Rain:.alias (hostopia)

Материал из Linux Wiki
Перейти к: навигация, поиск

Различные шелл-функции, которые я использовал на одной из своих работ (точнее, некоторые из них, то, что сохранилось и то, что можно выкладывать :)). В общем-то, законченных отдельных решений тут мало, что можно было уже выделил (пример - oscounter и browsercounter), но может кому-то пригодится какой-то кусок кода или решение. В общем - к разгребанию.


Локальные

Функции, используемые для локального применения либо для своих целей ;)

upload2server

Использование
upload2server (file|directory) server
Описание
Выгружает указанный файл или каталог в домашнюю директорию на указанном сервере. Необходима авторизация по ключам на серверах. Править под себя.
upload2server() {
tar cfz - "$1" | ssh $MYUSER@$MYPROXY "ssh $2 'tar xz'"
}

bashorgru

Использование
bashorgru номер_цитаты
Описание 
выводит указанную цитату с bash.org.ru
bashorgru() {
links2 -dump -codepage windows-1251 http://bash.org.ru/quote/$1 |
iconv --from-code cp1251 --to-code utf-8 | tr '\n' '\t' |
grep -oP --color "(?<=утверждена).*(?=\[IMG\]\t)" | tr '\t' '\n' | tail -n +2
}

checkiprange

Использование
checkiprange 192.168.1.123 192.168.0.0/22
Описание
Проверка попадания указанного IP-адреса в CIDR-диапазон.
checkiprange() {
[ -z $2 ] && echo "Usage: checkiprange IP CIDR/mask" || (echo $1 | grepcidr $(sipcalc $2 | grep 'Network range' | cut -d- -f2- | sed -e "s/ //g") 1>/dev/null && echo Match)
}

checkrepo

