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

    @alvenysh Автор вопроса
    3vi1_0n3, в телеге самое простое)
    https://t.me/Esquisito
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    3vi1_0n3, добрый день, если предложение ещё актуально, я бы обратился. В целом я уже сделал этот большой скрипт, который будет проверять настройки для разных систем и предлагать их настроить, но, во-первых, часть почему-то не срабатывает (буквально по одному файлу почти в каждой из ос не настраиваются, либо пишут что не настроены, хотя всё ок). Ну и хотелось бы это сделать красивее. Потому что на данный момент код на больше чем 6к строк. Как будто можно его сделать более читаемым, но я пока не соображу как.
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    3vi1_0n3, так по факту там проверяется не только один конкретный конфиг, а несколько. Я, как уже писал, новичок в этом плане и поэтому для меня большой вопрос - можно ли проверить сразу столько файлов и при не успехе настраивать.
    66544a6eef95b931706981.png
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    3vi1_0n3, надо запустить на кучу компов проверку - надо ли делать хорошо. И там где надо, после, запустить уже настройку, чтобы было хорошо. Оттуда же и требование чтобы было только 2 скрипта: проверка и настройка, больше ничего. Там где полностью конфиг надо заменять решается просто, а здесь я застрял на том что конфиг на разных тачках у меня был разный и мне вроде как надо не трогая другие блоки заменить только оговоренный.
    В целом, наверное масси и правда излишний, но когда я сравнивал конфиги, которые должны быть с конкретным содержанием, я пользовался такой функцией
    function check_file_content() {
        local file_path=$1
        local expected_content=$2
    
        # Удаление пустых строк и пробелов
        local actual_content=$(sed -e '/^[[:space:]]*$/d' "$file_path")
        local expected_content_clean=$(echo "$expected_content" | sed -e '/^[[:space:]]*$/d')
    
        # Сравнение содержимого
        if [ "$actual_content" == "$expected_content_clean" ]; then
            echo "Содержимое файла $file_path соответствует ожидаемому."
        else
            echo "Содержимое файла $file_path не соответствует ожидаемому."
        fi
    }

    А когда я меняю только часть конфига, как это переделать в голову не пришло.
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    добрый день, это конечно вариант решения (ну и первую часть мы плюс/минус одинаково решили), но проверочная часть ваша не сработает, если запустят сначала проверку, а потом уже настройку (т.е. по факту это два разных скрипта, о чём я, возможно, не указывал). Но спасибо)
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    вторая часть решена.
    правда костыль, который мне не нравится, но я чёт не знаю как по-другому это реализовать
    взял функцию
    function check_strings_in_file {
        local file="$1"
        shift  # Сдвигаем аргументы, чтобы остальные были строками
        local all_found=true
    
        for str in "$@"; do
            if ! grep -qF "$str" "$file"; then
                all_found=false
                break
            fi
        done
    
        if $all_found; then
            echo "${file##*/} настроен"
        else
            echo "${file##*/} не настроен"
        fi
    }

    и подставил напрямую значения

    check_strings_in_file "/etc/logrotate.d/syslog-ng" "/var/log/syslog" "{" " rotate 10" " size 10M" " daily" " missingok" " copytruncate" " notifempty" " compress" " delaycompress" " sharedscripts" " postrotate" "    invoke-rc.d syslog-ng reload > /dev/null" "                 endscript" "}" >> $output_file


    Если есть идеи как это проверить по-другому, правильнее, напишите пожалуйста)
    Написано
  • Как добавить/обновить блок в файле bash скриптом?

    @alvenysh Автор вопроса
    в целом, первую часть задачи я решил:
    -удаляем полностью весь блок
    -заменяем своим

    sudo sed -i '/\/var\/log\/syslog/,/}/d' /etc/logrotate.d/syslog-ng
    
    sys_log=(
    "/var/log/syslog"
    "{"
      " rotate 10"
      " size 10M"
      " daily"
      " missingok"
      " copytruncate"
      " notifempty"
      " compress"
      " delaycompress"
      " sharedscripts"
      " postrotate"
      "    invoke-rc.d syslog-ng reload > /dev/null"
      "                 endscript"
    "}"
    )
    
    # Проходим по каждому элементу массива
    for file in "${sys_log[@]}"; do
      echo "$file" >> "/etc/logrotate.d/syslog-ng"
    done


    решение простое и надёжное.
    Теперь нужна вторая часть, которая будет проверять - есть ли такой блок в существующем файле.
    Наверное тоже каким-нибудь циклом проходиться и сверять $sys_log с тем что в файле?
    Я просто только неделю разбираюсь в баше и поэтому думал что есть простой вариант, про который я не знаю)
    *опять же искал простое решение, которое самому в голову пришло)

    ps: bash принципиален
    Написано
  • Как указать явно куда устанавливать pip пакеты?

    @alvenysh Автор вопроса
    Это какой-то идиотизм, но сейчас всё работает.
    Что помогло?
    Обновление образа. Тупо uppdate/upgrade.
    без этого при обновлении пипа root переставал понимать где находится pip + если вручную указывать откуда запускать (в моём случае /usr/local/bin/pip3), то пип отрабатывал, но патрони не видел установленные модули (как будто прав не хватало, чтобы их вызвать).
    Написано
  • Как указать явно куда устанавливать pip пакеты?

    @alvenysh Автор вопроса
    То есть ситуация такая: если я вручную через ssh ставлю от имени рута все пакеты на машине - патрони потом не стартует.
    Если абсолютно те же команды прописываю через sudo от user - то patroni стартует и работает.

    В целом в ансибле это и показано - он ставит пакеты от рута и пакеты идут куда-то не туда (или система не знает все места куда смотреть/нет прав чтобы всё смотреть). Если пытаюсь явно указать become_user: user получаю ошибку что хоть пакеты и скачались, но нет прав чтобы установить их в /usr/local/lib/python3.8/site-packages
    Если добавляю —user, то пакеты ставятся в домашнюю директорию пользака и опять же при попытке стартовать patroni не видит пакеты.
    Короче я примерно понимаю в чём загвоздка, но не знаю как это решить.
    Написано
  • Как указать явно куда устанавливать pip пакеты?

    @alvenysh Автор вопроса
    MaxKozlov, нет, там должно быть что-то вроде этого?

    [global]
    trusted-host = pypi.org
    pypi.python.org
    pypi.org
    pypi.co
    files.pythonhosted.org
    pip.pypa.io

    ps: я вчера поторопился когда написал что это сработало, т.к. при таком варианте patroni запускается и сразу же падает.
    Написано