Compare commits

..

69 Commits
0.14 ... 0.18.4

Author SHA1 Message Date
William Hubbs
1b9570d4c7 update ChangeLog 2015-12-01 11:56:51 -06:00
William Hubbs
a94de51c4e consolefont: add after modules to dependencies
X-Gentoo-Bug: 559540
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=559540
2015-11-30 12:26:37 -06:00
William Hubbs
ffbcabbbb4 Bump version to 0.18.4 2015-11-30 12:22:20 -06:00
William Hubbs
bc6ab0f8f3 update changelog 2015-10-14 17:46:55 -05:00
William Hubbs
248a7dcda3 mtab: typo fix 2015-10-14 17:43:31 -05:00
William Hubbs
bb451fd7b4 update ChangeLog 2015-10-14 17:05:33 -05:00
William Hubbs
fb23cbe204 mtab: make /etc/mtab as a file configurable 2015-10-14 16:00:08 -05:00
William Hubbs
a4346bb7f5 start work on 0.18.3 2015-10-14 15:59:52 -05:00
William Hubbs
776346e2cd update changelog 2015-10-13 17:49:03 -05:00
William Hubbs
ce71ffbfbe openrc-run.sh: fix new required_* tests to exit properly 2015-10-13 17:42:46 -05:00
William Hubbs
d9ee8ca584 update changelog 2015-10-13 16:29:15 -05:00
William Hubbs
4e44e2cd73 typo fix
X-Gentoo-Bug: 563010
X-Gentoo-Bug: https://bugs.gentoo.org/show_bug.cgi?id=563010
2015-10-13 16:27:35 -05:00
William Hubbs
88b807f9bc increment version number 2015-10-13 15:57:25 -05:00
William Hubbs
feba5d86b7 mountinfo: make sure the netdev variable is initialized on Linux
This fixes the following regression:

X-Gentoo-Bug: 562668
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562668
2015-10-13 09:10:47 -05:00
William Hubbs
3b1e96a6a3 openrc-run.sh: allow spaces in required_{files,dirs}
X-Gentoo-Bug: 562320
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562320
2015-10-13 09:10:47 -05:00
William Hubbs
79998bdf9c increment version number 2015-10-13 09:10:28 -05:00
William Hubbs
050ddfae4a Update ChangeLog 2015-10-08 13:33:27 -05:00
William Hubbs
d5116cc697 localmount: white space cleanup 2015-10-08 13:20:14 -05:00
Ian Stakenvicius
b86d170037 localmount: clean up handling of aufs branches
X-Gentoo-Bug: 560008
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=560008
2015-10-08 12:49:09 -05:00
William Hubbs
6fa0d6318b mtab: fix update logic
This advises users to remove mtab from their runlevels if /etc/mtab is a
symlink, and it creates the symlink if /etc/mtab does not exist on a
system.

X-Gentoo-Bug: 560060
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=560060
2015-10-07 11:35:31 -05:00
Austin S. Hemmelgarn
80d3928b0d cgroups: Add the hugetlb, net_cls and pids controllers
Note from WilliamH: I slightly rearranged the code and added the
settings in rc.conf.

X-Gentoo-Bug: 555488
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=555488
2015-10-06 15:05:35 -05:00
William Hubbs
17ef205bc6 sysfs: use printf instead of echo to write to cgroup files
This is needed for compatibility with musl and printf is also posix.

X-Gentoo-Bug: 562334
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562334
2015-10-06 13:31:43 -05:00
William Hubbs
b20a1951ad rc-cgroup.sh: Do not add leading spaces to cgroup values
We were starting the value we write to the cgroup setting file with
leading spaces and this was causing issues. This change makes sure that
we aren't adding leading spaces to the value.

X-Gentoo-Bug: 562354
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562354
2015-10-06 12:11:29 -05:00
William Hubbs
bf0c0dd564 bootmisc: convert errors in clean_run function to warnings
X-Gentoo-Bug: 552418
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=552418
2015-10-05 11:22:08 -05:00
William Hubbs
1558ad2b9e bootmisc: only remove temp directory if umount is successful
Change the clean_run function to only remove the temp directory if the
umount was successful.

X-Gentoo-Bug: 561230
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=561230
2015-10-05 11:08:11 -05:00
William Hubbs
5f4f242036 mountinfo: fix --netdev and --nonetdev on Linux
On Linux, the --netdev and --nonetdev switches were not working. They
were both returning false. After this change, they operate based on the
presence or abscence of the _netdev option in mount options.
2015-10-05 10:18:00 -05:00
William Hubbs
b3f7ff901f mountinfo: read /proc/self/mounts instead of /proc/mounts on Linux 2015-10-04 15:35:33 -05:00
William Hubbs
a59365a582 start-stop-daemon.sh: complain in start if command is undefined
The default start-stop-daemon start function expects the command
variable to be defined to point to the daemon we want to start.

If the variable is undefined, this means that there will be nothing to
start, and in this case we should complain because it is possible that
the script writer made a typo in the variable name.
2015-10-02 16:34:15 -05:00
William Hubbs
dac5966ca4 Revert "local/netmount: remove uses of -O [no]_netdev"
This reverts commit 2a439c85bd.
There is another use case for -O involving iscsi, so we can't remove it.
2015-10-01 17:33:43 -05:00
William Hubbs
3b6a6df4b5 openrc-run: rename some dependency variables and a function for clarity
All of the dependency type lists had the types_ prefix in their names;
this has been changed to deptypes_ to make them more self documenting.

Along the same lines, the setup_types function was renamed
setup_deptypes.
2015-09-17 15:02:30 -05:00
William Hubbs
b047ea47e9 localmount/netmount: on Linux, fail if some file systems do not mount
The following return codes are returned by mount -a:

0:  all file systems mounted.
32: no file systems mounted.
64: some file systems mounted.

The localmount/netmount services should fail if all file systems that
should mount did not mount.
2015-09-01 14:41:07 -05:00
William Hubbs
b652752339 Make localmount and netmount always succeed on non-linux 2015-08-21 12:21:31 -05:00
William Hubbs
2a439c85bd local/netmount: remove uses of -O [no]_netdev
This was causing an incompatibility with busybox, and we do not use it
in Gentoo.
2015-08-18 18:25:48 -05:00
William Hubbs
7341cd882f allow localmount and netmount to fail 2015-08-17 18:21:39 -05:00
Mike Frysinger
279f1e5d10 binfmt: fix indent on return 2015-08-10 18:50:10 -05:00
Doug Freed
c256a7aa80 savecache: clean up implementation
X-Gentoo-Bug: 557222
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=557222
2015-08-10 14:51:15 +00:00
Jason Zaman
6a42298257 tmpfiles: run restorecon on the entire path
The tmpfiles "d" entry will create a full path and only the last dir in
the path will have its SELinux label set correctly. This patch will
restorecon the parents as well so that the selinux labels are correct.

eg, "d /run/libvirt/lxc", then "lxc" would have the correct SELinux
label but "libvirt" would not.

Signed-off-by: Jason Zaman <jason@perfinion.com>
2015-08-03 12:51:16 -07:00
William Hubbs
f69833a1e1 mountinfo: fix -e and -E options
Add the -e and -E options to getoptstring so they are recognized.
2015-08-02 07:39:58 -05:00
William Hubbs
eeadca0b8a Add EERROR_QUIET and EINFO_QUIET to environment whitelist 2015-07-23 12:44:10 -05:00
William Hubbs
dde339070b Increment version 2015-07-10 13:25:43 -05:00
Doug Freed
1736be3bc3 savecache: Fix unable to create cache message
The cache is created in $RC_LIBEXECDIR, not $RC_SVCDIR, so fix the error
message when we fail to create it to match.
2015-07-10 13:24:10 -04:00
Mike Gilbert
a36a635b01 tmpfiles: Recognize type 'v' (create btrfs subvol)
This change does NOT implement btrfs subvol creation.  Instead, it
treats 'v' the same as 'd', which is an acceptable fallback
according to the manual.

