#!/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 use strict; use warnings; #use LWP::Simple; use LWP::UserAgent; #use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ; use Data::Dumper; use JSON; ########################################## ### The user must set these variables ### # SET email address my $email='tclark77@tlcnet.info'; my $filetype='-linux-amd64.xz'; # 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; unless ( defined $gitea_current_version_string ) { die "ERROR: Unable to get the version of the gitea binary: $!"; } my $gitea_current_version; if ( $gitea_current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s/ ) { $gitea_current_version = $1; printf("Current version of gitea that is installed is $1\n"); } elsif ( $gitea_current_version_string =~ m/ion\ (\d+\d+\w*)\s/ ) { $gitea_current_version = $1; printf("Current version of gitea that is installed is $1\n"); $alphanum_ver = 1; print("!! Alpha num is true\n"); } my %binary_file = ( input => $gitea_bin, version => $gitea_current_version, ); unless ( defined $gitea_current_version ) { die "ERROR: Unable to get the current gitea version! Value is $gitea_current_version" } # Backup the current binary backup_bin( \%binary_file ); 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 (via LWP::UserAgent) 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); # printf("!! Print the json response if we have one:\n"); # printf Dumper $latest_release_hash; my $tag = $latest_release_hash->{tag_name}; # Works printf("The latest gitea version is $tag\n"); substr($tag, 0, 1, ''); print("!! Tag is now $tag\n"); my $download_filename='gitea-' . $tag . $filetype; printf("Downloaded filename will be $download_filename\n"); # gitea-1.7.6-linux-amd64.xz my $release_id = $latest_release_hash->{id}; # Works printf("The release id for the latest gitea version is $release_id\n"); if ( $tag gt $gitea_current_version || $alphanum_ver == 1 ) { printf("Proceeding with update\n"); 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"); =devel # Because doing this in perl would be a memory hog `xz -d --keep /home/gitea/bin/$download_filename` # Stop gitea service # rename unpacked binary to gitea or symlink?? # chown gitea.gitea binary # chmod 754 gitea # Check if we can start gitea # If can start then # Remove old binary (backup done at beginning) # Rename new binary to gitea # Remove .xz file # Notify success notify(1) # If no start notify and end & notify fail notify(0) =cut } # If install_bin good then cleanup() #notification( $email ); ##### Subroutines ##### sub backup_bin { my ( %opts ) = %{shift()}; my $input = $opts{input}; my $version = $opts{version}; 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"); 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'; # 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}) { printf("!! Print the name\n"); # printf Dumper $asset_ref; #print $asset_ref->{name} . "\n"; if ( $asset_ref->{name} eq $dl_filename ) { print ("Yay we have a match :D and it is \n"); print $asset_ref->{name} . "\n"; $dl_url = $asset_ref->{browser_download_url}; print("!! The download url is\n $dl_url \n"); return $dl_url; } unless ( defined $dl_url ) { print("ONOES we have no download URL!"); } } print("The download URL returning from sub is $dl_url\n"); return; } sub install_bin{ # Stop service # Copy the downloaded binary to gitea and chmod it 750 # Change owner unless we run this as user gitea # Start service # verify systemctld status is good # return the status return; } 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; }