re-common 10.0.39__py3-none-any.whl → 10.0.41__py3-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 (221) hide show
  1. re_common/baselibrary/__init__.py +4 -4
  2. re_common/baselibrary/baseabs/__init__.py +6 -6
  3. re_common/baselibrary/baseabs/baseabs.py +26 -26
  4. re_common/baselibrary/database/mbuilder.py +132 -132
  5. re_common/baselibrary/database/moudle.py +93 -93
  6. re_common/baselibrary/database/msqlite3.py +194 -194
  7. re_common/baselibrary/database/mysql.py +169 -169
  8. re_common/baselibrary/database/sql_factory.py +26 -26
  9. re_common/baselibrary/mthread/MThreadingRun.py +486 -486
  10. re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
  11. re_common/baselibrary/mthread/__init__.py +2 -2
  12. re_common/baselibrary/mthread/mythreading.py +695 -695
  13. re_common/baselibrary/pakge_other/socks.py +404 -404
  14. re_common/baselibrary/readconfig/config_factory.py +18 -18
  15. re_common/baselibrary/readconfig/ini_config.py +317 -317
  16. re_common/baselibrary/readconfig/toml_config.py +49 -49
  17. re_common/baselibrary/temporary/envdata.py +36 -36
  18. re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
  19. re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
  20. re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
  21. re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
  22. re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
  23. re_common/baselibrary/tools/contrast_db3.py +123 -123
  24. re_common/baselibrary/tools/copy_file.py +39 -39
  25. re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
  26. re_common/baselibrary/tools/foreachgz.py +39 -39
  27. re_common/baselibrary/tools/get_attr.py +10 -10
  28. re_common/baselibrary/tools/image_to_pdf.py +61 -61
  29. re_common/baselibrary/tools/java_code_deal.py +139 -139
  30. re_common/baselibrary/tools/javacode.py +79 -79
  31. re_common/baselibrary/tools/mdb_db3.py +48 -48
  32. re_common/baselibrary/tools/merge_file.py +171 -171
  33. re_common/baselibrary/tools/merge_gz_file.py +165 -165
  34. re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
  35. re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
  36. re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
  37. re_common/baselibrary/tools/mongo_tools.py +50 -50
  38. re_common/baselibrary/tools/move_file.py +170 -170
  39. re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
  40. re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
  41. re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
  42. re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
  43. re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
  44. re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
  45. re_common/baselibrary/tools/myparsel.py +104 -104
  46. re_common/baselibrary/tools/rename_dir_file.py +37 -37
  47. re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
  48. re_common/baselibrary/tools/split_line_to_many.py +25 -25
  49. re_common/baselibrary/tools/stringtodicts.py +33 -33
  50. re_common/baselibrary/tools/workwechant_bot.py +84 -84
  51. re_common/baselibrary/utils/baseaiohttp.py +296 -296
  52. re_common/baselibrary/utils/baseaiomysql.py +87 -87
  53. re_common/baselibrary/utils/baseallstep.py +191 -191
  54. re_common/baselibrary/utils/baseavro.py +19 -19
  55. re_common/baselibrary/utils/baseboto3.py +291 -291
  56. re_common/baselibrary/utils/basecsv.py +32 -32
  57. re_common/baselibrary/utils/basedict.py +133 -133
  58. re_common/baselibrary/utils/basedir.py +241 -241
  59. re_common/baselibrary/utils/baseencode.py +351 -351
  60. re_common/baselibrary/utils/baseencoding.py +28 -28
  61. re_common/baselibrary/utils/baseesdsl.py +86 -86
  62. re_common/baselibrary/utils/baseexcel.py +264 -264
  63. re_common/baselibrary/utils/baseexcept.py +109 -109
  64. re_common/baselibrary/utils/basefile.py +654 -654
  65. re_common/baselibrary/utils/baseftp.py +214 -214
  66. re_common/baselibrary/utils/basegzip.py +60 -60
  67. re_common/baselibrary/utils/basehdfs.py +135 -135
  68. re_common/baselibrary/utils/basehttpx.py +268 -268
  69. re_common/baselibrary/utils/baseip.py +87 -87
  70. re_common/baselibrary/utils/basejson.py +2 -2
  71. re_common/baselibrary/utils/baselist.py +32 -32
  72. re_common/baselibrary/utils/basemotor.py +190 -190
  73. re_common/baselibrary/utils/basemssql.py +98 -98
  74. re_common/baselibrary/utils/baseodbc.py +113 -113
  75. re_common/baselibrary/utils/basepandas.py +302 -302
  76. re_common/baselibrary/utils/basepeewee.py +11 -11
  77. re_common/baselibrary/utils/basepika.py +180 -180
  78. re_common/baselibrary/utils/basepydash.py +143 -143
  79. re_common/baselibrary/utils/basepymongo.py +230 -230
  80. re_common/baselibrary/utils/basequeue.py +22 -22
  81. re_common/baselibrary/utils/baserar.py +57 -57
  82. re_common/baselibrary/utils/baserequest.py +279 -279
  83. re_common/baselibrary/utils/baseset.py +8 -8
  84. re_common/baselibrary/utils/basesmb.py +403 -403
  85. re_common/baselibrary/utils/basestring.py +382 -382
  86. re_common/baselibrary/utils/basetime.py +320 -320
  87. re_common/baselibrary/utils/baseurl.py +121 -121
  88. re_common/baselibrary/utils/basezip.py +57 -57
  89. re_common/baselibrary/utils/core/__init__.py +7 -7
  90. re_common/baselibrary/utils/core/bottomutils.py +18 -18
  91. re_common/baselibrary/utils/core/mdeprecated.py +327 -327
  92. re_common/baselibrary/utils/core/mlamada.py +16 -16
  93. re_common/baselibrary/utils/core/msginfo.py +25 -25
  94. re_common/baselibrary/utils/core/requests_core.py +103 -103
  95. re_common/baselibrary/utils/fateadm.py +429 -429
  96. re_common/baselibrary/utils/importfun.py +123 -123
  97. re_common/baselibrary/utils/mfaker.py +57 -57
  98. re_common/baselibrary/utils/my_abc/__init__.py +3 -3
  99. re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
  100. re_common/baselibrary/utils/mylogger.py +414 -414
  101. re_common/baselibrary/utils/myredisclient.py +861 -861
  102. re_common/baselibrary/utils/pipupgrade.py +21 -21
  103. re_common/baselibrary/utils/ringlist.py +85 -85
  104. re_common/baselibrary/utils/version_compare.py +36 -36
  105. re_common/baselibrary/utils/ydmhttp.py +126 -126
  106. re_common/facade/lazy_import.py +11 -11
  107. re_common/facade/loggerfacade.py +25 -25
  108. re_common/facade/mysqlfacade.py +467 -467
  109. re_common/facade/now.py +31 -31
  110. re_common/facade/sqlite3facade.py +257 -257
  111. re_common/facade/use/mq_use_facade.py +83 -83
  112. re_common/facade/use/proxy_use_facade.py +19 -19
  113. re_common/libtest/base_dict_test.py +19 -19
  114. re_common/libtest/baseavro_test.py +13 -13
  115. re_common/libtest/basefile_test.py +14 -14
  116. re_common/libtest/basemssql_test.py +77 -77
  117. re_common/libtest/baseodbc_test.py +7 -7
  118. re_common/libtest/basepandas_test.py +38 -38
  119. re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
  120. re_common/libtest/get_attr_test/settings.py +54 -54
  121. re_common/libtest/idencode_test.py +53 -53
  122. re_common/libtest/iniconfig_test.py +35 -35
  123. re_common/libtest/ip_test.py +34 -34
  124. re_common/libtest/merge_file_test.py +20 -20
  125. re_common/libtest/mfaker_test.py +8 -8
  126. re_common/libtest/mm3_test.py +31 -31
  127. re_common/libtest/mylogger_test.py +88 -88
  128. re_common/libtest/myparsel_test.py +27 -27
  129. re_common/libtest/mysql_test.py +151 -151
  130. re_common/libtest/pymongo_test.py +21 -21
  131. re_common/libtest/split_test.py +11 -11
  132. re_common/libtest/sqlite3_merge_test.py +5 -5
  133. re_common/libtest/sqlite3_test.py +34 -34
  134. re_common/libtest/tomlconfig_test.py +30 -30
  135. re_common/libtest/use_tools_test/__init__.py +2 -2
  136. re_common/libtest/user/__init__.py +4 -4
  137. re_common/studio/__init__.py +4 -4
  138. re_common/studio/assignment_expressions.py +36 -36
  139. re_common/studio/mydash/test1.py +18 -18
  140. re_common/studio/pydashstudio/first.py +9 -9
  141. re_common/studio/streamlitstudio/first_app.py +65 -65
  142. re_common/studio/streamlitstudio/uber_pickups.py +23 -23
  143. re_common/studio/test.py +18 -18
  144. re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +235 -220
  145. re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
  146. re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
  147. re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
  148. re_common/v2/baselibrary/decorators/utils.py +59 -59
  149. re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
  150. re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
  151. re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
  152. re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
  153. re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
  154. re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
  155. re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
  156. re_common/v2/baselibrary/tools/concurrency.py +35 -35
  157. re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
  158. re_common/v2/baselibrary/tools/data_processer/data_processer.py +497 -508
  159. re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
  160. re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
  161. re_common/v2/baselibrary/tools/dict_tools.py +44 -44
  162. re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
  163. re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
  164. re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
  165. re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
  166. re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
  167. re_common/v2/baselibrary/tools/list_tools.py +69 -69
  168. re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
  169. re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
  170. re_common/v2/baselibrary/tools/text_matcher.py +326 -326
  171. re_common/v2/baselibrary/tools/tree_processor/__init__.py +0 -0
  172. re_common/v2/baselibrary/tools/tree_processor/builder.py +25 -0
  173. re_common/v2/baselibrary/tools/tree_processor/node.py +13 -0
  174. re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
  175. re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
  176. re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
  177. re_common/v2/baselibrary/utils/author_smi.py +361 -361
  178. re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
  179. re_common/v2/baselibrary/utils/basedict.py +37 -37
  180. re_common/v2/baselibrary/utils/basehdfs.py +163 -163
  181. re_common/v2/baselibrary/utils/basepika.py +180 -180
  182. re_common/v2/baselibrary/utils/basetime.py +94 -77
  183. re_common/v2/baselibrary/utils/db.py +174 -156
  184. re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
  185. re_common/v2/baselibrary/utils/json_cls.py +16 -16
  186. re_common/v2/baselibrary/utils/mq.py +83 -83
  187. re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
  188. re_common/v2/baselibrary/utils/string_bool.py +187 -186
  189. re_common/v2/baselibrary/utils/string_clear.py +246 -246
  190. re_common/v2/baselibrary/utils/string_smi.py +18 -18
  191. re_common/v2/baselibrary/utils/stringutils.py +312 -271
  192. re_common/vip/base_step_process.py +11 -11
  193. re_common/vip/baseencodeid.py +90 -90
  194. re_common/vip/changetaskname.py +28 -28
  195. re_common/vip/core_var.py +24 -24
  196. re_common/vip/mmh3Hash.py +89 -89
  197. re_common/vip/proxy/allproxys.py +127 -127
  198. re_common/vip/proxy/allproxys_thread.py +159 -159
  199. re_common/vip/proxy/cnki_proxy.py +153 -153
  200. re_common/vip/proxy/kuaidaili.py +87 -87
  201. re_common/vip/proxy/proxy_all.py +113 -113
  202. re_common/vip/proxy/update_kuaidaili_0.py +42 -42
  203. re_common/vip/proxy/wanfang_proxy.py +152 -152
  204. re_common/vip/proxy/wp_proxy_all.py +181 -181
  205. re_common/vip/read_rawid_to_txt.py +91 -91
  206. re_common/vip/title/__init__.py +5 -5
  207. re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
  208. re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
  209. re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
  210. re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
  211. re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
  212. re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
  213. re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
  214. re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
  215. re_common/vip/title/transform/__init__.py +10 -10
  216. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/LICENSE +201 -201
  217. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/METADATA +16 -16
  218. re_common-10.0.41.dist-info/RECORD +252 -0
  219. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/WHEEL +1 -1
  220. re_common-10.0.39.dist-info/RECORD +0 -248
  221. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/top_level.txt +0 -0
@@ -1,403 +1,403 @@
1
- # -*- coding: utf-8 -*-
2
- # @Time : 2020/11/27 16:38
3
- # @Author : suhong
4
- # @File : smb_test.py
5
- # @Software: PyCharm
6
- # !/usr/local/bin/python3
7
- import os
8
- import socket
9
- import sys
10
- import traceback
11
-
12
- import fs.smbfs
13
- from nmb.NetBIOS import NetBIOS
14
- from smb import smb_structs
15
- from smb.SMBConnection import SMBConnection
16
- from smb.smb_structs import OperationFailure
17
-
18
- from re_common.baselibrary import IniConfig
19
- from re_common.baselibrary.utils.basedir import BaseDir
20
-
21
-
22
- # 有的smb使用fs.smbfs无法访问,可以使用smb.SMBConnection
23
-
24
- class BaseSmb(object):
25
- """
26
- fs.smbfs 建立在 pysmb 之上
27
- host属性中直接输入ip无效,报错fs.errors.CreateFailed: could not get IP/host pair from '*.*.*.193',
28
- 包的作者目前也没有解决这个问题。加入主机名正常使用
29
- """
30
-
31
- def __init__(self, host=None, username=None, password=None,port=139,domain=""):
32
- self.conn = None
33
- self.host = host
34
- self.username = username
35
- self.password = password
36
- self.port = port
37
- self.domain = domain
38
-
39
-
40
- def set_uri(self, uri):
41
- """
42
- 'smb://username:password@SAMBAHOSTNAME:port/share'
43
- 由于不知道如何给SAMBAHOSTNAME这个参数,尝试了没有成功
44
- :return:
45
- """
46
- smb_fs = fs.open_fs(uri)
47
- return smb_fs
48
-
49
- def set_default(self):
50
- """
51
- 调用该函数默认链接177
52
- :return:
53
- """
54
- # host必须是(servername,ip),不能只提供ip,servername错误一样有效
55
- self.host = ("VIPS-001", "192.168.31.184")
56
- self.username = "caiji_smb_rw"
57
- self.password = "5joH9yST"
58
- self.port = 139
59
- self.domain = ""
60
-
61
- def set_config(self, path, sesc):
62
- dictsall = IniConfig(path).builder().get_config_dict()
63
- dicts = dictsall[sesc]
64
- self.host = dicts['host']
65
- self.username = dicts['username']
66
- self.password = dicts['password']
67
- self.port = dicts['port']
68
- self.domain = dicts['domain']
69
-
70
- def connect(self):
71
- """
72
- 设置用户名 密码 进行连接
73
- :return:
74
- """
75
- self.conn = fs.smbfs.SMBFS(host=self.host, username=self.username,
76
- passwd=self.password,
77
- port=self.port,
78
- domain=self.domain)
79
-
80
- def close(self):
81
- # 关闭链接
82
- self.conn.close()
83
-
84
- def get_gen_dir(self):
85
- """
86
- 获取根目录下的文件名
87
- :return:
88
- """
89
- for g in self.conn.listdir(""):
90
- yield g
91
-
92
- def is_exists(self, pathdir):
93
- """
94
- 目录是否存在
95
- :param sPth:
96
- :return:
97
- """
98
- return self.conn.exists(pathdir)
99
-
100
- def is_dir(self, pathdir):
101
- """
102
- 是否是目录
103
- :param sPth:
104
- :return:
105
- """
106
- return self.conn.isdir(pathdir)
107
-
108
- def is_file(self, pathfile):
109
- """
110
- 是否是文件
111
- :param sPth:
112
- :return:
113
- """
114
- return self.conn.isfile(pathfile)
115
-
116
- def create_dir(self, pathdir):
117
- """
118
- 创建目录 该方法可以创建多级目录
119
- :param pathdir:
120
- :return:
121
- """
122
- if not self.is_exists(pathdir):
123
- self.conn.makedirs(pathdir)
124
-
125
- def get_file_size(self, path):
126
- """
127
- 获取文件大小
128
- :param path:
129
- :return:
130
- """
131
- size = 0
132
- size += self.conn.getsize(path)
133
- return size
134
-
135
- def download_file(self, srcpath, dstpath):
136
- """
137
- 下载smb服务器文件到本地
138
- :param srcpath:本地文件
139
- :param dstpath: 服务器文件
140
- :return:
141
- """
142
- BaseDir.create_dir(srcpath)
143
- with open(dstpath, 'wb') as write_file:
144
- self.conn.download(srcpath, write_file)
145
-
146
- def upload_file(self, srcpath, dstpath):
147
- """
148
- 上传本地文件到smb服务器文件
149
- :param srcpath:本地文件
150
- :param dstpath: 服务器文件
151
- :return:
152
- """
153
- self.create_dir(dstpath)
154
- with open(srcpath, 'rb') as read_file:
155
- self.conn.upload(dstpath, read_file)
156
-
157
- def copy_file_to_file_smb(self, filePath, tarPath, overwrite=False):
158
- """
159
- 该方法只适合smb服务器地址到smb服务器地址
160
- :param filePath: 文件路径
161
- :param tarPath: 输出文件路径
162
- :return:
163
- """
164
- assert self.is_exists(filePath), FileNotFoundError("需要copy的文件不存在")
165
- assert self.conn.isfile(filePath), FileNotFoundError("需要copy的不是一个文件")
166
-
167
- self.conn.copy(filePath, tarPath, overwrite=overwrite)
168
-
169
- def copy_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
170
- """
171
- 该方法只适合smb服务器地址到smb服务器地址
172
- olddir和newdir都只能是目录,且newdir必须不存在
173
- :param oldDir:
174
- :param newDir:
175
- :return:
176
- """
177
- assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
178
- assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
179
- self.conn.copydir(oldDir, newDir)
180
-
181
- def move_file_to_file_smb(self, src_path, dst_path, overwrite=False):
182
-
183
- assert self.is_exists(src_path), FileNotFoundError("需要move的文件不存在")
184
- assert self.is_file(dst_path), FileNotFoundError("需要move的不是一个文件")
185
- self.conn.move(src_path, dst_path, overwrite=overwrite)
186
-
187
- def move_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
188
- """
189
- 该方法只适合smb服务器地址到smb服务器地址
190
- olddir和newdir都只能是目录,且newdir必须不存在
191
- :param oldDir:
192
- :param newDir:
193
- :return:
194
- """
195
- assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
196
- assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
197
- self.conn.movedir(oldDir, newDir)
198
-
199
- def delete_dir(self, dirpath):
200
- """
201
- 递归删除smb服务器文件夹
202
- :param dirpath:
203
- :return:
204
- """
205
- assert self.is_file(dirpath), FileExistsError("该目录是个文件")
206
-
207
- self.conn.removetree(dirpath)
208
-
209
- def delete_file(self, filepath):
210
- """
211
- 删除smb服务器文件
212
- :param dirpath:
213
- :return:
214
- """
215
- assert not self.is_file(filepath), FileNotFoundError("该路径不是个文件")
216
-
217
- self.conn.remove(filepath)
218
-
219
- def read_file(self, path, mode="r", return_model="yield"):
220
- """
221
- :param mode:
222
- :param path: caiji/except_client_try.txt
223
- :return:
224
- """
225
- with self.conn.open(path, mode, encoding="utf-8") as f:
226
- if return_model == "yield":
227
- for fLine in f:
228
- yield fLine.strip()
229
- if return_model == "all":
230
- return f.read()
231
-
232
- def write_file(self, path, value, mode="w"):
233
- with self.conn.open(path, mode, encoding="utf-8") as f:
234
- f.write(value)
235
-
236
-
237
- class SmbClient(object):
238
- """
239
- 优缺点:函数功能丰富,文件下载功能只对普通文件如txt,dat,csv有效,压缩文件无效
240
- """
241
-
242
- def __init__(self, username, password, my_name, remote_name, ip, port=139, domain='', server_name='caiji'):
243
- self.username = username
244
- self.password = password
245
- self.my_name = my_name
246
- self.ip = ip
247
- self.port = port
248
- self.remote_name = remote_name
249
- self.conn = None
250
- self.domain = domain
251
- self.server_name = server_name
252
-
253
- def set_use_smb2(self, is_use=True):
254
- """
255
- 在 pysmb 中禁用 SMB2 协议,请在创建SMBConnection实例之前将smb_structs模块中
256
- 的SUPPORT_SMB2标志设置为False
257
- :param is_use:
258
- :return:
259
- """
260
- smb_structs.SUPPORT_SMB2 = is_use
261
-
262
- def get_bios_name(self, timeout=10):
263
- """
264
- 想通过ip获取对应计算机名,但没有成功
265
- """
266
- bios = None
267
- try:
268
- bios = NetBIOS()
269
- srv_name = bios.queryIPForName(self.ip, timeout=timeout)
270
- print(srv_name)
271
- return srv_name
272
- except:
273
- traceback.print_exc()
274
- print(sys.stderr, "Looking up timeout, check remote_smb_ip again!!")
275
- finally:
276
- if bios is not None:
277
- bios.close()
278
- return []
279
-
280
- def set_config(self, path, sesc):
281
- dictsall = IniConfig(path).builder().get_config_dict()
282
- dicts = dictsall[sesc]
283
- self.ip = dicts['ip']
284
- self.port = dicts['port']
285
- self.username = dicts['username']
286
- self.password = dicts['password']
287
- self.my_name = dicts['my_name']
288
- self.remote_name = dicts['remote_name']
289
- self.domain = dicts['domain']
290
-
291
- def connect(self):
292
- """
293
- 建立smb服务连接
294
- port: 445或者139
295
- :return:
296
- """
297
- try:
298
- self.conn = SMBConnection(self.username, self.password, self.my_name,
299
- self.remote_name,
300
- domain=self.domain)
301
- self.conn.connect(self.ip, self.port)
302
- status = self.conn.auth_result
303
- except:
304
- self.conn.close()
305
- status = False
306
- return status
307
-
308
- def all_shares_name(self):
309
- """
310
- 列出smb服务器下的所有共享目录
311
- :return:
312
- """
313
- share_names = list()
314
- sharelist = self.conn.listShares()
315
- for s in sharelist:
316
- share_names.append(s.name)
317
- return share_names
318
-
319
- def all_file_names_in_dir(self, service_name, dir_name):
320
- """
321
- 列出文件夹内所有文件名
322
- :param service_name: 服务名(smb中的文件夹名,一级目录)
323
- :param dir_name: 二级目录及以下的文件目录
324
- :return:
325
- """
326
- f_names = list()
327
- for e in self.conn.listPath(service_name, dir_name):
328
- if e.filename[0] != '.': # (会返回一些.的文件,需要过滤)
329
- f_names.append(e.filename)
330
- return f_names
331
-
332
- def get_last_updatetime(self, service_name, file_path):
333
- '''
334
- 返回samba server上的文件更新时间(时间戳),如果出现OperationFailure说明无此文件,返回0
335
- :param samba:
336
- :param service_name:
337
- :param file_path:
338
- :return:
339
- '''
340
- try:
341
- sharedfile_obj = self.conn.getAttributes(service_name, file_path)
342
- return sharedfile_obj.last_write_time
343
- except OperationFailure:
344
- return 0
345
-
346
- def download(self, f_names, service_name, smb_dir, local_dir):
347
- """
348
- 下载文件
349
- :param f_names:文件名
350
- :param service_name:服务名(smb中的文件夹名)
351
- :param smb_dir: smb文件夹
352
- :param local_dir: 本地文件夹
353
- :return:
354
- """
355
- assert isinstance(f_names, list)
356
- for f_name in f_names:
357
- f = open(os.path.join(local_dir, f_name), 'wb')
358
- self.conn.retrieveFile(service_name, os.path.join(smb_dir, f_name), f)
359
- f.close()
360
-
361
- def createDir(self, service_name, path):
362
- """
363
- 创建文件夹
364
- :param samba:
365
- :param service_name:
366
- :param path:
367
- :return:
368
- """
369
- try:
370
- self.conn.createDirectory(service_name, path)
371
- except OperationFailure:
372
- pass
373
-
374
- def upload(self, service_name, smb_dir, local_dir, f_names):
375
- """
376
- 上传文件
377
- :param samba:
378
- :param service_name:服务名(smb中的文件夹名)
379
- :param smb_dir: smb文件夹
380
- :param local_dir: 本地文件列表所在目录
381
- :param f_names: 本地文件列表
382
- :return:
383
- """
384
- assert isinstance(f_names, list)
385
- for f_name in f_names:
386
- f = open(os.path.join(local_dir, f_name), 'rb')
387
- self.conn.storeFile(service_name, os.path.join(smb_dir, f_name), f) # 第二个参数path包含文件全路径
388
- f.close()
389
-
390
-
391
- # if __name__ == '__main__':
392
- # bs = BaseSmb()
393
- # # bs.set_uri("smb://caiji_smb_rw:5joH9yST@('VIPS-001','192.168.31.184'):139/caiji/except_client_try.txt")
394
- # bs.set_default()
395
- # bs.connect()
396
- # bs.write_file("caiji/except_client_try.txt","aaaa")
397
- # # for i in bs.get_gen_dir():
398
- # # print(i)
399
- # # print(bs.delete_dir("down_data/test.txt"))
400
-
401
- # if __name__ == '__main__':
402
- # sc = SmbClient("caiji_smb_rw", "5joH9yST", "TEST","VIPS-001", "192.168.31.184", 139, "WorkGroup")
403
- # sc.connect()
1
+ # -*- coding: utf-8 -*-
2
+ # @Time : 2020/11/27 16:38
3
+ # @Author : suhong
4
+ # @File : smb_test.py
5
+ # @Software: PyCharm
6
+ # !/usr/local/bin/python3
7
+ import os
8
+ import socket
9
+ import sys
10
+ import traceback
11
+
12
+ import fs.smbfs
13
+ from nmb.NetBIOS import NetBIOS
14
+ from smb import smb_structs
15
+ from smb.SMBConnection import SMBConnection
16
+ from smb.smb_structs import OperationFailure
17
+
18
+ from re_common.baselibrary import IniConfig
19
+ from re_common.baselibrary.utils.basedir import BaseDir
20
+
21
+
22
+ # 有的smb使用fs.smbfs无法访问,可以使用smb.SMBConnection
23
+
24
+ class BaseSmb(object):
25
+ """
26
+ fs.smbfs 建立在 pysmb 之上
27
+ host属性中直接输入ip无效,报错fs.errors.CreateFailed: could not get IP/host pair from '*.*.*.193',
28
+ 包的作者目前也没有解决这个问题。加入主机名正常使用
29
+ """
30
+
31
+ def __init__(self, host=None, username=None, password=None,port=139,domain=""):
32
+ self.conn = None
33
+ self.host = host
34
+ self.username = username
35
+ self.password = password
36
+ self.port = port
37
+ self.domain = domain
38
+
39
+
40
+ def set_uri(self, uri):
41
+ """
42
+ 'smb://username:password@SAMBAHOSTNAME:port/share'
43
+ 由于不知道如何给SAMBAHOSTNAME这个参数,尝试了没有成功
44
+ :return:
45
+ """
46
+ smb_fs = fs.open_fs(uri)
47
+ return smb_fs
48
+
49
+ def set_default(self):
50
+ """
51
+ 调用该函数默认链接177
52
+ :return:
53
+ """
54
+ # host必须是(servername,ip),不能只提供ip,servername错误一样有效
55
+ self.host = ("VIPS-001", "192.168.31.184")
56
+ self.username = "caiji_smb_rw"
57
+ self.password = "5joH9yST"
58
+ self.port = 139
59
+ self.domain = ""
60
+
61
+ def set_config(self, path, sesc):
62
+ dictsall = IniConfig(path).builder().get_config_dict()
63
+ dicts = dictsall[sesc]
64
+ self.host = dicts['host']
65
+ self.username = dicts['username']
66
+ self.password = dicts['password']
67
+ self.port = dicts['port']
68
+ self.domain = dicts['domain']
69
+
70
+ def connect(self):
71
+ """
72
+ 设置用户名 密码 进行连接
73
+ :return:
74
+ """
75
+ self.conn = fs.smbfs.SMBFS(host=self.host, username=self.username,
76
+ passwd=self.password,
77
+ port=self.port,
78
+ domain=self.domain)
79
+
80
+ def close(self):
81
+ # 关闭链接
82
+ self.conn.close()
83
+
84
+ def get_gen_dir(self):
85
+ """
86
+ 获取根目录下的文件名
87
+ :return:
88
+ """
89
+ for g in self.conn.listdir(""):
90
+ yield g
91
+
92
+ def is_exists(self, pathdir):
93
+ """
94
+ 目录是否存在
95
+ :param sPth:
96
+ :return:
97
+ """
98
+ return self.conn.exists(pathdir)
99
+
100
+ def is_dir(self, pathdir):
101
+ """
102
+ 是否是目录
103
+ :param sPth:
104
+ :return:
105
+ """
106
+ return self.conn.isdir(pathdir)
107
+
108
+ def is_file(self, pathfile):
109
+ """
110
+ 是否是文件
111
+ :param sPth:
112
+ :return:
113
+ """
114
+ return self.conn.isfile(pathfile)
115
+
116
+ def create_dir(self, pathdir):
117
+ """
118
+ 创建目录 该方法可以创建多级目录
119
+ :param pathdir:
120
+ :return:
121
+ """
122
+ if not self.is_exists(pathdir):
123
+ self.conn.makedirs(pathdir)
124
+
125
+ def get_file_size(self, path):
126
+ """
127
+ 获取文件大小
128
+ :param path:
129
+ :return:
130
+ """
131
+ size = 0
132
+ size += self.conn.getsize(path)
133
+ return size
134
+
135
+ def download_file(self, srcpath, dstpath):
136
+ """
137
+ 下载smb服务器文件到本地
138
+ :param srcpath:本地文件
139
+ :param dstpath: 服务器文件
140
+ :return:
141
+ """
142
+ BaseDir.create_dir(srcpath)
143
+ with open(dstpath, 'wb') as write_file:
144
+ self.conn.download(srcpath, write_file)
145
+
146
+ def upload_file(self, srcpath, dstpath):
147
+ """
148
+ 上传本地文件到smb服务器文件
149
+ :param srcpath:本地文件
150
+ :param dstpath: 服务器文件
151
+ :return:
152
+ """
153
+ self.create_dir(dstpath)
154
+ with open(srcpath, 'rb') as read_file:
155
+ self.conn.upload(dstpath, read_file)
156
+
157
+ def copy_file_to_file_smb(self, filePath, tarPath, overwrite=False):
158
+ """
159
+ 该方法只适合smb服务器地址到smb服务器地址
160
+ :param filePath: 文件路径
161
+ :param tarPath: 输出文件路径
162
+ :return:
163
+ """
164
+ assert self.is_exists(filePath), FileNotFoundError("需要copy的文件不存在")
165
+ assert self.conn.isfile(filePath), FileNotFoundError("需要copy的不是一个文件")
166
+
167
+ self.conn.copy(filePath, tarPath, overwrite=overwrite)
168
+
169
+ def copy_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
170
+ """
171
+ 该方法只适合smb服务器地址到smb服务器地址
172
+ olddir和newdir都只能是目录,且newdir必须不存在
173
+ :param oldDir:
174
+ :param newDir:
175
+ :return:
176
+ """
177
+ assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
178
+ assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
179
+ self.conn.copydir(oldDir, newDir)
180
+
181
+ def move_file_to_file_smb(self, src_path, dst_path, overwrite=False):
182
+
183
+ assert self.is_exists(src_path), FileNotFoundError("需要move的文件不存在")
184
+ assert self.is_file(dst_path), FileNotFoundError("需要move的不是一个文件")
185
+ self.conn.move(src_path, dst_path, overwrite=overwrite)
186
+
187
+ def move_dir_to_dir_smb(self, oldDir, newDir, moudle=0):
188
+ """
189
+ 该方法只适合smb服务器地址到smb服务器地址
190
+ olddir和newdir都只能是目录,且newdir必须不存在
191
+ :param oldDir:
192
+ :param newDir:
193
+ :return:
194
+ """
195
+ assert self.is_exists(oldDir), IsADirectoryError(oldDir + "目录不存在")
196
+ assert not self.is_exists(newDir), IsADirectoryError(newDir + "目录存在")
197
+ self.conn.movedir(oldDir, newDir)
198
+
199
+ def delete_dir(self, dirpath):
200
+ """
201
+ 递归删除smb服务器文件夹
202
+ :param dirpath:
203
+ :return:
204
+ """
205
+ assert self.is_file(dirpath), FileExistsError("该目录是个文件")
206
+
207
+ self.conn.removetree(dirpath)
208
+
209
+ def delete_file(self, filepath):
210
+ """
211
+ 删除smb服务器文件
212
+ :param dirpath:
213
+ :return:
214
+ """
215
+ assert not self.is_file(filepath), FileNotFoundError("该路径不是个文件")
216
+
217
+ self.conn.remove(filepath)
218
+
219
+ def read_file(self, path, mode="r", return_model="yield"):
220
+ """
221
+ :param mode:
222
+ :param path: caiji/except_client_try.txt
223
+ :return:
224
+ """
225
+ with self.conn.open(path, mode, encoding="utf-8") as f:
226
+ if return_model == "yield":
227
+ for fLine in f:
228
+ yield fLine.strip()
229
+ if return_model == "all":
230
+ return f.read()
231
+
232
+ def write_file(self, path, value, mode="w"):
233
+ with self.conn.open(path, mode, encoding="utf-8") as f:
234
+ f.write(value)
235
+
236
+
237
+ class SmbClient(object):
238
+ """
239
+ 优缺点:函数功能丰富,文件下载功能只对普通文件如txt,dat,csv有效,压缩文件无效
240
+ """
241
+
242
+ def __init__(self, username, password, my_name, remote_name, ip, port=139, domain='', server_name='caiji'):
243
+ self.username = username
244
+ self.password = password
245
+ self.my_name = my_name
246
+ self.ip = ip
247
+ self.port = port
248
+ self.remote_name = remote_name
249
+ self.conn = None
250
+ self.domain = domain
251
+ self.server_name = server_name
252
+
253
+ def set_use_smb2(self, is_use=True):
254
+ """
255
+ 在 pysmb 中禁用 SMB2 协议,请在创建SMBConnection实例之前将smb_structs模块中
256
+ 的SUPPORT_SMB2标志设置为False
257
+ :param is_use:
258
+ :return:
259
+ """
260
+ smb_structs.SUPPORT_SMB2 = is_use
261
+
262
+ def get_bios_name(self, timeout=10):
263
+ """
264
+ 想通过ip获取对应计算机名,但没有成功
265
+ """
266
+ bios = None
267
+ try:
268
+ bios = NetBIOS()
269
+ srv_name = bios.queryIPForName(self.ip, timeout=timeout)
270
+ print(srv_name)
271
+ return srv_name
272
+ except:
273
+ traceback.print_exc()
274
+ print(sys.stderr, "Looking up timeout, check remote_smb_ip again!!")
275
+ finally:
276
+ if bios is not None:
277
+ bios.close()
278
+ return []
279
+
280
+ def set_config(self, path, sesc):
281
+ dictsall = IniConfig(path).builder().get_config_dict()
282
+ dicts = dictsall[sesc]
283
+ self.ip = dicts['ip']
284
+ self.port = dicts['port']
285
+ self.username = dicts['username']
286
+ self.password = dicts['password']
287
+ self.my_name = dicts['my_name']
288
+ self.remote_name = dicts['remote_name']
289
+ self.domain = dicts['domain']
290
+
291
+ def connect(self):
292
+ """
293
+ 建立smb服务连接
294
+ port: 445或者139
295
+ :return:
296
+ """
297
+ try:
298
+ self.conn = SMBConnection(self.username, self.password, self.my_name,
299
+ self.remote_name,
300
+ domain=self.domain)
301
+ self.conn.connect(self.ip, self.port)
302
+ status = self.conn.auth_result
303
+ except:
304
+ self.conn.close()
305
+ status = False
306
+ return status
307
+
308
+ def all_shares_name(self):
309
+ """
310
+ 列出smb服务器下的所有共享目录
311
+ :return:
312
+ """
313
+ share_names = list()
314
+ sharelist = self.conn.listShares()
315
+ for s in sharelist:
316
+ share_names.append(s.name)
317
+ return share_names
318
+
319
+ def all_file_names_in_dir(self, service_name, dir_name):
320
+ """
321
+ 列出文件夹内所有文件名
322
+ :param service_name: 服务名(smb中的文件夹名,一级目录)
323
+ :param dir_name: 二级目录及以下的文件目录
324
+ :return:
325
+ """
326
+ f_names = list()
327
+ for e in self.conn.listPath(service_name, dir_name):
328
+ if e.filename[0] != '.': # (会返回一些.的文件,需要过滤)
329
+ f_names.append(e.filename)
330
+ return f_names
331
+
332
+ def get_last_updatetime(self, service_name, file_path):
333
+ '''
334
+ 返回samba server上的文件更新时间(时间戳),如果出现OperationFailure说明无此文件,返回0
335
+ :param samba:
336
+ :param service_name:
337
+ :param file_path:
338
+ :return:
339
+ '''
340
+ try:
341
+ sharedfile_obj = self.conn.getAttributes(service_name, file_path)
342
+ return sharedfile_obj.last_write_time
343
+ except OperationFailure:
344
+ return 0
345
+
346
+ def download(self, f_names, service_name, smb_dir, local_dir):
347
+ """
348
+ 下载文件
349
+ :param f_names:文件名
350
+ :param service_name:服务名(smb中的文件夹名)
351
+ :param smb_dir: smb文件夹
352
+ :param local_dir: 本地文件夹
353
+ :return:
354
+ """
355
+ assert isinstance(f_names, list)
356
+ for f_name in f_names:
357
+ f = open(os.path.join(local_dir, f_name), 'wb')
358
+ self.conn.retrieveFile(service_name, os.path.join(smb_dir, f_name), f)
359
+ f.close()
360
+
361
+ def createDir(self, service_name, path):
362
+ """
363
+ 创建文件夹
364
+ :param samba:
365
+ :param service_name:
366
+ :param path:
367
+ :return:
368
+ """
369
+ try:
370
+ self.conn.createDirectory(service_name, path)
371
+ except OperationFailure:
372
+ pass
373
+
374
+ def upload(self, service_name, smb_dir, local_dir, f_names):
375
+ """
376
+ 上传文件
377
+ :param samba:
378
+ :param service_name:服务名(smb中的文件夹名)
379
+ :param smb_dir: smb文件夹
380
+ :param local_dir: 本地文件列表所在目录
381
+ :param f_names: 本地文件列表
382
+ :return:
383
+ """
384
+ assert isinstance(f_names, list)
385
+ for f_name in f_names:
386
+ f = open(os.path.join(local_dir, f_name), 'rb')
387
+ self.conn.storeFile(service_name, os.path.join(smb_dir, f_name), f) # 第二个参数path包含文件全路径
388
+ f.close()
389
+
390
+
391
+ # if __name__ == '__main__':
392
+ # bs = BaseSmb()
393
+ # # bs.set_uri("smb://caiji_smb_rw:5joH9yST@('VIPS-001','192.168.31.184'):139/caiji/except_client_try.txt")
394
+ # bs.set_default()
395
+ # bs.connect()
396
+ # bs.write_file("caiji/except_client_try.txt","aaaa")
397
+ # # for i in bs.get_gen_dir():
398
+ # # print(i)
399
+ # # print(bs.delete_dir("down_data/test.txt"))
400
+
401
+ # if __name__ == '__main__':
402
+ # sc = SmbClient("caiji_smb_rw", "5joH9yST", "TEST","VIPS-001", "192.168.31.184", 139, "WorkGroup")
403
+ # sc.connect()