https://github.com/genome/genome
Raw File
Tip revision: 76ca381fce687554f38ee1dfb92771908f5b6557 authored by Nathaniel Nutter on 02 July 2014, 02:17:26 UTC
improvements to PSGI apps
Tip revision: 76ca381
genome_view_init_wrapper.pl
#!/usr/bin/env perl

use Cwd qw(realpath);
use File::Basename;
require LWP::UserAgent;

print STDERR "Getting current snapshot version... ";
my $current_snapshot_version = current_snapshot_version();
print STDERR "$current_snapshot_version\n";

print STDERR "Checking current version...\n";
if (wait_for_valid_http_response($current_snapshot_version, 10)) {
    print STDERR "Web server is already running on $current_snapshot_version, skipping restart.\n";
} else {
    print STDERR "Restarting web server...\n";
    unless (restart_web_server($current_snapshot_version)) {
        exit 255;
    }
}

sub current_snapshot_version {
    my $snapshot_path = realpath('/gsc/scripts/opt/genome/current/web');
    return basename($snapshot_path);
}

sub restart_web_server {
    my $snapshot_version = shift;

    reload_genome_view();
    my $restart_succeeded = wait_for_valid_http_response($snapshot_version);
    unless ($restart_succeeded) {
        print STDERR "\n\nReload failed so attempting a stop and start.\n\n";
        return unless stop_genome_view();
        return unless start_genome_view();
        $restart_succeeded = wait_for_valid_http_response($snapshot_version);
    }

    return $restart_succeeded;
}

sub wait_for_valid_http_response {
    my $snapshot_version = shift;
    my $max_elapsed_seconds = shift || 120;
    my $start_time = time;

    my $url = 'https://127.0.0.1/view/genome/search/status.html';

    my $user_agent = LWP::UserAgent->new(timeout => 10);
    if ($user_agent->can('ssl_opts')) {
        $user_agent->ssl_opts(verify_hostname => 0);
    }

    my $response;
    do {
        $response = $user_agent->get($url);
        sleep(3);
    } until (valid_http_response($response, $snapshot_version) || (time - $start_time) >= $max_elapsed_seconds);

    return valid_http_response($response, $snapshot_version);
}

sub valid_http_response {
    my $response = shift || return;
    my $snapshot_version = shift || die;

    my $code = $response->code;

    if ($response->is_success) {
        my @content = split("\n", $response->decoded_content);
        if ( grep { $_ =~ /^<!-- Genome: .*$snapshot_version\/lib\/perl\/Genome.pm-->$/ } @content ) {
            print STDERR "OK: Web server is up (" . $response->status_line . ") on new version ($snapshot_version).\n";
            return 1;
        }
        else {
            print STDERR "Not OK: Web server is up (" . $response->status_line . ") but *not* on new version ($snapshot_version).\n";
            return;
        }
    }
    else {
        print STDERR "Not OK: Failed to get successful response (" . $response->status_line . ") from URL (". $response->filename . ").\n";
        return;
    }
}

sub reload_genome_view {
    my $reload_genome_view_cmd = "sudo /etc/init.d/genome_view reload";
    print STDERR "RUNNING ($reload_genome_view_cmd)...\n";
    my $exit_code = system("$reload_genome_view_cmd");
    if ($exit_code != 0) {
        print STDERR "Command ($reload_genome_view_cmd) did not succeed.\n";
        return;
    }
    return 1;
}

sub stop_genome_view {
    my $stop_genome_view_cmd = "sudo /etc/init.d/genome_view stop";
    print STDERR "RUNNING ($stop_genome_view_cmd)...\n";
    my $exit_code = system("$stop_genome_view_cmd");
    if ($exit_code != 0) {
        print STDERR "Command ($stop_genome_view_cmd) did not succeed.\n";
        return;
    }
    return 1;
}

sub start_genome_view {
    my $start_genome_view_cmd = "sudo /etc/init.d/genome_view start";
    print STDERR "RUNNING ($start_genome_view_cmd)...\n";
    my $exit_code = system("$start_genome_view_cmd");
    if ($exit_code != 0) {
        print STDERR "Command ($start_genome_view_cmd) did not succeed.\n";
        return;
    }
    return 1;
}
back to top