#!/usr/bin/env perl # # vim: set ts=4:noet # # sbocheck # script to update the local sbo tree and check for updates # # authors: Jacob Pipkin # Luke Williams # license: WTFPL use 5.16.0; use strict; use warnings FATAL => 'all'; use SBO::Lib; use Getopt::Long; use File::Basename; my $self = basename($0); sub show_usage() { print < \$help, 'version|v' => \$vers); show_usage and exit 0 if $help; show_version and exit 0 if $vers; update_tree; # retrieve and format list of available updates sub get_update_list() { print "Checking for updated SlackBuilds...\n"; my $updates = get_available_updates; # consistent formatting - determine longest version string, which will tell # us the max minimum length of the left side of the output for stuff that # fits in 80 chars; stuff that doesn't will overflow. my @up_lengths; push @up_lengths, length $$updates[$_]{update} for keys @$updates; my @s_up_lengths = sort {$b <=> $a} @up_lengths; my $up_length = $s_up_lengths[0]; # "needs updating" bit without version is 30 characters my $remaining = 80 - ($up_length + 30); my @lengths; push @lengths, length "$$updates[$_]{name}-$$updates[$_]{installed}" for keys @$updates; my @s_lengths = sort {$b <=> $a} @lengths; my $min; FIRST: for my $len (@s_lengths) { if ($len < $remaining) { $min = $len; last FIRST; } } $min = $remaining unless $min; my @listing; for my $update (@$updates) { push(@listing, sprintf "%-${min}s < needs updating (SBo has %s)", "$$update{name}-$$update{installed}", "$$update{update}"); } return \@listing; } # print list of updates sub print_output($) { exists $_[0] or script_error 'print_output requires an argument'; my $listing = shift; if (exists $$listing[0]) { print "\n"; say $_ for @$listing; print "\n"; # save a log of available updates my $logfile = '/var/log/sbocheck.log'; unlink $logfile if -f $logfile; my ($log_fh, $exit) = open_fh($logfile, '>'); # non-fatal if ($exit) { warn $log_fh if $exit; } else { say {$log_fh} $_ for @$listing; close $log_fh; say "A copy of the above result is kept in $logfile\n"; } } else { say "\nNo updates available."; } } my $output = get_update_list; print_output $output; exit 0;