gnms 2.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of gnms might be problematic. Click here for more details.

Files changed (140) hide show
  1. data/LICENSE +459 -0
  2. data/README +29 -0
  3. data/bin/gnms +11 -0
  4. data/gnms.gemspec +70 -0
  5. data/lib/cmd_parse.rb +747 -0
  6. data/lib/config_global.rb +414 -0
  7. data/lib/contact.rb +171 -0
  8. data/lib/external/crypt/blowfish-tables.rb +190 -0
  9. data/lib/external/crypt/blowfish.rb +110 -0
  10. data/lib/external/crypt/cbc.rb +123 -0
  11. data/lib/external/crypt/stringxor.rb +27 -0
  12. data/lib/external/fog.rb +41 -0
  13. data/lib/external/jjmx.rb +45 -0
  14. data/lib/external/sms.rb +282 -0
  15. data/lib/external/xmpp4r-simple.rb +497 -0
  16. data/lib/format.rb +85 -0
  17. data/lib/gnms.rb +329 -0
  18. data/lib/gui/about_window.rb +177 -0
  19. data/lib/gui/adddelnode.rb +799 -0
  20. data/lib/gui/base_window.rb +789 -0
  21. data/lib/gui/canvas_map.rb +498 -0
  22. data/lib/gui/charts/gruff.rb +51 -0
  23. data/lib/gui/color_macro.rb +145 -0
  24. data/lib/gui/config_window.rb +2151 -0
  25. data/lib/gui/custom_plugin_window.rb +90 -0
  26. data/lib/gui/debug_window.rb +46 -0
  27. data/lib/gui/event_window.rb +469 -0
  28. data/lib/gui/find_node_window.rb +438 -0
  29. data/lib/gui/help_window.rb +47 -0
  30. data/lib/gui/ipcalculator.rb +147 -0
  31. data/lib/gui/jmx_ref_window.rb +309 -0
  32. data/lib/gui/link_view.rb +46 -0
  33. data/lib/gui/mib_browser.rb +585 -0
  34. data/lib/gui/node_host_property.rb +3712 -0
  35. data/lib/gui/node_host_view.rb +270 -0
  36. data/lib/gui/node_network_property.rb +1059 -0
  37. data/lib/gui/node_network_view.rb +186 -0
  38. data/lib/gui/node_view.rb +672 -0
  39. data/lib/gui/oid_ref_window.rb +288 -0
  40. data/lib/gui/snmptrap_ref_window.rb +288 -0
  41. data/lib/gui/sub/account_frame.rb +196 -0
  42. data/lib/gui/sub/contact_frame.rb +519 -0
  43. data/lib/gui/syslog_ref_window.rb +288 -0
  44. data/lib/gui/treenode_window.rb +320 -0
  45. data/lib/gui/update_window.rb +124 -0
  46. data/lib/gui/widgets.rb +169 -0
  47. data/lib/gui/wmi_ref_window.rb +286 -0
  48. data/lib/interface.rb +16 -0
  49. data/lib/ipcalc.rb +266 -0
  50. data/lib/link.rb +45 -0
  51. data/lib/main.rb +1091 -0
  52. data/lib/monitor/client/custom/custom_monitoring.rb +40 -0
  53. data/lib/monitor/client/jmx/jmx_attr_monitoring.rb +36 -0
  54. data/lib/monitor/client/jmx/jmx_monitoring.rb +83 -0
  55. data/lib/monitor/client/jmx/jmx_ref.rb +114 -0
  56. data/lib/monitor/client/snmp/mibs/SNMPv2-MIB.txt +854 -0
  57. data/lib/monitor/client/snmp/mibs/SNMPv2-SMI.txt +344 -0
  58. data/lib/monitor/client/snmp/oid_ref.rb +141 -0
  59. data/lib/monitor/client/snmp/snmp.rb +178 -0
  60. data/lib/monitor/client/snmp/snmp_monitoring.rb +58 -0
  61. data/lib/monitor/client/wmi/wmi.rb +139 -0
  62. data/lib/monitor/client/wmi/wmi_monitoring.rb +60 -0
  63. data/lib/monitor/client/wmi/wmi_ref.rb +141 -0
  64. data/lib/monitor/custom_plugin.rb +50 -0
  65. data/lib/monitor/server/msg_buffer.rb +39 -0
  66. data/lib/monitor/server/snmp/snmptrap_analyzer.rb +81 -0
  67. data/lib/monitor/server/snmp/snmptrap_capture.rb +26 -0
  68. data/lib/monitor/server/snmp/snmptrap_monitoring.rb +32 -0
  69. data/lib/monitor/server/snmp/snmptrap_ref.rb +135 -0
  70. data/lib/monitor/server/snmp/snmptrap_server.rb +50 -0
  71. data/lib/monitor/server/syslog/syslog_analyzer.rb +141 -0
  72. data/lib/monitor/server/syslog/syslog_capture.rb +28 -0
  73. data/lib/monitor/server/syslog/syslog_monitoring.rb +32 -0
  74. data/lib/monitor/server/syslog/syslog_ref.rb +136 -0
  75. data/lib/monitor/server/syslog/syslog_server.rb +43 -0
  76. data/lib/node.rb +1020 -0
  77. data/lib/node_db.rb +2668 -0
  78. data/lib/node_host.rb +215 -0
  79. data/lib/node_listener.rb +639 -0
  80. data/lib/node_network.rb +269 -0
  81. data/lib/node_property.rb +39 -0
  82. data/lib/notify/alarm.rb +247 -0
  83. data/lib/notify/irc_bot.rb +167 -0
  84. data/lib/notify/xmpp_bot.rb +107 -0
  85. data/lib/service.rb +36 -0
  86. data/lib/version.rb +8 -0
  87. data/pixmap/bg/map_bg.jpg +0 -0
  88. data/pixmap/bg/map_bg2.jpg +0 -0
  89. data/pixmap/logo.jpg +0 -0
  90. data/pixmap/logo_icon.png +0 -0
  91. data/pixmap/os/3com.png +0 -0
  92. data/pixmap/os/aix.gif +0 -0
  93. data/pixmap/os/amiga.png +0 -0
  94. data/pixmap/os/beos.png +0 -0
  95. data/pixmap/os/cisco.png +0 -0
  96. data/pixmap/os/freebsd.png +0 -0
  97. data/pixmap/os/hp.png +0 -0
  98. data/pixmap/os/hurd.gif +0 -0
  99. data/pixmap/os/irix.gif +0 -0
  100. data/pixmap/os/linux.png +0 -0
  101. data/pixmap/os/mac.png +0 -0
  102. data/pixmap/os/netbsd.gif +0 -0
  103. data/pixmap/os/netware.png +0 -0
  104. data/pixmap/os/openbsd.png +0 -0
  105. data/pixmap/os/os2warp.gif +0 -0
  106. data/pixmap/os/qnx.gif +0 -0
  107. data/pixmap/os/sco.gif +0 -0
  108. data/pixmap/os/sgi.xpm +111 -0
  109. data/pixmap/os/solaris.gif +0 -0
  110. data/pixmap/os/unix.gif +0 -0
  111. data/pixmap/os/unknown.png +0 -0
  112. data/pixmap/os/vms.xpm +345 -0
  113. data/pixmap/os/windows.png +0 -0
  114. data/pixmap/type/cloud.png +0 -0
  115. data/pixmap/type/device.png +0 -0
  116. data/pixmap/type/firewall.png +0 -0
  117. data/pixmap/type/gateway.png +0 -0
  118. data/pixmap/type/home.png +0 -0
  119. data/pixmap/type/host.png +0 -0
  120. data/pixmap/type/network.png +0 -0
  121. data/pixmap/type/printer.png +0 -0
  122. data/pixmap/type/router.png +0 -0
  123. data/pixmap/type/server.png +0 -0
  124. data/pixmap/type/switch.png +0 -0
  125. data/pixmap/type/vm.png +0 -0
  126. data/plugins/Defaultme.rb +7 -0
  127. data/plugins/DnsCheck.rb +46 -0
  128. data/plugins/FooMonitor.rb +26 -0
  129. data/plugins/HttpVirtualHostMonitor.rb +43 -0
  130. data/plugins/MysqlShowStatusMonitor.rb +64 -0
  131. data/plugins/PgsqlPercentConnectionMonitor.rb +72 -0
  132. data/plugins/SshCpuLoadMonitor.rb +85 -0
  133. data/plugins/SshDiskMonitor.rb +69 -0
  134. data/plugins/SshFgtAvExpiredMonitor.rb +75 -0
  135. data/plugins/SshPercentUsedRamMonitor.rb +74 -0
  136. data/plugins/TelnetCpuLoadMonitor.rb +69 -0
  137. data/plugins/example1.rb +15 -0
  138. data/plugins/example2.rb +7 -0
  139. data/sound/beep.wav +0 -0
  140. metadata +378 -0