Fixes #58
2015-06-24 22:40:35 -07:00
Mike Gilbert
9310ccc06b Remove execute bit from tmpfiles.sh.in 2015-06-24 22:40:02 -07:00
William Hubbs
0c2e4eb3cd Update ChangeLog 2015-06-19 09:55:37 -05:00
William Hubbs
d2ce07e227 Add rc-sstat script
The rc-sstat script is written to display status of s6 services and
run rc-status to display all services status.

This currently only works on Linux.
2015-06-10 18:45:29 -05:00
Mike Gilbert
b209fe3859 bootmisc: Don't call dmesg in systemd-nspawn containers
This fixes #57.
2015-06-02 13:11:04 -05:00
Mike Frysinger
c94c8288cd fix link to s6 website 2015-05-29 02:10:44 -04:00
Mike Gilbert
bcb9c44e73 man: Document the stopsig variable
This variable can be used to set the signal to send if the service is
using start-stop-daemon.

This fixes #56
2015-05-27 14:09:45 -05:00
William Hubbs
bbabf546f9 Document bash's handling of ulimit options
When bash is used in posix mode for the shell, the ulimit command uses
a block size of 512 bytes for the -c and -f options.

X-Gentoo-Bug: 549238
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=549238
2015-05-22 09:43:51 -05:00
William Hubbs
a7fcc1e264 S6: kick the scanner and sleep 1.5 seconds to avoid a race condition 2015-05-14 14:26:52 -05:00
William Hubbs
b79d058f16 s6: Use s6-svc -Dd to stop services
This allows us to get rid of the sleep call in the stop function. Also,
we set a configurable timeout value for stopping daemons.
2015-05-14 11:40:29 -05:00
William Hubbs
ddce529c71 More s6 fixes
- When no service link is in the scan directory, show the default
  stopped message.
