Skip to content
Snippets Groups Projects
client.py 40.6 KiB
Newer Older
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
        default='DEFAULT',
        help="Utilisation d'un serveur alternatif (test, backup, etc)"
    )
    parser.add_argument(
        '--drop-invalid',
        action='store_true',
        default=False,
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
        help="Combiné avec --force, droppe les clés en lesquelles on n'a pas confiance sans demander confirmation."
    )
    parser.add_argument(
        '-c', '--clipboard',
        action='store_true',
        default=None,
Daniel STAN's avatar
Daniel STAN committed
        help="Stocker le mot de passe dans le presse papier")
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    parser.add_argument(
        '--no-clip', '--noclip', '--noclipboard',
        action='store_false',
        default=None,
        dest='clipboard',
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
        help="Ne PAS stocker le mot de passe dans le presse papier"
    )
    parser.add_argument(
        '-f', '--force',
        action='store_true',
        default=False,
        help="Ne pas demander confirmation"
    )
Daniel STAN's avatar
Daniel STAN committed

    # Actions possibles
    action_grp = parser.add_mutually_exclusive_group(required=False)
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    action_grp.add_argument(
        '-e', '--edit',
        action='store_const',
        dest='action',
        default=show_file,
        const=edit_file,
        help="Editer (ou créer)"
    )
    action_grp.add_argument(
        '--view',
        action='store_const',
        dest='action',
        default=show_file,
        const=show_file,
        help="Voir le fichier"
    )
    action_grp.add_argument(
        '--remove',
        action='store_const',
        dest='action',
        default=show_file,
        const=remove_file,
        help="Effacer le fichier"
    )
    action_grp.add_argument(
        '-l', '--list',
        action='store_const',
        dest='action',
        default=show_file,
        const=show_files,
        help="Lister les fichiers"
    )
    action_grp.add_argument(
        '-r', '--restore',
        action='store_const', dest='action',
        default=show_file,
        const=restore_files,
        help="Restorer les fichiers corrompues"
    )
    action_grp.add_argument(
        '--check-keys',

        action='store_const',
        dest='action',
        default=show_file,
        const=my_check_keys,
        help="Vérifier les clés"
    )
    action_grp.add_argument(
        '--update-keys',
        action='store_const', dest='action',
        default=show_file,
        const=my_update_keys,
        help="Mettre à jour les clés"
    )
    action_grp.add_argument(
        '--list-roles',
        action='store_const',
        dest='action',
        default=show_file,
        const=show_roles,
        help="Lister les rôles existants"
    )
    action_grp.add_argument(
        '--list-servers',
        action='store_const',
        dest='action',
        default=show_file,
        const=show_servers,
        help="Lister les serveurs")
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    action_grp.add_argument(
        '--recrypt-files',
        action='store_const',
        dest='action',
        default=show_file,
        const=recrypt_files,
        help="""Rechiffrer les mots de passe.
                (Avec les mêmes rôles que ceux qu'ils avant.
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
                 Cela sert à mettre à jour les recipients pour qui un password est chiffré)"""
    )
    action_grp.add_argument(
        '--strict-recrypt-files',
        action='store_const',
        dest='action',
        default=show_file, const=lambda x: recrypt_files(
            x, strict=True),
        help="""Rechiffrer les mots de passe (mode strict, voir --roles)"""
    )
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    parser.add_argument(
        '--roles',
        nargs='?',
        default=None,
        help="""Liste de roles (séparés par des virgules). Par défaut, tous les
                rôles en écriture (sauf pour l'édition, d'un fichier existant).
                Avec --edit: le fichier sera chiffré pour exactement ces roles
                Avec --(strict-)recrypt-files :
                    sert à sélectionnenr les fichiers à rechiffrer
                    * non-strict: tout fichier possédant un des rôles listé
                    * strict: tout fichier dont *tous* les rôles sont dans la
                        liste
            """)
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    parser.add_argument(
        'fname',
        nargs='?',
        default=None,
        help="Nom du fichier à afficher"
    )
    # On parse les options fournies en commandline
    options = parser.parse_args()
    # Active le logger avec des couleurs
    # Par défaut on affiche >= WARNING
    options.verbose = 40 - (10 * options.verbose) if not options.quiet else 0
    logging.addLevelName(logging.INFO, "\033[1;36mINFO\033[1;0m")
    logging.addLevelName(logging.WARNING, "\033[1;33mWARNING\033[1;0m")
    logging.addLevelName(logging.ERROR, "\033[1;91mERROR\033[1;0m")
    logging.addLevelName(logging.DEBUG, "\033[1;37mDEBUG\033[1;0m")
    logging.basicConfig(
        level=options.verbose,
        format='\033[90m%(asctime)s\033[1;0m %(name)s %(levelname)s %(message)s'
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
    # On calcule les options qui dépendent des autres.
    # C'est un peu un hack, peut-être que la méthode propre serait de surcharger argparse.ArgumentParser
    # et argparse.Namespace, mais j'ai pas réussi à comprendre commenr m'en sortir.
    # ** Presse papier **
    # Si l'utilisateur n'a rien dit (ni option --clipboard ni --noclipboard),
    # on active le clipboard par défaut, à la condition
    # que xclip existe et qu'il a un serveur graphique auquel parler.
    if options.clipboard is None:
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
        options.clipboard = bool(
            os.getenv('DISPLAY')) and os.path.exists('/usr/bin/xclip')
    # On récupère les données du serveur à partir du nom fourni
    options.serverdata = config[options.server]
    # On parse les roles fournis, et il doivent exister, ne pas être -w…
    # parse_roles s'occupe de ça
    # NB : ça nécessite de se connecter au serveur, or, pour show_servers on n'en a pas besoin
    # Il faudrait ptêtre faire ça plus proprement, en attendant, je ducktape.
    if options.action != show_servers:
        options.roles = parse_roles(options)
    # Si l'utilisateur a demandé une action qui nécessite un nom de fichier,
    # on vérifie qu'il a bien fourni un nom de fichier.
    if options.action in NEED_FILENAME:
        insult_on_nofilename(options, parser)
    # On exécute l'action demandée
    options.action(options)