Как написать баш-скрипт для поиска блока конфигурации в файле `/etc/logrotate.d/syslog-ng` на Astra Linux, заменить его своими значениями в случае наличия или добавить, если блока нет? А также, как улучшить функцию `check_file_content_2`, чтобы она корректно реализовывала задачу поиска и добавления блока?
Для добавления или обновления блока кода в файле на bash можно воспользоваться утилитами `grep`, `sed` и `awk`. Вот пример такого скрипта:
```bash
#!/bin/bash
conf_file="/etc/logrotate.d/syslog-ng"
new_block="
# New block code
/var/log/syslog-ng/*.log {
compress
size 100k
rotate 5
daily
missingok
notifempty
copytruncate
}
"
if grep -q "/var/log/syslog-ng/*.log" "$conf_file"; then
sed -i '/\/var\/log\/syslog-ng\/\*\.log/, /^}/c\'"$new_block" "$conf_file"
else
echo "$new_block" >> "$conf_file"
fi
```
Этот скрипт сначала проверяет, существует ли блок конфигурации в файле `/etc/logrotate.d/syslog-ng`. Если он существует, то блок заменяется на новый. Если блока нет, то новый блок добавляется в конец файла.
Чтобы улучшить функцию `check_file_content_2` для реализации поиска и добавления блока, можно сделать следующие изменения:
```bash
check_file_content_2() {
local file="$1"
local search_pattern="$2"
local block="$3"
if grep -q "$search_pattern" "$file"; then
sed -i "/$search_pattern/, /^}/c\\$block" "$file"
else
echo "$block" >> "$file"
fi
}
# Пример использования:
conf_file="/etc/logrotate.d/syslog-ng"
search_pattern="/var/log/syslog-ng/*.log"
new_block="
# New block code
/var/log/syslog-ng/*.log {
compress
size 100k
rotate 5
daily
missingok
notifempty
copytruncate
}
"
check_file_content_2 "$conf_file" "$search_pattern" "$new_block"
```
Эти изменения позволят использовать функцию `check_file_content_2` для поиска и добавления блока в указанный файл с помощью переданных параметров.
Если вам надо писать на баше, то надо делать ровно то, что надо, и не более. Баш достаточно буквальный язык.
Первая часть:
#!/bin/bash # Создаем шаблон конфига из скрипта (без использования массива) cat > ./syslog-template <<"EOF" /var/log/syslog { rotate 10 size 10M daily missingok copytruncate notifempty compress delaycompress sharedscripts postrotate invoke-rc.d syslog-ng reload > /dev/null endscript } EOF # Удаляем секцию из файла sudo sed -i '/\/var\/log\/syslog/,/}/d' /etc/logrotate.d/syslog-ng # Добавляем секцию в файл # Тут, возможно, надо будет " | sudo tee -a" вместо пайпа cat ./syslog-template >> /etc/logrotate.d/syslog-ng
Вторая часть (не уверен, зачем она вообще нужна (так как изменения, внесенные первой частью, идемпотентны), но, раз вопрос так стоит, то пусть будет):
#!/bin/bash # На момент вызова файл шаблона должен существовать ORIGINAL=$(cat ./syslog-template) EXISTING=$(sed -rne '/\/var\/log\/syslog/,/}/p' /etc/logrotate.d/syslog-ng) [[ "$ORIGINAL" == "$EXISTING" ]] && echo "файл настроен" || echo "файл не настроен"