Compare commits
No commits in common. "295609a57d502b19a00eb676a9a9b07308ef8d84" and "4b6f469a58b3f8a244bd68bbbda169247fe6ddec" have entirely different histories.
295609a57d
...
4b6f469a58
18 changed files with 586 additions and 644 deletions
1064
Cargo.lock
generated
1064
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -1,3 +1,6 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
members = ["nzrd", "api", "client"]
|
members = [
|
||||||
resolver = "2"
|
"nzrd",
|
||||||
|
"api",
|
||||||
|
"client",
|
||||||
|
]
|
||||||
|
|
|
@ -8,9 +8,8 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
figment = { version = "0.10.8", features = ["json", "toml", "env"] }
|
figment = { version = "0.10.8", features = ["json", "toml", "env"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
tarpc = { version = "0.34", features = ["tokio1", "unix"] }
|
tarpc = { version = "0.31", features = ["tokio1", "unix"] }
|
||||||
tokio = { version = "1.0", features = ["macros"] }
|
tokio = { version = "1.0", features = ["macros"] }
|
||||||
uuid = "1.2.2"
|
uuid = "1.2.2"
|
||||||
# trust-dns-proto = { version = "0.23", features = ["serde-config"] }
|
trust-dns-proto = { version = "0.22.0", features = ["serde-config"] }
|
||||||
hickory-proto = { version = "0.24", features = ["serde-config"] }
|
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
|
@ -4,8 +4,8 @@ use figment::{
|
||||||
providers::{Env, Format, Json, Toml},
|
providers::{Env, Format, Json, Toml},
|
||||||
Figment, Metadata, Provider,
|
Figment, Metadata, Provider,
|
||||||
};
|
};
|
||||||
use hickory_proto::rr::Name;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use trust_dns_proto::rr::Name;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct StorageConfig {
|
pub struct StorageConfig {
|
||||||
|
|
|
@ -5,7 +5,7 @@ pub mod config;
|
||||||
pub mod model;
|
pub mod model;
|
||||||
pub mod net;
|
pub mod net;
|
||||||
|
|
||||||
pub use hickory_proto;
|
pub use trust_dns_proto;
|
||||||
|
|
||||||
#[tarpc::service]
|
#[tarpc::service]
|
||||||
pub trait Nazrin {
|
pub trait Nazrin {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use hickory_proto::rr::Name;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{fmt, net::Ipv4Addr};
|
use std::{fmt, net::Ipv4Addr};
|
||||||
|
use trust_dns_proto::rr::Name;
|
||||||
|
|
||||||
use crate::net::{cidr::CidrV4, mac::MacAddr};
|
use crate::net::{cidr::CidrV4, mac::MacAddr};
|
||||||
|
|
||||||
|
|
|
@ -10,14 +10,9 @@ nzr-api = { path = "../api" }
|
||||||
clap = { version = "4.0.26", features = ["derive"] }
|
clap = { version = "4.0.26", features = ["derive"] }
|
||||||
home = "0.5.4"
|
home = "0.5.4"
|
||||||
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
|
||||||
tokio-serde = { version = "0.9", features = ["bincode"] }
|
tokio-serde = { version = "0.8.0", features = ["bincode"] }
|
||||||
tarpc = { version = "0.34", features = [
|
tarpc = { version = "0.31", features = ["tokio1", "unix", "serde-transport", "serde-transport-bincode"] }
|
||||||
"tokio1",
|
tabled = "0.10.0"
|
||||||
"unix",
|
|
||||||
"serde-transport",
|
|
||||||
"serde-transport-bincode",
|
|
||||||
] }
|
|
||||||
tabled = "0.15"
|
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
env_logger = "0.11"
|
env_logger = "0.10.0"
|
|
@ -1,7 +1,7 @@
|
||||||
use clap::{CommandFactory, FromArgMatches, Parser, Subcommand};
|
use clap::{CommandFactory, FromArgMatches, Parser, Subcommand};
|
||||||
use nzr_api::hickory_proto::rr::Name;
|
|
||||||
use nzr_api::model;
|
use nzr_api::model;
|
||||||
use nzr_api::net::cidr::CidrV4;
|
use nzr_api::net::cidr::CidrV4;
|
||||||
|
use nzr_api::trust_dns_proto::rr::Name;
|
||||||
use nzr_api::{config, NazrinClient};
|
use nzr_api::{config, NazrinClient};
|
||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
@ -328,8 +328,8 @@ async fn handle_command() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let tabular: Vec<table::Instance> =
|
let tabular: Vec<table::Instance> =
|
||||||
instances?.iter().map(table::Instance::from).collect();
|
instances?.iter().map(table::Instance::from).collect();
|
||||||
let mut table = tabled::Table::new(tabular);
|
let mut table = tabled::Table::new(&tabular);
|
||||||
println!("{}", table.with(tabled::settings::Style::psql()));
|
println!("{}", table.with(tabled::Style::psql()));
|
||||||
}
|
}
|
||||||
InstanceCmd::Prune => (client.garbage_collect(tarpc::context::current()).await?)?,
|
InstanceCmd::Prune => (client.garbage_collect(tarpc::context::current()).await?)?,
|
||||||
},
|
},
|
||||||
|
@ -423,8 +423,8 @@ async fn handle_command() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let tabular: Vec<table::Subnet> =
|
let tabular: Vec<table::Subnet> =
|
||||||
subnets?.iter().map(table::Subnet::from).collect();
|
subnets?.iter().map(table::Subnet::from).collect();
|
||||||
let mut table = tabled::Table::new(tabular);
|
let mut table = tabled::Table::new(&tabular);
|
||||||
println!("{}", table.with(tabled::settings::Style::psql()));
|
println!("{}", table.with(tabled::Style::psql()));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,49 +6,35 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tarpc = { version = "0.34", features = [
|
tarpc = { version = "0.31", features = ["tokio1", "unix", "serde-transport", "serde-transport-bincode"] }
|
||||||
"tokio1",
|
tokio = { version = "1.0", features = ["macros", "rt-multi-thread", "process"] }
|
||||||
"unix",
|
tokio-serde = { version = "0.8.0", features = ["bincode"] }
|
||||||
"serde-transport",
|
|
||||||
"serde-transport-bincode",
|
|
||||||
] }
|
|
||||||
tokio = { version = "1", features = ["macros", "rt-multi-thread", "process"] }
|
|
||||||
tokio-serde = { version = "0.9", features = ["bincode"] }
|
|
||||||
sled = "0.34.7"
|
sled = "0.34.7"
|
||||||
virt = "0.4"
|
# virt = "0.2.11"
|
||||||
# virt = { path = "../../libvirt-rust" }
|
virt = { path = "../../libvirt-rust" }
|
||||||
fatfs = "0.3"
|
fatfs = "0.3"
|
||||||
uuid = { version = "1.2.2", features = [
|
uuid = { version = "1.2.2", features = ["v4", "fast-rng", "serde", "macro-diagnostics"] }
|
||||||
"v4",
|
|
||||||
"fast-rng",
|
|
||||||
"serde",
|
|
||||||
"macro-diagnostics",
|
|
||||||
] }
|
|
||||||
clap = { version = "4.0.26", features = ["derive"] }
|
clap = { version = "4.0.26", features = ["derive"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
# for new @attr support, awaiting 0.27.0
|
# for new @attr support, awaiting 0.27.0
|
||||||
quick-xml = { version = "0.36", features = ["serialize"] }
|
quick-xml = { git = "https://github.com/tafia/quick-xml", rev = "fb079b6714d7238d5180aaa098c5f9b02dbcc7da", features = ["serialize"] }
|
||||||
# quick-xml = { git = "https://github.com/tafia/quick-xml", rev = "fb079b6714d7238d5180aaa098c5f9b02dbcc7da", features = [
|
serde_with = "2.1.0"
|
||||||
# "serialize",
|
|
||||||
# ] }
|
|
||||||
serde_with = "2"
|
|
||||||
serde_yaml = "0.9.14"
|
serde_yaml = "0.9.14"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
libc = "0.2.137"
|
libc = "0.2.137"
|
||||||
home = "0.5.4"
|
home = "0.5.4"
|
||||||
stdext = "0.3.1"
|
stdext = "0.3.1"
|
||||||
zerocopy = "0.7"
|
zerocopy = "0.6.1"
|
||||||
nzr-api = { path = "../api" }
|
nzr-api = { path = "../api" }
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
|
async-trait = "0.1.60"
|
||||||
ciborium = "0.2.0"
|
ciborium = "0.2.0"
|
||||||
ciborium-io = "0.2.0"
|
ciborium-io = "0.2.0"
|
||||||
hickory-server = "0.24"
|
trust-dns-server = "0.22.0"
|
||||||
hickory-proto = { version = "0.24", features = ["serde-config"] }
|
|
||||||
async-trait = "0.1"
|
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
syslog = "7"
|
syslog = "6.0.1"
|
||||||
nix = { version = "0.29", features = ["user", "fs"] }
|
nix = "0.26.1"
|
||||||
tempfile = "3"
|
tempdir = "0.3.7"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use std::net::Ipv4Addr;
|
use std::net::Ipv4Addr;
|
||||||
|
|
||||||
use fatfs::FsOptions;
|
use fatfs::FsOptions;
|
||||||
use hickory_server::proto::rr::Name;
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use serde_with::skip_serializing_none;
|
use serde_with::skip_serializing_none;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::io::{prelude::*, Cursor};
|
use std::io::{prelude::*, Cursor};
|
||||||
|
use trust_dns_server::proto::rr::Name;
|
||||||
|
|
||||||
use nzr_api::net::{cidr::CidrV4, mac::MacAddr};
|
use nzr_api::net::{cidr::CidrV4, mac::MacAddr};
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,11 @@ use crate::ctrl::Storable;
|
||||||
use crate::ctx::Context;
|
use crate::ctx::Context;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::virt::VirtVolume;
|
use crate::virt::VirtVolume;
|
||||||
use hickory_server::proto::rr::Name;
|
|
||||||
use log::*;
|
use log::*;
|
||||||
use nzr_api::args;
|
use nzr_api::args;
|
||||||
use nzr_api::net::mac::MacAddr;
|
use nzr_api::net::mac::MacAddr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use trust_dns_server::proto::rr::Name;
|
||||||
|
|
||||||
const VIRT_MAC_OUI: &[u8] = &[0x02, 0xf1, 0x0f];
|
const VIRT_MAC_OUI: &[u8] = &[0x02, 0xf1, 0x0f];
|
||||||
|
|
||||||
|
@ -37,10 +37,13 @@ pub async fn new_instance(
|
||||||
// find the subnet corresponding to the interface
|
// find the subnet corresponding to the interface
|
||||||
let subnet = Subnet::get_by_key(ctx.db.clone(), args.subnet.as_bytes())
|
let subnet = Subnet::get_by_key(ctx.db.clone(), args.subnet.as_bytes())
|
||||||
.map_err(|er| cmd_error!("Unable to get interface: {}", er))?
|
.map_err(|er| cmd_error!("Unable to get interface: {}", er))?
|
||||||
.ok_or(cmd_error!(
|
.map_or(
|
||||||
"Subnet {} wasn't found in database",
|
Err(cmd_error!(
|
||||||
&args.subnet
|
"Subnet {} wasn't found in database",
|
||||||
))?;
|
&args.subnet
|
||||||
|
)),
|
||||||
|
Ok,
|
||||||
|
)?;
|
||||||
|
|
||||||
// bail if a domain already exists
|
// bail if a domain already exists
|
||||||
if let Ok(dom) = virt::domain::Domain::lookup_by_name(&ctx.virt.conn, &args.name) {
|
if let Ok(dom) = virt::domain::Domain::lookup_by_name(&ctx.virt.conn, &args.name) {
|
||||||
|
|
|
@ -19,7 +19,7 @@ impl DomainBuilder {
|
||||||
/// > used to form the filename for storing the persistent
|
/// > used to form the filename for storing the persistent
|
||||||
/// > configuration file.
|
/// > configuration file.
|
||||||
pub fn name(mut self, name: &str) -> Self {
|
pub fn name(mut self, name: &str) -> Self {
|
||||||
name.clone_into(&mut self.domain.name);
|
self.domain.name = name.to_owned();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ impl IfaceBuilder {
|
||||||
/// qemu-system-x86_64 -net nic,model=? /dev/null
|
/// qemu-system-x86_64 -net nic,model=? /dev/null
|
||||||
/// ```
|
/// ```
|
||||||
pub fn model(mut self, model: &str) -> Self {
|
pub fn model(mut self, model: &str) -> Self {
|
||||||
model.clone_into(&mut self.iface.model.r#type);
|
self.iface.model.r#type = model.to_owned();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,8 +233,8 @@ impl DiskBuilder {
|
||||||
|
|
||||||
/// Set the target for the disk to attach to.
|
/// Set the target for the disk to attach to.
|
||||||
pub fn target(mut self, dev: &str, bus: &str) -> Self {
|
pub fn target(mut self, dev: &str, bus: &str) -> Self {
|
||||||
bus.clone_into(&mut self.disk.target.bus);
|
self.disk.target.bus = bus.to_owned();
|
||||||
dev.clone_into(&mut self.disk.target.dev);
|
self.disk.target.dev = dev.to_owned();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ impl std::error::Error for ContextError {}
|
||||||
impl InnerCtx {
|
impl InnerCtx {
|
||||||
fn new(config: Config) -> Result<Self, ContextError> {
|
fn new(config: Config) -> Result<Self, ContextError> {
|
||||||
let zones = ZoneData::new(&config.dns);
|
let zones = ZoneData::new(&config.dns);
|
||||||
let conn = Connect::open(Some(&config.libvirt_uri)).map_err(ContextError::Virt)?;
|
let conn = Connect::open(&config.libvirt_uri).map_err(ContextError::Virt)?;
|
||||||
virt::error::clear_error_callback();
|
virt::error::clear_error_callback();
|
||||||
|
|
||||||
let pools = PoolRefs {
|
let pools = PoolRefs {
|
||||||
|
|
|
@ -9,12 +9,14 @@ use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::sync::{Mutex, RwLock};
|
use tokio::sync::{Mutex, RwLock};
|
||||||
|
|
||||||
use hickory_proto::rr::Name;
|
use trust_dns_server::authority::{AuthorityObject, Catalog};
|
||||||
use hickory_server::authority::{AuthorityObject, Catalog};
|
use trust_dns_server::client::rr::{LowerName, RrKey};
|
||||||
use hickory_server::proto::rr::{rdata::soa, RData, RecordSet};
|
use trust_dns_server::proto::rr::{rdata::soa, RData, RecordSet};
|
||||||
use hickory_server::proto::rr::{LowerName, RrKey};
|
use trust_dns_server::server::{Request, RequestHandler, ResponseHandler, ResponseInfo};
|
||||||
use hickory_server::server::{Request, RequestHandler, ResponseHandler, ResponseInfo};
|
use trust_dns_server::{
|
||||||
use hickory_server::{proto::rr::Record, store::in_memory::InMemoryAuthority};
|
proto::rr::{Name, Record},
|
||||||
|
store::in_memory::InMemoryAuthority,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CatalogRef(Arc<RwLock<Catalog>>);
|
pub struct CatalogRef(Arc<RwLock<Catalog>>);
|
||||||
|
@ -30,14 +32,12 @@ macro_rules! make_serial {
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
// hickory_dns 0.24 still requires async_trait
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl RequestHandler for CatalogRef {
|
impl RequestHandler for CatalogRef {
|
||||||
async fn handle_request<R: ResponseHandler>(
|
async fn handle_request<R>(&self, request: &Request, response_handle: R) -> ResponseInfo
|
||||||
&self,
|
where
|
||||||
request: &Request,
|
R: ResponseHandler,
|
||||||
response_handle: R,
|
{
|
||||||
) -> ResponseInfo {
|
|
||||||
self.0
|
self.0
|
||||||
.read()
|
.read()
|
||||||
.await
|
.await
|
||||||
|
@ -74,7 +74,7 @@ pub fn make_rectree_with_soa(name: &Name, config: &DNSConfig) -> BTreeMap<RrKey,
|
||||||
let mut records: BTreeMap<RrKey, RecordSet> = BTreeMap::new();
|
let mut records: BTreeMap<RrKey, RecordSet> = BTreeMap::new();
|
||||||
let soa_key = RrKey::new(
|
let soa_key = RrKey::new(
|
||||||
LowerName::from(name),
|
LowerName::from(name),
|
||||||
hickory_server::proto::rr::RecordType::SOA,
|
trust_dns_server::proto::rr::RecordType::SOA,
|
||||||
);
|
);
|
||||||
let soa_rec = Record::from_rdata(
|
let soa_rec = Record::from_rdata(
|
||||||
name.clone(),
|
name.clone(),
|
||||||
|
@ -100,7 +100,7 @@ impl InnerZD {
|
||||||
InMemoryAuthority::new(
|
InMemoryAuthority::new(
|
||||||
dns_config.default_zone.clone(),
|
dns_config.default_zone.clone(),
|
||||||
records,
|
records,
|
||||||
hickory_server::authority::ZoneType::Primary,
|
trust_dns_server::authority::ZoneType::Primary,
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -123,7 +123,7 @@ impl InnerZD {
|
||||||
let auth = InMemoryAuthority::new(
|
let auth = InMemoryAuthority::new(
|
||||||
name.clone(),
|
name.clone(),
|
||||||
make_rectree_with_soa(name, &self.config),
|
make_rectree_with_soa(name, &self.config),
|
||||||
hickory_server::authority::ZoneType::Primary,
|
trust_dns_server::authority::ZoneType::Primary,
|
||||||
false,
|
false,
|
||||||
)?;
|
)?;
|
||||||
self.import(&subnet.ifname.to_string(), auth).await;
|
self.import(&subnet.ifname.to_string(), auth).await;
|
||||||
|
@ -174,7 +174,7 @@ impl InnerZD {
|
||||||
zone.origin()
|
zone.origin()
|
||||||
);
|
);
|
||||||
|
|
||||||
let record = Record::from_rdata(fqdn, 3600, RData::A(addr.into()));
|
let record = Record::from_rdata(fqdn, 3600, RData::A(addr));
|
||||||
zone.upsert(record, 0).await;
|
zone.upsert(record, 0).await;
|
||||||
self.catalog()
|
self.catalog()
|
||||||
.0
|
.0
|
||||||
|
@ -194,7 +194,7 @@ impl InnerZD {
|
||||||
if let Some(zone) = zones.get_mut(interface) {
|
if let Some(zone) = zones.get_mut(interface) {
|
||||||
let hostname: LowerName = hostname.into();
|
let hostname: LowerName = hostname.into();
|
||||||
self.catalog.0.write().await.remove(&hostname);
|
self.catalog.0.write().await.remove(&hostname);
|
||||||
let key = RrKey::new(hostname, hickory_server::proto::rr::RecordType::A);
|
let key = RrKey::new(hostname, trust_dns_server::proto::rr::RecordType::A);
|
||||||
Ok(zone.records_mut().await.remove(&key).is_some())
|
Ok(zone.records_mut().await.remove(&key).is_some())
|
||||||
} else {
|
} else {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
|
|
|
@ -5,7 +5,7 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use tempfile::TempDir;
|
use tempdir::TempDir;
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
|
|
||||||
use crate::ctrl::virtxml::SizeInfo;
|
use crate::ctrl::virtxml::SizeInfo;
|
||||||
|
@ -101,7 +101,7 @@ where
|
||||||
Fut: Future<Output = std::io::Result<std::process::Output>>,
|
Fut: Future<Output = std::io::Result<std::process::Output>>,
|
||||||
{
|
{
|
||||||
let qi_path = qemu_img_path()?;
|
let qi_path = qemu_img_path()?;
|
||||||
let img_dir = TempDir::with_prefix("nazrin")?;
|
let img_dir = TempDir::new("nazrin")?;
|
||||||
let img_path = img_dir.path().join("img");
|
let img_path = img_dir.path().join("img");
|
||||||
|
|
||||||
let qi_out = func(Command::new(&qi_path), &img_path)
|
let qi_out = func(Command::new(&qi_path), &img_path)
|
||||||
|
|
|
@ -11,12 +11,12 @@ mod test;
|
||||||
mod virt;
|
mod virt;
|
||||||
|
|
||||||
use crate::ctrl::{net::Subnet, Storable};
|
use crate::ctrl::{net::Subnet, Storable};
|
||||||
use hickory_server::ServerFuture;
|
|
||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
use log::*;
|
use log::*;
|
||||||
use nzr_api::config;
|
use nzr_api::config;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use tokio::net::UdpSocket;
|
use tokio::net::UdpSocket;
|
||||||
|
use trust_dns_server::ServerFuture;
|
||||||
|
|
||||||
#[tokio::main(flavor = "multi_thread")]
|
#[tokio::main(flavor = "multi_thread")]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
use futures::{future, StreamExt};
|
|
||||||
use nzr_api::{args, model, Nazrin};
|
use nzr_api::{args, model, Nazrin};
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -36,6 +35,7 @@ impl NzrServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tarpc::server]
|
||||||
impl Nazrin for NzrServer {
|
impl Nazrin for NzrServer {
|
||||||
async fn new_instance(
|
async fn new_instance(
|
||||||
self,
|
self,
|
||||||
|
@ -55,7 +55,7 @@ impl Nazrin for NzrServer {
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut pt = prog_task.write().await;
|
let mut pt = prog_task.write().await;
|
||||||
"Starting instance...".clone_into(&mut pt.status_text);
|
pt.status_text = "Starting instance...".to_owned();
|
||||||
pt.percentage = 90.0;
|
pt.percentage = 90.0;
|
||||||
}
|
}
|
||||||
if let Some(addr) = addr {
|
if let Some(addr) = addr {
|
||||||
|
@ -281,10 +281,6 @@ pub async fn serve(ctx: Context, zones: ZoneData) -> Result<(), Box<dyn std::err
|
||||||
let transport = tarpc::serde_transport::new(framed, Bincode::default());
|
let transport = tarpc::serde_transport::new(framed, Bincode::default());
|
||||||
BaseChannel::with_defaults(transport)
|
BaseChannel::with_defaults(transport)
|
||||||
.execute(NzrServer::new(ctx, zones).serve())
|
.execute(NzrServer::new(ctx, zones).serve())
|
||||||
.for_each(|rpc| {
|
|
||||||
tokio::spawn(rpc);
|
|
||||||
future::ready(())
|
|
||||||
})
|
|
||||||
.await;
|
.await;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ impl VirtVolume {
|
||||||
let svol = StorageVol::create_xml(pool, &xml, flags)?;
|
let svol = StorageVol::create_xml(pool, &xml, flags)?;
|
||||||
|
|
||||||
if xmldata.vol_type() == Some(VolType::Qcow2) {
|
if xmldata.vol_type() == Some(VolType::Qcow2) {
|
||||||
let size = xmldata.capacity.unwrap();
|
let size = xmldata.capacity.unwrap().clone();
|
||||||
let src_img = img::create_qcow2(size).await?;
|
let src_img = img::create_qcow2(size).await?;
|
||||||
|
|
||||||
let stream = match Stream::new(&svol.get_connect().map_err(PoolError::VirtError)?, 0) {
|
let stream = match Stream::new(&svol.get_connect().map_err(PoolError::VirtError)?, 0) {
|
||||||
|
@ -93,7 +93,7 @@ impl VirtVolume {
|
||||||
return Err(Box::new(PoolError::CantUpload(er)));
|
return Err(Box::new(PoolError::CantUpload(er)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Self::upload_img(&src_img, stream)?;
|
Self::upload_img(&*src_img, stream)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
|
@ -125,7 +125,7 @@ impl VirtVolume {
|
||||||
|
|
||||||
let src_path = self.get_path().map_err(PoolError::NoPath)?;
|
let src_path = self.get_path().map_err(PoolError::NoPath)?;
|
||||||
|
|
||||||
let src_img = img::clone_qcow2(src_path, size)
|
let src_img = img::clone_qcow2(src_path, size.clone())
|
||||||
.await
|
.await
|
||||||
.map_err(PoolError::QemuError)?;
|
.map_err(PoolError::QemuError)?;
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ impl VirtVolume {
|
||||||
return Err(PoolError::CantUpload(er));
|
return Err(PoolError::CantUpload(er));
|
||||||
}
|
}
|
||||||
|
|
||||||
Self::upload_img(&src_img, stream)?;
|
Self::upload_img(&*src_img, stream)?;
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
inner: cloned,
|
inner: cloned,
|
||||||
|
|
Loading…
Reference in a new issue