bol-van / zapret

DPI bypass multi platform
7.95k stars 608 forks source link

Конфигурация в /etc/zapret #232

Open Nishimara opened 2 months ago

Nishimara commented 2 months ago

Zapret в прошлом месяце был мной опакечен в nixpkgs. Пакет работает как должен, за исключением файлов, которые пользователю нужно изменять. Можно было бы пройтись по всем файлам в репозитории и изменить все $ZAPRET_BASE/ipset на /etc/zapret/ipset, но это было бы слишком много работы, поэтому я создаю этот ишью. Возможно, после проверки на file.default смотреть сначала в /etc/zapret, а после уже в $ZAPRET_BASE/file ?

bol-van commented 2 months ago

линухов существует великое множество работа по прикрутке к каждому не входит в планы она может перасти в большн возни чем суть проекта тут еще всякие прошивочки

софт в опт заточен на расположение всех файлов в одной локации это позволяет запускаться почти на всем без учета особенностей проще говоря опакечивать на надо

ASHGOLDOFFICIAL commented 2 months ago

Может, например, ввести какую-то переменную окружения или опцию в конфиге, которая будет указывать на расположение файлов? По умолчанию пусть указывает на /opt/zapret/ipset, но в случае, если потребуется (например, для пакетования в дистрибутивах), её можно будет изменить. Тогда вся работа по прикручиванию к дистрибутивам будет на плечах их мэйнтейнеров, которые будут менять значение переменной под свои дистрибутивы.

Просто NixOS не нацелен на то, чтобы запускать программы, не установленные через пакетный менеджер, и потому не факт, что в /opt он будет хорошо работать.

Nishimara commented 2 months ago

При установке в /opt оно вообще не будет работать без изменения кода, поэтому конкретно в этой ситуации без пакетирования не обойтись

bol-van commented 2 months ago

там рид онли система как в федоре сильверблю? но даже в ней опт в rw

Nishimara commented 2 months ago

нет, проблема в расположении бинарников в NixOS. в /bin, как факт, лежит только sh, а все остальное лежит в /run/current-system/sw/bin симлинками на /nix/store

Nishimara commented 2 months ago

отойдя от nixos, объявление пути к конфигу посредством переменной, нежели хардкодом, лучший подход. так, при смене $ZAPRET_BASE будет меняться и путь к ipset и остальным бинарникам

bol-van commented 2 months ago

а в чем проблема с опт ? ро ? ноэкзек?

Nishimara commented 2 months ago

/opt в никсос изначально вообще нет. Не предусмотрена возможность устанавливать софт методами, кроме установки через пакетный менеджер nix и конфигурации nixos

bol-van commented 2 months ago

zapret_base можно переопределить но инсталятор расчитан именно на опт и в системд юните есть хардкод

можно было бы сделать в дебиан стиле етц дефаултс запрет но как будет в других?

Nishimara commented 2 months ago

как писал @ASHGOLDOFFICIAL можно определить переменную к ipset, которая изначально будет /opt/zapret/ipset

bol-van commented 2 months ago

не только в ипсет изменяемые файлы еще конфиг и кастомы в инит.д

я готов сделать вариант с /etc/defaults для смены zapret_base и запишите в любую рв локацию весь запрет

или же там делится все что ро и все что рв ?

Nishimara commented 2 months ago

это не совсем тот подход для никса. все пакеты ставятся в /nix/store, который рид онли. подрузамевается что пакеты не трогают свою директорию, за исключением чтения, а вся конфигурация поставляется либо в environment, либо в /etc/ сейчас конфиг как раз поставляется как environment, а сервис переписан с исходника. поэтому я и предлагаю создать отдельную переменную для файлов в ipset и конфига (уже имеется)

bol-van commented 2 months ago

понятно. сделаю наверно но быстро не выйдет

bol-van commented 2 months ago

Взялся , наконец, за ваш вопрос Схема вырисовывается такая

Кладете куда-то то, что скачивается в 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

Nishimara commented 2 months ago

Ответом на первый вопрос может служить небольшая справка по опакечиванию пакетов в никсе. Для начала копируются сурсы в /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 пакета без его модификации, что приведет к полной его пересборке.