pytbox 0.1.3__tar.gz → 0.1.5__tar.gz

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.

Potentially problematic release.


This version of pytbox might be problematic. Click here for more details.

Files changed (83) hide show
  1. {pytbox-0.1.3/src/pytbox.egg-info → pytbox-0.1.5}/PKG-INFO +1 -1
  2. {pytbox-0.1.3 → pytbox-0.1.5}/pyproject.toml +1 -1
  3. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/base.py +3 -1
  4. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/mail/alimail.py +55 -42
  5. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/timeutils.py +5 -2
  6. {pytbox-0.1.3 → pytbox-0.1.5/src/pytbox.egg-info}/PKG-INFO +1 -1
  7. {pytbox-0.1.3 → pytbox-0.1.5}/MANIFEST.in +0 -0
  8. {pytbox-0.1.3 → pytbox-0.1.5}/README.md +0 -0
  9. {pytbox-0.1.3 → pytbox-0.1.5}/setup.cfg +0 -0
  10. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/alert/alert_handler.py +0 -0
  11. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/alert/ping.py +0 -0
  12. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/alicloud/sls.py +0 -0
  13. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/build_config.py +0 -0
  14. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/instances.toml +0 -0
  15. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/__init__.py +0 -0
  16. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.cpu/cpu.toml.j2 +0 -0
  17. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.disk/disk.toml.j2 +0 -0
  18. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.diskio/diskio.toml.j2 +0 -0
  19. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.dns_query/dns_query.toml.j2 +0 -0
  20. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.http_response/http_response.toml.j2 +0 -0
  21. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.mem/mem.toml.j2 +0 -0
  22. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.net/net.toml.j2 +0 -0
  23. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.net_response/net_response.toml.j2 +0 -0
  24. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.ping/ping.toml.j2 +0 -0
  25. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.prometheus/prometheus.toml.j2 +0 -0
  26. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/cisco_interface.toml.j2 +0 -0
  27. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/cisco_system.toml.j2 +0 -0
  28. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/h3c_interface.toml.j2 +0 -0
  29. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/h3c_system.toml.j2 +0 -0
  30. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/huawei_interface.toml.j2 +0 -0
  31. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/huawei_system.toml.j2 +0 -0
  32. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/ruijie_interface.toml.j2 +0 -0
  33. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.snmp/ruijie_system.toml.j2 +0 -0
  34. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/categraf/jinja2/input.vsphere/vsphere.toml.j2 +0 -0
  35. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/__init__.py +0 -0
  36. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/categraf/__init__.py +0 -0
  37. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/categraf/commands.py +0 -0
  38. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/commands/vm.py +0 -0
  39. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/common/__init__.py +0 -0
  40. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/common/options.py +0 -0
  41. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/common/utils.py +0 -0
  42. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/formatters/__init__.py +0 -0
  43. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/formatters/output.py +0 -0
  44. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli/main.py +0 -0
  45. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/cli.py +0 -0
  46. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/common/__init__.py +0 -0
  47. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/database/mongo.py +0 -0
  48. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/database/victoriametrics.py +0 -0
  49. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/dida365.py +0 -0
  50. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/excel.py +0 -0
  51. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/feishu/client.py +0 -0
  52. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/feishu/endpoints.py +0 -0
  53. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/feishu/errors.py +0 -0
  54. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/feishu/helpers.py +0 -0
  55. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/feishu/typing.py +0 -0
  56. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/log/logger.py +0 -0
  57. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/log/victorialog.py +0 -0
  58. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/mail/client.py +0 -0
  59. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/mail/mail_detail.py +0 -0
  60. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/network/meraki.py +0 -0
  61. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/onepassword_connect.py +0 -0
  62. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/onepassword_sa.py +0 -0
  63. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/pyjira.py +0 -0
  64. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/env.py +0 -0
  65. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/load_config.py +0 -0
  66. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/load_vm_devfile.py +0 -0
  67. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/ping_checker.py +0 -0
  68. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/response.py +0 -0
  69. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/utils/richutils.py +0 -0
  70. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/vmware.py +0 -0
  71. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox/win/ad.py +0 -0
  72. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox.egg-info/SOURCES.txt +0 -0
  73. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox.egg-info/dependency_links.txt +0 -0
  74. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox.egg-info/entry_points.txt +0 -0
  75. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox.egg-info/requires.txt +0 -0
  76. {pytbox-0.1.3 → pytbox-0.1.5}/src/pytbox.egg-info/top_level.txt +0 -0
  77. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_base.py +0 -0
  78. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_feishu.py +0 -0
  79. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_logger.py +0 -0
  80. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_onepassword_connect.py +0 -0
  81. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_onepassword_sa.py +0 -0
  82. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_victoriametrics.py +0 -0
  83. {pytbox-0.1.3 → pytbox-0.1.5}/tests/test_vmware.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytbox
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: A collection of Python integrations and utilities (Feishu, Dida365, VictoriaMetrics, ...)
5
5
  Author-email: mingming hou <houm01@foxmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pytbox"
