summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2009-12-16 11:50:23 -0800
committerStephen Hemminger <stephen.hemminger@vyatta.com>2009-12-16 12:05:03 -0800
commit9eeced54732df964e0008fc738c12e8a599a1e89 (patch)
tree116781b2d08a47a258cc53f67aea01315759c1b5
parent4547b8b6abad28ba3cb15091d83534f1b2c20fdf (diff)
downloadvyatta-cfg-9eeced54732df964e0008fc738c12e8a599a1e89.tar.gz
vyatta-cfg-9eeced54732df964e0008fc738c12e8a599a1e89.zip
Fix DHCP command handling
This fixes Bug 3917 by checking for interface current state rather than configuration state. Also changed variable names and command arguments to improve clarity. Instead of --op_command="dhcp-renew" use "--dhcp renew".
-rwxr-xr-xscripts/vyatta-interfaces.pl70
1 files changed, 39 insertions, 31 deletions
diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl
index 0ae5330..a496e66 100755
--- a/scripts/vyatta-interfaces.pl
+++ b/scripts/vyatta-interfaces.pl
@@ -47,9 +47,9 @@ use warnings;
my $dhcp_daemon = '/sbin/dhclient';
-my ($eth_update, $eth_delete, $addr_set, @addr_commit, $dev, $mac, $mac_update, $op_dhclient);
+my ($eth_update, $eth_delete, $addr_set, @addr_commit, $dev, $mac, $mac_update);
my ($check_name, $show_names, $intf_cli_path, $vif_name, $warn_name);
-my ($check_up, $show_path);
+my ($check_up, $show_path, $dhcp_command);
my @speed_duplex;
sub usage {
@@ -77,7 +77,7 @@ GetOptions("eth-addr-update=s" => \$eth_update,
"dev=s" => \$dev,
"valid-mac=s" => \$mac,
"set-mac=s" => \$mac_update,
- "op-command=s" => \$op_dhclient,
+ "dhcp=s" => \$dhcp_command,
"check=s" => \$check_name,
"show=s" => \$show_names,
"vif=s" => \$vif_name,
@@ -93,7 +93,7 @@ is_valid_addr_set($addr_set, $dev) if ($addr_set);
is_valid_addr_commit($dev, @addr_commit) if (@addr_commit);
is_valid_mac($mac, $dev) if ($mac);
update_mac($mac_update, $dev) if ($mac_update);
-op_dhcp_command($op_dhclient, $dev) if ($op_dhclient);
+dhcp($dhcp_command, $dev) if ($dhcp_command);
is_valid_name($check_name, $dev) if ($check_name);
exists_name($dev) if ($warn_name);
show_interfaces($show_names) if ($show_names);
@@ -200,48 +200,45 @@ sub dhcp_update_config {
dhcp_write_file($conf_file, $output);
}
+# Is interface disabled in configuration (only valid in config mode)
sub is_intf_disabled {
my $name = shift;
my $intf = new Vyatta::Interface($name);
-
$intf or die "Unknown interface name/type: $name\n";
- # only do this if script run from config mode
- if (!defined $op_dhclient) {
- my $config = new Vyatta::Config;
- $config->setLevel($intf->path());
+ my $config = new Vyatta::Config;
+ $config->setLevel($intf->path());
- return $config->exists("disable");
- }
- return 0;
+ return $config->exists("disable");
}
-
sub run_dhclient {
my $intf = shift;
my ($intf_config_file, $intf_process_id_file, $intf_leases_file)
= generate_dhclient_intf_files($intf);
dhcp_update_config($intf_config_file, $intf);
- if (!(is_intf_disabled($intf))) {
- my $cmd = "$dhcp_daemon -pf $intf_process_id_file -x $intf 2> /dev/null; rm -f $intf_process_id_file 2> /dev/null;";
- $cmd .= "$dhcp_daemon -q -nw -cf $intf_config_file -pf $intf_process_id_file -lf $intf_leases_file $intf 2> /dev/null &";
- # adding & at the end to make the process into a daemon immediately
- system ($cmd) == 0
+
+ return is_intf_disabled($intf);
+
+ my $cmd = "$dhcp_daemon -pf $intf_process_id_file -x $intf 2> /dev/null; rm -f $intf_process_id_file 2> /dev/null;";
+ $cmd .= "$dhcp_daemon -q -nw -cf $intf_config_file -pf $intf_process_id_file -lf $intf_leases_file $intf 2> /dev/null &";
+ # adding & at the end to make the process into a daemon immediately
+ system ($cmd) == 0
or warn "start $dhcp_daemon failed: $?\n";
- }
}
sub stop_dhclient {
my $intf = shift;
- if (!(is_intf_disabled($intf))) {
- my ($intf_config_file, $intf_process_id_file, $intf_leases_file)
- = generate_dhclient_intf_files($intf);
- my $release_cmd = "$dhcp_daemon -q -cf $intf_config_file -pf $intf_process_id_file -lf $intf_leases_file -r $intf 2> /dev/null;";
- $release_cmd .= "rm -f $intf_process_id_file 2> /dev/null";
- system ($release_cmd) == 0
+
+ return if is_intf_disabled($intf);
+
+ my ($intf_config_file, $intf_process_id_file, $intf_leases_file)
+ = generate_dhclient_intf_files($intf);
+ my $release_cmd = "$dhcp_daemon -q -cf $intf_config_file -pf $intf_process_id_file -lf $intf_leases_file -r $intf 2> /dev/null;";
+ $release_cmd .= "rm -f $intf_process_id_file 2> /dev/null";
+ system ($release_cmd) == 0
or warn "stop $dhcp_daemon failed: $?\n";
- }
}
sub update_eth_addrs {
@@ -447,18 +444,27 @@ sub is_valid_addr_commit {
exit 0;
}
-sub op_dhcp_command {
- my ($op_command, $intf) = @_;
+# Is interface currently in admin down state?
+sub is_intf_down {
+ my $name = shift;
+ my $intf = new Vyatta::Interface($name);
+
+ return 1 unless $intf;
+ return ! $intf->up();
+}
+
+sub dhcp {
+ my ($request, $intf) = @_;
die "$intf is not using DHCP to get an IP address\n"
unless is_dhcp_enabled($intf);
die "$intf is disabled. Unable to release/renew lease\n"
- if is_intf_disabled($intf);
+ if is_intf_down($intf);
my $tmp_dhclient_dir = '/var/run/vyatta/dhclient/';
my $release_file = $tmp_dhclient_dir . 'dhclient_release_' . $intf;
- if ($op_command eq "dhcp-release") {
+ if ($request eq "release") {
die "IP address for $intf has already been released.\n"
if (-e $release_file);
@@ -466,10 +472,12 @@ sub op_dhcp_command {
stop_dhclient($intf);
mkdir ($tmp_dhclient_dir) if (! -d $tmp_dhclient_dir );
touch ($release_file);
- } elsif ($op_command eq "dhcp-renew") {
+ } elsif ($request eq "renew") {
print "Renewing DHCP lease on $intf ...\n";
run_dhclient($intf);
unlink ($release_file);
+ } else {
+ die "Unknown DHCP request: $request\n";
}
exit 0;