- Do not remove the service link when stopping the service.
2015-05-13 16:51:55 -05:00
William Hubbs
e372f97beb Fix the s6 handling
This changes the default s6 service directory to /var/svc.d, also
it changes the code to work with the individual services instead of
forcing a rescan when a service is started or stopped.
2015-05-13 16:10:08 -05:00
William Hubbs
c2abf4b436 Start work on 0.17 2015-05-13 16:06:31 -05:00
William Hubbs
d247ac4cbb Update changelog 2015-05-11 18:43:15 -05:00
William Hubbs
bb2d7becfd Add support for the s6 supervision suite 2015-05-11 18:36:49 -05:00
William Hubbs
0f9354becf man: Clarify the documentation for command_args
The command_args variable only works if using start-stop-daemon to start
the daemon.
2015-05-11 15:37:30 -05:00
William Hubbs
a15fa1a3b1 Rework supervisor integration framework
The original way of doing this allowed users to change the supervisor in
conf.d/*. This changes this so that the supervisor setup can be done in
the service script itself.
2015-05-11 09:44:06 -05:00
William Hubbs
0198affc74 The rc_supervisor variable is a service configuration variable
This variable should not be changed globally unless you really know what
you are doing.
2015-05-08 12:29:26 -05:00
William Hubbs
abef2fcb2d Make the default start, stop and status functions overridable
This will make it possible to add support for supervision suites such as
runit and s6.
2015-05-08 11:39:39 -05:00
Jakob Drexel
0b435ddd83 librc: Fix crash if the service name is the same as the including runlevel
If a service has the same name as the runlevel it is in, openrc will
crash on changing to such runlevel. It goes in a recursive madness and
eventually gets a SEGV while in snprintf (don't know why).

This fixes two errors:
1. ls_dir stats files not with full path -> stat always returns != 0
2. ls_dir adds files to list if stat failed

This fixes #53.

X-Gentoo-Bug: 537304
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=537304
2015-05-04 09:54:51 -05:00
William Hubbs
9f6427ea57 Start work on 0.16 2015-05-01 19:02:49 -05:00
William Hubbs
60488069c0 update ChangeLog 2015-05-01 16:08:24 -05:00
William Hubbs
9225bfa691 Build: make snapshot remove .git directory from tarball 2015-05-01 10:14:31 -05:00
Mike Gilbert
7bd456ed7b Disable service scripts for systemd-nspawn
This adds the -systemd-nspawn keyword to service scripts which are not
intended to run in systemd-nspawn containers.

This fixes #52.

    X-Gentoo-Bug: 548058
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=548058
2015-05-01 09:14:09 -05:00
William Hubbs
c709e6077c Add support for systemd-nspawn containers
This adds support for running OpenRC in a container created by
the systemd-nspawn utility.

This fixes #52.

X-Gentoo-Bug: 548058
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=548058
2015-05-01 09:04:07 -05:00
William Hubbs
a27d577da8 Build: fix the dist target
The dist target now creates an archive based on the version setting.
This makes it possible to create an archive identical to the ones github
generates once the release is tagged.
2015-04-30 14:45:42 -05:00
William Hubbs
8b93492086 convert all references from runscript to openrc-run 2015-04-27 11:21:29 -05:00
William Hubbs
4b1b457cd1 Start work on 0.15 2015-04-26 10:30:49 -05:00
60 changed files with 1342 additions and 1094 deletions

1467
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
NAME= openrc
VERSION= 0.14
VERSION= 0.18.4
PKG= ${NAME}-${VERSION}

34
NEWS.md
View File

@@ -3,6 +3,40 @@
This file will contain a list of notable changes for each release. Note
the information in this file is in reverse order.
## OpenRC-0.18.3
Modern Linux systems expect /etc/mtab to be a symbolic link to
/proc/self/mounts. Reasons for this change include support for mount
namespaces, which will not work if /etc/mtab is a file.
By default, the mtab service enforces this on each reboot.
If you find that this breaks your system in some way, please do the
following:
- Set mtab_is_file=yes in /etc/conf.d/mtab.
- Restart mtab. This will recreate the /etc/mtab file.
- Check for an issue on https://github.com/openrc/openrc/issues
explaining why you need /etc/mtab to be a file. If there isn't one,
please open one and explain in detail why you need this to be a file.
If there is one, please add your comments to it. Please give concrete
examples of why it is important that /etc/mtab be a file instead of a
symbolic link. Those comments will be taken into consideration for how
long to keep supporting mtab as a file or when the support can be
removed.
## OpenRC-0.18
The behaviour of localmount and netmount in this version is changing. In
the past, these services always started successfully. In this version,
they will be able to fail if file systems they mount fail to mount. If
you have file systems listed in fstab which should not be mounted at
boot time, make sure to add noauto to the mount options. If you have
file systems that you want to attempt to mount at boot time but failure
should be allowed, add nofail to the mount options for these file
systems in fstab.
## OpenRC-0.14
The binfmt service, which registers misc binary formats with the Linux

View File

@@ -15,7 +15,7 @@ include ${MK}/os.mk
CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules mtab
CONF-NetBSD= moused rarpd savecore

5
conf.d/mtab Normal file
View File

@@ -0,0 +1,5 @@
# This setting controls whether /etc/mtab is a file or symbolic link.
# Most of the time, you shouldn't touch this. However, if the default
# breaks your system in some way, please see the NEWS.md file that comes
# with OpenRC for the actions to take.
# mtab_is_file=no

View File

@@ -2,14 +2,15 @@
# LINUX SPECIFIC OPTIONS
# This is the subsystem type. Valid options on Linux:
# "" - nothing special
# "lxc" - Linux Containers
# "openvz" - Linux OpenVZ
# "prefix" - Prefix
# "uml" - Usermode Linux
# "vserver" - Linux vserver
# "xen0" - Xen0 Domain
# "xenU" - XenU Domain
# "" - nothing special
# "lxc" - Linux Containers
# "openvz" - Linux OpenVZ
# "prefix" - Prefix
# "uml" - Usermode Linux
# "vserver" - Linux vserver
# "systemd-nspawn" - Container created by the systemd-nspawn utility
# "xen0" - Xen0 Domain
# "xenU" - XenU Domain
# If this is commented out, automatic detection will be used.
#
# This should be set to the value representing the environment this file is
@@ -61,12 +62,21 @@ rc_tty_number=12
# Set the devices controller settings for this service.
#rc_cgroup_devices=""
# Set the hugetlb controller settings for this service.
#rc_cgroup_hugetlb=""
# Set the memory controller settings for this service.
#rc_cgroup_memory=""
# Set the net_cls controller settings for this service.
#rc_cgroup_net_cls=""
# Set the net_prio controller settings for this service.
#rc_cgroup_net_prio=""
# Set the pids controller settings for this service.
#rc_cgroup_pids=""
# Set this to YES if yu want all of the processes in a service's cgroup
# killed when the service is stopped or restarted.
# This should not be set globally because it kills all of the service's

View File

@@ -116,6 +116,9 @@
#SSD_NICELEVEL="-19"
# Pass ulimit parameters
# If you are using bash in POSIX mode for your shell, note that the
# ulimit command uses a block size of 512 bytes for the -c and -f
# options
#rc_ulimit="-u 30"
# It's possible to define extra dependencies for services like so

View File

@@ -3,7 +3,7 @@ include ../mk/net.mk
DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \
tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
tmpfiles.setup.in swclock.in sysctl.in urandom.in s6-svscan.in ${SRCS-${OS}}
BIN= ${OBJS}
# Are we installing our network scripts?

View File

@@ -8,7 +8,7 @@ depend()
{
after procfs
use modules devfs
keyword -openvz -prefix -vserver -lxc
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()
@@ -16,5 +16,5 @@ start()
ebegin "Loading custom binary format handlers"
"$RC_LIBEXECDIR"/sh/binfmt.sh
eend $?
return 0
return 0
}

View File

@@ -121,11 +121,11 @@ clean_run()
local dir
# If / is still read-only due to a problem, this will fail!
if ! checkpath -W /; then
eerror "/ is not writable; unable to clean up underlying /run"
ewarn "/ is not writable; unable to clean up underlying /run"
return 1
fi
if ! checkpath -W /tmp; then
eerror "/tmp is not writable; unable to clean up underlying /run"
ewarn "/tmp is not writable; unable to clean up underlying /run"
return 1
fi
# Now we know that we can modify /tmp and /
@@ -136,13 +136,12 @@ clean_run()
dir=$(mktemp -d)
if [ -n "$dir" -a -d $dir -a -w $dir ]; then
mount --bind / $dir && rm -rf $dir/run/* || rc=1
umount $dir
rm -rf $dir
umount $dir && rmdir $dir
else
rc=1
fi
if [ $rc -ne 0 ]; then
eerror "Could not clean up underlying /run on /"
ewarn "Could not clean up underlying /run on /"
return 1
fi
}
@@ -214,10 +213,13 @@ start()
if yesno $log_dmesg; then
if $logw || checkpath -W /var/log; then
# Create an 'after-boot' dmesg log
if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ -a "$RC_SYS" != LXC ]; then
dmesg > /var/log/dmesg
chmod 640 /var/log/dmesg
fi
case "$RC_SYS" in
VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;;
*)
dmesg > /var/log/dmesg
chmod 640 /var/log/dmesg
;;
esac
fi
fi

View File

@@ -7,8 +7,8 @@ description="Sets a font for the consoles."
depend()
{
need localmount termencoding
after hotplug bootmisc
keyword -openvz -prefix -uml -vserver -xenu -lxc
after hotplug bootmisc modules
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
}
start()

View File

@@ -8,7 +8,7 @@ depend()
{
provide dev-mount
before dev
keyword -prefix -vserver -lxc
keyword -prefix -systemd-nspawn -vserver -lxc
}
mount_dev()

View File

@@ -7,7 +7,7 @@ description="Set the dmesg level for a cleaner boot"
depend()
{
before dev modules
keyword -lxc -prefix -vserver
keyword -lxc -prefix -systemd-nspawn -vserver
}
start()

View File

@@ -9,7 +9,7 @@ _IFS="
depend()
{
use dev clock modules
keyword -jail -openvz -prefix -timeout -vserver -lxc -uml
keyword -jail -openvz -prefix -systemd-nspawn -timeout -vserver -lxc -uml
}
_abort() {

View File

@@ -5,7 +5,7 @@
description="Sets the hostname of the machine."
depend() {
keyword -prefix -lxc
keyword -prefix -systemd-nspawn -lxc
}
start()

View File

@@ -28,7 +28,7 @@ depend()
else
before *
fi
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
}
setupopts()

View File

@@ -8,7 +8,7 @@ depend()
{
need localmount termencoding
after bootmisc
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
}
start()

View File

@@ -9,13 +9,13 @@ depend()
need fsck
use lvm modules mtab
after lvm modules
keyword -jail -prefix -vserver -lxc
keyword -jail -prefix -systemd-nspawn -vserver -lxc
}
start()
{
# Mount local filesystems in /etc/fstab.
local types="noproc" x= no_netdev=
local types="noproc" x= no_netdev= rc=
for x in $net_fs_list $extra_net_fs_list; do
types="${types},no${x}"
done
@@ -29,9 +29,11 @@ start()
ebegin "Mounting local filesystems"
mount -at "$types" $no_netdev
eend $? "Some local filesystem failed to mount"
# Always return 0 - some local mounts may not be critical for boot
return 0
rc=$?
if [ "$RC_UNAME" != Linux ]; then
rc=0
fi
return $rc
}
stop()
@@ -70,17 +72,19 @@ stop()
sync
fi
local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id
for aufs_si_dir in /sys/fs/aufs/*; do
aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/}
aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')"
local aufs_branch aufs_mount_point aufs_si_id aufs_br_id branches
for aufs_si_dir in /sys/fs/aufs/si*; do
[ -d "${aufs_si_dir}" ] || continue
aufs_si_id="si=${aufs_si_dir#/sys/fs/aufs/si_}"
aufs_mount_point="$(mountinfo -o ${aufs_si_id})"
for x in $aufs_si_dir/br[0-9][0-9][0-9]; do
branches="$aufs_si_dir/br[0-9] $aufs_si_dir/br[0-9][0-9] $aufs_si_dir/br[0-9][0-9][0-9]"
for x in $branches; do
[ -e "${x}" ] || continue
aufs_branch=$(sed 's/=.*//g' $x)
eindent
if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then
ewarn "Failed to remove branch $aufs_branch from aufs \
$aufs_mount_point"
$aufs_mount_point"
fi
eoutdent
sync

View File

@@ -6,7 +6,7 @@ description="Configures the loopback interface."
depend()
{
keyword -jail -prefix -vserver
keyword -jail -prefix -systemd-nspawn -vserver
}
start()

View File

