Commit 78f69b9f authored by matograine's avatar matograine

Merge branch '0.3' into 'master'

0.3

See merge request !8
parents 090dbec6 8cca9084
......@@ -3,8 +3,6 @@
Ğ1-Cotis est un script de **cotisation volontaire**, qui permet de verser un % des paiements reçus aux comptes que l'on souhaite.
Il dépend de Silkaj et Diceware. Il permet aussi de programmer des **versements récurrents**.
!! La version 0.2.1 a un bug. Utiliser la v0.2 avec silkaj 0.6 !!
Lancé en tâche cron, il est prévu pour agir périodiquement (jours, semaine, mois, reboot) :
## Cotisation
......@@ -23,45 +21,47 @@ Vous trouverez (un peu) plus d'informations sur [le site](g1pourboire.fr/G1cotis
## Installation
Comment l'installer et le configurer ?
Il vous faut tout d'abord installer les dépendances :
Silkaj 0.6.5 (profitez-en pour le tester !)
Diceware
Silkaj : version spécifique à G1Cotis, en attendant la 0.8 officielle.
Diceware
* Sous Debian Buster ou Ubuntu 19.X GNU/Linux :
`# apt update ; apt upgrade ; apt install silkaj diceware`
* Sous Debian Buster ou Ubuntu 19.X GNU/Linux:
`# apt update ; apt upgrade ; apt install diceware pipenv libsodium23`
`# wget https://git.duniter.org/matograine/silkaj/-/archive/g1cotis-multioutput/silkaj-g1cotis-multioutput.tar.gz`
`# tar -xf silkaj-g1cotis-multioutput.tar.gz`
`# cd silkaj-g1cotis-multioutput`
`# pipenv install "-e ."`
* Sous Debian Stretch : voir [ce post](https://blog.jytou.fr/2018/06/02/installing-a-working-python-environment-and-silkaj-on-a-raspberry-pi-3-with-raspbian-jessie/) pour installer Silkaj en pipenv. Puis :
* Sous Debian Stretch : voir [ce post](https://blog.jytou.fr/2018/06/02/installing-a-working-python-environment-and-silkaj-on-a-raspberry-pi-3-with-raspbian-jessie/) pour pour installer Silkaj en pipenv. Puis :
`# apt install diceware`
* Sous d'autres distributions : je ne sais pas, indiquez-moi comment vous faites ! Voici [le site de Silkaj](https://silkaj.duniter.org/index.html)
Ensuite :
* Placez-vous dans le /home de l'utilisateur qui va lancer Ğ1cotis, connecté comme cet utilisateur.
* Télécharger la dernière release (v0.2.1) en .tar.gz :
`$ wget https://git.duniter.org/matograine/g1-cotis/-/archive/v0.2/g1-cotis-v0.2.tar.gz`
* Placez-vous dans le /home de l'utilisateur qui va lancer Ğ1cotis, connecté comme cet utilisateur.
* Télécharger la dernière release (v0.2) en .tar.gz :
`$ wget https://git.duniter.org/matograine/g1-cotis/-/archive/0.3/g1-cotis-0.3.tar.gz`
* La déziper où vous le souhaitez :
`$ tar -xf g1-cotis-v0.2.tar.gz`
`$ tar -xf g1-cotis-0.3.tar.gz`
* Renommer (si vous le souhaitez) :
`$ mv g1-cotis-v0.2 G1cotis`
`$ mv g1-cotis-0.3 G1cotis`
* Rendez ce dossier inaccessible pour les autres utilisateurs :
`$ chmod 700 G1cotis`
* Vous placer dans le dossier :
`$ cd G1cotis`
* Editer le fichier config.sh en fonction des paramètres locaux (dossier, noeud, monnaie, silkaj) :
* Editer le fichier config.sh en fonction des paramètres locaux (dossier, noeud, monnaie, dossier **silkaj-g1cotis-multioutput**) :
`$ nano config.sh`
* Créer le premier compte :
`$ bash nouveau-compte.sh`
* Modifiez le crontab en suivant les recommandations du script :
`$ crontab -e `
Tous les dossiers nécessaires seront créés à la première création de compte.
Pour une mise à jour, déplacez simplement les dossiers q_\<periode\> de l'ancien dossier vers le nouveau.
Pour une mise à jour, déplacez simplement les dossiers d_\<periode\> et le config.sh de l'ancien dossier vers le nouveau.
......@@ -95,10 +95,9 @@ D'autre part, il ne peut pas être lancé comme script fonctionnant au reboot, i
Je ne proposerai pas de service ouvert, cependant j'invite qui le souhaite à proposer ce service à ses connaissances. Si vous le faites, j'aurais plaisir à le savoir ;-)
Je n'ai pas les compétences pour créer une interface web, mais elle me semble un ajout utile. Si un.e dev veut faire un fork, soyez lae bienvenu.e !
### Licence CECILL ###
Cet ensemble de scripts est publié sous licence CECILL 2.1, compatible avec la licence GNU.
Aucune garantie n'est apportée : c'est le premier code que je publie, et je code comme un ~~cochon~~ autodidacte débutant.
\ No newline at end of file
Aucune garantie n'est apportée : c'est le premier code que je publie, et je code comme un ~~cochon~~ autodidacte débutant.
......@@ -6,22 +6,20 @@ export PATH=$PATH:/usr/local/bin # utile pour l'utiliser en tâche CRON.
#### Paramètres de l'instance G1Cotis ####
# Dossier G1Cotis (indiquer le chemin complet)
# !! Ne mettez pas de / à la fin !! exemple : /home/toto/G1cotis
dossier=/home/UTILISATEUR/g1cotis
# !! Ne mettez pas de / à la fin !! exemple : /home/toto/G1cotis
dossier=/home/UTILISATEUR/G1cotis
#### Paramètres Silkaj ####
## Choisir le noeud Duniter sur lequel vous vous connectez (de préférence un noeud régional, ou personnel, différent de g1.duniter.org)
noeud="g1.cgeek.fr:443" #"g1.presles.be:443" "ts.g1.librelois.fr" "g1.duniter.inso.ovh"
noeud="ts.g1.librelois.fr:443" #"g1.presles.be:443" "g1.duniter.inso.ovh"
## monnaie (Ğ1 ou ĞTest). Si vous travaillez sur la ĞTest, il vous faudra aussi modifier le noeud.
monnaie=Ğ1
## Si votre distribution GNU/Linux vous permet d'installer Silkaj directement :
silkaj=silkaj
##monnaie=ĞTest
## Si vous avez installé Silkaj en environnement virtuel :
## Chemin vers le dossier contenant Silkaj :
#cd /home/UTILISATEUR/Silkaj
#silkaj="pipenv run silkaj"
cd /home/UTILISATEUR/silkaj-g1cotis-multioutput
silkaj="pipenv run silkaj"
########################
......
......@@ -10,16 +10,6 @@ source $dossier_scripts/fonctions.sh
#### Début du script ####
## nettoyer authfile si besoin
if [ -e authfile ] ; then
mv -f authfile $dossier_auth/authfile.$(date +%d-%m-%y_%H:%m)
fi
if [ -e $dossier/authfile ] ; then
mv -f $dossier/authfile $dossier_auth/authfile.$(date +%d-%m-%y_%H:%m)
fi
# 1- information
printf "\n##################################\n#### Configuration de Ğ1Cotis ####\n################################## \n\n"
......@@ -46,10 +36,11 @@ printf "\n########################################\n#### Initialisation du sc
# 3- questions :
# lecture du chemin du dossier, Vérification du dossier
if [ ! $doss == $dossier ] ; then
printf "Vous n'avez pas modifié le fichier config.sh. \n \n Veuillez y indiquer : \'dossier=$doss\' , et vérifier le reste de la configuration. \n Vérifiez également que vous avez installé Silkaj et Diceware, comme indiqué dans le Readme. Si besoin, modifiez config.sh en fonction de votre installation de Silkaj. \n Puis relancer nouveau-compte.sh. A tout de suite !\n"
exit
printf "Vous n'avez pas modifié le fichier config.sh. \n \n Veuillez y indiquer : \'dossier=$doss\' , et vérifier le reste de la configuration. \n Vérifiez également que vous avez installé Silkaj et Diceware, comme indiqué dans le Readme. Si besoin, modifiez config.sh en fonction de votre installation de Silkaj. \n Puis relancer nouveau-compte.sh. A tout de suite !\n"
exit
fi
# VERIFIER L'EXISTENCE DES DOSSIERS
if [ ! -e $dossier_quot ] || [ ! -e $dossier_hebdo ] || [ ! -e $dossier_mens ] || [ ! -e $dossier_reboot ] || [ ! -e $dossier_auth ] || [ ! -e $dossier/logs ] ; then
......@@ -91,8 +82,8 @@ printf "Vous allez vérifier les paramètres du compte.\nSi ces paramètres ne c
printf "OK, continuer : "
read continuer
printf "\n\n#### Début du fichier ####\n"
cat $fichier
printf "#### fin du fichier ####\n\n"
printf '\E[31;40m'"\033[1m$(cat $fichier)\033[0m"
printf "\n\n#### fin du fichier ####\n\n"
printf "#### Dernières vérifications... ####\n\n"
## Vérification crontab
......@@ -123,13 +114,12 @@ if [ ! "$?" == "0" ] ; then
tps_random 28 ; dom=$?
dow=*
cr_mens=$(echo "$m $h $dom * $dow cd $dossier_scripts ; bash ./init_mens.sh >> $dossier/logs/g1cotis.log 2>&1")
printf "\nĞ1Cotis (mensuel) sera lancé chaque $dom e jour du mois à $h:$m."
printf "\n\n !! ATTENTION !! : Après ce script, exécutez la commande 'crontab -e' et ajoutez à la fin de votre crontable (modifiez MAILTO si vous savez ce que vous faites) :\n\nMAILTO=\"\"\n$cr_reboot\n$cr_quot\n$cr_hebdo\n$cr_mens\n\n "
fi
printf "\nĞ1Cotis (mensuel) sera lancé chaque $dow e jour du mois à $h:$m."
printf '\E[31;40m'"\033[1m\n\n !! ATTENTION !! : Après ce script, exécutez la commande 'crontab -e' et ajoutez à la fin de votre crontable (modifiez MAILTO si vous savez ce que vous faites) :\n\nMAILTO=\"\"\n$cr_reboot\n$cr_quot\n$cr_hebdo\n$cr_mens\n\n\033[0m "
fi
else
printf "Votre Crontab est déjà configuré. \nSi vous installez la v0.2 par-dessus la v0.1, veuillez effacer les lignes correspondantes dans le crontab et recommencer."
printf "Votre Crontab est déjà configuré. \nSi vous installez la v0.2 par-dessus la v0.1, veuillez effacer les lignes correspondantes dans le crontab et recommencer."
fi
rm /tmp/g1cotis-crontab
printf "\n\n#####\nFin des vérifications. Suivez nos recommandations avant le premier lancement de Ğ1Cotis.\n\nMerci de participer au financement de la Ğ1 !\n\n"
......@@ -65,46 +65,35 @@ elif [ $montant_round -lt $min ] ; then # S'il n'y a pas assez de monnai
elif [ $montant_round -ge $min ] ; then
echo "montant : " $montant $monnaie
## Calcul et envoi des cotisations
a=0
restant=$montant
while [ $a -lt ${#lst_tx[@]} ] ; do
echo "======================"
echo "compte de cotisation : " ${lst_tx[$a]}
p=$(echo "${lst_p[$a]}" | bc)
echo "pourcentage : " $p "%"
cot=$(echo "$montant * $p * 0.01 " | bc )
com=${lst_com[$a]}
echo "cotisation n° " $((a+1)) " : " $cot
# Calcul du montant restant
restant=$(echo "$restant - $cot" |bc )
# envoi de la transaction
while true ; do
$silkaj -p $noeud --auth-file --file=$auth tx -y --output="${lst_tx[$a]}" --amount="$cot" --comment="$com"
if [ $? == 0 ] ; then
echo "cotisation $(($a+1)) effectuée" ; break
else
echo "ERREUR : nouvel essai dans 5 minutes. Si ce problème se reproduit, envisagez de changer de noeud en modifiant config.sh"
sleep 300
fi
done
a=$(($a+1))
done
## Envoi du reste sur le compte final
restant_round=$(echo "$restant" | awk '{printf("%d\n",$1)}')
echo "apres cotisations :" $restant $monnaie
if [ ! $restant_round -eq 0 ] ; then
while true ; do
$silkaj -p $noeud --auth-file --file=$auth tx -y --output="$fin" --amount="$restant" --comment="G1Cotis"
if [ $? == 0 ] ; then
echo "transaction finale effectuée" ; break
else
echo "ERREUR : nouvel essai dans 5 minutes. Si ce problème se reproduit, envisagez de changer de noeud en modifiant config.sh"
sleep 300
fi
done
fi
## Création de la liste d'outputs
output=${lst_tx[0]}
a=1
while [ $a -lt ${#lst_tx[@]} ] ; do
output=$output:${lst_tx[$a]}
a=$((a+1))
done
output=$output:$fin
echo "debug output : $output"
## Création de la liste de montants
amount=$(echo "$montant * ${lst_p[0]} * 0.01 " | bc )
restant=$(echo "$montant - $amount" | bc)
a=1
while [ $a -lt ${#lst_p[@]} ] ; do
p=${lst_p[$a]}
cot=$(echo "$montant * $p * 0.01 " | bc )
amount=$amount:$cot
restant=$(echo "$restant - $cot" | bc )
a=$((a+1))
done
amount=$amount:$restant
echo "debug amount : $amount"
## envoi transaction
$silkaj -p $noeud -af --file $auth tx -y --output=$output --amount="$amount" --comment="$comment"
## fin du script
fi
......@@ -115,4 +104,6 @@ fin=""
min=""
lst_tx=""
lst_p=""
lst_com=""
comment=""
amount=""
......@@ -52,16 +52,19 @@ elif [ $(echo "100 * $montant_round" | bc) -lt $(echo "100 * $virt_recur" | bc)
elif [ $(echo "100 * $montant_round" | bc) -ge $(echo "100 * $virt_recur" | bc) ] ; then
echo "montant : " $montant $monnaie
## Envoi du virement
while true ; do
$silkaj -p $noeud --auth-file --file=$auth tx -y --output="$fin" --amount="$virt_recur" --comment=$com
if [ $? == 0 ] ; then
echo "virement effectué" ; break
else
echo "ERREUR : nouvel essai dans 5 minutes. Si ce problème se reproduit, envisagez de changer de noeud en modifiant config.sh ; ou vérifiez que le versement a DEUX chiffres après la virgule."
sleep 300
fi
done
## Envoi du virement : 5 tentatives
a=0
while [ $a -le 5 ] ; do
$silkaj -p $noeud -af --file $auth tx -y --output="$fin" --amount="$virt_recur" --comment="$com"
if [ $? == 0 ] ; then
echo "virement effectué" ; break
elif [ $a -eq 5 ] ; then
echo "Le serveur est inaccessible. envisagez de changer de noeud en modifiant config.sh ou reportez ce bug."
else
echo "ERREUR : nouvel essai dans 5 minutes. Si ce problème se reproduit, envisagez de changer de noeud en modifiant config.sh ; ou vérifiez que le versement a DEUX chiffres après l$
sleep 300
fi
done
fi
# vidage des variables
......
......@@ -58,13 +58,13 @@ echo -n "Connaissez-vous déjà les identifiants pour ce compte ? (o/N) : "
read ouinon
if [ "$ouinon" == "o" ] || [ "$ouinon" == "O" ] ; then
printf "\nNous allons créer le fichier d'authentification pour ce compte. Soyez sûr.e de vous rappeler des identifiants, Ğ1Cotis ne les enregistrera pas.\nEntrez les identifiants lorsque Silkaj vous le demandera.\n\nEn attente de Silkaj...\n\n"
$silkaj authfile > /tmp/$nom
rm -f ./authfile ; $silkaj authfile > /tmp/$nom
pubkey=$(cat /tmp/$nom | grep "Authentication file 'authfile' generated and stored in current folder for following public key:" | cut -d':' -f2 | sed 's/.\{1\}//' ) #| cut -d' ' -f2- | sed -e 's/ $monnaie//g' )
printf "\nClef publique : $pubkey pour le compte $nom. Est-ce juste ? (o/N) : "
read ouinon
if [ "$ouinon" = "o" ] || [ "$ouinon" = "O" ]; then
printf "recept=$pubkey\n" >> $fichier
cp ./authfile $dossier_auth/$pubkey.auth
mv ./authfile $dossier_auth/$pubkey.auth
printf "Parfait, continuons\n\n" ; break
elif [ "$ouinon" = "n" ] || [ "$ouinon" = "N" ] || [ "$ouinon" = "" ]; then
printf "\nRecommençons."
......@@ -76,10 +76,10 @@ read ouinon
mdp=$(diceware -d - --no-caps)
printf "\nNous vous proposons un identifiant secret et un mot de passe, basés sur Diceware. \nEcrivez-les (copier-coller) quand Silkaj vous les demandera.\nRappel : <Ctrl+Maj+C> et <Ctrl+Maj+V> pour copier-coller dans le terminal.\nSoyez sûr.e de vous en rappeler, Ğ1Cotis ne les enregistrera pas. \n\nID= $id\nMDP= $mdp\n\nEn attente de Silkaj...\n\n"
rappel=yes
$silkaj authfile > /tmp/$nom
rm -f ./authfile ; $silkaj authfile > /tmp/$nom
pubkey=$(cat /tmp/$nom | grep "Authentication file 'authfile' generated and stored in current folder for following public key:" | cut -d':' -f2 | sed 's/.\{1\}//' ) #| cut -d' ' -f2- | sed -e 's/ $monnaie//g' )
printf "recept=$pubkey\n" >> $fichier
cp ./authfile $dossier_auth/$pubkey.auth
mv ./authfile $dossier_auth/$pubkey.auth
printf "\nClef publique : $pubkey pour le compte $nom.\n\n" ; break
else
printf "Il faut écrire O ou N, pas $ouinon !"
......@@ -161,3 +161,5 @@ printf ")\n\n" >> $fichier
printf "## Liste des pourcentages\nlst_p=(\n" >> $fichier
ecriture_liste ${lst_p[@]}
printf ")\n\n" >> $fichier
printf "## Commentaire\ncomment=G1Cotis" >> $fichier
......@@ -56,13 +56,13 @@ echo -n "Connaissez-vous déjà les identifiants pour ce compte ? (o/N) : "
read ouinon
if [ "$ouinon" == "o" ] || [ "$ouinon" == "O" ] ; then
printf "\nNous allons créer le fichier d'authentification pour ce compte. Soyez sûr.e de vous rappeler des identifiants, Ğ1Cotis ne les enregistrera pas.\nEntrez les identifiants lorsque Silkaj vous le demandera.\n\nEn attente de Silkaj ...\n\n"
$silkaj authfile > /tmp/$nom
rm -f ./authfile ; $silkaj authfile > /tmp/$nom
pubkey=$(cat /tmp/$nom | grep "Authentication file 'authfile' generated and stored in current folder for following public key:" | cut -d':' -f2 | sed 's/.\{1\}//' ) #| cut -d' ' -f2- | sed -e 's/ $monnaie//g' )
printf "\nClef publique : $pubkey pour le compte $nom. Est-ce juste ? (o/N) : "
read ouinon
if [ "$ouinon" = "o" ] || [ "$ouinon" = "O" ]; then
printf "recept=$pubkey\n" >> $fichier
cp ./authfile $dossier_auth/$pubkey.auth
mv ./authfile $dossier_auth/$pubkey.auth
printf "Parfait, continuons\n\n" ; break
elif [ "$ouinon" = "n" ] || [ "$ouinon" = "N" ] || [ "$ouinon" = "" ]; then
printf "\nRecommençons."
......@@ -74,10 +74,10 @@ read ouinon
mdp=$(diceware -d - --no-caps)
printf "\nNous vous proposons un identifiant secret et un mot de passe, basés sur Diceware. \nEcrivez-les (copier-coller) quand Silkaj vous les demandera.\nRappel : <Ctrl+Maj+C> et <Ctrl+Maj+V> pour copier-coller dans le terminal.\nSoyez sûr.e de vous en rappeler, Ğ1Cotis ne les enregistrera pas. \n\nID= $id\nMDP= $mdp\n\nEn attente de Silkaj ... \n\n"
rappel=yes
$silkaj authfile > /tmp/$nom
rm -f ./authfile ; $silkaj authfile > /tmp/$nom
pubkey=$(cat /tmp/$nom | grep "Authentication file 'authfile' generated and stored in current folder for following public key:" | cut -d':' -f2 | sed 's/.\{1\}//' ) #| cut -d' ' -f2- | sed -e 's/ $monnaie//g' )
printf "recept=$pubkey\n" >> $fichier
cp ./authfile $dossier_auth/$pubkey.auth
mv ./authfile $dossier_auth/$pubkey.auth
printf "\nClef publique : $pubkey pour le compte $nom.\n\n" ; break
else
printf "Il faut écrire O ou N, pas $ouinon !"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment