use cvm12_rs::qmp; use tokio::net::UnixStream; use std::time::Duration; use tokio::time; #[tokio::main] async fn main() { let subscriber = tracing_subscriber::FmtSubscriber::builder() .with_max_level(tracing::Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber).expect("You Banned"); // Create a stream to connect let stream = UnixStream::connect("/home/lily/vms/xpiss/qmp.sock") .await .expect("Could not connect"); let client = qmp::QmpClient::new(stream); // Handshake QMP client.handshake().await.expect("Could not handshake QMP"); println!("Connected to QMP server"); // Create a copy of the client handle so we can issue a command in this other task. // This other task waits 10 seconds and closes the client, which causes the actor to stop. let copy = client.clone(); tokio::spawn(async move { tokio::time::sleep(Duration::from_secs(10)).await; println!("Closing client after 10 seconds"); copy.close().await.expect("Closing shouldn't fail"); }); println!( "res {}", client .execute_hmp("info block".into()) .await .expect("this shouldn't fail") ); // let's try to get all STOP events from QMP now. let mut rx = client.subscribe_to_event("STOP".into()).await.unwrap(); // If this worked, then now we can recieve all the events. // This code here allows running a VM with the -no-shutdown option, // automatially resetting it on shutdown. while let Some(message) = rx.recv().await { println!("Got stop event! {:?}", message); let res1 = client .execute("system_reset".into(), None) .await .expect("FUCK"); let res2 = client.execute("cont".into(), None).await.expect("FUCK"); println!("Result of running: {:?}, {:?}", res1, res2); } //println!("Hello, world!"); }