]> git.proxmox.com Git - pve-xtermjs.git/commitdiff
termproxy: update clap crate to major version 4
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 4 Oct 2023 13:38:36 +0000 (15:38 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 4 Oct 2023 15:19:49 +0000 (17:19 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Cargo.toml
debian/control
src/main.rs

index b9479be1892723e65c42705b6182176d84a3cec2..7b05c4741b092e2afee98be7ef6fdd71b3d8ecce 100644 (file)
@@ -15,7 +15,7 @@ exclude = [ "build", "debian" ]
 anyhow = "1"
 mio = { version = "0.8", features = [ "net", "os-ext" ] }
 ureq = { version = "2.4", default-features = false, features = [ "gzip" ] }
-clap = "3"
+clap = "4"
 proxmox-io = "1"
 proxmox-lang = "1.1"
 proxmox-sys = "0.5"
index fd052c2e241b8d922c29e3cde755ec7626c40be1..d06ae3bb2dcf3a1b0c7b8a88881c9ed586663331 100644 (file)
@@ -5,7 +5,7 @@ Build-Depends: cargo:native,
                debhelper-compat (= 13),
                dh-cargo (>= 25),
                librust-anyhow-1+default-dev,
-               librust-clap-3+default-dev,
+               librust-clap-4+default-dev,
                librust-mio-0.8+default-dev,
                librust-mio-0.8+net-dev,
                librust-mio-0.8+os-ext-dev,
index 6ad72bf77f2636b78d44e367643712ae5b3c9b3b..5eb14ee3585c3e1bf0d517f51dcddc869abb5785 100644 (file)
@@ -1,6 +1,6 @@
 use std::cmp::min;
 use std::collections::HashMap;
-use std::ffi::{OsStr, OsString};
+use std::ffi::OsString;
 use std::io::{ErrorKind, Write};
 use std::os::unix::io::{AsRawFd, FromRawFd};
 use std::os::unix::process::CommandExt;
@@ -8,7 +8,7 @@ use std::process::Command;
 use std::time::{Duration, Instant};
 
 use anyhow::{bail, format_err, Result};
-use clap::{App, AppSettings, Arg};
+use clap::Arg;
 use mio::net::{TcpListener, TcpStream};
 use mio::unix::SourceFd;
 use mio::{Events, Interest, Poll, Token};
@@ -212,7 +212,10 @@ fn listen_and_accept(
     }
 }
 
-fn run_pty(cmd: &OsStr, params: clap::OsValues) -> Result<PTY> {
+fn run_pty<'a>(mut full_cmd: impl Iterator<Item = &'a OsString>) -> Result<PTY> {
+    let cmd_exe = full_cmd.next().unwrap();
+    let params = full_cmd; // rest
+
     let (mut pty, secondary_name) = PTY::new().map_err(io_err_other)?;
 
     let mut filtered_env: HashMap<OsString, OsString> = std::env::vars_os()
@@ -227,7 +230,7 @@ fn run_pty(cmd: &OsStr, params: clap::OsValues) -> Result<PTY> {
         .collect();
     filtered_env.insert("TERM".into(), "xterm-256color".into());
 
-    let mut command = Command::new(cmd);
+    let mut command = Command::new(cmd_exe);
 
     command.args(params).env_clear().envs(&filtered_env);
 
@@ -248,48 +251,32 @@ const TCP: Token = Token(0);
 const PTY: Token = Token(1);
 
 fn do_main() -> Result<()> {
-    let matches = App::new("termproxy")
-        .setting(AppSettings::TrailingVarArg)
-        .arg(Arg::with_name("port").takes_value(true).required(true))
+    let matches = clap::builder::Command::new("termproxy")
+        .trailing_var_arg(true)
         .arg(
-            Arg::with_name("authport")
-                .takes_value(true)
-                .long("authport"),
+            Arg::new("port")
+                .num_args(1)
+                .required(true)
+                .value_parser(clap::value_parser!(u64)),
         )
-        .arg(Arg::with_name("use-port-as-fd").long("port-as-fd"))
+        .arg(Arg::new("authport").num_args(1).long("authport"))
+        .arg(Arg::new("use-port-as-fd").long("port-as-fd"))
+        .arg(Arg::new("path").num_args(1).long("path").required(true))
+        .arg(Arg::new("perm").num_args(1).long("perm"))
         .arg(
-            Arg::with_name("path")
-                .takes_value(true)
-                .long("path")
-                .required(true),
-        )
-        .arg(Arg::with_name("perm").takes_value(true).long("perm"))
-        .arg(
-            Arg::with_name("cmd")
-                .allow_invalid_utf8(true)
-                .multiple(true)
+            Arg::new("cmd")
+                .value_parser(clap::value_parser!(OsString))
+                .num_args(1..)
                 .required(true),
         )
         .get_matches();
 
-    let port: u64 = matches
-        .value_of("port")
-        .unwrap()
-        .parse()
-        .map_err(io_err_other)?;
-    let path = matches.value_of("path").unwrap();
-    let perm: Option<&str> = matches.value_of("perm");
-    let mut cmdparams = matches.values_of_os("cmd").unwrap();
-    let cmd = cmdparams.next().unwrap();
-    let authport: u16 = matches
-        .value_of("authport")
-        .unwrap_or("85")
-        .parse()
-        .map_err(io_err_other)?;
-    let mut pty_buf = ByteBuffer::new();
-    let mut tcp_buf = ByteBuffer::new();
-
-    let use_port_as_fd = matches.is_present("use-port-as-fd");
+    let port: u64 = *matches.get_one("port").unwrap();
+    let path = matches.get_one::<String>("path").unwrap();
+    let perm = matches.get_one::<String>("perm").map(|x| x.as_str());
+    let full_cmd: clap::parser::ValuesRef<OsString> = matches.get_many("cmd").unwrap();
+    let authport: u16 = *matches.get_one("authport").unwrap_or(&85);
+    let use_port_as_fd = matches.contains_id("use-port-as-fd");
 
     if use_port_as_fd && port > u16::MAX as u64 {
         return Err(format_err!("port too big"));
@@ -301,16 +288,19 @@ fn do_main() -> Result<()> {
         listen_and_accept("localhost", port, use_port_as_fd, Duration::new(10, 0))
             .map_err(|err| format_err!("failed waiting for client: {}", err))?;
 
+    let mut pty_buf = ByteBuffer::new();
+    let mut tcp_buf = ByteBuffer::new();
+
     let (username, ticket) = read_ticket_line(&mut tcp_handle, &mut pty_buf, Duration::new(10, 0))
         .map_err(|err| format_err!("failed reading ticket: {}", err))?;
     let port = if use_port_as_fd { Some(port) } else { None };
-    authenticate(&username, &ticket, path, perm, authport, port)?;
+    authenticate(&username, &ticket, &path, perm.as_deref(), authport, port)?;
     tcp_handle.write_all(b"OK").expect("error writing response");
 
     let mut poll = Poll::new()?;
     let mut events = Events::with_capacity(128);
 
-    let mut pty = run_pty(cmd, cmdparams)?;
+    let mut pty = run_pty(full_cmd)?;
 
     poll.registry().register(
         &mut tcp_handle,