@@ -7,7 +7,7 @@ description="Loads a user defined list of kernel modules."
depend()
{
use isapnp
keyword -openvz -prefix -vserver -lxc
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

View File

@@ -7,7 +7,7 @@ description="Re-mount filesytems read-only for a clean reboot."
depend()
{
need killprocs savecache
keyword -openvz -prefix -vserver -lxc
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

View File

@@ -7,26 +7,24 @@ description="Update /etc/mtab to match what the kernel knows about"
depend()
{
need root
keyword -prefix
keyword -prefix -systemd-nspawn
}
start()
{
[ -L /etc/mtab ] && return 0
local rc=0
ebegin "Updating /etc/mtab"
if ! checkpath -W /etc; then
rc=1
elif [ ! -e /etc/mtab ]; then
elif ! yesno ${mtab_is_file:-no}; then
[ ! -L /etc/mtab ] && [ -f /etc/mtab ] &&
ewarn "Removing /etc/mtab file"
einfo "Creating mtab symbolic link"
ln -snf /proc/self/mounts /etc/mtab
else
ewarn "The support for updating /etc/mtab as a file is"
ewarn "deprecated and will be removed in the future."
ewarn "Please run the following command as root on your system."
ewarn
ewarn "ln -snf /proc/self/mounts /etc/mtab"
ewarn
[ -L /etc/mtab ] && ewarn "Removing /etc/mtab symbolic link"
rm -f /etc/mtab
einfo "Creating mtab file"
# With / as tmpfs we cannot umount -at tmpfs in localmount as that
# makes / readonly and dismounts all tmpfs even if in use which is
# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts

View File

@@ -9,7 +9,7 @@ depend()
config /etc/fstab
use afc-client amd nfsclient autofs openvpn
use dns
keyword -jail -prefix -vserver -lxc
keyword -jail -prefix -systemd-nspawn -vserver -lxc
}
start()
@@ -27,7 +27,10 @@ start()
rc=$?
fi
ewend $rc "Could not mount all network filesystems"
return 0
if [ "$RC_UNAME" != Linux ]; then
rc=0
fi
return $rc
}
stop()

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend()
{
need localmount
keyword -openvz -prefix -vserver -lxc
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
_setleds()

View File

@@ -8,7 +8,7 @@ depend()
{
use modules devfs
need localmount
keyword -openvz -prefix -vserver -lxc
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

View File

@@ -7,7 +7,7 @@ description="Mount the root fs read/write"
depend()
{
need fsck
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

31
init.d/s6-svscan.in Normal file
View File

@@ -0,0 +1,31 @@
#!@SBINDIR@/openrc-run
# Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
command=/bin/s6-svscan
command_args="${RC_SVCDIR}"/s6-scan
command_background=yes
pidfile=/var/run/s6-svscan.pid
depend()
{
need localmount
}
start_pre()
{
einfo "Creating s6 scan directory"
checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan
return $?
}
stop_post()
{
ebegin "Stopping any remaining s6 services"
s6-svc -dx "${RC_SVCDIR}"/s6-scan/* 2>/dev/null || true
eend $?
ebegin "Stopping any remaining s6 service loggers"
s6-svc -dx "${RC_SVCDIR}"/s6-scan/*/log 2>/dev/null || true
eend $?
}

View File

@@ -7,43 +7,53 @@ description="Saves the caches OpenRC uses to non volatile storage"
start()
{
if [ -e "$RC_SVCDIR"/clock-skewed ]; then
ewarn "WARNING: clock skew detected!"
ewarn "Clock skew detected!"
if ! yesno "${RC_GOINGDOWN}"; then
eerror "Not saving deptree cache"
return 1
fi
fi
if ! checkpath -W "$RC_LIBEXECDIR"; then
ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
if ! yesno "${RC_GOINGDOWN}"; then
ewarn "Unable to save deptree cache"
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
if ! checkpath -W "$RC_LIBEXECDIR"; then
eerror "${RC_LIBEXECDIR} is not writable!"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi
return 0
fi
ebegin "Saving dependency cache"
local rc=
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
rm -rf "$RC_LIBEXECDIR"/cache
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
rc=$?
eerror "Unable to create $RC_LIBEXECDIR/cache"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
rc=0
return 0
fi
eend $rc "Unable to create $RC_SVCDIR/cache"
return $rc
return 1
fi
fi
local save=
if ! checkpath -W "$RC_LIBEXECDIR"/cache; then
eerror "${RC_LIBEXECDIR}/cache is not writable!"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi
ebegin "Saving dependency cache"
local rc=0 save=
for x in deptree depconfig shutdowntime softlevel nettree rc.log; do
[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x"
done
if [ -n "$save" ]; then
cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null
cp -p $save "$RC_LIBEXECDIR"/cache
rc=$?
fi
rc=$?
if yesno "${RC_GOINGDOWN}"; then
rc=0
if [ $rc -ne 0 ]; then
eerror "Unable to save dependency cache"
fi
eend 0
fi
eend $rc
eend $rc "Unable to save dependency cache"
}

View File

@@ -5,7 +5,7 @@
depend()
{
before localmount
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

View File

@@ -5,7 +5,7 @@
depend()
{
need localmount
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()

View File

@@ -8,7 +8,7 @@ depend()
{
before *
provide clock
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
}
# swclock is an OpenRC built in

View File

@@ -1,4 +1,4 @@
#!@PREFIX@/sbin/runscript
#!@PREFIX@/sbin/openrc-run
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
#FIXME: Modify for GNU/Hurd

View File

@@ -5,7 +5,7 @@
depend()
{
before bootmisc logger
keyword -prefix -vserver
keyword -prefix -systemd-nspawn -vserver
}
start()

View File

@@ -8,7 +8,7 @@ sysfs_opts=nodev,noexec,nosuid
depend()
{
keyword -lxc -prefix -vserver
keyword -lxc -prefix -systemd-nspawn -vserver
}
mount_sys()
@@ -116,7 +116,7 @@ mount_cgroups()
mount -n -t cgroup \
-o none,${sysfs_opts},name=openrc,release_agent="$agent" \
openrc /sys/fs/cgroup/openrc
echo 1 > /sys/fs/cgroup/openrc/notify_on_release
printf 1 > /sys/fs/cgroup/openrc/notify_on_release
fi
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend()
{
keyword -lxc -openvz -prefix -uml -vserver -xenu
keyword -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
use root
after bootmisc
}

View File

@@ -8,7 +8,7 @@ description="Initializes the random number generator."
depend()
{
need localmount
keyword -jail -lxc -openvz -prefix
keyword -jail -lxc -openvz -prefix -systemd-nspawn
}
save_seed()

View File

@@ -1,9 +1,17 @@
MK= ../mk
include ${MK}/sys.mk
include ${MK}/os.mk
MAN3= einfo.3 \
rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \
rc_runlevel.3 rc_service.3 rc_stringlist.3
MAN8= rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \
service.8 start-stop-daemon.8
ifeq (${OS},Linux)
MAN8 += rc-sstat.8
endif
# Handy macro to create symlinks
# This does rely on correctly formatting our manpages!
MAKE_LINKS= suffix=$${man\#*.}; \
@@ -16,8 +24,6 @@ MAKE_LINKS= suffix=$${man\#*.}; \
fi; \
done;
MK= ../mk
include ${MK}/sys.mk
include ${MK}/gitignore.mk
all:

View File

@@ -107,6 +107,19 @@ the service has already been stopped.
String describing the service.
.It Ar description_$command
String describing the extra command.
.It Ar supervisor
Supervisor to use to monitor this daemon. If this is unset,
start-stop-daemon will be used. The only alternate supervisor we support
in this release is S6 from Skarnet software. To use this, set
supervisor=s6.
.It Ar s6_service_path
The path to the s6 service directory if you are monitoring this service
with S6. The default is /var/svc.d/${RC_SVCNAME}.
.It Ar s6_svwait_options_start
The options to pass to s6-svwait when starting the service via s6.
.It Ar s6_service_timeout_stop
The amount of time, in milliseconds, s6-svc should wait for the service
to go down when stopping the service. The default is 10000.
.It Ar start_stop_daemon_args
List of arguments passed to start-stop-daemon when starting the daemon.
.It Ar command
@@ -114,7 +127,8 @@ Daemon to start or stop via
.Nm start-stop-daemon
if no start or stop function is defined by the service.
.It Ar command_args
List of arguments to pass to the daemon when starting.
List of arguments to pass to the daemon when starting via
.Nm start-stop-daemon .
.It Ar command_background
Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
the background. This implies the "--make-pidfile" and "--pidfile" option of
@@ -127,6 +141,8 @@ will chroot into this path before writing the pid file or starting the daemon.
Pidfile to use for the above defined command.
.It Ar name
Display name used for the above defined command.
.It Ar stopsig
Signal to send when stopping the daemon.
.It Ar retry
Retry schedule to use when stopping the daemon. It can either be a
timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).

46
man/rc-sstat.8 Normal file
View File

@@ -0,0 +1,46 @@
.\" Copyright (c) 2015 William Hubbs
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd April 24, 2008
.Dt RC-sstat 8 SMM
.Os OpenRC
.Sh NAME
.Nm rc-sstat
.Nd show status info about services supervised by s6 then rc-status
info
.Sh SYNOPSIS
.Nm
.Sh DESCRIPTION
.Nm
gathers and displays information about the status of services supervised
by s6 then runs rc-status to show info about nnormal OpenRC services.
.Pp
.Sh EXIT STATUS
.Nm
exits 1 if there is an internal error or exits with the same exit codes
as rc-status.
.Sh SEE ALSO
.Xr rc-status 8 ,
.Xr rc-update 8
.Sh AUTHORS
.An William Hubbs <w.d.hubbs@gmail.com>

View File

@@ -2,7 +2,7 @@
# Copyright (c) 2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
GITREF?= HEAD
GITREF?= ${VERSION}
DISTPREFIX?= ${NAME}-${VERSION}
DISTFILE?= ${DISTPREFIX}.tar.bz2
@@ -34,7 +34,7 @@ snapshot:
mkdir /tmp/${SNAPDIR}
cp -RPp * /tmp/${SNAPDIR}
(cd /tmp/${SNAPDIR}; make clean)
find /tmp/${SNAPDIR} -name .svn -exec rm -rf -- {} \; 2>/dev/null || true
rm -rf /tmp/${SNAPDIR}/.git 2>/dev/null || true
tar -cvjpf ${SNAPFILE} -C /tmp ${SNAPDIR}
rm -rf /tmp/${SNAPDIR}
ls -l ${SNAPFILE}

48
s6-guide.md Normal file
View File

@@ -0,0 +1,48 @@
# Using S6 with OpenRC
Beginning with OpenRC-0.16, we support using the s6 supervision suite
from Skarmet Software in place of start-stop-daemon for monitoring
daemons [1].
## Setup
Documenting s6 in detail is beyond the scope of this guide. It will
document how to set up OpenRC services to communicate with s6.
### Use Default start, stop and status functions
If you write your own start, stop and status functions in your service
script, none of this will work. You must allow OpenRC to use the default
functions.
### Dependencies
All OpenRC service scripts that want their daemons monitored by s6
should have the following line added to their dependencies to make sure
the s6 scan directory is being monitored.
need s6-svscan
### Variable Settings
The most important setting is the supervisor variable. At the top of
your service script, you should set this variable as follows:
supervisor=s6
Several other variables affect s6 services. They are documented on the
openrc-run man page, but I will list them here for convenience:
s6_service_path - the path to the s6 service directory. The default is
/var/svc.d/$RC_SVCNAME.
s6_svwait_options_start - the options to pass to s6-svwait when starting
the service. If this is not set, s6-svwait will not be called.
s6_service_timeout_stop - the amount of time, in milliseconds, s6-svc
should wait for a service to go down when stopping.
This is very early support, so feel free to file bugs if you have
issues.
[1] http://www.skarnet.org/software/s6

1
scripts/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
rc-sstat

View File

@@ -1,5 +1,19 @@
MK= ../mk
include ${MK}/os.mk
DIR= ${LIBEXECDIR}/bin
BIN= on_ac_power
INSTALLAFTER = _installafter
ifeq (${OS},Linux)
SRCS+= rc-sstat.in
BIN+= rc-sstat
endif
_installafter:
ifeq (${OS},Linux)
${INSTALL} -d ${DESTDIR}${SBINDIR}
ln -s ${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat
endif
MK= ../mk
include ${MK}/scripts.mk

140
scripts/rc-sstat.in Normal file
View File

@@ -0,0 +1,140 @@
#!@SHELL@
# Define variables
scandir="/run/openrc/s6-scan"
statfile=/dev/shm/s6-svstat.${USER}
color_red='\E[01;31m'
color_green='\E[32m'
color_yellow='\E[01;33m'
# Time Modules
uptimeModules() {
# Given a single integer argument representing seconds of uptime...
# convert uptime to a friendly human readable string: '2d 16h 58m 46s'
# define a variable to keep track of the longest length uptime string
uSec=${1:-0}
uDay=$(( $uSec / 86400 ))
uSec=$(( $uSec % 86400 ))
uHour=$(( $uSec / 3600 ))
uSec=$(( $uSec % 3600 ))
uMin=$(( $uSec / 60 ))
uSec=$(( $uSec % 60 ))
[ $uDay -ne 0 ] && pDay="${uDay}d " || pDay=""
[ $uHour -ne 0 ] && pHour="${uHour}h " || pHour=""
[ $uMin -ne 0 ] && pMin="${uMin}m " || pMin=""
[ $uSec -ne 0 ] && pSec="${uSec}s " || pSec=""
parsedUptime="$( echo ${pDay}${pHour}${pMin}${pSec} | sed 's#[ \t]*$##' )"
uCharCount=${#parsedUptime}
}
# Make sure we are running as root
if [ $(id -u) != 0 ]; then
printf "This command must be run as root\n"
exit 1
fi
# Make sure scandir exists
if [ ! -d $scandir ]; then
printf "%s\n" "$scandir does not exist"
exit 1
fi
# Make sure s6-svscan is running
if ! pgrep s6-svscan >/dev/null ; then
printf "s6-svscan is not running\n"
exit 1
fi
# If TERM is undefined (launching sstat through an ssh command) then make it vt100
if [ -z $TERM -o $TERM = "dumb" ]; then
export TERM=vt100
fi
# Gather list of candidate services s6-supervise may be supervising
# filter for folders and symlinks at /run/openrc/s6-scan/* ommiting output starting with '.'
services="$(find $scandir -maxdepth 1 -mindepth 1 \( -type d -or -type l \) | awk -F'/' '{ if ( $NF !~ "^\\." ) print $NF}')"
if [ -z "$services" ]; then
printf "s6 found no services configured for supervision\n"
exit 1
fi
# Gather status for each service from s6-svstat
# write to tmp file in memory for non I/O bound repeatative access
rm -f $statfile 2>/dev/null
for service in $services ; do
echo "$service $(s6-svstat ${scandir}/${service})" >> $statfile
done
# Define longest string from parsed uptime (default to 7 to match string length of 'Up Time')
timeStringLength=7
for uptime in $(awk '$2 == "up" {print $5}' $statfile | sort -run)
do
uptimeModules $uptime
[ ${uCharCount} -gt $timeStringLength ] && timeStringLength=$uCharCount
done
# Print the status header like so...
# Service Name State PID Up Time Start Time
#---------------------------- ----- ----- -------------- -------------------
printf "\n"
printf "%28s %5s %5s %${timeStringLength}s %19s\n" "Service Name" "State" "PID" "Up Time" "Start Time"
for dashes in 28 5 5 $timeStringLength 19 ; do
printf "%0.s-" $(seq 1 $dashes) ; echo -n ' '
done && printf "\n"
# sshd up (pid 26300) 80373 seconds
cat $statfile | \
while read line
do
set $line
service=$1
state=$2
pid=${4/)/}
time=$5
# call function to convert time in seconds and define additional variables
uptimeModules $time
if [ "$state" = up ]; then
if [ $time -lt 30 ]; then
# uptime < 30 seconds, color the whole line yellow
echo -en "$color_yellow"
# 1st 4 columns are printed with printf for space padding
printf "%28s %5s %5s %${timeStringLength}s" $service $state $pid "$parsedUptime"
# 4th column is output from date -d
echo -e " $(date -d "${time} seconds ago" "+%F %T")"
# reset terminal colors
tput sgr0
else
printf "%28s" $service
# uptime > 30 seconds, color just the "state" value green
echo -en "$color_green"
printf " %5s" $state
# reset terminal colors
tput sgr0
printf " %5s" $pid
printf " %${timeStringLength}s" "$parsedUptime"
echo -e " $(date -d "${time} seconds ago" "+%F %T")"
fi
else
printf "%28s" $service
echo -en "$color_red"
printf " %5s" $state
tput sgr0
echo ""
fi
done
# Cleanup
rm -f $statfile 2>/dev/null
printf "\n\n"
rc-status

2
sh/.gitignore vendored
View File

@@ -1,7 +1,7 @@
functions.sh
gendepends.sh
rc-functions.sh
runscript.sh
openrc-run.sh
cgroup-release-agent.sh
init.sh
init-early.sh

View File

@@ -1,8 +1,8 @@
DIR= ${LIBEXECDIR}/sh
SRCS= init.sh.in functions.sh.in gendepends.sh.in \
rc-functions.sh.in runscript.sh.in tmpfiles.sh.in ${SRCS-${OS}}
INC= rc-mount.sh functions.sh rc-functions.sh
BIN= gendepends.sh init.sh runscript.sh tmpfiles.sh ${BIN-${OS}}
openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}}
INC= rc-mount.sh functions.sh rc-functions.sh s6.sh start-stop-daemon.sh
BIN= gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}}
INSTALLAFTER= _installafter

View File

@@ -1,5 +1,5 @@
#!@SHELL@
# Shell wrapper for runscript
# Shell wrapper for openrc-run
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
@@ -34,7 +34,10 @@ sourcex()
sourcex "@LIBEXECDIR@/sh/functions.sh"
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
[ "$RC_SYS" != "PREFIX" ] && sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh"
case $RC_SYS in
PREFIX|SYSTEMD-NSPAWN) ;;
*) sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh";;
esac
# Support LiveCD foo
if sourcex -e "/sbin/livecd-functions.sh"; then
@@ -123,69 +126,42 @@ _status()
}
# Template start / stop / status functions
# These functions select the appropriate function to call from the
# supervisor modules
start()
{
[ -n "$command" ] || return 0
local _background=
ebegin "Starting ${name:-$RC_SVCNAME}"
if yesno "${command_background}"; then
if [ -z "${pidfile}" ]; then
eend 1 "command_background option used but no pidfile specified"
return 1
fi
_background="--background --make-pidfile"
fi
if yesno "$start_inactive"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
eval start-stop-daemon --start \
--exec $command \
${chroot:+--chroot} $chroot \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
$_background $start_stop_daemon_args \
-- $command_args
if eend $? "Failed to start $RC_SVCNAME"; then
service_set_value "command" "${command}"
[ -n "${chroot}" ] && service_set_value "chroot" "${chroot}"
[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
[ -n "${procname}" ] && service_set_value "procname" "${procname}"
return 0
fi
if yesno "$start_inactive"; then
if ! $_inactive; then
mark_service_stopped
fi
fi
return 1
local func=ssd_start
case "$supervisor" in
s6) func=s6_start ;;
?*)
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
;;
esac
$func
}
stop()
{
local startcommand="$(service_get_value "command")"
local startchroot="$(service_get_value "chroot")"
local startpidfile="$(service_get_value "pidfile")"
local startprocname="$(service_get_value "procname")"
command="${startcommand:-$command}"
chroot="${startchroot:-$chroot}"
pidfile="${startpidfile:-$pidfile}"
procname="${startprocname:-$procname}"
[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
ebegin "Stopping ${name:-$RC_SVCNAME}"
start-stop-daemon --stop \
${retry:+--retry} $retry \
${command:+--exec} $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $chroot$pidfile \
${stopsig:+--signal} $stopsig
eend $? "Failed to stop $RC_SVCNAME"
local func=ssd_stop
case "$supervisor" in
s6) func=s6_stop ;;
?*)
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
;;
esac
$func
}
status()
{
_status
local func=ssd_status
case "$supervisor" in
s6) func=s6_status ;;
?*)
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
;;
esac
$func
}
yesno $RC_DEBUG && set -x
@@ -209,6 +185,10 @@ unset _conf_d
# Load any system overrides
sourcex -e "@SYSCONFDIR@/rc.conf"
# load service supervisor functions
sourcex "@LIBEXECDIR@/sh/s6.sh"
sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh"
# Set verbose mode
if yesno "${rc_verbose:-$RC_VERBOSE}"; then
EINFO_VERBOSE=yes
@@ -241,20 +221,22 @@ done
# Load our script
sourcex "$RC_SERVICE"
for _d in $required_dirs; do
if [ ! -d $_d ]; then
eval "printf '%s\n' $required_dirs" | while read _d; do
if [ -n "$_d" ] && [ ! -d "$_d" ]; then
eerror "$RC_SVCNAME: \`$_d' is not a directory"
exit 1
fi
done
[ $? -ne 0 ] && exit 1
unset _d
for _f in $required_files; do
if [ ! -r $_f ]; then
eval "printf '%s\n' $required_files" | while read _f; do
if [ -n "$_f" ] && [ ! -r "$_f" ]; then
eerror "$RC_SVCNAME: \`$_f' is not readable"
exit 1
fi
done
[ $? -ne 0 ] && exit 1
unset _f
if [ -n "$opts" ]; then

