#!/usr/bin/perl use Tk; use DBI; use encoding 'euc_cn'; ###创建窗体 my $mw = MainWindow->new(-title => "system monitor",-bg=>"blue"); ##定义左边菜单框体 $FRAME_L = $mw->Frame(-bg=>white)->pack(qw/-side left -fill both /); #定义下拉菜单框 $WIDGET_F = $FRAME_L->Labelframe(-bg=>white)->pack(qw/-side top -fill both -expand 1 /); ##定义图片 #my $cns = $mw -> Canvas(-relief=>"sunken",-background=>"blue"); #$cns -> create('polygon',5,100,50,150,200,#-joinstyle=>"bevel",-fill=>"red",-outline=>"white",-width=>5); #$cns -> create('oval',300,-fill=>"green"); # #$cns -> create('oval',-fill=>"white",-width=>100); #$cns -> create('oval',1000,-width=>100); #$cns -> create('rectangle',10,250,-dash=>[6,4,2,4]); #$cns -> pack(qw/-side left -fill both -expand 1 /); ####设置标签 $code_font = $mw->fontCreate(-family => '黑体',-size => 80); my $lab = $mw -> Label(-text=>"浙江稠州商业银行\n运维巡检平台",-font => $code_font,-height=>10,-bg=>"#C6E2FF",-fg=>"black")->pack(qw/-side top -fill both -expand 1 /); ####定义菜单########################################################################## # #'Widget' 可以试任何的部件支持滚动条 比如 Text,ListBox,etc # # my $frm_menu = $mw -> Frame(-bg=>"#C6E2FF") ->pack(-side=>"top",-fill => 'x'); #my $txt = $frm_menu -> Scrolled('Text',-width => 50,-scrollbars=>'e',-bg=>"#C6E2FF") -> pack (); #Declare that there is a menu my $mbar = $frm_menu -> Menu(); $mw -> configure(-menu => $mbar); #The Main Buttons my $file = $mbar -> cascade(-label=>"File",-underline=>0,-tearoff => 0); my $others = $mbar -> cascade(-label =>"others",-tearoff => 0); my $tools = $mbar -> cascade(-label =>"tools",-tearoff => 0); my $help = $mbar -> cascade(-label =>"Help",-tearoff => 0); ## File Menu ## $file -> command(-label => "New",-command=>sub { $txt -> delete('10','end');} ); $file -> checkbutton(-label =>"Open",-underline => 0,-command => [\&menuClicked,"Open"]); $file -> command(-label =>"Save","Save"]); $file -> separator(); $file -> command(-label =>"Exit",-underline => 1,-command => sub { exit } ); ## Others Menu ## my $insert = $others -> cascade(-label =>"Insert",-tearoff => 0); $insert -> command(-label =>"Name",-command => sub { $txt->insert('end',"Name : Binny V A\n");}); $insert -> command(-label =>"Website",-command=>sub { $txt->insert('end',"Website : http://wwwgeocitiescom/binnyva/\n");}); $insert -> command(-label =>"Email",-command=> sub {$txt->insert('end',"E-Mail : binnyva\@hotmailcom\n");}); $others -> command(-label =>"Insert All",-underline => 7,"Name : Binny V A Website : http://wwwgeocitiescom/binnyva/ E-Mail : binnyva\@hotmailcom"); }); ## Help ## $help -> command(-label =>"About",-command => sub { $txt->delete('10','end'); $txt->insert('end',"About ---------- This script was created to make a menu for a\nPerl/Tk tutorial Made by Binny V A Website : http://wwwgeocitiescom/binnyva/code E-Mail : binnyva\@hotmailcom"); }); sub menuClicked { my ($opt) = @_; $mw->messageBox(-message=>"You have clicked $opt This function is not implanted yet"); } #################################################菜单结束####################### $code_font = $mw->fontCreate(-family => '黑体',-size => 12); ##定义下拉菜单 my %section = ( "1-系统信息查询" => ["VIEW cpu","VIEW MEMORY","VIEW disK"],"2-中间件信息查询" => [1,3],"3-数据库信息查询" => [1,"4-硬件信息查询" => [1,"5-软件信息查询" => [1,"6-登记信息查询" => [1],"7-综合查询" => [1],"8-收起菜单" =>undef,); my (@frames,@button); my %sub_of = ( "VIEW cpu" => \&push_button1,"VIEW MEMORY" => \&push_button2,"VIEW disK" => \&push_button3,4 => sub{ print "program 4" },5 => sub{ print "program 5" },6 => sub{ print "program 6" },7 => sub{ print "program 7" },8 => sub{ print "program 8" },9 => sub{ print "program 9" },); ##############push_button1开始###################### sub push_button1{ ##查看列表框 my $mw = new MainWindow; $lb = $mw->ListBox(-selectmode => "single")->pack(-expand => 1,-fill => 'both' ); $lb->insert('end',qw/red yellow green blue grey/); ##绑定到左键<Button-1> $lb->bind('<Button-1>',sub { $lb->configure(-background => $lb->get($lb->curselection( )) ); }); MainLoop } ##############push_button2开始########################### sub push_button2 { my $mw = MainWindow->new(-title => "Mem monitor"); $frm_name1 = $mw -> Frame()->pack(-side=>"top",-fill => 'x'); $lab1 = $frm_name1 -> Label(-text=>"Host Ip",-width=>10) -> pack(-side=>"left",-ipadx=>20,-ipady=>20); $ent1 = $frm_name1 -> Entry() -> pack(-side=>"left",-ipadx=>20); $lab2 = $frm_name1 -> Label(-text=>"Start date",-ipady=>20); $ent2 = $frm_name1 -> Entry() -> pack(-side=>"left",-ipadx=>20); $lab3= $frm_name1 -> Label(-text=>"Stop date",-ipady=>20); $ent3 = $frm_name1 -> Entry() -> pack(-side=>"left",-ipadx=>20); $but1 = $frm_name1 -> Button(-text => "ok",-command =>\&sub_fun2)-> pack(-side=>"left",-padx=>30); $but2 = $frm_name1 -> Button(-text => "导出数据",-command =>\&sub_clear2)-> pack(-side=>"left",-padx=>30); ###############定义表格开始 $mw->geometry("475x122"); #禁止窗口缩放 #$mw->resizable(0,0); require Tk::Table; $table_frame = $mw->Frame()->pack(-expand => 1,-fill => 'both'); $table = $table_frame->Table(-columns => 10,-rows =>1,-fixedrows => 1,-scrollbars => 'oe',-relief => 'raised'); #@arr1 = qw/HOST FILESYstem TYPE SIZE# USED AVAIL USE MOUNTED SYSDATE/; ##使用hash数组 my %hash=("1","HOST","2","TOTAL","3","USED","4","FREE","5","DATA_DATE"); foreach $key (sort keys %hash) { $var = $hash{$key}; # print "\$var is $var\n"; $tmp_label = $table->Label(-text => $var,-width => 40,-relief =>'raised'); ##放到第0行 第N列 $table->put(0,$key,$tmp_label); } ##创建100行 $tmp_label=""; foreach my $row (1 .. 100) { foreach my $col (1 .. 10) { $tmp_label = $table->Label(-text => "",-padx => 0,-anchor => 'w',-background => 'white',-relief => "groove"); $table->put($row,$col,$tmp_label); } } $table->pack(-expand => 1,-fill => 'both'); ##borderwidth 边框属性 $button_frame = $mv->Frame( -borderwidth => 4 )->pack(); $button_frame->Button(-text => "Exit",-command => sub {exit})->pack(); #my $frm4 = $mw -> Frame() ->pack(-side=>"top",-fill => 'x'); #Text Area #my $txt = $frm4 -> Text(-width=>108,-height=>40) -> pack(-fill => 'both'); # #定义表格结束 # } ###############push_button2结束####################### sub sub_fun2{ use Tk; my $dbname = 'dwh5'; my $dbUser = 'test'; my $dbUserPass = 'test'; $name1 = $ent1 -> get(); $name2 = $ent2 -> get(); $name3 = $ent3 -> get(); $tmp_label=""; foreach my $row (1 .. 100) { foreach my $col (1 .. 10) { $tmp_label = $table->Label(-text => "",-relief => "groove"); $table->put($row,-fill => 'both'); my $dbh = DBI->connect("dbi:Oracle:$dbname",$dbUser,$dbUserPass) or die "can't connect to database " ; my $hostsql = qq{select hostip,total,used,free,to_char(DATA_DATE\,'yyyy-mm-dd:Hh24:Mm:Ss') from mem_info where hostip='$name1'}; @arr2=""; $var2=""; $tmp_label=""; $var3=""; $i=0; my ($a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9); my $selStmt = $dbh->prepare($hostsql); $selStmt->bind_columns(undef,\$a1,\$a2,\$a3,\$a4,\$a5); $selStmt->execute(); while( $selStmt->fetch() ){ push (@arr2,"$a1\t$a2\t$a3\t$a4\t$a5\n" ); #循环取数组元素个数 $var2=@arr2 -1 ; $i=0; foreach $var3 ("$a1","$a2","$a3","$a4","$a5"){ $i++; # print "\$i is $i\n"; #print "\$var3 is $var3\n"; $tmp_label = $table->Label(-text => "$var3",-relief => "groove"); $table->put($var2,$i,$tmp_label); } } #print "\$var2 is $var2\n"; # print "1---\@arr2 is @arr2\n"; # print "\$arr2[1] is $arr2[1]\n"; # print "\$arr2[2] is $arr2[2]\n"; $selStmt->finish; $dbh->disconnect; } ##############push_button3开始####################### sub push_button3 { my $mw = MainWindow->new(-title => "disk monitor"); $frm_name1 = $mw -> Frame()->pack(-side=>"top",-command =>\&sub_fun3)-> pack(-side=>"left",-command =>\&sub_exp)-> pack(-side=>"left","FILESYstem","TYPE","SIZE#","6","AVAIL","7","USE","8","MOUNTED","9",-width => 22,-fill => 'both'); ##borderwidth 边框属性 $button_frame = $mw->Frame( -borderwidth => 4 )->pack(); $button_frame->Button(-text => "Exit",-height=>40) -> pack(-fill => 'both'); # #定义表格结束 # } ###############push_button3结束############################################# sub sub_exp{ my $dbname = 'dwh5'; my $dbUser = 'test'; my $dbUserPass = 'test'; $name1 = $ent1 -> get(); $name2 = $ent2 -> get(); $name3 = $ent3 -> get(); use HTTP::Date qw(time2iso str2time time2iso time2isoz); my $CurrTime = substr(time2iso(time()),10); # 当前时间 if ($name1 == ""){ $answer => $frm_name1->messageBox(-title => 'Please Reply',-message => '请输入主机名?',-type => 'YesNo',-icon => 'question',-default => 'yes'); undef $name1; }else{ my $dbname = 'dwh5'; my $dbUser = 'test'; my $dbUserPass = 'test'; my $dbh = DBI->connect("dbi:Oracle:$dbname",$dbUserPass) or die "can't connect to database "; #my $table_name= "$ARGV[0]"; $table_name="cpu_info"; my $hostsql = qq{select COLUMN_NAME from dba_tab_columns where table_name=upper('$table_name')}; my $UNLOAD_SRC_DBCONN = DBI->connect("DBI:Oracle:".$dbname,$dbUserPass) or die("DB connect error!n"); my $DW_DATA_DT =""; my $datafile="C:/$table_name${CurrTime}.TXT"; print "\$datfile is $datafile \n"; my @lstRlst1; my @lstRlst; my ($COLUMN_NAME); my $selStmt = $dbh->prepare($hostsql); $selStmt->bind_columns(undef,\$COLUMN_NAME); $selStmt->execute(); while( $selStmt->fetch() ){ print "$COLUMN_NAME\n"; push (@lstRlst1,$COLUMN_NAME); } $selStmt->finish; $dbh->disconnect; my @lstRlst = reverse (@lstRlst1); ########################################## #=================全局变量区==========================# sub printlog { my ($LogInfo)= @_; if(!defined($LogInfo) ){$LogInfo="";} my $StrLog="【${CurrTime}】 \t ${LogInfo} \n"; print $StrLog; #print LOGFILE $StrLog; } my $exportOraclesql="SELECT "; #数据导出的sql for (my $m=0;$m<@lstRlst + 0 ;$m++){ if ($m != @lstRlst + 0 - 1){ ##判断是否是最后一行,最后一行就不需要拼接,$exportOraclesql = "$exportOraclesql trim($lstRlst[$m])"."," } else{ $exportOraclesql = "$exportOraclesql trim($lstRlst[$m])"} print "$exportOraclesql\n"; } my $exportOraclesql="$exportOraclesql from $dbUser.$table_name"; sub Exportdata{ printlog "开始导出数据!"; my $exportsql=$exportOraclesql; my $exportsql="$exportsql where host='$name1' "; print "\$exportsql is $exportsql\n"; if($exportsql eq "error"){ return -1; } my $format_sql="alter session set nls_date_format='yyyy-mm-dd'"; my $stmt=$UNLOAD_SRC_DBCONN->prepare($format_sql); unless ($stmt){ printlog "\n执行prepare sql语句出错:\n"; printlog $DBI::errstr; return -1; } $stmt->execute; if ($UNLOAD_SRC_DBCONN->err) { printlog "\n执行sql语句出错:\n"; printlog $DBI::errstr; return -1; } $stmt=$UNLOAD_SRC_DBCONN->prepare($exportsql); unless ($stmt){ printlog "\n执行prepare sql语句出错:\n"; printlog $DBI::errstr; return -1; } $stmt->execute; if ($UNLOAD_SRC_DBCONN->err) { printlog "\n执行sql语句出错:\n"; printlog $DBI::errstr; return -1; } my $row=0; my $size=0; my $curtime; my $writeflagsql; my $tmpstr=""; $row=0; my $m=0; open(DATAFILE,">",$datafile) || die (print "Open DATA file Failed!!!\n"); while(my $Rows = $stmt->fetchrow_arrayref){ $m=0; $tmpstr=""; foreach(@$Rows){ $tmpstr=$tmpstr.$Rows->[$m]."|"; $m++; } #print DATAFILE $tmpstr.$DW_DATA_DT."\n"; print DATAFILE $tmpstr."\n"; $row++; if(($row%10000) == 0){ printlog "已导出数据$row条!"; } } $stmt->finish; # print FLAGFILE $datafile,"\n"; # print FLAGFILE $row,"\n"; close(DATAFILE); # close(FLAGFILE); $curtime=time2iso(time()); printlog "数据已成功导出!"; printlog "一共导出数据${row}条"; $answer => $frm_name1->messageBox(-title => 'Please Reply',-message => '数据已成功导出',-type => 'OK',-icon => 'question'); undef $name1; return 1; } Exportdata}} sub sub_fun3{ my $dbname = 'dwh5'; my $dbUser = 'test'; my $dbUserPass = 'test'; $name1 = $ent1 -> get(); $name2 = $ent2 -> get(); $name3 = $ent3 -> get(); if ($name1 == ""){ $answer => $frm_name1->messageBox(-title => 'Please Reply',-default => 'yes'); undef $name1; } foreach my $row (1 .. 100) { foreach my $col (1 .. 10) { $tmp_label = $table->Label(-text => "",-fill => 'both'); my $dbh = DBI->connect("dbi:Oracle:$dbname",$dbUserPass) or die "can't connect to database " ; my $hostsql = qq{select trim(HOST),trim(FILESYstem),trim(TYPE),trim(SIZE#),trim(USED),trim(AVAIL),trim(USE),trim(MOUNTED),'yyyy-mm-dd:Hh24:Mm:Ss') from cpu_info where host='$name1'}; @arr2=""; $var2=""; $tmp_label=""; $var3=""; $i=0; my ($a1,\$a5,\$a6,\$a7,\$a8,\$a9); $selStmt->execute(); while( $selStmt->fetch() ){ push (@arr2,"$a1\t$a2\t$a3\t$a4\t$a5\t$a6\t$a7\t$a8\t$a9\n" ); #循环取数组元素个数 $var2=@arr2 -1 ; $i=0; foreach $var3 ("$a1","$a5","$a6","$a7","$a8","$a9"){ $i++; # print "\$i is $i\n"; #print "\$var3 is $var3\n"; $tmp_label = $table->Label(-text => "$var3",$tmp_label); } } #print "\$var2 is $var2\n"; # print "1---\@arr2 is @arr2\n"; # print "\$arr2[1] is $arr2[1]\n"; # print "\$arr2[2] is $arr2[2]\n"; $selStmt->finish; $dbh->disconnect; } for my $sect_name (sort keys %section) { #按键排序,$sect_name表示键名 my $b; ##$WIDGET_F = $FRAME_L->Labelframe()->pack(qw/-side top -fill both -expand 1/); 标签框上布局 ##$f 框体 my $f = $WIDGET_F->Frame( ##background 按钮处于正常状态时候的背景颜色 -bg = -background -background => 'white',##指定按钮的3D效果 -relief => 'raised',-borderwidth => 1 ); ###Radiobutton 单选按钮 $sect_name键名 $b = $WIDGET_F->Radiobutton( -text => $sect_name,-indicatoron => 0,-value => $sect_name,-width => 25,# -bg => '#af1a3c6a6872',-bg =>'#87CEFA',##-foreground => color -fg => 'black',-command => sub { $_->packForget for @frames; $f->pack( -after => $b,qw/-side top -fill both -expand 1 -padx 1 -pady 1/ ); } )->pack(qw/-fill x -side top -padx 1 -pady 1/); ## $section{$sect_name} 将值付给数组,这里的$par_tmp就是1 2 3 4 5 6 7 8 9 # ## 访问hash数组元素 元素形式: $hash{'a'} for my $par_tmp (@{ $section{$sect_name} }) { #$fun='$sub_of{$par_tmp}'; $f->Button( -text => "$par_tmp",-relief => 'ridge',-bg => '#8189ce14cf5b',#-bg => 'white',##字体颜色 -fg => 'blue',##>$sub_of{$par_tmp} 就是引用,子entry调用 -command =>$sub_of{$par_tmp} )->pack(qw/-side top -fill x -padx 4 /); } push @frames,$f; push @button,$b; } $FRAME_L->Button( -text => "9-退出菜单",-relief => 'sunken',-borderwidth => 1,-bg => "#8189ce14cf5b",-fg => "black",-command => sub { exit; },)->pack(qw/-side bottom -fill x -padx 1 -pady 1 /); ; MainLoop;