xref: /DragonReach/src/unit/mod.rs (revision 4e851715e713d4b9f10926924b8a727bd7cc6cb3)
1 use crate::error::ParseError;
2 use crate::parse::Segment;
3 //use drstd as std;
4 use std::any::Any;
5 use std::boxed::Box;
6 use std::rc::Rc;
7 use std::string::String;
8 use std::vec::Vec;
9 
10 pub mod service;
11 pub mod target;
12 
13 use self::target::TargetUnit;
14 
15 //所有可解析的Unit都应该实现该trait
16 pub trait Unit {
17     /// @brief 从文件获取到Unit,该函数是解析Unit文件的入口函数
18     ///
19     /// 从path解析Unit属性
20     ///
21     /// @param path 需解析的文件
22     ///
23     /// @return 解析成功则返回对应Unit的Rc指针,否则返回Err
24     fn from_path(path: &str) -> Result<Rc<Self>, ParseError>
25     where
26         Self: Sized;
27 
28     fn as_any(&self) -> &dyn Any;
29 
30     /// @brief 设置Unit属性
31     ///
32     /// 设置对应Unit属性
33     ///
34     /// @param segment  属性段类型
35     ///
36     /// @param attr     属性名
37     ///
38     /// @param val      属性值
39     ///
40     /// @return 设置成功则返回Ok(()),否则返回Err
41     fn set_attr(&mut self, segment: Segment, attr: &str, val: &str) -> Result<(), ParseError>;
42 }
43 
44 //Unit状态
45 #[derive(Clone, Copy, Debug)]
46 enum UnitState {
47     Enabled,
48     Disabled,
49     Static,
50     Masked,
51 }
52 
53 //Unit类型
54 #[derive(Clone, Copy, PartialEq, Debug)]
55 pub enum UnitType {
56     Automount,
57     Device,
58     Mount,
59     Path,
60     Scope,
61     Service,
62     Slice,
63     Snapshot,
64     Socket,
65     Swap,
66     Target,
67     Timer,
68     Unknown,
69 }
70 
71 //记录unit文件基本信息,这个结构体里面的信息是所有Unit文件都可以有的属性
72 pub struct BaseUnit {
73     pub unit_part: UnitPart,
74     pub install_part: InstallPart,
75     pub state: UnitState,
76     pub unit_type: UnitType,
77 }
78 
79 impl Default for BaseUnit {
80     fn default() -> Self {
81         BaseUnit {
82             unit_part: UnitPart::default(),
83             install_part: InstallPart::default(),
84             state: UnitState::Disabled,
85             unit_type: UnitType::Unknown,
86         }
87     }
88 }
89 
90 impl BaseUnit {
91     pub fn parse_and_set_attribute(&self) -> Result<(), ParseError> {
92         return Ok(());
93     }
94 }
95 
96 #[derive(Default)]
97 pub struct Url {
98     pub url_string: String, // pub protocol: String,
99                             // pub host: String,
100                             // pub port: Option<u16>,
101                             // pub path: String,
102                             // pub query: Option<String>,
103                             // pub fragment: Option<String>,
104 }
105 
106 //对应Unit文件的Unit段
107 pub struct UnitPart {
108     pub description: String,
109     pub documentation: Vec<Url>,
110     pub requires: Vec<Rc<dyn Unit>>,
111     pub wants: Vec<Rc<dyn Unit>>,
112     pub after: Vec<Rc<dyn Unit>>,
113     pub before: Vec<Rc<dyn Unit>>,
114     pub binds_to: Vec<Rc<dyn Unit>>,
115     pub part_of: Vec<Rc<dyn Unit>>,
116     pub on_failure: Vec<Rc<dyn Unit>>,
117     pub conflicts: Vec<Rc<dyn Unit>>,
118 }
119 
120 impl Default for UnitPart {
121     fn default() -> Self {
122         UnitPart {
123             description: String::new(),
124             documentation: Vec::new(),
125             requires: Vec::new(),
126             wants: Vec::new(),
127             after: Vec::new(),
128             before: Vec::new(),
129             binds_to: Vec::new(),
130             part_of: Vec::new(),
131             on_failure: Vec::new(),
132             conflicts: Vec::new(),
133         }
134     }
135 }
136 
137 //对应Unit文件的Install段
138 pub struct InstallPart {
139     pub wanted_by: Vec<Rc<TargetUnit>>,
140     pub requires_by: Vec<Rc<TargetUnit>>,
141     pub also: Vec<Rc<dyn Unit>>,
142     pub alias: String,
143 }
144 
145 impl Default for InstallPart {
146     fn default() -> Self {
147         InstallPart {
148             wanted_by: Vec::new(),
149             requires_by: Vec::new(),
150             also: Vec::new(),
151             alias: String::new(),
152         }
153     }
154 }
155 
156 //对应Unit文件的各种属性
157 pub enum BaseUnitAttr {
158     None,
159 
160     //Unit段
161     //描述该Unit文件的信息
162     Description,
163     //指定服务文档
164     Documentation,
165     //依赖的其它 Unit 列表
166     Requires,
167     //这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
168     Wants,
169     //后面列出的所有模块全部启动完成以后,才会启动当前的服务
170     After,
171     //在启动指定的任务一个模块之间,都会首先确证当前服务已经运行
172     Before,
173     //这些Unit启动失败时该任务失败,都成功时该任务成功,在这些模板中有任意一个出现意外结束或重启时,这个服务也会跟着终止或重启
174     BindsTo,
175     //仅在列出的任务模块失败或重启时,终止或重启当前服务,而不会随列出模板的启动而启动
176     PartOf,
177     //当这个模板启动失败时,就会自动启动列出的每个模块
178     OnFailure,
179     //与这个模块有冲突的模块,如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然
180     Conflicts,
181 }
182 
183 pub enum InstallUnitAttr {
184     None,
185     //Install段
186     //依赖当前服务的模块。当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .wants 后缀构成的子目录中
187     WantedBy,
188     //依赖当前服务的模块。当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .required 后缀构成的子目录中
189     RequiredBy,
190     //当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
191     Also,
192     //别名
193     Alias,
194 }
195