Skip to content

Commit 4c8ad73

Browse files
committed
feat: mask/unmask
1 parent 69c60fd commit 4c8ad73

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

src/domain/service_repository.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ pub trait ServiceRepository {
1313
fn restart_service(&self, name: &str) -> Result<Service, Box<dyn Error>>;
1414
fn enable_service(&self, name: &str) -> Result<Service, Box<dyn Error>>;
1515
fn disable_service(&self, name: &str) -> Result<Service, Box<dyn Error>>;
16+
fn mask_service(&self, name: &str) -> Result<Service, Box<dyn Error>>;
17+
fn unmask_service(&self, name: &str) -> Result<Service, Box<dyn Error>>;
1618
fn reload_daemon(&self) -> Result<(), Box<dyn std::error::Error>>;
1719
fn change_connection(&mut self, connection_type: ConnectionType) -> Result<(), zbus::Error>;
1820
fn systemctl_cat(&self, name: &str) -> Result<String, Box<dyn Error>>;

src/infrastructure/systemd_service_adapter.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ impl ServiceRepository for SystemdServiceAdapter {
194194
let mut service = self.get_unit(name)?;
195195
while service.state().active().ends_with("ing") {
196196
service = self.get_unit(name)?;
197+
thread::sleep(Duration::from_millis(100));
197198
}
198199
Ok(service)
199200
}
@@ -205,6 +206,7 @@ impl ServiceRepository for SystemdServiceAdapter {
205206
let mut service = self.get_unit(name)?;
206207
while service.state().active().ends_with("ing") {
207208
service = self.get_unit(name)?;
209+
thread::sleep(Duration::from_millis(100));
208210
}
209211
Ok(service)
210212
}
@@ -216,6 +218,7 @@ impl ServiceRepository for SystemdServiceAdapter {
216218
let mut service = self.get_unit(name)?;
217219
while service.state().active().ends_with("ing") {
218220
service = self.get_unit(name)?;
221+
thread::sleep(Duration::from_millis(100));
219222
}
220223
Ok(service)
221224
}
@@ -236,6 +239,22 @@ impl ServiceRepository for SystemdServiceAdapter {
236239
self.get_unit(name)
237240
}
238241

242+
fn mask_service(&self, name: &str) -> Result<Service, Box<dyn std::error::Error>> {
243+
let proxy = self.manager_proxy()?;
244+
let _output: Vec<(String, String, String)> =
245+
proxy.call("MaskUnitFiles", &(vec![name], false, true))?;
246+
thread::sleep(Duration::from_millis(SLEEP_DURATION));
247+
self.get_unit(name)
248+
}
249+
250+
fn unmask_service(&self, name: &str) -> Result<Service, Box<dyn std::error::Error>> {
251+
let proxy = self.manager_proxy()?;
252+
let _output: Vec<(String, String, String)> =
253+
proxy.call("UnmaskUnitFiles", &(vec![name], false))?;
254+
thread::sleep(Duration::from_millis(SLEEP_DURATION));
255+
self.get_unit(name)
256+
}
257+
239258
fn reload_daemon(&self) -> Result<(), Box<dyn std::error::Error>> {
240259
let proxy = self.manager_proxy()?;
241260
proxy.call::<&str, (), ()>("Reload", &())?;

src/terminal/components/list.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ pub enum ServiceAction {
5858
Enable,
5959
Disable,
6060
RefreshAll,
61-
ToggleFilter
61+
ToggleFilter,
62+
ToggleMask
6263
}
6364

6465
pub struct TableServices {
@@ -258,6 +259,10 @@ impl TableServices {
258259
self.sender.send(AppEvent::Action(Actions::GoDetails)).unwrap();
259260
return;
260261
}
262+
KeyCode::Char('m') => {
263+
self.sender.send(AppEvent::Action(Actions::ServiceAction(ServiceAction::ToggleMask))).unwrap();
264+
return;
265+
}
261266
_ => {}
262267
}
263268

@@ -336,6 +341,15 @@ impl TableServices {
336341
let binding_usecase = self.usecase.clone();
337342
let usecase = binding_usecase.borrow();
338343
match action {
344+
ServiceAction::ToggleMask => {
345+
match service.state().file() {
346+
"masked" => self.handle_service_result(usecase.unmask_service(service)),
347+
"masked-runtime" => self.handle_service_result(usecase.unmask_service(service)),
348+
_ => self.handle_service_result(usecase.mask_service(service)),
349+
}
350+
self.fetch_services();
351+
self.fetch_and_refresh(self.old_filter_text.clone());
352+
},
339353
ServiceAction::Start => self.handle_service_result(usecase.start_service(service)),
340354
ServiceAction::Stop => self.handle_service_result(usecase.stop_service(service)),
341355
ServiceAction::Restart => self.handle_service_result(usecase.restart_service(service)),
@@ -382,7 +396,7 @@ impl TableServices {
382396
)));
383397

384398
help_text.push(Line::from(
385-
"Navigate: ↑/↓ | Switch tab: ←/→ | List all: f | Start: s | Stop: x | Restart: r | Enable: e | Disable: d | Refresh all: u | Log: v | Unit File: c"
399+
"Navigate: ↑/↓ | Switch tab: ←/→ | List all: f | Start: s | Stop: x | Restart: r | Enable: e | Disable: d | Mask/Unmask: m | Refresh list: u | Log: v | Unit File: c"
386400
));
387401
}
388402

src/usecases/services_manager.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ impl ServicesManager {
3939
self.repository.reload_daemon()?;
4040
Ok(service)
4141
}
42+
43+
pub fn mask_service(&self, service: &Service) -> Result<Service, Box<dyn Error>> {
44+
let service = self.repository.mask_service(service.name())?;
45+
Ok(service)
46+
}
47+
48+
pub fn unmask_service(&self, service: &Service) -> Result<Service, Box<dyn Error>> {
49+
let service = self.repository.unmask_service(service.name())?;
50+
Ok(service)
51+
}
4252

4353
pub fn list_services(&self, filter: bool) -> Result<Vec<Service>, Box<dyn Error>> {
4454
let mut all = Vec::new();

0 commit comments

Comments
 (0)