Add ISO catalog
This commit is contained in:
		
							
								
								
									
										2
									
								
								virtweb_backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								virtweb_backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -2877,6 +2877,7 @@ version = "8.7.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "mime_guess",
 | 
			
		||||
 "sha2",
 | 
			
		||||
 "walkdir",
 | 
			
		||||
]
 | 
			
		||||
@@ -3745,7 +3746,6 @@ dependencies = [
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "light-openid",
 | 
			
		||||
 "log",
 | 
			
		||||
 "mime_guess",
 | 
			
		||||
 "nix",
 | 
			
		||||
 "num",
 | 
			
		||||
 "quick-xml",
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,7 @@ tokio = { version = "1.45.0", features = ["rt", "time", "macros"] }
 | 
			
		||||
futures = "0.3.31"
 | 
			
		||||
ipnetwork = { version = "0.21.1", features = ["serde"] }
 | 
			
		||||
num = "0.4.3"
 | 
			
		||||
rust-embed = { version = "8.7.2" }
 | 
			
		||||
mime_guess = "2.0.5"
 | 
			
		||||
rust-embed = { version = "8.7.2", features = ["mime-guess"] }
 | 
			
		||||
dotenvy = "0.15.7"
 | 
			
		||||
nix = { version = "0.30.1", features = ["net"] }
 | 
			
		||||
basic-jwt = "0.3.0"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										86
									
								
								virtweb_backend/assets/img/debian.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								virtweb_backend/assets/img/debian.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<!-- Generator: Adobe Illustrator 10.0, SVG Export Plug-In . SVG Version: 3.0.0 Build 77)  -->
 | 
			
		||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
 | 
			
		||||
	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
 | 
			
		||||
	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
 | 
			
		||||
	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
 | 
			
		||||
	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
 | 
			
		||||
	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
 | 
			
		||||
	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
 | 
			
		||||
	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
 | 
			
		||||
	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
 | 
			
		||||
	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
 | 
			
		||||
	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
 | 
			
		||||
	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
 | 
			
		||||
]>
 | 
			
		||||
