Тестирую первую рабочую версию скрипта установки приложений для дистрибутива Chimbalix
С чего бы начать... Точно! Начнём с момента, когда стало возможным создание действительно автономных установочных пакетов с приложениями для дистрибутива Chimbalix! И я говорю не про линуксоидные DEB и прочие погрязшие в болоте зависимостей пакеты.
реклама
Так уж получилось, что в моём дистрибутиве (начиная с 24.1 Alphachi-Pre6) появился выделенный раздел меню "Applications", ведь использовать нестабильную помойку из стандартных линуксоидных разделов не представлялось возможным для долговременного размещения ярлыков приложений, да и линуксы, как правило, вовсе не предлагают вложенное меню "из коробки":
Мне пришлось придумывать отдельный раздел, который не будет значительно изменяться в будущем.
реклама
Для чего это надо? Правильно, чтобы однажды создав установочный пакет - не приходилось заново всё подгонять под новые версии дистрибутива, основные разделы которого могут измениться со временем, а полагаться на линуксоидную помойку стандартную... Извольте, но я не хочу этим дерьмом пользоваться:
Не знаю как там фанатам "дряхлого пингвина", но меня совсем не радует тот факт, что одно приложение может размазываться одновременно по двум и более разделам меню, это отвратительно, и это одна из причин, почему я вообще ушёл от линуксоидных стандартных категорий:
Я уже молчу про то, что у одного приложения может быть несколько разных ярлыков для разных задач, и с линуксоидским подходом они, как правило, разбросаны абы как наперекосяк по всему меню...
реклама
Новая категория "Applications" (apps) решает большинство характерных для линуксов проблем с меню "Пуск", да, чтобы добавить ярлыки, нужно ковырять три разных места разорванного в клочья "пингвина", это вам не Windows, где добавление разделов меню простая и интуитивно понятная задача, в Linux всё через задницу сделано, тем не менее такой подход позволяет каждому приложению иметь свой собственный раздел:
А благодаря стабильности раздела "apps" - не нужно переделывать однажды созданную структуру. Всё вроде прекрасно выглядит, даже примеры использования есть, берите и делайте! Но есть проблема... Одно дело создать пример использования, но совсем другое - создать установщик приложения.
У меня конечно есть старые наработки, но они настолько топорные, что под каждое приложение нужно всё переделывать, да и установочные файлы разбросаны обычными папками, что может привести к проблемам при копировании приложения через файловую систему вроде FAT32/NTFS, слишком многое может пойти не так:
реклама
Потому было решено начать разработку более совершенного скрипта установки приложений, который можно было бы использовать для установки разнообразного софта при минимальном вмешательстве в сам скрипт, и вот оно "чудо":
Да, на скриншоте видны папки с приложением и данными, но они не нужны для работы скрипта, главное сам скрипт и архив "installer_data", который к слову имеет формат сжатия 7-zip.
Ну что, перейдём сразу к делу, запустим установочный скрипт, запускать нужно в обычном пользовательском режиме:
Первым делом пользователю демонстрируется основная информация о приложении, тут же предлагается продолжить установку, в случае отказа или ошибок процесс установки будет прерван, а скрипт перейдёт к стандартной функции прерывания процесса установки, где будет выведена информация об "ошибке", эта же функция инициирует чистку временных файлов и размонтирование архива, если он был смонтирован:
Следующий этап предлагает пользователю проверить целостность архива, да, функция проста как дубина, и в принципе не является средством защиты от злоумышленников, но позволяет выявить проблемы с архивом, хоть скрипт и позволяет продолжить установку (пока не работает), но лучше прервать установку если ошибка спровоцирована не преднамеренно, а в следствии повреждения данных:
Дальше будет неожиданное, скрипт запросит root пароль!
Это действительно необходимо, ведь сейчас скрипт работает в режиме установки "System", а там без root доступа никак, на этом этапе происходит монтирование архива и сбор информации о файлах, да, о режиме установки нужно предупреждать заранее, или вовсе дать пользователю выбор в интерактивном режиме, но это как-нибудь потом доработаю:
Дальше начинается процесс установки, и сообщение о том, что установка завершена:
Собственно всё, приложение установлено:
И так же легко удаляется, кроме данных пользователя в домашнем каталоге, по очевидным причинам, да, скрипт удаления явно требует доработки, тем не менее он работает и свою задачу выполняет:
Теперь нужно протестировать режим установки в каталог пользователя:
Этапы с информацией ничем особо не отличаются, так что просто жмём "далее":
А вот дальше происходит проверка наличия файлов в каталогах назначения, и она предупреждает, что в каталоге пользователя уже есть файлы, и туда будут записаны новые данные, криво и косо конечно выглядит, но это дело поправимое, главное, что предупреждает:
В общем продолжаю и устанавливаю приложение:
Всё работает точно так же, как и в режиме установки "System", только не спрашивает root пароль для работы.
Удаление происходит штатно и без запросов root пароля:
На этом тестирование завершено, разумеется это не первое тестирование, ведь в процессе разработки мне приходилось неоднократно проводить тесты в виртуальной машине (ни разу не поломалась), и исправлять множество характерных для Linux граблей...
А теперь посмотрим внимательнее на структуру архива, каталог USER_HOME и application максимально просты, их названия всё говорят сами за себя, данные для установки в каталог пользователя и само приложение:
А вот каталог installer-data уже содержит каталоги bin, menu и заготовку скрипта удаления:
В каталоге "bin" хранятся заготовки bin файлов, как можно заметить, путь к приложению заменён строкой PATH_TO_FOLDER, она в процессе установки автоматически заменяется в зависимости от каталога назначения:
Переходим к "menu", тут три каталога, ведь меню в линуксах разорвано на три куска в трёх разных местах системы, всё это дерьмо нужно разложить по своим местам, чем занимается скрипт установки... Именно из-за этого я называю Linux "разорванным в клочья пингвином", просто он реально разорван в клочья:
Лишь бы не как в Windows было, наверное так думают разработчики подобного линуксоидного мракобесия...
Меню состоит из трёх частей, это сам файл "menu" формирующий структуру, в этом файле указывается относительный путь к "directory" и "desktop" файлам, но последние можно не указывать, вместо них можно задать уникальную категорию, и её указывать в "desktop" файлах, это может быть проще при наличии множества ярлыков:
Некоторые вероятно уже обратили внимание на уродливый и непостоянный синтаксис, путь к "directory" указан через слэш, а путь к "desktop" через дефис, но это ведь "жопен-сорс", каждый пляшет как попало...
Далее ярлыки (desktop файлы), они не брошены прямо в каталог apps, нет, они лежат в своём личном каталоге, а внутри можно найти уже знакомую строку PATH_TO_FOLDER, что автоматически подменяется при установке приложения, в остальном это обычный "ярлык":
И да, путь к иконке ярлыка нельзя указывать в кавычках, в отличие от путей к исполняемому файлу, глупо, нелогично и уродливо? Конечно! Это же "линукс"! Я был бы удивлён, если бы в линуксах такие мелочи были сделаны по-человечески и логично...
Directory файл тоже расположен не прямо в категории apps, а в своей личной папке, ведь таких файлов может быть несколько:
Я просто не хочу разводить типичную линуксоидную помойку как в других линуксах, когда все файлы брошены в одну кучу абы как по линуксоидски, и в эту же кучу бросаются все остальные файлы от других приложений, брр, отвратительно:
Да, у меня тоже помойка линуксоидная, ибо линуксоиды привыкли к помойке, и от этого невозможно избавиться, как говорится - нельзя из человека выбросить неряху... Но среди помойки есть каталог "apps", и там уже всё разложено по своим местам:
Конечно, линуксоидные разработчики могут засрать и этот каталог, но это уже не мои проблемы:
Моя задача была создать порядок в куче линуксоидного хаоса и мракобесия, и я создал, даже предоставил наглядные примеры правильного использования, что весьма щедро с моей стороны кстати, ибо линуксоиды разрабатывая софт, порой даже элементарных примеров использования не предоставляют, тупо набрасывают "сухие мануалы" и танцуйте с бубном как хотите без реальных примеров использования.
Собственно это весь архив, состоит из приложения, пользовательских данных и файлов меню, просто и понятно, а теперь перейдём к исходному коду, но постараюсь не останавливаться подробно, ибо объём статьи уже поджимает.
Начало скрипта состоит из комментариев, думаю есть смысл вынести это отдельным файлом, и более подробно всё расписать, так же в самом начале прописаны базовые переменные и стили, необходимые для оформления, в самом низу можно заметить переменную указывающую режим установки "User/System":
Далее идёт информация о приложении, вроде всё интуитивно понятно, тут же указан путь к архиву с приложением и MD5 хэш для проверки целостности:
Следом идут прочие настройки, например имя конечного каталога приложения, ещё можно указать владельца и права доступа к каталогу приложения при установке в режиме "System", тут же настраивается точка монтирования архива и временная папка.
Так как установка чего-либо в каталог пользователя это далеко не самая необходимая опция, и не является безопасной, да и нужна не всем приложениям, в настройках предусмотрен "выключатель".
Ну а конечные пути установки автоматически выбираются в зависимости от режима установки, их трогать смысла особо нет, а если есть необходимость это делать - значит приложение не соответствует принципу портативности, и скорее всего тащит с собой лишние зависимости для размазывания по операционной системе, что не приветствуется в моём дистрибутиве, хотя не исключён и вариант применения скрипта в других линуксах, но это уже не моя проблема:
Дальше начинаются функции, первая естественно "_ABORT", название говорит само за себя, если что-то пошло не так - оно идёт в "_ABORT" и на выход, далее функция отображения информации о приложении, показывает информацию и предлагает продолжить выполнение:
Вероятно некоторые уже заметили, но все важные функции имеют условие "all_ok", следующая функция просто не будет выполнена если предыдущая завершилась "плохо", потому в конце скрипта я могу не заботиться о дополнительных проверках и условиях вызывая функции в нужном порядке.
И да, BASH не умеет заранее определять функции, потому вызовы происходят именно в конце файла, неприятно конечно, но увы, ничего не поделать.
После идёт функция проверяющая целостность архива, там нет ничего примечательного, просто несколько условий и сравнений:
Кстати, про функцию "_CHECK_OS" забыли, она запускается первой, и собирает информацию о системе, она потом будет использоваться для предупреждения пользователя о запуске скрипта в системе, для которой не предназначен:
Так, после проверки целостности архива идёт функция монтирующая архив с приложением, и тут уже начинается "аттракцион" с разделением на режимы установки, ведь fuse используемый для монтирования не позволяет "вторгаться" в точку монтирования каким-либо иным пользователям, в режиме "System" происходит работа от имени root, смонтированный архив от имени любого другого пользователя будет просто недоступен, так же работает и в обратную сторону, архив смонтированный от имени обычного пользователя недоступен для root.
Можно конечно поизвращаться с аргументами утилиты sudo, но это лишний раз усложнит всё, и на данном этапе нецелесообразно.
Тут же поговорим про функцию "_UNMOUNT_ARCHIVE", она так же зависит от режима установки, ибо нельзя просто взять, и размонтировать архив...
После функции монтирования архива запускается функция считывающая файлы из архива, она же формирует списки файлов и каталогов, что потом будут использованы для поиска уже существующих файлов (поиск конфликтов), а так же будут записаны в шаблон скрипта удаления приложения.
Эта функция тоже разделена на два режима работы, ибо если архив смонтирован обычным пользователем, к нему невозможно получить доступ от имени root, и наоборот:
Далее функция отображающая подробную информацию о параметрах установки, то есть последний шаг перед началом установки, если конечно не возникнет "конфликтов":
Дальше идёт проверка каталогов и файлов на местах, куда устанавливается приложение, будет выведено предупреждение если обнаружены конфликты, тут уже нет необходимости в разделении на режимы работы:
Если никакого дерьма не случилось на всех предыдущих этапах - запускается функция установки приложения, разумеется она разделена на два режима, ну а при копировании файлов в каталог пользователя происходит предварительное копирование во временный каталог, а из него уже в каталог пользователя, да, костыль, но без него у пользователя будут файлы с неправильными правами доступа:
И в завершении функция подготовки скрипта удаления приложения, она так же разделена на режимы, и в случае "System" дополнительно устанавливает права доступа к файлу независимо от прав на основной каталог приложения, изменять его может только root, а читать и исполнять все.
В этой же функции происходит перезапуск панели задач, это необходимо для обновления элементов меню "Пуск", без неё не появится новое приложение в меню, это вам не Windows:
Скрипт удаления содержит функцию удаления файла/папки и пустой массив для путей к файлам, что заполняется скриптом установки, собственно тут ничего особого нет, хотя нет, тут есть остатки в виде проверки аргумента "silent", потом решу что с этим делать:
На этом завершу "обзор" скриптов...
Что тут сказать, скрипт установки приложений весьма "сырой", но он наконец работает, и выполняет задачу установки приложения в систему, хотя просто установить можно и всякими DEB пакетами, но я не хочу поддерживать помойку зависимостей и размазывание приложений кусками по всему линуксу...
Если разработчик ПО недостаточно компетентен, чтобы разрабатывать относительно простой софт, который не размазывался бы по всему линуксу как фекалии по сортиру, ну что тут сказать, пусть учится разрабатывать по-человечески.
Да и прямо сейчас я решаю свои проблемы, и как показывает практика - делаю это почти успешно, ради интереса на скорую руку подготовил установочный файл приложения Blender:
Да, есть недочёты, например путь установки Bin файлов не отображается в режиме "User", но ничего страшного, скрипт то совсем сырой ещё:
Хотя тут же выявилась проблема... Паковать приложение в 7-zip архив было не лучшей идеей, тем более если используются символические ссылки, линуксоидные архиваторы по умолчанию переводят ссылки в обычные файлы, нужно вручную ковырять флаги для исправления этого недостатка линуксоидных архиваторов...
А вот скорость установки оставляет желать лучшего, да и проявилась весьма странная ошибка копирования, хотя процесс на этом не завершился:
Файл кстати скопирован, правда его размер нулевой, и почему произошла ошибка пока непонятно, но она единичная, неужели что-то с файлом не так? Или скрипт нужно дорабатывать? В любом случае это нужно решать:
Хотя меня больше волнует скорость, она очень низкая, полагаю есть смысл архивировать в более простые форматы...
С форматом tar линуксоидный archivemount работает значительно быстрее, но не так, как хотелось бы, и от "случайных" ошибок все равно не спасает, можно было бы подумать, что это проявление характерной для линуксов проблемы, когда файлы ломаются из-за неадекватных механизмов кэширования ядра Linux:
Но на самом деле архивы упаковываются и распаковываются без ошибок, а значит это проблема неадекватной работы линуксоидной утилиты archivemount, она не только медленно работает, но и "допускает ошибки" в работе, отображая каталоги не там, где они должны находиться...
В любом случае приложение хоть и не с первого раза, но установилось полностью, и способ хранения файлов всё же нужно пересмотреть, слишком уж медленно выходит копирование больших объёмов прямо из смонтированного архива, да и ошибок в работе полно.
Эх, зря я понадеялся на линуксоидный софт для монтирования архивов, ибо, как всегда, линуксоидное работает через задницу...
Впрочем, именно для этого и нужно проверять софт в различных условиях, жаль только в линуксах вечно всё работает абы как наперекосяк, и приходится постоянно изобретать всевозможные костыли для решения всевозможных проблем, о которых я даже не подумал бы разрабатывая аналогичный скрипт в среде Windows, ибо в "плохой и ужасной" просто всё нормально работало бы как положено...
Вероятно, в среде "венды" я даже не занимался бы мракобесием с монтированием архивов, ввиду отсутствия необходимости заниматься таким дерьмом, а вся работа свелась бы к тупой распаковке файлов в нужные места, и может быть слиянием "reg" файла с реестром, если это очень уж нужно какому-нибудь приложению с минимумом зависимостей, а для сложных системных приложений мой скрипт и так и сяк не предназначен.
На этом завершу статью, тестирование прошло не безрезультатно, оказалось, что линуксоидный софт (archivemount) адекватно может работать только с простыми архивами, а с крупными и сложными допускает ошибки, да и скорость работы крайне низкая.
Полагаю есть смысл файлы приложения паковать вообще отдельным архивом, и рядом с установочным скриптом положить портативную, и главное актуальную версию 7-zip, а не прибитое гвоздями (зависимостями) к системе линуксоидное дерьмо 2016 года...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Неделя постоянной работы, и современный ноутбучный вентилятор с очень плотной крыльчаткой (радиальный вентилятор, "турбина") превращается в пушистого зверька:
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила