ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/external/subpack/utils/collectd/files/collectd.init b/external/subpack/utils/collectd/files/collectd.init
new file mode 100644
index 0000000..b8c0f36
--- /dev/null
+++ b/external/subpack/utils/collectd/files/collectd.init
@@ -0,0 +1,378 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2016 OpenWrt.org
+
+START=80
+STOP=10
+
+USE_PROCD=1
+COLLECTD_CONF="/tmp/collectd.conf"
+LOG="logger -t collectd[$$] -p"
+NICEPRIO=5
+
+CONFIG_STRING=""
+
+[ -d /usr/libexec/collectd ] && {
+	find /usr/libexec/collectd ! -perm 0500 -exec chmod 0500 '{}' '+'
+	find /usr/libexec/collectd ! \( -user nobody -a -group nogroup \) -exec chown nobody:nogroup '{}' '+'
+}
+
+process_exec() {
+	printf "<Plugin exec>\n" >> "$COLLECTD_CONF"
+	config_foreach process_exec_sections exec_input "Exec"
+	config_foreach process_exec_sections exec_notify "NotificationExec"
+	printf "</Plugin>\n\n" >> "$COLLECTD_CONF"
+}
+
+process_exec_sections() {
+	local cfg="$1"
+	local section="$2"
+
+	local cmdline cmduser cmdgroup
+
+	config_get cmdline "$cfg" cmdline
+	[ -z "$cmdline" ] && {
+		$LOG notice "No cmdline option in config $cfg defined"
+		return 0
+	}
+
+	config_get cmduser "$cfg" cmduser
+	[ -z "$cmduser" ] && {
+		$LOG notice "No cmduser option in config $cfg defined"
+		return 0
+	}
+
+	config_get cmdgroup "$cfg" cmdgroup
+	if [ -z "$cmdgroup" ]; then
+		printf "\\t%s \"%s\" \"%s\"\n" "${section}" "${cmduser}" "${cmdline}" >> "$COLLECTD_CONF"
+	else
+		printf "\\t%s \"%s:%s\" \"%s\"\n" "${section}" "${cmduser}" "${cmdgroup}" "${cmdline}" >> "$COLLECTD_CONF"
+	fi
+}
+
+process_curl() {
+	printf "<Plugin curl>\n" >> "$COLLECTD_CONF"
+	config_foreach process_curl_page curl_page
+	printf "</Plugin>\n\n" >> "$COLLECTD_CONF"
+}
+
+process_curl_page() {
+	local cfg="$1"
+
+	local name url
+
+	config_get name "$cfg" name
+	[ -z "$name" ] && {
+		$LOG notice "No name option in config $cfg defined"
+		return 0
+	}
+
+	config_get url "$cfg" url
+	[ -z "$url" ] && {
+		$LOG notice "No URL option in config $cfg defined"
+		return 0
+	}
+
+	printf "\\t<Page \"%s\">\n" "${name}" >> "$COLLECTD_CONF"
+	printf "\\t\\tURL \"%s\"\n" "${url}" >> "$COLLECTD_CONF"
+	printf "\\t\\tMeasureResponseTime true\n" >> "$COLLECTD_CONF"
+	printf "\\t</Page>\n" >> "$COLLECTD_CONF"
+}
+
+process_network() {
+	local cfg="$1"
+
+	local TimeToLive Forward CacheFlush
+
+	printf "<Plugin network>\n" >> "$COLLECTD_CONF"
+	config_foreach process_network_sections network_listen "listen"
+	config_foreach process_network_sections network_server "server"
+
+	config_get TimeToLive "$cfg" TimeToLive
+	[ -z "$TimeToLive" ] || {
+		printf "\\tTimeToLive %s\n" "${TimeToLive}" >> "$COLLECTD_CONF"
+	}
+
+	config_get CacheFlush "$cfg" CacheFlush
+	[ -z "$CacheFlush" ] || {
+		printf "\\tCacheFlush %s\n" "${CacheFlush}" >> "$COLLECTD_CONF"
+	}
+
+	config_get_bool Forward "$cfg" Forward
+	if [ "$Forward" = "0" ]; then
+		printf "\\tForward false\n" >> "$COLLECTD_CONF"
+	else
+		printf "\\tForward true\n" >> "$COLLECTD_CONF"
+	fi
+
+	printf "</Plugin>\n\n" >> "$COLLECTD_CONF"
+}
+
+process_network_sections() {
+	local cfg="$1"
+	local section="$2"
+
+	local host port output
+
+	config_get host "$cfg" host
+	[ -z "$host" ] && {
+		$LOG notice "No host option in config $cfg defined"
+		return 0
+	}
+
+	if [ "$section" = "server" ]; then
+		output="Server \"$host\""
+	else
+		output="Listen \"$host\""
+	fi
+
+	config_get port "$cfg" port
+	if [ -z "$port" ]; then
+		printf "\\t%s\n" "${output}" >> "$COLLECTD_CONF"
+	else
+		printf "\\t%s \"%s\"\n" "${output}" "${port}" >> "$COLLECTD_CONF"
+	fi
+}
+
+process_iptables() {
+	local cfg="$1"
+
+	printf "<Plugin iptables>\n" >> "$COLLECTD_CONF"
+	config_foreach process_iptables_sections iptables_match
+	printf "</Plugin>\n\n" >> "$COLLECTD_CONF"
+}
+
+process_iptables_sections() {
+	local cfg="$1"
+
+	local table chain
+
+	config_get table "$cfg" table
+	[ -z "$table" ] && {
+		$LOG notice "No table option in config $cfg defined"
+		return 0
+	}
+
+	config_get chain "$cfg" chain
+	[ -z "$chain" ] && {
+		$LOG notice "No chain option in config $cfg defined"
+		return 0
+	}
+
+	config_get index "$cfg" index
+	[ -z "$index" ] && {
+		$LOG notice "No index option in config $cfg defined"
+		return 0
+	}
+
+	config_get name "$cfg" name
+	if [ -z "$name" ]; then
+		printf "\\tChain %s %s %s\n" "${table}" "${chain}" "${index}" >> "$COLLECTD_CONF"
+	else
+		printf "\\tChain %s %s %s \"%s\"\n" "${table}" "${chain}" "${index}" "${name}">> "$COLLECTD_CONF"
+	fi
+}
+
+CONFIG_LIST=""
+add_list_option() {
+	local value="$1"
+	local option="$2"
+	local indent="$3"
+
+	CONFIG_LIST="${CONFIG_LIST}${indent}${option} \"$value\"\n"
+}
+
+process_generic() {
+	local cfg="$1"
+	local indent="$2"
+	local json="$3"
+
+	local config=""
+
+	. /usr/share/libubox/jshn.sh
+	json_init
+	json_load_file "$json"
+
+	json_select string 1>/dev/null 2>&1
+	if [ $? -eq 0 ]; then
+		json_get_keys keys
+		for key in ${keys}; do
+			json_get_var option "$key"
+			config_get value "$cfg" "$option" ""
+			[ -z "$value" ] || {
+				config="${config}${indent}${option} \"${value}\"\n"
+			}
+		done
+		json_select ..
+	fi
+
+	json_select bool 1>/dev/null 2>&1
+	if [ $? -eq 0 ]; then
+		json_get_keys keys
+		for key in ${keys}; do
+			json_get_var option "$key"
+			config_get_bool value "$cfg" "$option"
+			if [ "$value" = "0" ]; then
+				config="${config}${indent}${option} false\n"
+			fi
+
+			if [ "$value" = "1" ]; then
+				config="${config}${indent}${option} true\n"
+			fi
+		done
+		json_select ..
+	fi
+
+	json_select list 1>/dev/null 2>&1
+	if [ $? -eq 0 ]; then
+		json_get_keys keys
+		for key in ${keys}; do
+			json_get_var option "$key"
+			CONFIG_LIST=""
+			config_list_foreach "$cfg" "$option" add_list_option "$option" "$indent"
+			config="${config}${CONFIG_LIST}"
+		done
+		json_select ..
+	fi
+
+	[ -z "$config" ] || {
+		printf "%s<Plugin %s>\n" "${CONFIG_STRING}" "$cfg" >> "$COLLECTD_CONF"
+		echo -n -e "${config}" >> "$COLLECTD_CONF"
+		printf "%s</Plugin>\n" "${CONFIG_STRING}" >> "$COLLECTD_CONF"
+	}
+}
+
+process_plugins() {
+	local cfg="$1"
+
+	local enable keys key option value
+
+	config_get enable "$cfg" enable 0
+	[ "$enable" = "1" ] || return 0
+
+	[ -f "/usr/lib/collectd/$cfg.so" ] || {
+		$LOG notice "Plugin collectd-mod-$cfg not installed"
+		return 0
+	}
+
+	[ -f "/usr/share/collectd/plugin/$cfg.json" ] || {
+		$LOG notice "Configuration definition file for $cfg not found"
+		return 0
+	}
+
+	printf "LoadPlugin %s\n" "$cfg" >> "$COLLECTD_CONF"
+	case "$cfg" in
+		exec)
+			CONFIG_STRING=""
+			process_exec
+			;;
+		curl)
+			CONFIG_STRING=""
+			process_curl
+			;;
+		network)
+			CONFIG_STRING=""
+			process_network "$cfg"
+			;;
+		iptables)
+			CONFIG_STRING=""
+			process_iptables
+			;;
+		*)
+			CONFIG_STRING=""
+			process_generic "$cfg" "\\t" "/usr/share/collectd/plugin/$cfg.json"
+		;;
+	esac
+}
+
+process_config() {
+	local alt_config_file BaseDir Include PIDFile PluginDir TypesDB
+	local Interval ReadThreads WriteThreads Hostname
+	local WriteQueueLimitHigh WriteQueueLimitLow CollectInternalStats
+
+	rm -f "$COLLECTD_CONF"
+
+	[ -f /etc/config/collectd ] || {
+		$LOG notice "UCI config not found"
+		return 0
+	}
+	config_load collectd
+	config_get alt_config_file globals alt_config_file
+
+	# If "alt_config_file" specified, use that instead
+	[ -n "$alt_config_file" ] && [ -f "$alt_config_file" ] && {
+		rm -f "$COLLECTD_CONF"
+		ln -s "$alt_config_file" "$COLLECTD_CONF"
+		return 0
+	}
+
+	# GOBAL CONFIG
+	config_get BaseDir globals BaseDir "/var/run/collectd"
+	printf "BaseDir \"%s\"\n" "$BaseDir" >> "$COLLECTD_CONF"
+
+	config_get PIDFile globals PIDFile "/var/run/collectd.pid"
+	printf "PIDFile \"%s\"\n" "$PIDFile" >> "$COLLECTD_CONF"
+
+	config_get PluginDir globals PluginDir "/usr/lib/collectd"
+	printf "PluginDir \"%s\"\n" "$PluginDir" >> "$COLLECTD_CONF"
+
+	config_get TypesDB globals TypesDB "/usr/share/collectd/types.db"
+	printf "TypesDB \"%s\"\n" "$TypesDB" >> "$COLLECTD_CONF"
+
+	config_get Interval globals Interval 30
+	printf "Interval %s\n" "$Interval" >> "$COLLECTD_CONF"
+
+	config_get ReadThreads globals ReadThreads 2
+	printf "ReadThreads %s\n" "$ReadThreads" >> "$COLLECTD_CONF"
+
+	config_get WriteThreads globals WriteThreads 2
+	printf "WriteThreads %s\n" "$WriteThreads" >> "$COLLECTD_CONF"
+
+	config_get WriteQueueLimitLow globals WriteQueueLimitLow 0
+	[ "$WriteQueueLimitLow" -ne 0 ] \
+		&& printf "WriteQueueLimitLow %s\n" "$WriteQueueLimitLow" >> "$COLLECTD_CONF"
+
+	config_get WriteQueueLimitHigh globals WriteQueueLimitHigh 0
+	[ "$WriteQueueLimitHigh" -ne 0 ] \
+		&& printf "WriteQueueLimitHigh %s\n" "$WriteQueueLimitHigh" >> "$COLLECTD_CONF"
+
+	config_get_bool CollectInternalStats globals CollectInternalStats 0
+	if [ "$CollectInternalStats" = "0" ]; then
+		printf "CollectInternalStats false\n" >> "$COLLECTD_CONF"
+	else
+		printf "CollectInternalStats true\n" >> "$COLLECTD_CONF"
+	fi
+
+	config_get Hostname globals Hostname "$(uname -n)"
+	printf "Hostname \"%s\"\n" "$Hostname" >> "$COLLECTD_CONF"
+
+	config_get Include globals Include "/tmp/collectd.d"
+	printf "Include \"%s\"\n" "$Include" >> "$COLLECTD_CONF"
+	mkdir -p "$Include"
+
+	printf "\n" >> "$COLLECTD_CONF"
+
+	# PLUGIN CONFIG
+	config_foreach process_plugins plugin
+}
+
+service_triggers()
+{
+	procd_add_reload_trigger "collectd"
+}
+
+start_service() {
+	process_config
+
+	procd_open_instance
+	procd_set_param command /usr/sbin/collectd
+	procd_append_param command -C "$COLLECTD_CONF"
+	procd_append_param command -f # don't daemonize
+	procd_set_param nice "$NICEPRIO"
+	procd_set_param stderr 1
+	procd_set_param respawn
+	procd_close_instance
+}
+
+reload_service() {
+	restart "$@"
+}
diff --git a/external/subpack/utils/collectd/files/collectd.uci b/external/subpack/utils/collectd/files/collectd.uci
new file mode 100644
index 0000000..a716e93
--- /dev/null
+++ b/external/subpack/utils/collectd/files/collectd.uci
@@ -0,0 +1,215 @@
+config globals 'globals'
+	option alt_config_file "/etc/collectd.conf"
+#	option BaseDir '/var/run/collectd'
+#	option Include '/tmp/collectd.d'
+#	option PIDFile '/var/run/collectd.pid'
+#	option PluginDir '/usr/lib/collectd'
+#	option TypesDB '/usr/share/collectd/types.db'
+#	option Interval '30'
+#	option ReadThreads '2'
+#	option WriteThreads '2'
+#	option WriteQueueLimitLow '0'
+#	option WriteQueueLimitHigh '0'
+#	option CollectInternalStats '0'
+
+#config plugin 'apcups'
+#	option enable '0'
+#	option Host 'localhost'
+#	option Port '3551'
+
+#config plugin 'conntrack'
+#	option enable '0'
+
+#config plugin 'contextswitch'
+#	option enable '0'
+
+#config plugin 'cpu'
+#	option enable '0'
+
+#config plugin 'cpufreq'
+#	option enable '0'
+
+#config plugin 'csv'
+#	option enable '0'
+#	option StoreRates '0'
+#	option DataDir '/tmp'
+
+#config plugin 'curl'
+#	option enable '0'
+
+#config curl_page
+#	option name 'test'
+#	option url 'http://finance.google.com/finance?q=NYSE%3AAMD%22'
+
+#config plugin 'df'
+#	option enable '0'
+#	list Device '/dev/mtdblock/4'
+#	list MountPoint '/jffs'
+#	list FSType 'tmpfs'
+#	option IgnoreSelected '0'
+
+#config plugin 'disk'
+#	option enable '0'
+#	list Disk 'hda1'
+#	list Disk 'hdb'
+#	option IgnoreSelected '0'
+
+#config plugin 'dns'
+#	option enable '0'
+#	list Interface 'br-lan'
+#	list IgnoreSource '127.0.0.1'
+
+#config plugin 'email'
+#	option enable '0'
+#	option SocketFile '/var/run/collectd/email.sock'
+#	option SocketGroup 'nogroup'
+
+#config plugin 'entropy'
+#	option enable '0'
+
+#config plugin 'exec'
+#	option enable '0'
+
+#config exec_input
+#	option cmdline '/usr/bin/stat-dhcpusers'
+#	option cmduser 'nobody'
+#	option cmdgroup 'nogroup'
+
+#config exec_notify
+#	option cmdline '/usr/bin/stat-dhcpusers'
+#	option cmduser 'nobody'
+#	option cmdgroup 'nogroup'
+
+#config plugin 'interface'
+#	option enable '1'
+#	list Interface 'br-lan'
+#	option IgnoreSelected '0'
+
+#config plugin 'iptables'
+#	option enable '1'
+
+#config iptables_match
+#	option table 'nat'
+#	option chain 'zone_wan_postrouting'
+#	option index '1'
+#	option name 'WLAN-Clients traffic'
+
+#config plugin 'irq'
+#	option enable '0'
+#	list Irq '2'
+#	list Irq '3'
+#	list Irq '4'
+#	list Irq '7'
+
+#config plugin 'iwinfo'
+#	option enable '0'
+
+#config plugin 'load'
+#	option enable '0'
+
+#config plugin 'lua'
+#	option BasePath '/usr/share/collectd-mod-lua'
+#	list Script 'script1.lua'
+#	list Script 'script2.lua
+
+#config plugin 'memory'
+#	option enable '0'
+
+#config plugin 'netlink'
+#	option enable '0'
+#	option IgnoreSelected '0'
+#	list VerboseInterface 'br-lan'
+#	list QDisc 'br-lan'
+
+#config plugin 'network'
+#	option enable '1'
+#	option TimeToLive '128'
+#	option Forward '1'
+#	option CacheFlush '86400'
+
+#config network_listen
+#	option host '0.0.0.0'
+#	option port '25826'
+
+#config network_server
+#	option host '1.1.1.1'
+#	option port '25826'
+
+#config plugin 'nut'
+#	option enable '0'
+#	option UPS 'myupsname'
+
+#config plugin 'olsrd'
+#	option enable '0'
+#	option Port '2006'
+#	option Host '127.0.0.1'
+
+#config plugin 'openvpn'
+#	option enable '0'
+#	option StatusFile '/var/run/openvpn/openvpn.status'
+#	option CollectIndividualUsers '1'
+#	optoin CollectUserCount '1'
+#	optoin CollectCompression '1'
+#	option ImprovedNamingSchema '0'
+
+#config plugin 'ping'
+#	option enable '0'
+#	option TTL '127'
+#	option Interval '30'
+#	list Host '127.0.0.1'
+
+#config plugin 'processes'
+#	option enable '0'
+#	list Process 'uhttpd'
+#	list Process 'dnsmasq'
+#	list Process 'dropbear'
+
+#config plugin 'rrdtool'
+#	option enable '0'
+#	option DataDir '/tmp/rrd'
+#	option RRARows '100'
+#	option RRASingle '1'
+#	list RRATimespan '3600'
+#	list RRATimespan '86400'
+#	list RRATimespan '604800'
+#	list RRATimespan '2678400'
+#	list RRATimespan '31622400'
+
+#config plugin 'sensors'
+#	option enable '0'
+
+#config plugin 'swap'
+#	option enable '0'
+#	option ReportByDevice '1'
+#	option ValuesAbsolute '1'
+#	option ValuesPercentage '0'
+#	option ReportIO '1'
+#	option ReportBytes '1'
+
+#config plugin 'tcpconns'
+#	option enable '0'
+#	list ListeningPort '0'
+#	list LocalPort '22'
+#	list LocalPort '80'
+
+#config plugin 'thermal'
+#	option enable '0'
+#	option IgnoreSelected '0'
+#	list Device ''
+
+#config plugin 'ubi'
+#	option enable '0'
+#	list  Device 'ubi0'
+#	option IgnoreSelected '0'
+
+#config plugin 'unixsock'
+#	option enable '0'
+#	option SocketFile '/var/run/collectd/query.sock'
+#	option SocketGroup 'nogroup'
+
+#config plugin 'uptime'
+#	option enable '0'
+
+#config plugin 'vmem'
+#	option enable '0'
+#	option Verbose '0'
diff --git a/external/subpack/utils/collectd/files/exec-scripts/sqm_collectd.sh b/external/subpack/utils/collectd/files/exec-scripts/sqm_collectd.sh
new file mode 100755
index 0000000..ad84fc7
--- /dev/null
+++ b/external/subpack/utils/collectd/files/exec-scripts/sqm_collectd.sh
@@ -0,0 +1,107 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
+INTERVAL="${COLLECTD_INTERVAL:-60}"
+
+handle_cake() {
+	local ifc ifr tin i
+
+	ifc="$1"
+	ifr="${ifc//[!0-9A-Za-z]/_}"
+
+	# Overall
+	json_get_vars bytes packets drops backlog qlen
+
+	# Options
+	json_select options
+	json_get_vars bandwidth diffserv
+	json_select ".."
+
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_bytes\" interval=$INTERVAL N:$bytes"
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_drops\" interval=$INTERVAL N:$drops"
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_backlog\" interval=$INTERVAL N:$backlog"
+
+	# ash doesn't have arrays so prepare to get a little creative
+	case "$diffserv" in
+		diffserv3 | diffserv4) tns="BKBEVIVO"
+			;;
+		*) tns="T0T1T2T3T4T5T6T7"
+			;;
+	esac
+
+	# Tins
+	# Flows & delays indicate the state as of the last packet that flowed through, so they appear to get stuck.
+	# Discard the results from a stuck tin.
+	json_get_keys tins tins
+	json_select tins
+	i=0
+	for tin in $tins; do
+		json_select "$tin"
+		json_get_vars threshold_rate sent_bytes sent_packets backlog_bytes target_us peak_delay_us avg_delay_us base_delay_us drops ecn_mark ack_drops sparse_flows bulk_flows unresponsive_flows
+
+		eval osp="\$osp${ifr}t${i}"
+		if  [ "$osp" ] && [ "$osp" -eq "$sent_packets" ] ; then
+			peak_delay_us=0; avg_delay_us=0; base_delay_us=0
+			sparse_flows=0; bulk_flows=0; unresponsive_flows=0
+		else
+			eval "osp${ifr}t${i}=$sent_packets"
+		fi
+
+		tn=${tns:$((i<<1)):2}
+
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_bytes-$tn\" interval=$INTERVAL N:$sent_bytes"
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_thres-$tn\" interval=$INTERVAL N:$threshold_rate"
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_drops-$tn\" interval=$INTERVAL N:$drops:$ecn_mark:$ack_drops"
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_backlog-$tn\" interval=$INTERVAL N:$backlog_bytes"
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_flows-$tn\" interval=$INTERVAL N:$sparse_flows:$bulk_flows:$unresponsive_flows"
+		echo "PUTVAL \"$HOSTNAME/sqmcake-$ifc/qdisct_latencyus-$tn\" interval=$INTERVAL N:$target_us:$peak_delay_us:$avg_delay_us:$base_delay_us"
+
+		json_select ..
+		i=$((i+1))
+	done
+	json_select ..
+}
+
+handle_mq() {
+	ifc="$1"
+
+	# Overall
+	json_get_vars bytes drops backlog
+
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_bytes\" interval=$INTERVAL N:$bytes"
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_drops\" interval=$INTERVAL N:$drops"
+	echo "PUTVAL \"$HOSTNAME/sqm-$ifc/qdisc_backlog\" interval=$INTERVAL N:$backlog"
+}
+
+process_qdisc() {
+	local ifc jsn
+
+	ifc="$1"
+	jsn=$(tc -s -j qdisc show dev "$ifc") || return
+
+	# strip leading & trailing []
+	jsn="${jsn#[}" ; jsn="${jsn%]}"
+
+	json_load "${jsn}"
+	json_get_var qdisc kind
+
+	case "$qdisc" in
+		cake) handle_cake "$ifc"
+		;;
+		mq) handle_mq "$ifc"
+		;;
+
+		*) echo "Unknown qdisc type '$qdisc' on interface '$ifc'" 1>&2
+		;;
+	esac
+	json_cleanup
+}
+
+while true ; do
+	for ifc in "$@" ; do
+		process_qdisc "$ifc"
+	done
+	sleep "${INTERVAL%%.*}"
+done
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/apcups.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/apcups.json
new file mode 100644
index 0000000..15a31df
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/apcups.json
@@ -0,0 +1,6 @@
+{
+	"string": [
+		"Host",
+		"Port"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/conntrack.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/conntrack.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/conntrack.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/contextswitch.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/contextswitch.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/contextswitch.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpu.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpu.json
new file mode 100644
index 0000000..ef28a43
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpu.json
@@ -0,0 +1,7 @@
+{
+	"bool": [
+		"ValuesPercentage",
+		"ReportByCpu",
+		"ReportByState"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpufreq.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpufreq.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/cpufreq.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/csv.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/csv.json
new file mode 100644
index 0000000..3e89972
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/csv.json
@@ -0,0 +1,8 @@
+{
+	"string": [
+		"DataDir"
+	],
+	"bool": [
+		"StoreRates"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/curl.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/curl.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/curl.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/df.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/df.json
new file mode 100644
index 0000000..dde65fd
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/df.json
@@ -0,0 +1,10 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Device",
+		"MountPoint",
+		"FSType"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/disk.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/disk.json
new file mode 100644
index 0000000..e7b9214
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/disk.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Disk"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/dns.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/dns.json
new file mode 100644
index 0000000..c9dacf1
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/dns.json
@@ -0,0 +1,6 @@
+{
+	"list": [
+		"Interface",
+		"IgnoreSource"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/email.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/email.json
new file mode 100644
index 0000000..eb6b3ef
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/email.json
@@ -0,0 +1,8 @@
+{
+	"string": [
+		"SocketFile",
+		"SocketGroup",
+		"SocketPerms",
+		"MaxConns"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/entropy.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/entropy.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/entropy.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/exec.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/exec.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/exec.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/interface.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/interface.json
new file mode 100644
index 0000000..aef2522
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/interface.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Interface"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iptables.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iptables.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iptables.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/irq.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/irq.json
new file mode 100644
index 0000000..0f7e59c
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/irq.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Irq"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iwinfo.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iwinfo.json
new file mode 100644
index 0000000..aef2522
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/iwinfo.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Interface"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/load.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/load.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/load.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/logfile.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/logfile.json
new file mode 100644
index 0000000..fd16084
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/logfile.json
@@ -0,0 +1,9 @@
+{
+	"string": [
+		"LogLevel",
+		"File"
+	],
+	"bool": [
+		"Timestamp"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/lua.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/lua.json
new file mode 100644
index 0000000..2bc7b68
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/lua.json
@@ -0,0 +1,8 @@
+{
+	"string": [
+		"BasePath"
+	],
+	"list": [
+		"Script"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/memory.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/memory.json
new file mode 100644
index 0000000..fc43e2f
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/memory.json
@@ -0,0 +1,6 @@
+{
+	"bool": [
+		"ValuesPercentage",
+		"ValuesAbsolute"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/netlink.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/netlink.json
new file mode 100644
index 0000000..7ef7b77
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/netlink.json
@@ -0,0 +1,12 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Interface",
+		"VerboseInterface",
+		"QDisc",
+		"Classe",
+		"Filter"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/network.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/network.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/network.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/nut.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/nut.json
new file mode 100644
index 0000000..4cac99f
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/nut.json
@@ -0,0 +1,5 @@
+{
+	"string": [
+		"UPS"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/olsrd.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/olsrd.json
new file mode 100644
index 0000000..04c0438
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/olsrd.json
@@ -0,0 +1,9 @@
+{
+	"string": [
+		"Host",
+		"Port",
+		"CollectLinks",
+		"CollectRoutes",
+		"CollectTopology"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/openvpn.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/openvpn.json
new file mode 100644
index 0000000..87a3f16
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/openvpn.json
@@ -0,0 +1,11 @@
+{
+	"string": [
+		"StatusFile"
+	],
+	"bool": [
+		"CollectIndividualUsers",
+		"CollectUserCount",
+		"CollectCompression",
+		"ImprovedNamingSchema"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ping.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ping.json
new file mode 100644
index 0000000..53bc88c
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ping.json
@@ -0,0 +1,9 @@
+{
+	"string": [
+		"TTL",
+		"Interval"
+	],
+	"list": [
+		"Host"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/processes.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/processes.json
new file mode 100644
index 0000000..6e38fa9
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/processes.json
@@ -0,0 +1,5 @@
+{
+	"list": [
+		"Process"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/rrdtool.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/rrdtool.json
new file mode 100644
index 0000000..339f6ac
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/rrdtool.json
@@ -0,0 +1,17 @@
+{
+	"string": [
+		"DataDir",
+		"StepSize",
+		"HeartBeat",
+		"RRARows",
+		"XFF",
+		"CacheFlush",
+		"CacheTimeout"
+	],
+	"bool": [
+		"RRASingle"
+	],
+	"list": [
+		"RRATimespan"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/sensors.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/sensors.json
new file mode 100644
index 0000000..35915ba
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/sensors.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Sensor"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/smart.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/smart.json
new file mode 100644
index 0000000..52d6246
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/smart.json
@@ -0,0 +1,10 @@
+{
+	"bool": [
+		"IgnoreSelected",
+		"IgnoreSleepMode",
+		"UseSerial"
+	],
+	"list": [
+		"Disk"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/swap.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/swap.json
new file mode 100644
index 0000000..88734af
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/swap.json
@@ -0,0 +1,9 @@
+{
+	"bool": [
+		"ReportBytes",
+		"ReportByDevice",
+		"ValuesAbsolute",
+		"ValuesPercentage",
+		"ReportIO"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/syslog.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/syslog.json
new file mode 100644
index 0000000..d476509
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/syslog.json
@@ -0,0 +1,6 @@
+{
+	"string": [
+		"LogLevel",
+		"NotifyLevel"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/tcpconns.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/tcpconns.json
new file mode 100644
index 0000000..56a4c81
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/tcpconns.json
@@ -0,0 +1,9 @@
+{
+	"bool": [
+		"ListeningPorts"
+	],
+	"list": [
+		"LocalPort",
+		"RemotePort"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/thermal.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/thermal.json
new file mode 100644
index 0000000..cf93fc2
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/thermal.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Device"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ubi.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ubi.json
new file mode 100644
index 0000000..cf93fc2
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/ubi.json
@@ -0,0 +1,8 @@
+{
+	"bool": [
+		"IgnoreSelected"
+	],
+	"list": [
+		"Device"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/unixsock.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/unixsock.json
new file mode 100644
index 0000000..6362a9d
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/unixsock.json
@@ -0,0 +1,7 @@
+{
+	"string": [
+		"SocketFile",
+		"SocketGroup",
+		"SocketPerms"
+	]
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/uptime.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/uptime.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/uptime.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/external/subpack/utils/collectd/files/usr/share/collectd/plugin/vmem.json b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/vmem.json
new file mode 100644
index 0000000..5fb8a85
--- /dev/null
+++ b/external/subpack/utils/collectd/files/usr/share/collectd/plugin/vmem.json
@@ -0,0 +1,5 @@
+{
+	"bool": [
+		"Verbose"
+	]
+}