Sophie

Sophie

distrib > Mandriva > 2006.0 > x86_64 > by-pkgid > ff3ee324c0567e1c25614ef618e7dd7f > files > 13

clusterautosetup-2.1-5mdk.src.rpm

#!/usr/bin/perl -w
#
#Thinks to :
# Fabrice Coudert <zab_@gmx.net>
# steffen@dett.de
#Version 1.3
#Change:
#1.3
# Majour change, really sound support with -b
#1.2
# Major bug fixe
#1.1
# Bug fixe
#1.0
# Bug fixe
#
use strict;

my $nodename;
my $startnode;
my $esc = chr(27);

#
sub usage {
    die "$0 [-C conffile] [-l | -a MAC | -d MAC]
    -l          : list les nodes
    -a MAC      : ajoute la node MAC
    -d MAC      : supprime la node MAC
    -C conffile : specifie le fichier de conf (par defaut /etc/dhcpd.conf)
    -s          : sauvegarde les modifications
    -b		: beep mode engaged ! Don`t work very well with X
    ";
}
#
use Getopt::Std;
getopts("C:bla:d:s") || usage;
use vars qw($opt_C $opt_l $opt_a $opt_b $opt_d $opt_s);

my $conffile = ($opt_C) ? "$opt_C" : "/etc/dhcpd.conf";

my $conf = `cat $conffile`;

# J'extrait le $nodename depuis /etc/clusterserver.conf
my $line;
open CONF, "/etc/clusterserver.conf";


sub beep($$) {
    my $freq = shift;
    my $ms   = shift;

    if ( $freq < 1 ) {
        $freq = 1;
    }

    if ( $freq > 20000 ) {    #20 khz
        $freq = 20000;
    }
    if ( $ms < 1 ) {
        $ms = 1;
    }
    if ( $ms > 10000 ) {      #10 sec
        $ms = 10000;
    }

    print $esc . "[10;" . $freq . "]",    #set freq
      $esc . "[11;" . $ms . "]",          #set delay
      chr(7),                             #beep (ascii bell)
      $esc, "[10]",                       #reset freq
      $esc, "[11]";                       #reset delay

    select( undef, undef, undef, ( $ms / 1000 ) );
}



#Parsing /etc/clusterserver.conf
while ( defined( $line = <CONF> ) ) {
    if ( $line =~ /^NODENAME="(\S+)"\s+/ ) {
        $nodename = $1;
    }
    if ( $line =~ /^STARTNODE="(\S+)"\s+/ ) {
        $startnode = $1;
    }
}
close CONF;
if ( !( defined $nodename ) ) {
    print "Can't parse /etc/clusterserver.conf\n";
}

# extrait le: bloc NODE_LIST
my ($nodes_bloc) =
  ( $conf =~ /# TAG: NODE_LIST_BEGIN(.*?)# TAG: NODE_LIST_END/s );
die "unable to find NODE_LIST section" if ( !$nodes_bloc );

# extrait les blocs nodes
my @nodes = ( $nodes_bloc =~ /(host $nodename\S+\s*{.*?\s*})/gs );

# parse les blocs nodes
my @mac_addr = ();
foreach my $node (@nodes) {
    $node =~
      /host $nodename(\d*)\s*{.*?ethernet (.*?)\s*;\s*.*fixed-address (.*?);/s;

    next if ( $opt_d && $2 eq $opt_d );    ## pour supprimer une node

    #I put every char in lower case
    my $minuscule = $2;
    $minuscule =~ s/(\S)/\L$1/gi;
    push @mac_addr, $minuscule;
}

#I put every char in lower case
if ( defined $opt_a ) {
    $opt_a =~ s/(\S)/\L$1/gi;
}
if ( defined $opt_d ) {
    $opt_d =~ s/(\S)/\L$1/gi;
}

#Je test sur l'adresse a ajouter
#si c'est une adresse MAC

if ($opt_a) {
    my $test = $opt_a;
    if ( !( $test =~ /\S:\S\S:\S\S:\S\S:\S\S:\S\S/ ) ) {
        print "$opt_a is NOT a valide MAC addresse !\n";
        die;
    }
    undef $test;

}

# si elle existe deja
if ($opt_a) {
    foreach (@mac_addr) {
        if ( $_ eq $opt_a ) {
            $opt_a = undef;
            exit;
        }
    }
}

# pour ajouter une node
push @mac_addr, $opt_a if ($opt_a);

# liste les nodes
my $node_nbre = $startnode;
if ($opt_l) {
    my $node_nbre = $startnode;
    print "Node  n°        MAC\n";
    for ( my $i = 0 ; $i < scalar(@mac_addr) ; $i++ ) {
        print sprintf( "%4d       %s \n", $node_nbre, $mac_addr[$i] );
        $node_nbre++;
        $startnode++;
    }
}

# sauvegarde les modifs si -a ou -d
if ( $opt_a || $opt_d ) {
    $nodes_bloc = "";
    my $node_nbre = $startnode;
    for ( my $i = 0 ; $i < scalar(@mac_addr) ; $i++ ) {
        $nodes_bloc .= "host ";
        $nodes_bloc .= $nodename . $node_nbre;
        $nodes_bloc .= "{
   hardware ethernet $mac_addr[$i];
   fixed-address ";
        $nodes_bloc .= $nodename . $node_nbre;
        $nodes_bloc .= ";\n}\n";
        $node_nbre++;
    }
    $conf =~
s/# TAG: NODE_LIST_BEGIN.*?# TAG: NODE_LIST_END/# TAG: NODE_LIST_BEGIN\n$nodes_bloc# TAG: NODE_LIST_END/s;

    #print $conf; exit;
    if ($opt_s) {
        open CONF, ">$conffile" or die "Can't write change in $conffile\n";
        print CONF $conf;
        close CONF;
    }
    1;

    if ($opt_b) {
        my $bufmode = $|;
        $| = 1;

        for ( my $n = 0 ; $n < 200 ; $n++ ) {
            beep( $n * 5, 10 );
        }
        $| = $bufmode;
    }
}