Ejemplo n.º 1
0
def backup_user_metadata(username):
    """
    Backup all metadata including email addresses and SSH keys of a single user
    """

    user = gitlab_lib.get_user_metadata(username)
    backup_dir = os.path.join(OUTPUT_BASEDIR, "user_%s_%s" % (user['id'], user['username']))
    if not os.path.exists(backup_dir): os.mkdir(backup_dir)
    
    gitlab_lib.log(u"Backing up metadata of user %s [ID %s]" % (user["username"], user["id"]))
    dump(backup_dir, "user.json", user)
    dump(backup_dir, "projects.json", gitlab_lib.get_projects(username))
    dump(backup_dir, "ssh.json", gitlab_lib.fetch(gitlab_lib.USER_SSHKEYS % (gitlab_lib.API_URL, user["id"])))
    dump(backup_dir, "email.json", gitlab_lib.fetch(gitlab_lib.USER_EMAILS % (gitlab_lib.API_URL, user["id"])))
Ejemplo n.º 2
0
def backup_issues(api_url, project, token, backup_dir):
    """
    Backup all issues of a project
    issue notes must be backuped by additional api call
    """
    gitlab_lib.log(u"Backing up issues from project %s [ID %s]" % (project['name'], project['id']))

    issues = gitlab_lib.fetch(api_url % (gitlab_lib.API_URL, project['id']))

    dump(backup_dir, "issues.json", issues)

    for issue in issues:
        notes = gitlab_lib.fetch(gitlab_lib.NOTES_FOR_ISSUE % (gitlab_lib.API_URL, project['id'], issue['id']))

        if notes:
            dump(backup_dir, "issue_%d_notes.dump" % (issue['id'],), notes)
Ejemplo n.º 3
0
def backup_snippets(api_url, project, backup_dir):
    """
    Backup snippets and their contents
    snippet contents must be backuped by additional api call
    """
    gitlab_lib.log(u"Backing up snippets from project %s [ID %s]" % (project['name'], project['id']))

    snippets = gitlab_lib.fetch(api_url % (gitlab_lib.API_URL, project['id']))

    dump(backup_dir, "snippets.json", snippets)

    for snippet in snippets:
        dump(backup_dir,
             "snippet_%d_content.dump" % (snippet['id'],),
             gitlab_lib.rest_api_call(gitlab_lib.GET_SNIPPET_CONTENT % (gitlab_lib.API_URL, project['id'], snippet['id']), method="GET").text)

        notes = gitlab_lib.fetch(gitlab_lib.NOTES_FOR_SNIPPET % (gitlab_lib.API_URL, project['id'], snippet['id']))

        if notes:
            dump(backup_dir, "snippet_%d_notes.dump" % (snippet['id'],), notes)
Ejemplo n.º 4
0
def backup(repository_dir, queue):
    """
    Backup everything for the given project
    For every project create a dictionary with id_name as pattern
    Dump project metadata and each component as separate JSON files
    """
    while not queue.empty():
        project = queue.get()
        backup_dir = os.path.join(OUTPUT_BASEDIR, "%s_%s_%s" % (project['id'], project['namespace']['name'], project['name']))
        if not os.path.exists(backup_dir): os.mkdir(backup_dir)

        dump(backup_dir, "project.json", project)

        # shall we backup local data like repository and wiki?
        if repository_dir:
            backup_local_data(repository_dir, args.upload, backup_dir, project)

        # backup metadata of each component
        for (component, api_url) in gitlab_lib.PROJECT_COMPONENTS.items():
            # issues
            if component == "issues" and \
               project.get(component + "_enabled") == True:
                backup_issues(api_url, project, args.token, backup_dir)

            # snippets
            elif component == "snippets" and \
               project.get(component + "_enabled") == True:
                backup_snippets(api_url, project, backup_dir)

            # milestones are enabled if either issues or merge_requests are enabled
            # labels cannot be disabled therefore no labels_enabled field exists
            # otherwise check if current component is enabled in project
            elif component == "milestones" and \
                 (project.get("issues_enabled") == True or project.get("merge_requests_enabled") == True) or \
                 component == "labels" or \
                 project.get(component + "_enabled") == True:
                gitlab_lib.log(u"Backing up %s from project %s [ID %s]" % (component, project['name'], project['id']))
                dump(backup_dir,
                     component + ".json",
                     gitlab_lib.fetch(api_url % (gitlab_lib.API_URL, project['id'])))

            else:
                gitlab_lib.log("Component %s disabled for project %s [ID %s]" % (component, project['name'], project['id']))
