Как написать баш-скрипт для поиска блока конфигурации в файле `/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 "файл не настроен"