加入收藏 | 设为首页 | Life家族 | SCMLife | RMLife | PMLife | SQALife | TESTLife | 企业VIP专区 | 中文化荣誉殿堂
 
 18 12
发新话题
打印

[原创] 分享自己写的rmview script( 此文章被查看:4387次,被回复:17篇!! )

分享自己写的rmview script

写了很久,也对这个script改了很久。还是想要贴到这里,和大家分享一下自己写的东西。如果写得还可以,大家帮忙鼓励一下,也让自己觉得作配置管理可以::em64::4::" /> 点。关于这个script,要谢谢木木,他之前写得rmview给了我很多启发。

另外,觉得要发一篇格式好的帖子对我来说好难啊,不太想用附件,但是从word贴过来的文字太乱了,还是穿了附件上来,附件是我自己的总结,多了script的流程图。
引用:

删除viewscript
1           Script描述环境:
OSWindows XP 繁体,预设地区为英文(美国),短时间格式为yyyy/mm/dd
CC2003.16.15
PerlActivePerl 5.8.8 Build 817
功能
1.       删除单独的view
2.       删除某台机器上的view
3.       清理register server。删除30天来未和register server通信的机器上的view;删除最近3个月以来未使用的view
实现语言:
Perl
2           Script UsageUsage: rm_view.pl [-single_view view_tag] | [-host host_name] | [-scrub registry_server]
3           Sub programsSub del_single_view:读入要删除的view tag,删除单独这个view
Sub del_views_on_host:读入要删除的机器名,寻找到该机器上存在的view,删除这些view
Sub scrub_server:读入要清理的register server。删除30天来未和register server通信的机器上的view;删除最近3个月以来未使用的view
Sub delete_view:读入view tag,删除这个view
Sub del_inactive_views:读入view tag,判断是否最近3个月来未曾使用,“yes”删除,“no”不删除。
Sub ping_host:读入机器名,ping 机器,成功返回1,否则返回0
4           Script Code
引用:


#########################################################################
# Purpose: 1.remove a single view
#        2.remove all views in the certain host
#        3.scrub the views that have not been used since 30 days
# Usage: rm_view.pl [-single_view view_tag] | [-host host_name] | [-scrub registry_server]
# Author: Kerry
# Date: 29-Dec-2006
#########################################################################
  
#!/usr/bin/perl -w
use Net::Ping;

$usage = "Usage:rm_view.pl [-single_view view_tag]|[-host host_name]|[-scrub registry_server]";

@month = qw/Jan Feb Mar Apr May Jur Jul Aug Sep Oct Nov Dec/;

if ($ARGV[0] eq "-single_view"){
        &del_single_view;
}elsif ($ARGV[0] eq "-host"){
        &del_views_on_host;
}elsif($ARGV[0] eq "-scrub"){
        &scrub_server;
}else{
        print $usage;
}

shift @ARGV;

#      $del_single_view;
sub del_single_view{
        die "Please input a view!\n$usage\n" unless $ARGV[1];
        my $view_tag = $ARGV[1];
        
        print "***Remove the view $view_tag***\n";
        system("pause");
        &delete_view($view_tag);
}

#delete all views existing on a certain host
sub del_views_on_host{
        die "Please input a host!\n$usage\n" unless $ARGV[1];
        my $host_name=$ARGV[1];
        
        # find all views existing in the certain host
        my @exit_views=`cleartool lsview|findstr \/I \\\\$host_name\\`;

        foreach $exit_views (@exit_views){
                my ($view)=(split /\s+/,$exit_views)[1];
                print "***Delete the view $view***\n";
                system("pause");
                &delete_view($view);
        }
}

# scrub rgy server and delete all views that have not been used since 30 days
sub scrub_server{
        die "Please input a server!\n$usage\n" unless $ARGV[1];
        $rgy_server=$ARGV[1];
               
        # get valid clients
        my @valid_clients=`cleartool lsclient -host $rgy_server -type all -short`;
        foreach $valid_clients (@valid_clients){
                chomp $valid_clients;
        }
        
        # get all views on the registry server
        my @views=`cleartool lsview`;
        my @clients;
        foreach $views (@views){
                $_=(split /\s+/, $views)[2];
                @clients=(@clients,(split /\\/,$_)[2]);
        }

        # Match clients
        # Delete all views exiting on clients which have not contacted with
        # server since the lastest 30 days.
        my $i=0;
        @invalid_clients=@clients;
        while($i<=$#valid_clients){
                @invalid_clients=grep !/$valid_clients[$i]/i, @invalid_clients;
                $i++;
        }
        @invalid_clients=sort @invalid_clients;
        print @invalid_clients;
        if(@invalid_clients){
                push @invalid_clients,"null";
                foreach my $j (0..$#invalid_clients-1){
                        unless($invalid_clients[$j]=~/$invalid_clients[$j+1]/i){
                                my @views=`cleartool lsview|findstr \/I \\\\$invalid_clients[$j]\\`;
                                my $view;
                                foreach $views (@views){
                                        $view=(split /\s+/,$views)[1];
                                        print "***Delete the view $view***\n";
                                        system("pause");
                                        &delete_view($view);
                                }
                        }              
                }
        }else{
                print "***All clients are active.***\n";
        }
        
        # Find views that have not been used since the latest 3 months.
        foreach $valid_clients (@valid_clients){
                my @views=`cleartool lsview|findstr \/I \\\\$valid_clients\\`;
                my $view;
                foreach $views (@views){
                        $view=(split /\s+/,$views)[1];
                        &del_inactive_views($view);
                }
        }
}

# use rmview to delete the view.
sub delete_view{
        my $view_detail=`cleartool lsview -long @_`;
        print "$view_detail\n";
        my ($view,$path,$host,$uuid)=(split /\n/,$view_detail)[0,1,2,5];
        $view=(split /:/,$view)[1];
        $path=(split /:/,$path)[1];
        $host=(split /:\s/,$host)[1];
        $uuid=(split /uuid:/,$uuid)[1];
        
        # delete the view
        if(&ping_host($host)){
                system("cleartool endview -server $view");
                system("cleartool rmview $path");
        }else{
                system("cleartool unregister -view -uuid $uuid");
                system("cleartool rmtag -view $view");
        }
}

# Delete all views that hasn't been used since the lastest 3 months.
sub del_inactive_views{
        # Find the view that hasn't been used since the lastest 3 months.
        # List view's last accessed time.
        my $view_detail=`cleartool lsview -long -properties @_`;
        my ($view,$uuid,$accessed)=(split /\n/,$view_detail)[0,5,13];
        
        my $i,$valid_date,$date;
        if($accessed){
                $view=(split /:/,$view)[1];
                $uuid=(split /uuid:/,$uuid)[1];
                $accessed=(split /-/,(split /\s/,$accessed)[2])[1];
                $date=localtime();
                $date=(split /\s/,$date)[1];
               
                # Match the time
               
                for($i=0;$i<@month;$i++){
                        if ($accessed eq $month[$i]){
                                last;
                        }
                }

                if($i<=8){
                        $valid_date= grep /$date/i,@month[$i..$i+3];
                }elsif($i==9){
                        $valid_date= grep /$date/i,@month[$i,$i+1,$i+2,$i-9];
                }elsif($i==10){
                        $valid_date= grep /$date/i,@month[$i,$i+1,$i-10,$i-9];
                }else{
                        $valid_date= grep /$date/i,@month[$i,$i-11,$i-10,$i-9];
                }
#              print "$valid_date\n";
               
                # Unregister the view and remove the view tag.
                unless($valid_date){
                        print "***Delete the view $view***\n";
                        system("pause");
                        system("cleartool unregister -view -uuid $uuid");
                        system("cleartool rmtag -view $view");
                }
        }
}

sub ping_host{
        $p = Net::Ping->new();
        return 1 if $p->ping(@_);
        $p->close();
        return 0;
}


5           Disadvantage & ReportRmview.plsub srube_server还有可以改进的地方,这个sub program执行的效率不高。实际执行中register server上存在221view,共历时1小时将所有view清理一遍,(中间有我按pause的总计大概10分钟),共找出383个月内未使用的view030天内未活动的机器,18台机器cc无法取得albd通信或view server通信失败报错。这个sub program中调用cc lsview的地方太多,可以在最初的调用中就用arraycc lsview输出的结果保存,后续的程序可以对这个原始的array进行数据处理,剥离出需要的信息,而不必再次调用cc lsview,这样的话scrub_server的效率会提高很多。这个改进我会在以后的日子进行修改。这次暂时做到这步。




[ 本帖最后由 jo-kerry 于 2006-12-29 15:51 编辑 ]

附件

rmview_design.rar (136.83 KB, 2006-12-29 15:48)

关于附件奖励, 下载次数 42, 使用阶层: 中级 , 推荐星级: ★★★★★ , 出售价格: 10 金钱 , 你的购买价格: 10 金钱,【快速获取积分




© 本文为 jo-kerrySCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

写得不错,有耐心。
值得学习。



© 本文为 晓筱SCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

偶要学的东西太多了



© 本文为 liuke_123SCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

先给掌声,再下载下来测试一下先。

© 本文为 singwa 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

下来学习学习。老板也要用CC了,尽量让CC傻瓜一点。
这样被批评的机会少一点。

© 本文为 sheng2006 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

已经下载,测试中,多谢楼主

© 本文为 gjhna 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

谢谢了,虽然现在对这个脚本的没有多大需求,但是还是收藏了,谢过了。

© 本文为 tuohz 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

大家测试以后有什么问题的,可以跟帖说明,我会尽量调整这个script。

© 本文为 jo-kerry 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

谢谢LZ,一直考虑这个功能下来看看。上班后测试一下

© 本文为 风信子 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员
梦想是最遥远的旅行~~~

TOP

不错

不错,很厉害阿,我就不愿写脚本,宁可手动利用命令直接执行!

© 本文为 tester 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

 18 12
发新话题