Skip to main content

e_app/input/
api.rs

1use crate::share::{cmd_res, CmdRes};
2
3use super::{Opts, OptsApi};
4use e_utils::{Error, Result};
5use serde_json::json;
6
7/// # Input api 统一接口
8///
9/// # Rust
10///```rust
11/// fn main() -> e_utils::Result<()> {
12///   if e_app::input::Opts::check_empty() {
13///     let _ = app::MyApp::launch()?;
14///   } else {
15///     let opts = e_app::input::Opts::new(None as Option<Vec<String>>)?;
16///     let res = e_app::input::api(opts)?;
17///     println!("{}", res.to_str()?);
18///   }
19///   Ok(())
20/// }
21/// ```
22pub 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      // "check" => m_opts(check_office(), opts),
78      // "rkms" => {
79      //     if op.command.len() > 0 {
80      //         m_opts(register_office_kms(&op.command[0]), opts)
81      //     } else {
82      //         return Err(Error::String("Command Error must > 0 ".to_string()));
83      //     }
84      // }
85      _ => 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          // 待校验
97          "empty_activity_history" => new.merge(crate::clean::empty_activity_history()),
98          // 待校验
99          "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            // 待优化判断添加驱动
132            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
326/// 初始化
327pub 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}