Пример #1
0
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()
Пример #2
0
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()
Пример #3
0
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")
Пример #4
0
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")