def main(): log.startLogging(sys.stderr) keylocation = os.path.expanduser( os.path.join('~', '.gitserverglue', 'key.pem')) key = None if os.path.exists(keylocation): try: key = keys.Key.fromFile(keylocation) except: pass if key is None: rsakey = RSA.generate(2048) key = keys.Key(rsakey) try: if not os.path.exists(os.path.dirname(keylocation)): os.mkdir(os.path.dirname(keylocation)) f = open(keylocation, 'wb') f.write(rsakey.exportKey('PEM')) f.close() except: log.err(None, "Failed to write key to " + keylocation) ssh_factory = ssh.create_factory( public_keys={'ssh-rsa': key}, private_keys={'ssh-rsa': key}, authnz=TestAuthnz(), git_configuration=TestGitConfiguration() ) http_factory = http.create_factory( authnz=TestAuthnz(), git_configuration=TestGitConfiguration(), git_viewer=find_git_viewer() ) git_factory = git.create_factory( authnz=TestAuthnz(), git_configuration=TestGitConfiguration() ) reactor.listenTCP(5522, ssh_factory) reactor.listenTCP(8080, make_site_streaming(http_factory)) reactor.listenTCP(9418, git_factory) reactor.run()
def main(): log.startLogging(sys.stderr) keylocation = os.path.expanduser( os.path.join('~', '.gitserverglue', 'key.pem')) key = None if os.path.exists(keylocation): try: key = keys.Key.fromFile(keylocation) except: pass if key is None: rsakey = RSA.generate(2048) key = keys.Key(rsakey) try: if not os.path.exists(os.path.dirname(keylocation)): os.mkdir(os.path.dirname(keylocation)) f = open(keylocation, 'wb') f.write(rsakey.exportKey('PEM')) f.close() except: log.err(None, "Failed to write key to " + keylocation) ssh_factory = ssh.create_factory(public_keys={'ssh-rsa': key}, private_keys={'ssh-rsa': key}, authnz=TestAuthnz(), git_configuration=TestGitConfiguration()) http_factory = http.create_factory( authnz=TestAuthnz(), git_configuration=TestGitConfiguration(), git_viewer=find_git_viewer()) git_factory = git.create_factory(authnz=TestAuthnz(), git_configuration=TestGitConfiguration()) reactor.listenTCP(5522, ssh_factory) reactor.listenTCP(8080, make_site_streaming(http_factory)) reactor.listenTCP(9418, git_factory) reactor.run()
def run_server(): import logging.handlers from optparse import OptionParser parser = OptionParser() parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False) parser.add_option('-i', '--pidfile', action='store', dest='pidfile', default=None) parser.add_option('-l', '--logfile', action='store', dest='logfile', default=None) parser.add_option('-u', '--user', action='store', dest='user', default=None) parser.add_option('-g', '--group', action='store', dest='group', default=None) parser.add_option('-s', '--sshport', action='store', type='int', dest='sshport', default=2222) parser.add_option('-w', '--httpport', action='store', type='int', dest='httpport', default=8080) (options, args) = parser.parse_args() if (options.user is None) ^ (options.group is None): raise Exception("Both user and group have to be specified") # configure logging formatter = logging.Formatter('[%(asctime)s] %(levelname)s: <%(name)s@%(filename)s:%(lineno)d> %(message)s') if options.verbose: loglevel = logging.DEBUG else: loglevel = logging.ERROR if options.logfile: handler = logging.handlers.TimedRotatingFileHandler(options.logfile, when='midnight', backupCount=7, encoding='utf-8') else: handler = logging.StreamHandler() handler.setFormatter(formatter) logger = logging.getLogger() logger.addHandler(handler) logger.setLevel(loglevel) observer = log.PythonLoggingObserver() observer.start() cyd = cydra.Cydra() helper = CydraHelper(cyd) config = cyd.config.get_component_config('cydraplugins.gitserverglue.GitServerGlue', {}) keyfilename = config.get('server_key') if keyfilename is None: # try to find one anyways for location in ['cydra', '/etc/cydra']: if os.path.exists(location + '.key') and os.path.exists(location + '.pub'): keyfilename = location break if keyfilename is None: raise Exception("Failed to find SSH keypair") ssh_factory = ssh.create_factory( public_keys={'ssh-rsa': keys.Key.fromFile(keyfilename + '.pub')}, private_keys={'ssh-rsa': keys.Key.fromFile(keyfilename + '.key')}, authnz=helper, git_configuration=helper ) http_factory = http.create_factory( authnz=helper, git_configuration=helper, git_viewer=find_git_viewer() ) # save pid to file if requested if options.pidfile: with open(options.pidfile) as pidf: pidf.write(str(os.getpid())) try: def dump_stack(sig, frame): logger.debug("Dumping Stack: \n" + ''.join(traceback.format_stack(frame))) signal.signal(signal.SIGUSR1, dump_stack) reactor.listenTCP(options.sshport, ssh_factory) reactor.listenTCP(options.httpport, http_factory) # drop privileges if requested if os.getuid() == 0 and options.user: uid = int(options.user) if options.user.isdigit() else pwd.getpwnam(options.user).pw_uid gid = int(options.group) if options.group.isdigit() else grp.getgrnam(options.group).gr_gid os.setgroups([]) os.setgid(gid) os.setuid(uid) reactor.run() except Exception: logger.exception("Caught exception during run")
def run_server(): import logging.handlers from optparse import OptionParser parser = OptionParser() parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False) parser.add_option('-i', '--pidfile', action='store', dest='pidfile', default=None) parser.add_option('-l', '--logfile', action='store', dest='logfile', default=None) parser.add_option('-u', '--user', action='store', dest='user', default=None) parser.add_option('-g', '--group', action='store', dest='group', default=None) parser.add_option('-s', '--sshport', action='store', type='int', dest='sshport', default=2222) parser.add_option('-w', '--httpport', action='store', type='int', dest='httpport', default=8080) (options, args) = parser.parse_args() if (options.user is None) ^ (options.group is None): raise Exception("Both user and group have to be specified") # configure logging formatter = logging.Formatter( '[%(asctime)s] %(levelname)s: <%(name)s@%(filename)s:%(lineno)d> %(message)s' ) if options.verbose: loglevel = logging.DEBUG else: loglevel = logging.ERROR if options.logfile: handler = logging.handlers.TimedRotatingFileHandler(options.logfile, when='midnight', backupCount=7, encoding='utf-8') else: handler = logging.StreamHandler() handler.setFormatter(formatter) logger = logging.getLogger() logger.addHandler(handler) logger.setLevel(loglevel) observer = log.PythonLoggingObserver() observer.start() cyd = cydra.Cydra() helper = CydraHelper(cyd) config = cyd.config.get_component_config( 'cydraplugins.gitserverglue.GitServerGlue', {}) keyfilename = config.get('server_key') if keyfilename is None: # try to find one anyways for location in ['cydra', '/etc/cydra']: if os.path.exists(location + '.key') and os.path.exists(location + '.pub'): keyfilename = location break if keyfilename is None: raise Exception("Failed to find SSH keypair") ssh_factory = ssh.create_factory( public_keys={'ssh-rsa': keys.Key.fromFile(keyfilename + '.pub')}, private_keys={'ssh-rsa': keys.Key.fromFile(keyfilename + '.key')}, authnz=helper, git_configuration=helper) http_factory = http.create_factory(authnz=helper, git_configuration=helper, git_viewer=find_git_viewer()) # save pid to file if requested if options.pidfile: with open(options.pidfile) as pidf: pidf.write(str(os.getpid())) try: def dump_stack(sig, frame): logger.debug("Dumping Stack: \n" + ''.join(traceback.format_stack(frame))) signal.signal(signal.SIGUSR1, dump_stack) reactor.listenTCP(options.sshport, ssh_factory) reactor.listenTCP(options.httpport, http_factory) # drop privileges if requested if os.getuid() == 0 and options.user: uid = int( options.user) if options.user.isdigit() else pwd.getpwnam( options.user).pw_uid gid = int( options.group) if options.group.isdigit() else grp.getgrnam( options.group).gr_gid os.setgroups([]) os.setgid(gid) os.setuid(uid) reactor.run() except Exception: logger.exception("Caught exception during run")