-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathwd.py
142 lines (110 loc) · 4.34 KB
/
wd.py
1
2
3
4
5
6
7
8
9
10
11
12
13
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env python
import sys
import requests as R
from binascii import b2a_base64
from urllib import quote_plus
from os import path
import re
DEFAULT_WD_SERVER = 'wd'
class API(object):
def __init__(self, user='nobody', passwd='', wd_server=DEFAULT_WD_SERVER):
self.wd_server = wd_server
self.user = user
self.passwd = passwd
self.session = self.login(user, passwd)
@staticmethod
def _b64e(inp):
return b2a_base64(inp).replace('\n', '')
def _send(self, target, headers=None, cookies=None, data=None, files=None, store_token=True):
if store_token:
if not headers:
headers = {}
headers['X-CSRF-Token'] = cookies['WD-CSRF-TOKEN']
return R.post(url='http://{}/{}'.format(self.wd_server, target),
headers=headers,
cookies=cookies,
data=data,
files=files)
def upload_data(self, payload_data, remote_dir, remote_name):
"""
requires no session
"""
token = 'tkn'
headers = {
'User-Agent': 'Shockwave Flash',
}
files = {
'Filedata': (remote_name, payload_data)
}
return self._send('web/jquery/uploader/uploadify.php?WD-CSRF-TOKEN={}'.format(token),
headers=headers,
data={'X-CSRF-Token': token,
'folder': remote_dir
},
files=files,
store_token=False
)
def upload_file(self, file_path, remote_dir, remote_name=None):
if not remote_name:
remote_name = path.basename(file_path)
return self.upload_data(open(file_path, 'rb').read(), remote_dir, remote_name)
def login(self, uname='nobody', passw=''):
"""
login('admin','mmmst8j')
"""
pwd = self._b64e(passw)
res = self._send('cgi-bin/login_mgr.cgi',
data={
'cmd': "wd_login",
'username': uname,
'pwd': pwd,
'port': None,
},
store_token=False)
d = {}
for c in res.cookies:
d[c.name] = c.value
return d
def get_available_remote_path(self, session_cookies=None):
if not session_cookies:
session_cookies = self.session
res = self._send('cgi-bin/webfile_mgr.cgi',
cookies=session_cookies,
data={
'cmd': 'cgi_folder_content_first',
'page': 1,
'rp': 10,
'query': '',
'qtype': '',
'f_field': 'false',
'used_dir': '',
})
if not res.text:
print '> ERR: failed getting paths'
return None
g = re.findall(r'(?i)\>(/mnt/HD.*?)\<', res.text)
if len(g) < 1:
print '> ERR: didnt find any available paths'
return None
if len(g) > 1:
print '> got multiple options, will use the first to get the HD name:'
print g
p = g[0]
hd_path = '/'.join(p.split('/')[:-1])
return hd_path
def _un_tar_zip(self, name, remote_dir, session_cookies, cgi_type):
return self._send('cgi-bin/webfile_mgr.cgi',
cookies=session_cookies,
data={
'cmd': cgi_type,
'path': remote_dir,
'name': name,
}).text
def unzip(self, name, remote_dir, session_cookies=None):
if not session_cookies:
session_cookies = self.session
return self._un_tar_zip(name, remote_dir, session_cookies, 'cgi_unzip')
def untar(self, name, remote_dir, session_cookies=None):
if not session_cookies:
session_cookies = self.session
return '<status>ok</status>' in self._un_tar_zip(name, remote_dir, session_cookies, 'cgi_untar')