OberonCore
https://forum.oberoncore.ru/

#020 Host: добавить модуль для чтения параметров запуска
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6557
Страница 2 из 3

Автор:  Иван Денисов [ Понедельник, 24 Февраль, 2020 22:12 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Вот скажем я запускаю расчет:
Код:
#!/bin/sh

PATH=./mpich32/bin:$PATH; export PATH
LD_LIBRARY_PATH=./mpich32/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH

mpiexec -n 5 bbcb $@


Где сам bbcb при том использует переменные окружения:
Код:
#!/bin/sh

pd="/usr/lib/blackbox"
sd=`readlink -f .`

env \
   BB_PRIMARY_DIR="${pd}" BB_SECONDARY_DIR="${sd}" \
   "${pd}"/blackbox


А аргументы для расчёта уже предаю в виде аргументов командной строки.
Обращаюсь к ним через Kernel.argc Kernel.argv
Это была рабочая ситуация, когда отлаживал MPI.

Так что тут переменные окружения отделяют настройки ББ от аргументов расчёта вполне удачно.
Да и сам ББ сейчас так распространяется со скриптом запуска, как я выше привел. И это удачный вариант. Так как вызов из директории, делает её рабочей.

Но для чтения через командную строку тоже не против добавить режим в HostEnv, чтобы он проверял "/BB_SECONDARY_DIR" или "--BB_SECONDARY_DIR"

Автор:  Comdiv [ Понедельник, 24 Февраль, 2020 22:39 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Иван Денисов писал(а):
Вот скажем я запускаю расчет:...
И где-нибудь из-за такой ошибки
Код:
env \
   BB_PRIMARY_DIR="${pd}" BB_SECONDARY_D1R="${sd}" \
   "${pd}"/blackbox

Что-то может пойти не так, и ББ об этом не сможет сообщить

Автор:  Илья Ермаков [ Вторник, 25 Февраль, 2020 00:17 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

На конференции "Доверенные системы" в этом году и ФГУП НТЦ "Атлас", и ИСП РАН в своем плаче о том, как тяжело сделать хоть немного доверенной экосистему GNU, особо обращали внимание на переменные окружения как фактор всяких уязвимостей.

Автор:  Евгений Темиргалеев [ Вторник, 25 Февраль, 2020 00:24 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

С точки зрения системы и переменные окружения и параметры командной строки являются законным способом передачи параметров в программу. Переменные окружения были задействованы в Linux в свое время просто как единственный адекватный вариант, потому что доступ к аргументам командной строки был проблематичен. Теперь, когда Trurl написал новый линкер, эта проблема ушла. Но это не противоречит тому, чтобы навести порядок в Host, поместив извлечение параметров в отдельный модуль.

Автор:  Иван Денисов [ Четверг, 27 Февраль, 2020 12:47 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Спасибо, Евгению, теперь Блэкбокс в Linux умеет читать еще и параметры запуска через аргументы командной строки:
Код:
./blackbox --BB_PRIMARY_DIR="." --BB_SECONDARY_DIR="/home/dia"


Чтобы работала переменная BB_SECONDARY_DIR нужно обязательно указать BB_PRIMARY_DIR.

Но если BB_PRIMARY_DIR задана через переменную окружения, то тогда достаточно указать только BB_SECONDARY_DIR
Код:
bbcb --BB_SECONDARY_DIR="/home/dia"


Графический пример:
Вложение:
HostEnv.png
HostEnv.png [ 84.25 КБ | Просмотров: 6486 ]


Всё это работает с версии 1.8-a1.015

Автор:  Иван Денисов [ Понедельник, 02 Март, 2020 09:39 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

luowy в чате предложил оформить также более традиционные интерфейсы. И назвать Args по аналогии с другими Оберон/Модула системами.

Код:
(** Args -- access to program arguments and evironment *)
MODULE Args;

(** argc -- number of arguments *)
VAR argc-: INTEGER;

(** GetArg -- fetch an argument into a string buffer *)
PROCEDURE GetArg*(n: INTEGER; VAR s: ARRAY OF CHAR) IS "Args_GetArg";
(* CODE
     const char *t = (0 <= args[0].i && args[0].i < saved_argc ?
               saved_argv[args[0].i] : "");
     obcopy((char * ) args[1].x, t, args[2].i); *)

(** GetEnv -- fetch an environment variable into a string buffer *)
PROCEDURE GetEnv*(name: ARRAY OF CHAR; VAR s: ARRAY OF CHAR) IS "Args_GetEnv";
(* CODE
     const char *t = getenv((char * ) args[0].x);
     if (t == NULL) t = "";
     obcopy((char * ) args[2].x, t, args[3].i); *)

PROCEDURE SetArgc(VAR ac: INTEGER) IS "Args_SetArgc";
(* CODE ( *(args[0].p)).i = saved_argc; *)

BEGIN
  SetArgc(argc)
END Args.


Также высказывал предложение про интерфейсный модуль. И потому горячу поддерживаю эту инициативу, в свете тренда по развитию средств интеграции Блэкбокса с ОС и другими программами.

Раз в Блкэкбоксе фактически уже есть реализации для этого интерфейса. То не вижу из каких соображений не добавить такой интерфейс.

Если есть люди, которые считают, что взятие переменных окружения и аргументов командной строки — это Bells & Whistles и, что мы превращаем Блэбокс в Visual Studio, тоже выскажитесь на этот счёт.

Автор:  Евгений Темиргалеев [ Понедельник, 02 Март, 2020 09:49 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Я считаю, что необходимость привязывать прикладную часть ББ к конкретным механизмам нижележащей системы надо обосновать. И это обоснование должно быть более весомым, чем "потому что так везде". "Потому что так у всех" еще не значит, что нет другого более оптимального на перспективу решения.

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

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

Автор:  Иван Денисов [ Понедельник, 02 Март, 2020 10:03 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Это нужно, чтобы уменьшить использование ядра напрямую. Сейчас люди просто используют Kernel.argc Kernel.argv
Код получается не кросс-платформенным, и это плохо. Для решения прикладных задач надо контролировать откуда пришел параметр, из командной строки или переменной окружения. Для настроек Блэкбокса в общем-то не важно. Так что ваша идея с GetPar я считаю отлично решает проблему настройки. Но раз она реализует и решает ходом другую проблему, то давайте решим и её также.

Автор:  Иван Денисов [ Понедельник, 02 Март, 2020 10:23 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Согласен с тем, что в некой абстрактной ОС нет понятия переменной окружения и нет понятия аргументов командной строки. Так что возможно в System не лучшее место.
Тем не менее в Dialog, например есть глобальная переменная commandLinePars.

Автор:  Иван Денисов [ Понедельник, 02 Март, 2020 11:13 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Раз необходимо обобщение, то я бы тогда сделал параметры двух видов:
- параметры окружения (операционной системы, сессии, пользователя)
- параметры запуска программы (аргументы командной строки, файлы с конфигурацией запуска и т.п.)

В общем они все параметры, так что получается в интерфейсе три процедуры для чтения:
- GetEnv
- GetRun
- GetPar, как обобщение первого и второго.

Автор:  adimetrius [ Понедельник, 02 Март, 2020 13:18 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Евгений Темиргалеев писал(а):
Например, можно ввести более общий интерфейс, который позволяет прикладным компонентам получать параметры из внешней среды в виде ключ/значение. А откуда эти параметры берутся -- это уже дело десятое. В одной сборке они могут браться из командной строки, во второй из переменных окружения, в третьей сразу и оттуда и оттуда, а в четвертой вообще читаются из файла или из реестра и т.п.


Плюсую. Это дает возможность абстрагироваться от источника настроек тем, кому это не важно; а кому важно - если, напр, я в Лин пишу утилиту командной строки - будут напрямую обращаться к параметрическому бэкэнду. Или с парой ключ/значение можно сообщать, откуда оно взялось.

Располагаться этот интерфейс должен в Dialog, кмк - если сохранять преемственность, поскольку там сейчас чтение параметров комстроки.

Автор:  Иван Денисов [ Четверг, 12 Март, 2020 07:04 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Теперь надо вот так запускать Windows версию в Wine
Код:
#!/bin/sh
wine '/home/dia/oberon/blackbox/BlackBox.exe' /USE "`winepath -w "$PWD"`" $* &


Раньше вот так работало
Код:
#!/bin/sh
wine '/home/dia/oberon/blackbox/BlackBox.exe' -use "`winepath -w "$PWD"`" $* &

Автор:  kekc_leader [ Понедельник, 18 Январь, 2021 07:03 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Comdiv писал(а):
2. С переменными окружения возможно неявное проникновение нежелательных параметров


Это для стабильности Оберона крайне важно. В переменных окружения может оказаться что угодно, и прийти оно может откуда угодно.
Поэтому, если, скажем, какое-то приложение объявило, что считывает такие-то переменные окружения, люди стали им пользоваться и вписывать в скрипты, а потом произошло обновление, в результате которого приложение стало считывать ещё какие-то переменные окружения, то уже нельзя сказать, будут ли эти скрипты продолжать работать корректно. Хотя тот, кто скрипт писал, никаких дополнительных параметров явно не передавал, а только те, из первого набора.

Автор:  Comdiv [ Воскресенье, 24 Январь, 2021 22:04 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

kekc_leader писал(а):
В переменных окружения может оказаться что угодно, и прийти оно может откуда угодно.
Поэтому, если, скажем, какое-то приложение объявило, что считывает такие-то переменные окружения, люди стали им пользоваться и вписывать в скрипты, а потом произошло обновление, в результате которого приложение стало считывать ещё какие-то переменные окружения, то уже нельзя сказать, будут ли эти скрипты продолжать работать корректно. Хотя тот, кто скрипт писал, никаких дополнительных параметров явно не передавал, а только те, из первого набора.

Свежий пример уязвимости на переменных окружения как часть общей картины проблемности этого типа данных:
Цитата:
Уязвимость заключается в том, что flatpak-portal передаёт переменные окружения, специфичные для обращающегося к сервису процесса, в обработчики, не изолированные от основной системы (например, запуская команду "flatpak run"). Вредоносное приложение может выставить переменные окружения, влияющие на работу "flatpak run", и запустить любой код на стороне хост-окружения.

Автор:  kekc_leader [ Вторник, 26 Январь, 2021 04:05 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Консольные приложения иногда считаются чем-то маргинальным, а ведь на серверах практически всё консольное.

В свете возникающей иногда необходимости писать консольные приложения, прошу обдумать следующее предложение:

Позволить программам на ББ получать аргументы командной строки в чистом виде через единую (кроссплатформенную) переменную или процедурный вызов.

Автор:  Иван Денисов [ Вторник, 26 Январь, 2021 05:23 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

С помощью HostEnv cделал, чтобы Dialog.commandLinePars корректно устанавливался на всех платформах. Вместо HostMenus установка происходит в HostDialog, так что в консольной версии эта переменная теперь тоже корректно устанавливается.

Автор:  Иван Денисов [ Вторник, 26 Январь, 2021 05:26 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Ещё вопрос возник. HostMenus содержит следующую возможность:
Код:
(* File for specifying command line options *)
cmdLinePath = "System/Rsrc";
cmdLineFile = "CommandLine.txt";

Как вы относитесь к этой функциональности? Сейчас она поддерживается только в Windows версии.
Может быть убрать это из Блэкбокса? Есть ли прецеденты, что кто-то пользовался этим?

Автор:  Борис Рюмшин [ Вторник, 26 Январь, 2021 11:59 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Так Env вроде бы работает универсально и с переменными окружения и с параметрами строки. Нет?

Автор:  Иван Денисов [ Вторник, 26 Январь, 2021 12:23 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Борис Рюмшин писал(а):
Так Env вроде бы работает универсально и с переменными окружения и с параметрами строки. Нет?

Ну только он HostEnv, а использовать модули подсистемы Host нельзя в проектах. Нужен тогда какой-то интерфейсный модуль Env.
У Артура похоже желание самому как-то парсить командную строку.

Автор:  Comdiv [ Вторник, 26 Январь, 2021 14:15 ]
Заголовок сообщения:  Re: #020 Host: добавить модуль для чтения параметров запуска

Иван Денисов писал(а):
Может быть убрать это из Блэкбокса? Есть ли прецеденты, что кто-то пользовался этим?
Похоже на костыль, а костыли для того и создают, чтобы пользоваться. Так что увы. Но может быть, что в нём уже давно отпала потребность, и о нём забыли.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/