modulitiz-micro 2.40.0__py311-none-any.whl → 2.42.0__py311-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- modulitiz_micro/ModuloMeteo.py +72 -72
- modulitiz_micro/ModuloSeriale.py +70 -70
- modulitiz_micro/ModuloTarghe.py +47 -46
- modulitiz_micro/database/AbstractDatabaseService.py +13 -13
- modulitiz_micro/database/AbstractSql.py +69 -69
- modulitiz_micro/database/ModuloSqlOracle.py +19 -19
- modulitiz_micro/database/ModuloSqlServer.py +43 -43
- modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
- modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
- modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
- modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
- modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
- modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
- modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
- modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
- modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
- modulitiz_micro/files/cache/DatabaseCache.py +91 -91
- modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
- modulitiz_micro/files/git/ModuloGit.py +28 -28
- modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
- modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
- modulitiz_micro/gestionedom/GestioneDom.py +44 -44
- modulitiz_micro/iot/ModuleIotDevice.py +4 -4
- modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
- modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
- modulitiz_micro/rete/ModuloNetworking.py +72 -72
- modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
- modulitiz_micro/rete/email/EmailBean.py +5 -5
- modulitiz_micro/rete/email/ModuloEmail.py +90 -90
- modulitiz_micro/rete/http/ModuloHttp.py +119 -119
- modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
- modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
- modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
- modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
- modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
- modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
- modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
- modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
- modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
- modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
- modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
- modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
- modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
- modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
- modulitiz_micro/util/scheduler/{AbstractScheduler.py → ModuleScheduler.py} +26 -32
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/METADATA +58 -65
- modulitiz_micro-2.42.0.dist-info/RECORD +56 -0
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/WHEEL +1 -1
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info/licenses}/LICENSE +21 -21
- modulitiz_micro/ModuleEnum.py +0 -8
- modulitiz_micro/ModuloBase64.py +0 -61
- modulitiz_micro/ModuloColorText.py +0 -35
- modulitiz_micro/ModuloDate.py +0 -295
- modulitiz_micro/ModuloFunzioni.py +0 -71
- modulitiz_micro/ModuloListe.py +0 -150
- modulitiz_micro/ModuloNumeri.py +0 -127
- modulitiz_micro/ModuloPyinstaller.py +0 -29
- modulitiz_micro/ModuloStatistiche.py +0 -31
- modulitiz_micro/ModuloStringhe.py +0 -180
- modulitiz_micro/android/ModuloAndroid.py +0 -18
- modulitiz_micro/android/ModuloAndroidAdb.py +0 -48
- modulitiz_micro/android/ModuloAndroidSim.py +0 -130
- modulitiz_micro/android/beans/SmsBean.py +0 -12
- modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +0 -17
- modulitiz_micro/eccezioni/EccezioneBase.py +0 -7
- modulitiz_micro/eccezioni/EccezioneRuntime.py +0 -7
- modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +0 -7
- modulitiz_micro/files/ModuloFiles.py +0 -173
- modulitiz_micro/files/ModuloLogging.py +0 -69
- modulitiz_micro/files/ModuloZip.py +0 -42
- modulitiz_micro/files/cache/CacheBean.py +0 -5
- modulitiz_micro/files/cache/CacheRam.py +0 -29
- modulitiz_micro/init/AbstractBasicInit.py +0 -27
- modulitiz_micro/init/AbstractInit.py +0 -11
- modulitiz_micro/multithread/ModuloThread.py +0 -26
- modulitiz_micro/multithread/ModuloThreadLogger.py +0 -8
- modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +0 -25
- modulitiz_micro/nlp/ModuloNlp.py +0 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +0 -59
- modulitiz_micro/sistema/EnvVarsEnum.py +0 -9
- modulitiz_micro/sistema/ModuloSystem.py +0 -298
- modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +0 -11
- modulitiz_micro/util/beans/conf/AbstractConfBean.py +0 -16
- modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +0 -11
- modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +0 -13
- modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +0 -34
- modulitiz_micro/util/decorators/noAwait.py +0 -23
- modulitiz_micro/util/pip/AbstractModuloPip.py +0 -41
- modulitiz_micro/util/pip/ModuloPip.py +0 -49
- modulitiz_micro/util/spooler/AbstractSpooler.py +0 -14
- modulitiz_micro/util/spooler/Spooler.py +0 -18
- modulitiz_micro/util/spooler/beans/QueueBean.py +0 -8
- modulitiz_micro/util/spooler/decorators/spooler.py +0 -49
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +0 -7
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +0 -7
- modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +0 -31
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +0 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +0 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +0 -118
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +0 -89
- modulitiz_micro/util/wheel/ModuloToml.py +0 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +0 -12
- modulitiz_micro-2.40.0.dist-info/RECORD +0 -109
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/top_level.txt +0 -0
modulitiz_micro/ModuloNumeri.py
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
class ModuloNumeri(object):
|
2
|
-
"""
|
3
|
-
Utility di gestione dei numeri, sia interi (senza virgola) che floating-point (con decimali) che con o senza segno.
|
4
|
-
"""
|
5
|
-
|
6
|
-
UNO_DIVISO_1024=0.0009765625
|
7
|
-
|
8
|
-
NUMERI_CARDINALI={
|
9
|
-
0:"zero",
|
10
|
-
1:"uno",
|
11
|
-
2:"due",
|
12
|
-
3:"tre",
|
13
|
-
4:"quattro",
|
14
|
-
5:"cinque",
|
15
|
-
6:"sei",
|
16
|
-
7:"sette",
|
17
|
-
8:"otto",
|
18
|
-
9:"nove",
|
19
|
-
10:"dieci",
|
20
|
-
11:"undici"
|
21
|
-
}
|
22
|
-
|
23
|
-
NUMERI_ORDINALI={
|
24
|
-
"primo":1,
|
25
|
-
}
|
26
|
-
|
27
|
-
@staticmethod
|
28
|
-
def isInt(valore)->bool:
|
29
|
-
"""
|
30
|
-
Determina se un valore può essere considerato un numero intero.
|
31
|
-
"""
|
32
|
-
try:
|
33
|
-
int(valore)
|
34
|
-
return True
|
35
|
-
except ValueError:
|
36
|
-
return False
|
37
|
-
|
38
|
-
@staticmethod
|
39
|
-
def isFloat(valore)->bool:
|
40
|
-
"""
|
41
|
-
Determina se un valore può essere considerato un numero con la virgola.
|
42
|
-
"""
|
43
|
-
try:
|
44
|
-
float(valore)
|
45
|
-
return True
|
46
|
-
except ValueError:
|
47
|
-
return False
|
48
|
-
|
49
|
-
@staticmethod
|
50
|
-
def strToInt(valore:str)->int|None:
|
51
|
-
"""
|
52
|
-
Converte una stringa in numero intero.
|
53
|
-
"""
|
54
|
-
try:
|
55
|
-
return int(valore)
|
56
|
-
except ValueError:
|
57
|
-
return None
|
58
|
-
|
59
|
-
@staticmethod
|
60
|
-
def intToBool(valore:int)->bool:
|
61
|
-
"""
|
62
|
-
Converte un numero intero in valore booleano (o binario).
|
63
|
-
"""
|
64
|
-
return int(valore)==1
|
65
|
-
|
66
|
-
@staticmethod
|
67
|
-
def boolToInt(valore:bool)->int:
|
68
|
-
"""
|
69
|
-
Converte un valore booleano (o binario) in numero intero.
|
70
|
-
"""
|
71
|
-
return int(valore)
|
72
|
-
|
73
|
-
@classmethod
|
74
|
-
def byteToKilobyte(cls,byte:int)->int:
|
75
|
-
"""
|
76
|
-
Converte un numero di byte in KB
|
77
|
-
"""
|
78
|
-
return int(byte*cls.UNO_DIVISO_1024)
|
79
|
-
@classmethod
|
80
|
-
def byteToMegabyte(cls,byte:int)->int:
|
81
|
-
"""
|
82
|
-
Converte un numero di byte in MB
|
83
|
-
"""
|
84
|
-
return int(cls.byteToKilobyte(byte)*cls.UNO_DIVISO_1024)
|
85
|
-
|
86
|
-
@classmethod
|
87
|
-
def versionStrToInt(cls,testo:str)->int:
|
88
|
-
"""
|
89
|
-
Converte la stringa di una versione in intero.
|
90
|
-
NB: la versione andrebbe sempre trattata come una stringa.
|
91
|
-
"""
|
92
|
-
arr=testo.split(".")
|
93
|
-
testoPadded="".join([x.ljust(4,"0") for x in arr])
|
94
|
-
return cls.strToInt(testoPadded)
|
95
|
-
|
96
|
-
@staticmethod
|
97
|
-
def humanFormat(num: int) -> str:
|
98
|
-
"""
|
99
|
-
Formatta un numero in modo che sia più leggibile.
|
100
|
-
"""
|
101
|
-
magnitude=0
|
102
|
-
while abs(num)>=1000:
|
103
|
-
magnitude+=1
|
104
|
-
num/=1000.0
|
105
|
-
return '%.2f%s'%(num,['','K','M','G','T','P'][magnitude])
|
106
|
-
|
107
|
-
@staticmethod
|
108
|
-
def decimalNumbersTruncate(value:float,decimals:int)->float:
|
109
|
-
"""
|
110
|
-
Rimuove la quantità di decimali voluta da un valore.
|
111
|
-
Il valore 1.234 se viene troncato a 2 decimali diventa 1.23
|
112
|
-
"""
|
113
|
-
factor=10**decimals
|
114
|
-
return int(value*factor)/factor
|
115
|
-
|
116
|
-
@classmethod
|
117
|
-
def numberToWord(cls,numero:int)->str:
|
118
|
-
"""
|
119
|
-
Converte un numero in parola.
|
120
|
-
"""
|
121
|
-
return cls.NUMERI_CARDINALI[numero]
|
122
|
-
@classmethod
|
123
|
-
def wordToNumber(cls,parola:str)->int:
|
124
|
-
"""
|
125
|
-
Converte una parola in numero.
|
126
|
-
"""
|
127
|
-
return cls.NUMERI_ORDINALI[parola]
|
@@ -1,29 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
5
|
-
|
6
|
-
|
7
|
-
class ModuloPyinstaller(object):
|
8
|
-
"""
|
9
|
-
Utility di gestione del modulo che permette di compilare sorgenti e interprete in un file eseguibile unico (exe)
|
10
|
-
"""
|
11
|
-
|
12
|
-
@staticmethod
|
13
|
-
def isExecutableMode()->bool:
|
14
|
-
"""
|
15
|
-
Identifica se lo script viene eseguito da un eseguibile o meno.
|
16
|
-
"""
|
17
|
-
return getattr(sys, 'frozen', False)
|
18
|
-
|
19
|
-
@classmethod
|
20
|
-
def cdProjectsDir(cls):
|
21
|
-
"""
|
22
|
-
Se questo metodo non viene chiamato da un eseguibile costruito con PyInstaller fa nulla,
|
23
|
-
altrimenti cambia la cartella corrente alla root dei progetti.
|
24
|
-
"""
|
25
|
-
if cls.isExecutableMode() is False:
|
26
|
-
return
|
27
|
-
pathExecutableDir=os.path.dirname(sys.executable)
|
28
|
-
originalPath=os.path.abspath(ModuloFiles.pathJoin(pathExecutableDir,"../"))
|
29
|
-
os.chdir(originalPath)
|
@@ -1,31 +0,0 @@
|
|
1
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
2
|
-
from modulitiz_micro.ModuloNumeri import ModuloNumeri
|
3
|
-
|
4
|
-
|
5
|
-
class ModuloStatistiche(object):
|
6
|
-
"""
|
7
|
-
Utility per la gestione delle statistiche.
|
8
|
-
"""
|
9
|
-
|
10
|
-
@staticmethod
|
11
|
-
def calcolaProgresso(index:int, contaElementiElaborati:int, totElementi:int, secsInizio:int)->str:
|
12
|
-
"""
|
13
|
-
Calcola il tempo rimanente alla fine dell'elaborazione di un certo numero di elementi in base al trend attuale.
|
14
|
-
:param index: deve partire da 0
|
15
|
-
:param contaElementiElaborati: deve partire da 1
|
16
|
-
:param totElementi: numero totale di elementi
|
17
|
-
:param secsInizio: timestamp di inizio elaborazione
|
18
|
-
"""
|
19
|
-
secsFine=ModuloDate.getSecs()
|
20
|
-
percentuale=int((index*100) / totElementi)
|
21
|
-
|
22
|
-
secondiTrascorsi=secsFine - secsInizio
|
23
|
-
elementiRimanenti=totElementi - index
|
24
|
-
secondiRimanenti=int((secondiTrascorsi / contaElementiElaborati) * elementiRimanenti)
|
25
|
-
tempoRimanente=ModuloDate.dateToString(ModuloDate.timestampUtcToDate(secondiRimanenti),ModuloDate.FORMATO_ORA)
|
26
|
-
|
27
|
-
# se i numeri sono alti li conveto in un formato più leggibile
|
28
|
-
index=ModuloNumeri.humanFormat(index)
|
29
|
-
totElementi=ModuloNumeri.humanFormat(totElementi)
|
30
|
-
msg="Progresso: {:<5}/{}, percentuale: {:<3}%, tempo rimanente: {}".format(index, totElementi, percentuale, tempoRimanente)
|
31
|
-
return msg
|
@@ -1,180 +0,0 @@
|
|
1
|
-
import locale
|
2
|
-
import random
|
3
|
-
import string
|
4
|
-
|
5
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
6
|
-
|
7
|
-
|
8
|
-
class ModuloStringhe(object):
|
9
|
-
"""
|
10
|
-
Utility di gestione delle stringhe.
|
11
|
-
"""
|
12
|
-
|
13
|
-
CODIFICA_ASCII="ascii"
|
14
|
-
CODIFICA_LATIN1="latin_1"
|
15
|
-
CODIFICA_UTF8="utf-8"
|
16
|
-
|
17
|
-
SEP=r"//||//"
|
18
|
-
|
19
|
-
@classmethod
|
20
|
-
def setLocaleItalian(cls):
|
21
|
-
"""
|
22
|
-
Necessario per avere, ad esempio, il giorno della settimana nella lingua corretta.
|
23
|
-
"""
|
24
|
-
cls.setLocale("it_IT")
|
25
|
-
|
26
|
-
@classmethod
|
27
|
-
def setLocale(cls,lang:str):
|
28
|
-
"""
|
29
|
-
Imposta la lingua predefinita.
|
30
|
-
"""
|
31
|
-
try:
|
32
|
-
cls.__setLocale(lang)
|
33
|
-
except locale.Error:
|
34
|
-
lang+=".utf8"
|
35
|
-
cls.__setLocale(lang)
|
36
|
-
|
37
|
-
@staticmethod
|
38
|
-
def __setLocale(lang:str):
|
39
|
-
locale.setlocale(locale.LC_TIME, lang)
|
40
|
-
|
41
|
-
@staticmethod
|
42
|
-
def isEmpty(val:str|None)->bool:
|
43
|
-
"""
|
44
|
-
Verifica se il valore passato in input è NULL o vuoto.
|
45
|
-
"""
|
46
|
-
if val is None:
|
47
|
-
return True
|
48
|
-
val=str(val)
|
49
|
-
return val==''
|
50
|
-
|
51
|
-
@staticmethod
|
52
|
-
def contains(haystack:str,needle:str)->bool:
|
53
|
-
"""
|
54
|
-
Verifica se un testo è contenuto in un altro testo.
|
55
|
-
:param haystack: testo contenitore
|
56
|
-
:param needle: testo da cercare
|
57
|
-
"""
|
58
|
-
return haystack.find(needle)!=-1
|
59
|
-
|
60
|
-
@staticmethod
|
61
|
-
def normalizzaEol(cont:str)->str:
|
62
|
-
"""
|
63
|
-
Converte i caratteri di fine riga secondo lo standard Unix (universale)
|
64
|
-
"""
|
65
|
-
cont=cont.replace("\r\n","\n")
|
66
|
-
cont=cont.replace("\r","\n")
|
67
|
-
return cont
|
68
|
-
|
69
|
-
@staticmethod
|
70
|
-
def normalizzaTrattini(testo:str)->str:
|
71
|
-
"""
|
72
|
-
Tutti i caratteri assimilabili come un trattino vengono convertiti in trattini.
|
73
|
-
"""
|
74
|
-
#https://en.wikipedia.org/wiki/Dash#Common_dashes_and_Unicode_characters
|
75
|
-
testo=testo.replace(u'\u2012',"-") #figure dash
|
76
|
-
testo=testo.replace(u'\u2013',"-") #en dash
|
77
|
-
testo=testo.replace(u'\u2014',"-") #em dash
|
78
|
-
testo=testo.replace(u'\u2015',"-") #horizontal bar
|
79
|
-
#https://en.wikipedia.org/wiki/Hyphen#Unicode
|
80
|
-
testo=testo.replace(u'\u002D',"-") #HYPHEN-MINUS
|
81
|
-
testo=testo.replace(u'\u2212',"-") #MINUS SIGN
|
82
|
-
testo=testo.replace(u'\u00AD',"-") #SOFT HYPHEN
|
83
|
-
testo=testo.replace(u'\u2010',"-") #HYPHEN
|
84
|
-
testo=testo.replace(u'\u2011',"-") #NON-BREAKING HYPHEN
|
85
|
-
testo=testo.replace(u'\u0584',"-") #ARMENIAN HYPHEN
|
86
|
-
testo=testo.replace(u'\u1806',"-") #MONGOLIAN SOFT HYPHEN
|
87
|
-
testo=testo.replace(u'\uFE63',"-") #SMALL HYPHEN-MINUS
|
88
|
-
testo=testo.replace(u'\uFF0D',"-") #FULLWIDTH HYPHEN-MINUS
|
89
|
-
testo=testo.replace(u'\u2043',"-") #HYPHEN BULLET
|
90
|
-
return testo
|
91
|
-
|
92
|
-
@staticmethod
|
93
|
-
def normalizzaCaratteriSpeciali(testo:str)->str:
|
94
|
-
"""
|
95
|
-
Normalizzazione altri caratteri speciali.
|
96
|
-
"""
|
97
|
-
testo=testo.replace(u'\u039b','&') #GREEK CAPITAL LETTER LAMDA
|
98
|
-
return testo
|
99
|
-
|
100
|
-
@classmethod
|
101
|
-
def aggiungiTimestamp(cls,nomefile:str)->str:
|
102
|
-
"""
|
103
|
-
Se il nome del file ha l'estensione aggiungo il timestamp prima dell'estensione
|
104
|
-
"""
|
105
|
-
timestamp=ModuloDate.dateToString(None,ModuloDate.FORMATO_DATA_ORA_NOSPAZI)
|
106
|
-
if not cls.contains(nomefile,"."):
|
107
|
-
return nomefile+"_"+timestamp
|
108
|
-
arr=nomefile.split(".")
|
109
|
-
nuovonome=".".join(arr[0:-1])+"_"+timestamp+"."+arr[-1]
|
110
|
-
return nuovonome
|
111
|
-
|
112
|
-
@classmethod
|
113
|
-
def phoneNumberFormat(cls,stringa:str,sep:str):
|
114
|
-
"""
|
115
|
-
Formatta un numero di telefono rendendolo più facile da leggere.
|
116
|
-
"""
|
117
|
-
return cls.insertCharEveryN(stringa,sep,3)
|
118
|
-
|
119
|
-
@staticmethod
|
120
|
-
def capitalizeEveryWord(text:str)->str:
|
121
|
-
"""
|
122
|
-
Converte in maiuscolo il primo carattere di ogni parola.
|
123
|
-
"""
|
124
|
-
arr=text.split(" ")
|
125
|
-
arrNew=[x.capitalize() for x in arr]
|
126
|
-
textNew=" ".join(arrNew)
|
127
|
-
return textNew
|
128
|
-
|
129
|
-
@staticmethod
|
130
|
-
def splitColonne(text:str,sep:str)->list:
|
131
|
-
"""
|
132
|
-
Divide una stringa in colonne, ad ogni colonna vengono tolti gli spazi all'inizio e alla fine.
|
133
|
-
"""
|
134
|
-
colonne=text.split(sep)
|
135
|
-
colonne=[x.strip() for x in colonne]
|
136
|
-
return colonne
|
137
|
-
|
138
|
-
@staticmethod
|
139
|
-
def randomString(useLower:bool,useUpper:bool,useDigits:bool,length:int)->str:
|
140
|
-
"""
|
141
|
-
Crea una stringa di caratteri e/o numeri di lunghezza configurabile.
|
142
|
-
"""
|
143
|
-
chars=""
|
144
|
-
if useLower:
|
145
|
-
chars+=string.ascii_lowercase
|
146
|
-
if useUpper:
|
147
|
-
chars+=string.ascii_uppercase
|
148
|
-
if useDigits:
|
149
|
-
chars+=string.digits
|
150
|
-
return ''.join(random.choices(chars, k=length))
|
151
|
-
|
152
|
-
@staticmethod
|
153
|
-
def insertCharEveryN(stringa:str,sep:str,everyN:int)->str:
|
154
|
-
"""
|
155
|
-
Inserisce un carattere o un testo ogni N caratteri di un altro testo.
|
156
|
-
"""
|
157
|
-
return sep.join(stringa[i:i+everyN] for i in range(0, len(stringa), everyN))
|
158
|
-
|
159
|
-
@staticmethod
|
160
|
-
def trovaCodificaCorretta(textBytes:bytes,expectedText:str)->list:
|
161
|
-
"""
|
162
|
-
Questa funzione non ti puo' dire se la codifica e' corretta,
|
163
|
-
devi verificarlo tu a occhio perche' piu' codifiche possono andare bene.
|
164
|
-
"""
|
165
|
-
# questa variabile la lascio qui dentro perche' e' pesante
|
166
|
-
codecs=('ascii','big5','big5hkscs','cp037','cp424','cp437','cp500','cp737','cp775','cp850','cp852','cp855','cp856','cp857','cp860','cp861','cp862','cp863','cp864','cp865','cp866',
|
167
|
-
'cp869','cp874','cp875','cp932','cp949','cp950','cp1006','cp1026','cp1140','cp1250','cp1251','cp1252','cp1253','cp1254','cp1255','cp1256','cp1257','cp1258','euc_jp',
|
168
|
-
'euc_jis_2004','euc_jisx0213','euc_kr','gb2312','gbk','gb18030','hz','iso2022_jp','iso2022_jp_1','iso2022_jp_2','iso2022_jp_2004','iso2022_jp_3','iso2022_jp_ext','iso2022_kr',
|
169
|
-
'latin_1','iso8859_2','iso8859_3','iso8859_4','iso8859_5','iso8859_6','iso8859_7','iso8859_8','iso8859_9','iso8859_10','iso8859_13','iso8859_14','iso8859_15','johab','koi8_r',
|
170
|
-
'koi8_u','mac_cyrillic','mac_greek','mac_iceland','mac_latin2','mac_roman','mac_turkish','ptcp154','shift_jis','shift_jis_2004','shift_jisx0213','utf_16','utf_16_be','utf_16_le',
|
171
|
-
'utf_7','utf_8','utf_8_sig')
|
172
|
-
results=[]
|
173
|
-
for codec in codecs:
|
174
|
-
try:
|
175
|
-
testo=textBytes.decode(codec)
|
176
|
-
if testo==expectedText:
|
177
|
-
results.append(codec)
|
178
|
-
except UnicodeDecodeError:
|
179
|
-
pass
|
180
|
-
return results
|
@@ -1,18 +0,0 @@
|
|
1
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
2
|
-
|
3
|
-
|
4
|
-
class ModuloAndroid(object):
|
5
|
-
@staticmethod
|
6
|
-
def isAaptInstalled()->bool:
|
7
|
-
return ModuloSystem.isAptPackageInstalled("aapt")
|
8
|
-
@staticmethod
|
9
|
-
def isAdbInstalled()->bool:
|
10
|
-
return ModuloSystem.isAptPackageInstalled("adb")
|
11
|
-
|
12
|
-
@staticmethod
|
13
|
-
def getApkVersionName(nomefile:str)->str|None:
|
14
|
-
if not ModuloAndroid.isAaptInstalled():
|
15
|
-
return None
|
16
|
-
cmd=rf'''aapt dump badging {nomefile} | grep "versionName" | sed -e "s/.*versionName='//" -e "s/' .*//"'''
|
17
|
-
output=ModuloSystem.systemCallReturnOutput(cmd,None)
|
18
|
-
return output
|
@@ -1,48 +0,0 @@
|
|
1
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
2
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
3
|
-
|
4
|
-
|
5
|
-
class ModuloAndroidAdb(object):
|
6
|
-
"""
|
7
|
-
deviceId puo' essere l'identificativo:
|
8
|
-
- del dispositivo di 16 caratteri esadecimale
|
9
|
-
- della porta usb, del prodotto, del modello, ... (vedi il comando 'adb devices -l')
|
10
|
-
il transport_id non e' supportato
|
11
|
-
"""
|
12
|
-
|
13
|
-
def __init__(self,deviceId:str):
|
14
|
-
self.deviceId=deviceId
|
15
|
-
|
16
|
-
def isDeviceConnected(self)->bool:
|
17
|
-
cmd=r'adb -s "%s" get-state'%(self.deviceId,)
|
18
|
-
return self.__retrieveLastLineOfOutput(cmd)=='device'
|
19
|
-
|
20
|
-
def isDeviceUnlocked(self)->bool:
|
21
|
-
cmd=r'adb -s "%s" shell dumpsys window | grep mDreamingLockscreen'%(self.deviceId,)
|
22
|
-
output=ModuloSystem.systemCallReturnOutput(cmd,None).strip()
|
23
|
-
valori=[x.split("=")[1] for x in output.split(" ")]
|
24
|
-
for valore in valori:
|
25
|
-
if valore=="true":
|
26
|
-
return False
|
27
|
-
return True
|
28
|
-
|
29
|
-
def reboot(self)->bool:
|
30
|
-
cmd=r'adb -s "%s" reboot'%(self.deviceId,)
|
31
|
-
return self.__retrieveLastLineOfOutput(cmd)==''
|
32
|
-
def shutdown(self)->bool:
|
33
|
-
cmd=r'adb -s "%s" reboot -p'%(self.deviceId,)
|
34
|
-
return self.__retrieveLastLineOfOutput(cmd)=='Done'
|
35
|
-
|
36
|
-
@classmethod
|
37
|
-
def closeServer(cls) -> bool:
|
38
|
-
cmd="adb kill-server"
|
39
|
-
return cls.__retrieveOutput(cmd)==''
|
40
|
-
|
41
|
-
@staticmethod
|
42
|
-
def __retrieveOutput(cmd)->str:
|
43
|
-
return ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
|
44
|
-
@classmethod
|
45
|
-
def __retrieveLastLineOfOutput(cls,cmd)->str:
|
46
|
-
output=cls.__retrieveOutput(cmd)
|
47
|
-
righe=output.split("\n")
|
48
|
-
return righe[-1]
|
@@ -1,130 +0,0 @@
|
|
1
|
-
import time
|
2
|
-
|
3
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
4
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
5
|
-
from modulitiz_micro.ModuloNumeri import ModuloNumeri
|
6
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
7
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
8
|
-
|
9
|
-
|
10
|
-
class ModuloAndroidSim(object):
|
11
|
-
"""
|
12
|
-
CREATE TABLE sms (
|
13
|
-
_id INTEGER PRIMARY KEY
|
14
|
-
thread_id INTEGER
|
15
|
-
address TEXT
|
16
|
-
person INTEGER
|
17
|
-
date INTEGER
|
18
|
-
date_sent INTEGER DEFAULT 0
|
19
|
-
protocol INTEGER
|
20
|
-
read INTEGER DEFAULT 0
|
21
|
-
status INTEGER DEFAULT -1
|
22
|
-
type INTEGER
|
23
|
-
reply_path_present INTEGER
|
24
|
-
subject TEXT
|
25
|
-
body TEXT
|
26
|
-
service_center TEXT
|
27
|
-
locked INTEGER DEFAULT 0
|
28
|
-
sub_id INTEGER DEFAULT INVALID_SUBSCRIPTION_ID
|
29
|
-
error_code INTEGER DEFAULT NO_ERROR_CODE
|
30
|
-
creator TEXT
|
31
|
-
seen INTEGER DEFAULT 0
|
32
|
-
);
|
33
|
-
"""
|
34
|
-
|
35
|
-
def __init__(self,deviceId:str):
|
36
|
-
self.deviceId=deviceId
|
37
|
-
|
38
|
-
self.__SEP_WITH_DELIM=(r''' "'"\"%s"\"'" '''%(ModuloStringhe.SEP.replace(r"|",r"\|"),)).strip()
|
39
|
-
|
40
|
-
def hasDeviceCellSignal(self)->bool:
|
41
|
-
cmd=r'adb -s "%s" shell "dumpsys telephony.registry | grep mServiceState"'%(self.deviceId,)
|
42
|
-
output=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
|
43
|
-
ind=output.find("=")
|
44
|
-
if ind==-1:
|
45
|
-
return False
|
46
|
-
serviceState=output[ind+1]
|
47
|
-
if not ModuloNumeri.isInt(serviceState):
|
48
|
-
return False
|
49
|
-
return int(serviceState)==0
|
50
|
-
|
51
|
-
# operazioni di lettura
|
52
|
-
def smsRead(self,onlyUnread:bool)->list:
|
53
|
-
"""
|
54
|
-
Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
|
55
|
-
"""
|
56
|
-
sql=self.__smsQuery(onlyUnread,False)
|
57
|
-
output=self.__querySmsDb(sql)
|
58
|
-
return ModuloListe.eliminaElementiVuoti(output.split("|"+ModuloStringhe.SEP+"\n"))
|
59
|
-
|
60
|
-
def smsReadUntilNew(self,checkEverySecs:int|float,timeoutMin:int|float) -> list:
|
61
|
-
"""
|
62
|
-
Aspetta l'arrivo di un nuovo messaggio.
|
63
|
-
Questo metodo NON è asincrono.
|
64
|
-
"""
|
65
|
-
timeoutSecs=timeoutMin*60
|
66
|
-
tsStart=ModuloDate.getSecs()
|
67
|
-
results=[]
|
68
|
-
while ModuloListe.isEmpty(results) and (ModuloDate.getSecs()-tsStart)<timeoutSecs:
|
69
|
-
time.sleep(checkEverySecs)
|
70
|
-
results=self.smsRead(True)
|
71
|
-
return results
|
72
|
-
|
73
|
-
def smsReadCount(self,onlyUnread: bool) -> int:
|
74
|
-
"""
|
75
|
-
Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
|
76
|
-
"""
|
77
|
-
sql=self.__smsQuery(onlyUnread,True)
|
78
|
-
output=self.__querySmsDb(sql)
|
79
|
-
return int(output)
|
80
|
-
|
81
|
-
def __smsQuery(self,onlyUnread:bool,isCount:bool)->str:
|
82
|
-
sqlSelect="COUNT(*)" if isCount else "*,%s AS sep"%(self.__SEP_WITH_DELIM,)
|
83
|
-
sql="SELECT %s FROM sms WHERE 1=1 %s;"%(sqlSelect,("AND read=0" if onlyUnread else ""),)
|
84
|
-
return sql
|
85
|
-
|
86
|
-
# operazioni di modifica / cancellazione
|
87
|
-
def smsDelete(self,idSms:int)->str:
|
88
|
-
"""
|
89
|
-
Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
|
90
|
-
"""
|
91
|
-
sql="DELETE FROM sms WHERE _id=%d;"%(idSms,)
|
92
|
-
return self.__querySmsDb(sql)
|
93
|
-
def smsUpdateAsRed(self,idSms:int)->str:
|
94
|
-
"""
|
95
|
-
Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
|
96
|
-
"""
|
97
|
-
sql="UPDATE sms SET read=1 WHERE _id=%d AND read=0;"%(idSms,)
|
98
|
-
return self.__querySmsDb(sql)
|
99
|
-
def smsUpdateManyAsRed(self,idsSms:list[int])->str|None:
|
100
|
-
"""
|
101
|
-
Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
|
102
|
-
"""
|
103
|
-
if not idsSms:
|
104
|
-
return None
|
105
|
-
idsSmsStr=",".join(str(x) for x in idsSms)
|
106
|
-
sql="UPDATE sms SET read=1 WHERE _id IN(%s) AND read=0;"%(idsSmsStr,)
|
107
|
-
return self.__querySmsDb(sql)
|
108
|
-
|
109
|
-
def __querySmsDb(self,sqlQuery:str)->str:
|
110
|
-
"""
|
111
|
-
Richiede il ROOT sul device
|
112
|
-
"""
|
113
|
-
cmd=r'''adb -s "%s" shell "su -c 'sqlite3 "/data/data/com.android.providers.telephony/databases/mmssms.db" \"%s\"'" '''%(self.deviceId,sqlQuery)
|
114
|
-
output=ModuloSystem.systemCallReturnOutput(cmd,None).strip()
|
115
|
-
output=ModuloStringhe.normalizzaEol(output)
|
116
|
-
return output
|
117
|
-
|
118
|
-
def smsSend(self,unlockPin:int,numeroDest:str,msg:str)->str:
|
119
|
-
msg=msg.replace(" ",r"\ ")
|
120
|
-
# premo invio prima di inserire il pin, in questo modo forzo il focus sull'input text
|
121
|
-
cmd=r"""adb -s "%s" shell "input keyevent KEYCODE_POWER && sleep 1 && input keyevent KEYCODE_ENTER && sleep 0.5"
|
122
|
-
adb -s "%s" shell "input text \"%d\" && sleep 0.5 && input keyevent KEYCODE_ENTER"
|
123
|
-
adb -s "%s" shell am start -a android.intent.action.SENDTO -d sms:"%s" --es sms_body "%s" --ez exit_on_sent true
|
124
|
-
adb -s "%s" shell "sleep 2 && input keyevent 61 && sleep 0.5 && input keyevent KEYCODE_ENTER && sleep 0.5 && am force-stop com.android.mms && input keyevent KEYCODE_POWER && echo \"FINE\""
|
125
|
-
"""%(self.deviceId,
|
126
|
-
self.deviceId,unlockPin,
|
127
|
-
self.deviceId,numeroDest,msg,
|
128
|
-
self.deviceId)
|
129
|
-
output=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
|
130
|
-
return output
|
@@ -1,12 +0,0 @@
|
|
1
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
2
|
-
from modulitiz_micro.android.enums.AndroidSmsTypeEnum import AndroidSmsTypeEnum
|
3
|
-
|
4
|
-
|
5
|
-
class SmsBean(object):
|
6
|
-
def __init__(self,arr:list[str]):
|
7
|
-
self.id=int(arr[0])
|
8
|
-
self.numCell=arr[2]
|
9
|
-
self.data=ModuloDate.timestampToDate(int(arr[4])*0.001)
|
10
|
-
self.dataInvio=ModuloDate.timestampToDate(int(arr[5])*0.001)
|
11
|
-
self.type=AndroidSmsTypeEnum(int(arr[9])).name.lower()
|
12
|
-
self.body=arr[12]
|
@@ -1,17 +0,0 @@
|
|
1
|
-
from enum import IntEnum
|
2
|
-
from enum import auto
|
3
|
-
from enum import unique
|
4
|
-
|
5
|
-
|
6
|
-
@unique
|
7
|
-
class AndroidSmsTypeEnum(IntEnum):
|
8
|
-
"""
|
9
|
-
Tipi di sms/mms
|
10
|
-
"""
|
11
|
-
ALL=0
|
12
|
-
RECEIVED=auto()
|
13
|
-
SENT=auto()
|
14
|
-
DRAFT=auto()
|
15
|
-
OUTBOX=auto()
|
16
|
-
FAILED_OUTGOING=auto()
|
17
|
-
QUEUED=auto()
|