diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 9dcddd2..02f4d75 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -25,9 +25,20 @@ jobs: cd /tmp/phenix mkdir -p /tmp/release tar -czf /tmp/release/phenix_${{ github.ref_name }}.tar.gz . + - name: Make debian package + run: | + cargo install cargo-deb + cargo deb + cp target/debian/*.deb /tmp/release - name: Make release uses: actions/forgejo-release@v2.6.0 with: direction: upload - release-dir: /tmp/phenix - token: ${{ secrets.FORGEJO_TOKEN }} \ No newline at end of file + release-dir: /tmp/release + token: ${{ secrets.FORGEJO_TOKEN }} + - name: Upload debian package + run: | + cp /tmp/release/*.deb /tmp/phenix.deb + curl --user ${{ vars.DOCKER_PUSH_USERNAME }}:${{ secrets.DOCKER_PUSH_PASSWORD }} \ + --upload-file /tmp/phenix.deb \ + https://code.edgarpierre.fr/api/packages/${{ github.repository_owner }}/debian/pool/bookworm/main/upload diff --git a/Cargo.toml b/Cargo.toml index 9b43036..3734388 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,14 @@ [package] name = "phenix" -version = "0.1.2" +description = "Utility to restart PCIe devices when link is lost." +version = "0.2.1" edition = "2024" +license = "GPL-3.0-or-later" +repository="https://code.edgarpierre.fr/edpibu/phenix" +authors = ["edpibu "] -[dependencies] -regex = "1.11.1" +[package.metadata.deb] +maintainer-scripts = "debian/" + +[package.metadata.deb.systemd-units] +unit-scripts = "." diff --git a/src/main.rs b/src/main.rs index ff5d7eb..a9e001c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,20 @@ #![feature(file_buffered)] +use std::env; use std::fs::File; use std::io::BufRead; use std::io::Write; +use std::io::Seek; +use std::io::SeekFrom; fn main() { println!("Reading kernel messages..."); - let kmsg_file = - File::open_buffered("/dev/kmsg").expect("Failed to open /dev/kmsg"); + let mut kmsg_file = + File::open_buffered(env::var("PHENIX_KMSG").unwrap_or(String::from("/dev/kmsg"))) + .expect("Failed to open /dev/kmsg"); + + kmsg_file.seek(SeekFrom::End(0)).expect("Failed to seek to end"); let lines = kmsg_file.lines(); for line in lines { match line { @@ -24,8 +30,9 @@ fn manage_line(line: String) { println!("PCIe link lost {prefix}"); let id = line.splitn(3, " ").nth(1); - if let Some(id) = id { - reset_device(id); + match id { + Some(id) => reset_device(id), + None => println!("No device id found in message {line}"), } } } @@ -34,6 +41,7 @@ fn manage_line(line: String) { fn reset_device(id: &str) { println!("Resetting {id}"); echo1(rm_file_path(&id)); + println!("Removed device {id}"); echo1(String::from("/sys/bus/pci/rescan")); println!("Rescanned PCI bus"); } @@ -43,14 +51,12 @@ fn echo1(path: String) { match rm_file { Err(e) => println!("Failed to open remove file at {path}: {e}"), Ok(mut file) => { - file - .write_all(b"1") + file.write_all(b"1") .expect("Failed to write to remove file"); - println!("Removed device {path}"); } } } fn rm_file_path(id: &str) -> String { format!("/sys/bus/pci/devices/{id}/remove") -} \ No newline at end of file +}