Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

netswap.pl

by malloc (Pilgrim)
on Jun 01, 2001 at 23:59 UTC ( [id://85051]=sourcecode: print w/replies, xml ) Need Help??
Category: linux/networking
Author/Contact Info malloc Daniel Kelemen dan@ajvar.org
Description: This little script swaps out all of your linux network parameters based upon the contents of a configuration file, the structure of which is shown in the pod. It is intended mostly for use by people who use linux on a laptop, and frequently hop between networks where they have static IP's, as I do often, so i just keep a config file for each network. It works fine for me, and I hope some others will find it useful. Please feel free to comment on it, especially style/coding practices. Thanks for lookin, --malloc
#! /usr/bin/perl -i

=head1 NAME 

netswap.pl

=head1 AUTHOR 

Daniel Kelemen
 
=head1 SYNOPSIS

netswap.pl [FILENAME]-

    Scan the configuration file and setup local 
networking parameters based upon contents.

nconf files should be of form:

  hostname:   foo
  domainname: bar.com
  ip:         192.168.16.42
  subnetmask: 255.255.0.0
  gateway:    192.168.1.1
  dns:        192.168.2.1

=head1 DESCRIPTION

Switch local network parameters

=cut

my $line = my $param_name = my $param_val = "";
my $filename = shift || die "Usage: netswap.pl CONFILENAME\n";
open(FH,"$filename") || die "Could not open network configuration file
+: [$filename] for reading.\n";
while(<FH>){
    $line = $_;
    next unless ($line !~ m/^\s*$/) or ($line !~ m/^\s*\#/);
    $line =~ m/^(.*):(.*)$/;
    $param_name = $1;
    $param_val = $2;
    $param_name =~ s/^\s*//g;
    $param_name =~ s/\s*$//g;
    $param_val =~ s/^\s*//g;
    $param_val =~ s/\s.*$//g;
    ${$param_name} = $param_val;
}
close FH;
print "new hostname = [$hostname]\nnew domainname = [$domainname]\nnew
+ ip = [$ip]\nnew Subnet Mask = [$subnetmask]\nnew DNS = [$dns]\nnew g
+ateway = [$gateway]\n";

# We do /etc/hosts:
my %pass = ("^.*$hostname.*" => "$ip\t$hostname.$domainname\t$hostname
+"); # Replace the whole line for this hostname.
file_edit("/etc/hosts",\%pass);

# We do /etc/sysconfig/network:
%pass = ("^GATEWAY.*" => "GATEWAY=\"$gateway\"","^HOSTNAME.*" => "HOST
+NAME=\"$hostname\"","^DOMAINNAME.*" => "DOMAINNAME=\"$domainname\"");
file_edit("/etc/sysconfig/network",\%pass);

# We do /etc/sysconfig/network-scripts/ifcfg-eth0;
%pass =  ("^IPADDR.*" => "IPADDR=\"$ip\"","^NETMASK.*" => "NETMASK=\"$
+subnetmask\""); file_edit("/etc/sysconfig/network-scripts/ifcfg-eth0"
+,\%pass);

# We do the /etc/resolv.conf:
%pass = ("^nameserver.*" => "nameserver $dns","^SEARCH.*" => "SEARCH $
+domainname");
file_edit("/etc/resolv.conf",\%pass);

`/etc/init.d/network restart`; # FIN

########################file_edit###################

=head1 file_edit(@)

accepts: list containing filename to edit as first item,
hash reference as second item.  Hash should contain search expressions
as keys, replacement expressions as values.  eg.

    file_edit("/etc/hosts",(foo => bar));

will replace all occurrences of 'foo' with 'bar' in /etc/hosts.

=cut

sub file_edit(@) {
    my $filename = shift;
    my $hash_ref = shift;
    my %lines = %$hash_ref;
    die "File [$filename] cannot be found!\n" unless (-e $filename);
    @ARGV = ($filename); # put the filename where perl can find it.
    while(<>){ 
 $line = $_;
 foreach $search (keys %lines){
     if ($line =~ m/$search/i) { # not sure about insensitivity here.
  $line =~ s/$search/$lines{$search}/ig;
     }
 }
 print $line;
    } # End while line read for file

} # End file_edit.
Replies are listed 'Best First'.
Re: netswap.pl (style/coding comments)
by OeufMayo (Curate) on Jun 04, 2001 at 02:16 UTC

    malloc asked for comments about his style/coding practices, and I saw his useful netswap.pl program as a good exercise for a code/style review (not golf!).
    I'm not claiming that the proposed code is perfect nor the original code is bad (in fact, I really like the use of the -i switch to edit files in a convenient way in a program), but I hope to give some hints on how can one use perlish features to improve code.

Re: netswap.pl
by Anonymous Monk on Jun 02, 2001 at 00:49 UTC
    Only comment i have is that you don't really need the if ($line =~ m/$search/i) { in file_edit(). I'm sure things will work out just fine if you just use s/$search/$lines{$search}/ig; without that if..

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: sourcecode [id://85051]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2024-04-19 22:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found