aboutsummaryrefslogtreecommitdiff
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
+ )
+}