Ejemplo n.º 5
0
def get_objects(obj, obj_id):
    """
    Returns a list of all gitlab objects
    Obj can be projects or users or groups etc
    """
    objects = []
    chunk_size = 100
    page = 1
    url = ""
    suffix = ""
    
    if obj == "projects":
        suffix = "/all" 

    if obj_id:
        try:
            url = "%s/%s/%d" % (gitlab_lib.API_URL, obj, int(obj_id))
        except ValueError:
            if obj == 'users':
                url = "%s/%s?username=%s" % (gitlab_lib.API_URL, obj, obj_id)
            else:
                url = "%s/%s?search=%s" % (gitlab_lib.API_URL, obj, obj_id)
    else:
        url = "%s/%s%s?per_page=%d&page=%d" % (gitlab_lib.API_URL, obj, suffix, chunk_size, page)
        
    while 1:
        buff = gitlab_lib.fetch(url)

        if buff and type(buff) == list:
            objects.extend(buff)
            page += 1
        elif buff:
            objects.append(buff)

        if obj_id or not buff:
            break
        
        

    return objects
Ejemplo n.º 6
0
def get_objects(obj, obj_id):
    """
    Returns a list of all gitlab objects
    Obj can be projects or users or groups etc
    """
    objects = []
    chunk_size = 100
    page = 1
    url = ""
    suffix = ""

    while 1:
        if obj_id:
            try:
                url = "%s/%s/%d" % (gitlab_lib.API_BASE_URL, obj, int(obj_id))
            except ValueError:
                if obj == 'users':
                    url = "%s/%s?username=%s" % (gitlab_lib.API_BASE_URL, obj, obj_id)
                else:
                    url = "%s/%s?search=%s" % (gitlab_lib.API_BASE_URL, obj, obj_id)
        else:
            url = "%s/%s%s?per_page=%d&page=%d" % (gitlab_lib.API_BASE_URL, obj, suffix, chunk_size, page)

        buff = gitlab_lib.fetch(url)
        page += 1

        if buff and type(buff) == list:
            objects.extend(buff)
        elif buff:
            objects.append(buff)

        if obj_id or not buff:
            break



    return objects
Ejemplo n.º 7
0
def get_property(obj, obj_id, obj_property):
    metadata = gitlab_lib.fetch("%s/%s/%d" % (gitlab_lib.API_URL, obj, obj_id))
    return metadata.get(obj_property)
Ejemplo n.º 8
0
parser.add_argument("-s", "--server", help="Gitlab server name", default=backup_config.SERVER)
parser.add_argument("-t", "--token", help="Private token", default=backup_config.TOKEN)
args = parser.parse_args()

if not args.server or not args.token or not args.project:
    print "You must at least specify --server, --token and --project"
    sys.exit(1)


#
# MAIN PART
#
projects = []

try:
    projects.append(gitlab_lib.fetch(gitlab_lib.PROJECT_METADATA % (int(args.project),)))
except ValueError:
    projects = [x for x in gitlab_lib.get_projects() \
                if args.project in (x['name_with_namespace'] or x['description'])]

if len(projects) == 0:
    print "Found nothing"
else:
    for project in projects:
        if args.details:
            keys = project.keys()
            keys.sort()

            for key in keys:
                print u"%s: %s" % (key, project[key])
                print u"-" * 79