Max Bowsher <maxb <at> ukf.net> writes:

> 
> Christopher Cobb wrote:
> > I've found snipets of information, such as this:
> >
> >    http://sources.redhat.com/ml/cygwin-apps/2003-03/msg00526.html
> >
> > What I would like is an example of how to use setup.exe from the command 
> > line
> > (e.g., via ssh) to install a package remotely.
> >
> > I've tried this:
> >
> >    setup -D -s ftp://mirrors.kernel.org -R $CYGWIN_HOME -q -n wget
> >
> > which does not produce any errors, but it also doesn't seem to download or
> > install the package.
> 
> setup isn't really designed for use from the command line. It doesn't take 
> package names as arguments, for example. You could, I suppose, munge 
> /etc/setup/installed.db to fool setup into thinking that a really old (e.g. 
> version 0) version of a package is installed, so that it would updated - 
> it's a messy way to do it, but there is no better way.
> 
> Max.

Thanks Max for the idea.  Here is a quick hack/shell script which worked on the
(small handful) of packages that I tried with it.  

--- begin installCygwinPackage.sh ---
#!/bin/sh
#
# This script/hack allows you to install a cygwin package from the command line.
#
# Usage: installCygwinPackage.sh <package1> ... <packageN>
#
# It assumes that packages are at /packages and that setup.exe is somewhere
# in the path (like /usr/local/bin).
#
# It works by inserting fake package entries with a zeroed out versions
# into installed.db, then running setup.exe.
#
# Unfortunately, setup.exe insists on popping up a progress window
# on the local system.
#
# Thanks to Max Bowsher for the idea.
#

scriptName=`basename $0`

[ "$#" = "0" ] && {
   echo>&2 "$scriptName: No packages specified."
   echo>&2 "Usage: $scriptName <packageName> ... "
   exit 1
}

PACKAGES_DIR=/packages # adjust this for your installation

INSTALL_SITE_DIR=$PACKAGES_DIR/`(cd $PACKAGES_DIR && ls -1t | head -1)` # most
recently modified install dir
INSTALL_SITE=`echo $INSTALL_SITE_DIR | 
              sed -e '[EMAIL PROTECTED]@:@g' \
                  -e '[EMAIL PROTECTED]@/@g' \
                  -e '[EMAIL PROTECTED]([^/]\)/[^/[EMAIL PROTECTED]@'`
SETUP_INI=$INSTALL_SITE_DIR/setup.ini
INSTALLED_DB=/etc/setup/installed.db

# backup installed.db
INSTALLED_DB_BACKUP=$INSTALLED_DB.`date +%F_%H_%M_%S`
cp $INSTALLED_DB $INSTALLED_DB_BACKUP

# add zero-version packages to $INSTALLED_DB
for pkgName
do
    grep -q "^$pkgName " $INSTALLED_DB && {
       echo>&2 $scriptName: $pkgName is already installed
       continue;
    }

    pkgFileName=`
awk < $SETUP_INI '
/@ / {
    pkgName=$2
}
/version: / && pkg == pkgName {
    pkgVer=$2
}
/install: / && pkg == pkgName {
    num=split($2,arrFile,"/")
    pkgFile=arrFile[num]
    hyphenOffset=index(pkgFile,"-")
    if (hyphenOffset != 0)
    {
        pkgPrefix=substr(pkgFile, 0, hyphenOffset)
        verLength=index(pkgFile,".tar.bz2") - hyphenOffset
        ver=substr(pkgFile, hyphenOffset+1, verLength - 1)
        pkgSuffix=substr(pkgFile, hyphenOffset + verLength)
        pkgFile=pkgPrefix "" gensub(/[0-9]/,"0","g",ver) "" pkgSuffix
        print pkgFile
        pkgPrinted="true"
        exit
    }
}
END{
    if (pkgPrinted != "true") print pkgFile
}
' pkg=$pkgName
`
    echo $pkgName $pkgFileName 0 |
        cat $INSTALLED_DB - | sort -f > $INSTALLED_DB.tmp
    mv $INSTALLED_DB.tmp $INSTALLED_DB

done

diff -q $INSTALLED_DB $INSTALLED_DB_BACKUP > /dev/null ||
setup -D -L -s $INSTALL_SITE -R `cygpath -m /` -q -n
--- end installCygwinPackage.sh ---




--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to