chiark / gitweb /
otter(1): Provide command-{json,ron} for adhoc commands
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 May 2021 21:35:17 +0000 (22:35 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 May 2021 22:59:15 +0000 (23:59 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/otter.rs

index 59bf2a69515986a2854ada5a0d9ee8058ec07c3a..d98af03b5d54625a2a355a3257762baa0299cc1d 100644 (file)
@@ -1410,6 +1410,57 @@ impl AdhocFormat {
   }
 }
 
+//---------- adhoc command ----------
+
+mod command_adhoc {
+  use super::*;
+
+  #[derive(Default,Debug)]
+  struct Args {
+    cmds: Vec<String>,
+  }
+
+  fn subargs<'ap,'a:'ap,'m:'ap>(
+    sa: &'a mut Args,
+    ahf: AdhocFormat,
+  ) -> ArgumentParser<'ap> {
+    use argparse::*;
+    let mut ap = ArgumentParser::new();
+    ap.refer(&mut sa.cmds).required()
+      .add_argument(format!("{}-COMMAND", ahf.metavar()).leak(),
+                    Collect,
+                    format!("{}-encoded MgmtCommand", ahf.name())
+                    .leak());
+    ap
+  }
+
+  #[throws(AE)]
+  fn call(sc: &'static Subcommand, ma: MainOpts, args: Vec<String>) {
+    let ahf = sc.into();
+
+    let subargs: ApMaker<_> = &|sa| subargs(sa,ahf);
+    let args = parse_args::<Args,_>(args, subargs, &ok_id, None);
+    let mut conn = connect(&ma)?;
+
+    let cmds: Vec<MgmtCommand> = ahf.parse(args.cmds, "cmd")?;
+    for (i, cmd) in cmds.into_iter().enumerate() {
+      let resp = conn.cmd(&cmd).with_context(|| format!("cmd #{}", i))?;
+      ahf.report(resp)?;
+    }
+  }
+
+  inventory::submit!{Subcommand(
+    "command-json",
+    "run ad-hoc management command(s) (JSON)",
+    call,
+  )}
+  inventory::submit!{Subcommand(
+    "command-ron",
+    "run ad-hoc management command(s) (Rusty Object Notation)",
+    call,
+  )}
+}
+
 //---------- alter game ----------
 
 mod alter_game_adhoc {