1d583b39bSJohn Wren Kennedy# 2d583b39bSJohn Wren Kennedy# CDDL HEADER START 3d583b39bSJohn Wren Kennedy# 4d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the 5d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License"). 6d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License. 7d583b39bSJohn Wren Kennedy# 8d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing. 10d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions 11d583b39bSJohn Wren Kennedy# and limitations under the License. 12d583b39bSJohn Wren Kennedy# 13d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each 14d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the 16d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying 17d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner] 18d583b39bSJohn Wren Kennedy# 19d583b39bSJohn Wren Kennedy# CDDL HEADER END 20d583b39bSJohn Wren Kennedy# 21d583b39bSJohn Wren Kennedy 22d583b39bSJohn Wren Kennedy# 23d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24d583b39bSJohn Wren Kennedy# Use is subject to license terms. 25d583b39bSJohn Wren Kennedy# 26d583b39bSJohn Wren Kennedy 27d583b39bSJohn Wren Kennedy# 28*52244c09SJohn Wren Kennedy# Copyright (c) 2012, 2014 by Delphix. All rights reserved. 29d583b39bSJohn Wren Kennedy# 30d583b39bSJohn Wren Kennedy 31d583b39bSJohn Wren Kennedy. ${STF_TOOLS}/contrib/include/logapi.shlib 32d583b39bSJohn Wren Kennedy 33d583b39bSJohn Wren KennedyZFS=${ZFS:-/usr/sbin/zfs} 34d583b39bSJohn Wren KennedyZPOOL=${ZPOOL:-/usr/sbin/zpool} 35d583b39bSJohn Wren Kennedy 36d583b39bSJohn Wren Kennedy# Determine whether a dataset is mounted 37d583b39bSJohn Wren Kennedy# 38d583b39bSJohn Wren Kennedy# $1 dataset name 39d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs 40d583b39bSJohn Wren Kennedy# 41d583b39bSJohn Wren Kennedy# Return 0 if dataset is mounted; 1 if unmounted; 2 on error 42d583b39bSJohn Wren Kennedy 43d583b39bSJohn Wren Kennedyfunction ismounted 44d583b39bSJohn Wren Kennedy{ 45d583b39bSJohn Wren Kennedy typeset fstype=$2 46d583b39bSJohn Wren Kennedy [[ -z $fstype ]] && fstype=zfs 47d583b39bSJohn Wren Kennedy typeset out dir name ret 48d583b39bSJohn Wren Kennedy 49d583b39bSJohn Wren Kennedy case $fstype in 50d583b39bSJohn Wren Kennedy zfs) 51d583b39bSJohn Wren Kennedy if [[ "$1" == "/"* ]] ; then 52d583b39bSJohn Wren Kennedy for out in $($ZFS mount | $AWK '{print $2}'); do 53d583b39bSJohn Wren Kennedy [[ $1 == $out ]] && return 0 54d583b39bSJohn Wren Kennedy done 55d583b39bSJohn Wren Kennedy else 56d583b39bSJohn Wren Kennedy for out in $($ZFS mount | $AWK '{print $1}'); do 57d583b39bSJohn Wren Kennedy [[ $1 == $out ]] && return 0 58d583b39bSJohn Wren Kennedy done 59d583b39bSJohn Wren Kennedy fi 60d583b39bSJohn Wren Kennedy ;; 61d583b39bSJohn Wren Kennedy ufs|nfs) 62d583b39bSJohn Wren Kennedy out=$($DF -F $fstype $1 2>/dev/null) 63d583b39bSJohn Wren Kennedy ret=$? 64d583b39bSJohn Wren Kennedy (($ret != 0)) && return $ret 65d583b39bSJohn Wren Kennedy 66d583b39bSJohn Wren Kennedy dir=${out%%\(*} 67d583b39bSJohn Wren Kennedy dir=${dir%% *} 68d583b39bSJohn Wren Kennedy name=${out##*\(} 69d583b39bSJohn Wren Kennedy name=${name%%\)*} 70d583b39bSJohn Wren Kennedy name=${name%% *} 71d583b39bSJohn Wren Kennedy 72d583b39bSJohn Wren Kennedy [[ "$1" == "$dir" || "$1" == "$name" ]] && return 0 73d583b39bSJohn Wren Kennedy ;; 74d583b39bSJohn Wren Kennedy esac 75d583b39bSJohn Wren Kennedy 76d583b39bSJohn Wren Kennedy return 1 77d583b39bSJohn Wren Kennedy} 78d583b39bSJohn Wren Kennedy 79d583b39bSJohn Wren Kennedy# Return 0 if a dataset is mounted; 1 otherwise 80d583b39bSJohn Wren Kennedy# 81d583b39bSJohn Wren Kennedy# $1 dataset name 82d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs 83d583b39bSJohn Wren Kennedy 84d583b39bSJohn Wren Kennedyfunction mounted 85d583b39bSJohn Wren Kennedy{ 86d583b39bSJohn Wren Kennedy ismounted $1 $2 87d583b39bSJohn Wren Kennedy (($? == 0)) && return 0 88d583b39bSJohn Wren Kennedy return 1 89d583b39bSJohn Wren Kennedy} 90d583b39bSJohn Wren Kennedy 91d583b39bSJohn Wren Kennedy# Return 0 if a dataset is unmounted; 1 otherwise 92d583b39bSJohn Wren Kennedy# 93d583b39bSJohn Wren Kennedy# $1 dataset name 94d583b39bSJohn Wren Kennedy# $2 filesystem type; optional - defaulted to zfs 95d583b39bSJohn Wren Kennedy 96d583b39bSJohn Wren Kennedyfunction unmounted 97d583b39bSJohn Wren Kennedy{ 98d583b39bSJohn Wren Kennedy ismounted $1 $2 99d583b39bSJohn Wren Kennedy (($? == 1)) && return 0 100d583b39bSJohn Wren Kennedy return 1 101d583b39bSJohn Wren Kennedy} 102d583b39bSJohn Wren Kennedy 103d583b39bSJohn Wren Kennedy# split line on "," 104d583b39bSJohn Wren Kennedy# 105d583b39bSJohn Wren Kennedy# $1 - line to split 106d583b39bSJohn Wren Kennedy 107d583b39bSJohn Wren Kennedyfunction splitline 108d583b39bSJohn Wren Kennedy{ 109d583b39bSJohn Wren Kennedy $ECHO $1 | $SED "s/,/ /g" 110d583b39bSJohn Wren Kennedy} 111d583b39bSJohn Wren Kennedy 112d583b39bSJohn Wren Kennedyfunction default_setup 113d583b39bSJohn Wren Kennedy{ 114d583b39bSJohn Wren Kennedy default_setup_noexit "$@" 115d583b39bSJohn Wren Kennedy 116d583b39bSJohn Wren Kennedy log_pass 117d583b39bSJohn Wren Kennedy} 118d583b39bSJohn Wren Kennedy 119d583b39bSJohn Wren Kennedy# 120d583b39bSJohn Wren Kennedy# Given a list of disks, setup storage pools and datasets. 121d583b39bSJohn Wren Kennedy# 122d583b39bSJohn Wren Kennedyfunction default_setup_noexit 123d583b39bSJohn Wren Kennedy{ 124d583b39bSJohn Wren Kennedy typeset disklist=$1 125d583b39bSJohn Wren Kennedy typeset container=$2 126d583b39bSJohn Wren Kennedy typeset volume=$3 127d583b39bSJohn Wren Kennedy 128d583b39bSJohn Wren Kennedy if is_global_zone; then 129d583b39bSJohn Wren Kennedy if poolexists $TESTPOOL ; then 130d583b39bSJohn Wren Kennedy destroy_pool $TESTPOOL 131d583b39bSJohn Wren Kennedy fi 132d583b39bSJohn Wren Kennedy [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL 133d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $TESTPOOL $disklist 134d583b39bSJohn Wren Kennedy else 135d583b39bSJohn Wren Kennedy reexport_pool 136d583b39bSJohn Wren Kennedy fi 137d583b39bSJohn Wren Kennedy 138d583b39bSJohn Wren Kennedy $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR 139d583b39bSJohn Wren Kennedy $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR 140d583b39bSJohn Wren Kennedy 141d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTFS 142d583b39bSJohn Wren Kennedy log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS 143d583b39bSJohn Wren Kennedy 144d583b39bSJohn Wren Kennedy if [[ -n $container ]]; then 145d583b39bSJohn Wren Kennedy $RM -rf $TESTDIR1 || \ 146d583b39bSJohn Wren Kennedy log_unresolved Could not remove $TESTDIR1 147d583b39bSJohn Wren Kennedy $MKDIR -p $TESTDIR1 || \ 148d583b39bSJohn Wren Kennedy log_unresolved Could not create $TESTDIR1 149d583b39bSJohn Wren Kennedy 150d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTCTR 151d583b39bSJohn Wren Kennedy log_must $ZFS set canmount=off $TESTPOOL/$TESTCTR 152d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 153d583b39bSJohn Wren Kennedy log_must $ZFS set mountpoint=$TESTDIR1 \ 154d583b39bSJohn Wren Kennedy $TESTPOOL/$TESTCTR/$TESTFS1 155d583b39bSJohn Wren Kennedy fi 156d583b39bSJohn Wren Kennedy 157d583b39bSJohn Wren Kennedy if [[ -n $volume ]]; then 158d583b39bSJohn Wren Kennedy if is_global_zone ; then 159d583b39bSJohn Wren Kennedy log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL 160d583b39bSJohn Wren Kennedy else 161d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTVOL 162d583b39bSJohn Wren Kennedy fi 163d583b39bSJohn Wren Kennedy fi 164d583b39bSJohn Wren Kennedy} 165d583b39bSJohn Wren Kennedy 166d583b39bSJohn Wren Kennedy# 167d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool, file system and 168d583b39bSJohn Wren Kennedy# a container. 169d583b39bSJohn Wren Kennedy# 170d583b39bSJohn Wren Kennedyfunction default_container_setup 171d583b39bSJohn Wren Kennedy{ 172d583b39bSJohn Wren Kennedy typeset disklist=$1 173d583b39bSJohn Wren Kennedy 174d583b39bSJohn Wren Kennedy default_setup "$disklist" "true" 175d583b39bSJohn Wren Kennedy} 176d583b39bSJohn Wren Kennedy 177d583b39bSJohn Wren Kennedy# 178d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool,file system 179d583b39bSJohn Wren Kennedy# and a volume. 180d583b39bSJohn Wren Kennedy# 181d583b39bSJohn Wren Kennedyfunction default_volume_setup 182d583b39bSJohn Wren Kennedy{ 183d583b39bSJohn Wren Kennedy typeset disklist=$1 184d583b39bSJohn Wren Kennedy 185d583b39bSJohn Wren Kennedy default_setup "$disklist" "" "true" 186d583b39bSJohn Wren Kennedy} 187d583b39bSJohn Wren Kennedy 188d583b39bSJohn Wren Kennedy# 189d583b39bSJohn Wren Kennedy# Given a list of disks, setup a storage pool,file system, 190d583b39bSJohn Wren Kennedy# a container and a volume. 191d583b39bSJohn Wren Kennedy# 192d583b39bSJohn Wren Kennedyfunction default_container_volume_setup 193d583b39bSJohn Wren Kennedy{ 194d583b39bSJohn Wren Kennedy typeset disklist=$1 195d583b39bSJohn Wren Kennedy 196d583b39bSJohn Wren Kennedy default_setup "$disklist" "true" "true" 197d583b39bSJohn Wren Kennedy} 198d583b39bSJohn Wren Kennedy 199d583b39bSJohn Wren Kennedy# 200d583b39bSJohn Wren Kennedy# Create a snapshot on a filesystem or volume. Defaultly create a snapshot on 201d583b39bSJohn Wren Kennedy# filesystem 202d583b39bSJohn Wren Kennedy# 203d583b39bSJohn Wren Kennedy# $1 Existing filesystem or volume name. Default, $TESTFS 204d583b39bSJohn Wren Kennedy# $2 snapshot name. Default, $TESTSNAP 205d583b39bSJohn Wren Kennedy# 206d583b39bSJohn Wren Kennedyfunction create_snapshot 207d583b39bSJohn Wren Kennedy{ 208d583b39bSJohn Wren Kennedy typeset fs_vol=${1:-$TESTFS} 209d583b39bSJohn Wren Kennedy typeset snap=${2:-$TESTSNAP} 210d583b39bSJohn Wren Kennedy 211d583b39bSJohn Wren Kennedy [[ -z $fs_vol ]] && log_fail "Filesystem or volume's name is undefined." 212d583b39bSJohn Wren Kennedy [[ -z $snap ]] && log_fail "Snapshot's name is undefined." 213d583b39bSJohn Wren Kennedy 214d583b39bSJohn Wren Kennedy if snapexists $fs_vol@$snap; then 215d583b39bSJohn Wren Kennedy log_fail "$fs_vol@$snap already exists." 216d583b39bSJohn Wren Kennedy fi 217d583b39bSJohn Wren Kennedy datasetexists $fs_vol || \ 218d583b39bSJohn Wren Kennedy log_fail "$fs_vol must exist." 219d583b39bSJohn Wren Kennedy 220d583b39bSJohn Wren Kennedy log_must $ZFS snapshot $fs_vol@$snap 221d583b39bSJohn Wren Kennedy} 222d583b39bSJohn Wren Kennedy 223d583b39bSJohn Wren Kennedy# 224d583b39bSJohn Wren Kennedy# Create a clone from a snapshot, default clone name is $TESTCLONE. 225d583b39bSJohn Wren Kennedy# 226d583b39bSJohn Wren Kennedy# $1 Existing snapshot, $TESTPOOL/$TESTFS@$TESTSNAP is default. 227d583b39bSJohn Wren Kennedy# $2 Clone name, $TESTPOOL/$TESTCLONE is default. 228d583b39bSJohn Wren Kennedy# 229d583b39bSJohn Wren Kennedyfunction create_clone # snapshot clone 230d583b39bSJohn Wren Kennedy{ 231d583b39bSJohn Wren Kennedy typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} 232d583b39bSJohn Wren Kennedy typeset clone=${2:-$TESTPOOL/$TESTCLONE} 233d583b39bSJohn Wren Kennedy 234d583b39bSJohn Wren Kennedy [[ -z $snap ]] && \ 235d583b39bSJohn Wren Kennedy log_fail "Snapshot name is undefined." 236d583b39bSJohn Wren Kennedy [[ -z $clone ]] && \ 237d583b39bSJohn Wren Kennedy log_fail "Clone name is undefined." 238d583b39bSJohn Wren Kennedy 239d583b39bSJohn Wren Kennedy log_must $ZFS clone $snap $clone 240d583b39bSJohn Wren Kennedy} 241d583b39bSJohn Wren Kennedy 242d583b39bSJohn Wren Kennedyfunction default_mirror_setup 243d583b39bSJohn Wren Kennedy{ 244d583b39bSJohn Wren Kennedy default_mirror_setup_noexit $1 $2 $3 245d583b39bSJohn Wren Kennedy 246d583b39bSJohn Wren Kennedy log_pass 247d583b39bSJohn Wren Kennedy} 248d583b39bSJohn Wren Kennedy 249d583b39bSJohn Wren Kennedy# 250d583b39bSJohn Wren Kennedy# Given a pair of disks, set up a storage pool and dataset for the mirror 251d583b39bSJohn Wren Kennedy# @parameters: $1 the primary side of the mirror 252d583b39bSJohn Wren Kennedy# $2 the secondary side of the mirror 253d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL TESTFS 254d583b39bSJohn Wren Kennedyfunction default_mirror_setup_noexit 255d583b39bSJohn Wren Kennedy{ 256d583b39bSJohn Wren Kennedy readonly func="default_mirror_setup_noexit" 257d583b39bSJohn Wren Kennedy typeset primary=$1 258d583b39bSJohn Wren Kennedy typeset secondary=$2 259d583b39bSJohn Wren Kennedy 260d583b39bSJohn Wren Kennedy [[ -z $primary ]] && \ 261d583b39bSJohn Wren Kennedy log_fail "$func: No parameters passed" 262d583b39bSJohn Wren Kennedy [[ -z $secondary ]] && \ 263d583b39bSJohn Wren Kennedy log_fail "$func: No secondary partition passed" 264d583b39bSJohn Wren Kennedy [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL 265d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $TESTPOOL mirror $@ 266d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTFS 267d583b39bSJohn Wren Kennedy log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS 268d583b39bSJohn Wren Kennedy} 269d583b39bSJohn Wren Kennedy 270d583b39bSJohn Wren Kennedy# 271d583b39bSJohn Wren Kennedy# create a number of mirrors. 272d583b39bSJohn Wren Kennedy# We create a number($1) of 2 way mirrors using the pairs of disks named 273d583b39bSJohn Wren Kennedy# on the command line. These mirrors are *not* mounted 274d583b39bSJohn Wren Kennedy# @parameters: $1 the number of mirrors to create 275d583b39bSJohn Wren Kennedy# $... the devices to use to create the mirrors on 276d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL 277d583b39bSJohn Wren Kennedyfunction setup_mirrors 278d583b39bSJohn Wren Kennedy{ 279d583b39bSJohn Wren Kennedy typeset -i nmirrors=$1 280d583b39bSJohn Wren Kennedy 281d583b39bSJohn Wren Kennedy shift 282d583b39bSJohn Wren Kennedy while ((nmirrors > 0)); do 283d583b39bSJohn Wren Kennedy log_must test -n "$1" -a -n "$2" 284d583b39bSJohn Wren Kennedy [[ -d /$TESTPOOL$nmirrors ]] && $RM -rf /$TESTPOOL$nmirrors 285d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $TESTPOOL$nmirrors mirror $1 $2 286d583b39bSJohn Wren Kennedy shift 2 287d583b39bSJohn Wren Kennedy ((nmirrors = nmirrors - 1)) 288d583b39bSJohn Wren Kennedy done 289d583b39bSJohn Wren Kennedy} 290d583b39bSJohn Wren Kennedy 291d583b39bSJohn Wren Kennedy# 292d583b39bSJohn Wren Kennedy# create a number of raidz pools. 293d583b39bSJohn Wren Kennedy# We create a number($1) of 2 raidz pools using the pairs of disks named 294d583b39bSJohn Wren Kennedy# on the command line. These pools are *not* mounted 295d583b39bSJohn Wren Kennedy# @parameters: $1 the number of pools to create 296d583b39bSJohn Wren Kennedy# $... the devices to use to create the pools on 297d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL 298d583b39bSJohn Wren Kennedyfunction setup_raidzs 299d583b39bSJohn Wren Kennedy{ 300d583b39bSJohn Wren Kennedy typeset -i nraidzs=$1 301d583b39bSJohn Wren Kennedy 302d583b39bSJohn Wren Kennedy shift 303d583b39bSJohn Wren Kennedy while ((nraidzs > 0)); do 304d583b39bSJohn Wren Kennedy log_must test -n "$1" -a -n "$2" 305d583b39bSJohn Wren Kennedy [[ -d /$TESTPOOL$nraidzs ]] && $RM -rf /$TESTPOOL$nraidzs 306d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $TESTPOOL$nraidzs raidz $1 $2 307d583b39bSJohn Wren Kennedy shift 2 308d583b39bSJohn Wren Kennedy ((nraidzs = nraidzs - 1)) 309d583b39bSJohn Wren Kennedy done 310d583b39bSJohn Wren Kennedy} 311d583b39bSJohn Wren Kennedy 312d583b39bSJohn Wren Kennedy# 313d583b39bSJohn Wren Kennedy# Destroy the configured testpool mirrors. 314d583b39bSJohn Wren Kennedy# the mirrors are of the form ${TESTPOOL}{number} 315d583b39bSJohn Wren Kennedy# @uses: ZPOOL ZFS TESTPOOL 316d583b39bSJohn Wren Kennedyfunction destroy_mirrors 317d583b39bSJohn Wren Kennedy{ 318d583b39bSJohn Wren Kennedy default_cleanup_noexit 319d583b39bSJohn Wren Kennedy 320d583b39bSJohn Wren Kennedy log_pass 321d583b39bSJohn Wren Kennedy} 322d583b39bSJohn Wren Kennedy 323d583b39bSJohn Wren Kennedy# 324d583b39bSJohn Wren Kennedy# Given a minimum of two disks, set up a storage pool and dataset for the raid-z 325d583b39bSJohn Wren Kennedy# $1 the list of disks 326d583b39bSJohn Wren Kennedy# 327d583b39bSJohn Wren Kennedyfunction default_raidz_setup 328d583b39bSJohn Wren Kennedy{ 329d583b39bSJohn Wren Kennedy typeset disklist="$*" 330d583b39bSJohn Wren Kennedy disks=(${disklist[*]}) 331d583b39bSJohn Wren Kennedy 332d583b39bSJohn Wren Kennedy if [[ ${#disks[*]} -lt 2 ]]; then 333d583b39bSJohn Wren Kennedy log_fail "A raid-z requires a minimum of two disks." 334d583b39bSJohn Wren Kennedy fi 335d583b39bSJohn Wren Kennedy 336d583b39bSJohn Wren Kennedy [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL 337d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $TESTPOOL raidz $1 $2 $3 338d583b39bSJohn Wren Kennedy log_must $ZFS create $TESTPOOL/$TESTFS 339d583b39bSJohn Wren Kennedy log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS 340d583b39bSJohn Wren Kennedy 341d583b39bSJohn Wren Kennedy log_pass 342d583b39bSJohn Wren Kennedy} 343d583b39bSJohn Wren Kennedy 344d583b39bSJohn Wren Kennedy# 345d583b39bSJohn Wren Kennedy# Common function used to cleanup storage pools and datasets. 346d583b39bSJohn Wren Kennedy# 347d583b39bSJohn Wren Kennedy# Invoked at the start of the test suite to ensure the system 348d583b39bSJohn Wren Kennedy# is in a known state, and also at the end of each set of 349d583b39bSJohn Wren Kennedy# sub-tests to ensure errors from one set of tests doesn't 350d583b39bSJohn Wren Kennedy# impact the execution of the next set. 351d583b39bSJohn Wren Kennedy 352d583b39bSJohn Wren Kennedyfunction default_cleanup 353d583b39bSJohn Wren Kennedy{ 354d583b39bSJohn Wren Kennedy default_cleanup_noexit 355d583b39bSJohn Wren Kennedy 356d583b39bSJohn Wren Kennedy log_pass 357d583b39bSJohn Wren Kennedy} 358d583b39bSJohn Wren Kennedy 359d583b39bSJohn Wren Kennedyfunction default_cleanup_noexit 360d583b39bSJohn Wren Kennedy{ 361d583b39bSJohn Wren Kennedy typeset exclude="" 362d583b39bSJohn Wren Kennedy typeset pool="" 363d583b39bSJohn Wren Kennedy # 364d583b39bSJohn Wren Kennedy # Destroying the pool will also destroy any 365d583b39bSJohn Wren Kennedy # filesystems it contains. 366d583b39bSJohn Wren Kennedy # 367d583b39bSJohn Wren Kennedy if is_global_zone; then 368d583b39bSJohn Wren Kennedy $ZFS unmount -a > /dev/null 2>&1 369d583b39bSJohn Wren Kennedy exclude=`eval $ECHO \"'(${KEEP})'\"` 370d583b39bSJohn Wren Kennedy ALL_POOLS=$($ZPOOL list -H -o name \ 371d583b39bSJohn Wren Kennedy | $GREP -v "$NO_POOLS" | $EGREP -v "$exclude") 372d583b39bSJohn Wren Kennedy # Here, we loop through the pools we're allowed to 373d583b39bSJohn Wren Kennedy # destroy, only destroying them if it's safe to do 374d583b39bSJohn Wren Kennedy # so. 375d583b39bSJohn Wren Kennedy while [ ! -z ${ALL_POOLS} ] 376d583b39bSJohn Wren Kennedy do 377d583b39bSJohn Wren Kennedy for pool in ${ALL_POOLS} 378d583b39bSJohn Wren Kennedy do 379d583b39bSJohn Wren Kennedy if safe_to_destroy_pool $pool ; 380d583b39bSJohn Wren Kennedy then 381d583b39bSJohn Wren Kennedy destroy_pool $pool 382d583b39bSJohn Wren Kennedy fi 383d583b39bSJohn Wren Kennedy ALL_POOLS=$($ZPOOL list -H -o name \ 384d583b39bSJohn Wren Kennedy | $GREP -v "$NO_POOLS" \ 385d583b39bSJohn Wren Kennedy | $EGREP -v "$exclude") 386d583b39bSJohn Wren Kennedy done 387d583b39bSJohn Wren Kennedy done 388d583b39bSJohn Wren Kennedy 389d583b39bSJohn Wren Kennedy $ZFS mount -a 390d583b39bSJohn Wren Kennedy else 391d583b39bSJohn Wren Kennedy typeset fs="" 392d583b39bSJohn Wren Kennedy for fs in $($ZFS list -H -o name \ 393d583b39bSJohn Wren Kennedy | $GREP "^$ZONE_POOL/$ZONE_CTR[01234]/"); do 394d583b39bSJohn Wren Kennedy datasetexists $fs && \ 395d583b39bSJohn Wren Kennedy log_must $ZFS destroy -Rf $fs 396d583b39bSJohn Wren Kennedy done 397d583b39bSJohn Wren Kennedy 398d583b39bSJohn Wren Kennedy # Need cleanup here to avoid garbage dir left. 399d583b39bSJohn Wren Kennedy for fs in $($ZFS list -H -o name); do 400d583b39bSJohn Wren Kennedy [[ $fs == /$ZONE_POOL ]] && continue 401d583b39bSJohn Wren Kennedy [[ -d $fs ]] && log_must $RM -rf $fs/* 402d583b39bSJohn Wren Kennedy done 403d583b39bSJohn Wren Kennedy 404d583b39bSJohn Wren Kennedy # 405d583b39bSJohn Wren Kennedy # Reset the $ZONE_POOL/$ZONE_CTR[01234] file systems property to 406d583b39bSJohn Wren Kennedy # the default value 407d583b39bSJohn Wren Kennedy # 408d583b39bSJohn Wren Kennedy for fs in $($ZFS list -H -o name); do 409d583b39bSJohn Wren Kennedy if [[ $fs == $ZONE_POOL/$ZONE_CTR[01234] ]]; then 410d583b39bSJohn Wren Kennedy log_must $ZFS set reservation=none $fs 411d583b39bSJohn Wren Kennedy log_must $ZFS set recordsize=128K $fs 412d583b39bSJohn Wren Kennedy log_must $ZFS set mountpoint=/$fs $fs 413d583b39bSJohn Wren Kennedy typeset enc="" 414d583b39bSJohn Wren Kennedy enc=$(get_prop encryption $fs) 415d583b39bSJohn Wren Kennedy if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || \ 416d583b39bSJohn Wren Kennedy [[ "$enc" == "off" ]]; then 417d583b39bSJohn Wren Kennedy log_must $ZFS set checksum=on $fs 418d583b39bSJohn Wren Kennedy fi 419d583b39bSJohn Wren Kennedy log_must $ZFS set compression=off $fs 420d583b39bSJohn Wren Kennedy log_must $ZFS set atime=on $fs 421d583b39bSJohn Wren Kennedy log_must $ZFS set devices=off $fs 422d583b39bSJohn Wren Kennedy log_must $ZFS set exec=on $fs 423d583b39bSJohn Wren Kennedy log_must $ZFS set setuid=on $fs 424d583b39bSJohn Wren Kennedy log_must $ZFS set readonly=off $fs 425d583b39bSJohn Wren Kennedy log_must $ZFS set snapdir=hidden $fs 426d583b39bSJohn Wren Kennedy log_must $ZFS set aclmode=groupmask $fs 427d583b39bSJohn Wren Kennedy log_must $ZFS set aclinherit=secure $fs 428d583b39bSJohn Wren Kennedy fi 429d583b39bSJohn Wren Kennedy done 430d583b39bSJohn Wren Kennedy fi 431d583b39bSJohn Wren Kennedy 432d583b39bSJohn Wren Kennedy [[ -d $TESTDIR ]] && \ 433d583b39bSJohn Wren Kennedy log_must $RM -rf $TESTDIR 434d583b39bSJohn Wren Kennedy} 435d583b39bSJohn Wren Kennedy 436d583b39bSJohn Wren Kennedy 437d583b39bSJohn Wren Kennedy# 438d583b39bSJohn Wren Kennedy# Common function used to cleanup storage pools, file systems 439d583b39bSJohn Wren Kennedy# and containers. 440d583b39bSJohn Wren Kennedy# 441d583b39bSJohn Wren Kennedyfunction default_container_cleanup 442d583b39bSJohn Wren Kennedy{ 443d583b39bSJohn Wren Kennedy if ! is_global_zone; then 444d583b39bSJohn Wren Kennedy reexport_pool 445d583b39bSJohn Wren Kennedy fi 446d583b39bSJohn Wren Kennedy 447d583b39bSJohn Wren Kennedy ismounted $TESTPOOL/$TESTCTR/$TESTFS1 448d583b39bSJohn Wren Kennedy [[ $? -eq 0 ]] && \ 449d583b39bSJohn Wren Kennedy log_must $ZFS unmount $TESTPOOL/$TESTCTR/$TESTFS1 450d583b39bSJohn Wren Kennedy 451d583b39bSJohn Wren Kennedy datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ 452d583b39bSJohn Wren Kennedy log_must $ZFS destroy -R $TESTPOOL/$TESTCTR/$TESTFS1 453d583b39bSJohn Wren Kennedy 454d583b39bSJohn Wren Kennedy datasetexists $TESTPOOL/$TESTCTR && \ 455d583b39bSJohn Wren Kennedy log_must $ZFS destroy -Rf $TESTPOOL/$TESTCTR 456d583b39bSJohn Wren Kennedy 457d583b39bSJohn Wren Kennedy [[ -e $TESTDIR1 ]] && \ 458d583b39bSJohn Wren Kennedy log_must $RM -rf $TESTDIR1 > /dev/null 2>&1 459d583b39bSJohn Wren Kennedy 460d583b39bSJohn Wren Kennedy default_cleanup 461d583b39bSJohn Wren Kennedy} 462d583b39bSJohn Wren Kennedy 463d583b39bSJohn Wren Kennedy# 464d583b39bSJohn Wren Kennedy# Common function used to cleanup snapshot of file system or volume. Default to 465d583b39bSJohn Wren Kennedy# delete the file system's snapshot 466d583b39bSJohn Wren Kennedy# 467d583b39bSJohn Wren Kennedy# $1 snapshot name 468d583b39bSJohn Wren Kennedy# 469d583b39bSJohn Wren Kennedyfunction destroy_snapshot 470d583b39bSJohn Wren Kennedy{ 471d583b39bSJohn Wren Kennedy typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} 472d583b39bSJohn Wren Kennedy 473d583b39bSJohn Wren Kennedy if ! snapexists $snap; then 474d583b39bSJohn Wren Kennedy log_fail "'$snap' does not existed." 475d583b39bSJohn Wren Kennedy fi 476d583b39bSJohn Wren Kennedy 477d583b39bSJohn Wren Kennedy # 478d583b39bSJohn Wren Kennedy # For the sake of the value which come from 'get_prop' is not equal 479d583b39bSJohn Wren Kennedy # to the really mountpoint when the snapshot is unmounted. So, firstly 480d583b39bSJohn Wren Kennedy # check and make sure this snapshot's been mounted in current system. 481d583b39bSJohn Wren Kennedy # 482d583b39bSJohn Wren Kennedy typeset mtpt="" 483d583b39bSJohn Wren Kennedy if ismounted $snap; then 484d583b39bSJohn Wren Kennedy mtpt=$(get_prop mountpoint $snap) 485d583b39bSJohn Wren Kennedy (($? != 0)) && \ 486d583b39bSJohn Wren Kennedy log_fail "get_prop mountpoint $snap failed." 487d583b39bSJohn Wren Kennedy fi 488d583b39bSJohn Wren Kennedy 489d583b39bSJohn Wren Kennedy log_must $ZFS destroy $snap 490d583b39bSJohn Wren Kennedy [[ $mtpt != "" && -d $mtpt ]] && \ 491d583b39bSJohn Wren Kennedy log_must $RM -rf $mtpt 492d583b39bSJohn Wren Kennedy} 493d583b39bSJohn Wren Kennedy 494d583b39bSJohn Wren Kennedy# 495d583b39bSJohn Wren Kennedy# Common function used to cleanup clone. 496d583b39bSJohn Wren Kennedy# 497d583b39bSJohn Wren Kennedy# $1 clone name 498d583b39bSJohn Wren Kennedy# 499d583b39bSJohn Wren Kennedyfunction destroy_clone 500d583b39bSJohn Wren Kennedy{ 501d583b39bSJohn Wren Kennedy typeset clone=${1:-$TESTPOOL/$TESTCLONE} 502d583b39bSJohn Wren Kennedy 503d583b39bSJohn Wren Kennedy if ! datasetexists $clone; then 504d583b39bSJohn Wren Kennedy log_fail "'$clone' does not existed." 505d583b39bSJohn Wren Kennedy fi 506d583b39bSJohn Wren Kennedy 507d583b39bSJohn Wren Kennedy # With the same reason in destroy_snapshot 508d583b39bSJohn Wren Kennedy typeset mtpt="" 509d583b39bSJohn Wren Kennedy if ismounted $clone; then 510d583b39bSJohn Wren Kennedy mtpt=$(get_prop mountpoint $clone) 511d583b39bSJohn Wren Kennedy (($? != 0)) && \ 512d583b39bSJohn Wren Kennedy log_fail "get_prop mountpoint $clone failed." 513d583b39bSJohn Wren Kennedy fi 514d583b39bSJohn Wren Kennedy 515d583b39bSJohn Wren Kennedy log_must $ZFS destroy $clone 516d583b39bSJohn Wren Kennedy [[ $mtpt != "" && -d $mtpt ]] && \ 517d583b39bSJohn Wren Kennedy log_must $RM -rf $mtpt 518d583b39bSJohn Wren Kennedy} 519d583b39bSJohn Wren Kennedy 520d583b39bSJohn Wren Kennedy# Return 0 if a snapshot exists; $? otherwise 521d583b39bSJohn Wren Kennedy# 522d583b39bSJohn Wren Kennedy# $1 - snapshot name 523d583b39bSJohn Wren Kennedy 524d583b39bSJohn Wren Kennedyfunction snapexists 525d583b39bSJohn Wren Kennedy{ 526d583b39bSJohn Wren Kennedy $ZFS list -H -t snapshot "$1" > /dev/null 2>&1 527d583b39bSJohn Wren Kennedy return $? 528d583b39bSJohn Wren Kennedy} 529d583b39bSJohn Wren Kennedy 530d583b39bSJohn Wren Kennedy# 531d583b39bSJohn Wren Kennedy# Set a property to a certain value on a dataset. 532d583b39bSJohn Wren Kennedy# Sets a property of the dataset to the value as passed in. 533d583b39bSJohn Wren Kennedy# @param: 534d583b39bSJohn Wren Kennedy# $1 dataset who's property is being set 535d583b39bSJohn Wren Kennedy# $2 property to set 536d583b39bSJohn Wren Kennedy# $3 value to set property to 537d583b39bSJohn Wren Kennedy# @return: 538d583b39bSJohn Wren Kennedy# 0 if the property could be set. 539d583b39bSJohn Wren Kennedy# non-zero otherwise. 540d583b39bSJohn Wren Kennedy# @use: ZFS 541d583b39bSJohn Wren Kennedy# 542d583b39bSJohn Wren Kennedyfunction dataset_setprop 543d583b39bSJohn Wren Kennedy{ 544d583b39bSJohn Wren Kennedy typeset fn=dataset_setprop 545d583b39bSJohn Wren Kennedy 546d583b39bSJohn Wren Kennedy if (($# < 3)); then 547d583b39bSJohn Wren Kennedy log_note "$fn: Insufficient parameters (need 3, had $#)" 548d583b39bSJohn Wren Kennedy return 1 549d583b39bSJohn Wren Kennedy fi 550d583b39bSJohn Wren Kennedy typeset output= 551d583b39bSJohn Wren Kennedy output=$($ZFS set $2=$3 $1 2>&1) 552d583b39bSJohn Wren Kennedy typeset rv=$? 553d583b39bSJohn Wren Kennedy if ((rv != 0)); then 554d583b39bSJohn Wren Kennedy log_note "Setting property on $1 failed." 555d583b39bSJohn Wren Kennedy log_note "property $2=$3" 556d583b39bSJohn Wren Kennedy log_note "Return Code: $rv" 557d583b39bSJohn Wren Kennedy log_note "Output: $output" 558d583b39bSJohn Wren Kennedy return $rv 559d583b39bSJohn Wren Kennedy fi 560d583b39bSJohn Wren Kennedy return 0 561d583b39bSJohn Wren Kennedy} 562d583b39bSJohn Wren Kennedy 563d583b39bSJohn Wren Kennedy# 564d583b39bSJohn Wren Kennedy# Assign suite defined dataset properties. 565d583b39bSJohn Wren Kennedy# This function is used to apply the suite's defined default set of 566d583b39bSJohn Wren Kennedy# properties to a dataset. 567d583b39bSJohn Wren Kennedy# @parameters: $1 dataset to use 568d583b39bSJohn Wren Kennedy# @uses: ZFS COMPRESSION_PROP CHECKSUM_PROP 569d583b39bSJohn Wren Kennedy# @returns: 570d583b39bSJohn Wren Kennedy# 0 if the dataset has been altered. 571d583b39bSJohn Wren Kennedy# 1 if no pool name was passed in. 572d583b39bSJohn Wren Kennedy# 2 if the dataset could not be found. 573d583b39bSJohn Wren Kennedy# 3 if the dataset could not have it's properties set. 574d583b39bSJohn Wren Kennedy# 575d583b39bSJohn Wren Kennedyfunction dataset_set_defaultproperties 576d583b39bSJohn Wren Kennedy{ 577d583b39bSJohn Wren Kennedy typeset dataset="$1" 578d583b39bSJohn Wren Kennedy 579d583b39bSJohn Wren Kennedy [[ -z $dataset ]] && return 1 580d583b39bSJohn Wren Kennedy 581d583b39bSJohn Wren Kennedy typeset confset= 582d583b39bSJohn Wren Kennedy typeset -i found=0 583d583b39bSJohn Wren Kennedy for confset in $($ZFS list); do 584d583b39bSJohn Wren Kennedy if [[ $dataset = $confset ]]; then 585d583b39bSJohn Wren Kennedy found=1 586d583b39bSJohn Wren Kennedy break 587d583b39bSJohn Wren Kennedy fi 588d583b39bSJohn Wren Kennedy done 589d583b39bSJohn Wren Kennedy [[ $found -eq 0 ]] && return 2 590d583b39bSJohn Wren Kennedy if [[ -n $COMPRESSION_PROP ]]; then 591d583b39bSJohn Wren Kennedy dataset_setprop $dataset compression $COMPRESSION_PROP || \ 592d583b39bSJohn Wren Kennedy return 3 593d583b39bSJohn Wren Kennedy log_note "Compression set to '$COMPRESSION_PROP' on $dataset" 594d583b39bSJohn Wren Kennedy fi 595d583b39bSJohn Wren Kennedy if [[ -n $CHECKSUM_PROP ]]; then 596d583b39bSJohn Wren Kennedy dataset_setprop $dataset checksum $CHECKSUM_PROP || \ 597d583b39bSJohn Wren Kennedy return 3 598d583b39bSJohn Wren Kennedy log_note "Checksum set to '$CHECKSUM_PROP' on $dataset" 599d583b39bSJohn Wren Kennedy fi 600d583b39bSJohn Wren Kennedy return 0 601d583b39bSJohn Wren Kennedy} 602d583b39bSJohn Wren Kennedy 603d583b39bSJohn Wren Kennedy# 604d583b39bSJohn Wren Kennedy# Check a numeric assertion 605d583b39bSJohn Wren Kennedy# @parameter: $@ the assertion to check 606d583b39bSJohn Wren Kennedy# @output: big loud notice if assertion failed 607d583b39bSJohn Wren Kennedy# @use: log_fail 608d583b39bSJohn Wren Kennedy# 609d583b39bSJohn Wren Kennedyfunction assert 610d583b39bSJohn Wren Kennedy{ 611d583b39bSJohn Wren Kennedy (($@)) || log_fail "$@" 612d583b39bSJohn Wren Kennedy} 613d583b39bSJohn Wren Kennedy 614d583b39bSJohn Wren Kennedy# 615d583b39bSJohn Wren Kennedy# Function to format partition size of a disk 616d583b39bSJohn Wren Kennedy# Given a disk cxtxdx reduces all partitions 617d583b39bSJohn Wren Kennedy# to 0 size 618d583b39bSJohn Wren Kennedy# 619d583b39bSJohn Wren Kennedyfunction zero_partitions #<whole_disk_name> 620d583b39bSJohn Wren Kennedy{ 621d583b39bSJohn Wren Kennedy typeset diskname=$1 622d583b39bSJohn Wren Kennedy typeset i 623d583b39bSJohn Wren Kennedy 624d583b39bSJohn Wren Kennedy for i in 0 1 3 4 5 6 7 625d583b39bSJohn Wren Kennedy do 626d583b39bSJohn Wren Kennedy set_partition $i "" 0mb $diskname 627d583b39bSJohn Wren Kennedy done 628d583b39bSJohn Wren Kennedy} 629d583b39bSJohn Wren Kennedy 630d583b39bSJohn Wren Kennedy# 631d583b39bSJohn Wren Kennedy# Given a slice, size and disk, this function 632d583b39bSJohn Wren Kennedy# formats the slice to the specified size. 633d583b39bSJohn Wren Kennedy# Size should be specified with units as per 634d583b39bSJohn Wren Kennedy# the `format` command requirements eg. 100mb 3gb 635d583b39bSJohn Wren Kennedy# 636d583b39bSJohn Wren Kennedyfunction set_partition #<slice_num> <slice_start> <size_plus_units> <whole_disk_name> 637d583b39bSJohn Wren Kennedy{ 638d583b39bSJohn Wren Kennedy typeset -i slicenum=$1 639d583b39bSJohn Wren Kennedy typeset start=$2 640d583b39bSJohn Wren Kennedy typeset size=$3 641d583b39bSJohn Wren Kennedy typeset disk=$4 642d583b39bSJohn Wren Kennedy [[ -z $slicenum || -z $size || -z $disk ]] && \ 643d583b39bSJohn Wren Kennedy log_fail "The slice, size or disk name is unspecified." 644d583b39bSJohn Wren Kennedy typeset format_file=/var/tmp/format_in.$$ 645d583b39bSJohn Wren Kennedy 646d583b39bSJohn Wren Kennedy $ECHO "partition" >$format_file 647d583b39bSJohn Wren Kennedy $ECHO "$slicenum" >> $format_file 648d583b39bSJohn Wren Kennedy $ECHO "" >> $format_file 649d583b39bSJohn Wren Kennedy $ECHO "" >> $format_file 650d583b39bSJohn Wren Kennedy $ECHO "$start" >> $format_file 651d583b39bSJohn Wren Kennedy $ECHO "$size" >> $format_file 652d583b39bSJohn Wren Kennedy $ECHO "label" >> $format_file 653d583b39bSJohn Wren Kennedy $ECHO "" >> $format_file 654d583b39bSJohn Wren Kennedy $ECHO "q" >> $format_file 655d583b39bSJohn Wren Kennedy $ECHO "q" >> $format_file 656d583b39bSJohn Wren Kennedy 657d583b39bSJohn Wren Kennedy $FORMAT -e -s -d $disk -f $format_file 658d583b39bSJohn Wren Kennedy typeset ret_val=$? 659d583b39bSJohn Wren Kennedy $RM -f $format_file 660d583b39bSJohn Wren Kennedy [[ $ret_val -ne 0 ]] && \ 661d583b39bSJohn Wren Kennedy log_fail "Unable to format $disk slice $slicenum to $size" 662d583b39bSJohn Wren Kennedy return 0 663d583b39bSJohn Wren Kennedy} 664d583b39bSJohn Wren Kennedy 665d583b39bSJohn Wren Kennedy# 666d583b39bSJohn Wren Kennedy# Get the end cyl of the given slice 667d583b39bSJohn Wren Kennedy# 668d583b39bSJohn Wren Kennedyfunction get_endslice #<disk> <slice> 669d583b39bSJohn Wren Kennedy{ 670d583b39bSJohn Wren Kennedy typeset disk=$1 671d583b39bSJohn Wren Kennedy typeset slice=$2 672d583b39bSJohn Wren Kennedy if [[ -z $disk || -z $slice ]] ; then 673d583b39bSJohn Wren Kennedy log_fail "The disk name or slice number is unspecified." 674d583b39bSJohn Wren Kennedy fi 675d583b39bSJohn Wren Kennedy 676d583b39bSJohn Wren Kennedy disk=${disk#/dev/dsk/} 677d583b39bSJohn Wren Kennedy disk=${disk#/dev/rdsk/} 678d583b39bSJohn Wren Kennedy disk=${disk%s*} 679d583b39bSJohn Wren Kennedy 680d583b39bSJohn Wren Kennedy typeset -i ratio=0 681d583b39bSJohn Wren Kennedy ratio=$($PRTVTOC /dev/rdsk/${disk}s2 | \ 682d583b39bSJohn Wren Kennedy $GREP "sectors\/cylinder" | \ 683d583b39bSJohn Wren Kennedy $AWK '{print $2}') 684d583b39bSJohn Wren Kennedy 685d583b39bSJohn Wren Kennedy if ((ratio == 0)); then 686d583b39bSJohn Wren Kennedy return 687d583b39bSJohn Wren Kennedy fi 688d583b39bSJohn Wren Kennedy 689d583b39bSJohn Wren Kennedy typeset -i endcyl=$($PRTVTOC -h /dev/rdsk/${disk}s2 | 690d583b39bSJohn Wren Kennedy $NAWK -v token="$slice" '{if ($1==token) print $6}') 691d583b39bSJohn Wren Kennedy 692d583b39bSJohn Wren Kennedy ((endcyl = (endcyl + 1) / ratio)) 693d583b39bSJohn Wren Kennedy echo $endcyl 694d583b39bSJohn Wren Kennedy} 695d583b39bSJohn Wren Kennedy 696d583b39bSJohn Wren Kennedy 697d583b39bSJohn Wren Kennedy# 698d583b39bSJohn Wren Kennedy# Given a size,disk and total slice number, this function formats the 699d583b39bSJohn Wren Kennedy# disk slices from 0 to the total slice number with the same specified 700d583b39bSJohn Wren Kennedy# size. 701d583b39bSJohn Wren Kennedy# 702d583b39bSJohn Wren Kennedyfunction partition_disk #<slice_size> <whole_disk_name> <total_slices> 703d583b39bSJohn Wren Kennedy{ 704d583b39bSJohn Wren Kennedy typeset -i i=0 705d583b39bSJohn Wren Kennedy typeset slice_size=$1 706d583b39bSJohn Wren Kennedy typeset disk_name=$2 707d583b39bSJohn Wren Kennedy typeset total_slices=$3 708d583b39bSJohn Wren Kennedy typeset cyl 709d583b39bSJohn Wren Kennedy 710d583b39bSJohn Wren Kennedy zero_partitions $disk_name 711d583b39bSJohn Wren Kennedy while ((i < $total_slices)); do 712d583b39bSJohn Wren Kennedy if ((i == 2)); then 713d583b39bSJohn Wren Kennedy ((i = i + 1)) 714d583b39bSJohn Wren Kennedy continue 715d583b39bSJohn Wren Kennedy fi 716d583b39bSJohn Wren Kennedy set_partition $i "$cyl" $slice_size $disk_name 717d583b39bSJohn Wren Kennedy cyl=$(get_endslice $disk_name $i) 718d583b39bSJohn Wren Kennedy ((i = i+1)) 719d583b39bSJohn Wren Kennedy done 720d583b39bSJohn Wren Kennedy} 721d583b39bSJohn Wren Kennedy 722d583b39bSJohn Wren Kennedy# 723d583b39bSJohn Wren Kennedy# This function continues to write to a filenum number of files into dirnum 724d583b39bSJohn Wren Kennedy# number of directories until either $FILE_WRITE returns an error or the 725d583b39bSJohn Wren Kennedy# maximum number of files per directory have been written. 726d583b39bSJohn Wren Kennedy# 727d583b39bSJohn Wren Kennedy# Usage: 728d583b39bSJohn Wren Kennedy# fill_fs [destdir] [dirnum] [filenum] [bytes] [num_writes] [data] 729d583b39bSJohn Wren Kennedy# 730d583b39bSJohn Wren Kennedy# Return value: 0 on success 731d583b39bSJohn Wren Kennedy# non 0 on error 732d583b39bSJohn Wren Kennedy# 733d583b39bSJohn Wren Kennedy# Where : 734d583b39bSJohn Wren Kennedy# destdir: is the directory where everything is to be created under 735d583b39bSJohn Wren Kennedy# dirnum: the maximum number of subdirectories to use, -1 no limit 736d583b39bSJohn Wren Kennedy# filenum: the maximum number of files per subdirectory 737d583b39bSJohn Wren Kennedy# bytes: number of bytes to write 738d583b39bSJohn Wren Kennedy# num_writes: numer of types to write out bytes 739d583b39bSJohn Wren Kennedy# data: the data that will be writen 740d583b39bSJohn Wren Kennedy# 741d583b39bSJohn Wren Kennedy# E.g. 742d583b39bSJohn Wren Kennedy# file_fs /testdir 20 25 1024 256 0 743d583b39bSJohn Wren Kennedy# 744d583b39bSJohn Wren Kennedy# Note: bytes * num_writes equals the size of the testfile 745d583b39bSJohn Wren Kennedy# 746d583b39bSJohn Wren Kennedyfunction fill_fs # destdir dirnum filenum bytes num_writes data 747d583b39bSJohn Wren Kennedy{ 748d583b39bSJohn Wren Kennedy typeset destdir=${1:-$TESTDIR} 749d583b39bSJohn Wren Kennedy typeset -i dirnum=${2:-50} 750d583b39bSJohn Wren Kennedy typeset -i filenum=${3:-50} 751d583b39bSJohn Wren Kennedy typeset -i bytes=${4:-8192} 752d583b39bSJohn Wren Kennedy typeset -i num_writes=${5:-10240} 753d583b39bSJohn Wren Kennedy typeset -i data=${6:-0} 754d583b39bSJohn Wren Kennedy 755d583b39bSJohn Wren Kennedy typeset -i odirnum=1 756d583b39bSJohn Wren Kennedy typeset -i idirnum=0 757d583b39bSJohn Wren Kennedy typeset -i fn=0 758d583b39bSJohn Wren Kennedy typeset -i retval=0 759d583b39bSJohn Wren Kennedy 760d583b39bSJohn Wren Kennedy log_must $MKDIR -p $destdir/$idirnum 761d583b39bSJohn Wren Kennedy while (($odirnum > 0)); do 762d583b39bSJohn Wren Kennedy if ((dirnum >= 0 && idirnum >= dirnum)); then 763d583b39bSJohn Wren Kennedy odirnum=0 764d583b39bSJohn Wren Kennedy break 765d583b39bSJohn Wren Kennedy fi 766d583b39bSJohn Wren Kennedy $FILE_WRITE -o create -f $destdir/$idirnum/$TESTFILE.$fn \ 767d583b39bSJohn Wren Kennedy -b $bytes -c $num_writes -d $data 768d583b39bSJohn Wren Kennedy retval=$? 769d583b39bSJohn Wren Kennedy if (($retval != 0)); then 770d583b39bSJohn Wren Kennedy odirnum=0 771d583b39bSJohn Wren Kennedy break 772d583b39bSJohn Wren Kennedy fi 773d583b39bSJohn Wren Kennedy if (($fn >= $filenum)); then 774d583b39bSJohn Wren Kennedy fn=0 775d583b39bSJohn Wren Kennedy ((idirnum = idirnum + 1)) 776d583b39bSJohn Wren Kennedy log_must $MKDIR -p $destdir/$idirnum 777d583b39bSJohn Wren Kennedy else 778d583b39bSJohn Wren Kennedy ((fn = fn + 1)) 779d583b39bSJohn Wren Kennedy fi 780d583b39bSJohn Wren Kennedy done 781d583b39bSJohn Wren Kennedy return $retval 782d583b39bSJohn Wren Kennedy} 783d583b39bSJohn Wren Kennedy 784d583b39bSJohn Wren Kennedy# 785d583b39bSJohn Wren Kennedy# Simple function to get the specified property. If unable to 786d583b39bSJohn Wren Kennedy# get the property then exits. 787d583b39bSJohn Wren Kennedy# 788d583b39bSJohn Wren Kennedy# Note property is in 'parsable' format (-p) 789d583b39bSJohn Wren Kennedy# 790d583b39bSJohn Wren Kennedyfunction get_prop # property dataset 791d583b39bSJohn Wren Kennedy{ 792d583b39bSJohn Wren Kennedy typeset prop_val 793d583b39bSJohn Wren Kennedy typeset prop=$1 794d583b39bSJohn Wren Kennedy typeset dataset=$2 795d583b39bSJohn Wren Kennedy 796d583b39bSJohn Wren Kennedy prop_val=$($ZFS get -pH -o value $prop $dataset 2>/dev/null) 797d583b39bSJohn Wren Kennedy if [[ $? -ne 0 ]]; then 798d583b39bSJohn Wren Kennedy log_note "Unable to get $prop property for dataset " \ 799d583b39bSJohn Wren Kennedy "$dataset" 800d583b39bSJohn Wren Kennedy return 1 801d583b39bSJohn Wren Kennedy fi 802d583b39bSJohn Wren Kennedy 803d583b39bSJohn Wren Kennedy $ECHO $prop_val 804d583b39bSJohn Wren Kennedy return 0 805d583b39bSJohn Wren Kennedy} 806d583b39bSJohn Wren Kennedy 807d583b39bSJohn Wren Kennedy# 808d583b39bSJohn Wren Kennedy# Simple function to get the specified property of pool. If unable to 809d583b39bSJohn Wren Kennedy# get the property then exits. 810d583b39bSJohn Wren Kennedy# 811d583b39bSJohn Wren Kennedyfunction get_pool_prop # property pool 812d583b39bSJohn Wren Kennedy{ 813d583b39bSJohn Wren Kennedy typeset prop_val 814d583b39bSJohn Wren Kennedy typeset prop=$1 815d583b39bSJohn Wren Kennedy typeset pool=$2 816d583b39bSJohn Wren Kennedy 817d583b39bSJohn Wren Kennedy if poolexists $pool ; then 818d583b39bSJohn Wren Kennedy prop_val=$($ZPOOL get $prop $pool 2>/dev/null | $TAIL -1 | \ 819d583b39bSJohn Wren Kennedy $AWK '{print $3}') 820d583b39bSJohn Wren Kennedy if [[ $? -ne 0 ]]; then 821d583b39bSJohn Wren Kennedy log_note "Unable to get $prop property for pool " \ 822d583b39bSJohn Wren Kennedy "$pool" 823d583b39bSJohn Wren Kennedy return 1 824d583b39bSJohn Wren Kennedy fi 825d583b39bSJohn Wren Kennedy else 826d583b39bSJohn Wren Kennedy log_note "Pool $pool not exists." 827d583b39bSJohn Wren Kennedy return 1 828d583b39bSJohn Wren Kennedy fi 829d583b39bSJohn Wren Kennedy 830d583b39bSJohn Wren Kennedy $ECHO $prop_val 831d583b39bSJohn Wren Kennedy return 0 832d583b39bSJohn Wren Kennedy} 833d583b39bSJohn Wren Kennedy 834d583b39bSJohn Wren Kennedy# Return 0 if a pool exists; $? otherwise 835d583b39bSJohn Wren Kennedy# 836d583b39bSJohn Wren Kennedy# $1 - pool name 837d583b39bSJohn Wren Kennedy 838d583b39bSJohn Wren Kennedyfunction poolexists 839d583b39bSJohn Wren Kennedy{ 840d583b39bSJohn Wren Kennedy typeset pool=$1 841d583b39bSJohn Wren Kennedy 842d583b39bSJohn Wren Kennedy if [[ -z $pool ]]; then 843d583b39bSJohn Wren Kennedy log_note "No pool name given." 844d583b39bSJohn Wren Kennedy return 1 845d583b39bSJohn Wren Kennedy fi 846d583b39bSJohn Wren Kennedy 847d583b39bSJohn Wren Kennedy $ZPOOL get name "$pool" > /dev/null 2>&1 848d583b39bSJohn Wren Kennedy return $? 849d583b39bSJohn Wren Kennedy} 850d583b39bSJohn Wren Kennedy 851d583b39bSJohn Wren Kennedy# Return 0 if all the specified datasets exist; $? otherwise 852d583b39bSJohn Wren Kennedy# 853d583b39bSJohn Wren Kennedy# $1-n dataset name 854d583b39bSJohn Wren Kennedyfunction datasetexists 855d583b39bSJohn Wren Kennedy{ 856d583b39bSJohn Wren Kennedy if (($# == 0)); then 857d583b39bSJohn Wren Kennedy log_note "No dataset name given." 858d583b39bSJohn Wren Kennedy return 1 859d583b39bSJohn Wren Kennedy fi 860d583b39bSJohn Wren Kennedy 861d583b39bSJohn Wren Kennedy while (($# > 0)); do 862d583b39bSJohn Wren Kennedy $ZFS get name $1 > /dev/null 2>&1 || \ 863d583b39bSJohn Wren Kennedy return $? 864d583b39bSJohn Wren Kennedy shift 865d583b39bSJohn Wren Kennedy done 866d583b39bSJohn Wren Kennedy 867d583b39bSJohn Wren Kennedy return 0 868d583b39bSJohn Wren Kennedy} 869d583b39bSJohn Wren Kennedy 870d583b39bSJohn Wren Kennedy# return 0 if none of the specified datasets exists, otherwise return 1. 871d583b39bSJohn Wren Kennedy# 872d583b39bSJohn Wren Kennedy# $1-n dataset name 873d583b39bSJohn Wren Kennedyfunction datasetnonexists 874d583b39bSJohn Wren Kennedy{ 875d583b39bSJohn Wren Kennedy if (($# == 0)); then 876d583b39bSJohn Wren Kennedy log_note "No dataset name given." 877d583b39bSJohn Wren Kennedy return 1 878d583b39bSJohn Wren Kennedy fi 879d583b39bSJohn Wren Kennedy 880d583b39bSJohn Wren Kennedy while (($# > 0)); do 881d583b39bSJohn Wren Kennedy $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 \ 882d583b39bSJohn Wren Kennedy && return 1 883d583b39bSJohn Wren Kennedy shift 884d583b39bSJohn Wren Kennedy done 885d583b39bSJohn Wren Kennedy 886d583b39bSJohn Wren Kennedy return 0 887d583b39bSJohn Wren Kennedy} 888d583b39bSJohn Wren Kennedy 889d583b39bSJohn Wren Kennedy# 890d583b39bSJohn Wren Kennedy# Given a mountpoint, or a dataset name, determine if it is shared. 891d583b39bSJohn Wren Kennedy# 892d583b39bSJohn Wren Kennedy# Returns 0 if shared, 1 otherwise. 893d583b39bSJohn Wren Kennedy# 894d583b39bSJohn Wren Kennedyfunction is_shared 895d583b39bSJohn Wren Kennedy{ 896d583b39bSJohn Wren Kennedy typeset fs=$1 897d583b39bSJohn Wren Kennedy typeset mtpt 898d583b39bSJohn Wren Kennedy 899d583b39bSJohn Wren Kennedy if [[ $fs != "/"* ]] ; then 900d583b39bSJohn Wren Kennedy if datasetnonexists "$fs" ; then 901d583b39bSJohn Wren Kennedy return 1 902d583b39bSJohn Wren Kennedy else 903d583b39bSJohn Wren Kennedy mtpt=$(get_prop mountpoint "$fs") 904d583b39bSJohn Wren Kennedy case $mtpt in 905d583b39bSJohn Wren Kennedy none|legacy|-) return 1 906d583b39bSJohn Wren Kennedy ;; 907d583b39bSJohn Wren Kennedy *) fs=$mtpt 908d583b39bSJohn Wren Kennedy ;; 909d583b39bSJohn Wren Kennedy esac 910d583b39bSJohn Wren Kennedy fi 911d583b39bSJohn Wren Kennedy fi 912d583b39bSJohn Wren Kennedy 913d583b39bSJohn Wren Kennedy for mtpt in `$SHARE | $AWK '{print $2}'` ; do 914d583b39bSJohn Wren Kennedy if [[ $mtpt == $fs ]] ; then 915d583b39bSJohn Wren Kennedy return 0 916d583b39bSJohn Wren Kennedy fi 917d583b39bSJohn Wren Kennedy done 918d583b39bSJohn Wren Kennedy 919d583b39bSJohn Wren Kennedy typeset stat=$($SVCS -H -o STA nfs/server:default) 920d583b39bSJohn Wren Kennedy if [[ $stat != "ON" ]]; then 921d583b39bSJohn Wren Kennedy log_note "Current nfs/server status: $stat" 922d583b39bSJohn Wren Kennedy fi 923d583b39bSJohn Wren Kennedy 924d583b39bSJohn Wren Kennedy return 1 925d583b39bSJohn Wren Kennedy} 926d583b39bSJohn Wren Kennedy 927d583b39bSJohn Wren Kennedy# 928d583b39bSJohn Wren Kennedy# Given a mountpoint, determine if it is not shared. 929d583b39bSJohn Wren Kennedy# 930d583b39bSJohn Wren Kennedy# Returns 0 if not shared, 1 otherwise. 931d583b39bSJohn Wren Kennedy# 932d583b39bSJohn Wren Kennedyfunction not_shared 933d583b39bSJohn Wren Kennedy{ 934d583b39bSJohn Wren Kennedy typeset fs=$1 935d583b39bSJohn Wren Kennedy 936d583b39bSJohn Wren Kennedy is_shared $fs 937d583b39bSJohn Wren Kennedy if (($? == 0)); then 938d583b39bSJohn Wren Kennedy return 1 939d583b39bSJohn Wren Kennedy fi 940d583b39bSJohn Wren Kennedy 941d583b39bSJohn Wren Kennedy return 0 942d583b39bSJohn Wren Kennedy} 943d583b39bSJohn Wren Kennedy 944d583b39bSJohn Wren Kennedy# 945d583b39bSJohn Wren Kennedy# Helper function to unshare a mountpoint. 946d583b39bSJohn Wren Kennedy# 947d583b39bSJohn Wren Kennedyfunction unshare_fs #fs 948d583b39bSJohn Wren Kennedy{ 949d583b39bSJohn Wren Kennedy typeset fs=$1 950d583b39bSJohn Wren Kennedy 951d583b39bSJohn Wren Kennedy is_shared $fs 952d583b39bSJohn Wren Kennedy if (($? == 0)); then 953d583b39bSJohn Wren Kennedy log_must $ZFS unshare $fs 954d583b39bSJohn Wren Kennedy fi 955d583b39bSJohn Wren Kennedy 956d583b39bSJohn Wren Kennedy return 0 957d583b39bSJohn Wren Kennedy} 958d583b39bSJohn Wren Kennedy 959d583b39bSJohn Wren Kennedy# 960d583b39bSJohn Wren Kennedy# Check NFS server status and trigger it online. 961d583b39bSJohn Wren Kennedy# 962d583b39bSJohn Wren Kennedyfunction setup_nfs_server 963d583b39bSJohn Wren Kennedy{ 964d583b39bSJohn Wren Kennedy # Cannot share directory in non-global zone. 965d583b39bSJohn Wren Kennedy # 966d583b39bSJohn Wren Kennedy if ! is_global_zone; then 967d583b39bSJohn Wren Kennedy log_note "Cannot trigger NFS server by sharing in LZ." 968d583b39bSJohn Wren Kennedy return 969d583b39bSJohn Wren Kennedy fi 970d583b39bSJohn Wren Kennedy 971d583b39bSJohn Wren Kennedy typeset nfs_fmri="svc:/network/nfs/server:default" 972d583b39bSJohn Wren Kennedy if [[ $($SVCS -Ho STA $nfs_fmri) != "ON" ]]; then 973d583b39bSJohn Wren Kennedy # 974d583b39bSJohn Wren Kennedy # Only really sharing operation can enable NFS server 975d583b39bSJohn Wren Kennedy # to online permanently. 976d583b39bSJohn Wren Kennedy # 977d583b39bSJohn Wren Kennedy typeset dummy=/tmp/dummy 978d583b39bSJohn Wren Kennedy 979d583b39bSJohn Wren Kennedy if [[ -d $dummy ]]; then 980d583b39bSJohn Wren Kennedy log_must $RM -rf $dummy 981d583b39bSJohn Wren Kennedy fi 982d583b39bSJohn Wren Kennedy 983d583b39bSJohn Wren Kennedy log_must $MKDIR $dummy 984d583b39bSJohn Wren Kennedy log_must $SHARE $dummy 985d583b39bSJohn Wren Kennedy 986d583b39bSJohn Wren Kennedy # 987d583b39bSJohn Wren Kennedy # Waiting for fmri's status to be the final status. 988d583b39bSJohn Wren Kennedy # Otherwise, in transition, an asterisk (*) is appended for 989d583b39bSJohn Wren Kennedy # instances, unshare will reverse status to 'DIS' again. 990d583b39bSJohn Wren Kennedy # 991d583b39bSJohn Wren Kennedy # Waiting for 1's at least. 992d583b39bSJohn Wren Kennedy # 993d583b39bSJohn Wren Kennedy log_must $SLEEP 1 994d583b39bSJohn Wren Kennedy timeout=10 995d583b39bSJohn Wren Kennedy while [[ timeout -ne 0 && $($SVCS -Ho STA $nfs_fmri) == *'*' ]] 996d583b39bSJohn Wren Kennedy do 997d583b39bSJohn Wren Kennedy log_must $SLEEP 1 998d583b39bSJohn Wren Kennedy 999d583b39bSJohn Wren Kennedy ((timeout -= 1)) 1000d583b39bSJohn Wren Kennedy done 1001d583b39bSJohn Wren Kennedy 1002d583b39bSJohn Wren Kennedy log_must $UNSHARE $dummy 1003d583b39bSJohn Wren Kennedy log_must $RM -rf $dummy 1004d583b39bSJohn Wren Kennedy fi 1005d583b39bSJohn Wren Kennedy 1006d583b39bSJohn Wren Kennedy log_note "Current NFS status: '$($SVCS -Ho STA,FMRI $nfs_fmri)'" 1007d583b39bSJohn Wren Kennedy} 1008d583b39bSJohn Wren Kennedy 1009d583b39bSJohn Wren Kennedy# 1010d583b39bSJohn Wren Kennedy# To verify whether calling process is in global zone 1011d583b39bSJohn Wren Kennedy# 1012d583b39bSJohn Wren Kennedy# Return 0 if in global zone, 1 in non-global zone 1013d583b39bSJohn Wren Kennedy# 1014d583b39bSJohn Wren Kennedyfunction is_global_zone 1015d583b39bSJohn Wren Kennedy{ 1016d583b39bSJohn Wren Kennedy typeset cur_zone=$($ZONENAME 2>/dev/null) 1017d583b39bSJohn Wren Kennedy if [[ $cur_zone != "global" ]]; then 1018d583b39bSJohn Wren Kennedy return 1 1019d583b39bSJohn Wren Kennedy fi 1020d583b39bSJohn Wren Kennedy return 0 1021d583b39bSJohn Wren Kennedy} 1022d583b39bSJohn Wren Kennedy 1023d583b39bSJohn Wren Kennedy# 1024d583b39bSJohn Wren Kennedy# Verify whether test is permitted to run from 1025d583b39bSJohn Wren Kennedy# global zone, local zone, or both 1026d583b39bSJohn Wren Kennedy# 1027d583b39bSJohn Wren Kennedy# $1 zone limit, could be "global", "local", or "both"(no limit) 1028d583b39bSJohn Wren Kennedy# 1029d583b39bSJohn Wren Kennedy# Return 0 if permitted, otherwise exit with log_unsupported 1030d583b39bSJohn Wren Kennedy# 1031d583b39bSJohn Wren Kennedyfunction verify_runnable # zone limit 1032d583b39bSJohn Wren Kennedy{ 1033d583b39bSJohn Wren Kennedy typeset limit=$1 1034d583b39bSJohn Wren Kennedy 1035d583b39bSJohn Wren Kennedy [[ -z $limit ]] && return 0 1036d583b39bSJohn Wren Kennedy 1037d583b39bSJohn Wren Kennedy if is_global_zone ; then 1038d583b39bSJohn Wren Kennedy case $limit in 1039d583b39bSJohn Wren Kennedy global|both) 1040d583b39bSJohn Wren Kennedy ;; 1041d583b39bSJohn Wren Kennedy local) log_unsupported "Test is unable to run from "\ 1042d583b39bSJohn Wren Kennedy "global zone." 1043d583b39bSJohn Wren Kennedy ;; 1044d583b39bSJohn Wren Kennedy *) log_note "Warning: unknown limit $limit - " \ 1045d583b39bSJohn Wren Kennedy "use both." 1046d583b39bSJohn Wren Kennedy ;; 1047d583b39bSJohn Wren Kennedy esac 1048d583b39bSJohn Wren Kennedy else 1049d583b39bSJohn Wren Kennedy case $limit in 1050d583b39bSJohn Wren Kennedy local|both) 1051d583b39bSJohn Wren Kennedy ;; 1052d583b39bSJohn Wren Kennedy global) log_unsupported "Test is unable to run from "\ 1053d583b39bSJohn Wren Kennedy "local zone." 1054d583b39bSJohn Wren Kennedy ;; 1055d583b39bSJohn Wren Kennedy *) log_note "Warning: unknown limit $limit - " \ 1056d583b39bSJohn Wren Kennedy "use both." 1057d583b39bSJohn Wren Kennedy ;; 1058d583b39bSJohn Wren Kennedy esac 1059d583b39bSJohn Wren Kennedy 1060d583b39bSJohn Wren Kennedy reexport_pool 1061d583b39bSJohn Wren Kennedy fi 1062d583b39bSJohn Wren Kennedy 1063d583b39bSJohn Wren Kennedy return 0 1064d583b39bSJohn Wren Kennedy} 1065d583b39bSJohn Wren Kennedy 1066d583b39bSJohn Wren Kennedy# Return 0 if create successfully or the pool exists; $? otherwise 1067d583b39bSJohn Wren Kennedy# Note: In local zones, this function should return 0 silently. 1068d583b39bSJohn Wren Kennedy# 1069d583b39bSJohn Wren Kennedy# $1 - pool name 1070d583b39bSJohn Wren Kennedy# $2-n - [keyword] devs_list 1071d583b39bSJohn Wren Kennedy 1072d583b39bSJohn Wren Kennedyfunction create_pool #pool devs_list 1073d583b39bSJohn Wren Kennedy{ 1074d583b39bSJohn Wren Kennedy typeset pool=${1%%/*} 1075d583b39bSJohn Wren Kennedy 1076d583b39bSJohn Wren Kennedy shift 1077d583b39bSJohn Wren Kennedy 1078d583b39bSJohn Wren Kennedy if [[ -z $pool ]]; then 1079d583b39bSJohn Wren Kennedy log_note "Missing pool name." 1080d583b39bSJohn Wren Kennedy return 1 1081d583b39bSJohn Wren Kennedy fi 1082d583b39bSJohn Wren Kennedy 1083d583b39bSJohn Wren Kennedy if poolexists $pool ; then 1084d583b39bSJohn Wren Kennedy destroy_pool $pool 1085d583b39bSJohn Wren Kennedy fi 1086d583b39bSJohn Wren Kennedy 1087d583b39bSJohn Wren Kennedy if is_global_zone ; then 1088d583b39bSJohn Wren Kennedy [[ -d /$pool ]] && $RM -rf /$pool 1089d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $pool $@ 1090d583b39bSJohn Wren Kennedy fi 1091d583b39bSJohn Wren Kennedy 1092d583b39bSJohn Wren Kennedy return 0 1093d583b39bSJohn Wren Kennedy} 1094d583b39bSJohn Wren Kennedy 1095d583b39bSJohn Wren Kennedy# Return 0 if destroy successfully or the pool exists; $? otherwise 1096d583b39bSJohn Wren Kennedy# Note: In local zones, this function should return 0 silently. 1097d583b39bSJohn Wren Kennedy# 1098d583b39bSJohn Wren Kennedy# $1 - pool name 1099d583b39bSJohn Wren Kennedy# Destroy pool with the given parameters. 1100d583b39bSJohn Wren Kennedy 1101d583b39bSJohn Wren Kennedyfunction destroy_pool #pool 1102d583b39bSJohn Wren Kennedy{ 1103d583b39bSJohn Wren Kennedy typeset pool=${1%%/*} 1104d583b39bSJohn Wren Kennedy typeset mtpt 1105d583b39bSJohn Wren Kennedy 1106d583b39bSJohn Wren Kennedy if [[ -z $pool ]]; then 1107d583b39bSJohn Wren Kennedy log_note "No pool name given." 1108d583b39bSJohn Wren Kennedy return 1 1109d583b39bSJohn Wren Kennedy fi 1110d583b39bSJohn Wren Kennedy 1111d583b39bSJohn Wren Kennedy if is_global_zone ; then 1112d583b39bSJohn Wren Kennedy if poolexists "$pool" ; then 1113d583b39bSJohn Wren Kennedy mtpt=$(get_prop mountpoint "$pool") 1114d583b39bSJohn Wren Kennedy log_must $ZPOOL destroy -f $pool 1115d583b39bSJohn Wren Kennedy 1116d583b39bSJohn Wren Kennedy [[ -d $mtpt ]] && \ 1117d583b39bSJohn Wren Kennedy log_must $RM -rf $mtpt 1118d583b39bSJohn Wren Kennedy else 1119d583b39bSJohn Wren Kennedy log_note "Pool not exist. ($pool)" 1120d583b39bSJohn Wren Kennedy return 1 1121d583b39bSJohn Wren Kennedy fi 1122d583b39bSJohn Wren Kennedy fi 1123d583b39bSJohn Wren Kennedy 1124d583b39bSJohn Wren Kennedy return 0 1125d583b39bSJohn Wren Kennedy} 1126d583b39bSJohn Wren Kennedy 1127d583b39bSJohn Wren Kennedy# 1128d583b39bSJohn Wren Kennedy# Firstly, create a pool with 5 datasets. Then, create a single zone and 1129d583b39bSJohn Wren Kennedy# export the 5 datasets to it. In addition, we also add a ZFS filesystem 1130d583b39bSJohn Wren Kennedy# and a zvol device to the zone. 1131d583b39bSJohn Wren Kennedy# 1132d583b39bSJohn Wren Kennedy# $1 zone name 1133d583b39bSJohn Wren Kennedy# $2 zone root directory prefix 1134d583b39bSJohn Wren Kennedy# $3 zone ip 1135d583b39bSJohn Wren Kennedy# 1136d583b39bSJohn Wren Kennedyfunction zfs_zones_setup #zone_name zone_root zone_ip 1137d583b39bSJohn Wren Kennedy{ 1138d583b39bSJohn Wren Kennedy typeset zone_name=${1:-$(hostname)-z} 1139d583b39bSJohn Wren Kennedy typeset zone_root=${2:-"/zone_root"} 1140d583b39bSJohn Wren Kennedy typeset zone_ip=${3:-"10.1.1.10"} 1141d583b39bSJohn Wren Kennedy typeset prefix_ctr=$ZONE_CTR 1142d583b39bSJohn Wren Kennedy typeset pool_name=$ZONE_POOL 1143d583b39bSJohn Wren Kennedy typeset -i cntctr=5 1144d583b39bSJohn Wren Kennedy typeset -i i=0 1145d583b39bSJohn Wren Kennedy 1146d583b39bSJohn Wren Kennedy # Create pool and 5 container within it 1147d583b39bSJohn Wren Kennedy # 1148d583b39bSJohn Wren Kennedy [[ -d /$pool_name ]] && $RM -rf /$pool_name 1149d583b39bSJohn Wren Kennedy log_must $ZPOOL create -f $pool_name $DISKS 1150d583b39bSJohn Wren Kennedy while ((i < cntctr)); do 1151d583b39bSJohn Wren Kennedy log_must $ZFS create $pool_name/$prefix_ctr$i 1152d583b39bSJohn Wren Kennedy ((i += 1)) 1153d583b39bSJohn Wren Kennedy done 1154d583b39bSJohn Wren Kennedy 1155d583b39bSJohn Wren Kennedy # create a zvol 1156d583b39bSJohn Wren Kennedy log_must $ZFS create -V 1g $pool_name/zone_zvol 1157d583b39bSJohn Wren Kennedy 1158d583b39bSJohn Wren Kennedy # 1159d583b39bSJohn Wren Kennedy # If current system support slog, add slog device for pool 1160d583b39bSJohn Wren Kennedy # 1161d583b39bSJohn Wren Kennedy if verify_slog_support ; then 1162d583b39bSJohn Wren Kennedy typeset sdevs="/var/tmp/sdev1 /var/tmp/sdev2" 1163d583b39bSJohn Wren Kennedy log_must $MKFILE 100M $sdevs 1164d583b39bSJohn Wren Kennedy log_must $ZPOOL add $pool_name log mirror $sdevs 1165d583b39bSJohn Wren Kennedy fi 1166d583b39bSJohn Wren Kennedy 1167d583b39bSJohn Wren Kennedy # this isn't supported just yet. 1168d583b39bSJohn Wren Kennedy # Create a filesystem. In order to add this to 1169d583b39bSJohn Wren Kennedy # the zone, it must have it's mountpoint set to 'legacy' 1170d583b39bSJohn Wren Kennedy # log_must $ZFS create $pool_name/zfs_filesystem 1171d583b39bSJohn Wren Kennedy # log_must $ZFS set mountpoint=legacy $pool_name/zfs_filesystem 1172d583b39bSJohn Wren Kennedy 1173d583b39bSJohn Wren Kennedy [[ -d $zone_root ]] && \ 1174d583b39bSJohn Wren Kennedy log_must $RM -rf $zone_root/$zone_name 1175d583b39bSJohn Wren Kennedy [[ ! -d $zone_root ]] && \ 1176d583b39bSJohn Wren Kennedy log_must $MKDIR -p -m 0700 $zone_root/$zone_name 1177d583b39bSJohn Wren Kennedy 1178d583b39bSJohn Wren Kennedy # Create zone configure file and configure the zone 1179d583b39bSJohn Wren Kennedy # 1180d583b39bSJohn Wren Kennedy typeset zone_conf=/tmp/zone_conf.$$ 1181d583b39bSJohn Wren Kennedy $ECHO "create" > $zone_conf 1182d583b39bSJohn Wren Kennedy $ECHO "set zonepath=$zone_root/$zone_name" >> $zone_conf 1183d583b39bSJohn Wren Kennedy $ECHO "set autoboot=true" >> $zone_conf 1184d583b39bSJohn Wren Kennedy i=0 1185d583b39bSJohn Wren Kennedy while ((i < cntctr)); do 1186d583b39bSJohn Wren Kennedy $ECHO "add dataset" >> $zone_conf 1187d583b39bSJohn Wren Kennedy $ECHO "set name=$pool_name/$prefix_ctr$i" >> \ 1188d583b39bSJohn Wren Kennedy $zone_conf 1189d583b39bSJohn Wren Kennedy $ECHO "end" >> $zone_conf 1190d583b39bSJohn Wren Kennedy ((i += 1)) 1191d583b39bSJohn Wren Kennedy done 1192d583b39bSJohn Wren Kennedy 1193d583b39bSJohn Wren Kennedy # add our zvol to the zone 1194d583b39bSJohn Wren Kennedy $ECHO "add device" >> $zone_conf 1195d583b39bSJohn Wren Kennedy $ECHO "set match=/dev/zvol/dsk/$pool_name/zone_zvol" >> $zone_conf 1196d583b39bSJohn Wren Kennedy $ECHO "end" >> $zone_conf 1197d583b39bSJohn Wren Kennedy 1198d583b39bSJohn Wren Kennedy # add a corresponding zvol rdsk to the zone 1199d583b39bSJohn Wren Kennedy $ECHO "add device" >> $zone_conf 1200d583b39bSJohn Wren Kennedy $ECHO "set match=/dev/zvol/rdsk/$pool_name/zone_zvol" >> $zone_conf 1201d583b39bSJohn Wren Kennedy $ECHO "end" >> $zone_conf 1202d583b39bSJohn Wren Kennedy 1203d583b39bSJohn Wren Kennedy # once it's supported, we'll add our filesystem to the zone 1204d583b39bSJohn Wren Kennedy # $ECHO "add fs" >> $zone_conf 1205d583b39bSJohn Wren Kennedy # $ECHO "set type=zfs" >> $zone_conf 1206d583b39bSJohn Wren Kennedy # $ECHO "set special=$pool_name/zfs_filesystem" >> $zone_conf 1207d583b39bSJohn Wren Kennedy # $ECHO "set dir=/export/zfs_filesystem" >> $zone_conf 1208d583b39bSJohn Wren Kennedy # $ECHO "end" >> $zone_conf 1209d583b39bSJohn Wren Kennedy 1210d583b39bSJohn Wren Kennedy $ECHO "verify" >> $zone_conf 1211d583b39bSJohn Wren Kennedy $ECHO "commit" >> $zone_conf 1212d583b39bSJohn Wren Kennedy log_must $ZONECFG -z $zone_name -f $zone_conf 1213d583b39bSJohn Wren Kennedy log_must $RM -f $zone_conf 1214d583b39bSJohn Wren Kennedy 1215d583b39bSJohn Wren Kennedy # Install the zone 1216d583b39bSJohn Wren Kennedy $ZONEADM -z $zone_name install 1217d583b39bSJohn Wren Kennedy if (($? == 0)); then 1218d583b39bSJohn Wren Kennedy log_note "SUCCESS: $ZONEADM -z $zone_name install" 1219d583b39bSJohn Wren Kennedy else 1220d583b39bSJohn Wren Kennedy log_fail "FAIL: $ZONEADM -z $zone_name install" 1221d583b39bSJohn Wren Kennedy fi 1222d583b39bSJohn Wren Kennedy 1223d583b39bSJohn Wren Kennedy # Install sysidcfg file 1224d583b39bSJohn Wren Kennedy # 1225d583b39bSJohn Wren Kennedy typeset sysidcfg=$zone_root/$zone_name/root/etc/sysidcfg 1226d583b39bSJohn Wren Kennedy $ECHO "system_locale=C" > $sysidcfg 1227d583b39bSJohn Wren Kennedy $ECHO "terminal=dtterm" >> $sysidcfg 1228d583b39bSJohn Wren Kennedy $ECHO "network_interface=primary {" >> $sysidcfg 1229d583b39bSJohn Wren Kennedy $ECHO "hostname=$zone_name" >> $sysidcfg 1230d583b39bSJohn Wren Kennedy $ECHO "}" >> $sysidcfg 1231d583b39bSJohn Wren Kennedy $ECHO "name_service=NONE" >> $sysidcfg 1232d583b39bSJohn Wren Kennedy $ECHO "root_password=mo791xfZ/SFiw" >> $sysidcfg 1233d583b39bSJohn Wren Kennedy $ECHO "security_policy=NONE" >> $sysidcfg 1234d583b39bSJohn Wren Kennedy $ECHO "timezone=US/Eastern" >> $sysidcfg 1235d583b39bSJohn Wren Kennedy 1236d583b39bSJohn Wren Kennedy # Boot this zone 1237d583b39bSJohn Wren Kennedy log_must $ZONEADM -z $zone_name boot 1238d583b39bSJohn Wren Kennedy} 1239d583b39bSJohn Wren Kennedy 1240d583b39bSJohn Wren Kennedy# 1241d583b39bSJohn Wren Kennedy# Reexport TESTPOOL & TESTPOOL(1-4) 1242d583b39bSJohn Wren Kennedy# 1243d583b39bSJohn Wren Kennedyfunction reexport_pool 1244d583b39bSJohn Wren Kennedy{ 1245d583b39bSJohn Wren Kennedy typeset -i cntctr=5 1246d583b39bSJohn Wren Kennedy typeset -i i=0 1247d583b39bSJohn Wren Kennedy 1248d583b39bSJohn Wren Kennedy while ((i < cntctr)); do 1249d583b39bSJohn Wren Kennedy if ((i == 0)); then 1250d583b39bSJohn Wren Kennedy TESTPOOL=$ZONE_POOL/$ZONE_CTR$i 1251d583b39bSJohn Wren Kennedy if ! ismounted $TESTPOOL; then 1252d583b39bSJohn Wren Kennedy log_must $ZFS mount $TESTPOOL 1253d583b39bSJohn Wren Kennedy fi 1254d583b39bSJohn Wren Kennedy else 1255d583b39bSJohn Wren Kennedy eval TESTPOOL$i=$ZONE_POOL/$ZONE_CTR$i 1256d583b39bSJohn Wren Kennedy if eval ! ismounted \$TESTPOOL$i; then 1257d583b39bSJohn Wren Kennedy log_must eval $ZFS mount \$TESTPOOL$i 1258d583b39bSJohn Wren Kennedy fi 1259d583b39bSJohn Wren Kennedy fi 1260d583b39bSJohn Wren Kennedy ((i += 1)) 1261d583b39bSJohn Wren Kennedy done 1262d583b39bSJohn Wren Kennedy} 1263d583b39bSJohn Wren Kennedy 1264d583b39bSJohn Wren Kennedy# 1265d583b39bSJohn Wren Kennedy# Verify a given disk is online or offline 1266d583b39bSJohn Wren Kennedy# 1267d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise 1268d583b39bSJohn Wren Kennedy# 1269d583b39bSJohn Wren Kennedyfunction check_state # pool disk state{online,offline} 1270d583b39bSJohn Wren Kennedy{ 1271d583b39bSJohn Wren Kennedy typeset pool=$1 1272d583b39bSJohn Wren Kennedy typeset disk=${2#/dev/dsk/} 1273d583b39bSJohn Wren Kennedy typeset state=$3 1274d583b39bSJohn Wren Kennedy 1275d583b39bSJohn Wren Kennedy $ZPOOL status -v $pool | grep "$disk" \ 1276d583b39bSJohn Wren Kennedy | grep -i "$state" > /dev/null 2>&1 1277d583b39bSJohn Wren Kennedy 1278d583b39bSJohn Wren Kennedy return $? 1279d583b39bSJohn Wren Kennedy} 1280d583b39bSJohn Wren Kennedy 1281d583b39bSJohn Wren Kennedy# 1282d583b39bSJohn Wren Kennedy# Get the mountpoint of snapshot 1283d583b39bSJohn Wren Kennedy# For the snapshot use <mp_filesystem>/.zfs/snapshot/<snap> 1284d583b39bSJohn Wren Kennedy# as its mountpoint 1285d583b39bSJohn Wren Kennedy# 1286d583b39bSJohn Wren Kennedyfunction snapshot_mountpoint 1287d583b39bSJohn Wren Kennedy{ 1288d583b39bSJohn Wren Kennedy typeset dataset=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} 1289d583b39bSJohn Wren Kennedy 1290d583b39bSJohn Wren Kennedy if [[ $dataset != *@* ]]; then 1291d583b39bSJohn Wren Kennedy log_fail "Error name of snapshot '$dataset'." 1292d583b39bSJohn Wren Kennedy fi 1293d583b39bSJohn Wren Kennedy 1294d583b39bSJohn Wren Kennedy typeset fs=${dataset%@*} 1295d583b39bSJohn Wren Kennedy typeset snap=${dataset#*@} 1296d583b39bSJohn Wren Kennedy 1297d583b39bSJohn Wren Kennedy if [[ -z $fs || -z $snap ]]; then 1298d583b39bSJohn Wren Kennedy log_fail "Error name of snapshot '$dataset'." 1299d583b39bSJohn Wren Kennedy fi 1300d583b39bSJohn Wren Kennedy 1301d583b39bSJohn Wren Kennedy $ECHO $(get_prop mountpoint $fs)/.zfs/snapshot/$snap 1302d583b39bSJohn Wren Kennedy} 1303d583b39bSJohn Wren Kennedy 1304d583b39bSJohn Wren Kennedy# 1305d583b39bSJohn Wren Kennedy# Given a pool and file system, this function will verify the file system 1306d583b39bSJohn Wren Kennedy# using the zdb internal tool. Note that the pool is exported and imported 1307d583b39bSJohn Wren Kennedy# to ensure it has consistent state. 1308d583b39bSJohn Wren Kennedy# 1309d583b39bSJohn Wren Kennedyfunction verify_filesys # pool filesystem dir 1310d583b39bSJohn Wren Kennedy{ 1311d583b39bSJohn Wren Kennedy typeset pool="$1" 1312d583b39bSJohn Wren Kennedy typeset filesys="$2" 1313d583b39bSJohn Wren Kennedy typeset zdbout="/tmp/zdbout.$$" 1314d583b39bSJohn Wren Kennedy 1315d583b39bSJohn Wren Kennedy shift 1316d583b39bSJohn Wren Kennedy shift 1317d583b39bSJohn Wren Kennedy typeset dirs=$@ 1318d583b39bSJohn Wren Kennedy typeset search_path="" 1319d583b39bSJohn Wren Kennedy 1320d583b39bSJohn Wren Kennedy log_note "Calling $ZDB to verify filesystem '$filesys'" 1321d583b39bSJohn Wren Kennedy $ZFS unmount -a > /dev/null 2>&1 1322d583b39bSJohn Wren Kennedy log_must $ZPOOL export $pool 1323d583b39bSJohn Wren Kennedy 1324d583b39bSJohn Wren Kennedy if [[ -n $dirs ]] ; then 1325d583b39bSJohn Wren Kennedy for dir in $dirs ; do 1326d583b39bSJohn Wren Kennedy search_path="$search_path -d $dir" 1327d583b39bSJohn Wren Kennedy done 1328d583b39bSJohn Wren Kennedy fi 1329d583b39bSJohn Wren Kennedy 1330d583b39bSJohn Wren Kennedy log_must $ZPOOL import $search_path $pool 1331d583b39bSJohn Wren Kennedy 1332d583b39bSJohn Wren Kennedy $ZDB -cudi $filesys > $zdbout 2>&1 1333d583b39bSJohn Wren Kennedy if [[ $? != 0 ]]; then 1334d583b39bSJohn Wren Kennedy log_note "Output: $ZDB -cudi $filesys" 1335d583b39bSJohn Wren Kennedy $CAT $zdbout 1336d583b39bSJohn Wren Kennedy log_fail "$ZDB detected errors with: '$filesys'" 1337d583b39bSJohn Wren Kennedy fi 1338d583b39bSJohn Wren Kennedy 1339d583b39bSJohn Wren Kennedy log_must $ZFS mount -a 1340d583b39bSJohn Wren Kennedy log_must $RM -rf $zdbout 1341d583b39bSJohn Wren Kennedy} 1342d583b39bSJohn Wren Kennedy 1343d583b39bSJohn Wren Kennedy# 1344d583b39bSJohn Wren Kennedy# Given a pool, and this function list all disks in the pool 1345d583b39bSJohn Wren Kennedy# 1346d583b39bSJohn Wren Kennedyfunction get_disklist # pool 1347d583b39bSJohn Wren Kennedy{ 1348d583b39bSJohn Wren Kennedy typeset disklist="" 1349d583b39bSJohn Wren Kennedy 1350d583b39bSJohn Wren Kennedy disklist=$($ZPOOL iostat -v $1 | $NAWK '(NR >4) {print $1}' | \ 1351d583b39bSJohn Wren Kennedy $GREP -v "\-\-\-\-\-" | \ 1352d583b39bSJohn Wren Kennedy $EGREP -v -e "^(mirror|raidz1|raidz2|spare|log|cache)$") 1353d583b39bSJohn Wren Kennedy 1354d583b39bSJohn Wren Kennedy $ECHO $disklist 1355d583b39bSJohn Wren Kennedy} 1356d583b39bSJohn Wren Kennedy 1357d583b39bSJohn Wren Kennedy# 1358d583b39bSJohn Wren Kennedy# Destroy all existing metadevices and state database 1359d583b39bSJohn Wren Kennedy# 1360d583b39bSJohn Wren Kennedyfunction destroy_metas 1361d583b39bSJohn Wren Kennedy{ 1362d583b39bSJohn Wren Kennedy typeset metad 1363d583b39bSJohn Wren Kennedy 1364d583b39bSJohn Wren Kennedy for metad in $($METASTAT -p | $AWK '{print $1}'); do 1365d583b39bSJohn Wren Kennedy log_must $METACLEAR -rf $metad 1366d583b39bSJohn Wren Kennedy done 1367d583b39bSJohn Wren Kennedy 1368d583b39bSJohn Wren Kennedy for metad in $($METADB | $CUT -f6 | $GREP dev | $UNIQ); do 1369d583b39bSJohn Wren Kennedy log_must $METADB -fd $metad 1370d583b39bSJohn Wren Kennedy done 1371d583b39bSJohn Wren Kennedy} 1372d583b39bSJohn Wren Kennedy 1373d583b39bSJohn Wren Kennedy# /** 1374d583b39bSJohn Wren Kennedy# This function kills a given list of processes after a time period. We use 1375d583b39bSJohn Wren Kennedy# this in the stress tests instead of STF_TIMEOUT so that we can have processes 1376d583b39bSJohn Wren Kennedy# run for a fixed amount of time, yet still pass. Tests that hit STF_TIMEOUT 1377d583b39bSJohn Wren Kennedy# would be listed as FAIL, which we don't want : we're happy with stress tests 1378d583b39bSJohn Wren Kennedy# running for a certain amount of time, then finishing. 1379d583b39bSJohn Wren Kennedy# 1380d583b39bSJohn Wren Kennedy# @param $1 the time in seconds after which we should terminate these processes 1381d583b39bSJohn Wren Kennedy# @param $2..$n the processes we wish to terminate. 1382d583b39bSJohn Wren Kennedy# */ 1383d583b39bSJohn Wren Kennedyfunction stress_timeout 1384d583b39bSJohn Wren Kennedy{ 1385d583b39bSJohn Wren Kennedy typeset -i TIMEOUT=$1 1386d583b39bSJohn Wren Kennedy shift 1387d583b39bSJohn Wren Kennedy typeset cpids="$@" 1388d583b39bSJohn Wren Kennedy 1389d583b39bSJohn Wren Kennedy log_note "Waiting for child processes($cpids). " \ 1390d583b39bSJohn Wren Kennedy "It could last dozens of minutes, please be patient ..." 1391d583b39bSJohn Wren Kennedy log_must $SLEEP $TIMEOUT 1392d583b39bSJohn Wren Kennedy 1393d583b39bSJohn Wren Kennedy log_note "Killing child processes after ${TIMEOUT} stress timeout." 1394d583b39bSJohn Wren Kennedy typeset pid 1395d583b39bSJohn Wren Kennedy for pid in $cpids; do 1396d583b39bSJohn Wren Kennedy $PS -p $pid > /dev/null 2>&1 1397d583b39bSJohn Wren Kennedy if (($? == 0)); then 1398d583b39bSJohn Wren Kennedy log_must $KILL -USR1 $pid 1399d583b39bSJohn Wren Kennedy fi 1400d583b39bSJohn Wren Kennedy done 1401d583b39bSJohn Wren Kennedy} 1402d583b39bSJohn Wren Kennedy 1403d583b39bSJohn Wren Kennedy# 1404d583b39bSJohn Wren Kennedy# Verify a given hotspare disk is inuse or avail 1405d583b39bSJohn Wren Kennedy# 1406d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise 1407d583b39bSJohn Wren Kennedy# 1408d583b39bSJohn Wren Kennedyfunction check_hotspare_state # pool disk state{inuse,avail} 1409d583b39bSJohn Wren Kennedy{ 1410d583b39bSJohn Wren Kennedy typeset pool=$1 1411d583b39bSJohn Wren Kennedy typeset disk=${2#/dev/dsk/} 1412d583b39bSJohn Wren Kennedy typeset state=$3 1413d583b39bSJohn Wren Kennedy 1414d583b39bSJohn Wren Kennedy cur_state=$(get_device_state $pool $disk "spares") 1415d583b39bSJohn Wren Kennedy 1416d583b39bSJohn Wren Kennedy if [[ $state != ${cur_state} ]]; then 1417d583b39bSJohn Wren Kennedy return 1 1418d583b39bSJohn Wren Kennedy fi 1419d583b39bSJohn Wren Kennedy return 0 1420d583b39bSJohn Wren Kennedy} 1421d583b39bSJohn Wren Kennedy 1422d583b39bSJohn Wren Kennedy# 1423d583b39bSJohn Wren Kennedy# Verify a given slog disk is inuse or avail 1424d583b39bSJohn Wren Kennedy# 1425d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise 1426d583b39bSJohn Wren Kennedy# 1427d583b39bSJohn Wren Kennedyfunction check_slog_state # pool disk state{online,offline,unavail} 1428d583b39bSJohn Wren Kennedy{ 1429d583b39bSJohn Wren Kennedy typeset pool=$1 1430d583b39bSJohn Wren Kennedy typeset disk=${2#/dev/dsk/} 1431d583b39bSJohn Wren Kennedy typeset state=$3 1432d583b39bSJohn Wren Kennedy 1433d583b39bSJohn Wren Kennedy cur_state=$(get_device_state $pool $disk "logs") 1434d583b39bSJohn Wren Kennedy 1435d583b39bSJohn Wren Kennedy if [[ $state != ${cur_state} ]]; then 1436d583b39bSJohn Wren Kennedy return 1 1437d583b39bSJohn Wren Kennedy fi 1438d583b39bSJohn Wren Kennedy return 0 1439d583b39bSJohn Wren Kennedy} 1440d583b39bSJohn Wren Kennedy 1441d583b39bSJohn Wren Kennedy# 1442d583b39bSJohn Wren Kennedy# Verify a given vdev disk is inuse or avail 1443d583b39bSJohn Wren Kennedy# 1444d583b39bSJohn Wren Kennedy# Return 0 is pool/disk matches expected state, 1 otherwise 1445d583b39bSJohn Wren Kennedy# 1446d583b39bSJohn Wren Kennedyfunction check_vdev_state # pool disk state{online,offline,unavail} 1447d583b39bSJohn Wren Kennedy{ 1448d583b39bSJohn Wren Kennedy typeset pool=$1 1449d583b39bSJohn Wren Kennedy typeset disk=${2#/dev/dsk/} 1450d583b39bSJohn Wren Kennedy typeset state=$3 1451d583b39bSJohn Wren Kennedy 1452d583b39bSJohn Wren Kennedy cur_state=$(get_device_state $pool $disk) 1453d583b39bSJohn Wren Kennedy 1454d583b39bSJohn Wren Kennedy if [[ $state != ${cur_state} ]]; then 1455d583b39bSJohn Wren Kennedy return 1 1456d583b39bSJohn Wren Kennedy fi 1457d583b39bSJohn Wren Kennedy return 0 1458d583b39bSJohn Wren Kennedy} 1459d583b39bSJohn Wren Kennedy 1460d583b39bSJohn Wren Kennedy# 1461d583b39bSJohn Wren Kennedy# Check the output of 'zpool status -v <pool>', 1462d583b39bSJohn Wren Kennedy# and to see if the content of <token> contain the <keyword> specified. 1463d583b39bSJohn Wren Kennedy# 1464d583b39bSJohn Wren Kennedy# Return 0 is contain, 1 otherwise 1465d583b39bSJohn Wren Kennedy# 1466d583b39bSJohn Wren Kennedyfunction check_pool_status # pool token keyword 1467d583b39bSJohn Wren Kennedy{ 1468d583b39bSJohn Wren Kennedy typeset pool=$1 1469d583b39bSJohn Wren Kennedy typeset token=$2 1470d583b39bSJohn Wren Kennedy typeset keyword=$3 1471d583b39bSJohn Wren Kennedy 1472d583b39bSJohn Wren Kennedy $ZPOOL status -v "$pool" 2>/dev/null | $NAWK -v token="$token:" ' 1473d583b39bSJohn Wren Kennedy ($1==token) {print $0}' \ 1474d583b39bSJohn Wren Kennedy | $GREP -i "$keyword" > /dev/null 2>&1 1475d583b39bSJohn Wren Kennedy 1476d583b39bSJohn Wren Kennedy return $? 1477d583b39bSJohn Wren Kennedy} 1478d583b39bSJohn Wren Kennedy 1479d583b39bSJohn Wren Kennedy# 1480d583b39bSJohn Wren Kennedy# These 5 following functions are instance of check_pool_status() 1481d583b39bSJohn Wren Kennedy# is_pool_resilvering - to check if the pool is resilver in progress 1482d583b39bSJohn Wren Kennedy# is_pool_resilvered - to check if the pool is resilver completed 1483d583b39bSJohn Wren Kennedy# is_pool_scrubbing - to check if the pool is scrub in progress 1484d583b39bSJohn Wren Kennedy# is_pool_scrubbed - to check if the pool is scrub completed 1485d583b39bSJohn Wren Kennedy# is_pool_scrub_stopped - to check if the pool is scrub stopped 1486d583b39bSJohn Wren Kennedy# 1487d583b39bSJohn Wren Kennedyfunction is_pool_resilvering #pool 1488d583b39bSJohn Wren Kennedy{ 1489d583b39bSJohn Wren Kennedy check_pool_status "$1" "scan" "resilver in progress since " 1490d583b39bSJohn Wren Kennedy return $? 1491d583b39bSJohn Wren Kennedy} 1492d583b39bSJohn Wren Kennedy 1493d583b39bSJohn Wren Kennedyfunction is_pool_resilvered #pool 1494d583b39bSJohn Wren Kennedy{ 1495d583b39bSJohn Wren Kennedy check_pool_status "$1" "scan" "resilvered " 1496d583b39bSJohn Wren Kennedy return $? 1497d583b39bSJohn Wren Kennedy} 1498d583b39bSJohn Wren Kennedy 1499d583b39bSJohn Wren Kennedyfunction is_pool_scrubbing #pool 1500d583b39bSJohn Wren Kennedy{ 1501d583b39bSJohn Wren Kennedy check_pool_status "$1" "scan" "scrub in progress since " 1502d583b39bSJohn Wren Kennedy return $? 1503d583b39bSJohn Wren Kennedy} 1504d583b39bSJohn Wren Kennedy 1505d583b39bSJohn Wren Kennedyfunction is_pool_scrubbed #pool 1506d583b39bSJohn Wren Kennedy{ 1507d583b39bSJohn Wren Kennedy check_pool_status "$1" "scan" "scrub repaired" 1508d583b39bSJohn Wren Kennedy return $? 1509d583b39bSJohn Wren Kennedy} 1510d583b39bSJohn Wren Kennedy 1511d583b39bSJohn Wren Kennedyfunction is_pool_scrub_stopped #pool 1512d583b39bSJohn Wren Kennedy{ 1513d583b39bSJohn Wren Kennedy check_pool_status "$1" "scan" "scrub canceled" 1514d583b39bSJohn Wren Kennedy return $? 1515d583b39bSJohn Wren Kennedy} 1516d583b39bSJohn Wren Kennedy 1517d583b39bSJohn Wren Kennedy# 1518d583b39bSJohn Wren Kennedy# Use create_pool()/destroy_pool() to clean up the infomation in 1519d583b39bSJohn Wren Kennedy# in the given disk to avoid slice overlapping. 1520d583b39bSJohn Wren Kennedy# 1521d583b39bSJohn Wren Kennedyfunction cleanup_devices #vdevs 1522d583b39bSJohn Wren Kennedy{ 1523d583b39bSJohn Wren Kennedy typeset pool="foopool$$" 1524d583b39bSJohn Wren Kennedy 1525d583b39bSJohn Wren Kennedy if poolexists $pool ; then 1526d583b39bSJohn Wren Kennedy destroy_pool $pool 1527d583b39bSJohn Wren Kennedy fi 1528d583b39bSJohn Wren Kennedy 1529d583b39bSJohn Wren Kennedy create_pool $pool $@ 1530d583b39bSJohn Wren Kennedy destroy_pool $pool 1531d583b39bSJohn Wren Kennedy 1532d583b39bSJohn Wren Kennedy return 0 1533d583b39bSJohn Wren Kennedy} 1534d583b39bSJohn Wren Kennedy 1535d583b39bSJohn Wren Kennedy# 1536d583b39bSJohn Wren Kennedy# Verify the rsh connectivity to each remote host in RHOSTS. 1537d583b39bSJohn Wren Kennedy# 1538d583b39bSJohn Wren Kennedy# Return 0 if remote host is accessible; otherwise 1. 1539d583b39bSJohn Wren Kennedy# $1 remote host name 1540d583b39bSJohn Wren Kennedy# $2 username 1541d583b39bSJohn Wren Kennedy# 1542d583b39bSJohn Wren Kennedyfunction verify_rsh_connect #rhost, username 1543d583b39bSJohn Wren Kennedy{ 1544d583b39bSJohn Wren Kennedy typeset rhost=$1 1545d583b39bSJohn Wren Kennedy typeset username=$2 1546d583b39bSJohn Wren Kennedy typeset rsh_cmd="$RSH -n" 1547d583b39bSJohn Wren Kennedy typeset cur_user= 1548d583b39bSJohn Wren Kennedy 1549d583b39bSJohn Wren Kennedy $GETENT hosts $rhost >/dev/null 2>&1 1550d583b39bSJohn Wren Kennedy if (($? != 0)); then 1551d583b39bSJohn Wren Kennedy log_note "$rhost cannot be found from" \ 1552d583b39bSJohn Wren Kennedy "administrative database." 1553d583b39bSJohn Wren Kennedy return 1 1554d583b39bSJohn Wren Kennedy fi 1555d583b39bSJohn Wren Kennedy 1556d583b39bSJohn Wren Kennedy $PING $rhost 3 >/dev/null 2>&1 1557d583b39bSJohn Wren Kennedy if (($? != 0)); then 1558d583b39bSJohn Wren Kennedy log_note "$rhost is not reachable." 1559d583b39bSJohn Wren Kennedy return 1 1560d583b39bSJohn Wren Kennedy fi 1561d583b39bSJohn Wren Kennedy 1562d583b39bSJohn Wren Kennedy if ((${#username} != 0)); then 1563d583b39bSJohn Wren Kennedy rsh_cmd="$rsh_cmd -l $username" 1564d583b39bSJohn Wren Kennedy cur_user="given user \"$username\"" 1565d583b39bSJohn Wren Kennedy else 1566d583b39bSJohn Wren Kennedy cur_user="current user \"`$LOGNAME`\"" 1567d583b39bSJohn Wren Kennedy fi 1568d583b39bSJohn Wren Kennedy 1569d583b39bSJohn Wren Kennedy if ! $rsh_cmd $rhost $TRUE; then 1570d583b39bSJohn Wren Kennedy log_note "$RSH to $rhost is not accessible" \ 1571d583b39bSJohn Wren Kennedy "with $cur_user." 1572d583b39bSJohn Wren Kennedy return 1 1573d583b39bSJohn Wren Kennedy fi 1574d583b39bSJohn Wren Kennedy 1575d583b39bSJohn Wren Kennedy return 0 1576d583b39bSJohn Wren Kennedy} 1577d583b39bSJohn Wren Kennedy 1578d583b39bSJohn Wren Kennedy# 1579d583b39bSJohn Wren Kennedy# Verify the remote host connection via rsh after rebooting 1580d583b39bSJohn Wren Kennedy# $1 remote host 1581d583b39bSJohn Wren Kennedy# 1582d583b39bSJohn Wren Kennedyfunction verify_remote 1583d583b39bSJohn Wren Kennedy{ 1584d583b39bSJohn Wren Kennedy rhost=$1 1585d583b39bSJohn Wren Kennedy 1586d583b39bSJohn Wren Kennedy # 1587d583b39bSJohn Wren Kennedy # The following loop waits for the remote system rebooting. 1588d583b39bSJohn Wren Kennedy # Each iteration will wait for 150 seconds. there are 1589d583b39bSJohn Wren Kennedy # total 5 iterations, so the total timeout value will 1590d583b39bSJohn Wren Kennedy # be 12.5 minutes for the system rebooting. This number 1591d583b39bSJohn Wren Kennedy # is an approxiate number. 1592d583b39bSJohn Wren Kennedy # 1593d583b39bSJohn Wren Kennedy typeset -i count=0 1594d583b39bSJohn Wren Kennedy while ! verify_rsh_connect $rhost; do 1595d583b39bSJohn Wren Kennedy sleep 150 1596d583b39bSJohn Wren Kennedy ((count = count + 1)) 1597d583b39bSJohn Wren Kennedy if ((count > 5)); then 1598d583b39bSJohn Wren Kennedy return 1 1599d583b39bSJohn Wren Kennedy fi 1600d583b39bSJohn Wren Kennedy done 1601d583b39bSJohn Wren Kennedy return 0 1602d583b39bSJohn Wren Kennedy} 1603d583b39bSJohn Wren Kennedy 1604d583b39bSJohn Wren Kennedy# 1605d583b39bSJohn Wren Kennedy# Replacement function for /usr/bin/rsh. This function will include 1606d583b39bSJohn Wren Kennedy# the /usr/bin/rsh and meanwhile return the execution status of the 1607d583b39bSJohn Wren Kennedy# last command. 1608d583b39bSJohn Wren Kennedy# 1609d583b39bSJohn Wren Kennedy# $1 usrname passing down to -l option of /usr/bin/rsh 1610d583b39bSJohn Wren Kennedy# $2 remote machine hostname 1611d583b39bSJohn Wren Kennedy# $3... command string 1612d583b39bSJohn Wren Kennedy# 1613d583b39bSJohn Wren Kennedy 1614d583b39bSJohn Wren Kennedyfunction rsh_status 1615d583b39bSJohn Wren Kennedy{ 1616d583b39bSJohn Wren Kennedy typeset ruser=$1 1617d583b39bSJohn Wren Kennedy typeset rhost=$2 1618d583b39bSJohn Wren Kennedy typeset -i ret=0 1619d583b39bSJohn Wren Kennedy typeset cmd_str="" 1620d583b39bSJohn Wren Kennedy typeset rsh_str="" 1621d583b39bSJohn Wren Kennedy 1622d583b39bSJohn Wren Kennedy shift; shift 1623d583b39bSJohn Wren Kennedy cmd_str="$@" 1624d583b39bSJohn Wren Kennedy 1625d583b39bSJohn Wren Kennedy err_file=/tmp/${rhost}.$$.err 1626d583b39bSJohn Wren Kennedy if ((${#ruser} == 0)); then 1627d583b39bSJohn Wren Kennedy rsh_str="$RSH -n" 1628d583b39bSJohn Wren Kennedy else 1629d583b39bSJohn Wren Kennedy rsh_str="$RSH -n -l $ruser" 1630d583b39bSJohn Wren Kennedy fi 1631d583b39bSJohn Wren Kennedy 1632d583b39bSJohn Wren Kennedy $rsh_str $rhost /usr/bin/ksh -c "'$cmd_str; \ 1633d583b39bSJohn Wren Kennedy print -u 2 \"status=\$?\"'" \ 1634d583b39bSJohn Wren Kennedy >/dev/null 2>$err_file 1635d583b39bSJohn Wren Kennedy ret=$? 1636d583b39bSJohn Wren Kennedy if (($ret != 0)); then 1637d583b39bSJohn Wren Kennedy $CAT $err_file 1638d583b39bSJohn Wren Kennedy $RM -f $std_file $err_file 1639d583b39bSJohn Wren Kennedy log_fail "$RSH itself failed with exit code $ret..." 1640d583b39bSJohn Wren Kennedy fi 1641d583b39bSJohn Wren Kennedy 1642d583b39bSJohn Wren Kennedy ret=$($GREP -v 'print -u 2' $err_file | $GREP 'status=' | \ 1643d583b39bSJohn Wren Kennedy $CUT -d= -f2) 1644d583b39bSJohn Wren Kennedy (($ret != 0)) && $CAT $err_file >&2 1645d583b39bSJohn Wren Kennedy 1646d583b39bSJohn Wren Kennedy $RM -f $err_file >/dev/null 2>&1 1647d583b39bSJohn Wren Kennedy return $ret 1648d583b39bSJohn Wren Kennedy} 1649d583b39bSJohn Wren Kennedy 1650d583b39bSJohn Wren Kennedy# 1651d583b39bSJohn Wren Kennedy# Get the SUNWstc-fs-zfs package installation path in a remote host 1652d583b39bSJohn Wren Kennedy# $1 remote host name 1653d583b39bSJohn Wren Kennedy# 1654d583b39bSJohn Wren Kennedyfunction get_remote_pkgpath 1655d583b39bSJohn Wren Kennedy{ 1656d583b39bSJohn Wren Kennedy typeset rhost=$1 1657d583b39bSJohn Wren Kennedy typeset pkgpath="" 1658d583b39bSJohn Wren Kennedy 1659d583b39bSJohn Wren Kennedy pkgpath=$($RSH -n $rhost "$PKGINFO -l SUNWstc-fs-zfs | $GREP BASEDIR: |\ 1660d583b39bSJohn Wren Kennedy $CUT -d: -f2") 1661d583b39bSJohn Wren Kennedy 1662d583b39bSJohn Wren Kennedy $ECHO $pkgpath 1663d583b39bSJohn Wren Kennedy} 1664d583b39bSJohn Wren Kennedy 1665d583b39bSJohn Wren Kennedy#/** 1666d583b39bSJohn Wren Kennedy# A function to find and locate free disks on a system or from given 1667d583b39bSJohn Wren Kennedy# disks as the parameter. It works by locating disks that are in use 1668d583b39bSJohn Wren Kennedy# as swap devices, SVM devices, and dump devices, and also disks 1669d583b39bSJohn Wren Kennedy# listed in /etc/vfstab 1670d583b39bSJohn Wren Kennedy# 1671d583b39bSJohn Wren Kennedy# $@ given disks to find which are free, default is all disks in 1672d583b39bSJohn Wren Kennedy# the test system 1673d583b39bSJohn Wren Kennedy# 1674d583b39bSJohn Wren Kennedy# @return a string containing the list of available disks 1675d583b39bSJohn Wren Kennedy#*/ 1676d583b39bSJohn Wren Kennedyfunction find_disks 1677d583b39bSJohn Wren Kennedy{ 1678d583b39bSJohn Wren Kennedy sfi=/tmp/swaplist.$$ 1679d583b39bSJohn Wren Kennedy msi=/tmp/metastat.$$ 1680d583b39bSJohn Wren Kennedy dmpi=/tmp/dumpdev.$$ 1681d583b39bSJohn Wren Kennedy max_finddisksnum=${MAX_FINDDISKSNUM:-6} 1682d583b39bSJohn Wren Kennedy 1683d583b39bSJohn Wren Kennedy $SWAP -l > $sfi 1684d583b39bSJohn Wren Kennedy $METASTAT -c > $msi 2>/dev/null 1685d583b39bSJohn Wren Kennedy $DUMPADM > $dmpi 2>/dev/null 1686d583b39bSJohn Wren Kennedy 1687d583b39bSJohn Wren Kennedy# write an awk script that can process the output of format 1688d583b39bSJohn Wren Kennedy# to produce a list of disks we know about. Note that we have 1689d583b39bSJohn Wren Kennedy# to escape "$2" so that the shell doesn't interpret it while 1690d583b39bSJohn Wren Kennedy# we're creating the awk script. 1691d583b39bSJohn Wren Kennedy# ------------------- 1692d583b39bSJohn Wren Kennedy $CAT > /tmp/find_disks.awk <<EOF 1693d583b39bSJohn Wren Kennedy#!/bin/nawk -f 1694d583b39bSJohn Wren Kennedy BEGIN { FS="."; } 1695d583b39bSJohn Wren Kennedy 1696d583b39bSJohn Wren Kennedy /^Specify disk/{ 1697d583b39bSJohn Wren Kennedy searchdisks=0; 1698d583b39bSJohn Wren Kennedy } 1699d583b39bSJohn Wren Kennedy 1700d583b39bSJohn Wren Kennedy { 1701d583b39bSJohn Wren Kennedy if (searchdisks && \$2 !~ "^$"){ 1702d583b39bSJohn Wren Kennedy split(\$2,arr," "); 1703d583b39bSJohn Wren Kennedy print arr[1]; 1704d583b39bSJohn Wren Kennedy } 1705d583b39bSJohn Wren Kennedy } 1706d583b39bSJohn Wren Kennedy 1707d583b39bSJohn Wren Kennedy /^AVAILABLE DISK SELECTIONS:/{ 1708d583b39bSJohn Wren Kennedy searchdisks=1; 1709d583b39bSJohn Wren Kennedy } 1710d583b39bSJohn Wren KennedyEOF 1711d583b39bSJohn Wren Kennedy#--------------------- 1712d583b39bSJohn Wren Kennedy 1713d583b39bSJohn Wren Kennedy $CHMOD 755 /tmp/find_disks.awk 1714d583b39bSJohn Wren Kennedy disks=${@:-$($ECHO "" | $FORMAT -e 2>/dev/null | /tmp/find_disks.awk)} 1715d583b39bSJohn Wren Kennedy $RM /tmp/find_disks.awk 1716d583b39bSJohn Wren Kennedy 1717d583b39bSJohn Wren Kennedy unused="" 1718d583b39bSJohn Wren Kennedy for disk in $disks; do 1719d583b39bSJohn Wren Kennedy # Check for mounted 1720d583b39bSJohn Wren Kennedy $GREP "${disk}[sp]" /etc/mnttab >/dev/null 1721d583b39bSJohn Wren Kennedy (($? == 0)) && continue 1722d583b39bSJohn Wren Kennedy # Check for swap 1723d583b39bSJohn Wren Kennedy $GREP "${disk}[sp]" $sfi >/dev/null 1724d583b39bSJohn Wren Kennedy (($? == 0)) && continue 1725d583b39bSJohn Wren Kennedy # Check for SVM 1726d583b39bSJohn Wren Kennedy $GREP "${disk}" $msi >/dev/null 1727d583b39bSJohn Wren Kennedy (($? == 0)) && continue 1728d583b39bSJohn Wren Kennedy # check for dump device 1729d583b39bSJohn Wren Kennedy $GREP "${disk}[sp]" $dmpi >/dev/null 1730d583b39bSJohn Wren Kennedy (($? == 0)) && continue 1731d583b39bSJohn Wren Kennedy # check to see if this disk hasn't been explicitly excluded 1732d583b39bSJohn Wren Kennedy # by a user-set environment variable 1733d583b39bSJohn Wren Kennedy $ECHO "${ZFS_HOST_DEVICES_IGNORE}" | $GREP "${disk}" > /dev/null 1734d583b39bSJohn Wren Kennedy (($? == 0)) && continue 1735d583b39bSJohn Wren Kennedy unused_candidates="$unused_candidates $disk" 1736d583b39bSJohn Wren Kennedy done 1737d583b39bSJohn Wren Kennedy $RM $sfi 1738d583b39bSJohn Wren Kennedy $RM $msi 1739d583b39bSJohn Wren Kennedy $RM $dmpi 1740d583b39bSJohn Wren Kennedy 1741d583b39bSJohn Wren Kennedy# now just check to see if those disks do actually exist 1742d583b39bSJohn Wren Kennedy# by looking for a device pointing to the first slice in 1743d583b39bSJohn Wren Kennedy# each case. limit the number to max_finddisksnum 1744d583b39bSJohn Wren Kennedy count=0 1745d583b39bSJohn Wren Kennedy for disk in $unused_candidates; do 1746d583b39bSJohn Wren Kennedy if [ -b /dev/dsk/${disk}s0 ]; then 1747d583b39bSJohn Wren Kennedy if [ $count -lt $max_finddisksnum ]; then 1748d583b39bSJohn Wren Kennedy unused="$unused $disk" 1749d583b39bSJohn Wren Kennedy # do not impose limit if $@ is provided 1750d583b39bSJohn Wren Kennedy [[ -z $@ ]] && ((count = count + 1)) 1751d583b39bSJohn Wren Kennedy fi 1752d583b39bSJohn Wren Kennedy fi 1753d583b39bSJohn Wren Kennedy done 1754d583b39bSJohn Wren Kennedy 1755d583b39bSJohn Wren Kennedy# finally, return our disk list 1756d583b39bSJohn Wren Kennedy $ECHO $unused 1757d583b39bSJohn Wren Kennedy} 1758d583b39bSJohn Wren Kennedy 1759d583b39bSJohn Wren Kennedy# 1760d583b39bSJohn Wren Kennedy# Add specified user to specified group 1761d583b39bSJohn Wren Kennedy# 1762d583b39bSJohn Wren Kennedy# $1 group name 1763d583b39bSJohn Wren Kennedy# $2 user name 1764d583b39bSJohn Wren Kennedy# $3 base of the homedir (optional) 1765d583b39bSJohn Wren Kennedy# 1766d583b39bSJohn Wren Kennedyfunction add_user #<group_name> <user_name> <basedir> 1767d583b39bSJohn Wren Kennedy{ 1768d583b39bSJohn Wren Kennedy typeset gname=$1 1769d583b39bSJohn Wren Kennedy typeset uname=$2 1770d583b39bSJohn Wren Kennedy typeset basedir=${3:-"/var/tmp"} 1771d583b39bSJohn Wren Kennedy 1772d583b39bSJohn Wren Kennedy if ((${#gname} == 0 || ${#uname} == 0)); then 1773d583b39bSJohn Wren Kennedy log_fail "group name or user name are not defined." 1774d583b39bSJohn Wren Kennedy fi 1775d583b39bSJohn Wren Kennedy 1776d583b39bSJohn Wren Kennedy log_must $USERADD -g $gname -d $basedir/$uname -m $uname 1777d583b39bSJohn Wren Kennedy 1778d583b39bSJohn Wren Kennedy return 0 1779d583b39bSJohn Wren Kennedy} 1780d583b39bSJohn Wren Kennedy 1781d583b39bSJohn Wren Kennedy# 1782d583b39bSJohn Wren Kennedy# Delete the specified user. 1783d583b39bSJohn Wren Kennedy# 1784d583b39bSJohn Wren Kennedy# $1 login name 1785d583b39bSJohn Wren Kennedy# $2 base of the homedir (optional) 1786d583b39bSJohn Wren Kennedy# 1787d583b39bSJohn Wren Kennedyfunction del_user #<logname> <basedir> 1788d583b39bSJohn Wren Kennedy{ 1789d583b39bSJohn Wren Kennedy typeset user=$1 1790d583b39bSJohn Wren Kennedy typeset basedir=${2:-"/var/tmp"} 1791d583b39bSJohn Wren Kennedy 1792d583b39bSJohn Wren Kennedy if ((${#user} == 0)); then 1793d583b39bSJohn Wren Kennedy log_fail "login name is necessary." 1794d583b39bSJohn Wren Kennedy fi 1795d583b39bSJohn Wren Kennedy 1796d583b39bSJohn Wren Kennedy if $ID $user > /dev/null 2>&1; then 1797d583b39bSJohn Wren Kennedy log_must $USERDEL $user 1798d583b39bSJohn Wren Kennedy fi 1799d583b39bSJohn Wren Kennedy 1800d583b39bSJohn Wren Kennedy [[ -d $basedir/$user ]] && $RM -fr $basedir/$user 1801d583b39bSJohn Wren Kennedy 1802d583b39bSJohn Wren Kennedy return 0 1803d583b39bSJohn Wren Kennedy} 1804d583b39bSJohn Wren Kennedy 1805d583b39bSJohn Wren Kennedy# 1806d583b39bSJohn Wren Kennedy# Select valid gid and create specified group. 1807d583b39bSJohn Wren Kennedy# 1808d583b39bSJohn Wren Kennedy# $1 group name 1809d583b39bSJohn Wren Kennedy# 1810d583b39bSJohn Wren Kennedyfunction add_group #<group_name> 1811d583b39bSJohn Wren Kennedy{ 1812d583b39bSJohn Wren Kennedy typeset group=$1 1813d583b39bSJohn Wren Kennedy 1814d583b39bSJohn Wren Kennedy if ((${#group} == 0)); then 1815d583b39bSJohn Wren Kennedy log_fail "group name is necessary." 1816d583b39bSJohn Wren Kennedy fi 1817d583b39bSJohn Wren Kennedy 1818d583b39bSJohn Wren Kennedy # Assign 100 as the base gid 1819d583b39bSJohn Wren Kennedy typeset -i gid=100 1820d583b39bSJohn Wren Kennedy while true; do 1821d583b39bSJohn Wren Kennedy $GROUPADD -g $gid $group > /dev/null 2>&1 1822d583b39bSJohn Wren Kennedy typeset -i ret=$? 1823d583b39bSJohn Wren Kennedy case $ret in 1824d583b39bSJohn Wren Kennedy 0) return 0 ;; 1825d583b39bSJohn Wren Kennedy # The gid is not unique 1826d583b39bSJohn Wren Kennedy 4) ((gid += 1)) ;; 1827d583b39bSJohn Wren Kennedy *) return 1 ;; 1828d583b39bSJohn Wren Kennedy esac 1829d583b39bSJohn Wren Kennedy done 1830d583b39bSJohn Wren Kennedy} 1831d583b39bSJohn Wren Kennedy 1832d583b39bSJohn Wren Kennedy# 1833d583b39bSJohn Wren Kennedy# Delete the specified group. 1834d583b39bSJohn Wren Kennedy# 1835d583b39bSJohn Wren Kennedy# $1 group name 1836d583b39bSJohn Wren Kennedy# 1837d583b39bSJohn Wren Kennedyfunction del_group #<group_name> 1838d583b39bSJohn Wren Kennedy{ 1839d583b39bSJohn Wren Kennedy typeset grp=$1 1840d583b39bSJohn Wren Kennedy if ((${#grp} == 0)); then 1841d583b39bSJohn Wren Kennedy log_fail "group name is necessary." 1842d583b39bSJohn Wren Kennedy fi 1843d583b39bSJohn Wren Kennedy 1844d583b39bSJohn Wren Kennedy $GROUPMOD -n $grp $grp > /dev/null 2>&1 1845d583b39bSJohn Wren Kennedy typeset -i ret=$? 1846d583b39bSJohn Wren Kennedy case $ret in 1847d583b39bSJohn Wren Kennedy # Group does not exist. 1848d583b39bSJohn Wren Kennedy 6) return 0 ;; 1849d583b39bSJohn Wren Kennedy # Name already exists as a group name 1850d583b39bSJohn Wren Kennedy 9) log_must $GROUPDEL $grp ;; 1851d583b39bSJohn Wren Kennedy *) return 1 ;; 1852d583b39bSJohn Wren Kennedy esac 1853d583b39bSJohn Wren Kennedy 1854d583b39bSJohn Wren Kennedy return 0 1855d583b39bSJohn Wren Kennedy} 1856d583b39bSJohn Wren Kennedy 1857d583b39bSJohn Wren Kennedy# 1858d583b39bSJohn Wren Kennedy# This function will return true if it's safe to destroy the pool passed 1859d583b39bSJohn Wren Kennedy# as argument 1. It checks for pools based on zvols and files, and also 1860d583b39bSJohn Wren Kennedy# files contained in a pool that may have a different mountpoint. 1861d583b39bSJohn Wren Kennedy# 1862d583b39bSJohn Wren Kennedyfunction safe_to_destroy_pool { # $1 the pool name 1863d583b39bSJohn Wren Kennedy 1864d583b39bSJohn Wren Kennedy typeset pool="" 1865d583b39bSJohn Wren Kennedy typeset DONT_DESTROY="" 1866d583b39bSJohn Wren Kennedy 1867d583b39bSJohn Wren Kennedy # We check that by deleting the $1 pool, we're not 1868d583b39bSJohn Wren Kennedy # going to pull the rug out from other pools. Do this 1869d583b39bSJohn Wren Kennedy # by looking at all other pools, ensuring that they 1870d583b39bSJohn Wren Kennedy # aren't built from files or zvols contained in this pool. 1871d583b39bSJohn Wren Kennedy 1872d583b39bSJohn Wren Kennedy for pool in $($ZPOOL list -H -o name) 1873d583b39bSJohn Wren Kennedy do 1874d583b39bSJohn Wren Kennedy ALTMOUNTPOOL="" 1875d583b39bSJohn Wren Kennedy 1876d583b39bSJohn Wren Kennedy # this is a list of the top-level directories in each of the 1877d583b39bSJohn Wren Kennedy # files that make up the path to the files the pool is based on 1878d583b39bSJohn Wren Kennedy FILEPOOL=$($ZPOOL status -v $pool | $GREP /$1/ | \ 1879d583b39bSJohn Wren Kennedy $AWK '{print $1}') 1880d583b39bSJohn Wren Kennedy 1881d583b39bSJohn Wren Kennedy # this is a list of the zvols that make up the pool 1882d583b39bSJohn Wren Kennedy ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/dsk/$1$" \ 1883d583b39bSJohn Wren Kennedy | $AWK '{print $1}') 1884d583b39bSJohn Wren Kennedy 1885d583b39bSJohn Wren Kennedy # also want to determine if it's a file-based pool using an 1886d583b39bSJohn Wren Kennedy # alternate mountpoint... 1887d583b39bSJohn Wren Kennedy POOL_FILE_DIRS=$($ZPOOL status -v $pool | \ 1888d583b39bSJohn Wren Kennedy $GREP / | $AWK '{print $1}' | \ 1889d583b39bSJohn Wren Kennedy $AWK -F/ '{print $2}' | $GREP -v "dev") 1890d583b39bSJohn Wren Kennedy 1891d583b39bSJohn Wren Kennedy for pooldir in $POOL_FILE_DIRS 1892d583b39bSJohn Wren Kennedy do 1893d583b39bSJohn Wren Kennedy OUTPUT=$($ZFS list -H -r -o mountpoint $1 | \ 1894d583b39bSJohn Wren Kennedy $GREP "${pooldir}$" | $AWK '{print $1}') 1895d583b39bSJohn Wren Kennedy 1896d583b39bSJohn Wren Kennedy ALTMOUNTPOOL="${ALTMOUNTPOOL}${OUTPUT}" 1897d583b39bSJohn Wren Kennedy done 1898d583b39bSJohn Wren Kennedy 1899d583b39bSJohn Wren Kennedy 1900d583b39bSJohn Wren Kennedy if [ ! -z "$ZVOLPOOL" ] 1901d583b39bSJohn Wren Kennedy then 1902d583b39bSJohn Wren Kennedy DONT_DESTROY="true" 1903d583b39bSJohn Wren Kennedy log_note "Pool $pool is built from $ZVOLPOOL on $1" 1904d583b39bSJohn Wren Kennedy fi 1905d583b39bSJohn Wren Kennedy 1906d583b39bSJohn Wren Kennedy if [ ! -z "$FILEPOOL" ] 1907d583b39bSJohn Wren Kennedy then 1908d583b39bSJohn Wren Kennedy DONT_DESTROY="true" 1909d583b39bSJohn Wren Kennedy log_note "Pool $pool is built from $FILEPOOL on $1" 1910d583b39bSJohn Wren Kennedy fi 1911d583b39bSJohn Wren Kennedy 1912d583b39bSJohn Wren Kennedy if [ ! -z "$ALTMOUNTPOOL" ] 1913d583b39bSJohn Wren Kennedy then 1914d583b39bSJohn Wren Kennedy DONT_DESTROY="true" 1915d583b39bSJohn Wren Kennedy log_note "Pool $pool is built from $ALTMOUNTPOOL on $1" 1916d583b39bSJohn Wren Kennedy fi 1917d583b39bSJohn Wren Kennedy done 1918d583b39bSJohn Wren Kennedy 1919d583b39bSJohn Wren Kennedy if [ -z "${DONT_DESTROY}" ] 1920d583b39bSJohn Wren Kennedy then 1921d583b39bSJohn Wren Kennedy return 0 1922d583b39bSJohn Wren Kennedy else 1923d583b39bSJohn Wren Kennedy log_note "Warning: it is not safe to destroy $1!" 1924d583b39bSJohn Wren Kennedy return 1 1925d583b39bSJohn Wren Kennedy fi 1926d583b39bSJohn Wren Kennedy} 1927d583b39bSJohn Wren Kennedy 1928d583b39bSJohn Wren Kennedy# 1929d583b39bSJohn Wren Kennedy# Get IP address of hostname 1930d583b39bSJohn Wren Kennedy# $1 hostname 1931d583b39bSJohn Wren Kennedy# 1932d583b39bSJohn Wren Kennedyfunction getipbyhost 1933d583b39bSJohn Wren Kennedy{ 1934d583b39bSJohn Wren Kennedy typeset ip 1935d583b39bSJohn Wren Kennedy ip=`$ARP $1 2>/dev/null | $AWK -F\) '{print $1}' \ 1936d583b39bSJohn Wren Kennedy | $AWK -F\('{print $2}'` 1937d583b39bSJohn Wren Kennedy $ECHO $ip 1938d583b39bSJohn Wren Kennedy} 1939d583b39bSJohn Wren Kennedy 1940d583b39bSJohn Wren Kennedy# 1941d583b39bSJohn Wren Kennedy# Setup iSCSI initiator to target 1942d583b39bSJohn Wren Kennedy# $1 target hostname 1943d583b39bSJohn Wren Kennedy# 1944d583b39bSJohn Wren Kennedyfunction iscsi_isetup 1945d583b39bSJohn Wren Kennedy{ 1946d583b39bSJohn Wren Kennedy # check svc:/network/iscsi_initiator:default state, try to enable it 1947d583b39bSJohn Wren Kennedy # if the state is not ON 1948d583b39bSJohn Wren Kennedy typeset ISCSII_FMRI="svc:/network/iscsi_initiator:default" 1949d583b39bSJohn Wren Kennedy if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then 1950d583b39bSJohn Wren Kennedy log_must $SVCADM enable $ISCSII_FMRI 1951d583b39bSJohn Wren Kennedy 1952d583b39bSJohn Wren Kennedy typeset -i retry=20 1953d583b39bSJohn Wren Kennedy while [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) && \ 1954d583b39bSJohn Wren Kennedy ($retry -ne 0) ]] 1955d583b39bSJohn Wren Kennedy do 1956d583b39bSJohn Wren Kennedy ((retry = retry - 1)) 1957d583b39bSJohn Wren Kennedy $SLEEP 1 1958d583b39bSJohn Wren Kennedy done 1959d583b39bSJohn Wren Kennedy 1960d583b39bSJohn Wren Kennedy if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then 1961d583b39bSJohn Wren Kennedy log_fail "$ISCSII_FMRI service can not be enabled!" 1962d583b39bSJohn Wren Kennedy fi 1963d583b39bSJohn Wren Kennedy fi 1964d583b39bSJohn Wren Kennedy 1965d583b39bSJohn Wren Kennedy log_must $ISCSIADM add discovery-address $(getipbyhost $1) 1966d583b39bSJohn Wren Kennedy log_must $ISCSIADM modify discovery --sendtargets enable 1967d583b39bSJohn Wren Kennedy log_must $DEVFSADM -i iscsi 1968d583b39bSJohn Wren Kennedy} 1969d583b39bSJohn Wren Kennedy 1970d583b39bSJohn Wren Kennedy# 1971d583b39bSJohn Wren Kennedy# Check whether iscsi parameter is set as remote 1972d583b39bSJohn Wren Kennedy# 1973d583b39bSJohn Wren Kennedy# return 0 if iscsi is set as remote, otherwise 1 1974d583b39bSJohn Wren Kennedy# 1975d583b39bSJohn Wren Kennedyfunction check_iscsi_remote 1976d583b39bSJohn Wren Kennedy{ 1977d583b39bSJohn Wren Kennedy if [[ $iscsi == "remote" ]] ; then 1978d583b39bSJohn Wren Kennedy return 0 1979d583b39bSJohn Wren Kennedy else 1980d583b39bSJohn Wren Kennedy return 1 1981d583b39bSJohn Wren Kennedy fi 1982d583b39bSJohn Wren Kennedy} 1983d583b39bSJohn Wren Kennedy 1984d583b39bSJohn Wren Kennedy# 1985d583b39bSJohn Wren Kennedy# Check if a volume is a valide iscsi target 1986d583b39bSJohn Wren Kennedy# $1 volume name 1987d583b39bSJohn Wren Kennedy# return 0 if suceeds, otherwise, return 1 1988d583b39bSJohn Wren Kennedy# 1989d583b39bSJohn Wren Kennedyfunction is_iscsi_target 1990d583b39bSJohn Wren Kennedy{ 1991d583b39bSJohn Wren Kennedy typeset dataset=$1 1992d583b39bSJohn Wren Kennedy typeset target targets 1993d583b39bSJohn Wren Kennedy 1994d583b39bSJohn Wren Kennedy [[ -z $dataset ]] && return 1 1995d583b39bSJohn Wren Kennedy 1996d583b39bSJohn Wren Kennedy targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}') 1997d583b39bSJohn Wren Kennedy [[ -z $targets ]] && return 1 1998d583b39bSJohn Wren Kennedy 1999d583b39bSJohn Wren Kennedy for target in $targets; do 2000d583b39bSJohn Wren Kennedy [[ $dataset == $target ]] && return 0 2001d583b39bSJohn Wren Kennedy done 2002d583b39bSJohn Wren Kennedy 2003d583b39bSJohn Wren Kennedy return 1 2004d583b39bSJohn Wren Kennedy} 2005d583b39bSJohn Wren Kennedy 2006d583b39bSJohn Wren Kennedy# 2007d583b39bSJohn Wren Kennedy# Get the iSCSI name of a target 2008d583b39bSJohn Wren Kennedy# $1 target name 2009d583b39bSJohn Wren Kennedy# 2010d583b39bSJohn Wren Kennedyfunction iscsi_name 2011d583b39bSJohn Wren Kennedy{ 2012d583b39bSJohn Wren Kennedy typeset target=$1 2013d583b39bSJohn Wren Kennedy typeset name 2014d583b39bSJohn Wren Kennedy 2015d583b39bSJohn Wren Kennedy [[ -z $target ]] && log_fail "No parameter." 2016d583b39bSJohn Wren Kennedy 2017d583b39bSJohn Wren Kennedy if ! is_iscsi_target $target ; then 2018d583b39bSJohn Wren Kennedy log_fail "Not a target." 2019d583b39bSJohn Wren Kennedy fi 2020d583b39bSJohn Wren Kennedy 2021d583b39bSJohn Wren Kennedy name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \ 2022d583b39bSJohn Wren Kennedy | $AWK '{print $2}') 2023d583b39bSJohn Wren Kennedy 2024d583b39bSJohn Wren Kennedy return $name 2025d583b39bSJohn Wren Kennedy} 2026d583b39bSJohn Wren Kennedy 2027d583b39bSJohn Wren Kennedy# 2028d583b39bSJohn Wren Kennedy# check svc:/system/iscsitgt:default state, try to enable it if the state 2029d583b39bSJohn Wren Kennedy# is not ON 2030d583b39bSJohn Wren Kennedy# 2031d583b39bSJohn Wren Kennedyfunction iscsitgt_setup 2032d583b39bSJohn Wren Kennedy{ 2033d583b39bSJohn Wren Kennedy log_must $RM -f $ISCSITGTFILE 2034d583b39bSJohn Wren Kennedy if [[ "ON" == $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then 2035d583b39bSJohn Wren Kennedy log_note "iscsitgt is already enabled" 2036d583b39bSJohn Wren Kennedy return 2037d583b39bSJohn Wren Kennedy fi 2038d583b39bSJohn Wren Kennedy 2039d583b39bSJohn Wren Kennedy log_must $SVCADM enable -t $ISCSITGT_FMRI 2040d583b39bSJohn Wren Kennedy 2041d583b39bSJohn Wren Kennedy typeset -i retry=20 2042d583b39bSJohn Wren Kennedy while [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) && \ 2043d583b39bSJohn Wren Kennedy ($retry -ne 0) ]] 2044d583b39bSJohn Wren Kennedy do 2045d583b39bSJohn Wren Kennedy $SLEEP 1 2046d583b39bSJohn Wren Kennedy ((retry = retry - 1)) 2047d583b39bSJohn Wren Kennedy done 2048d583b39bSJohn Wren Kennedy 2049d583b39bSJohn Wren Kennedy if [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then 2050d583b39bSJohn Wren Kennedy log_fail "$ISCSITGT_FMRI service can not be enabled!" 2051d583b39bSJohn Wren Kennedy fi 2052d583b39bSJohn Wren Kennedy 2053d583b39bSJohn Wren Kennedy log_must $TOUCH $ISCSITGTFILE 2054d583b39bSJohn Wren Kennedy} 2055d583b39bSJohn Wren Kennedy 2056d583b39bSJohn Wren Kennedy# 2057d583b39bSJohn Wren Kennedy# set DISABLED state of svc:/system/iscsitgt:default 2058d583b39bSJohn Wren Kennedy# which is the most suiteable state if $ISCSITGTFILE exists 2059d583b39bSJohn Wren Kennedy# 2060d583b39bSJohn Wren Kennedyfunction iscsitgt_cleanup 2061d583b39bSJohn Wren Kennedy{ 2062d583b39bSJohn Wren Kennedy if [[ -e $ISCSITGTFILE ]]; then 2063d583b39bSJohn Wren Kennedy log_must $SVCADM disable $ISCSITGT_FMRI 2064d583b39bSJohn Wren Kennedy log_must $RM -f $ISCSITGTFILE 2065d583b39bSJohn Wren Kennedy fi 2066d583b39bSJohn Wren Kennedy} 2067d583b39bSJohn Wren Kennedy 2068d583b39bSJohn Wren Kennedy# 2069d583b39bSJohn Wren Kennedy# Close iSCSI initiator to target 2070d583b39bSJohn Wren Kennedy# $1 target hostname 2071d583b39bSJohn Wren Kennedy# 2072d583b39bSJohn Wren Kennedyfunction iscsi_iclose 2073d583b39bSJohn Wren Kennedy{ 2074d583b39bSJohn Wren Kennedy log_must $ISCSIADM modify discovery --sendtargets disable 2075d583b39bSJohn Wren Kennedy log_must $ISCSIADM remove discovery-address $(getipbyhost $1) 2076d583b39bSJohn Wren Kennedy $DEVFSADM -Cv 2077d583b39bSJohn Wren Kennedy} 2078d583b39bSJohn Wren Kennedy 2079d583b39bSJohn Wren Kennedy# 2080d583b39bSJohn Wren Kennedy# Get the available ZFS compression options 2081d583b39bSJohn Wren Kennedy# $1 option type zfs_set|zfs_compress 2082d583b39bSJohn Wren Kennedy# 2083d583b39bSJohn Wren Kennedyfunction get_compress_opts 2084d583b39bSJohn Wren Kennedy{ 2085d583b39bSJohn Wren Kennedy typeset COMPRESS_OPTS 2086d583b39bSJohn Wren Kennedy typeset GZIP_OPTS="gzip gzip-1 gzip-2 gzip-3 gzip-4 gzip-5 \ 2087d583b39bSJohn Wren Kennedy gzip-6 gzip-7 gzip-8 gzip-9" 2088d583b39bSJohn Wren Kennedy 2089d583b39bSJohn Wren Kennedy if [[ $1 == "zfs_compress" ]] ; then 2090d583b39bSJohn Wren Kennedy COMPRESS_OPTS="on lzjb" 2091d583b39bSJohn Wren Kennedy elif [[ $1 == "zfs_set" ]] ; then 2092d583b39bSJohn Wren Kennedy COMPRESS_OPTS="on off lzjb" 2093d583b39bSJohn Wren Kennedy fi 2094d583b39bSJohn Wren Kennedy typeset valid_opts="$COMPRESS_OPTS" 2095d583b39bSJohn Wren Kennedy $ZFS get 2>&1 | $GREP gzip >/dev/null 2>&1 2096d583b39bSJohn Wren Kennedy if [[ $? -eq 0 ]]; then 2097d583b39bSJohn Wren Kennedy valid_opts="$valid_opts $GZIP_OPTS" 2098d583b39bSJohn Wren Kennedy fi 2099d583b39bSJohn Wren Kennedy $ECHO "$valid_opts" 2100d583b39bSJohn Wren Kennedy} 2101d583b39bSJohn Wren Kennedy 2102d583b39bSJohn Wren Kennedy# 2103d583b39bSJohn Wren Kennedy# Verify zfs operation with -p option work as expected 2104d583b39bSJohn Wren Kennedy# $1 operation, value could be create, clone or rename 2105d583b39bSJohn Wren Kennedy# $2 dataset type, value could be fs or vol 2106d583b39bSJohn Wren Kennedy# $3 dataset name 2107d583b39bSJohn Wren Kennedy# $4 new dataset name 2108d583b39bSJohn Wren Kennedy# 2109d583b39bSJohn Wren Kennedyfunction verify_opt_p_ops 2110d583b39bSJohn Wren Kennedy{ 2111d583b39bSJohn Wren Kennedy typeset ops=$1 2112d583b39bSJohn Wren Kennedy typeset datatype=$2 2113d583b39bSJohn Wren Kennedy typeset dataset=$3 2114d583b39bSJohn Wren Kennedy typeset newdataset=$4 2115d583b39bSJohn Wren Kennedy 2116d583b39bSJohn Wren Kennedy if [[ $datatype != "fs" && $datatype != "vol" ]]; then 2117d583b39bSJohn Wren Kennedy log_fail "$datatype is not supported." 2118d583b39bSJohn Wren Kennedy fi 2119d583b39bSJohn Wren Kennedy 2120d583b39bSJohn Wren Kennedy # check parameters accordingly 2121d583b39bSJohn Wren Kennedy case $ops in 2122d583b39bSJohn Wren Kennedy create) 2123d583b39bSJohn Wren Kennedy newdataset=$dataset 2124d583b39bSJohn Wren Kennedy dataset="" 2125d583b39bSJohn Wren Kennedy if [[ $datatype == "vol" ]]; then 2126d583b39bSJohn Wren Kennedy ops="create -V $VOLSIZE" 2127d583b39bSJohn Wren Kennedy fi 2128d583b39bSJohn Wren Kennedy ;; 2129d583b39bSJohn Wren Kennedy clone) 2130d583b39bSJohn Wren Kennedy if [[ -z $newdataset ]]; then 2131d583b39bSJohn Wren Kennedy log_fail "newdataset should not be empty" \ 2132d583b39bSJohn Wren Kennedy "when ops is $ops." 2133d583b39bSJohn Wren Kennedy fi 2134d583b39bSJohn Wren Kennedy log_must datasetexists $dataset 2135d583b39bSJohn Wren Kennedy log_must snapexists $dataset 2136d583b39bSJohn Wren Kennedy ;; 2137d583b39bSJohn Wren Kennedy rename) 2138d583b39bSJohn Wren Kennedy if [[ -z $newdataset ]]; then 2139d583b39bSJohn Wren Kennedy log_fail "newdataset should not be empty" \ 2140d583b39bSJohn Wren Kennedy "when ops is $ops." 2141d583b39bSJohn Wren Kennedy fi 2142d583b39bSJohn Wren Kennedy log_must datasetexists $dataset 2143d583b39bSJohn Wren Kennedy log_mustnot snapexists $dataset 2144d583b39bSJohn Wren Kennedy ;; 2145d583b39bSJohn Wren Kennedy *) 2146d583b39bSJohn Wren Kennedy log_fail "$ops is not supported." 2147d583b39bSJohn Wren Kennedy ;; 2148d583b39bSJohn Wren Kennedy esac 2149d583b39bSJohn Wren Kennedy 2150d583b39bSJohn Wren Kennedy # make sure the upper level filesystem does not exist 2151d583b39bSJohn Wren Kennedy if datasetexists ${newdataset%/*} ; then 2152d583b39bSJohn Wren Kennedy log_must $ZFS destroy -rRf ${newdataset%/*} 2153d583b39bSJohn Wren Kennedy fi 2154d583b39bSJohn Wren Kennedy 2155d583b39bSJohn Wren Kennedy # without -p option, operation will fail 2156d583b39bSJohn Wren Kennedy log_mustnot $ZFS $ops $dataset $newdataset 2157d583b39bSJohn Wren Kennedy log_mustnot datasetexists $newdataset ${newdataset%/*} 2158d583b39bSJohn Wren Kennedy 2159d583b39bSJohn Wren Kennedy # with -p option, operation should succeed 2160d583b39bSJohn Wren Kennedy log_must $ZFS $ops -p $dataset $newdataset 2161d583b39bSJohn Wren Kennedy if ! datasetexists $newdataset ; then 2162d583b39bSJohn Wren Kennedy log_fail "-p option does not work for $ops" 2163d583b39bSJohn Wren Kennedy fi 2164d583b39bSJohn Wren Kennedy 2165d583b39bSJohn Wren Kennedy # when $ops is create or clone, redo the operation still return zero 2166d583b39bSJohn Wren Kennedy if [[ $ops != "rename" ]]; then 2167d583b39bSJohn Wren Kennedy log_must $ZFS $ops -p $dataset $newdataset 2168d583b39bSJohn Wren Kennedy fi 2169d583b39bSJohn Wren Kennedy 2170d583b39bSJohn Wren Kennedy return 0 2171d583b39bSJohn Wren Kennedy} 2172d583b39bSJohn Wren Kennedy 2173d583b39bSJohn Wren Kennedy# 2174d583b39bSJohn Wren Kennedy# Get configuration of pool 2175d583b39bSJohn Wren Kennedy# $1 pool name 2176d583b39bSJohn Wren Kennedy# $2 config name 2177d583b39bSJohn Wren Kennedy# 2178d583b39bSJohn Wren Kennedyfunction get_config 2179d583b39bSJohn Wren Kennedy{ 2180d583b39bSJohn Wren Kennedy typeset pool=$1 2181d583b39bSJohn Wren Kennedy typeset config=$2 2182d583b39bSJohn Wren Kennedy typeset alt_root 2183d583b39bSJohn Wren Kennedy 2184d583b39bSJohn Wren Kennedy if ! poolexists "$pool" ; then 2185d583b39bSJohn Wren Kennedy return 1 2186d583b39bSJohn Wren Kennedy fi 2187d583b39bSJohn Wren Kennedy alt_root=$($ZPOOL list -H $pool | $AWK '{print $NF}') 2188d583b39bSJohn Wren Kennedy if [[ $alt_root == "-" ]]; then 2189d583b39bSJohn Wren Kennedy value=$($ZDB -C $pool | $GREP "$config:" | $AWK -F: \ 2190d583b39bSJohn Wren Kennedy '{print $2}') 2191d583b39bSJohn Wren Kennedy else 2192d583b39bSJohn Wren Kennedy value=$($ZDB -e $pool | $GREP "$config:" | $AWK -F: \ 2193d583b39bSJohn Wren Kennedy '{print $2}') 2194d583b39bSJohn Wren Kennedy fi 2195d583b39bSJohn Wren Kennedy if [[ -n $value ]] ; then 2196d583b39bSJohn Wren Kennedy value=${value#'} 2197d583b39bSJohn Wren Kennedy value=${value%'} 2198d583b39bSJohn Wren Kennedy fi 2199d583b39bSJohn Wren Kennedy echo $value 2200d583b39bSJohn Wren Kennedy 2201d583b39bSJohn Wren Kennedy return 0 2202d583b39bSJohn Wren Kennedy} 2203d583b39bSJohn Wren Kennedy 2204d583b39bSJohn Wren Kennedy# 2205d583b39bSJohn Wren Kennedy# Privated function. Random select one of items from arguments. 2206d583b39bSJohn Wren Kennedy# 2207d583b39bSJohn Wren Kennedy# $1 count 2208d583b39bSJohn Wren Kennedy# $2-n string 2209d583b39bSJohn Wren Kennedy# 2210d583b39bSJohn Wren Kennedyfunction _random_get 2211d583b39bSJohn Wren Kennedy{ 2212d583b39bSJohn Wren Kennedy typeset cnt=$1 2213d583b39bSJohn Wren Kennedy shift 2214d583b39bSJohn Wren Kennedy 2215d583b39bSJohn Wren Kennedy typeset str="$@" 2216d583b39bSJohn Wren Kennedy typeset -i ind 2217d583b39bSJohn Wren Kennedy ((ind = RANDOM % cnt + 1)) 2218d583b39bSJohn Wren Kennedy 2219d583b39bSJohn Wren Kennedy typeset ret=$($ECHO "$str" | $CUT -f $ind -d ' ') 2220d583b39bSJohn Wren Kennedy $ECHO $ret 2221d583b39bSJohn Wren Kennedy} 2222d583b39bSJohn Wren Kennedy 2223d583b39bSJohn Wren Kennedy# 2224d583b39bSJohn Wren Kennedy# Random select one of item from arguments which include NONE string 2225d583b39bSJohn Wren Kennedy# 2226d583b39bSJohn Wren Kennedyfunction random_get_with_non 2227d583b39bSJohn Wren Kennedy{ 2228d583b39bSJohn Wren Kennedy typeset -i cnt=$# 2229d583b39bSJohn Wren Kennedy ((cnt =+ 1)) 2230d583b39bSJohn Wren Kennedy 2231d583b39bSJohn Wren Kennedy _random_get "$cnt" "$@" 2232d583b39bSJohn Wren Kennedy} 2233d583b39bSJohn Wren Kennedy 2234d583b39bSJohn Wren Kennedy# 2235d583b39bSJohn Wren Kennedy# Random select one of item from arguments which doesn't include NONE string 2236d583b39bSJohn Wren Kennedy# 2237d583b39bSJohn Wren Kennedyfunction random_get 2238d583b39bSJohn Wren Kennedy{ 2239d583b39bSJohn Wren Kennedy _random_get "$#" "$@" 2240d583b39bSJohn Wren Kennedy} 2241d583b39bSJohn Wren Kennedy 2242d583b39bSJohn Wren Kennedy# 2243d583b39bSJohn Wren Kennedy# Detect if the current system support slog 2244d583b39bSJohn Wren Kennedy# 2245d583b39bSJohn Wren Kennedyfunction verify_slog_support 2246d583b39bSJohn Wren Kennedy{ 2247d583b39bSJohn Wren Kennedy typeset dir=/tmp/disk.$$ 2248d583b39bSJohn Wren Kennedy typeset pool=foo.$$ 2249d583b39bSJohn Wren Kennedy typeset vdev=$dir/a 2250d583b39bSJohn Wren Kennedy typeset sdev=$dir/b 2251d583b39bSJohn Wren Kennedy 2252d583b39bSJohn Wren Kennedy $MKDIR -p $dir 2253d583b39bSJohn Wren Kennedy $MKFILE 64M $vdev $sdev 2254d583b39bSJohn Wren Kennedy 2255d583b39bSJohn Wren Kennedy typeset -i ret=0 2256d583b39bSJohn Wren Kennedy if ! $ZPOOL create -n $pool $vdev log $sdev > /dev/null 2>&1; then 2257d583b39bSJohn Wren Kennedy ret=1 2258d583b39bSJohn Wren Kennedy fi 2259d583b39bSJohn Wren Kennedy $RM -r $dir 2260d583b39bSJohn Wren Kennedy 2261d583b39bSJohn Wren Kennedy return $ret 2262d583b39bSJohn Wren Kennedy} 2263d583b39bSJohn Wren Kennedy 2264d583b39bSJohn Wren Kennedy# 2265d583b39bSJohn Wren Kennedy# The function will generate a dataset name with specific length 2266d583b39bSJohn Wren Kennedy# $1, the length of the name 2267d583b39bSJohn Wren Kennedy# $2, the base string to construct the name 2268d583b39bSJohn Wren Kennedy# 2269d583b39bSJohn Wren Kennedyfunction gen_dataset_name 2270d583b39bSJohn Wren Kennedy{ 2271d583b39bSJohn Wren Kennedy typeset -i len=$1 2272d583b39bSJohn Wren Kennedy typeset basestr="$2" 2273d583b39bSJohn Wren Kennedy typeset -i baselen=${#basestr} 2274d583b39bSJohn Wren Kennedy typeset -i iter=0 2275d583b39bSJohn Wren Kennedy typeset l_name="" 2276d583b39bSJohn Wren Kennedy 2277d583b39bSJohn Wren Kennedy if ((len % baselen == 0)); then 2278d583b39bSJohn Wren Kennedy ((iter = len / baselen)) 2279d583b39bSJohn Wren Kennedy else 2280d583b39bSJohn Wren Kennedy ((iter = len / baselen + 1)) 2281d583b39bSJohn Wren Kennedy fi 2282d583b39bSJohn Wren Kennedy while ((iter > 0)); do 2283d583b39bSJohn Wren Kennedy l_name="${l_name}$basestr" 2284d583b39bSJohn Wren Kennedy 2285d583b39bSJohn Wren Kennedy ((iter -= 1)) 2286d583b39bSJohn Wren Kennedy done 2287d583b39bSJohn Wren Kennedy 2288d583b39bSJohn Wren Kennedy $ECHO $l_name 2289d583b39bSJohn Wren Kennedy} 2290d583b39bSJohn Wren Kennedy 2291d583b39bSJohn Wren Kennedy# 2292d583b39bSJohn Wren Kennedy# Get cksum tuple of dataset 2293d583b39bSJohn Wren Kennedy# $1 dataset name 2294d583b39bSJohn Wren Kennedy# 2295d583b39bSJohn Wren Kennedy# sample zdb output: 2296d583b39bSJohn Wren Kennedy# Dataset data/test [ZPL], ID 355, cr_txg 2413856, 31.0K, 7 objects, rootbp 2297d583b39bSJohn Wren Kennedy# DVA[0]=<0:803046400:200> DVA[1]=<0:81199000:200> [L0 DMU objset] fletcher4 2298d583b39bSJohn Wren Kennedy# lzjb LE contiguous unique double size=800L/200P birth=2413856L/2413856P 2299d583b39bSJohn Wren Kennedy# fill=7 cksum=11ce125712:643a9c18ee2:125e25238fca0:254a3f74b59744 2300d583b39bSJohn Wren Kennedyfunction datasetcksum 2301d583b39bSJohn Wren Kennedy{ 2302d583b39bSJohn Wren Kennedy typeset cksum 2303d583b39bSJohn Wren Kennedy $SYNC 2304d583b39bSJohn Wren Kennedy cksum=$($ZDB -vvv $1 | $GREP "^Dataset $1 \[" | $GREP "cksum" \ 2305d583b39bSJohn Wren Kennedy | $AWK -F= '{print $7}') 2306d583b39bSJohn Wren Kennedy $ECHO $cksum 2307d583b39bSJohn Wren Kennedy} 2308d583b39bSJohn Wren Kennedy 2309d583b39bSJohn Wren Kennedy# 2310d583b39bSJohn Wren Kennedy# Get cksum of file 2311d583b39bSJohn Wren Kennedy# #1 file path 2312d583b39bSJohn Wren Kennedy# 2313d583b39bSJohn Wren Kennedyfunction checksum 2314d583b39bSJohn Wren Kennedy{ 2315d583b39bSJohn Wren Kennedy typeset cksum 2316d583b39bSJohn Wren Kennedy cksum=$($CKSUM $1 | $AWK '{print $1}') 2317d583b39bSJohn Wren Kennedy $ECHO $cksum 2318d583b39bSJohn Wren Kennedy} 2319d583b39bSJohn Wren Kennedy 2320d583b39bSJohn Wren Kennedy# 2321d583b39bSJohn Wren Kennedy# Get the given disk/slice state from the specific field of the pool 2322d583b39bSJohn Wren Kennedy# 2323d583b39bSJohn Wren Kennedyfunction get_device_state #pool disk field("", "spares","logs") 2324d583b39bSJohn Wren Kennedy{ 2325d583b39bSJohn Wren Kennedy typeset pool=$1 2326d583b39bSJohn Wren Kennedy typeset disk=${2#/dev/dsk/} 2327d583b39bSJohn Wren Kennedy typeset field=${3:-$pool} 2328d583b39bSJohn Wren Kennedy 2329d583b39bSJohn Wren Kennedy state=$($ZPOOL status -v "$pool" 2>/dev/null | \ 2330d583b39bSJohn Wren Kennedy $NAWK -v device=$disk -v pool=$pool -v field=$field \ 2331d583b39bSJohn Wren Kennedy 'BEGIN {startconfig=0; startfield=0; } 2332d583b39bSJohn Wren Kennedy /config:/ {startconfig=1} 2333d583b39bSJohn Wren Kennedy (startconfig==1) && ($1==field) {startfield=1; next;} 2334d583b39bSJohn Wren Kennedy (startfield==1) && ($1==device) {print $2; exit;} 2335d583b39bSJohn Wren Kennedy (startfield==1) && 2336d583b39bSJohn Wren Kennedy ($1==field || $1 ~ "^spares$" || $1 ~ "^logs$") {startfield=0}') 2337d583b39bSJohn Wren Kennedy echo $state 2338d583b39bSJohn Wren Kennedy} 2339d583b39bSJohn Wren Kennedy 2340d583b39bSJohn Wren Kennedy 2341d583b39bSJohn Wren Kennedy# 2342d583b39bSJohn Wren Kennedy# print the given directory filesystem type 2343d583b39bSJohn Wren Kennedy# 2344d583b39bSJohn Wren Kennedy# $1 directory name 2345d583b39bSJohn Wren Kennedy# 2346d583b39bSJohn Wren Kennedyfunction get_fstype 2347d583b39bSJohn Wren Kennedy{ 2348d583b39bSJohn Wren Kennedy typeset dir=$1 2349d583b39bSJohn Wren Kennedy 2350d583b39bSJohn Wren Kennedy if [[ -z $dir ]]; then 2351d583b39bSJohn Wren Kennedy log_fail "Usage: get_fstype <directory>" 2352d583b39bSJohn Wren Kennedy fi 2353d583b39bSJohn Wren Kennedy 2354d583b39bSJohn Wren Kennedy # 2355d583b39bSJohn Wren Kennedy # $ df -n / 2356d583b39bSJohn Wren Kennedy # / : ufs 2357d583b39bSJohn Wren Kennedy # 2358d583b39bSJohn Wren Kennedy $DF -n $dir | $AWK '{print $3}' 2359d583b39bSJohn Wren Kennedy} 2360d583b39bSJohn Wren Kennedy 2361d583b39bSJohn Wren Kennedy# 2362d583b39bSJohn Wren Kennedy# Given a disk, label it to VTOC regardless what label was on the disk 2363d583b39bSJohn Wren Kennedy# $1 disk 2364d583b39bSJohn Wren Kennedy# 2365d583b39bSJohn Wren Kennedyfunction labelvtoc 2366d583b39bSJohn Wren Kennedy{ 2367d583b39bSJohn Wren Kennedy typeset disk=$1 2368d583b39bSJohn Wren Kennedy if [[ -z $disk ]]; then 2369d583b39bSJohn Wren Kennedy log_fail "The disk name is unspecified." 2370d583b39bSJohn Wren Kennedy fi 2371d583b39bSJohn Wren Kennedy typeset label_file=/var/tmp/labelvtoc.$$ 2372d583b39bSJohn Wren Kennedy typeset arch=$($UNAME -p) 2373d583b39bSJohn Wren Kennedy 2374d583b39bSJohn Wren Kennedy if [[ $arch == "i386" ]]; then 2375d583b39bSJohn Wren Kennedy $ECHO "label" > $label_file 2376d583b39bSJohn Wren Kennedy $ECHO "0" >> $label_file 2377d583b39bSJohn Wren Kennedy $ECHO "" >> $label_file 2378d583b39bSJohn Wren Kennedy $ECHO "q" >> $label_file 2379d583b39bSJohn Wren Kennedy $ECHO "q" >> $label_file 2380d583b39bSJohn Wren Kennedy 2381d583b39bSJohn Wren Kennedy $FDISK -B $disk >/dev/null 2>&1 2382d583b39bSJohn Wren Kennedy # wait a while for fdisk finishes 2383d583b39bSJohn Wren Kennedy $SLEEP 60 2384d583b39bSJohn Wren Kennedy elif [[ $arch == "sparc" ]]; then 2385d583b39bSJohn Wren Kennedy $ECHO "label" > $label_file 2386d583b39bSJohn Wren Kennedy $ECHO "0" >> $label_file 2387d583b39bSJohn Wren Kennedy $ECHO "" >> $label_file 2388d583b39bSJohn Wren Kennedy $ECHO "" >> $label_file 2389d583b39bSJohn Wren Kennedy $ECHO "" >> $label_file 2390d583b39bSJohn Wren Kennedy $ECHO "q" >> $label_file 2391d583b39bSJohn Wren Kennedy else 2392d583b39bSJohn Wren Kennedy log_fail "unknown arch type" 2393d583b39bSJohn Wren Kennedy fi 2394d583b39bSJohn Wren Kennedy 2395d583b39bSJohn Wren Kennedy $FORMAT -e -s -d $disk -f $label_file 2396d583b39bSJohn Wren Kennedy typeset -i ret_val=$? 2397d583b39bSJohn Wren Kennedy $RM -f $label_file 2398d583b39bSJohn Wren Kennedy # 2399d583b39bSJohn Wren Kennedy # wait the format to finish 2400d583b39bSJohn Wren Kennedy # 2401d583b39bSJohn Wren Kennedy $SLEEP 60 2402d583b39bSJohn Wren Kennedy if ((ret_val != 0)); then 2403d583b39bSJohn Wren Kennedy log_fail "unable to label $disk as VTOC." 2404d583b39bSJohn Wren Kennedy fi 2405d583b39bSJohn Wren Kennedy 2406d583b39bSJohn Wren Kennedy return 0 2407d583b39bSJohn Wren Kennedy} 2408d583b39bSJohn Wren Kennedy 2409d583b39bSJohn Wren Kennedy# 2410d583b39bSJohn Wren Kennedy# check if the system was installed as zfsroot or not 2411d583b39bSJohn Wren Kennedy# return: 0 ture, otherwise false 2412d583b39bSJohn Wren Kennedy# 2413d583b39bSJohn Wren Kennedyfunction is_zfsroot 2414d583b39bSJohn Wren Kennedy{ 2415d583b39bSJohn Wren Kennedy $DF -n / | $GREP zfs > /dev/null 2>&1 2416d583b39bSJohn Wren Kennedy return $? 2417d583b39bSJohn Wren Kennedy} 2418d583b39bSJohn Wren Kennedy 2419d583b39bSJohn Wren Kennedy# 2420d583b39bSJohn Wren Kennedy# get the root filesystem name if it's zfsroot system. 2421d583b39bSJohn Wren Kennedy# 2422d583b39bSJohn Wren Kennedy# return: root filesystem name 2423d583b39bSJohn Wren Kennedyfunction get_rootfs 2424d583b39bSJohn Wren Kennedy{ 2425d583b39bSJohn Wren Kennedy typeset rootfs="" 2426d583b39bSJohn Wren Kennedy rootfs=$($AWK '{if ($2 == "/" && $3 == "zfs") print $1}' \ 2427d583b39bSJohn Wren Kennedy /etc/mnttab) 2428d583b39bSJohn Wren Kennedy if [[ -z "$rootfs" ]]; then 2429d583b39bSJohn Wren Kennedy log_fail "Can not get rootfs" 2430d583b39bSJohn Wren Kennedy fi 2431d583b39bSJohn Wren Kennedy $ZFS list $rootfs > /dev/null 2>&1 2432d583b39bSJohn Wren Kennedy if (($? == 0)); then 2433d583b39bSJohn Wren Kennedy $ECHO $rootfs 2434d583b39bSJohn Wren Kennedy else 2435d583b39bSJohn Wren Kennedy log_fail "This is not a zfsroot system." 2436d583b39bSJohn Wren Kennedy fi 2437d583b39bSJohn Wren Kennedy} 2438d583b39bSJohn Wren Kennedy 2439d583b39bSJohn Wren Kennedy# 2440d583b39bSJohn Wren Kennedy# get the rootfs's pool name 2441d583b39bSJohn Wren Kennedy# return: 2442d583b39bSJohn Wren Kennedy# rootpool name 2443d583b39bSJohn Wren Kennedy# 2444d583b39bSJohn Wren Kennedyfunction get_rootpool 2445d583b39bSJohn Wren Kennedy{ 2446d583b39bSJohn Wren Kennedy typeset rootfs="" 2447d583b39bSJohn Wren Kennedy typeset rootpool="" 2448d583b39bSJohn Wren Kennedy rootfs=$($AWK '{if ($2 == "/" && $3 =="zfs") print $1}' \ 2449d583b39bSJohn Wren Kennedy /etc/mnttab) 2450d583b39bSJohn Wren Kennedy if [[ -z "$rootfs" ]]; then 2451d583b39bSJohn Wren Kennedy log_fail "Can not get rootpool" 2452d583b39bSJohn Wren Kennedy fi 2453d583b39bSJohn Wren Kennedy $ZFS list $rootfs > /dev/null 2>&1 2454d583b39bSJohn Wren Kennedy if (($? == 0)); then 2455d583b39bSJohn Wren Kennedy rootpool=`$ECHO $rootfs | awk -F\/ '{print $1}'` 2456d583b39bSJohn Wren Kennedy $ECHO $rootpool 2457d583b39bSJohn Wren Kennedy else 2458d583b39bSJohn Wren Kennedy log_fail "This is not a zfsroot system." 2459d583b39bSJohn Wren Kennedy fi 2460d583b39bSJohn Wren Kennedy} 2461d583b39bSJohn Wren Kennedy 2462d583b39bSJohn Wren Kennedy# 2463d583b39bSJohn Wren Kennedy# Get the sub string from specified source string 2464d583b39bSJohn Wren Kennedy# 2465d583b39bSJohn Wren Kennedy# $1 source string 2466d583b39bSJohn Wren Kennedy# $2 start position. Count from 1 2467d583b39bSJohn Wren Kennedy# $3 offset 2468d583b39bSJohn Wren Kennedy# 2469d583b39bSJohn Wren Kennedyfunction get_substr #src_str pos offset 2470d583b39bSJohn Wren Kennedy{ 2471d583b39bSJohn Wren Kennedy typeset pos offset 2472d583b39bSJohn Wren Kennedy 2473d583b39bSJohn Wren Kennedy $ECHO $1 | \ 2474d583b39bSJohn Wren Kennedy $NAWK -v pos=$2 -v offset=$3 '{print substr($0, pos, offset)}' 2475d583b39bSJohn Wren Kennedy} 2476d583b39bSJohn Wren Kennedy 2477d583b39bSJohn Wren Kennedy# 2478d583b39bSJohn Wren Kennedy# Check if the given device is physical device 2479d583b39bSJohn Wren Kennedy# 2480d583b39bSJohn Wren Kennedyfunction is_physical_device #device 2481d583b39bSJohn Wren Kennedy{ 2482d583b39bSJohn Wren Kennedy typeset device=${1#/dev/dsk/} 2483d583b39bSJohn Wren Kennedy device=${device#/dev/rdsk/} 2484d583b39bSJohn Wren Kennedy 2485d583b39bSJohn Wren Kennedy $ECHO $device | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 2486d583b39bSJohn Wren Kennedy return $? 2487d583b39bSJohn Wren Kennedy} 2488d583b39bSJohn Wren Kennedy 2489d583b39bSJohn Wren Kennedy# 2490d583b39bSJohn Wren Kennedy# Get the directory path of given device 2491d583b39bSJohn Wren Kennedy# 2492d583b39bSJohn Wren Kennedyfunction get_device_dir #device 2493d583b39bSJohn Wren Kennedy{ 2494d583b39bSJohn Wren Kennedy typeset device=$1 2495d583b39bSJohn Wren Kennedy 2496d583b39bSJohn Wren Kennedy if ! $(is_physical_device $device) ; then 2497d583b39bSJohn Wren Kennedy if [[ $device != "/" ]]; then 2498d583b39bSJohn Wren Kennedy device=${device%/*} 2499d583b39bSJohn Wren Kennedy fi 2500d583b39bSJohn Wren Kennedy $ECHO $device 2501d583b39bSJohn Wren Kennedy else 2502d583b39bSJohn Wren Kennedy $ECHO "/dev/dsk" 2503d583b39bSJohn Wren Kennedy fi 2504d583b39bSJohn Wren Kennedy} 2505d583b39bSJohn Wren Kennedy 2506d583b39bSJohn Wren Kennedy# 2507d583b39bSJohn Wren Kennedy# Get the package name 2508d583b39bSJohn Wren Kennedy# 2509d583b39bSJohn Wren Kennedyfunction get_package_name 2510d583b39bSJohn Wren Kennedy{ 2511d583b39bSJohn Wren Kennedy typeset dirpath=${1:-$STC_NAME} 2512d583b39bSJohn Wren Kennedy 2513d583b39bSJohn Wren Kennedy echo "SUNWstc-${dirpath}" | /usr/bin/sed -e "s/\//-/g" 2514d583b39bSJohn Wren Kennedy} 2515d583b39bSJohn Wren Kennedy 2516d583b39bSJohn Wren Kennedy# 2517d583b39bSJohn Wren Kennedy# Get the word numbers from a string separated by white space 2518d583b39bSJohn Wren Kennedy# 2519d583b39bSJohn Wren Kennedyfunction get_word_count 2520d583b39bSJohn Wren Kennedy{ 2521d583b39bSJohn Wren Kennedy $ECHO $1 | $WC -w 2522d583b39bSJohn Wren Kennedy} 2523d583b39bSJohn Wren Kennedy 2524d583b39bSJohn Wren Kennedy# 2525d583b39bSJohn Wren Kennedy# To verify if the require numbers of disks is given 2526d583b39bSJohn Wren Kennedy# 2527d583b39bSJohn Wren Kennedyfunction verify_disk_count 2528d583b39bSJohn Wren Kennedy{ 2529d583b39bSJohn Wren Kennedy typeset -i min=${2:-1} 2530d583b39bSJohn Wren Kennedy 2531d583b39bSJohn Wren Kennedy typeset -i count=$(get_word_count "$1") 2532d583b39bSJohn Wren Kennedy 2533d583b39bSJohn Wren Kennedy if ((count < min)); then 2534d583b39bSJohn Wren Kennedy log_untested "A minimum of $min disks is required to run." \ 2535d583b39bSJohn Wren Kennedy " You specified $count disk(s)" 2536d583b39bSJohn Wren Kennedy fi 2537d583b39bSJohn Wren Kennedy} 2538d583b39bSJohn Wren Kennedy 2539d583b39bSJohn Wren Kennedyfunction ds_is_volume 2540d583b39bSJohn Wren Kennedy{ 2541d583b39bSJohn Wren Kennedy typeset type=$(get_prop type $1) 2542d583b39bSJohn Wren Kennedy [[ $type = "volume" ]] && return 0 2543d583b39bSJohn Wren Kennedy return 1 2544d583b39bSJohn Wren Kennedy} 2545d583b39bSJohn Wren Kennedy 2546d583b39bSJohn Wren Kennedyfunction ds_is_filesystem 2547d583b39bSJohn Wren Kennedy{ 2548d583b39bSJohn Wren Kennedy typeset type=$(get_prop type $1) 2549d583b39bSJohn Wren Kennedy [[ $type = "filesystem" ]] && return 0 2550d583b39bSJohn Wren Kennedy return 1 2551d583b39bSJohn Wren Kennedy} 2552d583b39bSJohn Wren Kennedy 2553d583b39bSJohn Wren Kennedyfunction ds_is_snapshot 2554d583b39bSJohn Wren Kennedy{ 2555d583b39bSJohn Wren Kennedy typeset type=$(get_prop type $1) 2556d583b39bSJohn Wren Kennedy [[ $type = "snapshot" ]] && return 0 2557d583b39bSJohn Wren Kennedy return 1 2558d583b39bSJohn Wren Kennedy} 2559d583b39bSJohn Wren Kennedy 2560d583b39bSJohn Wren Kennedy# 2561d583b39bSJohn Wren Kennedy# Check if Trusted Extensions are installed and enabled 2562d583b39bSJohn Wren Kennedy# 2563d583b39bSJohn Wren Kennedyfunction is_te_enabled 2564d583b39bSJohn Wren Kennedy{ 2565d583b39bSJohn Wren Kennedy $SVCS -H -o state labeld 2>/dev/null | $GREP "enabled" 2566d583b39bSJohn Wren Kennedy if (($? != 0)); then 2567d583b39bSJohn Wren Kennedy return 1 2568d583b39bSJohn Wren Kennedy else 2569d583b39bSJohn Wren Kennedy return 0 2570d583b39bSJohn Wren Kennedy fi 2571d583b39bSJohn Wren Kennedy} 2572f38cb554SJohn Wren Kennedy 2573f38cb554SJohn Wren Kennedy# Utility function to determine if a system has multiple cpus. 2574f38cb554SJohn Wren Kennedyfunction is_mp 2575f38cb554SJohn Wren Kennedy{ 2576*52244c09SJohn Wren Kennedy (($($PSRINFO | $WC -l) > 1)) 2577f38cb554SJohn Wren Kennedy} 2578f38cb554SJohn Wren Kennedy 2579f38cb554SJohn Wren Kennedy# Run the given command as the user provided. 2580f38cb554SJohn Wren Kennedyfunction user_run 2581f38cb554SJohn Wren Kennedy{ 2582f38cb554SJohn Wren Kennedy typeset user=$1 2583f38cb554SJohn Wren Kennedy shift 2584f38cb554SJohn Wren Kennedy 2585f38cb554SJohn Wren Kennedy eval \$SU \$user -c \"$@\" > /tmp/out 2>/tmp/err 2586f38cb554SJohn Wren Kennedy return $? 2587f38cb554SJohn Wren Kennedy} 2588*52244c09SJohn Wren Kennedy 2589*52244c09SJohn Wren Kennedy# 2590*52244c09SJohn Wren Kennedy# Check if the pool contains the specified vdevs 2591*52244c09SJohn Wren Kennedy# 2592*52244c09SJohn Wren Kennedy# $1 pool 2593*52244c09SJohn Wren Kennedy# $2..n <vdev> ... 2594*52244c09SJohn Wren Kennedy# 2595*52244c09SJohn Wren Kennedy# Return 0 if the vdevs are contained in the pool, 1 if any of the specified 2596*52244c09SJohn Wren Kennedy# vdevs is not in the pool, and 2 if pool name is missing. 2597*52244c09SJohn Wren Kennedy# 2598*52244c09SJohn Wren Kennedyfunction vdevs_in_pool 2599*52244c09SJohn Wren Kennedy{ 2600*52244c09SJohn Wren Kennedy typeset pool=$1 2601*52244c09SJohn Wren Kennedy typeset vdev 2602*52244c09SJohn Wren Kennedy 2603*52244c09SJohn Wren Kennedy if [[ -z $pool ]]; then 2604*52244c09SJohn Wren Kennedy log_note "Missing pool name." 2605*52244c09SJohn Wren Kennedy return 2 2606*52244c09SJohn Wren Kennedy fi 2607*52244c09SJohn Wren Kennedy 2608*52244c09SJohn Wren Kennedy shift 2609*52244c09SJohn Wren Kennedy 2610*52244c09SJohn Wren Kennedy typeset tmpfile=$($MKTEMP) 2611*52244c09SJohn Wren Kennedy $ZPOOL list -Hv "$pool" >$tmpfile 2612*52244c09SJohn Wren Kennedy for vdev in $@; do 2613*52244c09SJohn Wren Kennedy $GREP -w ${vdev##*/} $tmpfile >/dev/null 2>&1 2614*52244c09SJohn Wren Kennedy [[ $? -ne 0 ]] && return 1 2615*52244c09SJohn Wren Kennedy done 2616*52244c09SJohn Wren Kennedy 2617*52244c09SJohn Wren Kennedy $RM -f $tmpfile 2618*52244c09SJohn Wren Kennedy 2619*52244c09SJohn Wren Kennedy return 0; 2620*52244c09SJohn Wren Kennedy} 2621