about summary refs log tree commit diff
path: root/tools/sendsms/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/sendsms/src/main.rs')
-rwxr-xr-xtools/sendsms/src/main.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/sendsms/src/main.rs b/tools/sendsms/src/main.rs
new file mode 100755
index 0000000..30e92ff
--- /dev/null
+++ b/tools/sendsms/src/main.rs
@@ -0,0 +1,85 @@
+#![warn(rust_2018_idioms)]
+
+mod config;
+mod message;
+
+use clap::{crate_version, Parser};
+use gethostname::gethostname;
+use log::{error, info};
+use std::net::IpAddr;
+use std::path::PathBuf;
+use std::process::exit;
+
+#[derive(Parser, Debug)]
+#[clap(name = "sendsms")]
+#[clap(author = "Franck Cuny <franck@fcuny.net>")]
+#[clap(version = crate_version!())]
+#[clap(propagate_version = true)]
+struct Args {
+    #[clap(short, long, value_parser)]
+    config: PathBuf,
+
+    #[clap(subcommand)]
+    subcmd: SubCommand,
+}
+
+#[derive(Parser, Debug)]
+enum SubCommand {
+    Reboot,
+}
+
+fn main() {
+    env_logger::init();
+    let args = Args::parse();
+
+    let config: config::Config = match config::Config::load_from_file(&args.config) {
+        Ok(r) => r,
+        Err(e) => {
+            error!(
+                "unable to load data from {}: {}",
+                args.config.display(),
+                e.to_string()
+            );
+            exit(1);
+        }
+    };
+
+    let body = match args.subcmd {
+        SubCommand::Reboot => reboot(&config.reboot),
+    };
+
+    let msg = message::Message {
+        from: config.from.to_owned(),
+        to: config.to.to_owned(),
+        body,
+    };
+
+    match msg.send(&config) {
+        Ok(_) => info!("message sent successfully"),
+        Err(error) => {
+            error!("failed to send the message: {}", error);
+            exit(1);
+        }
+    }
+}
+
+fn reboot(config: &config::RebootConfig) -> String {
+    let ipaddr_v4 = if_addrs::get_if_addrs()
+        .unwrap_or_default()
+        .into_iter()
+        .find(|iface| iface.name == config.ifname)
+        .and_then(|iface| match iface.ip() {
+            IpAddr::V4(addr) => Some(addr),
+            IpAddr::V6(_) => None,
+        })
+        .expect("there should be an ipv4 address");
+
+    let hostname = gethostname()
+        .into_string()
+        .expect("failed to get the hostname");
+
+    format!(
+        "{} has rebooted. The IP address for the interface {} is {}.",
+        hostname, config.ifname, ipaddr_v4
+    )
+}