Reorganize dashboard UI with tabbed layout and improved status bars
All checks were successful
Build and Release / build-and-release (push) Successful in 1m36s
All checks were successful
Build and Release / build-and-release (push) Successful in 1m36s
Add tabbed navigation in right panel with "hosts | services" tabs to better utilize vertical space. Hosts tab displays all available hosts with blue selector bar (j/k navigation, Enter to switch). Services tab shows services for currently selected host. Status bar improvements: - Move dashboard IP to top-right status bar (non-bold) - Restructure bottom status bar with right-aligned build/agent versions - Fix overflow crashes using saturating_sub for small terminal windows Additional changes: - Add HostsWidget with scroll handling and mouse click support - Bold styling for currently active host - Create render_content() methods to avoid nested blocks in tabs - Display SMB share read/write mode in share listings
This commit is contained in:
@@ -251,12 +251,11 @@ impl SystemdCollector {
|
||||
if (service_name == "smbd" || service_name == "samba-smbd") && status_info.active_state == "active" {
|
||||
// Add SMB shares as sub-services
|
||||
let shares = self.get_smb_shares();
|
||||
for (share_name, share_path) in shares {
|
||||
let metrics = Vec::new();
|
||||
for (share_name, share_path, mode) in shares {
|
||||
sub_services.push(SubServiceData {
|
||||
name: format!("{}: {}", share_name, share_path),
|
||||
name: format!("{}: {} {}", share_name, share_path, mode),
|
||||
service_status: Status::Info,
|
||||
metrics,
|
||||
metrics: Vec::new(),
|
||||
service_type: "smb_share".to_string(),
|
||||
});
|
||||
}
|
||||
@@ -1133,13 +1132,14 @@ impl SystemdCollector {
|
||||
}
|
||||
|
||||
/// Get SMB shares from smb.conf
|
||||
/// Returns a list of (share_name, share_path) tuples
|
||||
fn get_smb_shares(&self) -> Vec<(String, String)> {
|
||||
/// Returns a list of (share_name, share_path, mode) tuples
|
||||
fn get_smb_shares(&self) -> Vec<(String, String, String)> {
|
||||
match std::fs::read_to_string("/etc/samba/smb.conf") {
|
||||
Ok(config) => {
|
||||
let mut shares = Vec::new();
|
||||
let mut current_share: Option<String> = None;
|
||||
let mut current_path: Option<String> = None;
|
||||
let mut current_mode: String = "ro".to_string(); // Default to read-only
|
||||
|
||||
for line in config.lines() {
|
||||
let line = line.trim();
|
||||
@@ -1155,7 +1155,7 @@ impl SystemdCollector {
|
||||
if let (Some(name), Some(path)) = (current_share.take(), current_path.take()) {
|
||||
// Skip special sections
|
||||
if name != "global" && name != "homes" && name != "printers" {
|
||||
shares.push((name, path));
|
||||
shares.push((name, path, current_mode.clone()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1163,6 +1163,7 @@ impl SystemdCollector {
|
||||
let share_name = line[1..line.len()-1].trim().to_string();
|
||||
current_share = Some(share_name);
|
||||
current_path = None;
|
||||
current_mode = "ro".to_string(); // Reset to default
|
||||
}
|
||||
// Look for path = /some/path
|
||||
else if line.starts_with("path") && line.contains('=') {
|
||||
@@ -1170,12 +1171,26 @@ impl SystemdCollector {
|
||||
current_path = Some(path_value.trim().to_string());
|
||||
}
|
||||
}
|
||||
// Look for read only = yes/no
|
||||
else if line.to_lowercase().starts_with("read only") && line.contains('=') {
|
||||
if let Some(value) = line.split('=').nth(1) {
|
||||
let val = value.trim().to_lowercase();
|
||||
current_mode = if val == "no" || val == "false" { "rw" } else { "ro" }.to_string();
|
||||
}
|
||||
}
|
||||
// Look for writable = yes/no (opposite of read only)
|
||||
else if line.to_lowercase().starts_with("writable") && line.contains('=') {
|
||||
if let Some(value) = line.split('=').nth(1) {
|
||||
let val = value.trim().to_lowercase();
|
||||
current_mode = if val == "yes" || val == "true" { "rw" } else { "ro" }.to_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Don't forget the last share
|
||||
if let (Some(name), Some(path)) = (current_share, current_path) {
|
||||
if name != "global" && name != "homes" && name != "printers" {
|
||||
shares.push((name, path));
|
||||
shares.push((name, path, current_mode));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user