From 39be1d684ad2f6dd6f8096cda3ce2ff444e5eaf7 Mon Sep 17 00:00:00 2001 From: LinusDikomey Date: Fri, 18 Mar 2022 18:07:08 +0100 Subject: [PATCH] Refactoring - Added print_banner macro - Moved main logic into function - More idiomatic code --- src/main.rs | 418 +++++++++++++++++++++++----------------------------- 1 file changed, 186 insertions(+), 232 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7d4c7ff..3cc34fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,249 +1,201 @@ use std::borrow::Cow; use clap::Parser; - #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { #[clap(short, long)] hostname: String, - //example: "IServSAT=mvuvFvCZSlpvuwhk0mmNwF1NKEQypM4d; IServSession=xEPqyJO1a5nsVd34HEpbPqQGMMQKapvw; nav-show-additional-modules=true; PHPSESSID=mchbrl11epjnnp851q0i4rt8rc" #[clap(short, long)] session_cookie: String, - #[clap(long)] target_ip: String, - #[clap(long)] target_room: u16, - #[clap(long)] target_compilation: Option, - } +macro_rules! print_banner { + ($f: expr, $($arg: expr),*) => { + println!(concat!("-----------------------------------\n", $f, "\n-----------------------------------"), $($arg),*) + }; +} fn main() -> Result<(), Box> { let args = Args::parse(); - loop { - let params = [ - ("filter[controllable]", ""), - ("filter[room][]", "__none"), - ("filter[group]", ""), - ("filter[search]", "iPad"), - ]; - let header = ("Cookie", args.session_cookie.to_owned()); - let client = reqwest::blocking::Client::new(); + loop { ipad(&args)?; } +} - let resp = client - .get(format!("https://{}/iserv/admin/hosts", args.hostname)) - .header(header.0, header.to_owned().1) - .query(¶ms) - .send()?; - - let status = &resp.status(); - let plain = &resp.text()?; - - let content = squeeze( - &plain, - "", - ); - - let json: serde_json::Value = serde_json::from_str(content).expect("Bad Jason!"); - - let json_part = &json["data"][0]["name"]["rendered"] - .to_string() - .replace("\\", ""); - - // skip rest of loop when no entry appeared - if json_part == "null" { - println!("###################################"); - println!("No new host: skipping (Retry in 5s)"); - println!("###################################"); - //sleep for 5 seconds - std::thread::sleep(std::time::Duration::from_secs(5)); - continue; - } - - let host_id = squeeze(json_part, "data-host-id=\"", "\""); - let device_name = squeeze(json_part, "", ""); - println!("-----------------------------------"); - println!("1/7 Found host"); - println!("Host id: {}", host_id); - println!("Device name: {}", device_name); - println!("Received response status: {:?}", status); - - let dest = format!("https://{}/iserv/admin/host/edit/{}", args.hostname, &host_id); - let resp = client.get(&dest).header(header.0, header.to_owned().1).send()?; - //TODO Check for non 200 response - - let status = &resp.status(); - let plain = &resp.text()?; - - let mut form_ip: &str = &args.target_ip; //default - - let form_name = squeeze_html_form(plain, "name=\"host[name]\"", "value=\"", "\""); - let form_tags = squeeze_html_form(plain, "name=\"host[tags][]\"", "value=\"", "\""); - let form_mac = squeeze_html_form(plain, "name=\"host[mac]\"", "value=\"", "\""); - let form_description = squeeze_html_form(plain, "name=\"host[description]\"", ">", "<"); - let form_token = squeeze_html_form(plain, "name=\"host[_token]\"", "value=\"", "\""); - - let mut form_data = [ - ("host[name]", form_name), - ("host[tags][]", form_tags), - ("host[room]", &args.target_room.to_string()), - ("host[ip]", &form_ip), - ("host[mac]", form_mac), - ("host[internet]", "1"), - ("host[proxyEnforce]", "0"), - ("host[owner]", ""), - ("host[controllable]", "0"), - ("host[inventoryNumber]", ""), - ("host[shutdown]", ""), - ("host[description]", form_description), - ("host[image][id]", ""), - ("host[image][x]", ""), - ("host[image][y]", ""), - ("host[actions][submit]", ""), - ("host[_token]", form_token), - ]; - println!("-----------------------------------"); - println!("2/7 Received current host properties"); - println!("Received response status: {:?}", status); - - let resp = client - .post(&dest) - .header(header.0, header.to_owned().1) - .form(&form_data) - .send()?; - - let status = &resp.status(); - let plain = &resp.text()?; - - form_ip = squeeze_html_form(plain, "name=\"host[ip]\"", "value=\"", "\""); - form_data[3] = ("host[ip]", form_ip); - - println!("-----------------------------------"); - println!("3/7 Received recommended ip: {}", form_ip); - println!("Received response status: {:?}", status); - - let resp = client - .post(&dest) - .header(header.0, header.to_owned().1) - .form(&form_data) - .send()?; - - let status = &resp.status(); - - println!("-----------------------------------"); - println!("4/7 Sucessfully updated host"); - println!("Received response status: {:?}", status); - println!("-----------------------------------"); - - if args.target_compilation.is_none() { - continue; - } - - let resp = client - .get(format!("https://{}/iserv/admin/mdm/ios/compilation/edit/{}", args.hostname, args.target_compilation.unwrap())) +fn ipad(args: &Args) -> Result<(), Box> { + let params = [ + ("filter[controllable]", ""), + ("filter[room][]", "__none"), + ("filter[group]", ""), + ("filter[search]", "iPad"), + ]; + let header = ("Cookie", args.session_cookie.to_owned()); + let client = reqwest::blocking::Client::new(); + let resp = client + .get(format!("https://{}/iserv/admin/hosts", args.hostname)) .header(header.0, header.to_owned().1) + .query(¶ms) .send()?; - //TODO Check for non 200 response - - let status = &resp.status(); - let plain = &resp.text()?; - - println!("-----------------------------------"); - println!("5/7 Received MDM compilation"); - println!("Received response status: {:?}", status); - println!("-----------------------------------"); - - let csrf_token = squeeze_html_form(plain, "name=\"ioscompilation[_token]\"", "value=\"", "\""); - - let mut form_data = Vec::from([ - ( - Cow::Borrowed("ioscompilation[name]"), - Cow::Borrowed(squeeze_html_form(plain, "name=\"ioscompilation[name]\"", "value=\"", "\"")), - ), - ( - Cow::Borrowed("ioscompilation[description]"), - Cow::Borrowed(squeeze_html_form(plain, "name=\"ioscompilation[description]\"", "value=\"", "\"")), - ), - ]); - - // push apps (