|
@ -8,7 +8,7 @@ use std::thread::sleep; |
|
|
use std::time::Duration;
|
|
|
use std::time::Duration;
|
|
|
use std::ops::Deref;
|
|
|
use std::ops::Deref;
|
|
|
|
|
|
|
|
|
use command_runner::CommandRunner;
|
|
|
|
|
|
|
|
|
use command_runner::{CommandRunner, SetuidCommandRunner};
|
|
|
use resources::Resource;
|
|
|
use resources::Resource;
|
|
|
use symbols::Symbol;
|
|
|
use symbols::Symbol;
|
|
|
use symbols::file::File as FileSymbol;
|
|
|
use symbols::file::File as FileSymbol;
|
|
@ -52,15 +52,15 @@ impl<E: Error> fmt::Display for NodeJsSystemdUserServiceError<E> { |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
pub struct NodeJsSystemdUserService<'a, C> where C: Deref<Target=str> {
|
|
|
|
|
|
|
|
|
pub struct NodeJsSystemdUserService<'a, C, R> where C: Deref<Target=str>, R: CommandRunner {
|
|
|
service_name: &'a str,
|
|
|
service_name: &'a str,
|
|
|
user_name: &'a str,
|
|
|
user_name: &'a str,
|
|
|
command_runner: &'a CommandRunner,
|
|
|
|
|
|
|
|
|
command_runner: R,
|
|
|
file: FileSymbol<C, String>
|
|
|
file: FileSymbol<C, String>
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl<'a> NodeJsSystemdUserService<'a, String> {
|
|
|
|
|
|
pub fn new(home: &'a str, user_name: &'a str, name: &'a str, path: &'a str, command_runner: &'a CommandRunner) -> Self {
|
|
|
|
|
|
|
|
|
impl<'a, R> NodeJsSystemdUserService<'a, String, SetuidCommandRunner<'a, R>> where R: CommandRunner {
|
|
|
|
|
|
pub fn new(home: &'a str, user_name: &'a str, name: &'a str, path: &'a str, command_runner: &'a R) -> Self {
|
|
|
let file_path = format!("{}/.config/systemd/user/{}.service", home.trim_right(), name);
|
|
|
let file_path = format!("{}/.config/systemd/user/{}.service", home.trim_right(), name);
|
|
|
|
|
|
|
|
|
let content = format!("[Service]
|
|
|
let content = format!("[Service]
|
|
@ -81,13 +81,13 @@ WantedBy=default.target |
|
|
NodeJsSystemdUserService {
|
|
|
NodeJsSystemdUserService {
|
|
|
service_name: name,
|
|
|
service_name: name,
|
|
|
user_name: user_name,
|
|
|
user_name: user_name,
|
|
|
command_runner: command_runner,
|
|
|
|
|
|
|
|
|
command_runner: SetuidCommandRunner::new(user_name, command_runner),
|
|
|
file: FileSymbol::new(file_path, content)
|
|
|
file: FileSymbol::new(file_path, content)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl<'a, C> NodeJsSystemdUserService<'a, C> where C: Deref<Target=str> {
|
|
|
|
|
|
|
|
|
impl<'a, C, R> NodeJsSystemdUserService<'a, C, R> where C: Deref<Target=str>, R: CommandRunner {
|
|
|
fn check_if_service(&self) -> Result<bool, Box<Error>> {
|
|
|
fn check_if_service(&self) -> Result<bool, Box<Error>> {
|
|
|
loop {
|
|
|
loop {
|
|
|
// Check if service is registered
|
|
|
// Check if service is registered
|
|
@ -131,7 +131,7 @@ fn wait_for_metadata(file_name: &str) -> Result<Metadata, Box<Error>> { |
|
|
Ok(result)
|
|
|
Ok(result)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl<'a, C> Symbol for NodeJsSystemdUserService<'a, C> where C: Deref<Target=str> {
|
|
|
|
|
|
|
|
|
impl<'a, C, R> Symbol for NodeJsSystemdUserService<'a, C, R> where C: Deref<Target=str>, R: CommandRunner {
|
|
|
fn target_reached(&self) -> Result<bool, Box<Error>> {
|
|
|
fn target_reached(&self) -> Result<bool, Box<Error>> {
|
|
|
if !(try!(self.file.target_reached())) {
|
|
|
if !(try!(self.file.target_reached())) {
|
|
|
return Ok(false);
|
|
|
return Ok(false);
|
|
@ -163,7 +163,7 @@ impl<'a, C> Symbol for NodeJsSystemdUserService<'a, C> where C: Deref<Target=str |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl<'a, C> fmt::Display for NodeJsSystemdUserService<'a, C> where C: Deref<Target=str> {
|
|
|
|
|
|
|
|
|
impl<'a, C, R> fmt::Display for NodeJsSystemdUserService<'a, C, R> where C: Deref<Target=str>, R: CommandRunner {
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(),fmt::Error>{
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(),fmt::Error>{
|
|
|
write!(f, "Systemd Node.js user service unit for {}", self.service_name)
|
|
|
write!(f, "Systemd Node.js user service unit for {}", self.service_name)
|
|
|
}
|
|
|
}
|
|
|