Merge branch 'master' of http://192.168.9.19:3000/axiom-team/astroport
This commit is contained in:
commit
bfc50642fa
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
MOTS=$(echo "$1" | grep -E "^\-?[0-9]+$")
|
||||||
|
# Default to 6 words passphrase
|
||||||
|
if [[ "$MOTS" == "" ]]; then MOTS=6; fi
|
||||||
|
WORDCOUNT=${1-$MOTS}
|
||||||
|
# Download the wordlist
|
||||||
|
# wget -nc -O ~/.diceware-wordlist http://world.std.com/%7Ereinhold/diceware.wordlist.asc 2> /dev/null
|
||||||
|
# print a list of the diceware words
|
||||||
|
cat ./diceware-wordlist.txt |
|
||||||
|
awk '/[1-6][1-6][1-6][1-6][1-6]/{ print $2 }' |
|
||||||
|
# randomize the list order
|
||||||
|
shuf --random-source=/dev/urandom |
|
||||||
|
# pick the first n words
|
||||||
|
head -n ${WORDCOUNT} |
|
||||||
|
# pretty print
|
||||||
|
tr '\n' ' '
|
||||||
|
echo
|
|
@ -0,0 +1,106 @@
|
||||||
|
#!/bin/bash
|
||||||
|
################################################################################
|
||||||
|
# Authors: @jytou (https://git.duniter.org/jytou)
|
||||||
|
# Modified by Fred (support@qo-op.com)
|
||||||
|
# Version: 0.1
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
################################################################################
|
||||||
|
# Checks the current block number of /tmp/zen/duniter_nodes.txt (is run in parallel)
|
||||||
|
# and output random (from last synchronized) node
|
||||||
|
|
||||||
|
checkonenode()
|
||||||
|
{
|
||||||
|
# Timeout in seconds for https nodes
|
||||||
|
httpsTimeout=1
|
||||||
|
# Timeout in seconds for http nodes
|
||||||
|
httpTimeout=1
|
||||||
|
|
||||||
|
node=$1
|
||||||
|
watched=$2
|
||||||
|
outfile=$3
|
||||||
|
# Curl: -m timeout, -k ignore SSL certificate errors
|
||||||
|
cur=`echo "$( { curl -m $httpsTimeout -k https://$node/blockchain/current; } 2>&1 )"`
|
||||||
|
n=$node
|
||||||
|
if [[ "$cur" != *issuersFrameVar* ]]
|
||||||
|
then
|
||||||
|
# It failed in https, maybe try http?
|
||||||
|
cur=`echo "$( { curl -m $httpTimeout http://$node/blockchain/current; } 2>&1 )"`
|
||||||
|
if [[ "$cur" == *issuersFrameVar* ]]
|
||||||
|
then
|
||||||
|
# Indicate that the node is http
|
||||||
|
n="$n-(http)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ "$cur" != *issuersFrameVar* ]]
|
||||||
|
then
|
||||||
|
# The node didn't respond on time
|
||||||
|
cur="ERROR"
|
||||||
|
else
|
||||||
|
# The node did respond - grab the block number and hash of the block as key
|
||||||
|
cur="`echo "$cur"|grep '^ "number": '|awk '{print $2}'|awk -F, '{print $1}'`-`echo "$cur"|grep '^ "hash": '|awk '{print $2}'|awk '{print substr($1,2,13)}'`"
|
||||||
|
fi
|
||||||
|
if [[ $watched =~ .*#$node#.* ]]
|
||||||
|
then
|
||||||
|
# The node is a watched node, add some bold
|
||||||
|
n="\e[1m$n\e[0m"
|
||||||
|
fi
|
||||||
|
# Put the result into the file
|
||||||
|
echo "$cur $n">$outfile
|
||||||
|
# Notify that we're done here
|
||||||
|
touch $outfile.done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Temp dir where results are stored
|
||||||
|
DIR=/tmp/zen/gnodewatch
|
||||||
|
export DIR
|
||||||
|
mkdir -p $DIR/chains
|
||||||
|
|
||||||
|
### /tmp/zen/duniter_nodes.txt REFRESH
|
||||||
|
find /tmp/zen/ -cmin +20 -type f -name "duniter_*" -exec rm -f '{}' \;
|
||||||
|
if [[ ! -f /tmp/zen/duniter_nodes.txt ]]; then
|
||||||
|
[[ -f /tmp/zen/good.nodes.txt ]] && DUNITER=$(head -n1 /tmp/zen/good.nodes.txt) || DUNITER="g1.duniter.org:443"
|
||||||
|
# echo "___ REFRESH /tmp/zen/duniter_nodes.txt from $DUNITER ___"
|
||||||
|
curl -s https://$DUNITER/network/peers | jq '.peers[] | .endpoints' | grep BMAS | awk '{print $2,$3}' | sed s/\"//g | sed s/\,//g | sed s/\ /:/g > /tmp/zen/duniter_nodes.txt
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Grab the nodes we are actively watching - they will be in bold in the final output
|
||||||
|
watched=`grep -v "#" /tmp/zen/duniter_nodes.txt|egrep "\!$"|awk '{print "#" $1 "#"}'`
|
||||||
|
# All nodes we are watching
|
||||||
|
nodes=`grep -v "#" /tmp/zen/duniter_nodes.txt|awk '{print $1}'`
|
||||||
|
# The index to generate separate file names
|
||||||
|
index=0
|
||||||
|
# Wipe out the output directory
|
||||||
|
rm $DIR/*out $DIR/*done $DIR/chains/* $DIR/NODE.* 2>/dev/null
|
||||||
|
|
||||||
|
# Query all nodes in parallel
|
||||||
|
for node in $nodes
|
||||||
|
do
|
||||||
|
checkonenode $node "$watched" $DIR/$index.out &
|
||||||
|
((index++))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wait a little for the first files to be created
|
||||||
|
sleep 1s
|
||||||
|
# Wait for all the threads to report they are done
|
||||||
|
while [ `ls $DIR/*done|wc -l` -lt $index ]
|
||||||
|
do
|
||||||
|
sleep 1s
|
||||||
|
done
|
||||||
|
|
||||||
|
# Grab all results
|
||||||
|
curs=`cat $DIR/*out|sort`
|
||||||
|
# Extract all forks, excluding all errors
|
||||||
|
chains="`echo "$curs"|grep -v ERROR|awk '{print $1}'|sort -r|uniq`"
|
||||||
|
|
||||||
|
# Count the number of chains and output most recent consensus to "good.nodes.txt"
|
||||||
|
nb=0
|
||||||
|
for chain in $chains
|
||||||
|
do
|
||||||
|
echo "$curs" | egrep "^$chain " | awk '{print $2}' >> $DIR/chains/$nb;
|
||||||
|
((nb++))
|
||||||
|
done
|
||||||
|
|
||||||
|
longchain=$(ls -S $DIR/chains/ | head -n 1)
|
||||||
|
cp $DIR/chains/$longchain /tmp/zen/good.nodes.txt
|
||||||
|
# WRITE OUT shuffle Duniter Node Sync with longest chain
|
||||||
|
echo $(shuf -n 1 /tmp/zen/good.nodes.txt)
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/bin/bash
|
||||||
|
################################################################################
|
||||||
|
# Author: Fred (support@qo-op.com)
|
||||||
|
# Version: 1.0
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
###########################################################################################
|
||||||
|
# This script convert secret.dunikey into ~/.ssb/secret.ssb
|
||||||
|
DUNKEYFILE="$1"
|
||||||
|
[[ ! ${DUNIKEYFILE} ]] && DUNKEYFILE="./secret.dunikey"
|
||||||
|
[[ ! ${DUNIKEYFILE} ]] && DUNKEYFILE="~/.ssb/secret.dunikey"
|
||||||
|
[[ ! -f ${DUNIKEYFILE} ]] && exit
|
||||||
|
|
||||||
|
pub=$(cat ${DUNIKEYFILE} | grep "pub" | cut -d ' ' -f 2)
|
||||||
|
priv=$(cat ${DUNIKEYFILE} | grep "sec" | cut -d ' ' -f 2)
|
||||||
|
ssbpub=$(echo $pub | base58 -d | base64)
|
||||||
|
ssbpriv=$(echo $priv | base58 -d | base64)
|
||||||
|
|
||||||
|
cat > ~/.ssb/secret.ssb <<EOF
|
||||||
|
# This secret generated by duniter2secret.sh
|
||||||
|
# G1 Wallet ACCOUNT BALANCE:
|
||||||
|
# silkaj balance $pub
|
||||||
|
#
|
||||||
|
# THIS KEY IS YOURS!
|
||||||
|
# NEVER show this to anyone!!!
|
||||||
|
|
||||||
|
{
|
||||||
|
"curve": "ed25519",
|
||||||
|
"public": "$ssbpub.ed25519",
|
||||||
|
"private": "$ssbpriv.ed25519",
|
||||||
|
"id": "@$ssbpub.ed25519"
|
||||||
|
}
|
||||||
|
|
||||||
|
# WARNING! It's vital that you DO NOT edit OR share your secret name
|
||||||
|
# instead, share your public name
|
||||||
|
# your public name: @$ssbpub.ed25519
|
||||||
|
EOF
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/bash
|
||||||
|
################################################################################
|
||||||
|
# Author: Fred (support@qo-op.com)
|
||||||
|
# Version: 1.0
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
###########################################################################################
|
||||||
|
# ipfs_TASK.sh SYNC SWARM PEERS AND RUN TASKS
|
||||||
|
me=`basename "$0"`
|
||||||
|
IPFSNODEID=$(ipfs id -f='<id>\n')
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
### IPFS ADD ~/.zen/wallets
|
||||||
|
IWALLETS=$(ipfs add -rHq '~/.zen/wallets' | tail -n 1)
|
||||||
|
|
||||||
|
# CHAIN STATE FOR $IPFSNODEID
|
||||||
|
if [[ -f ~/.zen/wallets/.$IPFSNODEID.chain ]]; then
|
||||||
|
cat ~/.zen/wallets/.$IPFSNODEID.chain > ~/.zen/wallets/.$IPFSNODEID.chain.prev
|
||||||
|
INC=$(cat ~/.zen/wallets/.$IPFSNODEID.n)
|
||||||
|
((INC++))
|
||||||
|
echo $INC > ~/.zen/wallets/.$IPFSNODEID.n
|
||||||
|
else
|
||||||
|
echo "" > ~/.zen/wallets/.$IPFSNODEID.chain.prev
|
||||||
|
echo "0" > ~/.zen/wallets/.$IPFSNODEID.n
|
||||||
|
fi
|
||||||
|
### IPFS ADD ~/.zen/wallets
|
||||||
|
echo $IWALLETS > ~/.zen/wallets/.$IPFSNODEID.chain
|
||||||
|
|
||||||
|
IWALLETS=$(ipfs add -rHq '~/.zen/wallets' | tail -n 1)
|
||||||
|
# PUBLISH IPNS NODE WALLETS
|
||||||
|
NODEWALLETS=$(ipfs name publish --quieter /ipfs/$IWALLETS)
|
||||||
|
echo $IWALLETS
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/bash
|
||||||
|
################################################################################
|
||||||
|
# Author: Fred (support@qo-op.com)
|
||||||
|
# Version: 1.0
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
###########################################################################################
|
||||||
|
# ipfs_TASK.sh SYNC SWARM PEERS AND RUN TASKS
|
||||||
|
IPFSNODEID=$(ipfs id -f='<id>\n')
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
### SYNC IPFS SWARM PEERS
|
||||||
|
count=0
|
||||||
|
for id in $(ipfs swarm peers | awk -F '/' '{print $7}');
|
||||||
|
do
|
||||||
|
count=$((count+1))
|
||||||
|
id=$(echo $id | cut -d '.' -f 3 | cut -d '/' -f 1)
|
||||||
|
echo "REFRESH ~/.zen/wallets_swarm/.$id ..."
|
||||||
|
rm -Rf ~/.zen/wallets_swarm/.$id
|
||||||
|
./timeout.sh -t 10 ipfs get --output=~/.zen/wallets_swarm/ /ipns/$id > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
echo "~/.zen/wallets_swarm/ RENEW from $count peers .........FINISH!!!"
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# MAKE LOCAL ~/.zen/wallets/.$IPFSNODEID/TASK/ directory
|
||||||
|
[[ ! -d ~/.zen/wallets/.$IPFSNODEID/TASK/ ]] && mkdir -p ~/.zen/wallets/.$IPFSNODEID/TASK/
|
||||||
|
### SEARCH FOR RECEIVED TASK .todo FROM SWARM
|
||||||
|
for todo in $(ls ~/.zen/wallets_swarm/.$IPFSNODEID/TASK/*.todo 2>/dev/null);
|
||||||
|
do
|
||||||
|
|
||||||
|
TODO=$(cat $todo)
|
||||||
|
CMD=$(echo $TODO | cut -d ':' -f 1)
|
||||||
|
SUB=$(echo $TODO | cut -d ':' -f 2)
|
||||||
|
ACTION=$(echo $TODO | cut -d ':' -f 3)
|
||||||
|
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
# ./ipfs_PUBLISH.sh
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# This Python script gets Duniter creddentials as arguments, and writes a PubSec file that should be compatible with Cesium and Silkaj(DuniterPy) clients.
|
||||||
|
# launch with :
|
||||||
|
# python3 key_create_dnuikey.py <id> <mdp>
|
||||||
|
|
||||||
|
# depends on duniterpy 0.56
|
||||||
|
|
||||||
|
### Licence - WTFPL
|
||||||
|
# This script was written my Matograine, in the hope that it will be helpful.
|
||||||
|
# Do What The Fuck you like with it. There is :
|
||||||
|
# * no guarantee that this will work
|
||||||
|
# * no support of any kind
|
||||||
|
#
|
||||||
|
# If this is helpful, please consider making a donation to the developper's pubkey : 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8
|
||||||
|
# Have fun
|
||||||
|
|
||||||
|
from sys import argv
|
||||||
|
from duniterpy.key import SigningKey
|
||||||
|
|
||||||
|
# path to save to
|
||||||
|
path = "./.secret.dunikey"
|
||||||
|
|
||||||
|
key = SigningKey.from_credentials(argv[1], argv[2], None)
|
||||||
|
key.save_pubsec_file(path)
|
||||||
|
print(
|
||||||
|
"G1 Wallet: ",
|
||||||
|
key.pubkey,
|
||||||
|
)
|
|
@ -0,0 +1,112 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
CopyLeft 2020 Pascal Engélibert <tuxmain@zettascript.org>
|
||||||
|
|
||||||
|
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 <https://www.gnu.org/licenses/>.
|
||||||
|
"""
|
||||||
|
|
||||||
|
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:
|
||||||
|
return open(os.path.expanduser(data_path), "rb" if b else "r").read()
|
||||||
|
|
||||||
|
def write_data(data, result_path):
|
||||||
|
if result_path == "-":
|
||||||
|
sys.stdout.write(data.decode())
|
||||||
|
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 privkey.decrypt_seal(data)
|
||||||
|
|
||||||
|
def sign(data, privkey):
|
||||||
|
return privkey.sign(data)
|
||||||
|
|
||||||
|
def verify(data, pubkey):
|
||||||
|
try:
|
||||||
|
sys.stderr.write("Signature OK!\n")
|
||||||
|
return libnacl.sign.Verifier(duniterpy.key.PublicKey(pubkey).hex_pk()).verify(data)
|
||||||
|
except ValueError:
|
||||||
|
sys.stderr.write("Bad signature!\n")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
def get_privkey(privkey_path, pubsec):
|
||||||
|
if pubsec:
|
||||||
|
return duniterpy.key.SigningKey.from_pubsec_file(privkey_path)
|
||||||
|
else:
|
||||||
|
return duniterpy.key.SigningKey.from_seedhex(read_data(privkey_path, False))
|
||||||
|
|
||||||
|
def show_help():
|
||||||
|
print("""Usage:
|
||||||
|
python3 natools.py <command> [options]
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
encrypt Encrypt data
|
||||||
|
decrypt Decrypt data
|
||||||
|
sign Sign data
|
||||||
|
verify Verify data
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-i <path> Input file path (default: -)
|
||||||
|
-k <path> Privkey file path (default: authfile.key)
|
||||||
|
--pubsec Use pub/sec format for -p
|
||||||
|
-p <str> Pubkey (base58)
|
||||||
|
-o <path> 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")
|
||||||
|
pubsec = "--pubsec" in sys.argv
|
||||||
|
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), get_privkey(privkey_path, pubsec)), result_path)
|
||||||
|
elif sys.argv[1] == "sign":
|
||||||
|
write_data(sign(read_data(data_path), get_privkey(privkey_path, pubsec)), 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: {}\n".format(e))
|
||||||
|
show_help()
|
||||||
|
exit(1)
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
########################################################################
|
||||||
|
# Author: Fred (support@qo-op.com)
|
||||||
|
# Version: 1.0
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
########################################################################
|
||||||
|
# This script creates ~/.ssb/secret.dunikey from your scuttlebutt secret
|
||||||
|
# You can use it https://cesium.app / https://silkaj.duniter.org/
|
||||||
|
# Python API https://pypi.org/project/duniterpy/
|
||||||
|
########################################################################
|
||||||
|
[[ ! -f ~/.ssb/secret ]] && echo "Your SSB secret is missing... EXIT" && exit 1
|
||||||
|
rm -f ~/.ssb/secret.dunikey
|
||||||
|
ssbpub=$(cat ~/.ssb/secret | grep public\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
|
||||||
|
ssbpriv=$(cat ~/.ssb/secret | grep private\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
|
||||||
|
g1pub=$(echo $ssbpub | base64 -d | base58)
|
||||||
|
g1priv=$(echo $ssbpriv | base64 -d | base58)
|
||||||
|
cat > ~/.ssb/secret.dunikey <<EOF
|
||||||
|
Type: PubSec
|
||||||
|
Version: 1
|
||||||
|
pub: $g1pub
|
||||||
|
sec: $g1priv
|
||||||
|
EOF
|
||||||
|
echo "Your G1 Wallet PubKey is :
|
||||||
|
$g1pub
|
||||||
|
|
||||||
|
Your KEY is located in ~/.ssb/secret.dunikey
|
||||||
|
Use it with https://cesium.app "
|
|
@ -0,0 +1,91 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# The Bash shell script executes a command with a time-out.
|
||||||
|
# Upon time-out expiration SIGTERM (15) is sent to the process. If the signal
|
||||||
|
# is blocked, then the subsequent SIGKILL (9) terminates it.
|
||||||
|
#
|
||||||
|
# Based on the Bash documentation example.
|
||||||
|
|
||||||
|
# Hello Chet,
|
||||||
|
# please find attached a "little easier" :-) to comprehend
|
||||||
|
# time-out example. If you find it suitable, feel free to include
|
||||||
|
# anywhere: the very same logic as in the original examples/scripts, a
|
||||||
|
# little more transparent implementation to my taste.
|
||||||
|
#
|
||||||
|
# Dmitry V Golovashkin <Dmitry.Golovashkin@sas.com>
|
||||||
|
|
||||||
|
scriptName="${0##*/}"
|
||||||
|
|
||||||
|
declare -i DEFAULT_TIMEOUT=20
|
||||||
|
declare -i DEFAULT_INTERVAL=1
|
||||||
|
declare -i DEFAULT_DELAY=1
|
||||||
|
|
||||||
|
# Timeout.
|
||||||
|
declare -i timeout=DEFAULT_TIMEOUT
|
||||||
|
# Interval between checks if the process is still alive.
|
||||||
|
declare -i interval=DEFAULT_INTERVAL
|
||||||
|
# Delay between posting the SIGTERM signal and destroying the process by SIGKILL.
|
||||||
|
declare -i delay=DEFAULT_DELAY
|
||||||
|
|
||||||
|
function printUsage() {
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
$scriptName [-t timeout] [-i interval] [-d delay] command
|
||||||
|
Execute a command with a time-out.
|
||||||
|
Upon time-out expiration SIGTERM (15) is sent to the process. If SIGTERM
|
||||||
|
signal is blocked, then the subsequent SIGKILL (9) terminates it.
|
||||||
|
|
||||||
|
-t timeout
|
||||||
|
Number of seconds to wait for command completion.
|
||||||
|
Default value: $DEFAULT_TIMEOUT seconds.
|
||||||
|
|
||||||
|
-i interval
|
||||||
|
Interval between checks if the process is still alive.
|
||||||
|
Positive integer, default value: $DEFAULT_INTERVAL seconds.
|
||||||
|
|
||||||
|
-d delay
|
||||||
|
Delay between posting the SIGTERM signal and destroying the
|
||||||
|
process by SIGKILL. Default value: $DEFAULT_DELAY seconds.
|
||||||
|
|
||||||
|
As of today, Bash does not support floating point arithmetic (sleep does),
|
||||||
|
therefore all delay/time values must be integers.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Options.
|
||||||
|
while getopts ":t:i:d:" option; do
|
||||||
|
case "$option" in
|
||||||
|
t) timeout=$OPTARG ;;
|
||||||
|
i) interval=$OPTARG ;;
|
||||||
|
d) delay=$OPTARG ;;
|
||||||
|
*) printUsage; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
|
# $# should be at least 1 (the command to execute), however it may be strictly
|
||||||
|
# greater than 1 if the command itself has options.
|
||||||
|
if (($# == 0 || interval <= 0)); then
|
||||||
|
printUsage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# kill -0 pid Exit code indicates if a signal may be sent to $pid process.
|
||||||
|
(
|
||||||
|
((t = timeout))
|
||||||
|
|
||||||
|
while ((t > 0)); do
|
||||||
|
sleep $interval
|
||||||
|
kill -0 $$ || exit 0
|
||||||
|
((t -= interval))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Be nice, post SIGTERM first.
|
||||||
|
# The 'exit 0' below will be executed if any preceeding command fails.
|
||||||
|
kill -s SIGTERM $$ && kill -0 $$ || exit 0
|
||||||
|
sleep $delay
|
||||||
|
kill -s SIGKILL $$
|
||||||
|
) 2> /dev/null &
|
||||||
|
|
||||||
|
exec "$@"
|
|
@ -5,8 +5,9 @@
|
||||||
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
########################################################################
|
########################################################################
|
||||||
# == Transform incoming G1 TX into IPFS ZenTAG ==
|
# == Transform incoming G1 TX into IPFS ZenTAG ==
|
||||||
# SCAN G1PUBKEY WALLET FOR COMMAND in received/pending TX/IN COMMENT
|
# SCAN NODE G1 Wallet FOR "ZEN" Command received (or pending) TX/IN
|
||||||
########################################################################
|
########################################################################
|
||||||
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
# _(_)_ _(_)_
|
# _(_)_ _(_)_
|
||||||
# @@@@ (_)@(_) @@@@ (_)@(_) @@@@
|
# @@@@ (_)@(_) @@@@ (_)@(_) @@@@
|
||||||
|
@ -16,12 +17,9 @@
|
||||||
# \ | \ |/ | / \ | \ |/ | / \ | \ |/
|
# \ | \ |/ | / \ | \ |/ | / \ | \ |/
|
||||||
# \\|// \\|/// \\\|// \\|// \\|/// \\\|// \\|// \\|///
|
# \\|// \\|/// \\\|// \\|// \\|/// \\\|// \\|// \\|///
|
||||||
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
# [ASTROPORT](https://astroport.com)
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|
||||||
me=`basename "$0"`
|
me=`basename "$0"`
|
||||||
# http://cb.vu/unixtoolbox.xhtml
|
|
||||||
# Create RAM disk
|
|
||||||
# mkdir -p ~/.zen/tmp && sudo mount -t tmpfs -osize=64m tmpfs ~/.zen/tmp
|
|
||||||
|
|
||||||
# Symetric Encrypt and decrypt
|
# Symetric Encrypt and decrypt
|
||||||
# openssl aes-256-cbc -k $mysecretpassword -salt -in file -out file.aes
|
# openssl aes-256-cbc -k $mysecretpassword -salt -in file -out file.aes
|
||||||
|
@ -31,17 +29,17 @@ me=`basename "$0"`
|
||||||
# openssl aes-128-cbc -d -salt -in directory.tar.gz.aes | tar -xz -f - # Decrypt
|
# openssl aes-128-cbc -d -salt -in directory.tar.gz.aes | tar -xz -f - # Decrypt
|
||||||
|
|
||||||
if [[ ! $(which silkaj) ]]; then
|
if [[ ! $(which silkaj) ]]; then
|
||||||
echo "$USER Install SILKAJ !!" && exit 1
|
echo "$USER please Install SILKAJ !!" && exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DUNITERURL="https://duniter-g1.p2p.legal" # ATTENTION PAS DE / FINAL !!!
|
# GET DUNITER SERVER
|
||||||
#DUNITERURL="https://duniter.g1.1000i100.fr" # METTRE EN LOAD BALANCING....
|
DUNITERURL="https://$(./duniter_getnode.sh)"
|
||||||
|
|
||||||
IPFSNODEID=$(ipfs id -f='<id>\n')
|
IPFSNODEID=$(ipfs id -f='<id>\n')
|
||||||
[[ $IPFSNODEID == "" ]] && echo "$USER Install IPFS !!" && exit
|
[[ $IPFSNODEID == "" ]] && echo "$USER Please Install IPFS !!" && exit 1
|
||||||
[[ ! -d ~/.ssb/zen/scan ]] && mkdir -p ~/.ssb/zen/scan
|
[[ ! -d ~/.zen/scan ]] && mkdir -p ~/.zen/scan
|
||||||
[[ ! -d ~/.ssb/zen/wallets ]] && mkdir -p ~/.ssb/zen/wallets
|
[[ ! -d ~/.zen/wallets ]] && mkdir -p ~/.zen/wallets
|
||||||
[[ ! -d ~/.ssb/zen/wallets_swarm ]] && mkdir -p ~/.ssb/zen/wallets_swarm
|
[[ ! -d ~/.zen/wallets_swarm ]] && mkdir -p ~/.zen/wallets_swarm
|
||||||
|
|
||||||
#########################################################################################################
|
#########################################################################################################
|
||||||
# GET G1 PUBKEY FROM SCUTTLEBUTT or $2 (DEBUG)
|
# GET G1 PUBKEY FROM SCUTTLEBUTT or $2 (DEBUG)
|
||||||
|
@ -56,84 +54,101 @@ if [[ $NODE_G1PUBKEY == "" ]]; then
|
||||||
ssbpriv=$(cat ~/.ssb/secret | grep private\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
|
ssbpriv=$(cat ~/.ssb/secret | grep private\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
|
||||||
NODE_G1PUBKEY=$(echo $ssbpub | base64 -d | base58)
|
NODE_G1PUBKEY=$(echo $ssbpub | base64 -d | base58)
|
||||||
NODE_G1PRIVKEY=$(echo $ssbpriv | base64 -d | base58)
|
NODE_G1PRIVKEY=$(echo $ssbpriv | base64 -d | base58)
|
||||||
echo "pub: $NODE_G1PUBKEY" > ~/.ipfs/g1.pubsec.dunikey
|
if [[ ! -f ~/.ssb/secret.dunikey ]]; then
|
||||||
echo "sec: $NODE_G1PRIVKEY" >> ~/.ipfs/g1.pubsec.dunikey
|
echo "pub: $NODE_G1PUBKEY" > ~/.ssb/secret.dunikey
|
||||||
|
echo "sec: $NODE_G1PRIVKEY" >> ~/.ssb/secret.dunikey
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
NODE_G1PUBKEY=$(cat ~/.ipfs/g1.pubsec.dunikey | grep 'pub:' | cut -d ' ' -f 2)
|
NODE_G1PUBKEY=$(cat ~/.ssb/secret.dunikey | grep 'pub:' | cut -d ' ' -f 2)
|
||||||
NODE_G1PRIVKEY=$(cat ~/.ipfs/g1.pubsec.dunikey | grep 'sec:' | cut -d ' ' -f 2)
|
NODE_G1PRIVKEY=$(cat ~/.ssb/secret.dunikey | grep 'sec:' | cut -d ' ' -f 2)
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
[[ "$NODE_G1PUBKEY" == "" ]] && echo "$USER Missing ~/.ipfs/g1.pubsec.dunikey : Install SSB Scuttlebot !" && exit;
|
[[ "$NODE_G1PUBKEY" == "" ]] && echo "$USER Missing ~/.ssb/secret : Please Install Scuttlebutt server !" && exit 1;
|
||||||
|
|
||||||
#########################################################################################################
|
#########################################################################################################
|
||||||
echo "CHECKING G1WALLET LAST TX/IN ($DELAY)"
|
echo "CHECKING G1WALLET LAST TX/IN ($DELAY)"
|
||||||
echo "======================================="
|
echo "======================================="
|
||||||
echo "IPFSNODEID = $IPFSNODEID"
|
echo "DUNITER URL = $DUNITERURL"
|
||||||
echo "NODE_G1PUBKEY = $NODE_G1PUBKEY"
|
echo "G1 PUBKEY = $NODE_G1PUBKEY"
|
||||||
# TODO: REDUCE TIME WINDOW & SCAN history.pending
|
echo "SSB ID = %$ssbpub.ed25519"
|
||||||
TIMEBEFORE=$(date --date="-$DELAY" +"%s")
|
echo "IPFS ID = $IPFSNODEID"
|
||||||
TIMESTAMP=$(date +"%s")
|
# SPECIAL ONE LINE BASH BONUS
|
||||||
|
# HOW MUCH = silkaj -p $(./duniter_getnode.sh) balance $(cat ~/.ssb/secret.dunikey | grep 'pub:' | cut -d ' ' -f 2)"
|
||||||
|
|
||||||
# GET BLOCKCHAIN TX DURING TIME WINDOW
|
# PREPARE TIMESTAMP LIMITS
|
||||||
curl -s $DUNITERURL/tx/history/$NODE_G1PUBKEY/times/$TIMEBEFORE/$TIMESTAMP > /tmp/g1zen.scan
|
TIMEBEFORE=$(date -u --date="-$DELAY" +"%s")
|
||||||
|
TIMESTAMP=$(date -u +"%s")
|
||||||
|
# GET BLOCKCHAIN TX FOR TIME WINDOW
|
||||||
|
curl -s $DUNITERURL/tx/history/$NODE_G1PUBKEY/times/$TIMEBEFORE/$TIMESTAMP > ~/.zen/g1zen.scan
|
||||||
|
## TODO VERIFY ~/.zen/g1zen.scan IS GOOD ?! AND RETRY... $DUNITERURL
|
||||||
|
|
||||||
#########################
|
###########################################################################
|
||||||
# LONG DELAY = received
|
# TX EXTRACTION
|
||||||
|
###########################################################################
|
||||||
|
# MORE THAN MINUTE DELAY = history.received
|
||||||
if [[ $DELAYUNIT != "minutes" && $DELAYUNIT != "minute" ]]; then
|
if [[ $DELAYUNIT != "minutes" && $DELAYUNIT != "minute" ]]; then
|
||||||
# HOW MANY TX DO WE HAVE...
|
# HOW MANY TX DO WE HAVE...
|
||||||
TXnb=$(cat /tmp/g1zen.scan | jq '.history.received[].hash' | wc -l)
|
TXnb=$(cat ~/.zen/g1zen.scan | jq '.history.received[].hash' | wc -l)
|
||||||
echo "DETECTED $TXnb TX... Checking TX/IN..."
|
echo "DETECTED $TXnb TX... Checking TX/IN..."
|
||||||
# PARSE $TXnb TX
|
# PARSE $TXnb TX
|
||||||
line=1
|
line=1
|
||||||
while [[ $line -le $TXnb ]]; do
|
while [[ $line -le $TXnb ]]; do
|
||||||
TXhash=$(cat /tmp/g1zen.scan | jq '.history.received[].hash' | head -n $line | tail -n 1 | sed s/\"//g)
|
# GET TX HASH
|
||||||
# IT IS A NEW TX/IN?
|
TXhash=$(cat ~/.zen/g1zen.scan | jq -r '.history.received[].hash' | head -n $line | tail -n 1 )
|
||||||
if [[ ! -f ~/.ssb/zen/scan/zen.$TXhash ]]; then
|
# IT IS A NEW TX?
|
||||||
# GET LAST RX ISSUER
|
if [[ ! -f ~/.zen/scan/zen.$TXhash ]]; then
|
||||||
ISSUER=$(cat /tmp/g1zen.scan | jq '.history.received[].issuers[0]' | head -n $line | tail -n 1 | sed s/\"//g)
|
# GET LAST TX ISSUER
|
||||||
|
ISSUER=$(cat ~/.zen/g1zen.scan | jq -r '.history.received[].issuers[0]' | head -n $line | tail -n 1)
|
||||||
[[ $ISSUER == $NODE_G1PUBKEY ]] && ((line++)) && continue ## TX/OUT CONTINUE
|
[[ $ISSUER == $NODE_G1PUBKEY ]] && ((line++)) && continue ## TX/OUT CONTINUE
|
||||||
echo $ISSUER > ~/.ssb/zen/scan/zen.$TXhash
|
echo $ISSUER > ~/.zen/scan/zen.$TXhash
|
||||||
# GET OUTPUTS AND MAKE ZEN SUM
|
# GET OUTPUTS AND MAKE ZEN=G1*100 SUM
|
||||||
ZEN=$(cat /tmp/g1zen.scan | jq '.history.received[].outputs[]' | grep $NODE_G1PUBKEY | head -n $line | tail -n 1 | sed s/\"//g | cut -d ':' -f 1)
|
ZEN=$(cat ~/.zen/g1zen.scan | jq -r '.history.received[].outputs[]' | grep $NODE_G1PUBKEY | head -n $line | tail -n 1 | cut -d ':' -f 1)
|
||||||
# GET COMMENT
|
# GET COMMENT
|
||||||
COMMENT=$(cat /tmp/g1zen.scan | jq '.history.received' | jq '.[].comment' | head -n $line | tail -n 1 | sed s/\"//g)
|
COMMENT=$(cat ~/.zen/g1zen.scan | jq '.history.received' | jq -r '.[].comment' | head -n $line | tail -n 1)
|
||||||
# echo "TX-IN $ISSUER => $NODE_G1PUBKEY"
|
# echo "TX-IN $ISSUER => $NODE_G1PUBKEY"
|
||||||
echo "TX/IN :: $ZEN ZEN from $ISSUER :: $COMMENT ($TXhash)"
|
echo "TX/IN :: $ZEN ZEN from $ISSUER :: $COMMENT ($TXhash)"
|
||||||
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
||||||
[[ $CMD == "ZEN" ]] && ./zen_MAKE.sh $ZEN $TXhash
|
###### CREATE ZEN VALUE IN IPFS #########
|
||||||
./zen_MAKE.sh $ZEN $TXhash $ISSUER
|
[[ $CMD == "ZEN" ]] && ./zen_MAKE.sh $ZEN $TXhash $ISSUER
|
||||||
|
############################################
|
||||||
|
echo "DEBUG! ./zen_MAKE.sh $ZEN $TXhash $ISSUER"
|
||||||
|
############################################
|
||||||
else
|
else
|
||||||
# STILL OLD TX
|
# STILL OLD TX
|
||||||
[[ $TXhash != "" ]] && echo "ALREADY TREATED TX/IN: $TXhash $(cat ~/.ssb/zen/scan/zen.$TXhash)" || echo "NO TX"
|
[[ $TXhash != "" ]] && echo "ALREADY TREATED TX/IN: $TXhash $(cat ~/.zen/scan/zen.$TXhash)" || echo "NO TX"
|
||||||
fi
|
fi
|
||||||
((line++))
|
((line++))
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
# MINUTE DELAY = pending
|
# MINUTE DELAY = pending // TODO: if anyone succeed in passing $VAR in jq command, both can be merge...
|
||||||
# HOW MANY TX DO WE HAVE...
|
# HOW MANY TX DO WE HAVE...
|
||||||
TXnb=$(cat /tmp/g1zen.scan | jq '.history.pending[].hash' | wc -l)
|
TXnb=$(cat ~/.zen/g1zen.scan | jq '.history.pending[].hash' | wc -l)
|
||||||
echo "DETECTED $TXnb TX... Checking TX/IN..."
|
echo "DETECTED $TXnb TX... Checking TX/IN..."
|
||||||
# PARSE $TXnb TX
|
# PARSE $TXnb TX
|
||||||
line=1
|
line=1
|
||||||
while [[ $line -le $TXnb ]]; do
|
while [[ $line -le $TXnb ]]; do
|
||||||
TXhash=$(cat /tmp/g1zen.scan | jq '.history.pending[].hash' | head -n $line | tail -n 1 | sed s/\"//g)
|
TXhash=$(cat ~/.zen/g1zen.scan | jq -r '.history.pending[].hash' | head -n $line | tail -n 1)
|
||||||
# IT IS A NEW TX/IN?
|
# IT IS A NEW TX/IN?
|
||||||
if [[ ! -f ~/.ssb/zen/scan/zen.$TXhash ]]; then
|
if [[ ! -f ~/.zen/scan/zen.$TXhash ]]; then
|
||||||
# GET LAST RX ISSUER
|
# GET LAST RX ISSUER
|
||||||
ISSUER=$(cat /tmp/g1zen.scan | jq '.history.pending[].issuers[0]' | head -n $line | tail -n 1 | sed s/\"//g)
|
ISSUER=$(cat ~/.zen/g1zen.scan | jq -r '.history.pending[].issuers[0]' | head -n $line | tail -n 1)
|
||||||
[[ $ISSUER == $NODE_G1PUBKEY ]] && ((line++)) && continue ## TX/OUT CONTINUE
|
[[ $ISSUER == $NODE_G1PUBKEY ]] && ((line++)) && continue ## TX/OUT CONTINUE
|
||||||
echo $ISSUER > ~/.ssb/zen/scan/zen.$TXhash
|
echo $ISSUER > ~/.zen/scan/zen.$TXhash
|
||||||
# GET OUTPUTS AND MAKE ZEN SUM
|
# GET OUTPUTS AND MAKE ZEN SUM
|
||||||
ZEN=$(cat /tmp/g1zen.scan | jq '.history.pending[].outputs[]' | grep $NODE_G1PUBKEY | head -n $line | tail -n 1 | sed s/\"//g | cut -d ':' -f 1)
|
ZEN=$(cat ~/.zen/g1zen.scan | jq -r '.history.pending[].outputs[]' | grep $NODE_G1PUBKEY | head -n $line | tail -n 1 | cut -d ':' -f 1)
|
||||||
# GET COMMENT
|
# GET COMMENT
|
||||||
COMMENT=$(cat /tmp/g1zen.scan | jq '.history.pending' | jq '.[].comment' | head -n $line | tail -n 1 | sed s/\"//g)
|
COMMENT=$(cat ~/.zen/g1zen.scan | jq '.history.pending' | jq -r '.[].comment' | head -n $line | tail -n 1)
|
||||||
# echo "TX-IN $ISSUER => $NODE_G1PUBKEY"
|
# echo "TX-IN $ISSUER => $NODE_G1PUBKEY"
|
||||||
echo "TX/IN :: $ZEN ZEN from $ISSUER :: $COMMENT ($TXhash)"
|
echo "TX/IN :: $ZEN ZEN from $ISSUER :: $COMMENT ($TXhash)"
|
||||||
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
||||||
|
###### CREATE ZEN VALUE IN IPFS #########
|
||||||
[[ $CMD == "ZEN" ]] && ./zen_MAKE.sh $ZEN $TXhash
|
[[ $CMD == "ZEN" ]] && ./zen_MAKE.sh $ZEN $TXhash
|
||||||
|
############################################
|
||||||
|
echo "DEBUG! ./zen_MAKE.sh $ZEN $TXhash $ISSUER"
|
||||||
|
############################################
|
||||||
else
|
else
|
||||||
# STILL OLD TX
|
# STILL OLD TX
|
||||||
[[ $TXhash != "" ]] && echo "ALREADY TREATED TX/IN: $TXhash $(cat ~/.ssb/zen/scan/zen.$TXhash)" || echo "NO TX"
|
[[ $TXhash != "" ]] && echo "ALREADY TREATED TX/IN: $TXhash $(cat ~/.zen/scan/zen.$TXhash)" || echo "NO TX"
|
||||||
fi
|
fi
|
||||||
((line++))
|
((line++))
|
||||||
done
|
done
|
|
@ -0,0 +1,123 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# TODO CLEAN IPFS: ipfs pin ls -q --type recursive | xargs ipfs pin rm
|
||||||
|
###########################################################################################
|
||||||
|
# Script appelé depuis zen_G1TXIN pour créer des QRCode IPNS + Clef associé à un ZenTag
|
||||||
|
# rempli des centimes de June reçues.#
|
||||||
|
###########################################################################################
|
||||||
|
###########################################################################################
|
||||||
|
# ZenTag Draft Format
|
||||||
|
# fred@ONELOVE:~/workspace/ZEN$ ipfs ls /ipns/QmZxwgScLyLjitE1mrUFqpTw27gk6tMdfKQ7QTEo28dE2u
|
||||||
|
# QmVkur97Pqpgt7cy71FCNacPd5Z1eD9QVfw5tu4LdXHavk 47 _chain
|
||||||
|
# QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9 2 _chain.n
|
||||||
|
# QmRPdapkSVeYeRcC6X7freVo8vrGYjKcGsa96V5GsMg36p 20 _chain.nanodate
|
||||||
|
# Qmc5m94Gu7z62RC8waSKkZUrCCBJPyHbkpmGzEePxy2oXJ 1 _chain.prev
|
||||||
|
# Qmb8gYFmno4QeEpaPTi969qQNyVJK9VyfBbsXtyMA3PMow 45 _g1.creator
|
||||||
|
# QmQo6ghBGdkGCnGoB22cYmraR76q44K1mjVXqQQ3UVn2T1 45 _g1.issuer
|
||||||
|
# QmfUFk27ZvHaGfEwBeqResw2qQ9SCu4tsY69SkVuCdWAxB 65 _g1.txhash
|
||||||
|
# QmaKa7FGwmMshE7RACrWAFCsWETu1HcHnV1eak7HcUk6Cs 47 _ipfs.creator
|
||||||
|
# QmfCL14hnVnm3mrYT7fRjveMRTEoSp2axqCVp3JYoxXXgn 1300 _ipfs.publishkey.B.gpg
|
||||||
|
# QmUQ7WsACNYYWAw4QW8hKTCq8MM8oYGV7HJuxW7QTGj9qS 1243 _ipfs.publishkey.crypt
|
||||||
|
# QmdvRknZWSZUyS9SfmFWcvySv1tgi2PTF711rsGPN6ftL1 65 _tag.B.sha
|
||||||
|
# QmXA1zSxA3dh1dxFtkKaH5iomN3BsKMSAo2qhruA58AU81 34 _tag.uid
|
||||||
|
# QmPrumas2N5DuwcqUz9mayAU6oDL2bLjhpkVZ8hCRq9rpx 5 _tag.zen
|
||||||
|
###########################################################################################
|
||||||
|
###########################################################################################
|
||||||
|
me=`basename "$0"`
|
||||||
|
|
||||||
|
ZEN=$1
|
||||||
|
TXhash=$2
|
||||||
|
[[ ! -f ~/.zen/scan/zen.$TXhash ]] && echo "TX/IN NON RECONNUE... ARRET" && exit
|
||||||
|
ISSUER=$(cat ~/.zen/scan/zen.$TXhash)
|
||||||
|
|
||||||
|
#########################################################################################################
|
||||||
|
IPFSNODEID=$(ipfs id -f='<id>\n')
|
||||||
|
if [[ -f ~/.ipfs/g1.pubsec.dunikey ]]; then
|
||||||
|
NODE_G1PUBKEY=$(cat ~/.ipfs/g1.pubsec.dunikey | grep 'pub:' | cut -d ' ' -f 2)
|
||||||
|
else
|
||||||
|
echo "MISSING NODE_G1PUBKEY ~/.ipfs/g1.pubsec.dunikey ... Ciao"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
#########################################################################################################
|
||||||
|
# CREATE ZEN TAG
|
||||||
|
# ZenTag NAMES
|
||||||
|
AA=$(./diceware.sh 6 | xargs); # Nom = Diceware de 6 mots
|
||||||
|
SHAA=$(echo -n $AA | sha256sum | cut -d ' ' -f 1)
|
||||||
|
RR=$(echo ${AA} | sed s/\ //g ); # Nom concaténé
|
||||||
|
PR=$(echo ${AA} | cut -d ' ' -f 1 ); # Prénom du G1Tag
|
||||||
|
|
||||||
|
# Create Unique G1tag in all SWARM! TODO BETTER
|
||||||
|
while [[ -f ~/.zen/tag/${SHAA} ]]; do
|
||||||
|
AA=$(./diceware.sh 6 | xargs);
|
||||||
|
SHAA=$(echo -n $AA | sha256sum | cut -d ' ' -f 1)
|
||||||
|
RR=$(echo ${AA} | sed s/\ //g );
|
||||||
|
PR=$(echo ${AA} | cut -d ' ' -f 1 );
|
||||||
|
done
|
||||||
|
|
||||||
|
# PASSWORD FOR HUMAN ACTION
|
||||||
|
BB=$(./diceware.sh 4 | xargs);
|
||||||
|
SHABB=$(echo -n "$BB" | sha256sum | cut -d ' ' -f 1)
|
||||||
|
####################
|
||||||
|
# WRITE ZENTAG
|
||||||
|
mkdir -p ~/.zen/tag/${SHAA}
|
||||||
|
echo "CREATING ZenTag ($ZEN zen): ls -al ~/.zen/tag/${SHAA}"
|
||||||
|
echo "$AA | $BB"
|
||||||
|
# ZenTag Create files
|
||||||
|
echo "$AA" > ~/.zen/tag/${SHAA}/_tag.uid # Nom du ZenTAG
|
||||||
|
echo "$ZEN" > ~/.zen/tag/${SHAA}/_tag.zen # Tag ZEN amount
|
||||||
|
echo "${IPFSNODEID}" > ~/.zen/tag/${SHAA}/_ipfs.creator # NODE IPFS ID
|
||||||
|
echo "$TXhash" > ~/.zen/tag/${SHAA}/_g1.txhash # HASH G1 TX/IN
|
||||||
|
echo "$NODE_G1PUBKEY" > ~/.zen/tag/${SHAA}/_g1.creator # CREATOR IPFS NODE G1PUBKEY
|
||||||
|
echo "$ISSUER" > ~/.zen/tag/${SHAA}/_g1.issuer # TX ISSUER G1PUBKEY
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
# ${RR} IPNS publishkey CYPHER *BB & **NODE_G1PUBKEY
|
||||||
|
[[ ! -f ~/.ipfs/keystore/_${RR} ]] && J=$(ipfs key gen -t rsa -s 2048 _${RR})
|
||||||
|
# WRITE SHABB for QRCode BB verification
|
||||||
|
echo "$SHABB" > ~/.zen/tag/${SHAA}/_tag.B.sha
|
||||||
|
# BB pgp symetric publishkey
|
||||||
|
echo "${BB}" | gpg -q --output ~/.zen/tag/${SHAA}/_ipfs.publishkey.B.gpg --yes --pinentry-mode loopback --symmetric --passphrase-fd 0 ~/.ipfs/keystore/_${RR}
|
||||||
|
# GIVE IPFS CREATOR NODE ACCESS TO ZEN TAG
|
||||||
|
./natools.py encrypt -p $NODE_G1PUBKEY -i ~/.ipfs/keystore/_${RR} -o ~/.zen/tag/${SHAA}/_ipfs.publishkey.crypt
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
# TAG IPFS STORAGE & G1Tag IPNS PUBLISHING
|
||||||
|
###########################################################
|
||||||
|
# TAG CHAIN DATA
|
||||||
|
echo "0" > ~/.zen/tag/${SHAA}/_chain.n # Tag modification number (0 first)
|
||||||
|
NANODATE=$(date -u +%s%N)
|
||||||
|
echo "$NANODATE" > ~/.zen/tag/${SHAA}/_chain.nanodate # Nanodate notification
|
||||||
|
|
||||||
|
echo "" > ~/.zen/tag/${SHAA}/_chain.prev
|
||||||
|
I=$(ipfs add -qr ~/.zen/tag/${SHAA} | tail -n 1)
|
||||||
|
# MEMORIZE FOR CHAINING FUTURE CHANGES
|
||||||
|
echo "${I}" > ~/.zen/tag/${SHAA}/_chain
|
||||||
|
# Activate chain
|
||||||
|
I=$(ipfs add -qr ~/.zen/tag/${SHAA} | tail -n 1)
|
||||||
|
|
||||||
|
# IPFS Hash for Immutable G1tag data
|
||||||
|
J=$(ipfs name publish -k _${RR} --quieter /ipfs/${I})
|
||||||
|
echo "${J}" > ~/.zen/tag/${SHAA}/_ipns
|
||||||
|
|
||||||
|
echo "ZENTAG MADE: ipfs ls /ipns/${J}"
|
||||||
|
ipfs ls /ipns/${J}
|
||||||
|
####################################################################################
|
||||||
|
### G1TAG PRINT
|
||||||
|
# QR CODE LECTURE
|
||||||
|
qrencode -s 5 -o ~/.zen/tag/${SHAA}/.QRCODE.pub.png "RJ:${SHAA}#${J}"
|
||||||
|
# QR CODE ECRITURE + ISSUER CYPHER (TODO : SHABB ou BB?)
|
||||||
|
qrencode -s 5 -o ~/.zen/tag/${SHAA}/.QRCODE.priv.png "BJ:${SHABB}#${J}"
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# TODO: PRINT LOCAL OR SEND "PRINT TASK" TO DAB MACHINE $ISSUER PREFERING ...
|
||||||
|
# DESTNODE=$(grep -Rwl "$ISSUER" ~/.zen/wallets_swarm/*/_pub)
|
||||||
|
# [[ $DESTNODE != "" ]] && DESNODEIPFSFILE=$(echo $DESTNODE | cut -d '_' -f 1)_ipfsid || exit
|
||||||
|
# DESTIPFS=$(cat $DESNODEIPFSFILE)
|
||||||
|
# ./natools.py encrypt -p $DESTIPFS -i ~/.zen/tag/${SHAA}/.QRCODE.priv.png -o ~/.zen/tag/${SHAA}/.QRCODE.crypt.png && rm ~/.zen/tag/${SHAA}/.QRCODE.priv.png
|
||||||
|
|
||||||
|
# CREATE TASK
|
||||||
|
# mkdir -p ~/.zen/wallets/.$DESTIPFS/TASK/
|
||||||
|
# echo "PRINT:ZENTAG:${J}" > ~/.zen/wallets/.$DESTIPFS/TASK/$NANODATE.$IPFSNODEID.todo
|
||||||
|
# ./ipfs_PUBLISH.sh
|
||||||
|
|
||||||
|
###
|
|
@ -0,0 +1,98 @@
|
||||||
|
#!/bin/bash
|
||||||
|
################################################################################
|
||||||
|
# Author: Fred (support@qo-op.com)
|
||||||
|
# Version: 1.0
|
||||||
|
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
###########################################################################################
|
||||||
|
# tag_OP.sh OPERATION ON ZenTAG...
|
||||||
|
|
||||||
|
###########################################################################################
|
||||||
|
# fred@ONELOVE:~/workspace/ZEN$ ipfs ls /ipns/QmZxwgScLyLjitE1mrUFqpTw27gk6tMdfKQ7QTEo28dE2u
|
||||||
|
# QmVkur97Pqpgt7cy71FCNacPd5Z1eD9QVfw5tu4LdXHavk 47 _chain
|
||||||
|
# QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9 2 _chain.n
|
||||||
|
# QmRPdapkSVeYeRcC6X7freVo8vrGYjKcGsa96V5GsMg36p 20 _chain.nanodate
|
||||||
|
# Qmc5m94Gu7z62RC8waSKkZUrCCBJPyHbkpmGzEePxy2oXJ 1 _chain.prev
|
||||||
|
# Qmb8gYFmno4QeEpaPTi969qQNyVJK9VyfBbsXtyMA3PMow 45 _g1.creator
|
||||||
|
# QmQo6ghBGdkGCnGoB22cYmraR76q44K1mjVXqQQ3UVn2T1 45 _g1.issuer
|
||||||
|
# QmfUFk27ZvHaGfEwBeqResw2qQ9SCu4tsY69SkVuCdWAxB 65 _g1.txhash
|
||||||
|
# QmaKa7FGwmMshE7RACrWAFCsWETu1HcHnV1eak7HcUk6Cs 47 _ipfs.creator
|
||||||
|
# QmfCL14hnVnm3mrYT7fRjveMRTEoSp2axqCVp3JYoxXXgn 1300 _ipfs.publishkey.B.gpg
|
||||||
|
# QmUQ7WsACNYYWAw4QW8hKTCq8MM8oYGV7HJuxW7QTGj9qS 1243 _ipfs.publishkey.crypt
|
||||||
|
# QmdvRknZWSZUyS9SfmFWcvySv1tgi2PTF711rsGPN6ftL1 65 _tag.B.sha
|
||||||
|
# QmXA1zSxA3dh1dxFtkKaH5iomN3BsKMSAo2qhruA58AU81 34 _tag.uid
|
||||||
|
# QmPrumas2N5DuwcqUz9mayAU6oDL2bLjhpkVZ8hCRq9rpx 5 _tag.zen
|
||||||
|
############################################################################################
|
||||||
|
# TRANSFERT $VALUE ZEN FROM $JSOURCE ZenTag to $JDEST ZenTag
|
||||||
|
JSOURCE=$1
|
||||||
|
JDEST=$2
|
||||||
|
VALUE=$3
|
||||||
|
|
||||||
|
IPFSNODEID=$(ipfs id -f='<id>\n')
|
||||||
|
NANODATE=$(date -u +%s%N)
|
||||||
|
############################################
|
||||||
|
echo "############################################
|
||||||
|
zen_OP.sh ZenTag TRANSFER $NANODATE
|
||||||
|
############################################
|
||||||
|
SOURCE(1): $JSOURCE
|
||||||
|
DEST(2): $JDEST
|
||||||
|
VALUE(3): $VALUE ZEN
|
||||||
|
############################################"
|
||||||
|
|
||||||
|
#############################################################################################################
|
||||||
|
# SOURCE
|
||||||
|
#############################################################################################################
|
||||||
|
############## SOURCE EXTRACTION
|
||||||
|
JSOURCEUID=$(ipfs cat /ipns/$JSOURCE/_tag.uid)
|
||||||
|
JSOURCERR=$(echo "$JSOURCEUID" | sed s/\ //g)
|
||||||
|
#############################################
|
||||||
|
############## GOOD or BAD ?
|
||||||
|
[[ $JSOURCERR == "" ]] && echo "NO G1Tag /ipns/$JSOURCE ... Ciao!" && exit
|
||||||
|
[[ ! -d /tmp/$JSOURCERR ]] && mkdir -p /tmp/$JSOURCERR || rm -f /tmp/$JSOURCERR/*
|
||||||
|
ipfs get --output=/tmp/${JSOURCERR}/ /ipns/$JSOURCE > /dev/null 2>&1
|
||||||
|
# echo "Retrieving SOURCE G1Tag: ipfs get --output=/tmp/${JSOURCERR}/ /ipns/$JSOURCE"
|
||||||
|
|
||||||
|
JSOURCECREATOR=$(cat /tmp/${JSOURCERR}/_ipfs.creator)
|
||||||
|
JSOURCEVALUE=$(cat /tmp/${JSOURCERR}/_tag.zen)
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
############## No JDEST, then return $JSOURCEVALUE
|
||||||
|
[[ "$JDEST" == "" ]] && echo "ZenTAG ($JSOURCEUID) VALUE = $JSOURCEVALUE Zen" && exit
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
############## TEST IF $VALUE IS AVAILABLE
|
||||||
|
FINALSOURCE=$(echo "${JSOURCEVALUE} - ${VALUE}" | bc -l)
|
||||||
|
[[ $FINALSOURCE -lt 0 ]] && echo "Manque $FINALSOURCE Zen à ce ZenTAG... Ciao!" && exit
|
||||||
|
|
||||||
|
#############################################################################################################
|
||||||
|
# DEST
|
||||||
|
#############################################################################################################
|
||||||
|
############## DESTINATION EXTRACTION
|
||||||
|
JDESTUID=$(ipfs cat /ipns/$JDEST/_tag.uid)
|
||||||
|
JDESTRR=$(echo "$JDESTUID" | sed s/\ //g);
|
||||||
|
#############################################
|
||||||
|
############## GOOD or BAD ?
|
||||||
|
[[ $JDESTRR == "" ]] && echo "NO G1Tag /ipns/$JDEST ... Ciao!" && exit
|
||||||
|
[[ ! -d /tmp/$JDESTRR ]] && mkdir -p /tmp/$JDESTRR || rm -f /tmp/$JDESTRR/*
|
||||||
|
ipfs get --output=/tmp/$JDESTRR/ /ipns/$JDEST > /dev/null 2>&1
|
||||||
|
|
||||||
|
JDESTCREATOR=$(cat /tmp/${JDESTRR}/_ipfs.creator)
|
||||||
|
JDESTVALUE=$(cat /tmp/${JDESTRR}/_tag.zen);
|
||||||
|
|
||||||
|
FINALDEST=$(echo "${JDESTVALUE} + ${VALUE}" | bc -l)
|
||||||
|
|
||||||
|
######################################################################################################
|
||||||
|
# CHECK NANODATE
|
||||||
|
LAST=$(cat /tmp/${JSOURCERR}/_chain.nanodate)
|
||||||
|
timediff=$( echo "${NANODATE} - ${LAST}" | bc -l )
|
||||||
|
# NODE TIME SYNC 600 milliards de nanosecondes = 600 s = 10 mn
|
||||||
|
if [[ $timediff -lt 600000000000 ]]; then
|
||||||
|
echo "LAST OPERATION NOT FINISHED YET... RETRY IN A FEW MINUTES"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "OK. OPERATION ALLOWED...
|
||||||
|
$JSOURCERR (/ipns/$JSOURCE) : $JSOURCEVALUE => $FINALSOURCE
|
||||||
|
$JDESTRR (/ipns/$JDEST) : $JDESTVALUE => $FINALDEST"
|
||||||
|
|
||||||
|
# TODO: SEND TASK TO $JSOURCECREATOR AND $JDESTCREATOR
|
|
@ -0,0 +1,302 @@
|
||||||
|
#!/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_XY.sh: QRCODE READER : START"
|
||||||
|
function log () {
|
||||||
|
echo "$line
|
||||||
|
$1" >> /tmp/tag_READ_XY.log
|
||||||
|
}
|
||||||
|
#############################################
|
||||||
|
# No external dependance !!!!
|
||||||
|
#source ./shell/init.sh
|
||||||
|
#source ./shell/functions.sh
|
||||||
|
##############################################
|
||||||
|
# NODE ENVIRONEMENT DETECTION
|
||||||
|
##############################################
|
||||||
|
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1);
|
||||||
|
IPFSNODEID=$(su $YOU -c "ipfs id -f='<id>\n'")
|
||||||
|
NODE_UIDNA=$(cat "./wallets/.$IPFSNODEID/_uidna")
|
||||||
|
|
||||||
|
MY_PATH="`dirname \"$0\"`" # relative
|
||||||
|
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
|
||||||
|
|
||||||
|
SWARM_G1PUBKEY=$(cat "${GPATH}/g1sms.pub.key")
|
||||||
|
SWARM_G1AUTHFILE="${GPATH}/g1sms.priv.key"
|
||||||
|
if [[ ! -f $SWARM_G1AUTHFILE ]]; then echo "ERREUR CLEF DECHIFFRAGE!"; exit; fi
|
||||||
|
|
||||||
|
## INIT NODE G1 PUB & PRIV KEY
|
||||||
|
NODE_G1PUBKEY=$(cat "${GPATH}/g1sms.preoni.pub.key")
|
||||||
|
NODE_G1AUTHFILE="${GPATH}/g1sms.preoni.priv.key"
|
||||||
|
|
||||||
|
|
||||||
|
if [[ ! -e "/dev/ttyACM0" ]]; then echo "Branchez votre lecteur de QR code!"; exit; fi
|
||||||
|
##############################################
|
||||||
|
|
||||||
|
# DOUCHETTE ES TU LA?
|
||||||
|
./shell/tools/4LETTER.scroll.py "G1TX START"
|
||||||
|
./shell/tools/4LETTER.clock.py &
|
||||||
|
clockpid=$!
|
||||||
|
|
||||||
|
# TABLEAU MEMOIRE DE SCAN
|
||||||
|
declare -a act
|
||||||
|
declare -a obj
|
||||||
|
declare -a val
|
||||||
|
|
||||||
|
cat /dev/ttyACM0 | while read line; do
|
||||||
|
kill $clockpid
|
||||||
|
|
||||||
|
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"
|
||||||
|
# IPFS READ
|
||||||
|
ID=$(su $YOU -c "ipfs cat /ipns/$J/TAG_id");
|
||||||
|
if [[ "$ID" == "" ]]; then
|
||||||
|
./shell/tools/4LETTER.scroll.py ">> BAD G1TAG <<"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Get First R Tag name word and remove space for RR
|
||||||
|
FID=$(echo $ID | awk '{print toupper($1)}')
|
||||||
|
RR=$(echo $ID | sed s/\ //g)
|
||||||
|
|
||||||
|
./shell/tools/4LETTER.scroll.py "${#act[@]} $FID > "
|
||||||
|
RVALUE=$(su $YOU -c "ipfs cat /ipns/$J/TAG_amount");
|
||||||
|
CURRENCY=$(su $YOU -c "ipfs cat /ipns/$J/TAG_currency" | awk '{print tolower($1)}')
|
||||||
|
|
||||||
|
PASSENGER=$(su $YOU -c "ipfs cat /ipns/$J/TAG_passenger");
|
||||||
|
if [[ "$PASSENGER" != "" ]]; then
|
||||||
|
./shell/tools/4LETTER.scroll.py "G1TAG PASSENGER $RVALUE ZEN"
|
||||||
|
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 "$RVALUE ZEN *** $G1VAL G1"
|
||||||
|
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 ">> BAD G1TAG <<"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
FID=$(echo $ID | awk '{print toupper($1)}')
|
||||||
|
RR=$(echo $ID | sed s/\ //g)
|
||||||
|
|
||||||
|
./shell/tools/4LETTER.scroll.py "${#act[@]} $FID TX >>"
|
||||||
|
BVALUE=$(su $YOU -c "ipfs cat /ipns/$J/TAG_amount")
|
||||||
|
CURRENCY=$(su $YOU -c "ipfs cat /ipns/$J/TAG_currency" | awk '{print tolower($1)}')
|
||||||
|
|
||||||
|
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"
|
||||||
|
./shell/tools/4LETTER.scroll.py "** GPG **"
|
||||||
|
gpg -d --output /tmp/ipns.key --pinentry-mode=loopback --passphrase $BB /tmp/TAG_publishkey.B.gpg
|
||||||
|
# CHECK IF OK
|
||||||
|
if [[ ! -f /tmp/ipns.key ]]; then
|
||||||
|
./shell/tools/4LETTER.scroll.py ">> BAD GPG KEY <<"
|
||||||
|
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"
|
||||||
|
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
|
||||||
|
G1VAL=$(bc -l <<< "scale=2; $BVALUE / 100" | cut -d '.' -f 1)
|
||||||
|
log "__SUB:tag_READ_X.sh: Ce G1 Tag $FID contient $BVALUE $CURRENCY"
|
||||||
|
./shell/tools/4LETTER.scroll.py "$BVALUE ZEN *** $G1VAL G1 MAX"
|
||||||
|
fi
|
||||||
|
cmd="BJ"
|
||||||
|
val+=("$BVALUE")
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if [[ $lon -eq 44 ]]; then
|
||||||
|
./shell/tools/4LETTER.scroll.py "PORTEFEUILLE G1 >>>>>>>> ${#act[@]}" &
|
||||||
|
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 " $NOPOINT G1 *** $NOPOINT G1 "
|
||||||
|
CASHBACK="$J"
|
||||||
|
cmd="G1"
|
||||||
|
val+=("$VALUE")
|
||||||
|
else
|
||||||
|
if [[ "$VALUE" == "" ]]; then
|
||||||
|
DUNITER=$(./shell/checknodes.sh 'BAN')
|
||||||
|
log "__SUB:tag_READ_X.sh: 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
|
||||||
|
log "__SUB:tag_READ_X.sh: ERREUR QRCODE ILLISIBLE. longueur $J = ${#J}"
|
||||||
|
./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 " 2 X "
|
||||||
|
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 "ZEN -> G1"
|
||||||
|
log "__SUB:tag_READ_X.sh: G1 tag de $BVALUE G1 ! /ipns/$J Virement vers $CASHBACK? "
|
||||||
|
|
||||||
|
./shell/tools/4LETTER.spinner.py &
|
||||||
|
spinnerpid=$!
|
||||||
|
|
||||||
|
# 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 $SWARM_G1AUTHFILE ($G1VAL) -> $CASHBACK"
|
||||||
|
PAY=$(./silkaj/silkaj transaction --auth-file -file="$SWARM_G1AUTHFILE" --amount=$G1VAL --output=$CASHBACK --comment="[G1sms+] G1Tag $RR ZEN -> G1" -y)
|
||||||
|
|
||||||
|
log "__SUB:tag_READ_X.sh: Silkaj output = $PAY"
|
||||||
|
# Stop 1LETTER.spinner.py
|
||||||
|
kill $spinnerpid
|
||||||
|
|
||||||
|
if [[ "$(echo $PAY | cut -d '|' -f 1)" == "KO" && "$PAY" != "" ]]; 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 "DETRUIRE G1TAG ${FID}"
|
||||||
|
|
||||||
|
# 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/timeout.sh -t 1 ./shell/tools/4LETTER.spinner.py
|
||||||
|
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 !!! 4 DIGIT REMOVING LEADING 0
|
||||||
|
COMBIEN=$(./shell/tools/matrixKeypad.py | sed 's/^0*//')
|
||||||
|
if [[ $COMBIEN -le ${val[1]} ]]; then
|
||||||
|
COMBIENZEN=$(bc -l <<< "$COMBIEN * 100")
|
||||||
|
log "__SUB:tag_READ_X.sh: Transfert de G1 Tag à G1 Tag. $COMBIEN"
|
||||||
|
./shell/tools/4LETTER.scroll.py "G1TAG ${FID} -> TX $COMBIENZEN ZEN *** $COMBIEN G1"
|
||||||
|
log "__SUB:tag_READ_X.sh: ./shell/tag_OP.sh ${obj[1]} ${obj[0]} $COMBIENZEN $SWARM_G1AUTHFILE"
|
||||||
|
./shell/tag_OP.sh ${obj[1]} ${obj[0]} $COMBIENZEN "$SWARM_G1AUTHFILE"
|
||||||
|
else
|
||||||
|
./shell/tools/4LETTER.scroll.py "ERREUR $COMBIEN > VALEUR DE ${FID} *** ${val[1]} ZEN"
|
||||||
|
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]} ZEN EN PASSENGER ${FID}";
|
||||||
|
log "__SUB:tag_READ_X.sh: $(./shell/tag_OP.sh ${obj[0]} ${obj[0]} 0 $SWARM_G1AUTHFILE)"
|
||||||
|
fi
|
||||||
|
CASHBACK=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
act=()
|
||||||
|
obj=()
|
||||||
|
val=()
|
||||||
|
# END OF 2-PASS READ
|
||||||
|
./shell/timeout.sh -t 2 ./shell/tools/4LETTER.spinner.py
|
||||||
|
fi
|
||||||
|
|
||||||
|
./shell/tools/4LETTER.blink.py
|
||||||
|
./shell/tools/4LETTER.clock.py &
|
||||||
|
clockpid=$!
|
||||||
|
done
|
Loading…
Reference in New Issue