mirror of
https://github.com/ilya-zlobintsev/LACT.git
synced 2025-02-25 18:55:26 -06:00
Init
This commit is contained in:
commit
c482961c49
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
101
.vscode/launch.json
vendored
Normal file
101
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in library 'daemon'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--lib",
|
||||||
|
"--package=daemon"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "daemon",
|
||||||
|
"kind": "lib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'daemon'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=daemon",
|
||||||
|
"--package=daemon"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "daemon",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'daemon'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=daemon",
|
||||||
|
"--package=daemon"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "daemon",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'cli'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=cli",
|
||||||
|
"--package=cli"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "cli",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'cli'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=cli",
|
||||||
|
"--package=cli"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "cli",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
2
Cargo.toml
Normal file
2
Cargo.toml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[workspace]
|
||||||
|
members = ["daemon", "cli"]
|
11
cli/Cargo.toml
Normal file
11
cli/Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "cli"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Ilya Zlobintsev <ilya.zl@protonmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
daemon = { path = "../daemon" }
|
||||||
|
structopt = "0.3"
|
15
cli/src/main.rs
Normal file
15
cli/src/main.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use structopt::StructOpt;
|
||||||
|
|
||||||
|
#[derive(StructOpt)]
|
||||||
|
#[structopt(rename_all = "lower")]
|
||||||
|
enum Opt {
|
||||||
|
///Get information about the GPU.
|
||||||
|
Info,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let opt = Opt::from_args();
|
||||||
|
match opt {
|
||||||
|
Opt::Info => daemon::get_info(),
|
||||||
|
}
|
||||||
|
}
|
11
daemon/Cargo.toml
Normal file
11
daemon/Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "daemon"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Ilya Zlobintsev <ilya.zl@protonmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bincode = "1.3"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
67
daemon/src/daemon.rs
Normal file
67
daemon/src/daemon.rs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
use std::os::unix::net::{UnixStream, UnixListener};
|
||||||
|
use std::io::{Read, Write};
|
||||||
|
use std::process::Command;
|
||||||
|
use std::thread;
|
||||||
|
use std::fs;
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
use crate::SOCK_PATH;
|
||||||
|
use crate::fan_controller::FanController;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Daemon {
|
||||||
|
fan_controller: FanController,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub enum Action {
|
||||||
|
GetInfo,
|
||||||
|
GetStats,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Daemon {
|
||||||
|
pub fn new(fan_controller: FanController) -> Daemon {
|
||||||
|
Daemon {
|
||||||
|
fan_controller,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(self) {
|
||||||
|
if fs::metadata(SOCK_PATH).is_ok() {
|
||||||
|
fs::remove_file(SOCK_PATH).expect("Failed to take control over socket");
|
||||||
|
}
|
||||||
|
|
||||||
|
let listener = UnixListener::bind(SOCK_PATH).unwrap();
|
||||||
|
|
||||||
|
Command::new("chmod").arg("666").arg(SOCK_PATH).output().expect("Failed to chmod");
|
||||||
|
|
||||||
|
for stream in listener.incoming() {
|
||||||
|
match stream {
|
||||||
|
Ok(stream) => {
|
||||||
|
thread::spawn(|| Daemon::handle_connection(stream));
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
println!("Error: {}", err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_connection(mut stream: UnixStream) {
|
||||||
|
let mut buffer = Vec::<u8>::new();
|
||||||
|
stream.read_to_end(&mut buffer).unwrap();
|
||||||
|
println!("finished reading");
|
||||||
|
let action: Action = bincode::deserialize(&buffer).unwrap();
|
||||||
|
|
||||||
|
let response = match action {
|
||||||
|
Action::GetInfo => "gpu information",
|
||||||
|
Action::GetStats => {
|
||||||
|
"gpu stats"
|
||||||
|
},
|
||||||
|
};
|
||||||
|
stream.write_all(response.as_bytes()).unwrap();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
10
daemon/src/fan_controller.rs
Normal file
10
daemon/src/fan_controller.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#[derive(Clone)]
|
||||||
|
pub struct FanController {
|
||||||
|
hwmon_path: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FanController {
|
||||||
|
pub fn new(hwmon_path: &str) -> FanController {
|
||||||
|
FanController { hwmon_path: hwmon_path.to_string() }
|
||||||
|
}
|
||||||
|
}
|
24
daemon/src/lib.rs
Normal file
24
daemon/src/lib.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
use std::os::unix::net::UnixStream;
|
||||||
|
use std::io::{Read, Write};
|
||||||
|
|
||||||
|
pub mod daemon;
|
||||||
|
pub mod fan_controller;
|
||||||
|
|
||||||
|
pub const SOCK_PATH: &str = "/tmp/amdgpu-configurator.sock";
|
||||||
|
|
||||||
|
pub fn get_info() {
|
||||||
|
let mut stream = UnixStream::connect(SOCK_PATH).expect("Failed to connect to daemon");
|
||||||
|
stream.write_all(&bincode::serialize(&daemon::Action::GetInfo).unwrap()).unwrap();
|
||||||
|
stream.shutdown(std::net::Shutdown::Write).expect("Could not shut down");
|
||||||
|
let mut response = String::new();
|
||||||
|
stream.read_to_string(&mut response).unwrap();
|
||||||
|
println!("{}", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct DaemonConnection {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DaemonConnection {
|
||||||
|
|
||||||
|
}
|
9
daemon/src/main.rs
Normal file
9
daemon/src/main.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use daemon::daemon::Daemon;
|
||||||
|
use daemon::fan_controller::FanController;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let fan_controller = FanController::new("afsadfasdfa");
|
||||||
|
let d = Daemon::new(fan_controller);
|
||||||
|
d.run();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user