You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.8 KiB
194 lines
5.8 KiB
#!/usr/bin/perl |
|
|
|
use strict; |
|
use warnings; |
|
use IO::Prompter; |
|
use File::Which qw( which ); |
|
|
|
# Configurable variables |
|
my $lang = 'en-CA'; |
|
my $install = "$ENV{HOME}/.local/bin"; |
|
my $working = "/tmp/firefox.new"; |
|
|
|
# Download link as provided by https://www.mozilla.org/$lang/firefox/developer/ |
|
my $url = 'https://download.mozilla.org/?product=firefox-devedition-latest-ssl' |
|
. '&os=linux64&lang='.$lang; |
|
|
|
# Ensure that we can unzip |
|
unless (which("bunzip2")) { |
|
die "Requires bunzip2. Try:\n" |
|
. "sudo apt install zutils or your distro's equivalent\n"; |
|
} |
|
|
|
# Only understood argument is to not bother verifying the package |
|
my ($download_key, $verify) = (0,1); |
|
if (defined $ARGV[0]) { |
|
if ($ARGV[0] eq '--no-verify') { |
|
$verify = 0; |
|
} else { |
|
die "Didn't understand argument $ARGV[0]\n"; |
|
} |
|
} |
|
|
|
# If verification is to be done, make sure we have the key |
|
unless ($verify) { |
|
print "Checking for Mozilla GPG key in keyring...\n"; |
|
system("gpg --list-keys release\@mozillla.com 2>&1 > /dev/null"); |
|
if ($?) { |
|
my $YN = prompt (-in => *STDIN, "You don't currently have " |
|
. "Mozilla's GPG key in your keyring.\n" |
|
. "Would you like to install it? If not, installation " |
|
. "will not be verified. [y/N]: ", |
|
-single |
|
); |
|
if ($YN eq 'y' || $YN eq 'Y') { |
|
$download_key = 1; |
|
} else { |
|
$verify = 0; |
|
} |
|
} |
|
} |
|
|
|
# If a previous download still exists remove it |
|
if ( -e $working ) { |
|
system("rm -rf $working"); |
|
if ($?) { |
|
die "Working directory " |
|
. $working |
|
. "already exists and failed to remove: $!\n"; |
|
} |
|
} |
|
|
|
# Get version currently installed |
|
my $current = `$install/firefox/firefox-bin --version`; |
|
$current =~ s/.*\s([^\s])/$1/; |
|
chomp $current; |
|
|
|
use WWW::Mechanize; |
|
my $mech = WWW::Mechanize->new(); |
|
|
|
# $url is actually going to redirect to the proper current dowload so just get |
|
# the redirect. |
|
my $head = $mech->head($url); |
|
|
|
my ($location, $version); |
|
# This redirect will have the version id, so we can use that to determine if a |
|
# new version actually exists |
|
if ($head->{'_msg'}) { |
|
$version = $location = $head->{'_previous'}->{'_headers'}->{'location'}; |
|
$version =~ s/^.*\-([^\-]*)\.tar\.bz2$/$1/; |
|
if ($version eq $current) { |
|
die "Current ($current) is the same as New ($version)\n"; |
|
} |
|
} else { |
|
print "unable to find new download\n"; |
|
} |
|
|
|
mkdir($working) || die "Couldn't make $working: $!\n"; |
|
|
|
# Download package |
|
print "Fetching package $location...\n"; |
|
$mech->get($location); |
|
$mech->save_content( $working."/firefox-".$version.".tar.bz2", |
|
binmode => ':raw', |
|
decoded_by_headers => 1 |
|
); |
|
|
|
# If verification is required, get signature as well |
|
if ($verify) { |
|
$location .= '.asc'; |
|
print "Fetching GPG signature $location...\n"; |
|
$mech->get($location); |
|
$mech->save_content( $working."/firefox-".$version.".tar.bz2.asc", |
|
binmode => ':raw', |
|
decoded_by_headers => 1 |
|
); |
|
} |
|
|
|
# If key still needs to be fetched, get it |
|
if ($download_key) { |
|
$location =~ s/linux-x86_64.*$/KEY/; |
|
print "Fetching GPG key $location...\n"; |
|
$mech->get($location); |
|
$mech->save_content( $working."/mozilla.pgp", |
|
binmode => ':raw', |
|
decoded_by_headers => 1 |
|
); |
|
# And install it |
|
print "Installing Mozilla GPG key in keyring...\n"; |
|
system("gpg --import $working/mozilla.pgp 2>&1 > /dev/null"); |
|
if ($?) { |
|
die "Warning: failed to import key. Cannot verify integrity.\n" |
|
. "Downloaded to " |
|
. $working |
|
. ". You can check and install it to " |
|
. $install |
|
. "manually: " |
|
. $! |
|
. "\n"; |
|
} |
|
unlink("$working/mozilla.pgp"); |
|
} |
|
|
|
# Verify the package |
|
if ($verify) { |
|
print "Verifying download with Mozilla GPG key...\n"; |
|
system("gpg --verify $working/firefox-$version.tar.bz2.asc"); |
|
if ($?) { |
|
die "Warning: failed to verify download. Signing failed.\n" |
|
. "Downloaded to " |
|
. $working |
|
. ". You can check and install it to " |
|
. $install |
|
. " manually: " |
|
. $! |
|
. "\n"; |
|
} |
|
} |
|
|
|
# Uncompress |
|
print "Uncompressing download with bunzip2...\n"; |
|
system("bunzip2 $working/firefox-$version.tar.bz2"); |
|
if ($?) { |
|
die "Failed to uncompress: $!\n"; |
|
} |
|
|
|
# Extract |
|
print "Extracting from TAR archive...\n"; |
|
system("tar -xf $working/firefox-$version.tar -C $working"); |
|
if ($?) { |
|
die "Failed to extract: $!\n"; |
|
} |
|
|
|
# Bin the old backup |
|
if (-e "$install/.firefox.old") { |
|
print "Removing previous backup folder...\n"; |
|
system("rm -rf $install/.firefox.old"); |
|
if ($?) { |
|
die "Failed to remove: $!\n"; |
|
} |
|
} |
|
|
|
# Move current to old |
|
print "Backing up currently installed version (" |
|
. $current |
|
. ") to " |
|
. $install |
|
. "/.firefox.old...\n"; |
|
system("mv $install/firefox $install/.firefox.old"); |
|
if ($?) { |
|
die "Failed to move: $!\n"; |
|
} |
|
|
|
# Move new to current |
|
print "Moving new version to $install for final installation...\n"; |
|
system("mv $working/firefox $install/"); |
|
if ($?) { |
|
die "Failed to move: $!\n"; |
|
} |
|
|
|
# Hurray! |
|
print "Installation of version " |
|
. $version |
|
. " complete. You should restart firefox whenever it is convenient.\n"; |
|
exit();
|
|
|