Hi, I wanted to parse the last line of a file and to draw 3 different color
progress bar.
If he last line begins by tftpd the progress bar will grow in yellow.
" " by ftpd "" in blue
by DHCPD "" in green.
my code seems to have a problem if there is a line with tftpd but it is not the
last line the progress bar is still growing, why?
Another question about geometry manager is:
How can I do to only have 3 progress bar ie if the 3 progress bar are already
present and if there is another tftpd, or ftpd, or DHCPD, in the last line, I
wanted to delete the first corresponding progress bar.My file is growing anyway.
Because now it add always a progress bar so it make growing my GUI.
I send you my code thanks.
#!/usr/local/bin/perl -w
use Tk;
use Win32::DriveInfo;
use Tk::ProgressBar;
use Win32::API;
use Win32;
#---------------- User Defined Declarations -----------------
my $status_var = 0;
my $lw=40; #width of labels
my $ethernet_address ='Ceci est un test'; #fixed for now
my $IP_address; #self-explanatory
my $client_name; #as is this
my $boot_file; #another -textvariable to be used
my $install_file_path;
my $SYSLOG='C:/CYGWIN_SYSLOG.TXT'; #your file to be parsed
my $dialog; #declare here, not in the sub
my $msdelay=5000; #5 second delay..until callback
my $mtime=1; #initialize to something other than $thistime
my $thistime=0; #variable to hold current 'stat' check
my $language="ENGLISH";
#------------------------ Main Program -----------------------
my $mw = MainWindow->new( -title => "Serveur d'installation "
);
$mw->geometry('570x500');
&setlanguage;
&makemenu;
&makeButtons;
&makeframe;
&makelabels;
my $Percent_Done = 100; # Starting point
&makeProgressBar;
$image = $mw->Photo(-file => "logo_alcatel.gif");
&check_syslog($SYSLOG);
$mw->repeat($msdelay,[\&check_syslog,$SYSLOG]);
MainLoop;
#------------------------ Subroutines ------------------------
sub setlanguage
{
#static variables defined in main and changed in this sub
if ($language eq 'ENGLISH')
{
$language_EA='Client Ethernet address';
$language_IP='IP Address';
$language_CN='Client Name';
$language_BF='Boot File';
$language_FP='Installation File Path';
}
elsif ($language eq 'FRENCH')
{
$language_EA='Adress Ethernet du Client';
$language_IP='Adresse Ip Du Client';
$language_CN='Nom du Client';
$language_BF='Fichier';
$language_FP='Chemin installation';
}
}
sub restart_serv
{
if( Win32::IsWin95() )
{
#for (sort keys %ENV) { print "$_is $ENV{$_}\n" }
$PROG = "c:\\cygwin\\usr\\sbin\\inetd.exe";
if (-f $PROG)
{
system($PROG)
}
else
{
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'INETD ALERT ',
-text => "Fail to execute Inetd daemon",
-font => "Arial 14 normal",
-justify => 'center',
-default_button => 'OK',
-bitmap =>'error',
-buttons => [qw/OK/] );
$dialog->Show;
}
#or die " je n'ai pas pu red�marrer : $!\n";
}
elsif( Win32::IsWinNT() )
{
system("net stop inetd");
system("net start inetd");
}
}
sub setdeletefile
{
open(FILE, ">c:/cygwin_syslog.txt");
close(FILE);
$Status_Text = "$count lines read (0 %)";
$mw->update;
}
sub makeframe
{
$myframe=$mw->Frame(-label => "",
-relief => 'groove',
-borderwidth => 2)->pack(-anchor=>'w',pady =>40);
}
sub makelabels
{
#$mw->Label(-text=>"")->pack(-anchor=>'w',-side => 'top');
#$mw->Label(-text=>"")->pack(-anchor=>'w',-side => 'top');
#$mw->Label(-text=>"")->pack(-anchor=>'w',-side => 'top');
$myframe->Label(-textvariable=>\$language_EA)->pack(-anchor=>'w');
my $label1=$myframe->Label(-relief=>'sunken',
-textvariable=>\$ethernet_address,
-width=>$lw,
-anchor=>'w',
-bg=>'white')->pack(-anchor=>'w');
$myframe->Label(-textvariable=>\$language_IP)->pack(-anchor=>'w');
my $label2=$myframe->Label(-relief=>'sunken',
-textvariable=>\$IP_address,
-width=>$lw,
-anchor=>'w',
-bg=>'white')->pack(-anchor=>'w');
$myframe->Label(-textvariable=>\$language_CN)->pack(-anchor=>'w');
my $label3=$myframe->Label(-relief=>'sunken',
-textvariable=>\$client_name,
-width=>$lw,
-anchor=>'w',
-bg=>'white')->pack(-anchor=>'w');
$myframe->Label(-textvariable=>\$language_BF)->pack(-anchor=>'w');
my $label4=$myframe->Label(-relief=>'sunken',
-textvariable=>\$boot_file,
-width=>$lw,
-anchor=>'w',
-bg=>'white')->pack(-anchor=>'w');
$myframe->Label(-textvariable=>\$language_FP)->pack(-anchor=>'w');
my $label5=$myframe->Label(-relief=>'sunken',
-textvariable=>\$install_file_path,
-width=>$lw,
-anchor=>'w',
-bg=>'white')->pack(-anchor=>'w');
#$mw->Label(-text => '')->pack(-anchor=>'w',-side => 'top',pady =>5);
}
sub check_syslog
{
use Net::Ping;
$p = Net::Ping->new();
$host = "cu5s46";
unless ($p->ping($host))
{
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'NETWORK ALERT ',
-text => "The network is down",
-font => "Arial 14 normal",
-justify => 'center',
-default_button => 'OK',
-bitmap =>'error',
-buttons => [qw/OK/] );
$dialog->Show;
}
$p->close;
$PROG2="C:/cygwin/usr/sbin/in.tftpd.exe";
unless(-f $PROG2)
{
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'TFTPD ALERT ',
-text => "Fail to execute TFTPD daemon",
-font => "Arial 14 normal",
-justify => 'center',
-default_button => 'OK',
-bitmap =>'error',
-buttons => [qw/OK/] );
$dialog->Show;
}
$PROG3 = "C:/WINDOWS/arp.exe";
unless(-f $PROG3)
{
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'ARP ALERT ',
-text => "Program arp.exe not found \n".
"You must reinstall\n".
"Microsoft TCP/IP",
-font => "Arial 14 normal",
-justify => 'center',
-default_button => 'OK',
-bitmap =>'error',
-buttons => [qw/OK/] );
$dialog->Show;
}
$PROG4="C:/cygwin/usr/sbin/in.ftpd.exe";
unless(-f $PROG4)
{
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'FTPD ALERT ',
-text => "Fail to execute FTPD daemon",
-font => "Arial 14 normal",
-justify => 'center',
-default_button => 'OK',
-bitmap =>'error',
-buttons => [qw/OK/] );
$dialog->Show;
}
if( Win32::IsWin95() )
{
my ($f)=@_;
$thistime=(stat($f))[9];
return if ($thistime == $mtime);
$mtime=$thistime;
my $dummy;
unless (open (FILE, $f))
{
warn "Couldn't open file $f: $!";
return;
}
@lines=<FILE>;
close (FILE);
($dummy, $IP_address, $read, $status)=split(":",$lines[$#lines-1]);
$IP_address=~s/^\s*(.*)\s*$/$1/;
($client_name)=split(/\./,$IP_address);
$read=~/.*bootp(.*)\s*/;
$boot_file=$1;
$read=~/.*(\/bootp.*)\s*/;
$install_file_path=$1;
}
elsif( Win32::IsWinNT() )
{
#use Win32::EventLog;
}
open SYSLOG,"<c:/cygwin_syslog.txt" || die "can't open: $!";
while (<SYSLOG>)
{
chomp;
if (/^tftpd/)
{
use Test;
my $var = 0;
my $pb = $mw->ProgressBar(-bd => 3,
-relief => 'raised',
-fg => 'yellow',
-variable => \$var)->pack(-side
=>'left',-anchor =>'w');
$pb->cget('-from');
$pb->cget('-to');
for my $v (map(10*$_+3,1..10))
{
$var = $v;
$pb->cget('-value');
$mw->update;
sleep 2; # This line added by Sisyphus
}
}
if (/^ftpd/)
{
my $var = 0;
my $pb = $mw->ProgressBar(-bd => 3,
-relief => 'raised',
-fg => 'blue',
-variable => \$var)
->pack(-side => 'left',-anchor =>'w');
$pb->cget('-from');
$pb->cget('-to');
for my $v (map(10*$_+3,1..10))
{
$var = $v;
$pb->cget('-value');
$mw->update;
sleep 2; # This line added by Sisyphus
}
}
if (/^DHCP/)
{
my $var = 0;
my $pb = $mw->ProgressBar(-bd => 3,
-relief => 'raised',
-fg => 'green',
-variable => \$var)
->pack(-side => 'left',-anchor =>'w');
$pb->cget('-from');
$pb->cget('-to');
for my $v (map(10*$_+3,1..10))
{
$var = $v;
$pb->cget('-value');
$mw->update;
sleep 2; # This line added by Sisyphus
}
}
}
}
#------------------------ SUBROUTINE makemenu -------------------------
sub makemenu{
my $menubar = $mw->Menu(-type => 'menubar',
-relief=>'flat');
$mw->configure(-menu => $menubar);
my $mnu0 = $menubar->cascade(-label => '~Control',
-tearoff => 0,
-font => "Arial 8 normal"
);
$mnu0->command( -label => '~Quitter',
-font => "Arial 8 normal",
-command =>sub{$mw->destroy()});
$mnu0->command( -label => '~Redemarrer',
-font => "Arial 8 normal",
-command =>sub{restart_serv});
$mnu0->separator();
my $mnu1 = $menubar->cascade(-label => '~Options',
-tearoff => 0,
-font => "Arial 8 normal"
);
my $cc = $mnu1->cascade(-label=>'~Language');
$cc-> radiobutton (-label=>'Generic Alcatel',
-variable => \$language,
-value=>"ENGLISH",
-command=>\&setlanguage);
$cc-> radiobutton (-label=>'Au Francais',
-variable => \$language,
-value=>"FRENCH",
-command=>\&setlanguage);
#my $cc2 = $mnu1->cascade(-label=>'~Drive');
#my $num_elements = @drives = Win32::DriveInfo::DrivesInUse();
#for ($i=0;$i<$num_elements;$i++)
#{
#$cc2-> radiobutton (-label=>$drives[$i]);
#}
#$mnu1->separator();
my $mnu2 = $menubar->cascade(-label => '~Alcatel',
-tearoff => 0,
-font => "Arial 8 normal"
);
$mnu2->command( -label => 'A~bout',
-font => "Arial 8 normal",
-command =>sub{about()}
);
} #end sub makemenu
sub about {
unless (Exists($dialog)){
require Tk::Dialog;
$dialog =$mw-> Dialog( -title => 'About',
-text => "Server d'installation Alcatel".
"Business Systems\n"
. "$VERSION\n " .
"Written by Jorge Goncalves, " .
"goncal11\@col.bsf.com Version 1.0",
-font => "Arial 8 normal",
-justify => 'center',
-default_button => 'Ok!',
-bitmap =>'info',
-image => $image,
-buttons => [qw/Ok!/] );
}
$dialog->Show;
} #end sub dialog
#-------------------------------SUBROUTINE PROGRESS
#BAR-------------------------
#-------
sub makeProgressBar
{
#$mw->Button( -text => 'Cygwin_Syslog Size',
#-command => [\&READ_FILE,$0] ,
#-bg => 'skyblue2' ) -> pack( -anchor =>'nw');
#$mw->Label( -textvariable => \$Status_Text , -text =>
#'Progression')
# ->pack(-anchor=>'w');
#my $bar = $mw->ProgressBar( -variable => \$Percent_Done,
#-relief => 'sunken',
#-width => 15,
#-length => 300,
#-colors => [0, 'red'])
#25, 'yellow',
#50, 'red',
#75,'black'] )
#->pack(-anchor =>'nw');
#$mw->Button( -text => 'Status servers',
# -command => [\&READ_FILE2,$0] ,
# -bg => 'skyblue2' ) -> pack( -anchor =>'nw');
$mw->Label( -text => 'DHCP',
-bg => 'green' ) -> pack(-side =>'top', -anchor =>'w',-pady =>3);
$mw->Label( -text => 'TFTP',
-bg => 'yellow' ) -> pack( -side =>'top', -anchor =>'w',-pady
=>3);
$mw->Label( -text => 'FTP ',
-bg => 'blue' ) -> pack( -side =>'top', -anchor =>'w',-pady =>3);
#$mw->Label(-text=>"Etats des serveurs")->pack(-anchor=>'w');
#my $bar2 = $mw->ProgressBar( -variable => \$Percent_Done2,
# -relief => 'sunken',
# -width => 15,
# -length => 300,
# -colors => [0, 'green',
# 30, 'yellow',
# 60, 'blue',
# ] )
# ->pack(-anchor =>'nw');
}
sub READ_FILE
{
#my $Input_File = shift;
my $Input_File='C:/CYGWIN_SYSLOG.TXT';
my $total = -s $Input_File; # Total bytes to process
my $one_percent = int( $total/100 );
my $count; # Lines read
my $at; # Position in file
my $target = $one_percent; # Progress update target
open( IN, $Input_File );
while( <IN> )
{
$at += length( $_ ); # Bytes read
$count++; # Lines read
if( $at >= $target )
{ # Time to report progress
my $percent = int( $at * 100 / $total );
if( $percent != $Percent_Done )
{ # Only update 100 times
$Percent_Done = $percent;
$Status_Text = "$count lines read ($percent%)";
$mw->update;
}
}
# Process input text
}
$Percent_Done = 100;
#system("perl test.pl");
}
sub READ_FILE2
{
#my $Input_File = shift;
my $Input_File='C:/CYGWIN_SYSLOG.TXT';
my $total = -s $Input_File; # Total bytes to process
my $one_percent = int( $total/100 );
my $count; # Lines read
my $at; # Position in file
my $target = $one_percent; # Progress update target
open( IN, $Input_File );
while( <IN> )
{
$at += length( $_ ); # Bytes read
$count++; # Lines read
if( $at >= $target )
{ # Time to report progress
my $percent = int( $at * 100 / $total );
if( $percent != $Percent_Done2 )
{ # Only update 100 times
$Percent_Done2 = $percent;
$Status_Text = "$count lines read ($percent%)";
$mw->update;
}
}
# Process input text
}
$Percent_Done2 = 100;
#system("perl test.pl");
}
sub makeButtons
{
my $bouton=$mw->Button(-bitmap => 'error',
-relief =>'raised',
-height =>'27',
-width => '27',
-cursor => 'pirate',
-command=>\&restart_serv)->pack(-side => 'left',
-anchor => 'n',
-padx => 3);
my $bouton=$mw->Button(-bitmap => 'gray12',
-relief =>'raised',
-height =>'27',
-width => '27',
-cursor => 'pirate',
-command=>\&setdeletefile)->pack(-side => 'left',
-anchor => 'n',
-padx => 3);
my $bouton=$mw->Button(-bitmap => 'question',
-relief =>'raised',
-width => '27',
-cursor => 'question_arrow',
-command=>\&about)->pack(-anchor => 'n',
-side => 'left',
-padx => 3,
);
}
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]