рдПрдХреНрд╕рдИрдПрди: рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд▓реНрджреА рд╕реЗ рд╡реАрдПрдирд╕реА рдХрдВрд╕реЛрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди


рдПрдЪрд╡реАрдПрдо рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдореЗрдВ рдПрдХреНрд╕рди рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЗ рдХрдВрд╕реЛрд▓ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХреНрд╕рдПрдо рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, Xena рдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдП VNC рдХрдВрд╕реЛрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ VNC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдХрд╛рд░реНрдп


рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЪрд▓рд╛рдиреЗ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ VNC рдПрдкреНрд▓реЗрдЯ рдПрдореНрдмреЗрдбреЗрдб рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХрд┐ рдЖрдк рдкрд╛рдпрдерди рд╕реЗ рдЬрд╝реЗрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╣реБрдЖ?


рд░рдирд┐рдВрдЧ рдбреЛрдо рдХреА рд╕реВрдЪреА




рд╡реАрдПрдирд╕реА рдЦреБрдж рдХреЛ рд╕рд╛рдВрддреНрд╡рдирд╛ рджреЗрддрд╛ рд╣реИ






рдХреИрд╕реЗ рдХрд┐рдпрд╛


рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдФрд░ рд╣рд▓реНрдХреЗ рдЪреЗрд░рд┐рдкреА рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ


vm_console.py #   static #     static/table.htm #    domU,          static/vnc.js # javascript      VNC-       static/vnc.htm #      VNC-,         static/tightvnc-jviewer.jar # java-    VNC,   http://www.tightvnc.com/ static/styles.css #      domU,   http://veerle-v2.duoh.com/blog/comments/a_css_styled_table/ static/images #     static/images/bg_header.jpg static/images/bullet1.gif 


рдЕрдкрдиреЗ рдЖрдк рдХреЛ рддрд┐рд░рд╕реНрдХрд╛рд░


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рддрд░реНрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
   -    domU    VNC-                java VNC-        

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ: рдЪреЗрд░реА, рд╕реНрд╡рдпрдВ, рдПрдХреНрд╕рдИрдПрди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╡реАрдПрдирд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рдкрддреЗ рдФрд░ рдмрдВрджрд░рдЧрд╛рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЙрдбреНрдпреВрд▓:
 import cherrypy from xen.util.xmlrpcclient import ServerProxy import re 

рдбреЛрдореВ рдЪрд▓рд╛рдиреЗ рдФрд░ рдПрдХ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛:
 class xen(): """Communicates with xen via rpc""" @staticmethod def get_domains(): """Gets a dictionary with 'Domain Name':'VNC host:port' structure""" server = ServerProxy('httpu:///var/run/xend/xmlrpc.sock') domains = server.xend.domains_with_state(True, 'all', 1) domain_list = {} for first_level in domains: # iterate through first level parameters for second_level in first_level: # iterate through second level parameters if second_level[0] == "name" and second_level[1] != "Domain-0": domain_list_current = second_level[1] if second_level[0] == "device": for third_level in second_level[1]: # iterate through third level subparameters if third_level[0] == "location" and re.match("\d+\.\d+\.\d+\.\d+\:\d\d\d\d", third_level[1]): domain_list[domain_list_current] = str(third_level[1]) return domain_list @staticmethod def create_domain_table(): """Creates table from domain list""" table = """<table id='mytable' cellspacing='0'><caption>List of active domUs</caption> <th scope="col" class="nobg">domU</th> <th scope="col">VNC host:port</th> """ domain_list = xen.get_domains() for k, v in domain_list.iteritems(): link = v.split(':', 1)[1] table += """ <tr> <th class="spec" scope="row">%s</th> <td><a href="javascript:vnc_console('/vnc/%s')" target='_blank'>%s</a></td> </tr> """ % (k, link, v) table += "</table>" return table 

рдпрд╣ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдИрдПрди рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣реЗ рдбреЛрдо рдХреА рд╕реВрдЪреА рдЦреАрдВрдЪрддреА рд╣реИред рдлрд┐рд░ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ: domU рдирд╛рдо рдФрд░ рдкрддрд╛: VNC рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯред рдЙрд╕рдХреЗ рдмрд╛рдж, рд░рдирд┐рдВрдЧ рдбреЛрдо рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

рдореИрдВрдиреЗ рдПрдХреНрд╕рдПрдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рдПрдХреНрд╕рдПрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдзрд┐ рдХреА рдЬрд╛рд╕реВрд╕реА рдХреА, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ
 /usr/lib64/python2.7/site-packages/xen/util/xmlrpcclient.py 
рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЕрдЧрд░ рд╕рдордп рд╣реИ, рддреЛ рдореИрдВ рдПрдХреНрд╕рдПрдПрдирд╡рд╛рдИ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХреНрд╕рдПрдПрдирдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░реВрдБрдЧрд╛ред

рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛:
 class listvm(object): def index(self, port=None): """Just a stub""" return """<h1><a href="/vnc/">vnc</a></h1>""" index.exposed = True def vnc(self, port=None): """Show running vm's or open vnc applet""" if port: template = open("static/vnc.htm", 'r').read() return template % port else: template = open("static/table.htm", 'r').read() return template % xen.create_domain_table() vnc.exposed = True 

рд╣рдо vnc рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЬрд╛рдирд╛ рд╣реИ
 < >/vnc 
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд▓реИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреЛрд░реНрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рдирд┐рдВрдЧ рдбреЛрдореВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛
 < >/vnc/5900 
рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдХрдВрд╕реЛрд▓ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред рд╢рд╛рдиреНрддрд┐ Proxmox VE рд╕реЗ рдлрд╛рдбрд╝рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдкреНрд▓реЗрдЯ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, Proxmox VE рдХрд╛ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдирдИ рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЪреЗрд░реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ:
 server_config = { 'server.socket_host': '127.0.0.1', 'server.socket_port': 80, 'tools.staticdir.root': "/usr/local/vm_console", 'tools.staticdir.debug': True, } cherrypy.config.update(server_config) listvm_config = { '/static': {'tools.staticdir.on': True, 'tools.staticdir.dir': "static", } } cherrypy.tree.mount(listvm(), '/', config=listvm_config) cherrypy.engine.start() cherrypy.engine.block() 


рдореИрдВ рдкреНрд░рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ


рдореИрдВрдиреЗ github рдкрд░ рд╕рдм рдХреБрдЫ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: github.com/sistemshik/vm_console

Source: https://habr.com/ru/post/In143694/


All Articles