#!/usr/bin/perl # Update gitea based on version provided # Author: Tracey Clark # Created: 2019-03-04 # You must have a mail transport agent installed to run this script # Note: Daily backups are also being run from cron # /home/gitea/gitea_backup.sh # Re-write to use this dir according to gitea docs # https://docs.gitea.io/en-us/install-from-binary/ use strict; use warnings; use LWP::UserAgent; use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ; use Data::Dumper; use JSON; use Sort::Versions; ########################################## ### The user must set these variables ### # SET email address my $email='tclark77@tlcnet.info'; my $filetype='-linux-amd64'; # https://api.github.com/repos/go-gitea/gitea/releases/latest 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; chomp $gitea_current_version_string; print("System is running \"$gitea_current_version_string\"\n"); unless ( defined $gitea_current_version_string ) { die "ERROR: Unable to get the version of the gitea binary on the system: $!"; } 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 $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 ); my $resp = $ua->get($latestURL); my $latest_release_hash = decode_json($resp->content) or die "ERROR: Unable to parse the version data! Output is:\n $resp"; my $tag = $latest_release_hash->{tag_name}; substr($tag, 0, 1, ''); print("Latest upstream version is $tag\n"); 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 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"); backup_bin( \%binary_file ); my $download_url = get_download_url( $download_filename, $release_id ); print("Downloading the compressed binary\n"); print("Download URL we got from the sub is $download_url\n"); `wget -P $gitea_bin_dir $download_url`; my $xz_file = $gitea_bin_dir . $download_filename; print("!!! xz file is $xz_file\n"); install_bin($download_filename); =devel # TODO # If can start then # Rename new binary to gitea # Remove .xz file # Notify success notify(1) # If no start notify and end & notify fail notify(0) =cut } my $status = check_gitea_status(); if( $status =~ /active/) { print("[INFO] Gitea service is active\n"); } unless( $status =~ /active/) { die"[WARN] Status of gitea is no good!! OMGURD\n"; } $gitea_current_version_string = `$gitea_bin --version`; print("Running version of gitea is now $gitea_current_version_string"); chomp $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"); } else { 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 { # # Check to make sure dependencies installed on system - unit test?? # # bzip2 perl mods # } sub get_current_version { my $current_version_string=shift; my $current_version; if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) { #if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s/ ) { $current_version = $1; printf("Version number of the installed gitea binary: $1\n"); } elsif ( $current_version_string =~ m/ion\ (\d+\d+\w*)\s/ ) { $current_version = $1; printf("Current version number the installed gitea binary: $1\n"); $alphanum_ver = 1; } my %binary_file = ( input => $gitea_bin, version => $current_version, ); unless ( defined $current_version ) { die "ERROR: Unable to get the current gitea version! Value is $current_version" } return %binary_file; } sub backup_bin { # Ghetto to get it working for now my ( %opts ) = %{shift()}; my $input = $opts{input}; my $version = $opts{version}; # my $gitea_bin_backup = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; # printf("Gitea bin backup will be $gitea_bin_backup\n"); # printf("!! Input is $gitea_bin\n and output is $gitea_bin_backup\n"); 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 = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2'; printf("Gitea bin backup will be $gitea_bin_backup\n"); 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 "Failed to run vi"; # # } # my $bzip_status = system("bzip2 -k", "$input"); # if (($status >>=8) != 0) { # die "Failed to run bzip2"; # } return; } sub get_download_url { my ($dl_filename, $rel_id) = @_; my $dl_url; print("Download filename in the sub is $dl_filename\n"); # Get the download_url from the array my $assetsURL = 'https://api.github.com/repos/go-gitea/gitea/releases/' . $release_id . '/assets'; # For debugging # printf("!!! Dump of assets URL"); # printf("!!! $assetsURL\n"); my $asset_resp = $ua->get($assetsURL); my $asset_resp_array_ref = decode_json($asset_resp->content); # printf("!! Print the json response for the assets:\n"); # printf Dumper $asset_resp_array_ref; # Array of hashes foreach my $asset_ref (@{$asset_resp_array_ref}) { if ( $asset_ref->{name} eq $dl_filename ) { 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}; print("!! The download url is $dl_url \n"); return $dl_url; } } unless ( defined $dl_url ) { print("ONOES we have no download URL!"); } return; } sub install_bin { 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 system("xz -d --keep /home/gitea/bin/$filename"); system("systemctl stop gitea"); system("cp $gitea_bin_dir/$unz_filename $gitea_bin"); system("chown gitea.gitea $gitea_bin"); system("chmod 750 $gitea_bin"); # Restart service print("Restarting the gitea service\n"); system("systemctl restart gitea"); return; } sub check_gitea_status { 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; } sub notification { my $to = shift; return; }