Revert "v0.4.65: Local directory ISO source (bind-mount workaround for Unraid)"

This reverts commit 72a2089c98.
This commit is contained in:
Miles Ward
2026-05-28 10:47:17 -04:00
parent 761489761c
commit 07e7c18698
12 changed files with 29 additions and 1027 deletions
+2 -80
View File
@@ -35,7 +35,7 @@ use openpxe_core::{
MAX_LOGO_BYTES,
};
use openpxe_ipxe_assets::asset_bytes;
use openpxe_iso_store::{IsoCategory, IsoMeta, LocalDirAddRequest, NfsAddRequest};
use openpxe_iso_store::{IsoCategory, IsoMeta, NfsAddRequest};
use serde::Deserialize;
use serde_json::json;
use std::net::SocketAddr;
@@ -136,13 +136,6 @@ pub fn build_router(state: AppState) -> Router {
.route("/api/nfs", get(api_nfs_list).post(api_nfs_add))
.route("/api/nfs/:id", delete(api_nfs_remove))
.route("/api/nfs/:id/scan", post(api_nfs_scan))
// v0.4.65: host-kernel NFS capability probe + bind-mounted
// local-directory source (works on Unraid / restricted-SCC
// hosts that can't kernel-mount NFS inside the container).
.route("/api/nfs/capabilities", get(api_nfs_capabilities))
.route("/api/local-dirs", get(api_local_dirs_list).post(api_local_dirs_add))
.route("/api/local-dirs/:id", delete(api_local_dirs_remove))
.route("/api/local-dirs/:id/scan", post(api_local_dirs_scan))
// Phase 4: Network info (read-only) + DNS edit.
.route("/api/network", get(api_network).put(api_network_put))
// Phase 4: live-log stream + recent buffer for the Terminal tab.
@@ -1039,26 +1032,11 @@ async fn api_docs() -> Json<serde_json::Value> {
{"method": "GET", "path": "/api/nfs",
"summary": "List configured NFS shares with mount state and iso counts."},
{"method": "POST", "path": "/api/nfs",
"summary": "Mount an NFS share. Body: { server, export, version, read_only, port? }."},
"summary": "Mount an NFS share. Body: { server, export, version, read_only }."},
{"method": "DELETE", "path": "/api/nfs/:id",
"summary": "Unmount a share and drop its entries from the ISO store."},
{"method": "POST", "path": "/api/nfs/:id/scan",
"summary": "Re-walk a mounted share for ISOs."},
{"method": "GET", "path": "/api/nfs/capabilities",
"summary": "Host-kernel NFS client support snapshot from /proc/filesystems."},
],
},
{
"name": "Local directories (v0.4.65)",
"endpoints": [
{"method": "GET", "path": "/api/local-dirs",
"summary": "List bind-mounted host directories registered as ISO sources."},
{"method": "POST", "path": "/api/local-dirs",
"summary": "Register a bind-mounted directory. Body: { path, label? }."},
{"method": "DELETE", "path": "/api/local-dirs/:id",
"summary": "Unregister a directory and drop its entries from the ISO store."},
{"method": "POST", "path": "/api/local-dirs/:id/scan",
"summary": "Re-walk a registered directory for ISOs."},
],
},
{
@@ -1758,62 +1736,6 @@ async fn api_nfs_scan(State(state): State<AppState>, AxumPath(id): AxumPath<Stri
}
}
// ─── v0.4.65: host-kernel NFS capability probe ─────────────────────────────
async fn api_nfs_capabilities(State(state): State<AppState>) -> Json<serde_json::Value> {
// The host caps are snapshotted at startup (pure read of
// /proc/filesystems) so this handler is just a JSON projection.
// The Storage tab uses `available` to decide whether to show the
// "your kernel doesn't have NFS client support" banner above the
// NFS form.
let c = &state.nfs_host_caps;
Json(json!({
"available": c.available,
"has_nfs3": c.has_nfs3,
"has_nfs4": c.has_nfs4,
"detail": c.detail,
}))
}
// ─── v0.4.65: bind-mounted local directories ───────────────────────────────
async fn api_local_dirs_list(State(state): State<AppState>) -> Json<serde_json::Value> {
Json(json!({ "directories": state.local_dirs.list() }))
}
async fn api_local_dirs_add(
State(state): State<AppState>,
Json(req): Json<LocalDirAddRequest>,
) -> Response {
match state.local_dirs.add(req).await {
Ok(d) => (StatusCode::CREATED, Json(d)).into_response(),
// The manager's errors are always operator-actionable
// (relative path / missing path / not-a-directory), so we
// surface them verbatim as 400s.
Err(e) => (StatusCode::BAD_REQUEST, format!("{e}")).into_response(),
}
}
async fn api_local_dirs_remove(
State(state): State<AppState>,
AxumPath(id): AxumPath<String>,
) -> Response {
match state.local_dirs.remove(&id).await {
Ok(()) => StatusCode::NO_CONTENT.into_response(),
Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, format!("{e}")).into_response(),
}
}
async fn api_local_dirs_scan(
State(state): State<AppState>,
AxumPath(id): AxumPath<String>,
) -> Response {
match state.local_dirs.rescan(&id).await {
Ok(n) => Json(json!({ "ok": true, "iso_count": n })).into_response(),
Err(e) => (StatusCode::BAD_REQUEST, format!("{e}")).into_response(),
}
}
// ─── Network info API ──────────────────────────────────────────────────────
async fn api_network(State(state): State<AppState>) -> Json<serde_json::Value> {
+1 -12
View File
@@ -4,7 +4,7 @@ use openpxe_core::{
AdminStore, BootLog, BrandingStore, ClientRegistry, DeploymentQueue, HostBindings, LogBus,
Metrics, SettingsStore, SsoStore,
};
use openpxe_iso_store::{IsoStore, LocalDirManager, NfsHostCaps, NfsManager, SmbManager};
use openpxe_iso_store::{IsoStore, NfsManager, SmbManager};
use std::sync::Arc;
use time::OffsetDateTime;
@@ -49,17 +49,6 @@ pub struct AppState {
/// available in the runtime image. Surfaces errors per-mount rather
/// than failing the global state.
pub nfs: NfsManager,
/// v0.4.65: bind-mounted host directories surfaced as ISO sources.
/// The container-friendly workaround for hosts (Unraid is the
/// dominant case) whose kernel lacks NFS client modules. Always
/// present; the operator opts in by registering paths from the
/// Storage tab.
pub local_dirs: LocalDirManager,
/// v0.4.65: host-kernel capability snapshot (from
/// `/proc/filesystems`). Snapshotted once at startup; the Storage
/// tab uses `available` to decide whether to show a "your kernel
/// doesn't have NFS client support" banner above the NFS form.
pub nfs_host_caps: NfsHostCaps,
/// Browser chunked upload state. Multipart uploads still go straight
/// through `IsoStore`, but the UI uses sessions so large ISO transfers
/// can show deterministic progress and leave visible partial files.
-2
View File
@@ -159,8 +159,6 @@ fn isos_text(s: &AppState) -> String {
let src = match i.source {
openpxe_iso_store::IsoSource::Local => "local".to_string(),
openpxe_iso_store::IsoSource::Nfs { mount_id, .. } => format!("nfs:{mount_id}"),
// v0.4.65: bind-mounted host directory.
openpxe_iso_store::IsoSource::LocalDir { dir_id, .. } => format!("dir:{dir_id}"),
};
let _ = writeln!(
out,