Как в скрипте на bash добавить или обновить блок кода в файле?

Как написать баш-скрипт для поиска блока конфигурации в файле `/etc/logrotate.d/syslog-ng` на Astra Linux, заменить его своими значениями в случае наличия или добавить, если блока нет? А также, как улучшить функцию `check_file_content_2`, чтобы она корректно реализовывала задачу поиска и добавления блока?
  • 24 мая 2024 г. 8:11
Ответы на вопрос 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 "файл не настроен"
Похожие вопросы