c2756a68401102786be343712c0c35acbd73d28dLennart Poettering This file is part of systemd.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering Copyright 2013 Lennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering systemd is free software; you can redistribute it and/or modify it
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering under the terms of the GNU Lesser General Public License as published by
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering (at your option) any later version.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering systemd is distributed in the hope that it will be useful, but
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering Lesser General Public License for more details.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering You should have received a copy of the GNU Lesser General Public License
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poetteringstatic bool arg_remain_after_exit = false;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poetteringstatic const char *arg_description = NULL;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poetteringstatic BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic const char *arg_service_type = NULL;
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poetteringstatic const char *arg_on_calendar = NULL;
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchaginstatic void polkit_agent_open_if_enabled(void) {
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin /* Open the polkit agent as a child process if necessary */
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (arg_transport != BUS_TRANSPORT_LOCAL)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho printf("%s [OPTIONS...] {COMMAND} [ARGS...]\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "Run the specified command in a transient scope or service or timer\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "unit. If timer option is specified and unit is exist which is\n"
cd32b977facd20145f570efbfdf541ffc2780c4eZbigniew Jędrzejewski-Szmek "specified with --unit option then command can be omitted.\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -h --help Show this help\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --version Show package version\n"
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin " --no-ask-password Do not prompt for password\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --user Run as user unit\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -H --host=[USER@]HOST Operate on remote host\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -M --machine=CONTAINER Operate on local container\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --scope Run this as scope rather than service\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --unit=UNIT Run under the specified unit name\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -p --property=NAME=VALUE Set unit property\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --description=TEXT Description for unit\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --slice=SLICE Run in the specified slice\n"
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering " --no-block Do not wait until operation finished\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -r --remain-after-exit Leave service around until explicitly stopped\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --send-sighup Send SIGHUP when terminating\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --service-type=TYPE Service type\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --uid=USER Run as system user\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --gid=GROUP Run as system group\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --nice=NICE Nice level\n"
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering " --setenv=NAME=VALUE Set environment\n"
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering " -t --pty Run service on pseudo tty\n"
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering " -q --quiet Suppress information messages during runtime\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "Timer options:\n\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-active=SECONDS Run after SECONDS delay\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-boot=SECONDS Run SECONDS after machine was booted up\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-startup=SECONDS Run SECONDS after systemd activation\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-unit-active=SECONDS Run SECONDS after the last activation\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-unit-inactive=SECONDS Run SECONDS after the last deactivation\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --on-calendar=SPEC Realtime timer\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --timer-property=NAME=VALUE Set timer unit property\n",
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return arg_on_active || arg_on_boot || arg_on_startup || arg_on_unit_active || arg_on_unit_inactive || arg_on_calendar;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "description", required_argument, NULL, ARG_DESCRIPTION },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "slice", required_argument, NULL, ARG_SLICE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "remain-after-exit", no_argument, NULL, 'r' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "send-sighup", no_argument, NULL, ARG_SEND_SIGHUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "service-type", required_argument, NULL, ARG_SERVICE_TYPE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "uid", required_argument, NULL, ARG_EXEC_USER },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "gid", required_argument, NULL, ARG_EXEC_GROUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "setenv", required_argument, NULL, ARG_SETENV },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-active", required_argument, NULL, ARG_ON_ACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-boot", required_argument, NULL, ARG_ON_BOOT },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-startup", required_argument, NULL, ARG_ON_STARTUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-unit-active", required_argument, NULL, ARG_ON_UNIT_ACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-unit-inactive", required_argument, NULL, ARG_ON_UNIT_INACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-calendar", required_argument, NULL, ARG_ON_CALENDAR },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "timer-property", required_argument, NULL, ARG_TIMER_PROPERTY },
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering { "no-block", no_argument, NULL, ARG_NO_BLOCK },
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering while ((c = getopt_long(argc, argv, "+hrH:M:p:tq", options, NULL)) >= 0)
1ac67edb7c4d31a287fa98c0b554ae98bd34e71bLennart Poettering if (r < 0 || arg_nice < PRIO_MIN || arg_nice >= PRIO_MAX) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (strv_extend(&arg_environment, optarg) < 0)
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering if (strv_extend(&arg_property, optarg) < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (strv_extend(&arg_timer_property, optarg) < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if ((optind >= argc) && (!arg_unit || !with_timer())) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering log_error("Command line to execute required.");
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering if (arg_user && arg_transport != BUS_TRANSPORT_LOCAL) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering log_error("Execution in user context is not supported on non-local systems.");
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering if (arg_scope && arg_transport != BUS_TRANSPORT_LOCAL) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering log_error("Scope execution is not supported on non-local systems.");
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (arg_scope && (arg_remain_after_exit || arg_service_type)) {
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering log_error("--remain-after-exit and --service-type= are not supported in --scope mode.");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (arg_pty && (with_timer() || arg_scope)) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering log_error("--pty is not compatible in timer or --scope mode.");
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering if (arg_pty && arg_transport == BUS_TRANSPORT_REMOTE) {
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering log_error("--pty is only supported when connecting to the local system or containers.");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Timer options are not supported in --scope mode.");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("--timer-property= has no effect without any other timer options.");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_unit_set_properties(sd_bus_message *m, char **properties) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "(sv)", "Description", "s", arg_description);
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering r = bus_append_unit_property_assignment(m, *i);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_cgroup_set_properties(sd_bus_message *m) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_slice, UNIT_NAME_NOGLOB, ".slice", &slice);
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Slice", "s", slice);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_kill_set_properties(sd_bus_message *m) {
aa1aad74e6b14730542c26a7c17c5d06c62b6089Zbigniew Jędrzejewski-Szmek return sd_bus_message_append(m, "(sv)", "SendSIGHUP", "b", arg_send_sighup);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_service_set_properties(sd_bus_message *m, char **argv, const char *pty_path) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_property);
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering r = sd_bus_message_append(m, "(sv)", "RemainAfterExit", "b", arg_remain_after_exit);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Type", "s", arg_service_type);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "User", "s", arg_exec_user);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Group", "s", arg_exec_group);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Nice", "i", arg_nice);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering const char *e;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "(sv)(sv)(sv)(sv)",
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_open_container(m, 'r', "sv");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "s", "Environment");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_open_container(m, 'v', "as");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append_strv(m, arg_environment);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho /* Exec container */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'r', "sv");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'v', "a(sasb)");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sasb)");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'r', "sasb");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_scope_set_properties(sd_bus_message *m) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_property);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "(sv)", "PIDs", "au", 1, (uint32_t) getpid());
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic int transient_timer_set_properties(sd_bus_message *m) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_timer_property);
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering /* Automatically clean up our transient timers */
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering r = sd_bus_message_append(m, "(sv)", "RemainAfterElapse", "b", false);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnActiveSec", "t", arg_on_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnBootSec", "t", arg_on_boot);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnStartupSec", "t", arg_on_startup);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnUnitActiveSec", "t", arg_on_unit_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnUnitInactiveSec", "t", arg_on_unit_inactive);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnCalendar", "s", arg_on_calendar);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poetteringstatic int make_unit_name(sd_bus *bus, UnitType t, char **ret) {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = sd_bus_get_unique_name(bus, &unique);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering /* We couldn't get the unique name, which is a pretty
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * common case if we are connected to systemd
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * directly. In that case, just pick a random uuid as
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_error_errno(r, "Failed to generate random run unit name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (asprintf(ret, "run-r" SD_ID128_FORMAT_STR ".%s", SD_ID128_FORMAT_VAL(rnd), unit_type_to_string(t)) < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering /* We managed to get the unique name, then let's use that to
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * name our transient units. */
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering log_error("Unique name %s has unexpected format.", unique);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering p = strjoin("run-u", id, ".", unit_type_to_string(t), NULL);
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering _cleanup_free_ char *service = NULL, *pty_path = NULL;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (arg_transport == BUS_TRANSPORT_LOCAL) {
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering master = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(errno, "Failed to acquire pseudo tty: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(r, "Failed to determine tty name: %m");
395745ba533ac91fe118f43ec83f13a752c0b473Lennart Poettering return log_error_errno(errno, "Failed to unlock tty: %m");
de33fc625725d199629ed074d6278504deb23debLennart Poettering } else if (arg_transport == BUS_TRANSPORT_MACHINE) {
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_unrefp) sd_bus *system_bus = NULL;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering const char *s;
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering return log_error_errno(r, "Failed to connect to system bus: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "org.freedesktop.machine1",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "org.freedesktop.machine1.Manager",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "OpenMachinePTY",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to get machine PTY: %s", bus_error_message(&error, -r));
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = sd_bus_message_read(reply, "hs", &master, &s);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering master = fcntl(master, F_DUPFD_CLOEXEC, 3);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(errno, "Failed to duplicate master fd: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering assert_not_reached("Can't allocate tty via ssh");
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering return log_error_errno(r, "Could not watch jobs: %m");
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SERVICE, &service);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "org.freedesktop.systemd1.Manager",
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "StartTransientUnit");
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and mode */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "ss", service, "fail");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_service_set_properties(m, argv, pty_path);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Auxiliary units */
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering return log_error_errno(r, "Failed to start transient service unit: %s", bus_error_message(&error, r));
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = sd_bus_message_read(reply, "o", &object);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_event_unrefp) sd_event *event = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to get event loop: %m");
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering (void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering (void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering log_info("Running as unit %s.\nPress ^] three times within 1s to disconnect TTY.", service);
ae3dde801253b1d5f7363bb9fb06bcb230f00eb8Lennart Poettering r = pty_forward_new(event, master, PTY_FORWARD_IGNORE_INITIAL_VHANGUP, &forward);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to create PTY forwarder: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to run event loop: %m");
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering pty_forward_get_last_char(forward, &last_char);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering log_info("Running as unit %s.", service);
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_strv_free_ char **env = NULL, **user_env = NULL;
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".scope", &scope);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle scope name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SCOPE, &scope);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1.Manager",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StartTransientUnit");
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and Mode */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "ss", scope, "fail");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sv)");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering /* Auxiliary units */
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to start transient scope unit: %s", bus_error_message(&error, -r));
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (setpriority(PRIO_PROCESS, 0, arg_nice) < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to set nice level: %m");
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = get_group_creds(&arg_exec_group, &gid);
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt return log_error_errno(r, "Failed to resolve group %s: %m", arg_exec_group);
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change GID to " GID_FMT ": %m", gid);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = get_user_creds(&arg_exec_user, &uid, &gid, &home, &shell);
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt return log_error_errno(r, "Failed to resolve user %s: %m", arg_exec_user);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "HOME=%s", home);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "SHELL=%s", shell);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "USER=%s", arg_exec_user);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "LOGNAME=%s", arg_exec_user);
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change GID to " GID_FMT ": %m", gid);
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change UID to " UID_FMT ": %m", uid);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering env = strv_env_merge(3, environ, user_env, arg_environment);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_message_read(reply, "o", &object);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Running scope as unit %s.", scope);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(errno, "Failed to execute: %m");
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_free_ char *timer = NULL, *service = NULL;
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_change_suffix(service, ".timer", &timer);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_change_suffix(timer, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".timer", &timer);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SERVICE, &service);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = unit_name_change_suffix(service, ".timer", &timer);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1.Manager",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StartTransientUnit");
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and Mode */
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "ss", timer, "fail");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sa(sv))");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'r', "sa(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "s", service);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_service_set_properties(m, argv, NULL);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to start transient timer unit: %s", bus_error_message(&error, -r));
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_message_read(reply, "o", &object);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Running timer as unit %s.", timer);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Will run service as unit %s.", service);
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
c9d954b27ee125c3c90a6d2951c62eec4abb160bZbigniew Jędrzejewski-Szmek _cleanup_free_ char *description = NULL, *command = NULL;
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering if (argc > optind && arg_transport == BUS_TRANSPORT_LOCAL) {
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering /* Patch in an absolute path */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering log_error_errno(r, "Failed to find executable %s: %m", argv[optind]);
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering description = strv_join(argv + optind, " ");
266f3e269d173f104aa2a5e3ceac9b6979ea5039Lennart Poettering r = bus_connect_transport_systemd(arg_transport, arg_host, arg_user, &bus);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Failed to create bus connection: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_scope(bus, argv + optind);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_timer(bus, argv + optind);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_service(bus, argv + optind);