mirror of
https://github.com/systemd/systemd
synced 2024-10-02 22:37:25 +00:00
units: make templates for quotaon and systemd-quotacheck service
This commit is contained in:
parent
9bb89a55a2
commit
fc5c6eccb4
|
@ -84,8 +84,10 @@
|
||||||
#define SPECIAL_FSCK_SERVICE "systemd-fsck@.service"
|
#define SPECIAL_FSCK_SERVICE "systemd-fsck@.service"
|
||||||
#define SPECIAL_FSCK_ROOT_SERVICE "systemd-fsck-root.service"
|
#define SPECIAL_FSCK_ROOT_SERVICE "systemd-fsck-root.service"
|
||||||
#define SPECIAL_FSCK_USR_SERVICE "systemd-fsck-usr.service"
|
#define SPECIAL_FSCK_USR_SERVICE "systemd-fsck-usr.service"
|
||||||
#define SPECIAL_QUOTACHECK_SERVICE "systemd-quotacheck.service"
|
#define SPECIAL_QUOTACHECK_SERVICE "systemd-quotacheck@.service"
|
||||||
#define SPECIAL_QUOTAON_SERVICE "quotaon.service"
|
#define SPECIAL_QUOTACHECK_ROOT_SERVICE "systemd-quotacheck-root.service"
|
||||||
|
#define SPECIAL_QUOTAON_SERVICE "quotaon@.service"
|
||||||
|
#define SPECIAL_QUOTAON_ROOT_SERVICE "quotaon-root.service"
|
||||||
#define SPECIAL_REMOUNT_FS_SERVICE "systemd-remount-fs.service"
|
#define SPECIAL_REMOUNT_FS_SERVICE "systemd-remount-fs.service"
|
||||||
#define SPECIAL_VOLATILE_ROOT_SERVICE "systemd-volatile-root.service"
|
#define SPECIAL_VOLATILE_ROOT_SERVICE "systemd-volatile-root.service"
|
||||||
#define SPECIAL_UDEVD_SERVICE "systemd-udevd.service"
|
#define SPECIAL_UDEVD_SERVICE "systemd-udevd.service"
|
||||||
|
|
|
@ -171,19 +171,6 @@ static bool mount_propagate_stop(Mount *m) {
|
||||||
* otherwise let's not bother. */
|
* otherwise let's not bother. */
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mount_needs_quota(const MountParameters *p) {
|
|
||||||
assert(p);
|
|
||||||
|
|
||||||
if (p->fstype && !fstype_needs_quota(p->fstype))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (mount_is_bind(p))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return fstab_test_option(p->options,
|
|
||||||
"usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mount_init(Unit *u) {
|
static void mount_init(Unit *u) {
|
||||||
Mount *m = MOUNT(u);
|
Mount *m = MOUNT(u);
|
||||||
|
|
||||||
|
@ -420,35 +407,6 @@ static int mount_add_device_dependencies(Mount *m) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mount_add_quota_dependencies(Mount *m) {
|
|
||||||
MountParameters *p;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(m);
|
|
||||||
|
|
||||||
if (!MANAGER_IS_SYSTEM(UNIT(m)->manager))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
p = get_mount_parameters_fragment(m);
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!mount_needs_quota(p))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE,
|
|
||||||
/* add_reference= */ true, UNIT_DEPENDENCY_FILE);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE,
|
|
||||||
/* add_reference= */true, UNIT_DEPENDENCY_FILE);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mount_is_extrinsic(Unit *u) {
|
static bool mount_is_extrinsic(Unit *u) {
|
||||||
MountParameters *p;
|
MountParameters *p;
|
||||||
Mount *m = MOUNT(u);
|
Mount *m = MOUNT(u);
|
||||||
|
@ -663,10 +621,6 @@ static int mount_add_non_exec_dependencies(Mount *m) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = mount_add_quota_dependencies(m);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = mount_add_default_dependencies(m);
|
r = mount_add_default_dependencies(m);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -46,6 +46,7 @@ typedef enum MountPointFlags {
|
||||||
MOUNT_GROWFS = 1 << 4,
|
MOUNT_GROWFS = 1 << 4,
|
||||||
MOUNT_RW_ONLY = 1 << 5,
|
MOUNT_RW_ONLY = 1 << 5,
|
||||||
MOUNT_PCRFS = 1 << 6,
|
MOUNT_PCRFS = 1 << 6,
|
||||||
|
MOUNT_QUOTA = 1 << 7,
|
||||||
} MountPointFlags;
|
} MountPointFlags;
|
||||||
|
|
||||||
typedef struct Mount {
|
typedef struct Mount {
|
||||||
|
@ -717,6 +718,18 @@ static int add_mount(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & MOUNT_QUOTA) {
|
||||||
|
r = generator_hook_up_quotacheck(dest, what, where, target_unit, fstype);
|
||||||
|
if (r < 0) {
|
||||||
|
if (r != -EOPNOTSUPP)
|
||||||
|
return r;
|
||||||
|
} else {
|
||||||
|
r = generator_hook_up_quotaon(dest, where, target_unit);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (FLAGS_SET(flags, MOUNT_AUTOMOUNT)) {
|
if (FLAGS_SET(flags, MOUNT_AUTOMOUNT)) {
|
||||||
r = unit_name_from_path(where, ".automount", &automount_name);
|
r = unit_name_from_path(where, ".automount", &automount_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -858,6 +871,8 @@ static MountPointFlags fstab_options_to_flags(const char *options, bool is_swap)
|
||||||
flags |= MOUNT_GROWFS;
|
flags |= MOUNT_GROWFS;
|
||||||
if (fstab_test_option(options, "x-systemd.pcrfs\0"))
|
if (fstab_test_option(options, "x-systemd.pcrfs\0"))
|
||||||
flags |= MOUNT_PCRFS;
|
flags |= MOUNT_PCRFS;
|
||||||
|
if (fstab_test_option(options, "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0" "prjquota\0"))
|
||||||
|
flags |= MOUNT_QUOTA;
|
||||||
if (fstab_test_yes_no_option(options, "noauto\0" "auto\0"))
|
if (fstab_test_yes_no_option(options, "noauto\0" "auto\0"))
|
||||||
flags |= MOUNT_NOAUTO;
|
flags |= MOUNT_NOAUTO;
|
||||||
if (fstab_test_yes_no_option(options, "nofail\0" "fail\0"))
|
if (fstab_test_yes_no_option(options, "nofail\0" "fail\0"))
|
||||||
|
@ -1210,7 +1225,7 @@ static int add_sysroot_mount(void) {
|
||||||
fstype,
|
fstype,
|
||||||
opts,
|
opts,
|
||||||
is_device_path(what) ? 1 : 0, /* passno */
|
is_device_path(what) ? 1 : 0, /* passno */
|
||||||
flags, /* makefs off, pcrfs off, noauto off, nofail off, automount off */
|
flags, /* makefs off, pcrfs off, quota off, noauto off, nofail off, automount off */
|
||||||
SPECIAL_INITRD_ROOT_FS_TARGET);
|
SPECIAL_INITRD_ROOT_FS_TARGET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,14 @@ static void test_files(void) {
|
||||||
|
|
||||||
static int run(int argc, char *argv[]) {
|
static int run(int argc, char *argv[]) {
|
||||||
int r;
|
int r;
|
||||||
|
_cleanup_free_ char *fspath = NULL;
|
||||||
|
bool quota_check_all = false;
|
||||||
|
|
||||||
log_setup();
|
log_setup();
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 2)
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
"This program takes no arguments.");
|
"This program expects one or no arguments.");
|
||||||
|
|
||||||
umask(0022);
|
umask(0022);
|
||||||
|
|
||||||
|
@ -79,13 +81,22 @@ static int run(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argc == 2) {
|
||||||
|
fspath = strdup(argv[1]);
|
||||||
|
if (!fspath)
|
||||||
|
return log_oom();
|
||||||
|
} else
|
||||||
|
quota_check_all = true;
|
||||||
|
|
||||||
r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_RLIMIT_NOFILE_SAFE|FORK_WAIT|FORK_LOG, NULL);
|
r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_RLIMIT_NOFILE_SAFE|FORK_WAIT|FORK_LOG, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
static const char * const cmdline[] = {
|
const char *cmdline[] = {
|
||||||
QUOTACHECK,
|
QUOTACHECK,
|
||||||
"-anug",
|
quota_check_all ? "-anug" : "-nug",
|
||||||
|
fspath,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "mkdir-label.h"
|
#include "mkdir-label.h"
|
||||||
|
#include "mountpoint-util.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "special.h"
|
#include "special.h"
|
||||||
|
@ -708,6 +709,77 @@ int generator_hook_up_pcrfs(
|
||||||
return generator_add_symlink_full(dir, where_unit, "wants", pcrfs_unit_path, instance);
|
return generator_add_symlink_full(dir, where_unit, "wants", pcrfs_unit_path, instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int generator_hook_up_quotacheck(
|
||||||
|
const char *dir,
|
||||||
|
const char *what,
|
||||||
|
const char *where,
|
||||||
|
const char *target,
|
||||||
|
const char *fstype) {
|
||||||
|
|
||||||
|
_cleanup_free_ char *where_unit = NULL, *instance = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(dir);
|
||||||
|
assert(where);
|
||||||
|
|
||||||
|
if (isempty(fstype) || streq(fstype, "auto"))
|
||||||
|
return log_warning_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Couldn't determine filesystem type for %s, quota cannot be activated", what);
|
||||||
|
if (!fstype_needs_quota(fstype))
|
||||||
|
return log_warning_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Quota was requested for %s, but not supported, ignoring: %s", what, fstype);
|
||||||
|
|
||||||
|
/* quotacheck unit for system root */
|
||||||
|
if (path_equal(where, "/"))
|
||||||
|
return generator_add_symlink(dir, SPECIAL_LOCAL_FS_TARGET, "wants", SYSTEM_DATA_UNIT_DIR "/" SPECIAL_QUOTACHECK_ROOT_SERVICE);
|
||||||
|
|
||||||
|
r = unit_name_path_escape(where, &instance);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to escape path '%s': %m", where);
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
r = generator_add_ordering(dir, target, "After", SPECIAL_QUOTACHECK_SERVICE, instance);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = unit_name_from_path(where, ".mount", &where_unit);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to make unit name from path '%s': %m", where);
|
||||||
|
|
||||||
|
return generator_add_symlink_full(dir, where_unit, "wants", SYSTEM_DATA_UNIT_DIR "/" SPECIAL_QUOTACHECK_SERVICE, instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
int generator_hook_up_quotaon(
|
||||||
|
const char *dir,
|
||||||
|
const char *where,
|
||||||
|
const char *target) {
|
||||||
|
|
||||||
|
_cleanup_free_ char *where_unit = NULL, *instance = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(dir);
|
||||||
|
assert(where);
|
||||||
|
|
||||||
|
/* quotaon unit for system root is not instantiated */
|
||||||
|
if (path_equal(where, "/"))
|
||||||
|
return generator_add_symlink(dir, SPECIAL_LOCAL_FS_TARGET, "wants", SYSTEM_DATA_UNIT_DIR "/" SPECIAL_QUOTAON_ROOT_SERVICE);
|
||||||
|
|
||||||
|
r = unit_name_path_escape(where, &instance);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to escape path '%s': %m", where);
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
r = generator_add_ordering(dir, target, "After", SPECIAL_QUOTAON_SERVICE, instance);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = unit_name_from_path(where, ".mount", &where_unit);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to make unit name from path '%s': %m", where);
|
||||||
|
|
||||||
|
return generator_add_symlink_full(dir, where_unit, "wants", SYSTEM_DATA_UNIT_DIR "/" SPECIAL_QUOTAON_SERVICE, instance);
|
||||||
|
}
|
||||||
|
|
||||||
int generator_enable_remount_fs_service(const char *dir) {
|
int generator_enable_remount_fs_service(const char *dir) {
|
||||||
/* Pull in systemd-remount-fs.service */
|
/* Pull in systemd-remount-fs.service */
|
||||||
return generator_add_symlink(dir, SPECIAL_LOCAL_FS_TARGET, "wants",
|
return generator_add_symlink(dir, SPECIAL_LOCAL_FS_TARGET, "wants",
|
||||||
|
|
|
@ -85,6 +85,16 @@ int generator_hook_up_pcrfs(
|
||||||
const char *dir,
|
const char *dir,
|
||||||
const char *where,
|
const char *where,
|
||||||
const char *target);
|
const char *target);
|
||||||
|
int generator_hook_up_quotacheck(
|
||||||
|
const char *dir,
|
||||||
|
const char *what,
|
||||||
|
const char *where,
|
||||||
|
const char *target,
|
||||||
|
const char *fstype);
|
||||||
|
int generator_hook_up_quotaon(
|
||||||
|
const char *dir,
|
||||||
|
const char *where,
|
||||||
|
const char *target);
|
||||||
|
|
||||||
int generator_enable_remount_fs_service(const char *dir);
|
int generator_enable_remount_fs_service(const char *dir);
|
||||||
|
|
||||||
|
|
|
@ -161,7 +161,11 @@ units = [
|
||||||
'conditions' : ['ENABLE_BINFMT'],
|
'conditions' : ['ENABLE_BINFMT'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'file' : 'quotaon.service.in',
|
'file' : 'quotaon@.service.in',
|
||||||
|
'conditions' : ['ENABLE_QUOTACHECK'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'file' : 'quotaon-root.service.in',
|
||||||
'conditions' : ['ENABLE_QUOTACHECK'],
|
'conditions' : ['ENABLE_QUOTACHECK'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -552,7 +556,11 @@ units = [
|
||||||
'conditions' : ['ENABLE_PSTORE'],
|
'conditions' : ['ENABLE_PSTORE'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'file' : 'systemd-quotacheck.service.in',
|
'file' : 'systemd-quotacheck@.service.in',
|
||||||
|
'conditions' : ['ENABLE_QUOTACHECK'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'file' : 'systemd-quotacheck-root.service.in',
|
||||||
'conditions' : ['ENABLE_QUOTACHECK'],
|
'conditions' : ['ENABLE_QUOTACHECK'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
24
units/quotaon-root.service.in
Normal file
24
units/quotaon-root.service.in
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Enable Root File System Quotas
|
||||||
|
Documentation=man:quotaon(8)
|
||||||
|
|
||||||
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
|
DefaultDependencies=no
|
||||||
|
After=systemd-quotacheck-root.service
|
||||||
|
Before=local-fs.target shutdown.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart={{QUOTAON}} -ug /
|
|
@ -12,13 +12,15 @@ Description=Enable File System Quotas
|
||||||
Documentation=man:quotaon(8)
|
Documentation=man:quotaon(8)
|
||||||
|
|
||||||
ConditionPathExists={{QUOTAON}}
|
ConditionPathExists={{QUOTAON}}
|
||||||
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
|
After=%i.mount
|
||||||
|
After=systemd-quotacheck@%i.service
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=systemd-quotacheck.service
|
|
||||||
Before=remote-fs.target
|
|
||||||
Before=shutdown.target
|
Before=shutdown.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart={{QUOTAON}} -aug
|
ExecStart={{QUOTAON}} -ug %f
|
|
@ -14,7 +14,7 @@ Documentation=man:systemd-journald.service(8) man:journald.conf(5)
|
||||||
ConditionPathExists=!/etc/initrd-release
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=systemd-remount-fs.service
|
After=systemd-remount-fs.service systemd-quotacheck-root.service
|
||||||
Before=systemd-tmpfiles-setup.service
|
Before=systemd-tmpfiles-setup.service
|
||||||
Wants=systemd-journald.service
|
Wants=systemd-journald.service
|
||||||
After=systemd-journald.service
|
After=systemd-journald.service
|
||||||
|
|
25
units/systemd-quotacheck-root.service.in
Normal file
25
units/systemd-quotacheck-root.service.in
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Root File System Quota Check
|
||||||
|
Documentation=man:systemd-quotacheck.service(8)
|
||||||
|
|
||||||
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
|
DefaultDependencies=no
|
||||||
|
After=systemd-remount-fs.service
|
||||||
|
Before=local-fs.target shutdown.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart={{LIBEXECDIR}}/systemd-quotacheck /
|
||||||
|
TimeoutSec=infinity
|
|
@ -12,14 +12,15 @@ Description=File System Quota Check
|
||||||
Documentation=man:systemd-quotacheck.service(8)
|
Documentation=man:systemd-quotacheck.service(8)
|
||||||
|
|
||||||
ConditionPathExists={{QUOTACHECK}}
|
ConditionPathExists={{QUOTACHECK}}
|
||||||
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=systemd-remount-fs.service
|
After=%i.mount
|
||||||
Before=remote-fs.target
|
|
||||||
Before=shutdown.target
|
Before=shutdown.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart={{LIBEXECDIR}}/systemd-quotacheck
|
ExecStart={{LIBEXECDIR}}/systemd-quotacheck %f
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
Loading…
Reference in a new issue