#!/bin/bash

# (C) Copyright Canonical Ltd. 2014
#
# Authors:
# Serge Hallyn <serge.hallyn@ubuntu.com>
#
# This library 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.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#

usage() {
	me=`basename $1`
	echo "Usage:"
	echo "   $me ping"
	echo
	echo "   $me create <controller> cgroup"
	echo
	echo "   $me chown <controller> <cgroup> uid gid"
	echo
	echo "   $me chmod <controller> <cgroup> mode"
	echo
	echo "   $me remove <controller> <cgroup>"
	echo
	echo "   $me getpidcgroup <controller> pid"
	echo
	echo "   $me movepid <controller> <cgroup> pid"
	echo
	echo "   $me getvalue <controller> <cgroup> file"
	echo
	echo "   $me setvalue <controller> <cgroup> file value"
	echo
	echo "   $me gettasks <controller> <cgroup>"
	echo
	echo "   $me listchildren <controller> <cgroup>"
	echo
	echo "   $me removeonempty <controller> <cgroup>"
	echo
	echo "   $me apiversion"
	echo ""
	echo " Replace '<controller>' with the desired controller, i.e."
	echo " memory, and '<cgroup>' with the desired cgroup, i.e. x1."
	echo " For create, chown, chmod, remove, and movepid, <controller>"
	echo " may be \"all\"."
	echo " To refer to the current cgroup, use ''."
	exit 1
}

if [ $# -lt 1 ]; then
	usage $0
fi

case "$1" in
	--version)
		echo 0.22
		exit 0
	;;
	ping)
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Ping int32:0
		exit $?
	;;
	getvalue)
		if [ $# -lt 4 ]; then
			usage $0
		fi
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.GetValue string:$2 string:$3 string:$4
		exit $?
	;;
	remove)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Remove string:$cg string:$3 int32:1
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Remove string:$2 string:$3 int32:1
		fi
		exit $?
	;;
	create)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Create string:$cg string:$3
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Create string:$2 string:$3
		fi
		exit $?
	;;
	chown)
		if [ $# -lt 5 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Chown string:$cg string:$3 int32:$4 int32:$5
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Chown string:$2 string:$3 int32:$4 int32:$5
		fi
		exit $?
	;;
	chmod)
		if [ $# -lt 4 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Chmod string:$cg string:$3 int32:$4
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Chmod string:$2 string:$3 int32:$4
		fi
		exit $?
	;;
	getpidcgroup)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.GetPidCgroup string:$2 int32:$3
		exit $?
	;;
	movepid)
		if [ $# -lt 4 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.MovePid string:$cg string:$3 int32:$4
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.MovePid string:$2 string:$3 int32:$4
		fi
		exit $?
	;;
	setvalue)
		if [ $# -lt 5 ]; then
			usage $0
		fi
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.SetValue string:$2 string:$3 string:$4 string:"$5"
		exit $?
	;;
	gettasks)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.GetTasks string:$2 string:$3
		exit $?
	;;
	listchildren)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.ListChildren string:$2 string:$3
		exit $?
	;;
	removeonempty)
		if [ $# -lt 3 ]; then
			usage $0
		fi
		if [ "$2" = "all" ]; then
			for cg in `awk '!/^#/ { print $1 }' /proc/cgroups`; do
				dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.RemoveOnEmpty string:$cg string:$3
			done
		else
			dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock --type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.RemoveOnEmpty string:$2 string:$3
		fi
		exit $?
	;;
	apiversion)
		dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock /org/linuxcontainers/cgmanager org.freedesktop.DBus.Properties.Get string:'org.linuxcontainers.cgmanager0_0' string:'api_version'
		exit $?
	;;
	*)
	usage $0
esac
