Skip to content
Snippets Groups Projects
Verified Commit 61dbaacd authored by me5na7qbjqbrp's avatar me5na7qbjqbrp
Browse files

Switch to INI configuration format

parent ac3b5a98
No related branches found
No related tags found
2 merge requests!5Code clean format,!3Add paramiko, logging and ini config
......@@ -26,39 +26,30 @@ import datetime
import copy
import logging
from binascii import hexlify
from configparser import ConfigParser
# Import a SSH client
from paramiko.client import SSHClient
from paramiko.ssh_exception import SSHException
# Logger local
# Configuration loading
# On n'a pas encore accès à la config donc on devine le nom
bootstrap_cmd_name = os.path.split(sys.argv[0])[1]
log = logging.getLogger(bootstrap_cmd_name)
# Import de la config
envvar = "CRANSPASSWORDS_CLIENT_CONFIG_DIR"
try:
sys.path.append(os.path.expanduser("~/.config/%s/" % (bootstrap_cmd_name,)))
import clientconfig as config
except ImportError:
default_config_path = os.path.expanduser("~/.config/" + bootstrap_cmd_name)
config_path = os.getenv("CRANSPASSWORDS_CLIENT_CONFIG_DIR", default_config_path)
config = ConfigParser()
if not config.read(config_path + "/clientconfig.ini"):
# If config could not be imported, display an error if required
ducktape_display_error = sys.stderr.isatty() and \
not any([opt in sys.argv for opt in ["-q", "--quiet"]]) and \
__name__ == '__main__'
envspecified = os.getenv(envvar, None)
if envspecified is None:
if ducktape_display_error:
log.error("Va lire le fichier README.")
exit(1)
else:
# On a spécifié à la main le dossier de conf
try:
sys.path.append(envspecified)
import clientconfig as config
except ImportError:
if ducktape_display_error:
log.error("%s is passed, but no config could be imported" % envvar)
exit(1)
if ducktape_display_error:
# Do not use logger as it has not been initialized yet
print("%s/clientconfig.ini could not be read. Please read README." % config_path)
exit(1)
# Logger local
log = logging.getLogger(bootstrap_cmd_name)
#: Pattern utilisé pour détecter la ligne contenant le mot de passe dans les fichiers
pass_regexp = re.compile('[\t ]*pass(?:word)?[\t ]*:[\t ]*(.*)\r?\n?$',
......@@ -290,14 +281,13 @@ def remote_command(options, command, arg=None, stdin_contents=None):
"""
Execute remote command and return output
"""
# TODO: instantiate client outside to have only one connection
client = create_ssh_client()
# Build command
if not "remote_cmd" in options.serverdata:
log.error("Missing parameter `remote_cmd` in active server configuration")
exit(1)
remote_cmd = " ".join(options.serverdata['remote_cmd'] + [command])
remote_cmd = options.serverdata['remote_cmd'] + " " + command
if arg:
remote_cmd += " " + arg
......@@ -612,7 +602,7 @@ def show_roles(options):
def show_servers(options):
"""Affiche la liste des serveurs disponibles"""
print(u"Liste des serveurs disponibles".encode("utf-8"))
for server in config.servers.keys():
for server in config.keys():
print((u" * " + server).encode("utf-8"))
def saveclipboard(restore=False, old_clipboard=None):
......@@ -958,7 +948,7 @@ if __name__ == "__main__":
default=False,
help="silent mode: hide errors, overrides verbosity"
)
parser.add_argument('-s', '--server', default='default',
parser.add_argument('-s', '--server', default='DEFAULT',
help="Utilisation d'un serveur alternatif (test, backup, etc)")
parser.add_argument('--drop-invalid', action='store_true', default=False,
dest='drop_invalid',
......@@ -1048,7 +1038,7 @@ if __name__ == "__main__":
if options.clipboard is None:
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.servers[options.server]
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
......
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé `DEFAULT` sera utilisée.
#:
#: `host` est l'ip ou le nom de domaine sur lequel se connecter
#: `remote_cmd' est la commande executée sur le serveur.
[DEFAULT]
host=odlyd.crans.org
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
[localhost]
host=localhost
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
[ovh]
host=soyouz.crans.org
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
#!/usr/bin/env python2
# -*- encoding: utf-8 -*-
""" Configuration du client cranspasswords """
import os
#: Pour override le nom si vous voulez renommer la commande
cmd_name = 'cranspasswords'
#: Path du binaire ssh sur la machine client
ssh_path = '/usr/bin/ssh'
#: Path du script ``cmd_name``-server sur le serveur
server_path = '/usr/local/bin/%s-server' % (cmd_name,)
#: Commande à exécuter sur le serveur après y être entré en ssh
distant_cmd = ["sudo", '-n', server_path]
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé ``'default'`` sera utilisée.
#:
#: * ``'remote_cmd'`` : La commande exécutée sur le serveur.
servers = {
'default': {
'host': 'odlyd.crans.org',
'remote_cmd': distant_cmd,
},
# Utile pour tester
'localhost': {
'host': 'localhost',
'remote_cmd': distant_cmd,
},
'ovh': {
'host': 'soyouz.crans.org',
'remote_cmd': distant_cmd,
}
}
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé `DEFAULT` sera utilisée.
#:
#: `host` est l'ip ou le nom de domaine sur lequel se connecter
#: `remote_cmd' est la commande executée sur le serveur.
[DEFAULT]
host=odlyd.crans.org
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
[titanic]
host=titanic
remote_cmd=ssh odlyd.crans.org sudo -n /usr/local/bin/cranspasswords-server
[localhost]
host=localhost
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
[ovh]
host=soyouz.crans.org
remote_cmd=sudo -n /usr/local/bin/cpasswords-server
#!/usr/bin/env python2
# -*- encoding: utf-8 -*-
""" Configuration du client cranspasswords """
import os
#: Pour override le nom si vous voulez renommer la commande
cmd_name = 'cranspasswords'
#: Path du script ``cmd_name``-server sur le serveur
server_path = '/usr/local/bin/%s-server' % (cmd_name,)
#: Commande à exécuter sur le serveur après y être entré en ssh
distant_cmd = ["sudo", '-n', server_path]
print distant_cmd
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé ``'default'`` sera utilisée.
#:
#: * ``'remote_cmd'`` : La commande exécutée sur le serveur.
servers = {
'default': {
'host': 'odlyd.crans.org',
'remote_cmd': distant_cmd,
},
'titanic': {
'host': 'freebox.crans.org',
# manual ssh jump
'remote_cmd': ['ssh', 'odyld.crans.org'] + distant_cmd,
},
# Utile pour tester
'localhost': {
'host': 'localhost',
'remote_cmd': distant_cmd,
},
'ovh': {
'host': 'soyouz.crans.org',
'remote_cmd': ['sudo', '-n', '/usr/local/bin/cpasswords-server'],
}
}
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé `DEFAULT` sera utilisée.
#:
#: `host` est l'ip ou le nom de domaine sur lequel se connecter
#: `remote_cmd' est la commande executée sur le serveur.
[DEFAULT]
host=
remote_cmd=/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server
[gladys]
host=home.b2moo.fr
remote_cmd=/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server
[gladys-home]
host=gladys.home
remote_cmd=/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server
[pimeys]
host=pimeys.fr
remote_cmd=sudo -n /usr/local/bin/cranspasswords-server
#!/usr/bin/env python2
# -*- encoding: utf-8 -*-
""" Configuration du client cranspasswords """
import os
#: Liste des serveurs sur lesquels ont peut récupérer des mots de passe.
#:
#: Sans précision du paramètre --server, la clé ``'default'`` sera utilisée.
#:
#: * ``'remote_cmd'`` : La commande exécutée sur le serveur.
servers = {
'default': {
'host': '',
'remote_cmd': ['/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server', ],
},
'gladys': {
'host': 'home.b2moo.fr',
'remote_cmd': ['/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server', ],
},
'gladys-home': {
'host': 'gladys.home',
'remote_cmd': ['/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server', ],
},
'pimeys': {
'host': 'pimeys.fr',
'remote_cmd': ['sudo', '-n', '/usr/local/bin/cranspasswords-server', ],
},
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment