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.
- data/LICENSE +459 -0
- data/README +29 -0
- data/bin/gnms +11 -0
- data/gnms.gemspec +70 -0
- data/lib/cmd_parse.rb +747 -0
- data/lib/config_global.rb +414 -0
- data/lib/contact.rb +171 -0
- data/lib/external/crypt/blowfish-tables.rb +190 -0
- data/lib/external/crypt/blowfish.rb +110 -0
- data/lib/external/crypt/cbc.rb +123 -0
- data/lib/external/crypt/stringxor.rb +27 -0
- data/lib/external/fog.rb +41 -0
- data/lib/external/jjmx.rb +45 -0
- data/lib/external/sms.rb +282 -0
- data/lib/external/xmpp4r-simple.rb +497 -0
- data/lib/format.rb +85 -0
- data/lib/gnms.rb +329 -0
- data/lib/gui/about_window.rb +177 -0
- data/lib/gui/adddelnode.rb +799 -0
- data/lib/gui/base_window.rb +789 -0
- data/lib/gui/canvas_map.rb +498 -0
- data/lib/gui/charts/gruff.rb +51 -0
- data/lib/gui/color_macro.rb +145 -0
- data/lib/gui/config_window.rb +2151 -0
- data/lib/gui/custom_plugin_window.rb +90 -0
- data/lib/gui/debug_window.rb +46 -0
- data/lib/gui/event_window.rb +469 -0
- data/lib/gui/find_node_window.rb +438 -0
- data/lib/gui/help_window.rb +47 -0
- data/lib/gui/ipcalculator.rb +147 -0
- data/lib/gui/jmx_ref_window.rb +309 -0
- data/lib/gui/link_view.rb +46 -0
- data/lib/gui/mib_browser.rb +585 -0
- data/lib/gui/node_host_property.rb +3712 -0
- data/lib/gui/node_host_view.rb +270 -0
- data/lib/gui/node_network_property.rb +1059 -0
- data/lib/gui/node_network_view.rb +186 -0
- data/lib/gui/node_view.rb +672 -0
- data/lib/gui/oid_ref_window.rb +288 -0
- data/lib/gui/snmptrap_ref_window.rb +288 -0
- data/lib/gui/sub/account_frame.rb +196 -0
- data/lib/gui/sub/contact_frame.rb +519 -0
- data/lib/gui/syslog_ref_window.rb +288 -0
- data/lib/gui/treenode_window.rb +320 -0
- data/lib/gui/update_window.rb +124 -0
- data/lib/gui/widgets.rb +169 -0
- data/lib/gui/wmi_ref_window.rb +286 -0
- data/lib/interface.rb +16 -0
- data/lib/ipcalc.rb +266 -0
- data/lib/link.rb +45 -0
- data/lib/main.rb +1091 -0
- data/lib/monitor/client/custom/custom_monitoring.rb +40 -0
- data/lib/monitor/client/jmx/jmx_attr_monitoring.rb +36 -0
- data/lib/monitor/client/jmx/jmx_monitoring.rb +83 -0
- data/lib/monitor/client/jmx/jmx_ref.rb +114 -0
- data/lib/monitor/client/snmp/mibs/SNMPv2-MIB.txt +854 -0
- data/lib/monitor/client/snmp/mibs/SNMPv2-SMI.txt +344 -0
- data/lib/monitor/client/snmp/oid_ref.rb +141 -0
- data/lib/monitor/client/snmp/snmp.rb +178 -0
- data/lib/monitor/client/snmp/snmp_monitoring.rb +58 -0
- data/lib/monitor/client/wmi/wmi.rb +139 -0
- data/lib/monitor/client/wmi/wmi_monitoring.rb +60 -0
- data/lib/monitor/client/wmi/wmi_ref.rb +141 -0
- data/lib/monitor/custom_plugin.rb +50 -0
- data/lib/monitor/server/msg_buffer.rb +39 -0
- data/lib/monitor/server/snmp/snmptrap_analyzer.rb +81 -0
- data/lib/monitor/server/snmp/snmptrap_capture.rb +26 -0
- data/lib/monitor/server/snmp/snmptrap_monitoring.rb +32 -0
- data/lib/monitor/server/snmp/snmptrap_ref.rb +135 -0
- data/lib/monitor/server/snmp/snmptrap_server.rb +50 -0
- data/lib/monitor/server/syslog/syslog_analyzer.rb +141 -0
- data/lib/monitor/server/syslog/syslog_capture.rb +28 -0
- data/lib/monitor/server/syslog/syslog_monitoring.rb +32 -0
- data/lib/monitor/server/syslog/syslog_ref.rb +136 -0
- data/lib/monitor/server/syslog/syslog_server.rb +43 -0
- data/lib/node.rb +1020 -0
- data/lib/node_db.rb +2668 -0
- data/lib/node_host.rb +215 -0
- data/lib/node_listener.rb +639 -0
- data/lib/node_network.rb +269 -0
- data/lib/node_property.rb +39 -0
- data/lib/notify/alarm.rb +247 -0
- data/lib/notify/irc_bot.rb +167 -0
- data/lib/notify/xmpp_bot.rb +107 -0
- data/lib/service.rb +36 -0
- data/lib/version.rb +8 -0
- data/pixmap/bg/map_bg.jpg +0 -0
- data/pixmap/bg/map_bg2.jpg +0 -0
- data/pixmap/logo.jpg +0 -0
- data/pixmap/logo_icon.png +0 -0
- data/pixmap/os/3com.png +0 -0
- data/pixmap/os/aix.gif +0 -0
- data/pixmap/os/amiga.png +0 -0
- data/pixmap/os/beos.png +0 -0
- data/pixmap/os/cisco.png +0 -0
- data/pixmap/os/freebsd.png +0 -0
- data/pixmap/os/hp.png +0 -0
- data/pixmap/os/hurd.gif +0 -0
- data/pixmap/os/irix.gif +0 -0
- data/pixmap/os/linux.png +0 -0
- data/pixmap/os/mac.png +0 -0
- data/pixmap/os/netbsd.gif +0 -0
- data/pixmap/os/netware.png +0 -0
- data/pixmap/os/openbsd.png +0 -0
- data/pixmap/os/os2warp.gif +0 -0
- data/pixmap/os/qnx.gif +0 -0
- data/pixmap/os/sco.gif +0 -0
- data/pixmap/os/sgi.xpm +111 -0
- data/pixmap/os/solaris.gif +0 -0
- data/pixmap/os/unix.gif +0 -0
- data/pixmap/os/unknown.png +0 -0
- data/pixmap/os/vms.xpm +345 -0
- data/pixmap/os/windows.png +0 -0
- data/pixmap/type/cloud.png +0 -0
- data/pixmap/type/device.png +0 -0
- data/pixmap/type/firewall.png +0 -0
- data/pixmap/type/gateway.png +0 -0
- data/pixmap/type/home.png +0 -0
- data/pixmap/type/host.png +0 -0
- data/pixmap/type/network.png +0 -0
- data/pixmap/type/printer.png +0 -0
- data/pixmap/type/router.png +0 -0
- data/pixmap/type/server.png +0 -0
- data/pixmap/type/switch.png +0 -0
- data/pixmap/type/vm.png +0 -0
- data/plugins/Defaultme.rb +7 -0
- data/plugins/DnsCheck.rb +46 -0
- data/plugins/FooMonitor.rb +26 -0
- data/plugins/HttpVirtualHostMonitor.rb +43 -0
- data/plugins/MysqlShowStatusMonitor.rb +64 -0
- data/plugins/PgsqlPercentConnectionMonitor.rb +72 -0
- data/plugins/SshCpuLoadMonitor.rb +85 -0
- data/plugins/SshDiskMonitor.rb +69 -0
- data/plugins/SshFgtAvExpiredMonitor.rb +75 -0
- data/plugins/SshPercentUsedRamMonitor.rb +74 -0
- data/plugins/TelnetCpuLoadMonitor.rb +69 -0
- data/plugins/example1.rb +15 -0
- data/plugins/example2.rb +7 -0
- data/sound/beep.wav +0 -0
- 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
|