#!/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):
        # recive data
        data = json.loads(self.request.recv(1024).strip())

        # GuestFS
        gfs = guestfs.GuestFS (python_return_dict=True)
        try:
            gfs.add_domain(data['vname'])
            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:" + data['passwd'] + ":"
                        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}))

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