├── .commitlintrc.mjs ├── .dockerignore ├── .github └── ISSUE_TEMPLATE │ └── config.yml ├── .gitignore ├── .gitlab-ci.yml ├── .gitlab └── merge_request_templates │ └── default.md ├── .gitmodules ├── .mockery.yaml ├── .releaserc.mjs ├── .vscode ├── launch.json └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── api ├── docker │ ├── Dockerfile │ └── requirements.txt └── src │ ├── api │ ├── __init__.py │ ├── libv2 │ │ ├── api_admin.py │ │ ├── api_admin_notifications.py │ │ ├── api_admin_socketio.py │ │ ├── api_allowed.py │ │ ├── api_analytics.py │ │ ├── api_auth.py │ │ ├── api_authentication.py │ │ ├── api_cards.py │ │ ├── api_desktop_events.py │ │ ├── api_desktops_common.py │ │ ├── api_desktops_nonpersistent.py │ │ ├── api_desktops_persistent.py │ │ ├── api_domains.py │ │ ├── api_downloads.py │ │ ├── api_hypervisors.py │ │ ├── api_logging.py │ │ ├── api_media.py │ │ ├── api_nonpersistentdesktop_events.py │ │ ├── api_notifier.py │ │ ├── api_notify.py │ │ ├── api_operations.py │ │ ├── api_queues.py │ │ ├── api_resources.py │ │ ├── api_scheduler.py │ │ ├── api_sessions.py │ │ ├── api_socketio_deployments.py │ │ ├── api_socketio_domains.py │ │ ├── api_socketio_media.py │ │ ├── api_socketio_targets.py │ │ ├── api_stats.py │ │ ├── api_storage.py │ │ ├── api_storage_node.py │ │ ├── api_targets.py │ │ ├── api_templates.py │ │ ├── api_usage.py │ │ ├── api_user_storage.py │ │ ├── api_users.py │ │ ├── api_viewers_config.py │ │ ├── api_vpn.py │ │ ├── bookings │ │ │ ├── api_booking.py │ │ │ ├── api_reservables.py │ │ │ ├── api_reservables_planner.py │ │ │ ├── api_reservables_planner_compute.py │ │ │ ├── api_socketio_bookings.py │ │ │ └── api_socketio_plannings.py │ │ ├── caches.py │ │ ├── datatables.py │ │ ├── deployments │ │ │ └── api_deployments.py │ │ ├── echarts.py │ │ ├── flask_rethink.py │ │ ├── genimage.py │ │ ├── helpers.py │ │ ├── isardViewer.py │ │ ├── isardVpn.py │ │ ├── load_config.py │ │ ├── load_validator_schemas.py │ │ ├── login.py │ │ ├── maintenance.py │ │ ├── notifications │ │ │ ├── notifications.py │ │ │ ├── notifications_action.py │ │ │ └── notifications_data.py │ │ ├── providers │ │ │ └── Nextcloud.py │ │ ├── quotas.py │ │ ├── quotas_process.py │ │ ├── recycle_bin.py │ │ ├── rethink_custom_base.py │ │ ├── rules.py │ │ ├── usage │ │ │ ├── common.py │ │ │ ├── consolidate.py │ │ │ ├── desktop.py │ │ │ ├── media.py │ │ │ ├── storage.py │ │ │ └── user.py │ │ ├── users.py │ │ ├── utils.py │ │ └── validators.py │ ├── schemas │ │ ├── allowed.yml │ │ ├── analytics_graph.yml │ │ ├── analytics_graph_update.yml │ │ ├── bastion.yml │ │ ├── bookings_priority.yml │ │ ├── category.yml │ │ ├── category_authentication.yml │ │ ├── category_update.yml │ │ ├── category_update_quota.yml │ │ ├── co_owners.yml │ │ ├── deployment.yml │ │ ├── deployment_update.yml │ │ ├── desktop.yml │ │ ├── desktop_from_media.yml │ │ ├── desktop_from_template.yml │ │ ├── desktop_queues.yml │ │ ├── desktop_reservables_update.yml │ │ ├── desktop_update.yml │ │ ├── desktops_from_template.yml │ │ ├── desktops_priority.yml │ │ ├── domains.yml │ │ ├── email_confirmation.yml │ │ ├── gpus.yml │ │ ├── graphics.yml │ │ ├── group.yml │ │ ├── group_update.yml │ │ ├── group_update_quota.yml │ │ ├── hypervisors.yml │ │ ├── interfaces.yml │ │ ├── login_notification.yml │ │ ├── maintenance_text.yml │ │ ├── media.yml │ │ ├── migration_exception.yml │ │ ├── notification.yml │ │ ├── notification_template_update.yml │ │ ├── notification_templates.yml │ │ ├── notification_update.yml │ │ ├── policy.yml │ │ ├── policy_edit.yml │ │ ├── provider_config_update.yml │ │ ├── qos_disk.yml │ │ ├── qos_disk_update.yml │ │ ├── qos_net.yml │ │ ├── remotevpn.yml │ │ ├── role_update.yml │ │ ├── secrets.yml │ │ ├── secrets_delete.yml │ │ ├── snippets │ │ │ ├── allowed.yml │ │ │ ├── check_quotas_update.yml │ │ │ ├── guest_properties.yml │ │ │ ├── guest_properties_update.yml │ │ │ ├── hardware.yml │ │ │ ├── hardware_update.yml │ │ │ ├── image_update.yml │ │ │ ├── limits.yml │ │ │ ├── login_notification.yml │ │ │ └── quotas.yml │ │ ├── storage_convert.yml │ │ ├── storage_create.yml │ │ ├── storage_pool.yml │ │ ├── storage_pool_update.yml │ │ ├── storage_rsync_by_path.yml │ │ ├── storage_rsync_by_storage_pool.yml │ │ ├── template.yml │ │ ├── template_duplicate.yml │ │ ├── template_to_desktop.yml │ │ ├── template_update.yml │ │ ├── unused_item_timeout.yml │ │ ├── unused_item_timeout_update.yml │ │ ├── usage_credit.yml │ │ ├── usage_credit_update.yml │ │ ├── usage_grouping.yml │ │ ├── usage_limit.yml │ │ ├── usage_parameters.yml │ │ ├── user.yml │ │ ├── user_auto_register.yml │ │ ├── user_from_csv.yml │ │ ├── user_from_csv_edit.yml │ │ ├── user_migration_import.yml │ │ ├── user_migration_update.yml │ │ ├── user_password_update.yml │ │ ├── user_storage.yml │ │ ├── user_update.yml │ │ ├── user_update_frontend.yml │ │ ├── user_update_quota.yml │ │ ├── videos.yml │ │ └── virt_pools.yml │ ├── static │ │ └── stock_assets │ │ │ ├── 1.jpg │ │ │ ├── 10.jpg │ │ │ ├── 11.jpg │ │ │ ├── 12.jpg │ │ │ ├── 13.jpg │ │ │ ├── 14.jpg │ │ │ ├── 15.jpg │ │ │ ├── 16.jpg │ │ │ ├── 17.jpg │ │ │ ├── 18.jpg │ │ │ ├── 19.jpg │ │ │ ├── 2.jpg │ │ │ ├── 20.jpg │ │ │ ├── 21.jpg │ │ │ ├── 22.jpg │ │ │ ├── 23.jpg │ │ │ ├── 24.jpg │ │ │ ├── 25.jpg │ │ │ ├── 26.jpg │ │ │ ├── 27.jpg │ │ │ ├── 28.jpg │ │ │ ├── 29.jpg │ │ │ ├── 3.jpg │ │ │ ├── 30.jpg │ │ │ ├── 31.jpg │ │ │ ├── 32.jpg │ │ │ ├── 33.jpg │ │ │ ├── 34.jpg │ │ │ ├── 35.jpg │ │ │ ├── 36.jpg │ │ │ ├── 37.jpg │ │ │ ├── 38.jpg │ │ │ ├── 39.jpg │ │ │ ├── 4.jpg │ │ │ ├── 40.jpg │ │ │ ├── 41.jpg │ │ │ ├── 42.jpg │ │ │ ├── 43.jpg │ │ │ ├── 44.jpg │ │ │ ├── 45.jpg │ │ │ ├── 46.jpg │ │ │ ├── 47.jpg │ │ │ ├── 48.jpg │ │ │ ├── 5.jpg │ │ │ ├── 6.jpg │ │ │ ├── 7.jpg │ │ │ ├── 8.jpg │ │ │ ├── 9.jpg │ │ │ ├── os_debian.png │ │ │ ├── os_fedora.png │ │ │ ├── os_kde.png │ │ │ ├── os_linux.png │ │ │ ├── os_slax.png │ │ │ ├── os_ubuntu.png │ │ │ ├── os_windows.png │ │ │ ├── sw_illustrator.png │ │ │ ├── sw_photoshop.png │ │ │ └── sw_premiere.png │ └── views │ │ ├── .giosavequMkHw │ │ ├── AdminDomainsView.py │ │ ├── AdminDownloadsView.py │ │ ├── AdminLoginConfigView.py │ │ ├── AdminMediaView.py │ │ ├── AdminNotificationsView.py │ │ ├── AdminResourcesView.py │ │ ├── AdminSchedulerView.py │ │ ├── AdminStoragePoolsView.py │ │ ├── AdminStorageView.py │ │ ├── AdminTablesView.py │ │ ├── AdminUsageView.py │ │ ├── AdminUserStorage.py │ │ ├── AdminUsersView.py │ │ ├── AllowedsView.py │ │ ├── AnalyticsView.py │ │ ├── AuthenticationView.py │ │ ├── BastionView.py │ │ ├── CardsView.py │ │ ├── CommonView.py │ │ ├── DesktopsNonPersistentView.py │ │ ├── DesktopsPersistentView.py │ │ ├── EchartsView.py │ │ ├── HypervisorsView.py │ │ ├── JumperViewerView.py │ │ ├── MediaViews.py │ │ ├── MigrationViews.py │ │ ├── NotifyView.py │ │ ├── OperationsView.py │ │ ├── PublicView.py │ │ ├── QueuesView.py │ │ ├── RecycleBinView.py │ │ ├── Stats.py │ │ ├── StorageView.py │ │ ├── TemplatesView.py │ │ ├── UsersView.py │ │ ├── ViewersConfigView.py │ │ ├── VpnViews.py │ │ ├── __init__.py │ │ ├── bookings │ │ ├── BookingView.py │ │ └── ReservablesView.py │ │ ├── decorators.py │ │ ├── deployments │ │ └── DeploymentsView.py │ │ ├── maintenance.py │ │ ├── notifications │ │ └── NotificationsView.py │ │ ├── socketio_emit.py │ │ └── task.py │ ├── scripts │ ├── api.cfg │ ├── api.py │ ├── create_desktop.py │ ├── db_query_time.py │ ├── new_user.py │ ├── update_db_user_pwd.py │ ├── update_user_pwd.py │ └── user_exists.py │ └── startv3.py ├── authentication ├── authentication │ ├── api_key.go │ ├── authentication.go │ ├── authentication_test.go │ ├── disclaimer.go │ ├── disclaimer_test.go │ ├── email.go │ ├── email_test.go │ ├── external.go │ ├── generate_user_token.go │ ├── login.go │ ├── login_internal_test.go │ ├── login_test.go │ ├── logout.go │ ├── logout_test.go │ ├── migrate_user.go │ ├── migrate_user_test.go │ ├── password.go │ ├── password_test.go │ ├── registration.go │ ├── renew.go │ ├── renew_test.go │ ├── utils.go │ └── utils_internal_test.go ├── build │ └── package │ │ ├── Dockerfile │ │ └── run.sh ├── cfg │ └── cfg.go ├── cmd │ └── authentication │ │ └── main.go ├── limits │ ├── limits.go │ └── limits_test.go ├── model │ ├── category.go │ ├── group.go │ ├── role.go │ ├── secret.go │ ├── user.go │ └── user_test.go ├── provider │ ├── external.go │ ├── form.go │ ├── google.go │ ├── ldap.go │ ├── local.go │ ├── local_test.go │ ├── oauth2.go │ ├── provider.go │ ├── provider_internal_test.go │ ├── saml.go │ ├── saml_test.go │ └── types │ │ ├── types.go │ │ └── types_test.go ├── token │ ├── parse.go │ ├── parse_test.go │ ├── sign.go │ ├── sign_test.go │ ├── token.go │ └── token_test.go └── transport │ └── http │ ├── http.go │ ├── http_test.go │ ├── observability.go │ ├── request_metadata.go │ ├── request_metadata_internal_test.go │ └── security.go ├── bastion ├── build │ └── package │ │ ├── Dockerfile │ │ └── run.sh ├── cfg │ └── cfg.go ├── cmd │ └── bastion │ │ └── main.go ├── model │ ├── category.go │ ├── config.go │ ├── desktop.go │ ├── target.go │ ├── target_test.go │ └── user.go └── transport │ ├── http │ └── http.go │ ├── proxy.go │ └── ssh │ ├── extensions.go │ ├── keys.go │ └── ssh.go ├── buf.gen.yaml ├── buf.yaml ├── build.sh ├── check ├── build │ └── package │ │ ├── Dockerfile │ │ ├── Dockerfile.client │ │ └── startapp.sh ├── cfg │ └── cfg.go ├── check │ ├── auth.go │ ├── check.go │ ├── viewers.go │ └── vpn.go ├── cmd │ ├── check │ │ └── main.go │ └── monitor │ │ ├── main.go │ │ └── monitor.json └── transport │ └── grpc │ └── grpc.go ├── component ├── _common │ └── src │ │ ├── api_exceptions.py │ │ ├── api_logs_users.py │ │ ├── api_rest.py │ │ ├── atexit_register.py │ │ ├── default_storage_pool.py │ │ ├── domain.py │ │ ├── grpc_client.py │ │ ├── log.py │ │ ├── media.py │ │ ├── redis_base.py │ │ ├── redis_retry.py │ │ ├── rethink_base.py │ │ ├── rethink_custom_base_factory.py │ │ ├── storage.py │ │ ├── storage_node.py │ │ ├── storage_pool.py │ │ ├── task.py │ │ ├── tokens.py │ │ ├── user.py │ │ └── worker.py └── core_worker │ ├── docker │ ├── Dockerfile │ ├── requirements.txt │ └── uuidgen.py │ └── src │ ├── rethink_custom_base.py │ └── task.py ├── docker-compose-parts ├── .env ├── api.build.yml ├── api.current.yml ├── api.devel.yml ├── api.legacy.yml ├── api.test.yml ├── api.yml ├── authentication.build.yml ├── authentication.current.yml ├── authentication.devel.yml ├── authentication.legacy.yml ├── authentication.test.yml ├── authentication.yml ├── backupninja.build.yml ├── backupninja.devel.yml ├── backupninja.yml ├── bastion-open-port.yml ├── bastion.build.yml ├── bastion.current.yml ├── bastion.devel.yml ├── bastion.legacy.yml ├── bastion.yml ├── check.build.yml ├── check.yml ├── core_worker.build.yml ├── core_worker.current.yml ├── core_worker.devel.yml ├── core_worker.legacy.yml ├── core_worker.yml ├── db-stats.build.yml ├── db-stats.yml ├── db.build.yml ├── db.yml ├── engine.build.yml ├── engine.current.yml ├── engine.devel.yml ├── engine.yml ├── guac.build.yml ├── guac.yml ├── haproxy.build.yml ├── hypervisor-vlans.yml ├── hypervisor.build.yml ├── hypervisor.devel.yml ├── hypervisor.yml ├── infrastructure.build.yml ├── infrastructure.current.yml ├── infrastructure.devel.yml ├── infrastructure.legacy.yml ├── infrastructure.yml ├── monitor-proxy.build.yml ├── monitor-proxy.devel.yml ├── monitor-proxy.yml ├── monitor.build.yml ├── monitor.devel.yml ├── monitor.yml ├── nc-proxy.build.yml ├── nc-proxy.current.yml ├── nc-proxy.devel.yml ├── nc-proxy.legacy.yml ├── nc-proxy.yml ├── nc.build.yml ├── nc.current.yml ├── nc.devel.yml ├── nc.legacy.yml ├── nc.yml ├── network.yml ├── notifier.build.yml ├── notifier.current.yml ├── notifier.devel.yml ├── notifier.legacy.yml ├── notifier.yml ├── portal.build.yml ├── portal.devel.yml ├── portal.yml ├── postgres.legacy.yml ├── postgres.yml ├── redis.yml ├── scheduler.build.yml ├── scheduler.current.yml ├── scheduler.devel.yml ├── scheduler.legacy.yml ├── scheduler.yml ├── sessions.build.yml ├── sessions.current.yml ├── sessions.devel.yml ├── sessions.yml ├── squid-hypervisor.current.yml ├── squid.build.yml ├── squid.legacy.yml ├── squid.yml ├── static.build.yml ├── static.devel.yml ├── static.yml ├── stats.all-in-one.current.yml ├── stats.build.yml ├── stats.legacy.yml ├── stats.yml ├── storage.build.yml ├── storage.devel.yml ├── storage.yml ├── video.build.yml ├── video.devel.yml ├── video.yml ├── vpn.build.yml ├── vpn.current.yml ├── vpn.devel.yml ├── vpn.yml ├── webapp.build.yml ├── webapp.current.yml ├── webapp.devel.yml ├── webapp.legacy.yml ├── webapp.yml ├── websockify.build.yml └── websockify.yml ├── docker ├── backupninja │ ├── Dockerfile │ ├── backup.d │ │ ├── 10-db-info.sh │ │ ├── 11-db-nfs-mount.sh │ │ ├── 12-db-dump.sh │ │ ├── 13-db-borg.borg │ │ ├── 14-db-compact.sh │ │ ├── 19-db-nfs-umount.sh │ │ ├── 20-redis-info.sh │ │ ├── 21-redis-nfs-mount.sh │ │ ├── 22-redis-dump.sh │ │ ├── 23-redis-borg.borg │ │ ├── 24-redis-compact.sh │ │ ├── 29-redis-nfs-umount.sh │ │ ├── 30-stats-info.sh │ │ ├── 31-stats-nfs-mount.sh │ │ ├── 32-stats-dump.sh │ │ ├── 33-stats-borg.borg │ │ ├── 34-stats-compact.sh │ │ ├── 39-stats-nfs-umount.sh │ │ ├── 80-config-info.sh │ │ ├── 81-config-nfs-mount.sh │ │ ├── 82-config-borg.borg │ │ ├── 84-config-compact.sh │ │ ├── 89-config-nfs-umount.sh │ │ ├── 90-disks-info.sh │ │ ├── 91-disks-nfs-mount.sh │ │ ├── 92-disks-borg.borg │ │ ├── 94-disks-compact.sh │ │ └── 99-disks-nfs-umount.sh │ ├── nfs_mount.sh │ ├── nfs_umount.sh │ └── run.sh ├── codegen │ ├── Dockerfile │ └── gen.sh ├── db │ ├── Dockerfile │ ├── Dockerfile.stats │ └── run.sh ├── grafana-agent │ ├── config.yml │ ├── monitor.yml │ ├── run.sh │ ├── video.yml │ └── web.yml ├── grafana │ ├── Dockerfile │ ├── dashboards │ │ ├── dashboard_gestor.json │ │ ├── general_status.json │ │ ├── haproxy.json │ │ ├── hypervisors_status.json │ │ ├── info_domains.json │ │ ├── info_hypervisors.json │ │ ├── isard_categories.json │ │ ├── isard_containers.json │ │ ├── isard_cost.json │ │ ├── isard_monitoring.json │ │ ├── isard_rethinkdb.json │ │ ├── isard_storage.json │ │ ├── isard_usage.json │ │ └── stats.yml │ ├── datasources │ │ └── stats.yml │ ├── grafana.ini │ └── run.sh ├── haproxy │ ├── Dockerfile │ ├── _common │ │ ├── auto-generate-certs.sh │ │ ├── haproxy-docker-entrypoint.sh │ │ ├── haproxy-reload │ │ ├── letsencrypt-hook-deploy-concatenante.sh │ │ ├── letsencrypt-renew-cron.sh │ │ └── letsencrypt.sh │ ├── cfg │ │ ├── _base │ │ │ ├── 00_begin.cfg │ │ │ ├── 02_logs.cfg │ │ │ ├── 04_00_fe_nonsecured_begin.cfg │ │ │ ├── 16_00_fe_secured_begin.cfg │ │ │ ├── 29_be_defaults.cfg │ │ │ ├── 30_stats.cfg │ │ │ └── 31_auth.cfg │ │ ├── monitor-proxy │ │ │ ├── 14_fe_notsecured.cfg │ │ │ ├── 16_12_fe_secured_end.cfg │ │ │ └── 20_backends.cfg │ │ ├── nc-proxy │ │ │ ├── 14_fe_notsecured.cfg │ │ │ ├── 16_12_fe_secured_end.cfg │ │ │ └── 20_backends.cfg │ │ ├── portal │ │ │ ├── 12_rdp.cfg │ │ │ ├── 16_04_fe_secured_abuse.cfg │ │ │ ├── 16_12_fe_secured_end.cfg │ │ │ └── 20_backends.cfg │ │ └── video │ │ │ ├── 16_12_fe_secured_end.cfg │ │ │ └── 20_backends.cfg │ └── prepare.sh ├── hypervisor │ ├── Dockerfile │ ├── kvm │ │ ├── 50-libvirt.rules │ │ ├── hooks │ │ │ └── qemu │ │ └── qemu-kvm │ ├── mdevctl_install.sh │ ├── networks │ │ ├── default.xml │ │ ├── private1.xml │ │ ├── private2.xml │ │ ├── private3.xml │ │ ├── private4.xml │ │ ├── private5.xml │ │ └── shared.xml │ ├── requirements.txt │ ├── spice-dev │ │ ├── build-spice-dev.sh │ │ ├── failing-tests.patch │ │ ├── libspice-server.la │ │ ├── libspice-server.so.1 │ │ └── libspice-server.so.1.14.3 │ └── src │ │ ├── checks │ │ ├── domain.xml │ │ ├── domain_gpu.xml │ │ ├── get_virt-install_xmls.sh │ │ └── libvirt-log.sh │ │ ├── dnsmasq-hook │ │ ├── api_client.py │ │ └── update-client-ips.sh │ │ ├── lib │ │ ├── __init__.py │ │ ├── api_client.py │ │ ├── check-cert.py │ │ ├── hypervisor.py │ │ ├── setup.py │ │ ├── update-client-ips.py │ │ └── vpnc.py │ │ ├── libvirt_restart.sh │ │ ├── ovs │ │ ├── eth2.sh │ │ ├── setup.sh │ │ ├── vlan100.xml │ │ ├── vlan2.xml │ │ ├── vlan200.xml │ │ ├── vlan4095.xml │ │ └── vxlan.sh │ │ ├── start.sh │ │ ├── tc │ │ └── tc_video.sh │ │ ├── test.py │ │ └── vlans │ │ ├── api_client.py │ │ ├── vlans-add.sh │ │ ├── vlans-db.py │ │ └── vlans-discover.sh ├── loki │ └── config.yaml ├── nextcloud │ ├── Dockerfile │ ├── background.jpg │ ├── init.sh │ ├── nginx.conf │ ├── requirements.txt │ ├── src │ │ └── authenticate.py │ └── supervisord.conf ├── postgres │ └── init_databases.sh ├── prometheus │ └── prometheus.yml ├── squid │ ├── Dockerfile │ └── run.sh ├── static │ ├── Dockerfile │ ├── default.conf │ └── noVNC │ │ ├── index.html │ │ └── signal.svg ├── storage │ ├── Dockerfile │ ├── init.sh │ ├── requirements.txt │ ├── task │ │ └── task.py │ └── utils │ │ ├── analyze │ │ └── wait_for_redis └── vpn │ ├── Dockerfile │ ├── dnsmasq-hook │ ├── api_client.py │ ├── ddns.sh │ ├── update-client-ips.py │ └── update-client-ips.sh │ ├── ovs │ └── ovs_setup.sh │ ├── requirements.txt │ ├── resources.md │ ├── run.sh │ └── src │ ├── api_client.py │ ├── iptools.py │ ├── simple_iptools.py │ ├── test.py │ ├── user_iptools.py │ ├── wg_monitor.py │ ├── wgadmin.py │ ├── wgkeys.py │ └── wgtools.py ├── engine ├── debug.yml ├── docker │ ├── Dockerfile │ ├── add-hyper-rethink.py │ ├── add-hypervisor.sh │ ├── add_openssh_for_debug.sh │ ├── genrsa.sh │ ├── requirements.txt │ └── run.sh └── engine │ ├── activate_private_downloads.py │ ├── engine │ ├── __init__.py │ ├── api │ │ ├── __init__.py │ │ ├── exceptions.py │ │ └── tokens.py │ ├── config.py │ ├── controllers │ │ ├── __init__.py │ │ ├── broom.py │ │ ├── events_recolector.py │ │ └── ui_actions.py │ ├── default_config.py │ ├── models │ │ ├── __init__.py │ │ ├── balancers.py │ │ ├── balancers_test.py │ │ ├── domain_xml.py │ │ ├── domain_xml_test.py │ │ ├── engine.py │ │ ├── hyp.py │ │ ├── hypervisor_orchestrator.py │ │ ├── nvidia_models.py │ │ ├── pool_hypervisors.py │ │ ├── rethink_custom_base.py │ │ └── rethink_hyp_event.py │ └── services │ │ ├── __init__.py │ │ ├── db │ │ ├── __init__.py │ │ ├── config.py │ │ ├── db.py │ │ ├── domains.py │ │ ├── downloads.py │ │ ├── hypervisors.py │ │ ├── hypervisors_status.py │ │ └── storage_pool.py │ │ ├── lib │ │ ├── __init__.py │ │ ├── debug.py │ │ ├── download.py │ │ ├── functions.py │ │ ├── libvirt_dicts.py │ │ ├── qcow.py │ │ ├── qmp.py │ │ ├── qmp │ │ │ ├── notifier_linux.sh │ │ │ ├── notifier_windows.bat │ │ │ ├── personal_unit_linux.sh │ │ │ └── personal_unit_windows.bat │ │ ├── status.py │ │ ├── storage.py │ │ └── telegram.py │ │ ├── log.py │ │ └── threads │ │ ├── __init__.py │ │ ├── disk_operations_thread.py │ │ ├── download_thread.py │ │ ├── hyp_worker_thread.py │ │ └── threads.py │ ├── generate_certs.sh │ ├── initdb │ ├── default_xmls │ │ ├── osinfo.txt │ │ ├── win10Virtio.xml │ │ └── win7Virtio.xml │ ├── lib.py │ ├── log.py │ ├── populate.py │ ├── profiles │ │ └── gpu_profiles.json │ └── upgrade.py │ ├── logging.conf │ ├── scripts │ ├── loop_selected_profile.py │ ├── test_a40.ipy │ ├── test_all_domains_starting_paused.py │ ├── test_db.py │ ├── test_gpu.ipy │ ├── update_db.py │ └── virt-conn.py │ ├── start.py │ └── update_certs.py ├── frontend ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc.json ├── .storybook │ ├── main.ts │ ├── preview.ts │ └── test-runner.ts ├── README.md ├── bun.lockb ├── components.json ├── e2e │ ├── tsconfig.json │ └── vue.spec.ts ├── env.d.ts ├── index.html ├── package.json ├── playwright.config.ts ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── assets │ │ ├── icons │ │ │ ├── activity-heart.svg │ │ │ ├── activity.svg │ │ │ ├── airplay.svg │ │ │ ├── airpods.svg │ │ │ ├── alarm-clock-check.svg │ │ │ ├── alarm-clock-minus.svg │ │ │ ├── alarm-clock-off.svg │ │ │ ├── alarm-clock-plus.svg │ │ │ ├── alarm-clock.svg │ │ │ ├── alert-circle.svg │ │ │ ├── alert-hexagon.svg │ │ │ ├── alert-octagon.svg │ │ │ ├── alert-square.svg │ │ │ ├── alert-triangle.svg │ │ │ ├── align-bottom-01.svg │ │ │ ├── align-bottom-02.svg │ │ │ ├── align-center.svg │ │ │ ├── align-horizontal-centre-01.svg │ │ │ ├── align-horizontal-centre-02.svg │ │ │ ├── align-justify.svg │ │ │ ├── align-left-01.svg │ │ │ ├── align-left-02.svg │ │ │ ├── align-left.svg │ │ │ ├── align-right-01.svg │ │ │ ├── align-right-02.svg │ │ │ ├── align-right.svg │ │ │ ├── align-top-01.svg │ │ │ ├── align-top-02.svg │ │ │ ├── align-vertical-center-01.svg │ │ │ ├── align-vertical-center-02.svg │ │ │ ├── anchor.svg │ │ │ ├── annotation-alert.svg │ │ │ ├── annotation-check.svg │ │ │ ├── annotation-dots.svg │ │ │ ├── annotation-heart.svg │ │ │ ├── annotation-info.svg │ │ │ ├── annotation-plus.svg │ │ │ ├── annotation-question.svg │ │ │ ├── annotation-x.svg │ │ │ ├── annotation.svg │ │ │ ├── announcement-01.svg │ │ │ ├── announcement-02.svg │ │ │ ├── announcement-03.svg │ │ │ ├── archive.svg │ │ │ ├── arrow-block-down.svg │ │ │ ├── arrow-block-left.svg │ │ │ ├── arrow-block-right.svg │ │ │ ├── arrow-block-up.svg │ │ │ ├── arrow-circle-broken-down-left.svg │ │ │ ├── arrow-circle-broken-down-right.svg │ │ │ ├── arrow-circle-broken-down.svg │ │ │ ├── arrow-circle-broken-left.svg │ │ │ ├── arrow-circle-broken-right.svg │ │ │ ├── arrow-circle-broken-up-left.svg │ │ │ ├── arrow-circle-broken-up-right.svg │ │ │ ├── arrow-circle-broken-up.svg │ │ │ ├── arrow-circle-down-left.svg │ │ │ ├── arrow-circle-down-right.svg │ │ │ ├── arrow-circle-down.svg │ │ │ ├── arrow-circle-left.svg │ │ │ ├── arrow-circle-right.svg │ │ │ ├── arrow-circle-up-left.svg │ │ │ ├── arrow-circle-up-right.svg │ │ │ ├── arrow-circle-up.svg │ │ │ ├── arrow-down-left.svg │ │ │ ├── arrow-down-right.svg │ │ │ ├── arrow-down.svg │ │ │ ├── arrow-left.svg │ │ │ ├── arrow-narrow-down-left.svg │ │ │ ├── arrow-narrow-down-right.svg │ │ │ ├── arrow-narrow-down.svg │ │ │ ├── arrow-narrow-left.svg │ │ │ ├── arrow-narrow-right.svg │ │ │ ├── arrow-narrow-up-left.svg │ │ │ ├── arrow-narrow-up-right.svg │ │ │ ├── arrow-narrow-up.svg │ │ │ ├── arrow-right.svg │ │ │ ├── arrow-square-down-left.svg │ │ │ ├── arrow-square-down-right.svg │ │ │ ├── arrow-square-down.svg │ │ │ ├── arrow-square-left.svg │ │ │ ├── arrow-square-right.svg │ │ │ ├── arrow-square-up-left.svg │ │ │ ├── arrow-square-up-right.svg │ │ │ ├── arrow-square-up.svg │ │ │ ├── arrow-up-left.svg │ │ │ ├── arrow-up-right.svg │ │ │ ├── arrow-up.svg │ │ │ ├── arrows-down.svg │ │ │ ├── arrows-left.svg │ │ │ ├── arrows-right.svg │ │ │ ├── arrows-triangle.svg │ │ │ ├── arrows-up.svg │ │ │ ├── asterisk-01.svg │ │ │ ├── asterisk-02.svg │ │ │ ├── at-sign.svg │ │ │ ├── atom-01.svg │ │ │ ├── atom-02.svg │ │ │ ├── attachment-01.svg │ │ │ ├── attachment-02.svg │ │ │ ├── award-01.svg │ │ │ ├── award-02.svg │ │ │ ├── award-03.svg │ │ │ ├── award-04.svg │ │ │ ├── award-05.svg │ │ │ ├── backpack.svg │ │ │ ├── bank-note-01.svg │ │ │ ├── bank-note-02.svg │ │ │ ├── bank-note-03.svg │ │ │ ├── bank.svg │ │ │ ├── bar-chart-01.svg │ │ │ ├── bar-chart-02.svg │ │ │ ├── bar-chart-03.svg │ │ │ ├── bar-chart-04.svg │ │ │ ├── bar-chart-05.svg │ │ │ ├── bar-chart-06.svg │ │ │ ├── bar-chart-07.svg │ │ │ ├── bar-chart-08.svg │ │ │ ├── bar-chart-09.svg │ │ │ ├── bar-chart-10.svg │ │ │ ├── bar-chart-11.svg │ │ │ ├── bar-chart-12.svg │ │ │ ├── bar-chart-circle-01.svg │ │ │ ├── bar-chart-circle-02.svg │ │ │ ├── bar-chart-circle-03.svg │ │ │ ├── bar-chart-square-01.svg │ │ │ ├── bar-chart-square-02.svg │ │ │ ├── bar-chart-square-03.svg │ │ │ ├── bar-chart-square-down.svg │ │ │ ├── bar-chart-square-minus.svg │ │ │ ├── bar-chart-square-plus.svg │ │ │ ├── bar-chart-square-up.svg │ │ │ ├── bar-line-chart.svg │ │ │ ├── battery-charging-01.svg │ │ │ ├── battery-charging-02.svg │ │ │ ├── battery-empty.svg │ │ │ ├── battery-full.svg │ │ │ ├── battery-low.svg │ │ │ ├── battery-mid.svg │ │ │ ├── beaker-01.svg │ │ │ ├── beaker-02.svg │ │ │ ├── bell-01.svg │ │ │ ├── bell-02.svg │ │ │ ├── bell-03.svg │ │ │ ├── bell-04.svg │ │ │ ├── bell-minus.svg │ │ │ ├── bell-off-01.svg │ │ │ ├── bell-off-02.svg │ │ │ ├── bell-off-03.svg │ │ │ ├── bell-plus.svg │ │ │ ├── bell-ringing-01.svg │ │ │ ├── bell-ringing-02.svg │ │ │ ├── bell-ringing-03.svg │ │ │ ├── bell-ringing-04.svg │ │ │ ├── bezier-curve-01.svg │ │ │ ├── bezier-curve-02.svg │ │ │ ├── bezier-curve-03.svg │ │ │ ├── bluetooth-connect.svg │ │ │ ├── bluetooth-off.svg │ │ │ ├── bluetooth-on.svg │ │ │ ├── bluetooth-signal.svg │ │ │ ├── bold-01.svg │ │ │ ├── bold-02.svg │ │ │ ├── bold-square.svg │ │ │ ├── book-closed.svg │ │ │ ├── book-open-01.svg │ │ │ ├── book-open-02.svg │ │ │ ├── bookmark-add.svg │ │ │ ├── bookmark-check.svg │ │ │ ├── bookmark-minus.svg │ │ │ ├── bookmark-x.svg │ │ │ ├── bookmark.svg │ │ │ ├── box.svg │ │ │ ├── brackets-check.svg │ │ │ ├── brackets-ellipses.svg │ │ │ ├── brackets-minus.svg │ │ │ ├── brackets-plus.svg │ │ │ ├── brackets-slash.svg │ │ │ ├── brackets-x.svg │ │ │ ├── brackets.svg │ │ │ ├── briefcase-01.svg │ │ │ ├── briefcase-02.svg │ │ │ ├── browser.svg │ │ │ ├── brush-01.svg │ │ │ ├── brush-02.svg │ │ │ ├── brush-03.svg │ │ │ ├── building-01.svg │ │ │ ├── building-02.svg │ │ │ ├── building-03.svg │ │ │ ├── building-04.svg │ │ │ ├── building-05.svg │ │ │ ├── building-06.svg │ │ │ ├── building-07.svg │ │ │ ├── building-08.svg │ │ │ ├── bus.svg │ │ │ ├── calculator.svg │ │ │ ├── calendar-check-01.svg │ │ │ ├── calendar-check-02.svg │ │ │ ├── calendar-date.svg │ │ │ ├── calendar-heart-01.svg │ │ │ ├── calendar-heart-02.svg │ │ │ ├── calendar-minus-01.svg │ │ │ ├── calendar-minus-02.svg │ │ │ ├── calendar-plus-01.svg │ │ │ ├── calendar-plus-02.svg │ │ │ ├── calendar.svg │ │ │ ├── camera-01.svg │ │ │ ├── camera-02.svg │ │ │ ├── camera-03.svg │ │ │ ├── camera-lens.svg │ │ │ ├── camera-off.svg │ │ │ ├── camera-plus.svg │ │ │ ├── car-01.svg │ │ │ ├── car-02.svg │ │ │ ├── certificate-01.svg │ │ │ ├── certificate-02.svg │ │ │ ├── chart-breakout-circle.svg │ │ │ ├── chart-breakout-square.svg │ │ │ ├── check-circle-broken.svg │ │ │ ├── check-circle.svg │ │ │ ├── check-done-01.svg │ │ │ ├── check-done-02.svg │ │ │ ├── check-heart.svg │ │ │ ├── check-square-broken.svg │ │ │ ├── check-square.svg │ │ │ ├── check-verified-01.svg │ │ │ ├── check-verified-02.svg │ │ │ ├── check-verified-03.svg │ │ │ ├── check.svg │ │ │ ├── chevron-down-double.svg │ │ │ ├── chevron-down.svg │ │ │ ├── chevron-left-double.svg │ │ │ ├── chevron-left.svg │ │ │ ├── chevron-right-double.svg │ │ │ ├── chevron-right.svg │ │ │ ├── chevron-selector-horizontal.svg │ │ │ ├── chevron-selector-vertical.svg │ │ │ ├── chevron-up-double.svg │ │ │ ├── chevron-up.svg │ │ │ ├── chrome-cast.svg │ │ │ ├── circle-cut.svg │ │ │ ├── circle.svg │ │ │ ├── clapperboard.svg │ │ │ ├── clipboard-attachment.svg │ │ │ ├── clipboard-check.svg │ │ │ ├── clipboard-download.svg │ │ │ ├── clipboard-minus.svg │ │ │ ├── clipboard-plus.svg │ │ │ ├── clipboard-x.svg │ │ │ ├── clipboard.svg │ │ │ ├── clock-check.svg │ │ │ ├── clock-fast-forward.svg │ │ │ ├── clock-plus.svg │ │ │ ├── clock-refresh.svg │ │ │ ├── clock-rewind.svg │ │ │ ├── clock-snooze.svg │ │ │ ├── clock-stopwatch.svg │ │ │ ├── clock.svg │ │ │ ├── cloud-01.svg │ │ │ ├── cloud-02.svg │ │ │ ├── cloud-03.svg │ │ │ ├── cloud-blank-01.svg │ │ │ ├── cloud-blank-02.svg │ │ │ ├── cloud-lightning.svg │ │ │ ├── cloud-moon.svg │ │ │ ├── cloud-off.svg │ │ │ ├── cloud-raining-01.svg │ │ │ ├── cloud-raining-02.svg │ │ │ ├── cloud-raining-03.svg │ │ │ ├── cloud-raining-04.svg │ │ │ ├── cloud-raining-05.svg │ │ │ ├── cloud-raining-06.svg │ │ │ ├── cloud-snowing-01.svg │ │ │ ├── cloud-snowing-02.svg │ │ │ ├── cloud-sun-01.svg │ │ │ ├── cloud-sun-02.svg │ │ │ ├── cloud-sun-03.svg │ │ │ ├── code-01.svg │ │ │ ├── code-02.svg │ │ │ ├── code-browser.svg │ │ │ ├── code-circle-01.svg │ │ │ ├── code-circle-02.svg │ │ │ ├── code-circle-03.svg │ │ │ ├── code-snippet-01.svg │ │ │ ├── code-snippet-02.svg │ │ │ ├── code-square-01.svg │ │ │ ├── code-square-02.svg │ │ │ ├── codepen.svg │ │ │ ├── coins-01.svg │ │ │ ├── coins-02.svg │ │ │ ├── coins-03.svg │ │ │ ├── coins-04.svg │ │ │ ├── coins-hand.svg │ │ │ ├── coins-stacked-01.svg │ │ │ ├── coins-stacked-02.svg │ │ │ ├── coins-stacked-03.svg │ │ │ ├── coins-stacked-04.svg │ │ │ ├── coins-swap-01.svg │ │ │ ├── coins-swap-02.svg │ │ │ ├── colors.svg │ │ │ ├── columns-01.svg │ │ │ ├── columns-02.svg │ │ │ ├── columns-03.svg │ │ │ ├── command.svg │ │ │ ├── compass-01.svg │ │ │ ├── compass-02.svg │ │ │ ├── compass-03.svg │ │ │ ├── compass.svg │ │ │ ├── container.svg │ │ │ ├── contrast-01.svg │ │ │ ├── contrast-02.svg │ │ │ ├── contrast-03.svg │ │ │ ├── copy-01.svg │ │ │ ├── copy-02.svg │ │ │ ├── copy-03.svg │ │ │ ├── copy-04.svg │ │ │ ├── copy-05.svg │ │ │ ├── copy-06.svg │ │ │ ├── copy-07.svg │ │ │ ├── corner-down-left.svg │ │ │ ├── corner-down-right.svg │ │ │ ├── corner-left-down.svg │ │ │ ├── corner-left-up.svg │ │ │ ├── corner-right-down.svg │ │ │ ├── corner-right-up.svg │ │ │ ├── corner-up-left.svg │ │ │ ├── corner-up-right.svg │ │ │ ├── cpu-chip-01.svg │ │ │ ├── cpu-chip-02.svg │ │ │ ├── credit-card-01.svg │ │ │ ├── credit-card-02.svg │ │ │ ├── credit-card-check.svg │ │ │ ├── credit-card-down.svg │ │ │ ├── credit-card-download.svg │ │ │ ├── credit-card-edit.svg │ │ │ ├── credit-card-lock.svg │ │ │ ├── credit-card-minus.svg │ │ │ ├── credit-card-plus.svg │ │ │ ├── credit-card-refresh.svg │ │ │ ├── credit-card-search.svg │ │ │ ├── credit-card-shield.svg │ │ │ ├── credit-card-up.svg │ │ │ ├── credit-card-upload.svg │ │ │ ├── credit-card-x.svg │ │ │ ├── crop-01.svg │ │ │ ├── crop-02.svg │ │ │ ├── cryptocurrency-01.svg │ │ │ ├── cryptocurrency-02.svg │ │ │ ├── cryptocurrency-03.svg │ │ │ ├── cryptocurrency-04.svg │ │ │ ├── cube-01.svg │ │ │ ├── cube-02.svg │ │ │ ├── cube-03.svg │ │ │ ├── cube-04.svg │ │ │ ├── cube-outline.svg │ │ │ ├── currency-bitcoin-circle.svg │ │ │ ├── currency-bitcoin.svg │ │ │ ├── currency-dollar-circle.svg │ │ │ ├── currency-dollar.svg │ │ │ ├── currency-ethereum-circle.svg │ │ │ ├── currency-ethereum.svg │ │ │ ├── currency-euro-circle.svg │ │ │ ├── currency-euro.svg │ │ │ ├── currency-pound-circle.svg │ │ │ ├── currency-pound.svg │ │ │ ├── currency-ruble-circle.svg │ │ │ ├── currency-ruble.svg │ │ │ ├── currency-rupee-circle.svg │ │ │ ├── currency-rupee.svg │ │ │ ├── currency-yen-circle.svg │ │ │ ├── currency-yen.svg │ │ │ ├── cursor-01.svg │ │ │ ├── cursor-02.svg │ │ │ ├── cursor-03.svg │ │ │ ├── cursor-04.svg │ │ │ ├── cursor-box.svg │ │ │ ├── cursor-click-01.svg │ │ │ ├── cursor-click-02.svg │ │ │ ├── data.svg │ │ │ ├── database-01.svg │ │ │ ├── database-02.svg │ │ │ ├── database-03.svg │ │ │ ├── dataflow-01.svg │ │ │ ├── dataflow-02.svg │ │ │ ├── dataflow-03.svg │ │ │ ├── dataflow-04.svg │ │ │ ├── delete.svg │ │ │ ├── diamond-01.svg │ │ │ ├── diamond-02.svg │ │ │ ├── dice-1.svg │ │ │ ├── dice-2.svg │ │ │ ├── dice-3.svg │ │ │ ├── dice-4.svg │ │ │ ├── dice-5.svg │ │ │ ├── dice-6.svg │ │ │ ├── disc-01.svg │ │ │ ├── disc-02.svg │ │ │ ├── distribute-spacing-horizontal.svg │ │ │ ├── distribute-spacing-vertical.svg │ │ │ ├── divide-01.svg │ │ │ ├── divide-02.svg │ │ │ ├── divide-03.svg │ │ │ ├── divider.svg │ │ │ ├── dotpoints-01.svg │ │ │ ├── dotpoints-02.svg │ │ │ ├── dots-grid.svg │ │ │ ├── dots-horizontal.svg │ │ │ ├── dots-vertical.svg │ │ │ ├── download-01.svg │ │ │ ├── download-02.svg │ │ │ ├── download-03.svg │ │ │ ├── download-04.svg │ │ │ ├── download-cloud-01.svg │ │ │ ├── download-cloud-02.svg │ │ │ ├── drop.svg │ │ │ ├── droplets-01.svg │ │ │ ├── droplets-02.svg │ │ │ ├── droplets-03.svg │ │ │ ├── dropper.svg │ │ │ ├── edit-01.svg │ │ │ ├── edit-02.svg │ │ │ ├── edit-03.svg │ │ │ ├── edit-04.svg │ │ │ ├── edit-05.svg │ │ │ ├── equal-not.svg │ │ │ ├── equal.svg │ │ │ ├── eraser.svg │ │ │ ├── expand-01.svg │ │ │ ├── expand-02.svg │ │ │ ├── expand-03.svg │ │ │ ├── expand-04.svg │ │ │ ├── expand-05.svg │ │ │ ├── expand-06.svg │ │ │ ├── eye-off.svg │ │ │ ├── eye.svg │ │ │ ├── face-content.svg │ │ │ ├── face-frown.svg │ │ │ ├── face-happy.svg │ │ │ ├── face-id-square.svg │ │ │ ├── face-id.svg │ │ │ ├── face-neutral.svg │ │ │ ├── face-sad.svg │ │ │ ├── face-smile.svg │ │ │ ├── face-wink.svg │ │ │ ├── fast-backward.svg │ │ │ ├── fast-forward.svg │ │ │ ├── feather.svg │ │ │ ├── figma.svg │ │ │ ├── file-01.svg │ │ │ ├── file-02.svg │ │ │ ├── file-03.svg │ │ │ ├── file-04.svg │ │ │ ├── file-05.svg │ │ │ ├── file-06.svg │ │ │ ├── file-07.svg │ │ │ ├── file-attachment-01.svg │ │ │ ├── file-attachment-02.svg │ │ │ ├── file-attachment-03.svg │ │ │ ├── file-attachment-04.svg │ │ │ ├── file-attachment-05.svg │ │ │ ├── file-check-01.svg │ │ │ ├── file-check-02.svg │ │ │ ├── file-check-03.svg │ │ │ ├── file-code-01.svg │ │ │ ├── file-code-02.svg │ │ │ ├── file-download-01.svg │ │ │ ├── file-download-02.svg │ │ │ ├── file-download-03.svg │ │ │ ├── file-heart-01.svg │ │ │ ├── file-heart-02.svg │ │ │ ├── file-heart-03.svg │ │ │ ├── file-lock-01.svg │ │ │ ├── file-lock-02.svg │ │ │ ├── file-lock-03.svg │ │ │ ├── file-minus-01.svg │ │ │ ├── file-minus-02.svg │ │ │ ├── file-minus-03.svg │ │ │ ├── file-plus-01.svg │ │ │ ├── file-plus-02.svg │ │ │ ├── file-plus-03.svg │ │ │ ├── file-question-01.svg │ │ │ ├── file-question-02.svg │ │ │ ├── file-question-03.svg │ │ │ ├── file-search-01.svg │ │ │ ├── file-search-02.svg │ │ │ ├── file-search-03.svg │ │ │ ├── file-shield-01.svg │ │ │ ├── file-shield-02.svg │ │ │ ├── file-shield-03.svg │ │ │ ├── file-x-01.svg │ │ │ ├── file-x-02.svg │ │ │ ├── file-x-03.svg │ │ │ ├── film-01.svg │ │ │ ├── film-02.svg │ │ │ ├── film-03.svg │ │ │ ├── filter-funnel-01.svg │ │ │ ├── filter-funnel-02.svg │ │ │ ├── filter-lines.svg │ │ │ ├── fingerprint-01.svg │ │ │ ├── fingerprint-02.svg │ │ │ ├── fingerprint-03.svg │ │ │ ├── fingerprint-04.svg │ │ │ ├── flag-01.svg │ │ │ ├── flag-02.svg │ │ │ ├── flag-03.svg │ │ │ ├── flag-04.svg │ │ │ ├── flag-05.svg │ │ │ ├── flag-06.svg │ │ │ ├── flash-off.svg │ │ │ ├── flash.svg │ │ │ ├── flex-align-bottom.svg │ │ │ ├── flex-align-left.svg │ │ │ ├── flex-align-right.svg │ │ │ ├── flex-align-top.svg │ │ │ ├── flip-backward.svg │ │ │ ├── flip-forward.svg │ │ │ ├── folder-check.svg │ │ │ ├── folder-closed.svg │ │ │ ├── folder-code.svg │ │ │ ├── folder-download.svg │ │ │ ├── folder-lock.svg │ │ │ ├── folder-minus.svg │ │ │ ├── folder-plus.svg │ │ │ ├── folder-question.svg │ │ │ ├── folder-search.svg │ │ │ ├── folder-shield.svg │ │ │ ├── folder-x.svg │ │ │ ├── folder.svg │ │ │ ├── framer.svg │ │ │ ├── gaming-pad-01.svg │ │ │ ├── gaming-pad-02.svg │ │ │ ├── gift-01.svg │ │ │ ├── gift-02.svg │ │ │ ├── git-branch-01.svg │ │ │ ├── git-branch-02.svg │ │ │ ├── git-commit.svg │ │ │ ├── git-merge.svg │ │ │ ├── git-pull-request.svg │ │ │ ├── glasses-01.svg │ │ │ ├── glasses-02.svg │ │ │ ├── globe-01.svg │ │ │ ├── globe-02.svg │ │ │ ├── globe-03.svg │ │ │ ├── globe-04.svg │ │ │ ├── globe-05.svg │ │ │ ├── globe-06.svg │ │ │ ├── globe-slated-01.svg │ │ │ ├── globe-slated-02.svg │ │ │ ├── google-chrome.svg │ │ │ ├── google.svg │ │ │ ├── graduation-hat-01.svg │ │ │ ├── graduation-hat-02.svg │ │ │ ├── grid-01.svg │ │ │ ├── grid-02.svg │ │ │ ├── grid-03.svg │ │ │ ├── grid-dots-blank.svg │ │ │ ├── grid-dots-bottom.svg │ │ │ ├── grid-dots-horizontal-center.svg │ │ │ ├── grid-dots-left.svg │ │ │ ├── grid-dots-outer.svg │ │ │ ├── grid-dots-right.svg │ │ │ ├── grid-dots-top.svg │ │ │ ├── grid-dots-vertical-center.svg │ │ │ ├── hand.svg │ │ │ ├── hard-drive.svg │ │ │ ├── hash-01.svg │ │ │ ├── hash-02.svg │ │ │ ├── heading-01.svg │ │ │ ├── heading-02.svg │ │ │ ├── heading-square.svg │ │ │ ├── headphones-01.svg │ │ │ ├── headphones-02.svg │ │ │ ├── heart-circle.svg │ │ │ ├── heart-hand.svg │ │ │ ├── heart-hexagon.svg │ │ │ ├── heart-octagon.svg │ │ │ ├── heart-rounded.svg │ │ │ ├── heart-square.svg │ │ │ ├── heart.svg │ │ │ ├── hearts.svg │ │ │ ├── help-circle.svg │ │ │ ├── help-hexagon.svg │ │ │ ├── help-octagon.svg │ │ │ ├── help-square.svg │ │ │ ├── hexagon-01.svg │ │ │ ├── hexagon-02.svg │ │ │ ├── home-01.svg │ │ │ ├── home-02.svg │ │ │ ├── home-03.svg │ │ │ ├── home-04.svg │ │ │ ├── home-05.svg │ │ │ ├── home-line.svg │ │ │ ├── home-smile.svg │ │ │ ├── horizontal-bar-chart-01.svg │ │ │ ├── horizontal-bar-chart-02.svg │ │ │ ├── horizontal-bar-chart-03.svg │ │ │ ├── hourglass-01.svg │ │ │ ├── hourglass-02.svg │ │ │ ├── hourglass-03.svg │ │ │ ├── hurricane-01.svg │ │ │ ├── hurricane-02.svg │ │ │ ├── hurricane-03.svg │ │ │ ├── image-01.svg │ │ │ ├── image-02.svg │ │ │ ├── image-03.svg │ │ │ ├── image-04.svg │ │ │ ├── image-05.svg │ │ │ ├── image-check.svg │ │ │ ├── image-down.svg │ │ │ ├── image-indent-left.svg │ │ │ ├── image-indent-right.svg │ │ │ ├── image-left.svg │ │ │ ├── image-plus.svg │ │ │ ├── image-right.svg │ │ │ ├── image-up.svg │ │ │ ├── image-user-check.svg │ │ │ ├── image-user-down.svg │ │ │ ├── image-user-left.svg │ │ │ ├── image-user-plus.svg │ │ │ ├── image-user-right.svg │ │ │ ├── image-user-up.svg │ │ │ ├── image-user-x.svg │ │ │ ├── image-user.svg │ │ │ ├── image-x.svg │ │ │ ├── inbox-01.svg │ │ │ ├── inbox-02.svg │ │ │ ├── infinity.svg │ │ │ ├── info-circle.svg │ │ │ ├── info-hexagon.svg │ │ │ ├── info-octagon.svg │ │ │ ├── info-square.svg │ │ │ ├── intersect-circle.svg │ │ │ ├── intersect-square.svg │ │ │ ├── italic-01.svg │ │ │ ├── italic-02.svg │ │ │ ├── italic-square.svg │ │ │ ├── key-01.svg │ │ │ ├── key-02.svg │ │ │ ├── keyboard-01.svg │ │ │ ├── keyboard-02.svg │ │ │ ├── laptop-01.svg │ │ │ ├── laptop-02.svg │ │ │ ├── layer-single.svg │ │ │ ├── layers-three-01.svg │ │ │ ├── layers-three-02.svg │ │ │ ├── layers-two-01.svg │ │ │ ├── layers-two-02.svg │ │ │ ├── layout-alt-01.svg │ │ │ ├── layout-alt-02.svg │ │ │ ├── layout-alt-03.svg │ │ │ ├── layout-alt-04.svg │ │ │ ├── layout-bottom.svg │ │ │ ├── layout-grid-01.svg │ │ │ ├── layout-grid-02.svg │ │ │ ├── layout-left.svg │ │ │ ├── layout-right.svg │ │ │ ├── layout-top.svg │ │ │ ├── left-indent-01.svg │ │ │ ├── left-indent-02.svg │ │ │ ├── letter-spacing-01.svg │ │ │ ├── letter-spacing-02.svg │ │ │ ├── life-buoy-01.svg │ │ │ ├── life-buoy-02.svg │ │ │ ├── lightbulb-01.svg │ │ │ ├── lightbulb-02.svg │ │ │ ├── lightbulb-03.svg │ │ │ ├── lightbulb-04.svg │ │ │ ├── lightbulb-05.svg │ │ │ ├── lightning-01.svg │ │ │ ├── lightning-02.svg │ │ │ ├── line-chart-down-01.svg │ │ │ ├── line-chart-down-02.svg │ │ │ ├── line-chart-down-03.svg │ │ │ ├── line-chart-down-04.svg │ │ │ ├── line-chart-down-05.svg │ │ │ ├── line-chart-up-01.svg │ │ │ ├── line-chart-up-02.svg │ │ │ ├── line-chart-up-03.svg │ │ │ ├── line-chart-up-04.svg │ │ │ ├── line-chart-up-05.svg │ │ │ ├── line-height.svg │ │ │ ├── link-01.svg │ │ │ ├── link-02.svg │ │ │ ├── link-03.svg │ │ │ ├── link-04.svg │ │ │ ├── link-05.svg │ │ │ ├── link-broken-01.svg │ │ │ ├── link-broken-02.svg │ │ │ ├── link-external-01.svg │ │ │ ├── link-external-02.svg │ │ │ ├── list.svg │ │ │ ├── loading-01.svg │ │ │ ├── loading-02.svg │ │ │ ├── loading-03.svg │ │ │ ├── lock-01.svg │ │ │ ├── lock-02.svg │ │ │ ├── lock-03.svg │ │ │ ├── lock-04.svg │ │ │ ├── lock-keyhole-circle.svg │ │ │ ├── lock-keyhole-square.svg │ │ │ ├── lock-unlocked-01.svg │ │ │ ├── lock-unlocked-02.svg │ │ │ ├── lock-unlocked-03.svg │ │ │ ├── lock-unlocked-04.svg │ │ │ ├── log-in-01.svg │ │ │ ├── log-in-02.svg │ │ │ ├── log-in-03.svg │ │ │ ├── log-in-04.svg │ │ │ ├── log-out-01.svg │ │ │ ├── log-out-02.svg │ │ │ ├── log-out-03.svg │ │ │ ├── log-out-04.svg │ │ │ ├── luggage-01.svg │ │ │ ├── luggage-02.svg │ │ │ ├── luggage-03.svg │ │ │ ├── magic-wand-01.svg │ │ │ ├── magic-wand-02.svg │ │ │ ├── mail-01.svg │ │ │ ├── mail-02.svg │ │ │ ├── mail-03.svg │ │ │ ├── mail-04.svg │ │ │ ├── mail-05.svg │ │ │ ├── map-01.svg │ │ │ ├── map-02.svg │ │ │ ├── mark.svg │ │ │ ├── marker-pin-01.svg │ │ │ ├── marker-pin-02.svg │ │ │ ├── marker-pin-03.svg │ │ │ ├── marker-pin-04.svg │ │ │ ├── marker-pin-05.svg │ │ │ ├── marker-pin-06.svg │ │ │ ├── maximize-01.svg │ │ │ ├── maximize-02.svg │ │ │ ├── medical-circle.svg │ │ │ ├── medical-cross.svg │ │ │ ├── medical-square.svg │ │ │ ├── menu-01.svg │ │ │ ├── menu-02.svg │ │ │ ├── menu-03.svg │ │ │ ├── menu-04.svg │ │ │ ├── menu-05.svg │ │ │ ├── message-alert-circle.svg │ │ │ ├── message-alert-square.svg │ │ │ ├── message-chat-circle.svg │ │ │ ├── message-chat-square.svg │ │ │ ├── message-check-circle.svg │ │ │ ├── message-check-square.svg │ │ │ ├── message-circle-01.svg │ │ │ ├── message-circle-02.svg │ │ │ ├── message-dots-circle.svg │ │ │ ├── message-dots-square.svg │ │ │ ├── message-heart-circle.svg │ │ │ ├── message-heart-square.svg │ │ │ ├── message-notification-circle.svg │ │ │ ├── message-notification-square.svg │ │ │ ├── message-plus-circle.svg │ │ │ ├── message-plus-square.svg │ │ │ ├── message-question-circle.svg │ │ │ ├── message-question-square.svg │ │ │ ├── message-smile-circle.svg │ │ │ ├── message-smile-square.svg │ │ │ ├── message-square-01.svg │ │ │ ├── message-square-02.svg │ │ │ ├── message-text-circle-01.svg │ │ │ ├── message-text-circle-02.svg │ │ │ ├── message-text-square-01.svg │ │ │ ├── message-text-square-02.svg │ │ │ ├── message-x-circle.svg │ │ │ ├── message-x-square.svg │ │ │ ├── microphone-01.svg │ │ │ ├── microphone-02.svg │ │ │ ├── microphone-off-01.svg │ │ │ ├── microphone-off-02.svg │ │ │ ├── microscope.svg │ │ │ ├── minimize-01.svg │ │ │ ├── minimize-02.svg │ │ │ ├── minus-circle.svg │ │ │ ├── minus-square.svg │ │ │ ├── minus.svg │ │ │ ├── modem-01.svg │ │ │ ├── modem-02.svg │ │ │ ├── monitor-01.svg │ │ │ ├── monitor-02.svg │ │ │ ├── monitor-03.svg │ │ │ ├── monitor-04.svg │ │ │ ├── monitor-05.svg │ │ │ ├── moon-01.svg │ │ │ ├── moon-02.svg │ │ │ ├── moon-eclipse.svg │ │ │ ├── moon-star.svg │ │ │ ├── mouse.svg │ │ │ ├── move.svg │ │ │ ├── music-note-01.svg │ │ │ ├── music-note-02.svg │ │ │ ├── music-note-plus.svg │ │ │ ├── navigation-pointer-01.svg │ │ │ ├── navigation-pointer-02.svg │ │ │ ├── navigation-pointer-off-01.svg │ │ │ ├── navigation-pointer-off-02.svg │ │ │ ├── notification-box.svg │ │ │ ├── notification-message.svg │ │ │ ├── notification-text.svg │ │ │ ├── octagon.svg │ │ │ ├── package-check.svg │ │ │ ├── package-minus.svg │ │ │ ├── package-plus.svg │ │ │ ├── package-search.svg │ │ │ ├── package-x.svg │ │ │ ├── package.svg │ │ │ ├── paint-pour.svg │ │ │ ├── paint.svg │ │ │ ├── palette.svg │ │ │ ├── paperclip.svg │ │ │ ├── paragraph-spacing.svg │ │ │ ├── paragraph-wrap.svg │ │ │ ├── passcode-lock.svg │ │ │ ├── passcode.svg │ │ │ ├── passport.svg │ │ │ ├── pause-circle.svg │ │ │ ├── pause-square.svg │ │ │ ├── pen-tool-01.svg │ │ │ ├── pen-tool-02.svg │ │ │ ├── pen-tool-minus.svg │ │ │ ├── pen-tool-plus.svg │ │ │ ├── pencil-01.svg │ │ │ ├── pencil-02.svg │ │ │ ├── pencil-line.svg │ │ │ ├── pentagon.svg │ │ │ ├── percent-01.svg │ │ │ ├── percent-02.svg │ │ │ ├── percent-03.svg │ │ │ ├── perspective-01.svg │ │ │ ├── perspective-02.svg │ │ │ ├── phone-01.svg │ │ │ ├── phone-02.svg │ │ │ ├── phone-call-01.svg │ │ │ ├── phone-call-02.svg │ │ │ ├── phone-hang-up.svg │ │ │ ├── phone-incoming-01.svg │ │ │ ├── phone-incoming-02.svg │ │ │ ├── phone-outgoing-01.svg │ │ │ ├── phone-outgoing-02.svg │ │ │ ├── phone-pause.svg │ │ │ ├── phone-plus.svg │ │ │ ├── phone-x.svg │ │ │ ├── phone.svg │ │ │ ├── pie-chart-01.svg │ │ │ ├── pie-chart-02.svg │ │ │ ├── pie-chart-03.svg │ │ │ ├── pie-chart-04.svg │ │ │ ├── piggy-bank-01.svg │ │ │ ├── piggy-bank-02.svg │ │ │ ├── pilcrow-01.svg │ │ │ ├── pilcrow-02.svg │ │ │ ├── pilcrow-square.svg │ │ │ ├── pin-01.svg │ │ │ ├── pin-02.svg │ │ │ ├── placeholder.svg │ │ │ ├── plane.svg │ │ │ ├── play-circle.svg │ │ │ ├── play-square.svg │ │ │ ├── play.svg │ │ │ ├── plus-circle.svg │ │ │ ├── plus-square.svg │ │ │ ├── plus.svg │ │ │ ├── podcast.svg │ │ │ ├── power-01.svg │ │ │ ├── power-02.svg │ │ │ ├── power-03.svg │ │ │ ├── presentation-chart-01.svg │ │ │ ├── presentation-chart-02.svg │ │ │ ├── presentation-chart-03.svg │ │ │ ├── printer.svg │ │ │ ├── puzzle-piece-01.svg │ │ │ ├── puzzle-piece-02.svg │ │ │ ├── qr-code-01.svg │ │ │ ├── qr-code-02.svg │ │ │ ├── receipt-check.svg │ │ │ ├── receipt.svg │ │ │ ├── recording-01.svg │ │ │ ├── recording-02.svg │ │ │ ├── recording-03.svg │ │ │ ├── reflect-01.svg │ │ │ ├── reflect-02.svg │ │ │ ├── refresh-ccw-01.svg │ │ │ ├── refresh-ccw-02.svg │ │ │ ├── refresh-ccw-03.svg │ │ │ ├── refresh-ccw-04.svg │ │ │ ├── refresh-ccw-05.svg │ │ │ ├── refresh-cw-01.svg │ │ │ ├── refresh-cw-02.svg │ │ │ ├── refresh-cw-03.svg │ │ │ ├── refresh-cw-04.svg │ │ │ ├── refresh-cw-05.svg │ │ │ ├── repeat-01.svg │ │ │ ├── repeat-02.svg │ │ │ ├── repeat-03.svg │ │ │ ├── repeat-04.svg │ │ │ ├── reverse-left.svg │ │ │ ├── reverse-right.svg │ │ │ ├── right-indent-01.svg │ │ │ ├── right-indent-02.svg │ │ │ ├── rocket-01.svg │ │ │ ├── rocket-02.svg │ │ │ ├── roller-brush.svg │ │ │ ├── route.svg │ │ │ ├── rows-01.svg │ │ │ ├── rows-02.svg │ │ │ ├── rows-03.svg │ │ │ ├── rss-01.svg │ │ │ ├── rss-02.svg │ │ │ ├── ruler.svg │ │ │ ├── safe.svg │ │ │ ├── sale-01.svg │ │ │ ├── sale-02.svg │ │ │ ├── sale-03.svg │ │ │ ├── sale-04.svg │ │ │ ├── save-01.svg │ │ │ ├── save-02.svg │ │ │ ├── save-03.svg │ │ │ ├── scale-01.svg │ │ │ ├── scale-02.svg │ │ │ ├── scale-03.svg │ │ │ ├── scales-01.svg │ │ │ ├── scales-02.svg │ │ │ ├── scan.svg │ │ │ ├── scissors-01.svg │ │ │ ├── scissors-02.svg │ │ │ ├── scissors-cut-01.svg │ │ │ ├── scissors-cut-02.svg │ │ │ ├── search-lg.svg │ │ │ ├── search-md.svg │ │ │ ├── search-refraction.svg │ │ │ ├── search-sm.svg │ │ │ ├── send-01.svg │ │ │ ├── send-02.svg │ │ │ ├── send-03.svg │ │ │ ├── server-01.svg │ │ │ ├── server-02.svg │ │ │ ├── server-03.svg │ │ │ ├── server-04.svg │ │ │ ├── server-05.svg │ │ │ ├── server-06.svg │ │ │ ├── settings-01.svg │ │ │ ├── settings-02.svg │ │ │ ├── settings-03.svg │ │ │ ├── settings-04.svg │ │ │ ├── share-01.svg │ │ │ ├── share-02.svg │ │ │ ├── share-03.svg │ │ │ ├── share-04.svg │ │ │ ├── share-05.svg │ │ │ ├── share-06.svg │ │ │ ├── share-07.svg │ │ │ ├── shield-01.svg │ │ │ ├── shield-02.svg │ │ │ ├── shield-03.svg │ │ │ ├── shield-dollar.svg │ │ │ ├── shield-off.svg │ │ │ ├── shield-plus.svg │ │ │ ├── shield-tick.svg │ │ │ ├── shield-zap.svg │ │ │ ├── shopping-bag-01.svg │ │ │ ├── shopping-bag-02.svg │ │ │ ├── shopping-bag-03.svg │ │ │ ├── shopping-cart-01.svg │ │ │ ├── shopping-cart-02.svg │ │ │ ├── shopping-cart-03.svg │ │ │ ├── shuffle-01.svg │ │ │ ├── shuffle-02.svg │ │ │ ├── signal-01.svg │ │ │ ├── signal-02.svg │ │ │ ├── signal-03.svg │ │ │ ├── simcard.svg │ │ │ ├── skew.svg │ │ │ ├── skip-back.svg │ │ │ ├── skip-forward.svg │ │ │ ├── slash-circle-01.svg │ │ │ ├── slash-circle-02.svg │ │ │ ├── slash-divider.svg │ │ │ ├── slash-octagon.svg │ │ │ ├── sliders-01.svg │ │ │ ├── sliders-02.svg │ │ │ ├── sliders-03.svg │ │ │ ├── sliders-04.svg │ │ │ ├── snowflake-01.svg │ │ │ ├── snowflake-02.svg │ │ │ ├── spacing-height-01.svg │ │ │ ├── spacing-height-02.svg │ │ │ ├── spacing-width-01.svg │ │ │ ├── spacing-width-02.svg │ │ │ ├── speaker-01.svg │ │ │ ├── speaker-02.svg │ │ │ ├── speaker-03.svg │ │ │ ├── speedometer-01.svg │ │ │ ├── speedometer-02.svg │ │ │ ├── speedometer-03.svg │ │ │ ├── speedometer-04.svg │ │ │ ├── square.svg │ │ │ ├── stand.svg │ │ │ ├── star-01.svg │ │ │ ├── star-02.svg │ │ │ ├── star-03.svg │ │ │ ├── star-04.svg │ │ │ ├── star-05.svg │ │ │ ├── star-06.svg │ │ │ ├── star-07.svg │ │ │ ├── stars-01.svg │ │ │ ├── stars-02.svg │ │ │ ├── stars-03.svg │ │ │ ├── sticker-circle.svg │ │ │ ├── sticker-square.svg │ │ │ ├── stop-circle.svg │ │ │ ├── stop-square.svg │ │ │ ├── stop.svg │ │ │ ├── strikethrough-01.svg │ │ │ ├── strikethrough-02.svg │ │ │ ├── strikethrough-square.svg │ │ │ ├── subscript.svg │ │ │ ├── sun-setting-01.svg │ │ │ ├── sun-setting-02.svg │ │ │ ├── sun-setting-03.svg │ │ │ ├── sun.svg │ │ │ ├── sunrise.svg │ │ │ ├── sunset.svg │ │ │ ├── switch-horizontal-01.svg │ │ │ ├── switch-horizontal-02.svg │ │ │ ├── switch-vertical-01.svg │ │ │ ├── switch-vertical-02.svg │ │ │ ├── table.svg │ │ │ ├── tablet-01.svg │ │ │ ├── tablet-02.svg │ │ │ ├── tag-01.svg │ │ │ ├── tag-02.svg │ │ │ ├── tag-03.svg │ │ │ ├── target-01.svg │ │ │ ├── target-02.svg │ │ │ ├── target-03.svg │ │ │ ├── target-04.svg │ │ │ ├── target-05.svg │ │ │ ├── telescope.svg │ │ │ ├── terminal-browser.svg │ │ │ ├── terminal-circle.svg │ │ │ ├── terminal-square.svg │ │ │ ├── terminal.svg │ │ │ ├── text-input.svg │ │ │ ├── thermometer-01.svg │ │ │ ├── thermometer-02.svg │ │ │ ├── thermometer-03.svg │ │ │ ├── thermometer-cold.svg │ │ │ ├── thermometer-warm.svg │ │ │ ├── thumbs-down.svg │ │ │ ├── thumbs-up.svg │ │ │ ├── ticket-01.svg │ │ │ ├── ticket-02.svg │ │ │ ├── toggle-01-left.svg │ │ │ ├── toggle-01-right.svg │ │ │ ├── toggle-02-left.svg │ │ │ ├── toggle-02-right.svg │ │ │ ├── toggle-03-left.svg │ │ │ ├── toggle-03-right.svg │ │ │ ├── tool-01.svg │ │ │ ├── tool-02.svg │ │ │ ├── train.svg │ │ │ ├── tram.svg │ │ │ ├── transform.svg │ │ │ ├── translate-01.svg │ │ │ ├── translate-02.svg │ │ │ ├── trash-01.svg │ │ │ ├── trash-02.svg │ │ │ ├── trash-03.svg │ │ │ ├── trash-04.svg │ │ │ ├── trend-down-01.svg │ │ │ ├── trend-down-02.svg │ │ │ ├── trend-up-01.svg │ │ │ ├── trend-up-02.svg │ │ │ ├── triangle.svg │ │ │ ├── trophy-01.svg │ │ │ ├── trophy-02.svg │ │ │ ├── truck-01.svg │ │ │ ├── truck-02.svg │ │ │ ├── tv-01.svg │ │ │ ├── tv-02.svg │ │ │ ├── tv-03.svg │ │ │ ├── type-01.svg │ │ │ ├── type-02.svg │ │ │ ├── type-square.svg │ │ │ ├── type-strikethrough-01.svg │ │ │ ├── type-strikethrough-02.svg │ │ │ ├── umbrella-01.svg │ │ │ ├── umbrella-02.svg │ │ │ ├── umbrella-03.svg │ │ │ ├── underline-01.svg │ │ │ ├── underline-02.svg │ │ │ ├── underline-square.svg │ │ │ ├── upload-01.svg │ │ │ ├── upload-02.svg │ │ │ ├── upload-03.svg │ │ │ ├── upload-04.svg │ │ │ ├── upload-cloud-01.svg │ │ │ ├── upload-cloud-02.svg │ │ │ ├── usb-flash-drive.svg │ │ │ ├── user-01.svg │ │ │ ├── user-02.svg │ │ │ ├── user-03.svg │ │ │ ├── user-check-01.svg │ │ │ ├── user-check-02.svg │ │ │ ├── user-circle.svg │ │ │ ├── user-down-01.svg │ │ │ ├── user-down-02.svg │ │ │ ├── user-edit.svg │ │ │ ├── user-left-01.svg │ │ │ ├── user-left-02.svg │ │ │ ├── user-minus-01.svg │ │ │ ├── user-minus-02.svg │ │ │ ├── user-plus-01.svg │ │ │ ├── user-plus-02.svg │ │ │ ├── user-right-01.svg │ │ │ ├── user-right-02.svg │ │ │ ├── user-square.svg │ │ │ ├── user-up-01.svg │ │ │ ├── user-up-02.svg │ │ │ ├── user-x-01.svg │ │ │ ├── user-x-02.svg │ │ │ ├── users-01.svg │ │ │ ├── users-02.svg │ │ │ ├── users-03.svg │ │ │ ├── users-check.svg │ │ │ ├── users-down.svg │ │ │ ├── users-edit.svg │ │ │ ├── users-left.svg │ │ │ ├── users-minus.svg │ │ │ ├── users-plus.svg │ │ │ ├── users-right.svg │ │ │ ├── users-up.svg │ │ │ ├── users-x.svg │ │ │ ├── variable.svg │ │ │ ├── video-recorder-off.svg │ │ │ ├── video-recorder.svg │ │ │ ├── virus.svg │ │ │ ├── voicemail.svg │ │ │ ├── volume-max.svg │ │ │ ├── volume-min.svg │ │ │ ├── volume-minus.svg │ │ │ ├── volume-plus.svg │ │ │ ├── volume-x.svg │ │ │ ├── wallet-01.svg │ │ │ ├── wallet-02.svg │ │ │ ├── wallet-03.svg │ │ │ ├── wallet-04.svg │ │ │ ├── wallet-05.svg │ │ │ ├── watch-circle.svg │ │ │ ├── watch-square.svg │ │ │ ├── waves.svg │ │ │ ├── webcam-01.svg │ │ │ ├── webcam-02.svg │ │ │ ├── wifi-off.svg │ │ │ ├── wifi.svg │ │ │ ├── wind-01.svg │ │ │ ├── wind-02.svg │ │ │ ├── wind-03.svg │ │ │ ├── x-circle.svg │ │ │ ├── x-close.svg │ │ │ ├── x-square.svg │ │ │ ├── x.svg │ │ │ ├── youtube.svg │ │ │ ├── zap-circle.svg │ │ │ ├── zap-fast.svg │ │ │ ├── zap-off.svg │ │ │ ├── zap-square.svg │ │ │ ├── zap.svg │ │ │ ├── zoom-in.svg │ │ │ └── zoom-out.svg │ │ ├── img │ │ │ ├── HELLO.svg │ │ │ ├── bg-dots.svg │ │ │ ├── clouds.svg │ │ │ ├── cover-img.svg │ │ │ ├── maintenance-img.svg │ │ │ └── mountains.svg │ │ ├── index.css │ │ └── logo.svg │ ├── components │ │ ├── card-box │ │ │ ├── CardBox.vue │ │ │ └── index.ts │ │ ├── icon │ │ │ ├── Icon.stories.ts │ │ │ ├── Icon.vue │ │ │ └── index.ts │ │ ├── locale-switch │ │ │ ├── LocaleSwitch.stories.ts │ │ │ ├── LocaleSwitch.vue │ │ │ └── index.ts │ │ ├── login │ │ │ ├── LoginCategoriesDropdown.vue │ │ │ ├── LoginCategorySelect.stories.ts │ │ │ ├── LoginCategorySelect.vue │ │ │ ├── LoginNotification.vue │ │ │ ├── LoginProviderExternal.stories.ts │ │ │ ├── LoginProviderExternal.vue │ │ │ ├── LoginProviderForm.stories.ts │ │ │ ├── LoginProviderForm.vue │ │ │ └── index.ts │ │ ├── migration │ │ │ ├── MigrationItemBox.vue │ │ │ ├── MigrationItemTable.vue │ │ │ ├── MigrationResultItem.vue │ │ │ └── index.ts │ │ ├── navbar │ │ │ ├── Navbar.vue │ │ │ ├── NavbarItem.stories.ts │ │ │ ├── NavbarItem.vue │ │ │ └── index.ts │ │ ├── register │ │ │ ├── RegisterForm.vue │ │ │ └── index.ts │ │ └── ui │ │ │ ├── accordion │ │ │ ├── Accordion.vue │ │ │ ├── AccordionContent.vue │ │ │ ├── AccordionItem.vue │ │ │ ├── AccordionTrigger.vue │ │ │ └── index.ts │ │ │ ├── alert │ │ │ ├── Alert.stories.ts │ │ │ ├── Alert.vue │ │ │ ├── AlertDescription.vue │ │ │ ├── AlertTitle.vue │ │ │ └── index.ts │ │ │ ├── auto-form │ │ │ ├── AutoForm.vue │ │ │ ├── AutoFormField.vue │ │ │ ├── AutoFormFieldArray.vue │ │ │ ├── AutoFormFieldBoolean.vue │ │ │ ├── AutoFormFieldDate.vue │ │ │ ├── AutoFormFieldEnum.vue │ │ │ ├── AutoFormFieldFile.vue │ │ │ ├── AutoFormFieldInput.vue │ │ │ ├── AutoFormFieldNumber.vue │ │ │ ├── AutoFormFieldObject.vue │ │ │ ├── AutoFormLabel.vue │ │ │ ├── constant.ts │ │ │ ├── dependencies.ts │ │ │ ├── index.ts │ │ │ ├── interface.ts │ │ │ └── utils.ts │ │ │ ├── avatar │ │ │ ├── Avatar.stories.ts │ │ │ ├── Avatar.vue │ │ │ ├── AvatarFallback.vue │ │ │ ├── AvatarImage.vue │ │ │ └── index.ts │ │ │ ├── button │ │ │ ├── Button.stories.ts │ │ │ ├── Button.vue │ │ │ └── index.ts │ │ │ ├── calendar │ │ │ ├── Calendar.vue │ │ │ ├── CalendarCell.vue │ │ │ ├── CalendarCellTrigger.vue │ │ │ ├── CalendarGrid.vue │ │ │ ├── CalendarGridBody.vue │ │ │ ├── CalendarGridHead.vue │ │ │ ├── CalendarGridRow.vue │ │ │ ├── CalendarHeadCell.vue │ │ │ ├── CalendarHeader.vue │ │ │ ├── CalendarHeading.vue │ │ │ ├── CalendarNextButton.vue │ │ │ ├── CalendarPrevButton.vue │ │ │ └── index.ts │ │ │ ├── checkbox │ │ │ ├── Checkbox.vue │ │ │ └── index.ts │ │ │ ├── command │ │ │ ├── Command.stories.ts │ │ │ ├── Command.vue │ │ │ ├── CommandDialog.vue │ │ │ ├── CommandEmpty.vue │ │ │ ├── CommandGroup.vue │ │ │ ├── CommandInput.vue │ │ │ ├── CommandItem.vue │ │ │ ├── CommandList.vue │ │ │ ├── CommandSeparator.vue │ │ │ ├── CommandShortcut.vue │ │ │ └── index.ts │ │ │ ├── dialog │ │ │ ├── Dialog.vue │ │ │ ├── DialogClose.vue │ │ │ ├── DialogContent.vue │ │ │ ├── DialogDescription.vue │ │ │ ├── DialogFooter.vue │ │ │ ├── DialogHeader.vue │ │ │ ├── DialogScrollContent.vue │ │ │ ├── DialogTitle.vue │ │ │ ├── DialogTrigger.vue │ │ │ └── index.ts │ │ │ ├── form │ │ │ ├── FormControl.vue │ │ │ ├── FormDescription.vue │ │ │ ├── FormItem.vue │ │ │ ├── FormLabel.vue │ │ │ ├── FormMessage.vue │ │ │ ├── index.ts │ │ │ ├── injectionKeys.ts │ │ │ └── useFormField.ts │ │ │ ├── input │ │ │ ├── Input.stories.ts │ │ │ ├── Input.vue │ │ │ └── index.ts │ │ │ ├── label │ │ │ ├── Label.stories.ts │ │ │ ├── Label.vue │ │ │ └── index.ts │ │ │ ├── popover │ │ │ ├── Popover.vue │ │ │ ├── PopoverContent.vue │ │ │ ├── PopoverTrigger.vue │ │ │ └── index.ts │ │ │ ├── radio-group │ │ │ ├── RadioGroup.vue │ │ │ ├── RadioGroupItem.vue │ │ │ └── index.ts │ │ │ ├── select │ │ │ ├── Select.stories.ts │ │ │ ├── Select.vue │ │ │ ├── SelectContent.vue │ │ │ ├── SelectGroup.vue │ │ │ ├── SelectItem.vue │ │ │ ├── SelectItemText.vue │ │ │ ├── SelectLabel.vue │ │ │ ├── SelectScrollDownButton.vue │ │ │ ├── SelectScrollUpButton.vue │ │ │ ├── SelectSeparator.vue │ │ │ ├── SelectTrigger.vue │ │ │ ├── SelectValue.vue │ │ │ └── index.ts │ │ │ ├── separator │ │ │ ├── Separator.vue │ │ │ └── index.ts │ │ │ ├── skeleton │ │ │ ├── Skeleton.stories.ts │ │ │ ├── Skeleton.vue │ │ │ └── index.ts │ │ │ ├── switch │ │ │ ├── Switch.stories.ts │ │ │ ├── Switch.vue │ │ │ └── index.ts │ │ │ ├── textarea │ │ │ ├── Textarea.vue │ │ │ └── index.ts │ │ │ └── tooltip │ │ │ ├── Tooltip.stories.ts │ │ │ ├── Tooltip.vue │ │ │ ├── TooltipContent.vue │ │ │ ├── TooltipProvider.vue │ │ │ ├── TooltipTrigger.vue │ │ │ └── index.ts │ ├── layouts │ │ ├── login │ │ │ ├── LoginLayout.stories.ts │ │ │ ├── LoginLayout.vue │ │ │ └── index.ts │ │ ├── maintenance │ │ │ ├── MaintenanceLayout.vue │ │ │ └── index.ts │ │ └── single-page │ │ │ ├── SinglePageLayout.vue │ │ │ └── index.ts │ ├── lib │ │ ├── auth.ts │ │ ├── constants.ts │ │ ├── i18n.ts │ │ └── utils.ts │ ├── locales │ │ ├── ca-ES.json │ │ ├── en-US.json │ │ ├── es-ES.json │ │ ├── eu-ES.json │ │ └── fr-FR.json │ ├── main.ts │ ├── router │ │ └── index.ts │ ├── stores │ │ └── counter.ts │ └── views │ │ ├── HomeView.vue │ │ ├── LoginView.vue │ │ ├── MaintenanceView.vue │ │ ├── MigrationView.vue │ │ ├── NotificationsView.vue │ │ └── RegisterView.vue ├── tailwind.config.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json ├── tsconfig.vitest.json ├── vite.config.ts └── vitest.config.ts ├── go.mod ├── go.sum ├── guac ├── .github │ └── workflows │ │ └── go.yml ├── .gitignore ├── LICENSE ├── README.md ├── build │ └── package │ │ └── Dockerfile ├── cmd │ └── guac │ │ └── guac.go ├── config.go ├── counted_lock.go ├── counted_lock_test.go ├── doc.go ├── errors.go ├── go.mod ├── go.sum ├── instruction.go ├── instruction_test.go ├── mem_session.go ├── mem_session_test.go ├── server.go ├── status.go ├── stream.go ├── stream_test.go ├── tunnel.go ├── tunnel_map.go ├── tunnel_map_test.go ├── ws_server.go └── ws_server_test.go ├── isardvdi.cfg.example ├── notifier ├── docker │ ├── Dockerfile │ └── requirements.txt └── src │ ├── notifier │ ├── __init__.py │ ├── lib │ │ ├── __init__.py │ │ ├── api_actions.py │ │ └── task.py │ ├── schemas │ │ ├── __init__.py │ │ └── notifier.py │ ├── templates │ │ └── email │ │ │ └── base.html │ └── views │ │ ├── __init__.py │ │ ├── decorators.py │ │ └── views.py │ └── start.py ├── old-frontend ├── .editorconfig ├── .gitignore ├── README.md ├── babel.config.js ├── package.json ├── playwright.config.js ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── assets │ │ ├── global.css │ │ ├── img │ │ │ ├── 400.svg │ │ │ ├── 401.svg │ │ │ ├── 402.svg │ │ │ ├── 403.svg │ │ │ ├── 404.svg │ │ │ ├── 405.svg │ │ │ ├── 500.svg │ │ │ ├── 502.svg │ │ │ ├── export.svg │ │ │ ├── icons │ │ │ │ ├── browser.svg │ │ │ │ └── file.svg │ │ │ ├── logo.png │ │ │ └── mountains.svg │ │ ├── logo.svg │ │ ├── styles.css │ │ ├── styles_small.css │ │ ├── styles_standard.css │ │ ├── styles_xl.css │ │ └── table_styles.css │ ├── components │ │ ├── AllowedForm.vue │ │ ├── AllowedModal.vue │ │ ├── AllowedSelect.vue │ │ ├── BastionModal.vue │ │ ├── Card.vue │ │ ├── CardList.vue │ │ ├── CardSkeleton.vue │ │ ├── Language.vue │ │ ├── ListItemSkeleton.vue │ │ ├── Logo.vue │ │ ├── MessageModal.vue │ │ ├── Modal.vue │ │ ├── NewNavBar.vue │ │ ├── NoVNC.vue │ │ ├── StatusBar.vue │ │ ├── TableList.vue │ │ ├── UpdatePasswordForm.vue │ │ ├── booking │ │ │ ├── BookingStatusBar.vue │ │ │ ├── CantStartNowModal.vue │ │ │ ├── EventModal.vue │ │ │ ├── PlanningModal.vue │ │ │ └── StartNowModal.vue │ │ ├── deployments │ │ │ ├── DeploymentCard.vue │ │ │ ├── DeploymentCoOwnersForm.vue │ │ │ ├── DeploymentLoadingModal.vue │ │ │ ├── DeploymentModal.vue │ │ │ └── DeploymentUserPermissions.vue │ │ ├── desktops │ │ │ ├── Button.vue │ │ │ ├── DesktopModal.vue │ │ │ ├── DesktopNewSkeleton.vue │ │ │ └── DesktopsFilter.vue │ │ ├── directViewer │ │ │ ├── DirectLinkModal.vue │ │ │ ├── DirectViewerButton.vue │ │ │ ├── DirectViewerHelpRDP.vue │ │ │ ├── DirectViewerHelpSpice.vue │ │ │ ├── DirectViewerSkeleton.vue │ │ │ └── ResetModal.vue │ │ ├── domain │ │ │ ├── DomainBastion.vue │ │ │ ├── DomainBookables.vue │ │ │ ├── DomainCredentials.vue │ │ │ ├── DomainHardware.vue │ │ │ ├── DomainImage.vue │ │ │ ├── DomainInfo.vue │ │ │ ├── DomainMedia.vue │ │ │ ├── DomainOSHardwareTemplate.vue │ │ │ └── DomainViewers.vue │ │ ├── images │ │ │ └── IsardImage.vue │ │ ├── media │ │ │ └── DeleteMediaModal.vue │ │ ├── profile │ │ │ ├── ApiKeyModal.vue │ │ │ ├── EmailVerificationModal.vue │ │ │ ├── ImportUserModal.vue │ │ │ ├── PasswordModal.vue │ │ │ ├── ProfileCardSkeleton.vue │ │ │ └── QuotaProgressBar.vue │ │ ├── recycleBin │ │ │ ├── RecycleBinModal.vue │ │ │ └── RecycleBinSkeleton.vue │ │ ├── shared │ │ │ ├── IsardButtViewerText.vue │ │ │ ├── IsardCalendar.vue │ │ │ ├── IsardDropdown.vue │ │ │ ├── IsardSearchSelect.vue │ │ │ ├── IsardTable.vue │ │ │ └── PoweredBy.vue │ │ ├── storage │ │ │ └── IncreaseModal.vue │ │ └── templates │ │ │ ├── ConvertToDesktopModal.vue │ │ │ └── DeleteTemplateModal.vue │ ├── helpers │ │ └── cookies.js │ ├── i18n.js │ ├── layouts │ │ └── MainLayout.vue │ ├── lib │ │ ├── GuacMouse.js │ │ ├── clipboard.js │ │ └── states.js │ ├── locales │ │ ├── ca.json │ │ ├── de.json │ │ ├── en.json │ │ ├── eo.json │ │ ├── es.json │ │ ├── eu.json │ │ ├── fr.json │ │ ├── hi.json │ │ ├── ko.json │ │ ├── pl.json │ │ ├── ru.json │ │ └── zh_Hans.json │ ├── main.js │ ├── pages │ │ ├── Booking.vue │ │ ├── BookingsSummary.vue │ │ ├── Deployment.vue │ │ ├── DeploymentEdit.vue │ │ ├── DeploymentNew.vue │ │ ├── DeploymentVideowall.vue │ │ ├── Deployments.vue │ │ ├── DesktopNew.vue │ │ ├── Desktops.vue │ │ ├── Disclaimer.vue │ │ ├── DomainEdit.vue │ │ ├── ExportUser.vue │ │ ├── ForgotPassword.vue │ │ ├── Media.vue │ │ ├── MediaNew.vue │ │ ├── NewFromMedia.vue │ │ ├── Planning.vue │ │ ├── Profile.vue │ │ ├── RecycleBin.vue │ │ ├── RecycleBins.vue │ │ ├── ResetPassword.vue │ │ ├── Storage.vue │ │ ├── TemplateNew.vue │ │ ├── Templates.vue │ │ └── VerifyEmail.vue │ ├── router │ │ └── index.js │ ├── shared │ │ ├── constants.js │ │ └── desktopConfig.js │ ├── store │ │ ├── index.js │ │ └── modules │ │ │ ├── allowed.js │ │ │ ├── auth.js │ │ │ ├── booking.js │ │ │ ├── config.js │ │ │ ├── deployment.js │ │ │ ├── deployments.js │ │ │ ├── desktops.js │ │ │ ├── domain.js │ │ │ ├── media.js │ │ │ ├── messageTemplate.js │ │ │ ├── planning.js │ │ │ ├── profile.js │ │ │ ├── recycleBin.js │ │ │ ├── snotify.js │ │ │ ├── sockets.js │ │ │ ├── storage.js │ │ │ ├── template.js │ │ │ ├── templates.js │ │ │ └── vpn.js │ ├── utils │ │ ├── allowedUtils.js │ │ ├── axios.js │ │ ├── bookingEventsSettings.js │ │ ├── bookingUtils.js │ │ ├── configUtils.js │ │ ├── dateUtils.js │ │ ├── deploymentsUtils.js │ │ ├── desktopsUtils.js │ │ ├── directViewerUtils.js │ │ ├── domainsUtils.js │ │ ├── errorUtils.js │ │ ├── i18n-validators.js │ │ ├── imageUtils.js │ │ ├── mediaUtils.js │ │ ├── messageUtils.js │ │ ├── planningEventsSettings.js │ │ ├── planningUtils.js │ │ ├── profileUtils.js │ │ ├── recycleBinUtils.js │ │ ├── section-config.js │ │ ├── socket-instance.js │ │ ├── storageUtils.js │ │ └── stringUtils.js │ └── views │ │ ├── DirectViewer.vue │ │ ├── Error.vue │ │ ├── Maintenance.vue │ │ ├── NotFound.vue │ │ └── Rdp.vue ├── tests.sh ├── tests │ └── e2e │ │ ├── admin │ │ ├── desktops-page.js │ │ ├── desktops.spec.js │ │ ├── downloads-page.js │ │ ├── downloads.spec.js │ │ ├── resources-page.js │ │ ├── resources.spec.js │ │ ├── users-page.js │ │ └── users-page.spec.js │ │ ├── base.js │ │ ├── desktops-page.js │ │ ├── desktops.spec.js │ │ ├── login-page.js │ │ ├── login.spec.js │ │ ├── navbar.js │ │ ├── navbar.spec.js │ │ ├── register-page.js │ │ └── templates-page.js ├── vue.config.js └── yarn.lock ├── openapi-ts.config.ts ├── orchestrator ├── build │ └── package │ │ └── Dockerfile ├── cfg │ └── cfg.go ├── cmd │ └── orchestrator │ │ └── main.go ├── log │ ├── cfg.go │ ├── generics.go │ ├── operations.go │ └── orchestrator.go └── orchestrator │ ├── cleanup.go │ ├── cleanup_internal_test.go │ ├── director │ ├── chamaleon.go │ ├── chamaleon_gpu_profiles.go │ ├── chamaleon_gpu_profiles.json │ ├── chamaleon_test.go │ ├── director.go │ ├── director_internal_test.go │ ├── rata.go │ ├── rata_internal_test.go │ └── rata_test.go │ ├── hypervisor.go │ ├── hypervisor_internal_test.go │ ├── orchestrator.go │ └── orchestrator_test.go ├── pkg ├── cfg │ ├── cfg.go │ └── cfg_test.go ├── db │ ├── db.go │ └── err.go ├── grpc │ ├── client.go │ ├── observability.go │ └── server.go ├── http │ └── client.go ├── jwt │ └── jwt.go ├── log │ ├── log.go │ └── log_test.go ├── oas │ ├── api │ │ └── api.json │ ├── authentication │ │ └── authentication.json │ └── notifier │ │ └── notifier.json ├── proto │ ├── check │ │ └── v1 │ │ │ └── check.proto │ ├── operations │ │ └── v1 │ │ │ └── operations.proto │ └── sessions │ │ └── v1 │ │ └── sessions.proto ├── redis │ ├── model.go │ ├── model_test.go │ └── redis.go ├── sdk │ ├── .mockery.yaml │ ├── README.md │ ├── admin.go │ ├── admin_user.go │ ├── authentication.go │ ├── cfg.go │ ├── client.go │ ├── desktop.go │ ├── domain.go │ ├── errors.go │ ├── errors_test.go │ ├── go.mod │ ├── go.sum │ ├── hypervisor.go │ ├── orchestrator.go │ ├── stats.go │ ├── template.go │ ├── types.go │ ├── user.go │ └── version.go ├── ssh │ └── ssh.go └── tls │ └── reloader.go ├── pyproject.toml ├── rdpgw ├── build │ └── package │ │ └── Dockerfile ├── cfg │ └── cfg.go ├── cmd │ └── rdpgw │ │ └── main.go ├── rdpgw │ └── rdpgw.go └── transport │ └── http │ └── http.go ├── scheduler ├── docker │ ├── Dockerfile │ └── requirements.txt └── src │ ├── scheduler │ ├── __init__.py │ ├── auth │ │ └── __init__.py │ ├── lib │ │ ├── actions.py │ │ ├── api_client.py │ │ ├── exceptions.py │ │ ├── flask_rethink.py │ │ ├── load_config.py │ │ ├── log.py │ │ └── scheduler.py │ ├── schemas │ │ └── interval.yml │ └── views │ │ ├── SchedulerView.py │ │ └── decorators.py │ ├── start.py │ ├── wsgi.ini │ └── wsgi.py ├── sessions ├── build │ └── package │ │ └── Dockerfile ├── cfg │ └── cfg.go ├── cmd │ └── sessions │ │ └── main.go ├── model │ ├── session.go │ └── user.go ├── sessions │ ├── sessions.go │ └── sessions_test.go └── transport │ └── grpc │ ├── grpc.go │ └── grpc_test.go ├── stats ├── build │ └── package │ │ ├── Dockerfile │ │ └── run.sh ├── cfg │ └── cfg.go ├── cmd │ └── stats │ │ └── main.go ├── collector │ ├── collector.go │ ├── conntrack.go │ ├── domain.go │ ├── domain_internal_test.go │ ├── hypervisor.go │ ├── isardvdi-api.go │ ├── isardvdi-authentication.go │ ├── oci.go │ ├── socket.go │ └── system.go └── transport │ └── http │ └── http.go ├── sysadm ├── 01-sshd.conf ├── INSTALL.md ├── README.md ├── compose ├── db.devel.yml ├── debian_docker.sh ├── debian_firewall.sh ├── isard-upgrade-cron.sh ├── isardvdi.service └── pacemaker-upgrade-cron.sh ├── testing ├── TESTING.md ├── docker-compose.yml ├── hypers │ ├── isard-hypervisor1.yml │ ├── isard-hypervisor2.yml │ ├── isard-hypervisor3.yml │ └── isard-hypervisor4.yml ├── selenium │ └── Dockerfile └── src │ ├── selenium_remote.py │ ├── test_login_logout.py │ └── test_requirements.py ├── webapp ├── docker │ ├── Dockerfile │ ├── healthcheck.js │ └── requirements.txt └── webapp │ ├── start.py │ └── webapp │ ├── __init__.py │ ├── auth │ ├── __init__.py │ └── authentication.py │ ├── lib │ ├── __init__.py │ ├── flask_rethink.py │ ├── load_config.py │ └── log.py │ ├── package.json │ ├── static │ ├── admin │ │ └── js │ │ │ ├── analytics.js │ │ │ ├── analytics_config.js │ │ │ ├── analytics_usage.js │ │ │ ├── authentication.js │ │ │ ├── bookables.js │ │ │ ├── bookables_events.js │ │ │ ├── bookables_priority.js │ │ │ ├── categories_management.js │ │ │ ├── categories_quotas_limits.js │ │ │ ├── deployments.js │ │ │ ├── desktops.js │ │ │ ├── desktops_priority.js │ │ │ ├── desktops_status.js │ │ │ ├── domains_resources.js │ │ │ ├── echarts.js │ │ │ ├── external_apps.js │ │ │ ├── filters.js │ │ │ ├── groups_management.js │ │ │ ├── groups_quotas_limits.js │ │ │ ├── hypervisors.js │ │ │ ├── hypervisors_detail.js │ │ │ ├── hypervisors_gpus.js │ │ │ ├── hypervisors_pools.js │ │ │ ├── login.js │ │ │ ├── logs_desktops.js │ │ │ ├── logs_desktops_config.js │ │ │ ├── logs_users.js │ │ │ ├── logs_users_config.js │ │ │ ├── media.js │ │ │ ├── migration.js │ │ │ ├── notifications.js │ │ │ ├── notifications_logs.js │ │ │ ├── notifications_manage.js │ │ │ ├── operations.js │ │ │ ├── orchestrator_hypervisors.js │ │ │ ├── queues.js │ │ │ ├── queues_config.js │ │ │ ├── recycle_bin_config.js │ │ │ ├── recyclebin_domains.js │ │ │ ├── roles.js │ │ │ ├── schedulers.js │ │ │ ├── socketio.js │ │ │ ├── storage.js │ │ │ ├── storage_pools.js │ │ │ ├── system.js │ │ │ ├── templates.js │ │ │ ├── updates.js │ │ │ ├── usage.js │ │ │ ├── usage_config.js │ │ │ ├── user_storage.js │ │ │ ├── users_management.js │ │ │ ├── users_pwd_policies.js │ │ │ ├── users_quotas_limits.js │ │ │ └── viewers_config.js │ ├── css │ │ ├── custom.css │ │ └── d3-bubble.css │ ├── gulp │ │ └── README.md │ ├── img │ │ ├── agplv3-155x51.png │ │ ├── cloud.png │ │ ├── fakeuser.png │ │ ├── isard.png │ │ ├── isard.svg │ │ ├── isard_50x50.gif │ │ ├── isard_50x50_white.gif │ │ ├── isard_logo.png │ │ ├── isard_white.png │ │ └── user.png │ ├── isard.css │ ├── isard.js │ └── js │ │ ├── auth.js │ │ ├── quota.js │ │ ├── restful.js │ │ ├── snippets │ │ ├── alloweds.js │ │ ├── desktop_add.js │ │ ├── domain_genealogy.js │ │ ├── domain_hardware.js │ │ ├── domain_hotplugged.js │ │ ├── form_items.js │ │ ├── media.js │ │ ├── quota.js │ │ └── render_table.js │ │ ├── version.js │ │ └── viewer.js │ ├── templates │ ├── admin │ │ └── pages │ │ │ ├── analytics.html │ │ │ ├── analytics_config.html │ │ │ ├── analytics_modals.html │ │ │ ├── authentication.html │ │ │ ├── authentication_modals.html │ │ │ ├── bookables.html │ │ │ ├── bookables_detail.html │ │ │ ├── bookables_events.html │ │ │ ├── bookables_modals.html │ │ │ ├── bookables_priority.html │ │ │ ├── bookables_priority_detail.html │ │ │ ├── bookables_priority_modals.html │ │ │ ├── booking_planning_detail.html │ │ │ ├── categories_detail_management.html │ │ │ ├── categories_detail_quotas_limits.html │ │ │ ├── deployments.html │ │ │ ├── deployments_detail.html │ │ │ ├── deployments_modals.html │ │ │ ├── desktops.html │ │ │ ├── desktops_priority_detail.html │ │ │ ├── desktops_priority_modals.html │ │ │ ├── desktops_status.html │ │ │ ├── domains_modals.html │ │ │ ├── domains_resources.html │ │ │ ├── domains_resources_modals.html │ │ │ ├── groups_detail_management.html │ │ │ ├── groups_detail_quotas_limits.html │ │ │ ├── hypervisor_pool_detail.html │ │ │ ├── hypervisors.html │ │ │ ├── hypervisors_detail.html │ │ │ ├── hypervisors_modals.html │ │ │ ├── login.html │ │ │ ├── login_modals.html │ │ │ ├── logs_desktops.html │ │ │ ├── logs_desktops_config.html │ │ │ ├── logs_users.html │ │ │ ├── logs_users_config.html │ │ │ ├── media.html │ │ │ ├── media_detail.html │ │ │ ├── media_modals.html │ │ │ ├── migration.html │ │ │ ├── migration_detail.html │ │ │ ├── notifications_detail.html │ │ │ ├── notifications_logs.html │ │ │ ├── notifications_logs_detail.html │ │ │ ├── notifications_manage.html │ │ │ ├── notifications_modals.html │ │ │ ├── notifications_templates.html │ │ │ ├── operations.html │ │ │ ├── queues.html │ │ │ ├── queues_config.html │ │ │ ├── recyclebin_config.html │ │ │ ├── recyclebin_config_modals.html │ │ │ ├── recyclebin_domains.html │ │ │ ├── recyclebin_domains_detail.html │ │ │ ├── roles_detail_management.html │ │ │ ├── schedulers.html │ │ │ ├── schedulers_modals.html │ │ │ ├── storage.html │ │ │ ├── storage_detail.html │ │ │ ├── storage_modals.html │ │ │ ├── storage_pools.html │ │ │ ├── storage_pools_detail.html │ │ │ ├── storage_pools_modals.html │ │ │ ├── system.html │ │ │ ├── system_modals.html │ │ │ ├── templates.html │ │ │ ├── templates_detail.html │ │ │ ├── updates.html │ │ │ ├── usage.html │ │ │ ├── usage_config.html │ │ │ ├── usage_modals.html │ │ │ ├── user_storage.html │ │ │ ├── user_storage_detail.html │ │ │ ├── user_storage_modals.html │ │ │ ├── users_detail_management.html │ │ │ ├── users_detail_quotas_limits.html │ │ │ ├── users_management.html │ │ │ ├── users_modals_management.html │ │ │ ├── users_modals_quotas_limits.html │ │ │ ├── users_pwd_policies.html │ │ │ ├── users_pwd_policies_modals.html │ │ │ ├── users_quotas_limits.html │ │ │ ├── viewers_config.html │ │ │ └── viewers_config_modals.html │ ├── base.html │ ├── footer.html │ ├── header.html │ ├── maintenance.html │ ├── page_404.html │ ├── page_500.html │ ├── pages │ │ ├── about.html │ │ ├── desktops_detail.html │ │ ├── desktops_modals.html │ │ ├── desktops_viewers.html │ │ └── templates_detail.html │ ├── sidebar.html │ └── snippets │ │ ├── alloweds.html │ │ ├── alloweds_add.html │ │ ├── alloweds_form.html │ │ ├── domain_genealogy.html │ │ ├── domain_hardware.html │ │ ├── domain_hardware_disksize_edit.html │ │ ├── domain_hardware_edit.html │ │ ├── domain_hotplugged.html │ │ ├── domain_reservables_edit.html │ │ ├── filters.html │ │ ├── media.html │ │ ├── migration_items_result.html │ │ ├── quota.html │ │ ├── quota_edit.html │ │ ├── storage_tree.html │ │ └── template_tree.html │ ├── views │ ├── AdminViews.py │ ├── __init__.py │ └── decorators.py │ └── yarn.lock └── websockify ├── build └── package │ └── Dockerfile └── cmd └── websockify └── main.go /.commitlintrc.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: ['@commitlint/config-conventional'] 3 | } 4 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | frontend/node_modules 2 | old-frontend/node_modules 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Please create issues in gitlab.com project 4 | url: https://gitlab.com/isard/isardvdi/-/issues/new 5 | about: Use open button to go to gitlab.com project issue creation from 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "docker/static/noVNC/src"] 2 | path = docker/static/noVNC/src 3 | url = https://github.com/novnc/novnc 4 | branch = master 5 | [submodule "docker/static/spice-ts"] 6 | path = docker/static/spice-ts 7 | url = https://gitlab.com/nefix/spice-ts 8 | branch = "main" 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.format.enable": true, 3 | "eslint.workingDirectories": [ 4 | "frontend" 5 | ], 6 | "[vue]": { 7 | "editor.defaultFormatter": "dbaeumer.vscode-eslint" 8 | } 9 | } -------------------------------------------------------------------------------- /api/src/api/schemas/allowed.yml: -------------------------------------------------------------------------------- 1 | allowed: 2 | schema: allowed 3 | -------------------------------------------------------------------------------- /api/src/api/schemas/analytics_graph_update.yml: -------------------------------------------------------------------------------- 1 | grouping: 2 | type: string 3 | coerce: sanitize 4 | priority: 5 | type: integer 6 | x_axis_days: 7 | type: integer 8 | min: 1 9 | title: 10 | type: string 11 | maxlength: 40 12 | coerce: sanitize 13 | subtitle: 14 | type: string 15 | maxlength: 40 16 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/category_update_quota.yml: -------------------------------------------------------------------------------- 1 | id: 2 | type: string 3 | coerce: sanitize 4 | quota: 5 | type: 6 | - dict 7 | - boolean 8 | schema: quotas 9 | role: 10 | type: string -------------------------------------------------------------------------------- /api/src/api/schemas/co_owners.yml: -------------------------------------------------------------------------------- 1 | co_owners: 2 | type: list 3 | required: true 4 | schema: 5 | required: false 6 | type: string 7 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/desktop_reservables_update.yml: -------------------------------------------------------------------------------- 1 | reservables: 2 | type: dict 3 | schema: 4 | vgpus: 5 | type: list 6 | nullable: true 7 | schema: 8 | type: string 9 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/email_confirmation.yml: -------------------------------------------------------------------------------- 1 | email: 2 | required: true 3 | type: string 4 | regex: "^[A-Za-z0-9._@%+-]+$" -------------------------------------------------------------------------------- /api/src/api/schemas/group_update_quota.yml: -------------------------------------------------------------------------------- 1 | id: 2 | type: string 3 | coerce: sanitize 4 | quota: 5 | type: 6 | - dict 7 | - boolean 8 | schema: quotas 9 | role: 10 | type: string 11 | coerce: sanitize 12 | limits: 13 | type: 14 | - dict 15 | - boolean 16 | schema: limits -------------------------------------------------------------------------------- /api/src/api/schemas/login_notification.yml: -------------------------------------------------------------------------------- 1 | cover: 2 | schema: login_notification 3 | form: 4 | schema: login_notification -------------------------------------------------------------------------------- /api/src/api/schemas/maintenance_text.yml: -------------------------------------------------------------------------------- 1 | title: 2 | type: string 3 | required: true 4 | coerce: sanitize 5 | maxlength: 100 6 | body: 7 | type: string 8 | required: true 9 | maxlength: 500 10 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/migration_exception.yml: -------------------------------------------------------------------------------- 1 | item_type: 2 | type: string 3 | required: true 4 | allowed: 5 | - categories 6 | - users 7 | - groups 8 | - roles 9 | coerce: sanitize 10 | item_ids: 11 | type: list 12 | required: true 13 | schema: 14 | type: string 15 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/role_update.yml: -------------------------------------------------------------------------------- 1 | name: 2 | maxlength: 50 3 | type: string 4 | coerce: sanitize 5 | description: 6 | maxlength: 255 7 | type: string 8 | coerce: sanitize 9 | id: 10 | type: string 11 | allowed: 12 | - user 13 | - advanced 14 | - manager 15 | - admin -------------------------------------------------------------------------------- /api/src/api/schemas/secrets_delete.yml: -------------------------------------------------------------------------------- 1 | id: 2 | required: true 3 | type: string 4 | empty: false 5 | forbidden: 6 | - isardvdi 7 | - isardvdi-hypervisors 8 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/snippets/check_quotas_update.yml: -------------------------------------------------------------------------------- 1 | check_quotas: 2 | type: boolean 3 | required: true -------------------------------------------------------------------------------- /api/src/api/schemas/template_to_desktop.yml: -------------------------------------------------------------------------------- 1 | name: 2 | maxlength: 50 3 | required: true 4 | type: string 5 | minlength: 4 6 | coerce: sanitize 7 | template_id: 8 | type: string 9 | required: true 10 | coerce: sanitize 11 | children: 12 | type: list 13 | required: false 14 | schema: 15 | type: string 16 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/template_update.yml: -------------------------------------------------------------------------------- 1 | enabled: 2 | type: boolean 3 | required: true -------------------------------------------------------------------------------- /api/src/api/schemas/user_migration_import.yml: -------------------------------------------------------------------------------- 1 | token: 2 | type: string 3 | required: true 4 | empty: false 5 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/user_migration_update.yml: -------------------------------------------------------------------------------- 1 | check_quotas: 2 | type: boolean 3 | schema: check_quotas_update -------------------------------------------------------------------------------- /api/src/api/schemas/user_password_update.yml: -------------------------------------------------------------------------------- 1 | password: 2 | type: string 3 | required: true 4 | empty: false -------------------------------------------------------------------------------- /api/src/api/schemas/user_update_frontend.yml: -------------------------------------------------------------------------------- 1 | password: 2 | type: string 3 | name: 4 | maxlength: 50 5 | type: string 6 | coerce: sanitize 7 | email: 8 | type: string 9 | coerce: sanitize 10 | photo: 11 | type: string 12 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/schemas/user_update_quota.yml: -------------------------------------------------------------------------------- 1 | id: 2 | type: string 3 | coerce: sanitize 4 | quota: 5 | type: 6 | - dict 7 | - boolean 8 | schema: quotas -------------------------------------------------------------------------------- /api/src/api/schemas/virt_pools.yml: -------------------------------------------------------------------------------- 1 | enable_virt_pool: 2 | type: boolean 3 | required: true 4 | id: 5 | type: string 6 | required: true 7 | coerce: sanitize -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/1.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/10.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/11.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/12.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/13.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/14.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/15.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/16.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/17.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/18.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/19.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/2.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/20.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/21.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/22.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/23.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/24.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/25.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/26.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/27.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/28.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/29.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/3.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/30.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/31.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/32.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/33.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/34.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/35.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/36.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/37.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/38.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/39.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/4.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/40.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/41.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/42.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/43.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/44.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/45.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/46.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/47.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/48.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/5.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/6.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/7.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/8.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/9.jpg -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_debian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_debian.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_fedora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_fedora.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_kde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_kde.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_linux.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_slax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_slax.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_ubuntu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_ubuntu.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/os_windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/os_windows.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/sw_illustrator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/sw_illustrator.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/sw_photoshop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/sw_photoshop.png -------------------------------------------------------------------------------- /api/src/api/static/stock_assets/sw_premiere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/static/stock_assets/sw_premiere.png -------------------------------------------------------------------------------- /api/src/api/views/.giosavequMkHw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/views/.giosavequMkHw -------------------------------------------------------------------------------- /api/src/api/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/api/src/api/views/__init__.py -------------------------------------------------------------------------------- /api/src/scripts/api.cfg: -------------------------------------------------------------------------------- 1 | URL=https://localhost 2 | USERNAME=admin 3 | CATEGORY_NAME=Default 4 | CATEGORY_ID=False 5 | PASSWORD=IsardVDI 6 | VERIFY_SSL=False -------------------------------------------------------------------------------- /bastion/transport/ssh/extensions.go: -------------------------------------------------------------------------------- 1 | package ssh 2 | 3 | const ExtensionRemoteUsr = "isardvdi_remote_usr" 4 | const ExtensionRemotePwd = "isardvdi_remote_pwd" 5 | const ExtensionRemoteTargetHost = "isardvdi_remote_target_host" 6 | const ExtensionRemoteTargetPort = "isardvdi_remote_target_port" 7 | -------------------------------------------------------------------------------- /buf.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | modules: 3 | - path: pkg/proto 4 | lint: 5 | use: 6 | - STANDARD 7 | disallow_comment_ignores: true 8 | breaking: 9 | use: 10 | - FILE 11 | except: 12 | - EXTENSION_NO_DELETE 13 | - FIELD_SAME_DEFAULT 14 | -------------------------------------------------------------------------------- /component/core_worker/docker/requirements.txt: -------------------------------------------------------------------------------- 1 | rq==2.0.0 2 | rethinkdb==2.4.10.post1 3 | requests~=2.30 4 | PyJWT==2.8.0 5 | cachetools~=5.3 6 | uuid 7 | betterproto~=1.2.5 8 | -------------------------------------------------------------------------------- /component/core_worker/docker/uuidgen.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | from uuid import uuid4 3 | 4 | print(uuid4()) 5 | -------------------------------------------------------------------------------- /docker-compose-parts/.env: -------------------------------------------------------------------------------- 1 | ../.env -------------------------------------------------------------------------------- /docker-compose-parts/api.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-api: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: api/docker/Dockerfile 7 | target: production 8 | args: 9 | SRC_VERSION_ID: $SRC_VERSION_ID 10 | -------------------------------------------------------------------------------- /docker-compose-parts/api.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-api: 4 | depends_on: 5 | isard-engine: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/api.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-api: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/api.test.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-api: 4 | environment: 5 | # This is also added in authentication.test.yml 6 | - AUTHENTICATION_AUTHENTICATION_LDAP_ENABLED=true 7 | - AUTHENTICATION_AUTHENTICATION_SAML_ENABLED=true 8 | -------------------------------------------------------------------------------- /docker-compose-parts/authentication.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-authentication: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: authentication/build/package/Dockerfile 7 | args: 8 | - "GOLANG_BUILD_IMAGE=${GOLANG_BUILD_IMAGE}" 9 | - "GOLANG_RUN_IMAGE=${GOLANG_RUN_IMAGE}" 10 | -------------------------------------------------------------------------------- /docker-compose-parts/authentication.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-authentication: 4 | depends_on: 5 | isard-db: 6 | condition: service_healthy 7 | isard-redis: 8 | condition: service_healthy 9 | isard-api: 10 | condition: service_healthy 11 | -------------------------------------------------------------------------------- /docker-compose-parts/authentication.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-authentication: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/backupninja.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-backupninja: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/backupninja/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/bastion-open-port.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-bastion: 4 | ports: 5 | - published: ${BASTION_SSH_PORT} 6 | target: 1315 7 | mode: host 8 | -------------------------------------------------------------------------------- /docker-compose-parts/bastion.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-bastion: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: bastion/build/package/Dockerfile 7 | args: 8 | - "GOLANG_BUILD_IMAGE=${GOLANG_BUILD_IMAGE}" 9 | - "GOLANG_RUN_IMAGE=${GOLANG_RUN_IMAGE}" 10 | -------------------------------------------------------------------------------- /docker-compose-parts/bastion.current.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-bastion: 4 | depends_on: 5 | isard-db: 6 | condition: service_healthy 7 | isard-vpn: 8 | condition: service_started 9 | -------------------------------------------------------------------------------- /docker-compose-parts/bastion.legacy.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-bastion: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/db-stats.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-stats-rethinkdb: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/db/Dockerfile.stats 7 | args: 8 | - GOLANG_BUILD_IMAGE 9 | - GOLANG_RUN_IMAGE 10 | -------------------------------------------------------------------------------- /docker-compose-parts/db.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-db: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/db/Dockerfile -------------------------------------------------------------------------------- /docker-compose-parts/engine.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-engine: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: engine/docker/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/engine.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-engine: 4 | depends_on: 5 | isard-db: 6 | condition: service_healthy 7 | isard-redis: 8 | condition: service_healthy 9 | -------------------------------------------------------------------------------- /docker-compose-parts/engine.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-engine: 4 | volumes: 5 | - ${BUILD_ROOT_PATH}/engine/engine:/isard:rw 6 | - ${BUILD_ROOT_PATH}/component/_common/src:/opt/isardvdi/isardvdi_common 7 | environment: 8 | JETBRAINS_REMOTE_RUN: 9 | -------------------------------------------------------------------------------- /docker-compose-parts/haproxy.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-haproxy: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/haproxy/Dockerfile 7 | target: production 8 | args: 9 | HAPROXY_RUN_IMAGE: ${HAPROXY_RUN_IMAGE} 10 | -------------------------------------------------------------------------------- /docker-compose-parts/hypervisor.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-hypervisor: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/hypervisor/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/hypervisor.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-hypervisor: 4 | volumes: 5 | - ${BUILD_ROOT_PATH}/docker/hypervisor/src:/src 6 | - ${BUILD_ROOT_PATH}/component/_common/src:/src/_common 7 | - ${BUILD_ROOT_PATH}/docker/hypervisor/kvm/hooks:/etc/libvirt/hooks 8 | -------------------------------------------------------------------------------- /docker-compose-parts/infrastructure.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-orchestrator: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: orchestrator/build/package/Dockerfile 7 | args: 8 | - "GOLANG_BUILD_IMAGE=${GOLANG_BUILD_IMAGE}" 9 | - "GOLANG_RUN_IMAGE=${GOLANG_RUN_IMAGE}" 10 | -------------------------------------------------------------------------------- /docker-compose-parts/infrastructure.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-orchestrator: 4 | depends_on: 5 | isard-db: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/infrastructure.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-orchestrator: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/monitor-proxy.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-monitor-proxy: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/haproxy/Dockerfile 7 | target: production 8 | args: 9 | HAPROXY_RUN_IMAGE: ${HAPROXY_RUN_IMAGE} 10 | -------------------------------------------------------------------------------- /docker-compose-parts/monitor-proxy.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-monitor-proxy: 4 | environment: 5 | DEVELOPMENT: "true" 6 | volumes: 7 | - ${BUILD_ROOT_PATH}/docker/haproxy/cfg:/usr/local/etc/haproxy/cfg -------------------------------------------------------------------------------- /docker-compose-parts/monitor.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-grafana: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/grafana/Dockerfile 7 | -------------------------------------------------------------------------------- /docker-compose-parts/monitor.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-grafana: 4 | ports: 5 | - "3000:3000" 6 | 7 | isard-prometheus: 8 | ports: 9 | - "9090:9090" 10 | -------------------------------------------------------------------------------- /docker-compose-parts/nc-proxy.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-proxy: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/haproxy/Dockerfile 7 | target: production 8 | args: 9 | HAPROXY_RUN_IMAGE: ${HAPROXY_RUN_IMAGE} 10 | -------------------------------------------------------------------------------- /docker-compose-parts/nc-proxy.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-proxy: 4 | depends_on: 5 | - isard-nc-nginx 6 | -------------------------------------------------------------------------------- /docker-compose-parts/nc-proxy.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-proxy: 4 | environment: 5 | DEVELOPMENT: "true" 6 | volumes: 7 | - ${BUILD_ROOT_PATH}/docker/haproxy/cfg:/usr/local/etc/haproxy/cfg -------------------------------------------------------------------------------- /docker-compose-parts/nc-proxy.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-proxy: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/nc.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-app: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/nextcloud/Dockerfile 7 | args: 8 | - IMG=${NEXTCLOUD_BASE_IMAGE-nextcloud:28.0-fpm-alpine} 9 | -------------------------------------------------------------------------------- /docker-compose-parts/nc.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-app: 4 | depends_on: 5 | isard-postgres: 6 | condition: service_started 7 | isard-nc-redis: 8 | condition: service_healthy 9 | 10 | isard-nc-nginx: 11 | depends_on: 12 | - isard-nc-app 13 | -------------------------------------------------------------------------------- /docker-compose-parts/nc.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-nc-app: 4 | restart: unless-stopped 5 | 6 | isard-nc-nginx: 7 | restart: unless-stopped 8 | 9 | isard-nc-redis: 10 | restart: unless-stopped 11 | -------------------------------------------------------------------------------- /docker-compose-parts/network.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | networks: 3 | isard-network: 4 | driver: bridge 5 | external: false 6 | name: isard-network 7 | ipam: 8 | config: 9 | - subnet: ${DOCKER_NET:-172.31.255}.0/24 10 | -------------------------------------------------------------------------------- /docker-compose-parts/notifier.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-notifier: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: notifier/docker/Dockerfile 7 | 8 | -------------------------------------------------------------------------------- /docker-compose-parts/notifier.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-notifier: 4 | depends_on: 5 | isard-redis: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/notifier.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-notifier: 4 | container_name: isard-notifier 5 | ports: 6 | - "5002:5000" 7 | volumes: 8 | - ${BUILD_ROOT_PATH}/notifier/src:/opt/isardvdi/src 9 | - ${BUILD_ROOT_PATH}/component/_common/src:/opt/isardvdi/isardvdi_common 10 | -------------------------------------------------------------------------------- /docker-compose-parts/notifier.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-notifier: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/portal.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-portal: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/haproxy/Dockerfile 7 | target: production 8 | args: 9 | HAPROXY_RUN_IMAGE: ${HAPROXY_RUN_IMAGE} 10 | -------------------------------------------------------------------------------- /docker-compose-parts/portal.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-portal: 4 | environment: 5 | DEVELOPMENT: "true" 6 | volumes: 7 | - ${BUILD_ROOT_PATH}/docker/haproxy/cfg:/usr/local/etc/haproxy/cfg -------------------------------------------------------------------------------- /docker-compose-parts/postgres.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-postgres: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/scheduler.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-scheduler: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: scheduler/docker/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/scheduler.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-scheduler: 4 | depends_on: 5 | isard-engine: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/scheduler.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-scheduler: 4 | container_name: isard-scheduler 5 | ports: 6 | - "5001:5000" 7 | volumes: 8 | - ${BUILD_ROOT_PATH}/scheduler/src:/src 9 | - ${BUILD_ROOT_PATH}/component/_common/src:/src/scheduler/_common 10 | -------------------------------------------------------------------------------- /docker-compose-parts/scheduler.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-scheduler: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/sessions.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-sessions: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: sessions/build/package/Dockerfile 7 | args: 8 | - "GOLANG_BUILD_IMAGE=${GOLANG_BUILD_IMAGE}" 9 | - "GOLANG_RUN_IMAGE=${GOLANG_RUN_IMAGE}" 10 | -------------------------------------------------------------------------------- /docker-compose-parts/squid-hypervisor.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-squid: 4 | depends_on: 5 | isard-hypervisor: 6 | condition: service_started 7 | -------------------------------------------------------------------------------- /docker-compose-parts/squid.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-squid: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/squid/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/squid.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-squid: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/static.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-static: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/static/Dockerfile 7 | target: production 8 | args: 9 | SRC_VERSION_ID: ${SRC_VERSION_ID} 10 | SRC_VERSION_LINK: ${SRC_VERSION_LINK} 11 | -------------------------------------------------------------------------------- /docker-compose-parts/stats.all-in-one.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-stats-go: 4 | depends_on: 5 | isard-api: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/stats.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | isard-stats-go: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: stats/build/package/Dockerfile 7 | args: 8 | - GOLANG_BUILD_IMAGE 9 | - GOLANG_RUN_IMAGE 10 | -------------------------------------------------------------------------------- /docker-compose-parts/stats.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-stats-go: 4 | restart: unless-stopped 5 | isard-stats-node-exporter: 6 | restart: unless-stopped 7 | isard-grafana: 8 | restart: unless-stopped 9 | isard-loki: 10 | restart: unless-stopped 11 | isard-grafana-agent: 12 | restart: unless-stopped 13 | -------------------------------------------------------------------------------- /docker-compose-parts/storage.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-storage: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/storage/Dockerfile 7 | target: production 8 | -------------------------------------------------------------------------------- /docker-compose-parts/video.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-video: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/haproxy/Dockerfile 7 | target: production 8 | args: 9 | HAPROXY_RUN_IMAGE: ${HAPROXY_RUN_IMAGE} 10 | -------------------------------------------------------------------------------- /docker-compose-parts/video.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-video: 4 | environment: 5 | DEVELOPMENT: "true" 6 | volumes: 7 | - ${BUILD_ROOT_PATH}/docker/haproxy/cfg:/usr/local/etc/haproxy/cfg -------------------------------------------------------------------------------- /docker-compose-parts/vpn.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-vpn: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: docker/vpn/Dockerfile 7 | target: production 8 | args: 9 | DOCKER_IMAGE_PREFIX: ${DOCKER_IMAGE_PREFIX} 10 | DOCKER_IMAGE_TAG: ${DOCKER_IMAGE_TAG} 11 | -------------------------------------------------------------------------------- /docker-compose-parts/vpn.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-vpn: 4 | depends_on: 5 | isard-api: 6 | condition: service_healthy 7 | -------------------------------------------------------------------------------- /docker-compose-parts/vpn.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-vpn: 4 | volumes: 5 | - ${BUILD_ROOT_PATH}/docker/vpn/src:/src 6 | - ${BUILD_ROOT_PATH}/docker/vpn/ovs:/ovs 7 | - ${BUILD_ROOT_PATH}/docker/vpn/dnsmasq-hook:/dnsmasq-hook 8 | - ${BUILD_ROOT_PATH}/docker/vpn/run.sh:/run.sh 9 | -------------------------------------------------------------------------------- /docker-compose-parts/webapp.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-webapp: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: webapp/docker/Dockerfile 7 | args: 8 | SRC_VERSION_ID: $SRC_VERSION_ID 9 | SRC_VERSION_LINK: $SRC_VERSION_LINK 10 | -------------------------------------------------------------------------------- /docker-compose-parts/webapp.current.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-webapp: 4 | depends_on: 5 | isard-engine: 6 | condition: service_healthy 7 | isard-api: 8 | condition: service_healthy 9 | -------------------------------------------------------------------------------- /docker-compose-parts/webapp.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-webapp: 4 | user: root 5 | volumes: 6 | - ${BUILD_ROOT_PATH}/webapp/webapp:/isard:rw 7 | - ${BUILD_ROOT_PATH}/component/_common/src:/isard/webapp/_common 8 | command: sh -c "yarn --cwd /isard/webapp install && python3 -u start.py" 9 | -------------------------------------------------------------------------------- /docker-compose-parts/webapp.legacy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-webapp: 4 | restart: unless-stopped 5 | -------------------------------------------------------------------------------- /docker-compose-parts/websockify.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-websockify: 4 | build: 5 | context: ${BUILD_ROOT_PATH} 6 | dockerfile: websockify/build/package/Dockerfile 7 | args: 8 | - "GOLANG_BUILD_IMAGE=${GOLANG_BUILD_IMAGE}" 9 | - "GOLANG_RUN_IMAGE=${GOLANG_RUN_IMAGE}" 10 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/10-db-info.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DB_WHEN 4 | 5 | # https://stackoverflow.com/a/61259844 6 | echo "----------- NEW DATABASE BACKUP: $(date +%Y-%m-%d_%H:%M:%S) -----------" >> $${my_empty_variable}LOG_FILE 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/11-db-nfs-mount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DB_WHEN 4 | 5 | /usr/local/bin/nfs_mount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/12-db-dump.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DB_WHEN 4 | 5 | rm -f /dbdump/isard-db*.tar.gz 6 | /usr/bin/rethinkdb-dump -c "$RETHINKDB_HOST:$RETHINKDB_PORT" -f "/dbdump/isard-db-$(date +%Y-%m-%d_%H:%M:%S).tar.gz" 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/19-db-nfs-umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DB_WHEN 4 | 5 | /usr/local/bin/nfs_umount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/20-redis-info.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_REDIS_WHEN 4 | 5 | # https://stackoverflow.com/a/61259844 6 | echo "----------- NEW REDIS BACKUP: $(date +%Y-%m-%d_%H:%M:%S) -----------" >> $${my_empty_variable}LOG_FILE 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/21-redis-nfs-mount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_REDIS_WHEN 4 | 5 | /usr/local/bin/nfs_mount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/22-redis-dump.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_REDIS_WHEN 4 | 5 | rm -f /redisdump/dump*.rdb 6 | redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" --rdb /redisdump/dump-$(date +%Y-%m-%d_%H:%M:%S).rdb 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/29-redis-nfs-umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_REDIS_WHEN 4 | 5 | /usr/local/bin/nfs_umount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/30-stats-info.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_STATS_WHEN 4 | 5 | # https://stackoverflow.com/a/61259844 6 | echo "----------- NEW STATS BACKUP: $(date +%Y-%m-%d_%H:%M:%S) -----------" >> $${my_empty_variable}LOG_FILE 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/31-stats-nfs-mount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_STATS_WHEN 4 | 5 | /usr/local/bin/nfs_mount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/39-stats-nfs-umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_STATS_WHEN 4 | 5 | /usr/local/bin/nfs_umount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/80-config-info.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_CONFIG_WHEN 4 | 5 | # https://stackoverflow.com/a/61259844 6 | echo "----------- NEW CONFIG BACKUP: $(date +%Y-%m-%d_%H:%M:%S) -----------" >> $${my_empty_variable}LOG_FILE 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/81-config-nfs-mount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_CONFIG_WHEN 4 | 5 | /usr/local/bin/nfs_mount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/89-config-nfs-umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_CONFIG_WHEN 4 | 5 | /usr/local/bin/nfs_umount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/90-disks-info.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DISKS_WHEN 4 | 5 | # https://stackoverflow.com/a/61259844 6 | echo "----------- NEW DISKS BACKUP: $(date +%Y-%m-%d_%H:%M:%S) -----------" >> $${my_empty_variable}LOG_FILE 7 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/91-disks-nfs-mount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DISKS_WHEN 4 | 5 | /usr/local/bin/nfs_mount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/backup.d/99-disks-nfs-umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | when = $BACKUP_DISKS_WHEN 4 | 5 | /usr/local/bin/nfs_umount.sh 6 | -------------------------------------------------------------------------------- /docker/backupninja/nfs_umount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | umount -f -l /backup 4 | 5 | if grep -qs "$BACKUP_NFS_SERVER:$BACKUP_NFS_FOLDER" /proc/mounts; then 6 | echo "ERROR!!! UNABLE TO UNMOUNT /backup $BACKUP_NFS_SERVER:$BACKUP_NFS_FOLDER" 7 | exit 1 8 | else 9 | echo "BACKUP NFS UnMOUNTED" 10 | fi 11 | -------------------------------------------------------------------------------- /docker/grafana/dashboards/stats.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'default' 5 | orgId: 1 6 | folder: '' 7 | folderUid: '' 8 | type: file 9 | options: 10 | path: /etc/grafana/provisioning/dashboards 11 | -------------------------------------------------------------------------------- /docker/haproxy/_common/letsencrypt-hook-deploy-concatenante.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cat $RENEWED_LINEAGE/fullchain.pem $RENEWED_LINEAGE/privkey.pem > /certs/chain.pem 3 | 4 | haproxy-reload 5 | -------------------------------------------------------------------------------- /docker/haproxy/cfg/_base/31_auth.cfg: -------------------------------------------------------------------------------- 1 | ### START 31_auth.cfg ### 2 | userlist AuthUsers 3 | user admin password $6$fBN2a.eJs8tVVVum$kKub56o9y0IBgXpE8isywqO7Ud2SJlTEpZhJiBJQTweSTXspYyfZm2cCxx8ALE5vZaPBCDhPr/JYWNBIoRPZb1 4 | ### END 31_auth.cfg ### 5 | -------------------------------------------------------------------------------- /docker/haproxy/cfg/nc-proxy/16_12_fe_secured_end.cfg: -------------------------------------------------------------------------------- 1 | # Nextcloud backend 2 | use_backend be_isard-nc if { path_beg /isard-nc or /isard-nc/ } 3 | 4 | http-request set-var(txn.block) str("DROP HTTP") 5 | default_backend be_drop -------------------------------------------------------------------------------- /docker/haproxy/cfg/nc-proxy/20_backends.cfg: -------------------------------------------------------------------------------- 1 | ### START 20_backends.cfg ### 2 | backend be_isard-nc 3 | server nc-nginx isard-nc-nginx:80 maxconn 2000 check port 80 inter 5s rise 2 fall 3 resolvers mydns init-addr none 4 | ### END 20_backends.cfg ### -------------------------------------------------------------------------------- /docker/haproxy/cfg/video/20_backends.cfg: -------------------------------------------------------------------------------- 1 | ### START 20_backends.cfg ### 2 | backend be_isard-websockify 3 | server websockify isard-websockify:8080 check port 8080 inter 5s rise 2 fall 3 resolvers mydns init-addr none 4 | ### END 20_backends.cfg ### -------------------------------------------------------------------------------- /docker/hypervisor/kvm/50-libvirt.rules: -------------------------------------------------------------------------------- 1 | polkit.addAdminRule(function(action, subject) { 2 | return ["unix-group:wheel"]; 3 | }); 4 | 5 | polkit.addRule(function(action, subject) { 6 | if (action.id == "org.libvirt.unix.manage" && 7 | subject.isInGroup("wheel")) { 8 | return polkit.Result.YES; 9 | } 10 | }); -------------------------------------------------------------------------------- /docker/hypervisor/kvm/qemu-kvm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | export QEMU_AUDIO_DRV=spice 3 | exec /usr/bin/qemu-system-x86_64 $@ 4 | -------------------------------------------------------------------------------- /docker/hypervisor/mdevctl_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | apk add --no-cache cargo uuidgen py3-docutils make git 3 | cd /opt 4 | git clone https://github.com/mdevctl/mdevctl 5 | cd mdevctl 6 | cargo build 7 | make install 8 | 9 | mkdir -p /etc/mdevctl.d/scripts.d/callouts 10 | mkdir -p /etc/mdevctl.d/scripts.d/notifiers 11 | apk del cargo py3-docutils make git -------------------------------------------------------------------------------- /docker/hypervisor/networks/private1.xml: -------------------------------------------------------------------------------- 1 | 2 | private1 3 | 98552eb2-3e01-4f4d-9d50-4b824f31caec 4 | 5 | -------------------------------------------------------------------------------- /docker/hypervisor/networks/private2.xml: -------------------------------------------------------------------------------- 1 | 2 | private2 3 | 98552eb2-3e01-4f4d-9d50-4b824f31caed 4 | 5 | -------------------------------------------------------------------------------- /docker/hypervisor/networks/private3.xml: -------------------------------------------------------------------------------- 1 | 2 | private3 3 | 98552eb2-3e01-4f4d-9d50-4b824f31caee 4 | 5 | -------------------------------------------------------------------------------- /docker/hypervisor/networks/private4.xml: -------------------------------------------------------------------------------- 1 | 2 | private4 3 | 98552eb2-3e01-4f4d-9d50-4b824f31caef 4 | 5 | -------------------------------------------------------------------------------- /docker/hypervisor/networks/private5.xml: -------------------------------------------------------------------------------- 1 | 2 | private5 3 | 98552eb2-3e01-4f4d-9d50-4b824f31caf1 4 | 5 | -------------------------------------------------------------------------------- /docker/hypervisor/requirements.txt: -------------------------------------------------------------------------------- 1 | PyJWT==2.8.0 2 | python-iptables==1.0.0 3 | pythonping==1.0.15 4 | -------------------------------------------------------------------------------- /docker/hypervisor/spice-dev/libspice-server.so.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/docker/hypervisor/spice-dev/libspice-server.so.1 -------------------------------------------------------------------------------- /docker/hypervisor/spice-dev/libspice-server.so.1.14.3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/docker/hypervisor/spice-dev/libspice-server.so.1.14.3 -------------------------------------------------------------------------------- /docker/hypervisor/src/dnsmasq-hook/api_client.py: -------------------------------------------------------------------------------- 1 | /src/lib/api_client.py -------------------------------------------------------------------------------- /docker/hypervisor/src/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/docker/hypervisor/src/lib/__init__.py -------------------------------------------------------------------------------- /docker/hypervisor/src/ovs/vlan100.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docker/hypervisor/src/ovs/vlan2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docker/hypervisor/src/ovs/vlan200.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docker/hypervisor/src/ovs/vlan4095.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docker/hypervisor/src/ovs/vxlan.sh: -------------------------------------------------------------------------------- 1 | ovs-vsctl add-port ovsbr0 vx_main -- set interface vx_main type=vxlan options:remote_ip=$1 option:key=flow 2 | -------------------------------------------------------------------------------- /docker/hypervisor/src/vlans/api_client.py: -------------------------------------------------------------------------------- 1 | /src/lib/api_client.py -------------------------------------------------------------------------------- /docker/nextcloud/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/docker/nextcloud/background.jpg -------------------------------------------------------------------------------- /docker/nextcloud/requirements.txt: -------------------------------------------------------------------------------- 1 | PyJWT==2.8.0 2 | requests==2.27.1 3 | -------------------------------------------------------------------------------- /docker/postgres/init_databases.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | psql -v ON_ERROR_STOP=1 --username root <<-EOSQL 4 | CREATE USER admin SUPERUSER PASSWORD '$WEBAPP_ADMIN_PWD'; 5 | CREATE DATABASE isard_nc; 6 | GRANT ALL PRIVILEGES ON DATABASE isard_nc TO admin; 7 | EOSQL -------------------------------------------------------------------------------- /docker/squid/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.22.0 as production 2 | 3 | RUN apk -U upgrade --no-cache 4 | RUN apk add --no-cache squid 5 | 6 | COPY docker/squid/run.sh /run.sh 7 | #EXPOSE 8080 8 | 9 | RUN chown -R squid:squid /etc/squid 10 | USER squid 11 | 12 | CMD ["/bin/sh", "/run.sh"] 13 | -------------------------------------------------------------------------------- /docker/storage/requirements.txt: -------------------------------------------------------------------------------- 1 | rq==2.0.0 2 | betterproto~=1.2 3 | rethinkdb==2.4.10.post1 4 | PyJWT==2.8.0 5 | tabulate -------------------------------------------------------------------------------- /docker/vpn/dnsmasq-hook/update-client-ips.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #$1 - add 3 | #$2 - 52:54:00:2c:7a:13 4 | #$3 - 192.168.128.76 5 | #$4 - slax 6 | 7 | export API_HYPERVISORS_SECRET=$API_HYPERVISORS_SECRET 8 | /usr/bin/python3 /dnsmasq-hook/update-client-ips.py "$@" 9 | -------------------------------------------------------------------------------- /docker/vpn/requirements.txt: -------------------------------------------------------------------------------- 1 | rethinkdb==2.4.10.post1 2 | python-iptables==1.0.0 3 | PyJWT==2.8.0 4 | requests~=2.31 5 | -------------------------------------------------------------------------------- /engine/docker/genrsa.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Set engine keys 4 | if [ ! -f /root/.ssh/id_rsa ] && [ ! -f /root/.ssh/id_ed25519 ] 5 | then 6 | echo "Generating new rsa keys..." 7 | cat /dev/zero | ssh-keygen -q -N "" 8 | fi 9 | -------------------------------------------------------------------------------- /engine/docker/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | /genrsa.sh 3 | python3 -u start.py -------------------------------------------------------------------------------- /engine/engine/engine/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/__init__.py -------------------------------------------------------------------------------- /engine/engine/engine/controllers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/controllers/__init__.py -------------------------------------------------------------------------------- /engine/engine/engine/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/models/__init__.py -------------------------------------------------------------------------------- /engine/engine/engine/services/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/services/__init__.py -------------------------------------------------------------------------------- /engine/engine/engine/services/db/__init__.py: -------------------------------------------------------------------------------- 1 | from .config import * 2 | from .db import * 3 | from .domains import * 4 | from .hypervisors import * 5 | from .hypervisors_status import * 6 | -------------------------------------------------------------------------------- /engine/engine/engine/services/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/services/lib/__init__.py -------------------------------------------------------------------------------- /engine/engine/engine/services/lib/qmp/notifier_windows.bat: -------------------------------------------------------------------------------- 1 | msg * {message} 2 | -------------------------------------------------------------------------------- /engine/engine/engine/services/threads/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/engine/engine/engine/services/threads/__init__.py -------------------------------------------------------------------------------- /engine/engine/logging.conf: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=main 3 | 4 | [handlers] 5 | keys=hand01 6 | 7 | [formaters] 8 | keys=form01 9 | 10 | [formater_form01] 11 | format='%(asctime)s - %(name)s - %(levelname)s - %(threadName)s - %(message)s' 12 | datefmt='%Y-%m-%d %H:%M:%S' -------------------------------------------------------------------------------- /engine/engine/scripts/test_gpu.ipy: -------------------------------------------------------------------------------- 1 | 2 | 3 | remove find /sys/devices/pci0000\:40 |grep remove |egrep '[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}' | xargs -I % sh -c 'echo 1 > %;' 4 | /sys/class/mdev_bus/0000\:41\:00.7/mdev_supported_types/nvidia-557/create 5 | 6 | -------------------------------------------------------------------------------- /engine/engine/scripts/update_db.py: -------------------------------------------------------------------------------- 1 | # Copyright 2017 the Isard-vdi project authors: 2 | # Josep Maria Viñolas Auquer 3 | # Alberto Larraz Dalmases 4 | # License: AGPLv3 5 | 6 | #!/usr/bin/env python 7 | # coding=utf-8 8 | 9 | from initdb.populate import Populate 10 | from initdb.upgrade import Upgrade 11 | 12 | p = Populate() 13 | u = Upgrade() 14 | -------------------------------------------------------------------------------- /engine/engine/scripts/virt-conn.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | import libvirt 4 | 5 | uri = "qemu+ssh://isard-hypervisor:2022/system" 6 | conn = libvirt.open(uri) 7 | 8 | hyper_info = conn.getInfo() 9 | hyper_cpu_model_names = conn.getCPUModelNames("x86_64") 10 | hyper_cpu_map = conn.getCPUMap() 11 | 12 | pprint(hyper_cpu_map) 13 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/prettierrc", 3 | "semi": false, 4 | "tabWidth": 2, 5 | "singleQuote": true, 6 | "printWidth": 100, 7 | "trailingComma": "none" 8 | } -------------------------------------------------------------------------------- /frontend/bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/frontend/bun.lockb -------------------------------------------------------------------------------- /frontend/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node20/tsconfig.json", 3 | "include": ["./**/*"] 4 | } 5 | -------------------------------------------------------------------------------- /frontend/e2e/vue.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | // See here how to get started: 4 | // https://playwright.dev/docs/intro 5 | test('visits the app root url', async ({ page }) => { 6 | await page.goto('/'); 7 | await expect(page.locator('div.greetings > h1')).toHaveText('You did it!'); 8 | }) 9 | -------------------------------------------------------------------------------- /frontend/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/src/assets/icons/activity.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alarm-clock-check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alarm-clock-minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alarm-clock-off.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alarm-clock-plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alarm-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/alert-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-bottom-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-center.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-horizontal-centre-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-justify.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-left-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-right-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-top-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/align-vertical-center-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/anchor.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-down-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-down-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-up-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-up-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-circle-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-down-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-down-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-down-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-down-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-up-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-up-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-narrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-up-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-up-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrows-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrows-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrows-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/arrows-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/asterisk-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/asterisk-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/at-sign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/attachment-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-05.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-06.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-07.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-08.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-09.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-circle-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-circle-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bar-chart-circle-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bluetooth-connect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bluetooth-off.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bluetooth-on.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bold-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/bold-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/check-circle-broken.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/check-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-down-double.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-left-double.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-right-double.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-selector-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-selector-vertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-up-double.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/chevron-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/clock-fast-forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/clock-rewind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-blank-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-blank-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-lightning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-raining-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-raining-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-raining-06.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/cloud-sun-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-circle-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-circle-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-circle-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-snippet-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/code-snippet-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/coins-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/coins-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/coins-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/colors.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/command.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-down-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-down-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-left-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-left-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-right-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-right-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-up-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/corner-up-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-bitcoin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-dollar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-ethereum.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-euro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-pound.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-ruble.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-rupee.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-yen-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/currency-yen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/divide-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/divide-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/dots-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/dots-vertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/download-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/download-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/download-cloud-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/download-cloud-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/drop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/droplets-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/droplets-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/dropper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/equal-not.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/equal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/expand-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/expand-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/expand-05.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/expand-06.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/filter-lines.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/flag-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/flag-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/flip-backward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/flip-forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/framer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/git-branch-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/git-commit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/git-merge.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/git-pull-request.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/hash-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/hash-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/heading-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/heading-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/help-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/hurricane-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/hurricane-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/infinity.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/info-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/italic-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/italic-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/letter-spacing-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/line-height.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/link-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/link-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/link-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/link-05.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/loading-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/lock-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/lock-unlocked-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/log-in-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/log-out-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/magic-wand-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/map-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/maximize-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/menu-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/menu-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/menu-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/menu-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/menu-05.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/microphone-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/microphone-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/minimize-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/minus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/moon-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/mouse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/move.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/paragraph-spacing.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/paragraph-wrap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/pause-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/percent-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/percent-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/pilcrow-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/pilcrow-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/placeholder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/plus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/power-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/power-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/power-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/recording-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/recording-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/recording-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/reflect-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/refresh-ccw-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/refresh-ccw-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/refresh-cw-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/refresh-cw-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/repeat-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/repeat-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/reverse-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/reverse-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/rss-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/scissors-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/scissors-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/scissors-cut-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/search-lg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/search-md.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/search-refraction.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/search-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/server-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/settings-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/shuffle-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/slash-circle-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/slash-circle-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/slash-divider.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sliders-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sliders-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/snowflake-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/spacing-height-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/spacing-height-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/spacing-width-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/spacing-width-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/strikethrough-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sun-setting-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sun-setting-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sunrise.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/sunset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/switch-horizontal-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/switch-horizontal-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/switch-vertical-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/switch-vertical-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/target-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/target-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/target-04.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/terminal-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/terminal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/thermometer-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/thermometer-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/thermometer-cold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/toggle-01-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/toggle-01-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/toggle-02-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/toggle-02-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/trend-down-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/trend-up-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/underline-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/underline-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/upload-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/upload-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/upload-cloud-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/upload-cloud-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/user-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/voicemail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/webcam-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/webcam-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/wind-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/wind-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/x-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/x-close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/zoom-in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/zoom-out.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/components/card-box/index.ts: -------------------------------------------------------------------------------- 1 | import { default as CardBox } from './CardBox.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/locale-switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LocaleSwitch } from './LocaleSwitch.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/migration/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MigrationItemBox } from './MigrationItemBox.vue' 2 | export { default as MigrationItemTable } from './MigrationItemTable.vue' 3 | export { default as MigrationResultItem } from './MigrationResultItem.vue' 4 | -------------------------------------------------------------------------------- /frontend/src/components/register/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RegisterForm } from './RegisterForm.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Accordion } from './Accordion.vue' 2 | export { default as AccordionContent } from './AccordionContent.vue' 3 | export { default as AccordionItem } from './AccordionItem.vue' 4 | export { default as AccordionTrigger } from './AccordionTrigger.vue' 5 | -------------------------------------------------------------------------------- /frontend/src/components/ui/avatar/AvatarFallback.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/avatar/AvatarImage.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /frontend/src/components/ui/calendar/CalendarGridBody.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/calendar/CalendarGridHead.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Checkbox } from './Checkbox.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/form/injectionKeys.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from 'vue' 2 | 3 | export const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey 4 | -------------------------------------------------------------------------------- /frontend/src/components/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue' 2 | export { default as PopoverTrigger } from './PopoverTrigger.vue' 3 | export { default as PopoverContent } from './PopoverContent.vue' 4 | -------------------------------------------------------------------------------- /frontend/src/components/ui/radio-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RadioGroup } from './RadioGroup.vue' 2 | export { default as RadioGroupItem } from './RadioGroupItem.vue' 3 | -------------------------------------------------------------------------------- /frontend/src/components/ui/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/separator/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Separator } from './Separator.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/skeleton/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Skeleton } from './Skeleton.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/textarea/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Textarea } from './Textarea.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/components/ui/tooltip/TooltipTrigger.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /frontend/src/components/ui/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tooltip } from './Tooltip.vue' 2 | export { default as TooltipContent } from './TooltipContent.vue' 3 | export { default as TooltipTrigger } from './TooltipTrigger.vue' 4 | export { default as TooltipProvider } from './TooltipProvider.vue' 5 | -------------------------------------------------------------------------------- /frontend/src/layouts/login/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LoginLayout } from './LoginLayout.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/layouts/maintenance/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MaintenanceLayout } from './MaintenanceLayout.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/layouts/single-page/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SinglePageLayout } from './SinglePageLayout.vue' 2 | -------------------------------------------------------------------------------- /frontend/src/lib/constants.ts: -------------------------------------------------------------------------------- 1 | export const appTitle = 'IsardVDI' 2 | export const isardVdiUrl = 'https://isardvdi.com' 3 | -------------------------------------------------------------------------------- /frontend/src/views/HomeView.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | }, 10 | { 11 | "path": "./tsconfig.vitest.json" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /frontend/tsconfig.vitest.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | "exclude": [], 4 | "compilerOptions": { 5 | "composite": true, 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo", 7 | 8 | "lib": [], 9 | "types": ["node", "jsdom"] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /guac/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | secret 3 | -------------------------------------------------------------------------------- /guac/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | Package guac implements a HTTP client and a WebSocket client that connects to an Apache Guacamole server. 3 | */ 4 | package guac 5 | -------------------------------------------------------------------------------- /notifier/docker/requirements.txt: -------------------------------------------------------------------------------- 1 | cachetools~=5.3 2 | Flask~=3.0 3 | gevent==23.9.1 4 | pydantic~=2.4 5 | PyJWT==2.8.0 6 | requests==2.31.0 7 | rethinkdb==2.4.10.post1 8 | rq==2.0.0 9 | spectree~=1.2 10 | waitress~=3.0.1 11 | simple-colors~=0.1.5 12 | python-json-logger~=2.0.7 13 | html-sanitizer==2.4.4 -------------------------------------------------------------------------------- /notifier/src/notifier/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/notifier/src/notifier/lib/__init__.py -------------------------------------------------------------------------------- /notifier/src/notifier/schemas/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/notifier/src/notifier/schemas/__init__.py -------------------------------------------------------------------------------- /notifier/src/notifier/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/notifier/src/notifier/views/__init__.py -------------------------------------------------------------------------------- /notifier/src/start.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import isardvdi_common.log 3 | from waitress import serve 4 | 5 | from notifier import app 6 | 7 | if __name__ == "__main__": 8 | serve(app, listen="*:5000") 9 | -------------------------------------------------------------------------------- /old-frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true 6 | -------------------------------------------------------------------------------- /old-frontend/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /old-frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/old-frontend/public/favicon.ico -------------------------------------------------------------------------------- /old-frontend/src/assets/global.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | height: 100%; 3 | padding-bottom: 0.5rem; 4 | background-color: #f2f3f3 !important; 5 | } 6 | 7 | .white-img { 8 | -webkit-filter: invert(1); 9 | filter: invert(1); 10 | } 11 | -------------------------------------------------------------------------------- /old-frontend/src/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/old-frontend/src/assets/img/logo.png -------------------------------------------------------------------------------- /old-frontend/src/components/ListItemSkeleton.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /old-frontend/src/components/shared/IsardButtViewerText.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /old-frontend/src/locales/eo.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /old-frontend/src/locales/hi.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /old-frontend/src/store/modules/snotify.js: -------------------------------------------------------------------------------- 1 | import { ErrorUtils } from '../../utils/errorUtils' 2 | 3 | export default { 4 | state: {}, 5 | getters: {}, 6 | mutations: {}, 7 | actions: { 8 | showNotification (_, data) { 9 | ErrorUtils.showInfoMessage(this._vm.$snotify, data.message) 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /old-frontend/src/utils/stringUtils.js: -------------------------------------------------------------------------------- 1 | export class StringUtils { 2 | static isNullOrUndefinedOrEmpty (arg) { 3 | return arg === null || arg === undefined || arg === 'undefined' || arg === '' 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /old-frontend/tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker run -it --rm --ipc=host -p "9323:9323" -w "/frontend" -v "$PWD:/frontend" -e "DOCKER=true" --add-host=host.docker.internal:host-gateway mcr.microsoft.com/playwright:v1.36.0-jammy yarn playwright test -------------------------------------------------------------------------------- /openapi-ts.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "@hey-api/openapi-ts"; 2 | 3 | const service = process.env.CODEGEN; 4 | 5 | export default defineConfig({ 6 | client: "@hey-api/client-fetch", 7 | input: `pkg/oas/${service}/${service}.json`, 8 | output: `frontend/src/gen/oas/${service}`, 9 | plugins: ["@tanstack/vue-query"], 10 | }); 11 | -------------------------------------------------------------------------------- /pkg/sdk/README.md: -------------------------------------------------------------------------------- 1 | # IsardVDI SDK Go 2 | 3 | This is the client library of IsardVDI for the Golang language. 4 | 5 | ```sh 6 | go get -u gitlab.com/isard/isardvdi/pkg/sdk 7 | ``` 8 | -------------------------------------------------------------------------------- /pkg/sdk/cfg.go: -------------------------------------------------------------------------------- 1 | package sdk 2 | 3 | type Cfg struct { 4 | Token string 5 | Host string 6 | IgnoreCerts bool `mapstructure:"ignore_certs"` 7 | } 8 | -------------------------------------------------------------------------------- /pkg/sdk/go.mod: -------------------------------------------------------------------------------- 1 | module gitlab.com/isard/isardvdi/pkg/sdk 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/google/go-querystring v1.1.0 7 | github.com/stretchr/testify v1.9.0 8 | ) 9 | -------------------------------------------------------------------------------- /pkg/sdk/version.go: -------------------------------------------------------------------------------- 1 | package sdk 2 | 3 | import ( 4 | "runtime/debug" 5 | ) 6 | 7 | var Version = "Unknown version" 8 | 9 | func init() { 10 | if bi, ok := debug.ReadBuildInfo(); ok { 11 | for _, d := range bi.Deps { 12 | if d.Path == "gitlab.com/isard/isardvdi/pkg/sdk" { 13 | Version = d.Version 14 | } 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /scheduler/docker/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==2.3.3 2 | Flask-Cors==5.0.0 3 | gevent-websocket==0.10.1 4 | Flask-SocketIO==5.1.0 5 | rethinkdb==2.4.10.post1 6 | requests~=2.31 7 | PyJWT==2.8.0 8 | APScheduler==3.9.1 9 | Werkzeug==3.0.3 10 | pytz==2022.7 11 | cachetools~=5.3 12 | -------------------------------------------------------------------------------- /scheduler/src/scheduler/auth/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/scheduler/src/scheduler/auth/__init__.py -------------------------------------------------------------------------------- /stats/collector/collector.go: -------------------------------------------------------------------------------- 1 | package collector 2 | 3 | import ( 4 | "github.com/prometheus/client_golang/prometheus" 5 | ) 6 | 7 | const namespace = "isardvdi" 8 | 9 | type Collector interface { 10 | Describe(chan<- *prometheus.Desc) 11 | Collect(chan<- prometheus.Metric) 12 | String() string 13 | } 14 | -------------------------------------------------------------------------------- /sysadm/db.devel.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | isard-db: 4 | ports: 5 | - 127.0.0.1:8080:8080 6 | - 127.0.0.1:28015:28015 7 | -------------------------------------------------------------------------------- /testing/selenium/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM registry.gitlab.com/isard/isardvdi/engine:develop 2 | MAINTAINER isard info@isard.com 3 | 4 | RUN pip3 install --no-cache-dir selenium 5 | 6 | CMD ["sleep", "infinity"] -------------------------------------------------------------------------------- /webapp/docker/requirements.txt: -------------------------------------------------------------------------------- 1 | cachetools~=5.3 2 | Flask~=3.0 3 | Flask-Login==0.6.3 4 | gevent==23.9.1 5 | PyJWT==2.8.0 6 | requests==2.31.0 7 | rethinkdb==2.4.10.post1 8 | waitress~=3.0.1 9 | simple-colors~=0.1.5 10 | python-json-logger~=2.0.7 -------------------------------------------------------------------------------- /webapp/webapp/webapp/auth/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/auth/__init__.py -------------------------------------------------------------------------------- /webapp/webapp/webapp/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/lib/__init__.py -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/css/d3-bubble.css: -------------------------------------------------------------------------------- 1 | .vdesktop1.escoladeltreball.org {fill: #F00000; background: #F00000;} 2 | .vdesktop2.escoladeltreball.org {fill: #00000F; background: #A00001;} 3 | .windows {fill: #00FFFF; background: #00FFFF;} 4 | .linux {fill: #006400; background: #006400;} 5 | -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/agplv3-155x51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/agplv3-155x51.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/cloud.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/fakeuser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/fakeuser.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/isard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/isard.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/isard_50x50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/isard_50x50.gif -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/isard_50x50_white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/isard_50x50_white.gif -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/isard_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/isard_logo.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/isard_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/isard_white.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/static/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/static/img/user.png -------------------------------------------------------------------------------- /webapp/webapp/webapp/templates/footer.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Isard VDI - Virtual desktops Website 4 |
5 |
6 |
7 | -------------------------------------------------------------------------------- /webapp/webapp/webapp/templates/maintenance.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

System in maintenance, please try later.

8 | 9 | 10 | -------------------------------------------------------------------------------- /webapp/webapp/webapp/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isard-vdi/isard/2bffe3849ed7993437c29f5f10ebd9a01c9111b7/webapp/webapp/webapp/views/__init__.py --------------------------------------------------------------------------------