1use crate::share::{cmd_res, CmdRes};
2
3use super::{Opts, OptsApi};
4use e_utils::{Error, Result};
5use serde_json::json;
6
7pub fn api(opts: Opts) -> Result<CmdRes> {
23 let mut new = cmd_res(opts);
24 let ref op = new.opts;
25 #[allow(unused)]
26 let _ = match op.api {
27 OptsApi::None => return Err(Error::String("Api cannot eq None".to_string())),
28 OptsApi::Os => {
29 #[cfg(not(feature = "os"))]
30 return Err(Error::String("Feature not support os".to_string()));
31 #[cfg(feature = "os")]
32 {
33 match &*op.task {
34 "check" => new.merge(crate::os::check_os_active()),
35 "active" => {
36 if op.command.len() > 1 {
37 new.merge(crate::os::active_os(
38 &op.command[0],
39 crate::os::ActiveLocalType::Temp(op.command[1].clone()),
40 ))
41 } else {
42 return Err(Error::String("Command Error must > 0 ".to_string()));
43 }
44 }
45 "deactive" => new.merge(crate::os::deactivate_os()),
46 "rkms" => {
47 if op.command.len() > 0 {
48 new.merge(crate::os::register_kms(&op.command[0]))
49 } else {
50 return Err(Error::String("Command Error must > 0 ".to_string()));
51 }
52 }
53 "ckms" => new.merge(crate::os::clear_kms()),
54 "clean_cache" => {
55 if op.command.len() > 0 {
56 new.merge(crate::os::clean_cache(crate::os::ActiveLocalType::Temp(
57 op.command[0].clone(),
58 )))
59 } else {
60 return Err(Error::String("Command Error must > 0 ".to_string()));
61 }
62 }
63 "query_cache" => {
64 if op.command.len() > 0 {
65 new.merge(crate::os::query_cache(crate::os::ActiveLocalType::Temp(
66 op.command[0].clone(),
67 )))
68 } else {
69 return Err(Error::String("Command Error must > 0 ".to_string()));
70 }
71 }
72 _ => return Err(Error::String("Task Error".to_string())),
73 }
74 }
75 }
76 OptsApi::Office => match &*op.task {
77 _ => return Err(Error::String("Task Error".to_string())),
86 },
87 OptsApi::Clean => {
88 #[cfg(not(feature = "clean"))]
89 return Err(Error::String("Feature not support Clean".to_string()));
90 #[cfg(feature = "clean")]
91 {
92 match &*op.task {
93 "empty_recycle_bin" => new.merge(crate::clean::empty_recycle_bin()),
94 "empty_access_log" => new.merge(crate::clean::empty_access_log()),
95 "empty_netshare" => new.merge(crate::clean::empty_netshare("*")),
96 "empty_activity_history" => new.merge(crate::clean::empty_activity_history()),
98 "empty_run_history" => new.merge(crate::clean::empty_run_history()),
100 _ => return Err(Error::String("Task Error".to_string())),
101 }
102 }
103 }
104 OptsApi::Drive => {
105 #[cfg(not(feature = "drive"))]
106 return Err(Error::String("Feature not support Drive".to_string()));
107 #[cfg(feature = "drive")]
108 {
109 match &*op.task {
110 "scan" => new.merge(crate::drive::pnputil_scan()),
111 "add-file" => {
112 let args: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
113 let mut outres = crate::share::default_cmd_res();
114 for x in e_utils::fs::tree_folder(&args[0])?
115 .into_iter()
116 .filter(|x| std::path::Path::new(x).extension().unwrap_or_default() == "inf")
117 {
118 let mut new_args = args.clone();
119 if let Some(v) = new_args.get_mut(0) {
120 *v = &x;
121 }
122 let res = crate::drive::pnputil_add_driver(new_args);
123 outres.content += &format!("{:?};;", res.content);
124 }
125 outres.status = true;
126 new.merge(outres)
127 }
128 "add" => {
129 let args: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
130 let res = crate::drive::pnputil_add_driver(args);
131 new.merge(res)
133 }
134 "delete" => {
135 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
136 new.merge(crate::drive::pnputil_delete_driver(args_src))
137 }
138 "delete-find" => {
139 let mut res = crate::share::default_cmd_res();
140 let commands = op.command.iter().map(|x| x.as_ref()).collect::<Vec<&str>>();
141 let devcon_node_list = crate::drive::findnodes(&op, commands);
142 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
143 for node in &devcon_node_list {
144 let inf_path: std::path::PathBuf = (&node.inf_file).into();
145 if let Some(fname) = inf_path.file_name().and_then(|x| x.to_str()) {
146 let mut args = args_src.clone();
147 args.insert(0, fname);
148 let dres = crate::drive::pnputil_delete_driver(args);
149 let status = crate::drive::devcon_status(&node.id);
150 if status.status != crate::drive::DriveStatusType::None {
151 res.status = false;
152 }
153 } else {
154 res.status = false;
155 }
156 if !res.status {
157 res.content = serde_json::to_string(&vec![node]).unwrap_or_default();
158 return Ok(res);
159 }
160 }
161 if let Ok(x) = serde_json::to_string(&devcon_node_list) {
162 res.content = x;
163 res.status = true;
164 }
165 new.merge(res)
166 }
167 "findnodes" => {
168 let mut res = crate::share::default_cmd_res();
169 let commands = op.command.iter().map(|x| x.as_ref()).collect::<Vec<&str>>();
170 let devcon_node_list = crate::drive::findnodes(&op, commands);
171 if let Ok(x) = serde_json::to_string(&devcon_node_list) {
172 res.content = x;
173 res.status = true;
174 }
175 new.merge(res)
176 }
177 "restart" => {
178 let mut res = crate::share::default_cmd_res();
179 let status_list = crate::drive::find_with_run(&op, crate::drive::pnputil_restart);
180 for status in &status_list {
181 if status.status == crate::drive::DriveStatusType::Runing {
182 res.status = true;
183 break;
184 }
185 }
186 if let Ok(x) = serde_json::to_string(&status_list) {
187 res.content = x;
188 }
189 new.merge(res)
190 }
191 "enable" => {
192 let mut res = crate::share::default_cmd_res();
193 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
194 let status_list = crate::drive::find_with_run(&op, crate::drive::pnputil_enable);
195 res.status = true;
196 for status in &status_list {
197 if status.status != crate::drive::DriveStatusType::Runing {
198 res.status = false;
199 break;
200 }
201 }
202 if let Ok(x) = serde_json::to_string(&status_list) {
203 res.content = x;
204 }
205 new.merge(res)
206 }
207 "disable" => {
208 let mut res = crate::share::default_cmd_res();
209 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
210 let status_list = crate::drive::find_with_run(&op, crate::drive::pnputil_disable);
211 res.status = true;
212 for status in &status_list {
213 if status.status != crate::drive::DriveStatusType::Disabled {
214 res.status = false;
215 break;
216 }
217 }
218 if let Ok(x) = serde_json::to_string(&status_list) {
219 res.content = x;
220 }
221 new.merge(res)
222 }
223 "remove" => {
224 let mut res = crate::share::default_cmd_res();
225 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
226 let status_list = crate::drive::find_with_run(&op, crate::drive::pnputil_remove);
227 res.status = true;
228 for status in &status_list {
229 if status.status != crate::drive::DriveStatusType::None {
230 res.status = false;
231 break;
232 }
233 }
234 if let Ok(x) = serde_json::to_string(&status_list) {
235 res.content = x;
236 }
237 new.merge(res)
238 }
239 "export" => {
240 let args_src: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
241 let res = crate::drive::pnputil_export_driver(args_src);
242 new.merge(res)
243 }
244 _ => {
245 let commands = op.command.iter().map(|x| x.as_ref()).collect::<Vec<&str>>();
246 new.merge(crate::drive::devcon(commands))
247 }
248 }
249 }
250 }
251 OptsApi::Net => {
252 #[cfg(not(all(feature = "net-info", feature = "net-manage")))]
253 return Err(Error::String("Feature not support Net".to_string()));
254 #[cfg(all(feature = "net-info", feature = "net-manage"))]
255 {
256 match &*op.task {
257 "interfaces" => new.set_status(true).set_content(
258 serde_json::to_string(&crate::net::get_interfaces()).unwrap_or_else(|e| e.to_string()),
259 ),
260 "interfaces_print" => {
261 let ifaces = crate::net::get_interfaces();
262 new
263 .set_status(true)
264 .set_content(format!("数量: {}", ifaces.len()));
265 for iface in ifaces {
266 println!("{:#?}", iface)
267 }
268 &mut new
269 }
270 "auto_dhcp" => {
271 let args: Vec<&str> = op.args.iter().map(|x| x.as_ref()).collect();
272 let mut len = 0;
273 if args.len() == 0 {
274 for iface in crate::net::get_interfaces() {
275 if let Some(ref name) = iface.friendly_name {
276 match iface.if_type {
277 crate::net::InterfaceType::Wireless80211
278 | crate::net::InterfaceType::GigabitEthernet
279 | crate::net::InterfaceType::FastEthernetFx
280 | crate::net::InterfaceType::FastEthernetT
281 | crate::net::InterfaceType::Ethernet
282 | crate::net::InterfaceType::TokenRing => {
283 let ip_res = crate::net::set_ip_dhcp(name)?;
284 let dns_res = crate::net::set_dns_dhcp(name)?;
285
286 new.opts.command.push(
287 json!({
288 "name": name,
289 "type": iface.if_type,
290 "dnsRes": dns_res,
291 "ipRes": ip_res
292 })
293 .to_string(),
294 );
295 len += 1;
296 }
297 _ => {}
298 }
299 }
300 }
301 } else {
302 let ip_res = crate::net::set_ip_dhcp(args[0])?;
303 let dns_res = crate::net::set_dns_dhcp(args[0])?;
304 new.opts.command.push(
305 json!({
306 "name": args[0],
307 "type": "Unknow",
308 "dnsRes": dns_res,
309 "ipRes": ip_res
310 })
311 .to_string(),
312 );
313 len = 1;
314 }
315 new.set_status(true).set_content(format!("数量: {}", len))
316 }
317 _ => return Err(Error::String("Task Error".to_string())),
318 }
319 }
320 }
321 };
322 #[allow(unreachable_code)]
323 Ok(new)
324}
325
326pub fn drive_init() -> Result<()> {
328 #[cfg(target_os = "windows")]
329 {
330 #[cfg(feature = "drive")]
331 crate::share::write_bytes_file(
332 crate::drive::get_drive_path().join(crate::drive::EDRIVE_NAME),
333 crate::drive::EDRIVE_EXE,
334 )?;
335 }
336 Ok(())
337}