modulitiz-micro 2.43.0__py311-none-any.whl → 2.44.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 -47
- 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 +62 -62
- 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/http/huawei/fusionsolar/ModuleHuaweiFusionSolar.py +84 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/beans/TokenBean.py +28 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceBean.py +6 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataBattery.py +22 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataPowerSensor.py +49 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataResidentialInverter.py +46 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/enums/DevTypeIdEnum.py +21 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/exceptions/ExceptionTooManyLogins.py +7 -0
- modulitiz_micro/rete/http/huawei/fusionsolar/service/AbstractHuaweiFusionSolar.py +71 -0
- 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/ModuleScheduler.py +26 -26
- {modulitiz_micro-2.43.0.dist-info → modulitiz_micro-2.44.0.dist-info}/METADATA +59 -59
- modulitiz_micro-2.44.0.dist-info/RECORD +65 -0
- {modulitiz_micro-2.43.0.dist-info → modulitiz_micro-2.44.0.dist-info}/licenses/LICENSE +21 -21
- modulitiz_micro-2.43.0.dist-info/RECORD +0 -56
- {modulitiz_micro-2.43.0.dist-info → modulitiz_micro-2.44.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.43.0.dist-info → modulitiz_micro-2.44.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
import json
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
5
|
+
from modulitiz_micro.rete.http.beans.HttpResponseBean import HttpResponseBean
|
6
|
+
from modulitiz_micro.rete.http.huawei.fusionsolar.beans.TokenBean import TokenBean
|
7
|
+
from modulitiz_micro.rete.http.huawei.fusionsolar.exceptions.ExceptionTooManyLogins import ExceptionTooManyLogins
|
8
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
9
|
+
from modulitiz_nano.eccezioni.EccezioneRuntime import EccezioneRuntime
|
10
|
+
from modulitiz_nano.files.ModuloFiles import ModuloFiles
|
11
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
12
|
+
|
13
|
+
|
14
|
+
class AbstractHuaweiFusionSolar(ABC):
|
15
|
+
URL_PREFIX="https://eu5.fusionsolar.huawei.com/thirdData/"
|
16
|
+
XSRF_TOKEN="XSRF-TOKEN"
|
17
|
+
|
18
|
+
def __init__(self,logger:ModuloLogging, user: str,pwd: str,sessionFileName: str):
|
19
|
+
self._logger=logger
|
20
|
+
self.__user=user
|
21
|
+
self.__pwd=pwd
|
22
|
+
self.__sessionFileName=sessionFileName
|
23
|
+
self.countRequests=0
|
24
|
+
self.__tokenBean:TokenBean|None=None
|
25
|
+
|
26
|
+
def populate(self):
|
27
|
+
if ModuloFiles.getFileSize(self.__sessionFileName)<=0:
|
28
|
+
return
|
29
|
+
# load token
|
30
|
+
with open(self.__sessionFileName,"rt") as f:
|
31
|
+
diz=json.load(f)
|
32
|
+
self.__tokenBean=TokenBean.fromDict(diz)
|
33
|
+
|
34
|
+
def __login(self):
|
35
|
+
self._makeGenericRequest("login", {"userName":self.__user,"systemCode":self.__pwd})
|
36
|
+
|
37
|
+
def _makeGenericRequest(self,urlSuffix: str, postData:dict)->dict:
|
38
|
+
isLogin=urlSuffix=="login"
|
39
|
+
if not isLogin:
|
40
|
+
# check if login is needed
|
41
|
+
if self.__tokenBean is None or self.__tokenBean.isExpired():
|
42
|
+
self.__login()
|
43
|
+
else:
|
44
|
+
# check if it's too early to call login
|
45
|
+
if self.__tokenBean is not None and self.__tokenBean.isTooEarly():
|
46
|
+
raise ExceptionTooManyLogins()
|
47
|
+
bean=self._makeInnerRequest(urlSuffix, postData, isLogin)
|
48
|
+
if bean.status!=ModuloHttp.STATUS_OK:
|
49
|
+
raise EccezioneRuntime("Status code %d"%(bean.status,))
|
50
|
+
# parse content
|
51
|
+
responseText=bean.responseBody.decode(ModuloStringhe.CODIFICA_UTF8)
|
52
|
+
if ModuloStringhe.isEmpty(responseText):
|
53
|
+
raise EccezioneRuntime("Response empty")
|
54
|
+
jsonObj=json.loads(responseText)
|
55
|
+
failCode=jsonObj['failCode']
|
56
|
+
if not jsonObj['success'] or failCode!=0:
|
57
|
+
raise EccezioneRuntime("Response call '%s' error %d:\n%s"%(urlSuffix,failCode,responseText))
|
58
|
+
# save token
|
59
|
+
if isLogin:
|
60
|
+
self.__tokenBean=TokenBean(bean.responseHeaders[self.XSRF_TOKEN])
|
61
|
+
with open(self.__sessionFileName,"wt") as f:
|
62
|
+
json.dump(self.__tokenBean.toDict(),f,indent=4)
|
63
|
+
return jsonObj['data']
|
64
|
+
|
65
|
+
def _makeInnerRequest(self,urlSuffix: str,postData: dict, isLogin:bool) -> HttpResponseBean:
|
66
|
+
moduleHttp=ModuloHttp(self.URL_PREFIX+urlSuffix,self._logger,False)
|
67
|
+
if not isLogin:
|
68
|
+
moduleHttp.addHeader(self.XSRF_TOKEN,self.__tokenBean.value)
|
69
|
+
bean=moduleHttp.doPost(postData,True,0,False)
|
70
|
+
self.countRequests+=1
|
71
|
+
return bean
|
@@ -1,73 +1,73 @@
|
|
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
|
+
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 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
|
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
|