@@ -0,0 +1,288 @@
1
+ class SyslogRefWindow
2
+
3
+ def clear_ls()
4
+ @syslog_ref_ls.clear()
5
+ end
6
+ #populate listview with saved values
7
+ def populate_ls()
8
+ $syslog_refs.each_key do |name|
9
+ iter = @syslog_ref_ls.append
10
+ iter[0] = name
11
+ iter[1] = $syslog_refs[name].description
12
+ end
13
+ end
14
+
15
+ def initialize()
16
+ #save syslogref hash
17
+ @syslogrefs_backup=$syslog_refs.dup
18
+
19
+ @window=Gtk::Window.new
20
+
21
+ @window.set_title("Syslog Ref configuration")
22
+ @window.set_size_request(300, 200)
23
+
24
+ @window.signal_connect("key_press_event") {|w,e|
25
+ if e.keyval == Gdk::Keyval::GDK_Escape
26
+ @window.destroy
27
+ end
28
+ }
29
+
30
+ frame = Gtk::Frame::new
31
+ frame.border_width=5
32
+ frame.show
33
+ vbox_root=Gtk::VBox::new
34
+ vbox_root.show
35
+ @window.add vbox_root
36
+ vbox_root.add frame
37
+
38
+ vbox = Gtk::VBox.new(false,0)
39
+ vbox.show
40
+ frame.add vbox
41
+
42
+ @syslog_ref_ls = Gtk::ListStore.new(String, String)
43
+ @syslog_ref_view = Gtk::TreeView.new(@syslog_ref_ls)
44
+ @syslog_ref_view.show
45
+ column1 = Gtk::TreeViewColumn.new("Name",
46
+ Gtk::CellRendererText.new, {:text => 0})
47
+ column1.set_sort_column_id(0)
48
+ column2 = Gtk::TreeViewColumn.new("Description",
49
+ Gtk::CellRendererText.new, {:text => 1})
50
+ column2.set_sort_column_id(1)
51
+
52
+ @syslog_ref_view.append_column(column1)
53
+ @syslog_ref_view.append_column(column2)
54
+
55
+ scroll = Gtk::ScrolledWindow.new(nil, nil)
56
+ scroll.border_width=2
57
+ scroll.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC)
58
+ scroll.add @syslog_ref_view
59
+ scroll.show
60
+
61
+ # Create a menu
62
+ menu = Gtk::Menu.new
63
+
64
+ item_add = Gtk::ImageMenuItem.new("Add Syslog Ref")
65
+ image_item_add = Gtk::Image.new()
66
+ image_item_add.set_stock(Gtk::Stock::ADD)
67
+ item_add.set_image(image_item_add)
68
+ item_add.signal_connect("activate") { add_gui_syslog_ref() }
69
+ menu.append(item_add)
70
+ item_del = Gtk::ImageMenuItem.new("Delete selected Syslog Ref")
71
+ image_item_del = Gtk::Image.new()
72
+ image_item_del.set_stock(Gtk::Stock::REMOVE)
73
+ item_del.set_image(image_item_del)
74
+ item_del.signal_connect("activate") {
75
+ if @syslog_ref_view.selection.selected!=nil
76
+ if SyslogRef::del_syslog_ref(@syslog_ref_view.selection.selected[0])
77
+ @syslog_ref_view.model.remove(@syslog_ref_view.selection.selected)
78
+ else
79
+ dialog = Gtk::MessageDialog.new(@window, Gtk::Dialog::DESTROY_WITH_PARENT,
80
+ Gtk::MessageDialog::ERROR,
81
+ Gtk::MessageDialog::BUTTONS_OK,
82
+ "You can't delete! Syslog Ref in use")
83
+ dialog.run
84
+ dialog.destroy
85
+ end
86
+ end
87
+ }
88
+ menu.append(item_del)
89
+ item_edit = Gtk::ImageMenuItem.new("Edit Syslog Ref")
90
+ image_item_edit = Gtk::Image.new()
91
+ image_item_edit.set_stock(Gtk::Stock::EDIT)
92
+ item_edit.set_image(image_item_edit)
93
+ item_edit.signal_connect("activate") {
94
+ if @syslog_ref_view.selection.selected != nil
95
+ edit_syslog_ref(@syslog_ref_view.selection.selected[0])
96
+ end
97
+ }
98
+ menu.append(item_edit)
99
+
100
+ menu.show_all
101
+
102
+ @syslog_ref_view.signal_connect("button_press_event") do |widget, event|
103
+ if event.kind_of? Gdk::EventButton and event.button == 3
104
+ if @syslog_ref_view.selection.selected == nil
105
+ item_del.set_sensitive(false)
106
+ item_edit.set_sensitive(false)
107
+ else
108
+ item_del.set_sensitive(true)
109
+ item_edit.set_sensitive(true)
110
+ end
111
+ menu.popup(nil, nil, event.button, event.time)
112
+ elsif (@syslog_ref_view.selection.selected != nil) && (event.event_type == Gdk::Event::BUTTON2_PRESS)
113
+ edit_syslog_ref(@syslog_ref_view.selection.selected[0])
114
+ end
115
+ end
116
+
117
+ populate_ls()
118
+ vbox.add(scroll)
119
+
120
+ bbox = Gtk::HBox::new(FALSE, 10)
121
+ bbox.border_width=10
122
+ bbox.show
123
+
124
+ ok_button = Gtk::Button.new(Gtk::Stock::OK)
125
+ ok_button.show
126
+ ok_button.signal_connect("clicked") {
127
+ SyslogRef::write_db_syslogref()
128
+ @window.destroy
129
+ }
130
+
131
+ cancel_button = Gtk::Button.new(Gtk::Stock::CANCEL)
132
+ cancel_button.show
133
+ cancel_button.signal_connect("clicked") {
134
+ $syslog_refs=@syslogrefs_backup
135
+ @window.destroy
136
+ }
137
+ ok_button.set_flags(Gtk::Widget::CAN_DEFAULT)
138
+ bbox.pack_start(ok_button, TRUE, TRUE, 0)
139
+ cancel_button.set_flags(Gtk::Widget::CAN_DEFAULT)
140
+ bbox.pack_start(cancel_button, TRUE, TRUE, 0)
141
+
142
+ separator = Gtk::HSeparator::new()
143
+ separator.show
144
+ vbox_root.pack_start(separator, FALSE, TRUE, 0)
145
+ vbox_root.pack_start(bbox, FALSE, TRUE, 0)
146
+
147
+ @window.show
148
+ end
149
+
150
+ def add_gui_syslog_ref()
151
+ add_modify_syslog_ref(true)
152
+ end
153
+
154
+ def edit_syslog_ref(syslog_ref_name)
155
+ add_modify_syslog_ref(false, syslog_ref_name)
156
+ end
157
+
158
+ def add_modify_syslog_ref(add_boolean, syslog_ref_name=nil)
159
+ window=Gtk::Window.new
160
+ window.set_modal(true)
161
+ lbl="Edit Syslog Ref"
162
+ if add_boolean
163
+ lbl="Add Syslog Ref"
164
+ end
165
+
166
+ window.set_title(lbl)
167
+ window.set_size_request(460, 160)
168
+
169
+ window.signal_connect("key_press_event") {|w,e|
170
+ if e.keyval == Gdk::Keyval::GDK_Escape
171
+ window.destroy
172
+ end
173
+ }
174
+
175
+ frame = Gtk::Frame::new
176
+ frame.border_width=10
177
+ frame.show
178
+ vbox_root=Gtk::VBox::new
179
+ vbox_root.show
180
+ window.add vbox_root
181
+ vbox_root.add frame
182
+
183
+ vbox = Gtk::VBox.new
184
+ vbox.show
185
+ frame.add vbox
186
+
187
+ table = Gtk::Table.new(3,2,false)
188
+ table.show
189
+
190
+ label_name = Gtk::Label.new "Name"
191
+ label_name.show
192
+ if add_boolean
193
+ entry_name = Gtk::Entry.new
194
+ else
195
+ entry_name = Gtk::Entry.new
196
+ entry_name.set_editable false
197
+ entry_name.set_text(syslog_ref_name)
198
+ end
199
+ entry_name.show
200
+
201
+ table.attach(label_name,0,1,0,1)
202
+ table.attach(entry_name,1,2,0,1)
203
+
204
+ entry_description = Gtk::Entry.new
205
+ if !add_boolean
206
+ entry_description.set_text($syslog_refs[entry_name.text()].description) unless entry_name.text() == ""
207
+ end
208
+ entry_description.show
209
+ label_description = Gtk::Label.new "Description"
210
+ label_description.show
211
+
212
+ table.attach(label_description,0,1,1,2)
213
+ table.attach(entry_description,1,2,1,2)
214
+
215
+ entry_value = Gtk::Entry.new
216
+ if !add_boolean
217
+ entry_value.set_text($syslog_refs[entry_name.text()].value.source) unless entry_name.text() == ""
218
+ end
219
+ entry_value.show
220
+ label_value = Gtk::Label.new "Value"
221
+ label_value.show
222
+
223
+ table.attach(label_value,0,1,2,3)
224
+ table.attach(entry_value,1,2,2,3)
225
+ if !add_boolean
226
+ entry_name.signal_connect("changed") {|e|
227
+ if e.text() != ""
228
+ entry_description.set_text($syslog_refs[e.text()].description)
229
+ entry_value.set_text($syslog_refs[e.text()].value)
230
+ end
231
+ }
232
+ end
233
+ bbox =Gtk::HBox::new(FALSE, 10)
234
+ bbox.border_width=10
235
+ bbox.show
236
+
237
+ ok_button = Gtk::Button.new(Gtk::Stock::OK)
238
+ ok_button.show
239
+ ok_button.signal_connect("clicked") {
240
+ if add_boolean
241
+ #new entry!
242
+ if $syslog_refs[entry_name.text()] == nil
243
+ SyslogRef::add_syslog_ref(entry_name.text(),entry_description.text(),entry_value.text())
244
+ iter = @syslog_ref_ls.append
245
+ iter[0] = entry_name.text()
246
+ iter[1] = entry_description.text()
247
+ window.destroy
248
+ else
249
+ dialog = Gtk::MessageDialog.new(window, Gtk::Dialog::DESTROY_WITH_PARENT,
250
+ Gtk::MessageDialog::ERROR,
251
+ Gtk::MessageDialog::BUTTONS_OK,
252
+ "Syslog Ref '#{entry_name.text()}' already exists!")
253
+ dialog.run
254
+ dialog.destroy
255
+ end
256
+ else
257
+ #modify existing entry
258
+ $syslog_refs[entry_name.text()].description=entry_description.text()
259
+ $syslog_refs[entry_name.text()].set_value(entry_value.text())
260
+ @syslog_ref_ls.each do |model,path,iter|
261
+ if iter[0] == entry_name.text()
262
+ iter[1]=entry_description.text()
263
+ break
264
+ end
265
+ end
266
+ window.destroy
267
+ end
268
+ }
269
+
270
+ cancel_button = Gtk::Button.new(Gtk::Stock::CANCEL)
271
+ cancel_button.show
272
+ cancel_button.signal_connect("clicked") {
273
+ window.destroy
274
+ }
275
+
276
+ ok_button.set_flags(Gtk::Widget::CAN_DEFAULT)
277
+ bbox.pack_start(ok_button, TRUE, TRUE, 0)
278
+ cancel_button.set_flags(Gtk::Widget::CAN_DEFAULT)
279
+ bbox.pack_start(cancel_button, TRUE, TRUE, 0)
280
+
281
+ vbox.add(table)
282
+ separator = Gtk::HSeparator::new()
283
+ separator.show
284
+ vbox_root.pack_start(separator, FALSE, TRUE, 0)
285
+ vbox_root.pack_start(bbox, FALSE, TRUE, 0)
286
+ window.show
287
+ end
288
+ end
@@ -0,0 +1,320 @@
1
+ require "#{GNMSLIB}"+'/gui/color_macro'
2
+
3
+ class TreeNodeWindow
4
+
5
+ #
6
+ # check if the tree is already visible
7
+ #
8
+ def visible?()
9
+ return @treenode.visible?()
10
+ end
11
+
12
+ #
13
+ # show the tree
14
+ #
15
+ def show()
16
+ if !$treenode_win.visible?
17
+ reload()
18
+ end
19
+ @treenode.show()
20
+ end
21
+
22
+ #
23
+ # hide the tree
24
+ #
25
+ def hide()
26
+ @treenode.hide()
27
+ end
28
+
29
+ #
30
+ # clear the tree
31
+ #
32
+ def clear()
33
+ @tree_store.clear()
34
+ end
35
+
36
+ #
37
+ # del a row in the tree when a node is removed
38
+ #
39
+ def del_row(node)
40
+ iter=search_node(node)
41
+ if iter != nil
42
+ @tree_store.remove(@tree_store.get_iter(iter))
43
+
44
+ #reduce count value
45
+ if node
46
+ #search for parent iter
47
+
48
+ endloop=false
49
+ begin
50
+ if node.map == ROOTMAPADDR
51
+ iter=0
52
+ endloop=true
53
+ else
54
+ iter=search_node($network[node.map])
55
+ end
56
+ #adjust network map nb hosts
57
+ str_tmp=@tree_store.get_value(@tree_store.get_iter("#{iter}"),1)
58
+ if str_tmp
59
+ str_tmp.scan(@re) do |network_ip, nb_host|
60
+ nb_host=1 unless nb_host.to_i() > 0
61
+ @tree_store.set_value(@tree_store.get_iter("#{iter}"),1,"#{network_ip} (#{nb_host.to_i()-1})")
62
+ node=$network[network_ip]
63
+ end
64
+ end
65
+ end while !endloop
66
+ end
67
+ end
68
+ end
69
+
70
+
71
+ #
72
+ # add a row in the tree when a new node is found
73
+ #
74
+ def add_row(node)
75
+ if node
76
+ #test if node is already present
77
+ iter=search_node(node)
78
+ if !iter
79
+ #find where to insert it
80
+ if node.map == ROOTMAPADDR
81
+ iter_map=0
82
+ endloop=true
83
+ else
84
+ iter_map=search_node($network[node.map])
85
+ end
86
+
87
+ root_iter = @tree_store.append(@tree_store.get_iter("#{iter_map}"))
88
+ hexa_rgb=$status_color[$status_value.index(node.status)]
89
+ root_iter[0] = hexa_to_rgb_color(hexa_rgb)
90
+ if node.class == Host
91
+ root_iter[1] = node.ip
92
+ else
93
+ root_iter[1] = "#{node.ip} (0)"
94
+ end
95
+ if node && node.class == Host
96
+ #search for network map
97
+
98
+ endloop=false
99
+ begin
100
+ if node.map == ROOTMAPADDR
101
+ iter_map=0
102
+ endloop=true
103
+ else
104
+ iter_map=search_node($network[node.map])
105
+ end
106
+
107
+ if iter_map != nil
108
+ #adjust network map nb hosts
109
+ str_tmp=@tree_store.get_value(@tree_store.get_iter("#{iter_map}"),1)
110
+ if str_tmp
111
+ str_tmp.scan(@re) do |network_ip, nb_host|
112
+ @tree_store.set_value(@tree_store.get_iter("#{iter_map}"),1,"#{network_ip} (#{nb_host.to_i()+1})")
113
+ node=$network[network_ip]
114
+ end
115
+ end
116
+ end
117
+ end while !endloop
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ #
124
+ # return an iter if node is found
125
+ #
126
+ def search_node(node)
127
+ if node
128
+ search_sub_node(node, 0)
129
+ end
130
+
131
+ end
132
+
133
+ #
134
+ # recursive search function to find sub node
135
+ #
136
+ def search_sub_node(node, iter)
137
+ iter_val=iter
138
+ iter_pos=0
139
+ while @tree_store.get_iter("#{iter_val}:#{iter_pos}") != nil do
140
+ value=@tree_store.get_value(@tree_store.get_iter("#{iter_val}:#{iter_pos}"),1)
141
+ #print "#{value}\n"
142
+ if value and value.index(node.ip) == 0
143
+ return "#{iter_val}:#{iter_pos}"
144
+ end
145
+ #check if it's a network
146
+ if value and value.match(/\s\(\d+/)
147
+ result=search_sub_node(node, "#{iter_val}:#{iter_pos}")
148
+ if result
149
+ return result
150
+ end
151
+ end
152
+ iter_pos+=1
153
+ end
154
+ return nil
155
+ end
156
+
157
+ #
158
+ # update the row severity corresponding to the node
159
+ #
160
+ def update_row(node)
161
+ iter=search_node(node)
162
+ if iter != nil
163
+ @tree_store.set_value(@tree_store.get_iter("#{iter}"), 0, get_color_from_status($status[$status_value.index(node.status)]))
164
+ end
165
+ end
166
+
167
+ #
168
+ # recursive reload the whole tree
169
+ #
170
+ def reload_sub(tree_root,network_node)
171
+ if network_node
172
+ root_iter = @tree_store.append(tree_root)
173
+ hexa_rgb=$status_color[$status_value.index(network_node.status)]
174
+ root_iter[0] = hexa_to_rgb_color(hexa_rgb)
175
+
176
+ cpt=0
177
+
178
+ network_node.get_node().sort{|ip1,ip2|
179
+ ip1_tmp=fill_ip_str(ip1[0])
180
+ ip2_tmp=fill_ip_str(ip2[0])
181
+ ip1_tmp = "0.0.0.0" if ip1_tmp.nil? or ip1_tmp.empty?
182
+ ip2_tmp = "0.0.0.0" if ip2_tmp.nil? or ip2_tmp.empty?
183
+ ip1_tmp<=>ip2_tmp
184
+ }.each {|ipt, node|
185
+ if node.class != Network
186
+ cpt+=1
187
+ child_iter = @tree_store.append(root_iter)
188
+ hexa_rgb=$status_color[$status_value.index(node.status)]
189
+ child_iter[0] = hexa_to_rgb_color(hexa_rgb)
190
+ child_iter[1] = node.ip
191
+ else
192
+ #network is also considered as a node
193
+ cpt+=1+reload_sub(root_iter, node)
194
+ end
195
+ root_iter[1] = "#{network_node.ip} (#{cpt})"
196
+ }
197
+ #special case when there is no node in network
198
+ if cpt == 0
199
+ root_iter[1] = "#{network_node.ip} (#{cpt})"
200
+ end
201
+ return cpt
202
+ end
203
+ return 0
204
+
205
+ end
206
+
207
+ #
208
+ # reload the whole tree, used when no updates was done for a long time aka tree was hidden
209
+ #
210
+ def reload()
211
+ clear()
212
+ node=$network[ROOTMAPADDR]
213
+ reload_sub(nil,node)
214
+ end
215
+
216
+ #
217
+ # main
218
+ #
219
+ def initialize()
220
+
221
+ @re=Regexp.new('^([\d.]+) \((\d+)\)$')
222
+ @column_title_expand="Expand all networks"
223
+ @column_title_collapse="Collapse all networks"
224
+ @node_selected=nil
225
+
226
+ @treenode = Gtk::Window.new
227
+ @treenode.set_size_request(200,200)
228
+ @treenode.set_title "Tree node"
229
+ @treenode.set_icon("#{PIXMAP_PATH}/logo_icon.png")
230
+ @tree_store=Gtk::TreeStore.new(Gdk::Color,String)
231
+
232
+ vbox=Gtk::VBox.new
233
+ vbox.show
234
+ @treenode.add vbox
235
+
236
+ scrolled_window = Gtk::ScrolledWindow.new(nil, nil)
237
+ scrolled_window.border_width=2
238
+ scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC)
239
+
240
+ vbox.pack_start(scrolled_window, true, true, 0)
241
+ scrolled_window.show
242
+
243
+ tv = Gtk::TreeView.new(@tree_store)
244
+ renderer = Gtk::CellRendererText.new
245
+ column = Gtk::TreeViewColumn.new(@column_title_expand, renderer, {
246
+ :background_gdk => 0,
247
+ :text => 1
248
+ })
249
+ tv.set_headers_clickable(true)
250
+ tv.set_headers_visible(true)
251
+ column.set_clickable(true)
252
+ column.set_alignment(0.5)
253
+
254
+ #collapse/expand button click events
255
+ column.signal_connect("clicked") {
256
+ if column.title == @column_title_expand
257
+ column.title=@column_title_collapse
258
+ tv.expand_all
259
+ else
260
+ column.title=@column_title_expand
261
+ tv.collapse_all
262
+ end
263
+ }
264
+ tv.append_column(column)
265
+ tv.show
266
+ scrolled_window.add(tv)
267
+
268
+ #select a node when a row is selected
269
+ tv.signal_connect("row-activated") {|trv,path|
270
+ #1 is the second column
271
+ value=trv.model.get_value(trv.model.get_iter(path),1)
272
+ if value and value.match(/\s\(\d+/)
273
+ #if it's a network
274
+ network_value=value.gsub(/\s\(.+$/,'')
275
+ if $network[network_value]
276
+ set_map(network_value)
277
+ end
278
+ else
279
+ if $host[value]
280
+ #change the map if it's needed
281
+ set_map($host[value].map)
282
+ if @node_selected != nil
283
+ @node_selected.node_view.unselect()
284
+ end
285
+ @node_selected=$host[value]
286
+ $host[value].node_view.select()
287
+ end
288
+ end
289
+ }
290
+
291
+ #delete node when delete key is pressed
292
+ tv.signal_connect("key_press_event") {|trv,e|
293
+ if e.keyval==Gdk::Keyval::GDK_Delete
294
+ path,focus_col=trv.cursor()
295
+ iter=trv.model.get_iter(path)
296
+
297
+ value=trv.model.get_value(iter,1)
298
+ #check if value of the cell contains a () so it's a network
299
+ if value and !value.match(/\s\(\d+/)
300
+ verify_delnodewin($host[value])
301
+ else
302
+ if value
303
+ network_val=value.gsub(/\s\(.+$/,'')
304
+ if (get_map() != network_val) && !$network[network_val].contain_network(get_map())
305
+ verify_delnodewin($network[network_val])
306
+ end
307
+ end
308
+ end
309
+ end
310
+ }
311
+ @treenode.signal_connect("delete_event") do
312
+ @treenode.hide
313
+ end
314
+ @treenode.signal_connect("key_press_event") {|w,e|
315
+ if e.keyval==Gdk::Keyval::GDK_Escape
316
+ @treenode.hide()
317
+ end
318
+ }
319
+ end
320
+ end