diff options
Diffstat (limited to 'unmaintained/libcgroup/cgconfig.initd')
-rw-r--r-- | unmaintained/libcgroup/cgconfig.initd | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/unmaintained/libcgroup/cgconfig.initd b/unmaintained/libcgroup/cgconfig.initd new file mode 100644 index 000000000..ae64ae161 --- /dev/null +++ b/unmaintained/libcgroup/cgconfig.initd @@ -0,0 +1,120 @@ +#!/sbin/openrc-run +# +# Control Groups Configuration Startup +# +# This script runs the cgconfigparser utility to parse and setup +# the control group filesystem. It uses ${CONFIG_FILE} +# and parses the configuration specified in there. +# +CGCONFIGPARSER="/usr/sbin/cgconfigparser" +CGROUP_FS="cgroup" +CONFIG_FILE=${CONFIG_FILE:-"/etc/cgconfig.conf"} +MOUNTS_FILE="/proc/mounts" +RULES_FILE="/etc/cgrules.conf" + +# Support multiple mount points +MOUNT_POINTS= + +move_all_to_init_class() { + local i + for i in $MOUNT_POINTS; do + local mount_point=${i%:*} + cd ${mount_point} + + if grep -qw "${mount_point}" ${MOUNTS_FILE}; then + local directory + for directory in $(find . -depth -type d); do + if [ "${directory}" != "." ]; then + # cat fails with "Argument list too long" error + sed -nu p < ${directory}/tasks > tasks + rmdir ${directory} + fi + done + else + ewarn "Resource control filesystem not mounted" + fi + + cd - >/dev/null + done +} + +parse_mounts() { + local device mount_point fs_type options other + while read device mount_point fs_type options other; do + if echo ${CGROUP_FS} | grep -q ${device}; then + MOUNT_POINTS="${MOUNT_POINTS} ${mount_point}:${options}" + fi + done < ${MOUNTS_FILE} +} + +umount_fs() { + local i + for i in ${MOUNT_POINTS}; do + umount ${i%:*} + rmdir ${i%:*} + done +} + +depend() { + need local +} + +start() { + ebegin "Starting cgconfig service" + + # Mount filesystem and create cgroups + if ! ${CGCONFIGPARSER} -l ${CONFIG_FILE} >/dev/null; then + eend 1 "Failed to parse ${CONFIG_FILE}" + return 1 + fi + + parse_mounts + + # Find default cgroup name in rules file + local default_cgroup + if [ -f "${RULES_FILE}" ]; then + default_cgroup=$(awk '$1 == "*" {print $3; exit}' ${RULES_FILE}) + if [ $default_cgroup == "*" ]; then + ewarn "${RULES_FILE} incorrect" + ewarn "Overriding it" + default_cgroup= + fi + fi + # Use predefined name if none was found + if [ -z "${default_cgroup}" ]; then + default_cgroup=sysdefault + fi + + # Create a default cgroup for tasks to return back to + local i + for i in $MOUNT_POINTS; do + local mount_point=${i%:*} + local mount_options=${i#*:} + # Ignore if directory already exists + mkdir -p ${mount_point}/${default_cgroup} + find ${mount_point}/ -name tasks | xargs chmod a+rw + chmod go-w ${mount_point}/tasks + + # Special rule for cpusets + if echo ${mount_options} | grep -qw cpuset; then + cat ${mount_point}/cpuset.cpus > ${mount_point}/${default_cgroup}/cpuset.cpus + cat ${mount_point}/cpuset.mems > ${mount_point}/${default_cgroup}/cpuset.mems + fi + + # Classify everything to default cgroup + local j + for j in $(ps --no-headers -eL o tid); do + echo $j > ${mount_point}/${default_cgroup}/tasks 2>/dev/null + done + done + + eend 0 +} + +stop() { + ebegin "Stopping cgconfig service" + parse_mounts + move_all_to_init_class + umount_fs + eend 0 +} |