<svg 
 | 
			
		||||
	 xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="262 450" i:rulerOrigin="0 0" i:pageBounds="0 792 612 0"
 | 
			
		||||
	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
 | 
			
		||||
	 width="87.041" height="108.445" viewBox="0 0 87.041 108.445" overflow="visible" enable-background="new 0 0 87.041 108.445"
 | 
			
		||||
	 xml:space="preserve">
 | 
			
		||||
	<metadata>
 | 
			
		||||
		<variableSets  xmlns="&ns_vars;">
 | 
			
		||||
			<variableSet  varSetName="binding1" locked="none">
 | 
			
		||||
				<variables></variables>
 | 
			
		||||
				<v:sampleDataSets  xmlns="&ns_custom;" xmlns:v="&ns_vars;"></v:sampleDataSets>
 | 
			
		||||
			</variableSet>
 | 
			
		||||
		</variableSets>
 | 
			
		||||
		<sfw  xmlns="&ns_sfw;">
 | 
			
		||||
			<slices></slices>
 | 
			
		||||
			<sliceSourceBounds  y="341.555" x="262" width="87.041" height="108.445" bottomLeftOrigin="true"></sliceSourceBounds>
 | 
			
		||||
		</sfw>
 | 
			
		||||
	</metadata>
 | 
			
		||||
	<g id="Layer_1" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
 | 
			
		||||
		<g>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M51.986,57.297c-1.797,0.025,0.34,0.926,2.686,1.287
 | 
			
		||||
				c0.648-0.506,1.236-1.018,1.76-1.516C54.971,57.426,53.484,57.434,51.986,57.297"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M61.631,54.893c1.07-1.477,1.85-3.094,2.125-4.766c-0.24,1.192-0.887,2.221-1.496,3.307
 | 
			
		||||
				c-3.359,2.115-0.316-1.256-0.002-2.537C58.646,55.443,61.762,53.623,61.631,54.893"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M65.191,45.629c0.217-3.236-0.637-2.213-0.924-0.978
 | 
			
		||||
				C64.602,44.825,64.867,46.932,65.191,45.629"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M45.172,1.399c0.959,0.172,2.072,0.304,1.916,0.533
 | 
			
		||||
				C48.137,1.702,48.375,1.49,45.172,1.399"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M47.088,1.932l-0.678,0.14l0.631-0.056L47.088,1.932"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M76.992,46.856c0.107,2.906-0.85,4.316-1.713,6.812l-1.553,0.776
 | 
			
		||||
				c-1.271,2.468,0.123,1.567-0.787,3.53c-1.984,1.764-6.021,5.52-7.313,5.863c-0.943-0.021,0.639-1.113,0.846-1.541
 | 
			
		||||
				c-2.656,1.824-2.131,2.738-6.193,3.846l-0.119-0.264c-10.018,4.713-23.934-4.627-23.751-17.371
 | 
			
		||||
				c-0.107,0.809-0.304,0.607-0.526,0.934c-0.517-6.557,3.028-13.143,9.007-15.832c5.848-2.895,12.704-1.707,16.893,2.197
 | 
			
		||||
				c-2.301-3.014-6.881-6.209-12.309-5.91c-5.317,0.084-10.291,3.463-11.951,7.131c-2.724,1.715-3.04,6.611-4.227,7.507
 | 
			
		||||
				C31.699,56.271,36.3,61.342,44.083,67.307c1.225,0.826,0.345,0.951,0.511,1.58c-2.586-1.211-4.954-3.039-6.901-5.277
 | 
			
		||||
				c1.033,1.512,2.148,2.982,3.589,4.137c-2.438-0.826-5.695-5.908-6.646-6.115c4.203,7.525,17.052,13.197,23.78,10.383
 | 
			
		||||
				c-3.113,0.115-7.068,0.064-10.566-1.229c-1.469-0.756-3.467-2.322-3.11-2.615c9.182,3.43,18.667,2.598,26.612-3.771
 | 
			
		||||
				c2.021-1.574,4.229-4.252,4.867-4.289c-0.961,1.445,0.164,0.695-0.574,1.971c2.014-3.248-0.875-1.322,2.082-5.609l1.092,1.504
 | 
			
		||||
				c-0.406-2.696,3.348-5.97,2.967-10.234c0.861-1.304,0.961,1.403,0.047,4.403c1.268-3.328,0.334-3.863,0.66-6.609
 | 
			
		||||
				c0.352,0.923,0.814,1.904,1.051,2.878c-0.826-3.216,0.848-5.416,1.262-7.285c-0.408-0.181-1.275,1.422-1.473-2.377
 | 
			
		||||
				c0.029-1.65,0.459-0.865,0.625-1.271c-0.324-0.186-1.174-1.451-1.691-3.877c0.375-0.57,1.002,1.478,1.512,1.562
 | 
			
		||||
				c-0.328-1.929-0.893-3.4-0.916-4.88c-1.49-3.114-0.527,0.415-1.736-1.337c-1.586-4.947,1.316-1.148,1.512-3.396
 | 
			
		||||
				c2.404,3.483,3.775,8.881,4.404,11.117c-0.48-2.726-1.256-5.367-2.203-7.922c0.73,0.307-1.176-5.609,0.949-1.691
 | 
			
		||||
				c-2.27-8.352-9.715-16.156-16.564-19.818c0.838,0.767,1.896,1.73,1.516,1.881c-3.406-2.028-2.807-2.186-3.295-3.043
 | 
			
		||||
				c-2.775-1.129-2.957,0.091-4.795,0.002c-5.23-2.774-6.238-2.479-11.051-4.217l0.219,1.023c-3.465-1.154-4.037,0.438-7.782,0.004
 | 
			
		||||
				c-0.228-0.178,1.2-0.644,2.375-0.815c-3.35,0.442-3.193-0.66-6.471,0.122c0.808-0.567,1.662-0.942,2.524-1.424
 | 
			
		||||
				c-2.732,0.166-6.522,1.59-5.352,0.295c-4.456,1.988-12.37,4.779-16.811,8.943l-0.14-0.933c-2.035,2.443-8.874,7.296-9.419,10.46
 | 
			
		||||
				l-0.544,0.127c-1.059,1.793-1.744,3.825-2.584,5.67c-1.385,2.36-2.03,0.908-1.833,1.278c-2.724,5.523-4.077,10.164-5.246,13.97
 | 
			
		||||
				c0.833,1.245,0.02,7.495,0.335,12.497c-1.368,24.704,17.338,48.69,37.785,54.228c2.997,1.072,7.454,1.031,11.245,1.141
 | 
			
		||||
				c-4.473-1.279-5.051-0.678-9.408-2.197c-3.143-1.48-3.832-3.17-6.058-5.102l0.881,1.557c-4.366-1.545-2.539-1.912-6.091-3.037
 | 
			
		||||
				l0.941-1.229c-1.415-0.107-3.748-2.385-4.386-3.646l-1.548,0.061c-1.86-2.295-2.851-3.949-2.779-5.23l-0.5,0.891
 | 
			
		||||
				c-0.567-0.973-6.843-8.607-3.587-6.83c-0.605-0.553-1.409-0.9-2.281-2.484l0.663-0.758c-1.567-2.016-2.884-4.6-2.784-5.461
 | 
			
		||||
				c0.836,1.129,1.416,1.34,1.99,1.533c-3.957-9.818-4.179-0.541-7.176-9.994l0.634-0.051c-0.486-0.732-0.781-1.527-1.172-2.307
 | 
			
		||||
				l0.276-2.75C4.667,58.121,6.719,47.409,7.13,41.534c0.285-2.389,2.378-4.932,3.97-8.92l-0.97-0.167
 | 
			
		||||
				c1.854-3.234,10.586-12.988,14.63-12.486c1.959-2.461-0.389-0.009-0.772-0.629c4.303-4.453,5.656-3.146,8.56-3.947
 | 
			
		||||
				c3.132-1.859-2.688,0.725-1.203-0.709c5.414-1.383,3.837-3.144,10.9-3.846c0.745,0.424-1.729,0.655-2.35,1.205
 | 
			
		||||
				c4.511-2.207,14.275-1.705,20.617,1.225c7.359,3.439,15.627,13.605,15.953,23.17l0.371,0.1
 | 
			
		||||
				c-0.188,3.802,0.582,8.199-0.752,12.238L76.992,46.856"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M32.372,59.764l-0.252,1.26c1.181,1.604,2.118,3.342,3.626,4.596
 | 
			
		||||
				C34.661,63.502,33.855,62.627,32.372,59.764"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M35.164,59.654c-0.625-0.691-0.995-1.523-1.409-2.352
 | 
			
		||||
				c0.396,1.457,1.207,2.709,1.962,3.982L35.164,59.654"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M84.568,48.916l-0.264,0.662c-0.484,3.438-1.529,6.84-3.131,9.994
 | 
			
		||||
				C82.943,56.244,84.088,52.604,84.568,48.916"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M45.527,0.537C46.742,0.092,48.514,0.293,49.803,0c-1.68,0.141-3.352,0.225-5.003,0.438
 | 
			
		||||
				L45.527,0.537"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M2.872,23.219c0.28,2.592-1.95,3.598,0.494,1.889
 | 
			
		||||
				C4.676,22.157,2.854,24.293,2.872,23.219"/>
 | 
			
		||||
			<path i:knockout="Off" fill="#A80030" d="M0,35.215c0.563-1.728,0.665-2.766,0.88-3.766C-0.676,33.438,0.164,33.862,0,35.215"/>
 | 
			
		||||
		</g>
 | 
			
		||||
	</g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								virtweb_backend/assets/img/kvm.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								virtweb_backend/assets/img/kvm.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 194 KiB  | 
							
								
								
									
										8
									
								
								virtweb_backend/assets/img/ubuntu.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								virtweb_backend/assets/img/ubuntu.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100">
 | 
			
		||||
<circle fill="#f47421" cy="50" cx="50" r="45"/>
 | 
			
		||||
<circle fill="none" stroke="#ffffff" stroke-width="8.55" cx="50" cy="50" r="21.825"/>
 | 
			
		||||
<g id="friend"><circle fill="#f47421" cx="19.4" cy="50" r="8.4376"/>
 | 
			
		||||
<path stroke="#f47421" stroke-width="3.2378" d="M67,50H77"/>
 | 
			
		||||
<circle fill="#ffffff" cx="19.4" cy="50" r="6.00745"/></g>
 | 
			
		||||
<use xlink:href="#friend" transform="rotate(120,50,50)"/>
 | 
			
		||||
<use xlink:href="#friend" transform="rotate(240,50,50)"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 550 B  | 
							
								
								
									
										1
									
								
								virtweb_backend/assets/img/windows.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								virtweb_backend/assets/img/windows.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" height="88" width="88" xmlns:v="https://vecta.io/nano"><path d="M0 12.402l35.687-4.86.016 34.423-35.67.203zm35.67 33.529l.028 34.453L.028 75.48.026 45.7zm4.326-39.025L87.314 0v41.527l-47.318.376zm47.329 39.349l-.011 41.34-47.318-6.678-.066-34.739z" fill="#00adef"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 311 B  | 
							
								
								
									
										47
									
								
								virtweb_backend/assets/iso_catalog.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								virtweb_backend/assets/iso_catalog.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Ubuntu releases",
 | 
			
		||||
    "url": "https://releases.ubuntu.com",
 | 
			
		||||
    "image": "/assets/img/ubuntu.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Old ubuntu releases",
 | 
			
		||||
    "url": "https://old-releases.ubuntu.com/releases/",
 | 
			
		||||
    "image": "/assets/img/ubuntu.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Current Debian releases (amd64)",
 | 
			
		||||
    "url": "https://cdimage.debian.org/mirror/cdimage/release/current/amd64/iso-dvd/",
 | 
			
		||||
    "image": "/assets/img/debian.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Old Debian releases",
 | 
			
		||||
    "url": "https://cdimage.debian.org/mirror/cdimage/archive/",
 | 
			
		||||
    "image": "/assets/img/debian.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Latest stable Virtio driver",
 | 
			
		||||
    "url": "https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso",
 | 
			
		||||
    "image": "/assets/img/kvm.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Windows server 2025",
 | 
			
		||||
    "url": "https://www.microsoft.com/en-us/evalcenter/download-windows-server-2025",
 | 
			
		||||
    "image": "/assets/img/windows.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Windows server 2022",
 | 
			
		||||
    "url": "https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022",
 | 
			
		||||
    "image": "/assets/img/windows.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Windows 11",
 | 
			
		||||
    "url": "https://www.microsoft.com/en-us/software-download/windows11",
 | 
			
		||||
    "image": "/assets/img/windows.svg"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Windows 11 Iot Enterprise LTSC 2024",
 | 
			
		||||
    "url": "https://www.microsoft.com/en-us/evalcenter/download-windows-11-iot-enterprise-ltsc-eval",
 | 
			
		||||
    "image": "/assets/img/windows.svg"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
