initial commit

main
amy 2 years ago
commit 8571dd64f0
No known key found for this signature in database
GPG Key ID: 6672E6DD65BEA50B

115
Cargo.lock generated

@ -0,0 +1,115 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cc"
version = "1.0.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "libc"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119"
[[package]]
name = "memoffset"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
dependencies = [
"autocfg",
]
[[package]]
name = "nix"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"memoffset",
]
[[package]]
name = "pkg-config"
version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f"
[[package]]
name = "pkg-warner"
version = "0.1.0"
dependencies = [
"nix",
"sqlite",
"toml",
]
[[package]]
name = "serde"
version = "1.0.130"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
[[package]]
name = "sqlite"
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fb1a534c07ec276fbbe0e55a1c00814d8563da3a2f4d9d9d4c802bd1278db6a"
dependencies = [
"libc",
"sqlite3-sys",
]
[[package]]
name = "sqlite3-src"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a260b07ce75a0644c6f5891f34f46db9869e731838e95293469ab17999abcfa3"
dependencies = [
"cc",
"pkg-config",
]
[[package]]
name = "sqlite3-sys"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04d2f028faeb14352df7934b4771806f60d61ce61be1928ec92396d7492e2e54"
dependencies = [
"libc",
"sqlite3-src",
]
[[package]]
name = "toml"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
dependencies = [
"serde",
]

@ -0,0 +1,11 @@
[package]
name = "pkg-warner"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
toml = "*"
sqlite = "*"
nix = "*"

@ -0,0 +1,12 @@
debug:
cargo build
ln -sf target/debug/pkg-warner .
release:
cargo build --release
ln -sf target/release/pkg-warner .
clean:
rm -rf target/ Cargo.lock pkg-warner
install:
cargo build --release
sudo cp target/release/pkg-warner /usr/bin/pkg-warner
sudo touch /etc/package_managers.toml

@ -0,0 +1,174 @@
use toml::{Value, toml};
use std::{fs, env};
use std::io::Write;
pub fn help() {
println!("Usage:
-h, help: Show this help message
-v, version: Show version
-i, init: Initialize the database
-c, create-script: create the scripts for the warnings
-w <package manager>, warning <package manager>: Show the warning for specified package manager
");
}
pub fn create_database() {
let homepath = env::var("HOME").unwrap();
let file = "/usr/share/pkg_warner/pkg_mngrs.db".to_string();
if !std::path::Path::new(&"/usr/share/pkg_warner/").is_dir() {
let _cdar = fs::create_dir_all("/usr/share/pkg_warner/".to_string());
match _cdar {
Ok(_) => {
println!("Created path for database (previously missing)");
}
Err(_) => {
println!("Couldn't create path for database (/usr/share/pkg_warner)")
}
}
}
let connection = sqlite::open(file).unwrap();
let result = connection
.execute(
"
CREATE TABLE pkg_mngrs (mngr TEXT, distro TEXT);
",
);
match result {
Ok(_) => {
println!("Created database");
}
Err(_) => {
println!("Couldn't create database");
}
}
}
pub fn add_mngrs(pkg_managers: Vec<Vec<String>>, proper_manager: String) {
let connection = sqlite::open("/usr/share/pkg_warner/pkg_mngrs.db".to_string()).unwrap();
for entry in pkg_managers {
println!("Don't use {}! {} is used on {}, here you use {}!", entry[0], entry[0], entry[1], proper_manager);
let result = connection.execute(format!(
"
INSERT INTO pkg_mngrs (mngr, distro) VALUES (\"{}\", \"{}\");
", entry[0], entry[1]
));
match result {
Ok(_) => {
println!("Added {} to database", entry[0]);
}
Err(_) => {
println!("Couldn't add {} to database", entry[0]);
}
}
}
}
pub fn create_script() {
let connection = sqlite::open("/usr/share/pkg_warner/pkg_mngrs.db").unwrap();
let result = connection.iterate(
format!("SELECT mngr FROM pkg_mngrs WHERE mngr IS NOT \"proper_manager\";"),
|pairs| {
for &(_column, value) in pairs.iter() {
writeln!(&mut fs::File::create(format!("/usr/bin/{}",value.unwrap())).unwrap(), "#!/usr/bin/env bash\n pkg-warner -w {}", value.unwrap()).unwrap();
}
true
},
);
match result {
Ok(_) => {}
Err(_) => println!("Couldn't get value from database"),
}
}
pub fn warn(proper_manager: String, package_manager: String) {
let connection = sqlite::open("/usr/share/pkg_warner/pkg_mngrs.db".to_string()).unwrap();
let mut warned = false;
let result = connection.iterate(
format!("SELECT distro FROM pkg_mngrs WHERE mngr = \"{}\";", package_manager),
|pairs| {
for &(_column, value) in pairs.iter() {
if !warned {
println!("{} is used on {}! Please use {} instead!", package_manager, value.unwrap(), proper_manager);
warned = true;
}
}
true
},
);
match result {
Ok(_) => {}
Err(_) => println!("Couldn't get value from database"),
}
}
fn main() {
let args: Vec<String> = env::args().skip(1).collect();
if args.is_empty() {
help();
return;
}
let oper = &args[0];
if !nix::unistd::Uid::effective().is_root() && oper != "-w" {
println!("You need to be root to run this program");
return;
}
let file = "/usr/share/pkg_warner/pkg_mngrs.db".to_string();
if !std::path::Path::new(&file).exists() {
create_database();
}
let file = format!("/etc/package_managers.toml");
let mut database = String::new();
database = fs::read_to_string(file).expect("Unable to read file");
let db_parsed = database.parse::<Value>().expect("Unable to parse database");
let mut pkg_managers: Vec<Vec<String>> = Vec::new();
for entry in db_parsed.as_table() {
for (key, value) in &*entry {
let mut tempvec = Vec::new();
tempvec.push(key.to_string());
tempvec.push(value.to_string().replace("distro = ", "").replace("\n","").replace("\"",""));
pkg_managers.push(tempvec);
}
}
let connection = sqlite::open("/usr/share/pkg_warner/pkg_mngrs.db").unwrap();
let mut proper_manager = String::new();
let mut found = false;
let result = connection.iterate(
format!("SELECT distro FROM pkg_mngrs WHERE mngr = \"proper_manager\";"),
|pairs| {
for &(_column, value) in pairs.iter() {
if !found {
proper_manager.push_str(value.unwrap());
found = true;
}
}
true
},
);
match oper.as_str() {
"-i" | "init" => {
create_database();
add_mngrs(pkg_managers, proper_manager);
create_script();
}
"-a" | "add" => {
add_mngrs(pkg_managers, proper_manager);
}
"-c" | "create-script" => {
create_script();
}
"-w" | "warning" => {
warn(proper_manager, args[1].to_string());
}
_ => {
help();
}
}
}
Loading…
Cancel
Save