summaryrefslogtreecommitdiff
path: root/scripts/vyatta-image-tools.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vyatta-image-tools.pl')
-rwxr-xr-xscripts/vyatta-image-tools.pl171
1 files changed, 171 insertions, 0 deletions
diff --git a/scripts/vyatta-image-tools.pl b/scripts/vyatta-image-tools.pl
new file mode 100755
index 0000000..abb0090
--- /dev/null
+++ b/scripts/vyatta-image-tools.pl
@@ -0,0 +1,171 @@
+#!/usr/bin/perl -w
+use Getopt::Long;
+use lib "/opt/vyatta/share/perl5/";
+
+use strict;
+
+my ($show, $delete, $updateone);
+my @copy;
+my @update;
+
+GetOptions("show=s" => \$show,
+ "delete=s" => \$delete,
+ "update=s{2}" => \@update,
+ "updateone=s" => \$updateone,
+ "copy=s{2}" => \@copy);
+
+if (defined $show){
+ show($show);
+}
+if (defined $delete){
+ delete_file($delete);
+}
+if (@update){
+ update(@update);
+}
+if (defined($updateone)){
+ update($updateone, "running://");
+}
+if (@copy){
+ copy(@copy);
+}
+
+sub conv_file {
+ my $file = " ";
+ $file = pop(@_);
+ $file =~ s/://;
+ $file =~ /(.+?)\/\/(.*)/;
+ my $topdir = $1;
+ $file = $2;
+ if ( $topdir eq "running" ) {
+ $file = "/$file";
+ } else {
+ $file = "/live/image/boot/$topdir/live-rw/$file";
+ }
+ return ($topdir, $file);
+}
+
+sub conv_file_to_rel {
+ my ($topdir, $filename) = @_;
+ if ($topdir eq "running"){
+ $filename =~ s?/?$topdir://?;
+ } else {
+ $filename =~ s?/live/image/boot/$topdir/live-rw/?$topdir://?;
+ }
+ return $filename;
+}
+
+sub delete_file {
+ my ($file) = @_;
+ (my $topdir, $file) = conv_file($file);
+ if (-d $file){
+ my $print_dir = conv_file_to_rel($topdir,$file);
+ if (y_or_n("Do you want to erase the entire $print_dir directory?")){
+ system("rm -rf $file");
+ print("Directory erased\n");
+ }
+ } elsif (-f $file) {
+ my $print_file = conv_file_to_rel($topdir,$file);
+ if (y_or_n("Do you want to erase the $print_file file?")){
+ system("rm -rf $file");
+ print("File erased\n");
+ }
+ }
+}
+
+sub copy {
+ my ($from, $to) = @_;
+ my ($f_topdir, $t_topdir);
+ ($f_topdir, $from) = conv_file($from);
+ ($t_topdir, $to) = conv_file($to);
+ $from =~ /.*\/(.*)/;
+ my $from_file = $1;
+ if ( -d $from && -e $to && !( -d $to ) ){
+ print "Cannot copy a directory to a file.\n";
+ return 1;
+ } elsif ( -f $to || (-d $to && -f "$to/$from_file") ) {
+ if (y_or_n("This file exists; overwrite if needed?")){
+ rsync($from, $to);
+ }
+ } elsif ( -d $to && -d $from ){
+ my $print_from = conv_file_to_rel($f_topdir, $from);
+ my $print_to = conv_file_to_rel($t_topdir, $to);
+ if (y_or_n("Merge directory $print_from with $print_to?")){
+ rsync($from, $to);
+ }
+ } else {
+ rsync($from, $to);
+ }
+}
+
+sub update {
+ my ($to, $from) = @_;
+ my ($t_topdir, $f_topdir);
+ ($f_topdir, $from) = conv_file($from);
+ ($t_topdir, $to) = conv_file($to);
+ my $print_from = conv_file_to_rel($f_topdir, $from);
+ my $print_to = conv_file_to_rel($t_topdir, $to);
+ my $msg = "WARNING: This is a destructive copy of the /config directories\n"
+ . "This will erase all data in the ".$print_to."config directory\n"
+ . "This data will be replaced with the data from $print_from\n"
+ . "Do you wish to continue?";
+ if (y_or_n("$msg")){
+ system("rm -rf $to/config");
+ rsync("$from/config", $to);
+ }
+}
+
+sub rsync {
+ my ($from,$to) = @_;
+ system("rsync -av --progress $from $to");
+}
+
+sub y_or_n {
+ my ($msg) = @_;
+ print "$msg (Y/N): ";
+ my $input = <>;
+ return 1 if ($input =~ /Y|y/);
+ return 0;
+}
+
+sub show {
+ my ($topdir, $file) = conv_file(pop(@_));
+ my $output = "";
+ if ( -d $file ) {
+ print "########### DIRECTORY LISTING ###########\n";
+ system("ls -lGph --group-directories-first $file");
+ } elsif ( -T $file ) {
+ print "########### FILE INFO ###########\n";
+ my $filename = conv_file_to_rel($topdir, $file);
+ print "File Name: $filename\n";
+ print "Text File: \n";
+ my $lsstr = `ls -lGh $file`;
+ parsels($lsstr);
+ print " Description:\t";
+ system("file -sb $file");
+ print "\n########### FILE DATA ###########\n";
+ system("cat $file");
+ } elsif ( -B $file ) {
+ print "########### FILE INFO ###########\n";
+ my $filename = conv_file_to_rel($topdir, $file);
+ print "File Name: $filename\n";
+ print "Binary File: \n";
+ my $lsstr = `ls -lGh $file`;
+ parsels($lsstr);
+ print " Description:\t";
+ system("file -sb $file");
+ print "\n########### FILE DATA ###########\n";
+ system("hexdump -C $file| less");
+ } else {
+ print "File Not Found\n";
+ }
+}
+
+sub parsels {
+ my $lsout = pop(@_);
+ my @ls = split(' ', $lsout);
+ print " Permissions: $ls[0]\n";
+ print " Owner:\t$ls[2]\n";
+ print " Size:\t\t$ls[3]\n";
+ print " Modified:\t$ls[4] $ls[5] $ls[6]\n";
+}