From 9c1f4c9525a693f2b00e1355a63bfeee81645b99 Mon Sep 17 00:00:00 2001 From: Pyro57000 <147988717+Pyro57000@users.noreply.github.com> Date: Thu, 21 Dec 2023 21:57:38 +0000 Subject: [PATCH] added the tool here it be yo --- pentest_tool/Cargo.lock | 532 ++++++++++++++++++++++++++++++++++++++ pentest_tool/Cargo.toml | 11 + pentest_tool/src/main.rs | 543 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 1086 insertions(+) create mode 100644 pentest_tool/Cargo.lock create mode 100644 pentest_tool/Cargo.toml create mode 100644 pentest_tool/src/main.rs diff --git a/pentest_tool/Cargo.lock b/pentest_tool/Cargo.lock new file mode 100644 index 0000000..fc84950 --- /dev/null +++ b/pentest_tool/Cargo.lock @@ -0,0 +1,532 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clearscreen" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f3f22f1a586604e62efd23f78218f3ccdecf7a33c4500db2d37d85a24fe994" +dependencies = [ + "nix", + "terminfo", + "thiserror", + "which", + "winapi", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pentest_tool" +version = "0.1.0" +dependencies = [ + "clearscreen", + "directories", + "fs_extra", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "syn" +version = "2.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "terminfo" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" +dependencies = [ + "dirs", + "fnv", + "nom", + "phf", + "phf_codegen", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" diff --git a/pentest_tool/Cargo.toml b/pentest_tool/Cargo.toml new file mode 100644 index 0000000..0ba45fc --- /dev/null +++ b/pentest_tool/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "pentest_tool" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clearscreen = "2.0.1" +directories = "5.0.1" +fs_extra = "1.3.0" diff --git a/pentest_tool/src/main.rs b/pentest_tool/src/main.rs new file mode 100644 index 0000000..fdf1b58 --- /dev/null +++ b/pentest_tool/src/main.rs @@ -0,0 +1,543 @@ +use std::fs; +use std::io::Write; +use std::path::PathBuf; +use std::process; +use std::time; +use std::time::Duration; +use std::time::SystemTime; +use clearscreen::clear; +use directories::UserDirs; +use clearscreen; + +#[derive(Clone)] +struct Project{ + customer: String, + project_name: String, + notes_folder: PathBuf, + files_folder: PathBuf, + activativation_time: SystemTime, + hour_count: Duration, + active: bool, + boxname: String, + id: i32, +} + + + +fn install(config_path: &PathBuf){ + let mut config_folder_path: PathBuf = config_path.clone(); + config_folder_path.pop(); + let mut projects_conf_path = config_folder_path.clone(); + projects_conf_path.push("projects.conf"); + fs::create_dir_all(config_folder_path).expect("error creating config dir"); + let mut config_file = fs::File::create(config_path).expect("error creating file"); + let mut projects_conf_file = fs::File::create(projects_conf_path).expect("error creating projects config file"); + projects_conf_file.write_all(b"customer:name:time").expect("error writing default project info"); + let mut notes_response = String::new(); + let mut files_response = String::new(); + let mut tools_response = String::new(); + println!("path to save project notes?"); + std::io::stdin().read_line(&mut notes_response).unwrap(); + println!("path to save project files?"); + std::io::stdin().read_line(&mut files_response).unwrap(); + println!("path to folder with your custom tools?"); + std::io::stdin().read_line(&mut tools_response).unwrap(); + let config_string = format!("Project_files:{}\nProject_notes:{}\ntools:{}", files_response.trim_end(), notes_response.trim_end(), tools_response.trim_end()); + config_file.write_all(config_string.as_bytes()).expect("error writing to config file"); + println!("config file generated and saved to {}\n", config_path.display()); + println!("please make sure to install distrobox:\nhttps://github.com/89luca89/distrobox\n\nthis will require either docker or podman as well.\n\n"); + println!("please rerun the program"); + std::process::exit(1); +} + + +fn get_projects(base_notes: &PathBuf, base_files: &PathBuf, config_path: &mut PathBuf) -> Vec{ + config_path.pop(); + config_path.push("projects.conf"); + let mut projects = Vec::new(); + let projects_string = fs::read_to_string(config_path).expect("error reading projects file"); + let project_lines:Vec<&str> = projects_string.split("\n").collect(); + let mut first = 0; + for line in project_lines{ + first = first + 1; + if first != 1{ + if line.len() > 1{ + let settings: Vec<&str> = line.split(":").collect(); + let customer = settings[0].to_owned(); + let project = settings[1].to_owned(); + let folder_name = format!("{}/{}", customer, project); + let mut notes_folder = base_notes.clone(); + let mut project_folder = base_files.clone(); + notes_folder.push(&folder_name); + project_folder.push(&folder_name); + let hours_count:u64 = settings[3].trim_end().parse().expect("error converting to u64"); + let _mins_count = hours_count * 60; + let secs_count = hours_count * 60; + let hours = Duration::from_secs(secs_count); + let mut active = false; + if settings[2] == "yes"{ + active = true; + } + let time = SystemTime::now(); + let boxname = settings[4].to_owned(); + let new_project = Project{customer: customer, project_name: project, files_folder: project_folder, notes_folder: notes_folder, activativation_time: time, hour_count: hours, active: active, id: first, boxname: boxname}; + println!("{} {} LOADED!", &new_project.customer, &new_project.project_name); + projects.push(new_project); + } + } + } + return projects +} + + +fn switch_project(projects: &mut Vec, config_path: &PathBuf){ + for project in projects.clone(){ + if project.active == false{ + println!("{} {}|{}", project.id, project.customer, project.project_name); + } + } + println!("\nnew project selection?\n"); + let mut response = String::new(); + std::io::stdin().read_line(&mut response).unwrap(); + if response.len() > 1{ + let new_id:i32 = response.trim_end().parse().expect("error converting to i32"); + for project in projects{ + if project.id == new_id{ + project.active = true; + println!("project found switching to {} {}", project.customer, project.project_name); + let mut box_selection_path = config_path.clone(); + box_selection_path.pop(); + box_selection_path.pop(); + box_selection_path.push("current_box"); + let mut box_selection = fs::File::create(box_selection_path).expect("error opening up box selection file"); + let box_output = project.boxname.as_bytes(); + box_selection.write_all(box_output).expect("error writing new box"); + } + else if project.id != new_id{ + project.active = false; + } + else{ + println!("error unknown project id") + } + } + } + else{ + println!("error we need user input here dummy!"); + } + +} + +fn save_projects(projects: &Vec, config_path: &PathBuf){ + let mut save_file_path = config_path.clone(); + save_file_path.pop(); + save_file_path.push("projects.conf"); + let mut save_file = fs::File::create(save_file_path).expect("error creating save_file"); + save_file.write_all(b"customer:name:active:hours:box_name\n").expect("error writing first line to file"); + for project in projects{ + let default = format!{"{}:{}:", project.customer, project.project_name}; + let mut _outline = String::new(); + if project.active{ + let hours = project.hour_count.as_secs()/60 + time::SystemTime::now().duration_since(project.activativation_time).expect("error caclucating hours").as_secs()/60; + _outline = format!("{}yes:{}:{}\n", default, hours, project.boxname); + } + else{ + _outline = format!("{}no:{}:{}\n", default, project.hour_count.as_secs()/60, project.boxname); + } + save_file.write_all(_outline.as_bytes()).expect("error writing outline"); + } +} + + +fn get_active_project(projects: &Vec) -> &Project{ + let mut active_project = &projects[0]; + for project in projects{ + if project.active == true{ + active_project = project + } + } + return active_project +} + +fn start_pentest(){ + let mut customer_name = String::new(); + let mut project_name = String::new(); + let mut scope = String::new(); + println!("Customer name?"); + std::io::stdin().read_line(&mut customer_name).unwrap(); + println!("Project name?"); + std::io::stdin().read_line(&mut project_name).unwrap(); + println!("path to scope?"); + std::io::stdin().read_line(&mut scope).unwrap(); + scope.pop(); + project_name.pop(); + customer_name.pop(); + let status = process::Command::new("start_pentest") + .arg(scope) + .arg(customer_name) + .arg(project_name) + .status().expect("error spawning start_pentest"); + if status.success() == false{ + println!("error please cleanup and re-run manually"); + } +} + +fn new_project(projects: &mut Vec, project_dir: &PathBuf, notes_dir: &PathBuf, tools_dir: &PathBuf, boxtemplate: &String){ + let mut new_id = 0; + for project in projects.clone(){ + if project.id > new_id{ + new_id = project.id + 1; + } + } + let mut new_project_dir = project_dir.clone(); + let mut new_note_dir = notes_dir.clone(); + let mut existing_folders = String::new(); + let mut customer_name = String::new(); + let mut project_name = String::new(); + println!("customer name?"); + std::io::stdin().read_line(&mut customer_name).unwrap(); + println!("project name?"); + std::io::stdin().read_line(&mut project_name).unwrap(); + println!("do you have an existing notes and folder structure to copy over?\ny/n"); + std::io::stdin().read_line(&mut existing_folders).unwrap(); + let customer_name = customer_name.trim_end().to_owned(); + let project_name = project_name.trim_end().to_owned(); + new_project_dir.push(&customer_name); + new_note_dir.push(&customer_name); + new_project_dir.push(&project_name); + new_note_dir.push(&project_name); + if existing_folders.contains("y") || existing_folders.contains("Y"){ + let mut files_to_copy = String::new(); + let mut notes_to_copy = String::new(); + println!("path to project folder folder to copy:"); + std::io::stdin().read_line(&mut files_to_copy).unwrap(); + println!("path to notes folder to copy:"); + std::io::stdin().read_line(&mut notes_to_copy).unwrap(); + files_to_copy.pop(); + notes_to_copy.pop(); + println!("files to copy: {}", files_to_copy); + println!("notes to copy: {}", notes_to_copy); + println!("files destination: {}", new_project_dir.display()); + println!("notes destination: {}", new_note_dir.display()); + let folder_move_success = process::Command::new("mv") + .arg("-i") + .arg(files_to_copy) + .arg(new_project_dir.display().to_string()) + .status().expect("unable to call the system mv command"); + let note_move_success = process::Command::new("mv") + .arg("-i") + .arg(notes_to_copy) + .arg(new_note_dir.display().to_string()) + .status().expect("unable to call the system mv command"); + if folder_move_success.success(){ + println!("we copied the project folder correctly!!"); + } + else{ + println!("failed to copy the project folder, try to move it manually!"); + } + if note_move_success.success(){ + println!("we copied the notes folder correctly!!"); + } + else{ + println!("failed to copy the notes folder, try to move it manually!"); + } + + } + else{ + //working_path.push("working"); + fs::create_dir_all(&new_project_dir).expect("error creating new files folder"); + fs::create_dir_all(&new_note_dir).expect("error creating new notes folder"); + } + let box_name = format!("atarchbox_{}", customer_name); + let pentest_volume = format!("{}:/pentest:rw", new_project_dir.display()); + let toold_volume = format!("{}:/tools:rw", tools_dir.display()); + let distrobox_result = process::Command::new("distrobox") + .arg("create") + .arg("--clone") + .arg(boxtemplate) + .arg("--init") + .arg("--volume") + .arg(toold_volume) + .arg("--volume") + .arg(pentest_volume) + .arg("--name") + .arg(&box_name) + .status() + .expect("error getting distrobox status"); + if distrobox_result.success(){ + println!("we made a distrobox oh boy!"); + let distrobox_start_result = process::Command::new("distrobox") + .arg("enter") + .arg(&box_name) + .status() + .expect("error getting response from distrobox start"); + if distrobox_start_result.success(){ + println!("distrobox was started as well!!!! good job me!"); + } + else{ + println!("ooof did not start successfully try entering it yoruself"); + } + } + else{ + println!("ooof distrobox did not work.... try creating it yourself"); + } + let new_project = Project{customer: customer_name.trim_end().to_owned(), + project_name: project_name.trim_end().to_owned(), + notes_folder: new_note_dir, + files_folder:new_project_dir, + activativation_time: SystemTime::now(), + hour_count: Duration::new(1, 1), + active: false, + id: new_id, + boxname: box_name, + }; + projects.push(new_project); + +} + + +fn remove_project(projects: &mut Vec){ + for project in projects.clone(){ + println!("{} {} {}", project.id, project.customer, project.project_name); + } + let mut project_to_remove = String::new(); + println!("project to remove?"); + std::io::stdin().read_line(&mut project_to_remove).unwrap(); + let mut project_to_keep = Vec::new(); + if project_to_remove.len() > 0{ + let remove_id: i32 = project_to_remove.trim_end().parse().unwrap(); + let mut project_set = false; + for project in projects.clone(){ + if project.id == remove_id{ + println!("will remove {} {}", project.customer, project.project_name); + project_set = true; + let distrobox_rm_status = process::Command::new("distrobox") + .arg("rm") + .arg("-f") + .arg(project.boxname) + .status().expect("error calling distrobox"); + if distrobox_rm_status.success(){ + println!("Distrobox Removal Successful!!!"); + } + else{ + println!("Distrobox Removal Failed, manual removal required!"); + } + } + else { + println!("{} {} will be kept", project.customer, project.project_name); + project_to_keep.push(project); + } + } + if project_set{ + projects.clear(); + projects.append(&mut project_to_keep); + } + else{ + println!("error no prjects found to remove") + } + + } + else{ + println!("we need user in put here dummy!!"); + } +} +fn open_in_dolphin(folder: &str, project: Project){ + let mut to_open = PathBuf::new(); + match folder{ + "notes" => to_open.push(project.notes_folder), + "files" => to_open.push(project.files_folder), + _ => println!("unknown entry... this should literally be impossible... how.... how tf did you.... what") + } + process::Command::new("dolphin") + .arg(to_open) + .spawn().expect("error opening dolphin"); +} + +fn stop_all_boxes(projects: &Vec){ + let mut problem_childs: Vec = Vec::new(); + let mut all_done = true; + for project in projects{ + let stopped = process::Command::new("distrobox") + .arg("stop") + .arg(&project.boxname) + .status().expect("error spawing distrobox"); + if stopped.success(){ + println!("{} sucessfully stopped!", &project.boxname); + } + else{ + println!("{} not stopped!!!!!!!", &project.boxname); + all_done = false; + problem_childs.push(project.clone()); + } + } + if all_done{ + println!("All boxes stopped GO US YAAAAA WE DID IT"); + } + else{ + println!("OOOOOOOF some boxes didn't stop yo, that's cringe"); + println!("here are the problem childs, you may need to stop them manually"); + for child in problem_childs{ + println!("{}",child.boxname); + } + } +} + + +fn project_standalone_terminal(){ + process::Command::new("konsole").arg("-e").arg("'~/.config/start_box.sh'").spawn().expect("error opeing konsole"); +} + + +fn project_inline_terminal(project: Project){ + process::Command::new("distrobox").arg("enter").arg(project.boxname).status().expect("error opeing konsole"); +} + + +fn main_menu(mut projects: Vec, config_path: &PathBuf, base_files: &PathBuf, base_notes: &PathBuf, tools_dir: &PathBuf, boxtemplate: String){ + let mut loopize = true; + loop { + let active_project = get_active_project(&projects); + let mut response = String::new(); + clear().expect("error clearing screen"); + print!(" + ___ __ __ ___ __ ___ __ + | | |__ | / ` / \\ |\\/| |__ |__| /\\ / ` |__/ |__ |__) + |/\\| |___ |___ \\__, \\__/ | | |___ | | /~~\\ \\__, | \\ |___ | \\ + + __ ___ ___ __ __ + / _` |__ | |__) | | |\\ | | |\\ | / _` + \\__> |___ | | |/\\| | \\| | | \\| \\__> + + + +NOTE SAVE PROJECT INFO BEFORE STOPPING THE APPLICATION, OR HOUR TRACKIGN WON'T BE ACCURATE +NOTE OPTION 10 WILL SAVE YOUR PROJECTS BEFORE QUITTING + +Current Project: {} {} +Current Minutes: {} minutes + + Main Menu: + 1 .) Show Active Project + 2 .) List Projects + 3 .) Switch Active Project + 4 .) Print Active Project Time + 5 .) Print All Proejct Times + 6 .) create new project with Pyro's default tool + 7 .) Save Project Information + 8 .) Import New Project - and setup new Distrobox + 9 .) Remove Project + 10.) Open A New Terminal in Current Active Project + 11.) Open A Terminal In this windows for the current active project + 12.) Open Project Files Folder In Dolphin + 13.) Open Project Notes Folder In Dolphin + 14.) Stop All Distroboxes + 15.) Quit Application +\n", active_project.customer, active_project.project_name, SystemTime::now().duration_since(active_project.activativation_time).unwrap().as_secs() / 60); + std::io::stdin().read_line(&mut response).expect("error getting menu input"); + clear().expect("error clearing screen"); + match response.as_str().trim_end(){ + "1" => println!("\n{} {}", active_project.customer ,active_project.project_name), + "2" => {println!("+++++++++++++++++++++"); + for project in &projects{ + println!("++{}|{}++",project.customer ,project.project_name)} + println!("++++++++++++++++++++")}, + "3" => switch_project(&mut projects, config_path), + "4" => println!("current Hour Count: {}", active_project.hour_count.as_secs()/3600 + time::SystemTime::now().duration_since(active_project.activativation_time).expect("error caclucating hours").as_secs()/3600), + "5" => {println!("++++++++++++++++++++"); + for project in &projects{ + if project.active == true{ + println!("++{} {}: {}++", project.customer, project.project_name, project.hour_count.as_secs()/3600 + time::SystemTime::now().duration_since(project.activativation_time).expect("error caclucating hours").as_secs()/3600); + } + else{ + println!("++{} {}:{}++", project.customer, project.project_name, project.hour_count.as_secs()/3600); + } + } + println!("++++++++++++++++++++") + }, + "6" => start_pentest(), + "7" => save_projects(&projects, &config_path), + "8" => new_project(&mut projects, &base_files, &base_notes, &tools_dir, &boxtemplate), + "9" => remove_project(&mut projects), + "10" => project_standalone_terminal(), + "11" => project_inline_terminal(active_project.clone()), + "12" => open_in_dolphin("files", active_project.clone()), + "13" => open_in_dolphin("notes", active_project.clone()), + "14" => stop_all_boxes(&projects), + "15" => {save_projects(&projects, &config_path); + let mut stop = String::new(); + println!("stop all boxes?\ny/n"); + std::io::stdin().read_line(&mut stop).unwrap(); + if stop.contains("y"){ + stop_all_boxes(&projects); + } + loopize = false}, + _ => println!("uknonwn selection") + } + if loopize == false{ + break + } + println!("\n\n\npress enter to return to the menu"); + let mut enter = String::new(); + std::io::stdin().read_line(&mut enter).unwrap(); + } +} + + +fn main() { + print!(" + ⠀⠀⠀⣠⠶⠚⠛⠛⠛⠲⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⣠⣾⣷⣄⠀⠀⠀⢀⣠⣤⣤⡀⠀⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⢸⣿⡿⢃⣸⡶⠂⢠⣿⣿⡿⠁⣱⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⢸⡏⠉⠩⣏⣐⣦⠀⠛⠦⠴⠚⠁⠀⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⣼⠧⠶⠶⠶⠿⠶⠶⠖⠚⠛⠉⠁⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠶⠶⡄⠀⠀ + ⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⢠⡟⠀⠀⢹⠀⠀ + ⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⢤⢠⡆⠀⢸⡄⠀⠀⠀⠀⠀⠀⢀⡿⠁⠀⠀⡾⠀⠀ + ⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠈⡇⠀⠸⣧⣠⠴⠶⠖⠲⢶⡞⠁⠀⢈⡼⢃⠀⠀ + ⠸⡆⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⡇⠀⠀⢿⠁⠄⣲⡶⠶⠿⢤⣄⡀⠛⢛⠉⢻⠀ + ⠀⢿⡀⠀⠀⠀⠀⠀⠀⠀⢸⠠⣇⠀⠀⠀⠀⠊⠁⠀⠀⠀⠀⠀⠙⢦⠈⠙⠓⣆ + ⠀⠈⢷⡀⠀⠀⠀⠀⠀⢠⠏⡀⣬⣹⣦⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠈⡿⠶⠶⠋ + ⠀⠀⠈⢷⡀⠀⠀⠀⠀⠘⠛⠛⠋⠀⠀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⣼⠃⠀⠀⠀ + ⠀⠀⠀⠀⠙⢦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⣠⡞⠁⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠈⠛⣷⢶⣦⣤⣄⣀⣠⣤⣤⠀⣶⠶⠶⠶⠛⠁⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⣀⡀⠀⣰⠇⣾⠀⠀⠈⣩⣥⣄⣿⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⢿⡉⠳⡟⣸⠃⠀⠀⠀⠘⢷⣌⠉⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠙⢦⣴⠏⠀⠀⠀⠀⠀⠀⠉⠳⠶⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + "); + let user_dirs = UserDirs::new().expect("error getting user directories"); + let mut config_path = user_dirs.home_dir().to_path_buf(); + config_path.push(".config/pyro_pentest_tool/conf"); + if config_path.as_path().exists() == false{ + install(&config_path); + } + let mut project_base_folder = PathBuf::new(); + let mut project_base_notes = PathBuf::new(); + let mut tools_folder = PathBuf::new(); + println!("config already generated\nloading config file...\n"); + let settings_string = fs::read_to_string(&config_path).expect("error reading config file"); + let settings: Vec<&str> = settings_string.split("\n").collect(); + let mut box_template = String::new(); + for line in settings{ + if line.len() > 1{ + let setting_vec: Vec<&str> = line.split(":").collect(); + match setting_vec[0]{ + "Project_files" => project_base_folder.push(setting_vec[1].trim_end()), + "Project_notes" => project_base_notes.push(setting_vec[1].trim_end()), + "tools_folder" => tools_folder.push(setting_vec[1].trim_end()), + "box_template" => box_template = setting_vec[1].trim_end().to_owned(), + _ => println!("error unknown setting: {}", setting_vec[0]) + } + } + } + print!(" + Project Folders: {} + Note Folders: {} + Tools Folder: {} + distrobox template: {}\n +", project_base_folder.display(), project_base_notes.display(), tools_folder.display(), box_template); + println!("loading project configs..."); + let projects = get_projects(&project_base_notes, &project_base_folder, &mut config_path); + println!("Enter to start main menu"); + let mut enter = String::new(); + std::io::stdin().read_line(&mut enter).unwrap(); + main_menu(projects, &config_path, &project_base_folder, &project_base_notes, &tools_folder, box_template); +}