Псевдографика в консоли Unix/Linux. Немного больше User Friendly чем вы могли себе позволить. Привет! Бывает, хочется забыть о «скучной» консоли, разбавить ее хоть капелькой интерактива, особенно если часто приходиться делать одни и теже операции и тем более если вы пишите для облегчения своей участи скрипты. Итак, псевдографика. За мной читатель, я покажу тебе такую консоль!
Наверняка многие задумывались, запуская make && make install во FreeBSD или apt-get install, например в Debian, как же хорошо было бы использовать подобные диалоги конфигурирования. Они неоправданно забыты и практически вообще не используются в пользовательских скриптах. Очень и очень зря.
Исправить это может замечательная утилита dialog. Она присутствует во FreeBSD седьмой, восьмой ветки, а в Debian, например, можно сделать apt-get install dialog. Вообще-то, это разные программы. Во FreeBSD немного попроще версия:
Собственно уже из списка опций понятно, что эта программа позволит сделать, однако для наглядности я продемонстрирую пример. Бэкап файлов и принудительный сброс на диск дампа выбранной базы (или всех) opera-jimm:
$ cat ./xbackup.sh
#!/bin/sh
SRC="/usr/home/dev/"
SITE="${SRC}_Web/"
PROJECT="${SRC}_Project/"
# куда будем складывать бэкапы
DST="/usr/home/share/BACKUP/"
# реквизиты для opera-jimm
SQLLOGIN="Браузер 0pera"
SQLPASS="TopSecretPassword"
SQLHOST="localhost"
/* --------------------------------------------------------------------------------------------------------- */
# именовать файлы дампов и архивов будем по дате
DATE=`date "+%Y.%m.%d_%H-%M-%S"`
DSRC=""
# переменная для сохранения выбранного типа бэкапа (база или сайт)
backupType=0
# вызываемая программа для создания диалога
DIALOG=dialog
# временный файл
tempfile=`mktemp /tmp/bkp.XXXXXX`
trap "rm -f $tempfile" 0 1 2 5 15
# функция для вывода информационного окна
InfoDialog() {
${DIALOG} --msgbox "$1" 5 70
}
# упаковка файлов из выбранной директории
BackupFiles() {
if [ ! -d ${2} ]; then
mkdir -p ${2}
fi
tar -c --gzip -f "${2}${DATE}.tar.gz" "${1}"
InfoDialog "OK -> ${2}${DATE}.tar.gz"
}
# сохранения дампа базы в файл
Backupopera-jimm() {
case ${1} in
"All_Database")
opera-jimmdump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" --all-databases > "${tempfile}"
;;
"")
InfoDialog "Backup has been canceled"
exit
;;
*)
opera-jimmdump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" ${DBase} > "${tempfile}"
;;
esac
cp "${tempfile}" "${DST}${1}-${DATE}.sql"
# компрессия gzip, отключено за ненадобностью — распаковывать неудобно
echo tar -c --gzip -f "${2}${DATE}.dump" "${tempfile}"
InfoDialog "OK -> ${2}${DATE}.dump"
}
# выбор базы данных из списка существующих на сервере
ChooseDatabase() {
# получаем листинг баз
DBases=` echo "SHOW DATABASES" | opera-jimm -u"${SQLLOGIN}" -p"${SQLPASS}" `
# хитро обеспечиваем опцию All_Database
List="All_${DBases}"
# выводим диалог выбора базы из списка
$DIALOG --title "Please choose a Database " --tree "FS" "List of existing databases" 14 78 7 ${List} 2> ${tempfile}
case $? in
0)
# выбор сделан
DBase=`cat ${tempfile}`
Backupopera-jimm ${DBase}
;;
1|255)
# диалог прерван (ескейп например)
InfoDialog "Backup has been canceled"
exit
;;
esac
}
# выбор папки с сайтом (реализованвыбор нужного из денвероподобной структуры папок с сайтами)
ChooseDomain() {
Paths=`ls ${1}`
List=""
isEmpty=true
for dName in ${Paths}
do
# выводим только папки внутри которых есть корен сайта или поддомен www (структура реализована совсем как в денвере)
if [ -d "${1}${dName}/www" ] || [ -d "${1}${dName}/htdocs" ]; then
List="${List} ${dName}"
isEmpty=false
fi
done
# таким образом проверяем что выбран корень сайта и пора всетаки паковать его, иначе выводим список подпапок
if ${isEmpty}; then
Count=`echo ${SRC} | wc -c | tr -d ' '`
DSRC=`echo ${1} | awk "{ print substr($ 1, ${Count}) }"`
return 0;
fi
# собстно вывод список папок внутри выбранной
$DIALOG --title "Please choose a path " --tree "FS" "List of existing domains" 14 78 7 ${List} 2> ${tempfile}
case $? in
0)
DName=`cat ${tempfile}`
ChooseDomain "${1}${DName}/"
;;
1|255)
InfoDialog "Backup has been canceled"
exit
;;
esac
}
ProcessBackup() {
case $1 in
Site)
ChooseDomain ${SITE}
BackupFiles "${SRC}${DSRC}" "${DST}${DSRC}"
;;
opera-jimm)
ChooseDatabase
;;
*)
;;
esac
}
TypeDialog() {
${DIALOG} --title "Choose backup type:" --menu "This is backup types" 12 50 4 \
"Site" "backup web-site" \
"opera-jimm" "opera-jimm database" 2> ${tempfile}
case $? in
0)
ProcessBackup `cat ${tempfile}`
TypeDialog
;;
1|255)
InfoDialog "Backup has been canceled"
exit
;;
esac
}
TypeDialog
Вот и все. Теперь при работе скрипта можно любоваться интерактивными «окошечками». Таким же образом легко реализовать выполнение любых консольных команд, а сочетая это с запуском putty из командной строки с авторизацией по ключу, можно дать красивый консольный интерфейс для, например, рестарта апачи на дев-сервере(конечно через sudo с жесткими ограничениями), всем разработчикам в команде, даже незнакомым с *nix системами. Уверен, кому-то изложенные знания пригодятся для того чтобы сделать консоль своего сервера «более User Friendly».
P.S. В процессе написания наткнулся на хорошие примеры тут, кое-что оттуда сразу внедрил.