|
| 1 | +#!/bin/bash |
| 2 | +#============================================================================ |
| 3 | +# Title : menu-asm |
| 4 | +# Description : Menu frontend for ASMdisks |
| 5 | +# Author : Bart Sjerps <bart@outrun.nl> |
| 6 | +# License : GPLv3+ |
| 7 | +# --------------------------------------------------------------------------- |
| 8 | + |
| 9 | +set -u |
| 10 | + |
| 11 | +die() { echo "$(basename $0): [die] $@" >&2 ; exit 10 ; } |
| 12 | +quit() { echo "$(basename $0): [quit] $@" ; exit 0 ; } |
| 13 | +msg() { echo "$(basename $0): [msg] $@" ; } |
| 14 | +err() { echo "$(basename $0): [err] $@" >&2 ; } |
| 15 | + |
| 16 | +source /usr/lib/lightmenu.bash &>/dev/null || die "lightmenu not installed" |
| 17 | + |
| 18 | +export BACKTITLE="ASMdisks menu on $(hostname)" |
| 19 | + |
| 20 | +#============================================================================ |
| 21 | +# Actions |
| 22 | +# --------------------------------------------------------------------------- |
| 23 | + |
| 24 | +view_asmdisks() { |
| 25 | + messagebox -fresize --margin 2 --height2 0 --hline "Use \Z1PgUP PgDOWN\Zn to scroll" \ |
| 26 | + --title "ASM disks" "$(asm -t disks | expand -t 10,20,28)" |
| 27 | +} |
| 28 | + |
| 29 | +view_asmlist() { |
| 30 | + messagebox --margin 5 -fresize --hline "Use \Z1PgUP PgDOWN\Zn to scroll" \ |
| 31 | + --title "ASM list" "$(asm list | expand -t 10,20,30,40)" |
| 32 | +} |
| 33 | + |
| 34 | +view_asmavailable() { |
| 35 | + messagebox --margin 5 -fresize --hline "Use \Z1PgUP PgDOWN\Zn to scroll" \ |
| 36 | + --title "ASM candidates" "$(asm -t disks | awk '$5=="-" && $4 == "blank" {print $0}')" |
| 37 | +} |
| 38 | + |
| 39 | +view_asmadd() { |
| 40 | + local -a volname disks |
| 41 | + local NAME= |
| 42 | + |
| 43 | + for c in $(seq 1 100); do |
| 44 | + NAME=$(printf "vol%s" $c) |
| 45 | + if [ ! -b /dev/oracleasm/$NAME ] ; then break ; fi |
| 46 | + done |
| 47 | + append volname "Volume /dev/oracleasm/" "$NAME" |
| 48 | + |
| 49 | + for line in $(asm -t disks | awk '$5=="-" && ( $4=="blank" || $4=="asm" ) {print $1","$4"-"$3}'); do |
| 50 | + append disks "${line%%,*}" "${line#*,}" DEVICE |
| 51 | + done |
| 52 | + result=$(ldialog formlist --height2 12 --formx 24 --title "Add ASM volume" --title2 "Select device" volname disks) || return $? |
| 53 | + |
| 54 | + volname=$(awk -F'\t' 'NR==1 && NF==1 {print $1}' <<< "$result") |
| 55 | + devname=$(awk -F'\t' 'NR==2 && NF==2 {print $2}' <<< "$result") |
| 56 | + |
| 57 | + runcommand asm createdisk $volname $devname |
| 58 | +} |
| 59 | + |
| 60 | +# TBD: update lightmenu.bash first to do listform |
| 61 | +view_asmrename() { |
| 62 | + local vol desc |
| 63 | + local -a disks |
| 64 | + status="Be careful when deleting ASM volumes still in use!" |
| 65 | + |
| 66 | + IFS=$'\n' ; for disk in $(asm -t list | asm -t list | awk -F'\t' '{print $1":"$2"-"$3"-"$4"G"}') |
| 67 | + do |
| 68 | + vol=$(echo $disk | cut -d: -f1) |
| 69 | + desc=$(echo $disk | cut -d: -f2- | tr '-' ' ') |
| 70 | + append disks "$vol" "$desc" VOLNAME |
| 71 | + done |
| 72 | + unset IFS |
| 73 | + result=$(ldialog list --title "Rename ASM volume" --status "$status" disks) || return $? |
| 74 | + # runcommand asm deletedisk $result |
| 75 | +} |
| 76 | + |
| 77 | +view_asmdel() { |
| 78 | + local vol desc |
| 79 | + local -a disks |
| 80 | + status="Be careful when deleting ASM volumes still in use!" |
| 81 | + |
| 82 | + IFS=$'\n' ; for disk in $(asm -t list | asm -t list | awk -F'\t' '{print $1":"$2"-"$3"-"$4"G"}') |
| 83 | + do |
| 84 | + vol=$(echo $disk | cut -d: -f1) |
| 85 | + desc=$(echo $disk | cut -d: -f2- | tr '-' ' ') |
| 86 | + append disks "$vol" "$desc" VOLNAME |
| 87 | + done |
| 88 | + unset IFS |
| 89 | + result=$(ldialog list --title "Delete ASM volume" --status "$status" disks) || return $? |
| 90 | + runcommand asm deletedisk $result |
| 91 | +} |
| 92 | + |
| 93 | +view_asmwipe() { |
| 94 | + local -a disks |
| 95 | + local dev disklist d |
| 96 | + status="\Z1WARNING WARNING WARNING\Zn\n" |
| 97 | + status+="Wiping a disk may lead to data loss! Make sure the disk you wipe has no important data on it!" |
| 98 | + |
| 99 | + disklist="$(asm -t disks)" |
| 100 | + |
| 101 | + for line in $(ls -d /sys/block/sd* ) |
| 102 | + do |
| 103 | + dev=/dev/${line##*/} |
| 104 | + # TBD: UPDATE for detected bootdisk |
| 105 | + [[ "$dev" == "/dev/sda" ]] && continue |
| 106 | + d=$(awk -F'\t' -v DEV=$dev '$1==DEV {print $2,$4,$3}' <<< "$disklist") |
| 107 | + append disks "${dev:-x}" "$d" |
| 108 | + done |
| 109 | + result=$(ldialog list --height2 6 --title "Wipe disk label" --title2 "\Z1Warning\Zn" --status "$status" disks) |
| 110 | + runcommand wipedisk -f $result |
| 111 | +} |
| 112 | +#============================================================================ |
| 113 | +# Menus |
| 114 | +# --------------------------------------------------------------------------- |
| 115 | +storagemenu() { |
| 116 | + local -a items |
| 117 | + |
| 118 | + [[ "$(scsi_id --whitelisted /dev/sda)" == "" ]] && SCSI=MISSING || SCSI=OK |
| 119 | + status="$(printf 'UUID: %s' $SCSI)" |
| 120 | + append items Disks "Show all disks" view_asmdisks |
| 121 | + append items Volumes "Show ASM volumes" view_asmlist |
| 122 | + append items Available "Show available disks" view_asmavailable |
| 123 | + append items Rescan "Rescan SCSI stack for new disks" runcommand asm rescan |
| 124 | + append items Add "Add volume" view_asmadd |
| 125 | + append items Delete "Delete volume" view_asmdel |
| 126 | + append items Import "Import ASM volumes" runcommand asm import |
| 127 | + append items Wipe "Wipe disk label" view_asmwipe |
| 128 | + |
| 129 | + lightmenu --title "ASM Storage configuration" --cancel Quit items |
| 130 | + rc=$? |
| 131 | + case $rc in |
| 132 | + 253) ;; |
| 133 | + *) return $rc ;; |
| 134 | + esac |
| 135 | +} |
| 136 | + |
| 137 | +lightmenu storagemenu |
0 commit comments