modulitiz-micro 2.41.0__py311-none-any.whl → 2.43.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.
Files changed (107) hide show
  1. modulitiz_micro/ModuloMeteo.py +72 -72
  2. modulitiz_micro/ModuloSeriale.py +70 -70
  3. modulitiz_micro/ModuloTarghe.py +47 -46
  4. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  5. modulitiz_micro/database/AbstractSql.py +69 -69
  6. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  7. modulitiz_micro/database/ModuloSqlServer.py +43 -43
  8. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  9. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  10. modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
  11. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  12. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  13. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  14. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  15. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  16. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  17. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  18. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  19. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  20. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  21. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  22. modulitiz_micro/files/git/ModuloGit.py +28 -28
  23. modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
  24. modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
  25. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  26. modulitiz_micro/iot/ModuleIotDevice.py +4 -4
  27. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  28. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  29. modulitiz_micro/rete/ModuloNetworking.py +72 -72
  30. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  31. modulitiz_micro/rete/email/EmailBean.py +5 -5
  32. modulitiz_micro/rete/email/ModuloEmail.py +90 -90
  33. modulitiz_micro/rete/http/ModuloHttp.py +119 -119
  34. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  35. modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
  36. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  37. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  38. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  39. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  40. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  41. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  42. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  43. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  44. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  45. modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
  46. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  47. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  48. modulitiz_micro/util/scheduler/ModuleScheduler.py +26 -26
  49. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.43.0.dist-info}/METADATA +59 -66
  50. modulitiz_micro-2.43.0.dist-info/RECORD +56 -0
  51. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.43.0.dist-info}/WHEEL +1 -1
  52. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.43.0.dist-info/licenses}/LICENSE +21 -21
  53. modulitiz_micro/ModuleEnum.py +0 -8
  54. modulitiz_micro/ModuloBase64.py +0 -61
  55. modulitiz_micro/ModuloColorText.py +0 -35
  56. modulitiz_micro/ModuloDate.py +0 -327
  57. modulitiz_micro/ModuloFunzioni.py +0 -71
  58. modulitiz_micro/ModuloListe.py +0 -150
  59. modulitiz_micro/ModuloNumeri.py +0 -127
  60. modulitiz_micro/ModuloPyinstaller.py +0 -29
  61. modulitiz_micro/ModuloStatistiche.py +0 -31
  62. modulitiz_micro/ModuloStringhe.py +0 -180
  63. modulitiz_micro/android/ModuloAndroid.py +0 -18
  64. modulitiz_micro/android/ModuloAndroidAdb.py +0 -48
  65. modulitiz_micro/android/ModuloAndroidSim.py +0 -130
  66. modulitiz_micro/android/beans/SmsBean.py +0 -12
  67. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +0 -17
  68. modulitiz_micro/eccezioni/EccezioneBase.py +0 -7
  69. modulitiz_micro/eccezioni/EccezioneRuntime.py +0 -7
  70. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +0 -7
  71. modulitiz_micro/files/ModuloFiles.py +0 -173
  72. modulitiz_micro/files/ModuloLogging.py +0 -69
  73. modulitiz_micro/files/ModuloZip.py +0 -42
  74. modulitiz_micro/files/cache/CacheBean.py +0 -5
  75. modulitiz_micro/files/cache/CacheRam.py +0 -29
  76. modulitiz_micro/init/AbstractBasicInit.py +0 -27
  77. modulitiz_micro/init/AbstractInit.py +0 -11
  78. modulitiz_micro/multithread/ModuloThread.py +0 -26
  79. modulitiz_micro/multithread/ModuloThreadLogger.py +0 -8
  80. modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +0 -25
  81. modulitiz_micro/nlp/ModuloNlp.py +0 -36
  82. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +0 -59
  83. modulitiz_micro/sistema/EnvVarsEnum.py +0 -9
  84. modulitiz_micro/sistema/ModuloSystem.py +0 -298
  85. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +0 -11
  86. modulitiz_micro/util/beans/conf/AbstractConfBean.py +0 -16
  87. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +0 -11
  88. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +0 -13
  89. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +0 -34
  90. modulitiz_micro/util/decorators/noAwait.py +0 -23
  91. modulitiz_micro/util/pip/AbstractModuloPip.py +0 -41
  92. modulitiz_micro/util/pip/ModuloPip.py +0 -49
  93. modulitiz_micro/util/spooler/AbstractSpooler.py +0 -14
  94. modulitiz_micro/util/spooler/Spooler.py +0 -18
  95. modulitiz_micro/util/spooler/beans/QueueBean.py +0 -8
  96. modulitiz_micro/util/spooler/decorators/spooler.py +0 -49
  97. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +0 -7
  98. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +0 -7
  99. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +0 -31
  100. modulitiz_micro/util/unittesting/AbstractTestUtil.py +0 -11
  101. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +0 -25
  102. modulitiz_micro/util/wheel/ModuloBuildWheel.py +0 -118
  103. modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +0 -89
  104. modulitiz_micro/util/wheel/ModuloToml.py +0 -40
  105. modulitiz_micro/util/wheel/ModuloWheel.py +0 -12
  106. modulitiz_micro-2.41.0.dist-info/RECORD +0 -109
  107. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.43.0.dist-info}/top_level.txt +0 -0
@@ -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()
@@ -1,7 +0,0 @@
1
- from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
2
-
3
-
4
- class EccezioneBase(EccezioneRuntime):
5
-
6
- def __init__(self,*args,**kwargs):
7
- super().__init__(*args,**kwargs)
@@ -1,7 +0,0 @@
1
- class EccezioneRuntime(RuntimeError):
2
-
3
- def __init__(self,*args,**kwargs):
4
- super().__init__(*args)
5
-
6
- def getMessage(self)->str:
7
- return " ".join(self.args)
@@ -1,7 +0,0 @@
1
- from modulitiz_micro.eccezioni.EccezioneBase import EccezioneBase
2
-
3
-
4
- class EccezioneSoNonSupportato(EccezioneBase):
5
-
6
- def __init__(self,*args,**kwargs):
7
- super().__init__(*args,**kwargs)