]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/home/homectl.c
homectl: allow --setenv=FOO
[thirdparty/systemd.git] / src / home / homectl.c
index d3dbf2d534c13fec0959d91db4d1ddde7372e37c..a4c0a47ce56bebd60ace8355e3b54671543cef5f 100644 (file)
@@ -2033,143 +2033,143 @@ static int help(int argc, char *argv[], void *userdata) {
         printf("%1$s [OPTIONS...] COMMAND ...\n\n"
                "%2$sCreate, manipulate or inspect home directories.%3$s\n"
                "\n%4$sCommands:%5$s\n"
-               "  list                        List home areas\n"
-               "  activate USER…              Activate a home area\n"
-               "  deactivate USER…            Deactivate a home area\n"
-               "  inspect USER…               Inspect a home area\n"
-               "  authenticate USER…          Authenticate a home area\n"
-               "  create USER                 Create a home area\n"
-               "  remove USER…                Remove a home area\n"
-               "  update USER                 Update a home area\n"
-               "  passwd USER                 Change password of a home area\n"
-               "  resize USER SIZE            Resize a home area\n"
-               "  lock USER…                  Temporarily lock an active home area\n"
-               "  unlock USER…                Unlock a temporarily locked home area\n"
-               "  lock-all                    Lock all suitable home areas\n"
-               "  deactivate-all              Deactivate all active home areas\n"
-               "  with USER [COMMAND…]        Run shell or command with access to a home area\n"
+               "  list                         List home areas\n"
+               "  activate USER…               Activate a home area\n"
+               "  deactivate USER…             Deactivate a home area\n"
+               "  inspect USER…                Inspect a home area\n"
+               "  authenticate USER…           Authenticate a home area\n"
+               "  create USER                  Create a home area\n"
+               "  remove USER…                 Remove a home area\n"
+               "  update USER                  Update a home area\n"
+               "  passwd USER                  Change password of a home area\n"
+               "  resize USER SIZE             Resize a home area\n"
+               "  lock USER…                   Temporarily lock an active home area\n"
+               "  unlock USER…                 Unlock a temporarily locked home area\n"
+               "  lock-all                     Lock all suitable home areas\n"
+               "  deactivate-all               Deactivate all active home areas\n"
+               "  with USER [COMMAND…]         Run shell or command with access to a home area\n"
                "\n%4$sOptions:%5$s\n"
-               "  -h --help                   Show this help\n"
-               "     --version                Show package version\n"
-               "     --no-pager               Do not pipe output into a pager\n"
-               "     --no-legend              Do not show the headers and footers\n"
-               "     --no-ask-password        Do not ask for system passwords\n"
-               "  -H --host=[USER@]HOST       Operate on remote host\n"
-               "  -M --machine=CONTAINER      Operate on local container\n"
-               "     --identity=PATH          Read JSON identity from file\n"
-               "     --json=FORMAT            Output inspection data in JSON (takes one of\n"
-               "                              pretty, short, off)\n"
-               "  -j                          Equivalent to --json=pretty (on TTY) or\n"
-               "                              --json=short (otherwise)\n"
-               "     --export-format=         Strip JSON inspection data (full, stripped,\n"
-               "                              minimal)\n"
-               "  -E                          When specified once equals -j --export-format=\n"
-               "                              stripped, when specified twice equals\n"
-               "                              -j --export-format=minimal\n"
+               "  -h --help                    Show this help\n"
+               "     --version                 Show package version\n"
+               "     --no-pager                Do not pipe output into a pager\n"
+               "     --no-legend               Do not show the headers and footers\n"
+               "     --no-ask-password         Do not ask for system passwords\n"
+               "  -H --host=[USER@]HOST        Operate on remote host\n"
+               "  -M --machine=CONTAINER       Operate on local container\n"
+               "     --identity=PATH           Read JSON identity from file\n"
+               "     --json=FORMAT             Output inspection data in JSON (takes one of\n"
+               "                               pretty, short, off)\n"
+               "  -j                           Equivalent to --json=pretty (on TTY) or\n"
+               "                               --json=short (otherwise)\n"
+               "     --export-format=          Strip JSON inspection data (full, stripped,\n"
+               "                               minimal)\n"
+               "  -E                           When specified once equals -j --export-format=\n"
+               "                               stripped, when specified twice equals\n"
+               "                               -j --export-format=minimal\n"
                "\n%4$sGeneral User Record Properties:%5$s\n"
-               "  -c --real-name=REALNAME     Real name for user\n"
-               "     --realm=REALM            Realm to create user in\n"
-               "     --email-address=EMAIL    Email address for user\n"
-               "     --location=LOCATION      Set location of user on earth\n"
-               "     --icon-name=NAME         Icon name for user\n"
-               "  -d --home-dir=PATH          Home directory\n"
-               "  -u --uid=UID                Numeric UID for user\n"
-               "  -G --member-of=GROUP        Add user to group\n"
-               "     --skel=PATH              Skeleton directory to use\n"
-               "     --shell=PATH             Shell for account\n"
-               "     --setenv=VARIABLE=VALUE  Set an environment variable at log-in\n"
-               "     --timezone=TIMEZONE      Set a time-zone\n"
-               "     --language=LOCALE        Set preferred language\n"
+               "  -c --real-name=REALNAME      Real name for user\n"
+               "     --realm=REALM             Realm to create user in\n"
+               "     --email-address=EMAIL     Email address for user\n"
+               "     --location=LOCATION       Set location of user on earth\n"
+               "     --icon-name=NAME          Icon name for user\n"
+               "  -d --home-dir=PATH           Home directory\n"
+               "  -u --uid=UID                 Numeric UID for user\n"
+               "  -G --member-of=GROUP         Add user to group\n"
+               "     --skel=PATH               Skeleton directory to use\n"
+               "     --shell=PATH              Shell for account\n"
+               "     --setenv=VARIABLE[=VALUE] Set an environment variable at log-in\n"
+               "     --timezone=TIMEZONE       Set a time-zone\n"
+               "     --language=LOCALE         Set preferred language\n"
                "     --ssh-authorized-keys=KEYS\n"
-               "                              Specify SSH public keys\n"
-               "     --pkcs11-token-uri=URI   URI to PKCS#11 security token containing\n"
-               "                              private key and matching X.509 certificate\n"
-               "     --fido2-device=PATH      Path to FIDO2 hidraw device with hmac-secret\n"
-               "                              extension\n"
+               "                               Specify SSH public keys\n"
+               "     --pkcs11-token-uri=URI    URI to PKCS#11 security token containing\n"
+               "                               private key and matching X.509 certificate\n"
+               "     --fido2-device=PATH       Path to FIDO2 hidraw device with hmac-secret\n"
+               "                               extension\n"
                "     --fido2-with-client-pin=BOOL\n"
-               "                              Whether to require entering a PIN to unlock the\n"
-               "                              account\n"
+               "                               Whether to require entering a PIN to unlock the\n"
+               "                               account\n"
                "     --fido2-with-user-presence=BOOL\n"
-               "                              Whether to require user presence to unlock the\n"
-               "                              account\n"
+               "                               Whether to require user presence to unlock the\n"
+               "                               account\n"
                "     --fido2-with-user-verification=BOOL\n"
-               "                              Whether to require user verification to unlock the\n"
-               "                              account\n"
-               "     --recovery-key=BOOL      Add a recovery key\n"
-               "\n%4$sAccount Management User Record Properties:%5$s\n"
-               "     --locked=BOOL            Set locked account state\n"
-               "     --not-before=TIMESTAMP   Do not allow logins before\n"
-               "     --not-after=TIMESTAMP    Do not allow logins after\n"
+               "                               Whether to require user verification to unlock\n"
+               "                               the account\n"
+               "     --recovery-key=BOOL       Add a recovery key\n"
+               "\n%4$sAccount Management User  Record Properties:%5$s\n"
+               "     --locked=BOOL             Set locked account state\n"
+               "     --not-before=TIMESTAMP    Do not allow logins before\n"
+               "     --not-after=TIMESTAMP     Do not allow logins after\n"
                "     --rate-limit-interval=SECS\n"
-               "                              Login rate-limit interval in seconds\n"
+               "                               Login rate-limit interval in seconds\n"
                "     --rate-limit-burst=NUMBER\n"
-               "                              Login rate-limit attempts per interval\n"
+               "                               Login rate-limit attempts per interval\n"
                "\n%4$sPassword Policy User Record Properties:%5$s\n"
-               "     --password-hint=HINT     Set Password hint\n"
+               "     --password-hint=HINT      Set Password hint\n"
                "     --enforce-password-policy=BOOL\n"
-               "                              Control whether to enforce system's password\n"
-               "                              policy for this user\n"
-               "  -P                          Equivalent to --enforce-password-password=no\n"
+               "                               Control whether to enforce system's password\n"
+               "                               policy for this user\n"
+               "  -P                           Same as --enforce-password-password=no\n"
                "     --password-change-now=BOOL\n"
-               "                              Require the password to be changed on next login\n"
+               "                               Require the password to be changed on next login\n"
                "     --password-change-min=TIME\n"
-               "                              Require minimum time between password changes\n"
+               "                               Require minimum time between password changes\n"
                "     --password-change-max=TIME\n"
-               "                              Require maximum time between password changes\n"
+               "                               Require maximum time between password changes\n"
                "     --password-change-warn=TIME\n"
-               "                              How much time to warn before password expiry\n"
+               "                               How much time to warn before password expiry\n"
                "     --password-change-inactive=TIME\n"
-               "                              How much time to block password after expiry\n"
+               "                               How much time to block password after expiry\n"
                "\n%4$sResource Management User Record Properties:%5$s\n"
-               "     --disk-size=BYTES        Size to assign the user on disk\n"
-               "     --access-mode=MODE       User home directory access mode\n"
-               "     --umask=MODE             Umask for user when logging in\n"
-               "     --nice=NICE              Nice level for user\n"
+               "     --disk-size=BYTES         Size to assign the user on disk\n"
+               "     --access-mode=MODE        User home directory access mode\n"
+               "     --umask=MODE              Umask for user when logging in\n"
+               "     --nice=NICE               Nice level for user\n"
                "     --rlimit=LIMIT=VALUE[:VALUE]\n"
-               "                              Set resource limits\n"
-               "     --tasks-max=MAX          Set maximum number of per-user tasks\n"
-               "     --memory-high=BYTES      Set high memory threshold in bytes\n"
-               "     --memory-max=BYTES       Set maximum memory limit\n"
-               "     --cpu-weight=WEIGHT      Set CPU weight\n"
-               "     --io-weight=WEIGHT       Set IO weight\n"
+               "                               Set resource limits\n"
+               "     --tasks-max=MAX           Set maximum number of per-user tasks\n"
+               "     --memory-high=BYTES       Set high memory threshold in bytes\n"
+               "     --memory-max=BYTES        Set maximum memory limit\n"
+               "     --cpu-weight=WEIGHT       Set CPU weight\n"
+               "     --io-weight=WEIGHT        Set IO weight\n"
                "\n%4$sStorage User Record Properties:%5$s\n"
-               "     --storage=STORAGE        Storage type to use (luks, fscrypt, directory,\n"
-               "                              subvolume, cifs)\n"
-               "     --image-path=PATH        Path to image file/directory\n"
+               "     --storage=STORAGE         Storage type to use (luks, fscrypt, directory,\n"
+               "                               subvolume, cifs)\n"
+               "     --image-path=PATH         Path to image file/directory\n"
                "\n%4$sLUKS Storage User Record Properties:%5$s\n"
-               "     --fs-type=TYPE           File system type to use in case of luks\n"
-               "                              storage (btrfs, ext4, xfs)\n"
-               "     --luks-discard=BOOL      Whether to use 'discard' feature of file system\n"
-               "                              when activated (mounted)\n"
+               "     --fs-type=TYPE            File system type to use in case of luks\n"
+               "                               storage (btrfs, ext4, xfs)\n"
+               "     --luks-discard=BOOL       Whether to use 'discard' feature of file system\n"
+               "                               when activated (mounted)\n"
                "     --luks-offline-discard=BOOL\n"
-               "                              Whether to trim file on logout\n"
-               "     --luks-cipher=CIPHER     Cipher to use for LUKS encryption\n"
-               "     --luks-cipher-mode=MODE  Cipher mode to use for LUKS encryption\n"
+               "                               Whether to trim file on logout\n"
+               "     --luks-cipher=CIPHER      Cipher to use for LUKS encryption\n"
+               "     --luks-cipher-mode=MODE   Cipher mode to use for LUKS encryption\n"
                "     --luks-volume-key-size=BITS\n"
-               "                              Volume key size to use for LUKS encryption\n"
-               "     --luks-pbkdf-type=TYPE   Password-based Key Derivation Function to use\n"
+               "                               Volume key size to use for LUKS encryption\n"
+               "     --luks-pbkdf-type=TYPE    Password-based Key Derivation Function to use\n"
                "     --luks-pbkdf-hash-algorithm=ALGORITHM\n"
-               "                              PBKDF hash algorithm to use\n"
+               "                               PBKDF hash algorithm to use\n"
                "     --luks-pbkdf-time-cost=SECS\n"
-               "                              Time cost for PBKDF in seconds\n"
+               "                               Time cost for PBKDF in seconds\n"
                "     --luks-pbkdf-memory-cost=BYTES\n"
-               "                              Memory cost for PBKDF in bytes\n"
+               "                               Memory cost for PBKDF in bytes\n"
                "     --luks-pbkdf-parallel-threads=NUMBER\n"
-               "                              Number of parallel threads for PKBDF\n"
+               "                               Number of parallel threads for PKBDF\n"
                "\n%4$sMounting User Record Properties:%5$s\n"
-               "     --nosuid=BOOL            Control the 'nosuid' flag of the home mount\n"
-               "     --nodev=BOOL             Control the 'nodev' flag of the home mount\n"
-               "     --noexec=BOOL            Control the 'noexec' flag of the home mount\n"
+               "     --nosuid=BOOL             Control the 'nosuid' flag of the home mount\n"
+               "     --nodev=BOOL              Control the 'nodev' flag of the home mount\n"
+               "     --noexec=BOOL             Control the 'noexec' flag of the home mount\n"
                "\n%4$sCIFS User Record Properties:%5$s\n"
-               "     --cifs-domain=DOMAIN     CIFS (Windows) domain\n"
-               "     --cifs-user-name=USER    CIFS (Windows) user name\n"
-               "     --cifs-service=SERVICE   CIFS (Windows) service to mount as home area\n"
+               "     --cifs-domain=DOMAIN      CIFS (Windows) domain\n"
+               "     --cifs-user-name=USER     CIFS (Windows) user name\n"
+               "     --cifs-service=SERVICE    CIFS (Windows) service to mount as home area\n"
                "\n%4$sLogin Behaviour User Record Properties:%5$s\n"
-               "     --stop-delay=SECS        How long to leave user services running after\n"
-               "                              logout\n"
-               "     --kill-processes=BOOL    Whether to kill user processes when sessions\n"
-               "                              terminate\n"
-               "     --auto-login=BOOL        Try to log this user in automatically\n"
+               "     --stop-delay=SECS         How long to leave user services running after\n"
+               "                               logout\n"
+               "     --kill-processes=BOOL     Whether to kill user processes when sessions\n"
+               "                               terminate\n"
+               "     --auto-login=BOOL         Try to log this user in automatically\n"
                "\nSee the %6$s for details.\n",
                program_invocation_short_name,
                ansi_highlight(),
@@ -2673,10 +2673,6 @@ static int parse_argv(int argc, char *argv[]) {
                                 break;
                         }
 
-                        if (!env_assignment_is_valid(optarg))
-                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                                       "Environment assignment '%s' not valid.", optarg);
-
                         e = json_variant_by_key(arg_identity_extra, "environment");
                         if (e) {
                                 r = json_variant_strv(e, &l);
@@ -2684,9 +2680,9 @@ static int parse_argv(int argc, char *argv[]) {
                                         return log_error_errno(r, "Failed to parse JSON environment field: %m");
                         }
 
-                        r = strv_env_replace_strdup(&l, optarg);
+                        r = strv_env_replace_strdup_passthrough(&l, optarg);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to replace JSON environment field: %m");
+                                return log_error_errno(r, "Cannot assign environment variable %s: %m", optarg);
 
                         strv_sort(l);