#!/bin/sh /etc/rc.common START=01 USE_PROCD=1 #PROCD_DEBUG=1 NAME=cgrulesengd CGBASEDIR=/sys/fs/cgroup CGCONFIG="cgroups" CGRULESCONF=/tmp/cgrules.conf CGCONFIGCONF=/tmp/cgconfig.conf cgroupinit_add_knob_val_to_list () { CG_KNOB_VAL_LIST="$CG_KNOB_VAL_LIST $1" } cgroupinit_create_group () { local cgrp=$1 local dir curr if [ "$cgrp" == "_root_" ]; then dir=. else dir=$(echo $cgrp |tr '_' '/') fi echo -e "group $dir {" >> $CGCONFIGCONF CG_KNOB_VAL_LIST= config_list_foreach $cgrp option cgroupinit_add_knob_val_to_list CG_KNOB_VAL_LIST=$(echo "$CG_KNOB_VAL_LIST" |sort) curr="_none_" for knob_val in $CG_KNOB_VAL_LIST ; do local ctrlr knob val knob=$(echo $knob_val |awk -F= '{print $1}') ctrlr=$(echo $knob |awk -F. '{print $1}') val=$(echo $knob_val |awk -F= '{print $2}') if [ "$curr" != "$ctrlr" ]; then [ "$curr" == "_none_" ] || echo -e "\t}" >> $CGCONFIGCONF curr=$ctrlr echo -e "\t$curr {" >> $CGCONFIGCONF fi echo -e "\t\t$knob = \"$val\";" >> $CGCONFIGCONF done [ "$curr" == "_none_" ] || echo -e "\t}" >> $CGCONFIGCONF echo -e "}\n" >> $CGCONFIGCONF } cgroupinit_add_to_rules () { local name_grp=$1 local name grp name=$(echo $name_grp |awk -F= '{print $1}') grp=$(echo $name_grp |awk -F= '{print $2}') echo -e "*:$name\t*\t$grp" >> $CGRULESCONF } cgroupinit_generate_config () { local enab defgrp config_load $CGCONFIG config_get enab cgroups enabled "1" [ $enab -eq 0 ] && return 1 config_get defgrp cgroups defgroup "_undef_" [ "$defgrp" == "_undef_" ] && return 1 # mount here instead of in cgconfigparser to get all options right # mounting without any controllers listed means mount all available if ! grep -q " $CGBASEDIR cgroup " /proc/mounts; then mount -t cgroup -o nodev,noexec,nosuid cgroup $CGBASEDIR [ $? -eq 0 ] || return 1 fi echo -n '' > $CGCONFIGCONF config_foreach cgroupinit_create_group cgroup echo -n '' > $CGRULESCONF config_list_foreach procmap procmap cgroupinit_add_to_rules echo -e "*\t*\t$defgrp" >> $CGRULESCONF return 0 } # cgrulesengd has hardcoded paths for configuration files # use symlinks to point to generated config files cgroupinit_cgrulesengd_fixup () { [ -r /etc/cgrules.conf ] || ln -s $CGRULESCONF /etc/cgrules.conf [ -r /etc/cgconfig.conf ] || ln -s $CGCONFIGCONF /etc/cgconfig.conf [ -d /etc/cgconfig.d ] || mkdir /etc/cgconfig.d } start_service () { cgroupinit_generate_config [ $? -eq 0 ] || return cgroupinit_cgrulesengd_fixup /usr/sbin/cgconfigparser -l $CGCONFIGCONF || return procd_open_instance procd_set_param command /usr/sbin/cgrulesengd --nodaemon --syslog procd_set_param respawn procd_close_instance } stop_service () { /usr/sbin/cgclear } service_triggers() { procd_add_reload_trigger $CGCONFIG }