Initial commit
This commit is contained in:
commit
6fd6a4471c
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
1000
Cargo.lock
generated
Normal file
1000
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "monitor-controller"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
clap = "4.5.17"
|
||||
rouille = "3.6.2"
|
11
monitor-controller.service.sample
Normal file
11
monitor-controller.service.sample
Normal file
@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=Run the monitor-controller serivce
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
StandardOutput=journal
|
||||
# CHANGE THIS BEFORE COPYING TO THE SYSTEMD FOLDER
|
||||
ExecStart=$HOME/.local/bin/monitor-controller -d -c $HOME/.config/hypr/mon.conf -p $HOME/.config/hypr
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
155
src/main.rs
Normal file
155
src/main.rs
Normal file
@ -0,0 +1,155 @@
|
||||
extern crate clap;
|
||||
extern crate rouille;
|
||||
|
||||
use std::{
|
||||
fs,
|
||||
path::Path,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
use clap::{Arg, ArgAction, Command};
|
||||
use rouille::Response;
|
||||
|
||||
fn get_config(path: &Path) -> Vec<String> {
|
||||
let c = fs::read_to_string(path)
|
||||
.expect("Config file does not exist")
|
||||
.split("\n")
|
||||
.into_iter()
|
||||
.map(|d| d.trim())
|
||||
.filter(|d| d.len() > 0)
|
||||
.map(|d| d.to_string())
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
if c.len() == 0 {
|
||||
panic!("Config seams to be empty")
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
|
||||
let matches = Command::new("Monitor Controller")
|
||||
.about("Monitor Contorller server/cli")
|
||||
.arg(
|
||||
Arg::new("daemon")
|
||||
.short('d')
|
||||
.help("Runs the app in daemon mode!")
|
||||
.action(ArgAction::SetTrue),
|
||||
)
|
||||
.arg(
|
||||
Arg::new("config")
|
||||
.short('c')
|
||||
.long("config")
|
||||
.help("Gives the path for the config location of the list of configs"),
|
||||
)
|
||||
.arg(
|
||||
Arg::new("base_path")
|
||||
.short('p')
|
||||
.help("Gives the base path for the configs"),
|
||||
)
|
||||
.arg(
|
||||
Arg::new("change_on_boot")
|
||||
.short('b')
|
||||
.help("Change to the first option when the daemon starts")
|
||||
.action(ArgAction::SetTrue),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
let daemon_mode: bool = matches
|
||||
.get_one::<bool>("daemon")
|
||||
.unwrap()
|
||||
.clone()
|
||||
.to_owned();
|
||||
|
||||
if daemon_mode {
|
||||
println!("Paying attention on 11111");
|
||||
|
||||
let base_path = matches.get_one::<String>("base_path");
|
||||
if base_path.is_none() {
|
||||
println!("Base path is required when running daemon mode");
|
||||
return;
|
||||
}
|
||||
|
||||
let base_path = base_path.unwrap().clone().to_owned();
|
||||
|
||||
let config_path = matches.get_one::<String>("config");
|
||||
|
||||
if config_path.is_none() {
|
||||
println!("Config path is required when running daemon mode");
|
||||
return;
|
||||
}
|
||||
|
||||
let config_path = Path::new(&config_path.unwrap())
|
||||
.canonicalize()
|
||||
.ok()
|
||||
.unwrap();
|
||||
|
||||
let config = Arc::new(Mutex::new(get_config(&config_path)));
|
||||
|
||||
let change_on_boot: bool = matches
|
||||
.get_one::<bool>("daemon")
|
||||
.unwrap()
|
||||
.clone()
|
||||
.to_owned();
|
||||
|
||||
if change_on_boot {
|
||||
let c = config.clone();
|
||||
let c = c.lock().ok().unwrap();
|
||||
|
||||
let u = c[0].clone().to_owned();
|
||||
|
||||
std::process::Command::new("ln")
|
||||
.arg("-sf")
|
||||
.arg(base_path.clone().to_owned() + "/" + &u.to_string() + ".conf")
|
||||
.arg(base_path.clone().to_owned() + "/monitors.conf")
|
||||
.spawn()
|
||||
.expect("Failed to change monitor on boot");
|
||||
}
|
||||
|
||||
rouille::start_server("0.0.0.0:11111", move |request| {
|
||||
if request.url().eq("/reload") {
|
||||
println!("Reloading config!");
|
||||
|
||||
let c = config.clone();
|
||||
let mut c = c.lock().ok().unwrap();
|
||||
*c = get_config(&config_path);
|
||||
|
||||
return Response::text("reloaded!");
|
||||
}
|
||||
|
||||
if !request.url().starts_with("/switch_to/") {
|
||||
return Response::text("Not reallllly sure what you are trying to do :3");
|
||||
}
|
||||
|
||||
let u = request.url().replace("/switch_to/", "");
|
||||
|
||||
let c = config.clone();
|
||||
let c = c.lock().ok().unwrap();
|
||||
|
||||
let found_it = c.iter().any(|d| d.eq(&u));
|
||||
|
||||
if !found_it {
|
||||
println!("Could not find the requested url");
|
||||
return Response::text("Could not find the requested config!")
|
||||
.with_status_code(404);
|
||||
}
|
||||
|
||||
let res = std::process::Command::new("ln")
|
||||
.arg("-sf")
|
||||
.arg(base_path.clone().to_owned() + "/" + &u.to_string() + ".conf")
|
||||
.arg(base_path.clone().to_owned() + "/monitors.conf")
|
||||
.spawn();
|
||||
|
||||
if res.is_err() {
|
||||
println!("Well somwthing went very wrong");
|
||||
return Response::text("Something went very wrong").with_status_code(500);
|
||||
}
|
||||
|
||||
return Response::text("Chaged it");
|
||||
})
|
||||
} else {
|
||||
println!("Well well well I have not done this!")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user