Add -U option to overwrite the user
This commit is contained in:
parent
91eb82f902
commit
20e2f78f83
2 changed files with 51 additions and 20 deletions
|
@ -23,6 +23,8 @@
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm cloud-agent
|
.Nm cloud-agent
|
||||||
.Op Fl nuv
|
.Op Fl nuv
|
||||||
|
.Op Fl t Ar timeout
|
||||||
|
.Op Fl U Ar username
|
||||||
.Ar interface
|
.Ar interface
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
|
@ -34,6 +36,23 @@ The options are as follows:
|
||||||
.Bl -tag -width Ds
|
.Bl -tag -width Ds
|
||||||
.It Fl n
|
.It Fl n
|
||||||
Do not configure the system and skip the provisioning step.
|
Do not configure the system and skip the provisioning step.
|
||||||
|
.It Fl t Ar timeout
|
||||||
|
Change the HTTP timeout.
|
||||||
|
The default is 3 seconds.
|
||||||
|
.It Fl U Ar username
|
||||||
|
Change the default user.
|
||||||
|
The default is
|
||||||
|
.Dq ec2-user
|
||||||
|
on AWS,
|
||||||
|
.Dq azure-user
|
||||||
|
on Azure, and
|
||||||
|
.Dq puffy
|
||||||
|
everywhere else.
|
||||||
|
The default user is used when it is not obtained from the cloud
|
||||||
|
configuration.
|
||||||
|
Using
|
||||||
|
.Dq root
|
||||||
|
is supported, but not recommended.
|
||||||
.It Fl u
|
.It Fl u
|
||||||
Deprovision and unconfigure the system.
|
Deprovision and unconfigure the system.
|
||||||
This deletes keys, passwords, and logs files without asking for permission.
|
This deletes keys, passwords, and logs files without asking for permission.
|
||||||
|
|
52
agent/main.c
52
agent/main.c
|
@ -325,11 +325,6 @@ agent_init(const char *ifname, int dryrun, int timeout)
|
||||||
free(sc);
|
free(sc);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
if ((sc->sc_username = strdup("puffy")) == NULL) {
|
|
||||||
free(sc);
|
|
||||||
close(sc->sc_nullfd);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Silently try to mount the cdrom */
|
/* Silently try to mount the cdrom */
|
||||||
fd = disable_output(sc, STDERR_FILENO);
|
fd = disable_output(sc, STDERR_FILENO);
|
||||||
|
@ -646,6 +641,13 @@ agent_configure(struct system_config *sc)
|
||||||
if (fileout(sc->sc_instance, "w", "/var/db/cloud-instance") != 0)
|
if (fileout(sc->sc_instance, "w", "/var/db/cloud-instance") != 0)
|
||||||
log_warnx("instance failed");
|
log_warnx("instance failed");
|
||||||
|
|
||||||
|
/* Set default username if not set */
|
||||||
|
if ((sc->sc_username == NULL) &&
|
||||||
|
(sc->sc_username = strdup("puffy")) == NULL) {
|
||||||
|
log_warn("default username");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/* hostname */
|
/* hostname */
|
||||||
log_debug("%s: hostname %s", __func__, sc->sc_hostname);
|
log_debug("%s: hostname %s", __func__, sc->sc_hostname);
|
||||||
if (fileout(sc->sc_hostname, "w", "/etc/myname") != 0)
|
if (fileout(sc->sc_hostname, "w", "/etc/myname") != 0)
|
||||||
|
@ -655,11 +657,13 @@ agent_configure(struct system_config *sc)
|
||||||
|
|
||||||
/* username */
|
/* username */
|
||||||
log_debug("%s: username %s", __func__, sc->sc_username);
|
log_debug("%s: username %s", __func__, sc->sc_username);
|
||||||
if (shell("useradd", "-L", "staff", "-G", "wheel",
|
if (strcmp("root", sc->sc_username) != 0) {
|
||||||
"-m", sc->sc_username, NULL) != 0)
|
if (shell("useradd", "-L", "staff", "-G", "wheel",
|
||||||
log_warnx("username failed");
|
"-m", sc->sc_username, NULL) != 0)
|
||||||
if (fileout(sc->sc_username, "w", "/root/.forward") != 0)
|
log_warnx("username failed");
|
||||||
log_warnx(".forward failed");
|
if (fileout(sc->sc_username, "w", "/root/.forward") != 0)
|
||||||
|
log_warnx(".forward failed");
|
||||||
|
}
|
||||||
|
|
||||||
/* password */
|
/* password */
|
||||||
if (sc->sc_password == NULL) {
|
if (sc->sc_password == NULL) {
|
||||||
|
@ -703,7 +707,8 @@ agent_configure(struct system_config *sc)
|
||||||
continue;
|
continue;
|
||||||
log_debug("%s: key %s", __func__, ssh->ssh_keyval);
|
log_debug("%s: key %s", __func__, ssh->ssh_keyval);
|
||||||
if (fileout(ssh->ssh_keyval, "a",
|
if (fileout(ssh->ssh_keyval, "a",
|
||||||
"/home/%s/.ssh/authorized_keys",
|
"%s/%s/.ssh/authorized_keys",
|
||||||
|
strcmp("root", sc->sc_username) == 0 ? "" : "/home",
|
||||||
sc->sc_username) != 0)
|
sc->sc_username) != 0)
|
||||||
log_warnx("public key failed");
|
log_warnx("public key failed");
|
||||||
}
|
}
|
||||||
|
@ -804,7 +809,7 @@ static int
|
||||||
agent_network(struct system_config *sc)
|
agent_network(struct system_config *sc)
|
||||||
{
|
{
|
||||||
struct net_addr *net;
|
struct net_addr *net;
|
||||||
char ift[16], ifname[16], line[1024], path[PATH_MAX];
|
char ift[16], ifname[16], line[1024];
|
||||||
const char *family;
|
const char *family;
|
||||||
char domain[(NI_MAXHOST + 1) * 6 + 8]; /* up to 6 domains */
|
char domain[(NI_MAXHOST + 1) * 6 + 8]; /* up to 6 domains */
|
||||||
int has_domain = 0;
|
int has_domain = 0;
|
||||||
|
@ -832,20 +837,19 @@ agent_network(struct system_config *sc)
|
||||||
/* XXX prefix or mask */
|
/* XXX prefix or mask */
|
||||||
|
|
||||||
/* hostname.if startup configuration */
|
/* hostname.if startup configuration */
|
||||||
snprintf(path, sizeof(path),
|
|
||||||
"/etc/hostname.%s", ifname);
|
|
||||||
if (!ifidx[net->net_ifunit])
|
if (!ifidx[net->net_ifunit])
|
||||||
fileout(comment, "w", path);
|
fileout(comment, "w",
|
||||||
|
"/etc/hostname.%s", ifname);
|
||||||
|
|
||||||
snprintf(line, sizeof(line), "%s alias %s",
|
snprintf(line, sizeof(line), "%s alias %s",
|
||||||
family, net->net_value);
|
family, net->net_value);
|
||||||
fileout(line, "a", path);
|
fileout(line, "a", "/etc/hostname.%s", ifname);
|
||||||
|
|
||||||
if (!ifidx[net->net_ifunit]++ &&
|
if (!ifidx[net->net_ifunit]++ &&
|
||||||
net->net_ifunit == 0) {
|
net->net_ifunit == 0) {
|
||||||
snprintf(line, sizeof(line),
|
snprintf(line, sizeof(line),
|
||||||
"!%s", sc->sc_args);
|
"!%s", sc->sc_args);
|
||||||
fileout(line, "a", path);
|
fileout(line, "a", "/etc/hostname.%s", ifname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* runtime configuration */
|
/* runtime configuration */
|
||||||
|
@ -1088,7 +1092,7 @@ usage(void)
|
||||||
{
|
{
|
||||||
extern char *__progname;
|
extern char *__progname;
|
||||||
|
|
||||||
fprintf(stderr, "usage: %s [-nuv] [-t 3] interface\n",
|
fprintf(stderr, "usage: %s [-nuv] [-t 3] [-U puffy] interface\n",
|
||||||
__progname);
|
__progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -1130,12 +1134,12 @@ main(int argc, char *const *argv)
|
||||||
int verbose = 0, dryrun = 0, unconfigure = 0;
|
int verbose = 0, dryrun = 0, unconfigure = 0;
|
||||||
int ch, ret, timeout = CONNECT_TIMEOUT;
|
int ch, ret, timeout = CONNECT_TIMEOUT;
|
||||||
const char *error = NULL;
|
const char *error = NULL;
|
||||||
char *args;
|
char *args, *username = NULL;
|
||||||
|
|
||||||
if ((args = get_args(argc, argv)) == NULL)
|
if ((args = get_args(argc, argv)) == NULL)
|
||||||
fatalx("failed to save args");
|
fatalx("failed to save args");
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "nvt:u")) != -1) {
|
while ((ch = getopt(argc, argv, "nvt:U:u")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'n':
|
case 'n':
|
||||||
dryrun = 1;
|
dryrun = 1;
|
||||||
|
@ -1148,6 +1152,10 @@ main(int argc, char *const *argv)
|
||||||
if (error != NULL)
|
if (error != NULL)
|
||||||
fatalx("invalid timeout: %s", error);
|
fatalx("invalid timeout: %s", error);
|
||||||
break;
|
break;
|
||||||
|
case 'U':
|
||||||
|
if ((username = strdup(optarg)) == NULL)
|
||||||
|
fatal("username");
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
unconfigure = 1;
|
unconfigure = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -1177,6 +1185,10 @@ main(int argc, char *const *argv)
|
||||||
if ((sc = agent_init(argv[0], dryrun, timeout)) == NULL)
|
if ((sc = agent_init(argv[0], dryrun, timeout)) == NULL)
|
||||||
fatalx("agent");
|
fatalx("agent");
|
||||||
sc->sc_args = args;
|
sc->sc_args = args;
|
||||||
|
if (username != NULL) {
|
||||||
|
free(sc->sc_username);
|
||||||
|
sc->sc_username = username;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX Detect cloud with help from hostctl and sysctl
|
* XXX Detect cloud with help from hostctl and sysctl
|
||||||
|
|
Loading…
Reference in a new issue