Subversion Repositories camp_sysinfo_client_3

Rev

Rev 244 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
191 rodolico 1
#! /usr/bin/env perl
2
 
3
use warnings;
4
use strict;
5
 
192 rodolico 6
use LWP::Simple; # apt install libwww-perl
191 rodolico 7
 
196 rodolico 8
# Must be passed full path to config file
9
#
10
# This is a simple script to use the postrun. To enable it, store it in the same directory as sysinf-client, then add the following
11
# to your configuration file
12
# postRunScript:
13
#   'script name': postrunscript.pl
14
#
15
# you will also need to add the some additional values to the above
16
#
17
# Script is designed to download an executable from some web server defined in $configuration{'postRunScript'}{'URL'}
18
# It will first download a checksum file from there. If that checksum is different from the one in this directory, it will 
19
# then download the executable  and run it.
20
# 
21
# values to look for in the configuration file:
22
# $configuration{'postRunScript'}{'URL'};
23
# $configuration{'postRunScript'}{'checksum'};
24
# $configuration{'postRunScript'}{'update script'};
25
#
26
# The YAML equivilent is
27
# postRunScript:
28
#   'script name': postrunscript.pl
29
#    URL: https://example.com/
30
#    checksum: sysinfo_update.cksum
31
#    'update script': sysinfo_update
32
#
33
# this script will try to download https://example.com/sysinfo_update.cksum. If it exists it will compare the contents
34
# to sysinfo_update.cksum in the directory this script is in. If they are different (or there is no file in the script directory)
35
# the contents will be written, then https://example.com/sysinfo_update will be downloaded. sysinfo_update will be changed to mod
36
# 0500, then executed the file
37
#
38
# NOTE: the checksum file doesn't really need a checksum (no checking is made). It just have different contents than what is 
39
# on disk
191 rodolico 40
 
41
 
42
# find our location and use it for searching for libraries
43
BEGIN {
44
   use FindBin;
45
   use File::Spec;
46
   use lib File::Spec->catdir($FindBin::Bin);
47
   eval( 'use YAML::Tiny;' );
48
   eval( 'use Data::Dumper;' );
49
}
50
 
51
# contains the directory our script is in
192 rodolico 52
my $scriptDir = File::Spec->catdir($FindBin::Bin);
53
$scriptDir .= '/' unless substr( $scriptDir, -1 ) eq '/';
191 rodolico 54
 
194 rodolico 55
#######################################################
56
#
57
# loadConfigurationFile($confFile)
58
#
196 rodolico 59
# I just wrote is simple instead of using the library since it just does a YAML read
60
#
194 rodolico 61
# Parameters:
62
#    $fileName - name of file to look for
196 rodolico 63
# Returns
64
# reference to hash of configuration information
194 rodolico 65
#
66
#######################################################
191 rodolico 67
 
194 rodolico 68
sub loadConfigurationFile {   
69
   my ( $fileName ) = @_;
70
   my $yaml = YAML::Tiny->read( $fileName );
71
   return $yaml->[0];
72
   die "Can not find $fileName\n";
73
}
74
 
196 rodolico 75
#######################################################
76
# getWriteFile
77
# 
78
# Probably doesn't even need to be a sub it is so simple. Download $filename from $url, 
79
# and store it in $dir/$filename
80
#
81
# Parameters:
82
#   $dir - the local directory to store the downloaded file
83
#   $url - the URL (withou the file name) to download from
84
#   $filename - The name of the file, bot at URL and stored in $dir
85
#
86
#######################################################
191 rodolico 87
sub getWriteFile {
88
   my ($dir, $url, $filename) = @_;
192 rodolico 89
   return getstore("$url$filename", "$dir$filename");
191 rodolico 90
}
91
 
196 rodolico 92
### Main ###
93
# get the config file name from the command line
194 rodolico 94
my $configFile = $ARGV[0];
95
die "Usage: $0 configFileName\n" unless $configFile;
196 rodolico 96
# load the configuration file
194 rodolico 97
my %configuration = %{ &loadConfigurationFile( $configFile) };
98
 
99
die "Configuration does not contain postRunScript URL\n" unless defined $configuration{'postRunScript'}{'URL'};
100
 
196 rodolico 101
# get the values we need
194 rodolico 102
my $URL = $configuration{'postRunScript'}{'URL'};
103
my $checksum = $configuration{'postRunScript'}{'checksum'};
104
my $update = $configuration{'postRunScript'}{'update script'};
105
 
196 rodolico 106
# check for a current checksum file and get the value if it exists (one line only)
191 rodolico 107
my $currentChecksum = '';
192 rodolico 108
if ( -f "$scriptDir$checksum" ) {
109
   open CK, "<$scriptDir$checksum" or warn "could not read $scriptDir$checksum: $!\n";
191 rodolico 110
   $currentChecksum = <CK>;
111
   close CK;
112
}
113
 
196 rodolico 114
# download checksum from URL, storing in $data
191 rodolico 115
my $data = get( $URL . $checksum );
196 rodolico 116
if ( $data && $data ne $currentChecksum ) { # checksums different, so we have to do something
117
   # grab it again, but save it this time
192 rodolico 118
   my $response = getstore( "$URL$checksum", "$scriptDir$checksum" );
196 rodolico 119
   # if we got something (should always happen, so the if is likely useless)
192 rodolico 120
   if ( is_success( $response ) ) {
196 rodolico 121
      # get the executable
192 rodolico 122
      $response = getstore( "$URL$update", "$scriptDir$update" );
196 rodolico 123
      if ( is_success( $response ) ) { # success
124
         # Make executable and execute it
125
         chmod 0500, $scriptDir . $update;
126
         exec( "$scriptDir$update" ) or print STDERR "Could not execute $scriptDir$update: $!\n";
192 rodolico 127
      }
191 rodolico 128
   }
129
}
130
 
131
1;