xref: /DragonReach/src/unit/service/mod.rs (revision 4e851715e713d4b9f10926924b8a727bd7cc6cb3)
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