Как была решена серьёзная проблема распространения софта для Linux в дистрибутиве Chimbalix
В прошлой части мы остановились на функции подтверждения установки приложения, рекомендую ознакомиться с прошлой частью, если вы впервые видите эту статью:
реклама
Вообще, первые 4 функции довольно простые, ведь в них нет никакой сложной логики, да и в следующих функциях тоже не будет ничего сложного, но именно с этого момента начинается вся самая ответственная работа...
К слову, функцию создания временного каталога следовало бы убрать из общей цепочки выполнения, ведь её вызовы должны происходить только в моменты необходимости, но дальше идёт функция _FILL_INPUT_FILES, от её работы зависит правильная подготовка файла "uninstall", и конечно же проверка каталогов на местах, куда будет установлено приложение:
реклама
Меня немного смущает такая зависимость функций друг от друга, тем более сейчас я не собираюсь использовать кривой функционал монтирования архивов от линуксоидных утилит.
С распаковкой основного архива никаких проблем, там просто распаковать и забыть, то же по сути и с файлами для каталога пользователя, но файлы меню и bin "ярлыки" так не выйдет распаковать... Или выйдет? Хм, если бы только мне не нужно было формировать список файлов для удаления...
В итоге переименовал функцию, чтобы имя соответствовало выполняемым задачам, и решил подготавливать все файлы сразу после распаковки во временный каталог, что кстати более оптимально, чем было в прошлой версии скрипта:
реклама
Готово, ещё одна функция переработана, так как с новым подходом не происходит монтирования архивов, то и делать разный код для разных режимов установки нет смысла, ведь работать с временными файлами можно от обычного пользователя, когда со смонтированным архивом это можно было делать только от имени пользователя, что производил монтирование.
Важно заметить... Чтобы всё корректно работало, нужно исправить функцию создания временного каталога, достаточно просто убрать "sudo", потому не буду на это отвлекаться в будущем:
реклама
По сути код даже упростился относительно предыдущего варианта, хотя погодите, я забыл сделать проверку результата работы архиватора, и автоматическое исправление прав на исполнение бинарного файла, вот так лучше:
С функцией проверки файлов в конечных каталогах почти ничего не делал, только убрал функционал, что больше не работает без функционала монтирования архивов:
Наконец настало время функции установки, в этот раз не будет происходить никакого мракобесия с монтированием архивов через линуксоидные инструменты, потому распаковка файлов приложения будет происходить прямо в пункт назначения.
Да, на этом этапе не нужны никакие root права, ведь каталог PortSoft изначально подразумевает полный доступ к содержимому для всех пользователей, а значит нет необходимости до сего момента прибегать к повышению привилегий.
Однако, если же режим установки будет системным для всех пользователей, то тут уже без вариантов, предоставьте root права для дальнейшей работы, ибо "ярлыки" без привилегий не выйдет скопировать.
Сразу можно заметить, что функция установки сильно упростилась, и это хорошо, ведь это ответственное место скрипта, и чем проще оно будет, тем меньше вероятность случайных ошибок в коде.
Ну а в случае обычного режима установки только для одного пользователя, root права вообще не нужны:
Однако рано ещё все проверять, осталось проработать функцию подготовки установочного файла, ведь теперь это делать нужно прямо в конечном каталоге установки, ибо шаблон теперь поставляется вместе с файлами устанавливаемой программы...
Готово! Убрал лишний старый код, и подправил оставшееся под новые реалии:
Пришло время протестировать скрипт, и первое дерьмо долго ждать не пришлось, архиватор завершается с ошибкой если видит "потенциально опасные" символические ссылки, что заставляет скрипт принудительно завершить работу независимо от критичности ошибки:
Почему архиватор ругается? Да потому что я создал ссылку через контекстное меню проводника, а там старая линуксоидная команда, что создает ссылки с абсолютными путями вместо относительных, с одной стороны это правильно, что путь абсолютный, но с другой приводит к проблемам... Другие люди просто не могут воспользоваться такой ссылкой, и это, увы, проблема сугубо человека, что допустил наличие ссылки с абсолютными путями в распространяемом архиве:
Но тут есть и моя проблема, скрипт должен обрабатывать такую ошибку и бить по рукам нерадивых разработчиков, допускающих такое дерьмо с абсолютными путями в ссылках на файлы...
Отлично, теперь у пользователя есть выбор, продолжить установку или прервать, таким образом буду бить по рукам нерадивых разработчиков/упаковщиков, что допускают символические ссылки с абсолютными путями в приложениях, я такие приложения видел, к сожалению, так что без внимания оставлять не собираюсь:
Хотя ладно, что-то пошло не так... Архиватор всё равно ругается на символическую ссылку, а всё потому, что я перепаковал архивы, но забыл удалить предыдущие, потому просто добавились новые файлы к старым, вполне весомый повод доработать скрипт упаковки архивов...
Если посмотреть на каталог назначения, можно обнаружить правильно подготовленную символическую ссылку, а значит скрипт всё делает правильно, нещадно бьёт нерадивого "упаковщика" по рукам, чтобы тот устранил проблему:
Ладно, мне лень переписывать хэши от старых архивов, так что проигнорируем недовольство скрипта во время тестирования:
Теперь скрипт ругается на присутствующий каталог в пункте назначения, как и положено, подтверждаю перезапись:
Готово, всё прошло без ошибок:
Но приложения нет в меню, потому что я случайно удалил каталог system_files, и не заметив такой оплошности создал пустой архив без ярлыков:
Что поделать, устанавливаю ещё раз:
Прекрасно! Всё установилось, и работает как положено!
И даже Bin ярлыки на месте, правда они работают только при обращении через bash, и только начиная с Chimbalix 24.4, что ещё не выпущен... А ещё вспомнил про один небольшой нюанс...
Правильно, нужно добавить проверку наличия локального каталога bin у пользователя, это хоть и не позволит обращаться к "бинарным" ярлыкам через терминал в текущей доступной версии дистрибутива Chimbalix 24.3, так как доставшиеся в наследство от MX Linux файлы bashrc/profile такая проверка не починит, но хотя бы не приведёт к падению функции копирования:
А что до кривых файлов bashrc/profile на стороне пользователя... Ну, проблема не особо критична, вот так скажу, это кривое дерьмо доставшееся по наследству от MX Linux будет исправлено в Chimbalix 24.4:
Для тех, кто хочет исправить доставшийся от MX Linux косяк... Путь к каталогу "local/bin" должен быть прописан в файле bashrc, именно этот файл обычно используется при нормальной работе системы.
Но если вдруг используется файл profile вместо bashrc, вступает в дело условие, подтягивающее файл с настройками bashrc, однако если bash версия не найдена - файл bashrc не будет подгружен, а путь к "local/bin" будет прописан отдельно, это всё необходимо для того, чтобы исключить двойное добавление путей в PATH:
Ладно, не будет отвлекаться, что там насчёт удаления установленного приложения? Хоть оно выглядит некрасиво, но свою задачу выполняет как положено:
Наконец скрипт заработал как положено!
Ну что, осталось проверить на сложном и массивном приложении свои труды! Начинаю с подготовки архивов, просто разложил по местам файлы запустив скрипт подготовленный ранее:
Так как у Blender нет файлов, которые нужно копировать в домашний каталог пользователя, отключаю данную функцию:
Blender довольно массивен (1.2 ГиБ), потому распаковка архива заняла немного больше двух секунд при установке с HDD на NVMe SSD, что многократно быстрее способов с монтированием архивов:
Прекрасно, всё установилось и работает как положено:
Удалять конечно же не буду, ибо знаю, оно удалит ровно то, что указано для удаления, да и эта программа мне ещё пригодится:
Теперь я могу в любой момент взять этот установочный пакет общим размером около 246 МиБ, и спокойно устанавливать когда захочу, и где захочу, разумеется при наличии дистрибутива Chimbalix на ПК:
Характерная для линуксов проблема распространения софта наконец решена в моём дистрибутиве! Увы, но никакие другие известные мне линуксоидские способы распространения ПО, не могут предоставить такой же простой функционал установки приложений, тем более в каталог пользователя...
Ни пресловутый DEB, ни Snap, ни RPM, ни боже упаси мерзкий Flatpak не могут предоставить мне возможность по-человечески устанавливать приложения в систему, в том числе без доступа к интернету, а вот мой Installer-SH позволяет, и даже не зависит от доступа к интернету, ибо не подразумевает в принципе такой мерзости как "болото зависимостей".
Осталось дело за малым - выгрузить наработки в GitHub репозиторий, чтобы другие люди могли взять "пример" и сделать свой собственный пакет приложения при желании:
https://github.com/Shedou/Chimbalix-Software-Catalog
Что дальше? Конечно же "полировать" скрипт, исправлять недостатки и совершенствовать при необходимости.
На этой успешной нотке завершу статью, я добился желаемого результата, хоть и не сразу, но новый скрипт теперь позволит легко создавать установочные пакеты разнообразных приложений, что пригодны для использования даже на полностью автономных системах, и позволяют устанавливать софт без root прав сугубо для одного пользователя.
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила