Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # apt-cyg: install tool for cygwin similar to debian apt-get
- #
- # Copyright (C) 2005-9, Stephen Jungels
- # Modified by GreenFox v2.4b
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # (http://www.fsf.org/licensing/licenses/gpl.html)
- # this script requires some packages
- WGET=`which wget 2> /dev/null`
- BZIP2=`which bzip2 2> /dev/null`
- TAR=`which tar 2> /dev/null`
- GAWK=`which awk 2> /dev/null`
- if test "-$WGET-" = "--" || test "-$BZIP2-" = "--" || test "-$TAR-" = "--" \
- || test "-$GAWK-" = "--"
- then
- echo You must install wget, tar, gawk and bzip2 to use apt-cyg.
- exit 1
- fi
- function usage()
- {
- echo apt-cyg: Installs and removes Cygwin packages.
- echo " \"apt-cyg install <package names>\" to install packages"
- echo " \"apt-cyg remove <package names>\" to remove packages"
- echo " \"apt-cyg update\" to update setup.ini"
- echo " \"apt-cyg show\" to show installed packages"
- echo " \"apt-cyg find <patterns>\" to find packages matching patterns"
- echo " \"apt-cyg describe <patterns>\" to describe packages matching patterns"
- echo " \"apt-cyg packageof <commands or files>\" to locate parent packages"
- echo "Options:"
- echo " --mirror, -m <url> : set mirror"
- echo " --cache, -c <dir> : set cache"
- echo " --file, -f <file> : read package names from file"
- echo " --noupdate, -u : don't update setup.ini from mirror"
- echo " --localdiskcache : Use local cache as source, if available. Used for offline instalation."
- echo " --force : Force re-installing package. USE WITH CAUTION AND CARE!"
- echo " --ForceUpdate : Force re-initalizeing setup.ini. "
- echo " --help"
- echo " --version"
- echo " --find-setup-exe :experemental"
- }
- function version()
- {
- echo "apt-cyg version 0.58 custombuild"
- echo "Written by Stephen Jungels"
- echo "Modified by GreenFox v2.4b"
- echo "Copyright (c) 2005-2012. Released under the GPL."
- }
- function findsetupexe()
- {
- echo "Attempting to load setup.exe, or loading from network..."
- [ -e "${cache}/setup.exe" ] && echo "Try using [ ${cache}/setup.exe ]"
- }
- function findworkspace()
- {
- # default working directory and mirror
- mirror="ftp://mirror.mcs.anl.gov/pub/cygwin"
- mirror="ftp://ftp.iij.ad.jp/pub/cygwin"
- cache="/cygdrive/c/archive/cygwin"
- # Note: path should be in unix format.
- # work wherever setup worked last, if possible
- if test -e /etc/setup/last-cache
- then
- tmp="`head -1 /etc/setup/last-cache`"
- cache="`cygpath -au "$tmp"`"
- fi
- if test -e /etc/setup/last-mirror
- then
- mirror="`head -1 /etc/setup/last-mirror`"
- fi
- if test "$localdiskcache" == "1"
- then
- echo Working directory is $cache
- echo Mirror is $mirror
- echo We are using the cache as package source.
- cd "$cache"
- else
- # Old method that uses network. Left for compatibility purpose.
- mirrordir="`echo "$mirror" | sed -e "s/:/%3a/g" -e "s:/:%2f:g"`"
- echo Working directory is $cache
- echo Mirror is $mirror
- mkdir -p "$cache/$mirrordir"
- cd "$cache/$mirrordir"
- fi
- }
- function getsetup()
- {
- if test "$noscripts" == "0" -a "$noupdate" == "0" -a "$localdiskcache" == "0"
- then
- touch "setup.ini"
- mv "setup.ini" "setup.ini-save"
- wget -N "$mirror/setup.bz2"
- if test -e "setup.bz2" && test $? -eq 0
- then
- bunzip2 "setup.bz2"
- mv "setup" "setup.ini"
- echo "Updated setup.ini"
- else
- wget -N "$mirror/setup.ini"
- if test -e setup.ini && test $? -eq 0
- then
- echo "Updated setup.ini"
- else
- mv "setup.ini-save" "setup.ini"
- echo "Error updating setup.ini, reverting"
- fi
- fi
- fi
- }
- function checkpackages()
- {
- if test "-$packages-" = "--"
- then
- echo Nothing to do, exiting
- exit 0
- fi
- }
- function apt-cyg-func-install(){
- for pkg in $packages
- do
- already="`grep -c "^$pkg " /etc/setup/installed.db`"
- if test $already -ge 1 -a "$forceinstall" == "0"
- then
- echo "Package $pkg is already installed, skipping"
- continue
- fi
- echo ""
- echo Installing $pkg
- # look for package and save desc file
- mkdir -p "release/$pkg"
- cat setup.ini | awk > "release/$pkg/desc" -v package="$pkg" \
- 'BEGIN{RS="\n\n@ "; FS="\n"} {if ($1 == package) {desc = $0; px++}} \
- END{if (px == 1 && desc != "") print desc; else print "Package not found"}'
- desc=`cat "release/$pkg/desc"`
- if test "-$desc-" = "-Package not found-"
- then
- echo Package $pkg not found or ambiguous name, exiting
- rm -r "release/$pkg"
- exit 1
- fi
- echo Found package $pkg
- # download and unpack the bz2 file
- # pick the latest version, which comes first
- install=`cat "release/$pkg/desc" | awk '/^install: / { print $2; exit }'`
- if test "-$install-" = "--"
- then
- echo "Could not find \"install\" in package description: obsolete package?"
- echo "Debug output of [$(realpath "release/$pkg/desc")]"
- echo "-----------------------------------------------------"
- cat "release/$pkg/desc"
- echo "-----------------------------------------------------"
- exit 1
- fi
- file=`basename $install`
- if test "$localdiskcache" == "1"
- then
- ############################################
- # This section needs refactoring. TODO
- ############################################
- echo "DBG:pwd=[`pwd`]pkg=[$pkg]file=[$file]mirror=[$mirror]install=[$install]"
- cd "$cache"
- cd "release/$pkg"
- if ! test -e "$file"
- then
- # Scan dir for matching name
- echo "Scanning cache for leftover..."
- local leftover_file="`find "$cache" -name "$file" |head -n 1`";
- if test "$leftover_file" == "" ; then
- #
- echo "Package $pkg missing from cache. Downloading file from mirror $mirror."
- wget -nc $mirror/$install
- # The mirror might not have the file.TODO.
- else
- echo "Trying to use [$leftover_file] as alternative to [$file]"
- file="$leftover_file";
- fi
- fi
- echo "DBG:169:pwd=[`pwd`]pkg=[$pkg]file=[$file]mirror=[$mirror]install=[$install]"
- digest="`cat "desc" | awk '/^install: / { print $4; exit }'`";
- digactual="`md5sum "$file" | awk '{print $1}'`";
- echo "Checking md5hash [$digest] == [$digactual] "
- if test "$digest" != "$digactual" ;
- then
- echo "Package $pkg in cache data is broken, partial, or empty. Downloading file from mirror."
- wget -c $mirror/$install
- fi
- digactual=`md5sum $file | awk '{print $1}'`
- ############################################
- else
- cd "release/$pkg"
- wget -nc $mirror/$install
- digest=`cat "desc" | awk '/^install: / { print $4; exit }'`
- digactual=`md5sum $file | awk '{print $1}'`
- fi
- if ! test $digest = $digactual
- then
- echo "MD5 sum did not match, exiting"
- exit 1
- fi
- echo "Unpacking..."
- #####
- # Dumps to root dir. We need to add code for chroot creating options
- ####
- cat "$file" | bunzip2 | tar > "/etc/setup/$pkg.lst" xvf - -C /
- gzip -f "/etc/setup/$pkg.lst"
- cd ../..
- # update the package database
- cat /etc/setup/installed.db | awk > /tmp/awk.$$ -v pkg="$pkg" -v bz=$file \
- '{if (ins != 1 && pkg < $1) {print pkg " " bz " 0"; ins=1}; print $0} \
- END{if (ins != 1) print pkg " " bz " 0"}'
- mv /etc/setup/installed.db /etc/setup/installed.db-save
- mv /tmp/awk.$$ /etc/setup/installed.db
- # recursively install required packages
- echo > /tmp/awk.$$ '/^requires: / {s=gensub("(requires: )?([^ ]+) ?", "\\2 ", "g", $0); print s}'
- requires=`cat "release/$pkg/desc" | awk -f /tmp/awk.$$`
- warn=0
- if ! test "-$requires-" = "--"
- then
- echo Package $pkg requires the following packages, installing:
- echo $requires
- for package in $requires
- do
- already=`grep -c "^$package " /etc/setup/installed.db`
- if test $already -ge 1
- then
- echo Package $package is already installed, skipping
- continue
- fi
- apt-cyg --noscripts install $package
- if ! test $? = 0 ; then warn=1; fi
- done
- fi
- if ! test $warn = 0
- then
- echo "Warning: some required packages did not install, continuing"
- fi
- # run all postinstall scripts
- pis=`ls "/etc/postinstall/*.sh" 2>/dev/null | wc -l`
- if test $pis -gt 0 && ! test $noscripts -eq 1
- then
- echo Running postinstall scripts
- for script in "/etc/postinstall/*.sh"
- do
- $script
- mv $script $script.done
- done
- fi
- echo Package $pkg installed
- done
- }
- function main(){
- # process options
- local noscripts=0
- local noupdate=0
- local file=""
- local dofile=0
- local command=""
- local filepackages=""
- local packages=""
- local localdiskcache=1
- local forceinstall=0
- # use vars = [ noscripts noupdate localdiskcache forceinstall file dofile command packages ]
- while test $# -gt 0
- do
- case "$1" in
- --mirror|-m)
- echo "$2" > /etc/setup/last-mirror
- shift ; shift
- ;;
- --cache|-c)
- cygpath -aw "$2" > /etc/setup/last-cache
- shift ; shift
- ;;
- --noscripts)
- noscripts=1
- shift
- ;;
- --noupdate|-u)
- noupdate=1
- shift
- ;;
- --ForceUpdate)
- noupdate=0
- localdiskcache=0
- shift
- ;;
- --localdiskcache)
- localdiskcache=1
- shift
- ;;
- --force)
- forceinstall=1
- shift
- ;;
- --help)
- usage
- exit 0
- ;;
- --version)
- version
- exit 0
- ;;
- --find-setup-exe)
- findsetupexe
- exit 0
- ;;
- --file|-f)
- if ! test "-$2-" = "--"
- then
- file="$2"
- dofile=1
- shift
- else
- echo 1>&2 No file name provided, ignoring $1
- fi
- shift
- ;;
- update|show|find|describe|packageof|install|remove)
- if test "-$command-" = "--"
- then
- command=$1
- else
- packages="$packages $1"
- fi
- shift
- ;;
- *)
- packages="$packages $1"
- shift
- ;;
- esac
- done
- ######################################################
- # Done reading the options. Now process accordingly
- ######################################################
- if test $dofile = 1
- then
- if test -f "$file"
- then
- filepackages="$filepackages `cat "$file" | awk '{printf "%s ", $0}'`"
- else
- echo File $file not found, skipping
- fi
- packages="$packages $filepackages"
- fi
- case "$command" in
- update)
- findworkspace
- getsetup
- ;;
- show)
- echo 1>&2 The following packages are installed:
- cat /etc/setup/installed.db | awk '/[^ ]+ [^ ]+ 0/ {print $1}'
- ;;
- find)
- checkpackages
- findworkspace
- getsetup
- for pkg in $packages
- do
- echo ""
- echo Searching for installed packages matching $pkg:
- awk '/[^ ]+ [^ ]+ 0/ {if ($1 ~ query) print $1}' query="$pkg" /etc/setup/installed.db
- echo ""
- echo Searching for installable packages matching $pkg:
- cat setup.ini | awk -v query="$pkg" \
- 'BEGIN{RS="\n\n@ "; FS="\n"; ORS="\n"} {if ($1 ~ query) {print $1}}'
- done
- ;;
- describe)
- checkpackages
- findworkspace
- getsetup
- for pkg in $packages
- do
- echo ""
- cat setup.ini | awk -v query="$pkg" \
- 'BEGIN{RS="\n\n@ "; FS="\n"; ORS="\n"} {if ($1 ~ query) {print $0 "\n"}}'
- done
- ;;
- packageof)
- checkpackages
- for pkg in $packages
- do
- key=`which "$pkg" 2>/dev/null | sed "s:^/::"`
- if test "-$key-" = "--"
- then
- key="$pkg"
- fi
- for manifest in "/etc/setup/*.lst.gz"
- do
- found=`cat "$manifest" | gzip -d | grep -c "$key"`
- if test $found -gt 0
- then
- package=`echo "$manifest" | sed -e "s:/etc/setup/::" -e "s/.lst.gz//"`
- echo Found $key in the package $package
- fi
- done
- done
- ;;
- install)
- checkpackages
- findworkspace
- getsetup
- apt-cyg-func-install
- ;;
- remove)
- checkpackages
- for pkg in $packages
- do
- already=`grep -c "^$pkg " /etc/setup/installed.db`
- if test $already = 0
- then
- echo Package $pkg is not installed, skipping
- continue
- fi
- dontremove="cygwin coreutils gawk bzip2 tar wget bash"
- for req in $dontremove
- do
- if test "-$pkg-" = "-$req-"
- then
- echo apt-cyg cannot remove package $pkg, exiting
- exit 1
- fi
- done
- if ! test -e "/etc/setup/$pkg.lst.gz"
- then
- echo Package manifest missing, cannot remove $pkg. Exiting
- exit 1
- fi
- echo Removing $pkg
- # run preremove scripts
- if test -e "/etc/preremove/$pkg.sh"
- then
- "/etc/preremove/$pkg.sh"
- rm "/etc/preremove/$pkg.sh"
- fi
- cat "/etc/setup/$pkg.lst.gz" | gzip -d | awk '/[^\/]$/ {print "rm -f \"/" $0 "\""}' | sh
- rm "/etc/setup/$pkg.lst.gz"
- rm -f /etc/postinstall/$pkg.sh.done
- cat /etc/setup/installed.db | awk > /tmp/awk.$$ -v pkg="$pkg" '{if (pkg != $1) print $0}'
- mv /etc/setup/installed.db /etc/setup/installed.db-save
- mv /tmp/awk.$$ /etc/setup/installed.db
- echo Package $pkg removed
- done
- ;;
- *)
- usage
- ;;
- esac
- }
- main "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement