Merge pull request #1528 from evverx/systemd-run-syslog-pri-fac
systemd-run can launch units with SyslogLevel and SyslogFacility
This commit is contained in:
@@ -83,7 +83,8 @@ _systemd_run() {
|
||||
LimitMEMLOCK= LimitLOCKS= LimitSIGPENDING= LimitMSGQUEUE=
|
||||
LimitNICE= LimitRTPRIO= LimitRTTIME= PrivateTmp= PrivateDevices=
|
||||
PrivateNetwork= NoNewPrivileges= WorkingDirectory= RootDirectory=
|
||||
TTYPath= SyslogIdentifier= SyslogLevelPrefix='
|
||||
TTYPath= SyslogIdentifier= SyslogLevelPrefix= SyslogLevel=
|
||||
SyslogFacility='
|
||||
|
||||
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
||||
return 0
|
||||
|
||||
@@ -3699,6 +3699,10 @@ static const char *const log_facility_unshifted_table[LOG_NFACILITIES] = {
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_facility_unshifted, int, LOG_FAC(~0));
|
||||
|
||||
bool log_facility_unshifted_is_valid(int facility) {
|
||||
return facility >= 0 && facility <= LOG_FAC(~0);
|
||||
}
|
||||
|
||||
static const char *const log_level_table[] = {
|
||||
[LOG_EMERG] = "emerg",
|
||||
[LOG_ALERT] = "alert",
|
||||
@@ -3712,6 +3716,10 @@ static const char *const log_level_table[] = {
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(log_level, int, LOG_DEBUG);
|
||||
|
||||
bool log_level_is_valid(int level) {
|
||||
return level >= 0 && level <= LOG_DEBUG;
|
||||
}
|
||||
|
||||
static const char* const sched_policy_table[] = {
|
||||
[SCHED_OTHER] = "other",
|
||||
[SCHED_BATCH] = "batch",
|
||||
|
||||
@@ -456,9 +456,11 @@ int sigchld_code_from_string(const char *s) _pure_;
|
||||
|
||||
int log_facility_unshifted_to_string_alloc(int i, char **s);
|
||||
int log_facility_unshifted_from_string(const char *s);
|
||||
bool log_facility_unshifted_is_valid(int faciliy);
|
||||
|
||||
int log_level_to_string_alloc(int i, char **s);
|
||||
int log_level_from_string(const char *s);
|
||||
bool log_level_is_valid(int level);
|
||||
|
||||
int sched_policy_to_string_alloc(int i, char **s);
|
||||
int sched_policy_from_string(const char *s);
|
||||
|
||||
@@ -880,6 +880,38 @@ int bus_exec_context_set_transient_property(
|
||||
unit_write_drop_in_private_format(u, mode, name, "SyslogIdentifier=%s\n", id);
|
||||
}
|
||||
|
||||
return 1;
|
||||
} else if (streq(name, "SyslogLevel")) {
|
||||
int level;
|
||||
|
||||
r = sd_bus_message_read(message, "i", &level);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!log_level_is_valid(level))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Log level value out of range");
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->syslog_priority = (c->syslog_priority & LOG_FACMASK) | level;
|
||||
unit_write_drop_in_private_format(u, mode, name, "SyslogLevel=%i\n", level);
|
||||
}
|
||||
|
||||
return 1;
|
||||
} else if (streq(name, "SyslogFacility")) {
|
||||
int facility;
|
||||
|
||||
r = sd_bus_message_read(message, "i", &facility);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!log_facility_unshifted_is_valid(facility))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Log facility value out of range");
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->syslog_priority = (facility << 3) | LOG_PRI(c->syslog_priority);
|
||||
unit_write_drop_in_private_format(u, mode, name, "SyslogFacility=%i\n", facility);
|
||||
}
|
||||
|
||||
return 1;
|
||||
} else if (streq(name, "Nice")) {
|
||||
int n;
|
||||
|
||||
+23
-1
@@ -1497,7 +1497,29 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
|
||||
"RootDirectory", "SyslogIdentifier"))
|
||||
r = sd_bus_message_append(m, "v", "s", eq);
|
||||
|
||||
else if (streq(field, "DeviceAllow")) {
|
||||
else if (streq(field, "SyslogLevel")) {
|
||||
int level;
|
||||
|
||||
level = log_level_from_string(eq);
|
||||
if (level < 0) {
|
||||
log_error("Failed to parse %s value %s.", field, eq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
r = sd_bus_message_append(m, "v", "i", level);
|
||||
|
||||
} else if (streq(field, "SyslogFacility")) {
|
||||
int facility;
|
||||
|
||||
facility = log_facility_unshifted_from_string(eq);
|
||||
if (facility < 0) {
|
||||
log_error("Failed to parse %s value %s.", field, eq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
r = sd_bus_message_append(m, "v", "i", facility);
|
||||
|
||||
} else if (streq(field, "DeviceAllow")) {
|
||||
|
||||
if (isempty(eq))
|
||||
r = sd_bus_message_append(m, "v", "a(ss)", 0);
|
||||
|
||||
Reference in New Issue
Block a user