On Fri, May 18, 2018 at 03:59:41PM +0200, Geert Stappers wrote: > On Fri, May 11, 2018 at 11:04:13AM +0200, Jörg Frings-Fürst wrote: > > > > please can someone move my packages from alioth to salsa. > > > > Copying is done > > Next step is automating granting permission. >
Done. If it needs more TLC, say so. Groeten Geert Stappers -- Leven en laten leven
#!/usr/bin/python import argparse import locale import logging import os.path import sys import time import requests if sys.version_info [0] < 3: input = raw_input # keep trailing slashes if changed SALSA_BASE_URL='https://salsa.debian.org/' SALSA_API=SALSA_BASE_URL + "api/v4/" ENV_VAR='GITLAB_TOKEN' def parse_args(): parser = argparse.ArgumentParser(description='add a GitLab user', epilog="Your GitLab token should be " "provided via the {} environment variable. You can create one here: " "{}profile/personal_access_tokens.".format(ENV_VAR, SALSA_BASE_URL)) parser.add_argument('user', help='gitlab user name') parser.add_argument('project', nargs= '+', help=('gitlab project name [ project [ project [ ... ] ] ]' + '\n\t\te.g. debian/radvd') ) default_level = 'WARNING' parser.add_argument('-v', '--verbose', dest='loglevel', action='store_const', const='INFO', default=default_level, help='enable verbose messages') parser.add_argument('-d', '--debug', dest='loglevel', action='store_const', const='DEBUG', default=default_level, help='enable debugging messages') parser.add_argument('--loglevel', default=default_level, type=str.upper, help='expliticly set logging level') parser.add_argument('--syslog', const='INFO', nargs='?', default=None, type=str.upper, help='send logs to syslog') parser.add_argument('--logfile', default=None, help='write log to the given file (default: %(default)s)') return parser.parse_args() def setup_logging(args): logger = logging.getLogger('') # disable the base filter, each stream has its own filter logger.setLevel('DEBUG') if args.syslog: sl = logging.handlers.SysLogHandler(address='/dev/log') sl.setFormatter(logging.Formatter(prog+'[%(process)d]: %(message)s')) # convert syslog argument to a numeric value sl.setLevel(args.syslog.upper()) logger.addHandler(sl) logger.debug('configured syslog level %s' % args.syslog) handler = logging.StreamHandler() handler.setFormatter(logging.Formatter('%(message)s')) handler.setLevel(args.loglevel.upper()) logger.addHandler(handler) if args.logfile: handler = logging.FileHandler(args.logfile) handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) logger.addHandler(handler) def get_salsa_member_id(args): headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]} salsa_member_id = None members = requests.get(SALSA_API + 'users?username=' + args.user, headers=headers) members.raise_for_status() for member in members.json(): if member['username'] == args.user: salsa_member_id = member['id'] logging.debug('salsa_member_id: %d', salsa_member_id) return salsa_member_id def get_salsa_project_id(prj): headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]} salsa_project_id = None projects = requests.get(SALSA_API + 'search?scope=projects&search=' + str(prj.split('/')[-1]), headers=headers) projects.raise_for_status() for project in projects.json(): logging.debug('salsa_project_found: %s', project['path_with_namespace']) if project['path_with_namespace'] == prj: salsa_project_id = project['id'] logging.debug('salsa_project_id: %d', salsa_project_id) return salsa_project_id def add_member_to_project(member_id,project_id,project_name,level): logging.info("add member to project %d", project_id) payload = {'user_id': member_id, 'access_level': level} headers = {'PRIVATE-TOKEN': os.environ[ENV_VAR]} logging.debug('payload: %s', payload) result = requests.post(SALSA_API + 'projects/' + str(project_id) + '/members', data=payload, headers=headers) logging.debug('result.content: %s', result.content) try: result.raise_for_status() except requests.exceptions.HTTPError as e: logging.error('request failed with %s: %s, project: %s', e, result.json()['message'], project_name ) def main(): args = parse_args() gl_level = 30 # wanted gitlab access level setup_logging(args) if ENV_VAR in os.environ: salsa_member_id = get_salsa_member_id(args) else: logging.warning('Please provide gitlab API token via %s', ENV_VAR) sys.exit(1) if salsa_member_id == None: logging.warning('Could not find %s, so stopped', args.user) sys.exit(1) for p in args.project: logging.debug('looping for project %s', p) salsa_project_id = get_salsa_project_id(p) if salsa_project_id == None: logging.warning('Could not find %s, so skipped', p) else: add_member_to_project(salsa_member_id,salsa_project_id,p,gl_level) if __name__ == '__main__': main()