Open Nishimara opened 2 months ago
линухов существует великое множество работа по прикрутке к каждому не входит в планы она может перасти в большн возни чем суть проекта тут еще всякие прошивочки
софт в опт заточен на расположение всех файлов в одной локации это позволяет запускаться почти на всем без учета особенностей проще говоря опакечивать на надо
Может, например, ввести какую-то переменную окружения или опцию в конфиге, которая будет указывать на расположение файлов? По умолчанию пусть указывает на /opt/zapret/ipset
, но в случае, если потребуется (например, для пакетования в дистрибутивах), её можно будет изменить. Тогда вся работа по прикручиванию к дистрибутивам будет на плечах их мэйнтейнеров, которые будут менять значение переменной под свои дистрибутивы.
Просто NixOS не нацелен на то, чтобы запускать программы, не установленные через пакетный менеджер, и потому не факт, что в /opt
он будет хорошо работать.
При установке в /opt оно вообще не будет работать без изменения кода, поэтому конкретно в этой ситуации без пакетирования не обойтись
там рид онли система как в федоре сильверблю? но даже в ней опт в rw
нет, проблема в расположении бинарников в NixOS. в /bin, как факт, лежит только sh, а все остальное лежит в /run/current-system/sw/bin симлинками на /nix/store
отойдя от nixos, объявление пути к конфигу посредством переменной, нежели хардкодом, лучший подход. так, при смене $ZAPRET_BASE будет меняться и путь к ipset и остальным бинарникам
а в чем проблема с опт ? ро ? ноэкзек?
/opt в никсос изначально вообще нет. Не предусмотрена возможность устанавливать софт методами, кроме установки через пакетный менеджер nix и конфигурации nixos
zapret_base можно переопределить но инсталятор расчитан именно на опт и в системд юните есть хардкод
можно было бы сделать в дебиан стиле етц дефаултс запрет но как будет в других?
как писал @ASHGOLDOFFICIAL можно определить переменную к ipset, которая изначально будет /opt/zapret/ipset
не только в ипсет изменяемые файлы еще конфиг и кастомы в инит.д
я готов сделать вариант с /etc/defaults для смены zapret_base и запишите в любую рв локацию весь запрет
или же там делится все что ро и все что рв ?
это не совсем тот подход для никса. все пакеты ставятся в /nix/store, который рид онли. подрузамевается что пакеты не трогают свою директорию, за исключением чтения, а вся конфигурация поставляется либо в environment, либо в /etc/ сейчас конфиг как раз поставляется как environment, а сервис переписан с исходника. поэтому я и предлагаю создать отдельную переменную для файлов в ipset и конфига (уже имеется)
понятно. сделаю наверно но быстро не выйдет
Взялся , наконец, за ваш вопрос Схема вырисовывается такая
Кладете куда-то то, что скачивается в zip архиве с git Это называется ZAPRET_BASE ZAPRET_BASE скриптами определяется по факту запуска оттуда. Если запустить blockcheck, он сделает ZAPRET_BASE как директория самого blockcheck Если запустить ipset/create_ipset.sh, он сделает ZAPRET_BASE как директория себя/.. Если запустить init.d/sysv/zapret, он сделает ZAPRET_BASE как директория себя/../..
ZAPRET_TARGET по умолчанию /opt/zapret - это та директория, которую install_easy считает своей целью. при несовпадении текущей директории начинается тема с копированием в ZAPRET_TARGET можно переопределить
Дальше делаем еще 2 переменных ZAPRET_RW по умолчанию принимает значение ZAPRET_BASE Это директория, которая копирует структуру ZAPRET_BASE только с теми директориями, в которых могут быть r/w файлы. Обычно она выглядит так: /etc/zapret_rw/config /etc/zapret_rw/init.d/sysv/custom /etc/zapret_rw/init.d/openwrt/custom /etc/zapret_rw/init.d/macos/custom /etc/zapret_rw/ipset/zapret-ip.txt.gz /etc/zapret_rw/ipset/zapret-user-ip.txt /etc/zapret_rw/ipset/zapret-user-hosts.txt ...................
ZAPRET_CONFIG принимает по умолчанию значение $ZAPRET_RW/config
НО
все-таки полностью r/o директорию ZAPRET_BASE сделать не получается, потому что install_bin.sh там создает линки на bins совместимой архитектуры, либо в binaries/my компилятся exe-шники
как вы это будете обыгрывать ?
и вопрос N2 по поводу systemd юнита. в init.d/systemd там жестко прописано /opt/zapret скрипт инсталяции делает на него ссылку в /lib/systemd/system
Ответом на первый вопрос может служить небольшая справка по опакечиванию пакетов в никсе. Для начала копируются сурсы в /nix/store, следом идет buildPhase - фаза сборки пакета, и завершает installPhase - фаза установки, как следует из названия. Добавляются переменные в environment сборщика - $src, сурсы проекта и $out, директория где находится все то, что на нормальной системе было бы раскидано по иерархии. Во время всех фаз $out остается read-write, а сурсы только для чтения.
На данный момент запрет опакечен следующим образом: https://github.com/NixOS/nixpkgs/blob/227ecf783e65363ba216d4889a39c366c65fc38a/pkgs/by-name/za/zapret/package.nix
в installPhase происходит все то, что делает install_bin.sh, а также заменяются все объявления ZAPRET_BASE на фактическое его местонахождение. никакие скрипты из проекта в ходе установки не запускаются
на второй вопрос ответ схож: сервис прописан с нуля опираясь на тот, что указан в проекте, но адаптирован под реалии nixos.
Изначальная проблема, по которой был создан ишью это как раз сервис. В отличии от пакета, в сервисе никак нельзя модифицировать $out пакета без его модификации, что приведет к полной его пересборке.
Zapret в прошлом месяце был мной опакечен в nixpkgs. Пакет работает как должен, за исключением файлов, которые пользователю нужно изменять. Можно было бы пройтись по всем файлам в репозитории и изменить все $ZAPRET_BASE/ipset на /etc/zapret/ipset, но это было бы слишком много работы, поэтому я создаю этот ишью. Возможно, после проверки на file.default смотреть сначала в /etc/zapret, а после уже в $ZAPRET_BASE/file ?