diff options
author | Bob Gilligan <gilligan@vyatta.com> | 2010-05-26 16:11:36 -0700 |
---|---|---|
committer | Bob Gilligan <gilligan@vyatta.com> | 2010-05-26 16:11:36 -0700 |
commit | 74105f39b3646c12c0dfed647c7fd9922cdd864e (patch) | |
tree | a5e63ce37d25d4bdb12cf0c5aa5f7dfa40014d61 /scripts | |
parent | fcc3a7c4d5465022a9f7092fc5d335a44e4211e4 (diff) | |
download | vyatta-cfg-system-74105f39b3646c12c0dfed647c7fd9922cdd864e.tar.gz vyatta-cfg-system-74105f39b3646c12c0dfed647c7fd9922cdd864e.zip |
Move DHCPv6 client configuration to this package and restructre parameters.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/vyatta-dhcpv6-client.pl | 157 | ||||
-rwxr-xr-x | scripts/vyatta-interfaces.pl | 9 |
2 files changed, 165 insertions, 1 deletions
diff --git a/scripts/vyatta-dhcpv6-client.pl b/scripts/vyatta-dhcpv6-client.pl new file mode 100644 index 00000000..c1a0dbd3 --- /dev/null +++ b/scripts/vyatta-dhcpv6-client.pl @@ -0,0 +1,157 @@ +#!/usr/bin/perl +# +# Module: vyatta-dhcpv6-client.pl +# +# **** License **** +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# This code was originally developed by Vyatta, Inc. +# Portions created by Vyatta are Copyright (C) 2005-2009 Vyatta, Inc. +# All Rights Reserved. +# +# Author: Bob Gilligan <gilligan@vyatta.com> +# Date: April 2010 +# Description: Start and stop DHCPv6 client daemon for an interface. +# +# **** End License **** +# +# + +use strict; +use lib "/opt/vyatta/share/perl5/"; +use FileHandle; +use Vyatta::Config; +use Getopt::Long; + +my $start_flag; # Start the daemon +my $stop_flag; # Stop the daemon and delete all config files +my $release_flag; # Stop the daemon, but leave config file +my $renew_flag; # Re-start the daemon. Functionally same as start_flag +my $temp_flag; +my $params_only_flag; +my $ifname; + + +sub gen_conf_file { + my ($conffile, $ifname) = @_; + + my $FD_WR = new FileHandle; + + if (!open($FD_WR, ">$conffile")) { + printf("Can't write config file: $conffile\n"); + exit 1; + } + my $date = `date`; + my $user = `id -un`; + my $hostname = `hostname`; + chomp($date); + chomp($user); + chomp($hostname); + + print $FD_WR "# This file was auto-generated by the Vyatta\n"; + print $FD_WR "# configuration sub-system. Do not edit it.\n"; + print $FD_WR "\n"; + print $FD_WR "# Generated on $date by $user\n"; + print $FD_WR "#\n"; + print $FD_WR "interface \"$ifname\" {\n"; + print $FD_WR " send host-name \"$hostname\";\n"; + print $FD_WR " send dhcp6.oro 1, 2, 7, 12, 13, 23, 24, 39;\n"; + print $FD_WR "}\n"; +} + + +# +# Main Section +# + +GetOptions("start" => \$start_flag, + "stop" => \$stop_flag, + "release" => \$release_flag, + "renew" => \$renew_flag, + "temporary" => \$temp_flag, + "parameters-only" => \$params_only_flag, + "ifname=s" => \$ifname, + ); + +if ((defined $temp_flag) && (defined $params_only_flag)) { + printf("Error: --temporary and --parameters-only flags are mutually exclusive.\n"); + exit 1; +} + +if (!defined $ifname) { + printf("Error: Interface name must be specified with --ifname parameter.\n"); + exit 1; +} + +my $pidfile = "/var/lib/dhcp3/dhclient_v6_$ifname.pid"; +my $leasefile = "/var/lib/dhcp3/dhclient_v6_$ifname.leases"; +my $conffile = "/var/lib/dhcp3/dhclient_v6_$ifname.conf"; +my $cmdname = "/sbin/dhclient"; + +if (defined $release_flag) { + if (! -e $conffile) { + printf("DHCPv6 client is not configured on interface $ifname.\n"); + exit 1; + } + + if (! -e $pidfile) { + printf("DHCPv6 client is already released on interface $ifname.\n"); + exit 1; + } +} + +if (defined $renew_flag) { + if (! -e $conffile) { + printf("DHCPv6 client is not configured on interface $ifname.\n"); + exit 1; + } +} + +if (defined $stop_flag || defined $release_flag) { + # Stop dhclient -6 on $ifname + + printf("Stopping daemon...\n"); + my $output=`$cmdname -6 -nw -cf $conffile -pf $pidfile -lf $leasefile -r $ifname`; + printf($output); + + # Delete files it leaves behind... + printf("Deleting related files...\n"); + unlink($pidfile); + if (defined $stop_flag) { + # If just releasing, leave the config file around as a flag that + # DHCPv6 remains configured on this interface. + unlink($conffile); + } +} + +if (defined $start_flag || defined $renew_flag) { + # Generate the DHCP client config file... + gen_conf_file($conffile, $ifname); + + # First, kill any previous instance of dhclient running on this interface + # + printf("Stopping old daemon...\n"); + my $output = `$cmdname -6 -pf $pidfile -x $ifname`; + printf($output); + + # start "dhclient -6" on $ifname + + my $args = ""; + if (defined $temp_flag) { + $args .= " -T"; + } + if (defined $params_only_flag) { + $args .= " -S"; + } + + printf("Starting new daemon...\n"); + my $output=`$cmdname -6 -nw -cf $conffile -pf $pidfile -lf $leasefile $args $ifname`; + printf($output); +} diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl index 90d8dfc7..42ffc7d8 100755 --- a/scripts/vyatta-interfaces.pl +++ b/scripts/vyatta-interfaces.pl @@ -356,6 +356,13 @@ sub is_valid_addr_set { exit 0; } + if ($addr_net eq "dhcpv6") { + die "Error: can't use dhcpv6 client on loopback interface\n" + if ($intf eq "lo"); + + exit 0; + } + my ($addr, $net); if ($addr_net =~ m/^([0-9a-fA-F\.\:]+)\/(\d+)$/) { $addr = $1; @@ -423,7 +430,7 @@ sub is_valid_addr_commit { $dhcp = 1; } else { my $version = is_ip_v4_or_v6($addr); - if ($version == 4) { + if (defined($version) && $version == 4) { $static_v4 = 1; } } |