1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from flumotion.admin import connections
25 from flumotion.common import log, connection as fconnection
26 from flumotion.twisted import flavors, reflect, pb as fpb
27 from flumotion.admin.text import misc_curses
28 from flumotion.admin.text import connection
29
30 from twisted.internet import reactor
31 from zope.interface import implements
32 import gobject
33 import curses
34
35 -class AdminTextGreeter(log.Loggable, gobject.GObject, misc_curses.CursesStdIO):
36 implements(flavors.IStateListener)
37
38 logCategory = 'admintextgreeter'
39
40 - def __init__(self, stdscr):
41 self.stdscr = stdscr
42 self.connections = connections.get_recent_connections()
43 self.current_connection = 0
44 self.state = 0
45 self.current_input = ''
46 curses.curs_set(0)
47 self.entries = [ '', 'Hostname', 'Port', 'Secure?', 'Username', 'Password' ]
48 self.inputs = [ '', 'localhost', '7531', 'Yes', 'user', '' ]
49
51 self.stdscr.addstr(0, 0, "Please choose a connection:")
52
53 cury = 3
54 maxyx = self.stdscr.getmaxyx()
55 self.debug("mayx: %d, %d", maxyx[0], maxyx[1])
56 for c in self.connections:
57 self.debug("cury: %d", cury)
58 if cury - 3 == self.current_connection:
59 self.stdscr.addstr(cury, 10, c['name'], curses.A_REVERSE)
60 else:
61 self.stdscr.addstr(cury, 10, c['name'])
62 if cury + 10 > maxyx[0]:
63 break
64 cury = cury + 1
65 self.displayed_connections = cury - 3
66 if cury - 3 == self.current_connection:
67 self.stdscr.addstr(cury + 1, 10, "New connection...", curses.A_REVERSE)
68 else:
69 self.stdscr.addstr(cury + 1, 10, "New connection...")
70 self.stdscr.refresh()
71
72
74 cury = self.displayed_connections + 5 + self.state
75 if self.state > 0 and self.state < 5:
76 self.stdscr.addstr(cury, 10, "%s: %s" % (self.entries[self.state],self.current_input))
77 elif self.state == 5:
78
79 self.stdscr.addstr(cury, 10, "%s: " % self.entries[self.state])
80 else:
81 self.stdscr.move(cury,10)
82 self.stdscr.clrtobot()
83 self.stdscr.refresh()
84
86 c= self.stdscr.getch()
87 if self.state == 0:
88 if c == curses.KEY_DOWN:
89 if self.current_connection >= self.displayed_connections :
90 self.current_connection = 0
91 else:
92 self.current_connection = self.current_connection + 1
93 self.show()
94 elif c == curses.KEY_UP:
95 if self.current_connection == 0:
96 self.current_connection = self.displayed_connections
97 else:
98 self.current_connection = self.current_connection - 1
99 self.show()
100 elif c == curses.KEY_ENTER or c == 10:
101
102 if self.current_connection == self.displayed_connections:
103 curses.curs_set(1)
104 self.current_input = self.inputs[1]
105 self.state = 1
106 self.display_current_input_line()
107 else:
108
109 curses.curs_set(1)
110 c = self.connections[self.current_connection]
111 info = c['info']
112 reactor.removeReader(self)
113 connection.connect_to_manager(self.stdscr, info)
114 else:
115 if c == curses.KEY_ENTER or c == 10:
116 if self.state < 6:
117 self.inputs[self.state] = self.current_input
118 if self.state < 5:
119 self.current_input = self.inputs[self.state+1]
120 self.state = self.state + 1
121 self.display_current_input_line()
122 else:
123
124 reactor.removeReader(self)
125 try:
126 port = int(self.inputs[2])
127 except ValueError:
128 port = 7531
129 info = fconnection.PBConnectionInfo(self.inputs[1], port,
130 self.inputs[3] == 'Yes', fpb.Authenticator(
131 username=self.inputs[4], password=self.inputs[5]))
132
133 connection.connect_to_manager(self.stdscr, info)
134 pass
135 elif c == curses.KEY_BACKSPACE or c == 127:
136 self.current_input = self.current_input[:-1]
137 self.display_current_input_line()
138 elif c == curses.KEY_UP:
139 if self.state > 0:
140 self.current_input = self.inputs[self.state-1]
141 self.state = self.state - 1
142 if self.state == 0:
143
144 curses.curs_set(0)
145 self.display_current_input_line()
146 elif c == curses.KEY_DOWN:
147 pass
148 else:
149 self.current_input = self.current_input + chr(c)
150 self.display_current_input_line()
151