7
- version = "0.1.3"
7
+ version = "0.1.5"
8
8
  description = "A collection of Python integrations and utilities (Feishu, Dida365, VictoriaMetrics, ...)"
9
9
  authors = [{ name = "mingming hou", email = "houm01@foxmail.com" }]
10
10
  license = "MIT"
@@ -14,6 +14,7 @@ from pytbox.utils.env import get_env_by_os_environment
14
14
  from pytbox.vmware import VMwareClient
15
15
  from pytbox.pyjira import PyJira
16
16
  from pytbox.mail.client import MailClient
17
+ from pytbox.mail.alimail import AliMail
17
18
 
18
19
  config = load_config_by_file(path='/workspaces/pytbox/tests/alert/config_dev.toml', oc_vault_id=os.environ.get('oc_vault_id'))
19
20
 
@@ -83,4 +84,5 @@ pyjira = PyJira(
83
84
  )
84
85
 
85
86
  mail_163 = MailClient(mail_address=config['mail']['163']['mail_address'], password=config['mail']['163']['password'])
86
- mail_qq = MailClient(mail_address=config['mail']['qq']['mail_address'], password=config['mail']['qq']['password'])
87
+ mail_qq = MailClient(mail_address=config['mail']['qq']['mail_address'], password=config['mail']['qq']['password'])
88
+ ali_mail = AliMail(mail_address=config['mail']['aliyun']['mail_address'], client_id=config['mail']['aliyun']['client_id'], client_secret=config['mail']['aliyun']['client_secret'])
@@ -4,32 +4,29 @@ from typing import Literal
4
4
  from datetime import datetime, timedelta
5
5
 
6
6
  import requests
7
+ from ..utils.response import ReturnResponse
8
+ from .mail_detail import MailDetail
9
+ from ..utils.timeutils import TimeUtils
7
10
 
8
11
 
9
12
 
10
13
  class AliMail:
11
- def __init__(self, email_address: str=None, client_id: str=None, client_secret: str=None):
12
-
13
- self.email_address = email_address
14
- self.client_id = auth['username']
15
- self.client_secret = auth['password']
14
+ '''
15
+ _summary_
16
+ '''
17
+ def __init__(self, mail_address: str=None, client_id: str=None, client_secret: str=None, timeout: int=3):
18
+ self.email_address = mail_address
19
+ self.client_id = client_id
20
+ self.client_secret = client_secret
16
21
  self.base_url = "https://alimail-cn.aliyuncs.com/v2"
22
+ self.timeout = timeout
17
23
  self.headers = {
18
24
  "Content-Type": "application/json",
19
- "Authorization": f"bearer {self._get_access_token()}"
25
+ "Authorization": f"bearer {self._get_access_token_by_request()}"
20
26
  }
27
+ self.session = requests.Session()
28
+ self.session.headers.update(self.headers)
21
29
 
22
- def _get_access_token(self):
23
- current_time = datetime.now()
24
- # stored_token = mongo_alimail_token.find_one({"token_type": "bearer"})
25
- if stored_token and stored_token.get('expiration_time'):
26
- expiration_time = stored_token['expiration_time']
27
- if current_time < expiration_time:
28
- return stored_token['access_token']
29
- else:
30
- return self._get_access_token_by_request()
31
- else:
32
- return self._get_access_token_by_request()
33
30
 
34
31
  def _get_access_token_by_request(self):
