chiark / gitweb /
fix error and default and socket and things
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 23 Aug 2020 21:45:59 +0000 (22:45 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 23 Aug 2020 21:45:59 +0000 (22:45 +0100)
src/bin/otter.rs
src/global.rs

index 8d13348b7379ccf634905175823603013014942f..f8a2c3e35e0f3dff0ec12dae805213198a867d90 100644 (file)
@@ -57,6 +57,7 @@ const EXIT_DISASTER : i32 = 16;
 #[derive(Debug,Default)]
 struct MainOpts {
   scope: Option<ManagementScope>,
+  socket_path: Option<String>,
   verbose: i32,
 }
 
@@ -71,6 +72,13 @@ inventory::collect!(Subcommand);
 struct ArgumentParseError(String);
 display_as_debug!(ArgumentParseError);
 
+impl From<anyhow::Error> for ArgumentParseError {
+  fn from(ae: anyhow::Error) -> ArgumentParseError {
+    eprintln!("error during argument parsing/startup: {:?}\n", &ae);
+    exit(EXIT_USAGE);
+  }
+}
+
 fn parse_args<T,F>(
   args: Vec<String>,
   apmaker: &F,
@@ -118,6 +126,7 @@ fn main() {
   #[derive(Default,Debug)]
   struct MainArgs {
     opts: MainOpts,
+    config_filename: Option<String>,
     subcommand: String,
     subargs: Vec<String>,
   };
@@ -145,6 +154,12 @@ fn main() {
     scope.add_option(&["--scope-unix"],
                      StoreConst(None),
                      "use unix user $USER scope (default)");
+    ap.refer(&mut ma.opts.socket_path)
+      .add_option(&["--socket"], StoreOption,
+                  "specify server socket path");
+    ap.refer(&mut ma.config_filename)
+      .add_option(&["-C","--config"], StoreOption,
+                  "specify server config file (used for finding socket)");
     let mut verbose = ap.refer(&mut ma.opts.verbose);
     verbose.add_option(&["-q","--quiet"], StoreConst(-1),
                        "set verbosity to error messages only");
@@ -158,6 +173,13 @@ fn main() {
       ))?;
       *scope = Some(ManagementScope::Unix { user });
     }
+    if ma.config_filename.is_some() || ma.opts.socket_path.is_none() {
+      ServerConfig::read(ma.config_filename.as_ref().map(String::as_str))
+        .context("read config file")?;
+    }
+    ma.opts.socket_path.get_or_insert_with(
+      || config().command_socket.clone()
+    );
     Ok(())
   }), Some(&|w|{
     writeln!(w, "\nSubcommands:")?;
@@ -281,7 +303,9 @@ impl ConnForGame {
 
 #[throws(E)]
 fn connect(ma: &MainOpts) -> Conn {
-  let unix = UnixStream::connect(DEFAULT_COMMAND_SOCKET).context("connect to server")?; // xxx
+  let socket_path = ma.socket_path.as_ref().unwrap();
+  let unix = UnixStream::connect(&socket_path)
+    .with_context(||socket_path.clone()).context("connect to server")?; 
   let chan = MgmtChannel::new(unix)?;
   let mut chan = Conn { chan };
   chan.cmd(&MgmtCommand::SetScope(ma.scope.clone().unwrap()))?;
index 446ea7860cbbe0b41ee43b44f1e270ebb3485991..c6262052e7a211e0d462aec5617bb01d54db7ed2 100644 (file)
@@ -924,8 +924,7 @@ pub fn client_expire_old_clients() {
 const DEFAULT_CONFIG_FILENAME : &str = "server.toml";
 
 const DEFAULT_SAVE_DIRECTORY : &str = "save";
-pub const DEFAULT_COMMAND_SOCKET : &str = "command.socket"; // in save dir
-// ^ xxx should not be pub
+const DEFAULT_COMMAND_SOCKET : &str = "command.socket"; // in save dir
 
 #[derive(Deserialize,Debug,Clone)]
 pub struct ServerConfigSpec {
@@ -969,7 +968,8 @@ impl ServerConfig {
     let config_filename = config_filename
       .unwrap_or_else(|| DEFAULT_CONFIG_FILENAME);
     let mut buf = String::new();
-    File::open(config_filename)?.read_to_string(&mut buf)?;
+    File::open(&config_filename).with_context(||config_filename.to_string())?
+      .read_to_string(&mut buf)?;
     let config : ServerConfigSpec = toml::de::from_str(&buf)?;
     let config = config.try_into()?;
     set_config(config);