summaryrefslogtreecommitdiff
path: root/scripts/vyatta-show-version
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vyatta-show-version')
-rwxr-xr-xscripts/vyatta-show-version188
1 files changed, 162 insertions, 26 deletions
diff --git a/scripts/vyatta-show-version b/scripts/vyatta-show-version
index 636f2c0..c98135d 100755
--- a/scripts/vyatta-show-version
+++ b/scripts/vyatta-show-version
@@ -1,48 +1,184 @@
-#!/bin/bash
+#!/usr/bin/perl -w
+#
+# Module: show_version
+#
# **** License ****
# Version: VPL 1.0
-#
+#
# The contents of this file are subject to the Vyatta Public License
# Version 1.0 ("License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.vyatta.com/vpl
-#
+#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and limitations
# under the License.
-#
+#
# This code was originally developed by Vyatta, Inc.
-# Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2005, 2006, 2007 Vyatta, Inc.
# All Rights Reserved.
-#
-# Author: Tom Grennan
+#
+# Author: Rick Balocca
# Date: 2007
-#
+# Description:
+#
# **** End License ****
+#
+use strict;
+use warnings;
+
+#
+# Global hash of debians in the base install and now.
+#
+my $rHoH_base_debs;
+my $rHoH_now_debs;
+
+my $base = '/opt/vyatta/etc';
+my $versionfile = "$base/version";
+my $buildfile = "$base/build.txt";
+my $debsfile = "$base/deb-versions.txt";
+
+sub echo_file {
+ my ($file) = @_;
-# TODO add other version info
+ my @lines = ();
+ if (!(-e $file)) {
+ return @lines;
+ }
+
+ open(my $FH, '<', $file) or die "Unable to open [$file]\n";
+ @lines=<$FH>;
+ close($FH);
+ return @lines;
+}
-shopt -s extglob
-shopt -s nullglob
+#
+# convert the "dpkg -l" output have same format as deb-versions.txt
+#
+sub get_pkg_version {
+ my @lines = @_;
+
+ my @new_lines = ();
+ foreach my $line (@lines) {
+ if ($line =~ /^[D\|\+]/) {
+ next; # skip header
+ }
+ my ($status, $pkg, $version) = split(/[ \t\n]+/, $line, 4);
+ if ($status =~ /^i/) {
+ push(@new_lines, "$pkg $version");
+ }
+ }
+ return @new_lines;
+}
+
+sub read_pkg_file {
+ my @pkgs_list = @_;
+
+ my %HoH = ();
+ my ($name, $version);
+ foreach my $line (@pkgs_list) {
+ ($name, $version) = split(/[ \t\n]+/, $line, 3);
+ $HoH{$name}{'version'} = $version;
+ }
+ return \%HoH;
+}
+
+sub show_added {
+ for my $name (sort keys %$rHoH_now_debs) {
+ if (!$rHoH_base_debs->{$name}) {
+ printf("Aii %-25s%-25s\n",
+ $name, $rHoH_now_debs->{$name}->{'version'});
+ }
+ }
+}
+
+sub show_deleted {
+ for my $name (sort keys %$rHoH_base_debs) {
+ if (!$rHoH_now_debs->{$name}) {
+ printf("X %-25s%-25s\n",
+ $name, $rHoH_base_debs->{$name}->{'version'});
+ }
+ }
+}
-declare -a cls=( /usr/share/doc/vyatta-*/changelog.gz )
-declare -a cl_dirs=( ${cls[@]%/*} )
-declare -a pkgs=( ${cl_dirs[@]##*/} )
+sub show_upgraded_downgraded {
+ my ($up_down) = @_;
+
+ my ($symbol, $op, $ver_base, $ver_now, $cmd);
+ if ($up_down eq "upgraded") {
+ $symbol = "U";
+ $op = "lt";
+ } else {
+ $symbol = "D";
+ $op = "gt";
+ }
+ for my $name (sort keys %$rHoH_base_debs) {
+ if ($rHoH_now_debs->{$name}) {
+ $ver_base = $rHoH_base_debs->{$name}{'version'};
+ $ver_now = $rHoH_now_debs->{$name}{'version'};
+ if ($ver_base ne $ver_now) {
+ $cmd = "dpkg --compare-versions \"$ver_base\" $op \"$ver_now\"";
+ if (!system($cmd)) {
+ printf("%sii %-25s%-20s (baseline: %s)\n",
+ $symbol, $name, $ver_now, $ver_base);
+ }
+ }
+ }
+ }
+}
-dpkg -l ${pkgs[@]}
+sub show_upgraded {
+ show_upgraded_downgraded("upgraded");
+}
-cat <<EOF
+sub show_downgraded {
+ show_upgraded_downgraded("downgraded");
+}
+
+sub show_all {
+ show_added();
+ show_deleted();
+ show_upgraded();
+ show_downgraded();
+}
+
+my %options = (
+ "added" => \&show_added,
+ "deleted", => \&show_deleted,
+ "upgraded" => \&show_upgraded,
+ "downgraded" => \&show_downgraded,
+ "all" => \&show_all,
+);
+
+#
+# main
+#
+print(&echo_file($versionfile));
+print(&echo_file($buildfile));
-Source Repositories
-EOF
+my $booted = `grep '^unionfs.*/filesystem.squashfs' /proc/mounts`;
+if (defined($booted) && $booted ne "") {
+ $booted="livecd";
+} else {
+ $booted="disk";
+}
+print "Booted From: $booted\n";
+if (!(-e $debsfile)) {
+ exit 0;
+}
-for pkg in ${pkgs[@]} ; do
- printf " %-20s " ${pkg} ;
- test ${#pkg} -lt 20 || echo -ne \\n\\t ;
- gunzip -c /usr/share/doc/$pkg/changelog.gz | tail -n1 ;
-done
+print "\n";
+$rHoH_base_debs = read_pkg_file(&echo_file($debsfile));
+$rHoH_now_debs = read_pkg_file(get_pkg_version(`dpkg -l`));
-### Local Variables:
-### mode: shell-script
-### End:
+if ($#ARGV == 0) {
+ if ($options{$ARGV[0]}) {
+ $options{$ARGV[0]}->();
+ } else {
+ print "Usage: showversion [added|deleted|upgraded|downgraded|all]\n";
+ exit 1;
+ }
+}
+
+# end of file