source: genappalpha/bin/genapp_mkappconfig @ 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: 13.5 KB
Line 
1#!/usr/bin/perl
2
3# genappconfig
4# $debug++;
5my $gb   = $ENV{ "GENAPP" } || die "$0: environment variable GENAPP must be set\n";
6
7$notes = "usage: $0
8Checks local directory's directives.json
9if it contains target language html5 or if there exists an appconfig.json
10merge global config.json settings into appconfig.json or create new
11";
12
13print "perl version is $]\n" if $debug;
14print "command is: $0 @ARGV\n" if $debug;
15
16if ( $] < 5.018 ) {
17    if ( -e "$gb/perl/bin/perl" ) {
18        $pv =`$gb/perl/bin/perl -e 'print \$];'`;
19        if ( $pv >= 5.018 ) {
20            print "will run new version\n" if $debug;
21            unshift @ARGV, $0;
22            exec( "$gb/perl/bin/perl", @ARGV );
23        } else {
24            die "$gb/perl/bin/perl exists, but not a correct version of perl (needs a minimum of 5.18)\n";
25        }
26    } else {
27        die "you need to install a version of perl >= 5.18 in $gb/perl\n
28there is a script $gb/sbin/install-perl-stable to do this";
29    }
30}
31
32require "$gb/etc/perl/genapp_util.pl";
33
34# -- read directives.json
35
36my $directivesfile = "directives.json";
37
38{
39    my $f = $directivesfile;
40    if ( -e $f ) {
41        print "reading $f\n" if $debug;
42        open my $fh, $f || die "$0: can not open $f\n";
43        my @ol = <$fh>;
44        close $fh;
45        my @l = grep !/^\s*#/ , @ol;
46            my $l = join '', @l;
47        eval {
48            $dirjson = decode_json( $l );
49            1;
50        } || do {
51            my $e = $@;
52           
53            # figure out line #
54
55            my ( $cp ) = $e =~ /at character offset (\d+) /;
56            my $i;
57            my $cpos = $cp;
58            for ( $i = 0; $i < @ol; ++$i ) {
59                next if $ol[ $i ] =~ /^\s*#/;
60                    $cpos -= length( $ol[ $i ] );
61                last if $cpos < 0;
62            }
63
64            my $sline = $i - 2;
65            my $eline = $i + 2;
66            $sline = 0 if $sline < 0;
67            $eline = @ol - 1 if $eline >= @ol;
68
69            print "JSON Error in file $f near these lines:\n";
70            for ( my $j = $sline; $j <= $eline; ++$j ) {
71                my $uj = $j + 1;
72                print "$uj: $ol[$j]";
73                print "$uj: " .'^'x(length($ol[$j])) . "\n" if $j == $i;
74            }
75            die;
76        };
77    } else {
78        die "$0: no $f found in current directory\n";
79    }
80}
81
82my $needsappconfig;
83my $hasappconfig;
84
85if ( $$dirjson{ "languages" } ) {
86    foreach my $k ( @{$$dirjson{ "languages" }} ) {
87        if ( $k eq "html5" ) {
88            $needsappconfig++;
89        }
90    }
91}
92
93if ( -e "appconfig.json" ) {
94    $needsappconfig++;
95    $hasappconfig++;
96}
97
98if ( !$needsappconfig ) {
99    print "no appconfig needed\n" if $debug;
100    exit;
101}
102
103#--- get config.json info
104
105my $cfgjson = {};
106my $cfgjsonf = "$gb/etc/config.json";
107my $cfgjsonnotes = '-'x80 . "\n
108$cfgjsonf contains global system information.
109this is used to setup individual applications values.
110to build a default config.json file
111$gb/sbin/setconfig.pl -pj
112and verify the information is correct.
113Particularly, if the machine is not publically exposed, you probably want to change the hostip and hostname, as it will likely report the public ip of your firewall.
114The full options are listed by
115$gb/sbin/setconfig.pl -h
116You can also manually edit $cfgjsonf
117
118Once you are satisified that the setting are correct
119you can rerun $0
120" . '-'x80 . "\n"
121;
122
123{
124    my $f = $cfgjsonf;
125    if ( -e $f ) {
126        print "reading $f\n" if $debug;
127        open my $fh, $f || die "$0: can not open $f\n";
128        my @ol = <$fh>;
129        close $fh;
130        my @l = grep !/^\s*#/ , @ol;
131            my $l = join '', @l;
132        eval {
133            $cfgjson = decode_json( $l );
134            1;
135        } || do {
136            my $e = $@;
137           
138            # figure out line #
139
140            my ( $cp ) = $e =~ /at character offset (\d+) /;
141            my $i;
142            my $cpos = $cp;
143            for ( $i = 0; $i < @ol; ++$i ) {
144                next if $ol[ $i ] =~ /^\s*#/;
145                    $cpos -= length( $ol[ $i ] );
146                last if $cpos < 0;
147            }
148
149            my $sline = $i - 2;
150            my $eline = $i + 2;
151            $sline = 0 if $sline < 0;
152            $eline = @ol - 1 if $eline >= @ol;
153
154            print "JSON Error in file $f near these lines:\n";
155            for ( my $j = $sline; $j <= $eline; ++$j ) {
156                my $uj = $j + 1;
157                print "$uj: $ol[$j]";
158                print "$uj: " .'^'x(length($ol[$j])) . "\n" if $j == $i;
159            }
160            die;
161        };
162    } else {
163        my $res = `$gb/sbin/setconfig.pl -pj`;
164        print "$0 :
165" . '-'x80 . "
166please verify these settings are correct
167" . '-'x80 . "
168$res
169$cfgjsonnotes
170";
171        exit;
172    }
173}
174
175#--- get appconfig.json
176
177$appconfigfile = "appconfig.json";
178
179$appjson = {};
180
181{
182    my $f = $appconfigfile;
183    if ( -e $f ) {
184        print "reading $f\n" if $debug;
185        open my $fh, $f || die "$0: can not open $f\n";
186        my @ol = <$fh>;
187        close $fh;
188        my @l = grep !/^\s*#/ , @ol;
189            my $l = join '', @l;
190        eval {
191            $appjson = decode_json( $l );
192            1;
193        } || do {
194            my $e = $@;
195           
196            # figure out line #
197
198            my ( $cp ) = $e =~ /at character offset (\d+) /;
199            my $i;
200            my $cpos = $cp;
201            for ( $i = 0; $i < @ol; ++$i ) {
202                next if $ol[ $i ] =~ /^\s*#/;
203                    $cpos -= length( $ol[ $i ] );
204                last if $cpos < 0;
205            }
206
207            my $sline = $i - 2;
208            my $eline = $i + 2;
209            $sline = 0 if $sline < 0;
210            $eline = @ol - 1 if $eline >= @ol;
211
212            print "JSON Error in file $f near these lines:\n";
213            for ( my $j = $sline; $j <= $eline; ++$j ) {
214                my $uj = $j + 1;
215                print "$uj: $ol[$j]";
216                print "$uj: " .'^'x(length($ol[$j])) . "\n" if $j == $i;
217            }
218            die;
219        };
220    }
221}
222
223# sets up the app's appconfig.json:
224
225sub setappconfig {
226    my $targetdir  = $_[0];
227    my $admin      = $_[1];
228
229    my $json = {};
230    $$json{ "hostip"   } = $$cfgjson{ 'hostip' }   || die "$0 hostip not defined in $cfgjsonf. $cfgjsonnotes";
231    $$json{ "hostname" } = $$cfgjson{ 'hostname' } || die "$0 hostname not defined in $cfgjsonf. $cfgjsonnotes";
232
233    $$json{ "messaging" }{ "wsport" }    = $$cfgjson{ "messaging" }{ "wsport" } || die "$0 wsport not defined in $cfgjsonf. $cfgjsonnotes";
234    $$json{ "messaging" }{ "wssport" }   = $$cfgjson{ "messaging" }{ "wssport" } || die "$0 wssport not defined in $cfgjsonf. $cfgjsonnotes";
235    $$json{ "messaging" }{ "zmqhostip" } = $$cfgjson{ "messaging" }{ "zmqhostip" } || die "$0 zmqhostip not defined in $cfgjsonf. $cfgjsonnotes";
236    $$json{ "messaging" }{ "zmqport" }   = $$cfgjson{ "messaging" }{ "zmqport" } || die "$0 zmqport not defined in $cfgjsonf. $cfgjsonnotes";
237    $$json{ "messaging" }{ "udphostip" } = $$cfgjson{ "messaging" }{ "udphostip" } || die "$0 udphostip not defined in $cfgjsonf. $cfgjsonnotes";
238    $$json{ "messaging" }{ "udpport" }   = $$cfgjson{ "messaging" }{ "udpport" } || die "$0 udpport not defined in $cfgjsonf. $cfgjsonnotes";
239    $$json{ "messaging" }{ "tcphostip" } = $$cfgjson{ "messaging" }{ "tcphostip" } || die "$0 tcphostip not defined in $cfgjsonf. $cfgjsonnotes";
240    $$json{ "messaging" }{ "tcpport" }   = $$cfgjson{ "messaging" }{ "tcpport" } || die "$0 tcpport not defined in $cfgjsonf. $cfgjsonnotes";
241    $$json{ "messaging" }{ "tcprport" }  = $$cfgjson{ "messaging" }{ "tcprport" } || die "$0 tcprport not defined in $cfgjsonf. $cfgjsonnotes";
242    $$json{ "messaging" }{ "tcptimeout" }  = $$cfgjson{ "messaging" }{ "tcptimeout" } || die "$0 tcptimeout not defined in $cfgjsonf. $cfgjsonnotes";
243
244    $$json{ "restricted" }{ "admin" } = ( $admin ) if $admin;
245
246    $$json{ "resources" }{ "local" } = "";
247
248    $$json{ "resourcedefault" } = "local";
249    $$json{ "submitpolicy" } = "login";
250
251    $$json{ "lockdir" } = "$gb/etc";
252
253    $f = "$targetdir/appconfig.json";
254    open  $fh, ">$f" || die "$0: could not open $f for writing\n";
255    {
256        my $js = JSON->new;
257        print $fh $js->pretty->encode( $json );
258    }
259    close $fh;
260    print "created $f\n";
261}
262
263my $cwd = `pwd`;
264chomp $cwd;
265
266if ( !$hasappconfig ) {
267    setappconfig( $cwd );
268    exit;
269} 
270
271# merge relevant info
272
273{
274    my $changes;
275
276    die "$0 hostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'hostip' };
277    if ( $$appjson{ 'hostip' } ne $$cfgjson{ 'hostip' } ) {
278        $changes .= "hostip updated from [$$appjson{'hostip'}] to [$$cfgjson{'hostip'}]\n";
279        $$appjson{ 'hostip' } = $$cfgjson{ 'hostip' };
280    }
281
282    die "$0 hostname not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'hostname' };
283    if ( $$appjson{ 'hostname' } ne $$cfgjson{ 'hostname' } ) {
284        $changes .= "hostname updated from [$$appjson{'hostname'}] to [$$cfgjson{'hostname'}]\n";
285        $$appjson{ "hostname" } = $$cfgjson{ 'hostname' };
286    }
287       
288    die "$0 wsport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'wsport' };
289    if ( $$appjson{ 'messaging' }{ 'wsport' } ne $$cfgjson{ 'messaging' }{ 'wsport' } ) {
290        $changes .= "messaging:wsport updated from [$$appjson{'messaging'}{'wsport'}] to [$$cfgjson{'messaging'}{'wsport'}]\n";
291        $$appjson{ 'messaging' }{ 'wsport' } = $$cfgjson{ 'messaging' }{ 'wsport' };
292    }
293
294    die "$0 wssport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'wssport' };
295    if ( $$appjson{ 'messaging' }{ 'wssport' } ne $$cfgjson{ 'messaging' }{ 'wssport' } ) {
296        $changes .= "messaging:wssport updated from [$$appjson{'messaging'}{'wssport'}] to [$$cfgjson{'messaging'}{'wssport'}]\n";
297        $$appjson{ 'messaging' }{ 'wssport' } = $$cfgjson{ 'messaging' }{ 'wssport' };
298    }
299
300    die "$0 zmqhostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'zmqhostip' };
301    if ( $$appjson{ 'messaging' }{ 'zmqhostip' } ne $$cfgjson{ 'messaging' }{ 'zmqhostip' } ) {
302        $changes .= "messaging:zmqhostip updated from [$$appjson{'messaging'}{'zmqhostip'}] to [$$cfgjson{'messaging'}{'zmqhostip'}]\n";
303        $$appjson{ 'messaging' }{ 'zmqhostip' } = $$cfgjson{ 'messaging' }{ 'zmqhostip' };
304    }
305
306    die "$0 zmqport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'zmqport' };
307    if ( $$appjson{ 'messaging' }{ 'zmqport' } ne $$cfgjson{ 'messaging' }{ 'zmqport' } ) {
308        $changes .= "messaging:zmqport updated from [$$appjson{'messaging'}{'zmqport'}] to [$$cfgjson{'messaging'}{'zmqport'}]\n";
309        $$appjson{ 'messaging' }{ 'zmqport' } = $$cfgjson{ 'messaging' }{ 'zmqport' };
310    }
311
312    die "$0 udphostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'udphostip' };
313    if ( $$appjson{ 'messaging' }{ 'udphostip' } ne $$cfgjson{ 'messaging' }{ 'udphostip' } ) {
314        $changes .= "messaging:udphostip updated from [$$appjson{'messaging'}{'udphostip'}] to [$$cfgjson{'messaging'}{'udphostip'}]\n";
315        $$appjson{ 'messaging' }{ 'udphostip' } = $$cfgjson{ 'messaging' }{ 'udphostip' };
316    }
317
318    die "$0 udpport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'udpport' };
319    if ( $$appjson{ 'messaging' }{ 'udpport' } ne $$cfgjson{ 'messaging' }{ 'udpport' } ) {
320        $changes .= "messaging:udpport updated from [$$appjson{'messaging'}{'udpport'}] to [$$cfgjson{'messaging'}{'udpport'}]\n";
321        $$appjson{ 'messaging' }{ 'udpport' } = $$cfgjson{ 'messaging' }{ 'udpport' };
322    }
323
324    die "$0 tcphostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcphostip' };
325    if ( $$appjson{ 'messaging' }{ 'tcphostip' } ne $$cfgjson{ 'messaging' }{ 'tcphostip' } ) {
326        $changes .= "messaging:tcphostip updated from [$$appjson{'messaging'}{'tcphostip'}] to [$$cfgjson{'messaging'}{'tcphostip'}]\n";
327        $$appjson{ 'messaging' }{ 'tcphostip' } = $$cfgjson{ 'messaging' }{ 'tcphostip' };
328    }
329
330    die "$0 tcpport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcpport' };
331    if ( $$appjson{ 'messaging' }{ 'tcpport' } ne $$cfgjson{ 'messaging' }{ 'tcpport' } ) {
332        $changes .= "messaging:tcpport updated from [$$appjson{'messaging'}{'tcpport'}] to [$$cfgjson{'messaging'}{'tcpport'}]\n";
333        $$appjson{ 'messaging' }{ 'tcpport' } = $$cfgjson{ 'messaging' }{ 'tcpport' };
334    }
335
336    die "$0 tcprport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcprport' };
337    if ( $$appjson{ 'messaging' }{ 'tcprport' } ne $$cfgjson{ 'messaging' }{ 'tcprport' } ) {
338        $changes .= "messaging:tcprport updated from [$$appjson{'messaging'}{'tcprport'}] to [$$cfgjson{'messaging'}{'tcprport'}]\n";
339        $$appjson{ 'messaging' }{ 'tcprport' } = $$cfgjson{ 'messaging' }{ 'tcprport' };
340    }
341
342    die "$0 tcptimeout not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcptimeout' };
343    if ( $$appjson{ 'messaging' }{ 'tcptimeout' } ne $$cfgjson{ 'messaging' }{ 'tcptimeout' } ) {
344        $changes .= "messaging:tcptimeout updated from [$$appjson{'messaging'}{'tcptimeout'}] to [$$cfgjson{'messaging'}{'tcptimeout'}]\n";
345        $$appjson{ 'messaging' }{ 'tcptimeout' } = $$cfgjson{ 'messaging' }{ 'tcptimeout' };
346    }
347
348    if ( $changes ) {
349       
350        $f = "$cwd/appconfig.json";
351        open  $fh, ">$f" || die "$0: could not open $f for writing\n";
352        {
353            my $js = JSON->new;
354            print $fh $js->pretty->encode( $appjson );
355        }
356        close $fh;
357        print '-'x( length( "updated $f" ) + 10 ) . "\n";
358        print "updated $f\n";
359        print $changes;
360        print '-'x( length( "updated $f" ) + 10 ) . "\n";
361    } else {
362        print "no differences\n" if $debug;
363    }
364}
365
366
Note: See TracBrowser for help on using the repository browser.