# telegraf-fix - проверка и починка telegraf на инсталляции vStack

Один скрипт, два режима. Сначала проверяет состояние, потом ( только по явной
команде ) применяет ровно те фиксы, условия которых выполнены.

## Затрагивает

- инсталляции vStackOS, где telegraf обновился при переходе 2.2 -> 3.0 и теперь
  работает под своим пользователем ( `telegraf_user` в rc-скрипте )
- не применяется, если telegraf не установлен или пакет старый ( работает от
  root ) - скрипт это распознаёт и ничего не делает

## Проблема

Апгрейд telegraf сменил запуск с root на пользователя telegraf. Из-за этого:
exec-скрипты в /root/bin становятся недоступны telegraf ( permission denied );
лог /var/log/telegraf/telegraf.log, принадлежащий root, мешает писать; а строка
ротации, шлющая сигнал в pidfile, при первой же ротации УБИВАЕТ telegraf, потому
что pidfile принадлежит супервизору daemon(8). Итог у партнёра - пропавшие
метрики и разросшийся лог.

## Что чинит

- move-scripts - переносит exec-скрипты из /root/bin в
  /usr/local/libexec/telegraf и правит пути в telegraf.conf
- chown-log - возвращает /var/log/telegraf/telegraf.log владельцу
  telegraf:telegraf ( 640 )
- fix-rotation - заменяет отсутствующую или опасную сигнальную ротацию на
  ротацию по размеру ( 10 MB ) с перезапуском через wrapper
- restart-service - поднимает telegraf, если он не запущен при
  telegraf_enable=YES, либо работает без daemon(8)-супервизора ( зомби после
  убитой ротации )

## Как проверить подпись и запустить

От root на ноде:

```
cd /tmp
fetch https://repo.vstack.com/hotfixes/telegraf-fix/telegraf-fix.sh
fetch https://repo.vstack.com/hotfixes/telegraf-fix/telegraf-fix.sh.sig
openssl dgst -sha256 -verify /usr/share/keys/vstack/vstackos.pub \
  -signature telegraf-fix.sh.sig telegraf-fix.sh
```

Дождаться `Verified OK` ( иначе файл повреждён или подменён - не запускать,
сообщить в поддержку ), затем:

```
sh telegraf-fix.sh          # режим check, только отчёт, ничего не меняет
sh telegraf-fix.sh apply    # применить найденные фиксы
```

## Как читать отчёт

```
== telegraf-fix on node01, mode: check ==
telegraf package:   1.34.0
service user:       telegraf
service state:      running (supervisor 81318, telegraf 81319)
conf references to /root/bin: none
log owner:          telegraf:telegraf
log rotation:       ok, restart wrapper
verdict: everything is in order, nothing to do
```

Вердикты:
- `everything is in order, nothing to do` - фиксы не нужны, ничего не менялось
- `fixes needed: ...` - перечень нужных фиксов; в режиме check ничего не
  меняется, в режиме apply каждый фикс отчитывается строкой `applied: ...`
- `fixes are not applicable` - telegraf отсутствует или пакет старый ( не
  обновлялся при переходе 2.2 -> 3.0, работает от root ); ничего не менялось

Коды возврата: 0 - порядок ( нечего чинить / неприменимо / фиксы применены ),
3 - check нашёл что чинить, 1 - ошибка или неуспешный apply ( выполнен откат ).

## Откат

Перед правкой telegraf.conf снимается бэкап `telegraf.conf.bak-<дата>`. Сервис
перезапускается только если применён фикс, который этого требует; если менялась
только ротация - сервис не трогается.

После перезапуска скрипт 20 секунд ждёт и проверяет, что telegraf работает
( супервизор + процесс ) и в свежем логе нет фатальных ошибок. Если telegraf не
поднялся - автоматический откат: конфиг возвращается из бэкапа, скрипты
переезжают обратно в /root/bin, сервис перезапускается со старым конфигом, код
возврата 1.

При отказе прислать в поддержку: полный вывод скрипта, вывод
`telegraf --test --config /usr/local/etc/telegraf.conf` и хвост
/var/log/telegraf/telegraf.log.

## Известные ограничения

- Скрипты, на которые ссылается конфиг, но которых нет ни в /root/bin, ни в
  /usr/local/libexec/telegraf - блокер, чинится руками ( отчёт покажет MISSING )
- Опасная запись ротации вне /usr/local/etc/newsyslog.conf.d/telegraf.conf
  ( например в /etc/newsyslog.conf ) - блокер, удалить руками и перезапустить
