On lör, 2011-11-26 at 01:28 +0200, Peter Eisentraut wrote:
> I propose that we change createuser so that it does not prompt for
> anything by default. We can arrange options so that you can get prompts
> for whatever is missing, but by default, a call to createuser should
> just run CREATE USER with default options. The fact that createuser
> issues prompts is always annoying when you create setup scripts, because
> you have to be careful to specify all the necessary options, and they
> are inconsistent and different between versions (although the last
> change about that was a long time ago), and the whole behavior seems
> contrary to the behavior of all other utilities. I don't think there'd
> be a real loss by not prompting by default; after all, we don't really
> want to encourage users to create more superusers, do we? Comments?
Patch attached. I'll add it to the next commitfest.
diff --git i/doc/src/sgml/ref/createuser.sgml w/doc/src/sgml/ref/createuser.sgml
index 4cbfd69..90b0fd4 100644
--- i/doc/src/sgml/ref/createuser.sgml
+++ w/doc/src/sgml/ref/createuser.sgml
@@ -102,7 +102,8 @@ PostgreSQL documentation
<term><option>--no-createdb</></term>
<listitem>
<para>
- The new user will not be allowed to create databases.
+ The new user will not be allowed to create databases. This is the
+ default.
</para>
</listitem>
</varlistentry>
@@ -153,6 +154,19 @@ PostgreSQL documentation
</varlistentry>
<varlistentry>
+ <term><option>--interactive</></term>
+ <listitem>
+ <para>
+ Prompt for the user name if none is specified on the command line, and
+ also prompt for whichever of the
+ options <option>-d</option>/<option>-D</option>, <option>-r</option>/<option>-R</option>, <option>-s</option>/<option>-S</option>
+ is not specified on the command line. (This was the default behavior
+ up to PostgreSQL 9.1.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-l</></term>
<term><option>--login</></term>
<listitem>
@@ -215,7 +229,8 @@ PostgreSQL documentation
<term><option>--no-createrole</></term>
<listitem>
<para>
- The new user will not be allowed to create new roles.
+ The new user will not be allowed to create new roles. This is the
+ default.
</para>
</listitem>
</varlistentry>
@@ -235,7 +250,7 @@ PostgreSQL documentation
<term><option>--no-superuser</></term>
<listitem>
<para>
- The new user will not be a superuser.
+ The new user will not be a superuser. This is the default.
</para>
</listitem>
</varlistentry>
@@ -287,11 +302,6 @@ PostgreSQL documentation
</para>
<para>
- You will be prompted for a name and other missing information if it
- is not specified on the command line.
- </para>
-
- <para>
<application>createuser</application> also accepts the following
command-line arguments for connection parameters:
@@ -422,6 +432,14 @@ PostgreSQL documentation
server:
<screen>
<prompt>$ </prompt><userinput>createuser joe</userinput>
+</screen>
+ </para>
+
+ <para>
+ To create a user <literal>joe</literal> on the default database
+ server with prompting for some additional attributes:
+<screen>
+<prompt>$ </prompt><userinput>createuser --interactive joe</userinput>
<computeroutput>Shall the new role be a superuser? (y/n) </computeroutput><userinput>n</userinput>
<computeroutput>Shall the new role be allowed to create databases? (y/n) </computeroutput><userinput>n</userinput>
<computeroutput>Shall the new role be allowed to create more new roles? (y/n) </computeroutput><userinput>n</userinput>
@@ -430,7 +448,7 @@ PostgreSQL documentation
<para>
To create the same user <literal>joe</literal> using the
- server on host <literal>eden</>, port 5000, avoiding the prompts and
+ server on host <literal>eden</>, port 5000, with attributes explicitly specified,
taking a look at the underlying command:
<screen>
<prompt>$ </prompt><userinput>createuser -h eden -p 5000 -S -D -R -e joe</userinput>
diff --git i/doc/src/sgml/ref/dropuser.sgml w/doc/src/sgml/ref/dropuser.sgml
index 724fe40..bc6feaf 100644
--- i/doc/src/sgml/ref/dropuser.sgml
+++ w/doc/src/sgml/ref/dropuser.sgml
@@ -62,7 +62,9 @@ PostgreSQL documentation
<listitem>
<para>
Specifies the name of the <productname>PostgreSQL</productname> user to be removed.
- You will be prompted for a name if none is specified on the command line.
+ You will be prompted for a name if none is specified on the command
+ line and the <option>-i</option>/<option>--interactive</option> option
+ is used.
</para>
</listitem>
</varlistentry>
@@ -83,7 +85,8 @@ PostgreSQL documentation
<term><option>--interactive</></term>
<listitem>
<para>
- Prompt for confirmation before actually removing the user.
+ Prompt for confirmation before actually removing the user, and prompt
+ for the user name if none is specified on the command line.
</para>
</listitem>
</varlistentry>
diff --git i/src/bin/scripts/createuser.c w/src/bin/scripts/createuser.c
index d6e05dd..ce74410 100644
--- i/src/bin/scripts/createuser.c
+++ w/src/bin/scripts/createuser.c
@@ -39,6 +39,7 @@ main(int argc, char *argv[])
{"no-login", no_argument, NULL, 'L'},
{"replication", no_argument, NULL, 1},
{"no-replication", no_argument, NULL, 2},
+ {"interactive", no_argument, NULL, 3},
/* adduser is obsolete, undocumented spelling of superuser */
{"adduser", no_argument, NULL, 'a'},
{"no-adduser", no_argument, NULL, 'A'},
@@ -52,12 +53,13 @@ main(int argc, char *argv[])
const char *progname;
int optindex;
int c;
- char *newuser = NULL;
+ const char *newuser = NULL;
char *host = NULL;
char *port = NULL;
char *username = NULL;
enum trivalue prompt_password = TRI_DEFAULT;
bool echo = false;
+ bool interactive = false;
char *conn_limit = NULL;
bool pwprompt = false;
char *newpassword = NULL;
@@ -154,6 +156,9 @@ main(int argc, char *argv[])
case 2:
replication = TRI_NO;
break;
+ case 3:
+ interactive = true;
+ break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
@@ -175,7 +180,17 @@ main(int argc, char *argv[])
}
if (newuser == NULL)
- newuser = simple_prompt("Enter name of role to add: ", 128, true);
+ {
+ if (interactive)
+ newuser = simple_prompt("Enter name of role to add: ", 128, true);
+ else
+ {
+ if (getenv("PGUSER"))
+ newuser = getenv("PGUSER");
+ else
+ newuser = get_user_name(progname);
+ }
+ }
if (pwprompt)
{
@@ -195,7 +210,7 @@ main(int argc, char *argv[])
if (superuser == 0)
{
- if (yesno_prompt("Shall the new role be a superuser?"))
+ if (interactive && yesno_prompt("Shall the new role be a superuser?"))
superuser = TRI_YES;
else
superuser = TRI_NO;
@@ -210,7 +225,7 @@ main(int argc, char *argv[])
if (createdb == 0)
{
- if (yesno_prompt("Shall the new role be allowed to create databases?"))
+ if (interactive && yesno_prompt("Shall the new role be allowed to create databases?"))
createdb = TRI_YES;
else
createdb = TRI_NO;
@@ -218,7 +233,7 @@ main(int argc, char *argv[])
if (createrole == 0)
{
- if (yesno_prompt("Shall the new role be allowed to create more new roles?"))
+ if (interactive && yesno_prompt("Shall the new role be allowed to create more new roles?"))
createrole = TRI_YES;
else
createrole = TRI_NO;
@@ -315,20 +330,22 @@ help(const char *progname)
printf(_("\nOptions:\n"));
printf(_(" -c, --connection-limit=N connection limit for role (default: no limit)\n"));
printf(_(" -d, --createdb role can create new databases\n"));
- printf(_(" -D, --no-createdb role cannot create databases\n"));
+ printf(_(" -D, --no-createdb role cannot create databases (default)\n"));
printf(_(" -e, --echo show the commands being sent to the server\n"));
printf(_(" -E, --encrypted encrypt stored password\n"));
printf(_(" -i, --inherit role inherits privileges of roles it is a\n"
" member of (default)\n"));
printf(_(" -I, --no-inherit role does not inherit privileges\n"));
+ printf(_(" --interactive prompt for missing role name and attributes rather\n"
+ " than using defaults\n"));
printf(_(" -l, --login role can login (default)\n"));
printf(_(" -L, --no-login role cannot login\n"));
printf(_(" -N, --unencrypted do not encrypt stored password\n"));
printf(_(" -P, --pwprompt assign a password to new role\n"));
printf(_(" -r, --createrole role can create new roles\n"));
- printf(_(" -R, --no-createrole role cannot create roles\n"));
+ printf(_(" -R, --no-createrole role cannot create roles (default)\n"));
printf(_(" -s, --superuser role will be superuser\n"));
- printf(_(" -S, --no-superuser role will not be superuser\n"));
+ printf(_(" -S, --no-superuser role will not be superuser (default)\n"));
printf(_(" --replication role can initiate replication\n"));
printf(_(" --no-replication role cannot initiate replication\n"));
printf(_(" --help show this help, then exit\n"));
@@ -339,7 +356,5 @@ help(const char *progname)
printf(_(" -U, --username=USERNAME user name to connect as (not the one to create)\n"));
printf(_(" -w, --no-password never prompt for password\n"));
printf(_(" -W, --password force password prompt\n"));
- printf(_("\nIf one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
- "be prompted interactively.\n"));
printf(_("\nReport bugs to <[email protected]>.\n"));
}
diff --git i/src/bin/scripts/dropuser.c w/src/bin/scripts/dropuser.c
index bfd5b1c..15fe834 100644
--- i/src/bin/scripts/dropuser.c
+++ w/src/bin/scripts/dropuser.c
@@ -106,7 +106,16 @@ main(int argc, char *argv[])
}
if (dropuser == NULL)
- dropuser = simple_prompt("Enter name of role to drop: ", 128, true);
+ {
+ if (interactive)
+ dropuser = simple_prompt("Enter name of role to drop: ", 128, true);
+ else
+ {
+ fprintf(stderr, _("%s: missing required argument role name\n"), progname);
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+ exit(1);
+ }
+ }
if (interactive)
{
@@ -147,7 +156,8 @@ help(const char *progname)
printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
printf(_("\nOptions:\n"));
printf(_(" -e, --echo show the commands being sent to the server\n"));
- printf(_(" -i, --interactive prompt before deleting anything\n"));
+ printf(_(" -i, --interactive prompt before deleting anything, and prompt for\n"
+ " role name if not specified\n"));
printf(_(" --if-exists don't report error if user doesn't exist\n"));
printf(_(" --help show this help, then exit\n"));
printf(_(" --version output version information, then exit\n"));
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers