diff --git a/.gitignore b/.gitignore index 5790fd2..fa0ae04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *~ *.swp .vstags +*.tdy +*.bak diff --git a/update-gitea.pl b/update-gitea.pl index a42a725..ef83ca6 100755 --- a/update-gitea.pl +++ b/update-gitea.pl @@ -14,72 +14,77 @@ use strict; use warnings; use LWP::UserAgent; -use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ; +use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error); use Data::Dumper; use JSON; use Sort::Versions; use Getopt::Long qw(GetOptions); use Term::ANSIColor qw(:constants); -my ($verbose, $info); +my ( $verbose, $info ); GetOptions( - 'info!' => \$info, - 'verbose!' => \$verbose, + 'info!' => \$info, + 'verbose!' => \$verbose, ); ########################################## ### The user must set these variables ### # SET email address -my $email='tclark77@tlcnet.info'; -my $filetype='-linux-amd64'; +my $email = 'tclark77@tlcnet.info'; +my $filetype = '-linux-amd64'; # https://api.github.com/repos/go-gitea/gitea/releases/latest # This URL will only have one version listed -my $gitea_bin_dir = '/home/gitea/bin/'; -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 $alphanum_ver = 0; +my $alphanum_ver = 0; chomp $gitea_current_version_string; print("System is running \"$gitea_current_version_string\"\n"); unless ( defined $gitea_current_version_string ) { - die "[DIE]: 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 $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}; # https://hubpages.com/technology/Use-Perl-to-access-REST-API # Spin up the browser object 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 $latest_release_hash = decode_json($resp->content) - or die "[DIE]: Unable to parse the version data! Output is:\n $resp"; +my $resp = $ua->get($latestURL); +my $latest_release_hash = decode_json( $resp->content ) + or die "[DIE]: Unable to parse the version data! Output is:\n $resp"; my $orig_tag = $latest_release_hash->{tag_name}; -my $tag = $orig_tag; -substr($tag, 0, 1, ''); +my $tag = $orig_tag; +substr( $tag, 0, 1, '' ); 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"); my $unz_filename = 'gitea-' . $tag . $filetype; 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'; printf("Download file target: $download_filename\n"); - #ex: gitea-1.7.6-linux-amd64.xz -if ( versioncmp($gitea_current_version, $tag) == -1 ) { - printf("Version tag is greater than the system version, proceeding with update\n"); +#ex: gitea-1.7.6-linux-amd64.xz + +if ( versioncmp( $gitea_current_version, $tag ) == -1 ) { + printf( +"Version tag is greater than the system version, proceeding with update\n" + ); backup_bin( \%binary_file ); my $download_url = get_download_url( $download_filename, $release_id ); @@ -88,7 +93,7 @@ if ( versioncmp($gitea_current_version, $tag) == -1 ) { `wget -P $gitea_bin_dir $download_url`; my $xz_file = $gitea_bin_dir . $download_filename; - if (defined $info) { + if ( defined $info ) { print YELLOW "[INFO] xz file is $xz_file\n", RESET; } @@ -102,34 +107,38 @@ if ( versioncmp($gitea_current_version, $tag) == -1 ) { # Notify success notify(1) # If no start notify and end & notify fail notify(0) =cut + } my $status = check_gitea_status(); -if( $status =~ /active/) { - print(GREEN "[INFO] Gitea service is active\n", RESET); +if ( $status =~ /active/ ) { + print( GREEN "[INFO] Gitea service is active\n", RESET ); } -unless( $status =~ /active/) { +unless ( $status =~ /active/ ) { die RED "[DIE] Status of gitea service is no good! OMGURD\n", RESET; } $gitea_current_version_string = `$gitea_bin --version`; 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'}; -if ( versioncmp($gitea_current_version, $tag) == -1 ) { - printf("Upstream version tag is STILL greater than the current system version, something went wrong\n"); +if ( versioncmp( $gitea_current_version, $tag ) == -1 ) { + printf( +"Upstream version tag is STILL greater than the current system version, something went wrong\n" + ); } 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 # # If install_bin good then cleanup() # #notification( $email ); - - # ##### Subroutines ##### # sub check_deps { @@ -138,7 +147,7 @@ else { # } sub get_current_version { - my $current_version_string=shift; + my $current_version_string = shift; my $current_version; if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) { $current_version = $1; @@ -150,106 +159,130 @@ sub get_current_version { $alphanum_ver = 1; } my %binary_file = ( - input => $gitea_bin, + input => $gitea_bin, version => $current_version, ); unless ( defined $current_version ) { - die RED "[DIE]: Unable to get the current gitea version! Value is $current_version", RESET + die RED +"[DIE]: Unable to get the current gitea version! Value is $current_version", + RESET; } return %binary_file; } sub backup_bin { + # Ghetto to get it working for now - my ( %opts ) = %{shift()}; - my $input = $opts{input}; + my (%opts) = %{ shift() }; + my $input = $opts{input}; my $version = $opts{version}; print GREEN "Backing up the current binary\n", RESET; - if (defined $info) { - print YELLOW "[INFO] Input in backup_bin sub is:\n Directory $input\n Version $version\n", RESET; + if ( defined $info ) { + print YELLOW +"[INFO] Input in backup_bin sub is:\n Directory $input\n Version $version\n", + RESET; } - my $gitea_bin_backup = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; + my $gitea_bin_backup = + '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; print GREEN "Gitea bin backup will be $gitea_bin_backup\n", RESET; system("cp $input $input.bak"); - # TODO - # # Do this with a system call to make a compressed copy of the current binary - # # bzip2 -k file.txt - # # my $status = system("vi", "fred.txt"); - # # if (($status >>=8) != 0) { - # # die "[DIE] Failed to run vi"; - # # } - # my $bzip_status = system("bzip2 -k", "$input"); - # if (($status >>=8) != 0) { - # die "[DIE] Failed to run bzip2"; - # } + # TODO + # # Do this with a system call to make a compressed copy of the current binary + # # bzip2 -k file.txt + # # my $status = system("vi", "fred.txt"); + # # if (($status >>=8) != 0) { + # # die "[DIE] Failed to run vi"; + # # } + # my $bzip_status = system("bzip2 -k", "$input"); + # if (($status >>=8) != 0) { + # die "[DIE] Failed to run bzip2"; + # } - return; + return; } sub get_download_url { - my ($dl_filename, $rel_id) = @_; - my $dl_url; + my ( $dl_filename, $rel_id ) = @_; + my $dl_url; + # Get the download_url from the array - my $assetsURL = 'https://api.github.com/repos/go-gitea/gitea/releases/' . $release_id . '/assets'; - if (defined $info) { + my $assetsURL = + 'https://api.github.com/repos/go-gitea/gitea/releases/' + . $release_id + . '/assets'; + if ( defined $info ) { print YELLOW "[INFO] Assets URL\n"; print "$assetsURL\n", RESET; } - my $asset_resp = $ua->get($assetsURL); - my $asset_resp_array_ref = decode_json($asset_resp->content); + my $asset_resp = $ua->get($assetsURL); + my $asset_resp_array_ref = decode_json( $asset_resp->content ); - if (defined $verbose) { - printf(RED "[DEBUG] Array of hashes of the json response for the assets:\n"); + if ( defined $verbose ) { + printf( RED + "[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}) { - 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); + 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 ) { - 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"; $dl_url = $asset_ref->{browser_download_url}; - if (defined $info) { - print YELLOW "[INFO] The download url from the response array is $dl_url\n", RESET; + if ( defined $info ) { + print YELLOW +"[INFO] The download url from the response array is $dl_url\n", + RESET; } return $dl_url; } } - unless ( defined $dl_url ) { - print( RED "ONOES we have no download URL from the github API! Trying to build one manually\n", RESET); - # die RED "[DIE] Can't continue without a download URL", RESET; - print BLUE "Tag we are passing *into* the build_download_url from get_download_url is $orig_tag\n", RESET; - my $dl_url = build_download_url($orig_tag, $download_filename); + unless ( defined $dl_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 0; + return 0; } sub build_download_url { - my ($url_tag, $url_file) = @_; - print BLUE "Tag passed into build_download_url is $url_tag\n", RESET; - # 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) { + 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 { - my $filename=shift; + my $filename = shift; + #my $unz_binary = print("Unpacking the downloaded file, setting owner and permissions\n"); + # Copy the downloaded binary to gitea and chmod it 750 # Doing this with a filthy system call because the perl library # for xz manipulation is a memory hog and buggy besides @@ -266,11 +299,12 @@ sub install_bin { } sub check_gitea_status { - my $gitea_status=`systemctl is-active gitea`; + my $gitea_status = `systemctl is-active gitea`; return $gitea_status; } sub cleanup { + # remove downloaded binary and old backup set install_status=success ELSE remove "gitea" and restore from backup and set install_status=fail return; }