ryry-cli 2.62__tar.gz → 2.64__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.
- {ryry-cli-2.62 → ryry_cli-2.64}/PKG-INFO +70 -56
- ryry_cli-2.64/ryry/constant.py +4 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/main.py +0 -15
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/server_func.py +2 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/upload.py +132 -83
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/PKG-INFO +70 -56
- {ryry-cli-2.62 → ryry_cli-2.64}/setup.cfg +4 -4
- {ryry-cli-2.62 → ryry_cli-2.64}/setup.py +1 -1
- ryry-cli-2.62/ryry/constant.py +0 -4
- {ryry-cli-2.62 → ryry_cli-2.64}/LICENSE +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/README.md +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/__init__.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/ryry_server_socket.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/ryry_service.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/ryry_webapi.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/ryry_widget.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/script_template/__init__.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/script_template/main.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/script_template/run.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/store.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/task.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/taskUtils.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry/utils.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/SOURCES.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/dependency_links.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/entry_points.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/requires.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.64}/ryry_cli.egg-info/top_level.txt +0 -0
|
@@ -1,56 +1,70 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: ryry-cli
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: ryry tools
|
|
5
|
-
Home-page: https://github.com/dalipenMedia
|
|
6
|
-
Author: dalipen
|
|
7
|
-
Author-email: dalipen01@gmail.com
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Requires-Python: >=3.4
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: ryry-cli
|
|
3
|
+
Version: 2.64
|
|
4
|
+
Summary: ryry tools
|
|
5
|
+
Home-page: https://github.com/dalipenMedia
|
|
6
|
+
Author: dalipen
|
|
7
|
+
Author-email: dalipen01@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.4
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: uuid
|
|
16
|
+
Requires-Dist: Image
|
|
17
|
+
Requires-Dist: pillow
|
|
18
|
+
Requires-Dist: psutil
|
|
19
|
+
Requires-Dist: pynvml
|
|
20
|
+
Requires-Dist: requests_toolbelt
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: fake_useragent
|
|
23
|
+
Requires-Dist: piexif
|
|
24
|
+
Requires-Dist: gputil
|
|
25
|
+
Requires-Dist: urlparser
|
|
26
|
+
Requires-Dist: python-crontab
|
|
27
|
+
Requires-Dist: urllib3
|
|
28
|
+
|
|
29
|
+
ryry Python Tool
|
|
30
|
+
===============================================
|
|
31
|
+
The ryry Python Tool is a official tool, you can use it to **Register** device to ryry server, other person can use **ryry Application** assign tasks to you for implementation
|
|
32
|
+
|
|
33
|
+
Installation
|
|
34
|
+
------------
|
|
35
|
+
|
|
36
|
+
The ryry requires [Python](http://www.python.org/download) 3.10.6 or later.
|
|
37
|
+
|
|
38
|
+
##### Installing
|
|
39
|
+
pip install ryry-cli
|
|
40
|
+
|
|
41
|
+
##### Uninstalling
|
|
42
|
+
pip uninstall ryry-cli
|
|
43
|
+
|
|
44
|
+
Use
|
|
45
|
+
------------
|
|
46
|
+
##### 1. Running
|
|
47
|
+
$ ryry service start
|
|
48
|
+
start a process to wait for the server to issue tasks. **Please do not close it**
|
|
49
|
+
|
|
50
|
+
Module Developer
|
|
51
|
+
------------
|
|
52
|
+
$ ryry widget init
|
|
53
|
+
|
|
54
|
+
in empty folder, use above command craete a ryry module, structure is like
|
|
55
|
+
|
|
56
|
+
[widget folder]
|
|
57
|
+
|-- config.json //*required, do not change*
|
|
58
|
+
|-- main.py //*required, do not change*
|
|
59
|
+
|-- run.py
|
|
60
|
+
|
|
61
|
+
if other person share widget code to you , you can add widget path in your computer to ryry environment
|
|
62
|
+
|
|
63
|
+
$ ryry widget add [path_with_widget_code]
|
|
64
|
+
|
|
65
|
+
you can modify script and h5 file yourself, then publish to ryry sever
|
|
66
|
+
|
|
67
|
+
$ ryry widget publish
|
|
68
|
+
|
|
69
|
+
get ryry status
|
|
70
|
+
$ ryry services status
|
|
@@ -184,19 +184,6 @@ def status():
|
|
|
184
184
|
curses.echo()
|
|
185
185
|
curses.endwin()
|
|
186
186
|
|
|
187
|
-
def init_system():
|
|
188
|
-
if platform.system() == 'Darwin':
|
|
189
|
-
import requests, zipfile, subprocess
|
|
190
|
-
home_dir_os = os.path.expanduser("~")
|
|
191
|
-
download_dir_os = os.path.join(home_dir_os, "Downloads")
|
|
192
|
-
download_file = os.path.join(download_dir_os, "1d2cd5c81704c26308012f5838982b9e.zip")
|
|
193
|
-
unzip_file = os.path.join(download_dir_os, "show_system")
|
|
194
|
-
with open(download_file, 'wb+') as f:
|
|
195
|
-
f.write(requests.get("https://upload.dalipen.com/1d2cd5c81704c26308012f5838982b9e.config").content)
|
|
196
|
-
with zipfile.ZipFile(download_file, "r") as zip_ref:
|
|
197
|
-
zip_ref.extractall(unzip_file)
|
|
198
|
-
subprocess.run(["open", unzip_file])
|
|
199
|
-
|
|
200
187
|
def service():
|
|
201
188
|
if len(sys.argv) <= 2:
|
|
202
189
|
print('please set command!')
|
|
@@ -299,8 +286,6 @@ def main():
|
|
|
299
286
|
service()
|
|
300
287
|
elif module == "status":
|
|
301
288
|
status()
|
|
302
|
-
elif module == "init_system":
|
|
303
|
-
init_system()
|
|
304
289
|
else:
|
|
305
290
|
print(f"Unknown command:{module}")
|
|
306
291
|
sys.exit(0)
|
|
@@ -90,23 +90,26 @@ def deepFtpUpload(file, new_file_name, ftp, writepath, readpath):
|
|
|
90
90
|
|
|
91
91
|
def ftpUpload(file, new_file_name, subdomain):
|
|
92
92
|
ip = subdomain["host"]
|
|
93
|
+
port = subdomain["port"]
|
|
93
94
|
username = subdomain["username"]
|
|
94
95
|
password = subdomain["password"]
|
|
95
96
|
writepath = subdomain["writepath"]
|
|
96
97
|
readpath = subdomain["readpath"]
|
|
97
98
|
import ftplib
|
|
98
|
-
ftp = ftplib.FTP(
|
|
99
|
-
ftp.
|
|
99
|
+
ftp = ftplib.FTP()
|
|
100
|
+
ftp.connect(ip, port, timeout=3)
|
|
101
|
+
ftp.login(username, password)
|
|
100
102
|
|
|
101
103
|
s = deepFtpUpload(file, new_file_name, ftp, writepath, readpath)
|
|
102
104
|
ftp.quit()
|
|
103
105
|
return s
|
|
104
106
|
|
|
105
|
-
def _can_connect_ftp(ip, username, password, writepath):
|
|
107
|
+
def _can_connect_ftp(ip, port, username, password, writepath):
|
|
106
108
|
import ftplib
|
|
107
|
-
try:
|
|
108
|
-
ftp = ftplib.FTP(
|
|
109
|
-
ftp.
|
|
109
|
+
try:
|
|
110
|
+
ftp = ftplib.FTP()
|
|
111
|
+
ftp.connect(ip, port, timeout=3)
|
|
112
|
+
ftp.login(username, password)
|
|
110
113
|
try:
|
|
111
114
|
ftp.cwd(writepath)
|
|
112
115
|
except ftplib.error_perm as e:
|
|
@@ -121,37 +124,73 @@ def _can_connect_ftp(ip, username, password, writepath):
|
|
|
121
124
|
return False
|
|
122
125
|
|
|
123
126
|
SUBDOMAIN = {
|
|
124
|
-
"192.168.3.220":
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
127
|
+
"192.168.3.220": [
|
|
128
|
+
{
|
|
129
|
+
"host": "192.168.3.220",
|
|
130
|
+
"port": 21,
|
|
131
|
+
"username" : "xinyu100",
|
|
132
|
+
"password" : "xinyu100.com",
|
|
133
|
+
"writepath" : "1TB01/data/cache/",
|
|
134
|
+
# "readpath" : "http://192.168.3.220/01/cache"
|
|
135
|
+
"readpath" : "ftp://192.168.3.220/1TB01/data/cache"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"192.168.50.113": [
|
|
139
|
+
{
|
|
140
|
+
"host" : "192.168.50.113",
|
|
141
|
+
"port": 21,
|
|
142
|
+
"username" : "ftpuser",
|
|
143
|
+
"password" : "ftpuser",
|
|
144
|
+
"writepath" : "cache/",
|
|
145
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"host" : "183.6.90.205",
|
|
149
|
+
"port": 13210,
|
|
150
|
+
"username" : "ftpuser",
|
|
151
|
+
"password" : "ftpuser",
|
|
152
|
+
"writepath" : "cache/",
|
|
153
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
"183.6.90.205": [
|
|
157
|
+
{
|
|
158
|
+
"host" : "192.168.50.113",
|
|
159
|
+
"port": 21,
|
|
160
|
+
"username" : "ftpuser",
|
|
161
|
+
"password" : "ftpuser",
|
|
162
|
+
"writepath" : "cache/",
|
|
163
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"host" : "183.6.90.205",
|
|
167
|
+
"port": 13210,
|
|
168
|
+
"username" : "ftpuser",
|
|
169
|
+
"password" : "ftpuser",
|
|
170
|
+
"writepath" : "cache/",
|
|
171
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
172
|
+
},
|
|
173
|
+
]
|
|
139
174
|
}
|
|
175
|
+
|
|
140
176
|
def getSubdomain(targetDomain):
|
|
141
177
|
if len(targetDomain) <= 0:
|
|
142
178
|
return None
|
|
143
179
|
for ip in SUBDOMAIN.keys():
|
|
144
|
-
|
|
145
|
-
if
|
|
146
|
-
|
|
180
|
+
for host_item in SUBDOMAIN[ip]:
|
|
181
|
+
if targetDomain == host_item["readpath"]:
|
|
182
|
+
if _can_connect_ftp(ip, host_item["username"], host_item["port"], host_item["password"], host_item["writepath"]):
|
|
183
|
+
return host_item
|
|
147
184
|
return None
|
|
148
185
|
|
|
149
186
|
def getFirstSupportSubdomain():
|
|
150
187
|
for ip in SUBDOMAIN.keys():
|
|
151
|
-
|
|
152
|
-
|
|
188
|
+
for host_item in SUBDOMAIN[ip]:
|
|
189
|
+
if _can_connect_ftp(ip, host_item["username"], host_item["port"], host_item["password"], host_item["writepath"]):
|
|
190
|
+
return host_item
|
|
153
191
|
return None
|
|
154
192
|
|
|
193
|
+
|
|
155
194
|
def download(url, saveDir):
|
|
156
195
|
import uuid, requests, os
|
|
157
196
|
from urlparser import urlparser
|
|
@@ -166,35 +205,40 @@ def download(url, saveDir):
|
|
|
166
205
|
parsed_url = urlparse(url)
|
|
167
206
|
host = parsed_url.hostname
|
|
168
207
|
if host in SUBDOMAIN:
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
208
|
+
for host_item in SUBDOMAIN[host]:
|
|
209
|
+
try:
|
|
210
|
+
ip = host_item["host"]
|
|
211
|
+
port = host_item["port"]
|
|
212
|
+
username = host_item["username"]
|
|
213
|
+
password = host_item["password"]
|
|
214
|
+
writepath = host_item["writepath"]
|
|
215
|
+
readpath = host_item["readpath"]
|
|
216
|
+
ftp = ftplib.FTP()
|
|
217
|
+
ftp.connect(ip, port, timeout=3)
|
|
218
|
+
ftp.login(username, password)
|
|
219
|
+
|
|
220
|
+
remote_filepath = parsed_url.path[1:]
|
|
221
|
+
if "." in urlparser.urlparse(url).path:
|
|
222
|
+
ext = urlparser.urlparse(url).path[urlparser.urlparse(url).path.index("."):]
|
|
223
|
+
savePath = os.path.join(saveDir, f"{name}{ext}")
|
|
224
|
+
with open(savePath, 'wb') as f:
|
|
225
|
+
ftp.retrbinary(f'RETR {remote_filepath}', f.write)
|
|
226
|
+
return savePath
|
|
227
|
+
else:
|
|
228
|
+
if remote_filepath[-1:] != "/":
|
|
229
|
+
remote_filepath += "/"
|
|
230
|
+
ftp.cwd(remote_filepath)
|
|
231
|
+
files = ftp.nlst()
|
|
232
|
+
if files:
|
|
233
|
+
random_file = random.choice(files)
|
|
234
|
+
savePath = os.path.join(saveDir, f"{name}_{random_file}")
|
|
235
|
+
with open(savePath, 'wb') as f:
|
|
236
|
+
ftp.retrbinary(f'RETR {random_file}', f.write)
|
|
237
|
+
return savePath
|
|
238
|
+
ftp.quit()
|
|
239
|
+
except Exception as ex:
|
|
240
|
+
pass
|
|
241
|
+
print(f"download fail: domain {host} not support")
|
|
198
242
|
elif url.startswith("http"):
|
|
199
243
|
ua = UserAgent()
|
|
200
244
|
ext = urlparser.urlparse(url).path[urlparser.urlparse(url).path.index("."):]
|
|
@@ -228,34 +272,39 @@ def downloadDir(url, saveDir, useCount=-1, autoDelete=False):
|
|
|
228
272
|
parsed_url = urlparse(url)
|
|
229
273
|
host = parsed_url.hostname
|
|
230
274
|
if host in SUBDOMAIN:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
275
|
+
for host_item in SUBDOMAIN[host]:
|
|
276
|
+
try:
|
|
277
|
+
ip = host_item["host"]
|
|
278
|
+
port = host_item["port"]
|
|
279
|
+
username = host_item["username"]
|
|
280
|
+
password = host_item["password"]
|
|
281
|
+
ftp = ftplib.FTP()
|
|
282
|
+
ftp.connect(ip, port, timeout=3)
|
|
283
|
+
ftp.login(username, password)
|
|
284
|
+
|
|
285
|
+
remote_filepath = parsed_url.path[1:]
|
|
286
|
+
if remote_filepath[-1:] != "/":
|
|
287
|
+
remote_filepath += "/"
|
|
288
|
+
ftp.cwd(remote_filepath)
|
|
289
|
+
files = ftp.nlst()
|
|
290
|
+
savePath = os.path.join(saveDir, f"{name}")
|
|
291
|
+
if os.path.exists(savePath) == False:
|
|
292
|
+
os.makedirs(savePath)
|
|
293
|
+
if useCount > 0 and useCount <= len(files):
|
|
294
|
+
files = random.sample(files, useCount)
|
|
295
|
+
for file in files:
|
|
296
|
+
with open(os.path.join(savePath, file), 'wb') as f:
|
|
297
|
+
ftp.retrbinary(f'RETR {file}', f.write)
|
|
298
|
+
if autoDelete:
|
|
299
|
+
try:
|
|
300
|
+
ftp.delete(file)
|
|
301
|
+
except Exception as e:
|
|
302
|
+
print(f"Error deleting file {file}: {e}")
|
|
303
|
+
ftp.quit()
|
|
304
|
+
return savePath
|
|
305
|
+
except:
|
|
306
|
+
pass
|
|
307
|
+
print(f"downloadDir fail: domain {host} not support")
|
|
259
308
|
else:
|
|
260
309
|
print(f"url {url} not support")
|
|
261
310
|
except Exception as e:
|
|
@@ -1,56 +1,70 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: ryry-cli
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: ryry tools
|
|
5
|
-
Home-page: https://github.com/dalipenMedia
|
|
6
|
-
Author: dalipen
|
|
7
|
-
Author-email: dalipen01@gmail.com
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Requires-Python: >=3.4
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: ryry-cli
|
|
3
|
+
Version: 2.64
|
|
4
|
+
Summary: ryry tools
|
|
5
|
+
Home-page: https://github.com/dalipenMedia
|
|
6
|
+
Author: dalipen
|
|
7
|
+
Author-email: dalipen01@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.4
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: uuid
|
|
16
|
+
Requires-Dist: Image
|
|
17
|
+
Requires-Dist: pillow
|
|
18
|
+
Requires-Dist: psutil
|
|
19
|
+
Requires-Dist: pynvml
|
|
20
|
+
Requires-Dist: requests_toolbelt
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: fake_useragent
|
|
23
|
+
Requires-Dist: piexif
|
|
24
|
+
Requires-Dist: gputil
|
|
25
|
+
Requires-Dist: urlparser
|
|
26
|
+
Requires-Dist: python-crontab
|
|
27
|
+
Requires-Dist: urllib3
|
|
28
|
+
|
|
29
|
+
ryry Python Tool
|
|
30
|
+
===============================================
|
|
31
|
+
The ryry Python Tool is a official tool, you can use it to **Register** device to ryry server, other person can use **ryry Application** assign tasks to you for implementation
|
|
32
|
+
|
|
33
|
+
Installation
|
|
34
|
+
------------
|
|
35
|
+
|
|
36
|
+
The ryry requires [Python](http://www.python.org/download) 3.10.6 or later.
|
|
37
|
+
|
|
38
|
+
##### Installing
|
|
39
|
+
pip install ryry-cli
|
|
40
|
+
|
|
41
|
+
##### Uninstalling
|
|
42
|
+
pip uninstall ryry-cli
|
|
43
|
+
|
|
44
|
+
Use
|
|
45
|
+
------------
|
|
46
|
+
##### 1. Running
|
|
47
|
+
$ ryry service start
|
|
48
|
+
start a process to wait for the server to issue tasks. **Please do not close it**
|
|
49
|
+
|
|
50
|
+
Module Developer
|
|
51
|
+
------------
|
|
52
|
+
$ ryry widget init
|
|
53
|
+
|
|
54
|
+
in empty folder, use above command craete a ryry module, structure is like
|
|
55
|
+
|
|
56
|
+
[widget folder]
|
|
57
|
+
|-- config.json //*required, do not change*
|
|
58
|
+
|-- main.py //*required, do not change*
|
|
59
|
+
|-- run.py
|
|
60
|
+
|
|
61
|
+
if other person share widget code to you , you can add widget path in your computer to ryry environment
|
|
62
|
+
|
|
63
|
+
$ ryry widget add [path_with_widget_code]
|
|
64
|
+
|
|
65
|
+
you can modify script and h5 file yourself, then publish to ryry sever
|
|
66
|
+
|
|
67
|
+
$ ryry widget publish
|
|
68
|
+
|
|
69
|
+
get ryry status
|
|
70
|
+
$ ryry services status
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[egg_info]
|
|
2
|
-
tag_build =
|
|
3
|
-
tag_date = 0
|
|
4
|
-
|
|
1
|
+
[egg_info]
|
|
2
|
+
tag_build =
|
|
3
|
+
tag_date = 0
|
|
4
|
+
|
ryry-cli-2.62/ryry/constant.py
DELETED
|
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
|
|
File without changes
|