Merge pull request 'update_version_test' (#2) from update_version_test into master

Reviewed-on: https://gitea.tlcnet.info/tracey/shell-scripts/pulls/2
This commit is contained in:
Tracey Clark 2021-09-05 15:52:46 -05:00
commit 39b05cbee5
2 changed files with 152 additions and 81 deletions

3
.gitignore vendored
View file

@ -1,2 +1,5 @@
*~ *~
*.swp *.swp
.vstags
*.tdy
*.bak

View file

@ -14,61 +14,77 @@
use strict; use strict;
use warnings; use warnings;
use LWP::UserAgent; use LWP::UserAgent;
use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ; use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error);
use Data::Dumper; use Data::Dumper;
use JSON; use JSON;
use Sort::Versions; use Sort::Versions;
use Getopt::Long qw(GetOptions);
use Term::ANSIColor qw(:constants);
my ( $verbose, $info );
GetOptions(
'info!' => \$info,
'verbose!' => \$verbose,
);
########################################## ##########################################
### The user must set these variables ### ### The user must set these variables ###
# SET email address # SET email address
my $email='tclark77@tlcnet.info'; my $email = 'tclark77@tlcnet.info';
my $filetype='-linux-amd64'; my $filetype = '-linux-amd64';
# https://api.github.com/repos/go-gitea/gitea/releases/latest # https://api.github.com/repos/go-gitea/gitea/releases/latest
my $gitea_bin_dir = '/home/gitea/bin/'; # This URL will only have one version listed
my $gitea_bin = $gitea_bin_dir . '/gitea'; my $gitea_bin_dir = '/home/gitea/bin/';
my $gitea_bin = $gitea_bin_dir . '/gitea';
my $gitea_current_version_string = `$gitea_bin --version`; my $gitea_current_version_string = `$gitea_bin --version`;
my $alphanum_ver = 0; my $alphanum_ver = 0;
chomp $gitea_current_version_string; chomp $gitea_current_version_string;
print("System is running \"$gitea_current_version_string\"\n"); print("System is running \"$gitea_current_version_string\"\n");
unless ( defined $gitea_current_version_string ) { unless ( defined $gitea_current_version_string ) {
die "ERROR: Unable to get the version of the gitea binary on the system: $!"; die
"[DIE]: Unable to get the version of the gitea binary on the system: $!";
} }
my %binary_file = get_current_version($gitea_current_version_string); my %binary_file = get_current_version($gitea_current_version_string);
my $gitea_current_version = $binary_file{'version'}; my $gitea_current_version = $binary_file{'version'};
my $baseURL = q{https://github.com/go-gitea/gitea/}; my $baseURL = q{https://github.com/go-gitea/gitea/};
my $latestURL = q{https://api.github.com/repos/go-gitea/gitea/releases/latest}; my $latestURL = q{https://api.github.com/repos/go-gitea/gitea/releases/latest};
# https://hubpages.com/technology/Use-Perl-to-access-REST-API # https://hubpages.com/technology/Use-Perl-to-access-REST-API
# Spin up the browser object # Spin up the browser object
my $ua = LWP::UserAgent->new( my $ua = LWP::UserAgent->new(
cookie_jar => {}, # keep cookies in RAM but not persistent between sessions cookie_jar => {}, # keep cookies in RAM but not persistent between sessions
); );
my $resp = $ua->get($latestURL); my $resp = $ua->get($latestURL);
my $latest_release_hash = decode_json($resp->content) my $latest_release_hash = decode_json( $resp->content )
or die "ERROR: Unable to parse the version data! Output is:\n $resp"; or die "[DIE]: Unable to parse the version data! Output is:\n $resp";
my $tag = $latest_release_hash->{tag_name}; my $orig_tag = $latest_release_hash->{tag_name};
substr($tag, 0, 1, ''); my $tag = $orig_tag;
substr( $tag, 0, 1, '' );
print("Latest upstream version is $tag\n"); print("Latest upstream version is $tag\n");
my $release_id = $latest_release_hash->{id}; # Works my $release_id = $latest_release_hash->{id}; # Works
printf("Release id: $release_id\n"); printf("Release id: $release_id\n");
my $unz_filename = 'gitea-' . $tag . $filetype; my $unz_filename = 'gitea-' . $tag . $filetype;
printf("Uncompressed filename: $unz_filename\n"); printf("Uncompressed filename: $unz_filename\n");
#ex: gitea-1.7.6-linux-amd64
#ex: gitea-1.7.6-linux-amd64
my $download_filename = $unz_filename . '.xz'; my $download_filename = $unz_filename . '.xz';
printf("Download file target: $download_filename\n"); printf("Download file target: $download_filename\n");
#ex: gitea-1.7.6-linux-amd64.xz
if ( versioncmp($gitea_current_version, $tag) == -1 ) { #ex: gitea-1.7.6-linux-amd64.xz
printf("Version tag is greater than the system version, proceeding with update\n");
if ( versioncmp( $gitea_current_version, $tag ) == -1 ) {
printf(
"Version tag is greater than the system version, proceeding with update\n"
);
backup_bin( \%binary_file ); backup_bin( \%binary_file );
my $download_url = get_download_url( $download_filename, $release_id ); my $download_url = get_download_url( $download_filename, $release_id );
@ -76,7 +92,10 @@ if ( versioncmp($gitea_current_version, $tag) == -1 ) {
print("Download URL we got from the sub is $download_url\n"); print("Download URL we got from the sub is $download_url\n");
`wget -P $gitea_bin_dir $download_url`; `wget -P $gitea_bin_dir $download_url`;
my $xz_file = $gitea_bin_dir . $download_filename; my $xz_file = $gitea_bin_dir . $download_filename;
print("!!! xz file is $xz_file\n");
if ( defined $info ) {
print YELLOW "[INFO] xz file is $xz_file\n", RESET;
}
install_bin($download_filename); install_bin($download_filename);
@ -88,35 +107,38 @@ if ( versioncmp($gitea_current_version, $tag) == -1 ) {
# Notify success notify(1) # Notify success notify(1)
# If no start notify and end & notify fail notify(0) # If no start notify and end & notify fail notify(0)
=cut =cut
} }
my $status = check_gitea_status(); my $status = check_gitea_status();
if( $status =~ /active/) { if ( $status =~ /active/ ) {
print("[INFO] Gitea service is active\n"); print( GREEN "[INFO] Gitea service is active\n", RESET );
} }
unless( $status =~ /active/) { unless ( $status =~ /active/ ) {
die"[WARN] Status of gitea is no good!! OMGURD\n"; die RED "[DIE] Status of gitea service is no good! OMGURD\n", RESET;
} }
$gitea_current_version_string = `$gitea_bin --version`; $gitea_current_version_string = `$gitea_bin --version`;
print("Running version of gitea is now $gitea_current_version_string");
chomp $gitea_current_version_string; chomp $gitea_current_version_string;
%binary_file = get_current_version($gitea_current_version_string); %binary_file = get_current_version($gitea_current_version_string);
$gitea_current_version = $binary_file{'version'}; $gitea_current_version = $binary_file{'version'};
if ( versioncmp($gitea_current_version, $tag) == -1 ) { if ( versioncmp( $gitea_current_version, $tag ) == -1 ) {
printf("Upstream version tag is STILL greater than the current system version, something went wrong\n"); printf(
"Upstream version tag is STILL greater than the current system version, something went wrong\n"
);
} }
else { else {
print("Write something here to call cleanup and remove the old xz file and uncompressed file\n"); print(
"Write something here to call cleanup and remove the old xz file and uncompressed file\n"
);
} }
#TODO Add check if running binary is the same version as what we downloaded #TODO Add check if running binary is the same version as what we downloaded
# # If install_bin good then cleanup() # # If install_bin good then cleanup()
# #notification( $email ); # #notification( $email );
# ##### Subroutines ##### # ##### Subroutines #####
# sub check_deps { # sub check_deps {
@ -125,10 +147,9 @@ else {
# } # }
sub get_current_version { sub get_current_version {
my $current_version_string=shift; my $current_version_string = shift;
my $current_version; my $current_version;
if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) { if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) {
#if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s/ ) {
$current_version = $1; $current_version = $1;
printf("Version number of the installed gitea binary: $1\n"); printf("Version number of the installed gitea binary: $1\n");
} }
@ -138,84 +159,130 @@ sub get_current_version {
$alphanum_ver = 1; $alphanum_ver = 1;
} }
my %binary_file = ( my %binary_file = (
input => $gitea_bin, input => $gitea_bin,
version => $current_version, version => $current_version,
); );
unless ( defined $current_version ) { unless ( defined $current_version ) {
die "ERROR: Unable to get the current gitea version! Value is $current_version" die RED
"[DIE]: Unable to get the current gitea version! Value is $current_version",
RESET;
} }
return %binary_file; return %binary_file;
} }
sub backup_bin { sub backup_bin {
# Ghetto to get it working for now # Ghetto to get it working for now
my ( %opts ) = %{shift()}; my (%opts) = %{ shift() };
my $input = $opts{input}; my $input = $opts{input};
my $version = $opts{version}; my $version = $opts{version};
print GREEN "Backing up the current binary\n", RESET;
# my $gitea_bin_backup = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; if ( defined $info ) {
# printf("Gitea bin backup will be $gitea_bin_backup\n"); print YELLOW
# printf("!! Input is $gitea_bin\n and output is $gitea_bin_backup\n"); "[INFO] Input in backup_bin sub is:\n Directory $input\n Version $version\n",
RESET;
printf("Backing up the current binary\n"); }
printf("Input in backup_bin sub is $input\n and version is $version\n"); my $gitea_bin_backup =
my $gitea_bin_backup = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2';
printf("Gitea bin backup will be $gitea_bin_backup\n"); print GREEN "Gitea bin backup will be $gitea_bin_backup\n", RESET;
system("cp $input $input.bak"); system("cp $input $input.bak");
# TODO # TODO
# # Do this with a system call to make a compressed copy of the current binary # # Do this with a system call to make a compressed copy of the current binary
# # bzip2 -k file.txt # # bzip2 -k file.txt
# # my $status = system("vi", "fred.txt"); # # my $status = system("vi", "fred.txt");
# # if (($status >>=8) != 0) { # # if (($status >>=8) != 0) {
# # die "Failed to run vi"; # # die "[DIE] Failed to run vi";
# # } # # }
# my $bzip_status = system("bzip2 -k", "$input"); # my $bzip_status = system("bzip2 -k", "$input");
# if (($status >>=8) != 0) { # if (($status >>=8) != 0) {
# die "Failed to run bzip2"; # die "[DIE] Failed to run bzip2";
# } # }
return; return;
} }
sub get_download_url { sub get_download_url {
my ($dl_filename, $rel_id) = @_; my ( $dl_filename, $rel_id ) = @_;
my $dl_url; my $dl_url;
print("Download filename in the sub is $dl_filename\n");
# Get the download_url from the array # Get the download_url from the array
my $assetsURL = 'https://api.github.com/repos/go-gitea/gitea/releases/' . $release_id . '/assets'; my $assetsURL =
# For debugging 'https://api.github.com/repos/go-gitea/gitea/releases/'
# printf("!!! Dump of assets URL"); . $release_id
# printf("!!! $assetsURL\n"); . '/assets';
if ( defined $info ) {
print YELLOW "[INFO] Assets URL\n";
print "$assetsURL\n", RESET;
}
my $asset_resp = $ua->get($assetsURL); my $asset_resp = $ua->get($assetsURL);
my $asset_resp_array_ref = decode_json($asset_resp->content); my $asset_resp_array_ref = decode_json( $asset_resp->content );
# printf("!! Print the json response for the assets:\n"); if ( defined $verbose ) {
# printf Dumper $asset_resp_array_ref; printf( RED
# Array of hashes "[DEBUG] Array of hashes of the json response for the assets:\n"
);
printf Dumper $asset_resp_array_ref, RESET;
}
foreach my $asset_ref (@{$asset_resp_array_ref}) { foreach my $asset_ref ( @{$asset_resp_array_ref} ) {
if ( defined $verbose ) {
print( RED
"[DEBUG] The asset ref in get_download_url is $asset_ref\n" );
print(
"The asset ref name in get_download_url is $asset_ref->{name}\n",
RESET
);
}
if ( $asset_ref->{name} eq $dl_filename ) { if ( $asset_ref->{name} eq $dl_filename ) {
print ("Yay we have a match for our desired file :D and it is \n"); print("Yay we have a match for our desired file :D and it is \n");
print $asset_ref->{name} . "\n"; print $asset_ref->{name} . "\n";
$dl_url = $asset_ref->{browser_download_url}; $dl_url = $asset_ref->{browser_download_url};
print("!! The download url is $dl_url \n"); if ( defined $info ) {
print YELLOW
"[INFO] The download url from the response array is $dl_url\n",
RESET;
}
return $dl_url; return $dl_url;
} }
} }
unless ( defined $dl_url ) { unless ( defined $dl_url ) {
print("ONOES we have no download URL!"); print( RED
"ONOES we have no download URL from the github API! Trying to build one manually\n",
RESET
);
my $dl_url = build_download_url( $orig_tag, $download_filename );
return $dl_url;
} }
return; return 0;
}
sub build_download_url {
my ( $url_tag, $url_file ) = @_;
print "Building the URL based on the version\n";
# If getting the download URL fails through the API, use this to build it manually
# URL is in the form of
# https://github.com/go-gitea/gitea/releases/download/v1.15.2/gitea-1.15.2-linux-amd64.xz
my $built_url =
'https://github.com/go-gitea/gitea/releases/download/'
. $url_tag . '/'
. $url_file;
if ( defined $info ) {
print YELLOW "The URL built for the download is $built_url\n", RESET;
}
return $built_url;
} }
sub install_bin { sub install_bin {
my $filename=shift; my $filename = shift;
#my $unz_binary =
#my $unz_binary =
print("Unpacking the downloaded file, setting owner and permissions\n"); print("Unpacking the downloaded file, setting owner and permissions\n");
# Copy the downloaded binary to gitea and chmod it 750 # Copy the downloaded binary to gitea and chmod it 750
# Doing this with a filthy system call because the perl library # Doing this with a filthy system call because the perl library
# for xz manipulation is a memory hog and buggy besides # for xz manipulation is a memory hog and buggy besides
@ -232,11 +299,12 @@ sub install_bin {
} }
sub check_gitea_status { sub check_gitea_status {
my $gitea_status=`systemctl is-active gitea`; my $gitea_status = `systemctl is-active gitea`;
return $gitea_status; return $gitea_status;
} }
sub cleanup { sub cleanup {
# remove downloaded binary and old backup set install_status=success ELSE remove "gitea" and restore from backup and set install_status=fail # remove downloaded binary and old backup set install_status=success ELSE remove "gitea" and restore from backup and set install_status=fail
return; return;
} }