From 1bdad857db29b7549acb4a1e175bb0173d6dc8f2 Mon Sep 17 00:00:00 2001 From: qo-op Date: Thu, 12 Dec 2019 20:07:53 +0100 Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20des=20./tools=20"scripts=20?= =?UTF-8?q?utilitaires"=20Ici=20pour=20g=C3=A9rer:=20-=20Un=20clavier=20pa?= =?UTF-8?q?v=C3=A9=20num=C3=A9rique=20(4=20lignes/3=20colonnes)=20Soudures?= =?UTF-8?q?!=20https://pad.p2p.legal/s/G1Tx#CLAVIER=20Mod=C3=A8le:=20https?= =?UTF-8?q?://shop.pimoroni.com/products/keypad-12-button-1=20-=20Affichag?= =?UTF-8?q?e=204=20LETTRES=20https://www.kubii.fr/cartes-extension-cameras?= =?UTF-8?q?-raspberry-pi/1871-four-letter-phat-kubii-3272496007253.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Utilisé par shell/tag_READ_X.sh pour réaliser un trasfert partiel entre G1Tag --- _chain | 2 +- _comments | 2 + _nanodate | 2 +- _publishkey.gpg | Bin 1288 -> 1288 bytes shell/init_keys.sh | 5 +- shell/sms_G1TAG.sh | 4 + shell/tag_OP.sh | 4 +- shell/tag_READ_X.sh | 261 ++++++++++++++++++ shell/tools/4LETTER.clear.py | 3 + shell/tools/4LETTER.clock.py | 20 ++ shell/tools/4LETTER.scroll.py | 20 ++ shell/tools/4LETTER.spinner.py | 15 + shell/tools/G1_TUX_keygen.py | 64 +++++ shell/tools/G1_TUX_natools.py | 85 ++++++ .../G1_gen_pubkey.py} | 0 .../G1_request_cesium_profile.py} | 0 .../G1_send_transaction.py} | 0 shell/tools/matrixKeypad.py | 41 +++ shell/tools/matrixKeypad_RPi_GPIO.py | 102 +++++++ shell/tools/matrixKeypad_RPi_GPIO.pyc | Bin 0 -> 2215 bytes 20 files changed, 624 insertions(+), 6 deletions(-) create mode 100755 shell/tag_READ_X.sh create mode 100755 shell/tools/4LETTER.clear.py create mode 100755 shell/tools/4LETTER.clock.py create mode 100755 shell/tools/4LETTER.scroll.py create mode 100755 shell/tools/4LETTER.spinner.py create mode 100644 shell/tools/G1_TUX_keygen.py create mode 100644 shell/tools/G1_TUX_natools.py rename shell/{g1_gen_pubkey.py => tools/G1_gen_pubkey.py} (100%) rename shell/{request_cesium_profile.py => tools/G1_request_cesium_profile.py} (100%) rename shell/{g1_send_transaction.py => tools/G1_send_transaction.py} (100%) create mode 100755 shell/tools/matrixKeypad.py create mode 100755 shell/tools/matrixKeypad_RPi_GPIO.py create mode 100644 shell/tools/matrixKeypad_RPi_GPIO.pyc diff --git a/_chain b/_chain index f43502e..85768c8 100755 --- a/_chain +++ b/_chain @@ -1 +1 @@ -Qma8qnxgJ8rtCoo6grgzYb9d346pAFjm7vcvxpXVwAFYo7 +QmYS8rkJee27cXLy6fbZAoweBFHNUkfTZ4V3YrWfNtWFwA diff --git a/_comments b/_comments index 7fd7e36..fad95b3 100755 --- a/_comments +++ b/_comments @@ -164,3 +164,5 @@ OK 2019-11-27: sms 2019-12-10: 2019-12-10: +2019-12-10: fourletterphat +2019-12-11: diff --git a/_nanodate b/_nanodate index 46c44af..b7d14df 100755 --- a/_nanodate +++ b/_nanodate @@ -1 +1 @@ -1575941136113508325 +1576059397859243783 diff --git a/_publishkey.gpg b/_publishkey.gpg index 30b97906b0fdd7148cfbfc6807e58aafd7f81398..817c0b5bcb7ab64a257378f6bc8d119d5f38654d 100755 GIT binary patch literal 1288 zcmV+j1^4=l4Fm}T0+8zjZjn88o50fQ0s0`hpZ&eD`#G~P4&C53L<^bK!aIim(dnB< z31lJT_m9{&(4v-+n7)|7bH*2)CFGErIQ#nTiXC%7H&lmhCs^cbj`-kwk?d*hn0B8l zI|l>y9*{8ynyuCDFEE{NEK)CdAbrn(G()uxml$tY4A&l zRLuLuK2j&Z>&+mI^01>Y7auWcQO#Xx#drd^#J_pm3~dc$hjq(n|% zMo9-bUZ=41I@Kt)ka*aV!Mi~#g*U-yDl!ujk8BOw)HEQ)Bs;)l&F#%)>k|S7Yy~|_ z2{f$Si;vIM7ijh{M}E`>RWCFSWlqKt1nfF|5Zw2h#l?9?Z<8mD!!?WrjLZjpKWL^K zHt8BRyR3sEjQS?wP>B3hu3i!qoPTYtl$u2;DD?;h5n=g(92V>8%KsHZ=6X9qk~qv` z$X40p8D`NGX5SJNQ9z^HqwGnAtgh6zA->MQ;FD@vB zt5yUh3(U==VRj|)IOW?~+jWnb5iz(J3}{yM4b7t2|5i`gy^@a`Xc~%4c)PWldtTab z2`kiW|F*TqE8FBP3dae2E|J={Xy~NtLc@x3UxKx3i$jR+q?}rh+rNbDY~wTa%PPkk zZX;L}q@T&cV>G8Mj%;Ma3?D+pZ1^2UbJPp~YBv>-Ue{z~;A^Z_h2;L%HN;7d=?pQo zXCLUjdI=C;?|vlRhg?mXp(hd#8XvtM%shL5CC{LWkzV>+lL8;t28 zmm(RoPPqc-%vdCIkc^cG_0UypHl~Hep|zZ7%%S$2s}+_j(;e9#9kgVxO2QUg1WU9)YGDB?D3 z%zlmoLmE3Ila3v|q`p`!10?}giy_S%mmYrOz-hx&SDs|dnX&j+JAs7lerAEETUm!shn7#Os$s`V=I+$0)U5%X0>t!~bI=G% zU0nPOD3@cEz%|vi$E6VZVb{-qL2_g+3J%87)BHhXGk(unnN~_d2&vRZ; zFdL$TuP7MtpE#&Yp+}dpKcZUOYjUZWFRnD#O0#)zUJ4*1sHapBjAuQ`MnyxAxjd%t z^#)dvDoV4>4uF*XFt416w=_@e8EiXo)&BLtKqxE%W#@=U`#AHxw52C y3C*2au`4UN#H*j-SBw{%Xd)XV7+#(!js%yBCB^c)<$|6<*r?}Z&)wzC$$Wv0*>ouY literal 1288 zcmV+j1^4=l4Fm}T0`iCzDqG`c%kNiC+r+n2$qVyDtv~T4(DDA6fc*Byx zYZ}v=C^{?{gNe05U0g-33JnJI??$95`1ttBWrr&=`nRx<7aCbc<1xx9{!9foGG61% zW-0r4hQZ%CECsF#efOcIE?~ydc%jIaW2jjpU{Co2o=rtlbV5wII3hJU$E+ zr}2E~C@{KFWfpms#eG#Lcp~vti%X5n3igOSJ&3qvmCM@(39*Yzy!PZX<}*{^Ehg%M zjcP7DcuvGkEDi(_s^EH}tJEs~8QEehq`}K_p4)+RsH=iev8N8_t9x<8(BY0;O%e@_ zEQ3YT;r7$YF?11gEUR zNtO$qOXuvME{HaTEG|)Vs)2F+Y{xsrFtu+1?^W1k>3CAr&v^7h5?6QH3a}CxJ=4sM zQjRv-W~W<85kR%M+C3=s5MVcSC#M`ntJ_RyTcqMK9SYPN`5M9QjIFhe!{Gr@k#7)2 zO-k^D6{wLUvmmlDq?#bQ$5ufgYl;!CgN#I7%g{S@9e>b-m{=fP^#$di7=v~i8d-kV!S%HDHWlUxRmaX=AvDZ) zahaOH!&_aLTFMFkS=`)mt%Vi*{IOpFqw@Z)u)Xh-^&D*+p``Ek4mR#kxrvUJnQ0X- za4p+hy-7pY*FjysK{w0tr$}Z&;6o09xoE8Qkqf zh_=OX`gS-@e-nDCczru*nwuF}imFJ0wm2KePIi#{l7a@qT04H9pMgsjM`h`NJOGsA zBxHnjl{F%E>FMiDmq2Hx1!gL*r6(Jcr^jQsLNhnUHj1Si6PSm{Xo9X@+n5w_L-Eow zoozKBu`gQDm{N|sCkJ(m@@KU#MXvu~oDKB3&Y9Dwn(CnIDCo5)4O(^OR00NMXC5wX zI)1QU9(Kr`z%?eJbFo!Qe7Q;ppnQ0NWQ8aCdchcLgV+LOQ*lX-Ju+{gA1N?q>ur&$ zihPa(zwFBYzyy5#E__u22_MV)7>5t z(5vMwrzR@l>Tg_eDzePn?-qWf#C(0%656MY65(&$%e z=C8jhG|;AQX-t+p%+c1uQB4uQWj$o9vs0XsZ8M6YhzBADi=+dnBx_Ojc~vAw#_i@) ys$YQ;a_rlE-Dz43V9&xs*!JPLJBRe|ZJmxVb1nAeVr@zCsus*oWK3-B)xS5^fN5(0 diff --git a/shell/init_keys.sh b/shell/init_keys.sh index 55d0735..296e17d 100755 --- a/shell/init_keys.sh +++ b/shell/init_keys.sh @@ -53,8 +53,6 @@ if [[ -f ./wallets/.$IPFSNODEID/$IPFSNODEID.nanodate ]]; then fi fi -echo $NANODATE > ./wallets/.$IPFSNODEID/$IPFSNODEID.nanodate - ################################################################# # CREATE NODE .$IPFSNODEID SPACE (G1Wallet + TASK + NODE DETAILS) ################################################################# @@ -62,6 +60,7 @@ echo $NANODATE > ./wallets/.$IPFSNODEID/$IPFSNODEID.nanodate if [[ ! -f "./wallets/.$IPFSNODEID/$IPFSNODEID.pub" ]]; then mkdir -p ./wallets/.$IPFSNODEID/TASK NODEG1WALLET=$(./silkaj/silkaj generate_auth_file --auth-scrypt -salt="$IPFSNODEID" -password="$GPGPASS") + if [[ ! $NODEG1WALLET ]]; then echo "PROBLEME CREATION DU WALLET G1 DE $IPFSNODEID"; exit; fi echo "${GPGPASS}" | gpg -q --output "./wallets/.$IPFSNODEID/$IPFSNODEID.authfile.GPGPASS.gpg" --yes --pinentry-mode loopback --symmetric --passphrase-fd 0 "./authfile" ./shell/natools.py encrypt -p $NODEG1WALLET -i "./authfile" -o "./wallets/.$IPFSNODEID/$IPFSNODEID.authfile.crypt" rm -f ./authfile @@ -101,6 +100,8 @@ if [[ ! -f "./wallets/.$IPFSNODEID/$IPFSNODEID.pub" ]]; then gammu-smsd-inject -l TEXT "$ADMINPHONE" -text "$NODEG1WALLET" 1>&2 fi +echo $NANODATE > ./wallets/.$IPFSNODEID/$IPFSNODEID.nanodate + ################################################################ #INFORM ABOUT NODE CAPACITIES export NODEPUB=$(cat "./wallets/.$IPFSNODEID/$IPFSNODEID.pub") diff --git a/shell/sms_G1TAG.sh b/shell/sms_G1TAG.sh index 5aa00d8..bfb5345 100755 --- a/shell/sms_G1TAG.sh +++ b/shell/sms_G1TAG.sh @@ -10,6 +10,8 @@ # BJ: WRITE G1Tag # WRITE ACCESS ONLY for B possessor and NODE G1Tag Creator # TODO: MAKE http API for G1Tag accessible through local ipfs gateway !!!! +# https://github.com/typicode/lowdb USE json and ipfs DAG??! +# # TAG 250 => Imprime un G1Tag rempli de 250 UNIT # TAG 2 100 => Imprime 100 G1Tag BON de 2 UNIT # PHONE any ./wallets/IDs @@ -220,6 +222,8 @@ TAGCHAIN="./TAG/${RR}/TAG_chain" # contains IPFS current ipfs hash # WRITE G1Tag G1 amount convert -pointsize 150 -fill black -gravity Center -draw 'text 240,-140 "'"$2"'"' "./TAG/${RR}/${RR}.png" "./TAG/${RR}/${RR}.png" + convert -pointsize 50 -fill black -gravity NorthEast -draw 'text -100,0 "'"G1"'"' "./TAG/${RR}/${RR}.png" "./TAG/${RR}/${RR}.png" + # WRITE G1Tag RR convert -pointsize 40 -fill black -gravity SouthWest -draw 'text 0,0 "'"${RR}"'"' "./TAG/${RR}/${RR}.png" "./TAG/${RR}/${RR}.png" diff --git a/shell/tag_OP.sh b/shell/tag_OP.sh index 54145ef..7d30dd4 100755 --- a/shell/tag_OP.sh +++ b/shell/tag_OP.sh @@ -156,9 +156,9 @@ fi echo "__SUB:tag_OP.sh: DONE. G1Tag balance updated: $JSOURCERR (/ipns/$JSOURCE) : $JSOURCEVALUE => $FINALSOURCE $JDESTRR (/ipns/$JSDEST) : $JDESTVALUE) => $FINALDEST" -return 1 + else echo "__SUB:tag_OP.sh: NO OPERATION DONE" - return 0 + fi ###################################################################################################### diff --git a/shell/tag_READ_X.sh b/shell/tag_READ_X.sh new file mode 100755 index 0000000..e514a7b --- /dev/null +++ b/shell/tag_READ_X.sh @@ -0,0 +1,261 @@ +#!/bin/bash +################################################################################ +# Author: Fred (support@qo-op.com) +# Version: 0.1 +# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) +########################################################################################### +########################################################################################### +# Lit les données reçues depuis un lecteur de QR Code branché en USB/SERIE (/dev/ttyACM0) +# Interpète les G1QRcodes et les G1Tag (R/W) +# Saisie du montant à transférer par pavé numérique +########################################################################################### +echo "__SUB:tag_READ_X.sh: QRCODE READER : START" +source ./shell/init.sh +source ./shell/functions.sh + +# DOUCHETTE ES TU LA? +if [ ! $G1TX ]; then echo "Branchez votre lecteur de QR code!"; exit; fi +./shell/tools/4LETTER.scroll.py "G1TX SCAN QRCODE G1 + G1TAG PRET" +./shell/timeout.sh -t 2 ./shell/tools/4LETTER.spinner.py + +# TABLEAU MEMOIRE DE SCAN +declare -a act +declare -a obj +declare -a val + +cat /dev/ttyACM0 | while read line; do + lon=${#line} + pref=$(echo $line | cut -d ":" -f 1) + qrvalue=$(echo $line | cut -d ":" -f 2) + log "__SUB:tag_READ_X.sh: SCAN /dev/ttyACM0 ($lon) :: $line" + + case $pref in + RJ) + R=$(echo $qrvalue | cut -d '#' -f 1) + J=$(echo $qrvalue | cut -d '#' -f 2) + log "__SUB:tag_READ_X.sh: Lecture G1Tag $R $J" + # + ID=$(su $YOU -c "ipfs cat /ipns/$J/TAG_id"); + if [[ "$ID" == "" ]]; then + ./shell/tools/4LETTER.scroll.py "MAUVAIS G1TAG DETRUIRE OU RAPPORTER A SON CREATEUR" + continue + fi + FID=$(echo $ID | awk '{print toupper($1)}') + RR=$(echo $ID | sed s/\ //g) + + ./shell/tools/4LETTER.scroll.py "G1TAG $FID READ" + RVALUE=$(su $YOU -c "ipfs cat /ipns/$J/TAG_amount"); + CURRENCY=$(su $YOU -c "ipfs cat /ipns/$J/TAG_currency" | awk '{print tolower($1)}') + if [[ "$CURRENCY" == "zen" ]]; then CUR="zène"; else CUR=$CURRENCY; fi # Correction du défaut de prononciation. + PASSENGER=$(su $YOU -c "ipfs cat /ipns/$J/TAG_passenger"); + if [[ "$PASSENGER" != "" ]]; then + ./shell/tools/4LETTER.scroll.py "G1TAG PASSENGER $RVALUE" + else + G1VAL=$(bc -l <<< "scale=2; $RVALUE / 100" | cut -d '.' -f 1) + log "__SUB:tag_READ_X.sh: G1Tag $FID. Valeur $RVALUE $CURRENCY = $G1VAL G1" + ./shell/tools/4LETTER.scroll.py "ZEN $RVALUE" + fi + cmd="RJ" + CASHBACK="" + val+=("$RVALUE") + ;; + + BJ) + BB=$(echo $qrvalue | cut -d '#' -f 1) + J=$(echo $qrvalue | cut -d '#' -f 2) + log "__SUB:tag_READ_X.sh: Ouverture G1Tag $BB $J" + # + ID=$(su $YOU -c "ipfs cat /ipns/$J/TAG_id"); + if [[ "$ID" == "" ]]; then + ./shell/tools/4LETTER.scroll.py "MAUVAIS G1TAG STOP" + continue + fi + FID=$(echo $ID | awk '{print toupper($1)}') + RR=$(echo $ID | sed s/\ //g) + + ./shell/tools/4LETTER.scroll.py "G1TAG $FID WRITE" + BVALUE=$(su $YOU -c "ipfs cat /ipns/$J/TAG_amount") + CURRENCY=$(su $YOU -c "ipfs cat /ipns/$J/TAG_currency" | awk '{print tolower($1)}') + if [[ "$CURRENCY" == "zen" ]]; then CUR="zène"; else CUR=$CURRENCY; fi # Correction du défaut de prononciation. + PASSENGER=$(su $YOU -c "ipfs cat /ipns/$J/TAG_passenger"); + # DIG PUBLISHING KEY + if [[ -f /home/$YOU/.ipfs/keystore/$RR ]]; then + log "__SUB:tag_READ_X.sh: Clef de publication IPFS $RR déjà présente" + else + rm /tmp/TAG_publishkey.B.gpg + su $YOU -c "ipfs get -o /tmp/ /ipns/$J/TAG_publishkey.B.gpg" + # CHECK IF OK + gpg -d --output /tmp/ipns.key --pinentry-mode=loopback --passphrase $BB /tmp/TAG_publishkey.B.gpg + if [[ ! -f /tmp/ipns.key ]]; then + ./shell/tools/4LETTER.scroll.py "ERREUR DECHIFFRAGE GPG" + continue + fi + mv /tmp/ipns.key /home/$YOU/.ipfs/keystore/$RR + log "__SUB:tag_READ_X.sh: Récupération de la clef de publication $RR" + ./shell/tools/4LETTER.scroll.py "DECHIFFRAGE CLEF" + fi + if [[ "$PASSENGER" != "" ]]; then + log "__SUB:tag_READ_X.sh: !!!! $FID REC Tag = $BVALUE $CURRENCY" + ./shell/tools/4LETTER.scroll.py "G1TAG PASSENGER $BVALUE ZEN" + else + log "__SUB:tag_READ_X.sh: Ce G1 Tag $FID contient $BVALUE $CURRENCY" + ./shell/tools/4LETTER.scroll.py "ZEN $BVALUE" + fi + cmd="BJ" + val+=("$BVALUE") + ;; + + *) + if [[ $lon -eq 44 ]]; then + ./shell/tools/4LETTER.scroll.py "PORTEFEUILLE G1" & + J=$qrvalue + if [[ "$J" != "${obj[0]}" ]]; then + VALUE=$(./shell/timeout.sh -t 25 ./silkaj/silkaj amount $J) + + if [[ "$(echo $VALUE | cut -d ':' -f 1)" != "Error" && "$VALUE" != "" ]]; then + log "__SUB:tag_READ_X.sh: Ce compte monnaie libre contient $VALUE G1" + NOPOINT=$(echo $VALUE | cut -d '.' -f 1) + ./shell/tools/4LETTER.scroll.py "CONTIENT $NOPOINT G1 *** $NOPOINT G1 " + CASHBACK="$J" + cmd="G1" + val+=("$VALUE") + else + log "__SUB:tag_READ_X.sh: ERREUR QR code illisible. longueur $J = ${#J}" + if [[ "$VALUE" == "" ]]; then + DUNITER=$(./shell/checknodes.sh 'BAN') + echo "ERREUR TIMEOUT. CHANGE SILKAJ SERVER: $DUNITER" + ./shell/tools/4LETTER.scroll.py "ERREUR TIMEOUT SILKAJ" + ./shell/timeout.sh -t 1 ./shell/tools/4LETTER.spinner.py + CASHBACK="" + else + ./shell/tools/4LETTER.scroll.py "ERREUR QRCODE INCONNU" + ./shell/timeout.sh -t 1 ./shell/tools/4LETTER.spinner.py + CASHBACK="" + fi + fi + else + ./shell/tools/4LETTER.scroll.py "OUI CONTIENT ${val[0]} G1 !!" + fi + else + ./shell/tools/4LETTER.scroll.py "ERREUR QRCODE INCONNU" + fi + + ;; + + esac + + ############################################################### + # APRES G1 CASHBACK : G1 Tag BJ WRITE => ENCAISSEMENT + if [[ "${cmd}" == "BJ" && "$CASHBACK" != "" && -f /home/$YOU/.ipfs/keystore/${RR} ]]; then + ./shell/tools/4LETTER.scroll.py "ENCAISSEMENT G1TAG" + log "__SUB:tag_READ_X.sh: G1 tag de $BVALUE G1 ! /ipns/$J Virement vers $CASHBACK? " + + ./shell/tools/4LETTER.scroll.py "VERS PORTEFEUILLE G1" + # ipfs get G1Tag vers ./TAG/${RR} + mkdir -p ./TAG/${RR}; rm -f ./TAG/${RR}/*; chown -R $YOU ./TAG/${RR}/ + log "__SUB:tag_READ_X.sh: ipfs get --output=./TAG/${RR} /ipns/$J" + su $YOU -c "ipfs get --output=./TAG/${RR} /ipns/$J" + + if [[ $(cat ./TAG/${RR}/TAG_passenger) != "" ]]; then ./shell/tools/4LETTER.scroll.py "IMPOSSIBLE TAG PASSENGER $BVALUE ZEN"; continue; fi + + # Make Silkaj TX + G1VAL=$(bc -l <<< "scale=2; $BVALUE / 100" | cut -d '.' -f 1) + log "__SUB:tag_READ_X.sh: Silkaj TX $MASTERKEYFILE ($G1VAL) -> $CASHBACK" + PAY=$(./silkaj/silkaj transaction --auth-file -file="$MASTERKEYFILE" --amount=$G1VAL --output=$CASHBACK --comment="[G1sms+] CAPTURE G1Tag $RR" -y) + + log "__SUB:tag_READ_X.sh: Silkaj output = $PAY" + if [[ "$(echo $PAY | cut -d '|' -f 1)" == "KO" ]]; then + new=$(./shell/checknodes.sh "BAN") + sms_ERROR "$ADMINPHONE" "Il est survenu un problème avec un virement. Retour silkaj: $PAY ... $new"; + ./shell/tools/4LETTER.scroll.py "ERREUR SILKAJ ERREUR" + else + # ENCAISSEMENT G1Tag + ./shell/tools/4LETTER.scroll.py "VIR ${FID} $G1VAL G1 ---) OK" + # CAPTURE / DESTRUCTION du G1 Tag + echo "0" > "./TAG/${RR}/TAG_amount" + echo "${J}" > "./TAG/${RR}/TAG_ipns" + + # Iterate + if [[ -f ./TAG/${RR}/TAG_n ]]; then NN=$(cat ./TAG/${RR}/TAG_n); ((NN++)); else NN=0; fi + + # TAG_actions + echo "$NN" > "./TAG/${RR}/TAG_n" + echo "${NANODATE}" > "./TAG/${RR}/TAG_nanodate" + echo "${IPFSNODEID}" > "./TAG/${RR}/TAG_writerid" + + # EMPTY G1TAG ID AND REMOVE PUBLISHKEYS + echo "" > "./TAG/${RR}/TAG_id" + rm -f ./TAG/TAG_publishkey.* + + log "__SUB:tag_READ_X.sh: Destruction G1Tag TAG_id $NN.${NANODATE} (par NODE ${IPFSNODEID}) => Value = 0" + I=$(su $YOU -c "ipfs add -qr ./TAG/${RR} | tail -n 1") + # TAG_chain + echo "$I" > "./TAG/${RR}/TAG_chain" + I=$(su $YOU -c "ipfs add -qr ./TAG/${RR} | tail -n 1") + # IPNS $RR PUBLISH + J=$(su $YOU -c "ipfs name publish -k ${RR} --quieter /ipfs/${I}") + + log "__SUB:tag_READ_X.sh: Destruction de ce G1 Tag publish -k ${RR} --quieter /ipfs/${I} :: ipfs ls /ipns/$J" + ./shell/tools/4LETTER.scroll.py "${FID} G1TAG VIDE MERCI DE LE DETRUIRE" + + # CLEAN IPFS keystore: remove NOT created NODE keys + SOURCENODEID=$(cat "./TAG/${RR}/TAG_nodeid") + if [[ "${SOURCENODEID}" != "${IPFSNODEID}" ]]; then + rm -f /home/$YOU/.ipfs/keystore/${RR} + fi + fi + else + # AJOUT MEMOIRE SCAN + ./shell/tools/4LETTER.scroll.py "ENSUITE" + act+=("$cmd") + obj+=("$J") + fi + + + # FLUSH MEMOIRE 2 SCAN + if [[ ${#act[@]} -eq 2 ]]; then + echo "${act[@]}" + echo "${obj[@]}" + echo "${val[@]}" + ############################################################### + # PRESENTATION RJ puis BJ différents Tag WRITE = TRANSFERT G1 TAG + if [[ "${act[0]}" == "RJ" && "${act[1]}" == "BJ" && "${obj[0]}" != "${obj[1]}" ]]; then + PASSENGER=$(su $YOU -c "ipfs cat /ipns/${obj[1]}/TAG_passenger"); + if [[ "$PASSENGER" != "" ]]; then + ./shell/tools/4LETTER.scroll.py "IMPOSSIBLE TAG PASSENGER"; + else + # READ KEYBOARD VALUE !!! + COMBIEN=$(./shell/tools/matrixKeypad.py) + if [[ $COMBIEN -le ${val[1]} ]]; then + log "__SUB:tag_READ_X.sh: Transfert de G1 Tag à G1 Tag. $COMBIEN" + ./shell/tools/4LETTER.scroll.py "G1TAG ${FID} TRANSFERT DE $COMBIEN ZEN" + log "__SUB:tag_READ_X.sh: $(./shell/tag_OP.sh ${obj[1]} ${obj[0]} $COMBIEN $MASTERKEYFILE)" + else + ./shell/tools/4LETTER.scroll.py "$COMBIEN DEPASSE ${val[1]} $CUR DU G1TAG ${FID}" + fi + fi + CASHBACK="" + fi + ############################################################### + # PRESENTATION BJ identiques TRANSFORMATION G1 TAG en REC TAG + if [[ "${act[0]}" == "BJ" && "${act[1]}" == "BJ" && "${obj[0]}" == "${obj[1]}" ]]; then + PASSENGER=$(su $YOU -c "ipfs cat /ipns/${obj[0]}/TAG_passenger"); + if [[ "$PASSENGER" != "" ]]; then + ./shell/tools/4LETTER.scroll.py "DEJA TAG PASSENGER"; + else + log "__SUB:tag_READ_X.sh: Transformation du G1 Tag en Rec Tag. ${val[0]} = ${val[1]}" + ./shell/tools/4LETTER.scroll.py "TRASNFORMATION G1TAG ${val[0]} $CUR EN PASSENGER ${FID}"; + log "__SUB:tag_READ_X.sh: $(./shell/tag_OP.sh ${obj[0]} ${obj[0]} 0 $MASTERKEYFILE)" + fi + CASHBACK="" + fi + + act=() + obj=() + val=() + ./shell/timeout.sh -t 2 ./shell/tools/4LETTER.spinner.py + fi + + ./shell/tools/4LETTER.scroll.py "FLASHER QRCODE" + +done diff --git a/shell/tools/4LETTER.clear.py b/shell/tools/4LETTER.clear.py new file mode 100755 index 0000000..059c6c6 --- /dev/null +++ b/shell/tools/4LETTER.clear.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python +import fourletterphat +fourletterphat.clear() diff --git a/shell/tools/4LETTER.clock.py b/shell/tools/4LETTER.clock.py new file mode 100755 index 0000000..138cd59 --- /dev/null +++ b/shell/tools/4LETTER.clock.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import time +import fourletterphat + +while True: + fourletterphat.clear() + + str_time = time.strftime("%H%M") + + # Display the time + fourletterphat.print_number_str(str_time) + + # Blink the middle decimal point + # int(time.time() % 2) will alternate 1 0 1 0 + # which we can use to directly set the point + fourletterphat.set_decimal(1, int(time.time() % 2)) + + fourletterphat.show() + time.sleep(0.1) diff --git a/shell/tools/4LETTER.scroll.py b/shell/tools/4LETTER.scroll.py new file mode 100755 index 0000000..c77897f --- /dev/null +++ b/shell/tools/4LETTER.scroll.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +import sys +import fourletterphat + +# if bad number of arguments... +if len(sys.argv) != 2: + + # display command usage + print(""" + Usage: + python 4LETTER.scroll.py "message a afficher" + """) + + # exit with status code error + exit(1) + +# Get message from arguments +message = sys.argv[1] +fourletterphat.scroll_print( message ) + diff --git a/shell/tools/4LETTER.spinner.py b/shell/tools/4LETTER.spinner.py new file mode 100755 index 0000000..2e4ca45 --- /dev/null +++ b/shell/tools/4LETTER.spinner.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +import time +import fourletterphat as flp + +spinner = ["|", "/", "-", "\\"] + +while True: + for i in range(4): + for s in spinner: + s = s * 4 + flp.clear() + flp.print_str(s) + flp.show() + time.sleep(0.1) diff --git a/shell/tools/G1_TUX_keygen.py b/shell/tools/G1_TUX_keygen.py new file mode 100644 index 0000000..395d75f --- /dev/null +++ b/shell/tools/G1_TUX_keygen.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +""" + CopyLeft 2019 Pascal Engélibert + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +""" + +import sys +from duniterpy.key import SigningKey + +def getargv(arg, default=""): + if arg in sys.argv and len(sys.argv) > sys.argv.index(arg)+1: + return sys.argv[sys.argv.index(arg)+1] + else: + return default + +if __name__ == "__main__": + + if "--help" in sys.argv or not "-i" in sys.argv or not "-o" in sys.argv: + print("""Duniter MiniTools: Mass Keygen +CopyLeft 2019 Pascal Engélibert + +Usage: +python3 keygen.py -i -o +Format: CSV ; Separator: tab +""") + exit() + + infile = open(getargv("-i"), "r") + outfile = open(getargv("-o"), "w") + + i = 0 + while True: + line = infile.readline() + if line == "": + break + i += 1 + if "\n" in line: + line = line[:len(line)-1] + + cols = line.split("\t") + while "" in cols: + cols.remove("") + if len(cols) < 2: + print("Error (line "+str(i)+"): less than 2 columns! (at least 2 expected)") + break + + key = SigningKey.from_credentials(cols[0], cols[1]) + outfile.write(cols[0]+"\t"+cols[1]+"\t"+key.pubkey+"\n") + + infile.close() + outfile.close() diff --git a/shell/tools/G1_TUX_natools.py b/shell/tools/G1_TUX_natools.py new file mode 100644 index 0000000..5149743 --- /dev/null +++ b/shell/tools/G1_TUX_natools.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +import os, sys, duniterpy.key, libnacl.sign + +def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str: + if arg in args and len(args) > args.index(arg)+n: + return args[args.index(arg)+n] + else: + return default + +def read_data(data_path, b=True): + if data_path == "-": + if b: + return sys.stdin.read().encode() + else: + return sys.stdin.read() + else: + if b: + return open(os.path.expanduser(data_path), "rb").read() + else: + return open(os.path.expanduser(data_path), "r").read() + +def write_data(data, result_path): + (sys.stdout if result_path == "-" else open(os.path.expanduser(result_path), "wb")).write(data) + +def encrypt(data, pubkey): + return duniterpy.key.PublicKey(pubkey).encrypt_seal(data) + +def decrypt(data, privkey): + return duniterpy.key.SigningKey.from_seedhex(privkey).decrypt_seal(data) + +def sign(data, privkey): + return duniterpy.key.SigningKey.from_seedhex(privkey).sign(data) + +def verify(data, pubkey): + try: + return libnacl.sign.Verifier(duniterpy.key.PublicKey(pubkey).hex_pk()).verify(data) + except ValueError: + exit(1) + +def show_help(): + print("""Usage: +python3 natools.py [options] + +Commands: + encrypt Encrypt data + decrypt Decrypt data + sign Sign data + verify Verify data + +Options: + -i Input file path (default: -) + -k Privkey file path (default: authfile.key) + -p Pubkey (base58) + -o Output file path (default: -) + +Note: "-" means stdin or stdout. +""") + +if __name__ == "__main__": + + if "--help" in sys.argv: + show_help() + exit() + + data_path = getargv("-i", "-") + privkey_path = getargv("-k", "authfile.key") + pubkey = getargv("-p") + result_path = getargv("-o", "-") + + try: + if sys.argv[1] == "encrypt": + write_data(encrypt(read_data(data_path), pubkey), result_path) + elif sys.argv[1] == "decrypt": + write_data(decrypt(read_data(data_path), read_data(privkey_path, False)), result_path) + elif sys.argv[1] == "sign": + write_data(sign(read_data(data_path), read_data(privkey_path, False)), result_path) + elif sys.argv[1] == "verify": + write_data(verify(read_data(data_path), pubkey), result_path) + else: + show_help() + except Exception as e: + sys.stderr.write("Error: ", e, "\n") + show_help() + exit(1) diff --git a/shell/g1_gen_pubkey.py b/shell/tools/G1_gen_pubkey.py similarity index 100% rename from shell/g1_gen_pubkey.py rename to shell/tools/G1_gen_pubkey.py diff --git a/shell/request_cesium_profile.py b/shell/tools/G1_request_cesium_profile.py similarity index 100% rename from shell/request_cesium_profile.py rename to shell/tools/G1_request_cesium_profile.py diff --git a/shell/g1_send_transaction.py b/shell/tools/G1_send_transaction.py similarity index 100% rename from shell/g1_send_transaction.py rename to shell/tools/G1_send_transaction.py diff --git a/shell/tools/matrixKeypad.py b/shell/tools/matrixKeypad.py new file mode 100755 index 0000000..492de43 --- /dev/null +++ b/shell/tools/matrixKeypad.py @@ -0,0 +1,41 @@ +#! /usr/bin/python +import fourletterphat +from matrixKeypad_RPi_GPIO import keypad +from time import sleep + +# Initialize the keypad class +kp = keypad() + +fourletterphat.print_str("ZEN?") +fourletterphat.show() + +def digit(): + # Loop while waiting for a keypress + r = None + while r == None: + r = kp.getKey() + return r + +#print ("Please enter a 4 digit code: ") + +# Getting digit 1, printing it, then sleep to allow the next digit press. +d1 = digit() +#print (d1) +sleep(0.25) + +d2 = digit() +#print (d2) +sleep(0.25) + +d3 = digit() +#print (d3) +sleep(0.25) + +d4 = digit() +#print (d4) + +# printing out the assembled 4 digit code. +print "%s%s%s%s"%(d1,d2,d3,d4) +fourletterphat.clear() +fourletterphat.scroll_print("OK %s%s%s%s"%(d1,d2,d3,d4)) +sleep(2) diff --git a/shell/tools/matrixKeypad_RPi_GPIO.py b/shell/tools/matrixKeypad_RPi_GPIO.py new file mode 100755 index 0000000..c162fcc --- /dev/null +++ b/shell/tools/matrixKeypad_RPi_GPIO.py @@ -0,0 +1,102 @@ +# ##################################################### +# Python Library for 3x4 matrix keypad using +# 7 of the avialable GPIO pins on the Raspberry Pi. +# +# This could easily be expanded to handle a 4x4 but I +# don't have one for testing. The KEYPAD constant +# would need to be updated. Also the setting/checking +# of the colVal part would need to be expanded to +# handle the extra column. +# +# Written by Chris Crumpacker +# May 2013 +# +# main structure is adapted from Bandono's +# matrixQPI which is wiringPi based. +# https://github.com/bandono/matrixQPi?source=cc +# ##################################################### + +import RPi.GPIO as GPIO + +class keypad(): + # CONSTANTS + KEYPAD = [ + [1,2,3], + [4,5,6], + [7,8,9], + ["*",0,"#"] + ] + + ROW = [18,23,24,25] + COLUMN = [5,6,13] + + def __init__(self): + GPIO.setmode(GPIO.BCM) + + def getKey(self): + + # Set all columns as output low + for j in range(len(self.COLUMN)): + GPIO.setup(self.COLUMN[j], GPIO.OUT) + GPIO.output(self.COLUMN[j], GPIO.LOW) + + # Set all rows as input + for i in range(len(self.ROW)): + GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP) + + # Scan rows for pushed key/button + # A valid key press should set "rowVal" between 0 and 3. + rowVal = -1 + for i in range(len(self.ROW)): + tmpRead = GPIO.input(self.ROW[i]) + if tmpRead == 0: + rowVal = i + + # if rowVal is not 0 thru 3 then no button was pressed and we can exit + if rowVal <0 or rowVal >3: + self.exit() + return + + # Convert columns to input + for j in range(len(self.COLUMN)): + GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + + # Switch the i-th row found from scan to output + GPIO.setup(self.ROW[rowVal], GPIO.OUT) + GPIO.output(self.ROW[rowVal], GPIO.HIGH) + + # Scan columns for still-pushed key/button + # A valid key press should set "colVal" between 0 and 2. + colVal = -1 + for j in range(len(self.COLUMN)): + tmpRead = GPIO.input(self.COLUMN[j]) + if tmpRead == 1: + colVal=j + + # if colVal is not 0 thru 2 then no button was pressed and we can exit + if colVal <0 or colVal >2: + self.exit() + return + + # Return the value of the key pressed + self.exit() + return self.KEYPAD[rowVal][colVal] + + def exit(self): + # Reinitialize all rows and columns as input at exit + for i in range(len(self.ROW)): + GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP) + for j in range(len(self.COLUMN)): + GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP) + +if __name__ == '__main__': + # Initialize the keypad class + kp = keypad() + + # Loop while waiting for a keypress + digit = None + while digit == None: + digit = kp.getKey() + + # Print the result + print digit diff --git a/shell/tools/matrixKeypad_RPi_GPIO.pyc b/shell/tools/matrixKeypad_RPi_GPIO.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d3fee136dfab590afe9fe37c97b3938c434ac4d GIT binary patch literal 2215 zcmb_cU2hvz5S_bguM@|P)1)m;6e=MqVL+-C3Gsjs3Qdp`HMPyA#)?t3va(CE&iZrL zs*9Yb^28(mpueI23m$kyf^%k*xD9y$#oBv3JNNF)nYlA#|5?l*{PxF-W4ZX*_}|8g zPXRt2BaukgNZW{SiJukUmS03(iyXBr32gB*a%Rccm%yU7o#8iaN2Z$+IFz~jqXZf0 z=JbFgqitznue#S)2Zv<`&ceU(t0ffAf>*w??qT^Z+=qr> z5tynlL&y>|h8(2@!XhBy;m<-qDt;WULJU73JRqzSihyID33s0CJkxV}A`YUT%20|z`~{@S>7W->hGC_;75C!L zEAeR%MU`YQh~i4GlZ?aZQ@sMuZG;{@JRZJE7?$US{V?&ok08h7Dn_X@crK-W4;$0( z$sP%qU9v|2yDz?yb0eVG&0K8EjI8rLE3Yjvl$>ijC>rdH?n`UB{f^BAW<+g%D(BWa zHWy@Or8aT@sk1yx7&Gch3l(#2%XIHXLtB@ImXtzj2rkY+7PVn(CBLP4*ciR#)0%1h zogo`yD5DuNGF~eKIz8sF~f#By2j+T&ftP!Eg;FMsGn+LB3c=ms5M)yIPf>f7i;dPOqOp^qTNUjoG5 zG#ln2@RN*VHqCugFh%=;$(syy_J-N`mp-3%F4J<=xxeD&zt$?sAgv=Ot<~#|ivGR1 zQFB*~dfmhk8kM7tS5SPeSeK*r7838? zg`Fl=Ofq62u}HNtyO@prPA~AhgbY0o!*~+m)#bQP36q@59&kS-(B7PvO81L_BvtT^HQgbLe&`Zk2&PighDIsL+&yCXG1Oj+Mpk3 kpZMWPm?-_*Vy+avPP6sR8eGQ9fReRVEr7XWN@m6W2Mhm(Jpcdz literal 0 HcmV?d00001