92 |
92 |
93 def query (self) : |
93 def query (self) : |
94 hosts = self.db.query(Host) |
94 hosts = self.db.query(Host) |
95 |
95 |
96 # sort ? |
96 # sort ? |
97 sort = self.request.args.get('sort') |
97 self.sort = self.request.args.get('sort') |
98 |
98 |
99 if sort : |
99 if self.sort : |
100 sort = self.HOST_ATTRS[sort] |
100 sort = self.HOST_ATTRS[self.sort] |
101 else : |
101 else : |
102 sort = self.HOST_SORT |
102 sort = self.HOST_SORT |
103 |
103 |
104 log.debug("sort: %s", sort) |
104 log.debug("sort: %s", sort) |
105 |
105 |
106 hosts = hosts.order_by(sort) |
106 hosts = hosts.order_by(sort) |
107 |
107 |
108 # k |
108 # k |
109 self.sort = sort |
|
110 |
|
111 return hosts |
109 return hosts |
112 |
110 |
113 def render_hosts (self, hosts, title=None) : |
111 def render_hosts (self, hosts, title=None, filters=False) : |
114 COLS = ( |
112 COLS = ( |
115 #title sort |
113 #title sort filter |
116 ('#', None), |
114 ('IP', 'ip', 'ip' ), |
117 ('IP', 'ip'), |
115 ('MAC', 'mac', 'mac' ), |
118 ('MAC', 'mac'), |
116 ('Hostname', 'name', False ), |
119 ('Hostname', 'name'), |
117 ('Seen', 'seen', False ), |
120 ('Seen', 'seen'), |
118 ) |
121 ) |
119 |
122 |
120 def url (**opts) : |
123 return html.table( |
121 args = dict(filters) |
|
122 args.update(opts) |
|
123 |
|
124 return self.url(**args) |
|
125 |
|
126 table = html.table( |
124 html.caption(title) if title else None, |
127 html.caption(title) if title else None, |
125 html.thead( |
128 html.thead( |
126 html.tr( |
129 html.tr( |
127 html.th( |
130 html.th('#'), |
128 html.a(href=self.url(sort=sort))(title) if sort else (title) |
131 ( |
129 ) for title, sort in COLS |
132 html.th( |
130 ) |
133 html.a(href=url(sort=sort))(title) if sort else (title) |
|
134 ) for title, sort, filter in COLS |
|
135 ) |
|
136 ), |
|
137 html.tr(class_='filter')( |
|
138 html.td( |
|
139 html.input(type='submit', value=u'\u00BF'), |
|
140 ), |
|
141 ( |
|
142 html.td( |
|
143 html.input(type='text', name=filter, value=filters.get(filter)) if filter else None |
|
144 ) for title, sort, filter in COLS |
|
145 ) |
|
146 ) if filters is not False else None |
131 ), |
147 ), |
132 html.tbody( |
148 html.tbody( |
133 html.tr(class_=('alternate' if i % 2 else None), id=host.id)( |
149 html.tr(class_=('alternate' if i % 2 else None), id=host.id)( |
134 html.td(class_='id')( |
150 html.td(class_='id')( |
135 html.a(href=self.url(ItemHandler, id=host.id))( |
151 html.a(href=self.url(ItemHandler, id=host.id))( |
149 html.td(host.render_name()), |
165 html.td(host.render_name()), |
150 html.td(host.when()), |
166 html.td(host.when()), |
151 ) for i, host in enumerate(hosts) |
167 ) for i, host in enumerate(hosts) |
152 ) |
168 ) |
153 ) |
169 ) |
|
170 |
|
171 if filters is False : |
|
172 return table |
|
173 else : |
|
174 return html.form(method='get', action=self.url())( |
|
175 html.input(type='hidden', name='sort', value=self.sort), |
|
176 table, |
|
177 ) |
154 |
178 |
155 def render_host (self, host, hosts) : |
179 def render_host (self, host, hosts) : |
156 attrs = ( |
180 attrs = ( |
157 ('IP', host.ip), |
181 ('IP', host.ip), |
158 ('MAC', host.mac), |
182 ('MAC', host.mac), |
172 self.render_hosts(hosts), |
196 self.render_hosts(hosts), |
173 |
197 |
174 html.a(href=self.url(ListHandler))(html('«'), 'Back'), |
198 html.a(href=self.url(ListHandler))(html('«'), 'Back'), |
175 ) |
199 ) |
176 |
200 |
177 class IndexHandler (BaseHandler) : |
|
178 def process (self) : |
|
179 self.hosts = self.query() |
|
180 |
|
181 def title (self) : |
|
182 return "DHCP Hosts" |
|
183 |
|
184 def render (self) : |
|
185 return self.render_hosts(self.hosts) |
|
186 |
|
187 class ItemHandler (BaseHandler) : |
201 class ItemHandler (BaseHandler) : |
188 def process (self, id) : |
202 def process (self, id) : |
189 self.hosts = self.query() |
203 self.hosts = self.query() |
190 self.host = self.hosts.get(id) |
204 self.host = self.hosts.get(id) |
191 |
205 |
200 def render (self) : |
214 def render (self) : |
201 return self.render_host(self.host, self.hosts) |
215 return self.render_host(self.host, self.hosts) |
202 |
216 |
203 class ListHandler (BaseHandler) : |
217 class ListHandler (BaseHandler) : |
204 def process (self) : |
218 def process (self) : |
205 hosts = self.query() |
219 self.hosts = self.query() |
|
220 |
|
221 # filter? |
206 self.filters = {} |
222 self.filters = {} |
207 |
223 |
208 for attr in self.HOST_ATTRS : |
224 for attr in self.HOST_ATTRS : |
209 value = self.request.args.get(attr) |
225 value = self.request.args.get(attr) |
210 |
226 |
211 if not value : |
227 if not value : |
212 continue |
228 continue |
213 |
229 |
214 # preprocess |
230 # preprocess |
215 if attr == 'mac' : |
231 like = False |
|
232 |
|
233 if value.endswith('*') : |
|
234 like = value.replace('*', '%') |
|
235 |
|
236 elif attr == 'mac' : |
216 value = Host.normalize_mac(value) |
237 value = Host.normalize_mac(value) |
217 |
238 |
218 # filter |
239 # filter |
219 hosts = hosts.filter(self.HOST_ATTRS[attr] == value) |
240 col = self.HOST_ATTRS[attr] |
|
241 |
|
242 if like : |
|
243 filter = (col.like(like)) |
|
244 else : |
|
245 filter = (col == value) |
|
246 |
|
247 self.hosts = self.hosts.filter(filter) |
220 self.filters[attr] = value |
248 self.filters[attr] = value |
221 |
|
222 self.hosts = hosts |
|
223 |
249 |
224 def title (self) : |
250 def title (self) : |
225 if self.filters : |
251 if self.filters : |
226 return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues())) |
252 return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues())) |
227 else : |
253 else : |
228 return "DHCP Hosts" |
254 return "DHCP Hosts" |
229 |
255 |
230 def render (self) : |
256 def render (self) : |
231 return ( |
257 return ( |
232 self.render_hosts(self.hosts), |
258 self.render_hosts(self.hosts, filters=self.filters), |
233 |
259 |
234 html.a(href=self.url())(html('«'), 'Back') if self.filters else None, |
260 html.a(href=self.url())(html('«'), 'Back') if self.filters else None, |
235 ) |
261 ) |