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