1use crate::common::OpType;
2use crate::{handle_client_error, GroupOpt, GroupPosix, OutputMode};
3use kanidm_proto::constants::ATTR_GIDNUMBER;
4
5mod account_policy;
6
7impl GroupOpt {
8 pub fn debug(&self) -> bool {
9 match self {
10 GroupOpt::List(copt) | GroupOpt::Search { copt, .. } => copt.debug,
11 GroupOpt::Get(gcopt) => gcopt.copt.debug,
12 GroupOpt::SetEntryManagedBy { copt, .. } | GroupOpt::Create { copt, .. } => copt.debug,
13 GroupOpt::Delete(gcopt) => gcopt.copt.debug,
14 GroupOpt::ListMembers(gcopt) => gcopt.copt.debug,
15 GroupOpt::AddMembers(gcopt) => gcopt.copt.debug,
16 GroupOpt::RemoveMembers(gcopt) => gcopt.copt.debug,
17 GroupOpt::SetMembers(gcopt) => gcopt.copt.debug,
18 GroupOpt::PurgeMembers(gcopt) => gcopt.copt.debug,
19 GroupOpt::Rename { copt, .. } | GroupOpt::SetMail { copt, .. } => copt.debug,
20 GroupOpt::Posix { commands } => match commands {
21 GroupPosix::Show(gcopt) => gcopt.copt.debug,
22 GroupPosix::Set(gcopt) => gcopt.copt.debug,
23 GroupPosix::ResetGidnumber { copt, .. } => copt.debug,
24 },
25 GroupOpt::AccountPolicy { commands } => commands.debug(),
26 }
27 }
28
29 pub async fn exec(&self) {
30 match self {
31 GroupOpt::List(copt) => {
32 let client = copt.to_client(OpType::Read).await;
33 match client.idm_group_list().await {
34 Ok(r) => match copt.output_mode {
35 OutputMode::Json => {
36 let r_attrs: Vec<_> = r.iter().map(|entry| &entry.attrs).collect();
37 println!(
38 "{}",
39 serde_json::to_string(&r_attrs).expect("Failed to serialise json")
40 );
41 }
42 OutputMode::Text => r.iter().for_each(|ent| println!("{}", ent)),
43 },
44 Err(e) => handle_client_error(e, copt.output_mode),
45 }
46 }
47 GroupOpt::Search { copt, name } => {
48 let client = copt.to_client(OpType::Read).await;
49 match client.idm_group_search(name).await {
50 Ok(r) => match copt.output_mode {
51 OutputMode::Json => {
52 let r_attrs: Vec<_> = r.iter().map(|entry| &entry.attrs).collect();
53 println!(
54 "{}",
55 serde_json::to_string(&r_attrs).expect("Failed to serialise json")
56 );
57 }
58 OutputMode::Text => r.iter().for_each(|ent| println!("{}", ent)),
59 },
60 Err(e) => handle_client_error(e, copt.output_mode),
61 }
62 }
63 GroupOpt::Get(gcopt) => {
64 let client = gcopt.copt.to_client(OpType::Read).await;
65 match client.idm_group_get(gcopt.name.as_str()).await {
67 Ok(Some(e)) => match gcopt.copt.output_mode {
68 OutputMode::Json => {
69 println!(
70 "{}",
71 serde_json::to_string(&e.attrs).expect("Failed to serialise json")
72 );
73 }
74 OutputMode::Text => println!("{}", e),
75 },
76 Ok(None) => warn!("No matching group '{}'", gcopt.name.as_str()),
77 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
78 }
79 }
80 GroupOpt::Create {
81 copt,
82 name,
83 entry_managed_by,
84 } => {
85 let client = copt.to_client(OpType::Write).await;
86 match client
87 .idm_group_create(name.as_str(), entry_managed_by.as_deref())
88 .await
89 {
90 Err(err) => {
91 error!("Error -> {:?}", err)
92 }
93 Ok(_) => println!("Successfully created group '{}'", name.as_str()),
94 }
95 }
96 GroupOpt::Delete(gcopt) => {
97 let client = gcopt.copt.to_client(OpType::Write).await;
98 match client.idm_group_delete(gcopt.name.as_str()).await {
99 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
100 Ok(_) => println!("Successfully deleted group {}", gcopt.name.as_str()),
101 }
102 }
103 GroupOpt::PurgeMembers(gcopt) => {
104 let client = gcopt.copt.to_client(OpType::Write).await;
105 match client.idm_group_purge_members(gcopt.name.as_str()).await {
106 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
107 Ok(_) => println!(
108 "Successfully purged members of group {}",
109 gcopt.name.as_str()
110 ),
111 }
112 }
113 GroupOpt::ListMembers(gcopt) => {
114 let client = gcopt.copt.to_client(OpType::Read).await;
115 match client.idm_group_get_members(gcopt.name.as_str()).await {
116 Ok(Some(groups)) => groups.iter().for_each(|m| println!("{:?}", m)),
117 Ok(None) => warn!("No members in group {}", gcopt.name.as_str()),
118 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
119 }
120 }
121 GroupOpt::AddMembers(gcopt) => {
122 let client = gcopt.copt.to_client(OpType::Write).await;
123 let new_members: Vec<&str> = gcopt.members.iter().map(String::as_str).collect();
124
125 match client
126 .idm_group_add_members(gcopt.name.as_str(), &new_members)
127 .await
128 {
129 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
130 Ok(_) => println!(
131 "Successfully added {:?} to group \"{}\"",
132 &new_members,
133 gcopt.name.as_str()
134 ),
135 }
136 }
137
138 GroupOpt::RemoveMembers(gcopt) => {
139 let client = gcopt.copt.to_client(OpType::Write).await;
140 let remove_members: Vec<&str> = gcopt.members.iter().map(String::as_str).collect();
141
142 match client
143 .idm_group_remove_members(gcopt.name.as_str(), &remove_members)
144 .await
145 {
146 Err(e) => {
147 error!("Failed to remove members!");
148 handle_client_error(e, gcopt.copt.output_mode)
149 }
150 Ok(_) => println!("Successfully removed members from {}", gcopt.name.as_str()),
151 }
152 }
153 GroupOpt::SetMembers(gcopt) => {
154 let client = gcopt.copt.to_client(OpType::Write).await;
155 let new_members: Vec<&str> = gcopt.members.iter().map(String::as_str).collect();
156
157 match client
158 .idm_group_set_members(gcopt.name.as_str(), &new_members)
159 .await
160 {
161 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
162 Ok(_) => println!("Successfully set members for group {}", gcopt.name.as_str()),
163 }
164 }
165 GroupOpt::SetMail { copt, name, mail } => {
166 let client = copt.to_client(OpType::Write).await;
167
168 let result = if mail.is_empty() {
169 client.idm_group_purge_mail(name.as_str()).await
170 } else {
171 client
172 .idm_group_set_mail(name.as_str(), mail.as_slice())
173 .await
174 };
175
176 match result {
177 Err(e) => handle_client_error(e, copt.output_mode),
178 Ok(_) => println!("Successfully set mail for group {}", name.as_str()),
179 }
180 }
181 GroupOpt::Rename {
182 copt,
183 name,
184 new_name,
185 } => {
186 let client = copt.to_client(OpType::Write).await;
187
188 let result = client.group_rename(name.as_str(), new_name.as_str()).await;
189
190 match result {
191 Err(e) => handle_client_error(e, copt.output_mode),
192 Ok(_) => println!("Successfully renamed group {} to {}", name, new_name),
193 }
194 }
195 GroupOpt::SetEntryManagedBy {
196 name,
197 entry_managed_by,
198 copt,
199 } => {
200 let client = copt.to_client(OpType::Write).await;
201
202 match client
203 .idm_group_set_entry_managed_by(name, entry_managed_by)
204 .await
205 {
206 Err(e) => handle_client_error(e, copt.output_mode),
207 Ok(_) => println!(
208 "Successfully set entry manager to '{}' for group '{}'",
209 entry_managed_by, name
210 ),
211 }
212 }
213 GroupOpt::Posix { commands } => match commands {
214 GroupPosix::Show(gcopt) => {
215 let client = gcopt.copt.to_client(OpType::Read).await;
216 match client.idm_group_unix_token_get(gcopt.name.as_str()).await {
217 Ok(token) => println!("{}", token),
218 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
219 }
220 }
221 GroupPosix::Set(gcopt) => {
222 let client = gcopt.copt.to_client(OpType::Write).await;
223 match client
224 .idm_group_unix_extend(gcopt.name.as_str(), gcopt.gidnumber)
225 .await
226 {
227 Err(e) => handle_client_error(e, gcopt.copt.output_mode),
228 Ok(_) => println!(
229 "Success adding POSIX configuration for group {}",
230 gcopt.name.as_str()
231 ),
232 }
233 }
234 GroupPosix::ResetGidnumber { copt, group_id } => {
235 let client = copt.to_client(OpType::Write).await;
236 if let Err(e) = client
237 .idm_group_purge_attr(group_id.as_str(), ATTR_GIDNUMBER)
238 .await
239 {
240 handle_client_error(e, copt.output_mode)
241 }
242 }
243 },
244 GroupOpt::AccountPolicy { commands } => commands.exec().await,
245 } }
247}