blob: 19e9883f6fa2b717b53ee1e6a2755b9e7a2dab6a [file] [log] [blame]
Jeongik Cha3cea4812024-12-05 23:04:30 +09001use api::debian_service_client::DebianServiceClient;
2use api::ShutdownQueueOpeningRequest;
3use std::process::Command;
4
5use anyhow::anyhow;
6use clap::Parser;
7use log::debug;
8pub mod api {
9 tonic::include_proto!("com.android.virtualization.terminal.proto");
10}
11
12#[derive(Parser)]
13/// Flags for running command
14pub struct Args {
15 /// grpc port number
16 #[arg(long)]
17 #[arg(alias = "grpc_port")]
18 grpc_port: String,
19}
20
21#[tokio::main]
22async fn main() -> Result<(), Box<dyn std::error::Error>> {
23 let args = Args::parse();
24 let gateway_ip_addr = netdev::get_default_gateway()?.ipv4[0];
25
26 let server_addr = format!("http://{}:{}", gateway_ip_addr.to_string(), args.grpc_port);
27
28 debug!("connect to grpc server {}", server_addr);
29
30 let mut client = DebianServiceClient::connect(server_addr).await.map_err(|e| e.to_string())?;
31
32 let mut res_stream = client
33 .open_shutdown_request_queue(tonic::Request::new(ShutdownQueueOpeningRequest {}))
34 .await?
35 .into_inner();
36
37 while let Some(_response) = res_stream.message().await? {
38 let status = Command::new("poweroff").status().expect("power off");
39 if !status.success() {
40 return Err(anyhow!("Failed to power off: {status}").into());
41 }
42 debug!("poweroff");
43 break;
44 }
45 Ok(())
46}