| | 61 | class beautydate(gtk.Widget): |
| | 62 | __gsignals__ = { 'clicked': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, |
| | 63 | ()) |
| | 64 | } |
| | 65 | |
| | 66 | def __init__(self, title): |
| | 67 | gtk.Widget.__init__(self) |
| | 68 | self.title = self.create_pango_layout("%s" % title) |
| | 69 | self.title_font_size = 10 |
| | 70 | self.bhover = False |
| | 71 | self.bshow = True |
| | 72 | self.bclicked = False |
| | 73 | self.gradlevel = 1 |
| | 74 | self.graddec = True |
| | 75 | self.timer = -1 |
| | 76 | self.incl = 1.6 |
| | 77 | self.temptext = None # temp text (used in ni viewer) |
| | 78 | |
| | 79 | self.title.set_font_description(pango.FontDescription("Serif Bold %s" % self.title_font_size)) |
| | 80 | |
| | 81 | def _get_title_font_size(self): |
| | 82 | """ |
| | 83 | Get title font size. |
| | 84 | """ |
| | 85 | return self.__tsfont |
| | 86 | |
| | 87 | def _set_title_font_size(self, size): |
| | 88 | """ |
| | 89 | Set title font size. |
| | 90 | """ |
| | 91 | self.__tsfont = size |
| | 92 | |
| | 93 | def do_realize(self): |
| | 94 | self.set_flags(self.flags() | gtk.REALIZED) |
| | 95 | |
| | 96 | self.window = gdk.Window(self.get_parent_window(), |
| | 97 | width=self.allocation.width, |
| | 98 | height=self.allocation.height, |
| | 99 | window_type=gdk.WINDOW_CHILD, |
| | 100 | wclass=gdk.INPUT_OUTPUT, |
| | 101 | event_mask=self.get_events() | |
| | 102 | gdk.EXPOSURE_MASK | |
| | 103 | gdk.POINTER_MOTION_MASK | |
| | 104 | gdk.BUTTON_PRESS_MASK | |
| | 105 | gdk.BUTTON_RELEASE_MASK | |
| | 106 | gdk.ENTER_NOTIFY_MASK | |
| | 107 | gdk.LEAVE_NOTIFY_MASK) |
| | 108 | self.window.set_user_data(self) |
| | 109 | self.style.attach(self.window) |
| | 110 | self.style.set_background(self.window, gtk.STATE_NORMAL) |
| | 111 | self.window.move_resize(*self.allocation) |
| | 112 | |
| | 113 | self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) |
| | 114 | |
| | 115 | |
| | 116 | def do_unrealize(self): |
| | 117 | self.window.set_user_data(None) |
| | 118 | |
| | 119 | def do_size_request(self, requisition): |
| | 120 | width, height = self.title.get_size() |
| | 121 | width = width / pango.SCALE |
| | 122 | height = (height / pango.SCALE) + 6 |
| | 123 | |
| | 124 | if width < 430: |
| | 125 | width = 430 |
| | 126 | |
| | 127 | requisition.width = width |
| | 128 | requisition.height = height |
| | 129 | |
| | 130 | def do_size_allocate(self, allocation): |
| | 131 | self.allocation = allocation |
| | 132 | |
| | 133 | if self.flags() & gtk.REALIZED: |
| | 134 | self.window.move_resize(*allocation) |
| | 135 | |
| | 136 | def do_enter_notify_event(self, event): |
| | 137 | self.bhover = True |
| | 138 | self.queue_draw() |
| | 139 | |
| | 140 | def do_leave_notify_event(self, event): |
| | 141 | self.bhover = False |
| | 142 | self.queue_draw() |
| | 143 | |
| | 144 | def do_button_press_event(self, event): |
| | 145 | if self.bhover: |
| | 146 | if self.timer != -1: |
| | 147 | return |
| | 148 | self.bshow = not self.bshow |
| | 149 | self.bclicked = True |
| | 150 | self.graddec = True |
| | 151 | self.emit('clicked') |
| | 152 | self.queue_draw() |
| | 153 | |
| | 154 | def timeout(self): |
| | 155 | if self.graddec: |
| | 156 | self.gradlevel -= 0.1 |
| | 157 | else: |
| | 158 | self.gradlevel += 0.1 |
| | 159 | |
| | 160 | if self.bshow: |
| | 161 | self.incl += 0.1 |
| | 162 | else: |
| | 163 | self.incl -= 0.1 |
| | 164 | if self.incl < 1.0: |
| | 165 | self.incl = 1.0 |
| | 166 | if self.incl > 1.6: |
| | 167 | self.incl = 1.6 |
| | 168 | |
| | 169 | if self.gradlevel >= 1: |
| | 170 | if self.bshow: |
| | 171 | self.incl = 1.6 |
| | 172 | else: |
| | 173 | self.incl = 1.0 |
| | 174 | self.bclicked = False # animation end |
| | 175 | self.timer = -1 |
| | 176 | return False |
| | 177 | |
| | 178 | self.queue_draw() |
| | 179 | |
| | 180 | def do_expose_event(self, event): |
| | 181 | border = 4 |
| | 182 | cr = self.window.cairo_create() |
| | 183 | cr.rectangle(*event.area) |
| | 184 | cr.clip() |
| | 185 | |
| | 186 | # white background |
| | 187 | cr.save() |
| | 188 | cr.rectangle(*event.area) |
| | 189 | cr.set_source_rgb(1, 1, 1) |
| | 190 | cr.fill() |
| | 191 | cr.restore() |
| | 192 | |
| | 193 | # shadow |
| | 194 | cr.save() |
| | 195 | cr.rectangle(4, self.allocation[3] - border, |
| | 196 | self.allocation[2] - 4 - 1, border) |
| | 197 | pat = cairo.LinearGradient(0, 0, 0, self.allocation[3]) |
| | 198 | pat.add_color_stop_rgb(0.7, 0, 0, 0) |
| | 199 | pat.add_color_stop_rgb(1, 1, 1, 1) |
| | 200 | cr.set_source(pat) |
| | 201 | cr.fill() |
| | 202 | cr.restore() |
| | 203 | |
| | 204 | # contour |
| | 205 | cr.save() |
| | 206 | cr.rectangle(self.allocation[2] - border, border, border - 1, |
| | 207 | self.allocation[3] - 2 * border) |
| | 208 | cr.set_source_rgba(0, 0, 0, 0.4) |
| | 209 | cr.fill() |
| | 210 | cr.restore() |
| | 211 | |
| | 212 | # rectangle and gradient |
| | 213 | cr.save() |
| | 214 | |
| | 215 | cr.rectangle(0, 0, self.allocation[2] - 4, |
| | 216 | self.allocation[3] - border) |
| | 217 | pat = cairo.LinearGradient(0, 0, self.allocation[2] - border, 0) |
| | 218 | if self.bshow: # anim transitions |
| | 219 | if not self.bclicked: |
| | 220 | pat.add_color_stop_rgba(1, 0.729, 0.851, 1, 1) |
| | 221 | pat.add_color_stop_rgba(0, 0.918, 0.957, 1, 1) |
| | 222 | else: |
| | 223 | if self.gradlevel < 0.6: |
| | 224 | self.graddec = False |
| | 225 | |
| | 226 | if self.graddec: |
| | 227 | pat.add_color_stop_rgba(1, 0.7, 0.7, 0.7, self.gradlevel) |
| | 228 | pat.add_color_stop_rgba(0, 0.8, 0.8, 0.8, self.gradlevel) |
| | 229 | else: |
| | 230 | pat.add_color_stop_rgba(1, 0.729, 0.851, 1, self.gradlevel) |
| | 231 | pat.add_color_stop_rgba(0, 0.918, 0.957, 1, self.gradlevel) |
| | 232 | |
| | 233 | if self.timer != -1: |
| | 234 | gobject.source_remove(self.timer) |
| | 235 | |
| | 236 | gobject.timeout_add(25, self.timeout) |
| | 237 | else: |
| | 238 | if not self.bclicked: |
| | 239 | pat.add_color_stop_rgba(1, 0.75, 0.75, 0.75, 1) |
| | 240 | pat.add_color_stop_rgba(0, 0.9, 0.9, 0.9, 1) |
| | 241 | else: |
| | 242 | if self.gradlevel < 0.4: |
| | 243 | self.graddec = False |
| | 244 | |
| | 245 | if self.graddec: |
| | 246 | pat.add_color_stop_rgba(1, 0.729, 0.851, 1, self.gradlevel) |
| | 247 | pat.add_color_stop_rgba(0, 0.918, 0.957, 1, self.gradlevel) |
| | 248 | else: |
| | 249 | pat.add_color_stop_rgba(1, 0.75, 0.75, 0.75, self.gradlevel) |
| | 250 | pat.add_color_stop_rgba(0, 0.9, 0.9, 0.9, self.gradlevel) |
| | 251 | |
| | 252 | if self.timer != -1: |
| | 253 | gobject.source_remove(self.timer) |
| | 254 | |
| | 255 | self.timer = gobject.timeout_add(25, self.timeout) |
| | 256 | |
| | 257 | cr.set_source(pat) |
| | 258 | cr.fill() |
| | 259 | cr.restore() |
| | 260 | |
| | 261 | # \/ or > |
| | 262 | cr.move_to(4, border) |
| | 263 | if self.bshow: # \/ # anim transitions |
| | 264 | if not self.bclicked: |
| | 265 | cr.rel_line_to(10/1.6, 10) |
| | 266 | cr.rel_line_to(10/1.6, -10) |
| | 267 | else: |
| | 268 | cr.rel_line_to(10/self.incl, 10/((1.6 - self.incl) + 1)) |
| | 269 | cr.rel_line_to(10/self.incl, -10/((1.6 - self.incl) + 1)) |
| | 270 | else: # > |
| | 271 | if not self.bclicked: |
| | 272 | cr.rel_line_to(10, 10/1.6) |
| | 273 | cr.rel_line_to(-10, 10/1.6) |
| | 274 | else: |
| | 275 | cr.rel_line_to(10/self.incl, 10/((1.6 - self.incl) + 1)) |
| | 276 | cr.rel_line_to(-10/self.incl, 10/((1.6 - self.incl) + 1)) |
| | 277 | |
| | 278 | if self.bhover: |
| | 279 | alpha = 1 |
| | 280 | else: |
| | 281 | alpha = 0.6 |
| | 282 | cr.set_source_rgba(0, 0, 0, alpha) |
| | 283 | cr.fill() |
| | 284 | |
| | 285 | # write date title |
| | 286 | if self.bhover: |
| | 287 | cr.set_source_rgb(0, 0, 0) |
| | 288 | else: |
| | 289 | cr.set_source_rgba(0, 0, 0, 0.6) |
| | 290 | _, fonth = self.title.get_pixel_size() |
| | 291 | cr.move_to(20, 1) |
| | 292 | cr.update_layout(self.title) |
| | 293 | cr.show_layout(self.title) |
| | 294 | |
| | 295 | # Properties |
| | 296 | title_font_size = property(_get_title_font_size, _set_title_font_size) |
| | 297 | |
| | 298 | |
| | 299 | gobject.type_register(beautydate) |
| | 300 | |
| | 301 | |
| 531 | | print "load inv info" |
| 532 | | |
| | 789 | pass |
| | 790 | #self._load_inventory_data(title) |
| | 791 | """ |
| | 792 | |
| | 793 | |
| | 794 | |
| | 795 | def _load_inventory_data(self, inventory_name): |
| | 796 | fk_inventory = self.invdb.get_inventory_id_for_name(inventory_name) |
| | 797 | scans = self.invdb.get_scans_id_for_inventory(fk_inventory) |
| | 798 | last_scan_id = scans[len(scans)-1][0] |
| | 799 | hosts = self.addresses[inventory_name] |
| | 800 | |
| | 801 | box = gtk.VBox() |
| | 802 | |
| | 803 | # scan info |
| | 804 | hb = gtk.HBox() |
| | 805 | hb.pack_start(gtk.Label(_("Scan count: %d" % len(scans))), False, False, 0) |
| | 806 | box.pack_start(hb, False, False, 0) |
| | 807 | |
| | 808 | hb = gtk.HBox() |
| | 809 | last_scan_date = self.invdb.get_finish_timestamp_for_scan_from_db(last_scan_id) |
| | 810 | hb.pack_start(gtk.Label(_("Last scan date: %s" % last_scan_date)), False, False, 0) |
| | 811 | box.pack_start(hb, False, False, 0) |
| | 812 | |
| | 813 | details = self.invdb.get_scan_details_for_scan_from_db(scans[0][0]) |
| | 814 | detc = [ _("Scan args"), _("XML output version"), _("Verbose"), |
| | 815 | _("Debugging"), _("Scanner name"), _("Scanner version") ] |
| | 816 | for indx, item in enumerate(details): |
| | 817 | hb = gtk.HBox() |
| | 818 | hb.pack_start(gtk.Label("%s: %s" % (detc[indx], item)), False, False, 0) |
| | 819 | box.pack_start(hb, False, False, 0) |
| | 820 | |
| | 821 | # "separator" |
| | 822 | hb = gtk.HBox() |
| | 823 | hb.pack_start(gtk.Label("\n"), False, False, 0) |
| | 824 | box.pack_start(hb, False, False, 0) |
| | 825 | |
| | 826 | # hosts info |
| | 827 | hb = gtk.HBox() |
| | 828 | hb.pack_start(gtk.Label(_("Hosts: %s" % ', '.join(host for host in hosts))), False, False, 0) |
| | 829 | box.pack_start(hb, False, False, 0) |
| | 830 | |
| | 831 | hb = gtk.HBox() |
| | 832 | hb.pack_start(gtk.Label(_("Host count: %s" % len(hosts))), False, False, 0) |
| | 833 | box.pack_start(hb, False, False, 0) |
| | 834 | |
| | 835 | sw = gtk.ScrolledWindow() |
| | 836 | sw.add_with_viewport(box) |
| | 837 | sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) |
| | 838 | sw.show_all() |
| | 839 | |
| | 840 | return sw |
| | 841 | |
| | 842 | |
| | 843 | def create_tags(self, buffer): |
| | 844 | buffer.create_tag("heading_center", weight=pango.WEIGHT_BOLD, |
| | 845 | size=15 * pango.SCALE, |
| | 846 | justification=gtk.JUSTIFY_CENTER) |
| | 847 | |
| | 848 | buffer.create_tag("whitefg", foreground="white") |
| | 849 | #invisible=True) |
| | 850 | |
| | 851 | buffer.create_tag("p", left_margin=30) |
| | 852 | |
| | 853 | def insert_text(self, buffer, text): |
| | 854 | iter = buffer.get_iter_at_offset(0) |
| | 855 | buffer.insert(iter, ' ') |
| | 856 | anchor = buffer.create_child_anchor(iter) |
| | 857 | buffer.insert(iter, "\n") |
| | 858 | for i in text: |
| | 859 | buffer.insert_with_tags_by_name(iter, i, "p") |
| | 860 | |
| | 861 | def attach_widgets(self, text_view, date): |
| | 862 | buffer = text_view.get_buffer() |
| | 863 | iter = buffer.get_start_iter() |
| | 864 | |
| | 865 | while self.find_anchor(iter): |
| | 866 | anchor = iter.get_child_anchor() |
| | 867 | text = beautydate(date) |
| | 868 | text.connect('clicked', self.tclick, text, buffer) |
| | 869 | |
| | 870 | text_view.add_child_at_anchor(text, anchor) |
| | 871 | text.show_all() |
| | 872 | |
| | 873 | return |
| | 874 | |
| | 875 | def find_anchor(self, iter): |
| | 876 | while iter.forward_char(): |
| | 877 | if iter.get_child_anchor(): |
| | 878 | return True |
| | 879 | |
| | 880 | def tclick(self, event, widget, textbuffer): |
| | 881 | if widget.bshow: |
| | 882 | iter = textbuffer.get_iter_at_line(1) |
| | 883 | textbuffer.insert_with_tags_by_name(iter, widget.temptext, "p") |
| | 884 | else: |
| | 885 | start, end = textbuffer.get_bounds() |
| | 886 | start = textbuffer.get_iter_at_line(1) |
| | 887 | if not widget.temptext: |
| | 888 | text = textbuffer.get_text(start, end) |
| | 889 | widget.temptext = text |
| | 890 | |
| | 891 | textbuffer.delete(start, end) |
| 584 | | lstore.set(iter, 1, "down") |
| 585 | | |
| 586 | | treeview = gtk.TreeView(lstore) |
| 587 | | content.add(treeview) |
| 588 | | |
| 589 | | # column for scan finish timestamp |
| 590 | | column = gtk.TreeViewColumn(_("Scan finish date"), |
| 591 | | gtk.CellRendererText(), text=0) |
| 592 | | column.set_sort_column_id(0) |
| 593 | | treeview.append_column(column) |
| 594 | | |
| 595 | | # column for host status |
| 596 | | column = gtk.TreeViewColumn(_("Host status"), |
| 597 | | gtk.CellRendererText(), text=1) |
| 598 | | treeview.append_column(column) |
| 599 | | |
| 600 | | # column for host ports (this will be broken in several parts) |
| 601 | | column = gtk.TreeViewColumn(_("Host ports"), |
| 602 | | gtk.CellRendererText(), text=2) |
| 603 | | treeview.append_column(column) |
| 604 | | |
| 605 | | # column for host extraports (" ") |
| 606 | | column = gtk.TreeViewColumn(_("Host extraports"), |
| 607 | | gtk.CellRendererText(), text=3) |
| 608 | | treeview.append_column(column) |
| 609 | | |
| 610 | | treeview.show() |
| 611 | | |
| | 976 | text.append("down") |
| | 977 | self.insert_text(text_buffer, text) |
| | 978 | self.attach_widgets(tview, item[1]) |
| | 979 | box.pack_start(tview) |
| | 980 | |
| | 981 | sw = gtk.ScrolledWindow() |
| | 982 | sw.add_with_viewport(box) |
| | 983 | sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) |
| | 984 | sw.show_all() |
| | 985 | |
| | 986 | return sw |
| | 987 | |