1 use super::{BaseUnit, Unit}; 2 use crate::error::ParseError; 3 use crate::parse::parse_service::ServiceParser; 4 use crate::parse::{AttrParse, Segment}; 5 use crate::task::cmdtask::CmdTask; 6 //use drstd as std; 7 use std::rc::Rc; 8 use std::string::String; 9 use std::vec::Vec; 10 #[derive(Default)] 11 pub struct ServiceUnit { 12 pub unit_base: BaseUnit, 13 pub service_part: ServicePart, 14 } 15 16 #[derive(Debug)] 17 pub enum ServiceType { 18 Simple, 19 Forking, 20 OneShot, 21 Dbus, 22 Notify, 23 Idle, 24 } 25 26 impl Default for ServiceType { 27 fn default() -> Self { 28 ServiceType::Simple 29 } 30 } 31 32 #[derive(Debug)] 33 pub enum RestartOption { 34 AlwaysRestart, 35 OnSuccess, 36 OnFailure, 37 OnAbnormal, 38 OnAbort, 39 OnWatchdog, 40 None, 41 } 42 43 impl Default for RestartOption { 44 fn default() -> Self { 45 Self::None 46 } 47 } 48 49 #[derive(Debug)] 50 pub enum MountFlag { 51 Shared, 52 Slave, 53 Private, 54 } 55 56 impl Default for MountFlag { 57 fn default() -> Self { 58 Self::Private 59 } 60 } 61 62 #[derive(Default, Debug)] 63 pub struct ServicePart { 64 //生命周期相关 65 pub service_type: ServiceType, 66 /// 67 pub remain_after_exit: bool, 68 pub exec_start: Vec<CmdTask>, 69 pub exec_start_pre: Vec<CmdTask>, 70 pub exec_start_pos: Vec<CmdTask>, 71 pub exec_reload: Vec<CmdTask>, 72 pub exec_stop: Vec<CmdTask>, 73 pub exec_stop_post: Vec<CmdTask>, 74 pub restart_sec: u64, 75 pub restart: RestartOption, 76 pub timeout_start_sec: u64, 77 pub timeout_stop_sec: u64, 78 //上下文配置相关 79 pub environment: String, 80 pub environment_file: String, 81 pub nice: i8, 82 pub working_directory: String, 83 pub root_directory: String, 84 pub user: String, 85 pub group: String, 86 pub mount_flags: MountFlag, 87 //LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等,后续支持再添加 88 } 89 90 impl Unit for ServiceUnit { 91 fn as_any(&self) -> &dyn core::any::Any { 92 self 93 } 94 95 fn from_path(path: &str) -> Result<Rc<Self>, ParseError> 96 where 97 Self: Sized, 98 { 99 return ServiceParser::parse(path); 100 } 101 102 fn set_attr(&mut self, segment: Segment, attr: &str, val: &str) -> Result<(), ParseError> { 103 if segment != Segment::Service { 104 return Err(ParseError::EINVAL); 105 } 106 return ServiceParser::parse_and_set_attribute(self, attr, val); 107 } 108 } 109 110 pub enum ServiceUnitAttr { 111 None, 112 //Service段 113 //定义启动时的进程行为 114 Type, 115 // 116 RemainAfterExit, 117 //启动命令 118 ExecStart, 119 //启动当前服务之前执行的命令 120 ExecStartPre, 121 //启动当前服务之后执行的命令 122 ExecStartPos, 123 //重启当前服务时执行的命令 124 ExecReload, 125 //停止当前服务时执行的命令 126 ExecStop, 127 //停止当其服务之后执行的命令 128 ExecStopPost, 129 //自动重启当前服务间隔的秒数 130 RestartSec, 131 //定义何种情况 Systemd 会自动重启当前服务 132 Restart, 133 //启动服务时等待的秒数 134 TimeoutStartSec, 135 //停止服务时的等待秒数,如果超过这个时间仍然没有停止,应该使用 SIGKILL 信号强行杀死服务的进程 136 TimeoutStopSec, 137 //为服务指定环境变量 138 Environment, 139 //指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义 140 EnvironmentFile, 141 //服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级 142 Nice, 143 //指定服务的工作目录 144 WorkingDirectory, 145 //指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件 146 RootDirectory, 147 //指定运行服务的用户 148 User, 149 //指定运行服务的用户组 150 Group, 151 //服务的 Mount Namespace 配置,会影响进程上下文中挂载点的信息 152 MountFlags, 153 } 154