mirror of
				https://github.com/retspen/webvirtcloud
				synced 2025-07-31 12:41:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python
 | 
						|
#
 | 
						|
# gstfsd - WebVirtCloud daemon for managing VM's filesystem
 | 
						|
#
 | 
						|
 | 
						|
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
 | 
						|
        d = self.request.recv(1024).strip()
 | 
						|
        data = json.loads(d)
 | 
						|
 | 
						|
        # 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'):
 | 
						|
                        if data['action'] == 'password':
 | 
						|
                            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')
 | 
						|
                            self.request.sendall(json.dumps({'return': 'success'}))
 | 
						|
                        if data['action'] == 'publickey':
 | 
						|
                            if not gfs.is_dir('/root/.ssh'):
 | 
						|
                                gfs.mkdir('/root/.ssh')
 | 
						|
                                gfs.chmod(700, "/root/.ssh")
 | 
						|
                            gfs.write('/root/.ssh/authorized_keys', data['key'])
 | 
						|
                            gfs.chmod(600, '/root/.ssh/authorized_keys')
 | 
						|
                            self.request.sendall(json.dumps({'return': 'success'}))
 | 
						|
                    gfs.umount(part)
 | 
						|
                except RuntimeError:
 | 
						|
                    pass
 | 
						|
            gfs.shutdown()
 | 
						|
            gfs.close()
 | 
						|
        except Exception as err:
 | 
						|
            self.request.sendall(bytes(json.dumps({'return': 'error', 'message': str(err)}).encode()))
 | 
						|
 | 
						|
 | 
						|
server = MyTCPServer((ADDRESS, PORT), MyTCPServerHandler)
 | 
						|
server.serve_forever()
 |