summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStig Thormodsrud <stig@vyatta.com>2010-05-28 17:43:48 -0700
committerStig Thormodsrud <stig@vyatta.com>2010-05-28 17:43:48 -0700
commit117041e7a7495dfdade0f4c94f38a5fcb1bda7b2 (patch)
tree9e4800b798f85986de0365a0c853b26ba0165fc6
parentb1f7a5e6af6614935d608cd52bc7df7eb8e074b2 (diff)
parentce660cba1408ac05795b19bc5adaf605b470c34f (diff)
downloadvyatta-op-117041e7a7495dfdade0f4c94f38a5fcb1bda7b2.tar.gz
vyatta-op-117041e7a7495dfdade0f4c94f38a5fcb1bda7b2.zip
Merge branch 'larkspur' of http://git.vyatta.com/vyatta-op into larkspur
-rw-r--r--Makefile.am4
-rw-r--r--debian/changelog48
-rw-r--r--debian/control1
-rw-r--r--scripts/dhcpv6-client-show-leases.pl211
-rw-r--r--scripts/rename-image.pl108
-rw-r--r--scripts/show-image-storage.pl66
-rwxr-xr-xscripts/vyatta-boot-image.pl73
-rwxr-xr-xscripts/vyatta-show-interfaces.pl4
-rw-r--r--templates/release/dhcpv6/interface/node.def2
-rw-r--r--templates/release/dhcpv6/interface/node.tag/node.def10
-rw-r--r--templates/release/dhcpv6/node.def1
-rw-r--r--templates/rename/node.def1
-rw-r--r--templates/rename/system/image/node.def1
-rw-r--r--templates/rename/system/image/node.tag/node.def6
-rw-r--r--templates/rename/system/image/node.tag/node.tag/node.def7
-rw-r--r--templates/rename/system/node.def1
-rw-r--r--templates/renew/dhcpv6/interface/node.def1
-rw-r--r--templates/renew/dhcpv6/interface/node.tag/node.def10
-rw-r--r--templates/renew/dhcpv6/node.def1
-rw-r--r--templates/show/dhcpv6/client/leases/node.def3
-rw-r--r--templates/show/dhcpv6/client/node.def1
-rw-r--r--templates/show/interfaces/input/detail/node.def2
-rw-r--r--templates/show/interfaces/input/node.def2
-rw-r--r--templates/show/interfaces/input/node.tag/brief/node.def2
-rw-r--r--templates/show/interfaces/input/node.tag/node.def3
-rw-r--r--templates/show/system/image/storage/node.def3
-rw-r--r--templates/show/system/image/version/node.def2
27 files changed, 562 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am
index 7174493..67ae860 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -23,6 +23,10 @@ bin_SCRIPTS += scripts/show-dhcp-leases.pl
bin_SCRIPTS += scripts/vyatta-boot-image.pl
bin_SCRIPTS += scripts/vyatta-sudo
bin_SCRIPTS += scripts/vyatta-show-snmp.pl
+bin_SCRIPTS += scripts/rename-image.pl
+bin_SCRIPTS += scripts/show-image-storage.pl
+
+sbin_SCRIPTS = scripts/dhcpv6-client-show-leases.pl
bin_sudo_users_SCRIPTS = scripts/vyatta-identify-interface.pl
bin_sudo_users_SCRIPTS += scripts/vyatta-delete-log-file.sh
diff --git a/debian/changelog b/debian/changelog
index 00bfea3..e8b9ea0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,51 @@
+vyatta-op (0.13.65) unstable; urgency=low
+
+ * Move DHCPv6 client op-mode commands to this package.
+
+ -- Bob Gilligan <gilligan@vyatta.com> Wed, 26 May 2010 16:35:33 -0700
+
+vyatta-op (0.13.64) unstable; urgency=low
+
+ * Don't allow the currently running image to be renamed.
+
+ -- Bob Gilligan <gilligan@vyatta.com> Thu, 20 May 2010 10:47:05 -0700
+
+vyatta-op (0.13.63) unstable; urgency=low
+
+ * UNRELEASED
+
+ -- Bob Gilligan <gilligan@vyatta.com> Fri, 30 Apr 2010 17:51:27 -0700
+
+vyatta-op (0.13.62) unstable; urgency=low
+
+ * Add "show system image storage" op mode command.
+
+ -- Bob Gilligan <gilligan@vyatta.com> Fri, 30 Apr 2010 17:50:24 -0700
+
+vyatta-op (0.13.61) unstable; urgency=low
+
+ * Added an op-mode command to rename a system image.
+
+ -- Bob Gilligan <gilligan@vyatta.com> Fri, 30 Apr 2010 15:54:37 -0700
+
+vyatta-op (0.13.60) unstable; urgency=low
+
+ * Bugfix 5549: Use proper prompt string when deleting image.
+
+ -- Bob Gilligan <gilligan@vyatta.com> Mon, 26 Apr 2010 12:26:53 -0700
+
+vyatta-op (0.13.59) unstable; urgency=low
+
+ * Add Input Functional Block device support
+
+ -- Stephen Hemminger <stephen.hemminger@vyatta.com> Thu, 15 Apr 2010 13:53:22 -0700
+
+vyatta-op (0.13.58) unstable; urgency=low
+
+ * Use new interface_description function
+
+ -- Stephen Hemminger <stephen.hemminger@vyatta.com> Mon, 29 Mar 2010 16:15:45 -0700
+
vyatta-op (0.13.57) unstable; urgency=low
* Remove old vtysh alias
diff --git a/debian/control b/debian/control
index 2052a68..724c211 100644
--- a/debian/control
+++ b/debian/control
@@ -13,6 +13,7 @@ Depends: sed (>= 4.1.5),
ntpdate,
procps (>= 1:3.2.7-3),
pciutils,
+ vyatta-cfg (>= 0.16.26),
vyatta-quagga (>= 0.99.15-26),
lsof,
coreutils (>= 5.97-5.3),
diff --git a/scripts/dhcpv6-client-show-leases.pl b/scripts/dhcpv6-client-show-leases.pl
new file mode 100644
index 0000000..546668c
--- /dev/null
+++ b/scripts/dhcpv6-client-show-leases.pl
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+
+# Module: dhcpv6-client-show-leases.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.
+#
+# A copy of the GNU General Public License is available as
+# `/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution
+# or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'.
+# You can also obtain it by writing to the Free Software Foundation,
+# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# This code was originally developed by Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2010 Vyatta, Inc.
+# All Rights Reserved.
+#
+# Author: Bob Gilligan
+# Date: April 2010
+# Description: Script to display DHCPv6 client leases in a user-friendly form
+#
+# **** End License ****
+
+use strict;
+use lib "/opt/vyatta/share/perl5/";
+
+use Getopt::Long;
+use Vyatta::Config;
+
+
+# Globals
+my $debug_flag = 0;
+
+GetOptions(
+ "debug" => \$debug_flag,
+ );
+
+
+sub log_msg {
+ my $message = shift;
+
+ print "DEBUG: $message" if $debug_flag;
+}
+
+
+#
+# Main section.
+#
+
+opendir (my $dir, "/var/lib/dhcp3");
+my @lease_files;
+while (my $f = readdir $dir) {
+ if ($f =~ /^dhclient_v6_(\w+).leases$/) {
+ push (@lease_files, $f);
+ }
+}
+closedir $dir;
+
+if ($debug_flag) {
+ print "lease files:", join(' ',@lease_files), "\n";
+}
+
+# Holds the most recent (last) entry for each interface
+my %ghash = ();
+
+foreach my $lease_filename (@lease_files) {
+ my @lines=();
+
+ if (!open(LEASE_FILE, "</var/lib/dhcp3/$lease_filename")) {
+ printf("Can't open lease file for reading: $lease_filename\n");
+ exit 1;
+ }
+
+ @lines = <LEASE_FILE>;
+ close(LEASE_FILE);
+ chomp @lines;
+
+ my $level = 0;
+ my $s1;
+ my $s2;
+ my $ia_na;
+ my $iaaddr;
+ my $ends_day;
+ my $ends_time;
+ my $ifname;
+ my $starts;
+ my $pref_life;
+ my $max_life;
+ my $binding_state;
+
+ # Parse the leases file into a hash keyed by IPv6 addr.
+ foreach my $line (@lines) {
+ log_msg("Line: $line\n");
+ if ($line =~ /^lease6 \{/) {
+ if ($level != 0) {
+ printf("Found lease6 at level $level\n");
+ exit 1;
+ }
+ $level++;
+ } elsif ($line =~ /^.*ia-na .*\{/) {
+ if ($level != 1) {
+ printf("Found ia-na at level $level\n");
+ exit 1;
+ }
+ log_msg("setting ia_na\n");
+ ($s1, $ia_na, $s2) = split(' ', $line);
+ $level++;
+ } elsif ($line =~ /^.*interface /) {
+ if ($level != 1) {
+ printf("Found interface at level $level\n");
+ exit 1;
+ }
+ ($s1, $ifname) = split(' ', $line);
+ $ifname =~ s/;//;
+ $ifname =~ s/\"//g;
+ log_msg("Setting ifname to $ifname\n");
+ } elsif ($line =~ /^.*iaaddr .*\{/) {
+ if ($level != 2) {
+ printf("Found iaaddr at level $level\n");
+ exit 1;
+ }
+ ($s1, $iaaddr, $s2) = split(' ', $line);
+ log_msg("Setting iaaddr to $iaaddr.\n");
+ log_msg("s1 $s1 s2 $s2\n");
+ $level++;
+ } elsif ($line =~ /^.*starts /) {
+ ($s1, $starts) = split(' ', $line);
+ $starts =~ s/;//;
+ } elsif ($line =~ /^.*preferred-life /) {
+ ($s1, $pref_life) = split(' ', $line);
+ $pref_life =~ s/;//;
+ } elsif ($line =~ /^.*max-life /) {
+ ($s1, $max_life) = split(' ', $line);
+ $max_life =~ s/;//;
+ } elsif ($line =~ /^.*ends /) {
+ if ($level != 2) {
+ printf("Found ends at level $level\n");
+ exit 1;
+ }
+ log_msg("Setting ends_day ends_time\n");
+ ($s1, $s2, $ends_day, $ends_time) = split(' ', $line);
+ $ends_time =~ s/;//;
+ } elsif ($line =~ /^.*binding state /) {
+ if ($level != 2) {
+ printf("Found binding state at level $level\n");
+ exit 1;
+ }
+ log_msg("Setting binding state\n");
+ ($s1, $s2, $binding_state) = split(' ', $line);
+ $binding_state =~ s/;//;
+ } elsif ($line =~ /^.*\{/) {
+ log_msg("Unknown clause: $line\n");
+ $level++;
+ } elsif ($line =~ /\}$/) {
+ $level--;
+ if ($level == 0) {
+ if (!defined($ia_na)) {
+ printf("ia_na not defined\n");
+ exit 1;
+ }
+
+ if (!defined($iaaddr)) {
+ printf("iaaddr not defined\n");
+ exit 1;
+ }
+ }
+ } else {
+ log_msg("Unknown parameter: $line\n");
+ }
+ }
+
+ my @array = ($ia_na, $iaaddr, $starts, $max_life, $pref_life);
+ $ghash{$ifname} = \@array;
+}
+
+# Display the leases...
+
+my $num_entries = scalar(keys %ghash);
+if ($num_entries == 0) {
+ printf("There are no DHCPv6 leases.\n");
+ exit 0;
+} else {
+ printf("DHCPv6 client leases:\n");
+}
+
+printf("\n");
+printf("Interface IPv6 Address Expires\n");
+printf("--------- --------------------------------------- ------------------------\n");
+foreach my $key (keys %ghash) {
+ my $entry = $ghash{$key};
+ my ($ia_na, $iaaddr, $starts, $max_life, $pref_life) = @$entry;
+ my $ts;
+ if (defined ($starts) && defined ($max_life)) {
+ my $exp_time = $starts + $max_life;
+ $ts = localtime($exp_time);
+ } else {
+ $ts = "Unknown";
+ }
+ printf ("%-9s %-39s %s\n", $key, $iaaddr, $ts);
+}
+
+
+
diff --git a/scripts/rename-image.pl b/scripts/rename-image.pl
new file mode 100644
index 0000000..e2e9745
--- /dev/null
+++ b/scripts/rename-image.pl
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+
+# **** 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) 2010 Vyatta, Inc.
+# All Rights Reserved.
+#
+# Author: Bob Gilligan
+# Date: April 30, 2010
+# Description: Script to re-name a system image.
+#
+# **** End License ****
+
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Temp qw/ tempfile tempdir /;
+
+my $old_name;
+my $new_name;
+
+GetOptions(
+ 'old_name:s' => \$old_name,
+ 'new_name:s' => \$new_name,
+ );
+
+if (!defined($old_name) || !defined($new_name)) {
+ printf("Must specify both old ane new name.\n");
+ exit 1;
+}
+
+my $image_path = "/live/image/boot";
+
+if (! -e "$image_path") {
+ # must be running on old non-image installed system
+ $image_path = "";
+}
+
+if (! -e "$image_path/$old_name") {
+ printf("Old name $old_name does not exist.\n");
+ exit 1;
+}
+
+if (("$new_name" eq "Old-non-image-installation") ||
+ ("$new_name" eq "grub") ||
+ ("$new_name" =~ /^initrd/) ||
+ ("$new_name" =~ /^vmlinuz/) ||
+ ("$new_name" =~ /^System\.map/) ||
+ ("$new_name" =~ /^config-/)) {
+ printf("Can't use reserved image name.\n");
+ exit 1;
+}
+
+my $cmdline=`cat /proc/cmdline`;
+my $cur_name;
+($cur_name, undef) = split(' ', $cmdline);
+$cur_name =~ s/BOOT_IMAGE=\/boot\///;
+$cur_name =~ s/\/vmlinuz.*//;
+
+if ($old_name eq $cur_name) {
+ printf("Can't re-name the running image.\n");
+ exit 1;
+}
+
+if (-e "$image_path/$new_name") {
+ printf("New name $new_name already exists.\n");
+ exit 1;
+}
+
+printf("Renaming image $old_name to $new_name.\n");
+
+my $tmpfh;
+my $tmpfilename;
+($tmpfh, $tmpfilename) = tempfile();
+
+if (!open (GRUBFH, "<${image_path}/grub/grub.cfg")) {
+ printf("Can't open grub file.\n");
+ exit 1;
+}
+
+# This is sensitive to the format of menu entries and boot paths
+# in the grub config file.
+#
+my $line;
+while ($line = <GRUBFH>) {
+ $line =~ s/\/boot\/$old_name/\/boot\/$new_name/g;
+ $line =~ s/Vyatta $old_name/Vyatta $new_name/;
+ $line =~ s/Lost password change $old_name/Lost password change $new_name/;
+ printf($tmpfh $line);
+}
+
+close($tmpfh);
+close(GRUBFH);
+
+system("mv $image_path/$old_name $image_path/$new_name");
+system("cp $tmpfilename $image_path/grub/grub.cfg");
+
+printf("Done.\n");
+
diff --git a/scripts/show-image-storage.pl b/scripts/show-image-storage.pl
new file mode 100644
index 0000000..00a5112
--- /dev/null
+++ b/scripts/show-image-storage.pl
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+# **** 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) 2010 Vyatta, Inc.
+# All Rights Reserved.
+#
+# Author: Bob Gilligan
+# Date: April 30, 2010
+# Description: Script to display disk storage used by images
+#
+# **** End License ****
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+
+#
+# Main section
+#
+
+# Figure out where the images live...
+my $imagedir = "/live/image/boot";
+if (! -e $imagedir) {
+ # Must be running on Old non-image system.
+ $imagedir = "/boot";
+ if (! -e $imagedir) {
+ printf("Can't locate system image directory!\n");
+ exit 1;
+ }
+}
+
+my $bootlist=`/opt/vyatta/bin/vyatta-boot-image.pl --list`;
+
+my @bootlist_arr = split(/\n/, $bootlist);
+
+printf("Image name Read-Only Read-Write Total\n");
+printf("------------------------------ ------------ ------------ ------------\n");
+
+foreach my $image (@bootlist_arr) {
+ my $total;
+ my $read_only;
+ my $read_write;
+ my $string;
+ my $garbage;
+
+ if ( -e "$imagedir/$image") {
+ $string = `du -s $imagedir/$image`;
+ ($total, $garbage) = split(' ', $string);
+ $string = `du -s $imagedir/$image/*.squashfs`;
+ ($read_only, $garbage) = split(' ', $string);
+ $read_write = $total - $read_only;
+ printf("%-30s %12d %12d %12d\n", $image, $read_only, $read_write,
+ $total);
+ }
+}
diff --git a/scripts/vyatta-boot-image.pl b/scripts/vyatta-boot-image.pl
index 276d704..9431711 100755
--- a/scripts/vyatta-boot-image.pl
+++ b/scripts/vyatta-boot-image.pl
@@ -57,6 +57,8 @@ sub parseGrubCfg {
my @entries = ();
my $in_entry = 0;
my $idx = 0;
+ my $running_boot_cmd=`cat /proc/cmdline`;
+ $running_boot_cmd =~ s/BOOT_IMAGE=//;
while (<$fd>) {
if ($in_entry) {
if (/^}/) {
@@ -87,6 +89,11 @@ sub parseGrubCfg {
} else {
$ehash{'reset'} = 0;
}
+ if (/$running_boot_cmd/) {
+ $ehash{'running_vers'} = 1;
+ } else {
+ $ehash{'running_vers'} = 0;
+ }
push @entries, \%ehash;
}
} elsif (/^set default=(\d+)$/) {
@@ -179,23 +186,70 @@ sub getBootList {
}
+# Get the Vyatta version of a particular image, given its name.
+#
+sub image_vyatta_version {
+ my ($image_name) = @_;
+
+ my $vers;
+ my $dpkg_path = "var/lib/dpkg";
+
+ my $image_path;
+ if ($image_name eq $OLD_IMG_VER_STR) {
+ $image_path = "";
+ } else {
+ $image_path = "/live/image/boot/$image_name/live-rw";
+ }
+
+ $image_path .= "/var/lib/dpkg";
+
+ if ( -e $image_path ) {
+ $vers = `dpkg-query --admindir=$image_path --showformat='\${Version}' --show vyatta-version`;
+ return $vers;
+ } else {
+ if ($image_name eq $OLD_IMG_VER_STR) {
+ return "unknown";
+ }
+
+ my @squash_files = </live/image/boot/$image_name/*.squashfs>;
+ foreach my $squash_file (@squash_files) {
+ if (-e $squash_file) {
+ system("sudo mkdir /tmp/squash_mount");
+ system("sudo mount -o loop,ro -t squashfs $squash_file /tmp/squash_mount");
+ $image_path = "/tmp/squash_mount/var/lib/dpkg";
+ my $vers = `dpkg-query --admindir=$image_path --showformat='\${Version}' --show vyatta-version`;
+ system("sudo umount /tmp/squash_mount");
+ system("sudo rmdir /tmp/squash_mount");
+ return $vers;
+ }
+ }
+ # None found
+ return "unknown2"
+ }
+}
+
# Prints the boot list generated by getBootList(). If the argument
# $brief is set, display the entries for machine instead of human
# consumption: One entry per line showing the the version string only.
#
sub displayBootList {
- my ($didx, $entries, $brief) = @_;
- my $running_ver = curVer();
+ my ($didx, $entries, $brief, $show_version) = @_;
for my $i (0 .. $#{$entries}) {
my $di = $i + 1;
my $ver = $ {$entries}[$i]->{'ver'};
my $m = '';
+
+ if (defined $show_version) {
+ my $vyatta_vers = image_vyatta_version($ver);
+ $m .= " [$vyatta_vers]";
+ }
+
if ($didx == $ {$entries}[$i]->{'idx'}) {
- $m = ' (default boot)';
+ $m .= ' (default boot)';
}
- if ($ver eq $running_ver) {
- $m .= ' (running version)';
+ if ($ {$entries}[$i]->{'running_vers'} == 1) {
+ $m .= ' (running image)';
}
if (defined($brief)) {
@@ -416,13 +470,14 @@ sub doDelete {
# Main section
#
-my ($show, $del, $sel, $list) = (undef, undef, undef, undef);
+my ($show, $del, $sel, $list, $show_vers) = (undef, undef, undef, undef);
GetOptions(
'show' => \$show,
'delete:s' => \$del,
'select:s' => \$sel,
- 'list' => \$list
+ 'list' => \$list,
+ 'show_vers' => \$show_vers,
);
if (-e $UNION_GRUB_CFG) {
@@ -481,7 +536,7 @@ if (defined($del)) {
$msg = 'The following image(s) can be deleted:';
}
print "$msg\n\n";
-displayBootList($def_idx, $bentries);
+displayBootList($def_idx, $bentries, undef, $show_vers);
print "\n";
exit 0 if (defined($show) || (!defined($sel) && !defined($del))); # show-only
@@ -489,7 +544,7 @@ exit 0 if (defined($show) || (!defined($sel) && !defined($del))); # show-only
# for doing select
my $prompt_msg = 'Select the default boot image: ';
my $error_msg = 'Invalid selection. Default is not changed.';
-if ($del) {
+if (defined ($del)) {
# doing delete
$prompt_msg = 'Select the image to delete: ';
$error_msg = 'Invalid selection. Nothing is deleted.';
diff --git a/scripts/vyatta-show-interfaces.pl b/scripts/vyatta-show-interfaces.pl
index 1b662c8..6e071e2 100755
--- a/scripts/vyatta-show-interfaces.pl
+++ b/scripts/vyatta-show-interfaces.pl
@@ -57,10 +57,8 @@ my @tx_stat_vars =
sub get_intf_description {
my $name = shift;
- my $intf = new Vyatta::Interface($name);
- return "" unless $intf;
+ my $description = interface_description($name);
- my $description = $intf->description();
return "" unless $description;
return $description;
}
diff --git a/templates/release/dhcpv6/interface/node.def b/templates/release/dhcpv6/interface/node.def
new file mode 100644
index 0000000..847df8e
--- /dev/null
+++ b/templates/release/dhcpv6/interface/node.def
@@ -0,0 +1,2 @@
+help: Release a DHCPv6 lease on an interface
+
diff --git a/templates/release/dhcpv6/interface/node.tag/node.def b/templates/release/dhcpv6/interface/node.tag/node.def
new file mode 100644
index 0000000..05f45c8
--- /dev/null
+++ b/templates/release/dhcpv6/interface/node.tag/node.def
@@ -0,0 +1,10 @@
+help: Release DHCPv6 lease for interface
+
+allowed:
+ local -a array
+ array=( /var/lib/dhcp3/dhclient_v6_*.conf )
+ tail=${array[@]#/var/lib/dhcp3/dhclient_v6_}
+ ifnames=${tail[@]%.conf}
+ echo -n ${ifnames[@]}
+
+run: sudo /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --release --ifname "$4"
diff --git a/templates/release/dhcpv6/node.def b/templates/release/dhcpv6/node.def
new file mode 100644
index 0000000..ed4b8c2
--- /dev/null
+++ b/templates/release/dhcpv6/node.def
@@ -0,0 +1 @@
+help: Release a DHCPv6 lease \ No newline at end of file
diff --git a/templates/rename/node.def b/templates/rename/node.def
new file mode 100644
index 0000000..b2270fd
--- /dev/null
+++ b/templates/rename/node.def
@@ -0,0 +1 @@
+help: Re-name something.
diff --git a/templates/rename/system/image/node.def b/templates/rename/system/image/node.def
new file mode 100644
index 0000000..00e9c81
--- /dev/null
+++ b/templates/rename/system/image/node.def
@@ -0,0 +1 @@
+help: Re-name a system image.
diff --git a/templates/rename/system/image/node.tag/node.def b/templates/rename/system/image/node.tag/node.def
new file mode 100644
index 0000000..eb25def
--- /dev/null
+++ b/templates/rename/system/image/node.tag/node.def
@@ -0,0 +1,6 @@
+help: System image to rename.
+
+allowed:
+ local -a images ;
+ images=`/opt/vyatta/bin/vyatta-boot-image.pl --list`
+ echo -n $images
diff --git a/templates/rename/system/image/node.tag/node.tag/node.def b/templates/rename/system/image/node.tag/node.tag/node.def
new file mode 100644
index 0000000..1f94c57
--- /dev/null
+++ b/templates/rename/system/image/node.tag/node.tag/node.def
@@ -0,0 +1,7 @@
+help: New name for system image.
+
+run:
+ old=$4
+ new=$5
+ sudo /opt/vyatta/bin/rename-image.pl --old_name $old --new_name $new
+
diff --git a/templates/rename/system/node.def b/templates/rename/system/node.def
new file mode 100644
index 0000000..1d86fc2
--- /dev/null
+++ b/templates/rename/system/node.def
@@ -0,0 +1 @@
+help: Re-name a system object.
diff --git a/templates/renew/dhcpv6/interface/node.def b/templates/renew/dhcpv6/interface/node.def
new file mode 100644
index 0000000..eb69706
--- /dev/null
+++ b/templates/renew/dhcpv6/interface/node.def
@@ -0,0 +1 @@
+help: Renew DHCPv6 lease for an interface \ No newline at end of file
diff --git a/templates/renew/dhcpv6/interface/node.tag/node.def b/templates/renew/dhcpv6/interface/node.tag/node.def
new file mode 100644
index 0000000..b6c5813
--- /dev/null
+++ b/templates/renew/dhcpv6/interface/node.tag/node.def
@@ -0,0 +1,10 @@
+help: Renew a DHCPv6 lease on an interface
+
+allowed:
+ local -a array
+ array=( /var/lib/dhcp3/dhclient_v6_*.conf )
+ tail=${array[@]#/var/lib/dhcp3/dhclient_v6_}
+ ifnames=${tail[@]%.conf}
+ echo -n ${ifnames[@]}
+
+run: sudo /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --renew --ifname "$4" \ No newline at end of file
diff --git a/templates/renew/dhcpv6/node.def b/templates/renew/dhcpv6/node.def
new file mode 100644
index 0000000..cbfb1bb
--- /dev/null
+++ b/templates/renew/dhcpv6/node.def
@@ -0,0 +1 @@
+help: Renew a DHCPv6 lease
diff --git a/templates/show/dhcpv6/client/leases/node.def b/templates/show/dhcpv6/client/leases/node.def
new file mode 100644
index 0000000..8eb6954
--- /dev/null
+++ b/templates/show/dhcpv6/client/leases/node.def
@@ -0,0 +1,3 @@
+help: Display DHCPv6 client leases
+
+run: sudo /opt/vyatta/sbin/dhcpv6-client-show-leases.pl
diff --git a/templates/show/dhcpv6/client/node.def b/templates/show/dhcpv6/client/node.def
new file mode 100644
index 0000000..7c5b0c3
--- /dev/null
+++ b/templates/show/dhcpv6/client/node.def
@@ -0,0 +1 @@
+help: Display DHCPv6 client information
diff --git a/templates/show/interfaces/input/detail/node.def b/templates/show/interfaces/input/detail/node.def
new file mode 100644
index 0000000..9cb235b
--- /dev/null
+++ b/templates/show/interfaces/input/detail/node.def
@@ -0,0 +1,2 @@
+help: Show detailed input functional block interface information
+run: ${vyatta_bindir}/vyatta-show-interfaces.pl --intf-type=input --action=show
diff --git a/templates/show/interfaces/input/node.def b/templates/show/interfaces/input/node.def
new file mode 100644
index 0000000..9114561
--- /dev/null
+++ b/templates/show/interfaces/input/node.def
@@ -0,0 +1,2 @@
+help: Show input functional block interface information
+run: ${vyatta_bindir}/vyatta-show-interfaces.pl --intf-type=input --action=show-brief
diff --git a/templates/show/interfaces/input/node.tag/brief/node.def b/templates/show/interfaces/input/node.tag/brief/node.def
new file mode 100644
index 0000000..ec7d295
--- /dev/null
+++ b/templates/show/interfaces/input/node.tag/brief/node.def
@@ -0,0 +1,2 @@
+help: Show summary of the specified input functional block interface information
+run: ${vyatta_bindir}/vyatta-show-interfaces.pl --intf="$4" --action=show-brief
diff --git a/templates/show/interfaces/input/node.tag/node.def b/templates/show/interfaces/input/node.tag/node.def
new file mode 100644
index 0000000..ab21b37
--- /dev/null
+++ b/templates/show/interfaces/input/node.tag/node.def
@@ -0,0 +1,3 @@
+help: Show specified input functional block interface information
+allowed: ${vyatta_sbindir}/vyatta-interfaces.pl --show input
+run: ${vyatta_bindir}/vyatta-show-interfaces.pl --intf="$4"
diff --git a/templates/show/system/image/storage/node.def b/templates/show/system/image/storage/node.def
new file mode 100644
index 0000000..0592adc
--- /dev/null
+++ b/templates/show/system/image/storage/node.def
@@ -0,0 +1,3 @@
+help: Show disk space utilization of system images
+
+run: /opt/vyatta/bin/show-image-storage.pl
diff --git a/templates/show/system/image/version/node.def b/templates/show/system/image/version/node.def
new file mode 100644
index 0000000..b488a12
--- /dev/null
+++ b/templates/show/system/image/version/node.def
@@ -0,0 +1,2 @@
+help: Show installed Vyatta images with Vyatta version number
+run: /opt/vyatta/bin/vyatta-boot-image.pl --show --show_vers