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
@@ -1,69 +1,69 @@
|
|
1
|
-
import json
|
2
|
-
import random
|
3
|
-
from urllib.parse import quote_plus
|
4
|
-
from urllib.parse import unquote_plus
|
5
|
-
|
6
|
-
import requests
|
7
|
-
|
8
|
-
from
|
9
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
10
|
-
from
|
11
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
12
|
-
from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
|
13
|
-
from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
|
14
|
-
|
15
|
-
|
16
|
-
class ModuloHttpUtils(object):
|
17
|
-
@staticmethod
|
18
|
-
def isUrlAvailable(logger:ModuloLogging|None,url:str,retries:int,ignoreCerts:bool=False) -> bool:
|
19
|
-
if retries!=0:
|
20
|
-
connectionSafe=ModuloHttpConnectionSafe(logger)
|
21
|
-
return connectionSafe.run(retries,0,ModuloHttpUtils.__isUrlAvailable,url,ignoreCerts)
|
22
|
-
try:
|
23
|
-
return ModuloHttpUtils.__isUrlAvailable(url,ignoreCerts)
|
24
|
-
except EccezioneHttpGeneric:
|
25
|
-
return False
|
26
|
-
|
27
|
-
@staticmethod
|
28
|
-
@catchAndRaiseHttpExceptions
|
29
|
-
def __isUrlAvailable(url:str,ignoreCerts:bool) -> bool:
|
30
|
-
with requests.get(url,stream=True,verify=(not ignoreCerts)) as response:
|
31
|
-
return response.status_code==ModuloHttp.STATUS_OK
|
32
|
-
|
33
|
-
@staticmethod
|
34
|
-
def getIpV4() -> str|None:
|
35
|
-
"""
|
36
|
-
Returns public external IpV4 address.
|
37
|
-
"""
|
38
|
-
url=random.choice(ModuloHttp.URLS_GET_IPV4)
|
39
|
-
http=ModuloHttp(url,None)
|
40
|
-
try:
|
41
|
-
response=http.doGet(2,False)
|
42
|
-
except EccezioneHttpGeneric:
|
43
|
-
return None
|
44
|
-
if response is None:
|
45
|
-
return None
|
46
|
-
return response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
|
47
|
-
|
48
|
-
@classmethod
|
49
|
-
def translate(cls,langFrom:str|None,langTo:str,msg:str) -> str|None:
|
50
|
-
if langFrom is None:
|
51
|
-
langFrom="auto"
|
52
|
-
msg=cls.encodeUrl(msg)
|
53
|
-
url=f'https://translate.googleapis.com/translate_a/single?client=gtx&sl={langFrom}&tl={langTo}&dt=t&q={msg}'
|
54
|
-
http=ModuloHttp(url,None)
|
55
|
-
try:
|
56
|
-
response=http.doGet(3,False)
|
57
|
-
except EccezioneHttpGeneric:
|
58
|
-
return None
|
59
|
-
responseText=response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
|
60
|
-
result=json.loads(responseText)
|
61
|
-
output="".join(x[0] for x in result[0])
|
62
|
-
return output
|
63
|
-
|
64
|
-
@staticmethod
|
65
|
-
def encodeUrl(url: str) -> str:
|
66
|
-
return quote_plus(url)
|
67
|
-
@staticmethod
|
68
|
-
def decodeUrl(url: str) -> str:
|
69
|
-
return unquote_plus(url)
|
1
|
+
import json
|
2
|
+
import random
|
3
|
+
from urllib.parse import quote_plus
|
4
|
+
from urllib.parse import unquote_plus
|
5
|
+
|
6
|
+
import requests
|
7
|
+
|
8
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
9
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
10
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
11
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
12
|
+
from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
|
13
|
+
from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
|
14
|
+
|
15
|
+
|
16
|
+
class ModuloHttpUtils(object):
|
17
|
+
@staticmethod
|
18
|
+
def isUrlAvailable(logger:ModuloLogging|None,url:str,retries:int,ignoreCerts:bool=False) -> bool:
|
19
|
+
if retries!=0:
|
20
|
+
connectionSafe=ModuloHttpConnectionSafe(logger)
|
21
|
+
return connectionSafe.run(retries,0,ModuloHttpUtils.__isUrlAvailable,url,ignoreCerts)
|
22
|
+
try:
|
23
|
+
return ModuloHttpUtils.__isUrlAvailable(url,ignoreCerts)
|
24
|
+
except EccezioneHttpGeneric:
|
25
|
+
return False
|
26
|
+
|
27
|
+
@staticmethod
|
28
|
+
@catchAndRaiseHttpExceptions
|
29
|
+
def __isUrlAvailable(url:str,ignoreCerts:bool) -> bool:
|
30
|
+
with requests.get(url,stream=True,verify=(not ignoreCerts)) as response:
|
31
|
+
return response.status_code==ModuloHttp.STATUS_OK
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def getIpV4() -> str|None:
|
35
|
+
"""
|
36
|
+
Returns public external IpV4 address.
|
37
|
+
"""
|
38
|
+
url=random.choice(ModuloHttp.URLS_GET_IPV4)
|
39
|
+
http=ModuloHttp(url,None)
|
40
|
+
try:
|
41
|
+
response=http.doGet(2,False)
|
42
|
+
except EccezioneHttpGeneric:
|
43
|
+
return None
|
44
|
+
if response is None:
|
45
|
+
return None
|
46
|
+
return response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
|
47
|
+
|
48
|
+
@classmethod
|
49
|
+
def translate(cls,langFrom:str|None,langTo:str,msg:str) -> str|None:
|
50
|
+
if langFrom is None:
|
51
|
+
langFrom="auto"
|
52
|
+
msg=cls.encodeUrl(msg)
|
53
|
+
url=f'https://translate.googleapis.com/translate_a/single?client=gtx&sl={langFrom}&tl={langTo}&dt=t&q={msg}'
|
54
|
+
http=ModuloHttp(url,None)
|
55
|
+
try:
|
56
|
+
response=http.doGet(3,False)
|
57
|
+
except EccezioneHttpGeneric:
|
58
|
+
return None
|
59
|
+
responseText=response.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
|
60
|
+
result=json.loads(responseText)
|
61
|
+
output="".join(x[0] for x in result[0])
|
62
|
+
return output
|
63
|
+
|
64
|
+
@staticmethod
|
65
|
+
def encodeUrl(url: str) -> str:
|
66
|
+
return quote_plus(url)
|
67
|
+
@staticmethod
|
68
|
+
def decodeUrl(url: str) -> str:
|
69
|
+
return unquote_plus(url)
|
@@ -1,5 +1,5 @@
|
|
1
|
-
class HttpResponseBean(object):
|
2
|
-
def __init__(self,status:int,responseBody:bytes,responseHeaders:dict):
|
3
|
-
self.status=status
|
4
|
-
self.responseBody=responseBody
|
5
|
-
self.responseHeaders=responseHeaders
|
1
|
+
class HttpResponseBean(object):
|
2
|
+
def __init__(self,status:int,responseBody:bytes,responseHeaders:dict):
|
3
|
+
self.status=status
|
4
|
+
self.responseBody=responseBody
|
5
|
+
self.responseHeaders=responseHeaders
|
@@ -1,22 +1,22 @@
|
|
1
|
-
import socket
|
2
|
-
from functools import wraps
|
3
|
-
from urllib.error import URLError
|
4
|
-
|
5
|
-
import requests
|
6
|
-
|
7
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
8
|
-
|
9
|
-
|
10
|
-
def catchAndRaiseHttpExceptions(funzione):
|
11
|
-
"""
|
12
|
-
Cattura tutte le eccezioni http di vario tipo e rilancia un'eccezione custom
|
13
|
-
"""
|
14
|
-
|
15
|
-
@wraps(funzione)
|
16
|
-
def wrapped(*args,**kwargs):
|
17
|
-
try:
|
18
|
-
return funzione(*args,**kwargs)
|
19
|
-
except (ConnectionError,TimeoutError,URLError,
|
20
|
-
requests.exceptions.ConnectionError,socket.gaierror) as ex:
|
21
|
-
raise EccezioneHttpGeneric() from ex
|
22
|
-
return wrapped
|
1
|
+
import socket
|
2
|
+
from functools import wraps
|
3
|
+
from urllib.error import URLError
|
4
|
+
|
5
|
+
import requests
|
6
|
+
|
7
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
8
|
+
|
9
|
+
|
10
|
+
def catchAndRaiseHttpExceptions(funzione):
|
11
|
+
"""
|
12
|
+
Cattura tutte le eccezioni http di vario tipo e rilancia un'eccezione custom
|
13
|
+
"""
|
14
|
+
|
15
|
+
@wraps(funzione)
|
16
|
+
def wrapped(*args,**kwargs):
|
17
|
+
try:
|
18
|
+
return funzione(*args,**kwargs)
|
19
|
+
except (ConnectionError,TimeoutError,URLError,
|
20
|
+
requests.exceptions.ConnectionError,socket.gaierror) as ex:
|
21
|
+
raise EccezioneHttpGeneric() from ex
|
22
|
+
return wrapped
|
@@ -1,73 +1,73 @@
|
|
1
|
-
import socket
|
2
|
-
import struct
|
3
|
-
from abc import ABC
|
4
|
-
|
5
|
-
from
|
6
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
7
|
-
from
|
8
|
-
from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
|
9
|
-
from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
|
10
|
-
|
11
|
-
|
12
|
-
class AbstractModuloNtp(ABC):
|
13
|
-
REFRESH_CACHE_EVERY_SECS=4*3600*1000 # NTP request frequency
|
14
|
-
OFFSET_MILLIS=1 # offset correzione errore
|
15
|
-
TIMEOUT=10
|
16
|
-
|
17
|
-
__PORTA=123 # numero della porta (UDP)
|
18
|
-
__BUF=1024
|
19
|
-
__TIME1970=2208988800 # reference time, secondi da 1900-01-01 00:00:00 a 1970-01-01 00:00:00 = 70 anni
|
20
|
-
__MSG=('\x1b' + 47 * '\0').encode()
|
21
|
-
|
22
|
-
|
23
|
-
def __init__(self,host:str,logger:ModuloLogging):
|
24
|
-
self.logger=logger
|
25
|
-
self.connectionSafe = ModuloHttpConnectionSafe(logger)
|
26
|
-
self.host=host
|
27
|
-
self.lastNtpResponse=0
|
28
|
-
self.lastNtpTimestampUtc=0
|
29
|
-
|
30
|
-
def getTimestampUtcFromNtp(self,useCache:bool=True,retryIfError:bool=True)->int:
|
31
|
-
if useCache is True and self.lastNtpResponse!=0:
|
32
|
-
# controllo se e' passato poco tempo dall'ultima chiamata ntp
|
33
|
-
diffMillisLastResponse=(ModuloDate.getMillis()-self.lastNtpResponse)
|
34
|
-
if diffMillisLastResponse<self.REFRESH_CACHE_EVERY_SECS:
|
35
|
-
# calcolo l'ora attuale usando il cronometro interno
|
36
|
-
return self.lastNtpTimestampUtc+diffMillisLastResponse+self.OFFSET_MILLIS
|
37
|
-
# invio la richiesta e in caso di errore...
|
38
|
-
if not retryIfError:
|
39
|
-
#... uso il cronometro interno
|
40
|
-
try:
|
41
|
-
timestampUtc=self.__ntpSendPacket()
|
42
|
-
except EccezioneHttpGeneric:
|
43
|
-
timestampUtc=None
|
44
|
-
else:
|
45
|
-
#... riprovo
|
46
|
-
timestampUtc=self.connectionSafe.run(1,3,self.__ntpSendPacket)
|
47
|
-
if timestampUtc is None:
|
48
|
-
diffMillisLastResponse=(ModuloDate.getMillis()-self.lastNtpResponse)
|
49
|
-
return self.lastNtpTimestampUtc+diffMillisLastResponse+self.OFFSET_MILLIS
|
50
|
-
timestampUtc=timestampUtc*1000
|
51
|
-
# successo
|
52
|
-
self.lastNtpResponse=ModuloDate.getMillis()
|
53
|
-
self.lastNtpTimestampUtc=timestampUtc
|
54
|
-
return self.lastNtpTimestampUtc
|
55
|
-
|
56
|
-
def getDatetimeFromNtp(self,useCache:bool=True,retryIfError:bool=True):
|
57
|
-
tsSec=self.getTimestampUtcFromNtp(useCache,retryIfError)//1000
|
58
|
-
return ModuloDate.timestampUtcToDate(tsSec)
|
59
|
-
|
60
|
-
@catchAndRaiseHttpExceptions
|
61
|
-
def __ntpSendPacket(self)->int:
|
62
|
-
# connect to server
|
63
|
-
client=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
64
|
-
client.settimeout(self.TIMEOUT)
|
65
|
-
client.sendto(self.__MSG,(self.host,self.__PORTA))
|
66
|
-
# ricevo i dati
|
67
|
-
response=client.recvfrom(self.__BUF)[0]
|
68
|
-
# chiudo la socket
|
69
|
-
client.close()
|
70
|
-
# estraggo il timestamp
|
71
|
-
tsSec=struct.unpack("!12I",response)[10]
|
72
|
-
tsSec-=self.__TIME1970
|
73
|
-
return tsSec
|
1
|
+
import socket
|
2
|
+
import struct
|
3
|
+
from abc import ABC
|
4
|
+
|
5
|
+
from modulitiz_nano.ModuloDate import ModuloDate
|
6
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
7
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
8
|
+
from modulitiz_micro.rete.http.ModuloHttpConnectionSafe import ModuloHttpConnectionSafe
|
9
|
+
from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import catchAndRaiseHttpExceptions
|
10
|
+
|
11
|
+
|
12
|
+
class AbstractModuloNtp(ABC):
|
13
|
+
REFRESH_CACHE_EVERY_SECS=4*3600*1000 # NTP request frequency
|
14
|
+
OFFSET_MILLIS=1 # offset correzione errore
|
15
|
+
TIMEOUT=10
|
16
|
+
|
17
|
+
__PORTA=123 # numero della porta (UDP)
|
18
|
+
__BUF=1024
|
19
|
+
__TIME1970=2208988800 # reference time, secondi da 1900-01-01 00:00:00 a 1970-01-01 00:00:00 = 70 anni
|
20
|
+
__MSG=('\x1b' + 47 * '\0').encode()
|
21
|
+
|
22
|
+
|
23
|
+
def __init__(self,host:str,logger:ModuloLogging):
|
24
|
+
self.logger=logger
|
25
|
+
self.connectionSafe = ModuloHttpConnectionSafe(logger)
|
26
|
+
self.host=host
|
27
|
+
self.lastNtpResponse=0
|
28
|
+
self.lastNtpTimestampUtc=0
|
29
|
+
|
30
|
+
def getTimestampUtcFromNtp(self,useCache:bool=True,retryIfError:bool=True)->int:
|
31
|
+
if useCache is True and self.lastNtpResponse!=0:
|
32
|
+
# controllo se e' passato poco tempo dall'ultima chiamata ntp
|
33
|
+
diffMillisLastResponse=(ModuloDate.getMillis()-self.lastNtpResponse)
|
34
|
+
if diffMillisLastResponse<self.REFRESH_CACHE_EVERY_SECS:
|
35
|
+
# calcolo l'ora attuale usando il cronometro interno
|
36
|
+
return self.lastNtpTimestampUtc+diffMillisLastResponse+self.OFFSET_MILLIS
|
37
|
+
# invio la richiesta e in caso di errore...
|
38
|
+
if not retryIfError:
|
39
|
+
#... uso il cronometro interno
|
40
|
+
try:
|
41
|
+
timestampUtc=self.__ntpSendPacket()
|
42
|
+
except EccezioneHttpGeneric:
|
43
|
+
timestampUtc=None
|
44
|
+
else:
|
45
|
+
#... riprovo
|
46
|
+
timestampUtc=self.connectionSafe.run(1,3,self.__ntpSendPacket)
|
47
|
+
if timestampUtc is None:
|
48
|
+
diffMillisLastResponse=(ModuloDate.getMillis()-self.lastNtpResponse)
|
49
|
+
return self.lastNtpTimestampUtc+diffMillisLastResponse+self.OFFSET_MILLIS
|
50
|
+
timestampUtc=timestampUtc*1000
|
51
|
+
# successo
|
52
|
+
self.lastNtpResponse=ModuloDate.getMillis()
|
53
|
+
self.lastNtpTimestampUtc=timestampUtc
|
54
|
+
return self.lastNtpTimestampUtc
|
55
|
+
|
56
|
+
def getDatetimeFromNtp(self,useCache:bool=True,retryIfError:bool=True):
|
57
|
+
tsSec=self.getTimestampUtcFromNtp(useCache,retryIfError)//1000
|
58
|
+
return ModuloDate.timestampUtcToDate(tsSec)
|
59
|
+
|
60
|
+
@catchAndRaiseHttpExceptions
|
61
|
+
def __ntpSendPacket(self)->int:
|
62
|
+
# connect to server
|
63
|
+
client=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
64
|
+
client.settimeout(self.TIMEOUT)
|
65
|
+
client.sendto(self.__MSG,(self.host,self.__PORTA))
|
66
|
+
# ricevo i dati
|
67
|
+
response=client.recvfrom(self.__BUF)[0]
|
68
|
+
# chiudo la socket
|
69
|
+
client.close()
|
70
|
+
# estraggo il timestamp
|
71
|
+
tsSec=struct.unpack("!12I",response)[10]
|
72
|
+
tsSec-=self.__TIME1970
|
73
|
+
return tsSec
|
@@ -1,8 +1,8 @@
|
|
1
|
-
from modulitiz_micro.rete.ntp.AbstractModuloNtp import AbstractModuloNtp
|
2
|
-
|
3
|
-
|
4
|
-
class ModuloNtpIt(AbstractModuloNtp):
|
5
|
-
HOST_IT="ntp1.inrim.it"
|
6
|
-
|
7
|
-
def __init__(self,*args,**kwargs):
|
8
|
-
super().__init__(self.HOST_IT,*args,**kwargs)
|
1
|
+
from modulitiz_micro.rete.ntp.AbstractModuloNtp import AbstractModuloNtp
|
2
|
+
|
3
|
+
|
4
|
+
class ModuloNtpIt(AbstractModuloNtp):
|
5
|
+
HOST_IT="ntp1.inrim.it"
|
6
|
+
|
7
|
+
def __init__(self,*args,**kwargs):
|
8
|
+
super().__init__(self.HOST_IT,*args,**kwargs)
|
@@ -1,35 +1,35 @@
|
|
1
|
-
from abc import abstractmethod
|
2
|
-
|
3
|
-
from
|
4
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttp import EccezioneHttp
|
5
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
6
|
-
from modulitiz_micro.rete.socketserver.AbstractSocketServer import AbstractSocketServer
|
7
|
-
|
8
|
-
|
9
|
-
class AbstractBasicGetSocketServer(AbstractSocketServer):
|
10
|
-
|
11
|
-
def __init__(self,*args,**kwargs):
|
12
|
-
super().__init__(*args,**kwargs)
|
13
|
-
|
14
|
-
@abstractmethod
|
15
|
-
def processResponse(self,clientIp:str,path:str,params:dict)->str|None:
|
16
|
-
"""
|
17
|
-
Cosa fare se la richiesta e' formalmente corretta.
|
18
|
-
Deve ritornare un output per chi ha fatto la richiesta
|
19
|
-
"""
|
20
|
-
|
21
|
-
def handleRequest(self,method:str,url:str,path:str,params:dict,httpType:str,clientIp:str,clientPort:int)->tuple:
|
22
|
-
if method!='GET' or not ModuloStringhe.contains(httpType,'HTTP') or ModuloStringhe.isEmpty(url):
|
23
|
-
return 500,None,None
|
24
|
-
# controllo parametri
|
25
|
-
httpCode=ModuloHttp.STATUS_OK
|
26
|
-
responseBody=""
|
27
|
-
try:
|
28
|
-
responseBody=self.processResponse(clientIp,path,params)
|
29
|
-
except Exception as ex:
|
30
|
-
if not isinstance(ex, EccezioneHttp):
|
31
|
-
self.callbackError(ex)
|
32
|
-
httpCode=500
|
33
|
-
else:
|
34
|
-
httpCode=ex.httpCode
|
35
|
-
return httpCode,None,responseBody
|
1
|
+
from abc import abstractmethod
|
2
|
+
|
3
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
4
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttp import EccezioneHttp
|
5
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
6
|
+
from modulitiz_micro.rete.socketserver.AbstractSocketServer import AbstractSocketServer
|
7
|
+
|
8
|
+
|
9
|
+
class AbstractBasicGetSocketServer(AbstractSocketServer):
|
10
|
+
|
11
|
+
def __init__(self,*args,**kwargs):
|
12
|
+
super().__init__(*args,**kwargs)
|
13
|
+
|
14
|
+
@abstractmethod
|
15
|
+
def processResponse(self,clientIp:str,path:str,params:dict)->str|None:
|
16
|
+
"""
|
17
|
+
Cosa fare se la richiesta e' formalmente corretta.
|
18
|
+
Deve ritornare un output per chi ha fatto la richiesta
|
19
|
+
"""
|
20
|
+
|
21
|
+
def handleRequest(self,method:str,url:str,path:str,params:dict,httpType:str,clientIp:str,clientPort:int)->tuple:
|
22
|
+
if method!='GET' or not ModuloStringhe.contains(httpType,'HTTP') or ModuloStringhe.isEmpty(url):
|
23
|
+
return 500,None,None
|
24
|
+
# controllo parametri
|
25
|
+
httpCode=ModuloHttp.STATUS_OK
|
26
|
+
responseBody=""
|
27
|
+
try:
|
28
|
+
responseBody=self.processResponse(clientIp,path,params)
|
29
|
+
except Exception as ex:
|
30
|
+
if not isinstance(ex, EccezioneHttp):
|
31
|
+
self.callbackError(ex)
|
32
|
+
httpCode=500
|
33
|
+
else:
|
34
|
+
httpCode=ex.httpCode
|
35
|
+
return httpCode,None,responseBody
|