View File

@@ -54,7 +54,9 @@ cgroup_set_values()
val=
;;
*)
val="$val $1"
[ -n "$val" ] &&
val="$val $1" ||
val="$1"
;;
esac
shift
@@ -107,12 +109,21 @@ cgroup_set_limits()
local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
[ -n "$devices" ] && cgroup_set_values devices "$devices"
local hugetlb="${rc_cgroup_hugetlb:-$RC_CGROUP_HUGETLB}"
[ -n "$hugetlb" ] && cgroup_set_values hugetlb "$hugetlb"
local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
[ -n "$memory" ] && cgroup_set_values memory "$memory"
local net_cls="${rc_cgroup_net_cls:-$RC_CGROUP_NET_CLS}"
[ -n "$net_cls" ] && cgroup_set_values net_cls "$net_cls"
local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
local pids="${rc_cgroup_pids:-$RC_CGROUP_PIDS}"
[ -n "$pids" ] && cgroup_set_values pids "$pids"
return 0
}

View File

@@ -85,7 +85,7 @@ get_bootparam()
return 1
}
# Called from runscript.sh or gendepends.sh
# Called from openrc-run.sh or gendepends.sh
_depend() {
depend
local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends=

50
sh/s6.sh Normal file
View File

@@ -0,0 +1,50 @@
# Start / stop / status functions for s6 support
# Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
[ -z "${s6_service_path}" ] && s6_service_path="/var/svc.d/${RC_SVCNAME}"
s6_start()
{
if [ ! -d "${s6_service_path}" ]; then
eerror "${s6_service_path} does not exist."
return 1
fi
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
ebegin "Starting ${name:-$RC_SVCNAME}"
ln -sf "${s6_service_path}" "${s6_service_link}"
s6-svscanctl -na "${RC_SVCDIR}"/s6-scan
sleep 1.5
s6-svc -u "${s6_service_link}"
if [ -n "$s6_svwait_options_start" ]; then
s6-svwait ${s6_svwait_options_start} "${s6_service_link}"
fi
sleep 1.5
set -- $(s6-svstat "${s6_service_link}")
[ "$1" = "up" ]
eend $? "Failed to start $RC_SVCNAME"
}
s6_stop()
{
if [ ! -d "${s6_service_path}" ]; then
eerror "${s6_service_path} does not exist."
return 1
fi
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
ebegin "Stopping ${name:-$RC_SVCNAME}"
s6-svc -Dd -T ${s6_service_timeout_stop:-10000} "${s6_service_link}"
set -- $(s6-svstat "${s6_service_link}")
[ "$1" = "down" ]
eend $? "Failed to stop $RC_SVCNAME"
}
s6_status()
{
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
if [ -L "${s6_service_link}" ]; then
s6-svstat "${s6_service_link}"
else
_status
fi
}

77
sh/start-stop-daemon.sh Normal file
View File

@@ -0,0 +1,77 @@
# start / stop / status functions for start-stop-daemon
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ssd_start()
{
if [ -z "$command" ]; then
ewarn "The command variable is undefined."
ewarn "There is nothing for ${name:-$RC_SVCNAME} to start."
ewarn "If this is what you intend, please write a start function."
ewarn "This will become a failure in a future release."
return 0
fi
local _background=
ebegin "Starting ${name:-$RC_SVCNAME}"
if yesno "${command_background}"; then
if [ -z "${pidfile}" ]; then
eend 1 "command_background option used but no pidfile specified"
return 1
fi
if [ -n "${command_args_background}" ]; then
eend 1 "command_background used with command_args_background"
return 1
fi
_background="--background --make-pidfile"
fi
if yesno "$start_inactive"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
eval start-stop-daemon --start \
--exec $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
${command_user+--user} $command_user \
$_background $start_stop_daemon_args \
-- $command_args $command_args_background
if eend $? "Failed to start $RC_SVCNAME"; then
service_set_value "command" "${command}"
[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
[ -n "${procname}" ] && service_set_value "procname" "${procname}"
return 0
fi
if yesno "$start_inactive"; then
if ! $_inactive; then
mark_service_stopped
fi
fi
return 1
}
ssd_stop()
{
local startcommand="$(service_get_value "command")"
local startpidfile="$(service_get_value "pidfile")"
local startprocname="$(service_get_value "procname")"
command="${startcommand:-$command}"
pidfile="${startpidfile:-$pidfile}"
procname="${startprocname:-$procname}"
[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
ebegin "Stopping ${name:-$RC_SVCNAME}"
start-stop-daemon --stop \
${retry:+--retry} $retry \
${command:+--exec} $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
${stopsig:+--signal} $stopsig
eend $? "Failed to stop $RC_SVCNAME"
}
ssd_status()
{
_status
}

23
sh/tmpfiles.sh.in Executable file → Normal file
View File

@@ -53,10 +53,18 @@ relabel() {
done
}
splitpath() {
local path=$1
while [ -n "$path" ]; do
echo $path
path=${path%/*}
done
}
_restorecon() {
local path=$1
if [ -x /sbin/restorecon ]; then
dryrun_or_real restorecon -F "$path"
dryrun_or_real restorecon -F $(splitpath "$path")
fi
}
@@ -122,6 +130,7 @@ _d() {
if [ ! -d "$path" ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path"
fi
}
@@ -137,10 +146,18 @@ _D() {
if [ $CREATE -gt 0 ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path"
fi
}
_v() {
# Create a subvolume if the path does not exist yet and the file system
# supports this (btrfs). Otherwise create a normal directory.
# TODO: Implement btrfs subvol creation.
_d "$@"
}
_L() {
# Create a symlink if it doesn't exist yet
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
@@ -336,7 +353,7 @@ for FILE in $tmpfiles_d ; do
# whine about invalid entries
case $cmd in
f|F|w|d|D|p|L|c|C|b|x|X|r|R|z|Z) ;;
f|F|w|d|D|v|p|L|c|C|b|x|X|r|R|z|Z) ;;
*) warninvalid ; continue ;;
esac
@@ -344,7 +361,7 @@ for FILE in $tmpfiles_d ; do
if [ "$mode" = '-' -o "$mode" = '' ]; then
case "$cmd" in
p|f|F) mode=0644 ;;
d|D) mode=0755 ;;
d|D|v) mode=0755 ;;
C|z|Z|x|r|R|L) ;;
esac
fi

View File

@@ -99,7 +99,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
pid_t p;
char buffer[PATH_MAX];
struct stat sb;
pid_t runscript_pid = 0;
pid_t openrc_pid = 0;
char *pp;
RC_PIDLIST *pids = NULL;
RC_PID *pi;
@@ -108,7 +108,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
return NULL;
/*
We never match RC_RUNSCRIPT_PID if present so we avoid the below
We never match RC_OPENRC_PID if present so we avoid the below
scenario
/etc/init.d/ntpd stop does
@@ -118,9 +118,9 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
nasty
*/
if ((pp = getenv("RC_RUNSCRIPT_PID"))) {
if (sscanf(pp, "%d", &runscript_pid) != 1)
runscript_pid = 0;
if ((pp = getenv("RC_OPENRC_PID"))) {
if (sscanf(pp, "%d", &openrc_pid) != 1)
openrc_pid = 0;
}
/*
@@ -146,7 +146,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
while ((entry = readdir(procdir)) != NULL) {
if (sscanf(entry->d_name, "%d", &p) != 1)
continue;
if (runscript_pid != 0 && runscript_pid == p)
if (openrc_pid != 0 && openrc_pid == p)
continue;
if (pid != 0 && pid != p)
continue;

View File

@@ -101,7 +101,9 @@ ls_dir(const char *dir, int options)
continue;
}
if (options & LS_DIR) {
if (stat(d->d_name, &buf) == 0 &&
snprintf(file, sizeof(file), "%s/%s",
dir, d->d_name);
if (stat(file, &buf) != 0 ||
!S_ISDIR(buf.st_mode))
continue;
}
@@ -294,6 +296,8 @@ rc_sys_v1(void)
return RC_SYS_OPENVZ; /* old test */
else if (file_regex("/proc/1/environ", "container=lxc"))
return RC_SYS_LXC;
else if (file_regex("/proc/1/environ", "container=systemd-nspawn"))
return RC_SYS_SYSTEMD_NSPAWN;
#endif
return NULL;

View File

@@ -332,6 +332,7 @@ bool rc_service_daemons_crashed(const char *);
#define RC_SYS_OPENVZ "OPENVZ"
#define RC_SYS_LXC "LXC"
#define RC_SYS_PREFIX "PREFIX"
#define RC_SYS_SYSTEMD_NSPAWN "SYSTEMD-NSPAWN"
#define RC_SYS_UML "UML"
#define RC_SYS_VSERVER "VSERVER"
#define RC_SYS_XEN0 "XEN0"

View File

@@ -1,8 +1,8 @@
PROG= openrc
SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \
SRCS= checkpath.c fstabinfo.c mountinfo.c openrc-run.c \
rc-applets.c rc-depend.c rc-logger.c \
rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \
runscript.c rc.c swclock.c
rc.c start-stop-daemon.c swclock.c
ifeq (${MKSELINUX},yes)
SRCS+= rc-selinux.c

View File

@@ -298,7 +298,7 @@ find_mounts(struct args *args)
int netdev;
RC_STRINGLIST *list;
if ((fp = fopen("/proc/mounts", "r")) == NULL)
if ((fp = fopen("/proc/self/mounts", "r")) == NULL)
eerrorx("getmntinfo: %s", strerror(errno));
list = rc_stringlist_new();
@@ -315,6 +315,8 @@ find_mounts(struct args *args)
if ((ent = getmntfile(to))) {
if (strstr(ent->mnt_opts, "_netdev"))
netdev = 0;
else
netdev = 1;
}
process_mount(list, args, from, to, fst, opts, netdev);
@@ -347,7 +349,7 @@ get_regex(const char *string)
#include "_usage.h"
#define extraopts "[mount1] [mount2] ..."
#define getoptstring "f:F:n:N:o:O:p:P:ist" getoptstring_COMMON
#define getoptstring "f:F:n:N:o:O:p:P:iste:E:" getoptstring_COMMON
static const struct option longopts[] = {
{ "fstype-regex", 1, NULL, 'f'},
{ "skip-fstype-regex", 1, NULL, 'F'},

View File

@@ -1,5 +1,5 @@
/*
* runscript.c
* openrc-run.c
* Handle launching of init scripts.
*/
@@ -85,8 +85,12 @@ static bool sighup, in_background, deps, dry_run;
static pid_t service_pid;
static int signal_pipe[2] = { -1, -1 };
static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m;
static RC_STRINGLIST *types_mua = NULL;
static RC_STRINGLIST *deptypes_b;
static RC_STRINGLIST *deptypes_n;
static RC_STRINGLIST *deptypes_nu;
static RC_STRINGLIST *deptypes_nua;
static RC_STRINGLIST *deptypes_m;
static RC_STRINGLIST *deptypes_mua;
static void
handle_signal(int sig)
@@ -231,12 +235,12 @@ cleanup(void)
rc_plugin_unload();
#ifdef DEBUG_MEMORY
rc_stringlist_free(types_b);
rc_stringlist_free(types_n);
rc_stringlist_free(types_nu);
rc_stringlist_free(types_nua);
rc_stringlist_free(types_m);
rc_stringlist_free(types_mua);
rc_stringlist_free(deptypes_b);
rc_stringlist_free(deptypes_n);
rc_stringlist_free(deptypes_nu);
rc_stringlist_free(deptypes_nua);
rc_stringlist_free(deptypes_m);
rc_stringlist_free(deptypes_mua);
rc_deptree_free(deptree);
rc_stringlist_free(restart_services);
rc_stringlist_free(need_services);
@@ -370,18 +374,18 @@ svc_exec(const char *arg1, const char *arg2)
dup2(slave_tty, STDERR_FILENO);
}
if (exists(RC_SVCDIR "/runscript.sh")) {
execl(RC_SVCDIR "/runscript.sh",
RC_SVCDIR "/runscript.sh",
if (exists(RC_SVCDIR "/openrc-run.sh")) {
execl(RC_SVCDIR "/openrc-run.sh",
RC_SVCDIR "/openrc-run.sh",
service, arg1, arg2, (char *) NULL);
eerror("%s: exec `" RC_SVCDIR "/runscript.sh': %s",
eerror("%s: exec `" RC_SVCDIR "/openrc-run.sh': %s",
service, strerror(errno));
_exit(EXIT_FAILURE);
} else {
execl(RC_LIBEXECDIR "/sh/runscript.sh",
RC_LIBEXECDIR "/sh/runscript.sh",
execl(RC_LIBEXECDIR "/sh/openrc-run.sh",
RC_LIBEXECDIR "/sh/openrc-run.sh",
service, arg1, arg2, (char *) NULL);
eerror("%s: exec `" RC_LIBEXECDIR "/sh/runscript.sh': %s",
eerror("%s: exec `" RC_LIBEXECDIR "/sh/openrc-run.sh': %s",
service, strerror(errno));
_exit(EXIT_FAILURE);
}
@@ -518,30 +522,30 @@ get_started_services(void)
}
static void
setup_types(void)
setup_deptypes(void)
{
types_b = rc_stringlist_new();
rc_stringlist_add(types_b, "broken");
deptypes_b = rc_stringlist_new();
rc_stringlist_add(deptypes_b, "broken");
types_n = rc_stringlist_new();
rc_stringlist_add(types_n, "ineed");
deptypes_n = rc_stringlist_new();
rc_stringlist_add(deptypes_n, "ineed");
types_nu = rc_stringlist_new();
rc_stringlist_add(types_nu, "ineed");
rc_stringlist_add(types_nu, "iuse");
deptypes_nu = rc_stringlist_new();
rc_stringlist_add(deptypes_nu, "ineed");
rc_stringlist_add(deptypes_nu, "iuse");
types_nua = rc_stringlist_new();
rc_stringlist_add(types_nua, "ineed");
rc_stringlist_add(types_nua, "iuse");
rc_stringlist_add(types_nua, "iafter");
deptypes_nua = rc_stringlist_new();
rc_stringlist_add(deptypes_nua, "ineed");
rc_stringlist_add(deptypes_nua, "iuse");
rc_stringlist_add(deptypes_nua, "iafter");
types_m = rc_stringlist_new();
rc_stringlist_add(types_m, "needsme");
deptypes_m = rc_stringlist_new();
rc_stringlist_add(deptypes_m, "needsme");
types_mua = rc_stringlist_new();
rc_stringlist_add(types_mua, "needsme");
rc_stringlist_add(types_mua, "usesme");
rc_stringlist_add(types_mua, "beforeme");
deptypes_mua = rc_stringlist_new();
rc_stringlist_add(deptypes_mua, "needsme");
rc_stringlist_add(deptypes_mua, "usesme");
rc_stringlist_add(deptypes_mua, "beforeme");
}
static void
@@ -604,10 +608,10 @@ svc_start_deps(void)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree");
if (!types_b)
setup_types();
if (!deptypes_b)
setup_deptypes();
services = rc_deptree_depends(deptree, types_b, applet_list,
services = rc_deptree_depends(deptree, deptypes_b, applet_list,
runlevel, 0);
if (TAILQ_FIRST(services)) {
eerrorn("ERROR: %s needs service(s) ", applet);
@@ -625,9 +629,9 @@ svc_start_deps(void)
rc_stringlist_free(services);
services = NULL;
need_services = rc_deptree_depends(deptree, types_n,
need_services = rc_deptree_depends(deptree, deptypes_n,
applet_list, runlevel, depoptions);
use_services = rc_deptree_depends(deptree, types_nu,
use_services = rc_deptree_depends(deptree, deptypes_nu,
applet_list, runlevel, depoptions);
if (!rc_runlevel_starting()) {
@@ -655,7 +659,7 @@ svc_start_deps(void)
return;
/* Now wait for them to start */
services = rc_deptree_depends(deptree, types_nua, applet_list,
services = rc_deptree_depends(deptree, deptypes_nua, applet_list,
runlevel, depoptions);
/* We use tmplist to hold our scheduled by list */
tmplist = rc_stringlist_new();
@@ -860,10 +864,10 @@ svc_stop_deps(RC_SERVICE state)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree");
if (!types_m)
setup_types();
if (!deptypes_m)
setup_deptypes();
services = rc_deptree_depends(deptree, types_m, applet_list,
services = rc_deptree_depends(deptree, deptypes_m, applet_list,
runlevel, depoptions);
tmplist = rc_stringlist_new();
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
@@ -923,7 +927,7 @@ svc_stop_deps(RC_SERVICE state)
/* We now wait for other services that may use us and are
* stopping. This is important when a runlevel stops */
services = rc_deptree_depends(deptree, types_mua, applet_list,
services = rc_deptree_depends(deptree, deptypes_mua, applet_list,
runlevel, depoptions);
TAILQ_FOREACH(svc, services, entries) {
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
@@ -1162,6 +1166,11 @@ openrc_run(int argc, char **argv)
subshells the init script may create so that our mark_service_*
functions can always instruct us of this change */
snprintf(pidstr, sizeof(pidstr), "%d", (int) getpid());
setenv("RC_OPENRC_PID", pidstr, 1);
/*
* RC_RUNSCRIPT_PID is deprecated, but we will keep it for a while
* for safety.
*/
setenv("RC_RUNSCRIPT_PID", pidstr, 1);
/* eprefix is kinda klunky, but it works for our purposes */

View File

@@ -329,7 +329,7 @@ do_mark_service(int argc, char **argv)
bool ok = false;
char *svcname = getenv("RC_SVCNAME");
char *service = NULL;
char *runscript_pid;
char *openrc_pid;
/* char *mtime; */
pid_t pid;
RC_SERVICE bit;
@@ -350,7 +350,7 @@ do_mark_service(int argc, char **argv)
eerrorx("%s: unknown applet", applet);
/* If we're marking ourselves then we need to inform our parent
runscript process so they do not mark us based on our exit code */
openrc-run process so they do not mark us based on our exit code */
/*
* FIXME: svcname and service are almost always equal except called from a
* shell with just argv[1] - So that doesn't seem to do what Roy initially
@@ -359,8 +359,8 @@ do_mark_service(int argc, char **argv)
* openrc@gentoo.org).
*/
if (ok && svcname && strcmp(svcname, service) == 0) {
runscript_pid = getenv("RC_RUNSCRIPT_PID");
if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
openrc_pid = getenv("RC_OPENRC_PID");
if (openrc_pid && sscanf(openrc_pid, "%d", &pid) == 1)
if (kill(pid, SIGHUP) != 0)
eerror("%s: failed to signal parent %d: %s",
applet, pid, strerror(errno));
@@ -369,10 +369,10 @@ do_mark_service(int argc, char **argv)
in control as well */
/*
l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
strlen(runscript_pid) + 4;
strlen(openrc_pid) + 4;
mtime = xmalloc(l);
snprintf(mtime, l, RC_SVCDIR "/exclusive/%s.%s",
svcname, runscript_pid);
svcname, openrc_pid);
if (exists(mtime) && unlink(mtime) != 0)
eerror("%s: unlink: %s", applet, strerror(errno));
free(mtime);

View File

@@ -66,6 +66,7 @@ static const char *const env_whitelist[] = {
"LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS",
"LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL",
"IN_HOTPLUG", "IN_BACKGROUND", "RC_INTERFACE_KEEP_CONFIG",
"EERROR_QUIET", "EINFO_QUIET",
NULL
};