Blame pagure/cli/admin.py

Pierre-Yves Chibon 079c2a
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
"""
Pierre-Yves Chibon ffbe63
 (c) 2017-2018 - Copyright Red Hat Inc
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
 Authors:
Pierre-Yves Chibon 079c2a
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
"""
Aurélien Bompard dcf6f6
Pierre-Yves Chibon 67d1cc
from __future__ import print_function, unicode_literals, absolute_import
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
import argparse
Pierre-Yves Chibon af5184
import datetime
Pierre-Yves Chibon 079c2a
import logging
Pierre-Yves Chibon a1181c
import os
Patrick Uiterwijk d29158
import requests
Patrick Uiterwijk d29158
from string import Template
Pierre-Yves Chibon f4ba43
import sys
Julen Landa Alustiza 803bbd
import pygit2
Pierre-Yves Chibon a1181c
Pierre-Yves Chibon 87a6d0
import arrow
Pierre-Yves Chibon ffbe63
from six.moves import input
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 9c2953
if "PAGURE_CONFIG" not in os.environ and os.path.exists(
Pierre-Yves Chibon 9c2953
    "/etc/pagure/pagure.cfg"
Pierre-Yves Chibon 9c2953
):
Pierre-Yves Chibon 9c2953
    print("Using configuration file `/etc/pagure/pagure.cfg`")
Pierre-Yves Chibon 9c2953
    os.environ["PAGURE_CONFIG"] = "/etc/pagure/pagure.cfg"
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon b130e5
import pagure.config  # noqa: E402
Pierre-Yves Chibon de6f12
import pagure.exceptions  # noqa: E402
Pierre-Yves Chibon de6f12
import pagure.lib.git  # noqa: E402
Pierre-Yves Chibon cf98be
import pagure.lib.model_base  # noqa: E402
Pierre-Yves Chibon 930073
import pagure.lib.query  # noqa: E402
Pierre-Yves Chibon 1aac43
import pagure.lib.tasks_utils  # noqa: E402
Pierre-Yves Chibon b130e5
from pagure.flask_app import generate_user_key_files  # noqa: E402
Julen Landa Alustiza 803bbd
from pagure.utils import get_repo_path  # noqa: E402
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon b130e5
_config = pagure.config.reload_config()
Pierre-Yves Chibon cf98be
session = pagure.lib.model_base.create_session(_config["DB_URL"])
Pierre-Yves Chibon 079c2a
_log = logging.getLogger(__name__)
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 25e586
WATCH = {
Pierre-Yves Chibon 9c2953
    "-1": "reset the watch status to default",
Pierre-Yves Chibon 9c2953
    "0": "unwatch, don't notify the user of anything",
Pierre-Yves Chibon 9c2953
    "1": "watch issues and PRs",
Pierre-Yves Chibon 9c2953
    "2": "watch commits",
Pierre-Yves Chibon 9c2953
    "3": "watch issues, PRs and commits",
Pierre-Yves Chibon 25e586
}
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 6bf258
def _parser_refresh_gitolite(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the refresh-gitolite action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
     """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "refresh-gitolite", help="Re-generate the gitolite config file"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon ede948
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--user", help="User of the project (to use only on forks)"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon ede948
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--project",
Pierre-Yves Chibon 9c2953
        help="Project to update (as namespace/project if there "
Pierre-Yves Chibon 9c2953
        "is a namespace)",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("--group", help="Group to refresh")
Pierre-Yves Chibon ede948
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--all",
Pierre-Yves Chibon 9c2953
        dest="all_",
Pierre-Yves Chibon 9c2953
        default=False,
Pierre-Yves Chibon 9c2953
        action="store_true",
Pierre-Yves Chibon 9c2953
        help="Refresh all the projects",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_generate_acl)
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
def _parser_refresh_ssh(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the refresh-ssh action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "refresh-ssh",
Pierre-Yves Chibon 9c2953
        help="Re-write to disk every user's ssh key stored in the database",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_refresh_ssh)
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
def _parser_clear_hook_token(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the clear-hook-token action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "clear-hook-token",
Pierre-Yves Chibon 9c2953
        help="Generate a new hook token for every project in this instance",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_generate_hook_token)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 6bf258
def _parser_admin_token_list(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token list action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "list", help="List the API admin token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--user", help="User to associate or associated with the token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("--token", help="API token")
Pierre-Yves Chibon 6bf258
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--active",
Pierre-Yves Chibon 9c2953
        default=False,
Pierre-Yves Chibon 9c2953
        action="store_true",
Pierre-Yves Chibon 9c2953
        help="Only list active API token",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--expired",
Pierre-Yves Chibon 9c2953
        default=False,
Pierre-Yves Chibon 9c2953
        action="store_true",
Pierre-Yves Chibon 9c2953
        help="Only list expired API token",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon f3c6b4
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--all",
Pierre-Yves Chibon 9c2953
        default=False,
Pierre-Yves Chibon 9c2953
        action="store_true",
Pierre-Yves Chibon 9c2953
        help="Only list all API token instead of only those with admin ACLs",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_list_admin_token)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 6bf258
def _parser_admin_token_info(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token info action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "info", help="Provide some information about a specific API token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("token", help="API token")
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_info_admin_token)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 6bf258
def _parser_admin_token_expire(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token expire action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon af5184
    # Expire admin token
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "expire", help="Expire a specific API token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("token", help="API token")
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_expire_admin_token)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
def _parser_admin_token_create(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token create action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon af5184
    # Create admin token
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "create", help="Create a new API token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("user", help="User to associate with the token")
Pierre-Yves Chibon 6bf258
    local_parser.set_defaults(func=do_create_admin_token)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 87a6d0
def _parser_admin_token_update(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token update action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 87a6d0
    # Update admin token
Pierre-Yves Chibon 87a6d0
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "update", help="Update the expiration date of an API token"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("token", help="API token")
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("date", help="New expiration date")
Pierre-Yves Chibon 87a6d0
    local_parser.set_defaults(func=do_update_admin_token)
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 6bf258
def _parser_admin_token(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the admin-token action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 6bf258
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "admin-token", help="Manages the admin tokens for this instance"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 9c2953
    subsubparser = local_parser.add_subparsers(title="actions")
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    # list
Pierre-Yves Chibon 6bf258
    _parser_admin_token_list(subsubparser)
Pierre-Yves Chibon 6bf258
    # info
Pierre-Yves Chibon 6bf258
    _parser_admin_token_info(subsubparser)
Pierre-Yves Chibon 6bf258
    # expire
Pierre-Yves Chibon 6bf258
    _parser_admin_token_expire(subsubparser)
Pierre-Yves Chibon 6bf258
    # create
Pierre-Yves Chibon 6bf258
    _parser_admin_token_create(subsubparser)
Pierre-Yves Chibon 87a6d0
    # update
Pierre-Yves Chibon 87a6d0
    _parser_admin_token_update(subsubparser)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 25e586
def _parser_get_watch(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the get-watch action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 25e586
    # Update watch status
Pierre-Yves Chibon 25e586
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "get-watch", help="Get someone's watch status on a project"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "project",
Pierre-Yves Chibon 9c2953
        help="Project (as namespace/project if there "
Pierre-Yves Chibon 9c2953
        "is a namespace) -- Fork not supported",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("user", help="User to get the watch status of")
Pierre-Yves Chibon 25e586
    local_parser.set_defaults(func=do_get_watch_status)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
def _parser_update_watch(subparser):
Pierre-Yves Chibon eddbd9
    """ Set up the CLI argument parser for the update-watch action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 25e586
    # Update watch status
Pierre-Yves Chibon 25e586
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "update-watch", help="Update someone's watch status on a project"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "project",
Pierre-Yves Chibon 9c2953
        help="Project to update (as namespace/project if there "
Pierre-Yves Chibon 9c2953
        "is a namespace) -- Fork not supported",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "user", help="User to update the watch status of"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "-s", "--status", help="Watch status to update to"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
    local_parser.set_defaults(func=do_update_watch_status)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 3a016c
def _parser_read_only(subparser):
Pierre-Yves Chibon ffbe63
    """ Set up the CLI argument parser for the read-only action.
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon eddbd9
        arguments
Pierre-Yves Chibon eddbd9
Pierre-Yves Chibon eddbd9
    """
Pierre-Yves Chibon 3a016c
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "read-only", help="Get or set the read-only flag on a project"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 3a016c
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--user", help="User of the project (to use only on forks)"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 3a016c
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "project",
Pierre-Yves Chibon 9c2953
        help="Project to update (as namespace/project if there "
Pierre-Yves Chibon 9c2953
        "is a namespace)",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 3a016c
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--ro",
Pierre-Yves Chibon 3a016c
        help="Read-Only status to set (has to be: true or false), do not "
Pierre-Yves Chibon 9c2953
        "specify to get the current status",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 3a016c
    local_parser.set_defaults(func=do_read_only)
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon d0b0b3
Pierre-Yves Chibon ffbe63
def _parser_new_group(subparser):
Pierre-Yves Chibon ffbe63
    """ Set up the CLI argument parser for the new-group action.
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon ffbe63
        arguments
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    """
Pierre-Yves Chibon ffbe63
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "new-group", help="Create a new group on this pagure instance"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("group_name", help="Name of the group")
Pierre-Yves Chibon ffbe63
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "username",
Pierre-Yves Chibon ffbe63
        help="Name of the user creating the group "
Pierre-Yves Chibon 9c2953
        "(will be added to the group once created)",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9c2953
    local_parser.add_argument("--display", help="Display name of the group")
Pierre-Yves Chibon ffbe63
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--description", help="Short description of the group"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon ffbe63
    local_parser.set_defaults(func=do_new_group)
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
Fabian Arrotin 0096c9
def _parser_list_groups(subparser):
Fabian Arrotin 0096c9
    """ Set up the CLI argument parser for the list-groups action.
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
    :arg subparser: an argparse subparser allowing to have action's specific
Fabian Arrotin 0096c9
        arguments
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
    """
Fabian Arrotin 0096c9
    local_parser = subparser.add_parser(
Fabian Arrotin 0096c9
        "list-groups", help="Lists existing groups on this pagure instance"
Fabian Arrotin 0096c9
    )
Fabian Arrotin 0096c9
    local_parser.set_defaults(func=do_list_groups)
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
Pierre-Yves Chibon bee78a
def _parser_block_user(subparser):
Pierre-Yves Chibon bee78a
    """ Set up the CLI argument parser for the block-user action.
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon bee78a
        arguments
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    """
Pierre-Yves Chibon bee78a
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 9c2953
        "block-user",
Pierre-Yves Chibon 9c2953
        help="Prevents an user to interact with this pagure instance until "
Pierre-Yves Chibon 9c2953
        "the specified date",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6e0576
    local_parser.add_argument(
Pierre-Yves Chibon 6e0576
        "username", default=None, nargs="?", help="Name of the user to block"
Pierre-Yves Chibon 6e0576
    )
Pierre-Yves Chibon bee78a
    local_parser.add_argument(
Pierre-Yves Chibon 9c2953
        "date",
Pierre-Yves Chibon 6e0576
        nargs="?",
Pierre-Yves Chibon 9c2953
        default=None,
Pierre-Yves Chibon 9c2953
        help="Date before which the user is not welcome on this pagure "
Pierre-Yves Chibon 9c2953
        "instance",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6e0576
    local_parser.add_argument(
Pierre-Yves Chibon 6e0576
        "--list",
Pierre-Yves Chibon 6e0576
        default=False,
Pierre-Yves Chibon 6e0576
        action="store_true",
Pierre-Yves Chibon 6e0576
        help="List all blocked users",
Pierre-Yves Chibon 6e0576
    )
Pierre-Yves Chibon bee78a
    local_parser.set_defaults(func=do_block_user)
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
Patrick Uiterwijk d29158
def _parser_upload_repospanner_hooks(subparser):
Patrick Uiterwijk d29158
    """ Set up the CLI argument parser to upload repospanner hook.
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    Args:
Patrick Uiterwijk d29158
        subparser: An argparse subparser
Patrick Uiterwijk d29158
    """
Patrick Uiterwijk d29158
    local_parser = subparser.add_parser(
Patrick Uiterwijk d29158
        "upload-repospanner-hook", help="Upload repoSpanner hook script"
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    local_parser.add_argument(
Patrick Uiterwijk d29158
        "region", help="repoSpanner region where to " "upload hook"
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    local_parser.set_defaults(func=do_upload_repospanner_hooks)
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
def _parser_ensure_project_hooks(subparser):
Patrick Uiterwijk d29158
    """ Set up the CLI argument parser to ensure project hooks are setup
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    Args:
Patrick Uiterwijk d29158
        subparser: An argparse subparser
Patrick Uiterwijk d29158
    """
Patrick Uiterwijk d29158
    local_parser = subparser.add_parser(
Patrick Uiterwijk d29158
        "ensure-project-hooks",
Patrick Uiterwijk d29158
        help="Ensure all projects have their hooks setup",
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    local_parser.add_argument(
Patrick Uiterwijk d29158
        "hook", help="repoSpanner hook ID to set", default=None
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    local_parser.set_defaults(func=do_ensure_project_hooks)
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
Pierre-Yves Chibon 74b8f8
def _parser_delete_project(subparser):
Pierre-Yves Chibon 74b8f8
    """ Set up the CLI argument parser for the delete-project action.
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon 74b8f8
        arguments
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
     """
Pierre-Yves Chibon 74b8f8
    local_parser = subparser.add_parser(
Pierre-Yves Chibon 74b8f8
        "delete-project", help="Delete the project specified"
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    local_parser.add_argument(
Pierre-Yves Chibon 74b8f8
        "--user", help="User of the project (to use only on forks)"
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    local_parser.add_argument(
Pierre-Yves Chibon 74b8f8
        "project",
Pierre-Yves Chibon 74b8f8
        help="Project to update (as namespace/project if there "
Pierre-Yves Chibon 74b8f8
        "is a namespace)",
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    local_parser.add_argument(
Pierre-Yves Chibon 74b8f8
        "action_user",
Pierre-Yves Chibon 74b8f8
        help="Username of the user doing the action (ie: deleting the "
Pierre-Yves Chibon 74b8f8
        "project)",
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    local_parser.set_defaults(func=do_delete_project)
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon a10996
def _parser_create_branch(subparser):
Pierre-Yves Chibon a10996
    """ Set up the CLI argument parser for the create-branch action.
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    :arg subparser: an argparse subparser allowing to have action's specific
Pierre-Yves Chibon a10996
        arguments
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
     """
Pierre-Yves Chibon a10996
    local_parser = subparser.add_parser(
Pierre-Yves Chibon a10996
        "create-branch",
Pierre-Yves Chibon a10996
        help="Create the specified branch in the specified project",
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "--user", help="User of the project (to use only on forks)"
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "project",
Pierre-Yves Chibon a10996
        help="Project to update (as namespace/project if there "
Pierre-Yves Chibon a10996
        "is a namespace)",
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "--from-branch",
Pierre-Yves Chibon a10996
        default=None,
Pierre-Yves Chibon a10996
        help="Name of the branch on which to base the new one",
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "--from-commit",
Pierre-Yves Chibon a10996
        default=None,
Pierre-Yves Chibon a10996
        help="Commit on which to base the new branch",
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "new_branch", help="Name of the new branch to create"
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.add_argument(
Pierre-Yves Chibon a10996
        "action_user",
Pierre-Yves Chibon a10996
        help="Username of the user doing the action (ie: creating the "
Pierre-Yves Chibon a10996
        "branch)",
Pierre-Yves Chibon a10996
    )
Pierre-Yves Chibon a10996
    local_parser.set_defaults(func=do_create_branch)
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
Julen Landa Alustiza 803bbd
def _parser_set_default_branch(subparser):
Julen Landa Alustiza 803bbd
    """ Set up the CLI argument parser for the set-default-branch action.
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    :arg subparser: an argparse subparser allowing to have action's specific
Julen Landa Alustiza 803bbd
        arguments
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
     """
Julen Landa Alustiza 803bbd
    local_parser = subparser.add_parser(
Julen Landa Alustiza 803bbd
        "set-default-branch", help="Set the specified branch as default"
Julen Landa Alustiza 803bbd
    )
Julen Landa Alustiza 803bbd
    local_parser.add_argument(
Julen Landa Alustiza 803bbd
        "project",
Julen Landa Alustiza 803bbd
        help="Project to update (as namespace/project if there "
Julen Landa Alustiza 803bbd
        "is a namespace)",
Julen Landa Alustiza 803bbd
    )
Julen Landa Alustiza 803bbd
    local_parser.add_argument(
Julen Landa Alustiza 803bbd
        "--user", help="User of the project (to use only on forks)"
Julen Landa Alustiza 803bbd
    )
Julen Landa Alustiza 803bbd
    local_parser.add_argument(
Julen Landa Alustiza 803bbd
        "branch", help="Name of the branch to be set as default"
Julen Landa Alustiza 803bbd
    )
Julen Landa Alustiza 803bbd
    local_parser.set_defaults(func=do_set_default_branch)
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
Aurélien Bompard a29742
def parse_arguments(args=None):
Pierre-Yves Chibon 6bf258
    """ Set-up the argument parsing. """
Pierre-Yves Chibon 6bf258
    parser = argparse.ArgumentParser(
Pierre-Yves Chibon 9c2953
        description="The admin CLI for this pagure instance"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    parser.add_argument(
Pierre-Yves Chibon 9c2953
        "-c", "--config", default=None, help="Specify a configuration to use"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
    parser.add_argument(
Pierre-Yves Chibon 9c2953
        "--debug",
Pierre-Yves Chibon 9c2953
        default=False,
Pierre-Yves Chibon 9c2953
        action="store_true",
Pierre-Yves Chibon 9c2953
        help="Increase the verbosity of the information displayed",
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 7c3688
Pierre-Yves Chibon 9c2953
    subparser = parser.add_subparsers(title="actions")
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    # refresh-gitolite
Pierre-Yves Chibon 6bf258
    _parser_refresh_gitolite(subparser)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    # refresh-ssh
Pierre-Yves Chibon 6bf258
    _parser_refresh_ssh(subparser)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    # clear-hook-token
Pierre-Yves Chibon 6bf258
    _parser_clear_hook_token(subparser)
Pierre-Yves Chibon 6bf258
Pierre-Yves Chibon 6bf258
    # Admin token actions
Pierre-Yves Chibon 6bf258
    _parser_admin_token(subparser)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 25e586
    # get-watch
Pierre-Yves Chibon 25e586
    _parser_get_watch(subparser)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # update-watch
Pierre-Yves Chibon 25e586
    _parser_update_watch(subparser)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 3a016c
    # read-only
Pierre-Yves Chibon 3a016c
    _parser_read_only(subparser)
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon ffbe63
    # new-group
Pierre-Yves Chibon ffbe63
    _parser_new_group(subparser)
Pierre-Yves Chibon ffbe63
Fabian Arrotin 0096c9
    # list-groups
Fabian Arrotin 0096c9
    _parser_list_groups(subparser)
Fabian Arrotin 0096c9
Pierre-Yves Chibon bee78a
    # block-user
Pierre-Yves Chibon bee78a
    _parser_block_user(subparser)
Pierre-Yves Chibon bee78a
Patrick Uiterwijk d29158
    # upload-repospanner-hooks
Patrick Uiterwijk d29158
    _parser_upload_repospanner_hooks(subparser)
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    # ensure-project-hooks
Patrick Uiterwijk d29158
    _parser_ensure_project_hooks(subparser)
Patrick Uiterwijk d29158
Pierre-Yves Chibon 74b8f8
    # delete-project
Pierre-Yves Chibon 74b8f8
    _parser_delete_project(subparser)
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon a10996
    # create-branch
Pierre-Yves Chibon a10996
    _parser_create_branch(subparser)
Pierre-Yves Chibon a10996
Julen Landa Alustiza 803bbd
    # set-default-branch
Julen Landa Alustiza 803bbd
    _parser_set_default_branch(subparser)
Julen Landa Alustiza 803bbd
Aurélien Bompard a29742
    return parser.parse_args(args)
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
def _ask_confirmation():
Pierre-Yves Chibon 9c2953
    """ Ask to confirm an action.
Pierre-Yves Chibon 9c2953
    """
Pierre-Yves Chibon 9c2953
    action = input("Do you want to continue? [y/N]")
Pierre-Yves Chibon 9c2953
    return action.lower() in ["y", "yes"]
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 12c3d1
def _get_input(text):
Pierre-Yves Chibon 9c2953
    """ Ask the user for input. """
Aurélien Bompard 831553
    return input(text)
Pierre-Yves Chibon 12c3d1
Pierre-Yves Chibon 12c3d1
Pierre-Yves Chibon 25e586
def _get_project(arg_project, user=None):
Pierre-Yves Chibon 9c2953
    """ From the project specified to the CLI, extract the actual project.
Pierre-Yves Chibon 9c2953
    """
Pierre-Yves Chibon 25e586
    namespace = None
Pierre-Yves Chibon 9c2953
    if "/" in arg_project:
Pierre-Yves Chibon 9c2953
        if arg_project.count("/") > 1:
Pierre-Yves Chibon 25e586
            raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
                'Invalid project name, has more than one "/": %s' % arg_project
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 9c2953
        namespace, name = arg_project.split("/")
Pierre-Yves Chibon 25e586
    else:
Pierre-Yves Chibon 25e586
        name = arg_project
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 930073
    return pagure.lib.query._get_project(
Pierre-Yves Chibon 9c2953
        session, namespace=namespace, name=name, user=user
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Your Name 76327a
def _check_project(_project, **kwargs):
Your Name 76327a
    """ Check that the project extracted with args is a valid project """
Your Name 76327a
    if _project is None:
Your Name 76327a
        raise pagure.exceptions.PagureException(
Your Name 76327a
            "No project found with: {}".format(
Your Name 76327a
                ", ".join(["{}={}".format(k, v) for k, v in kwargs.items()])
Your Name 76327a
            )
Your Name 76327a
        )
Your Name 76327a
Your Name 76327a
Pierre-Yves Chibon ede948
def do_generate_acl(args):
Pierre-Yves Chibon b22dbf
    """ Regenerate the gitolite ACL file.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon ede948
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon 9c2953
    _log.debug("group:          %s", args.group)
Pierre-Yves Chibon 9c2953
    _log.debug("project:        %s", args.project)
Pierre-Yves Chibon 9c2953
    _log.debug("user:           %s", args.user)
Pierre-Yves Chibon 9c2953
    _log.debug("all:            %s", args.all_)
Pierre-Yves Chibon ede948
Pierre-Yves Chibon ede948
    title = None
Pierre-Yves Chibon ede948
    project = None
Pierre-Yves Chibon ede948
    if args.project:
Pierre-Yves Chibon 25e586
        project = _get_project(args.project, user=args.user)
Pierre-Yves Chibon ede948
        title = project.fullname
Pierre-Yves Chibon ede948
    if args.all_:
Pierre-Yves Chibon 9c2953
        title = "all"
Pierre-Yves Chibon ede948
        project = -1
Pierre-Yves Chibon ede948
Patrick Uiterwijk 92cbf5
    if not args.all_ and not args.project:
Patrick Uiterwijk 92cbf5
        print(
Pierre-Yves Chibon 9c2953
            "Please note that you have not selected a project or --all. "
Pierre-Yves Chibon 9c2953
            "Do you want to recompile the existing config file?"
Pierre-Yves Chibon 9c2953
        )
Patrick Uiterwijk 92cbf5
        if not _ask_confirmation():
Patrick Uiterwijk 92cbf5
            return
Patrick Uiterwijk 92cbf5
Patrick Uiterwijk ad0b72
    helper = pagure.lib.git_auth.get_git_auth_helper()
Pierre-Yves Chibon 9c2953
    _log.debug("Got helper: %s", helper)
Pierre-Yves Chibon ede948
Pierre-Yves Chibon ede948
    group_obj = None
Pierre-Yves Chibon ede948
    if args.group:
Pierre-Yves Chibon 930073
        group_obj = pagure.lib.query.search_groups(
Pierre-Yves Chibon 930073
            session, group_name=args.group
Pierre-Yves Chibon 930073
        )
Pierre-Yves Chibon ede948
    _log.debug(
Pierre-Yves Chibon 9c2953
        "Calling helper: %s with arg: project=%s, group=%s",
Pierre-Yves Chibon 9c2953
        helper,
Pierre-Yves Chibon 9c2953
        project,
Pierre-Yves Chibon 9c2953
        group_obj,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon ede948
Pierre-Yves Chibon f4ba43
    print(
Pierre-Yves Chibon 9c2953
        "Do you want to re-generate the gitolite.conf file for group: %s "
Pierre-Yves Chibon 9c2953
        "and project: %s?" % (group_obj, title)
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 079c2a
    if _ask_confirmation():
Pierre-Yves Chibon ede948
        helper.generate_acls(project=project, group=group_obj)
Pierre-Yves Chibon 1aac43
        pagure.lib.tasks_utils.gc_clean()
Pierre-Yves Chibon 9c2953
        print("Gitolite ACLs updated")
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon af5184
def do_refresh_ssh(_):
Pierre-Yves Chibon b22dbf
    """ Regenerate the user key files.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg _: the argparse object returned by ``parse_arguments()``, which is
Pierre-Yves Chibon b22dbf
        ignored as there are no argument to pass to this action.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon f4ba43
    print(
Pierre-Yves Chibon 9c2953
        "Do you want to re-generate all the ssh keys for every user in "
Pierre-Yves Chibon 9c2953
        "the database? (Depending on your instance this may take a while "
Pierre-Yves Chibon 9c2953
        "and result in an outage while it lasts)"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 079c2a
    if _ask_confirmation():
Pierre-Yves Chibon 079c2a
        generate_user_key_files()
Pierre-Yves Chibon 9c2953
        print("User key files regenerated")
Pierre-Yves Chibon 079c2a
        do_generate_acl()
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon b22dbf
def do_generate_hook_token(_):
Pierre-Yves Chibon b22dbf
    """ Regenerate the hook_token for each projects in the DB.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg _: the argparse object returned by ``parse_arguments()``, which is
Pierre-Yves Chibon b22dbf
        ignored as there are no argument to pass to this action.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon f4ba43
    print(
Pierre-Yves Chibon 9c2953
        "Do you want to re-generate all the hook token for every user in "
Pierre-Yves Chibon 9c2953
        "the database? This will break every web-hook set-up on this "
Pierre-Yves Chibon 9c2953
        "instance. You should only ever run this for a security issue"
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 079c2a
    if _ask_confirmation():
Pierre-Yves Chibon 930073
        pagure.lib.query.generate_hook_token(session)
Pierre-Yves Chibon 9c2953
        print("Hook token all re-generated")
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon af5184
def do_list_admin_token(args):
Pierre-Yves Chibon b22dbf
    """ List the admin token.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon 9c2953
    _log.debug("user:           %s", args.user)
Pierre-Yves Chibon 9c2953
    _log.debug("token:          %s", args.token)
Pierre-Yves Chibon 9c2953
    _log.debug("active:         %s", args.active)
Pierre-Yves Chibon 9c2953
    _log.debug("expire:         %s", args.expired)
Pierre-Yves Chibon 9c2953
    _log.debug("all:            %s", args.all)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    acls = pagure.config.config["ADMIN_API_ACLS"]
Pierre-Yves Chibon f3c6b4
    if args.all:
Pierre-Yves Chibon f3c6b4
        acls = None
Pierre-Yves Chibon 930073
    tokens = pagure.lib.query.search_token(
Pierre-Yves Chibon 9c2953
        session, acls, user=args.user, active=args.active, expired=args.expired
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 9a36a4
Pierre-Yves Chibon af5184
    for token in tokens:
Pierre-Yves Chibon 9c2953
        print("%s -- %s -- %s" % (token.id, token.user.user, token.expiration))
Pierre-Yves Chibon af5184
    if not tokens:
Pierre-Yves Chibon 9c2953
        print("No admin tokens found")
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
def do_info_admin_token(args):
Pierre-Yves Chibon b22dbf
    """ Print out information about the specified API token.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon 9c2953
    _log.debug("token:          %s", args.token)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 930073
    token = pagure.lib.query.search_token(session, acls=None, token=args.token)
Pierre-Yves Chibon af5184
    if not token:
Pierre-Yves Chibon 9c2953
        raise pagure.exceptions.PagureException("No such admin token found")
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("%s -- %s -- %s" % (token.id, token.user.user, token.expiration))
Pierre-Yves Chibon 9c2953
    print("ACLs:")
Pierre-Yves Chibon af5184
    for acl in token.acls:
Pierre-Yves Chibon 9c2953
        print("  - %s" % acl.name)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
def do_expire_admin_token(args):
Pierre-Yves Chibon b22dbf
    """ Expire a specific admin token.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon 9c2953
    _log.debug("token:          %s", args.token)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    acls = pagure.config.config["ADMIN_API_ACLS"]
Pierre-Yves Chibon 930073
    token = pagure.lib.query.search_token(session, acls, token=args.token)
Pierre-Yves Chibon af5184
    if not token:
Pierre-Yves Chibon 9c2953
        raise pagure.exceptions.PagureException("No such admin token found")
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("%s -- %s -- %s" % (token.id, token.user.user, token.expiration))
Pierre-Yves Chibon 9c2953
    print("ACLs:")
Pierre-Yves Chibon af5184
    for acl in token.acls:
Pierre-Yves Chibon 9c2953
        print("  - %s" % acl.name)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("Do you really want to expire this API token?")
Pierre-Yves Chibon af5184
    if _ask_confirmation():
Pierre-Yves Chibon af5184
        token.expiration = datetime.datetime.utcnow()
Pierre-Yves Chibon b130e5
        session.add(token)
Pierre-Yves Chibon b130e5
        session.commit()
Pierre-Yves Chibon 9c2953
        print("Token expired")
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 87a6d0
def do_update_admin_token(args):
Pierre-Yves Chibon 87a6d0
    """ Update the expiration date of an admin token.
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
    """
Pierre-Yves Chibon 9c2953
    _log.debug("token:          %s", args.token)
Pierre-Yves Chibon 9c2953
    _log.debug("new date:       %s", args.date)
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 9c2953
    acls = pagure.config.config["ADMIN_API_ACLS"]
Pierre-Yves Chibon 930073
    token = pagure.lib.query.search_token(session, acls, token=args.token)
Pierre-Yves Chibon 87a6d0
    if not token:
Pierre-Yves Chibon 9c2953
        raise pagure.exceptions.PagureException("No such admin token found")
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
    try:
Pierre-Yves Chibon 9c2953
        date = arrow.get(args.date, "YYYY-MM-DD").replace(tzinfo="UTC")
Pierre-Yves Chibon 87a6d0
    except Exception as err:
Pierre-Yves Chibon 87a6d0
        _log.exception(err)
Pierre-Yves Chibon 87a6d0
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "Invalid new expiration date submitted: %s, not of the format "
Pierre-Yves Chibon 9c2953
            "YYYY-MM-DD" % args.date
Pierre-Yves Chibon 87a6d0
        )
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 2a9d22
    if date.naive.date() <= datetime.datetime.utcnow().date():
Pierre-Yves Chibon 2a9d22
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "You are about to expire this API token using the wrong "
Pierre-Yves Chibon 9c2953
            "command, please use: pagure-admin admin-token expire"
Pierre-Yves Chibon 2a9d22
        )
Pierre-Yves Chibon 2a9d22
Pierre-Yves Chibon 9c2953
    print("%s -- %s -- %s" % (token.id, token.user.user, token.expiration))
Pierre-Yves Chibon 9c2953
    print("ACLs:")
Pierre-Yves Chibon 87a6d0
    for acl in token.acls:
Pierre-Yves Chibon 9c2953
        print("  - %s" % acl.name)
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
    print(
Pierre-Yves Chibon 9c2953
        "Do you really want to update this API token to expire on %s?"
Pierre-Yves Chibon 9c2953
        % args.date
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 87a6d0
    if _ask_confirmation():
Pierre-Yves Chibon 87a6d0
        token.expiration = date.naive
Pierre-Yves Chibon b130e5
        session.add(token)
Pierre-Yves Chibon b130e5
        session.commit()
Pierre-Yves Chibon 9c2953
        print("Token updated")
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon 87a6d0
Pierre-Yves Chibon af5184
def do_create_admin_token(args):
Pierre-Yves Chibon b22dbf
    """ Create a new admin token.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon b22dbf
Pierre-Yves Chibon b22dbf
    """
Pierre-Yves Chibon 9c2953
    _log.debug("user:          %s", args.user)
Pierre-Yves Chibon af5184
    # Validate user first
Pierre-Yves Chibon 930073
    pagure.lib.query.get_user(session, args.user)
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    acls_list = pagure.config.config["ADMIN_API_ACLS"]
Pierre-Yves Chibon af5184
    for idx, acl in enumerate(acls_list):
Pierre-Yves Chibon 9c2953
        print("%s.  %s" % (idx, acl))
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("Which ACLs do you want to associated with this token?")
Pierre-Yves Chibon 9c2953
    acls = _get_input("(Comma separated list): ")
Pierre-Yves Chibon 9c2953
    acls_idx = [int(acl.strip()) for acl in acls.split(",")]
Pierre-Yves Chibon af5184
    acls = [acls_list[acl] for acl in acls_idx]
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("ACLs selected:")
Pierre-Yves Chibon af5184
    for idx, acl in enumerate(acls_idx):
Pierre-Yves Chibon 9c2953
        print("%s.  %s" % (acls_idx[idx], acls[idx]))
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 9c2953
    print("Do you want to create this API token?")
Pierre-Yves Chibon af5184
    if _ask_confirmation():
Pierre-Yves Chibon 930073
        print(
Pierre-Yves Chibon 930073
            pagure.lib.query.add_token_to_user(session, None, acls, args.user)
Pierre-Yves Chibon 930073
        )
Pierre-Yves Chibon af5184
Pierre-Yves Chibon af5184
Pierre-Yves Chibon 74b8f8
def do_delete_project(args):
Pierre-Yves Chibon 74b8f8
    """ Delete a project.
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    """
Pierre-Yves Chibon 74b8f8
    _log.debug("project:       %s", args.project)
Pierre-Yves Chibon 74b8f8
    _log.debug("user:          %s", args.user)
Pierre-Yves Chibon 74b8f8
    _log.debug("user deleting: %s", args.action_user)
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    # Validate users
Pierre-Yves Chibon 74b8f8
    pagure.lib.query.get_user(session, args.user)
Pierre-Yves Chibon 74b8f8
    pagure.lib.query.get_user(session, args.action_user)
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    # Get the project
Pierre-Yves Chibon 74b8f8
    project = _get_project(args.project, user=args.user)
Pierre-Yves Chibon 74b8f8
Your Name 76327a
    _check_project(project, project=args.project, user=args.user)
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    print(
Pierre-Yves Chibon 74b8f8
        "Are you sure you want to delete: %s?\n  This cannot be undone!"
Pierre-Yves Chibon 74b8f8
        % project.fullname
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    if not _ask_confirmation():
Pierre-Yves Chibon 74b8f8
        return
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
    pagure.lib.tasks.delete_project(
Pierre-Yves Chibon 74b8f8
        namespace=project.namespace,
Pierre-Yves Chibon 74b8f8
        name=project.name,
Pierre-Yves Chibon 74b8f8
        user=project.user.user if project.is_fork else None,
Pierre-Yves Chibon 74b8f8
        action_user=args.action_user,
Pierre-Yves Chibon 74b8f8
    )
Pierre-Yves Chibon 74b8f8
    session.commit()
Pierre-Yves Chibon 74b8f8
    print("Project deleted")
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 74b8f8
Pierre-Yves Chibon 25e586
def do_get_watch_status(args):
Pierre-Yves Chibon 25e586
    """ Get the watch status of an user on a project.
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    """
Pierre-Yves Chibon 9c2953
    _log.debug("user:          %s", args.user)
Pierre-Yves Chibon 9c2953
    _log.debug("project:       %s", args.project)
Pierre-Yves Chibon 25e586
    # Validate user
Pierre-Yves Chibon 930073
    pagure.lib.query.get_user(session, args.user)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Get the project
Pierre-Yves Chibon 25e586
    project = _get_project(args.project)
Pierre-Yves Chibon 25e586
Your Name 76327a
    _check_project(project, project=args.project)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 9c2953
    level = (
Pierre-Yves Chibon 930073
        pagure.lib.query.get_watch_level_on_repo(
Pierre-Yves Chibon 9c2953
            session=session,
Pierre-Yves Chibon 9c2953
            user=args.user,
Pierre-Yves Chibon 9c2953
            repo=project.name,
Pierre-Yves Chibon 9c2953
            repouser=None,
Pierre-Yves Chibon 9c2953
            namespace=project.namespace,
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 9c2953
        or []
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Specify that issues == 'issues & PRs'
Pierre-Yves Chibon 9c2953
    if "issues" in level:
Pierre-Yves Chibon 9c2953
        level.append("pull-requests")
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 9c2953
    print(
Pierre-Yves Chibon 9c2953
        "On %s user: %s is watching the following items: %s"
Pierre-Yves Chibon 9c2953
        % (project.fullname, args.user, ", ".join(level) or None)
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
def do_update_watch_status(args):
Pierre-Yves Chibon 25e586
    """ Update the watch status of an user on a project.
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    """
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 9c2953
    _log.debug("user:          %s", args.user)
Pierre-Yves Chibon 9c2953
    _log.debug("status:        %s", args.status)
Pierre-Yves Chibon 9c2953
    _log.debug("project:       %s", args.project)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Validate user
Pierre-Yves Chibon 930073
    pagure.lib.query.get_user(session, args.user)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Ask the status if none were given
Pierre-Yves Chibon 25e586
    if args.status is None:
Pierre-Yves Chibon 9c2953
        print("The watch status can be one of the following: ")
Pierre-Yves Chibon 25e586
        for lvl in WATCH:
Pierre-Yves Chibon 9c2953
            print("%s: %s" % (lvl, WATCH[lvl]))
Pierre-Yves Chibon 9c2953
        args.status = _get_input("Status:")
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Validate the status
Pierre-Yves Chibon 25e586
    if args.status not in WATCH:
Pierre-Yves Chibon 25e586
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "Invalid status provided: %s not in %s"
Pierre-Yves Chibon 9c2953
            % (args.status, ", ".join(sorted(WATCH.keys())))
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
    # Get the project
Pierre-Yves Chibon 25e586
    project = _get_project(args.project)
Pierre-Yves Chibon 25e586
Your Name 76327a
    _check_project(project, project=args.project)
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 9c2953
    print(
Pierre-Yves Chibon 9c2953
        "Updating watch status of %s to %s (%s) on %s"
Pierre-Yves Chibon 9c2953
        % (args.user, args.status, WATCH[args.status], args.project)
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 930073
    pagure.lib.query.update_watch_status(
Pierre-Yves Chibon 9c2953
        session=session, project=project, user=args.user, watch=args.status
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon b130e5
    session.commit()
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 25e586
Pierre-Yves Chibon 3a016c
def do_read_only(args):
Pierre-Yves Chibon 3a016c
    """ Set or update the read-only status of a project.
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    """
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 9c2953
    _log.debug("project:       %s", args.project)
Pierre-Yves Chibon 9c2953
    _log.debug("user:          %s", args.user)
Pierre-Yves Chibon 9c2953
    _log.debug("read-only:     %s", args.ro)
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    # Validate user
Pierre-Yves Chibon 930073
    pagure.lib.query.get_user(session, args.user)
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    # Get the project
Pierre-Yves Chibon 99cda8
    project = _get_project(args.project, user=args.user)
Pierre-Yves Chibon 3a016c
Your Name 76327a
    _check_project(project, project=args.project)
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    # Validate ro flag
Pierre-Yves Chibon 9c2953
    if args.ro and args.ro.lower() not in ["true", "false"]:
Pierre-Yves Chibon 3a016c
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "Invalid read-only status specified: %s is not in: "
Pierre-Yves Chibon 9c2953
            "true, false" % args.ro.lower()
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
    if not args.ro:
Pierre-Yves Chibon 3a016c
        print(
Pierre-Yves Chibon 9c2953
            "The current read-only flag of the project %s is set to %s"
Pierre-Yves Chibon 9c2953
            % (project.fullname, project.read_only)
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 3a016c
    else:
Pierre-Yves Chibon 930073
        pagure.lib.query.update_read_only_mode(
Pierre-Yves Chibon 9c2953
            session, project, read_only=(args.ro.lower() == "true")
Pierre-Yves Chibon 3a016c
        )
Pierre-Yves Chibon b130e5
        session.commit()
Pierre-Yves Chibon 3a016c
        print(
Pierre-Yves Chibon 9c2953
            "The read-only flag of the project %s has been set to %s"
Pierre-Yves Chibon 9c2953
            % (project.fullname, args.ro.lower() == "true")
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon 3a016c
Pierre-Yves Chibon ffbe63
def do_new_group(args):
Pierre-Yves Chibon ffbe63
    """ Create a new group in this pagure instance.
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    """
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon 9c2953
    _log.debug("name:               %s", args.group_name)
Pierre-Yves Chibon 9c2953
    _log.debug("display-name:       %s", args.display)
Pierre-Yves Chibon 9c2953
    _log.debug("description:        %s", args.description)
Pierre-Yves Chibon 9c2953
    _log.debug("username:           %s", args.username)
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    # Validate user
Pierre-Yves Chibon 930073
    pagure.lib.query.get_user(session, args.username)
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    if not args.username:
Pierre-Yves Chibon ffbe63
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "An username must be provided to associate with the group"
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
    if not args.display:
Pierre-Yves Chibon ffbe63
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "A display name must be provided for the group"
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon 9c2953
    if pagure.config.config.get("ENABLE_GROUP_MNGT") is False:
Pierre-Yves Chibon 9c2953
        print("Group management has been turned off for this pagure instance")
Pierre-Yves Chibon ffbe63
        if not _ask_confirmation():
Pierre-Yves Chibon ffbe63
            return
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon 930073
    msg = pagure.lib.query.add_group(
Pierre-Yves Chibon ffbe63
        session=session,
Pierre-Yves Chibon ffbe63
        group_name=args.group_name,
Pierre-Yves Chibon ffbe63
        display_name=args.display,
Pierre-Yves Chibon ffbe63
        description=args.description,
Pierre-Yves Chibon 9c2953
        group_type="user",
Pierre-Yves Chibon ffbe63
        user=args.username,
Pierre-Yves Chibon ffbe63
        is_admin=True,
Pierre-Yves Chibon 9c2953
        blacklist=pagure.config.config["BLACKLISTED_GROUPS"],
Pierre-Yves Chibon ffbe63
    )
Pierre-Yves Chibon ffbe63
    session.commit()
Pierre-Yves Chibon 9c2953
    print("Group `%s` created." % args.group_name)
Pierre-Yves Chibon ffbe63
    print(msg)
Pierre-Yves Chibon ffbe63
Pierre-Yves Chibon ffbe63
Fabian Arrotin 0096c9
def do_list_groups(args):
Fabian Arrotin 0096c9
    """ Lists existing groups in this pagure instance.
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
    :arg args: the argparse object returned by ``parse_arguments()``.
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
    """
Fabian Arrotin 0096c9
Pierre-Yves Chibon 930073
    msg = pagure.lib.query.search_groups(session=session)
Fabian Arrotin 0096c9
    if msg:
Fabian Arrotin 0096c9
        print("List of groups on this Pagure instance:")
Fabian Arrotin 0096c9
        for group in msg:
Fabian Arrotin 0096c9
            print(group)
Fabian Arrotin 0096c9
    else:
Fabian Arrotin 0096c9
        print("No groups found in this pagure instance.")
Fabian Arrotin 0096c9
Fabian Arrotin 0096c9
Pierre-Yves Chibon 6e0576
def do_list_blocked_users(args):
Pierre-Yves Chibon 6e0576
    """ List all the blocked users.
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon 6e0576
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon 6e0576
    """
Pierre-Yves Chibon 6e0576
    date = None
Pierre-Yves Chibon 6e0576
    if args.date:
Pierre-Yves Chibon 6e0576
        try:
Pierre-Yves Chibon 6e0576
            date = arrow.get(args.date, "YYYY-MM-DD").replace(tzinfo="UTC")
Pierre-Yves Chibon 6e0576
            date = date.datetime
Pierre-Yves Chibon 6e0576
        except Exception as err:
Pierre-Yves Chibon 6e0576
            _log.exception(err)
Pierre-Yves Chibon 6e0576
            raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 6e0576
                "Invalid date submitted: %s, not of the format "
Pierre-Yves Chibon 6e0576
                "YYYY-MM-DD" % args.date
Pierre-Yves Chibon 6e0576
            )
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon 6e0576
    blocked_users = pagure.lib.query.get_blocked_users(
Pierre-Yves Chibon 6e0576
        session, username=args.username or None, date=date
Pierre-Yves Chibon 6e0576
    )
Pierre-Yves Chibon 6e0576
    if blocked_users:
Pierre-Yves Chibon 6e0576
        print("Users blocked:")
Pierre-Yves Chibon 6e0576
        for user in blocked_users:
Pierre-Yves Chibon 6e0576
            print(
Pierre-Yves Chibon 6e0576
                " %s  -  %s"
Pierre-Yves Chibon 6e0576
                % (
Pierre-Yves Chibon 6e0576
                    user.user.ljust(20),
Pierre-Yves Chibon 6e0576
                    user.refuse_sessions_before.isoformat(),
Pierre-Yves Chibon 6e0576
                )
Pierre-Yves Chibon 6e0576
            )
Pierre-Yves Chibon 6e0576
    else:
Pierre-Yves Chibon 6e0576
        print("No users are currently blocked")
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon bee78a
def do_block_user(args):
Pierre-Yves Chibon bee78a
    """ Block the specified user from all interactions with pagure until the
Pierre-Yves Chibon bee78a
    specified date.
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    :arg args: the argparse object returned by ``parse_arguments()``.
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    """
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon 9c2953
    _log.debug("username:           %s", args.username)
Pierre-Yves Chibon 9c2953
    _log.debug("date:               %s", args.date)
Pierre-Yves Chibon 6e0576
    _log.debug("list:               %s", args.list)
Pierre-Yves Chibon 6e0576
Pierre-Yves Chibon 6e0576
    if args.list:
Pierre-Yves Chibon 6e0576
        return do_list_blocked_users(args)
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    if not args.username:
Pierre-Yves Chibon bee78a
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "An username must be specified"
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    try:
Pierre-Yves Chibon 9c2953
        date = arrow.get(args.date, "YYYY-MM-DD").replace(tzinfo="UTC")
Pierre-Yves Chibon bee78a
    except Exception as err:
Pierre-Yves Chibon bee78a
        _log.exception(err)
Pierre-Yves Chibon bee78a
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "Invalid date submitted: %s, not of the format "
Pierre-Yves Chibon 9c2953
            "YYYY-MM-DD" % args.date
Pierre-Yves Chibon bee78a
        )
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
    # Validate user
Pierre-Yves Chibon 930073
    user = pagure.lib.query.get_user(session, args.username)
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon 9c2953
    print(
Pierre-Yves Chibon 9c2953
        "The user `%s` will be blocked from all interaction with this "
Pierre-Yves Chibon 6e0576
        "pagure instance until: %s." % (user.username, date.isoformat())
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon bee78a
    if not _ask_confirmation():
Pierre-Yves Chibon bee78a
        return
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon dd63e4
    user.refuse_sessions_before = date.datetime
Pierre-Yves Chibon bee78a
    session.add(user)
Pierre-Yves Chibon bee78a
    session.commit()
Pierre-Yves Chibon bee78a
Pierre-Yves Chibon bee78a
Patrick Uiterwijk d29158
def do_upload_repospanner_hooks(args):
Patrick Uiterwijk d29158
    """ Upload hooks to repoSpanner
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    Args:
Patrick Uiterwijk d29158
        args (argparse.Namespace): Parsed arguments
Patrick Uiterwijk d29158
    """
Patrick Uiterwijk d29158
    regioninfo = pagure.config.config["REPOSPANNER_REGIONS"].get(args.region)
Patrick Uiterwijk d29158
    if not regioninfo:
Patrick Uiterwijk d29158
        raise ValueError(
Patrick Uiterwijk d29158
            "repoSpanner region %s not in config file" % args.region
Patrick Uiterwijk d29158
        )
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    env = {
Patrick Uiterwijk d29158
        "config": os.environ.get("PAGURE_CONFIG", "/etc/pagure/pagure.cfg"),
Patrick Uiterwijk d29158
        "pypath": os.environ.get("PYTHONPATH", "None"),
Patrick Uiterwijk d29158
    }
Patrick Uiterwijk d29158
    sourcefile = os.path.abspath(
Patrick Uiterwijk d29158
        os.path.join(
Patrick Uiterwijk d29158
            os.path.dirname(os.path.realpath(__file__)),
Patrick Uiterwijk d29158
            "../hooks/files/repospannerhook",
Patrick Uiterwijk d29158
        )
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    with open(sourcefile, "r") as source:
Patrick Uiterwijk d29158
        template = source.read()
Patrick Uiterwijk d29158
    hookcontents = Template(template).substitute(env)
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    resp = requests.post(
Patrick Uiterwijk d29158
        "%s/admin/hook/admin.git/upload" % regioninfo["url"],
Patrick Uiterwijk d29158
        data=hookcontents,
Patrick Uiterwijk d29158
        headers={"X-Object-Size": str(len(hookcontents))},
Patrick Uiterwijk d29158
        verify=regioninfo["ca"],
Patrick Uiterwijk d29158
        cert=(
Patrick Uiterwijk d29158
            regioninfo["admin_cert"]["cert"],
Patrick Uiterwijk d29158
            regioninfo["admin_cert"]["key"],
Patrick Uiterwijk d29158
        ),
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    resp.raise_for_status()
Patrick Uiterwijk d29158
    resp = resp.json()
Patrick Uiterwijk d29158
    _log.debug("Response json: %s", resp)
Patrick Uiterwijk d29158
    if not resp["Success"]:
Patrick Uiterwijk d29158
        raise Exception("Error in repoSpanner API call: %s" % resp["Error"])
Patrick Uiterwijk d29158
    hook = resp["Info"]
Patrick Uiterwijk b3beee
    print("Hook ID for region %s: %s" % (args.region, hook))
Patrick Uiterwijk d29158
    return hook
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
def do_ensure_project_hooks(args):
Patrick Uiterwijk d29158
    """ Ensures that all projects have their hooks setup
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
    Args:
Patrick Uiterwijk d29158
        args (argparse.Namespace): Parsed arguments
Patrick Uiterwijk d29158
    """
Patrick Uiterwijk d29158
    projects = []
Patrick Uiterwijk d29158
    query = session.query(pagure.lib.model.Project).order_by(
Patrick Uiterwijk d29158
        pagure.lib.model.Project.id
Patrick Uiterwijk d29158
    )
Patrick Uiterwijk d29158
    for project in query.all():
Patrick Uiterwijk d29158
        print("Ensuring hooks for %s" % project.fullname)
Patrick Uiterwijk d29158
        projects.append(project.fullname)
Patrick Uiterwijk d29158
        pagure.lib.git.set_up_project_hooks(
Patrick Uiterwijk d29158
            project, project.repospanner_region, hook=args.hook
Patrick Uiterwijk d29158
        )
Patrick Uiterwijk d29158
    return projects
Patrick Uiterwijk d29158
Patrick Uiterwijk d29158
Pierre-Yves Chibon a10996
def do_create_branch(args):
Pierre-Yves Chibon a10996
    """ Creates the specified git branch
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    Args:
Pierre-Yves Chibon a10996
        args (argparse.Namespace): Parsed arguments
Pierre-Yves Chibon a10996
    """
Pierre-Yves Chibon a10996
    _log.debug("project:         %s", args.project)
Pierre-Yves Chibon a10996
    _log.debug("user:            %s", args.user)
Pierre-Yves Chibon a10996
    _log.debug("new branch:      %s", args.new_branch)
Pierre-Yves Chibon a10996
    _log.debug("from branch:     %s", args.from_branch)
Pierre-Yves Chibon a10996
    _log.debug("from commit:     %s", args.from_commit)
Pierre-Yves Chibon a10996
    _log.debug("user creating:   %s", args.action_user)
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    if not args.from_branch and not args.from_commit:
Pierre-Yves Chibon a10996
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon a10996
            "You must create the branch from something, either a commit "
Pierre-Yves Chibon a10996
            "or another branch"
Pierre-Yves Chibon a10996
        )
Pierre-Yves Chibon a10996
    if args.from_branch and args.from_commit:
Pierre-Yves Chibon a10996
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon a10996
            "You must create the branch from something, either a commit "
Pierre-Yves Chibon a10996
            "or another branch, not from both"
Pierre-Yves Chibon a10996
        )
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    # Validate users
Pierre-Yves Chibon a10996
    pagure.lib.query.get_user(session, args.action_user)
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    # Get the project
Pierre-Yves Chibon a10996
    project = _get_project(args.project, user=args.user)
Pierre-Yves Chibon a10996
Your Name 76327a
    _check_project(project, project=args.project, user=args.user)
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    try:
Pierre-Yves Chibon a10996
        pagure.lib.git.new_git_branch(
Pierre-Yves Chibon a10996
            args.action_user,
Pierre-Yves Chibon a10996
            project,
Pierre-Yves Chibon a10996
            args.new_branch,
Pierre-Yves Chibon a10996
            from_branch=args.from_branch,
Pierre-Yves Chibon a10996
            from_commit=args.from_commit,
Pierre-Yves Chibon a10996
        )
Pierre-Yves Chibon a10996
    except ValueError:
Pierre-Yves Chibon a10996
        if args.from_commit:
Pierre-Yves Chibon a10996
            raise pagure.exceptions.PagureException(
Pierre-Yves Chibon a10996
                "No commit %s found from which to branch" % (args.from_commit)
Pierre-Yves Chibon a10996
            )
Pierre-Yves Chibon a10996
        else:  # pragma: no-cover
Pierre-Yves Chibon a10996
            raise
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
    print("Branch created")
Pierre-Yves Chibon a10996
Pierre-Yves Chibon a10996
Julen Landa Alustiza 803bbd
def do_set_default_branch(args):
Julen Landa Alustiza 803bbd
    """ Sets the specified git branch as default
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    Args:
Julen Landa Alustiza 803bbd
        args (argparse.Namespace): Parsed arguments
Julen Landa Alustiza 803bbd
    """
Julen Landa Alustiza 803bbd
    _log.debug("project:         %s", args.project)
Julen Landa Alustiza 803bbd
    _log.debug("user:            %s", args.user)
Julen Landa Alustiza 803bbd
    _log.debug("branch:          %s", args.branch)
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    # Get the project
Julen Landa Alustiza 803bbd
    project = _get_project(args.project, user=args.user)
Julen Landa Alustiza 803bbd
Your Name 76327a
    _check_project(project, project=args.project, user=args.user)
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    repo_path = get_repo_path(project)
Julen Landa Alustiza 803bbd
    repo_obj = pygit2.Repository(repo_path)
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    if args.branch not in repo_obj.listall_branches():
Julen Landa Alustiza 803bbd
        raise pagure.exceptions.PagureException(
Julen Landa Alustiza 803bbd
            "No %s branch found on project: %s" % (args.branch, args.project)
Julen Landa Alustiza 803bbd
        )
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    pagure.lib.git.git_set_ref_head(project, args.branch)
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
    print("Branch %s set as default" % (args.branch))
Julen Landa Alustiza 803bbd
Julen Landa Alustiza 803bbd
Pierre-Yves Chibon 079c2a
def main():
Pierre-Yves Chibon 079c2a
    """ Start of the application. """
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
    # Parse the arguments
Pierre-Yves Chibon 079c2a
    args = parse_arguments()
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon b130e5
    if args.config:
Pierre-Yves Chibon b130e5
        config = args.config
Pierre-Yves Chibon 9c2953
        if not config.startswith("/"):
Pierre-Yves Chibon b130e5
            config = os.path.join(os.getcwd(), config)
Pierre-Yves Chibon 9c2953
        os.environ["PAGURE_CONFIG"] = config
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
        global session, _config
Pierre-Yves Chibon b130e5
        _config = pagure.config.reload_config()
Pierre-Yves Chibon cf98be
        session = pagure.lib.model_base.create_session(_config["DB_URL"])
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon 079c2a
    logging.basicConfig()
Pierre-Yves Chibon 079c2a
    if args.debug:
Pierre-Yves Chibon 079c2a
        _log.setLevel(logging.DEBUG)
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
    # Act based on the arguments given
Pierre-Yves Chibon 079c2a
    return_code = 0
Pierre-Yves Chibon 079c2a
    try:
Pierre-Yves Chibon af5184
        args.func(args)
Pierre-Yves Chibon 079c2a
    except KeyboardInterrupt:
Pierre-Yves Chibon 079c2a
        print("\nInterrupted by user.")
Pierre-Yves Chibon 079c2a
        return_code = 1
Pierre-Yves Chibon 079c2a
    except pagure.exceptions.PagureException as err:
Pierre-Yves Chibon 079c2a
        print(err)
Pierre-Yves Chibon 079c2a
        return_code = 3
Pierre-Yves Chibon 079c2a
    except Exception as err:
Pierre-Yves Chibon 9c2953
        print("Error: {0}".format(err))
Pierre-Yves Chibon 079c2a
        logging.exception("Generic error catched:")
Pierre-Yves Chibon 079c2a
        return_code = 2
Pierre-Yves Chibon b130e5
    finally:
Pierre-Yves Chibon b130e5
        session.remove()
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
    return return_code
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 079c2a
Pierre-Yves Chibon 9c2953
if __name__ == "__main__":
Pierre-Yves Chibon 079c2a
    sys.exit(main())