[lxc-devel] [PATCH 3/4] lxc-clone: use posix shell instead of bash

Stéphane Graber stgraber at ubuntu.com
Tue Dec 25 16:36:28 UTC 2012


On 12/25/2012 05:08 PM, Natanael Copa wrote:
> - avoid getopt --longoptions
> - use 'which' instead of 'type' to detect existance of tools
> - use 'grep -q -w' instead of bash substring variable expansion
>   ${line:0:18}
> 
> Signed-off-by: Natanael Copa <ncopa at alpinelinux.org>

Acked-by: Stéphane Graber <stgraber at ubuntu.com>

Pushed to staging. Thanks.

> ---
>  src/lxc/lxc-clone.in | 56 +++++++++++++++++++++++++++++-----------------------
>  1 file changed, 31 insertions(+), 25 deletions(-)
> 
> diff --git a/src/lxc/lxc-clone.in b/src/lxc/lxc-clone.in
> index c9cc5c7..4640149 100644
> --- a/src/lxc/lxc-clone.in
> +++ b/src/lxc/lxc-clone.in
> @@ -1,4 +1,4 @@
> -#!/bin/bash
> +#!/bin/sh
>  
>  #
>  # lxc: linux Container library
> @@ -44,8 +44,16 @@ help() {
>      echo "                  only works for non-snapshot LVM)" >&2
>  }
>  
> -shortoptions='ho:n:sL:v:p:t:'
> -longoptions='help,orig:,name:,snapshot,fssize:,vgname:,lvprefix:,fstype:'
> +usage_err() {
> +    [ -n "$1" ] && echo "$1" >&2
> +    usage
> +    exit 1
> +}
> +
> +optarg_check() {
> +    [ -n "$2" ] || usage_err "option $1 requires an argument"
> +}
> +
>  lxc_path=@LXCPATH@
>  bindir=@BINDIR@
>  snapshot=no
> @@ -55,57 +63,55 @@ lxc_vg=lxc
>  lxc_lv_prefix=""
>  fstype=ext3
>  
> -getopt=$(getopt -o $shortoptions --longoptions  $longoptions -- "$@")
> -if [ $? != 0 ]; then
> -    usage
> -    exit 1;
> -fi
> -
> -eval set -- "$getopt"
> -
> -while true; do
> -    case "$1" in
> +while [ $# -gt 0 ]; do
> +    opt="$1"
> +    shift
> +    case "$opt" in
>          -h|--help)
>              help
>              exit 1
>              ;;
>          -s|--snapshot)
> -            shift
>              snapshot=yes
>              snapshot_opt="-s"
>              ;;
>          -o|--orig)
> -            shift
> +            optarg_check $opt $1
>              lxc_orig=$1
>              shift
>              ;;
>          -L|--fssize)
> -            shift
> +            optarg_check $opt $1
>              lxc_size=$1
>              shift
>              ;;
>          -v|--vgname)
> -            shift
> +            optarg_check $opt $1
>              lxc_vg=$1
>              shift
>              ;;
>          -n|--name)
> -            shift
> +            optarg_check $opt $1
>              lxc_new=$1
>              shift
>              ;;
>          -p|--lvprefix)
> -            shift
> +            optarg_check $opt $1
>              lxc_lv_prefix=$1
>              shift
>              ;;
>          --)
> -            shift
>              break
>              ;;
> +        -?)
> +            usage_err "Unknown option: '$opt'"
> +            ;;
> +        -*)
> +            # split opts -abc into -a -b -c
> +            set -- $(echo "${opt#-}" | sed 's/\(.\)/ -\1/g') "$@"
> +            ;;
>          *)
> -            usage
> -            exit 1
> +            usage_err
>              ;;
>      esac
>  done
> @@ -191,7 +197,7 @@ lxc-info -s -n $lxc_orig|grep RUNNING >/dev/null 2>&1 || container_running=False
>  
>  sed -i '/lxc.rootfs/d' $lxc_path/$lxc_new/config
>  if [ -b $oldroot ]; then
> -    type vgscan || { echo "$(basename $0): lvm is not installed" >&2; false; }
> +    which vgscan >/dev/null || { echo "$(basename $0): lvm is not installed" >&2; false; }
>      lvdisplay $oldroot > /dev/null 2>&1 || { echo "$(basename $0): non-lvm blockdev cloning is not supported" >&2; false; }
>      lvm=TRUE
>      # ok, create a snapshot of the lvm device
> @@ -204,7 +210,7 @@ if [ -b $oldroot ]; then
>      fi
>      newlv="${lxc_lv_prefix}${lxc_new}_snapshot"
>      lvcreate -s -L $lxc_size -n $newlv $oldroot
> -    type xfs_admin > /dev/null 2>&1 && {
> +    which xfs_admin > /dev/null 2>&1 && {
>          # change filesystem UUID if it is an xfs filesystem
>          xfs_admin -u /dev/$lxc_vg/$newlv && xfs_admin -U generate /dev/$lxc_vg/$newlv
>      }
> @@ -272,7 +278,7 @@ c=$lxc_path/$lxc_new/config
>  mv ${c} ${c}.old
>  (
>  while read line; do
> -    if [ "${line:0:18}" = "lxc.network.hwaddr" ]; then
> +    if echo $line | grep -q -w '^lxc.network.hwaddr'; then
>          echo "lxc.network.hwaddr= 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')"
>      else
>          echo "$line"
> 


-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 899 bytes
Desc: OpenPGP digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20121225/2791e654/attachment.pgp>


More information about the lxc-devel mailing list