source: genapp/sbin/tutorial-user.pl

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

updated url

  • Property svn:executable set to *
File size: 6.8 KB
Line 
1#!/usr/bin/perl
2
3# configuration
4
5# uncomment for debugguing
6$debug++;
7
8# systems :  systemname, homebase, wwwbase, wwwusebase, optgenapp, group, lockdir-used, random pass cmd
9
10@systems = (
11    "slack",  "/home", "/var/www/htdocs", "/share/apps/genapp/__app__/output/html5", "/share/apps/genapp", "apache", 0, "mkpasswd",
12    "ubuntu", "/home", "/var/www/html",   "/opt/genapp/__app__/output/html5",        "/opt/genapp",        "genapp", 1, " echo '' | mkpasswd -s | cut -c1-9",
13    );
14
15$svndemo = "svn.genapp.rocks/svn/base/demo";
16
17# end configuration
18
19while ( $i = shift @systems ) {
20    $sname           { $i }++;
21    $homebase        { $i } = shift @systems;
22    $wwwbase         { $i } = shift @systems;
23    $wwwusebase      { $i } = shift @systems;
24    $optgenapp       { $i } = shift @systems;
25    $group           { $i } = shift @systems;
26    $lockdir         { $i } = shift @systems;
27    $mkpasswd        { $i } = shift @systems;
28    $requireslinks   { $i } = $wwwusebase{ $i } eq $optgenapp{ $i };
29}
30
31my $gb   = $ENV{ "GENAPP" } || die "$0: environment variable GENAPP must be set\n";
32
33if ( $] < 5.018 ) {
34    if ( -e "$gb/perl/bin/perl" ) {
35        $pv =`$gb/perl/bin/perl -e 'print \$];'`;
36        if ( $pv >= 5.018 ) {
37            print "will run new version\n" if $debug;
38            unshift @ARGV, $0;
39            exec( "$gb/perl/bin/perl", @ARGV );
40        } else {
41            die "$gb/perl/bin/perl exists, but not a correct version of perl (needs a minimum of 5.18)\n";
42        }
43    } else {
44        die "you need to install a version of perl >= 5.18 in $gb/perl\n
45there is a script $gb/sbin/install-perl-stable to do this";
46    }
47}
48
49my $rc = eval {
50    require JSON;         JSON->import( -support_by_pp );
51};
52# use JSON -support_by_pp;
53
54
55# utility subs
56
57sub runcmd {
58    my $cmd = $_[0];
59    my $out;
60    print "running shell command:\n--------\n$cmd\n--------\n" if $debug;
61    open my $fh, "$cmd |";
62    while ( <$fh> ) {
63        $out .= $_;
64        print;
65    }
66    close $fh;
67    die "$0: command $cmd failed\n" if $?;
68    $out;
69}
70
71sub runcmdsb {
72    my $cmd = $_[0];
73    $cmd =~ s/"/\\\"/g;
74    $cmd =~ s/\$/\\\$/g;
75    $cmd = "sudo bash -c \"$cmd\"";
76    print "sd cmd is <$cmd>\n";
77    runcmd( $cmd );
78}
79
80$notes = 
81"usage: $0 system wss ip hostname name
82sets up a new user named 'name' for tutorials
83wss must be y or n
84currently supported 'system's are slack and ubuntu
85";
86
87$sys      = shift || die $notes;
88$wss      = shift || die $notes;
89$ip       = shift || die $notes;
90$hostname = shift || die $notes;
91$user     = shift || die $notes;
92
93die "$0 wss must be y or n
94$notes" if $wss !~ /^(y|n)$/;
95
96$wssp = $wss eq "y" ? "443" : "80";
97
98die "$0: unknown system $sys\n" if !$sname{ $sys };
99
100my $whoami = `whoami`;
101chomp $whoami;
102
103
104$app       = "${user}";
105$wwwusebase{$sys} =~ s/__app__/$app/;
106$targetwww    = "$wwwbase{$sys}/$app";
107$targetwwwuse = "$wwwusebase{$sys}";
108$targetsvn    = "$optgenapp{$sys}/$app";
109
110print "
111system        $sys
112wss           $wss
113homebase      $homebase{$sys}
114wwwbase       $wwwbase{$sys}
115wwwusebase    $wwwusebase{$sys}
116optgenapp     $optgenapp{$sys}
117group         $group{$sys}
118lockdir       $lockdir{$sys}
119requireslinks $requireslinks{$sys}
120
121app           $app
122targetwww     $targetwww
123targetwwwuse  $targetwwwuse
124targetsvn     $targetsvn
125
126" if $debug;
127
128$id = `id -u $user 2> /dev/null`;
129chomp $id;
130die "$0: user $user already exists\n" if $id;
131
132{ 
133    my $tmp;
134    $tmp = `getent group $group{$sys}`;
135    chomp $tmp;
136    die "$0: group group '$group{$sys}' must exist to proceed\n" if !$tmp;
137
138    $tmp = `getent group sshlogin`;
139    chomp $tmp;
140    die "$0: group 'sshlogin' must exist to proceed\n" if !$tmp;
141
142    die "$0: $targetwww already exists\n" if -e $targetwww;
143    die "$0: $targetwwwuse already exists\n" if -e $targetwwwuse;
144    die "$0: $targetsvn already exists\n" if -e $targetsvn;
145
146    die "$0: $optgenapp{$sys} not a directory\n" if !-d $optgenapp{$sys};
147}
148
149# proceed, add user
150
151$pw = `$mkpasswd{$sys}`;
152chomp $pw;
153$pw =~ s/^-/X/g;
154
155print "pw is $pw\n";
156
157$f = "$optgenapp{$sys}/tutorialinfo.txt";
158`cat <<__EOF >> $f
159username $user
160password $pw
161\l
162__EOF
163`;
164
165$epw = `openssl passwd -1 '$pw'`;
166chomp $epw;
167
168print "pw is $pw, epw is $epw\n" if $debug;
169
170$cmd = "/usr/sbin/useradd -m -d $homebase{$sys}/$user -s /bin/bash -G $group{$sys},sshlogin -p '$epw' $user";
171
172runcmdsb( $cmd );
173
174# checkout svn instance
175
176runcmd( "cd $optgenapp{$sys} && svn --force export svn://$svndemo $app" );
177
178
179# setup genapptest instance
180
181chdir "$targetsvn" || die "$0: could not change to directory $targetsvn\n";
182
183{
184    my $f = "directives.json.template";
185    open my $fh, "$f" || die "$0: could not open $f\n";
186    my @l = <$fh>;
187    close $fh;
188
189    my $apphome = $optgenapp{$sys};
190    my $wwwhome = $wwwbase{$sys};
191    grep s/\/REPLACE_WITH_YOUR_HOME_DIRECTORY\/REPLACE_WITH_DIRNAME/$targetsvn/, @l;
192    grep s/\/REPLACE_WITH_YOUR_HOME_DIRECTORY/$apphome/, @l;
193    grep s/\/REPLACE_WITH_YOUR_WEBROOT/$wwwhome/, @l;
194    grep s/REPLACE_WITH_DIRNAME/$app/, @l;
195
196    pop @l;
197    push @l, $wss eq "y" ? '   ,"usewss":"true"' : '   ,"usews":"true"';
198    push @l, "\n}\n";
199
200    $f = "directives.json";
201    open  $fh, ">$f" || die "$0: could not open $f for writing\n";
202    print $fh ( join '', @l );
203    close $fh;
204}
205
206{
207    if ( $ip eq 'auto' ) {
208        $ip = `wget http://ipinfo.io/ip -qO -`;
209        chomp $ip;
210        $hostname = $ip;
211    }
212
213    my $json = {};
214    $$json{ "hostip"   } = $ip;
215    $$json{ "hostname" } = $hostname;
216
217    $$json{ "messaging" }{ "wsport" } = 37777;
218    $$json{ "messaging" }{ "wssport" } = $wssp;
219    $$json{ "messaging" }{ "zmqhostip" } = "127.0.0.1";
220    $$json{ "messaging" }{ "zmqport" } = 37778;
221    $$json{ "messaging" }{ "udphostip" } = "127.0.0.1";
222    $$json{ "messaging" }{ "udpport" } = 37779;
223    $$json{ "messaging" }{ "tcphostip" } = "127.0.0.1";
224    $$json{ "messaging" }{ "tcpport" } = 37780;
225
226    $$json{ "restricted" }{ "admin" } = ( $whoami );
227
228    $$json{ "resources" }{ "local" } = "";
229
230    $$json{ "resourcedefault" } = "local";
231    $$json{ "submitpolicy" } = "login";
232
233    $$json{ "lockdir" } = "$optgenapp{$sys}/etc" if $lockdir;
234
235    $f = "appconfig.json";
236    open  $fh, ">$f" || die "$0: could not open $f for writing\n";
237    {
238        my $js = JSON->new;
239        print $fh $js->pretty->encode( $json );
240    }
241    close $fh;
242}
243
244
245runcmdsb( "chown -R $user:$group{$sys} $targetsvn && chmod -R g+rw $targetsvn && find . -type d | xargs chmod g+xs" );
246
247runcmd ( "sudo su - $user -c '. /etc/profile; cd $optgenapp{$sys}/$app && genapp.pl'" );
248
249# setup links
250
251runcmdsb( "ln -sf $targetwwwuse $targetwww" );
252if ( $requireslinks{$sys} ) {
253    runcmd( "cd $targetsvn && ln -s output/html5/ajax ajax && ln -s output/html5/results results && ln -s output/html5/util util" );
254}
255
256# fixup ownership
257
258runcmd( "mkdir $targetsvn/tmp" );
259runcmd ( "sudo su - $user -c 'ln -s $targetsvn $app'" );
260
261runcmdsb( "chown -R $user:$group{$sys} $targetsvn && chmod -R g+rw $targetsvn && find . -type d | xargs chmod g+xs" );
262   
Note: See TracBrowser for help on using the repository browser.