mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
fixes an issue where if a package had multiple port mappings, only the last one would get an nginx config
include the nginx paths when *removing* a package
This commit is contained in:
committed by
Aiden McClelland
parent
cc0535ad5b
commit
adeaabfa5f
@@ -9,7 +9,7 @@ use std::time::Duration;
|
|||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
use color_eyre::eyre::eyre;
|
use color_eyre::eyre::eyre;
|
||||||
use patch_db::json_ptr::JsonPointer;
|
use patch_db::json_ptr::JsonPointer;
|
||||||
use patch_db::{DbHandle, PatchDb, Revision};
|
use patch_db::{DbHandle, LockType, PatchDb, Revision};
|
||||||
use reqwest::Url;
|
use reqwest::Url;
|
||||||
use rpc_toolkit::url::Host;
|
use rpc_toolkit::url::Host;
|
||||||
use rpc_toolkit::Context;
|
use rpc_toolkit::Context;
|
||||||
@@ -301,6 +301,10 @@ impl RpcContext {
|
|||||||
#[instrument(skip(self))]
|
#[instrument(skip(self))]
|
||||||
pub async fn cleanup(&self) -> Result<(), Error> {
|
pub async fn cleanup(&self) -> Result<(), Error> {
|
||||||
let mut db = self.db.handle();
|
let mut db = self.db.handle();
|
||||||
|
crate::db::DatabaseModel::new()
|
||||||
|
.package_data()
|
||||||
|
.lock(&mut db, LockType::Write)
|
||||||
|
.await?;
|
||||||
for package_id in crate::db::DatabaseModel::new()
|
for package_id in crate::db::DatabaseModel::new()
|
||||||
.package_data()
|
.package_data()
|
||||||
.keys(&mut db, true)
|
.keys(&mut db, true)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ pub async fn install(
|
|||||||
match pde.take() {
|
match pde.take() {
|
||||||
Some(PackageDataEntry::Installed {
|
Some(PackageDataEntry::Installed {
|
||||||
installed,
|
installed,
|
||||||
manifest,
|
manifest: _manifest,
|
||||||
static_files,
|
static_files,
|
||||||
}) => {
|
}) => {
|
||||||
*pde = Some(PackageDataEntry::Updating {
|
*pde = Some(PackageDataEntry::Updating {
|
||||||
@@ -1020,13 +1020,19 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
|
|||||||
add_dependent_to_current_dependents_lists(&mut tx, pkg_id, ¤t_dependencies).await?;
|
add_dependent_to_current_dependents_lists(&mut tx, pkg_id, ¤t_dependencies).await?;
|
||||||
update_dependency_errors_of_dependents(ctx, &mut tx, pkg_id, current_dependents.keys())
|
update_dependency_errors_of_dependents(ctx, &mut tx, pkg_id, current_dependents.keys())
|
||||||
.await?;
|
.await?;
|
||||||
} else if let Some(recovered) = crate::db::DatabaseModel::new()
|
} else if let Some(recovered) = {
|
||||||
.recovered_packages()
|
// solve taxonomy escalation
|
||||||
.idx_model(pkg_id)
|
crate::db::DatabaseModel::new()
|
||||||
.get(&mut tx, true)
|
.recovered_packages()
|
||||||
.await?
|
.lock(&mut tx, LockType::Write)
|
||||||
.into_owned()
|
.await?;
|
||||||
{
|
crate::db::DatabaseModel::new()
|
||||||
|
.recovered_packages()
|
||||||
|
.idx_model(pkg_id)
|
||||||
|
.get(&mut tx, true)
|
||||||
|
.await?
|
||||||
|
.into_owned()
|
||||||
|
} {
|
||||||
handle_recovered_package(recovered, manifest, ctx, pkg_id, version, &mut tx).await?;
|
handle_recovered_package(recovered, manifest, ctx, pkg_id, version, &mut tx).await?;
|
||||||
add_dependent_to_current_dependents_lists(&mut tx, pkg_id, ¤t_dependencies).await?;
|
add_dependent_to_current_dependents_lists(&mut tx, pkg_id, ¤t_dependencies).await?;
|
||||||
update_dependency_errors_of_dependents(ctx, &mut tx, pkg_id, current_dependents.keys())
|
update_dependency_errors_of_dependents(ctx, &mut tx, pkg_id, current_dependents.keys())
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use patch_db::DbHandle;
|
use patch_db::{DbHandle, LockType};
|
||||||
use reqwest::Url;
|
use reqwest::Url;
|
||||||
use rpc_toolkit::command;
|
use rpc_toolkit::command;
|
||||||
|
|
||||||
@@ -10,6 +10,10 @@ use crate::Error;
|
|||||||
pub async fn set_eos_url(#[context] ctx: RpcContext, #[arg] url: Url) -> Result<(), Error> {
|
pub async fn set_eos_url(#[context] ctx: RpcContext, #[arg] url: Url) -> Result<(), Error> {
|
||||||
let mut db = ctx.db.handle();
|
let mut db = ctx.db.handle();
|
||||||
let mut tx = db.begin().await?;
|
let mut tx = db.begin().await?;
|
||||||
|
crate::db::DatabaseModel::new()
|
||||||
|
.server_info()
|
||||||
|
.lock(&mut tx, LockType::Write)
|
||||||
|
.await?;
|
||||||
crate::db::DatabaseModel::new()
|
crate::db::DatabaseModel::new()
|
||||||
.server_info()
|
.server_info()
|
||||||
.eos_marketplace()
|
.eos_marketplace()
|
||||||
@@ -24,12 +28,16 @@ pub async fn set_eos_url(#[context] ctx: RpcContext, #[arg] url: Url) -> Result<
|
|||||||
pub async fn set_package_url(#[context] ctx: RpcContext, #[arg] url: Url) -> Result<(), Error> {
|
pub async fn set_package_url(#[context] ctx: RpcContext, #[arg] url: Url) -> Result<(), Error> {
|
||||||
let mut db = ctx.db.handle();
|
let mut db = ctx.db.handle();
|
||||||
let mut tx = db.begin().await?;
|
let mut tx = db.begin().await?;
|
||||||
ctx.set_nginx_conf(&mut tx).await?;
|
crate::db::DatabaseModel::new()
|
||||||
|
.server_info()
|
||||||
|
.lock(&mut tx, LockType::Write)
|
||||||
|
.await?;
|
||||||
crate::db::DatabaseModel::new()
|
crate::db::DatabaseModel::new()
|
||||||
.server_info()
|
.server_info()
|
||||||
.package_marketplace()
|
.package_marketplace()
|
||||||
.put(&mut tx, &Some(url))
|
.put(&mut tx, &Some(url))
|
||||||
.await?;
|
.await?;
|
||||||
|
ctx.set_nginx_conf(&mut tx).await?;
|
||||||
tx.commit(None).await?;
|
tx.commit(None).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,8 +120,10 @@ impl NginxControllerInner {
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
// write nginx configs
|
// write nginx configs
|
||||||
let nginx_conf_path =
|
let nginx_conf_path = nginx_root.join(format!(
|
||||||
nginx_root.join(format!("sites-available/{}_{}.conf", package, id));
|
"sites-available/{}_{}_{}.conf",
|
||||||
|
package, id, port.0
|
||||||
|
));
|
||||||
tokio::fs::write(
|
tokio::fs::write(
|
||||||
&nginx_conf_path,
|
&nginx_conf_path,
|
||||||
format!(
|
format!(
|
||||||
@@ -138,7 +140,7 @@ impl NginxControllerInner {
|
|||||||
.await
|
.await
|
||||||
.with_ctx(|_| (ErrorKind::Filesystem, nginx_conf_path.display().to_string()))?;
|
.with_ctx(|_| (ErrorKind::Filesystem, nginx_conf_path.display().to_string()))?;
|
||||||
let sites_enabled_link_path =
|
let sites_enabled_link_path =
|
||||||
nginx_root.join(format!("sites-enabled/{}_{}.conf", package, id));
|
nginx_root.join(format!("sites-enabled/{}_{}_{}.conf", package, id, port.0));
|
||||||
if tokio::fs::metadata(&sites_enabled_link_path).await.is_ok() {
|
if tokio::fs::metadata(&sites_enabled_link_path).await.is_ok() {
|
||||||
tokio::fs::remove_file(&sites_enabled_link_path).await?;
|
tokio::fs::remove_file(&sites_enabled_link_path).await?;
|
||||||
}
|
}
|
||||||
@@ -150,7 +152,7 @@ impl NginxControllerInner {
|
|||||||
match self.interfaces.get_mut(&package) {
|
match self.interfaces.get_mut(&package) {
|
||||||
None => {
|
None => {
|
||||||
let info = PackageNetInfo {
|
let info = PackageNetInfo {
|
||||||
ip: ipv4,
|
_ip: ipv4,
|
||||||
interfaces: interface_map,
|
interfaces: interface_map,
|
||||||
};
|
};
|
||||||
self.interfaces.insert(package, info);
|
self.interfaces.insert(package, info);
|
||||||
@@ -168,35 +170,44 @@ impl NginxControllerInner {
|
|||||||
async fn remove(&mut self, nginx_root: &Path, package: &PackageId) -> Result<(), Error> {
|
async fn remove(&mut self, nginx_root: &Path, package: &PackageId) -> Result<(), Error> {
|
||||||
let removed = self.interfaces.remove(package);
|
let removed = self.interfaces.remove(package);
|
||||||
if let Some(net_info) = removed {
|
if let Some(net_info) = removed {
|
||||||
for (id, _meta) in net_info.interfaces {
|
for (id, meta) in net_info.interfaces {
|
||||||
// remove ssl certificates and nginx configs
|
for (port, _lan_port_config) in meta.lan_config.iter() {
|
||||||
let package_path = nginx_root.join(format!("ssl/{}", package));
|
// remove ssl certificates and nginx configs
|
||||||
let enabled_path =
|
let package_path = nginx_root.join(format!("ssl/{}", package));
|
||||||
nginx_root.join(format!("sites-enabled/{}_{}.conf", package, id));
|
let enabled_path = nginx_root
|
||||||
let available_path =
|
.join(format!("sites-enabled/{}_{}_{}.conf", package, id, port.0));
|
||||||
nginx_root.join(format!("sites-available/{}_{}.conf", package, id));
|
let available_path = nginx_root.join(format!(
|
||||||
let _ = tokio::try_join!(
|
"sites-available/{}_{}_{}.conf",
|
||||||
async {
|
package, id, port.0
|
||||||
if tokio::fs::metadata(&package_path).await.is_ok() {
|
));
|
||||||
tokio::fs::remove_dir_all(&package_path)
|
let _ = tokio::try_join!(
|
||||||
.map(|res| {
|
async {
|
||||||
res.with_ctx(|_| {
|
if tokio::fs::metadata(&package_path).await.is_ok() {
|
||||||
(ErrorKind::Filesystem, package_path.display().to_string())
|
tokio::fs::remove_dir_all(&package_path)
|
||||||
|
.map(|res| {
|
||||||
|
res.with_ctx(|_| {
|
||||||
|
(
|
||||||
|
ErrorKind::Filesystem,
|
||||||
|
package_path.display().to_string(),
|
||||||
|
)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
.await?;
|
||||||
.await?;
|
Ok(())
|
||||||
Ok(())
|
} else {
|
||||||
} else {
|
Ok(())
|
||||||
Ok(())
|
}
|
||||||
}
|
},
|
||||||
},
|
tokio::fs::remove_file(&enabled_path).map(|res| res.with_ctx(|_| (
|
||||||
tokio::fs::remove_file(&enabled_path).map(|res| res
|
ErrorKind::Filesystem,
|
||||||
.with_ctx(|_| (ErrorKind::Filesystem, enabled_path.display().to_string()))),
|
enabled_path.display().to_string()
|
||||||
tokio::fs::remove_file(&available_path).map(|res| res.with_ctx(|_| (
|
))),
|
||||||
ErrorKind::Filesystem,
|
tokio::fs::remove_file(&available_path).map(|res| res.with_ctx(|_| (
|
||||||
available_path.display().to_string()
|
ErrorKind::Filesystem,
|
||||||
))),
|
available_path.display().to_string()
|
||||||
)?;
|
))),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.hup().await?;
|
self.hup().await?;
|
||||||
@@ -214,7 +225,7 @@ impl NginxControllerInner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct PackageNetInfo {
|
struct PackageNetInfo {
|
||||||
ip: Ipv4Addr,
|
_ip: Ipv4Addr,
|
||||||
interfaces: BTreeMap<InterfaceId, InterfaceMetadata>,
|
interfaces: BTreeMap<InterfaceId, InterfaceMetadata>,
|
||||||
}
|
}
|
||||||
pub struct InterfaceMetadata {
|
pub struct InterfaceMetadata {
|
||||||
|
|||||||
Reference in New Issue
Block a user