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,186 @@
1
+ class NodeNetworkView < NodeView
2
+
3
+ def setup_ellipse(root, status, icon_file, label)
4
+
5
+ node_size = get_node_size()
6
+ @group = Goo::CanvasGroup.new(root,{:x => 0.0,:y => 0.0, :can_focus => true})
7
+ @group.visibility = Goo::CanvasItem::HIDDEN
8
+ @icon=Goo::CanvasEllipse.new(@group, node.x+node_size/2, node.y+node_size/2,
9
+ node_size/2, node_size/2,
10
+ :fill_color_rgba => status,
11
+ :stroke_color => "black",
12
+ :line_width => 1.0)
13
+ if (icon_file == nil) || (!FileTest.exist?(icon_file))
14
+ icon_file="#{PIXMAP_PATH}/unknown.png"
15
+ end
16
+ @image=nil
17
+ if FileTest.exist?(icon_file)
18
+ im=Gdk::Pixbuf.new(icon_file)
19
+ #the network type icon
20
+ @image=Goo::CanvasImage.new(@group, im, @icon.x1, @icon.y1,
21
+ :width => node_size*80/100.0,
22
+ :height => node_size*80/100.0,
23
+ :can_focus => false,
24
+ :scale_to_fit => true
25
+ )
26
+
27
+ @image.x= @icon.x1+(node_size/2.0)-@image.width/2.0
28
+ @image.y= @icon.y1+(node_size/2.0)-@image.height/2.0
29
+ else
30
+ puts "Could not find img #{icon_file}"
31
+ end
32
+ #box for the network label background, pos will be fixed by resize method
33
+ cl = Integer("0x#{rgb_to_hex_color(Gdk::Color.new($config.label_bg[0],$config.label_bg[1],$config.label_bg[2]))}ff")
34
+ @bg_text=Goo::CanvasRect.new(@group,@icon.x1-3*label.size/2, @icon.y2+node_size/5-5,
35
+ node_size+3*label.size,
36
+ node_size/5+5,
37
+ :fill_color_rgba => cl,
38
+ :stroke_color_rgba => cl,
39
+ :line_width => 1.0)
40
+
41
+ #the label, pos will be fixed by resize method
42
+ @text=Goo::CanvasText.new(@group, label, @icon.x1+node_size/2, @icon.y2+2+node_size/5, 0,
43
+ Gtk::ANCHOR_CENTER,
44
+ :fill_color_rgba => Integer("0x#{rgb_to_hex_color(Gdk::Color.new($config.label_text[0],$config.label_text[1],$config.label_text[2]))}ff"),
45
+ :font => "Sans 8")
46
+
47
+ setup_item(@group)
48
+ #set_tooltips()
49
+ end
50
+
51
+ #
52
+ # define a tooltip
53
+ #
54
+ def show_tooltips()
55
+ if @tooltips==nil
56
+ @tooltips=Gtk::Window.new(Gtk::Window::POPUP)
57
+ @tooltips.set_decorated(false)
58
+ @tooltips.set_size_request(-1,-1)
59
+ @tooltips.set_window_position(Gtk::Window::POS_NONE)
60
+ @tooltips.border_width=1
61
+ x,y=$win.position
62
+ @tooltips.move(node.x+x+50, node.y+y+40)
63
+ @tooltips.app_paintable=true
64
+ @tooltips.realize
65
+ drawable=@tooltips.window
66
+ gc = Gdk::GC.new(drawable)
67
+
68
+
69
+ @tooltips.modify_bg(Gtk::STATE_NORMAL,$light_yellow)
70
+ @tooltips.signal_connect("expose-event") do |win, evt|
71
+ tooltips_width, tooltips_height=@tooltips.size
72
+
73
+ drawable.draw_rectangle(gc,false, 0, 0, tooltips_width-1, tooltips_height-1)
74
+ drawable.draw_rectangle(gc,false, 1, 1, tooltips_width-3, tooltips_height-3)
75
+ false
76
+
77
+ end
78
+ vbox=Gtk::VBox.new
79
+ vbox.border_width=5
80
+ ttips_text="<span weight=\"bold\" size=\"small\">IP: </span>#{self.node.ip}"
81
+ ttips_text+="\n<span weight=\"bold\" size=\"small\">Mask: </span>#{self.node.netmask}"
82
+ if self.node.dns_domain?
83
+ ttips_text+="\n<span weight=\"bold\" size=\"small\">Dns domain: </span>#{self.node.dns_domain}"
84
+ end
85
+ if self.node.name?
86
+ ttips_text+="\n<span weight=\"bold\" size=\"small\">Name: </span>#{self.node.name}"
87
+ end
88
+ if self.node.description?() &&( self.node.description != "")
89
+ ttips_text+="\n<span weight=\"bold\" size=\"small\">Description: </span>#{self.node.description}"
90
+ end
91
+ label = Gtk::Label.new.set_markup(ttips_text)
92
+ label.set_alignment(0,0.5)
93
+ vbox.add label
94
+
95
+ if self.node.os && (self.node.os != "unknown")
96
+ hbox=Gtk::HButtonBox.new
97
+ hbox.set_layout_style(Gtk::ButtonBox::START)
98
+ vbox.add hbox
99
+ label_os = Gtk::Label.new.set_markup("<span weight=\"bold\" size=\"small\">OS: </span>")
100
+ label_os.set_alignment(0,0.5)
101
+ label_os.show
102
+ hbox.add label_os
103
+ pxb = Gdk::Pixbuf.new(PIXMAP_PATH+"/#{find_extension("os/#{self.node.os}")}",20,20)
104
+ pxb_pixmap,pxb_mask=pxb.render_pixmap_and_mask(128)
105
+ img=Gtk::Image.new(pxb_pixmap,pxb_mask)
106
+ img.show
107
+ hbox.add img
108
+ hbox.show
109
+ end
110
+
111
+ if self.node.type
112
+ ttype=Gtk::Table.new(1,0,false)
113
+ vbox.add ttype
114
+ label_type = Gtk::Label.new.set_markup("<span weight=\"bold\" size=\"small\">Type: </span>")
115
+ label_type.set_alignment(0,0.5)
116
+ label_type.show
117
+ ttype.add label_type
118
+ pxb = Gdk::Pixbuf.new(PIXMAP_PATH+"/#{find_extension("type/#{self.node.type}")}",20,20)
119
+ pxb_pixmap,pxb_mask=pxb.render_pixmap_and_mask(128)
120
+ img=Gtk::Image.new(pxb_pixmap,pxb_mask)
121
+ img.show
122
+ ttype.attach(img,0,1,0,1, Gtk::FILL)
123
+ ttype.show
124
+ end
125
+ if self.node.nb_node() > 0
126
+ label_nbhost=Gtk::Label.new.set_markup("<span weight=\"bold\" size=\"small\">Nb host: </span>#{self.node.nb_node}")
127
+ label_nbhost.set_alignment(0,0.5)
128
+ label_nbhost.show
129
+ vbox.add label_nbhost
130
+
131
+ table = Gtk::Table.new(1,2,false)
132
+ table.show
133
+ vbox.add table
134
+ label_status=Gtk::Label.new.set_markup("<span weight=\"bold\" size=\"small\">Status: </span>")
135
+ label_status.show
136
+ table.attach(label_status,0,1,0,1, Gtk::FILL)
137
+
138
+ #do stat for each internal node network severity
139
+ sev_stat=Array.new($status_value.size,0)
140
+ node.get_node().each_value do |n|
141
+ sev_stat[$status_value.index(n.status)]+=1
142
+ end
143
+
144
+ status_index=0
145
+ $status.each do |stat|
146
+ if sev_stat[status_index] > 0
147
+ label_sev = Gtk::Label.new.set_markup("<span color=\"##{rgb_to_hex_color(get_color_from_status(stat))}\">#{sev_stat[status_index]} #{stat}</span>")
148
+ label_sev.show
149
+ table.attach(label_sev,1,2,status_index,status_index+1, Gtk::FILL)
150
+ end
151
+ status_index+=1
152
+ end
153
+
154
+ end
155
+
156
+ vbox.show
157
+ label.show
158
+ @tooltips.add vbox
159
+ end
160
+ if !@tooltips.visible?
161
+ @tooltips.show()
162
+ end
163
+
164
+
165
+
166
+ end
167
+
168
+ def hide_tooltips()
169
+ if @tooltips != nil
170
+ @tooltips.hide()
171
+ #with this the tooltips is always refreshed
172
+ @tooltips.destroy
173
+ @tooltips=nil
174
+ end
175
+ end
176
+
177
+ def initialize(rootcanvas, nd, status, icon_file, label)
178
+ @dragging=false
179
+ @size=get_node_size()
180
+ @tooltips=nil
181
+ self.node=nd
182
+ self.selected=false
183
+ setup_ellipse(rootcanvas, status, icon_file, label)
184
+ end
185
+
186
+ end
@@ -0,0 +1,672 @@
1
+ class NodeView
2
+
3
+ MIN_MOVE=5
4
+ NODE_SIZE=40
5
+
6
+ attr_accessor :icon, :image, :bg_text, :text, :selected, :group
7
+ attr_accessor :node, :notification_count, :notification_sev
8
+
9
+ def add_notification(sev)
10
+ @notification_count[$status_value.index(sev)] +=1
11
+ if @notification_sev < sev
12
+ @notification_sev = sev
13
+ end
14
+ update_notification_icon()
15
+ if $icon.embedded? and !$win.visible? and !$icon.blinking?
16
+ $icon.set_blinking(true)
17
+ end
18
+ end
19
+
20
+ def del_notification(sev)
21
+ @notification_count[$status_value.index(sev)] -=1 if @notification_count[$status_value.index(sev)] > 0
22
+ #we need to update sev too
23
+ #warning it's not equivalent to @notification_count.each_with_index.max
24
+ max = @notification_count.max
25
+ if max == 0
26
+ @notification_sev = UNKNOWN
27
+ else
28
+ @notification_sev = $status_value[@notification_count.index(max)]
29
+ end
30
+ update_notification_icon()
31
+ end
32
+
33
+ def reset_notification()
34
+ #@notification_count is an array of 4 sevs: critical, major, warning, minor
35
+ @notification_count = Array.new(4, 0)
36
+ @notification_sev = UNKNOWN
37
+ end
38
+
39
+ def move_up()
40
+ hide_link()
41
+ move(0, -MIN_MOVE)
42
+ show_link()
43
+ end
44
+
45
+ def move_down()
46
+ hide_link()
47
+ move(0, MIN_MOVE)
48
+ show_link()
49
+ end
50
+
51
+ def move_left()
52
+ hide_link()
53
+ move(-MIN_MOVE, 0)
54
+ show_link()
55
+ end
56
+
57
+ def move_right()
58
+ hide_link()
59
+ move(MIN_MOVE, 0)
60
+ show_link()
61
+ end
62
+
63
+ def get_node_size()
64
+ view_size=$config.pixmap_size.to_i()
65
+
66
+ if @node != nil && @node.map != nil
67
+ if $network[@node.map].node_size != nil
68
+ view_size=$network[@node.map].node_size
69
+ end
70
+ end
71
+
72
+ if view_size <= 0
73
+ return NODE_SIZE
74
+ else
75
+ return view_size
76
+ end
77
+ end
78
+
79
+ def reparent(canvas_group)
80
+ @group.parent = canvas_group
81
+ end
82
+
83
+ def get_size()
84
+ return @size
85
+ end
86
+
87
+ def resize()
88
+ #puts "in resize"
89
+ to_size=get_node_size()
90
+ hide_link()
91
+ @size=$config.pixmap_size
92
+
93
+ @image.width=(to_size)*80/100.0
94
+ @image.height=(to_size)*80/100.0
95
+
96
+ @image.x= @icon.x+(to_size/2.0)-@image.width/2.0
97
+ @image.y= @icon.y+(to_size/2.0)-@image.height/2.0
98
+
99
+ old_icon_width = @icon.width
100
+ old_icon_height = @icon.height
101
+ old_icon_y = @icon.y
102
+ @icon.width=to_size
103
+ @icon.height=to_size
104
+
105
+ @text.x = @icon.x + get_node_size()/2
106
+ @text.y = @icon.y + get_node_size() + 11
107
+ reload_bg_text()
108
+ reload_label_colors()
109
+
110
+ #notification icon is only displayed on Host node
111
+ if @node.class == Host
112
+ circle_size = to_size/2.0
113
+ @notification_group.translate(@icon.width - old_icon_width, @icon.y - old_icon_y)
114
+ resize_notification_icon(circle_size)
115
+ end
116
+ show_link()
117
+ end
118
+
119
+ #
120
+ # need to reload bg text when text label is changed
121
+ #
122
+ def reload_bg_text()
123
+ to_size = get_node_size()
124
+ siz = to_size + 3*@text.text.size
125
+ if siz > (@text.x2 - @text.x1)
126
+ @bg_text.width = siz
127
+ end
128
+ @bg_text.x = @text.x - @bg_text.width/2
129
+ @bg_text.y = @icon.y + to_size + 5
130
+ end
131
+
132
+ def reload_label_colors()
133
+ cl = Integer("0x#{rgb_to_hex_color(Gdk::Color.new($config.label_bg[0],$config.label_bg[1],$config.label_bg[2]))}ff")
134
+ @bg_text.fill_color_rgba = cl
135
+ @bg_text.stroke_color_rgba = cl
136
+ @text.fill_color_rgba = Integer("0x#{rgb_to_hex_color(Gdk::Color.new($config.label_text[0],$config.label_text[1],$config.label_text[2]))}ff")
137
+ end
138
+
139
+ def selected?()
140
+ return @selected==true
141
+ end
142
+
143
+ def select()
144
+ @icon.stroke_color = "red"
145
+ @icon.line_width = 2.0
146
+ @selected=true
147
+ end
148
+
149
+ def unselect()
150
+ @icon.stroke_color = "black"
151
+ @icon.line_width = 1.0
152
+ @selected=false
153
+ end
154
+
155
+ def move(x_translate, y_translate)
156
+ @node.x += x_translate
157
+ @node.y += y_translate
158
+ @group.translate(x_translate, y_translate)
159
+ end
160
+
161
+ def destroy()
162
+ @group.parent.remove_child(@group) if !@group.nil?
163
+ end
164
+
165
+ def show()
166
+ @group.visibility = Goo::CanvasItem::VISIBLE if !@group.nil?
167
+ end
168
+
169
+ def hide()
170
+ @group.visibility = Goo::CanvasItem::HIDDEN if !@group.nil?
171
+ end
172
+
173
+ def set_text_color(color)
174
+ if @text != nil
175
+ @text.fill_color = color
176
+ end
177
+ end
178
+
179
+ def set_text(txt)
180
+ if (@text != nil) && (@text.text != txt)
181
+ @text.text = txt
182
+ reload_bg_text()
183
+ end
184
+ end
185
+
186
+ def get_text()
187
+ if @text != nil
188
+ @text.text
189
+ end
190
+ end
191
+
192
+ def hide_text()
193
+ if @text != nil
194
+ @bg_text.visibility = Goo::CanvasItem::HIDDEN
195
+ @text.visibility = Goo::CanvasItem::HIDDEN
196
+ end
197
+ end
198
+
199
+ def show_text()
200
+ if @text != nil
201
+ @bg_text.visibility = Goo::CanvasItem::VISIBLE
202
+ @text.visibility = Goo::CanvasItem::VISIBLE
203
+ end
204
+ end
205
+
206
+ def set_image(img_path)
207
+ if @image != nil
208
+ full_img_path="#{PIXMAP_PATH}/"+img_path
209
+ if FileTest.exist?(full_img_path)
210
+ begin
211
+ Gtk.thread_protect do
212
+ node_size = get_node_size()
213
+ @image.pixbuf = Gdk::Pixbuf.new(full_img_path, node_size, node_size)
214
+ @image.width=(node_size)*80/100.0
215
+ @image.height=(node_size)*80/100.0
216
+ end
217
+ rescue Exception => msg
218
+ $log.error("Image is corrupted #{msg}")
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ def icon_color(color)
225
+ if @icon != nil
226
+ Gtk.thread_protect do
227
+ @icon.fill_color_rgba = color
228
+ end
229
+ end
230
+ end
231
+
232
+ def hide_selected_node_link()
233
+ $canvas.get_selected_node.each {|n|
234
+ if n.nb_links > 0
235
+ n.get_links().each {|lnk|
236
+ lnk.hide
237
+ }
238
+ end
239
+ }
240
+ end
241
+
242
+ def show_selected_node_link()
243
+ $canvas.get_selected_node.each {|n|
244
+ if n.nb_links > 0
245
+ n.get_links().each {|lnk|
246
+ lnk.show
247
+ }
248
+ end
249
+ }
250
+ end
251
+
252
+ def hide_link()
253
+ if @node.nb_links > 0
254
+ @node.get_links().each {|lnk|
255
+ lnk.remove_link
256
+ }
257
+ end
258
+ end
259
+
260
+ def show_link()
261
+ if @node.nb_links > 0
262
+ @node.get_links().each {|lnk|
263
+ lnk.display
264
+ }
265
+ end
266
+ end
267
+
268
+ def unlink_node()
269
+ node_t=$canvas.get_selected_node()
270
+ node_t_size=node_t.size
271
+ if node_t_size == 0
272
+ @node.del_all_links()
273
+ elsif node_t_size == 1
274
+ node_t[0].del_all_links()
275
+ else
276
+ cpt=0
277
+ while cpt < node_t_size do
278
+ node_id=node_t.shift
279
+ node_t.each { |node2_id|
280
+ if node_id.linked(node2_id) == 1
281
+ node_id.del_node_link(node2_id)
282
+ end
283
+ }
284
+ cpt+=1
285
+ end
286
+ end
287
+ end
288
+
289
+ private
290
+ def item_event(item, event)
291
+ if busy?()
292
+ return
293
+ end
294
+ #print "node view item event #{item} #{event.event_type} #{Gdk::Event::LEAVE_NOTIFY}\n"
295
+ case event.event_type
296
+ when Gdk::Event::KEY_PRESS
297
+ estring=Gdk::Keyval.to_name(event.keyval)
298
+ #print "code touche: ",event.keyval," = ",estring,"\n"
299
+ if (event.keyval == Gdk::Keyval::GDK_d) || (event.keyval == Gdk::Keyval::GDK_Delete)
300
+ #we want to delete a node!
301
+ verify_delnodewin(node)
302
+ end
303
+ when Gdk::Event::ENTER_NOTIFY
304
+ #@text.fill_color = "green"
305
+ #puts "mouse over"
306
+ $win.window.cursor = Gdk::Cursor.new(Gdk::Cursor::HAND1)
307
+ if $config.show_tooltips
308
+ @ttips=Thread.start {
309
+ sleep(3)
310
+ Gtk.thread_protect do
311
+ show_tooltips()
312
+ end
313
+ }
314
+ end
315
+ when Gdk::Event::LEAVE_NOTIFY
316
+ #puts "mouse out"
317
+ $win.window.cursor = nil
318
+ #@text.set({:fill_color => "black"})
319
+ if defined?(@ttips)
320
+ hide_tooltips()
321
+ Thread.kill(@ttips)
322
+ Gtk.thread_flush
323
+ end
324
+ when Gdk::Event::BUTTON2_PRESS
325
+ #show links cause hide during first button check
326
+ show_selected_node_link()
327
+ if node.class == Network
328
+ if (event.state & Gdk::Window::SHIFT_MASK) != 0
329
+ node_property(self.node)
330
+ else
331
+ set_map(self.node.ip)
332
+ end
333
+ else
334
+ node_property(self.node)
335
+ $canvas.show()
336
+ end
337
+ when Gdk::Event::BUTTON_PRESS
338
+ item_x, item_y = item.parent.canvas.convert_to_pixels(event.x,event.y)
339
+ case event.button
340
+ when 1
341
+ @x = item_x;
342
+ @y = item_y;
343
+ #puts "here button press #{@x} #{@y}"
344
+ @dragging = true
345
+ if !selected?
346
+ if event.state & Gdk::Window::CONTROL_MASK != Gdk::Window::CONTROL_MASK
347
+ #unselect all nodes
348
+ $canvas.get_selected_node.each {|n|
349
+ n.node_view.unselect()
350
+ }
351
+ end
352
+ #and then select this one
353
+ select()
354
+ end
355
+ #hide links before moving nodes
356
+ hide_selected_node_link()
357
+ when 3
358
+ #popup menu
359
+ b = event.button
360
+ t = event.time
361
+
362
+ #just highlight the node
363
+ node.node_view.select
364
+
365
+ popup_menu = Gtk::Menu.new
366
+ popup_menu.append(Gtk::SeparatorMenuItem.new)
367
+
368
+ if node.status == UNMANAGED
369
+ ismon=Gtk::ImageMenuItem.new("Start Monitoring")
370
+ image_ismon = Gtk::Image.new()
371
+ image_ismon.set_stock(Gtk::Stock::MEDIA_PLAY)
372
+ ismon.set_image(image_ismon)
373
+ popup_menu.append(ismon)
374
+ else
375
+ ismon=Gtk::ImageMenuItem.new("Stop Monitoring")
376
+ image_ismon = Gtk::Image.new()
377
+ image_ismon.set_stock(Gtk::Stock::MEDIA_STOP)
378
+ ismon.set_image(image_ismon)
379
+ popup_menu.append(ismon)
380
+ end
381
+ map_menu_item=Gtk::ImageMenuItem.new("Move to map")
382
+ image_map_menu_item = Gtk::Image.new()
383
+ image_map_menu_item.set_stock(Gtk::Stock::JUMP_TO)
384
+ map_menu_item.set_image(image_map_menu_item)
385
+ if $map != nil
386
+ if (n_network() == 2) && (node.class == Network)
387
+ #there is just root node and this network node
388
+ map_menu_item.set_sensitive false
389
+ else
390
+ map_menu=Gtk::Menu.new
391
+ $network.each_value {|node_map|
392
+ if (get_map() != node_map.ip) && ($canvas.get_selected_node().index(node_map) == nil)
393
+ map_menu.append(actme=Gtk::MenuItem.new(node_map.ip))
394
+ actme.signal_connect('button-press-event') {
395
+ #first we remove the links
396
+ unlink_node()
397
+ old_map=node.map
398
+ #print "1\n";
399
+ selected_nodes=$canvas.get_selected_node()
400
+ #print "2\n";
401
+
402
+ invalid_move=0
403
+ selected_nodes.each {|n|
404
+ if (n.class == Network)&&(n.contain_network(node_map.ip))
405
+ invalid_move=1
406
+ end
407
+ }
408
+ if invalid_move == 0
409
+ #deselect nodes
410
+ node.set_map(node_map.ip)
411
+ #print "3\n";
412
+
413
+ selected_nodes.each {|n|
414
+
415
+ #cant move network in itself
416
+ #print "2 #{n.ip} #{node_map.ip}\n";
417
+ if (n.ip != node_map.ip)
418
+ n.set_map(node_map.ip)
419
+ end
420
+ }
421
+
422
+ #print "3\n";
423
+ #print "node_view.rb: #{node_map.ip} #{old_map}\n";
424
+ node_map.update_status()
425
+ #we should test here which is inner of the other!
426
+ $network[old_map].update_status()
427
+ end
428
+ }
429
+ end
430
+ }
431
+ map_menu_item.set_submenu(map_menu)
432
+ end
433
+ else
434
+ map_menu_item.set_sensitive false
435
+ end
436
+
437
+ popup_menu.append(map_menu_item)
438
+ deletenode=Gtk::ImageMenuItem.new("Delete")
439
+ image_deletenode = Gtk::Image.new()
440
+ image_deletenode.set_stock(Gtk::Stock::DELETE)
441
+ deletenode.set_image(image_deletenode)
442
+ popup_menu.append(deletenode)
443
+ if $map == nil
444
+ deletenode.set_sensitive false
445
+ end
446
+ popup_menu.append(linknode=Gtk::MenuItem.new("Link"))
447
+ popup_menu.append(unlinknode=Gtk::MenuItem.new("Unlink"))
448
+
449
+ if $map == nil
450
+ linknode.set_sensitive false
451
+ unlinknode.set_sensitive false
452
+ end
453
+ if $canvas.nb_selected() < 2
454
+ linknode.set_sensitive false
455
+ end
456
+ if node.nb_links() == 0
457
+ unlinknode.set_sensitive false
458
+ end
459
+
460
+ popup_menu.append(Gtk::SeparatorMenuItem.new)
461
+
462
+ if node.class == Host
463
+ admin_menu_item=Gtk::ImageMenuItem.new("Admin")
464
+ image_admin_menu_item = Gtk::Image.new()
465
+ image_admin_menu_item.set_stock(Gtk::Stock::EXECUTE)
466
+ admin_menu_item.set_image(image_admin_menu_item)
467
+ admin_menu=Gtk::Menu.new
468
+
469
+ admin_menu.append(ssh=Gtk::MenuItem.new("Ssh"))
470
+ if $config.ssh_path == "" || $config.xterm_path == ""
471
+ ssh.set_sensitive false
472
+ end
473
+ admin_menu.append(telnet=Gtk::MenuItem.new("Telnet"))
474
+ if $config.telnet_path == "" || $config.xterm_path == ""
475
+ telnet.set_sensitive false
476
+ end
477
+ admin_menu.append(browser=Gtk::MenuItem.new("Web"))
478
+ if $config.browser_path == "" || $config.xterm_path == ""
479
+ browser.set_sensitive false
480
+ end
481
+ admin_menu.append(vnc=Gtk::MenuItem.new("VNC"))
482
+ if $config.vncviewer_path == "" || $config.xterm_path == ""
483
+ vnc.set_sensitive false
484
+ end
485
+ admin_menu.append(rdp=Gtk::MenuItem.new("RDP"))
486
+ if $config.vncviewer_path == "" || $config.xterm_path == ""
487
+ rdp.set_sensitive false
488
+ end
489
+ admin_menu_item.set_submenu(admin_menu)
490
+
491
+ ssh.signal_connect('button-press-event') {
492
+ Thread.start {
493
+ if $config.xterm_path !=""
494
+ system("#{$config.xterm_path} #{$config.ssh_path} #{node.ip}")
495
+ end
496
+ }
497
+ popup_menu.destroy
498
+ }
499
+ telnet.signal_connect('button-press-event') {
500
+ Thread.start {
501
+ if $config.xterm_path !=""
502
+ system("#{$config.xterm_path} #{$config.telnet_path} #{node.ip}")
503
+ end
504
+ }
505
+ popup_menu.destroy
506
+ }
507
+ browser.signal_connect('button-press-event') {
508
+ Thread.start {
509
+ if $config.xterm_path !=""
510
+ system("#{$config.browser_path} http://#{node.ip}")
511
+ end
512
+ }
513
+ popup_menu.destroy
514
+ }
515
+ vnc.signal_connect('button-press-event') {
516
+ Thread.start {
517
+ if $config.xterm_path !=""
518
+ system("#{$config.xterm_path} #{$config.vncviewer_path} #{node.ip}:1")
519
+ end
520
+ }
521
+ popup_menu.destroy
522
+ }
523
+ rdp.signal_connect('button-press-event') {
524
+ Thread.start {
525
+ if $config.xterm_path !=""
526
+ system("#{$config.xterm_path} #{$config.rdesktop_path} #{node.ip}")
527
+ end
528
+ }
529
+ popup_menu.destroy
530
+ }
531
+ popup_menu.append(admin_menu_item)
532
+ elsif node.class == Network
533
+ enter_network=Gtk::ImageMenuItem.new("Go down")
534
+ image_enter_network = Gtk::Image.new()
535
+ image_enter_network.set_stock(Gtk::Stock::GO_DOWN)
536
+ enter_network.set_image(image_enter_network)
537
+ popup_menu.append(enter_network)
538
+ enter_network.signal_connect('button-press-event') {
539
+ set_map(self.node.ip)
540
+ }
541
+ end
542
+
543
+ popup_menu.append(Gtk::SeparatorMenuItem.new)
544
+
545
+ popup_menu.append(event_win_host=Gtk::MenuItem.new("Show events"))
546
+
547
+ property=Gtk::ImageMenuItem.new("Property")
548
+ image_property = Gtk::Image.new()
549
+ image_property.set_stock(Gtk::Stock::PROPERTIES)
550
+ property.set_image(image_property)
551
+ popup_menu.append(property)
552
+
553
+ if node.status==UNMANAGED
554
+ property.set_sensitive(false)
555
+ end
556
+ popup_menu.show_all
557
+ popup_menu.popup(nil,nil,b,t)
558
+
559
+ ismon.signal_connect('button-press-event') {
560
+ if node.status == UNMANAGED
561
+ #when right clik
562
+ node.set_all_severity(UNKNOWN)
563
+ #when selected
564
+ $canvas.get_selected_node().each {|n|
565
+ n.set_all_severity(UNKNOWN)
566
+ }
567
+ #check if node status changed
568
+ if node.status == UNMANAGED
569
+ #all monitoring should be disabled, so we warn the users
570
+ errorEntry($win, "First, you have to configure monitoring in Option/Preference menu")
571
+ end
572
+ else
573
+ node.set_all_severity(UNMANAGED)
574
+ $canvas.get_selected_node().each {|n|
575
+ n.set_all_severity(UNMANAGED)
576
+ }
577
+ end
578
+ #refresh network map status
579
+ $network[node.map].update_status() unless $network[node.map] == nil
580
+ popup_menu.destroy
581
+ }
582
+ deletenode.signal_connect('button-press-event') {
583
+ verify_delnodewin(node)
584
+ popup_menu.destroy
585
+ }
586
+
587
+ unlinknode.signal_connect('button-press-event') {
588
+ unlink_node()
589
+ popup_menu.destroy
590
+ }
591
+
592
+ linknode.signal_connect('button-press-event') {
593
+ node_t=$canvas.get_selected_node()
594
+ node_t_size=node_t.size
595
+ cpt=0
596
+ while cpt < node_t_size do
597
+ node_id=node_t.shift
598
+ node_t.each { |node2_id|
599
+ if node_id.linked(node2_id) == 0
600
+ Link.new(node_id, node2_id)
601
+ end
602
+ }
603
+ cpt+=1
604
+ end
605
+ popup_menu.destroy
606
+ }
607
+
608
+ property.signal_connect('button-press-event') { |w,s|
609
+ node_property(self.node)
610
+ popup_menu.destroy
611
+ }
612
+ event_win_host.signal_connect('button-press-event') {
613
+ $event_win.filter_by_node(self.node)
614
+ $event_win.show()
615
+ popup_menu.destroy
616
+ }
617
+
618
+ #end of popup menu
619
+ end
620
+ when Gdk::Event::BUTTON_RELEASE
621
+ @dragging = false;
622
+ when Gdk::Event::MOTION_NOTIFY
623
+ item_x, item_y = item.canvas.convert_from_pixels(event.x, event.y)
624
+
625
+ if @dragging && (event.state & Gdk::Window::BUTTON1_MASK == Gdk::Window::BUTTON1_MASK)
626
+
627
+ nodex=node.x+(item_x - @x)
628
+ nodey=node.y+(item_y - @y)
629
+
630
+ #test if node is not out of the view
631
+ if nodex >=0 && nodey >=0 && nodex+get_node_size() <= ($win.window.geometry[2]-$win.window.geometry[0]) && nodey+get_node_size() <= ($win.window.geometry[3]-$win.window.geometry[1])
632
+ move(item_x - @x, item_y - @y)
633
+ mapp=get_map()
634
+ if mapp != nil
635
+ $network[mapp].get_node().each_value {|n|
636
+ if n.node_view and n.node_view.selected?() and n!=node
637
+ #test if node will be out of view
638
+ nodex=n.x+(item_x - @x)
639
+ nodey=n.y+(item_y - @y)
640
+ if nodex >=0 && nodey >=0 && nodex+get_node_size() <= ($win.window.geometry[2]-$win.window.geometry[0]) && nodey+get_node_size() <= ($win.window.geometry[3]-$win.window.geometry[1])
641
+ n.node_view.move(item_x - @x, item_y - @y)
642
+ end
643
+ end
644
+ }
645
+ end
646
+ end
647
+ end
648
+ end
649
+ end
650
+
651
+ def setup_item(item)
652
+ item.signal_connect('key_press_event') do |group, item, event|
653
+ item_event(group, event)
654
+ end
655
+ item.signal_connect('enter_notify_event') do |group, item, event|
656
+ item_event(group, event)
657
+ end
658
+ item.signal_connect('leave_notify_event') do |group, item, event|
659
+ item_event(group, event)
660
+ end
661
+ item.signal_connect('button_press_event') do |group, item, event|
662
+ item_event(group, event)
663
+ end
664
+ item.signal_connect('button_release_event') do |group, item, event|
665
+ item_event(group, event)
666
+ end
667
+ item.signal_connect('motion_notify_event') do |group, item, event|
668
+ item_event(group, event)
669
+ end
670
+ end
671
+
672
+ end