OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Thomas Lotterer Root: /e/openpkg/cvs Email: [EMAIL PROTECTED] Module: openpkg-tools Date: 26-Jan-2005 09:09:39 Branch: HEAD Handle: 2005012608093900 Modified files: openpkg-tools/cmd bf-mk.pl Log: improve/correct manpage and bf.conf defaults; add screen prereq; generate convenience "worker" command; Summary: Revision Changes Path 1.2 +143 -36 openpkg-tools/cmd/bf-mk.pl ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-tools/cmd/bf-mk.pl ============================================================================ $ cvs diff -u -r1.1 -r1.2 bf-mk.pl --- openpkg-tools/cmd/bf-mk.pl 24 Jan 2005 15:37:51 -0000 1.1 +++ openpkg-tools/cmd/bf-mk.pl 26 Jan 2005 08:09:39 -0000 1.2 @@ -50,6 +50,7 @@ my $opt_key = 0; my $opt_master = 0; my $opt_slave = 0; +my $opt_worker = 0; my $opt_oneshot = 0; my $opt_loop = 0; my $opt_init = 0; @@ -94,6 +95,7 @@ " -k|key generate .ssh/ keys\n" . " -m|master generate bin/master wrapper\n" . " -s|slave generate bin/slave script\n" . + " -w|worker generate bin/worker script\n" . " -1|oneshot run master once\n" . " -l|loop run master in a loop\n" . " -i|init init mode\n" . @@ -111,7 +113,7 @@ "Notes on query mode"; " with -q variables can be printed, e.g. \"prefix=%{master.prefix}\"\n"; "Notes on shared setup mode"; - " with -[rlkms] only selected files are generated, otherwise all\n" . + " with -[rlkmsw] only selected files are generated, otherwise all\n" . " with -o is written to given file otherwise to proper destination\n"; exit(1) if (defined $level); exit(0); @@ -126,6 +128,7 @@ 'k|key' => \$opt_key, 'm|master' => \$opt_master, 's|slave' => \$opt_slave, + 'w|worker' => \$opt_worker, '1|oneshot' => \$opt_oneshot, 'l|loop' => \$opt_loop, 'i|init' => \$opt_init, @@ -162,12 +165,13 @@ my $shared = $cfg->{"shared"}->{"prefix"} || die "mandatory setting shared.prefix undefined"; # if no files selected default to all files selected - unless ($opt_bashrc or $opt_bashlogin or $opt_key or $opt_master or $opt_slave) { + unless ($opt_bashrc or $opt_bashlogin or $opt_key or $opt_master or $opt_slave or $opt_worker) { $opt_bashrc = 1; $opt_bashlogin = 1; $opt_key = 1; $opt_master = 1; $opt_slave = 1; + $opt_worker = 1; } if ($opt_oneshot) { @@ -194,6 +198,7 @@ &writefile("$shared/.bash_login", $opt_outfile, 0644, &gen_bashlogin($cfg)) if($opt_bashrc); &writefile("$shared/bin/master", $opt_outfile, 0755, &gen_master($cfg)) if($opt_master); &writefile("$shared/bin/slave", $opt_outfile, 0755, &gen_slave($cfg)) if($opt_slave); + &writefile("$shared/bin/worker", $opt_outfile, 0755, &gen_worker($cfg)) if($opt_worker); } } # die gracefully ;-) @@ -389,6 +394,21 @@ my ($cfg) = @_; my $txt = <<'EOT'; . .bashrc +echo " Welcome to the OpenPKG build farm %{shared.prefix}" +echo "" +echo " recreate scripts and config based on %{master.host} configuration" +echo " $ master" +echo " " +echo " run WORKER (attach to or create screens)" +echo " $ worker" +echo "" +echo " run MASTER (define work for slaves)" +echo " $ master -1 #oneshot" +echo " $ master -l #loop" +echo "" +echo " run SLAVE (do the work)" +echo " $ slave -1 #oneshot" +echo " $ slave -l #loop" EOT return &subst($cfg, $txt); } @@ -429,19 +449,6 @@ exit 1 } -assert () -{ - [ ".%{shared.prefix}" != . ] || die "SHARED directory not configured" - [ -d "%{shared.prefix}" ] || die "shared prefix \"%{shared.prefix}\" does not exist on this machine" - cd %{shared.prefix} || die "cannot change directory to shared prefix \"%{shared.prefix}\"" - [ -x "%{driver.shtool}" ] || die "driver shtool(1) \"%{driver.shtool}\" not executable" - [ -x "%{driver.sudo}" ] || die "driver sudo(1) \"%{driver.sudo}\" not executable" - [ ".%{slaves.prefix}" != . ] || die "SLAVES prefix not configured" - [ -d "%{slaves.prefix}" ] || die "slave prefix \"%{slaves.prefix}\" does not exist on this machine" - [ -d "%{slaves.ltmp}" ] || die "large temporary disks space \"%{slaves.ltmp}\" missing" - [ ".%{slaves.bfdb}" != . ] || die "SLAVES bfdb not configured" -} - oneshot () { # creating SHARED directory structure for SLAVE @@ -528,9 +535,6 @@ } #main() -assert - -# configuration queried from SLAVE HOST=`%{driver.hostname} | %{driver.sed} -e 's;\..*$;;'` ARCH=`%{slaves.rpm} --eval '%{l_host_arch}'` OS=`%{slaves.rpm} --eval '%{l_host_os}'` @@ -550,6 +554,96 @@ return &subst($cfg, $txt); } +sub gen_worker ($) +{ + my ($cfg) = @_; + my $txt = <<'EOT'; +#!%{driver.sh} +## +## This file was created by "openpkg bf-mk" and will be overwritten on +## any configuration change. Manual edits are a waste of time. +## + +warn () +{ + echo "$0:WARNING: $1" +} + +die () +{ + echo "$0:ERROR: $1" + exit 1 +} + +cmd_attach () +{ + %{driver.shtool} echo -e "%B++ [EMAIL PROTECTED]:%{shared.prefix}: attach to screen%b" + cd %{shared.prefix} && exec %{master.screen} -r openpkg-buildfarm -p = +} + +cmd_create () +{ + %{driver.shtool} echo -e "%B++ [EMAIL PROTECTED]:%{shared.prefix}: create screens%b" + instances=`cd %{shared.prefix}/src && echo *-*-*` + screenrc="%{shared.prefix}/tmp/master/screenrc" + ( echo "vbell off" + echo "screen -t \"$HOST [MASTER]\" %{driver.sh}" + for inst in $instances; do + eval `echo "$inst" | sed -e 's/^\([^-][^-]*\)-\([^-][^-]*\)-\([^-][^-]*\)$/host="\1"; arch="\2"; os="\3";/'` + echo "screen -t \"$host-$arch-$os\" %{master.ssh} -A -t -x $host %{driver.sh}" + done + echo "select 0" + ) >$screenrc + eval `%{master.sshagent} -s 2>/dev/null` + %{master.sshadd} -D </dev/null 2>/dev/null + %{master.sshadd} </dev/null || exit 1 + cd %{shared.prefix} && exec %{master.screen} -S openpkg-buildfarm -c $screenrc +} + +usage () +{ + level="$1"; + if [ ".$1" != . ]; then level="$level:"; fi + + ( echo "$0:$level Usage: $0 [options]" + echo "Available options:" + echo " -a|attach attach to screen" + echo " -c|create create screens" + echo " -H|help print out this usage page" + echo "To reconfigure settings, change bf.conf on the MASTER" + echo " and regenerate environment using \"master\"" + ) >&2 + if [ ".$1" != . ]; then exit 1; fi + exit 0 +} + +#main() +HOST=`%{driver.hostname} | %{driver.sed} -e 's;\..*$;;'` +ARCH=`%{slaves.rpm} --eval '%{l_host_arch}'` +OS=`%{slaves.rpm} --eval '%{l_host_os}'` + +cmd="" +if [ ".$1" = ".-a" -o ".$1" = ".--attach" ]; then cmd="attach"; fi +if [ ".$1" = ".-c" -o ".$1" = ".--create" ]; then cmd="create"; fi +if [ ".$1" = ".-H" -o ".$1" = ".--help" ]; then cmd="help"; fi +if [ ".$cmd" = .help ]; then usage; fi + +# fallback to command autodetection +if [ ".$cmd" = . ]; then + if [ ".`%{master.screen} -list | %{master.grep} openpkg-buildfarm`" != . ]; then + cmd="attach" + else + cmd="create" + fi +fi + +if [ ".$cmd" = . ]; then usage "ERROR"; fi +cmd_$cmd +exit 1 +EOT + return &subst($cfg, $txt); +} + sub init_bfconf () { my $txt = <<'EOT'; @@ -558,8 +652,8 @@ ## master { - # OpenPKG instance on SLAVES doing the build - # openpkg-team using "/openpkg" + # OpenPKG instance on MASTER doing the build + # openpkg-team using prefix="/openpkg-bf/sw" on host="bf.openpkg.org" # prefix "@l_prefix@"; openpkg "%{prefix}/bin/openpkg"; @@ -572,10 +666,12 @@ db "%{prefix}/var/openpkg-tools/bf/db.sqlite"; rsync "%{prefix}/bin/rsync"; screen "%{prefix}/bin/screen"; - shell "%{prefix}/bin/bash"; - sshkeygen "%{prefix}/bin/ssh-keygen"; + grep "%{prefix}/bin/grep"; + sh "%{prefix}/bin/bash"; + ssh "%{prefix}/bin/ssh"; sshadd "%{prefix}/bin/ssh-add"; sshagent "%{prefix}/bin/ssh-agent"; + sshkeygen "%{prefix}/bin/ssh-keygen"; host "master.example.com"; # database file @@ -645,21 +741,21 @@ driver { # Place to find common (development) tools used by SLAVES # Might be a OpenPKG instance but can be OS stuff if available - # openpkg-team using "/usr/opkg" + # openpkg-team using OpenPKG instance at "/usr/opkg" # prefix "/bf/driver"; - gcc "%{prefix}/bin/gcc"; - ld "%{prefix}/bin/ld"; - make "%{prefix}/bin/make"; - sh "/bin/sh"; - shtool "%{prefix}/lib/openpkg/shtool"; - sudo "%{prefix}/bin/sudo"; - sudoers "%{prefix}/etc/sudo/sudoers"; - hostname "hostname"; - sed "sed"; cp "cp"; + gcc "gcc"; + hostname "hostname"; + ld "ld"; ln "ln"; + make "make"; rm "rm"; + sed "sed"; + sh "/bin/sh"; + shtool "shtool"; + sudo "sudo"; + sudoers "/etc/sudoers"; }; EOT @@ -696,7 +792,7 @@ master oneshot: -1 master loop: -l query mode: -q - setup mode: [-rlkms] + setup mode: [-rlkmsw] =head1 DESCRIPTION @@ -735,6 +831,7 @@ [-k|key] generate .ssh/ keys [-m|master] generate bin/master wrapper [-s|slave] generate bin/slave script + [-w|worker] generate bin/worker script common options @@ -834,15 +931,24 @@ su - worker master + run WORKER to initialize screen(s) + + su - worker + worker + run MASTER once su - worker + worker + select MASTER screen master -1 - run SLAVE once + run SLAVE in a loop su - worker - slave -1 + worker + reattaches to screen, select SLAVE or create a new screen + slave -l access database @@ -889,7 +995,6 @@ @install perl-crypto-5.8.5-2.2.0 @install perl-net-5.8.5-2.2.0 @install perl-dbi-5.8.5-2.2.0 --with=dbd_sqlite - @install openpkg-tools-0.8.28-20050124 --with=bf @install sharutils-4.3.77-2.2.0 @install ncurses-5.4.20041009-2.2.0 @install texinfo-4.7-2.2.0 @@ -912,6 +1017,8 @@ @install shtool-2.0.1-2.2.0 @install fsl-1.5.0-2.2.0 @install openssh-3.9p1-2.2.0 + @install screen-4.0.2-2.2.0 + @install openpkg-tools-0.8.28-20050124 --with=bf %slaves echo "---- boot/build ${NODE} %${CMD} ----" @@ . ______________________________________________________________________ The OpenPKG Project www.openpkg.org CVS Repository Commit List openpkg-cvs@openpkg.org