Apps: "Bash", "Docker" & etc.
В этой заметке описан один из этапов реализации поставленной в вышестоящей публикации задачи автоматизации процедур развёртывания тестовых стендов из docker-контейнеров.
Библиотека функций визуализации состояния и журналов событий тестовых стендов:
# vi /usr/local/etc/devops/lib/misc.sh.snippet
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция публикации журналов событий процедур запуска и остановки контейнеров
function front-nginx-log-show {
unset BODY 2>/dev/null
BODY=${BODY}"<!DOCTYPE HTML>\n\
<html>\n\
<head>\n\
<meta charset=\"utf-8\">\n\
<meta http-equiv=\"refresh\" content=\"60\">\n\
<title>Running or working recently testing sites</title>\n\
<style>\n\
a {text-decoration: none;}\n\
a:visited {color: blue;}\n\
</style>\n\
</head>\n\
<body>\n\
<h3 style=\"color: #333333;\">Running or working recently testing sites</h3>\n\
<span style=\"color: #808080;\">\n\
Collection time: <!--# config timefmt=\"%Y-%m-%d %H:%M:%S\" --><!--# echo var=\"date_local\" -->\n\
(<a href=\"#\" onClick=\"javascript: window.location.reload(); return false;\">refresh</a>)\n\
</span>\n\
\n"
CONTAINERS=( $(docker ps --format '{{.Names}}' 2>/dev/null) )
for FILENAME in /var/opt/devops/front/var/www/log/*.log ; do
if [ -f "${FILENAME}" ] && [ $(wc -c < "${FILENAME}") -gt 3 ] ; then
ESITENAME=$(basename ${FILENAME} .log)
EACTIVE=false
BODY=${BODY}"<br /><br />\n"
BODY=${BODY}"<a href=\"./${ESITENAME}.html\" style=\"font-size: 120%;\">${ESITENAME}</a>"
for ELEMENT in "${CONTAINERS[@]}"; do
[[ "${ELEMENT}" = *"${ESITENAME}"* ]] && { EACTIVE=true; break; }
done
if [ "${ESITENAME}" = "default" ] ; then
BODY=${BODY}" [ <span style=\"color: gray;\">unbound journal</span> ]"
elif [ "${EACTIVE}" = "true" ] ; then
BODY=${BODY}" [ <span style=\"color: green;\">is running</span> ]"
else
BODY=${BODY}" [ <span style=\"color: red;\">not running</span> ]"
fi
BODY=${BODY}"\n"
unset EBODY 2>/dev/null
EBODY=${EBODY}"<!DOCTYPE HTML>\n\
<html>\n\
<head>\n\
<meta charset=\"utf-8\">\n\
<meta http-equiv=\"refresh\" content=\"60\">\n\
<title>Event logs of running or working recently testing site</title>\n\
<style>\n\
a {text-decoration: none;}\n\
a:visited {color: blue;}\n\
pre {\n\
border-left: #C0C0C0 3px solid;\n\
font-family: monospace;\n\
margin-left: .5%;\n\
padding-left: .5%;\n\
}\n\
</style>\n\
</head>\n\
<body>\n\
<h3 style=\"color: #333333;\">Event logs of running or working recently testing site</h3>\n\
<span style=\"color: #808080;\">\n\
Collection time: <!--# config timefmt=\"%Y-%m-%d %H:%M:%S\" --><!--# echo var=\"date_local\" -->\n\
(<a href=\"#\" onClick=\"javascript: window.location.reload(); return false;\">refresh</a>)\n\
[ <a href=\"./index.html\">back to index</a> ]\n\
</span>\n\
\n"
EBODY=${EBODY}"<h4 style=\"color: #333333;\">${ESITENAME}:</h4>\n"
EBODY=${EBODY}"<pre>\n"$(echo "<!--# include virtual=\"./${ESITENAME}.log\" -->")"</pre>\n"
EBODY=${EBODY}"\n</body>\n</html>"
echo -e "${EBODY}" 2>/dev/null > /var/opt/devops/front/var/www/log/${ESITENAME}.html
fi
done
if [ ! -f "${FILENAME}" ] ; then
BODY=${BODY}"<br /><br />There are currently no event logs.\n"
fi
BODY=${BODY}"\n</body>\n</html>"
echo -e "${BODY}" 2>/dev/null > /var/opt/devops/front/var/www/log/index.html
return ${?}
}
# Функция профилактической чистки директории журналов от устаревших файлов
function front-nginx-log-cleaning {
CONTAINERS=( $(docker ps --format '{{.Names}}' 2>/dev/null) )
for FILENAME in /var/opt/devops/front/var/www/log/*.log ; do
unset INVOLVED
# Для каждого файла проводим проверку на его связь с запущенными контейнерами
if [ -f "${FILENAME}" ] ; then
for ELEMENT in "${CONTAINERS[@]}"; do
[[ "${ELEMENT}" = *"$(basename ${FILENAME} .log)"* ]] && { INVOLVED=true; break; }
done
# Если файл журнала не связан с запущенными контейнерами и обновлялся более суток назад, то удаляем его
if [[ "${INVOLVED}" != "true" ]] ; then
FILEMTIME=$(stat -c %Y ${FILENAME}); CURRTIME=$(date +%s)
DIFFDAYS=$(( ( CURRTIME - FILEMTIME ) / 86400 ))
if [ "${DIFFDAYS}" -ge "1" ] ; then
rm -f "${FILENAME}"
front-nginx-log-show
fi
fi
fi
done
return ${?}
}
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция публикации журналов событий процедур запуска и остановки контейнеров
function front-nginx-log-show {
unset BODY 2>/dev/null
BODY=${BODY}"<!DOCTYPE HTML>\n\
<html>\n\
<head>\n\
<meta charset=\"utf-8\">\n\
<meta http-equiv=\"refresh\" content=\"60\">\n\
<title>Running or working recently testing sites</title>\n\
<style>\n\
a {text-decoration: none;}\n\
a:visited {color: blue;}\n\
</style>\n\
</head>\n\
<body>\n\
<h3 style=\"color: #333333;\">Running or working recently testing sites</h3>\n\
<span style=\"color: #808080;\">\n\
Collection time: <!--# config timefmt=\"%Y-%m-%d %H:%M:%S\" --><!--# echo var=\"date_local\" -->\n\
(<a href=\"#\" onClick=\"javascript: window.location.reload(); return false;\">refresh</a>)\n\
</span>\n\
\n"
CONTAINERS=( $(docker ps --format '{{.Names}}' 2>/dev/null) )
for FILENAME in /var/opt/devops/front/var/www/log/*.log ; do
if [ -f "${FILENAME}" ] && [ $(wc -c < "${FILENAME}") -gt 3 ] ; then
ESITENAME=$(basename ${FILENAME} .log)
EACTIVE=false
BODY=${BODY}"<br /><br />\n"
BODY=${BODY}"<a href=\"./${ESITENAME}.html\" style=\"font-size: 120%;\">${ESITENAME}</a>"
for ELEMENT in "${CONTAINERS[@]}"; do
[[ "${ELEMENT}" = *"${ESITENAME}"* ]] && { EACTIVE=true; break; }
done
if [ "${ESITENAME}" = "default" ] ; then
BODY=${BODY}" [ <span style=\"color: gray;\">unbound journal</span> ]"
elif [ "${EACTIVE}" = "true" ] ; then
BODY=${BODY}" [ <span style=\"color: green;\">is running</span> ]"
else
BODY=${BODY}" [ <span style=\"color: red;\">not running</span> ]"
fi
BODY=${BODY}"\n"
unset EBODY 2>/dev/null
EBODY=${EBODY}"<!DOCTYPE HTML>\n\
<html>\n\
<head>\n\
<meta charset=\"utf-8\">\n\
<meta http-equiv=\"refresh\" content=\"60\">\n\
<title>Event logs of running or working recently testing site</title>\n\
<style>\n\
a {text-decoration: none;}\n\
a:visited {color: blue;}\n\
pre {\n\
border-left: #C0C0C0 3px solid;\n\
font-family: monospace;\n\
margin-left: .5%;\n\
padding-left: .5%;\n\
}\n\
</style>\n\
</head>\n\
<body>\n\
<h3 style=\"color: #333333;\">Event logs of running or working recently testing site</h3>\n\
<span style=\"color: #808080;\">\n\
Collection time: <!--# config timefmt=\"%Y-%m-%d %H:%M:%S\" --><!--# echo var=\"date_local\" -->\n\
(<a href=\"#\" onClick=\"javascript: window.location.reload(); return false;\">refresh</a>)\n\
[ <a href=\"./index.html\">back to index</a> ]\n\
</span>\n\
\n"
EBODY=${EBODY}"<h4 style=\"color: #333333;\">${ESITENAME}:</h4>\n"
EBODY=${EBODY}"<pre>\n"$(echo "<!--# include virtual=\"./${ESITENAME}.log\" -->")"</pre>\n"
EBODY=${EBODY}"\n</body>\n</html>"
echo -e "${EBODY}" 2>/dev/null > /var/opt/devops/front/var/www/log/${ESITENAME}.html
fi
done
if [ ! -f "${FILENAME}" ] ; then
BODY=${BODY}"<br /><br />There are currently no event logs.\n"
fi
BODY=${BODY}"\n</body>\n</html>"
echo -e "${BODY}" 2>/dev/null > /var/opt/devops/front/var/www/log/index.html
return ${?}
}
# Функция профилактической чистки директории журналов от устаревших файлов
function front-nginx-log-cleaning {
CONTAINERS=( $(docker ps --format '{{.Names}}' 2>/dev/null) )
for FILENAME in /var/opt/devops/front/var/www/log/*.log ; do
unset INVOLVED
# Для каждого файла проводим проверку на его связь с запущенными контейнерами
if [ -f "${FILENAME}" ] ; then
for ELEMENT in "${CONTAINERS[@]}"; do
[[ "${ELEMENT}" = *"$(basename ${FILENAME} .log)"* ]] && { INVOLVED=true; break; }
done
# Если файл журнала не связан с запущенными контейнерами и обновлялся более суток назад, то удаляем его
if [[ "${INVOLVED}" != "true" ]] ; then
FILEMTIME=$(stat -c %Y ${FILENAME}); CURRTIME=$(date +%s)
DIFFDAYS=$(( ( CURRTIME - FILEMTIME ) / 86400 ))
if [ "${DIFFDAYS}" -ge "1" ] ; then
rm -f "${FILENAME}"
front-nginx-log-show
fi
fi
fi
done
return ${?}
}