diff --git a/setup/start/collectd/collectd.conf b/setup/start/collectd/collectd.conf
index fa531d23f..75d559f8b 100644
--- a/setup/start/collectd/collectd.conf
+++ b/setup/start/collectd/collectd.conf
@@ -243,8 +243,19 @@ LoadPlugin write_graphite
Import "du"
- Path boxdata "/home/yellowtent/boxdata"
- Path platformdata "/home/yellowtent/platformdata"
+
+ Instance maildata
+ Dir "/home/yellowtent/boxdata/mail"
+
+
+ Instance boxdata
+ Dir "/home/yellowtent/boxdata"
+ Exclude "mail"
+
+
+ Instance platformdata
+ Dir "/home/yellowtent/platformdata"
+
diff --git a/setup/start/collectd/du.py b/setup/start/collectd/du.py
index cebff1aef..ed3b9d8ad 100644
--- a/setup/start/collectd/du.py
+++ b/setup/start/collectd/du.py
@@ -1,39 +1,55 @@
-import collectd,os,subprocess
+import collectd,os,subprocess,sys
# https://www.programcreek.com/python/example/106897/collectd.register_read
-PATHS = []
-INTERVAL = 60 * 60 * 24
+PATHS = [] # { name, dir, exclude }
+INTERVAL = 60 * 60 * 24 # every day
-def du(path):
- return subprocess.check_output(['du','-Dsb', path]).split()[0].decode('utf-8')
+def du(pathinfo):
+ cmd = 'timeout 1800 du -Dsb "{}"'.format(pathinfo['dir'])
+ if pathinfo['exclude'] != '':
+ cmd += ' --exclude "{}"'.format(pathinfo['exclude'])
-def init():
- global PATHS
- collectd.info('custom du plugin initialized with %s' % PATHS)
+ collectd.info('computing size with command: %s' % cmd);
+ try:
+ size = subprocess.check_output(cmd, shell=True).split()[0].decode('utf-8')
+ collectd.info('\tsize of %s is %s' % (pathinfo['dir'], size))
+ return size
+ except Exception as e:
+ collectd.info('\terror getting the size of %s: %s' % (pathinfo['dir'], str(e)))
+ return -1
-# configure is called for each module block
+# configure is called for each module block. this is called before init
def configure(config):
global PATHS
- for node in config.children:
- key = node.key
-
- if key == 'Path':
- PATHS.append({ 'name': node.values[0], 'path': node.values[1] })
- collectd.info('du plugin: monitoring %s' % node.values[1])
- else:
+ for child in config.children:
+ if child.key != 'Path':
collectd.info('du plugin: Unknown config key "%s"' % key)
+ continue
+
+ pathinfo = { 'name': '', 'dir': '', 'exclude': '' }
+ for node in child.children:
+ if node.key == 'Instance':
+ pathinfo['name'] = node.values[0]
+ elif node.key == 'Dir':
+ pathinfo['dir'] = node.values[0]
+ elif node.key == 'Exclude':
+ pathinfo['exclude'] = node.values[0]
+
+ PATHS.append(pathinfo);
+ collectd.info('du plugin: monitoring %s' % pathinfo['dir']);
+
+def init():
+ global PATHS
+ collectd.info('custom du plugin initialized with %s %s' % (PATHS, sys.version))
def read():
- for p in PATHS:
- path = p['path']
- collectd.info('computing size of %s' % path)
- size = du(path)
- collectd.info('du plugin: size of %s is %s' % (path, size))
+ for pathinfo in PATHS:
+ size = du(pathinfo)
# type comes from https://github.com/collectd/collectd/blob/master/src/types.db
- val = collectd.Values(type='capacity', plugin='du', plugin_instance=p['name'])
+ val = collectd.Values(type='capacity', plugin='du', plugin_instance=pathinfo['name'])
val.dispatch(values=[size], type_instance='usage')
diff --git a/src/cloudron.js b/src/cloudron.js
index 9d60201e3..a52cd64d0 100644
--- a/src/cloudron.js
+++ b/src/cloudron.js
@@ -185,6 +185,7 @@ function getDisks(callback) {
const disks = {
disks: ext4Disks, // root disk is first
boxDataDisk: values[1].filesystem,
+ mailDataDisk: values[1].filesystem,
platformDataDisk: values[2].filesystem,
appsDataDisk: values[3].filesystem,
apps: {}
diff --git a/src/collectd.config.ejs b/src/collectd.config.ejs
index 2d72edab0..ab5d2ce49 100644
--- a/src/collectd.config.ejs
+++ b/src/collectd.config.ejs
@@ -33,7 +33,10 @@ LoadPlugin "table"
- Path "<%= appId %>" "<%= appDataDir %>"
+
+ Instance "<%= appId %>"
+ Dir "<%= appDataDir %>"
+