modulitiz-micro 2.26.0__py311-none-any.whl → 2.27.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 +58 -58
- 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 +61 -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 +49 -49
- modulitiz_micro/database/ModuloSqlOracle.py +19 -19
- modulitiz_micro/database/ModuloSqlServer.py +50 -50
- modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
- modulitiz_micro/database/mysql/ModuloMysql.py +151 -151
- 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 +15 -15
- 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/multithreading/ModuloThread.py +26 -26
- modulitiz_micro/multithreading/ModuloThreadLogger.py +8 -8
- modulitiz_micro/multithreading/ModuloThreadWithCallbackError.py +25 -25
- modulitiz_micro/nlp/ModuloNlp.py +36 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
- modulitiz_micro/rete/ModuloNetworking.py +64 -64
- modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
- modulitiz_micro/rete/email/EmailBean.py +5 -0
- modulitiz_micro/rete/{ModuloEmail.py → email/ModuloEmail.py} +90 -69
- modulitiz_micro/rete/http/ModuloHttp.py +114 -114
- modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
- modulitiz_micro/rete/http/ModuloHttpUtils.py +66 -66
- 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/ModuloTelegram.py +52 -52
- 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 +18 -18
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +118 -118
- modulitiz_micro/util/wheel/ModuloToml.py +40 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
- {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/LICENSE +20 -20
- {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/METADATA +63 -63
- modulitiz_micro-2.27.0.dist-info/RECORD +101 -0
- modulitiz_micro-2.26.0.dist-info/RECORD +0 -100
- {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.26.0.dist-info → modulitiz_micro-2.27.0.dist-info}/top_level.txt +0 -0
@@ -1,25 +1,25 @@
|
|
1
|
-
import threading
|
2
|
-
|
3
|
-
|
4
|
-
class ModuloThreadWithCallbackError(threading.Thread):
|
5
|
-
"""
|
6
|
-
This class should always be used in preference to threading.Thread.
|
7
|
-
|
8
|
-
The interface provided by this class is identical to that of threading.Thread,
|
9
|
-
however, if an exception occurs in the thread the callback function is called,
|
10
|
-
rather than printed to stderr.
|
11
|
-
|
12
|
-
This is important in daemon style applications where stderr is redirected to /dev/null.
|
13
|
-
"""
|
14
|
-
|
15
|
-
def __init__(self,callbackError,**kwargs):
|
16
|
-
super().__init__(**kwargs)
|
17
|
-
self.callbackError=callbackError
|
18
|
-
self._realRun=self.run
|
19
|
-
self.run=self.__wrapRun
|
20
|
-
|
21
|
-
def __wrapRun(self):
|
22
|
-
try:
|
23
|
-
self._realRun()
|
24
|
-
except Exception as ex:
|
25
|
-
self.callbackError(ex)
|
1
|
+
import threading
|
2
|
+
|
3
|
+
|
4
|
+
class ModuloThreadWithCallbackError(threading.Thread):
|
5
|
+
"""
|
6
|
+
This class should always be used in preference to threading.Thread.
|
7
|
+
|
8
|
+
The interface provided by this class is identical to that of threading.Thread,
|
9
|
+
however, if an exception occurs in the thread the callback function is called,
|
10
|
+
rather than printed to stderr.
|
11
|
+
|
12
|
+
This is important in daemon style applications where stderr is redirected to /dev/null.
|
13
|
+
"""
|
14
|
+
|
15
|
+
def __init__(self,callbackError,**kwargs):
|
16
|
+
super().__init__(**kwargs)
|
17
|
+
self.callbackError=callbackError
|
18
|
+
self._realRun=self.run
|
19
|
+
self.run=self.__wrapRun
|
20
|
+
|
21
|
+
def __wrapRun(self):
|
22
|
+
try:
|
23
|
+
self._realRun()
|
24
|
+
except Exception as ex:
|
25
|
+
self.callbackError(ex)
|
modulitiz_micro/nlp/ModuloNlp.py
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
class ModuloNlp(object):
|
2
|
-
|
3
|
-
@staticmethod
|
4
|
-
def giornoRelativoToParola(giornoRel:int)->str|None:
|
5
|
-
match giornoRel:
|
6
|
-
case -1: return "ieri"
|
7
|
-
case 0: return "oggi"
|
8
|
-
case 1: return "domani"
|
9
|
-
case 2: return "dopodomani"
|
10
|
-
case _: return None
|
11
|
-
|
12
|
-
@staticmethod
|
13
|
-
def giornoRelativoToNum(giornoRel:str)->int|None:
|
14
|
-
match giornoRel:
|
15
|
-
case "ieri": return -1
|
16
|
-
case "oggi": return 0
|
17
|
-
case "domani": return 1
|
18
|
-
case "dopodomani": return 2
|
19
|
-
case _: return None
|
20
|
-
|
21
|
-
@staticmethod
|
22
|
-
def verboEssere(isPassato:bool)->str:
|
23
|
-
if isPassato:
|
24
|
-
return "era"
|
25
|
-
return "è"
|
26
|
-
|
27
|
-
@staticmethod
|
28
|
-
def articolo(isDeterminativo:bool,isMaschile:bool)->str:
|
29
|
-
if isDeterminativo:
|
30
|
-
if isMaschile:
|
31
|
-
return "il"
|
32
|
-
return "la"
|
33
|
-
if isMaschile:
|
34
|
-
return "un"
|
35
|
-
return "una"
|
36
|
-
|
1
|
+
class ModuloNlp(object):
|
2
|
+
|
3
|
+
@staticmethod
|
4
|
+
def giornoRelativoToParola(giornoRel:int)->str|None:
|
5
|
+
match giornoRel:
|
6
|
+
case -1: return "ieri"
|
7
|
+
case 0: return "oggi"
|
8
|
+
case 1: return "domani"
|
9
|
+
case 2: return "dopodomani"
|
10
|
+
case _: return None
|
11
|
+
|
12
|
+
@staticmethod
|
13
|
+
def giornoRelativoToNum(giornoRel:str)->int|None:
|
14
|
+
match giornoRel:
|
15
|
+
case "ieri": return -1
|
16
|
+
case "oggi": return 0
|
17
|
+
case "domani": return 1
|
18
|
+
case "dopodomani": return 2
|
19
|
+
case _: return None
|
20
|
+
|
21
|
+
@staticmethod
|
22
|
+
def verboEssere(isPassato:bool)->str:
|
23
|
+
if isPassato:
|
24
|
+
return "era"
|
25
|
+
return "è"
|
26
|
+
|
27
|
+
@staticmethod
|
28
|
+
def articolo(isDeterminativo:bool,isMaschile:bool)->str:
|
29
|
+
if isDeterminativo:
|
30
|
+
if isMaschile:
|
31
|
+
return "il"
|
32
|
+
return "la"
|
33
|
+
if isMaschile:
|
34
|
+
return "un"
|
35
|
+
return "una"
|
36
|
+
|
@@ -1,59 +1,59 @@
|
|
1
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
2
|
-
from modulitiz_micro.ModuloNumeri import ModuloNumeri
|
3
|
-
from modulitiz_micro.nlp.ModuloNlp import ModuloNlp
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloNlpDateAndTime(object):
|
7
|
-
@staticmethod
|
8
|
-
def dateToString(data,anno:str)->str:
|
9
|
-
dataStr=ModuloDate.dateToString(data,"%w %A %d %B")
|
10
|
-
numGiornoSett,giornoSett,giorno,mese=dataStr.split(" ")
|
11
|
-
# sistemo grammaticalmente gli articoli, verbi, ...
|
12
|
-
numGiornoSett=int(numGiornoSett)
|
13
|
-
giorno=int(giorno)
|
14
|
-
articoloGiornoMese="il "
|
15
|
-
giornoParola=giorno
|
16
|
-
if giorno in (1,8,11):
|
17
|
-
articoloGiornoMese="l'"
|
18
|
-
giornoParola=ModuloNumeri.numberToWord(giorno)
|
19
|
-
verbo=ModuloNlp.verboEssere(data<ModuloDate.now())
|
20
|
-
articoloGiornoSett=ModuloNlp.articolo(False,numGiornoSett!=0)
|
21
|
-
output=f"{articoloGiornoMese}{giornoParola} {mese}{anno} {verbo} {articoloGiornoSett} {giornoSett}"
|
22
|
-
output=output.lower()
|
23
|
-
return output
|
24
|
-
|
25
|
-
@classmethod
|
26
|
-
def minutesToTimeRelative(cls,minutes:int,arrotonda:bool)->str:
|
27
|
-
prefixTempo=""
|
28
|
-
minutes,hoursDiff,hoursWord=cls.__minutesToHours(minutes)
|
29
|
-
# minuti
|
30
|
-
minutesWord=minutes
|
31
|
-
if minutes==1:
|
32
|
-
minutesWord="un"
|
33
|
-
elif 10<minutes<60:
|
34
|
-
if arrotonda is True and minutes%10!=0:
|
35
|
-
prefixTempo=" circa"
|
36
|
-
minutes=round(minutes,-1)
|
37
|
-
minutesWord=minutes
|
38
|
-
output="Fino a"+prefixTempo
|
39
|
-
if hoursDiff>0:
|
40
|
-
output+=" %s or%s"%(hoursWord,("a" if hoursDiff==1 else "e"))
|
41
|
-
if minutes>0:
|
42
|
-
output+=" e"
|
43
|
-
if minutes>0:
|
44
|
-
output+=" %s minut%s"%(minutesWord,("o" if minutes==1 else "i"))
|
45
|
-
return output
|
46
|
-
|
47
|
-
@staticmethod
|
48
|
-
def __minutesToHours(minutes:int)->tuple:
|
49
|
-
hoursDiff=0
|
50
|
-
hoursWord=""
|
51
|
-
if minutes<60:
|
52
|
-
return minutes,hoursDiff,hoursWord
|
53
|
-
hoursDiff=minutes//60
|
54
|
-
minutes=minutes%60
|
55
|
-
if hoursDiff==1:
|
56
|
-
hoursWord="un"
|
57
|
-
else:
|
58
|
-
hoursWord=hoursDiff
|
59
|
-
return minutes,hoursDiff,hoursWord
|
1
|
+
from modulitiz_micro.ModuloDate import ModuloDate
|
2
|
+
from modulitiz_micro.ModuloNumeri import ModuloNumeri
|
3
|
+
from modulitiz_micro.nlp.ModuloNlp import ModuloNlp
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloNlpDateAndTime(object):
|
7
|
+
@staticmethod
|
8
|
+
def dateToString(data,anno:str)->str:
|
9
|
+
dataStr=ModuloDate.dateToString(data,"%w %A %d %B")
|
10
|
+
numGiornoSett,giornoSett,giorno,mese=dataStr.split(" ")
|
11
|
+
# sistemo grammaticalmente gli articoli, verbi, ...
|
12
|
+
numGiornoSett=int(numGiornoSett)
|
13
|
+
giorno=int(giorno)
|
14
|
+
articoloGiornoMese="il "
|
15
|
+
giornoParola=giorno
|
16
|
+
if giorno in (1,8,11):
|
17
|
+
articoloGiornoMese="l'"
|
18
|
+
giornoParola=ModuloNumeri.numberToWord(giorno)
|
19
|
+
verbo=ModuloNlp.verboEssere(data<ModuloDate.now())
|
20
|
+
articoloGiornoSett=ModuloNlp.articolo(False,numGiornoSett!=0)
|
21
|
+
output=f"{articoloGiornoMese}{giornoParola} {mese}{anno} {verbo} {articoloGiornoSett} {giornoSett}"
|
22
|
+
output=output.lower()
|
23
|
+
return output
|
24
|
+
|
25
|
+
@classmethod
|
26
|
+
def minutesToTimeRelative(cls,minutes:int,arrotonda:bool)->str:
|
27
|
+
prefixTempo=""
|
28
|
+
minutes,hoursDiff,hoursWord=cls.__minutesToHours(minutes)
|
29
|
+
# minuti
|
30
|
+
minutesWord=minutes
|
31
|
+
if minutes==1:
|
32
|
+
minutesWord="un"
|
33
|
+
elif 10<minutes<60:
|
34
|
+
if arrotonda is True and minutes%10!=0:
|
35
|
+
prefixTempo=" circa"
|
36
|
+
minutes=round(minutes,-1)
|
37
|
+
minutesWord=minutes
|
38
|
+
output="Fino a"+prefixTempo
|
39
|
+
if hoursDiff>0:
|
40
|
+
output+=" %s or%s"%(hoursWord,("a" if hoursDiff==1 else "e"))
|
41
|
+
if minutes>0:
|
42
|
+
output+=" e"
|
43
|
+
if minutes>0:
|
44
|
+
output+=" %s minut%s"%(minutesWord,("o" if minutes==1 else "i"))
|
45
|
+
return output
|
46
|
+
|
47
|
+
@staticmethod
|
48
|
+
def __minutesToHours(minutes:int)->tuple:
|
49
|
+
hoursDiff=0
|
50
|
+
hoursWord=""
|
51
|
+
if minutes<60:
|
52
|
+
return minutes,hoursDiff,hoursWord
|
53
|
+
hoursDiff=minutes//60
|
54
|
+
minutes=minutes%60
|
55
|
+
if hoursDiff==1:
|
56
|
+
hoursWord="un"
|
57
|
+
else:
|
58
|
+
hoursWord=hoursDiff
|
59
|
+
return minutes,hoursDiff,hoursWord
|
@@ -1,64 +1,64 @@
|
|
1
|
-
import os
|
2
|
-
import socket
|
3
|
-
from contextlib import closing
|
4
|
-
from uuid import getnode
|
5
|
-
|
6
|
-
from _socket import gaierror
|
7
|
-
|
8
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
9
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
10
|
-
from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
|
11
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
12
|
-
|
13
|
-
|
14
|
-
class ModuloNetworking(object):
|
15
|
-
@staticmethod
|
16
|
-
def getMacAddress()->str:
|
17
|
-
mac=("%012X" % getnode())
|
18
|
-
return mac
|
19
|
-
|
20
|
-
@staticmethod
|
21
|
-
def getIp()->str|None:
|
22
|
-
sockObj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
23
|
-
sockObj.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
24
|
-
# doesn't even have to be reachable
|
25
|
-
try:
|
26
|
-
sockObj.connect(('255.255.255.255', 1))
|
27
|
-
indirizzoIp = sockObj.getsockname()[0]
|
28
|
-
except gaierror:
|
29
|
-
indirizzoIp = None
|
30
|
-
finally:
|
31
|
-
sockObj.close()
|
32
|
-
return indirizzoIp
|
33
|
-
|
34
|
-
@staticmethod
|
35
|
-
def isHttpPortOpen(host:str|None,port:int)->bool:
|
36
|
-
# controllo host
|
37
|
-
if host is None:
|
38
|
-
host="127.0.0.1"
|
39
|
-
# controllo porta
|
40
|
-
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
|
41
|
-
if sock.connect_ex((host, port)) == 0:
|
42
|
-
return True
|
43
|
-
return False
|
44
|
-
|
45
|
-
@staticmethod
|
46
|
-
def checkPing(indirizzoIp:str)->bool:
|
47
|
-
# costruisco il comando a seconda del sistema operativo
|
48
|
-
comando="ping "
|
49
|
-
if ModuloSystem.isWindows():
|
50
|
-
comando+="-n"
|
51
|
-
elif os.name=='posix':
|
52
|
-
comando+="-c"
|
53
|
-
else:
|
54
|
-
raise EccezioneRuntime("Tipologia del sistema operativo non riconosciuta: "+os.name)
|
55
|
-
comando+=" 1 " + indirizzoIp
|
56
|
-
# eseguo il comando
|
57
|
-
outputComando=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(comando,None))
|
58
|
-
righe=outputComando.split("\n")
|
59
|
-
righe=ModuloListe.eliminaElementiVuoti(righe)
|
60
|
-
for riga in righe:
|
61
|
-
if ModuloStringhe.contains(riga, "%"):
|
62
|
-
numPacchettiPersi=int(riga.split("=")[1].split("(")[0].strip())
|
63
|
-
return numPacchettiPersi==0
|
64
|
-
return False
|
1
|
+
import os
|
2
|
+
import socket
|
3
|
+
from contextlib import closing
|
4
|
+
from uuid import getnode
|
5
|
+
|
6
|
+
from _socket import gaierror
|
7
|
+
|
8
|
+
from modulitiz_micro.ModuloListe import ModuloListe
|
9
|
+
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
10
|
+
from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
|
11
|
+
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
12
|
+
|
13
|
+
|
14
|
+
class ModuloNetworking(object):
|
15
|
+
@staticmethod
|
16
|
+
def getMacAddress()->str:
|
17
|
+
mac=("%012X" % getnode())
|
18
|
+
return mac
|
19
|
+
|
20
|
+
@staticmethod
|
21
|
+
def getIp()->str|None:
|
22
|
+
sockObj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
23
|
+
sockObj.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
24
|
+
# doesn't even have to be reachable
|
25
|
+
try:
|
26
|
+
sockObj.connect(('255.255.255.255', 1))
|
27
|
+
indirizzoIp = sockObj.getsockname()[0]
|
28
|
+
except gaierror:
|
29
|
+
indirizzoIp = None
|
30
|
+
finally:
|
31
|
+
sockObj.close()
|
32
|
+
return indirizzoIp
|
33
|
+
|
34
|
+
@staticmethod
|
35
|
+
def isHttpPortOpen(host:str|None,port:int)->bool:
|
36
|
+
# controllo host
|
37
|
+
if host is None:
|
38
|
+
host="127.0.0.1"
|
39
|
+
# controllo porta
|
40
|
+
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
|
41
|
+
if sock.connect_ex((host, port)) == 0:
|
42
|
+
return True
|
43
|
+
return False
|
44
|
+
|
45
|
+
@staticmethod
|
46
|
+
def checkPing(indirizzoIp:str)->bool:
|
47
|
+
# costruisco il comando a seconda del sistema operativo
|
48
|
+
comando="ping "
|
49
|
+
if ModuloSystem.isWindows():
|
50
|
+
comando+="-n"
|
51
|
+
elif os.name=='posix':
|
52
|
+
comando+="-c"
|
53
|
+
else:
|
54
|
+
raise EccezioneRuntime("Tipologia del sistema operativo non riconosciuta: "+os.name)
|
55
|
+
comando+=" 1 " + indirizzoIp
|
56
|
+
# eseguo il comando
|
57
|
+
outputComando=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(comando,None))
|
58
|
+
righe=outputComando.split("\n")
|
59
|
+
righe=ModuloListe.eliminaElementiVuoti(righe)
|
60
|
+
for riga in righe:
|
61
|
+
if ModuloStringhe.contains(riga, "%"):
|
62
|
+
numPacchettiPersi=int(riga.split("=")[1].split("(")[0].strip())
|
63
|
+
return numPacchettiPersi==0
|
64
|
+
return False
|
@@ -1,15 +1,15 @@
|
|
1
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
2
|
-
|
3
|
-
|
4
|
-
class ModuloOpenVpn(object):
|
5
|
-
def __init__(self,percorsoOpenVpn:str):
|
6
|
-
self.__percorsoOpenVpn=percorsoOpenVpn
|
7
|
-
|
8
|
-
def startVpn(self,isOpenVpnAlreadyRunning:bool,filenameOvpn:str):
|
9
|
-
"""
|
10
|
-
Send a command to start vpn to a new or already running instance of the GUI.
|
11
|
-
https://community.openvpn.net/openvpn/wiki/OpenVPN-GUI-New#gui-help
|
12
|
-
"""
|
13
|
-
subCmd="--command connect" if isOpenVpnAlreadyRunning else "--connect"
|
14
|
-
cmd=r'start "" "{}" {} {}.ovpn'.format(self.__percorsoOpenVpn,subCmd,filenameOvpn)
|
15
|
-
ModuloSystem.systemCallWaitAndClose(cmd,False)
|
1
|
+
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
2
|
+
|
3
|
+
|
4
|
+
class ModuloOpenVpn(object):
|
5
|
+
def __init__(self,percorsoOpenVpn:str):
|
6
|
+
self.__percorsoOpenVpn=percorsoOpenVpn
|
7
|
+
|
8
|
+
def startVpn(self,isOpenVpnAlreadyRunning:bool,filenameOvpn:str):
|
9
|
+
"""
|
10
|
+
Send a command to start vpn to a new or already running instance of the GUI.
|
11
|
+
https://community.openvpn.net/openvpn/wiki/OpenVPN-GUI-New#gui-help
|
12
|
+
"""
|
13
|
+
subCmd="--command connect" if isOpenVpnAlreadyRunning else "--connect"
|
14
|
+
cmd=r'start "" "{}" {} {}.ovpn'.format(self.__percorsoOpenVpn,subCmd,filenameOvpn)
|
15
|
+
ModuloSystem.systemCallWaitAndClose(cmd,False)
|
@@ -1,69 +1,90 @@
|
|
1
|
-
import smtplib
|
2
|
-
|
3
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
4
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
5
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
6
|
-
|
7
|
-
|
8
|
-
class ModuloEmail(object):
|
9
|
-
SERVER_GOOGLE_INVIO=('smtp.gmail.com',smtplib.SMTP_SSL_PORT)
|
10
|
-
SERVER_VIRGILIO_INVIO=('out.virgilio.it',smtplib.SMTP_SSL_PORT)
|
11
|
-
|
12
|
-
def __init__(self,credenzialiServer:tuple,isDebug:bool=False):
|
13
|
-
self.credenzialiServer=credenzialiServer
|
14
|
-
self.isDebug=isDebug
|
15
|
-
self.connEmail=None
|
16
|
-
self.
|
17
|
-
self.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if
|
27
|
-
self.
|
28
|
-
|
29
|
-
self.
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
1
|
+
import smtplib
|
2
|
+
|
3
|
+
from modulitiz_micro.ModuloDate import ModuloDate
|
4
|
+
from modulitiz_micro.ModuloListe import ModuloListe
|
5
|
+
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
6
|
+
|
7
|
+
|
8
|
+
class ModuloEmail(object):
|
9
|
+
SERVER_GOOGLE_INVIO=('smtp.gmail.com',smtplib.SMTP_SSL_PORT)
|
10
|
+
SERVER_VIRGILIO_INVIO=('out.virgilio.it',smtplib.SMTP_SSL_PORT)
|
11
|
+
|
12
|
+
def __init__(self,credenzialiServer:tuple,user:str|None,password:str|None,isDebug:bool=False):
|
13
|
+
self.credenzialiServer=credenzialiServer
|
14
|
+
self.isDebug=isDebug
|
15
|
+
self.connEmail=None
|
16
|
+
self.user=user
|
17
|
+
self.password=password
|
18
|
+
self.isLogged=False
|
19
|
+
|
20
|
+
def login(self,user:str|None=None,password:str|None=None):
|
21
|
+
if self.isLogged:
|
22
|
+
return
|
23
|
+
# controllo se usare le credenziali dei parametri o quelle della classe
|
24
|
+
if user is not None:
|
25
|
+
self.user=user
|
26
|
+
if password is not None:
|
27
|
+
self.password=password
|
28
|
+
# mi collego
|
29
|
+
self.connEmail=smtplib.SMTP_SSL(*self.credenzialiServer)
|
30
|
+
if self.isDebug:
|
31
|
+
self.connEmail.set_debuglevel(1)
|
32
|
+
# se serve setto l'autenticazione
|
33
|
+
if self.user is not None and self.password is not None:
|
34
|
+
self.connEmail.login(self.user,self.password)
|
35
|
+
self.isLogged=True
|
36
|
+
|
37
|
+
def sendWithLoginAndClose(self,destinatari:str|list|tuple, oggetto:str, messaggio:str,
|
38
|
+
isHtml:bool)->dict:
|
39
|
+
# controllo se gia' loggato
|
40
|
+
if self.isLogged is False:
|
41
|
+
self.login(self.user,self.password)
|
42
|
+
# invio email
|
43
|
+
try:
|
44
|
+
errors=self.send(None,destinatari,oggetto,messaggio,isHtml)
|
45
|
+
except Exception as ex:
|
46
|
+
self.close()
|
47
|
+
raise ex
|
48
|
+
# chiudo la connessione
|
49
|
+
self.close()
|
50
|
+
return errors
|
51
|
+
|
52
|
+
def send(self, mittente:str|None,destinatari:str|list|tuple, oggetto:str, messaggio:str,
|
53
|
+
isHtml:bool, dataInvio=ModuloDate.now(), cc=None, ccn=None)->dict:
|
54
|
+
# controllo i parametri
|
55
|
+
dataInvio=ModuloDate.dateToString(dataInvio)
|
56
|
+
if isinstance(destinatari, str):
|
57
|
+
destinatari=[destinatari]
|
58
|
+
if mittente is None:
|
59
|
+
mittente=self.user
|
60
|
+
domain=self.user.split("@")[-1]
|
61
|
+
messageId=f"{ModuloDate.getSecs()}@{domain}"
|
62
|
+
# creo il messaggio
|
63
|
+
message=f"""Date: {dataInvio}
|
64
|
+
From: {mittente}
|
65
|
+
Subject: {oggetto}
|
66
|
+
To: {", ".join(destinatari)}
|
67
|
+
Message-ID: <{messageId}>
|
68
|
+
"""
|
69
|
+
if not ModuloListe.isEmpty(cc):
|
70
|
+
message+=("Cc: "+", ".join(cc))+"\n"
|
71
|
+
if not ModuloListe.isEmpty(ccn):
|
72
|
+
message+=("Bcc: "+", ".join(ccn))+"\n"
|
73
|
+
message+="Content-Type: text/html;\n"
|
74
|
+
# converto il messaggio in formato html
|
75
|
+
if not isHtml:
|
76
|
+
messaggio=ModuloStringhe.normalizzaEol(messaggio).replace("\n","<br/>\n")
|
77
|
+
messaggio=messaggio.encode(ModuloStringhe.CODIFICA_ASCII,"xmlcharrefreplace").decode(ModuloStringhe.CODIFICA_UTF8)
|
78
|
+
message+="\n"+messaggio
|
79
|
+
# invio la mail
|
80
|
+
try:
|
81
|
+
return self.connEmail.sendmail(mittente,destinatari,message)
|
82
|
+
except smtplib.SMTPServerDisconnected as ex:
|
83
|
+
return {"":str(ex)}
|
84
|
+
|
85
|
+
def close(self):
|
86
|
+
if self.connEmail is None:
|
87
|
+
return
|
88
|
+
self.connEmail.quit()
|
89
|
+
self.connEmail=None
|
90
|
+
self.isLogged=False
|