source: genappalpha/sbin/setconfig.pl @ 1488

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

fixes for install with tcp messaging

  • Property svn:executable set to *
File size: 14.9 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";
286my $tcprport   = 30781;
287my $tcptimeout = 300;
288
289if ( $$json{ "messaging" }{ "wssport" } ) {
290    if ( $$json{'messaging'}{'wssport'} != $wssport ) {
291        $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";
292    }
293    if ( $fo ) {
294        $$json{ 'messaging'}{'wssport' }         = $wssport;
295    }
296} else {
297    $$json{ 'messaging'}{'wssport' }         = $wssport;
298}
299
300if ( $$json{ "messaging" }{ "wsport" } ) {
301    if ( $$json{'messaging'}{'wsport'} != $wsport ) {
302        $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";
303    }
304    if ( $fo ) {
305        $$json{ 'messaging'}{'wsport' }         = $wsport;
306    }
307} else {
308    $$json{ 'messaging'}{'wsport' }         = $wsport;
309}
310
311if ( $$json{ "messaging" }{ "zmqport" } ) {
312    if ( $$json{'messaging'}{'zmqport'} != $zmqport ) {
313        $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";
314    }
315    if ( $fo ) {
316        $$json{ 'messaging'}{'zmqport' }         = $zmqport;
317    }
318} else {
319    $$json{ 'messaging'}{'zmqport' }         = $zmqport;
320}
321
322if ( $$json{ "messaging" }{ "zmqhostip" } ) {
323    if ( $$json{'messaging'}{'zmqhostip'} ne $zmqhostip ) {
324        $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";
325    }
326    if ( $fo ) {
327        $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
328    }
329} else {
330    $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
331}
332
333if ( $$json{ "messaging" }{ "udpport" } ) {
334    if ( $$json{'messaging'}{'udpport'} != $udpport ) {
335        $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";
336    }
337    if ( $fo ) {
338        $$json{ 'messaging'}{'udpport' }         = $udpport;
339    }
340} else {
341    $$json{ 'messaging'}{'udpport' }         = $udpport;
342}
343
344if ( $$json{ "messaging" }{ "udphostip" } ) {
345    if ( $$json{'messaging'}{'udphostip'} ne $udphostip ) {
346        $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";
347    }
348    if ( $fo ) {
349        $$json{ 'messaging'}{'udphostip' }         = $udphostip;
350    }
351} else {
352    $$json{ 'messaging'}{'udphostip' }         = $udphostip;
353}
354
355if ( $$json{ "messaging" }{ "tcpport" } ) {
356    if ( $$json{'messaging'}{'tcpport'} != $tcpport ) {
357        $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";
358    }
359    if ( $fo ) {
360        $$json{ 'messaging'}{'tcpport' }         = $tcpport;
361    }
362} else {
363    $$json{ 'messaging'}{'tcpport' }         = $tcpport;
364}
365
366if ( $$json{ "messaging" }{ "tcphostip" } ) {
367    if ( $$json{'messaging'}{'tcphostip'} ne $tcphostip ) {
368        $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";
369    }
370    if ( $fo ) {
371        $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
372    }
373} else {
374    $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
375}
376
377if ( $$json{ "messaging" }{ "tcprport" } ) {
378    if ( $$json{'messaging'}{'tcprport'} ne $tcprport ) {
379        $notice .= "The identified tcprport for this server [$tcprport] is different than that stored [$$json{'messaging'}{'tcprport'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
380    }
381    if ( $fo ) {
382        $$json{ 'messaging'}{'tcprport' }         = $tcprport;
383    }
384} else {
385    $$json{ 'messaging'}{'tcprport' }         = $tcprport;
386}
387
388if ( $$json{ "messaging" }{ "tcptimeout" } ) {
389    if ( $$json{'messaging'}{'tcptimeout'} ne $tcptimeout ) {
390        $notice .= "The identified tcptimeout for this server [$tcptimeout] is different than that stored [$$json{'messaging'}{'tcptimeout'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
391    }
392    if ( $fo ) {
393        $$json{ 'messaging'}{'tcptimeout' }         = $tcptimeout;
394    }
395} else {
396    $$json{ 'messaging'}{'tcptimeout' }         = $tcptimeout;
397}
398
399if ( $$json{ "https" } ) {
400    if ( $$json{'https'} != $https ) {
401        $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";
402    }
403    if ( $fo ) {
404        $$json{'https'}         = int($https);
405    }
406} else {
407    $$json{'https'}         = int($https);
408}
409
410if ( !$webroot ) {
411    $webroot = "/var/www/html" if $os =~ /^(ubuntu|centos|redhat|scientific)$/;
412    $webroot = "/var/www/htdocs" if $os =~ /^slackware$/;
413}
414
415if ( $$json{ "webroot" } ) {
416    if ( $$json{'webroot'} != $webroot ) {
417        $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";
418    }
419    if ( $fo ) {
420        $$json{'webroot'}         = $webroot;
421    }
422} else {
423    $$json{'webroot'}         = $webroot;
424}
425
426open my $fh, ">$f" || die "$0: can not open $f for writing, check permissions\n";
427print $fh to_json( $json, { utf8 => 1, pretty => 1 } );
428close $fh;
429
430if ( $pj ) {
431    print "-"x80 . "\n";
432    print "Final config.json:\n";
433    print "-"x80 . "\n";
434    {
435        my $js = JSON->new;
436        print $js->pretty->encode( $json );
437    }
438    print "-"x80 . "\n";
439}
440
441print "-"x80 . "\n" . "Notices:\n" . "-"x80 . "\n" . $notice . "-"x80 . "\n" if $notice;
Note: See TracBrowser for help on using the repository browser.