#!/usr/bin/env python

import SocketServer
import json
import guestfs
import re


PORT = 16510
ADDRESS = "0.0.0.0"


class MyTCPServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = True


class MyTCPServerHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        try:
            # recive data
            data = json.loads(self.request.recv(1024).strip())
            dom_name = data['vname']
            passwd_hash = data['passwd']

            # GuestFS
            gfs = guestfs.GuestFS (python_return_dict=True)
            try:
                gfs.add_domain(dom_name)
                gfs.launch()
                parts = gfs.list_partitions()
                for part in parts:
                    try:
                        gfs.mount(part, '/')
                        if gfs.is_file('/etc/shadow'):
                            file_shadow = gfs.cat('/etc/shadow')
                            new_root_hash = "root:" + passwd_hash + ":"
                            file_shadow_new = re.sub('^root:.*?:', new_root_hash, file_shadow)
                            gfs.write("/etc/shadow", file_shadow_new)
                            gfs.chmod('640', '/etc/shadow')
                            gfs.umount(part)
                            self.request.sendall(json.dumps({'return':'success'}))
                    except RuntimeError:
                        pass
                gfs.shutdown()
                gfs.close()
            except RuntimeError, err:
                self.request.sendall(json.dumps({'return': 'error', 'message': err.message}))

        except Exception, e:
            print "Exception wile receiving message: ", e

server = MyTCPServer((ADDRESS, PORT), MyTCPServerHandler)
server.serve_forever()