import collectd
import random
import socket
import os

#== Our Own Functions go here: ==#
def configer(ObjConfiguration):
   collectd.debug('Configuring Stuff') 

def initer():
    collectd.debug('initing stuff')

def reader(input_data=None):

    metric1 = collectd.Values();
    metric1.plugin = 'stamina'
    metric1.type = 'gauge'
    metric1.values = [random.random()]
    metric1.host = str(socket.gethostname())
    metric1.dispatch()

    cgroupDir = '/sys/fs/cgroup/'
    lxcDir = '/libvirt/lxc/'  

    memoryDir = cgroupDir + 'memory' + lxcDir

    for dirname, dirnames, filenames in os.walk(memoryDir):
        for subdirname in dirnames:
            lxcName = os.path.relpath(subdirname)

            with open(os.path.join(dirname, subdirname)+'/memory.stat', 'r') as f:
                lines = f.read().splitlines()

            mem_rss = 0
            mem_cache = 0
            mem_swap = 0

            for line in lines:
                data = line.split()
                if data[0] == "total_rss":
                        mem_rss = int(data[1])
                elif data[0] == "total_cache":
                        mem_cache = int(data[1])
                elif data[0] == "total_swap":
                        mem_swap = int(data[1])
            
            memory_rss = collectd.Values();
            memory_rss.plugin = str(lxcName + '-mem_rss')
            memory_rss.type = 'gauge'
            memory_rss.values = [mem_rss]
            memory_rss.host = str(socket.gethostname())
            memory_rss.dispatch()

            memory_cache = collectd.Values();
            memory_cache.plugin = str(lxcName + '-mem_cache')
            memory_cache.type = 'gauge'
            memory_cache.values = [mem_cache]
            memory_cache.host = str(socket.gethostname())
            memory_cache.dispatch()

            memory_swap = collectd.Values();
            memory_swap.plugin = str(lxcName + '-mem_swap')
            memory_swap.type = 'gauge'
            memory_swap.values = [mem_swap]
            memory_swap.host = str(socket.gethostname())
            memory_swap.dispatch()

    cpuacctDir = cgroupDir + 'cpu,cpuacct' + '/system/libvirtd.service/' + lxcDir

    for dirname, dirnames, filenames in os.walk(cpuacctDir):
        for subdirname in dirnames:
            lxcName = os.path.relpath(subdirname)

            cpu_usage = 0

            with open(os.path.join(dirname, subdirname)+'/cpuacct.usage', 'r') as f:
                cpu_usage = int(f.readline()) 

            CPU_usage = collectd.Values();
            CPU_usage.plugin = str(lxcName + '-CPU_usage')
            CPU_usage.type = 'gauge'
            CPU_usage.values = [cpu_usage]
            CPU_usage.host = str(socket.gethostname())
            CPU_usage.dispatch()           

#== Hook Callbacks, Order is important! ==#
collectd.register_config(configer)
collectd.register_init(initer)
collectd.register_read(reader)
