jail(8): introduce new command option -e to exhibit

a list of configured non-wildcard jails with their parameters,
no matter running or not.

The option -e takes separator argument that is used
to separate printed parameters. It will be used with following
additions to system periodic scripts to differentiate parts
of directory tree belonging jails as opposed to host's.

MFC after:	1 month
This commit is contained in:
eugen 2018-11-10 12:03:57 +00:00
parent 8b5fd3e9d6
commit 7e81b08555
3 changed files with 59 additions and 13 deletions

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd October 17, 2018
.Dd November 10, 2018
.Dt JAIL 8
.Os
.Sh NAME
@ -49,6 +49,7 @@
.Nm
.Op Fl qv
.Op Fl f Ar conf_file
.Op Fl e Ar separator
.Op Fl rR
.Op Cm * | Ar jail ...
.Nm
@ -63,6 +64,7 @@
The
.Nm
utility creates new jails, or modifies or removes existing jails.
It can also print a list of configured jails and their parameters.
A jail
.Pq or Dq prison
is specified via parameters on the command line, or in the
@ -71,6 +73,7 @@ file.
.Pp
At least one of the options
.Fl c ,
.Fl e ,
.Fl m
or
.Fl r
@ -86,6 +89,15 @@ and
.Va name
parameters (if specified on the command line)
must not refer to an existing jail.
.It Fl e Ar separator
Exhibit a list of all configured non-wildcard jails and their parameters.
No jail creation, modification or removal performed if this option is used.
The
.Ar separator
string is used to separate parameters.
Use
.Xr jls 8
utility to list running jails.
.It Fl m
Modify an existing jail.
One of the

View File

@ -60,6 +60,7 @@ const char *cfname;
int iflag;
int note_remove;
int verbose;
const char *separator = "\t";
static void clear_persist(struct cfjail *j);
static int update_jail(struct cfjail *j);
@ -69,8 +70,9 @@ static void jail_quoted_warnx(const struct cfjail *j, const char *name_msg,
const char *noname_msg);
static int jailparam_set_note(const struct cfjail *j, struct jailparam *jp,
unsigned njp, int flags);
static void print_jail(FILE *fp, struct cfjail *j, int oldcl);
static void print_jail(FILE *fp, struct cfjail *j, int oldcl, int running);
static void print_param(FILE *fp, const struct cfparam *p, int sep, int doname);
static void show_jails(void);
static void quoted_print(FILE *fp, char *str);
static void usage(void);
@ -151,7 +153,7 @@ main(int argc, char **argv)
cfname = CONF_FILE;
JidFile = NULL;
while ((ch = getopt(argc, argv, "cdf:hiJ:lmn:p:qrRs:u:U:v")) != -1) {
while ((ch = getopt(argc, argv, "cde:f:hiJ:lmn:p:qrRs:u:U:v")) != -1) {
switch (ch) {
case 'c':
op |= JF_START;
@ -159,6 +161,10 @@ main(int argc, char **argv)
case 'd':
dflag = 1;
break;
case 'e':
op |= JF_SHOW;
separator = optarg;
break;
case 'f':
cfname = optarg;
break;
@ -276,7 +282,13 @@ main(int argc, char **argv)
? NULL : "false");
}
}
} else if (op == JF_STOP) {
} else if (op == JF_STOP || op == JF_SHOW) {
/* Just print list of all configured non-wildcard jails */
if (op == JF_SHOW) {
load_config();
show_jails();
exit(0);
}
/* Jail remove, perhaps using the config file */
if (!docf || argc == 0)
usage();
@ -439,7 +451,7 @@ main(int argc, char **argv)
jail_create_done:
clear_persist(j);
if (jfp != NULL)
print_jail(jfp, j, oldcl);
print_jail(jfp, j, oldcl, 1);
dep_done(j, 0);
break;
@ -918,16 +930,18 @@ jailparam_set_note(const struct cfjail *j, struct jailparam *jp, unsigned njp,
* Print a jail record.
*/
static void
print_jail(FILE *fp, struct cfjail *j, int oldcl)
print_jail(FILE *fp, struct cfjail *j, int oldcl, int running)
{
struct cfparam *p;
int printsep;
if (oldcl) {
fprintf(fp, "%d\t", j->jid);
if (running)
fprintf(fp, "%d%s", j->jid, separator);
print_param(fp, j->intparams[KP_PATH], ',', 0);
putc('\t', fp);
fputs(separator, fp);
print_param(fp, j->intparams[KP_HOST_HOSTNAME], ',', 0);
putc('\t', fp);
fputs(separator, fp);
#ifdef INET
print_param(fp, j->intparams[KP_IP4_ADDR], ',', 0);
#ifdef INET6
@ -941,19 +955,38 @@ print_jail(FILE *fp, struct cfjail *j, int oldcl)
#ifdef INET6
print_param(fp, j->intparams[KP_IP6_ADDR], ',', 0);
#endif
putc('\t', fp);
fputs(separator, fp);
print_param(fp, j->intparams[IP_COMMAND], ' ', 0);
} else {
fprintf(fp, "jid=%d", j->jid);
printsep = 0;
if (running) {
fprintf(fp, "jid=%d", j->jid);
printsep = 1;
}
TAILQ_FOREACH(p, &j->params, tq)
if (strcmp(p->name, "jid")) {
putc(' ', fp);
if (printsep)
fputs(separator, fp);
else
printsep = 1;
print_param(fp, p, ',', 1);
}
}
putc('\n', fp);
}
/*
* Exhibit list of all configured non-wildcard jails
*/
static void
show_jails(void)
{
struct cfjail *j;
TAILQ_FOREACH(j, &cfjails, tq)
print_jail(stdout, j, 0, 0);
}
/*
* Print a parameter value, or a name=value pair.
*/
@ -1007,7 +1040,7 @@ usage(void)
(void)fprintf(stderr,
"usage: jail [-dhilqv] [-J jid_file] [-u username] [-U username]\n"
" -[cmr] param=value ... [command=command ...]\n"
" jail [-dqv] [-f file] -[cmr] [jail]\n"
" jail [-dqv] [-f file] [-e separator] -[cmr] [jail]\n"
" jail [-qv] [-f file] -[rR] ['*' | jail ...]\n"
" jail [-dhilqv] [-J jid_file] [-u username] [-U username]\n"
" [-n jailname] [-s securelevel]\n"

View File

@ -67,6 +67,7 @@
#define JF_TIMEOUT 0x0200 /* A command (or process kill) timed out */
#define JF_SLEEPQ 0x0400 /* Waiting on a command and/or timeout */
#define JF_FROM_RUNQ 0x0800 /* Has already been on the run queue */
#define JF_SHOW 0x1000 /* -e Exhibit list of configured jails */
#define JF_OP_MASK (JF_START | JF_SET | JF_STOP)
#define JF_RESTART (JF_START | JF_STOP)