Использование
checkrepo /path/to/Packages.gz
Описание
Проверка несоответствия md5-сумм указанной в Packages и реальной для deb-пакетов.
checkrepo() {
zcat "${1}" | sed -n '/Filename:/,/MD5sum:/p' | grep -v Size: |
sed -e 'N; s/\n/ /g' -e "s/Filename: //" -e "s/MD5sum: //g" |
while read file md5
do [ "$(md5sum "${1%/*}/../../../../${file}" | cut -d' ' -f1)" != "${md5}" ] && echo -e "\e[31m$(readlink -f "${1%/*}/../../../../${file}")\e[0m"
done
}

getdownloadlists

Использование
getdownloadlists path/to/file/with/urls <число списков>
Описание
Используется для разделения списка URL на указанное количество списков, исходя из размера файла. Деление идет поштучно, поэтому первый список может оказаться по итоговому размеру больше, чем последний.
getdownloadlists() {
n=1
m="${2}"
cat "${1}" | sort -u |
while read i
do curl --head "${i}" 2>/dev/null | awk -F':' '/^Content-Length: /{print $2"\t\t'$i'"}' | sed -re "s/^( )*//g"
done | sort -nr |
while read size file
do echo "${file} ${size}" >> downloadlist."${n}" ; let n+=1 && [ "${n}" -gt "${m}" ] && n="1"
done
}

checkip

Использование
checkip 123.123.123.123
Описание
Проверяет принадлежность данного IP нашим серверам
checkip() {
echo "${@}" | grep -qE '\b(64\.29\.1(4[4-9]|5[0-9])\.[0-9]{1,3}|69\.49\.(9[6-9]|1([0-1][0-9]|2[0-7])\.[0-9]{1,3})|216\.251\.(3[2-9]|4[0-7])\.[0-9]{1,3})\b' && echo -e "\e[32mOS\e[0m" || echo -e "\e[31mEW\e[0m"
}

getremotely

Использование getremotely http://kernel.org/pub/linux/kernel/v2.6/patch-2.6.28.6.bz2
Описание
Скачивает файлы через удаленный сервер по ssh либо файлы с удаленного сервера
getremotely() { [[ "${1%%:/*}" == 'http' || "${1%%:/*}" == 'ftp' ]] && cmd='wget -O -' || cmd='cat'
ssh -C $MYUSER@$MYPROXY "ssh -C $MYHOST '${cmd} "${1}"'" > "${1##*/}"
echo 'Download complete'
}

Ориентированные на сервера

currdomain

Использование
currdomain
Описание
Вывод названия текущего домена.
Примечание
Многие другие функции и проверки основаны на этой, она должна работать максимально корректно и не выдавать ничего вне домена.
currdomain() {
pwd|grep -oP  "(?<=[a-zA-Z0-9\-]/)([a-z0-9-]+\.){1,3}([a-z]{1,3}\.)?[a-z]{1,4}"|head -n1
}

domroot

Использование
domroot
Описание
Вывод пути до корня текущего домена.
domroot() {
[ ! -z "$(currdomain)" ] && echo $PWD | awk -F"$(currdomain)" '{print $1 FS}'
}

putmysqlinfo, putmssqlinfo

Использование
putmysqlinfo SERVER USER PASS DB1 DB2 ... DBn
Описание
Создает в private файл с параметрами подключения для соответствующей базы данных. Выполнять из корня домена
putmysqlinfo() {
domain="$(currdomain)"&& echo -e "DOMAIN:$domain\nDBSERVER:$1\nDBUSER:$2\nDBPASS:$3" >> $(domroot)/private/mysql.dblogin
shift 3
echo "DBNAMES:$@" >> $(domroot)/private/mysql.dblogin
}
 
putmssqlinfo() {
domain="$(currdomain)"&& echo -e "DOMAIN:$domain\nDBSERVER:$1\nDBUSER:$2\nDBPASS:$3" >> $(domroot)/private/mssql.dblogin
shift 3
echo "DBNAMES:$@" >> $(domroot)/private/mssql.dblogin
}

showmysqlinfo, showmssqlinfo

Использование
showmssqlinfo
Описание
Вывод информации о подключении из файла в private для соответствующей базы данных. Выполнять из любого каталога домена.
showmysqlinfo() {
cat $(domroot)/private/mysql.dblogin 2>/dev/null || echo -e "\e[31mNo info available\e[0m"
}
 
showmssqlinfo() {
cat $(domroot)/private/mssql.dblogin 2>/dev/null || echo -e "\e[31mNo info available\e[0m"
}

fdperms

Использование
fdperms
Описание
Устанавливает права 660 для файлов и 770 для каталогов, вниз, начиная от текущего каталога домена.
fdperms() {
[ ! -z "$(currdomain)" ] && (find . -type d -exec chmod 770 {} \;; find . -type f -exec chmod 660 {} \;) || echo -e "\e[31mError: You are not in domain folder\e[0m"
}

fdown

Использование
fdown
Описание
Устанавливает владельца и группу для всех файлов, начиная от текущего каталога, такие же, как и на public для текущего домена. Если владельцы корня и public'a различаются, а также если владелец корня имеет UID меньше 2000 - функция не работает!

ЗЫ: А раньше это была простая короткая функция :)

fdown() {
if [ ! -z "$(currdomain)" ]
then
if [[ "$(ls -lnd $(domroot) | awk '{print $3}')" == "$(ls -lnd $(domroot)/public | awk '{print $3}')" && ! "$(ls -lnd $(domroot)/public | awk '{print $3}')" =~ "^([0-1])?[0-9]{1,3}$" ]]
then
echo -e "\e[35mOld owner:\t\e[36m$(ls -ld $(domroot)/public | awk '{print $3}')\e[0m"
chown -R --reference=$(echo $PWD | awk -F"`currdomain`" '{print $1 FS"/public"}') .
else echo -e "\e[31mError: wrong owner\e[0m"
fi
else echo -e "\e[31mError: You are not in domain folder\e[0m"
fi
}

addphperror, delphperror

Использование
addphperror
Описание
Добавление/Удаление строки "php_flag display_errors on" и "php_value error_reporting 6543" в .htaccess в корне домена для вывода ошибок для PHP5
addphperror() {
echo -e "php_flag display_errors on\nphp_value error_reporting 6543" >> $(domroot)/.htaccess
}
 
delphperror() {
sed -i -e "/^php_flag display_errors on/d" -e "/^php_value error_reporting/d" $(domroot)/.htaccess
}

mergesqlinfo

Использование
mergesqlinfo private/mysql.dblogin
Описание
Удаляет дублирующиеся записи в указанном файле подключения к SQL-серверу. Делается сравнение по строке домена, сервера, пользователя и пароля. Совпадающие блоки сливаются, базы записываюся в строке DBNAMES: через пробел, дублирующиеся записи о базах удаляются. Выводится статистика о старом и новом количестве записей.
mergesqlinfo() {
[ ! -z $1 ] && oldcount=$(grep -c DOMAIN $1) &&\
content=$(cat $1 | tr '\n' ' ' | sed -e "s/ /:::/g" -e "s/:::DBNAMES/ DBNAMES/g" -e "s/DOMAIN/\nDOMAIN/g" | grep . | sed -e "s/:::$/\\\n/g") &&\
echo -e $content | grep -oE --color "^( )?DOMAIN.* " | sed -e "s/^ //g" | sort -u |
while read str
do
echo -e "$(echo $str| sed -e "s/:::/\\\n/g")\nDBNAMES:$(echo -e $content | grep -F "${str}" | awk '{print $2}' | sed -e "s/DBNAMES://g" -e "s/:::/ /g" -r -e "s/( )+/ /g" | tr ' ' '\n' | sort -u | tr '\n' ' ')"
done > ${1} &&\
newcount=$(grep -c DOMAIN ${1}) && echo -e "\e[35mMerging \e[33m${oldcount} \e[31m-> \e[32m${newcount} \e[35msql-records for \e[36m$(grep -m1 DOMAIN $1 | cut -d: -f2-)\e[0m"
}

sputmysqlinfo

Использование
sputmysqlinfo RRAD.log
Описание
Раскидывает информацию о подключении к MySQL базе данных на основе лога провижнинга RRAD'a. Если поле user пустое - выдается сообщение об ошибке. Функция привязана к c25. Для создаваемых файлов идет обработка через mergesqlinfo.
Примечание
Надо сделать выборку SQL-сервера, как вариант - полностью универсальная функция, т.е., чтобы можно было менять и путь к доменам.
sputmysqlinfo() {
if [ ! -z "${1}" ]
then awk -F':' '{if ($1=="enabledMySQL") print $2" "$4" "$5" USR:"$6}' "${1}" |
while read domain pass base user
do
user=$(echo $user | sed -e "s/^USR://g")
if [ ! -z "${user}" ]
then
c25 $domain && echo "Adding info for $domain" && putmysqlinfo sql5c25a.carrierzone.com $user $pass $base && mergesqlinfo private/mysql.dblogin
else
echo -e "\e[31mError: empty user for \e[32m$domain\e[0m"
fi
done
else echo -e "\e[31mError: no input file specified\e[0m"
fi
}

checkindex

Использование
checkindex public/
Описание
Вывод предположительных индексных файлов для указанного каталога.
checkindex() {
ls -1 $1 | grep -iE "^(index|default|home|main)([0-9]{1,2})?\.(htm|html|cfm|asp|aspx|php|shtml)$"
}

domain_info

Использование
domain_info
Описание
Вывод информации о текущем домене. Работает в любом каталоге домена. Выводится:
  • Имя домена.
  • IP-адрес домена, используя ДНС-серверы Хостопии, а также принадлежность домена нашей либо не нашей системе. Реальный IP может отличаться.
  • Владелец и группа для корня домена, файла .htaccess, каталогов public, cgi-bin, databases (если существуют). При неправильных правах (рут или пользовательские (с 3-4-х значным UIN) строка с правами подсвечивается.
  • Наличие или отсутствие контента. Стандартные файлы UC-страницы игнорируются.
  • Файлы в каталоге databases (базы данных), или их отсутствие.
  • Наличие или отсутствие файла с информацией о подключениях к MySQL-базам в /private.
  • Наличие или отсутствие файла с информацией о подключениях к MSSQL-базам в /private.
  • Наличие или отсутствие файлов в /cgi-bin.
  • Проверяются доступные индексные файлы в /public. При наличии .htaccess в корне домена включенные в него индексные файлы выделены желтым цветом, остальные - голубым. При отсутствии .htaccess вся строка выделяется красным цветом. При отсутствии /public выводится сообщение.
  • Используемые технологии (определение идет по расширениям файлов внутри домена). Варианты: ASP, ASPX, CFM, CFMX, PHP, Javascript, HTML, Flash.
domain_info() {
# Domain
        echo -e "\e[95mDomain:\t\t\e[36m$(currdomain)\e[0m"
# IP Address, our system / elsewhere
        arecords="$([ ! -z "$(currdomain)" ] && host -t A $(currdomain) | grep -oE "\b([0-9]{1,3}\.){1,3}[0-9]{1,3}$" | tr '\n' ' ')"
        [ ! -z "${arecords}" ] && echo -e "\e[95mAddress:\t\e[36m${arecords}\t\e[0m$(checkip "${arecords}")"
 
        domroot="$(domroot)"
# Owners of domain root, public, cgi-bin, databases
        [ ! -z "$(currdomain)" ] && (echo -e "\e[95mOwner:" && echo -en "\e[36m" ; ls -lan ${domroot} | awk '{print $9"\t"$3"\t"$4}' | sed -e "s/^\.\t/domain root\t/g" -e "s/cgi-bin/cgi-bin  /g" -e "s/public/public  /g" | grep -E "^(public|cgi-bin|databases|\.htaccess|domain root)" | sed -r -e "s-\t[0-9]{1,4}\b\t-`echo -e "\e[5;31m"`&`echo -e "\e[0;36m"`-g" | sed -e "s/^/-> /g" && echo -e "\e[0m")
# Test content
        [ -z "$(ls -1A ${domroot}/public 2>/dev/null| grep -vE "^(index.phtml|pic1.gif|welcome.gif|helloworldtestfileformigration.asp)$")" ] && echo -e "\e[95mContent:\t\e[31mNo content\e[0m" || echo -e "\e[95mContent:\t\e[36mContent present\e[0m"
# Test databases
        [ -e ${domroot}/databases ] && (echo -en "\e[95mHave DBs:\t\e[36m$(ls -1A ${domroot}/databases | tr '\n' ' ')\e[0m"; echo) || echo -e "\e[95mHave DBs:\t\e[36mNo DBs\e[0m"
# Test mysql.dblogin, show number of info-blocks and databases
        [ -e ${domroot}/private/mysql.dblogin ] && echo -e "\e[95mMySQL info:\t\e[36m$(printf "Blocks: \e[32m%s\e[36m\tDBs: \e[32m%s\n" $(showmysqlinfo | grep "^DBNAME" | sed -e "s/^DBNAMES://g" | sed -e "s/^ //g" | while read i;do echo $i | tr ' ' '\n' | sort -u | tr '\n' ' ' ; echo ; done | wc -wl))\e[0m"
# Test mssql.dblogin, show number of info-blocks and databases
        [ -e ${domroot}/private/mssql.dblogin ] && echo -e "\e[95mMSSQL info:\t\e[36m$(printf "Blocks: \e[32m%s\e[36m\tDBs: \e[32m%s\n" $(showmssqlinfo | grep "^DBNAME" | sed -e "s/^DBNAMES://g" | sed -e "s/^ //g" | while read i;do echo $i | tr ' ' '\n' | sort -u | tr '\n' ' ' ; echo ; done | wc -wl))\e[0m"
# Test cgi-bin
        [ -z "$(ls -1A ${domroot}/cgi-bin 2>/dev/null)" ] && echo -e "\e[95mcgi-bin:\t\e[36mEmpty\e[0m" || echo -e "\e[95mcgi-bin:\t\e[36mHave content\e[0m"
# Test indexes in public, test DirectoryIndex in /.htaccess
        clr1="$([ -e ${domroot}/.htaccess ] && echo "\e[36m" || echo "\e[31m")";clr2="\e[93m";echo -e "\e[95mIndexes:\t$clr1$([ -e ${domroot}/public ] && (checkindex ${domroot}/public | tr '\n' ' ' | sed -r -e "s-\b($([ -e ${domroot}/.htaccess ] && awk '{if ($1=="DirectoryIndex") print $0 | "sed -e \"s/DirectoryIndex //g\" -re \"s/( )+/|/g\""}' ${domroot}/.htaccess))\b-`echo -e "$clr2"`&`echo -e "$clr1"`-g")||echo -e "\e[31mNo public")\e[0m"
# Test technologies (by extensions)
        exts=$(cd ${domroot} && find public/ -type f -maxdepth 3 2>/dev/null | cut -d. -f2- | cut -d. -f2- | tr a-z A-Z | sort -u | tr '\n' ' ' ; cd -)
        echo -e "\e[95mTechnologies:\t\
\e[31m$(echo $exts | grep -qoE "\b(ASP)\b" && echo 'ASP ')\
\e[91m$(echo $exts | grep -qoE "\b(ASPX)\b" && echo 'ASPX ')\
\e[31m$(echo $exts | grep -qoE "\b(CFM)\b" && echo 'CFM ')\
\e[91m$(echo $exts | grep -qoE "\b(CFMX)\b" && echo 'CFMX ')\
\e[31m$(echo $exts | grep -qoE "\b(MDB)\b" && echo 'MSAccess ')\
\e[32m$(echo $exts | grep -qoE "\b(PHP)\b" && echo 'PHP ')\
\e[32m$(echo $exts | grep -qoE "\b(JS)\b" && echo 'Javascript ')\
\e[36m$(echo $exts | grep -qoE "\b(HTM|HTML)\b" && echo 'HTML ')\
\e[33m$(echo $exts | grep -qoE "\b(FLV|SWF)\b" && echo 'Flash ')\e[0m"
}

addindex

Использование
addindex index.html index.php
Описание
Добавляет указанные индексные файлы в .htaccess в корне домена сразу после DirectoryIndex. Выполняется из любого каталога домена. Делает проверки на доступность записи в .htaccess и на непустую строку параметров. При наличии root-прав меняет права на .htaccess на те же, что и у /public домена.
addindex() {
indexes=$@ && file="$(domroot)/.htaccess" && [ ! -z $1 ] && ([ -w "${file}" ] && ([ ! -z "$(grep -iqE "^DirectoryIndex" "${file}" 2>/dev/null &&\
echo 1)" ] && (sed -i -e "s/^DirectoryIndex/DirectoryIndex $indexes/gi" ${file} &&\
echo -e "\e[95mIndexes added:\t\e[36m$indexes\e[0m" ; chown --reference=${domroot}/public ${file} 2>/dev/null ; chmod 660 ${file} 2>/dev/null;:) || echo -e "\e[31mError: .htaccess has no \e[36mDirectoryIndex\e[31m section\e[0m") || echo -e "\e[31mError: Can't write to .htaccess file\e[0m" ) || echo -e "\e[31mError: No index specified\e[0m"
}

getrrad

Использование
getrrad html.com
Описание
Используя файл .alias в моем домашнем каталоге выдает список логинов / паролей для RRAD для конкретного партнера (либо для всех партнеров по ключу -l). Переопределить размещение файла можно вторым параметром
getrrad() {
[ -z "${2}" ] && tabfile="/home/$MYUSER/.alias" || tabfile="${2}"
case "${1}" in
'') echo -e "Usage:\tgetrrad -l|PARTNER" ;;
-l) printf "\e[32m%-20s \e[35m%-25s \e[31m%-10s \e[33m%-30s \e[36m%s\e[0m\n" $(sed -e 's/:::/ /g' -ne '/^#### begin of RRAD connection info ####$/,/^#### end of RRAD connection info ####$/p' "${tabfile}" | head -n-1 | tail -n+2 | sed 's/^#//g') ;;
*) sed -n '/^#### begin of RRAD connection info ####$/,/^#### end of RRAD connection info ####$/p' "${tabfile}" |
awk -F':::' '/^#'$1'/{print "telnet "$2, $3"\nL I "$4, $5}' ;;
esac
}

cminfo

Использование
cminfo
Описание
Выводит список смонтированных кластеров на данном миграционном сервере используя таблицу из файла .alias из моего домашнего каталога. Первый параметр может переопределить размещение файла с таблицей.
cminfo() {
[ -z "${1}" ] && tabfile="/home/$MYUSER/.alias" || tabfile="${1}"
mount | grep -E '^([0-9]{1,3}\.){1,3}[0-9]{1,3}' |
while read server on mp blah
do
server="$(echo ${server} | cut -d: -f1)"
sed -ne '/^#### begin of clusters mount table ####$/,/^#### end of clusters mount table ####$/p' "${tabfile}" | sed 's/^#//g'|
awk -F':::' '/'$server'/{if ($0!="### begin of clusters mount table ####") if ($0!="### end of clusters mount table ####") print "printf \"\\e[32m%s \\e[31m%s \\e[32m%s %s \\e[36m%s\\e[0m\\n\" "$2" \"("$1")\" mounted on '$mp'"}' |sh
done
}

fpinstall

Использование
fpinstall
Описание
Назначает нужные права и делает перемещения каталогов для ручной установки Front Page. Переходим в каталог с доменом, выполняем функцию, ставим FP в WebSiteOS и нажимаем Enter.
fpinstall() {
[ ! -z "$(currdomain)" ] &&\
(mv public/ public.bak &&\
mkdir public &&\
chmod 2770 public . &&\
chown --reference=. public &&\
chown :60 public &&\
echo -e "\e[0;31mInstall FP and press Enter\e[0m" &&\
read &&\
rm -rf public/images/ &&\
mv public.bak/* public/ 2>/dev/null
rm -rf public.bak
echo -e "\e[32mDone\e[0m")
}

fixformmail

Использование
fixformmail path/to/formmail
Описание
Фиксит обычные html'ные форммейлы, заменяет action на ссылку на наш форммейл, создает formmail.conf, слегка правит код
fixformmail() {
if [ ! -f "${1}" ]; then
                echo -e "\e[5;31mPlease, specify file\e[0;0m"
else
        sed -i -r -e "s@(FORM.* ACTION[ \t]*=[ \t]*)[\"\']?[a-zA-Z0-9:/\._%\-]+[\"\']?( |>)@\1\"http://$(currdomain)/cgi-bin/formmail\"\2@gi" -e 's/(<input +type[ \t]*=[ \t] *["'\'']?hidden["'\'']?[ \t]+name[ \t]*=[ \t]*["'\'']?)(to|recipient|mailto)(["'\'']?[ \t]+value[ \t]*=[ \t]*["'\'']?)/\1recipient\3/gi' "${1}"
        grep -nEi '<form.* action[ \t]*=[ \t]*|input[ \t]+type[ \t]*=[ \t]*["'\'']?hidden["'\'']?[ \t]+name[ \t]*=[ \t]*["'\'']?recipient["'\'']?' "${1}" |
        sed -r -e 's/:(\t| )*</:\t</g' -e "s/([ \t](action|value)[ \t]*=[ \t]*[\"'\'']?)([a-zA-Z0-9,@:/\._\-]+)([\"'\'']?)/`echo -e "\e[35m"`\1`echo -e "\e[36m"`\3`echo -e "\e[35m"`\4`echo -e "\e[0m"`/gi" -e "s/^([0-9]+:)/`echo -e "\e[31m"`\1`echo -e "\e[90m"`/gi"
        [ -e "$(domroot)/private/formmail.conf" ] && echo -ne "\n\e[5;31m\tWarning: formmail.conf already exist:\n\e[0;36mOld content: \e[32m$(cat $(domroot)/private/formmail.conf)\e[36m\nNew content:\e[32m " || echo -ne "\n\e[36mformmail.conf content:\e[32m "
        echo referers=$(currdomain),www.$(currdomain),$(grep -m1 -iE 'input[ \t]+type[ \t]*=[ \t]*["'\'']?hidden["'\'']?[ \t]+name[ \t]*=[ \t]*["'\'']?recipient["'\'']?' "${1}" | sed -r -e 's/^.*[ \t]value[ \t]*=[ \t]*[\"'\'']?[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9_\.\-]+),?[\"'\'']?.*/\1/gi') | tee "$(domroot)/private/formmail.conf"
        ln -sf /services/websoftware/auto-cgi/formmail "$(domroot)"/cgi-bin/formmail
        chown -h --reference="$(domroot)" "$(domroot)"/cgi-bin/formmail "$(domroot)"/private/formmail.conf
        echo -e "\n\e[35mFiles:\e[0m"
        ls --color=auto -l "$(domroot)"/cgi-bin/formmail "$(domroot)"/private/formmail.conf
fi
}

cleardatabase

Использование
cleardatabase server user pass dbname
Описание
удаляет все таблицы в указанной базе
cleardatabase() {
echo "drop table $(echo 'show tables;' | mysql --skip-column-names -h"$1" -u"$2" -p"$3" "$4" | tr '\n' ',' | sed 's/,$//');" |
mysql -h"$1" -u"$2" -p"$3" "$4"
}

repairdatabase

Использование
repairdatabase server user pass dbname
Описание
фиксит все таблицы в указанной базе
repairdatabase() {
printf "%-75s %-10s %-10s %-10s\n" $(echo "repair table $(echo 'show tables;' | mysql --skip-column-names -h"$1" -u"$2" -p"$3" "$4" | tr '\n' ',' | sed 's/,$//');" |
mysql --skip-column-names -h"$1" -u"$2" -p"$3" "$4" 2>/dev/null) | sed -e "s/^$4\.//g"
}

dbmanager

Использование
dbmanager или dbmanager path/to/db.dump/for/upload.sql
Описание
Интерактивный DB Manager для MySQL баз, облегчающий выполнение обычных действий с базами - подключение, очистка, заливка дампа, дамп базы, восстановление из этого дампа, фиксинг баз. Работает по инфе в стандартном файлике в private/
dbmanager() {
if [ -e "$(domroot)/private/mysql.dblogin" ];then
        blocks="$(showmysqlinfo | tr '\n' ' ' | sed -r -e "s/(DBSERVER|DBUSER|DBPASS|DBNAMES)://g" -e "s/DOMAIN:/\n/g" | sed -n -r -e "s/ +/:::/pg" | sed -e "s/\b$(currdomain)::://g")"
if [ "$(wc -w <<< $blocks)" -gt 1 ]; then
        echo -e "\e[35mSelect login:\e[0m"
        select block in $(echo $blocks | sed -r -e "s/([a-z0-9\._\-]+):::([a-z0-9]+):::([^:]+):::/`echo -e "\e[36m"`\1:::`echo -e "\e[33m"`\2:::`echo -e "\e[35m"`\3:::/g" | sed -e "s/:::/`echo -e "\e[32m"`&`echo -e "\e[0m"`/g")
        do
                blocks="$(echo $block | sed -r "s/\x1b\[..?m//g")"
                break
        done
fi
 
dbserver="$(awk -F':::' '{print $1}' <<< $blocks)"
dbuser="$(awk -F':::' '{print $2}' <<< $blocks)"
dbpass="$(awk -F':::' '{print $3}' <<< $blocks)"
dbnames="$(awk -F":::${dbpass}:::" '{print $2}' <<< $blocks | sed -e "s/:::/ /g")"
 
unset UPLOAD RESTORE
[ ! -z "${1}" ] && UPLOAD='UPLOAD'
[ -d "$(domroot)/private/mysql.dbdumps" ] && RESTORE='RESTORE'
 
echo -e "\e[35mPlease, select action:\e[0m"
select action in EXIT CONNECT DUMP REPAIR ${RESTORE} ${UPLOAD} CLEAR
do
if [ "${action}" != 'EXIT' ]; then
        echo -e "\e[35mSelect database for \e[36m${action}\e[0m"
        select dbname in EXIT $dbnames
        do
                if [ "${dbname}" != 'EXIT' ]; then
 
                if [ "${action}" == 'CONNECT' ];
                        then
                        echo -e "\e[35mConnecting to \e[36m${dbuser}:${dbpass}@${dbserver}/${dbname}\e[0m"
                        mysql -h${dbserver} -u"${dbuser}" -p"${dbpass}" "${dbname}"
                elif [ "${action}" == 'CLEAR' ];
                        then
                        echo -e "\e[5;31mCleaning DB \e[0;36m${dbuser}:${dbpass}@${dbserver}/${dbname}\e[0m"
                        cleardatabase "${dbserver}" "${dbuser}" "${dbpass}" "${dbname}"
                elif [ "${action}" == 'REPAIR' ];
                        then
                        echo -e "\e[35mRepairing DB \e[0;36m${dbuser}:${dbpass}@${dbserver}/${dbname}\e[0m"
                        repairdatabase "${dbserver}" "${dbuser}" "${dbpass}" "${dbname}"
                elif [ "${action}" == 'DUMP' ];
                        then
                        echo -e "\e[35mDumping \e[36m${dbuser}:${dbpass}@${dbserver}/${dbname} \e[35m
to \e[36m$(domroot)/private/mysql.dbdumps/${dbname}.sql\e[0m"
                        mkdir -p "$(domroot)/private/mysql.dbdumps"
                        mysqldump -h${dbserver} -u"${dbuser}" -p"${dbpass}" "${dbname}" > "$(domroot)/private/mysql.dbdumps/${dbname}.sql"
                        chown --reference="$(domroot)" -R "$(domroot)/private/mysql.dbdumps"
                elif [ "${action}" == 'UPLOAD' ];
                        then
                        echo -e "\e[35mUploading \e[36m${1} \e[35mto \e[36m${dbuser}:${dbpass}@${dbserver}/${dbname}\e[0m"
                        mysql -h${dbserver} -u"${dbuser}" -p"${dbpass}" "${dbname}" < "${1}"
                elif [ "${action}" == 'RESTORE' ];
                        then
                        if [ -e "$(domroot)/private/mysql.dbdumps/${dbname}.sql" ];
                                then
                                echo -e "\e[35mRestoring DB \e[36m${dbname}\e[35m from file \e[36mprivate/mysql.dbdumps/${dbname}.sql\e[0m"
                                mysql -h${dbserver} -u"${dbuser}" -p"${dbpass}" "${dbname}" < "$(domroot)/private/mysql.dbdumps/${dbname}.sql"
                        else
                                echo -e "\e[31mSorry, no file for restore\e[0m"
 
                        fi
                else
                        break
                fi
                fi
                break
        done
else
        break
fi
break
done
else
        echo "Sorry, can't find mysqldb.login info"
fi
}