1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use crate::common::OpType;
use std::collections::BTreeMap;
use std::error::Error;
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use kanidm_proto::v1::{Entry, Filter, Modify, ModifyList};
use serde::de::DeserializeOwned;
use crate::RawOpt;
fn read_file<T: DeserializeOwned, P: AsRef<Path>>(path: P) -> Result<T, Box<dyn Error>> {
let f = File::open(path)?;
let r = BufReader::new(f);
Ok(serde_json::from_reader(r)?)
}
impl RawOpt {
pub fn debug(&self) -> bool {
match self {
RawOpt::Search(sopt) => sopt.commonopts.debug,
RawOpt::Create(copt) => copt.commonopts.debug,
RawOpt::Modify(mopt) => mopt.commonopts.debug,
RawOpt::Delete(dopt) => dopt.commonopts.debug,
}
}
pub async fn exec(&self) {
match self {
RawOpt::Search(sopt) => {
let client = sopt.commonopts.to_client(OpType::Read).await;
let filter: Filter = match serde_json::from_str(sopt.filter.as_str()) {
Ok(f) => f,
Err(e) => {
error!("Error -> {:?}", e);
return;
}
};
match client.search(filter).await {
Ok(rset) => rset.iter().for_each(|e| println!("{}", e)),
Err(e) => error!("Error -> {:?}", e),
}
}
RawOpt::Create(copt) => {
let client = copt.commonopts.to_client(OpType::Write).await;
let r_entries: Vec<BTreeMap<String, Vec<String>>> = match read_file(&copt.file) {
Ok(r) => r,
Err(e) => {
error!("Error -> {:?}", e);
return;
}
};
let entries = r_entries.into_iter().map(|b| Entry { attrs: b }).collect();
if let Err(e) = client.create(entries).await {
error!("Error -> {:?}", e);
}
}
RawOpt::Modify(mopt) => {
let client = mopt.commonopts.to_client(OpType::Write).await;
let filter: Filter = match serde_json::from_str(mopt.filter.as_str()) {
Ok(f) => f,
Err(e) => {
error!("Error -> {:?}", e);
return;
}
};
let r_list: Vec<Modify> = match read_file(&mopt.file) {
Ok(r) => r,
Err(e) => {
error!("Error -> {:?}", e);
return;
}
};
let modlist = ModifyList::new_list(r_list);
if let Err(e) = client.modify(filter, modlist).await {
error!("Error -> {:?}", e);
}
}
RawOpt::Delete(dopt) => {
let client = dopt.commonopts.to_client(OpType::Write).await;
let filter: Filter = match serde_json::from_str(dopt.filter.as_str()) {
Ok(f) => f,
Err(e) => {
error!("Error -> {:?}", e);
return;
}
};
if let Err(e) = client.delete(filter).await {
error!("Error -> {:?}", e);
}
}
}
}
}