Initial commit.

This commit is contained in:
Eduard Tolosa 2019-03-29 19:10:25 -05:00
commit 229ada8f79
8 changed files with 125 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
**/*.rs.bk

4
Cargo.lock generated Normal file
View file

@ -0,0 +1,4 @@
[[package]]
name = "powerman"
version = "0.1.0"

7
Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "powerman"
version = "0.1.0"
authors = ["Eduard Toloza <tolosaeduard@gmail.com>"]
edition = "2018"
[dependencies]

20
archlinux/PKGBUILD Normal file
View file

@ -0,0 +1,20 @@
# Maintainer: Eduard Toloza <tolosaeduard@gmail.com>
pkgname=powerman
pkgver=0.1.0
pkgrel=1
pkgdesc='Power Management framework for Linux written in Rust..'
arch=('x86_64')
url='https://gitlab.com/edu4rdshl/powerman'
license=('GPL3')
source=("https://gitlab.com/edu4rdshl/${pkgname}/-/archive/${pkgver}/${pkgname}-${pkgver}.tar.gz")
sha512sums=('SKIP')
package() {
cd "${pkgname}-${pkgver}"
install -dm 755 "${pkgdir}/usr/lib/systemd/system/"
install -Dm 755 bin/"${pkgname}" "${pkgdir}/usr/bin/${pkgname}"
install -Dm 755 README.md "${pkgdir}/usr/share/doc/${pkgname}/README"
cp "${pkgname}".{service,timer} "${pkgdir}/usr/lib/systemd/system/"
}

BIN
bin/powerman Executable file

Binary file not shown.

12
powerman.service Normal file
View file

@ -0,0 +1,12 @@
[Unit]
Description=Check battery status and make actions based in arguments.
After=default.target
[Service]
Type=oneshot
ExecStart=/usr/bin/powerman 5 hibernate
KillMode=process
KillSignal=SIGINT
[Install]
WantedBy=default.target

10
powerman.timer Normal file
View file

@ -0,0 +1,10 @@
[Unit]
Description=Check for battery status every minute.
[Timer]
OnBootSec=1min
OnUnitActiveSec=1min
Unit=powerman.service
[Install]
WantedBy=timers.target

70
src/main.rs Normal file
View file

@ -0,0 +1,70 @@
use std::env;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
use std::process::Command;
fn main() {
// Get user arguments, first argument is the level of battery
// when the user want to take a action, second argument is the
// action to take using systemctl. For example, if you want to
// hibernate when the battery level is less than 5%, you should
// pass the following aguments: 5 hibernate
let args: Vec<String> = env::args().collect();
if args.len() == 3 {
// Convert user agument into integer
let bat_discharging_action: u32 = args[1]
.trim()
.parse()
.expect("Error, battery percentage capacity can not be converted in a valid number.");
battery_critical_action(bat_discharging_action, &args[2]);
} else {
println!("Usage:
powerman <Minimun level of battery before ation>, <Action>
Example: powerman 5 hibernate <- hibernate the computer when the battery level is less than 5%.
You need to enable powerman.timer init.")
}
}
fn battery_critical_action(percentage: u32, action: &str) {
// Path battery capacity percentage
let battery_capacity_path = "/sys/class/power_supply/BAT0/capacity";
let systemctl_path = "/usr/bin/systemctl";
// Check if systemd and BAT0 device exist
if Path::new(&battery_capacity_path).exists() && Path::new(&systemctl_path).exists() {
// Declare variable for get battery value into string
let mut bat_value = String::new();
// Read the capacity from file
let mut b_capacity = File::open(&battery_capacity_path).expect("Error opening file.");
// Convert percentage into string
b_capacity
.read_to_string(&mut bat_value)
.expect("Failed to read file.");
// Convert percentage into integer
let bat_percentage: u32 = bat_value
.trim()
.parse()
.expect("Error, battery percentage level can not be converted in a valid number.");
// Compare percentage and execute actions accordy to use input
if bat_percentage < percentage {
let command_action = Command::new(&systemctl_path)
// Get user argument 2 for action to execute
.arg(&action)
.output()
.expect("Failed to execute command.");
if command_action.status.success() == false {
eprintln!("Process exited with: {}", &command_action.status);
eprintln!(
"\nMore information about the error:\n\n {:#?}",
&command_action
);
}
}
}
}