[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 8/8] Refactor package dependency checking and installation



On Thu, 9 Apr 2015, George Dunlap wrote:
> First, create a new global variable, PKGTYPE.  At the moment support "deb" 
> and "rpm".
> 
> Define _check-package-$PKGTYPE which returns true if the package is
> installed, false otherwise, and _install-package-$PKGTYPE which will
> install a list of packages.
> 
> Define check-package(), which will take a list of packages, and check
> to see if they're installed.  Any missing packages will be added to an
> array called "missing".
> 
> Change _${COMPONENT}_install_dependencies to
> ${COMPONENT}_check_package.  Have these call check-package.
> 
> Don't call _${COMPONENT}_install_dependencies from ${COMPONENT}_build.
> 
> Define check-builddeps().  Define an empty "missing" array.  Call
> check-package for "raisin" dependincies (like git and rpmbuild).  Then
> call for_each_component check_package.
> 
> At this point we have an array with all missing packages.  If it's
> empty, be happy.  If it's non-empty, and deps=true, try to install the
> packages; otherwise print the missing packages and exit.
> 
> Add install-builddeps(), which is basically check-builddeps() with
> deps=true by default.
> 
> Call check-builddeps from build() to close the loop.

I think that this is a good idea. It is nice to be able to check whether
the deps are already installed before going ahead and installing them. I
also like the new command to install dependencies and do nothing else.

It needs to be changed a bit to work without core.sh but it is mostly
OK.


> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> ---
> CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> ---
>  components/grub         |  6 ++--
>  components/libvirt      |  6 ++--
>  components/xen          | 10 +++---
>  lib/build.sh            | 87 +++++++++++++++++++++++++++++++++++------------
>  lib/common-functions.sh | 89 
> +++++++++++++++++++++++++++++++++++++++----------
>  5 files changed, 148 insertions(+), 50 deletions(-)
> 
> diff --git a/components/grub b/components/grub
> index a5aa27d..839e001 100644
> --- a/components/grub
> +++ b/components/grub
> @@ -1,6 +1,6 @@
>  #!/usr/bin/env bash
>  
> -function _grub_install_dependencies() {
> +function grub_check_package() {
>      local DEP_Debian_common="build-essential tar autoconf bison flex"
>      local DEP_Debian_x86_32="$DEP_Debian_common"
>      local DEP_Debian_x86_64="$DEP_Debian_common libc6-dev-i386"
> @@ -18,8 +18,8 @@ function _grub_install_dependencies() {
>          echo grub is only supported on x86_32 and x86_64
>          return
>      fi
> -    echo installing Grub dependencies
> -    eval install_dependencies \$DEP_"$DISTRO"_"$ARCH"
> +    echo checking Grub dependencies
> +    eval check-package \$DEP_"$DISTRO"_"$ARCH"
>  }
>  

Need to change build not to call _grub_install_dependencies


> diff --git a/components/libvirt b/components/libvirt
> index 6602dcf..b106970 100644
> --- a/components/libvirt
> +++ b/components/libvirt
> @@ -1,6 +1,6 @@
>  #!/usr/bin/env bash
>  
> -function _libvirt_install_dependencies() {
> +function libvirt_check_package() {
>      local DEP_Debian_common="build-essential libtool autoconf autopoint \
>                               xsltproc libxml2-utils pkg-config python-dev   \
>                               libxml-xpath-perl libyajl-dev libxml2-dev      \
> @@ -18,8 +18,8 @@ function _libvirt_install_dependencies() {
>      local DEP_Fedora_x86_32="$DEP_Fedora_common"
>      local DEP_Fedora_x86_64="$DEP_Fedora_common"
>  
> -    echo installing Libvirt dependencies
> -    eval install_dependencies \$DEP_"$DISTRO"_"$ARCH"
> +    echo checking Libvirt dependencies
> +    eval check-package \$DEP_"$DISTRO"_"$ARCH"
>  }

Same here


>  function libvirt_build() {
> diff --git a/components/xen b/components/xen
> index 7a9f22d..ce46e3d 100644
> --- a/components/xen
> +++ b/components/xen
> @@ -1,6 +1,8 @@
>  #!/usr/bin/env bash
>  
> -function _xen_install_dependencies() {
> +function xen_check_package() {
> +    $requireargs DISTRO ARCH
> +
>      local DEP_Debian_common="build-essential python-dev gettext uuid-dev   \
>               libncurses5-dev libyajl-dev libaio-dev pkg-config 
> libglib2.0-dev  \
>               libssl-dev libpixman-1-dev bridge-utils wget"
> @@ -15,13 +17,11 @@ function _xen_install_dependencies() {
>      local DEP_Fedora_x86_32="$DEP_Fedora_common dev86 acpica-tools texinfo"
>      local DEP_Fedora_x86_64="$DEP_Fedora_x86_32 glibc-devel.i686"
>  
> -    echo installing Xen dependencies
> -    eval install_dependencies \$DEP_"$DISTRO"_"$ARCH"
> +    echo Checking Xen dependencies
> +    eval check-package \$DEP_"$DISTRO"_"$ARCH"
>  }
>  
>  function xen_build() {
> -    _xen_install_dependencies
> -
>      cd "$BASEDIR"
>      git-checkout $XEN_UPSTREAM_URL $XEN_UPSTREAM_REVISION xen-dir
>      cd xen-dir
> diff --git a/lib/build.sh b/lib/build.sh
> index ab1e087..a453874 100755
> --- a/lib/build.sh
> +++ b/lib/build.sh
> @@ -2,32 +2,72 @@
>  
>  set -e
>  
> -_help() {
> -    echo "Usage: ./build.sh <options> <command>"
> +RAISIN_HELP+=("check-builddep   Check to make sure we have all dependencies 
> installed")
> +function check-builddep() {
> +    local -a missing
> +
> +    $arg_parse
> +
> +    default deps "false" ; $default_post
> +    
> +    $requireargs PKGTYPE DISTRO
> +
> +    check-package git
> +
> +    if [[ $DISTRO = "Fedora" ]] ; then
> +        check-package rpm-build
> +    fi
> +
> +    for_each_component check_package
> +
> +    if [[ -n "${missing[@]}" ]] ; then
> +     echo "Missing packages: ${missing[@]}"
> +     if $deps ; then
> +         echo "Installing..."
> +         install-package "${missing[@]}"
> +     else
> +         echo "Please install, or run ./raise install-builddep"
> +         exit 1
> +     fi
> +    fi
> +}

indentation is wrong


> +RAISIN_HELP+=("install-builddep Install all packages required for build.  
> Uses sudo.")
> +function install-builddep() {
> +    local pkgtype
> +
> +    $arg_parse
> +
> +    check-builddep deps=true
> +}
> +
> +build-help() {
> +    echo "Usage: $0 build opt=val"
>      echo "where options are:"
> -    echo "    -n | --no-deps       Do no install build-time dependencies"
> -    echo "    -v | --verbose       Verbose"
> -    echo "    -y | --yes           Do not ask questions and continue"
> -    echo "where commands are:"
> -    echo "    build                Build the components enabled in config"
> -    echo "    install              Install binaries under /  (requires sudo)"
> -    echo "    configure            Configure the system  (requires sudo)"
> +    echo "    yes=(true|false)     Don't ask before doing anything 
> dangerous.  Defaults to false."
> +    echo "    deps=(true|false)    Attempt to install dependencies.  
> Defaults to false."
> +    echo "    verbose=(true|false) Increased verbosity.  Defaults to false."
>  }

I would keep the old style help and options for simplicity. Removing the
deps option entirely is OK I think.


> +RAISIN_HELP+=("build           Clone and build components enabled in config")
>  build() {
>      $arg_parse
>  
> -    if [[ $YES != "y" ]]
> -    then
> -        echo "Do you want Raisin to automatically install build time 
> dependencies for you? (y/n)"
> +    default deps "false" ; $default_post
> +    default verbose "false" ; $default_post
> +    default yes "false" ; $default_post
> +
> +    if $deps && ! $yes ; then
> +        echo "WARNING: You have chosen to automatically install software as 
> root."
> +        echo -n "Are you sure that you want to continue? (y/n)"
>          while read answer
>          do
>              if [[ "$answer" = "n" ]]
>              then
> -                NO_DEPS=1
> -                break
> +                exit 0
>              elif [[ "$answer" = "y" ]]
>              then
> +             yes="true"
>                  break
>              else
>                  echo "Reply y or n"

I would keep the warning as it was before


> @@ -35,12 +75,10 @@ build() {
>          done
>      fi
>  
> +    check-builddep
> +    
>      mkdir -p "$INST_DIR" &>/dev/null
> -    install_dependencies git
> -    if [[ $DISTRO = "Fedora" ]]
> -    then
> -        install_dependencies rpm-build
> -    fi
> +
>      # build and install under $DESTDIR
>      for_each_component clean
>      for_each_component build
> @@ -59,6 +97,7 @@ unraise() {
>      rm -rf "$INST_DIR"
>  }
>  
> +RAISIN_HELP+=("install         Install binaries under /  (requires sudo)")
>  install() {
>      $arg_parse
>  
> @@ -71,12 +110,15 @@ install() {
>      install_package xen-system
>  }
>  
> +RAISIN_HELP+=("configure       Configure the system  (requires sudo)")
>  configure() {
>      $arg_parse
>  
> -    if [[ $YES != "y" ]]
> -    then
> -        echo "Proceeding we'll make changes to the running system,"
> +    default verbose "false" ; $default_post
> +    default yes "false" ; $default_post
> +
> +    if $deps && ! $yes ; then
> +        echo "WARNING: Proceeding we'll make changes to the running system,"
>          echo "are you sure that you want to continue? (y/n)"
>          while read answer
>          do
> @@ -85,6 +127,7 @@ configure() {
>                  exit 0
>              elif [[ "$answer" = "y" ]]
>              then
> +             yes="true"
>                  break
>              else
>                  echo "Reply y or n"
> diff --git a/lib/common-functions.sh b/lib/common-functions.sh
> index cfa0c7f..fd73f08 100644
> --- a/lib/common-functions.sh
> +++ b/lib/common-functions.sh
> @@ -97,15 +97,23 @@ function get_distro() {
>      case "$os_VENDOR" in
>          "Debian"* | "Ubuntu"* | "LinuxMint"* )
>              DISTRO="Debian"
> +         PKGTYPE="deb"
> +            ;;
> +        "Fedora" )
> +            DISTRO="Fedora"
> +         PKGTYPE="rpm"
>              ;;
>          "SUSE"* )
>              DISTRO="SUSE"
> +         PKGTYPE="rpm"
>              ;;
>          "OpenSUSE"* | "openSUSE"* )
>              DISTRO="openSUSE"
> +         PKGTYPE="rpm"
>              ;;
>          "Red"* | "CentOS"* )
>              DISTRO="CentOS"
> +         PKGTYPE="rpm"
>              ;;
>          *)
>              DISTRO=$os_VENDOR
> @@ -114,6 +122,7 @@ function get_distro() {
>  
>      export os_VENDOR os_RELEASE os_UPDATE os_CODENAME
>      export DISTRO
> +    export PKGTYPE
>  }
>  
>  function get_arch() {
> @@ -122,24 +131,70 @@ function get_arch() {
>                  -e s/aarch64/arm64/`
>  }
>  
> -function install_dependencies() {
> -    if [[ "$NO_DEPS" && "$NO_DEPS" -eq 1 ]]
> -    then
> -        echo "Not installing any dependencies, as requested."
> -        echo "Depency list: $*"
> -        return 0
> +function _check-package-deb() {
> +    $arg_parse
> +
> +    $verbose && echo "Checking for package ${args[0]}"
> +
> +    if dpkg -s "${args[0]}" 2>/dev/null | grep -q "Status:.*installed" ; then
> +     return 0
> +    else
> +     return 1
>      fi
> -    case $DISTRO in
> -        "Debian" )
> -        $SUDO apt-get install -y $*
> -        ;;
> -        "Fedora" )
> -        $SUDO yum install -y $*
> -        ;;
> -        * )
> -        echo "I don't know how to install dependencies on $DISTRO"
> -        ;;
> -    esac
> +}
> +
> +function _install-package-deb() {
> +    $arg_parse
> +
> +    $requireargs SUDO
> +
> +    $SUDO apt-get install -y "${args[@]}"
> +}
> +
> +function _check-package-rpm() {
> +    local pstatus
> +
> +    $arg_parse
> +
> +    $verbose && echo "Checking for package ${args[0]}"
> +
> +    if rpm -q "${args[0]}" 2>&1 >/dev/null ; then
> +     return 0
> +    else
> +     return 1
> +    fi
> +}

Indentation and coding style


> +function _install-package-rpm() {
> +    $arg_parse
> +
> +    $requireargs SUDO
> +
> +    $SUDO yum install -y "${args[@]}"
> +}
> +
> +# Modifies inherited variable "missing"
> +function check-package() {
> +    local p
> +
> +    $arg_parse
> +
> +    $requireargs PKGTYPE
> +
> +    for p in "${args[@]}" ; do
> +     if ! _check-package-${PKGTYPE} $p ; then
> +         missing+=("$p")
> +     fi
> +    done

same here

> +}
> +
> +function install-package() {
> +    $arg_parse
> +
> +    $requireargs PKGTYPE
> +
> +    _install-package-${PKGTYPE} "${args[@]}"
>  }
>  
>  function start_initscripts() {
> -- 
> 1.9.1
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.