Работаем над Installer-SH, или как установить софт только для одного пользователя в Linux
Как установить приложение только для одного пользователя в Linux? На самом деле нет адекватных способов такое провернуть, увы, но в этом плане линуксы не доросли даже до уровня Windows XP, хотя казалось бы, на дворе 2024 год, и есть запросы на такой функционал от немногочисленных пользователей:
реклама
И вот, казалось бы, я разработал первую рабочую версию скрипта установки приложений, сделал два режима установки приложения, прямо в систему, и только для одного пользователя, даже поработал над хорошим сжатием установочных файлов, и оно прекрасно работало, пока в качестве приложения использовалось несколько маленьких файлов с простой структурой каталогов.
Но стоило сделать установочный пакет гораздо более сложного и массивного приложения...
реклама
Как сразу начали всплывать проблемы кривой линуксоидной утилиты archivemount, вокруг которой строилась вся логика работы программы установки:
Тестирую первую рабочую версию скрипта установки приложений для дистрибутива Chimbalix
Таким образом было решено полностью переработать структуру "программы установки", и отказаться от использования вечно кривых линуксоидных инструментов, увы, но я не нашёл адекватной замены утилите archivemount...
реклама
Почему разработка софта для Linux это сущий кошмар на примере Installer-SH для Chimbalix
Таким образом мне придётся основательно переработать практически весь имеющийся код, ибо новый подход подразумевает отсутствие функционала монтирования архивов, а это было главной особенностью скрипта, что позволяла практически всё нести в одном единственном архиве:
реклама
Так как изменений вносить придётся действительно много, пожалуй сделаю копию скрипта под новым именем, а старый останется как "пример":
Важно заметить, я до сих пор действую без какого-либо плана, да и какие конкретные планы могут быть в среде вечно кривых линуксов? В среде, где в любой момент может произойти абсолютно любое дерьмо, даже там, где казалось бы, что не может никакого дерьма случиться...
Ладно, приступим к написанию скрипта, начало позаимствую от старой версии, почему бы и нет... Дальше прописываю базовые переменные, в их число входит путь к данным и исполняемому файлу архиватора 7-zip:
Далее можно найти параметры отвечающие за режим установки, по умолчанию будет использоваться режим установки только для одного пользователя, но можно переключить в режим системы, хотя для установки в таком режиме нужны будут root права.
Тут же расположен переключатель, позволяющий отключить копирование прочих данных в каталог пользователя, ибо такой функционал нужен далеко не каждому приложению, и архив с такими данными может вообще отсутствовать:
Структуру переменных, содержащих информацию о приложении вообще не трогал, больно уж хорошо оно получилось:
А вот путей к архивам стало больше, и для каждого своя строка с MD5 хэшем, разумеется они будут заполняться именно тут, хотя можно было сделать специальную функцию, считывающую текстовые файлы рядом с архивом, но извольте, не хочу провоцировать лишние обращения к посторонним файлам.
Так как архив с прочими данными предназначенный для распаковки в каталог пользователя не обязателен, и вообще рекомендуется к использованию только в самых крайних случаях, когда приложение без этих данных будет работать некорректно, была введена дополнительная проверка, автоматически отключающая эту функцию при отсутствии архива:
Вроде и мелочь, но позволит избежать лишних проблем, если вдруг человек упаковавший приложение забудет о параметре "User_Data_Copy_Confirm"...
В этот раз я не буду полагаться на кривой линуксоидный функционал монтирования архивов, что во время тестирования с простыми архивами прекрасно работал, а как только повысил "сложность работы" - началось характерное линуксоидное мракобесие... Потому раздел параметров установки значительно сократился.
Остались параметры указывающие конечные пути установки, временная папка и путь к шаблону "uninstall" в конечном каталоге установки, так же немного переработаны имена переменных для удобства, всё равно переделывать практически весь скрипт, так почему бы не сделать лучше предыдущего?
И да, в этой зоне, основное что придётся менять при создании автономных установочных пакетов приложений, это название каталога установки приложения, всё остальное трогать смысла особо нет:
Функция вывода информации о приложении была слегка изменена, теперь выводит текущую версию операционной системы и режим установки, ведь по предыдущему опыту было ясно, что это необходимо выводить сразу:
Так как в этот раз не будет происходить монтирования архивов, то и функции контроля за этим делом тоже не нужны, однако временный каталог никуда не исчезает, и его нужно контролировать, потому нужно написать новую функцию _CLEAR_TEMP для этой задачи...
Хотя есть проблема, в новой версии скрипта я собирался использовать случайное имя временного каталога, чтобы исключить возможные конфликты с возможно существующими каталогами, однако если временный каталог будет создан, но не удалён в момент неожиданного прерывания работы скрипта, при следующем запуске старый временный каталог не будет обнаружен и удалён...
Вообще это очень неприятная ситуация, можно было бы разбить переменную на две части, и просто удалять все варианты с дополнительными числами в конце имени, но так как временные файлы находятся в каталоге предназначенном для временных файлов, я не вижу смысла извращаться так:
Потому добавляю два "случайных" числа в конец имени временного каталога, чтобы свести к минимуму вероятность совпадения с возможно существующими каталогами:
Хотя тут есть проблема, переменные "_$RANDOM" нужно разбивать кавычками друг от друга, а я этого не заметил до самого конца статьи... Ну ничего, бывает, лучше поздно исправить, чем никогда.
А вот и функция очистки временного каталога, она весьма проста:
Функция создания временного каталога содержит проверку наличия создаваемой папки, по идее можно и без неё обойтись, но мне не жалко лишней строчки кода, дополнительная проверка лишней не будет:
Тут же переработал порядок исполнения функций, теперь создание каких-либо временных файлов будет происходить только после того, как пользователь окончательно согласится устанавливать приложение, просто так правильнее:
Далее нужно переработать функцию _CHECK_MD5, в её задачи входит проверка целостности архивов и информирование пользователя о возможных проблемах.
Логика работы осталась прежней, разве что теперь проверяется три архива, и если хоть с одним архивом есть проблема - происходит вывод информации о несоответствии хэша, архив "user_files" проверяется только если активен параметр в самом начале скрипта:
И да, я начал выносить строковые "шаблоны" в отдельные переменные, чтобы можно было легко поправить оформление при необходимости:
В общем, проверка архивов работает как положено, можно двигаться дальше:
Что там у нас дальше идёт... Точно! Функция с подробной информацией об установке, она же последний этап, после которого будет проверка существующих каталогов, и начнётся процесс установки приложения:
Хотя постойте, я забыл исправить косяк в предыдущей функции, там нехватало одной строчки кода...
Не будем на этом заострять внимание, вернёмся к функции _PRINT_INSTALL_SETTINGS.
Хм... Пожалуй меня это устраивает
На данном этапе отображается режим установки, основные пункты назначения, и конечно же привлекаю внимание к тому факту, что будут установлены данные в домашний каталог пользователя:
Можно было подробнее тут расписать дополнительную техническую информацию, да и поправить отступы не помешало бы, но пока сойдёт и так.
И на этом завершу данную статью, дальнейшую работу над установочным скриптом продолжу в другой части, иначе наберётся слишком много материала за раз.
Эх, если так подумать, самую лёгкую работу я уже сделал ведь, дальше будет сложнее...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила