modulitiz-micro 2.34.0__py311-none-any.whl → 2.36.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/ModuloBase64.py +61 -61
- modulitiz_micro/ModuloColorText.py +35 -35
- modulitiz_micro/ModuloDate.py +295 -295
- modulitiz_micro/ModuloFunzioni.py +70 -70
- modulitiz_micro/ModuloListe.py +150 -150
- modulitiz_micro/ModuloMeteo.py +72 -72
- modulitiz_micro/ModuloNumeri.py +130 -130
- modulitiz_micro/ModuloPyinstaller.py +29 -29
- modulitiz_micro/ModuloSeriale.py +70 -61
- modulitiz_micro/ModuloStatistiche.py +31 -31
- modulitiz_micro/ModuloStringhe.py +180 -180
- modulitiz_micro/ModuloTarghe.py +46 -46
- modulitiz_micro/android/ModuloAndroid.py +18 -18
- modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
- modulitiz_micro/android/ModuloAndroidSim.py +130 -130
- modulitiz_micro/android/beans/SmsBean.py +12 -12
- modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
- 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/EccezioneBase.py +7 -7
- modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
- modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
- modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
- modulitiz_micro/eccezioni/EccezioneSoNonSupportato.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/ModuloFiles.py +173 -173
- modulitiz_micro/files/ModuloLogging.py +69 -69
- modulitiz_micro/files/ModuloZip.py +42 -42
- modulitiz_micro/files/cache/CacheBean.py +5 -5
- modulitiz_micro/files/cache/CacheRam.py +29 -29
- 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/init/AbstractBasicInit.py +27 -27
- modulitiz_micro/init/AbstractInit.py +11 -11
- modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
- modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
- modulitiz_micro/multithread/ModuloThread.py +26 -26
- modulitiz_micro/multithread/ModuloThreadLogger.py +8 -8
- modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +25 -25
- modulitiz_micro/nlp/ModuloNlp.py +36 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
- modulitiz_micro/rete/ModuloNetworking.py +67 -67
- 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 +115 -115
- 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/EnvVarsEnum.py +9 -9
- modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
- modulitiz_micro/sistema/ModuloSystem.py +298 -298
- 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/conf/AbstractBasicConfBean.py +11 -11
- modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
- modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
- modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
- modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
- modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
- modulitiz_micro/util/decorators/noAwait.py +23 -23
- modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
- modulitiz_micro/util/pip/ModuloPip.py +49 -49
- modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
- modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
- modulitiz_micro/util/spooler/Spooler.py +18 -18
- modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
- modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
- modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +31 -31
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +117 -117
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -83
- modulitiz_micro/util/wheel/ModuloToml.py +40 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/LICENSE +21 -21
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/METADATA +64 -64
- modulitiz_micro-2.36.0.dist-info/RECORD +104 -0
- modulitiz_micro-2.34.0.dist-info/RECORD +0 -104
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/top_level.txt +0 -0
@@ -1,130 +1,130 @@
|
|
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
|
+
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 +1,12 @@
|
|
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
|
+
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 +1,17 @@
|
|
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
|
+
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,13 +1,13 @@
|
|
1
|
-
import threading
|
2
|
-
from abc import ABC
|
3
|
-
|
4
|
-
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
5
|
-
|
6
|
-
|
7
|
-
class AbstractDatabaseService(ABC):
|
8
|
-
|
9
|
-
def __init__(self,logger:ModuloLogging):
|
10
|
-
self._logger=logger
|
11
|
-
self.lock=threading.Lock()
|
12
|
-
|
13
|
-
self.database=None
|
1
|
+
import threading
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
5
|
+
|
6
|
+
|
7
|
+
class AbstractDatabaseService(ABC):
|
8
|
+
|
9
|
+
def __init__(self,logger:ModuloLogging):
|
10
|
+
self._logger=logger
|
11
|
+
self.lock=threading.Lock()
|
12
|
+
|
13
|
+
self.database=None
|
@@ -1,69 +1,69 @@
|
|
1
|
-
import threading
|
2
|
-
from abc import ABC
|
3
|
-
|
4
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
5
|
-
|
6
|
-
|
7
|
-
class AbstractSql(ABC):
|
8
|
-
def __init__(self):
|
9
|
-
self.connDb=None
|
10
|
-
self.lock=threading.Lock()
|
11
|
-
|
12
|
-
def commit(self):
|
13
|
-
"""
|
14
|
-
Use to make modifications permanents.
|
15
|
-
"""
|
16
|
-
with self.lock:
|
17
|
-
self.commitNoLock()
|
18
|
-
|
19
|
-
def commitNoLock(self):
|
20
|
-
"""
|
21
|
-
Use only if lock is made externally.
|
22
|
-
"""
|
23
|
-
self.connDb.commit()
|
24
|
-
|
25
|
-
def rollback(self):
|
26
|
-
"""
|
27
|
-
Undo last uncommitted operations.
|
28
|
-
"""
|
29
|
-
with self.lock:
|
30
|
-
self.connDb.rollback()
|
31
|
-
|
32
|
-
def initCursor(self):
|
33
|
-
"""
|
34
|
-
Creates cursor objects, it's needed to read/write database.
|
35
|
-
"""
|
36
|
-
with self.lock:
|
37
|
-
cursoreDb=self.connDb.cursor()
|
38
|
-
return cursoreDb
|
39
|
-
|
40
|
-
def fetchOne(self,cursoreDb):
|
41
|
-
"""
|
42
|
-
Retrieve first row of query
|
43
|
-
"""
|
44
|
-
with cursoreDb:
|
45
|
-
with self.lock:
|
46
|
-
result=cursoreDb.fetchone()
|
47
|
-
if not result:
|
48
|
-
return None
|
49
|
-
return result[0]
|
50
|
-
|
51
|
-
def count(self,cursoreDb)->int:
|
52
|
-
with cursoreDb:
|
53
|
-
with self.lock:
|
54
|
-
result=cursoreDb.fetchone()
|
55
|
-
if not result:
|
56
|
-
return 0
|
57
|
-
return result[0]
|
58
|
-
|
59
|
-
def close(self):
|
60
|
-
with self.lock:
|
61
|
-
if self.connDb is not None:
|
62
|
-
self.connDb.close()
|
63
|
-
self.connDb=None
|
64
|
-
|
65
|
-
@staticmethod
|
66
|
-
def ifEmptyThenNull(testo:str|None)->str|None:
|
67
|
-
if ModuloStringhe.isEmpty(testo) or testo=="NULL":
|
68
|
-
return None
|
69
|
-
return testo
|
1
|
+
import threading
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
5
|
+
|
6
|
+
|
7
|
+
class AbstractSql(ABC):
|
8
|
+
def __init__(self):
|
9
|
+
self.connDb=None
|
10
|
+
self.lock=threading.Lock()
|
11
|
+
|
12
|
+
def commit(self):
|
13
|
+
"""
|
14
|
+
Use to make modifications permanents.
|
15
|
+
"""
|
16
|
+
with self.lock:
|
17
|
+
self.commitNoLock()
|
18
|
+
|
19
|
+
def commitNoLock(self):
|
20
|
+
"""
|
21
|
+
Use only if lock is made externally.
|
22
|
+
"""
|
23
|
+
self.connDb.commit()
|
24
|
+
|
25
|
+
def rollback(self):
|
26
|
+
"""
|
27
|
+
Undo last uncommitted operations.
|
28
|
+
"""
|
29
|
+
with self.lock:
|
30
|
+
self.connDb.rollback()
|
31
|
+
|
32
|
+
def initCursor(self):
|
33
|
+
"""
|
34
|
+
Creates cursor objects, it's needed to read/write database.
|
35
|
+
"""
|
36
|
+
with self.lock:
|
37
|
+
cursoreDb=self.connDb.cursor()
|
38
|
+
return cursoreDb
|
39
|
+
|
40
|
+
def fetchOne(self,cursoreDb):
|
41
|
+
"""
|
42
|
+
Retrieve first row of query
|
43
|
+
"""
|
44
|
+
with cursoreDb:
|
45
|
+
with self.lock:
|
46
|
+
result=cursoreDb.fetchone()
|
47
|
+
if not result:
|
48
|
+
return None
|
49
|
+
return result[0]
|
50
|
+
|
51
|
+
def count(self,cursoreDb)->int:
|
52
|
+
with cursoreDb:
|
53
|
+
with self.lock:
|
54
|
+
result=cursoreDb.fetchone()
|
55
|
+
if not result:
|
56
|
+
return 0
|
57
|
+
return result[0]
|
58
|
+
|
59
|
+
def close(self):
|
60
|
+
with self.lock:
|
61
|
+
if self.connDb is not None:
|
62
|
+
self.connDb.close()
|
63
|
+
self.connDb=None
|
64
|
+
|
65
|
+
@staticmethod
|
66
|
+
def ifEmptyThenNull(testo:str|None)->str|None:
|
67
|
+
if ModuloStringhe.isEmpty(testo) or testo=="NULL":
|
68
|
+
return None
|
69
|
+
return testo
|
@@ -1,19 +1,19 @@
|
|
1
|
-
import oracledb
|
2
|
-
|
3
|
-
from modulitiz_micro.database.ModuloSqlServer import ModuloSqlServer
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloSqlOracle(ModuloSqlServer):
|
7
|
-
DEFAULT_PORTA=1521
|
8
|
-
|
9
|
-
def __init__(self,porta:int|None,*args,**kwargs):
|
10
|
-
super().__init__(*args,**kwargs)
|
11
|
-
if porta is None:
|
12
|
-
porta=self.DEFAULT_PORTA
|
13
|
-
self.porta=porta
|
14
|
-
|
15
|
-
def connessione(self):
|
16
|
-
dsn="{}/{}@{}:{}/xe".format(self.username,self.password,self.host,self.porta)
|
17
|
-
self.connDb=oracledb.connect(dsn)
|
18
|
-
self.connDb=dsn
|
19
|
-
|
1
|
+
import oracledb
|
2
|
+
|
3
|
+
from modulitiz_micro.database.ModuloSqlServer import ModuloSqlServer
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloSqlOracle(ModuloSqlServer):
|
7
|
+
DEFAULT_PORTA=1521
|
8
|
+
|
9
|
+
def __init__(self,porta:int|None,*args,**kwargs):
|
10
|
+
super().__init__(*args,**kwargs)
|
11
|
+
if porta is None:
|
12
|
+
porta=self.DEFAULT_PORTA
|
13
|
+
self.porta=porta
|
14
|
+
|
15
|
+
def connessione(self):
|
16
|
+
dsn="{}/{}@{}:{}/xe".format(self.username,self.password,self.host,self.porta)
|
17
|
+
self.connDb=oracledb.connect(dsn)
|
18
|
+
self.connDb=dsn
|
19
|
+
|
@@ -1,43 +1,43 @@
|
|
1
|
-
import pypyodbc
|
2
|
-
|
3
|
-
from modulitiz_micro.database.AbstractSql import AbstractSql
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloSqlServer(AbstractSql):
|
7
|
-
ERROR_CODE__UNIQUE_INDEX=23000
|
8
|
-
|
9
|
-
def __init__(self,host:str,nome_db:str,username:str,password:str):
|
10
|
-
super().__init__()
|
11
|
-
self.host=host
|
12
|
-
self.nome_db=nome_db
|
13
|
-
self.username=username
|
14
|
-
self.password=password
|
15
|
-
|
16
|
-
def connessione(self):
|
17
|
-
connDb=pypyodbc.connect("Driver={SQL Server};Server="+self.host+";Database="+self.nome_db+";uid="+self.username+";pwd="+self.password+";")
|
18
|
-
self.connDb=connDb
|
19
|
-
|
20
|
-
def select(self,sql:str,params:list):
|
21
|
-
with self.initCursor() as cursoreDb:
|
22
|
-
cursoreDb.execute(sql,params)
|
23
|
-
results=list(cursoreDb)
|
24
|
-
return results
|
25
|
-
|
26
|
-
def select_count(self,cursoreDb,sql:str,params:list)->int:
|
27
|
-
with cursoreDb:
|
28
|
-
cursoreDb.execute(sql,params)
|
29
|
-
output=self.count(cursoreDb)
|
30
|
-
return output
|
31
|
-
|
32
|
-
def modifica(self,cursoreDb,sql:str,params:list,ignore_unique_index:bool):
|
33
|
-
"""
|
34
|
-
Use it for data modifications like: insert, update, delete
|
35
|
-
"""
|
36
|
-
try:
|
37
|
-
cursoreDb.execute(sql,params)
|
38
|
-
except pypyodbc.IntegrityError as ie:
|
39
|
-
if ignore_unique_index:
|
40
|
-
error_code=int(ie.value[0])
|
41
|
-
if error_code!=self.ERROR_CODE__UNIQUE_INDEX:
|
42
|
-
raise ie
|
43
|
-
|
1
|
+
import pypyodbc
|
2
|
+
|
3
|
+
from modulitiz_micro.database.AbstractSql import AbstractSql
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloSqlServer(AbstractSql):
|
7
|
+
ERROR_CODE__UNIQUE_INDEX=23000
|
8
|
+
|
9
|
+
def __init__(self,host:str,nome_db:str,username:str,password:str):
|
10
|
+
super().__init__()
|
11
|
+
self.host=host
|
12
|
+
self.nome_db=nome_db
|
13
|
+
self.username=username
|
14
|
+
self.password=password
|
15
|
+
|
16
|
+
def connessione(self):
|
17
|
+
connDb=pypyodbc.connect("Driver={SQL Server};Server="+self.host+";Database="+self.nome_db+";uid="+self.username+";pwd="+self.password+";")
|
18
|
+
self.connDb=connDb
|
19
|
+
|
20
|
+
def select(self,sql:str,params:list):
|
21
|
+
with self.initCursor() as cursoreDb:
|
22
|
+
cursoreDb.execute(sql,params)
|
23
|
+
results=list(cursoreDb)
|
24
|
+
return results
|
25
|
+
|
26
|
+
def select_count(self,cursoreDb,sql:str,params:list)->int:
|
27
|
+
with cursoreDb:
|
28
|
+
cursoreDb.execute(sql,params)
|
29
|
+
output=self.count(cursoreDb)
|
30
|
+
return output
|
31
|
+
|
32
|
+
def modifica(self,cursoreDb,sql:str,params:list,ignore_unique_index:bool):
|
33
|
+
"""
|
34
|
+
Use it for data modifications like: insert, update, delete
|
35
|
+
"""
|
36
|
+
try:
|
37
|
+
cursoreDb.execute(sql,params)
|
38
|
+
except pypyodbc.IntegrityError as ie:
|
39
|
+
if ignore_unique_index:
|
40
|
+
error_code=int(ie.value[0])
|
41
|
+
if error_code!=self.ERROR_CODE__UNIQUE_INDEX:
|
42
|
+
raise ie
|
43
|
+
|
@@ -1,6 +1,6 @@
|
|
1
|
-
from modulitiz_micro.eccezioni.EccezioneBase import EccezioneBase
|
2
|
-
|
3
|
-
class EccezioneDbNoData(EccezioneBase):
|
4
|
-
|
5
|
-
def __init__(self,*args,**kwargs):
|
6
|
-
super().__init__(*args,**kwargs)
|
1
|
+
from modulitiz_micro.eccezioni.EccezioneBase import EccezioneBase
|
2
|
+
|
3
|
+
class EccezioneDbNoData(EccezioneBase):
|
4
|
+
|
5
|
+
def __init__(self,*args,**kwargs):
|
6
|
+
super().__init__(*args,**kwargs)
|