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