summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Warczarek <jakub.warczarek@gmail.com>2021-04-23 20:41:45 +0200
committerLennart Poettering <lennart@poettering.net>2021-05-03 20:19:19 +0200
commit572c55ee3cbeb2a7ed4600aec2530ffa7e7a3a87 (patch)
tree11fc1bd4badb1d99a83f6f57b2c69d43b5058b38
parentcore: apply LogLevelMax to messages about units (diff)
downloadsystemd-572c55ee3cbeb2a7ed4600aec2530ffa7e7a3a87.tar.xz
systemd-572c55ee3cbeb2a7ed4600aec2530ffa7e7a3a87.zip
hostnamectl: deprecate set-* methods and expose getters by only using nouns in commands
-rw-r--r--man/hostnamectl.xml67
-rw-r--r--shell-completion/bash/hostnamectl6
-rw-r--r--shell-completion/zsh/_hostnamectl30
-rw-r--r--src/hostname/hostnamectl.c82
4 files changed, 96 insertions, 89 deletions
diff --git a/man/hostnamectl.xml b/man/hostnamectl.xml
index ed2dabef3b..51f83d1cd6 100644
--- a/man/hostnamectl.xml
+++ b/man/hostnamectl.xml
@@ -63,14 +63,16 @@
<varlistentry>
<term><command>status</command></term>
- <listitem><para>Show current system hostname and related information. If no command is specified,
+ <listitem><para>Show system hostname and related information. If no command is specified,
this is the implied default.</para></listitem>
</varlistentry>
<varlistentry>
- <term><command>set-hostname <replaceable>NAME</replaceable></command></term>
+ <term><command>hostname</command> [<replaceable>NAME</replaceable>]</term>
- <listitem><para>Set the system hostname to <replaceable>NAME</replaceable>. By default, this will alter the
+ <listitem><para>If no argument is given, print the system hostname. If an
+ optional argument <replaceable>NAME</replaceable> is provided then the command changes the
+ system hostname to <replaceable>NAME</replaceable>. By default, this will alter the
pretty, the static, and the transient hostname alike; however, if one or more of <option>--static</option>,
<option>--transient</option>, <option>--pretty</option> are used, only the selected hostnames are changed. If
the pretty hostname is being set, and static or transient are being set as well, the specified hostname will be
@@ -82,35 +84,29 @@
<para>The static and transient hostnames must each be either a single DNS label (a string composed of
7-bit ASCII lower-case characters and no spaces or dots, limited to the format allowed for DNS domain
name labels), or a sequence of such labels separated by single dots that forms a valid DNS FQDN. The
- hostname must be at most 64 characters, which is a Linux limitation (DNS allows longer names).</para>
-
- <para>Pass the empty string <literal></literal> as the hostname to reset the selected hostnames to
- their default (usually <literal>&FALLBACK_HOSTNAME;</literal>).</para></listitem>
+ hostname must be at most 64 characters, which is a Linux limitation (DNS allows longer names).</para></listitem>
</varlistentry>
<varlistentry>
- <term><command>set-icon-name <replaceable>NAME</replaceable></command></term>
+ <term><command>icon-name</command> [<replaceable>NAME</replaceable>]</term>
- <listitem><para>Set the system icon name to
- <replaceable>NAME</replaceable>. The icon name is used by some
+ <listitem><para>If no argument is given, print the icon name of the system. If an
+ optional argument <replaceable>NAME</replaceable> is provided then the command changes the
+ icon name to <replaceable>NAME</replaceable>. The icon name is used by some
graphical applications to visualize this host. The icon name
should follow the <ulink
url="http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html">Icon
- Naming Specification</ulink>.</para>
-
- <para>Pass an empty string to reset the icon name to the
- default value, which is determined from chassis type (see
- below) and possibly other parameters.</para></listitem>
+ Naming Specification</ulink>.</para></listitem>
</varlistentry>
<varlistentry>
- <term><command>set-chassis <replaceable>TYPE</replaceable></command></term>
+ <term><command>chassis</command> [<replaceable>TYPE</replaceable>]</term>
- <listitem><para>Set the chassis type to
- <replaceable>TYPE</replaceable>. The chassis type is used by
- some graphical applications to visualize the host or alter
- user interaction. Currently, the following chassis types are
- defined:
+ <listitem><para>If no argument is given, print the chassis type. If an
+ optional argument <replaceable>TYPE</replaceable> is provided then the command changes the
+ chassis type to <replaceable>TYPE</replaceable>. The chassis type is used by
+ some graphical applications to visualize the host or alter user interaction.
+ Currently, the following chassis types are defined:
<literal>desktop</literal>,
<literal>laptop</literal>,
<literal>convertible</literal>,
@@ -123,43 +119,36 @@
<literal>vm</literal> and
<literal>container</literal> for virtualized systems that lack
an immediate physical chassis.</para>
-
- <para>Pass an empty string to reset the chassis type to the
- default value which is determined from the firmware and
- possibly other parameters.</para>
</listitem>
</varlistentry>
<varlistentry>
- <term><command>set-deployment <replaceable>ENVIRONMENT</replaceable></command></term>
+ <term><command>deployment</command> [<replaceable>ENVIRONMENT</replaceable>]</term>
- <listitem><para>Set the deployment environment description.
- <replaceable>ENVIRONMENT</replaceable> must be a single word
- without any control characters. One of the following is
- suggested:
+ <listitem><para>If no argument is given, print the deployment environment. If an
+ optional argument <replaceable>ENVIRONMENT</replaceable> is provided then the command changes the
+ deployment environment to <replaceable>ENVIRONMENT</replaceable>.
+ Argument <replaceable>ENVIRONMENT</replaceable>
+ must be a single word without any control characters. One of the following is suggested:
<literal>development</literal>,
<literal>integration</literal>,
<literal>staging</literal>,
<literal>production</literal>.
</para>
-
- <para>Pass an empty string to reset to the default empty
- value.</para>
</listitem>
</varlistentry>
<varlistentry>
- <term><command>set-location <replaceable>LOCATION</replaceable></command></term>
+ <term><command>location</command> [<replaceable>LOCATION</replaceable>]</term>
- <listitem><para>Set the location string for the system, if it
- is known. <replaceable>LOCATION</replaceable> should be a
+ <listitem><para>If no argument is given, print the location string for the system. If an
+ optional argument <replaceable>LOCATION</replaceable> is provided then the command changes the
+ location string for the system to <replaceable>LOCATION</replaceable>.
+ Argument <replaceable>LOCATION</replaceable> should be a
human-friendly, free-form string describing the physical
location of the system, if it is known and applicable. This
may be as generic as <literal>Berlin, Germany</literal> or as
specific as <literal>Left Rack, 2nd Shelf</literal>.</para>
-
- <para>Pass an empty string to reset to the default empty
- value.</para>
</listitem>
</varlistentry>
</variablelist>
diff --git a/shell-completion/bash/hostnamectl b/shell-completion/bash/hostnamectl
index e3765c315c..5c8d3975d7 100644
--- a/shell-completion/bash/hostnamectl
+++ b/shell-completion/bash/hostnamectl
@@ -38,9 +38,9 @@ _hostnamectl() {
local -A VERBS=(
[STANDALONE]='status'
- [ICONS]='set-icon-name'
- [NAME]='set-hostname set-deployment set-location'
- [CHASSIS]='set-chassis'
+ [ICONS]='icon-name'
+ [NAME]='hostname deployment location'
+ [CHASSIS]='chassis'
)
for ((i=0; i < COMP_CWORD; i++)); do
diff --git a/shell-completion/zsh/_hostnamectl b/shell-completion/zsh/_hostnamectl
index d05c46bd43..2a6bf4d125 100644
--- a/shell-completion/zsh/_hostnamectl
+++ b/shell-completion/zsh/_hostnamectl
@@ -1,8 +1,8 @@
#compdef hostnamectl -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
-(( $+functions[_hostnamectl_set-hostname] )) ||
-_hostnamectl_set-hostname() {
+(( $+functions[_hostnamectl_hostname] )) ||
+_hostnamectl_hostname() {
if (( CURRENT <= 3 )); then
_message "new hostname"
else
@@ -10,8 +10,8 @@ _hostnamectl_set-hostname() {
fi
}
-(( $+functions[_hostnamectl_set-icon-name] )) ||
-_hostnamectl_set-icon-name() {
+(( $+functions[_hostnamectl_icon-name] )) ||
+_hostnamectl_icon-name() {
if (( CURRENT <= 3 )); then
_message "new icon name"
else
@@ -19,8 +19,8 @@ _hostnamectl_set-icon-name() {
fi
}
-(( $+functions[_hostnamectl_set-chassis] )) ||
-_hostnamectl_set-chassis() {
+(( $+functions[_hostnamectl_chassis] )) ||
+_hostnamectl_chassis() {
if (( CURRENT <= 3 )); then
_chassis=( desktop laptop convertible server tablet handset watch embedded vm container )
_describe chassis _chassis
@@ -29,8 +29,8 @@ _hostnamectl_set-chassis() {
fi
}
-(( $+functions[_hostnamectl_set-deployment] )) ||
-_hostnamectl_set-deployment() {
+(( $+functions[_hostnamectl_deployment] )) ||
+_hostnamectl_deployment() {
if (( CURRENT <= 3 )); then
_message "new environment"
else
@@ -38,8 +38,8 @@ _hostnamectl_set-deployment() {
fi
}
-(( $+functions[_hostnamectl_set-location] )) ||
-_hostnamectl_set-location() {
+(( $+functions[_hostnamectl_location] )) ||
+_hostnamectl_location() {
if (( CURRENT <= 3 )); then
_message "new location"
else
@@ -52,11 +52,11 @@ _hostnamectl_commands() {
local -a _hostnamectl_cmds
_hostnamectl_cmds=(
"status:Show current hostname settings"
- "set-hostname:Set system hostname"
- "set-icon-name:Set icon name for host"
- "set-chassis:Set chassis type for host"
- "set-deployment:Set deployment environment for host"
- "set-location:Set location for host"
+ "hostname:Get/set system hostname"
+ "icon-name:Get/set icon name for host"
+ "chassis:Get/set chassis type for host"
+ "deployment:Get/set deployment environment for host"
+ "location:Get/set location for host"
)
if (( CURRENT == 1 )); then
_describe -t commands 'hostnamectl commands' _hostnamectl_cmds || compadd "$@"
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index 19c04869dd..852da6bb8e 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -318,6 +318,19 @@ static int show_all_names(sd_bus *bus) {
return print_status_info(&info);
}
+static int get_hostname_based_on_flag(sd_bus *bus) {
+ const char *attr;
+
+ if (!!arg_static + !!arg_pretty + !!arg_transient > 1)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Cannot query more than one name type at a time");
+
+ attr = arg_pretty ? "PrettyHostname" :
+ arg_static ? "StaticHostname" : "Hostname";
+
+ return get_one_name(bus, attr, NULL);
+}
+
static int show_status(int argc, char **argv, void *userdata) {
sd_bus *bus = userdata;
int r;
@@ -352,22 +365,13 @@ static int show_status(int argc, char **argv, void *userdata) {
return 0;
}
- if (arg_pretty || arg_static || arg_transient) {
- const char *attr;
-
- if (!!arg_static + !!arg_pretty + !!arg_transient > 1)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Cannot query more than one name type at a time");
-
- attr = arg_pretty ? "PrettyHostname" :
- arg_static ? "StaticHostname" : "Hostname";
-
- return get_one_name(bus, attr, NULL);
- }
+ if (arg_pretty || arg_static || arg_transient)
+ return get_hostname_based_on_flag(bus);
return show_all_names(bus);
}
+
static int set_simple_string_internal(sd_bus *bus, sd_bus_error *error, const char *target, const char *method, const char *value) {
_cleanup_(sd_bus_error_free) sd_bus_error e = SD_BUS_ERROR_NULL;
int r;
@@ -481,20 +485,29 @@ static int set_hostname(int argc, char **argv, void *userdata) {
return ret;
}
-static int set_icon_name(int argc, char **argv, void *userdata) {
- return set_simple_string(userdata, "icon", "SetIconName", argv[1]);
+static int get_or_set_hostname(int argc, char **argv, void *userdata) {
+ return argc == 1 ? get_hostname_based_on_flag(userdata) :
+ set_hostname(argc, argv, userdata);
+}
+
+static int get_or_set_icon_name(int argc, char **argv, void *userdata) {
+ return argc == 1 ? get_one_name(userdata, "IconName", NULL) :
+ set_simple_string(userdata, "icon", "SetIconName", argv[1]);
}
-static int set_chassis(int argc, char **argv, void *userdata) {
- return set_simple_string(userdata, "chassis", "SetChassis", argv[1]);
+static int get_or_set_chassis(int argc, char **argv, void *userdata) {
+ return argc == 1 ? get_one_name(userdata, "Chassis", NULL) :
+ set_simple_string(userdata, "chassis", "SetChassis", argv[1]);
}
-static int set_deployment(int argc, char **argv, void *userdata) {
- return set_simple_string(userdata, "deployment", "SetDeployment", argv[1]);
+static int get_or_set_deployment(int argc, char **argv, void *userdata) {
+ return argc == 1 ? get_one_name(userdata, "Deployment", NULL) :
+ set_simple_string(userdata, "deployment", "SetDeployment", argv[1]);
}
-static int set_location(int argc, char **argv, void *userdata) {
- return set_simple_string(userdata, "location", "SetLocation", argv[1]);
+static int get_or_set_location(int argc, char **argv, void *userdata) {
+ return argc == 1 ? get_one_name(userdata, "Location", NULL) :
+ set_simple_string(userdata, "location", "SetLocation", argv[1]);
}
static int help(void) {
@@ -509,11 +522,11 @@ static int help(void) {
"%sQuery or change system hostname.%s\n"
"\nCommands:\n"
" status Show current hostname settings\n"
- " set-hostname NAME Set system hostname\n"
- " set-icon-name NAME Set icon name for host\n"
- " set-chassis NAME Set chassis type for host\n"
- " set-deployment NAME Set deployment environment for host\n"
- " set-location NAME Set location for host\n"
+ " hostname [NAME] Get/set system hostname\n"
+ " icon-name [NAME] Get/set icon name for host\n"
+ " chassis [NAME] Get/set chassis type for host\n"
+ " deployment [NAME] Get/set deployment environment for host\n"
+ " location [NAME] Get/set location for host\n"
"\nOptions:\n"
" -h --help Show this help\n"
" --version Show package version\n"
@@ -623,13 +636,18 @@ static int parse_argv(int argc, char *argv[]) {
static int hostnamectl_main(sd_bus *bus, int argc, char *argv[]) {
static const Verb verbs[] = {
- { "status", VERB_ANY, 1, VERB_DEFAULT, show_status },
- { "set-hostname", 2, 2, 0, set_hostname },
- { "set-icon-name", 2, 2, 0, set_icon_name },
- { "set-chassis", 2, 2, 0, set_chassis },
- { "set-deployment", 2, 2, 0, set_deployment },
- { "set-location", 2, 2, 0, set_location },
- { "help", VERB_ANY, VERB_ANY, 0, verb_help }, /* Not documented, but supported since it is created. */
+ { "status", VERB_ANY, 1, VERB_DEFAULT, show_status },
+ { "hostname", VERB_ANY, 2, 0, get_or_set_hostname },
+ { "set-hostname", 2, 2, 0, get_or_set_hostname }, /* obsolete */
+ { "icon-name", VERB_ANY, 2, 0, get_or_set_icon_name },
+ { "set-icon-name", 2, 2, 0, get_or_set_icon_name }, /* obsolete */
+ { "chassis", VERB_ANY, 2, 0, get_or_set_chassis },
+ { "set-chassis", 2, 2, 0, get_or_set_chassis }, /* obsolete */
+ { "deployment", VERB_ANY, 2, 0, get_or_set_deployment },
+ { "set-deployment", 2, 2, 0, get_or_set_deployment }, /* obsolete */
+ { "location", VERB_ANY, 2, 0, get_or_set_location },
+ { "set-location", 2, 2, 0, get_or_set_location }, /* obsolete */
+ { "help", VERB_ANY, VERB_ANY, 0, verb_help }, /* Not documented, but supported since it is created. */
{}
};