Makefile côté serveur.
This commit is contained in:
parent
dca1572b21
commit
7dacd6bb1b
4 changed files with 45 additions and 17 deletions
12
Makefile
12
Makefile
|
@ -11,6 +11,12 @@ after=cmd_name = '${cmd_name}'
|
||||||
before2=cmd_name=${cmd_original_name}
|
before2=cmd_name=${cmd_original_name}
|
||||||
after2=cmd_name=${cmd_name}
|
after2=cmd_name=${cmd_name}
|
||||||
|
|
||||||
|
# Path du sudoer-file utilisé pour autoriser l'accès au script serveur
|
||||||
|
sudoer_file_path=/etc/sudoers.d/${cmd_name}
|
||||||
|
# Groupe qui aura le droit de lire les fichiers de mot de passe
|
||||||
|
# (indépendamment de pouvoir les déchiffrer)
|
||||||
|
sudoer_group=respbats
|
||||||
|
|
||||||
build:
|
build:
|
||||||
@echo "Pour installer ${cmd_name} :"
|
@echo "Pour installer ${cmd_name} :"
|
||||||
@echo "Exécutez make install pour installer le client pour vous."
|
@echo "Exécutez make install pour installer le client pour vous."
|
||||||
|
@ -35,3 +41,9 @@ install:
|
||||||
@if [ "${cmd_name}" != "${cmd_original_name}" ]; then make --quiet rerename; fi
|
@if [ "${cmd_name}" != "${cmd_original_name}" ]; then make --quiet rerename; fi
|
||||||
|
|
||||||
install-server:
|
install-server:
|
||||||
|
@echo "Création du sudoer-file."
|
||||||
|
@echo "# Autorisation locale d'éxécution de ${cmd_name}" > ${sudoer_file_path}
|
||||||
|
@echo " %${sudoer_group} ALL=(root) NOPASSWD: /usr/local/bin/${cmd_name}-server" >> ${sudoer_file_path}
|
||||||
|
install server.py /usr/local/bin/${cmd_name}-server
|
||||||
|
install -d /etc/${cmd_name}
|
||||||
|
install serverconfig.example.py /etc/${cmd_name}/serverconfig.py
|
||||||
|
|
18
README
18
README
|
@ -5,17 +5,29 @@ ordinateur) et le serveur.
|
||||||
== Nom de la commande ==
|
== Nom de la commande ==
|
||||||
Si vous voulez appeler votre commande autrement que "cranspasswords",
|
Si vous voulez appeler votre commande autrement que "cranspasswords",
|
||||||
c'est possible. Il faut pour cela changer la variable cmd_name dans le Makefile
|
c'est possible. Il faut pour cela changer la variable cmd_name dans le Makefile
|
||||||
avant de lancer make install.
|
avant de lancer make install ou make install-server.
|
||||||
|
|
||||||
== Installation et configuration du client ==
|
== Installation et configuration du client ==
|
||||||
* Copier le dépôt git sur votre machine :
|
* Copiez le dépôt git sur votre machine :
|
||||||
$ git clone git://git.crans.org/git/cranspasswords.git
|
$ git clone git://git.crans.org/git/cranspasswords.git
|
||||||
* Installer le package python-gnupg
|
* Installez le package python-gnupg
|
||||||
* Si ce n'est déjà fait, indiquer votre clé publique sur gest_crans
|
* Si ce n'est déjà fait, indiquer votre clé publique sur gest_crans
|
||||||
* Lancez make install
|
* Lancez make install
|
||||||
* Assurez-vous d'avoir ~/bin dans votre $PATH
|
* Assurez-vous d'avoir ~/bin dans votre $PATH
|
||||||
* Exécutez cranspasswords test pour voir si vous arrivez à récupérer le mot de passe de test
|
* Exécutez cranspasswords test pour voir si vous arrivez à récupérer le mot de passe de test
|
||||||
|
|
||||||
|
== Installation et configuration du serveur ==
|
||||||
|
* Copiez le dépôt git sur le serveur :
|
||||||
|
$ git clone git://git.crans.org/git/cranspasswords.git
|
||||||
|
* Lancez sudo make install-server
|
||||||
|
* Il va installer un suoder-file, si vous voulez paramétrer
|
||||||
|
le groupe qui aura les accès en lecture aux fichiers de mot de passe,
|
||||||
|
changez la variable sudoer_group au début de Makefile.
|
||||||
|
La possibilité de lire les fichiers est indépendante de la capacité
|
||||||
|
à les déchiffrer.
|
||||||
|
* Éditez /etc/cranspasswords/serverconfig.py pour qu'il soit conforme
|
||||||
|
à vos désirs.
|
||||||
|
|
||||||
== Complétion ==
|
== Complétion ==
|
||||||
* Pour avoir la bash-complétion, dans votre .bashrc :
|
* Pour avoir la bash-complétion, dans votre .bashrc :
|
||||||
* Sourcez le fichier bash_completion présent dans le dépôt
|
* Sourcez le fichier bash_completion présent dans le dépôt
|
||||||
|
|
2
server
2
server
|
@ -2,4 +2,4 @@
|
||||||
# sudo-wrapper pour exécuter cranspasswords côté serveur
|
# sudo-wrapper pour exécuter cranspasswords côté serveur
|
||||||
|
|
||||||
cmd_name=cranspasswords
|
cmd_name=cranspasswords
|
||||||
sudo /root/${cmd_name}/server.py $*
|
sudo /usr/local/bin/${cmd_name}/server.py $*
|
||||||
|
|
30
server.py
30
server.py
|
@ -13,7 +13,11 @@ import datetime
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
|
||||||
from serverconfig import READONLY, CRANSP_MAIL, DEST_MAIL, KEYS, ROLES, STORE, cmd_name
|
# Même problème que pour le client, il faut bootstraper le nom de la commande
|
||||||
|
# Pour accéder à la config
|
||||||
|
cmd_name = os.path.split(sys.argv[0])[1].replace("-server", "")
|
||||||
|
sys.path.append("/etc/%s/" % (cmd_name,))
|
||||||
|
import serverconfig
|
||||||
|
|
||||||
MYUID = pwd.getpwuid(os.getuid())[0]
|
MYUID = pwd.getpwuid(os.getuid())[0]
|
||||||
if MYUID == 'root':
|
if MYUID == 'root':
|
||||||
|
@ -26,13 +30,13 @@ def validate(roles, mode='r'):
|
||||||
for role in roles:
|
for role in roles:
|
||||||
if mode == 'w':
|
if mode == 'w':
|
||||||
role += '-w'
|
role += '-w'
|
||||||
if ROLES.has_key(role) and MYUID in ROLES[role]:
|
if serverconfig.ROLES.has_key(role) and MYUID in serverconfig.ROLES[role]:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def getpath(filename, backup=False):
|
def getpath(filename, backup=False):
|
||||||
"""Récupère le chemin du fichier ``filename``"""
|
"""Récupère le chemin du fichier ``filename``"""
|
||||||
return os.path.join(STORE, '%s.%s' % (filename, 'bak' if backup else 'json'))
|
return os.path.join(serverconfig.STORE, '%s.%s' % (filename, 'bak' if backup else 'json'))
|
||||||
|
|
||||||
def writefile(filename, contents):
|
def writefile(filename, contents):
|
||||||
"""Écrit le fichier avec les bons droits UNIX"""
|
"""Écrit le fichier avec les bons droits UNIX"""
|
||||||
|
@ -43,15 +47,15 @@ def writefile(filename, contents):
|
||||||
|
|
||||||
def listroles():
|
def listroles():
|
||||||
"""Liste des roles existant et de leurs membres"""
|
"""Liste des roles existant et de leurs membres"""
|
||||||
return ROLES
|
return serverconfig.ROLES
|
||||||
|
|
||||||
def listkeys():
|
def listkeys():
|
||||||
"""Liste les usernames et les (mail, fingerprint) correspondants"""
|
"""Liste les usernames et les (mail, fingerprint) correspondants"""
|
||||||
return KEYS
|
return serverconfig.KEYS
|
||||||
|
|
||||||
def listfiles():
|
def listfiles():
|
||||||
"""Liste les fichiers dans l'espace de stockage, et les roles qui peuvent y accéder"""
|
"""Liste les fichiers dans l'espace de stockage, et les roles qui peuvent y accéder"""
|
||||||
os.chdir(STORE)
|
os.chdir(serverconfig.STORE)
|
||||||
|
|
||||||
filenames = glob.glob('*.json')
|
filenames = glob.glob('*.json')
|
||||||
files = {}
|
files = {}
|
||||||
|
@ -128,14 +132,14 @@ def backup(corps, fname, old):
|
||||||
def notification(subject, corps, fname, old):
|
def notification(subject, corps, fname, old):
|
||||||
"""Envoie par mail une notification de changement de fichier"""
|
"""Envoie par mail une notification de changement de fichier"""
|
||||||
conn = smtplib.SMTP('localhost')
|
conn = smtplib.SMTP('localhost')
|
||||||
frommail = CRANSP_MAIL
|
frommail = serverconfig.CRANSP_MAIL
|
||||||
tomail = DEST_MAIL
|
tomail = serverconfig.DEST_MAIL
|
||||||
msg = MIMEMultipart(_charset="utf-8")
|
msg = MIMEMultipart(_charset="utf-8")
|
||||||
msg['Subject'] = subject
|
msg['Subject'] = subject
|
||||||
msg['X-Mailer'] = cmd_name.decode()
|
msg['X-Mailer'] = serverconfig.cmd_name.decode()
|
||||||
msg['From'] = CRANSP_MAIL
|
msg['From'] = serverconfig.CRANSP_MAIL
|
||||||
msg['To'] = DEST_MAIL
|
msg['To'] = serverconfig.DEST_MAIL
|
||||||
msg.preamble = u"%s report" % (cmd_name.decode(),)
|
msg.preamble = u"%s report" % (serverconfig.cmd_name.decode(),)
|
||||||
info = MIMEText(corps +
|
info = MIMEText(corps +
|
||||||
u"\nLa version précédente a été sauvegardée." +
|
u"\nLa version précédente a été sauvegardée." +
|
||||||
u"\n\n-- \nCranspasswords.py", _charset="utf-8")
|
u"\n\n-- \nCranspasswords.py", _charset="utf-8")
|
||||||
|
@ -150,7 +154,7 @@ if __name__ == "__main__":
|
||||||
if len(argv) not in [1, 2]:
|
if len(argv) not in [1, 2]:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
command = argv[0]
|
command = argv[0]
|
||||||
if READONLY and command in WRITE_COMMANDS:
|
if serverconfig.READONLY and command in WRITE_COMMANDS:
|
||||||
raise IOError("Ce serveur est read-only.")
|
raise IOError("Ce serveur est read-only.")
|
||||||
filename = None
|
filename = None
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue