#!/usr/bin/perl #use strict; use lib qw(/usr/lib/libDrakX); use c; use common; use Digest::MD5; use Gtk2::TrayIcon; use ugtk2 qw(:create :helpers :wrappers); my ($eventbox, $img); my ($menu, $timeout); my $raisedwindow = 0; my $onstartupfile = "$ENV{HOME}/.net_applet"; add_icon_path("/usr/share/libDrakX/pixmaps/"); # Allow multiple instances, but only one per user: my @pids = `ps -u $ENV{USER} | grep net_applet`; @pids > 1 and die "net_applet already running\n"; my $prog_name = "/usr/bin/net_applet"; my $current_md5 = md5file($prog_name); my %appletstate = ( connected => { colour => [ 'connected' ], changes => [ 'disconnected', 'error', 'busy' ], menu => [ 'confNetwork', 'monitorNetwork', 'refresh', 'help' ], tt => [ N_("Network is up on interface %d") ] }, disconnected => { colour => [ 'disconnected' ], changes => [ 'connected', 'error', 'busy' ], menu => [ 'confNetwork', 'refresh', 'help' ], tt => [ #-PO: keep the "Configure Network" substring synced with the "Configure Network" message below N_("Network is down. Click on \"Configure Network\"") ] } ); my %actions = ( 'confNetwork' => { name => N("Configure Network"), launch => sub { system("/usr/sbin/drakconnect --skip-wizard &") } }, 'monitorNetwork' => { name => N("Monitor Network"), launch => sub { system("/usr/sbin/net_monitor &") } }, 'refresh' => { name => N("Refresh"), launch => sub { checkNetwork() } }, 'help' => { name => N("Get Online Help"), launch => sub { system("drakhelp --id internet-connection &") } } ); gtkadd(my $icon = Gtk2::TrayIcon->new("Net_Applet"), gtkadd($eventbox = Gtk2::EventBox->new, gtkpack($img = Gtk2::Image->new) ) ); $eventbox->signal_connect(button_press_event => sub { if (!$raisedwindow) { if ($_[1]->button == 1) { $raisedwindow = 1; netMonitor() } } $_[1]->button == 3 && $menu and $menu->popup(undef, undef, undef, undef, $_[1]->button, $_[1]->time); }); my ($opt) = @ARGV; if ($opt eq '--force' || $opt eq '-f') { setAutoStart('TRUE') }; shouldStart() or die "$onstartupfile should be set to TRUE or use net_applet --force"; checkNetwork(); cronNetwork(); $icon->show_all; Gtk2->main; ugtk2::exit(0); sub shouldStart() { my %p = getVarsFromSh($onstartupfile); my $ret = $p{AUTOSTART} eq 'FALSE' ? 0 : 1; $ret } sub md5file { my @md5; foreach my $file (@_) { open(my $FILE, $file) or do { print STDERR "Can't open '$file': $!"; push @md5, "" }; binmode($FILE); push @md5, Digest::MD5->new->addfile($FILE)->hexdigest; close($FILE); } return wantarray() ? @md5 : $md5[0]; } sub netMonitor() { system("/usr/sbin/net_monitor --testing"); checkNetwork() } sub checkNetwork() { my $gatewayconf = '/etc/sysconfig/network'; my %h = getVarsFromSh($gatewayconf); my $new_md5 = md5file($prog_name); # print "NEW($newmd5) = OLD($oldmd5)\n" my ($gd, $addrgd); if ($h{GATEWAYDEV}) { $addrgd = getIP($gd = $h{GATEWAYDEV}); } else { ($addrgd, $gd) = `/sbin/ip route show` =~ /^default\s+via\s+(\S+).*\s+dev\s+(\S+)/m; } if ($addrgd) { go2State('connected', $gd) } else { go2State('disconnected', '') } if ($new_md5 ne $current_md5) { exec($prog_name) }; } sub getIP { my ($interface) = shift; my $ifconfig = '/sbin/ifconfig'; my @lines = `$ifconfig $interface`; my @ip = map { if_(/inet adr:([\d.]+)/, $1) } @lines; return wantarray() ? @ip : $ip[0]; } sub cronNetwork() { $timeout = Glib::Timeout->add(60*1000, sub { checkNetwork(); 1; }); } sub go2State { $menu and $menu->destroy; $menu = setState(@_) } sub setState { my ($state_type, $interface) = @_; my $checkmi; my $arr = $appletstate{$state_type}{menu}; my $tmp = gtkcreate_pixbuf($appletstate{$state_type}{colour}[0]); $img->set_from_pixbuf($tmp); gtkset_tip(Gtk2::Tooltips->new, $eventbox, formatAlaTeX(common::sprintf_fixutf8(translate($appletstate{$state_type}{tt}[0]), $interface))); my $menu = Gtk2::Menu->new; foreach (@$arr) { $menu->append(gtksignal_connect(gtkshow(Gtk2::MenuItem->new_with_label($actions{$_}{name})), activate => $actions{$_}{launch})); } $menu->append(gtkshow(Gtk2::SeparatorMenuItem->new)); $menu->append(gtksignal_connect(gtkset_active($checkmi = Gtk2::CheckMenuItem->new_with_label(N("Always launch on startup")), shouldStart()), toggled => sub { setAutoStart(uc(bool2text($checkmi->get_active))) })); $checkmi->show; $menu->append(gtksignal_connect(gtkshow(Gtk2::MenuItem->new_with_label(N("Quit"))), activate => sub { mainQuit() })); $menu } sub mainQuit() { Glib::Source->remove($timeout) if $timeout; Gtk2->main_quit } sub setAutoStart { my $state = shift; output_p $onstartupfile, qq(AUTOSTART=$state ); }