Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | #------------------------------------------------------------------------------- |
| 3 | #Created by helmuthdu mailto: helmuthdu[at]gmail[dot]com |
| 4 | #Contribution: flexiondotorg |
| 5 | #------------------------------------------------------------------------------- |
| 6 | #This program is free software: you can redistribute it and/or modify |
| 7 | #it under the terms of the GNU General Public License as published by |
| 8 | #the Free Software Foundation, either version 3 of the License, or |
| 9 | #(at your option) any later version. |
| 10 | # |
| 11 | #This program is distributed in the hope that it will be useful, |
| 12 | #but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | #GNU General Public License for more details. |
| 15 | # |
| 16 | #You should have received a copy of the GNU General Public License |
| 17 | #along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 18 | #------------------------------------------------------------------------------- |
| 19 | # Run this script after your first boot with archlinux (as root) |
| 20 | |
| 21 | #VARIABLES {{{ |
| 22 | checklist=( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) |
| 23 | # COLORS {{{ |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 24 | Bold=$(tput bold) |
Helmuth Saatkamp | 4bb9b7e | 2013-04-29 22:11:41 -0300 | [diff] [blame] | 25 | Underline=$(tput sgr 0 1) |
| 26 | Reset=$(tput sgr0) |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 27 | # Regular Colors |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 28 | Red=$(tput setaf 1) |
| 29 | Green=$(tput setaf 2) |
| 30 | Yellow=$(tput setaf 3) |
| 31 | Blue=$(tput setaf 4) |
| 32 | Purple=$(tput setaf 5) |
| 33 | Cyan=$(tput setaf 6) |
| 34 | White=$(tput setaf 7) |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 35 | # Bold |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 36 | BRed=${Bold}$(tput setaf 1) |
| 37 | BGreen=${Bold}$(tput setaf 2) |
| 38 | BYellow=${Bold}$(tput setaf 3) |
| 39 | BBlue=${Bold}$(tput setaf 4) |
| 40 | BPurple=${Bold}$(tput setaf 5) |
| 41 | BCyan=${Bold}$(tput setaf 6) |
| 42 | BWhite=${Bold}$(tput setaf 7) |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 43 | #}}} |
| 44 | # PROMPT {{{ |
| 45 | prompt1="Enter your option: " |
| 46 | prompt2="Enter n° of options (ex: 1 2 3 or 1-3): " |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 47 | prompt3="You have to manual enter the following commands, then press ${BYellow}ctrl+d${Reset} or type ${BYellow}exit${Reset}:" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 48 | #}}} |
| 49 | # EDITOR {{{ |
| 50 | AUTOMATIC_MODE=0 |
| 51 | if [[ -f /usr/bin/vim ]]; then |
| 52 | EDITOR="vim" |
| 53 | elif [[ -z $EDITOR ]]; then |
| 54 | EDITOR="nano" |
| 55 | fi |
| 56 | #}}} |
| 57 | # DESKTOP ENVIRONMENT |
| 58 | CINNAMON=0 |
| 59 | GNOME=0 |
| 60 | KDE=0 |
| 61 | # ARCHITECTURE |
| 62 | ARCHI=`uname -m` |
| 63 | UEFI=0 |
| 64 | # AUR PACKAGE |
Helmuth | 222679e | 2013-08-14 10:43:39 -0300 | [diff] [blame] | 65 | AUR=`echo -e "(${BPurple}aur${Reset})"` |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 66 | #CURRENT DIRECTORY |
| 67 | AUI_DIR=`pwd` |
| 68 | MOUNTPOINT="/mnt" |
| 69 | # VERBOSE MODE |
| 70 | [[ $1 == -v || $1 == --verbose ]] && VERBOSE_MODE=1 || VERBOSE_MODE=0 |
| 71 | # LOG FILE |
| 72 | LOG="${AUI_DIR}/`basename ${0}`_error.log" |
| 73 | [[ -f $LOG ]] && rm -f $LOG |
Helmuth | 2f259c5 | 2013-07-18 15:47:19 -0300 | [diff] [blame] | 74 | PKG_MANAGER="pacman" |
| 75 | PKG="" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 76 | PKG_FAIL="${AUI_DIR}/`basename ${0}`_pkg_fail_list.log" |
| 77 | [[ -f $PKG_FAIL ]] && rm -f $PKG_FAIL |
| 78 | # CONNECTION CHECK |
| 79 | XPINGS=0 |
| 80 | #MISC |
| 81 | SPIN="/-\|" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 82 | AUTOMATIC_MODE=0 |
| 83 | #}}} |
| 84 | #COMMON FUNCTIONS {{{ |
| 85 | error_msg() { #{{{ |
| 86 | local MSG="${1}" |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 87 | echo -e "${MSG}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 88 | exit 1 |
| 89 | } #}}} |
| 90 | cecho() { #{{{ |
| 91 | echo -e "$1" |
| 92 | echo -e "$1" >>"$LOG" |
| 93 | tput sgr0; |
| 94 | } #}}} |
| 95 | ncecho() { #{{{ |
| 96 | echo -ne "$1" |
| 97 | echo -ne "$1" >>"$LOG" |
| 98 | tput sgr0 |
| 99 | } #}}} |
| 100 | spinny() { #{{{ |
| 101 | echo -ne "\b${SPIN:i++%${#SPIN}:1}" |
| 102 | } #}}} |
| 103 | progress() { #{{{ |
| 104 | ncecho " "; |
| 105 | while true; do |
| 106 | kill -0 $pid 2> /dev/null; |
| 107 | if [[ $? == 0 ]]; then |
| 108 | spinny |
| 109 | sleep 0.25 |
| 110 | else |
| 111 | ncecho "\b\b"; |
| 112 | wait $pid |
| 113 | retcode=$? |
Helmuth Saatkamp | 35f4862 | 2013-05-06 23:55:19 -0300 | [diff] [blame] | 114 | echo -ne "$pid's retcode: $retcode" >> $LOG |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 115 | if [[ $retcode == 0 ]] || [[ $retcode == 255 ]]; then |
| 116 | cecho success |
| 117 | else |
| 118 | cecho failed |
Helmuth | 222679e | 2013-08-14 10:43:39 -0300 | [diff] [blame] | 119 | echo -e "$PKG" >> $PKG_FAIL |
Helmuth | 6633a43 | 2013-08-20 15:07:18 -0300 | [diff] [blame] | 120 | tail -n 15 $LOG |
| 121 | read -p "ERROR! Continue install [y/N]?" OPTION |
| 122 | [[ $OPTION != y ]] && exit 1 |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 123 | fi |
| 124 | break |
| 125 | fi |
| 126 | done |
| 127 | } #}}} |
Helmuth | 19c9e39 | 2013-08-30 15:08:47 -0300 | [diff] [blame] | 128 | check_boot_system() { # {{{ |
| 129 | if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then |
| 130 | modprobe -r -q efivars || true # if MAC |
| 131 | else |
| 132 | modprobe -q efivars # all others |
| 133 | fi |
| 134 | if [[ -d "/sys/firmware/efi/vars/" ]]; then |
| 135 | UEFI=1 |
| 136 | echo "UEFI Mode detected" |
| 137 | else |
| 138 | UEFI=0 |
| 139 | echo "BIOS Mode detected" |
| 140 | fi |
| 141 | } |
| 142 | #}}} |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 143 | check_root() { #{{{ |
Helmuth | 9c43ed4 | 2013-08-14 11:43:53 -0300 | [diff] [blame] | 144 | if [[ "$(id -u)" != "0" ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 145 | error_msg "ERROR! You must execute the script as the 'root' user." |
| 146 | fi |
| 147 | } #}}} |
| 148 | check_user() { #{{{ |
Helmuth | 9c43ed4 | 2013-08-14 11:43:53 -0300 | [diff] [blame] | 149 | if [[ "$(id -u)" == "0" ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 150 | error_msg "ERROR! You must execute the script as a normal user." |
| 151 | fi |
| 152 | } #}}} |
| 153 | check_archlinux() { #{{{ |
Helmuth | 9c43ed4 | 2013-08-14 11:43:53 -0300 | [diff] [blame] | 154 | if [[ ! -e /etc/arch-release ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 155 | error_msg "ERROR! You must execute the script on Arch Linux." |
| 156 | fi |
| 157 | } #}}} |
| 158 | check_hostname() { #{{{ |
Helmuth | 9c43ed4 | 2013-08-14 11:43:53 -0300 | [diff] [blame] | 159 | if [[ `echo ${HOSTNAME} | sed 's/ //g'` == "" ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 160 | error_msg "ERROR! Hostname is not configured." |
| 161 | fi |
| 162 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 163 | check_pacman_blocked() { #{{{ |
Helmuth | 9c43ed4 | 2013-08-14 11:43:53 -0300 | [diff] [blame] | 164 | if [[ -f /var/lib/pacman/db.lck ]]; then |
Helmuth | 6633a43 | 2013-08-20 15:07:18 -0300 | [diff] [blame] | 165 | error_msg "ERROR! Pacman is blocked. \nIf not running remove /var/lib/pacman/db.lck." |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 166 | fi |
| 167 | } #}}} |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 168 | check_domainname() { #{{{ |
| 169 | DOMAINNAME=`echo ${HOSTNAME} | cut -d'.' -f2- | sed 's/ //g'` |
| 170 | |
| 171 | # Hmm, still no domain name. Keep looking... |
| 172 | if [[ "${DOMAINNAME}" == "" ]]; then |
| 173 | DOMAINNAME=`grep domain /etc/resolv.conf | sed 's/domain //g' | sed 's/ //g'` |
| 174 | fi |
| 175 | |
| 176 | # OK, give up. |
| 177 | if [[ "${DOMAINNAME}" == "" ]]; then |
| 178 | error_msg "ERROR! Domain name is not configured." |
| 179 | fi |
| 180 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 181 | check_connection(){ #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 182 | XPINGS=$(( $XPINGS + 1 )) |
Helmuth | 39b5254 | 2013-08-09 12:18:52 -0300 | [diff] [blame] | 183 | ping_gw() { |
Helmuth | 2307e5d | 2013-08-09 12:23:42 -0300 | [diff] [blame] | 184 | IP_ADDR=`ip r | grep default | cut -d ' ' -f 3` |
| 185 | [[ -z $IP_ADDR ]] && IP_ADDR="8.8.8.8" |
| 186 | ping -q -w 1 -c 1 ${IP_ADDR} > /dev/null && return 1 || return 0 |
Helmuth | 39b5254 | 2013-08-09 12:18:52 -0300 | [diff] [blame] | 187 | } |
Helmuth Saatkamp | 65b9afe | 2013-05-30 11:28:47 -0300 | [diff] [blame] | 188 | WIRED_DEV=`ip link | grep enp | awk '{print $2}'| sed 's/://'` |
Helmuth | 39b5254 | 2013-08-09 12:18:52 -0300 | [diff] [blame] | 189 | WIRELESS_DEV=`ip link | grep wlp | awk '{print $2}'| sed 's/://'` |
| 190 | if ping_gw; then |
| 191 | print_warning "ERROR! Connection not Found." |
| 192 | print_info "Network Setup" |
| 193 | conn_type_list=("Wired Automatic" "Wired Manual" "Wireless") |
| 194 | PS3="$prompt1" |
| 195 | select CONNECTION_TYPE in "${conn_type_list[@]}"; do |
| 196 | case "$REPLY" in |
| 197 | 1) |
| 198 | systemctl start dhcpcd@${WIRED_DEV}.service |
| 199 | break |
| 200 | ;; |
| 201 | 2) |
| 202 | systemctl stop dhcpcd@${WIRED_DEV}.service |
| 203 | read -p "IP Address: " IP_ADDR |
| 204 | read -p "Submask: " SUBMASK |
| 205 | read -p "Gateway: " GATEWAY |
| 206 | ip link set ${WIRED_DEV} up |
| 207 | ip addr add ${IP_ADDR}/${SUBMASK} dev ${WIRED_DEV} |
| 208 | ip route add default via ${GATEWAY} |
| 209 | $EDITOR /etc/resolv.conf |
| 210 | break |
| 211 | ;; |
| 212 | 3) |
| 213 | ip link set ${WIRELESS_DEV} up |
| 214 | wifi-menu ${WIRELESS_DEV} |
| 215 | break |
| 216 | ;; |
| 217 | *) |
| 218 | invalid_option |
| 219 | ;; |
| 220 | esac |
| 221 | done |
| 222 | if [[ $XPINGS -gt 2 ]]; then |
| 223 | print_warning "Can't establish connection. exiting..." |
| 224 | exit 1 |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 225 | fi |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 226 | check_connection |
| 227 | fi |
| 228 | } #}}} |
| 229 | check_vga() { #{{{ |
| 230 | # Determine video chipset - only Intel, ATI and nvidia are supported by this script" |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 231 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Detecting video chipset " |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 232 | if [[ -n $(dmidecode --type 1 | grep VirtualBox) ]]; then |
| 233 | cecho Virtualbox |
| 234 | VIDEO_DRIVER="virtualbox" |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 235 | elif [[ -f /sys/kernel/debug/dri/0/vbios.rom ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 236 | cecho Nvidia |
| 237 | read_input_text "Install NVIDIA proprietary driver" $PROPRIETARY_DRIVER |
| 238 | if [[ $OPTION == y ]]; then |
| 239 | VIDEO_DRIVER="nvidia" |
| 240 | else |
| 241 | VIDEO_DRIVER="nouveau" |
| 242 | fi |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 243 | elif [[ -f /sys/kernel/debug/dri/0/i915_capabilities ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 244 | cecho Intel |
| 245 | VIDEO_DRIVER="intel" |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 246 | elif [[ -f /sys/kernel/debug/dri/0/radeon_pm_info || -f /sys/kernel/debug/dri/0/radeon_sa_info ]]; then |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 247 | cecho AMD/ATI |
| 248 | read_input_text "Install ATI proprietary driver" $PROPRIETARY_DRIVER |
| 249 | if [[ $OPTION == y ]]; then |
| 250 | VIDEO_DRIVER="catalyst" |
| 251 | else |
| 252 | VIDEO_DRIVER="ati" |
| 253 | fi |
| 254 | else |
| 255 | cecho VESA |
| 256 | VIDEO_DRIVER="vesa" |
| 257 | fi |
| 258 | OPTION="y" |
| 259 | [[ $VIDEO_DRIVER == intel || $VIDEO_DRIVER == vesa ]] && read -p "Confirm video driver: $VIDEO_DRIVER [Y/n]" OPTION |
| 260 | if [[ $OPTION == n ]]; then |
| 261 | read -p "Type your video driver [ex: sis, fbdev, modesetting]: " VIDEO_DRIVER |
| 262 | fi |
| 263 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 264 | read_input() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 265 | if [[ $AUTOMATIC_MODE -eq 1 ]]; then |
| 266 | OPTION=$1 |
| 267 | else |
| 268 | read -p "$prompt1" OPTION |
| 269 | fi |
| 270 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 271 | read_input_text() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 272 | if [[ $AUTOMATIC_MODE -eq 1 ]]; then |
| 273 | OPTION=$2 |
| 274 | else |
| 275 | read -p "$1 [y/N]: " OPTION |
| 276 | echo "" |
| 277 | fi |
| 278 | OPTION=`echo "$OPTION" | tr '[:upper:]' '[:lower:]'` |
| 279 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 280 | read_input_options() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 281 | local line |
| 282 | local packages |
| 283 | if [[ $AUTOMATIC_MODE -eq 1 ]]; then |
| 284 | array=("$1") |
| 285 | else |
| 286 | read -p "$prompt2" OPTION |
| 287 | array=("$OPTION") |
| 288 | fi |
| 289 | for line in ${array[@]/,/ }; do |
| 290 | if [[ ${line/-/} != $line ]]; then |
| 291 | for ((i=${line%-*}; i<=${line#*-}; i++)); do |
| 292 | packages+=($i); |
| 293 | done |
| 294 | else |
| 295 | packages+=($line) |
| 296 | fi |
| 297 | done |
| 298 | OPTIONS=("${packages[@]}") |
| 299 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 300 | print_line() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 301 | printf "%$(tput cols)s\n"|tr ' ' '-' |
| 302 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 303 | print_title() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 304 | clear |
| 305 | print_line |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 306 | echo -e "# ${Bold}$1${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 307 | print_line |
| 308 | echo "" |
| 309 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 310 | print_info() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 311 | #Console width number |
| 312 | T_COLS=`tput cols` |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 313 | echo -e "${Bold}$1${Reset}\n" | fold -sw $(( $T_COLS - 18 )) | sed 's/^/\t/' |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 314 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 315 | print_warning() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 316 | #Console width number |
| 317 | T_COLS=`tput cols` |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 318 | echo -e "${BRed}$1${Reset}\n" | fold -sw $(( $T_COLS - 1 )) |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 319 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 320 | start_module() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 321 | modprobe $1 |
| 322 | } #}}} |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 323 | add_module() { #{{{ |
| 324 | #check if the number of arguments is less then 2 |
| 325 | for MODULE in $1; do |
| 326 | [[ $# -lt 2 ]] && MODULE_NAME="$MODULE" || MODULE_NAME="$2"; |
| 327 | echo "$MODULE" >> /etc/modules-load.d/$MODULE_NAME.conf |
| 328 | start_module "$MODULE" |
| 329 | done |
| 330 | } #}}} |
| 331 | add_repository() { #{{{ |
| 332 | REPO=${1} |
| 333 | URL=${2} |
| 334 | |
| 335 | CHECK_REPO=`grep -F "${REPO}" /etc/pacman.conf` |
| 336 | if [[ -z $CHECK_REPO ]]; then |
| 337 | echo -e "\n[${REPO}]\nSigLevel = Optional TrustAll\nServer = ${URL}" >> /etc/pacman.conf |
| 338 | system_update |
| 339 | fi |
| 340 | } #}}} |
| 341 | add_line() { #{{{ |
| 342 | ADD_LINE=${1} |
| 343 | FILEPATH=${2} |
| 344 | |
| 345 | CHECK_LINE=`grep -F "${ADD_LINE}" ${FILEPATH}` |
| 346 | [[ -z $CHECK_LINE ]] && echo "${ADD_LINE}" >> ${FILEPATH} |
| 347 | } #}}} |
| 348 | replace_line() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 349 | SEARCH=${1} |
| 350 | REPLACE=${2} |
| 351 | FILEPATH=${3} |
| 352 | FILEBASE=`basename ${3}` |
| 353 | |
| 354 | sed -e "s/${SEARCH}/${REPLACE}/" ${FILEPATH} > /tmp/${FILEBASE} 2>"$LOG" |
| 355 | if [[ ${?} -eq 0 ]]; then |
| 356 | mv /tmp/${FILEBASE} ${FILEPATH} |
| 357 | else |
| 358 | cecho "failed: ${SEARCH} - ${FILEPATH}" |
| 359 | fi |
| 360 | } #}}} |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 361 | update_early_modules() { #{{{ |
| 362 | local NEW_MODULE=${1} |
| 363 | local OLD_ARRAY=`egrep ^MODULES= /etc/mkinitcpio.conf` |
| 364 | |
| 365 | if [[ -n ${NEW_MODULE} ]]; then |
| 366 | # Determine if the new module is already listed. |
| 367 | _EXISTS=`echo ${OLD_ARRAY} | grep ${NEW_MODULE}` |
| 368 | if [ $? -eq 1 ]; then |
| 369 | |
| 370 | source /etc/mkinitcpio.conf |
| 371 | if [[ -z ${MODULES} ]]; then |
| 372 | NEW_MODULES="${NEW_MODULE}" |
| 373 | else |
| 374 | NEW_MODULES="${MODULES} ${NEW_MODULE}" |
| 375 | fi |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 376 | replace_line "MODULES=\"${MODULES}\"" "MODULES=\"${NEW_MODULES}\"" /etc/mkinitcpio.conf |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 377 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Rebuilding init " |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 378 | mkinitcpio -p linux >>"$LOG" 2>&1 & |
| 379 | pid=$!;progress $pid |
| 380 | fi |
| 381 | fi |
| 382 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 383 | is_package_installed() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 384 | #check if a package is already installed |
| 385 | for PKG in $1; do |
| 386 | pacman -Q $PKG &> /dev/null && return 0; |
| 387 | done |
| 388 | return 1 |
| 389 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 390 | checkbox() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 391 | #display [X] or [ ] |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 392 | [[ "$1" -eq 1 ]] && echo -e "${BBlue}[${Reset}${Bold}X${BBlue}]${Reset}" || echo -e "${BBlue}[ ${BBlue}]${Reset}"; |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 393 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 394 | checkbox_package() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 395 | #check if [X] or [ ] |
| 396 | is_package_installed "$1" && checkbox 1 || checkbox 0 |
| 397 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 398 | aui_download_packages() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 399 | for PKG in $1; do |
| 400 | #exec command as user instead of root |
| 401 | su - ${USER_NAME} -c " |
| 402 | [[ ! -d aui_packages ]] && mkdir aui_packages |
| 403 | cd aui_packages |
| 404 | curl -o $PKG.tar.gz https://aur.archlinux.org/packages/${PKG:0:2}/$PKG/$PKG.tar.gz |
| 405 | tar zxvf $PKG.tar.gz |
| 406 | rm $PKG.tar.gz |
| 407 | cd $PKG |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 408 | makepkg -csi --noconfirm |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 409 | " |
| 410 | done |
| 411 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 412 | aur_package_install() { #{{{ |
Helmuth | 1712c34 | 2013-09-19 11:22:46 -0300 | [diff] [blame] | 413 | su - ${USER_NAME} -c "sudo -v" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 414 | #install package from aur |
| 415 | for PKG in $1; do |
| 416 | if ! is_package_installed "${PKG}" ; then |
| 417 | if [[ $AUTOMATIC_MODE -eq 1 ]]; then |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 418 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Installing ${AUR} ${Bold}${PKG}${Reset} " |
Helmuth | 2f259c5 | 2013-07-18 15:47:19 -0300 | [diff] [blame] | 419 | su - ${USER_NAME} -c "${AUR_PKG_MANAGER} --noconfirm -S ${PKG}" >>"$LOG" 2>&1 & |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 420 | pid=$!;progress $pid |
| 421 | else |
Helmuth | 2f259c5 | 2013-07-18 15:47:19 -0300 | [diff] [blame] | 422 | su - ${USER_NAME} -c "${AUR_PKG_MANAGER} -S ${PKG}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 423 | fi |
| 424 | else |
| 425 | if [[ $VERBOSE_MODE -eq 0 ]]; then |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 426 | cecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Installing ${AUR} ${Bold}${PKG}${Reset} success" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 427 | else |
| 428 | echo -e "Warning: ${PKG} is up to date --skipping" |
| 429 | fi |
| 430 | fi |
| 431 | done |
| 432 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 433 | package_install() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 434 | #install packages using pacman |
| 435 | if [[ $AUTOMATIC_MODE -eq 1 || $VERBOSE_MODE -eq 0 ]]; then |
| 436 | for PKG in ${1}; do |
| 437 | PKG_REPO=`pacman -Sp --print-format %r ${PKG} | uniq | sed '1!d'` |
| 438 | case $PKG_REPO in |
| 439 | "core") |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 440 | PKG_REPO="${BRed}${PKG_REPO}${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 441 | ;; |
| 442 | "extra") |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 443 | PKG_REPO="${BYellow}${PKG_REPO}${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 444 | ;; |
| 445 | "community") |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 446 | PKG_REPO="${BGreen}${PKG_REPO}${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 447 | ;; |
| 448 | "multilib") |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 449 | PKG_REPO="${BCyan}${PKG_REPO}${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 450 | ;; |
| 451 | esac |
Helmuth | 03e10fa | 2013-09-19 14:12:27 -0300 | [diff] [blame] | 452 | if ! is_package_installed "${PKG}" ; then |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 453 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Installing (${PKG_REPO}) ${Bold}${PKG}${Reset} " |
Helmuth | 2f259c5 | 2013-07-18 15:47:19 -0300 | [diff] [blame] | 454 | $PKG_MANAGER -S --noconfirm --needed ${PKG} >>"$LOG" 2>&1 & |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 455 | pid=$!;progress $pid |
| 456 | else |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 457 | cecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Installing (${PKG_REPO}) ${Bold}${PKG}${Reset} exists " |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 458 | fi |
| 459 | done |
| 460 | else |
Helmuth | 9c8b80f | 2013-09-19 08:50:41 -0300 | [diff] [blame] | 461 | $PKG_MANAGER -S --needed ${1} |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 462 | fi |
| 463 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 464 | package_remove() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 465 | #remove package |
| 466 | for PKG in ${1}; do |
| 467 | if is_package_installed "${PKG}" ; then |
| 468 | if [[ $AUTOMATIC_MODE -eq 1 || $VERBOSE_MODE -eq 0 ]]; then |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 469 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Removing ${Bold}${PKG}${Reset} " |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 470 | pacman -Rcsn --noconfirm ${PKG} >>"$LOG" 2>&1 & |
| 471 | pid=$!;progress $pid |
| 472 | else |
| 473 | pacman -Rcsn ${PKG} |
| 474 | fi |
| 475 | fi |
| 476 | done |
| 477 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 478 | system_upgrade() { #{{{ |
Helmuth | 1d4e671 | 2013-08-14 11:04:23 -0300 | [diff] [blame] | 479 | local MODIFY=`stat /var/lib/pacman/sync | egrep ^Modify | cut -d':' -f2 | cut -d' ' -f2` |
| 480 | local TODAY=`date +%Y-%m-%d` |
Helmuth | 6633a43 | 2013-08-20 15:07:18 -0300 | [diff] [blame] | 481 | if [[ ${MODIFY} != ${TODAY} ]]; then |
| 482 | pacman -Syu ${1} |
Helmuth | 1d4e671 | 2013-08-14 11:04:23 -0300 | [diff] [blame] | 483 | fi |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 484 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 485 | system_update() { #{{{ |
Helmuth | df52c6e | 2013-08-15 14:06:49 -0300 | [diff] [blame] | 486 | if [[ $VERBOSE_MODE -eq 0 ]]; then |
| 487 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Updating packages " |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 488 | $PKG_MANAGER -Syy >>"$LOG" 2>&1 & |
Helmuth | df52c6e | 2013-08-15 14:06:49 -0300 | [diff] [blame] | 489 | pid=$!;progress $pid |
| 490 | else |
Helmuth | d5f0209 | 2013-09-24 09:42:23 -0300 | [diff] [blame] | 491 | $PKG_MANAGER -Syy $1 |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 492 | fi |
| 493 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 494 | npm_install() { #{{{ |
Helmuth | fdff0cb | 2013-08-12 14:41:31 -0300 | [diff] [blame] | 495 | #install packages using pacman |
| 496 | npm install -g $1 |
| 497 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 498 | contains_element() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 499 | #check if an element exist in a string |
| 500 | for e in "${@:2}"; do [[ $e == $1 ]] && break; done; |
| 501 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 502 | config_xinitrc() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 503 | #create a xinitrc file in home user directory |
| 504 | cp -fv /etc/skel/.xinitrc /home/${USER_NAME}/ |
| 505 | echo -e "exec $1" >> /home/${USER_NAME}/.xinitrc |
| 506 | chown -R ${USER_NAME}:users /home/${USER_NAME}/.xinitrc |
| 507 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 508 | invalid_option() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 509 | print_line |
| 510 | echo "Invalid option. Try another one." |
| 511 | pause_function |
| 512 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 513 | pause_function() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 514 | print_line |
| 515 | if [[ $AUTOMATIC_MODE -eq 0 ]]; then |
| 516 | read -e -sn 1 -p "Press any key to continue..." |
| 517 | fi |
| 518 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 519 | menu_item() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 520 | #check if the number of arguments is less then 2 |
| 521 | [[ $# -lt 2 ]] && PACKAGE_NAME="$1" || PACKAGE_NAME="$2"; |
| 522 | #list of chars to remove from the package name |
| 523 | CHARS_TO_REMOVE=("Ttf-" "-bzr" "-hg" "-svn" "-git" "-stable" "-icon-theme" "Gnome-shell-theme-" "Gnome-shell-extension-"); |
| 524 | #remove chars from package name |
| 525 | for CHARS in ${CHARS_TO_REMOVE[@]}; do PACKAGE_NAME=`echo ${PACKAGE_NAME^} | sed 's/'$CHARS'//'`; done |
| 526 | #display checkbox and package name |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 527 | echo -e "$(checkbox_package "$1") ${Bold}$PACKAGE_NAME${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 528 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 529 | mainmenu_item() { #{{{ |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 530 | echo -e "$(checkbox "$1") ${Bold}$2${Reset}" |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 531 | } #}}} |
| 532 | elihw() { #{{{ |
| 533 | [[ $OPT == b || $OPT == d ]] && break; |
| 534 | } #}}} |
| 535 | add_user_to_group() { #{{{ |
| 536 | local _USER=${1} |
| 537 | local _GROUP=${2} |
| 538 | |
| 539 | if [[ -z ${_GROUP} ]]; then |
| 540 | error_msg "ERROR! 'add_user_to_group' was not given enough parameters." |
| 541 | fi |
| 542 | |
Helmuth Saatkamp | 0fdd7fa | 2013-04-29 22:07:07 -0300 | [diff] [blame] | 543 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} Adding ${Bold}${_USER}${Reset} to ${Bold}${_GROUP}${Reset} " |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 544 | gpasswd -a ${_USER} ${_GROUP} >>"$LOG" 2>&1 & |
| 545 | pid=$!;progress $pid |
| 546 | } #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 547 | system_ctl() { #{{{ |
Helmuth | 1d4e671 | 2013-08-14 11:04:23 -0300 | [diff] [blame] | 548 | local ACTION=${1} |
| 549 | local OBJECT=${2} |
| 550 | ncecho " ${BBlue}[${Reset}${Bold}X${BBlue}]${Reset} systemctl ${ACTION} ${OBJECT} " |
| 551 | systemctl ${ACTION} ${OBJECT} >> "$LOG" 2>&1 |
| 552 | pid=$!;progress $pid |
| 553 | } |
| 554 | #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 555 | arch_chroot() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 556 | arch-chroot $MOUNTPOINT /bin/bash -c "${1}" |
| 557 | } |
| 558 | #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 559 | setkeymap() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 560 | local keymaps=(`localectl list-keymaps`) |
| 561 | PS3="(shift+pgup/pgdown) $prompt1" |
| 562 | echo "Select keymap:" |
| 563 | select KEYMAP in "${keymaps[@]}"; do |
| 564 | if contains_element "$KEYMAP" "${keymaps[@]}"; then |
Helmuth Saatkamp | 9330518 | 2013-06-03 15:13:45 -0300 | [diff] [blame] | 565 | break |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 566 | else |
| 567 | invalid_option |
| 568 | fi |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 569 | done |
| 570 | } |
| 571 | #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 572 | setlocale() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 573 | local locale_list=(`cat /etc/locale.gen | grep _ | sed 's/\..*$//' | sed '/@/d' | awk '{print $1}' | uniq | sed 's/#//g'`); |
| 574 | PS3="$prompt1" |
| 575 | echo "Select locale:" |
| 576 | select LOCALE in "${locale_list[@]}"; do |
| 577 | if contains_element "$LOCALE" "${locale_list[@]}"; then |
| 578 | LOCALE_8859="${LOCALE} ISO-8859" |
| 579 | LOCALE_UTF8="${LOCALE}.UTF-8" |
| 580 | break |
| 581 | else |
| 582 | invalid_option |
| 583 | fi |
| 584 | done |
| 585 | } |
| 586 | #}}} |
Helmuth | 4a58c28 | 2013-08-14 11:30:01 -0300 | [diff] [blame] | 587 | settimezone() { #{{{ |
Helmuth Saatkamp | 7d3a37f | 2013-04-24 10:51:46 -0300 | [diff] [blame] | 588 | local zone=(`timedatectl list-timezones | sed 's/\/.*$//' | uniq`); |
| 589 | PS3="$prompt1" |
| 590 | echo "Select zone:" |
| 591 | select ZONE in "${zone[@]}"; do |
| 592 | if contains_element "$ZONE" "${zone[@]}"; then |
| 593 | local subzone=(`timedatectl list-timezones | grep ${ZONE} | sed 's/^.*\///'`) |
| 594 | PS3="$prompt1" |
| 595 | echo "Select subzone:" |
| 596 | select SUBZONE in "${subzone[@]}"; do |
| 597 | if contains_element "$SUBZONE" "${subzone[@]}"; then |
| 598 | break |
| 599 | else |
| 600 | invalid_option |
| 601 | fi |
| 602 | done |
| 603 | break |
| 604 | else |
| 605 | invalid_option |
| 606 | fi |
| 607 | done |
| 608 | } #}}} |
| 609 | #}}} |