Rust 任务二传手

CrossPython / 2023-08-28 / 原文

 

use postgres::{Client, NoTls};
use std::process::Command;
use std::fs::File;
use std::io::{BufRead, BufReader, Write};

fn  is_program_running(program: &str) ->bool {
    let cmdstr = format!("IMAGENAME eq {}", program);
    let output = Command::new("cmd")
                    .arg("/S")
                    .arg("/c")
                    .arg("tasklist")
                    .arg("/FI")
                    .arg(cmdstr)
                    .output()
                    .expect("-1");
    let output_str = String::from_utf8_lossy(&output.stdout);
    let result = match output_str.find(program) {
        Some(_) => true,
        None => false
    };
    result
}

fn trigger_scheduled_task(taskname: &str) {
    let cmdstr = format!("schtasks /RUN /TN {}", taskname);
    Command::new("cmd")
                .arg("/S")
                .arg("/c")
                .arg(cmdstr)
                .output()
                .expect("-1");
}

fn main() -> Result<(), postgres::Error> {
    //数据库TODO
    let mut client = Client::connect("host=localhost dbname=test user=postgres password=postgres", NoTls)?;
    loop {
        if is_program_running("notepad.exe") == false {     //notepad TODO
            for row in client.query(r"select cast(id as varchar) as id, tasktype 
                                                    from saptask 
                                                    where status='ongoing'", &[])? {
                let id: &str = row.get(0);
                let tasktype: &str = row.get(1);
                let logpath = match tasktype {      // address TODO
                    "MM" => r"D:\www\test\log.txt",
                    "BOM" => r"D:\www\test\log.txt",
                    _ => r"D:\www\test\log.txt",
                };
                let file = File::open(logpath).unwrap();
                let reader = BufReader::new(file);
                for line in reader.lines() {
                    let linestr = line.unwrap_or_else(|_|{"".to_string()});
                    match &linestr.find("programfinished") {
                        Some(_) => {
                            let endtime = linestr.replace(" > programfinished ;", "");
                            let sqlid = str::parse::<i32>(&id).unwrap();
                            client.execute("update saptask 
                                                    set endtime=$1,status='done' 
                                                    where id=$2", &[&endtime, &sqlid])?;
                        },
                        _ => {}
                    }
                }
            }
        } 

        for ongoingtask in client.query(r"select cast(count(id) as varchar) as q 
                                                            from saptask 
                                                            where status='ongoing'", &[])? {
            let q :&str= ongoingtask.get(0);
            if q.parse::<i32>().unwrap() == 0 {
                for taskrow in client.query(r"select tasktype, taskfilepath 
                                                                from saptask 
                                                                where status='pending' 
                                                                order by id asc 
                                                                limit 1", &[])? {
                    let tasktype: &str = taskrow.get(0);
                    let taskfilepath: &str = taskrow.get(1);
                    match tasktype {        // 1. 替换程序名称
                        "MM" => {
                            // 将newtaskaddr写入对应程序的txt文件里.然后去执行这个任务. 
                            let newaddr= "D:/test/hello_rust.txt";                          //TODO
                            let mut f = File::create(newaddr).unwrap();
                            f.write_all(taskfilepath.as_bytes()).unwrap();
                            println!("MM");},
                        "BOM" => {
                            // 将newtaskaddr写入对应程序的txt文件里.然后去执行这个任务. 
                            let newaddr= "D:/test/hello_rust.txt";                          //TODO
                            let mut f = File::create(newaddr).unwrap();
                            f.write_all(taskfilepath.as_bytes()).unwrap();
                            println!("BOM");
                            trigger_scheduled_task("do");
                        },
                        _ => {}
                    }
                }
            }
        }
    }
}