35
32
  '''
@@ -52,7 +49,7 @@ class AliMail:
52
49
  "client_secret": self.client_secret
53
50
  }
54
51
  try:
55
- response = requests.post(interface_url, headers=headers, data=data, timeout=3)
52
+ response = requests.post(interface_url, headers=headers, data=data, timeout=self.timeout)
56
53
  response_json = response.json()
57
54
  current_time = datetime.now()
58
55
  data = {
@@ -61,28 +58,23 @@ class AliMail:
61
58
  'expires_in': response_json["expires_in"],
62
59
  'expiration_time': current_time + timedelta(seconds=response_json["expires_in"])
63
60
  }
64
- mongo_alimail_token.update_one(
65
- {"token_type": "bearer"},
66
- {"$set": data},
67
- upsert=True
68
- )
69
61
  return data.get("access_token")
70
62
  except requests.RequestException as e:
71
63
  # 处理请求失败异常
72
- print(f"请求失败:{e}")
64
+ raise e
73
65
  except (KeyError, ValueError) as e:
74
66
  # 处理解析响应失败异常
75
- print(f"解析响应失败: {e}")
67
+ raise e
76
68
 
77
- def list_mail_folders(self):
78
- response = requests.get(
69
+ def get_mail_folders(self):
70
+ response = self.session.get(
79
71
  url=f"{self.base_url}/users/{self.email_address}/mailFolders",
80
72
  headers=self.headers
81
73
  )
82
74
  return response.json().get('folders')
83
75
 
84
- def query_folder_id(self, folder_name: Literal['inbox']='inbox'):
85
- folders = self.list_mail_folders()
76
+ def get_folder_id(self, folder_name: Literal['inbox']='inbox'):
77
+ folders = self.get_mail_folders()
86
78
  for folder in folders:
87
79
  if folder.get('displayName') == folder_name:
88
80
  return folder.get('id')
@@ -92,7 +84,7 @@ class AliMail:
92
84
  params = {
93
85
  "$select": "body,toRecipients,internetMessageId,internetMessageHeaders"
94
86
  }
95
- response = requests.get(
87
+ response = self.session.get(
96
88
  url=f"{self.base_url}/users/{self.email_address}/messages/{mail_id}",
97
89
  headers=self.headers,
98
90
  params=params,
@@ -100,30 +92,51 @@ class AliMail:
100
92
  )
101
93
  return response.json().get('message')
102
94
 
103
- def list_mail(self, folder_name: str='inbox', size: int=100):
104
- folder_id = self.query_folder_id(folder_name=folder_name)
95
+ def get_mail_list(self, folder_name: str='inbox', size: int=100):
96
+ folder_id = self.get_folder_id(folder_name=folder_name)
105
97
  params = {
106
98
  "size": size,
107
99
  # "$select": "toRecipients"
108
100
  }
109
- response = requests.get(
101
+ response = self.session.get(
110
102
  url=f"{self.base_url}/users/{self.email_address}/mailFolders/{folder_id}/messages",
111
103
  headers=self.headers,
112
104
  params=params,
113
105
  timeout=3
114
106
  )
115
107
  messages = response.json().get("messages")
108
+ sent_to_list = []
116
109
  for message in messages:
117
110
  mail_id = message.get("id")
118
111
  detail = self.get_mail_detail(mail_id=mail_id)
119
- message.update(detail)
120
- yield message
121
-
112
+
113
+ for to_recipient in detail.get('toRecipients'):
114
+ sent_to_list.append(to_recipient.get('email'))
115
+
116
+ yield MailDetail(
117
+ uid=message.get('id'),
118
+ sent_from=message.get('from').get('email'),
119
+ sent_to=sent_to_list,
120
+ date=TimeUtils.convert_str_to_datetime(time_str=message.get('sentDateTime'), app='alimail'),
121
+ cc="",
122
+ subject=message.get('subject'),
123
+ body_plain=message.get('summary'),
124
+ body_html=""
125
+ )
126
+
127
+ def move(self, uid: str, destination_folder: str) -> ReturnResponse:
128
+ params = {
129
+ "ids": [uid],
130
+ "destinationFolderId": self.get_folder_id(destination_folder)
131
+ }
132
+ r = self.session.post(
133
+ url=f"{self.base_url}/users/{self.email_address}/messages/move",
134
+ params=params
135
+ )
136
+ if r.status_code == 200:
137
+ return ReturnResponse(code=0, msg=f'邮件移动到 {destination_folder} 成功', data=None)
138
+ else:
139
+ return ReturnResponse(code=1, msg=f'邮件移动到 {destination_folder} 失败', data=r.json())
122
140
 
123
141
  if __name__ == '__main__':
124
- ali_mail = AliMail()
125
- # print(ali_mail.query_folder_id())
126
- # for i in ali_mail.list_mail(size=1):
127
- # print(i)
128
- # print(ali_mail.access_token)
129
- print(ali_mail.get_mail_detail(mail_id='DzzzzzzMeuY'))
142
+ ali_mail = AliMail()
@@ -287,7 +287,7 @@ class TimeUtils:
287
287
  return int(time.time()) * 1000
288
288
 
289
289
  @staticmethod
290
- def convert_str_to_datetime(time_str: str, app: Literal['lg_alert_trigger', 'lg_alert_resolved', 'mongo']='lg_alert_trigger') -> datetime.datetime:
290
+ def convert_str_to_datetime(time_str: str, app: Literal['lg_alert_trigger', 'lg_alert_resolved', 'mongo', 'alimail']='lg_alert_trigger') -> datetime.datetime:
291
291
  """
292
292
  将字符串转换为datetime对象
293
293
 
@@ -305,7 +305,10 @@ class TimeUtils:
305
305
  elif app == 'mongo':
306
306
  time_obj = datetime.datetime.fromisoformat(time_str.replace('Z', '+00:00'))
307
307
  return time_obj # 已经包含时区信息,直接返回
308
-
308
+ elif app == 'alimail':
309
+ time_obj = datetime.datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%SZ")
310
+ time_obj = time_obj + datetime.timedelta(hours=8)
311
+ # return time_obj
309
312
  # 对于没有时区信息的时间对象,设置为Asia/Shanghai时区
310
313
  time_with_tz = time_obj.replace(tzinfo=ZoneInfo("Asia/Shanghai"))
311
314
  return time_with_tz
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytbox
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: A collection of Python integrations and utilities (Feishu, Dida365, VictoriaMetrics, ...)
5
5
  Author-email: mingming hou <houm01@foxmail.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes