source: genappalpha/sbin/setconfig.pl @ 1486

Last change on this file since 1486 was 1486, checked in by ehb, 4 years ago

Install updates + support for Centos 7.5 & Ubuntu 18.04

  • Property svn:executable set to *
File size: 13.8 KB
Line 
1#!/usr/bin/perl
2
3my $gb   = $ENV{ "GENAPP" };
4if ( !$gb ) {
5    use Cwd 'abs_path';
6    $gb = abs_path($0);
7    $gb =~ s/\/sbin\/setconfig\.pl$//;
8}
9
10if ( $] < 5.018 ) {
11    if ( -e "$gb/perl/bin/perl" ) {
12        $pv =`$gb/perl/bin/perl -e 'print \$];'`;
13        if ( $pv >= 5.018 ) {
14            print "will run new version\n" if $debug;
15            unshift @ARGV, $0;
16            exec( "$gb/perl/bin/perl", @ARGV );
17        } else {
18            die "$gb/perl/bin/perl exists, but not a correct version of perl (needs a minimum of 5.18)\n";
19        }
20    } else {
21        die "you need to install a version of perl >= 5.18 in $gb/perl\n
22there is a script $gb/sbin/install-perl-stable to do this";
23    }
24}
25
26my $rc = eval {
27    require JSON;         JSON->import( -support_by_pp );
28};
29
30my $notes = "
31usage: $0
32
33sets up $gb/config.json
34
35options
36 -f                            force overwrite of identified values to those previously stored
37 -h                            show help
38 -hostip hostip                use specified host ip address
39 -hostname hostname            use specified host name
40 -if network-interface-id      find and set hostip from that of specified interface (e.g. eth0, eth1, lo, etc)
41 -pj                           print resulting config.json
42 -https                        use https and wss
43 -webroot webroot              specifiy the webroot directory
44";
45
46my $pj;
47my $fo;
48my $hostip;
49my $hostname;
50my $https = 0;
51my $webroot;
52
53while ( @ARGV ) {
54    my $option = shift @ARGV;
55    if ( $option =~ /^-f$/ ) {
56        $fo = 1;
57        next;
58    }
59    if ( $option =~ /^-if$/ ) {
60        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
61        my $if = shift @ARGV; 
62        my $cmd = "/sbin/ip -4 addr show $if | grep inet | awk '{ print \$2 }' | sed 's/\\\/.*\$//'";
63        $hostip = `$cmd`;
64        chomp $hostip;
65        die "$0: could not get hostip of interface $if\n" if !$hostip;
66        next;
67    }
68    if ( $option =~ /^-hostip$/ ) {
69        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
70        $hostip = shift @ARGV;;
71        next;
72    }
73    if ( $option =~ /^-hostname$/ ) {
74        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
75        $hostname = shift @ARGV;;
76        next;
77    }
78    if ( $option =~ /^-webroot$/ ) {
79        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
80        $webroot = shift @ARGV;;
81        next;
82    }
83    if ( $option =~ /^-h$/ ) {
84        print $notes;
85        exit;
86    }
87    if ( $option =~ /^-pj$/ ) {
88        $pj++;
89        next;
90    }
91    if ( $option =~ /^-https$/ ) {
92        $https++;
93        next;
94    }
95
96    die "Unknown command line option specified '$option'\n" . $notes;
97}
98
99my $f = "$gb/etc/config.json";
100
101my $json = {};
102
103if ( -e $f ) {
104    print "reading $f\n";
105    open my $fh, $f || die "$0: can not open $f\n";
106    my @ol = <$fh>;
107    close $fh;
108    my @l = grep !/^\s*#/ , @ol;
109    my $l = join '', @l;
110    eval {
111        $json = decode_json( $l );
112        1;
113    } || do {
114        my $e = $@;
115       
116        # figure out line #
117
118        my ( $cp ) = $e =~ /at character offset (\d+) /;
119        my $i;
120        my $cpos = $cp;
121        for ( $i = 0; $i < @ol; ++$i ) {
122            next if $ol[ $i ] =~ /^\s*#/;
123            $cpos -= length( $ol[ $i ] );
124            last if $cpos < 0;
125        }
126
127        my $sline = $i - 2;
128        my $eline = $i + 2;
129        $sline = 0 if $sline < 0;
130        $eline = @ol - 1 if $eline >= @ol;
131
132        print "JSON Error in file $f near these lines:\n";
133        for ( my $j = $sline; $j <= $eline; ++$j ) {
134            my $uj = $j + 1;
135            print "$uj: $ol[$j]";
136            print "$uj: " .'^'x(length($ol[$j])) . "\n" if $j == $i;
137        }
138        die;
139    };
140}
141
142# determine os
143
144my $tos = `uname -v`;
145my $os;
146my $os_release;
147
148$os = 'ubuntu' if $tos =~ /Ubuntu/;
149
150if ( $os eq 'ubuntu' ) {
151    $os_release = `lsb_release -r | awk '{ print \$2 }'`;
152    chomp $os_release;
153}
154
155if ( !$os && -e "/etc/redhat-release" ) {
156# check for centos/redhat
157    my $check = `cat /etc/redhat-release`;
158    chomp $check;
159    if ( $check =~ /^CentOS .* release/ ) {
160        $os = "centos";
161        ( $os_release ) = $check =~ /^CentOS .* release (\S+)/;
162       
163    } else {
164        if ( $check =~ /^CentOS release/ ) {
165            $os = "centos";
166            ( $os_release ) = $check =~ /^CentOS release (\S+)/;
167        }
168    }
169    if ( $check =~ /^Red Hat Enterprise Linux Server release/ ) {
170        $os = "redhat";
171        ( $os_release ) = $check =~ /^Red Hat Enterprise Linux Server release (\S+)/;
172    }
173    if ( $check =~ /^Scientific Linux release/ ) {
174        $os = "scientific";
175        ( $os_release ) = $check =~ /^Scientific Linux release (\S+)/;
176        if ( -e "/etc/cernvm-release" ) {
177            $os_release .= "-cernvm";
178        }
179    }
180}   
181
182if ( !$os  && -e "/etc/slackware-version" ) {
183    my $check = `cat /etc/slackware-version`;
184    $os = "slackware";
185    ( $os_release ) = $check =~ /^Slackware (\S+)/;
186}
187
188if ( !os ) {
189    warn "$0: operating system not recognized\n";
190}
191
192print "Operating system is identified as '$os' release '$os_release'\n";
193
194my $notice;
195
196if ( $$json{'os'} ) {
197    if ( $$json{'os'} ne $os ) {
198        $notice .= "The identified operating system [$os] is different than that stored [$$json{'os'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
199    } else {
200        if ( $$json{'os_release'} ne $os_release ) {
201            $notice .= "The identified $os release [$os_release] is different than that stored [$$json{'os_release'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
202        }
203    }
204    if ( $fo ) {
205        $$json{ 'os' }         = $os;
206        $$json{ 'os_release' } = $os_release;
207    }
208} else {
209    $$json{ 'os' }         = $os;
210    $$json{ 'os_release' } = $os_release;
211}
212
213if ( !$hostip ) {
214    my $foundwgetorcurl;
215    if ( `which wget 2> /dev/null` ) {
216        $hostip = `wget http://ipinfo.io/ip -qO -`;
217        chomp $hostip;
218        $foundwgetorcurl++;
219    } else {
220        if ( `which curl 2> /dev/null` ) {
221            $cmd = 'curl -q ipinfo.io 2> /dev/null | grep \'"ip":\' | awk \'{ print $2 }\' | sed s/,// | sed s/\"//g';
222            $hostip = `$cmd`;
223            chomp $hostip;
224            $foundwgetorcurl++;
225        }
226    }
227    die "$0: please install wget or curl so that your public ip address can be determined" if !$foundwgetorcurl;
228}
229
230if ( $$json{'hostip'} ) {
231    if ( $$json{'hostip'} ne $hostip ) {
232        $notice .= "The identified hostip for this server [$hostip] is different than that stored [$$json{'hostip'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
233    }
234    if ( $fo ) {
235        $$json{ 'hostip' }         = $hostip;
236    }
237} else {
238    $$json{ 'hostip' }         = $hostip;
239}
240
241if ( !$hostname ) {
242    $hostname = `host $hostip` if !$hostname;
243    chomp $hostname;
244    if ( $hostname =~ /(not found|no PTR record)/ ) {
245        $hostname = $hostip;
246    } else {
247        ( $hostname ) = $hostname =~ /\s+(\S+)\.$/;
248    }
249}
250
251if ( $$json{'hostname'} ) {
252    if ( $$json{'hostname'} ne $hostname ) {
253        $notice .= "The identified hostname for this server [$hostname] is different than that stored [$$json{'hostname'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
254    }
255    if ( $fo ) {
256        $$json{ 'hostname' }         = $hostname;
257    }
258} else {
259    $$json{ 'hostname' }         = $hostname;
260}
261
262$hostname = $$json{ 'hostname' };
263# verify hostname matches ip address
264{
265    my $nametoip;
266    if ( `which dig 2> /dev/null` ) {
267        $nametoip = `dig \@8.8.8.8 +short $hostname`;
268    } else {
269        $nametoip = `host $hostname | awk '/has address/ { print \$4 }'`;
270    }
271    chomp $nametoip;
272    if ( $nametoip ne $hostip ) {
273        $notice .= "WARNING: the ip address from a DNS lookup [$nametoip] of the hostname [$hostname] does not match the hostip [$hostip]. This will create issues unless you really understand what you are doing!\n";
274    }
275}
276
277
278my $wssport   = $https ? 443 : 80;
279my $wsport    = 30777;
280my $zmqport   = 30778;
281my $zmqhostip = "127.0.0.1";
282my $udpport   = 30779;
283my $udphostip = "127.0.0.1";
284my $tcpport   = 30780;
285my $tcphostip = "127.0.0.1";
286
287if ( $$json{ "messaging" }{ "wssport" } ) {
288    if ( $$json{'messaging'}{'wssport'} != $wssport ) {
289        $notice .= "The identified wssport for this server [$wssport] is different than that stored [$$json{'messaging'}{'wssport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
290    }
291    if ( $fo ) {
292        $$json{ 'messaging'}{'wssport' }         = $wssport;
293    }
294} else {
295    $$json{ 'messaging'}{'wssport' }         = $wssport;
296}
297
298if ( $$json{ "messaging" }{ "wsport" } ) {
299    if ( $$json{'messaging'}{'wsport'} != $wsport ) {
300        $notice .= "The identified wsport for this server [$wsport] is different than that stored [$$json{'messaging'}{'wsport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
301    }
302    if ( $fo ) {
303        $$json{ 'messaging'}{'wsport' }         = $wsport;
304    }
305} else {
306    $$json{ 'messaging'}{'wsport' }         = $wsport;
307}
308
309if ( $$json{ "messaging" }{ "zmqport" } ) {
310    if ( $$json{'messaging'}{'zmqport'} != $zmqport ) {
311        $notice .= "The identified zmqport for this server [$zmqport] is different than that stored [$$json{'messaging'}{'zmqport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
312    }
313    if ( $fo ) {
314        $$json{ 'messaging'}{'zmqport' }         = $zmqport;
315    }
316} else {
317    $$json{ 'messaging'}{'zmqport' }         = $zmqport;
318}
319
320if ( $$json{ "messaging" }{ "zmqhostip" } ) {
321    if ( $$json{'messaging'}{'zmqhostip'} ne $zmqhostip ) {
322        $notice .= "The identified zmqhostip for this server [$zmqhostip] is different than that stored [$$json{'messaging'}{'zmqhostip'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
323    }
324    if ( $fo ) {
325        $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
326    }
327} else {
328    $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
329}
330
331if ( $$json{ "messaging" }{ "udpport" } ) {
332    if ( $$json{'messaging'}{'udpport'} != $udpport ) {
333        $notice .= "The identified udpport for this server [$udpport] is different than that stored [$$json{'messaging'}{'udpport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
334    }
335    if ( $fo ) {
336        $$json{ 'messaging'}{'udpport' }         = $udpport;
337    }
338} else {
339    $$json{ 'messaging'}{'udpport' }         = $udpport;
340}
341
342if ( $$json{ "messaging" }{ "udphostip" } ) {
343    if ( $$json{'messaging'}{'udphostip'} ne $udphostip ) {
344        $notice .= "The identified udphostip for this server [$udphostip] is different than that stored [$$json{'messaging'}{'udphostip'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
345    }
346    if ( $fo ) {
347        $$json{ 'messaging'}{'udphostip' }         = $udphostip;
348    }
349} else {
350    $$json{ 'messaging'}{'udphostip' }         = $udphostip;
351}
352
353if ( $$json{ "messaging" }{ "tcpport" } ) {
354    if ( $$json{'messaging'}{'tcpport'} != $tcpport ) {
355        $notice .= "The identified tcpport for this server [$tcpport] is different than that stored [$$json{'messaging'}{'tcpport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
356    }
357    if ( $fo ) {
358        $$json{ 'messaging'}{'tcpport' }         = $tcpport;
359    }
360} else {
361    $$json{ 'messaging'}{'tcpport' }         = $tcpport;
362}
363
364if ( $$json{ "messaging" }{ "tcphostip" } ) {
365    if ( $$json{'messaging'}{'tcphostip'} ne $tcphostip ) {
366        $notice .= "The identified tcphostip for this server [$tcphostip] is different than that stored [$$json{'messaging'}{'tcphostip'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
367    }
368    if ( $fo ) {
369        $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
370    }
371} else {
372    $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
373}
374
375if ( $$json{ "https" } ) {
376    if ( $$json{'https'} != $https ) {
377        $notice .= "The identified https flag for this server [$https] is different than that stored [$$json{'https'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
378    }
379    if ( $fo ) {
380        $$json{'https'}         = int($https);
381    }
382} else {
383    $$json{'https'}         = int($https);
384}
385
386if ( !$webroot ) {
387    $webroot = "/var/www/html" if $os =~ /^(ubuntu|centos|redhat|scientific)$/;
388    $webroot = "/var/www/htdocs" if $os =~ /^slackware$/;
389}
390
391if ( $$json{ "webroot" } ) {
392    if ( $$json{'webroot'} != $webroot ) {
393        $notice .= "The identified webroot for this server [$webroot] is different than that stored [$$json{'webroot'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
394    }
395    if ( $fo ) {
396        $$json{'webroot'}         = $webroot;
397    }
398} else {
399    $$json{'webroot'}         = $webroot;
400}
401
402open my $fh, ">$f" || die "$0: can not open $f for writing, check permissions\n";
403print $fh to_json( $json, { utf8 => 1, pretty => 1 } );
404close $fh;
405
406if ( $pj ) {
407    print "-"x80 . "\n";
408    print "Final config.json:\n";
409    print "-"x80 . "\n";
410    {
411        my $js = JSON->new;
412        print $js->pretty->encode( $json );
413    }
414    print "-"x80 . "\n";
415}
416
417print "-"x80 . "\n" . "Notices:\n" . "-"x80 . "\n" . $notice . "-"x80 . "\n" if $notice;
Note: See TracBrowser for help on using the repository browser.