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