public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Subject: Re: [PATCH 8/8] Allow pasta to take a command to execute
Date: Tue, 30 Aug 2022 10:26:02 +0200	[thread overview]
Message-ID: <20220830102602.2bb8f2d3@elisabeth> (raw)
In-Reply-To: <Yw1k1e0F4+aikvyl@yekko>

[-- Attachment #1: Type: text/plain, Size: 4397 bytes --]

On Tue, 30 Aug 2022 11:16:05 +1000
David Gibson <david(a)gibson.dropbear.id.au> wrote:

> On Mon, Aug 29, 2022 at 09:16:58PM +0200, Stefano Brivio wrote:
> > On Fri, 26 Aug 2022 14:58:39 +1000
> > David Gibson <david(a)gibson.dropbear.id.au> wrote:
> >   
> > > When not given an existing PID or network namspace to attach to, pasta
> > > spawns a shell.  Most commands which can spawn a shell in an altered
> > > environment can also run other commands in that same environment, which can
> > > be useful in automation.
> > > 
> > > Allow pasta to do the same thing; it can be given an arbitrary command to
> > > run in the network and user namespace which pasta creates.  If neither a
> > > command nor an existing PID or netns to attach to is given, continue to
> > > spawn a default shell, as before.
> > > 
> > > Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
> > > ---
> > >  conf.c  | 27 ++++++++++++++++++---------
> > >  passt.1 | 14 +++++++++-----
> > >  pasta.c | 33 +++++++++++++++++++++++----------
> > >  pasta.h |  2 +-
> > >  4 files changed, 51 insertions(+), 25 deletions(-)
> > > 
> > > diff --git a/conf.c b/conf.c
> > > index 2a18124..162c2dd 100644
> > > --- a/conf.c
> > > +++ b/conf.c
> > > @@ -550,7 +550,8 @@ static int conf_ns_pid(char *userns, char *netns, const char *arg)
> > >  		return 0;
> > >  	}
> > >  
> > > -	return -EINVAL;
> > > +	/* Not a PID, later code will treat as a command */
> > > +	return 0;
> > >  }
> > >  
> > >  /**
> > > @@ -1480,14 +1481,18 @@ void conf(struct ctx *c, int argc, char **argv)
> > >  
> > >  	check_root(c);
> > >  
> > > -	if (c->mode == MODE_PASTA && optind + 1 == argc) {
> > > -		ret = conf_ns_pid(userns, netns, argv[optind]);
> > > -		if (ret < 0)
> > > +	if (c->mode == MODE_PASTA) {
> > > +		if (*netns && optind != argc) {
> > > +			err("Both --netns and PID or command given");
> > >  			usage(argv[0]);
> > > -	} else if (c->mode == MODE_PASTA && *userns
> > > -		   && !*netns && optind == argc) {
> > > -		err("--userns requires --netns or PID");
> > > -		usage(argv[0]);
> > > +		} else if (optind + 1 == argc) {
> > > +			ret = conf_ns_pid(userns, netns, argv[optind]);
> > > +			if (ret < 0)
> > > +				usage(argv[0]);
> > > +		} else if (*userns && !*netns && optind == argc) {
> > > +			err("--userns requires --netns or PID");
> > > +			usage(argv[0]);
> > > +		}
> > >  	} else if (optind != argc) {
> > >  		usage(argv[0]);
> > >  	}
> > >
> > > [...]  
> > 
> > I haven't really looked into this yet, but I guess we should now
> > handle getopts return codes a bit differently, because this works:
> > 
> >   $ ./pasta --config-net -- sh -c 'sleep 1; ip li sh'
> >   1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
> >       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
> >   2: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65520 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
> >       link/ether aa:3e:39:5f:c6:15 brd ff:ff:ff:ff:ff:ff
> > 
> > while this doesn't:
> > 
> >   $ ./pasta --config-net sh -c 'sleep 1; ip li sh'
> >   ./pasta: invalid option -- 'c'
> >   [...]
> > 
> > despite the fact that there's no ambiguity.  
> 
> You mean because pasta itself doesn't have a -c option?

Ah, no, I meant it's after 'sh', which is a non-option argument.
However,

> Attempting to
> account for that sounds like a bad idea.  Requiring -- when the
> command given has options of its own that aren't supposed to go to the
> wrapper is pretty common for these sorts of tools.  Basically the
> trade-off is that you either need to require that, or you have to
> require that all non-option arguments of the wrapper come last (old
> style POSIXish command line parsing, as opposed to GNUish
> conventions).  The latter is usually more awkward than the former.

...right, my assumption was exactly that, but it's probably not a good
one. Let's keep it this way then. I wonder, though, if in the man page:

       pasta [OPTION]... [COMMAND [ARG]...]

we should explicitly mention this, because from this synopsis line it
looks like it's enough to put any command, with any argument, at the
end. Or maybe it's already covered by typical GNUish conventions and
users are used to it.

-- 
Stefano


  reply	other threads:[~2022-08-30  8:26 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-26  4:58 [PATCH 0/8] Allow pasta to take a command to spawn instead of shell David Gibson
2022-08-26  4:58 ` [PATCH 1/8] conf: Make the argument to --pcap option mandatory David Gibson
2022-08-26  4:58 ` [PATCH 2/8] conf: Use "-D none" and "-S none" instead of missing empty option arguments David Gibson
2022-08-30 17:41   ` Stefano Brivio
2022-08-26  4:58 ` [PATCH 3/8] Correct manpage for --userns David Gibson
2022-08-26  4:58 ` [PATCH 4/8] Remove --nsrun-dir option David Gibson
2022-08-26  4:58 ` [PATCH 5/8] Move ENOENT error message into conf_ns_opt() David Gibson
2022-08-26  4:58 ` [PATCH 6/8] More deterministic detection of whether argument is a PID, PATH or NAME David Gibson
2022-08-26  4:58 ` [PATCH 7/8] Use explicit --netns option rather than multiplexing with PID David Gibson
2022-08-29 19:16   ` Stefano Brivio
2022-08-30  1:12     ` David Gibson
2022-08-30  8:25       ` Stefano Brivio
2022-08-26  4:58 ` [PATCH 8/8] Allow pasta to take a command to execute David Gibson
2022-08-29 19:16   ` Stefano Brivio
2022-08-30  1:16     ` David Gibson
2022-08-30  8:26       ` Stefano Brivio [this message]
2022-08-30 17:41         ` Stefano Brivio
2022-09-01 10:07 ` [PATCH 0/8] Allow pasta to take a command to spawn instead of shell Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220830102602.2bb8f2d3@elisabeth \
    --to=sbrivio@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).