modulitiz-micro 2.42.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.
Files changed (63) hide show
  1. modulitiz_micro/ModuloMeteo.py +72 -72
  2. modulitiz_micro/ModuloSeriale.py +70 -70
  3. modulitiz_micro/ModuloTarghe.py +47 -47
  4. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  5. modulitiz_micro/database/AbstractSql.py +69 -69
  6. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  7. modulitiz_micro/database/ModuloSqlServer.py +43 -43
  8. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  9. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  10. modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
  11. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  12. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  13. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  14. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  15. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  16. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  17. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  18. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  19. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  20. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  21. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  22. modulitiz_micro/files/git/ModuloGit.py +28 -28
  23. modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
  24. modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
  25. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  26. modulitiz_micro/iot/ModuleIotDevice.py +62 -62
  27. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  28. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  29. modulitiz_micro/rete/ModuloNetworking.py +72 -72
  30. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  31. modulitiz_micro/rete/email/EmailBean.py +5 -5
  32. modulitiz_micro/rete/email/ModuloEmail.py +90 -90
  33. modulitiz_micro/rete/http/ModuloHttp.py +119 -119
  34. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  35. modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
  36. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  37. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  38. modulitiz_micro/rete/http/huawei/fusionsolar/ModuleHuaweiFusionSolar.py +84 -0
  39. modulitiz_micro/rete/http/huawei/fusionsolar/beans/TokenBean.py +28 -0
  40. modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceBean.py +6 -0
  41. modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataBattery.py +22 -0
  42. modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataPowerSensor.py +49 -0
  43. modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataResidentialInverter.py +46 -0
  44. modulitiz_micro/rete/http/huawei/fusionsolar/enums/DevTypeIdEnum.py +21 -0
  45. modulitiz_micro/rete/http/huawei/fusionsolar/exceptions/ExceptionTooManyLogins.py +7 -0
  46. modulitiz_micro/rete/http/huawei/fusionsolar/service/AbstractHuaweiFusionSolar.py +71 -0
  47. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  48. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  49. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  50. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  51. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  52. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  53. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  54. modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
  55. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  56. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  57. modulitiz_micro/util/scheduler/ModuleScheduler.py +26 -26
  58. {modulitiz_micro-2.42.0.dist-info → modulitiz_micro-2.44.0.dist-info}/METADATA +59 -58
  59. modulitiz_micro-2.44.0.dist-info/RECORD +65 -0
  60. {modulitiz_micro-2.42.0.dist-info → modulitiz_micro-2.44.0.dist-info}/licenses/LICENSE +21 -21
  61. modulitiz_micro-2.42.0.dist-info/RECORD +0 -56
  62. {modulitiz_micro-2.42.0.dist-info → modulitiz_micro-2.44.0.dist-info}/WHEEL +0 -0
  63. {modulitiz_micro-2.42.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