From 8960f883609f0ded92db7bdf2a1d835a32e649fb Mon Sep 17 00:00:00 2001 From: Szymon Datko Date: Fri, 25 Oct 2019 15:07:57 +0200 Subject: [PATCH] Tiny cleanup --- .gitignore | 1 + gerrit_fake_ssh_server.py | 103 ++++++++++++++++++++++---------------- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index c861681..7860fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .venv/ *.swp gerrit_fake_ssh_server.log +jenkins.war diff --git a/gerrit_fake_ssh_server.py b/gerrit_fake_ssh_server.py index 9770f67..01994ae 100644 --- a/gerrit_fake_ssh_server.py +++ b/gerrit_fake_ssh_server.py @@ -1,20 +1,18 @@ #!/usr/bin/env python import inspect +import logging import os -import select -import socket import socketserver import sys import threading import time import traceback -import logging import paramiko -from paramiko.py3compat import u -PORT = 2200 # it could be even 29418, which is standard gerrit port +# it could be even 29418, which is standard gerrit port +PORT = 2200 FILE_DIR = os.path.dirname(__file__) BASE_NAME = os.path.extsep.join(os.path.basename(__file__) @@ -23,19 +21,25 @@ HOST_KEY = paramiko.RSAKey(filename=os.path.join(FILE_DIR, 'gerrit-server-key'), password='jenkins') -COMMANDS_MAP = {'gerrit version': '', - 'gerrit stream-events': '{}\r\n'} - -GERRIT_CMD_VERSION = 'gerrit version 2.16.7\n' - -GERRIT_SHELL_MSG = """ +GERRIT_CMD_PROJECTS = """All-Projects +All-Users +openstack +openstack/nova +openstack/neutron +""" +GERRIT_CMD_VERSION = "ferrit version 1.0.0\n" +GERRIT_SHELL_MSG = """\r **** Welcome to Ferrit Code Review ****\r \r Hi Jenkins, you have successfully connected over SSH.\r \r Unfortunately, interactive shells are disabled.\r + To clone a hosted Git repository, use:\r \r -""" + git clone ssh://localhost:{GERRIT_PORT}/REPOSITORY_NAME.git\r +\r +""".format(GERRIT_PORT=PORT) + LOG = logging.getLogger(__name__) LOG.setLevel(logging.DEBUG) handler = logging.FileHandler(os.path.join(FILE_DIR, BASE_NAME + '.log')) @@ -43,73 +47,79 @@ handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] ' '%(filename)s:%(lineno)s - ' '%(message)s')) LOG.addHandler(handler) +handler = logging.StreamHandler(sys.stdout) +handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] ' + '%(filename)s:%(lineno)s - ' + '%(message)s')) +LOG.addHandler(handler) class Server(paramiko.ServerInterface): - def __init__(self, client_address): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('client_address: %s', client_address) + self.command = None self.event = threading.Event() self.client_address = client_address def check_channel_request(self, kind, chanid): - LOG.debug('Kind: %s, chanid: %s', kind, chanid) + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('kind: %s, chanid: %s', kind, chanid) if kind == 'session': return paramiko.OPEN_SUCCEEDED return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED def get_allowed_auths(self, username): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('username: %s', username) return "password,publickey" def check_auth_password(self, username, password): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('username: %s, password: %s', username, password) return paramiko.AUTH_SUCCESSFUL def check_auth_publickey(self, username, key): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('username: %s, key: %s', username, str(key)[:11]) return paramiko.AUTH_SUCCESSFUL def check_channel_exec_request(self, channel, command): - LOG.debug(inspect.stack()[0][3]) + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('channel: %s, command: %s', channel.get_id(), command) self.command = command self.event.set() return True def check_channel_shell_request(self, channel): - LOG.debug(inspect.stack()[0][3]) - self.command = None + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('channel: %s', channel.get_id()) self.event.set() return True - def check_channel_subsystem_request(self, channel, name): - return True - - def check_channel_window_change_request(self, channel, width, height, - pixelwidth, pixelheight): - return True - - def check_channel_x11_request(self, channel, single_connection, - auth_protocol, auth_cookie, screen_number): - return True - - def check_channel_forward_agent_request(self, channel): - return True - def check_global_request(self, kind, msg): - return True - - def check_channel_direct_tcpip_request(self, chanid, origin, destination): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug('kind: %s, msg: %s', kind, msg) return True def check_channel_env_request(self, channel, name, value): - LOG.debug("channel: %s, name: %s, value: %s", channel, name, value) + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug("channel: %s, name: %s, value: %s", + channel.get_id(), name, value) return True def check_channel_pty_request(self, channel, term, width, height, pixelwidth, pixelheight, modes): + LOG.debug('%s', inspect.stack()[0][3]) + LOG.debug("channel: %s, term: %s, width: %s, height: %s, " + "pixelwidth: %s, pixelheight: %s, modes: %s", + channel.get_id(), term, width, height, + pixelwidth, pixelheight, str(modes)[:7]) return True class SSHHandler(socketserver.StreamRequestHandler): def handle(self): - self._prev = None try: transport = paramiko.Transport(self.connection) transport.add_server_key(HOST_KEY) @@ -132,24 +142,33 @@ class SSHHandler(socketserver.StreamRequestHandler): return 1 if server.command: - LOG.debug('server_command %s, mapped to: %s', - server.command.decode('utf-8'), - COMMANDS_MAP.get(server.command.decode('utf-8'))) - cmd = server.command.decode('utf-8') + LOG.debug('received server command: %s', cmd) if cmd == 'gerrit version': + LOG.debug('sending version string') channel.send(GERRIT_CMD_VERSION) channel.close() + + elif cmd == 'gerrit ls-projects': + LOG.debug('sending list of projects') + channel.send(GERRIT_CMD_PROJECTS) + channel.close() + elif cmd == 'gerrit stream-events': + LOG.debug('sending events from queue...') while True: time.sleep(1) + pass # TODO: implement queue or something here + else: + LOG.debug('unknown command -- closing channel') channel.close() + else: - # interactive session + LOG.debug('requested interactive session') channel.send_stderr(GERRIT_SHELL_MSG) - channel.makefile("rU").read(1) # wait for user interaction + channel.makefile("rU").read(1) # wait for any key press return except Exception: