source: genappalpha/bin/genapp_mkappconfig @ 1402

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

renamed mkappconfig->genapp_mkappconfig
added genapp_reg to register an app in the global registry

  • Property svn:executable set to *
File size: 12.3 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
242    $$json{ "restricted" }{ "admin" } = ( $admin ) if $admin;
243
244    $$json{ "resources" }{ "local" } = "";
245
246    $$json{ "resourcedefault" } = "local";
247    $$json{ "submitpolicy" } = "login";
248
249    $$json{ "lockdir" } = "$gb/etc";
250
251    $f = "$targetdir/appconfig.json";
252    open  $fh, ">$f" || die "$0: could not open $f for writing\n";
253    {
254        my $js = JSON->new;
255        print $fh $js->pretty->encode( $json );
256    }
257    close $fh;
258    print "created $f\n";
259}
260
261my $cwd = `pwd`;
262chomp $cwd;
263
264if ( !$hasappconfig ) {
265    setappconfig( $cwd );
266    exit;
267} 
268
269# merge relevant info
270
271{
272    my $changes;
273
274    die "$0 hostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'hostip' };
275    if ( $$appjson{ 'hostip' } ne $$cfgjson{ 'hostip' } ) {
276        $changes .= "hostip updated from [$$appjson{'hostip'}] to [$$cfgjson{'hostip'}]\n";
277        $$appjson{ 'hostip' } = $$cfgjson{ 'hostip' };
278    }
279
280    die "$0 hostname not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'hostname' };
281    if ( $$appjson{ 'hostname' } ne $$cfgjson{ 'hostname' } ) {
282        $changes .= "hostname updated from [$$appjson{'hostname'}] to [$$cfgjson{'hostname'}]\n";
283        $$appjson{ "hostname" } = $$cfgjson{ 'hostname' };
284    }
285       
286    die "$0 wsport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'wsport' };
287    if ( $$appjson{ 'messaging' }{ 'wsport' } ne $$cfgjson{ 'messaging' }{ 'wsport' } ) {
288        $changes .= "messaging:wsport updated from [$$appjson{'messaging'}{'wsport'}] to [$$cfgjson{'messaging'}{'wsport'}]\n";
289        $$appjson{ 'messaging' }{ 'wsport' } = $$cfgjson{ 'messaging' }{ 'wsport' };
290    }
291
292    die "$0 wssport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'wssport' };
293    if ( $$appjson{ 'messaging' }{ 'wssport' } ne $$cfgjson{ 'messaging' }{ 'wssport' } ) {
294        $changes .= "messaging:wssport updated from [$$appjson{'messaging'}{'wssport'}] to [$$cfgjson{'messaging'}{'wssport'}]\n";
295        $$appjson{ 'messaging' }{ 'wssport' } = $$cfgjson{ 'messaging' }{ 'wssport' };
296    }
297
298    die "$0 zmqhostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'zmqhostip' };
299    if ( $$appjson{ 'messaging' }{ 'zmqhostip' } ne $$cfgjson{ 'messaging' }{ 'zmqhostip' } ) {
300        $changes .= "messaging:zmqhostip updated from [$$appjson{'messaging'}{'zmqhostip'}] to [$$cfgjson{'messaging'}{'zmqhostip'}]\n";
301        $$appjson{ 'messaging' }{ 'zmqhostip' } = $$cfgjson{ 'messaging' }{ 'zmqhostip' };
302    }
303
304    die "$0 zmqport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'zmqport' };
305    if ( $$appjson{ 'messaging' }{ 'zmqport' } ne $$cfgjson{ 'messaging' }{ 'zmqport' } ) {
306        $changes .= "messaging:zmqport updated from [$$appjson{'messaging'}{'zmqport'}] to [$$cfgjson{'messaging'}{'zmqport'}]\n";
307        $$appjson{ 'messaging' }{ 'zmqport' } = $$cfgjson{ 'messaging' }{ 'zmqport' };
308    }
309
310    die "$0 udphostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'udphostip' };
311    if ( $$appjson{ 'messaging' }{ 'udphostip' } ne $$cfgjson{ 'messaging' }{ 'udphostip' } ) {
312        $changes .= "messaging:udphostip updated from [$$appjson{'messaging'}{'udphostip'}] to [$$cfgjson{'messaging'}{'udphostip'}]\n";
313        $$appjson{ 'messaging' }{ 'udphostip' } = $$cfgjson{ 'messaging' }{ 'udphostip' };
314    }
315
316    die "$0 udpport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'udpport' };
317    if ( $$appjson{ 'messaging' }{ 'udpport' } ne $$cfgjson{ 'messaging' }{ 'udpport' } ) {
318        $changes .= "messaging:udpport updated from [$$appjson{'messaging'}{'udpport'}] to [$$cfgjson{'messaging'}{'udpport'}]\n";
319        $$appjson{ 'messaging' }{ 'udpport' } = $$cfgjson{ 'messaging' }{ 'udpport' };
320    }
321
322    die "$0 tcphostip not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcphostip' };
323    if ( $$appjson{ 'messaging' }{ 'tcphostip' } ne $$cfgjson{ 'messaging' }{ 'tcphostip' } ) {
324        $changes .= "messaging:tcphostip updated from [$$appjson{'messaging'}{'tcphostip'}] to [$$cfgjson{'messaging'}{'tcphostip'}]\n";
325        $$appjson{ 'messaging' }{ 'tcphostip' } = $$cfgjson{ 'messaging' }{ 'tcphostip' };
326    }
327
328    die "$0 tcpport not defined in $cfgjsonf. $cfgjsonnotes" if !$$cfgjson{ 'messaging' }{ 'tcpport' };
329    if ( $$appjson{ 'messaging' }{ 'tcpport' } ne $$cfgjson{ 'messaging' }{ 'tcpport' } ) {
330        $changes .= "messaging:tcpport updated from [$$appjson{'messaging'}{'tcpport'}] to [$$cfgjson{'messaging'}{'tcpport'}]\n";
331        $$appjson{ 'messaging' }{ 'tcpport' } = $$cfgjson{ 'messaging' }{ 'tcpport' };
332    }
333
334    if ( $changes ) {
335       
336        $f = "$cwd/appconfig.json";
337        open  $fh, ">$f" || die "$0: could not open $f for writing\n";
338        {
339            my $js = JSON->new;
340            print $fh $js->pretty->encode( $appjson );
341        }
342        close $fh;
343        print '-'x( length( "updated $f" ) + 10 ) . "\n";
344        print "updated $f\n";
345        print $changes;
346        print '-'x( length( "updated $f" ) + 10 ) . "\n";
347    } else {
348        print "no differences\n" if $debug;
349    }
350}
351
352
Note: See TracBrowser for help on using the repository browser.