@@ -3,6 +3,27 @@ pub use serve_static_debug::{root_index, serve_static_content};
 | 
			
		||||
#[cfg(not(debug_assertions))]
 | 
			
		||||
pub use serve_static_release::{root_index, serve_static_content};
 | 
			
		||||
 | 
			
		||||
/// Static API assets hosting
 | 
			
		||||
pub mod serve_assets {
 | 
			
		||||
    use actix_web::{HttpResponse, web};
 | 
			
		||||
    use rust_embed::RustEmbed;
 | 
			
		||||
 | 
			
		||||
    #[derive(RustEmbed)]
 | 
			
		||||
    #[folder = "assets/"]
 | 
			
		||||
    struct Asset;
 | 
			
		||||
 | 
			
		||||
    /// Serve API assets
 | 
			
		||||
    pub async fn serve_api_assets(file: web::Path<String>) -> HttpResponse {
 | 
			
		||||
        match Asset::get(&file) {
 | 
			
		||||
            None => HttpResponse::NotFound().body("File not found"),
 | 
			
		||||
            Some(asset) => HttpResponse::Ok()
 | 
			
		||||
                .content_type(asset.metadata.mimetype())
 | 
			
		||||
                .body(asset.data),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Web asset hosting placeholder in debug mode
 | 
			
		||||
#[cfg(debug_assertions)]
 | 
			
		||||
mod serve_static_debug {
 | 
			
		||||
    use actix_web::{HttpResponse, Responder};
 | 
			
		||||
@@ -16,6 +37,7 @@ mod serve_static_debug {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Web asset hosting in release mode
 | 
			
		||||
#[cfg(not(debug_assertions))]
 | 
			
		||||
mod serve_static_release {
 | 
			
		||||
    use actix_web::{HttpResponse, Responder, web};
 | 
			
		||||
@@ -23,12 +45,12 @@ mod serve_static_release {
 | 
			
		||||
 | 
			
		||||
    #[derive(RustEmbed)]
 | 
			
		||||
    #[folder = "static/"]
 | 
			
		||||
    struct Asset;
 | 
			
		||||
    struct WebAsset;
 | 
			
		||||
 | 
			
		||||
    fn handle_embedded_file(path: &str, can_fallback: bool) -> HttpResponse {
 | 
			
		||||
        match (Asset::get(path), can_fallback) {
 | 
			
		||||
        match (WebAsset::get(path), can_fallback) {
 | 
			
		||||
            (Some(content), _) => HttpResponse::Ok()
 | 
			
		||||
                .content_type(mime_guess::from_path(path).first_or_octet_stream().as_ref())
 | 
			
		||||
                .content_type(content.metadata.mimetype())
 | 
			
		||||
                .body(content.data.into_owned()),
 | 
			
		||||
            (None, false) => HttpResponse::NotFound().body("404 Not Found"),
 | 
			
		||||
            (None, true) => handle_embedded_file("index.html", false),
 | 
			
		||||
 
 | 
			
		||||
@@ -337,6 +337,11 @@ async fn main() -> std::io::Result<()> {
 | 
			
		||||
                web::delete().to(api_tokens_controller::delete),
 | 
			
		||||
            )
 | 
			
		||||
            // Static assets
 | 
			
		||||
            .route(
 | 
			
		||||
                "/api/assets/{tail:.*}",
 | 
			
		||||
                web::get().to(static_controller::serve_assets::serve_api_assets),
 | 
			
		||||
            )
 | 
			
		||||
            // Static web frontend
 | 
			
		||||
            .route("/", web::get().to(static_controller::root_index))
 | 
			
		||||
            .route(
 | 
			
		||||
                "/{tail:.*}",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user