UMGUM.COM 

Функции визуализации ( Библиотека функций визуализации состояния и журналов событий тестовых стендов "Docker + Bash". )

4 мая 2019  (обновлено 17 июня 2019)

Эта публикация скрыта. Она доступна только по прямой ссылке.

OS: "Linux Debian 9 (Stretch)", "Linux Ubuntu 18.04 LTS (Bionic Beaver)".
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 ${?}
}


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )