add rename,
[vuplus_dvbapp-plugin] / ftpbrowser / src / FTPServerManager.py
1 # for localized messages
2 from . import _
3
4 # GUI (Screens)
5 from Components.ConfigList import ConfigListScreen
6 from Screens.MessageBox import MessageBox
7 from Screens.Screen import Screen
8 from NTIVirtualKeyBoard import NTIVirtualKeyBoard
9
10 # GUI (Components)
11 from Components.MenuList import MenuList
12 from Components.ActionMap import ActionMap
13 from Components.Label import Label
14
15 # Config
16 from Components.config import config, ConfigInteger, ConfigSubsection, \
17                 ConfigText, ConfigPassword, ConfigYesNo, getConfigListEntry
18
19 # For new and improved _parse
20 from urlparse import urlparse, urlunparse
21
22 def _parse(url, defaultPort = None):
23         url = url.strip()
24         parsed = urlparse(url)
25         scheme = parsed[0]
26         path = urlunparse(('','')+parsed[2:])
27
28         if defaultPort is None:
29                 if scheme == 'https':
30                         defaultPort = 443
31                 elif scheme == 'ftp':
32                         defaultPort = 21
33                 else:
34                         defaultPort = 80
35
36         host, port = parsed[1], defaultPort
37
38         if '@' in host:
39                 username, host = host.split('@')
40                 if ':' in username:
41                         username, password = username.split(':')
42                 else:
43                         password = ""
44         else:
45                 username = ""
46                 password = ""
47
48         if ':' in host:
49                 host, port = host.split(':')
50                 port = int(port)
51
52         if path == "":
53                 path = "/"
54
55         return scheme, host, port, path, username, password
56
57 class FTPServer:
58         def __init__(self, cfg):
59                 self.cfg = cfg
60
61         def getCfg(self):
62                 return self.cfg
63
64         def getName(self):
65                 return self.cfg.name.value
66
67         def getAddress(self):
68                 return self.cfg.address.value
69
70         def getUsername(self):
71                 return self.cfg.username.value
72
73         def getPassword(self):
74                 return self.cfg.password.value
75
76         def getPort(self):
77                 return self.cfg.port.value
78
79         def getPassive(self):
80                 return self.cfg.passive.value
81
82         def getPath(self):
83                 # TODO: implement
84                 return '/'
85
86         def getURI(self):
87                 if self.getUsername() != "":
88                         uri = "ftp://%s:%s@%s:%d%s" % (self.getUsername(), self.getPassword(), self.getAddress(), self.getPort(), self.getPath())
89                 else:
90                         uri = "ftp://%s:%d%s" % (self.getAddress(), self.getPort(), self.getPath())
91                 return uri
92
93         def save(self):
94                 self.cfg.save()
95
96         def cancel(self):
97                 self.cfg.cancel()
98
99 def ftpserverFromURI(uri, name = "", save = True):
100         scheme, host, port, path, username, password = _parse(uri, defaultPort = 21)
101         
102         newServer = ConfigSubsection()
103         if save:
104                 config.plugins.ftpbrowser.server.append(newServer)
105         newServer.name = ConfigText(fixed_size = False)
106         newServer.name.value = name or host
107         newServer.address = ConfigText(fixed_size = False)
108         newServer.address.value = host
109         newServer.username = ConfigText(fixed_size = False)
110         newServer.username.value = username
111         newServer.password = ConfigPassword()
112         newServer.password.value = password
113         newServer.port = ConfigInteger(0, (0, 65535))
114         newServer.port.value = port
115         newServer.passive = ConfigYesNo(False)
116
117         if save:
118                 newServer.save()
119                 config.plugins.ftpbrowser.servercount.value += 1
120                 config.plugins.ftpbrowser.servercount.save()
121
122         return FTPServer(newServer)
123
124 class FTPServerEditor(ConfigListScreen, Screen):
125         skin = """
126                 <screen position="center,center" size="560,180" title="FTP Server Editor">
127                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
128                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
129                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
130                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
131                         <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
132                         <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
133                         <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
134                         <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
135                         <widget name="config" position="10,50" size="550,130" scrollbarMode="showOnDemand" />
136                 </screen>"""
137
138         def __init__(self, session, server):
139                 Screen.__init__(self, session)
140
141                 self.server = server
142
143                 self["key_red"] = Label(_("Exit"))
144                 self["key_green"] = Label(_("OK"))
145                 self["key_yellow"] = Label("")
146                 self["key_blue"] = Label(_("Enter URI"))
147
148                 ConfigListScreen.__init__(self, [
149                         getConfigListEntry(_("Name:"), server.cfg.name),
150                         getConfigListEntry(_("Address:"), server.cfg.address),
151                         getConfigListEntry(_("Username:"), server.cfg.username),
152                         getConfigListEntry(_("Password:"), server.cfg.password),
153                         getConfigListEntry(_("Port:"), server.cfg.port)
154                 ])
155                 
156                 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
157                         {
158                                 "save": self.keySave,
159                                 "cancel": self.keyCancel,
160                                 "blue": self.getURI,
161                         }, -2)
162
163                 self.onLayoutFinish.append(self.layoutFinished)
164
165         def layoutFinished(self):
166                 self.setTitle(_("FTP Server Editor"))
167
168         def gotURI(self, res):
169                 if res:
170                         cfg = self.server.cfg
171
172                         # _parse gets confused without a scheme
173                         if not res.startswith("ftp://"):
174                                 res = "ftp://" + res
175                         scheme, host, port, path, username, password = _parse(res, defaultPort = 21)
176
177                         cfg.address.value = host
178                         cfg.username.value = username
179                         cfg.password.value = password
180                         cfg.port.value = port
181
182         def getURI(self):
183                 self.session.openWithCallback(
184                         self.gotURI,
185                         NTIVirtualKeyBoard,
186                         title = _("Enter URI of FTP Server:"),
187                         text = self.server.getURI(),
188                 )
189
190         def keySave(self):
191                 self.saveAll()
192                 self.close(True)
193
194 class FTPServerManager(Screen):
195         skin = """
196                 <screen position="center,center" size="560,420" title="FTP Server Manager" >
197                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
198                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
199                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
200                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
201                         <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
202                         <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
203                         <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
204                         <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
205                         <widget name="list" position="0,50" size="560,360" scrollbarMode="showOnDemand" />
206                 </screen>"""
207
208         def __init__(self, session):
209                 Screen.__init__(self, session)
210                 self.session = session
211                 self.changed = False
212                 
213                 self["key_red"] = Label(_("Delete"))
214                 self["key_green"] = Label(_("Add"))
215                 self["key_yellow"] = Label(_("Edit"))
216                 self["key_blue"] = Label(_("Save"))
217                 self["list"] = MenuList([])
218                 
219                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
220                         {
221                                 "cancel": self.exit,
222                                 "ok": self.okClicked,
223                                 "red": self.delete,
224                                 "green": self.add,
225                                 "yellow": self.edit,
226                                 "blue": self.save
227                         }, -1)
228                 
229                 self.onLayoutFinish.extend((
230                         self.updateServerList,
231                         self.layoutFinished,
232                 ))
233
234         def layoutFinished(self):
235                 self.setTitle(_("FTP Server Manager"))
236
237         def updateServerList(self):
238                 list = [server.name.value for server in config.plugins.ftpbrowser.server]
239                 self["list"].setList(list)
240
241         def exit(self, server=None):
242                 if self.changed:
243                         self.save(False)
244                 self.close(server)
245
246         def okClicked(self):
247                 idx = self["list"].getSelectedIndex()
248                 ftpserverconfig = config.plugins.ftpbrowser
249                 Len = ftpserverconfig.servercount.value
250
251                 if Len and idx < Len:
252                         server = FTPServer(ftpserverconfig.server[idx])
253                         self.exit(server)
254
255         def delete(self):
256                 self.session.openWithCallback(
257                         self.deleteConfirm,
258                         MessageBox,
259                         _("Really delete this entry?\nIt cannot be recovered!")
260                 )
261
262         def deleteConfirm(self, ret):
263                 if not ret:
264                         return
265
266                 idx = self["list"].getSelectedIndex()
267                 ftpserverconfig = config.plugins.ftpbrowser
268                 Len = ftpserverconfig.servercount.value
269
270                 if Len and idx < Len:
271                         del ftpserverconfig.server[idx]
272                         ftpserverconfig.servercount.value -= 1
273                         self.updateServerList()
274                         self.changed = True
275
276         def add(self):
277                 newServer = ConfigSubsection()
278                 config.plugins.ftpbrowser.server.append(newServer)
279                 newServer.name = ConfigText("Name", fixed_size = False)
280                 newServer.address = ConfigText("192.168.2.12", fixed_size = False)
281                 newServer.username = ConfigText("root", fixed_size = False)
282                 newServer.password = ConfigPassword("dreambox")
283                 newServer.port = ConfigInteger(21, (1, 65535))
284                 newServer.passive = ConfigYesNo(False)
285                 config.plugins.ftpbrowser.servercount.value += 1
286                 config.plugins.ftpbrowser.servercount.save()
287
288                 self.updateServerList()
289                 self.changed = True
290
291         def edit(self):
292                 idx = self["list"].getSelectedIndex()
293                 ftpserverconfig = config.plugins.ftpbrowser
294                 Len = ftpserverconfig.servercount.value
295
296                 if Len and idx < Len:
297                         self.session.openWithCallback(
298                                 self.editCallback,
299                                 FTPServerEditor,
300                                 FTPServer(ftpserverconfig.server[idx])
301                         )
302
303         def editCallback(self, ret = False):
304                 if ret:
305                         self.updateServerList()
306                         self.changed = True
307
308         def save(self, showMessageBox=True):
309                 config.plugins.ftpbrowser.save()
310                 if showMessageBox:
311                         self.session.open(
312                                 MessageBox,
313                                 _("Configuration saved."),
314                                 type = MessageBox.TYPE_INFO
315                         )
316