Uird.next

Сделал бранч для экспериментов - uird.next.
Пока добавлен только новый парсер параметров cfg_parser, разбирает параметры из конфига uird и cmdline и записывает в папку /tmp/parameters используя фс как массив. Значительно упрощается доступ к параметрам. Для получения значений можно использовать стандартные ls, cat, grep и т.д. Чтоб еще больше упростить добавил функцию getpar. Она заменяет и cmdline_value и cmdline_parameter.
Теперь на примере. Параметр uird.from=/MagOS::/mnt/magos::noexec,/MagOS-Data::/mnt/data

getpar uird.from 

вернет

1 2 

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

getpar uird.from 1

вернет

/MagOS
/mnt/magos
noexec

Здесь 1 это номер файла, то есть вернет весь первый параметр, с его подпараметрами (то что разделяется :: )

getpar uird.from 1 1

вернет

/MagOS

вторая цифра здесь номер строки
когда значение у параметра заведомо одно именно так оно и получается

getpar параметр 1 1

Теперь побочные, но полезные штуки.

getpar uird.from [[:digit:]]

вернет все значения по одному в строку, полезно когда нет подпараметров, например для uird.ro(cp,rw,run) это будут все значения разделенные переводом строки. Этот digit, будет добавлен к cat /папка/папка[[:digit:]], то есть можно и что-то другое [1-3] например. Имена файлов там только цифры.

getpar uird.from 1 "2,$"

вернет

/mnt/magos
noexec

то есть все подзначения первого параметра от второго до последнего, там просто sed по этому можно передать /regexp/ (только то что соответствует регекспу) или 1,4 (с первого по четвертый)

Если параметр значений не имеет, то два варианта проверки.

  • по коду завершения: 0 если параметр включен, и не 0 если не включен
  • по возвращаемому значению: enabled - если включен и пусто если выключен.
    Второй варант проверки удобен для параметров, которые можно использовать со значениями и без. Если включено то там либо enabled либо цифры, если выключено - пусто.
    Для выключения параметра включенного в конфиге передаем ему пустое значение.

P.S. Пока не все проверки переписал, только чтоб с моим cmdline загрузилось :))

Еще немного из идей. Uird.break привязал к параметрам uird. После первого поиска параметра который указан в uird.break включается дебаг режим.

uird.break=uird.from  - переход в дебаг режим перед поиском источников base уровня.

Так удобнее потому, что не нужно запоминать названия брейков и удаляется куча проверок из uird.init. (если какое то важное место будет упущено можно конкретное место вернуть).

Еще кучка изменений. Немного сломал даже совместимость. Сделал чтоб можно было передавать значения переменным из cmdline прямо в некоторые функции. Переменная должна быть обязательно локальной и объявленной, в таком варианте каждая функция забирает только свои переменные, а глобальные случайно не сломать. На этот принцип перевел получение всех доп значений. Получается так:
uird.from=/MagOS::MNT_OPTS=noexec::MNT=/mnt/magos
или так
uird.changes=/MagOS-Data/my.img::FS=btrfs::SIZE=2048::MNT_OPTS=compress=lzo
или так
uird.from=/MagOS;MagOS-Data::FORCE=yes::TIMEOUT=2

Буков больше, зато внутри не надо разбирать по косвеным признакам каждый параметр. Можно по этому принципу и в другие места допиливать если понадобится.

Прикольно, но кто кроме разрабов знает имена этих переменных…

Пока никто. Основное напишем в хелп, остальное только для избранных :slight_smile: Пока в доп.параметрах была только точка для бинда было нормально, когда появились параметры монтирования стало сложнее. По факту определялось так: что начинается со слэша - то бинд, оставшееся параметры монтирования. Если добавлять еще что-то вероятность ошибочного определения растет. А тут передаем прямо в нужную функцию. Пока этих функций штуки три всего, дальше будем смотреть.

По хорошему надо все параметры сделать безопасными и фишки, когда выполняется в параметрах bash надо сделать парольными наверное или через сертификат доверия.

Имеешь ввиду eval cmdline?

Да. Иначе не очень.

Согласен. С одной стороны:) А с другой стороны, если у тебя есть возможность записать в cmdline, тебя уже ничто не остановит :))

Для этой новой штуки с передачей параметров в функции эта проблема не актуальна я думаю. Хотя eval там тоже используется. Там есть проверка для каждой строчки для eval. Строка должна начинаться с имя_существующей_локальной_переменной=, то есть что угодно не выполнить.

Может тогда сделать секурный вариант уирда? То есть если собрано с ключем --secure, то uird будет подписанный, без eval cmdline, с правами 600 на сам файл uird и т.д. А если без ключа, то без паранойи.

Ну cmdline по хорошему надо закрыть, чтобы только доверенный вариант позволял выполнить там произвольный код. А во всех остальных случаях - только безопасные переменные. А две версии - поддерживаю.

По “закрыть” не понял, что имеешь ввиду?

Ну можно выполнять, если есть ключ или ввел пароль.

Не удобно будет. У Ильфата, например, имя модуля так задается с date. Придется пароль при каждой загрузке вводить для такой мелочи. Предлагаю для secure вообще запретить eval cmdline, а в обычном uird разрешить без паролей.

Поэтому я и говорю, что не только пароль, но и ключ.

типа uird.key=/keyfile.gpg. И тогда не спрашивать пароль. Так?

Да. Либо в uird_configs зашивать жестко

Можно сделать так. Кладем в корень файл paranoia, и записываем в него - 0. Ноль означает - отключено, все что больше нуля - включено. Так при желании даже уровень паранойи можно задать.
Где, кроме eval еще могут быть потенциально проблемные места?

Там где дебаг шелл доступ к шелу.