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 [email protected]