mirror of https://github.com/huashengdun/webssh
				
				
				
			Updating known_hosts file periodically for autoadd policy
							parent
							
								
									dc0b48ce9a
								
							
						
					
					
						commit
						82a6dfdabd
					
				
							
								
								
									
										39
									
								
								main.py
								
								
								
								
							
							
						
						
									
										39
									
								
								main.py
								
								
								
								
							| 
						 | 
					@ -6,6 +6,7 @@ import traceback
 | 
				
			||||||
import uuid
 | 
					import uuid
 | 
				
			||||||
import weakref
 | 
					import weakref
 | 
				
			||||||
import paramiko
 | 
					import paramiko
 | 
				
			||||||
 | 
					import tornado.ioloop
 | 
				
			||||||
import tornado.web
 | 
					import tornado.web
 | 
				
			||||||
import tornado.websocket
 | 
					import tornado.websocket
 | 
				
			||||||
from tornado.ioloop import IOLoop
 | 
					from tornado.ioloop import IOLoop
 | 
				
			||||||
| 
						 | 
					@ -19,6 +20,7 @@ define('port', default=8888, help='listen port', type=int)
 | 
				
			||||||
define('debug', default=False, help='debug mode', type=bool)
 | 
					define('debug', default=False, help='debug mode', type=bool)
 | 
				
			||||||
define('policy', default='reject',
 | 
					define('policy', default='reject',
 | 
				
			||||||
       help='missing host key policy, reject|autoadd|warning')
 | 
					       help='missing host key policy, reject|autoadd|warning')
 | 
				
			||||||
 | 
					define('period', default=10, help='seconds for PeriodicCallback', type=int)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BUF_SIZE = 1024
 | 
					BUF_SIZE = 1024
 | 
				
			||||||
| 
						 | 
					@ -197,10 +199,8 @@ class IndexHandler(MixinHandler, tornado.web.RequestHandler):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def ssh_connect(self):
 | 
					    def ssh_connect(self):
 | 
				
			||||||
        ssh = paramiko.SSHClient()
 | 
					        ssh = paramiko.SSHClient()
 | 
				
			||||||
        if isinstance(self.settings['policy'], paramiko.client.AutoAddPolicy):
 | 
					        ssh._system_host_keys = self.settings['system_host_keys']
 | 
				
			||||||
            ssh.load_host_keys(self.settings['host_file'])
 | 
					        ssh._host_keys = self.settings['host_keys']
 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            ssh._host_keys = self.settings['host_keys']
 | 
					 | 
				
			||||||
        ssh.set_missing_host_key_policy(self.settings['policy'])
 | 
					        ssh.set_missing_host_key_policy(self.settings['policy'])
 | 
				
			||||||
        args = self.get_args()
 | 
					        args = self.get_args()
 | 
				
			||||||
        dst_addr = (args[0], args[1])
 | 
					        dst_addr = (args[0], args[1])
 | 
				
			||||||
| 
						 | 
					@ -290,12 +290,12 @@ def get_host_keys(path):
 | 
				
			||||||
    return paramiko.hostkeys.HostKeys()
 | 
					    return paramiko.hostkeys.HostKeys()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def create_host_file(host_file):
 | 
					def save_host_keys(host_keys, filename):
 | 
				
			||||||
    host_keys = get_host_keys(host_file)
 | 
					    length = len(host_keys)
 | 
				
			||||||
    if not host_keys:
 | 
					    if length != host_keys._last_len:
 | 
				
			||||||
        host_keys = get_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
 | 
					        logging.info('Updating {}'.format(filename))
 | 
				
			||||||
    host_keys.save(host_file)
 | 
					        host_keys.save(filename)
 | 
				
			||||||
    return host_keys
 | 
					        host_keys._last_len = length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_policy_class(policy):
 | 
					def get_policy_class(policy):
 | 
				
			||||||
| 
						 | 
					@ -316,12 +316,21 @@ def get_policy_class(policy):
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
    parse_command_line()
 | 
					    parse_command_line()
 | 
				
			||||||
    base_dir = os.path.dirname(__file__)
 | 
					    base_dir = os.path.dirname(__file__)
 | 
				
			||||||
    host_file = os.path.join(base_dir, 'known_hosts')
 | 
					    filename = os.path.join(base_dir, 'known_hosts')
 | 
				
			||||||
    host_keys = create_host_file(host_file)
 | 
					    host_keys = get_host_keys(filename)
 | 
				
			||||||
 | 
					    system_host_keys = get_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
 | 
				
			||||||
    policy_class = get_policy_class(options.policy)
 | 
					    policy_class = get_policy_class(options.policy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not host_keys and policy_class is paramiko.client.RejectPolicy:
 | 
					    if policy_class is paramiko.client.AutoAddPolicy:
 | 
				
			||||||
        raise ValueError('Empty known_hosts with reject policy?')
 | 
					        host_keys.save(filename)  # for permssion test
 | 
				
			||||||
 | 
					        host_keys._last_len = len(host_keys)
 | 
				
			||||||
 | 
					        tornado.ioloop.PeriodicCallback(
 | 
				
			||||||
 | 
					            lambda: save_host_keys(host_keys, filename),
 | 
				
			||||||
 | 
					            options.period * 1000  # milliseconds
 | 
				
			||||||
 | 
					        ).start()
 | 
				
			||||||
 | 
					    elif policy_class is paramiko.client.RejectPolicy:
 | 
				
			||||||
 | 
					        if not host_keys and not system_host_keys:
 | 
				
			||||||
 | 
					            raise ValueError('Empty known_hosts with reject policy?')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    settings = {
 | 
					    settings = {
 | 
				
			||||||
        'template_path': os.path.join(base_dir, 'templates'),
 | 
					        'template_path': os.path.join(base_dir, 'templates'),
 | 
				
			||||||
| 
						 | 
					@ -337,8 +346,8 @@ def main():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    settings.update(
 | 
					    settings.update(
 | 
				
			||||||
        debug=options.debug,
 | 
					        debug=options.debug,
 | 
				
			||||||
        host_file=host_file,
 | 
					 | 
				
			||||||
        host_keys=host_keys,
 | 
					        host_keys=host_keys,
 | 
				
			||||||
 | 
					        system_host_keys=system_host_keys,
 | 
				
			||||||
        policy=policy_class()
 | 
					        policy=policy_class()
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue