source: genapp/sbin/setconfig.pl

Last change on this file was 1682, checked in by ehb, 3 years ago

Fixes for 18.04 & setconfig issue

  • Property svn:executable set to *
File size: 16.6 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 -publicport                   specify a public port (used for websockets)
44 -webroot webroot              specify the webroot directory
45 -mongossl hostname cafile     specify the hostname and certificate file for mongod
46";
47
48my $pj;
49my $fo;
50my $hostip;
51my $hostname;
52my $https = 0;
53my $webroot;
54
55while ( @ARGV ) {
56    my $option = shift @ARGV;
57    if ( $option =~ /^-f$/ ) {
58        $fo = 1;
59        next;
60    }
61    if ( $option =~ /^-if$/ ) {
62        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
63        my $if = shift @ARGV; 
64        my $cmd = "/sbin/ip -4 addr show $if | grep inet | awk '{ print \$2 }' | sed 's/\\\/.*\$//'";
65        $hostip = `$cmd`;
66        chomp $hostip;
67        die "$0: could not get hostip of interface $if\n" if !$hostip;
68        next;
69    }
70    if ( $option =~ /^-hostip$/ ) {
71        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
72        $hostip = shift @ARGV;
73        next;
74    }
75    if ( $option =~ /^-hostname$/ ) {
76        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
77        $hostname = shift @ARGV;
78        next;
79    }
80    if ( $option =~ /^-webroot$/ ) {
81        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
82        $webroot = shift @ARGV;;
83        next;
84    }
85    if ( $option =~ /^-publicport$/ ) {
86        die "$0: option $option requries an argument\n" . $notes if !@ARGV;
87        $publicport = shift @ARGV;;
88        next;
89    }
90    if ( $option =~ /^-h$/ ) {
91        print $notes;
92        exit;
93    }
94    if ( $option =~ /^-pj$/ ) {
95        $pj++;
96        next;
97    }
98    if ( $option =~ /^-https$/ ) {
99        $https++;
100        next;
101    }
102    if ( $option =~ /^-mongossl$/ ) {
103        $mongosslhost = shift @ARGV;
104        $mongourl = "mongodb://${mongosslhost}:27017/?ssl=true";
105        die "$0: option $option requries two arguments\n" . $notes if !@ARGV;
106        $mongocafile = shift @ARGV;
107        next;
108    }
109
110    die "Unknown command line option specified '$option'\n" . $notes;
111}
112
113my $f = "$gb/etc/config.json";
114
115my $json = {};
116
117if ( -e $f ) {
118    print "reading $f\n";
119    open my $fh, $f || die "$0: can not open $f\n";
120    my @ol = <$fh>;
121    close $fh;
122    my @l = grep !/^\s*#/ , @ol;
123    my $l = join '', @l;
124    eval {
125        $json = decode_json( $l );
126        1;
127    } || do {
128        my $e = $@;
129       
130        # figure out line #
131
132        my ( $cp ) = $e =~ /at character offset (\d+) /;
133        my $i;
134        my $cpos = $cp;
135        for ( $i = 0; $i < @ol; ++$i ) {
136            next if $ol[ $i ] =~ /^\s*#/;
137            $cpos -= length( $ol[ $i ] );
138            last if $cpos < 0;
139        }
140
141        my $sline = $i - 2;
142        my $eline = $i + 2;
143        $sline = 0 if $sline < 0;
144        $eline = @ol - 1 if $eline >= @ol;
145
146        print "JSON Error in file $f near these lines:\n";
147        for ( my $j = $sline; $j <= $eline; ++$j ) {
148            my $uj = $j + 1;
149            print "$uj: $ol[$j]";
150            print "$uj: " .'^'x(length($ol[$j])) . "\n" if $j == $i;
151        }
152        die;
153    };
154}
155
156# determine os
157
158my $tos = `uname -v`;
159my $os;
160my $os_release;
161
162$os = 'ubuntu' if $tos =~ /Ubuntu/;
163
164if ( $os eq 'ubuntu' ) {
165    $os_release = `lsb_release -r | awk '{ print \$2 }'`;
166    chomp $os_release;
167}
168
169if ( !$os && -e "/etc/redhat-release" ) {
170# check for centos/redhat
171    my $check = `cat /etc/redhat-release`;
172    chomp $check;
173    if ( $check =~ /^CentOS .* release/ ) {
174        $os = "centos";
175        ( $os_release ) = $check =~ /^CentOS .* release (\S+)/;
176       
177    } else {
178        if ( $check =~ /^CentOS release/ ) {
179            $os = "centos";
180            ( $os_release ) = $check =~ /^CentOS release (\S+)/;
181        }
182    }
183    if ( $check =~ /^Red Hat Enterprise Linux Server release/ ) {
184        $os = "redhat";
185        ( $os_release ) = $check =~ /^Red Hat Enterprise Linux Server release (\S+)/;
186    }
187    if ( $check =~ /^Scientific Linux release/ ) {
188        $os = "scientific";
189        ( $os_release ) = $check =~ /^Scientific Linux release (\S+)/;
190        if ( -e "/etc/cernvm-release" ) {
191            $os_release .= "-cernvm";
192        }
193    }
194}   
195
196if ( !$os  && -e "/etc/slackware-version" ) {
197    my $check = `cat /etc/slackware-version`;
198    $os = "slackware";
199    ( $os_release ) = $check =~ /^Slackware (\S+)/;
200}
201
202if ( !os ) {
203    warn "$0: operating system not recognized\n";
204}
205
206print "Operating system is identified as '$os' release '$os_release'\n";
207
208my $notice;
209
210if ( $$json{'os'} ) {
211    if ( $$json{'os'} ne $os ) {
212        $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";
213    } else {
214        if ( $$json{'os_release'} ne $os_release ) {
215            $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";
216        }
217    }
218    if ( $fo ) {
219        $$json{ 'os' }         = $os;
220        $$json{ 'os_release' } = $os_release;
221    }
222} else {
223    $$json{ 'os' }         = $os;
224    $$json{ 'os_release' } = $os_release;
225}
226
227if ( !$hostip ) {
228    my $foundwgetorcurl;
229    if ( `which wget 2> /dev/null` ) {
230        $hostip = `wget http://ipinfo.io/ip -qO -`;
231        chomp $hostip;
232        $foundwgetorcurl++;
233    } else {
234        if ( `which curl 2> /dev/null` ) {
235            $cmd = 'curl -q ipinfo.io 2> /dev/null | grep \'"ip":\' | awk \'{ print $2 }\' | sed s/,// | sed s/\"//g';
236            $hostip = `$cmd`;
237            chomp $hostip;
238            $foundwgetorcurl++;
239        }
240    }
241    die "$0: please install wget or curl so that your public ip address can be determined" if !$foundwgetorcurl;
242}
243
244if ( $$json{'hostip'} ) {
245    if ( $$json{'hostip'} ne $hostip ) {
246        $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";
247    }
248    if ( $fo ) {
249        $$json{ 'hostip' }         = $hostip;
250    }
251} else {
252    $$json{ 'hostip' }         = $hostip;
253}
254
255if ( !$hostname ) {
256    $hostname = `host $hostip` if !$hostname;
257    chomp $hostname;
258    if ( $hostname =~ /(not found|no PTR record)/ ) {
259        $hostname = $hostip;
260    } else {
261        ( $hostname ) = $hostname =~ /\s+(\S+)\.$/;
262    }
263}
264
265if ( $$json{'hostname'} ) {
266    if ( $$json{'hostname'} ne $hostname ) {
267        $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";
268    }
269    if ( $fo ) {
270        $$json{ 'hostname' }         = $hostname;
271    }
272} else {
273    $$json{ 'hostname' }         = $hostname;
274}
275
276$hostname = $$json{ 'hostname' };
277# verify hostname matches ip address
278{
279    my $nametoip;
280    if ( `which dig 2> /dev/null` ) {
281        $nametoip = `dig \@8.8.8.8 +short $hostname`;
282    } else {
283        $nametoip = `host $hostname | awk '/has address/ { print \$4 }'`;
284    }
285    chomp $nametoip;
286    if ( $nametoip ne $hostip ) {
287        $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";
288    }
289}
290
291
292my $wssport    = $https ? 443 : 80;
293$wssport    = $publicport if $publicport;
294my $wsport     = 30777;
295my $zmqport    = 30778;
296my $zmqhostip  = "127.0.0.1";
297my $udpport    = 30779;
298my $udphostip  = "127.0.0.1";
299my $tcpport    = 30780;
300my $tcphostip  = "127.0.0.1";
301my $tcprport   = 30781;
302my $tcptimeout = 300;
303
304if ( $$json{ "messaging" }{ "wssport" } ) {
305    if ( $$json{'messaging'}{'wssport'} != $wssport ) {
306        $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";
307    }
308    if ( $fo ) {
309        $$json{ 'messaging'}{'wssport' }         = $wssport;
310    }
311} else {
312    $$json{ 'messaging'}{'wssport' }         = $wssport;
313}
314
315if ( $$json{ "messaging" }{ "wsport" } ) {
316    if ( $$json{'messaging'}{'wsport'} != $wsport ) {
317        $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";
318    }
319    if ( $fo ) {
320        $$json{ 'messaging'}{'wsport' }         = $wsport;
321    }
322} else {
323    $$json{ 'messaging'}{'wsport' }         = $wsport;
324}
325
326if ( $$json{ "messaging" }{ "zmqport" } ) {
327    if ( $$json{'messaging'}{'zmqport'} != $zmqport ) {
328        $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";
329    }
330    if ( $fo ) {
331        $$json{ 'messaging'}{'zmqport' }         = $zmqport;
332    }
333} else {
334    $$json{ 'messaging'}{'zmqport' }         = $zmqport;
335}
336
337if ( $$json{ "messaging" }{ "zmqhostip" } ) {
338    if ( $$json{'messaging'}{'zmqhostip'} ne $zmqhostip ) {
339        $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";
340    }
341    if ( $fo ) {
342        $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
343    }
344} else {
345    $$json{ 'messaging'}{'zmqhostip' }         = $zmqhostip;
346}
347
348if ( $$json{ "messaging" }{ "udpport" } ) {
349    if ( $$json{'messaging'}{'udpport'} != $udpport ) {
350        $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";
351    }
352    if ( $fo ) {
353        $$json{ 'messaging'}{'udpport' }         = $udpport;
354    }
355} else {
356    $$json{ 'messaging'}{'udpport' }         = $udpport;
357}
358
359if ( $$json{ "messaging" }{ "udphostip" } ) {
360    if ( $$json{'messaging'}{'udphostip'} ne $udphostip ) {
361        $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";
362    }
363    if ( $fo ) {
364        $$json{ 'messaging'}{'udphostip' }         = $udphostip;
365    }
366} else {
367    $$json{ 'messaging'}{'udphostip' }         = $udphostip;
368}
369
370if ( $$json{ "messaging" }{ "tcpport" } ) {
371    if ( $$json{'messaging'}{'tcpport'} != $tcpport ) {
372        $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";
373    }
374    if ( $fo ) {
375        $$json{ 'messaging'}{'tcpport' }         = $tcpport;
376    }
377} else {
378    $$json{ 'messaging'}{'tcpport' }         = $tcpport;
379}
380
381if ( $$json{ "messaging" }{ "tcphostip" } ) {
382    if ( $$json{'messaging'}{'tcphostip'} ne $tcphostip ) {
383        $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";
384    }
385    if ( $fo ) {
386        $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
387    }
388} else {
389    $$json{ 'messaging'}{'tcphostip' }         = $tcphostip;
390}
391
392if ( $$json{ "messaging" }{ "tcprport" } ) {
393    if ( $$json{'messaging'}{'tcprport'} ne $tcprport ) {
394        $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";
395    }
396    if ( $fo ) {
397        $$json{ 'messaging'}{'tcprport' }         = $tcprport;
398    }
399} else {
400    $$json{ 'messaging'}{'tcprport' }         = $tcprport;
401}
402
403if ( $$json{ "messaging" }{ "tcptimeout" } ) {
404    if ( $$json{'messaging'}{'tcptimeout'} ne $tcptimeout ) {
405        $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";
406    }
407    if ( $fo ) {
408        $$json{ 'messaging'}{'tcptimeout' }         = $tcptimeout;
409    }
410} else {
411    $$json{ 'messaging'}{'tcptimeout' }         = $tcptimeout;
412}
413
414if ( $$json{ "https" } ) {
415    if ( $$json{'https'} != $https ) {
416        $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";
417    }
418    if ( $fo ) {
419        $$json{'https'}         = int($https);
420    }
421} else {
422    $$json{'https'}         = int($https);
423}
424
425if ( !$webroot ) {
426    $webroot = "/var/www/html" if $os =~ /^(ubuntu|centos|redhat|scientific)$/;
427    $webroot = "/var/www/htdocs" if $os =~ /^slackware$/;
428}
429
430if ( $$json{ "webroot" } ) {
431    if ( $$json{'webroot'} != $webroot ) {
432        $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";
433    }
434    if ( $fo ) {
435        $$json{'webroot'}         = $webroot;
436    }
437} else {
438    $$json{'webroot'}         = $webroot;
439}
440
441if ( $$json{ "mongo" }{ "url" } ) {
442    if ( $$json{'mongo'}{'url'} ne $mongourl ) {
443        $notice .= "The identified mongod url for this server [$mongourl] is different than that stored [$$json{'mongo'}{'url'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
444    }
445    if ( $fo ) {
446        $$json{'mongo'}{'url'} = $mongourl;
447    }
448} else {
449    if ( $mongourl ) {
450        $$json{'mongo'}{'url'} = $mongourl;
451    } else {
452        delete $$json{'mongo'};
453    }
454}
455
456if ( $$json{ "mongo" }{ "cafile" } ) {
457    if ( $$json{'mongo'}{'cafile'} ne $mongocafile ) {
458        $notice .= "The identified mongod certificate file for this server [$mongocafile] is different than that stored [$$json{'mongo'}{'cafile'}] in $f. " . ( $fo ? "Overwriting with identified value." : "Leaving stored value untouched (use -f to overwrite)." ) . "\n";
459    }
460    if ( $fo ) {
461        $$json{'mongo'}{'cafile'} = $mongocafile;
462    }
463} else {
464    if ( $mongocafile ) {
465        $$json{'mongo'}{'cafile'} = $mongocafile;
466    } else {
467        delete $$json{'mongo'};
468    }
469}
470
471open my $fh, ">$f" || die "$0: can not open $f for writing, check permissions\n";
472print $fh to_json( $json, { utf8 => 1, pretty => 1 } );
473close $fh;
474
475if ( $pj ) {
476    print "-"x80 . "\n";
477    print "Final config.json:\n";
478    print "-"x80 . "\n";
479    {
480        my $js = JSON->new;
481        print $js->pretty->encode( $json );
482    }
483    print "-"x80 . "\n";
484}
485
486print "-"x80 . "\n" . "Notices:\n" . "-"x80 . "\n" . $notice . "-"x80 . "\n" if $notice;
Note: See TracBrowser for help on using the repository browser.