#!/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; } }