#!/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 Compress::Bzip2 qw(:all :constant :utilities :gzip); # cant get output use Data::Dumper; use JSON; ########################################## ### The user must set these variables ### # SET email address my $email='tclark77@tlcnet.info'; my $filetype='-linux-amd64.xz'; # gitea is hosted on github # GET /repos/go-gitea/gitea/releases/latest # https://api.github.com/repos/go-gitea/gitea/releases/latest =json $VAR1 = { 'upload_url' => 'https://uploads.github.com/repos/go-gitea/gitea/releases/15817548/assets{?name,label}', 'assets_url' => 'https://api.github.com/repos/go-gitea/gitea/releases/15817548/assets', 'tag_name' => 'v1.7.3', 'author' => { 'gravatar_id' => '', etc }, =cut my $gitea_bin = '/home/gitea/bin/gitea'; my $gitea_current_version_string = `$gitea_bin --version`; my $gitea_current_version; if ( $gitea_current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) { $gitea_current_version = $1; } printf("The version of gitea that is running is \"$gitea_current_version\"\n"); # Backup the current binary 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"); =example # IO::File mode print($z $string); printf($z $format, $string); close($z); =cut my $input = $gitea_bin; my $temp_out = '/home/gitea/tempout.bz'; my $bz = new IO::Compress::Bzip2 $temp_out or die "bzip2 failed: $Bzip2Error\n"; # bzip2 $input => "$gitea_bin_backup" # or die "bzip2 failed: $Bzip2Error\n"; # This works, but writes garbage to end of filename # need to do in OO way # https://metacpan.org/pod/IO::Compress::Bzip2 #print $bz $gitea_bin; # This writes the filename as string to the bz #$bz->close(); 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; # In case we need to deref later #my %latest_release_data = %$latest_release_hash; my $tag = $latest_release_hash->{tag_name}; printf("The latest gitea version is $tag\n"); if ( $tag gt $gitea_current_version ) { printf("Proceeding with update\n"); my $dl_filename='gitea-' . $tag . $filetype; printf("Downloaded filename will be $dl_filename\n"); } # Get the download_url from the array # Download version specified\ # $gitea_bin # wget # Unzip downloaded gitea # unxz $GITEA_XZ # 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 # If good then remove downloaded binary and old backup set install_status=success ELSE remove "gitea" and restore from backup and set install_status=fail # Notification # $install_status message