jaklis upgrade
This commit is contained in:
parent
1169ffe6e4
commit
2b4038dc67
|
@ -1,5 +1,10 @@
|
||||||
DUNIKEY="/.zen/secret.dunikey" # Chemin du fichier de trousseau Ḡ1 de l'émetteur, au format PubSec
|
# Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec
|
||||||
POD="https://data.gchange.fr" # Noeud Gchange utilisé pour l'envoi du message
|
DUNIKEY=/.zen/secret.dunikey
|
||||||
#POD="https://g1.data.duniter.fr" # Noeud Cecium+ utilisé pour l'envoi du message
|
|
||||||
#POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours
|
# Noeud Duniter
|
||||||
#POD="https://g1.data.e-is.pro"
|
NODE=https://g1.librelois.fr/gva
|
||||||
|
|
||||||
|
# Adresse du pod Cesium ou Gchange à utiliser
|
||||||
|
POD=https://g1.data.le-sou.org
|
||||||
|
#POD=https://g1.data.duniter.fr
|
||||||
|
#POD=https://data.gchange.fr
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
DUNIKEY="" # Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec
|
# Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec
|
||||||
#POD="https://g1.data.duniter.fr" # Adresse du pod Cesium ou Gchange à utiliser
|
DUNIKEY=
|
||||||
POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours
|
|
||||||
#POD="https://data.gchange.fr" # Adresse du pod ḠChange à utiliser
|
|
||||||
|
|
||||||
NODE="https://g1.librelois.fr/gva"
|
# Noeud Duniter
|
||||||
|
NODE=https://g1.librelois.fr/gva
|
||||||
|
|
||||||
|
# Adresse du pod Cesium ou Gchange à utiliser
|
||||||
|
POD=https://g1.data.le-sou.org
|
||||||
|
#POD=https://g1.data.duniter.fr
|
||||||
|
#POD=https://data.gchange.fr
|
||||||
|
|
|
@ -22,7 +22,7 @@ Renseignez optionnellement le fichier **.env** (Généré lors de la première t
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: jaklis.py [-h] [-v] [-k KEY] [-n NODE] {read,send,delete,get,set,erase,like,unlike,pay,history,balance} ...
|
usage: jaklis.py [-h] [-v] [-k KEY] [-n NODE] {read,send,delete,get,set,erase,stars,unstars,getoffer,setoffer,deleteoffer,pay,history,balance,id,idBalance} ...
|
||||||
|
|
||||||
Client CLI pour Cesium+ et Ḡchange
|
Client CLI pour Cesium+ et Ḡchange
|
||||||
|
|
||||||
|
@ -33,19 +33,23 @@ optional arguments:
|
||||||
-n NODE, --node NODE Adresse du noeud Cesium+, Gchange ou Duniter à utiliser
|
-n NODE, --node NODE Adresse du noeud Cesium+, Gchange ou Duniter à utiliser
|
||||||
|
|
||||||
Commandes de jaklis:
|
Commandes de jaklis:
|
||||||
{read,send,delete,get,set,erase,like,unlike,pay,history,balance}
|
{read,send,delete,get,set,erase,stars,unstars,getoffer,setoffer,deleteoffer,pay,history,balance,id,idBalance}
|
||||||
read Lecture des messages
|
read Lecture des messages
|
||||||
send Envoi d'un message
|
send Envoi d'un message
|
||||||
delete Supression d'un message
|
delete Supression d'un message
|
||||||
get Voir un profile Cesium+
|
get Voir un profile Cesium+
|
||||||
set Configurer son profile Cesium+
|
set Configurer son profile Cesium+
|
||||||
erase Effacer son profile Cesium+
|
erase Effacer son profile Cesium+
|
||||||
like Voir les likes d'un profile / Liker un profile (option -s NOTE)
|
stars Voir les étoiles d'un profile / Noter un profile (option -s NOTE)
|
||||||
unlike Supprimer un like
|
unstars Supprimer un star
|
||||||
|
getoffer Obtenir les informations d'une annonce gchange
|
||||||
|
setoffer Créer une annonce gchange
|
||||||
|
deleteoffer Supprimer une annonce gchange
|
||||||
pay Payer en Ḡ1
|
pay Payer en Ḡ1
|
||||||
history Voir l'historique des transactions d'un compte Ḡ1
|
history Voir l'historique des transactions d'un compte Ḡ1
|
||||||
balance Voir le solde d'un compte Ḡ1
|
balance Voir le solde d'un compte Ḡ1
|
||||||
|
id Voir l'identité d'une clé publique/username
|
||||||
|
idBalance Voir l'identité d'une clé publique/username et son solde
|
||||||
```
|
```
|
||||||
|
|
||||||
Utilisez `./jaklis CMD -h` où `CMD` est la commande souhaité pour obtenir l'aide détaillé de cette commande.
|
Utilisez `./jaklis CMD -h` où `CMD` est la commande souhaité pour obtenir l'aide détaillé de cette commande.
|
||||||
|
|
|
@ -6,7 +6,7 @@ from shutil import copyfile
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from duniterpy.key import SigningKey
|
from duniterpy.key import SigningKey
|
||||||
|
|
||||||
__version__ = "0.0.2"
|
__version__ = "0.0.4"
|
||||||
|
|
||||||
MY_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) + '/'
|
MY_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) + '/'
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@ deleteoffer_cmd = subparsers.add_parser('deleteoffer', help="Supprimer une annon
|
||||||
pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1")
|
pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1")
|
||||||
history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1")
|
history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1")
|
||||||
balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1")
|
balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1")
|
||||||
|
id_cmd = subparsers.add_parser('id', help="Voir l'identité d'une clé publique/username")
|
||||||
|
id_balance_cmd = subparsers.add_parser('idBalance', help="Voir l'identité d'une clé publique/username et son solde")
|
||||||
|
currentUd = subparsers.add_parser('currentUd', help="Affiche la montant actuel du dividende Universel")
|
||||||
|
|
||||||
# Messages management
|
# Messages management
|
||||||
read_cmd.add_argument('-n', '--number',type=int, default=3, help="Affiche les NUMBER derniers messages")
|
read_cmd.add_argument('-n', '--number',type=int, default=3, help="Affiche les NUMBER derniers messages")
|
||||||
|
@ -94,6 +97,10 @@ history_cmd.add_argument('--nocolors', action='store_true', help="Affiche le r
|
||||||
|
|
||||||
balance_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé")
|
balance_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé")
|
||||||
balance_cmd.add_argument('-m', '--mempool', action='store_true', help="Utilise les sources en Mempool")
|
balance_cmd.add_argument('-m', '--mempool', action='store_true', help="Utilise les sources en Mempool")
|
||||||
|
id_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé")
|
||||||
|
id_cmd.add_argument('-u', '--username', help="Username du compte visé")
|
||||||
|
id_balance_cmd.add_argument('-p', '--pubkey', help="Pubkey du compte visé")
|
||||||
|
currentUd.add_argument('-p', '--pubkey', help="Pubkey du compte visé")
|
||||||
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
@ -130,7 +137,7 @@ try:
|
||||||
except:
|
except:
|
||||||
profile = False
|
profile = False
|
||||||
|
|
||||||
if cmd in ('history','balance','get') and (pubkey or profile):
|
if cmd in ('history','balance','get','id','idBalance') and (pubkey or profile):
|
||||||
noNeedDunikey = True
|
noNeedDunikey = True
|
||||||
keyPath = False
|
keyPath = False
|
||||||
try:
|
try:
|
||||||
|
@ -220,7 +227,7 @@ if cmd in ("read","send","delete","set","get","erase","stars","unstars","getoffe
|
||||||
cesium.deleteOffer(args.id)
|
cesium.deleteOffer(args.id)
|
||||||
|
|
||||||
# Construct GVA object
|
# Construct GVA object
|
||||||
elif cmd in ("pay","history","balance"):
|
elif cmd in ("pay","history","balance","id","idBalance","currentUd"):
|
||||||
from lib.gva import GvaApi
|
from lib.gva import GvaApi
|
||||||
|
|
||||||
if args.node:
|
if args.node:
|
||||||
|
@ -239,10 +246,16 @@ elif cmd in ("pay","history","balance"):
|
||||||
|
|
||||||
if cmd == "pay":
|
if cmd == "pay":
|
||||||
gva.pay(args.amount, args.comment, args.mempool, args.verbose)
|
gva.pay(args.amount, args.comment, args.mempool, args.verbose)
|
||||||
if cmd == "history":
|
elif cmd == "history":
|
||||||
gva.history(args.json, args.nocolors, args.number)
|
gva.history(args.json, args.nocolors, args.number)
|
||||||
if cmd == "balance":
|
elif cmd == "balance":
|
||||||
gva.balance(args.mempool)
|
gva.balance(args.mempool)
|
||||||
|
elif cmd == "id":
|
||||||
|
gva.id(args.pubkey, args.username)
|
||||||
|
elif cmd == "idBalance":
|
||||||
|
gva.idBalance(args.pubkey)
|
||||||
|
elif cmd == "currentUd":
|
||||||
|
gva.currentUd()
|
||||||
|
|
||||||
|
|
||||||
if keyPath:
|
if keyPath:
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -2,7 +2,7 @@ import re, string, random, base64
|
||||||
from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX
|
from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX
|
||||||
from lib.messaging import ReadFromCesium, SendToCesium, DeleteFromCesium
|
from lib.messaging import ReadFromCesium, SendToCesium, DeleteFromCesium
|
||||||
from lib.profiles import Profiles
|
from lib.profiles import Profiles
|
||||||
from lib.likes import ReadLikes, SendLikes, UnLikes
|
from lib.stars import ReadLikes, SendLikes, UnLikes
|
||||||
from lib.offers import Offers
|
from lib.offers import Offers
|
||||||
|
|
||||||
class CesiumPlus(CesiumCommon):
|
class CesiumPlus(CesiumCommon):
|
||||||
|
@ -100,13 +100,14 @@ class CesiumPlus(CesiumCommon):
|
||||||
document = setOffer.configDocSet(title, description, city, localisation, category, price, picture)
|
document = setOffer.configDocSet(title, description, city, localisation, category, price, picture)
|
||||||
result = setOffer.sendDocumentSet(document,'set')
|
result = setOffer.sendDocumentSet(document,'set')
|
||||||
|
|
||||||
print(result)
|
# print(result)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def getOffer(self, id, avatar=None):
|
def getOffer(self, id, avatar=None):
|
||||||
getOffer = Offers(self.dunikey, self.pod, self.noNeedDunikey)
|
getOffer = Offers(self.dunikey, self.pod, self.noNeedDunikey)
|
||||||
|
|
||||||
resultJSON = getOffer.sendDocumentGet(id, 'get')
|
resultJSON = getOffer.sendDocumentGet(id, 'get')
|
||||||
|
# print(resultJSON)
|
||||||
result = getOffer.parseJSON(resultJSON)
|
result = getOffer.parseJSON(resultJSON)
|
||||||
|
|
||||||
print(result)
|
print(result)
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
from lib.currentUd import currentUd
|
||||||
import sys, re
|
import sys, re
|
||||||
from lib.natools import get_privkey
|
from lib.natools import get_privkey
|
||||||
from lib.gvaPay import Transaction, PUBKEY_REGEX
|
from lib.gvaPay import Transaction, PUBKEY_REGEX
|
||||||
from lib.gvaHistory import History
|
from lib.gvaHistory import History
|
||||||
from lib.gvaBalance import Balance
|
from lib.gvaBalance import Balance
|
||||||
|
from lib.gvaID import Id
|
||||||
|
|
||||||
class GvaApi():
|
class GvaApi():
|
||||||
def __init__(self, dunikey, node, pubkey, noNeedDunikey=False):
|
def __init__(self, dunikey, node, pubkey, noNeedDunikey=False):
|
||||||
|
@ -57,3 +59,18 @@ class GvaApi():
|
||||||
gva = Balance(self.dunikey, self.node, self.destPubkey, useMempool)
|
gva = Balance(self.dunikey, self.node, self.destPubkey, useMempool)
|
||||||
balanceValue = gva.sendDoc()
|
balanceValue = gva.sendDoc()
|
||||||
print(balanceValue)
|
print(balanceValue)
|
||||||
|
|
||||||
|
def id(self, pubkey, username):
|
||||||
|
gva = Id(self.dunikey, self.node, pubkey, username)
|
||||||
|
result = gva.sendDoc()
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
def idBalance(self, pubkey):
|
||||||
|
gva = Id(self.dunikey, self.node, pubkey)
|
||||||
|
result = gva.sendDoc(True)
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
def currentUd(self):
|
||||||
|
gva = currentUd(self.node)
|
||||||
|
result = gva.sendDoc()
|
||||||
|
print(result)
|
|
@ -26,7 +26,7 @@ class Balance:
|
||||||
# Build balance generation document
|
# Build balance generation document
|
||||||
queryBuild = gql(
|
queryBuild = gql(
|
||||||
"""
|
"""
|
||||||
query ($pubkey: String!){
|
query ($pubkey: PkOrScriptGva!){
|
||||||
balance(script: $pubkey) {
|
balance(script: $pubkey) {
|
||||||
amount
|
amount
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,10 @@ class Balance:
|
||||||
message = ast.literal_eval(str(e))["message"]
|
message = ast.literal_eval(str(e))["message"]
|
||||||
sys.stderr.write("Echec de récupération du solde:\n" + message + "\n")
|
sys.stderr.write("Echec de récupération du solde:\n" + message + "\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
if (balanceResult['balance'] == None): balanceValue = 'null'
|
||||||
|
else:
|
||||||
|
balanceValue = balanceResult['balance']['amount']/100
|
||||||
|
|
||||||
balanceValue = balanceResult['balance']['amount']/100
|
|
||||||
# print(balanceValue)
|
# print(balanceValue)
|
||||||
return balanceValue
|
return balanceValue
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import sys, re, os.path, json, ast, time
|
import sys, re, os.path, json, ast, time, hashlib
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from duniterpy.key import base58
|
||||||
from termcolor import colored
|
from termcolor import colored
|
||||||
from lib.natools import fmt, sign, get_privkey
|
from lib.natools import fmt, sign, get_privkey
|
||||||
from gql import gql, Client
|
from gql import gql, Client
|
||||||
|
@ -27,9 +28,9 @@ class History:
|
||||||
# Build history generation document
|
# Build history generation document
|
||||||
queryBuild = gql(
|
queryBuild = gql(
|
||||||
"""
|
"""
|
||||||
query ($pubkey: String!, $number: Int!){
|
query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!){
|
||||||
txsHistoryBc(
|
txsHistoryBc(
|
||||||
pubkeyOrScript: $pubkey
|
script: $script
|
||||||
pagination: { pageSize: $number, ord: DESC }
|
pagination: { pageSize: $number, ord: DESC }
|
||||||
) {
|
) {
|
||||||
both {
|
both {
|
||||||
|
@ -55,17 +56,17 @@ class History:
|
||||||
issuers
|
issuers
|
||||||
comment
|
comment
|
||||||
outputs
|
outputs
|
||||||
writtenTime
|
receivedTime
|
||||||
}
|
}
|
||||||
receiving {
|
receiving {
|
||||||
currency
|
currency
|
||||||
issuers
|
issuers
|
||||||
comment
|
comment
|
||||||
outputs
|
outputs
|
||||||
writtenTime
|
receivedTime
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
balance(script: $pubkey) {
|
balance(script: $script) {
|
||||||
amount
|
amount
|
||||||
base
|
base
|
||||||
}
|
}
|
||||||
|
@ -83,7 +84,8 @@ class History:
|
||||||
)
|
)
|
||||||
paramsBuild = {
|
paramsBuild = {
|
||||||
"pubkey": self.pubkey,
|
"pubkey": self.pubkey,
|
||||||
"number": number
|
"number": number,
|
||||||
|
"script": f"SIG({self.pubkey})",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Send history document
|
# Send history document
|
||||||
|
@ -176,8 +178,12 @@ class History:
|
||||||
|
|
||||||
def printHistory(self, trans, noColors):
|
def printHistory(self, trans, noColors):
|
||||||
# Get balance
|
# Get balance
|
||||||
balance = self.historyDoc['balance']['amount']/100
|
if (self.historyDoc['balance'] == None):
|
||||||
balanceUD = round(balance/self.UD, 2)
|
balance = balanceUD = 'null'
|
||||||
|
else:
|
||||||
|
|
||||||
|
balance = self.historyDoc['balance']['amount']/100
|
||||||
|
balanceUD = round(balance/self.UD, 2)
|
||||||
|
|
||||||
# Get currency
|
# Get currency
|
||||||
currency = self.historyDoc['node']['peer']['currency']
|
currency = self.historyDoc['node']['peer']['currency']
|
||||||
|
@ -220,11 +226,12 @@ class History:
|
||||||
print('|', end='')
|
print('|', end='')
|
||||||
print('-'.center(rows-1, '-'))
|
print('-'.center(rows-1, '-'))
|
||||||
print('|', end='')
|
print('|', end='')
|
||||||
printKey = t[2][0:8] + '\u2026' + t[2][-3:]
|
checksum = self.gen_checksum(t[2])
|
||||||
|
shortPubkey = t[2][0:4] + '\u2026' + t[2][-4:] + ':' + checksum
|
||||||
if noColors:
|
if noColors:
|
||||||
print(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment))
|
print(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, shortPubkey, t[3], t[4], comment))
|
||||||
else:
|
else:
|
||||||
print(colored(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment), color))
|
print(colored(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, shortPubkey, t[3], t[4], comment), color))
|
||||||
print('|', end='')
|
print('|', end='')
|
||||||
print('-'.center(rows-1, '-'))
|
print('-'.center(rows-1, '-'))
|
||||||
print('|', end='')
|
print('|', end='')
|
||||||
|
@ -235,6 +242,15 @@ class History:
|
||||||
print(colored('Reçus', 'green'), '-', colored('En cours de réception', 'yellow'), '-', colored('Envoyé', 'blue'), '-', colored("En cours d'envoi", 'red'))
|
print(colored('Reçus', 'green'), '-', colored('En cours de réception', 'yellow'), '-', colored('Envoyé', 'blue'), '-', colored("En cours d'envoi", 'red'))
|
||||||
|
|
||||||
return trans
|
return trans
|
||||||
|
|
||||||
|
def gen_checksum(self, pubkey):
|
||||||
|
"""
|
||||||
|
Returns the checksum of the input pubkey (encoded in b58)
|
||||||
|
thx Matograine
|
||||||
|
"""
|
||||||
|
pubkey_byte = base58.Base58Encoder.decode(str.encode(pubkey))
|
||||||
|
hash = hashlib.sha256(hashlib.sha256(pubkey_byte).digest()).digest()
|
||||||
|
return base58.Base58Encoder.encode(hash)[:3]
|
||||||
|
|
||||||
def jsonHistory(self, transList):
|
def jsonHistory(self, transList):
|
||||||
dailyJSON = []
|
dailyJSON = []
|
||||||
|
|
|
@ -6,7 +6,7 @@ from lib.natools import fmt, sign, get_privkey
|
||||||
from gql import gql, Client
|
from gql import gql, Client
|
||||||
from gql.transport.aiohttp import AIOHTTPTransport
|
from gql.transport.aiohttp import AIOHTTPTransport
|
||||||
|
|
||||||
PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}"
|
PUBKEY_REGEX = "(?![OIl])[0-9A-Za-z]{42,45}"
|
||||||
|
|
||||||
class Transaction:
|
class Transaction:
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ class Transaction:
|
||||||
if self.verbose: print("useMempool:", str(self.useMempool))
|
if self.verbose: print("useMempool:", str(self.useMempool))
|
||||||
queryBuild = gql(
|
queryBuild = gql(
|
||||||
"""
|
"""
|
||||||
query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTx(
|
query ($recipient: PkOrScriptGva!, $issuer: PubKeyGva!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTx(
|
||||||
amount: $amount
|
amount: $amount
|
||||||
comment: $comment
|
comment: $comment
|
||||||
issuer: $issuer
|
issuer: $issuer
|
||||||
|
|
|
@ -1,241 +0,0 @@
|
||||||
import os, sys, ast, requests, json, base58, base64, time, string, random, re
|
|
||||||
from lib.natools import fmt, sign, get_privkey, box_decrypt, box_encrypt
|
|
||||||
from time import sleep
|
|
||||||
from hashlib import sha256
|
|
||||||
from datetime import datetime
|
|
||||||
from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX
|
|
||||||
|
|
||||||
class ReadLikes(CesiumCommon):
|
|
||||||
# Configure JSON document to send
|
|
||||||
def configDoc(self, profile):
|
|
||||||
if not profile: profile = self.pubkey
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
data['query'] = {}
|
|
||||||
data['query']['bool'] = {}
|
|
||||||
data['query']['bool']['filter'] = [
|
|
||||||
{'term': {'index': 'user'}},
|
|
||||||
{'term': {'type': 'profile'}},
|
|
||||||
{'term': {'id': profile}},
|
|
||||||
{'term': {'kind': 'STAR'}}
|
|
||||||
]
|
|
||||||
# data['query']['bool']['should'] = {'term':{'issuer': self.issuer}}
|
|
||||||
data['size'] = 5000
|
|
||||||
data['_source'] = ['issuer','level']
|
|
||||||
data['aggs'] = {
|
|
||||||
'level_sum': {
|
|
||||||
'sum': {
|
|
||||||
'field': 'level'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return json.dumps(data)
|
|
||||||
|
|
||||||
def sendDocument(self, document):
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
'Content-type': 'application/json',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send JSON document and get JSON result
|
|
||||||
result = requests.post('{0}/like/record/_search'.format(self.pod), headers=headers, data=document)
|
|
||||||
|
|
||||||
if result.status_code == 200:
|
|
||||||
# print(result.text)
|
|
||||||
return result.text
|
|
||||||
else:
|
|
||||||
sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n')
|
|
||||||
|
|
||||||
def parseResult(self, result):
|
|
||||||
result = json.loads(result)
|
|
||||||
totalLikes = result['hits']['total']
|
|
||||||
totalValue = result['aggregations']['level_sum']['value']
|
|
||||||
if totalLikes:
|
|
||||||
score = totalValue/totalLikes
|
|
||||||
else:
|
|
||||||
score = 0
|
|
||||||
raw = result['hits']['hits']
|
|
||||||
finalPrint = {}
|
|
||||||
finalPrint['likes'] = []
|
|
||||||
for i in raw:
|
|
||||||
issuer = i['_source']['issuer']
|
|
||||||
# print(issuer)
|
|
||||||
gProfile = self.getProfile(issuer)
|
|
||||||
try:
|
|
||||||
pseudo = gProfile['title']
|
|
||||||
except:
|
|
||||||
pseudo = ''
|
|
||||||
try:
|
|
||||||
payTo = gProfile['pubkey']
|
|
||||||
except:
|
|
||||||
payTo = ''
|
|
||||||
id = i['_id']
|
|
||||||
level = i['_source']['level']
|
|
||||||
if issuer == self.pubkey:
|
|
||||||
finalPrint['yours'] = { 'id' : id, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level }
|
|
||||||
else:
|
|
||||||
finalPrint['likes'].append({ 'issuer' : issuer, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level })
|
|
||||||
finalPrint['score'] = score
|
|
||||||
|
|
||||||
return json.dumps(finalPrint)
|
|
||||||
|
|
||||||
def getProfile(self, profile):
|
|
||||||
headers = {
|
|
||||||
'Content-type': 'application/json',
|
|
||||||
}
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
data['query'] = {}
|
|
||||||
data['query']['bool'] = {}
|
|
||||||
data['query']['bool']['filter'] = [
|
|
||||||
{'term': {'_index': 'user'}},
|
|
||||||
{'term': {'_type': 'profile'}},
|
|
||||||
{'term': {'_id': profile}}
|
|
||||||
]
|
|
||||||
data['_source'] = ['title','pubkey']
|
|
||||||
|
|
||||||
data = json.dumps(data)
|
|
||||||
|
|
||||||
result = requests.post('{0}/user/profile/_search'.format(self.pod), headers=headers, data=data)
|
|
||||||
result = json.loads(result.text)['hits']['hits']
|
|
||||||
for i in result:
|
|
||||||
return i['_source']
|
|
||||||
|
|
||||||
|
|
||||||
#################### Like class ####################
|
|
||||||
|
|
||||||
|
|
||||||
class SendLikes(CesiumCommon):
|
|
||||||
# Configure JSON document to send
|
|
||||||
def configDoc(self, profile, likes):
|
|
||||||
if not profile: profile = self.pubkey
|
|
||||||
if likes not in range(0, 6):
|
|
||||||
sys.stderr.write('Votre like doit être compris entre 0 et 5.\n')
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
timeSent = int(time.time())
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
data['version'] = 2
|
|
||||||
data['index'] = "user"
|
|
||||||
data['type'] = "profile"
|
|
||||||
data['id'] = profile
|
|
||||||
data['kind'] = "STAR"
|
|
||||||
data['level'] = likes
|
|
||||||
data['time'] = timeSent
|
|
||||||
data['issuer'] = self.pubkey
|
|
||||||
|
|
||||||
document = json.dumps(data)
|
|
||||||
|
|
||||||
# Generate hash of document
|
|
||||||
hashDoc = sha256(document.encode()).hexdigest().upper()
|
|
||||||
|
|
||||||
# Generate signature of document
|
|
||||||
signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode()
|
|
||||||
|
|
||||||
# Build final document
|
|
||||||
data = {}
|
|
||||||
data['hash'] = hashDoc
|
|
||||||
data['signature'] = signature
|
|
||||||
signJSON = json.dumps(data)
|
|
||||||
finalJSON = {**json.loads(signJSON), **json.loads(document)}
|
|
||||||
finalDoc = json.dumps(finalJSON)
|
|
||||||
|
|
||||||
return finalDoc
|
|
||||||
|
|
||||||
def sendDocument(self, document, pubkey):
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
'Content-type': 'application/json',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send JSON document and get JSON result
|
|
||||||
result = requests.post('{0}/user/profile/:id/_like'.format(self.pod), headers=headers, data=document)
|
|
||||||
|
|
||||||
if result.status_code == 200:
|
|
||||||
print("Profile liké avec succès !")
|
|
||||||
return result.text
|
|
||||||
elif result.status_code == 400:
|
|
||||||
resultJson = json.loads(result.text)
|
|
||||||
if 'DuplicatedDocumentException' in resultJson['error']:
|
|
||||||
rmLike = UnLikes(self.dunikey, self.pod)
|
|
||||||
idLike = rmLike.checkLike(pubkey)
|
|
||||||
if idLike:
|
|
||||||
document = rmLike.configDoc(idLike)
|
|
||||||
rmLike.sendDocument(document, True)
|
|
||||||
sleep(0.5)
|
|
||||||
self.sendDocument(document, pubkey)
|
|
||||||
return resultJson['error']
|
|
||||||
else:
|
|
||||||
sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n')
|
|
||||||
else:
|
|
||||||
resultJson = json.loads(result.text)
|
|
||||||
sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n')
|
|
||||||
|
|
||||||
|
|
||||||
#################### Unlike class ####################
|
|
||||||
|
|
||||||
|
|
||||||
class UnLikes(CesiumCommon):
|
|
||||||
# Check if you liked this profile
|
|
||||||
def checkLike(self, pubkey):
|
|
||||||
readProfileLikes = ReadLikes(self.dunikey, self.pod)
|
|
||||||
document = readProfileLikes.configDoc(pubkey)
|
|
||||||
result = readProfileLikes.sendDocument(document)
|
|
||||||
result = readProfileLikes.parseResult(result)
|
|
||||||
result = json.loads(result)
|
|
||||||
|
|
||||||
if 'yours' in result:
|
|
||||||
myLike = result['yours']['id']
|
|
||||||
return myLike
|
|
||||||
else:
|
|
||||||
sys.stderr.write("Vous n'avez pas liké ce profile\n")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Configure JSON document to send
|
|
||||||
def configDoc(self, idLike):
|
|
||||||
timeSent = int(time.time())
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
data['version'] = 2
|
|
||||||
data['index'] = "like"
|
|
||||||
data['type'] = "record"
|
|
||||||
data['id'] = idLike
|
|
||||||
data['issuer'] = self.pubkey
|
|
||||||
data['time'] = timeSent
|
|
||||||
|
|
||||||
document = json.dumps(data)
|
|
||||||
|
|
||||||
# Generate hash of document
|
|
||||||
hashDoc = sha256(document.encode()).hexdigest().upper()
|
|
||||||
|
|
||||||
# Generate signature of document
|
|
||||||
signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode()
|
|
||||||
|
|
||||||
# Build final document
|
|
||||||
data = {}
|
|
||||||
data['hash'] = hashDoc
|
|
||||||
data['signature'] = signature
|
|
||||||
signJSON = json.dumps(data)
|
|
||||||
finalJSON = {**json.loads(signJSON), **json.loads(document)}
|
|
||||||
finalDoc = json.dumps(finalJSON)
|
|
||||||
|
|
||||||
return finalDoc
|
|
||||||
|
|
||||||
def sendDocument(self, document, silent):
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
'Content-type': 'application/json',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send JSON document and get JSON result
|
|
||||||
result = requests.post('{0}/history/delete'.format(self.pod), headers=headers, data=document)
|
|
||||||
|
|
||||||
if result.status_code == 200:
|
|
||||||
if not silent:
|
|
||||||
print("Like supprimé avec succès !")
|
|
||||||
return result.text
|
|
||||||
else:
|
|
||||||
sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n')
|
|
|
@ -1,6 +1,7 @@
|
||||||
import os, sys, ast, requests, json, base58, base64
|
import os, sys, ast, requests, json, base58, base64
|
||||||
from time import time
|
from time import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from termcolor import colored
|
||||||
from lib.natools import fmt, get_privkey, box_decrypt, box_encrypt
|
from lib.natools import fmt, get_privkey, box_decrypt, box_encrypt
|
||||||
from lib.cesiumCommon import CesiumCommon, pp_json, PUBKEY_REGEX
|
from lib.cesiumCommon import CesiumCommon, pp_json, PUBKEY_REGEX
|
||||||
|
|
||||||
|
@ -56,11 +57,11 @@ class ReadFromCesium(CesiumCommon):
|
||||||
nbrMsg = totalMsg
|
nbrMsg = totalMsg
|
||||||
|
|
||||||
if totalMsg == 0:
|
if totalMsg == 0:
|
||||||
print("Aucun message à afficher.")
|
print(colored("Aucun message à afficher.", 'yellow'))
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
infoTotal = " Nombre de messages: " + str(nbrMsg) + "/" + str(totalMsg) + " "
|
infoTotal = " Nombre de messages: " + str(nbrMsg) + "/" + str(totalMsg) + " "
|
||||||
print(infoTotal.center(rows, '#'))
|
print(colored(infoTotal.center(rows, '#'), "yellow"))
|
||||||
for hits in msgJSON["hits"]:
|
for hits in msgJSON["hits"]:
|
||||||
self.idMsg = hits["_id"]
|
self.idMsg = hits["_id"]
|
||||||
msgSrc = hits["_source"]
|
msgSrc = hits["_source"]
|
||||||
|
@ -76,19 +77,19 @@ class ReadFromCesium(CesiumCommon):
|
||||||
headerMsg = startHeader + date + "(ID: {})".format(self.idMsg) + " "
|
headerMsg = startHeader + date + "(ID: {})".format(self.idMsg) + " "
|
||||||
|
|
||||||
print('-'.center(rows, '-'))
|
print('-'.center(rows, '-'))
|
||||||
print(headerMsg.center(rows+9, '-'))
|
print(colored(headerMsg, "blue").center(rows+9, '-'))
|
||||||
print('-'.center(rows, '-'))
|
print('-'.center(rows, '-'))
|
||||||
try:
|
try:
|
||||||
self.title = decrypt(msgSrc["title"])
|
self.title = decrypt(msgSrc["title"])
|
||||||
self.content = decrypt(msgSrc["content"])
|
self.content = decrypt(msgSrc["content"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.stderr.write(str(e) + '\n')
|
sys.stderr.write(colored(str(e), 'red') + '\n')
|
||||||
pp_json(hits)
|
pp_json(hits)
|
||||||
continue
|
continue
|
||||||
print('\033[1m' + self.title + '\033[0m')
|
print('\033[1m' + self.title + '\033[0m')
|
||||||
print(self.content)
|
print(self.content)
|
||||||
|
|
||||||
print(infoTotal.center(rows, '#'))
|
print(colored(infoTotal.center(rows, '#'), "yellow"))
|
||||||
|
|
||||||
# Parse JSON result and display messages
|
# Parse JSON result and display messages
|
||||||
def jsonMessages(self, msgJSON, nbrMsg, outbox):
|
def jsonMessages(self, msgJSON, nbrMsg, outbox):
|
||||||
|
@ -124,7 +125,7 @@ class ReadFromCesium(CesiumCommon):
|
||||||
self.title = decrypt(msgSrc["title"])
|
self.title = decrypt(msgSrc["title"])
|
||||||
self.content = decrypt(msgSrc["content"])
|
self.content = decrypt(msgSrc["content"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.stderr.write(str(e) + '\n')
|
sys.stderr.write(colored(str(e), 'red') + '\n')
|
||||||
pp_json(hits)
|
pp_json(hits)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -182,7 +183,7 @@ class SendToCesium(CesiumCommon):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
if result.status_code == 200:
|
if result.status_code == 200:
|
||||||
print("Message envoyé avec succès !")
|
print(colored("Message envoyé avec succès !", "green"))
|
||||||
print("ID: " + result.text)
|
print("ID: " + result.text)
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
|
@ -225,11 +226,11 @@ class DeleteFromCesium(CesiumCommon):
|
||||||
elif result.status_code == 403:
|
elif result.status_code == 403:
|
||||||
raise ValueError("Vous n'êtes pas l'auteur de ce message.")
|
raise ValueError("Vous n'êtes pas l'auteur de ce message.")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.stderr.write("Impossible de supprimer le message {0}:\n".format(idMsg) + str(e) + "\n")
|
sys.stderr.write(colored("Impossible de supprimer le message {0}:\n".format(idMsg), 'red') + str(e) + "\n")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if result.status_code == 200:
|
if result.status_code == 200:
|
||||||
print("Message {0} supprimé avec succès !".format(idMsg))
|
print(colored("Message {0} supprimé avec succès !".format(idMsg), "green"))
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
sys.stderr.write("Erreur inconnue.")
|
sys.stderr.write("Erreur inconnue.")
|
||||||
|
|
|
@ -25,8 +25,7 @@ class Offers(CesiumCommon):
|
||||||
data['thumbnail']['_content'] = picture
|
data['thumbnail']['_content'] = picture
|
||||||
data['thumbnail']['_content_type'] = "image/png"
|
data['thumbnail']['_content_type'] = "image/png"
|
||||||
# if category: data['category'] = category
|
# if category: data['category'] = category
|
||||||
# else: data['category'] = {"parent":"cat24","localizedNames":{"en":"CD / Music","es-ES":"CDs / M\u00fasica","fr-FR":"CD / Musique"},"name":"CD / Musique","id":"cat26"}
|
# else:
|
||||||
# data['category'] = {"parent":"cat90","localizedNames":{"en":"Fruits & Vegetables","es-ES":"Frutas y Vegetales","fr-FR":"Fruits & Légumes"},"name":"Fruits & Légumes","id":"cat92"}
|
|
||||||
data['category'] = {"parent":"cat24","localizedNames":{"en":"DVD / Films","es-ES":"DVDs / Cine","fr-FR":"DVD / Films"},"name":"DVD / Films","id":"cat25"}
|
data['category'] = {"parent":"cat24","localizedNames":{"en":"DVD / Films","es-ES":"DVDs / Cine","fr-FR":"DVD / Films"},"name":"DVD / Films","id":"cat25"}
|
||||||
if price: data['price'] = float(price) * 100
|
if price: data['price'] = float(price) * 100
|
||||||
data['type'] = 'offer'
|
data['type'] = 'offer'
|
||||||
|
@ -95,11 +94,13 @@ class Offers(CesiumCommon):
|
||||||
if type == 'set':
|
if type == 'set':
|
||||||
reqQuery = '{0}/market/record'.format(self.pod)
|
reqQuery = '{0}/market/record'.format(self.pod)
|
||||||
elif type == 'get':
|
elif type == 'get':
|
||||||
reqQuery = '{0}/market/record/{1}?_source=category,title,description,issuer,time,creationTime,location,address,city,price,unit,currency,thumbnail._content_type,picturesCount,type,stock,fees,feesCurrency,geoPoint,pubkey,freePrice'.format(self.pod, id)
|
reqQuery = '{0}/market/record/{1}?_source=category,title,description,issuer,time,creationTime,location,address,city,price,unit,currency,thumbnail._content_type,thumbnail._content,picturesCount,type,stock,fees,feesCurrency,geoPoint,pubkey,freePrice'.format(self.pod, id)
|
||||||
elif type == 'erase':
|
elif type == 'erase':
|
||||||
reqQuery = '{0}/market/delete'.format(self.pod)
|
reqQuery = '{0}/market/delete'.format(self.pod)
|
||||||
|
|
||||||
|
|
||||||
result = requests.get(reqQuery, headers=headers)
|
result = requests.get(reqQuery, headers=headers)
|
||||||
|
# print(result)
|
||||||
if result.status_code == 200:
|
if result.status_code == 200:
|
||||||
# print(result.text)
|
# print(result.text)
|
||||||
return result.text
|
return result.text
|
||||||
|
|
|
@ -68,7 +68,7 @@ class Profiles(CesiumCommon):
|
||||||
}
|
}
|
||||||
},"from":0,
|
},"from":0,
|
||||||
"size":100,
|
"size":100,
|
||||||
"_source":["title", avatar,"description","city","address","socials.url","creationTime","membersCount","type"],
|
"_source":["title", avatar,"description","city","address","socials.url","creationTime","membersCount","type","geoPoint"],
|
||||||
"indices_boost":{"user":100,"page":1,"group":0.01
|
"indices_boost":{"user":100,"page":1,"group":0.01
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
wheel
|
wheel
|
||||||
base58
|
base58
|
||||||
pybase64
|
pybase64
|
||||||
duniterpy
|
duniterpy==0.62.0
|
||||||
termcolor
|
termcolor
|
||||||
python-dotenv
|
python-dotenv
|
||||||
|
gql==3.0.0a5
|
||||||
|
#gql==2.0
|
||||||
requests
|
requests
|
||||||
|
|
|
@ -18,6 +18,14 @@ MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
|
||||||
SMSADMIN="$(cat /home/pi/.zen/SMSADMIN)" ## FRENCH NUMBER
|
SMSADMIN="$(cat /home/pi/.zen/SMSADMIN)" ## FRENCH NUMBER
|
||||||
[[ ${SMSADMIN#"$prefix"} != "${SMSADMIN}" ]] && smsadmin=0${SMSADMIN#"$prefix"} || smsadmin="${SMSADMIN}" ## 06
|
[[ ${SMSADMIN#"$prefix"} != "${SMSADMIN}" ]] && smsadmin=0${SMSADMIN#"$prefix"} || smsadmin="${SMSADMIN}" ## 06
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
## CHECK MADEINZION INTERNET SERVICES CONNEXION
|
||||||
|
ping -q -w 1 -c 1 data.gchange.fr 2>&1>/dev/null && echo "GCHANGE+ OK" && GCHANGE=1 || GCHANGE=0
|
||||||
|
ping -q -w 1 -c 1 g1.data.e-is.pro 2>&1>/dev/null && echo "CESIUM+ OK" && CESIUM=1 || CESIUM=0
|
||||||
|
ping -q -w 1 -c 1 oasis.astroport.com 2>&1>/dev/null && echo "OASIS OK" && OASIS=1 || OASIS=0
|
||||||
|
ping -q -w 1 -c 1 taurus.copylaradio.com 2>&1>/dev/null && echo "TAURUS OK" && TAURUS=1 || TAURUS=0
|
||||||
|
########################################################################
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# GET INCOMING SMS CONTENT
|
# GET INCOMING SMS CONTENT
|
||||||
########################################################################
|
########################################################################
|
||||||
|
@ -31,7 +39,20 @@ PHONE="$SMS_1_NUMBER" # gammu-smsd
|
||||||
|
|
||||||
TEXT="$SMS_1_TEXT" # gammu-smsd
|
TEXT="$SMS_1_TEXT" # gammu-smsd
|
||||||
[[ ! ${TEXT} ]] && TEXT="$2" # CLI MODE
|
[[ ! ${TEXT} ]] && TEXT="$2" # CLI MODE
|
||||||
[[ "${TEXT}" == "" ]] && TEXT="TEST : ABC : 12345*" # TEST MESSAGE
|
[[ "${TEXT}" == "" ]] && echo "SMS IS EMPTY - EXIT -" && exit 1
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# INTERNET CONNEXION NOT OK
|
||||||
|
########################################################################
|
||||||
|
if [[ $GCHANGE == 0 ]]; then
|
||||||
|
echo "GCHANGE UNREACHABLE => CREATING timestamp.replay.sh - EXIT -"
|
||||||
|
echo "#!/bin/bash
|
||||||
|
sudo $MY_PATH/sms_received \"${PHONE}\" \"${TEXT}\"" > /home/${YOU}/.zen/SMS/$(date -u +%s%N | cut -b1-13).replay.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
########################################################################
|
||||||
|
# INTERNET CONNEXION NOT OK
|
||||||
|
########################################################################
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
## LOG
|
## LOG
|
||||||
|
@ -43,7 +64,7 @@ echo "TEXT: $TEXT"
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# SWITCH CASE
|
# SWITCH CASE DEPENDING ON SMS TEXT FIRST WORD
|
||||||
########################################################################
|
########################################################################
|
||||||
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
CMD=$(echo "$TEXT" | awk '{print toupper($1)}')
|
||||||
echo "COMMAND = $CMD"
|
echo "COMMAND = $CMD"
|
||||||
|
@ -55,11 +76,6 @@ case "$CMD" in
|
||||||
$MY_PATH/sms/AIDE.sh "$phone" &
|
$MY_PATH/sms/AIDE.sh "$phone" &
|
||||||
;;
|
;;
|
||||||
|
|
||||||
TEST)
|
|
||||||
echo "TEST: sending ___ $TEXT _to_ $phone"
|
|
||||||
gammu-smsd-inject TEXT "$phone" -text "$TEXT"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "MESSAGE DE $phone POUR $CMD"
|
echo "MESSAGE DE $phone POUR $CMD"
|
||||||
MESSAGE=$(echo "$TEXT" | cut -d ' ' -f 2-)
|
MESSAGE=$(echo "$TEXT" | cut -d ' ' -f 2-)
|
||||||
|
@ -81,5 +97,5 @@ esac
|
||||||
# [[ "$phone" != "$smsadmin" ]] && gammu-smsd-inject TEXT "$smsadmin" -text "$phone : $TEXT"
|
# [[ "$phone" != "$smsadmin" ]] && gammu-smsd-inject TEXT "$smsadmin" -text "$phone : $TEXT"
|
||||||
|
|
||||||
## FILESYSTEM RIGHTS CORRECTION
|
## FILESYSTEM RIGHTS CORRECTION
|
||||||
chown -R pi:pi /home/pi/.zen
|
chown -R pi:pi /home/pi/.zen/SMS
|
||||||
exit 0
|
exit 0
|
||||||
|
|
Loading…
Reference in New Issue