Страницы

Поиск по вопросам

Показаны сообщения с ярлыком deb. Показать все сообщения
Показаны сообщения с ярлыком deb. Показать все сообщения

четверг, 23 января 2020 г.

Распаковка deb-пакета С#

#c_sharp #ar #deb


Нужно распаковать deb-пакет на С#. Deb-файл является архивов ar. 

Есть ли какие-то библиотеки для распаковки архива ar под С#?

Зачем мне это нужно. Из deb-пакета я хочу получить версию пакета. То есть я хочу
добраться до файла control, где я смогу версию пакета прочитать. Может быть есть библиотеки
для чтения deb-пакета?
    


Ответы

Ответ 1



Под Windows deb файлы может открыть архиватор 7zip. Данная задача весьма специфическая Поэтому, сомневаюсь, что существует готовая "обёртка" под C# предназначенная специально для её решения. Вероятнее всего придётся писать её самому используя 7zip API. В принципе, есть ещё SevenZipSharp. Это "обёртка" для 7zip API под .NET. Хотя эта библиотека официально предназначена в основном для архивов в формате 7z и zip она также может распаковать и deb.

Ответ 2



С помощью библиотеки libarchive написал функцию на С++ #include "archive.h" #include "archive_entry.h" #include /** Примеры работы с библиотекой libarchive https://github.com/libarchive/libarchive/wiki/Examples */ /** * @brief Копирование данных из одного архива в другой * @param ar * @param aw * @return */ static int CopyData(struct archive *ar, struct archive *aw) { int r; const void *buff; size_t size; off_t offset; for (;;) { r = archive_read_data_block(ar, &buff, &size, &offset); if (r == ARCHIVE_EOF) { return (ARCHIVE_OK); } if (r < ARCHIVE_OK) { return (r); } r = archive_write_data_block(aw, buff, size, offset); if (r < ARCHIVE_OK) { fprintf(stderr, "%s\n", archive_error_string(aw)); return (r); } } } /** * @brief ExtractArchive Извечение архива на диск * @param filename - входной архив * @param outputDir - выходные данные * @return */ bool ExtractArchive(const char *filename, const char* dest) { struct archive *a; struct archive *ext; struct archive_entry *entry; int flags; int r; /* Select which attributes we want to restore. */ flags = ARCHIVE_EXTRACT_TIME; flags |= ARCHIVE_EXTRACT_PERM; flags |= ARCHIVE_EXTRACT_ACL; flags |= ARCHIVE_EXTRACT_FFLAGS; a = archive_read_new(); archive_read_support_format_all(a); archive_read_support_compression_all(a); ext = archive_write_disk_new(); archive_write_disk_set_options(ext, flags); archive_write_disk_set_standard_lookup(ext); if ((r = archive_read_open_filename(a, filename, 10240))) { fprintf(stderr, "file not found"); return false; } for (;;) { r = archive_read_next_header(a, &entry); if (r == ARCHIVE_EOF) { break; } if (r < ARCHIVE_OK) { fprintf(stderr, "%s\n", archive_error_string(a)); } if (r < ARCHIVE_WARN) { return false; } const char* currentFile = archive_entry_pathname(entry); const std::string fullOutputPath = std::string(dest) + currentFile; archive_entry_set_pathname(entry, fullOutputPath.c_str()); r = archive_write_header(ext, entry); if (r < ARCHIVE_OK) { fprintf(stderr, "%s\n", archive_error_string(ext)); } else if (archive_entry_size(entry) > 0) { r = CopyData(a, ext); if (r < ARCHIVE_OK) fprintf(stderr, "%s\n", archive_error_string(ext)); if (r < ARCHIVE_WARN) { return false; } } r = archive_write_finish_entry(ext); if (r < ARCHIVE_OK) { fprintf(stderr, "%s\n", archive_error_string(ext)); } if (r < ARCHIVE_WARN) { return -1; } } archive_read_close(a); archive_read_free(a); archive_write_close(ext); archive_write_free(ext); return true; } int main() { ExtractArchive(pathToDeb, destFolder); return 0; } Функции ExtractArchive передаю deb-файл, который он удачно распаковывает в папку destFolder. На выходе получаю 3 файла control.tar.gz data.tar.gz. dedian-binary. Теперь имея архив control.tar.gz, я его распакую(библиотек для работы с архивом tar.gz много, в том числе и для С#) и вытащу из него нужный мне файл control. Теперь сделаю сборку нативной библиотеки и буду дергать функцию ExtractArchive из С#. Это мое быстрое решение проблемы распаковки ar-архива под С#.

воскресенье, 12 января 2020 г.

Обновление своего deb-пакета

#debian #dpkg #deb


Относительно недавно сформировал свой собственный пакет files_1.deb для debian для
установки некоторых файлов на удаленные сервера филиалов. Файлы лежат в корне пакета.
Теперь создаю еще один deb-пакет, скажем, files_2.deb, в котором содержатся дополнительные
файлы, также в корне пакета.

Но когда выполняют команду dpkg -i files_2.deb на удаленном сервере, то неожиданно
удаляются на сервере файлы, которые были в files_1.deb.

Как это можно запретить? Файла postrm нет в обоих пакетах, чтобы было удаление.
    


Ответы

Ответ 1



скорее всего, удаляются не файлы, а обновляется пакет. вероятно, вы назвали пакеты именами files_1 и files_2. а так как символ подчёркивания не является допустимым в имени пакета, но служит для отделения имени пакета от опционального поля эпохи (epoch), то, с точки зрения пакетного менеджера, это один и тот же пакет (только с разными эпохами). поэтому пакет files (с эпохой 2) при установке и заменяет одноимённый пакет files (с эпохой 1). если вы хотите, чтобы пристутствовали файлы из обоих пакетов, самое логичное — установить оба этих пакета. естественно, они должны носить разные имена.

Расшарить репозитарий в локальную сеть

#linux #ubuntu #debian #репозиторий #deb


Создал локальный deb-репозиторий. На машине, где он установлен, все работает, пакеты
с него устанавливаются.

Что нужно сделать, чтобы его было видно на других машинах в сети?
    


Ответы

Ответ 1



установите любой http- или ftp-сервер, в качестве docroot-а настройте в нём каталог, в котором находится репозиторий (в этом каталоге должен быть под-каталог dists). на компьютерах, которым нужен доступ к этому репозиторию, добавляйте такие же строки в /etc/apt/sources.list, как вы добавили на той машине, где он находится, только url поставьте соответствующий. т.е., вместо: deb file:/путь/к/репозиторию ... указывайте (для http-сервера): deb http://адрес.или.имя.машины.с.репозиторием/ ... или (для ftp-сервера): deb ftp://адрес.или.имя.машины.с.репозиторием/ ...

вторник, 10 декабря 2019 г.

Почему ставить программы в обход пакетного менеджера linux плохо?

#linux #windows #администрирование #faq #deb


Не холивара ради, но накоплений точек зрения для.

Замучился отвечать одно и тоже в одинаковых темах "я запустил .run и всё сломалось",
"я распаковал tar и компьютер взорвался", поэтому создал вопрос, чтобы в дальнейшем
ссылаться сюда.
    


Ответы

Ответ 1



Чем плохо: Плохое обновление. В классическом варианте, менеджер пакетов сам проверяет наличие обновления, сам выкачивает и сам ставит. Руками поставленный бинарник или не будет обновляться вообще или будет обновляться тем способом, который выбрал разработчик. В итоге получаем кучу кастомных обновлялок, которые "висят в трее" и непонятно что делают. Плохое сопровождение. Вытекает из первого пункта. Раз непонятно как программа обновляется (не факт, что через скрипт, может и через бинарник), то непонятно куда, что, как, когда, зачем она ставит. При передаче системы в другие руки - нужно больше документации и объяснений кто с кем дружит, а кого в сеть не пускаем. Зоопарк версий. В linux библиотеки общие для всей системы. QT, mp3, java ставятся один раз и используются всеми, кому надо. В случае с ручной установкой, в систему (/opt тоже система) ставятся компоненты мутных версий, которые используются только этой программой. Проблемы начинаются, когда надо закрыть уязвимость, а что делать непонятно, потому что неизвестны (или надо сильно копать) версии и что сломается, если заменить один компонент, но оставить другой. Этим как раз и должен заниматься менеджер пакетов. Проблемы с совместимостью. В системе может быть старая версия ядра или libc и тогда программа будет вести себя весьма странно, если вообще заведётся. Обновление libc руками может уронить вообще всё остальное. Большие затраты по силам и времени. На большом количестве софта установленного руками, времени на поддержание версий в актуальном состоянии тратится просто вагон, а при наличии не одной машины - увеличивается до неприличных цифр. Проблемы с удалением. При удалении проги надо удалить все бинарники, библиотеки, кэши и конфиги, пройтись по всем /var/, /lib/ и /usr/. Самое главное - не удалить ничего лишнего, иначе см. выше про libc. На это тоже уходит порядочное количество времени. Чем хорошо: Свежие версии от разрабов. Не надо дожидаться слоупоков от дистрибутива, которые будут тестировать никому ненужную совместимость с остальными компонентами. Не надо привыкать к другой философии. На винде работало - чем тут хуже? Критические обновления безопасности ставят автоматом только трусы. Меня это не коснётся, мой проект хакерам не интересен. Можно почувствовать себя Ъ-][@k3r0m делая ./configure && make && make install и превращая Ubuntu\CentOS\SuSe в Slackware. Можно прочувствовать всю боль мейнтейнеров постоянно борясь с вылазиющими конфликтами компонентов. Дополнение 1. Отдельно стоит упомянуть виртуалки и контейнеры. Хостовая система будет изолирована, внутрь их можно делать сколь угодно ужасный деплой (но помнить, что плохой код\конфиг в любом уровне абстракции остаётся плохим), если придерживаться концепции атомарного обновления: хочешь обновить что-то - обнови в новом окружении всё что надо, замени старое, а старое грохни. FAQ. Q: А я делаю make install на локалхосте 5 лет и брат пока что жив. A: Молодец, возьми пирожок с полки. deb\rpm\etc придумали не потому, что дело было вечером и делать было нечего. Древние задолбались ставить всё руками и решили ввести абстракцию для облегчения жизни себе и другим. Значит у тебя не те объёмы, чтобы понять какой подарок сделала концепция пакетных менеджеров для администрирования систем. Q: Этим вашим deb и dnf я не могу поставить 2-3-5 версий библиотек в одну систему. Я буду продолжать использовать tar xvf. A: Никто не Вуди Аллен^W^W идеален. Или иди в ногу со всеми и пиши на том, на чём сидит большинство или используй контейнеры\виртуалки. Как вариант - найди дистрибутив, в котором пакетный менеджер позволяет это делать. Q: Тут нет самой свежей версии $AWESOME_SOFTWARE. Где там мой wget? A: Пакетный менеджер $DISTRONAME не серебряная пуля, но он покрывает ~90% потребностей обычного пользователя или админа. Нужна свежая версия? Сами разрабы часто держат свою репу под популярные дистрибутивы. И там можно даже dev-ветку из гита попробовать. Чешутся руки СОБИРАТЬ@КОМПИЛЯТЬ - запакеть то, что собрал и после этого устанавливай. Так, менеджер пакетов будет знать что делать и куда слать алярмы. Q: А что на счёт pip\gem\npm\? A: Спорно. С одной стороны - это менеджер пакетов, с другой - про его действия не сообщается "главному" менеджеру. Но если нет нужных компонентов у родителя, а они нужны позарез, то лучше хоть что-то, чем tar. Ну и если не использовать суперпользователя, то тот же питон ставится в домашний каталог не ломая текущие версии. Более того, оф. документация НЕ рекомендует ставить пакеты через pip в систему.

суббота, 7 декабря 2019 г.

Как создать deb пакет?

#python #ubuntu #python_3x #deb


Пишу на  python3  под Ubuntu, хочу создать deb пакет, подскажите как, или где есть
доступная информация?
    


Ответы

Ответ 1



Для того, кто не понимает как устроены .deb пакеты эта задача может оказаться неподъемной, как бы просто не было написано в гайдах. Первое, что у вас должно быть в наличии - это работающий setup.py, чтобы ваше приложение могло корректно собрать все необходимые файлы и зависимости, где надо скомпилироваться и т.д. Нет setup - нет пакета. Второе - ваш самый лучший друг отныне - это dh-virtualenv. dh - значит DebHelper. helper'ы - это специальные утилиты, помогающие собрать вам пакет. Эта штука прочитает ваш requirements, скачает нужную версию Python, скачает все зависимости, скомпилирует опять-таки все, что нужно и ваше приложение окажется мало того, что в пакете, так еще и автоматически в virtualenv. То есть ваше приложение развернется из пакета уже в изолированной обертке и вы можете быть уверены, что оно никому ничего не сломает, не переставит системный Python, не понаставит лишних библиотек и независимо. Это так круто, что даже сложно описать не задыхаясь. Подключить dh-virtualenv легко: Третье - создайте в корне проекта каталог с именем debian - это служебный каталог со служебными файлами. Об их назначении и подробностях вы сможете прочитать в соответствующих руководствах, здесь я приведу примеры таких файлов: rules: #!/usr/bin/make -f %: dh $@ --with python-virtualenv override_dh_virtualenv: dh_virtualenv --python /usr/bin/python3 Подключает dh-virtualenv и указывает, что собираемся с Py3. По умолчанию dh-virtualenv последней версии поместит ваши файлы при установке в /opt/venvs/, но это зависит от версии, читайте readme. Этот путь можно переопределить. control: Source: MY_COOL_PACKAGE Section: python X-Python3-Version: >= 3.3 Priority: extra Maintainer: Choo Choo Build-Depends: debhelper (>= 9), python, dh-virtualenv (>= 0.8), python3-setuptools Standards-Version: 3.9.5 Package: MY_COOL_PACKAGE Architecture: all Depends: ${python:Depends}, ${misc:Depends}, postgresql-client, libpq-dev, postgresql-contrib, python3-all, python3-dev, python3-setuptools, python3-pip, libxml2-dev, libxslt1-dev, zlib1g-dev Description: Таки посмотрите на зависимости, подставьте те, которые нужны вам В этом, да и makefile обратите внимание на наличие и количество пробелов - вся сборка это ОЧЕНЬ бюрократизированный процесс, не там поставите пробел (или поставите 5 вместо четырех) и долго не будете понимать, в чем дело. С пробелами нужно быть крайне внимательным, читайте в руководствах как конкретно разделяются секции и команды. compat: 9 changelog: тут вам поможет утилита dch. Пускайте man dch и вам там пояснят за смену версий, утилита простая. Можно жахнуть dch -i, чтобы увеличить версию на 1, заполнить список изменений и информацию о контрибьютере. Получится как-то так: MY_COOL_PACKAGE (0.5.1) experimental; urgency=medium * Пофиксил бажную страницу -- Choo Choo Mon, 10 Apr 2017 17:24:45 +0300 configs: /etc/MY_COOL_PACKAGE/my_config.ini - необходимость в этом файле возникает, если какие-то файлы должны поместиться в особенные каталоги (логи, конфиги). После этого ваше приложение выглядит как-то примерно так: my_app: -- .git -- sources ---- debian/ ------ changelog ------ compat ------ control ------ files -------- rules ---- source_files/ ---- requirements.txt ---- setup.py -- .gitignore -- readme.txt Когда все сделано, все файлы созданы - выполняете команду dpkg-buildpackage -us -uc. Кто-то предпочитает не пользоваться низкоуровневым dpkg, а вместо него использует дебил - debuild. Либо dpkg, либо дебил, если все сделано верно соберут вам пакет и несколько других файлов, они нас пока не касаются - вас интересует только .deb файл. Это обычный архив и вы можете посмотреть его, чтобы убедиться, что все на месте. Если все на месте, то не спешите радоваться, потому что перед тем, как посылать этот пакет в архив, вам нужно его проверить - за это отвечает утилита lintian - она проверит ваш пакет и выдаст вердикт. Если пакет некачественный, то перед установкой dpkg будет ругаться (и всем будет говорить, что пакет некачественный - стыдно), однако, после подтверждения даже некачественный пакет можно установить. Также нужно отметить, что приведенное "руководство" - довольно простой пример для маленького приложения. Наверняка вам потребуется изучить, как вставить pre-install, post-install скрипты (например, для миграций), не раз прочитать руководство на предмет остальных служебных файлов и параметров сборки, коих тьма.

Ответ 2



Похоже, вам нужен либо stdeb, либо пакет devscripts (можно установить командой sudo apt install devscripts)

среда, 6 марта 2019 г.

Расшарить репозитарий в локальную сеть

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


Ответ

установите любой http- или ftp-сервер, в качестве docroot-а настройте в нём каталог, в котором находится репозиторий (в этом каталоге должен быть под-каталог dists).
на компьютерах, которым нужен доступ к этому репозиторию, добавляйте такие же строки в /etc/apt/sources.list, как вы добавили на той машине, где он находится, только url поставьте соответствующий.
т.е., вместо:
deb file:/путь/к/репозиторию ...
указывайте (для http-сервера):
deb http://адрес.или.имя.машины.с.репозиторием/ ...
или (для ftp-сервера):
deb ftp://адрес.или.имя.машины.с.репозиторием/ ...

четверг, 11 октября 2018 г.

Как создать deb пакет?

Пишу на python3 под Ubuntu, хочу создать deb пакет, подскажите как, или где есть доступная информация?


Ответ

Для того, кто не понимает как устроены .deb пакеты эта задача может оказаться неподъемной, как бы просто не было написано в гайдах.
Первое, что у вас должно быть в наличии - это работающий setup.py, чтобы ваше приложение могло корректно собрать все необходимые файлы и зависимости, где надо скомпилироваться и т.д. Нет setup - нет пакета.
Второе - ваш самый лучший друг отныне - это dh-virtualenv. dh - значит DebHelper. helper'ы - это специальные утилиты, помогающие собрать вам пакет. Эта штука прочитает ваш requirements, скачает нужную версию Python, скачает все зависимости, скомпилирует опять-таки все, что нужно и ваше приложение окажется мало того, что в пакете, так еще и автоматически в virtualenv. То есть ваше приложение развернется из пакета уже в изолированной обертке и вы можете быть уверены, что оно никому ничего не сломает, не переставит системный Python, не понаставит лишних библиотек и независимо. Это так круто, что даже сложно описать не задыхаясь. Подключить dh-virtualenv легко:
Третье - создайте в корне проекта каталог с именем debian - это служебный каталог со служебными файлами. Об их назначении и подробностях вы сможете прочитать в соответствующих руководствах, здесь я приведу примеры таких файлов:
rules:
#!/usr/bin/make -f
%: dh $@ --with python-virtualenv
override_dh_virtualenv: dh_virtualenv --python /usr/bin/python3
Подключает dh-virtualenv и указывает, что собираемся с Py3. По умолчанию dh-virtualenv последней версии поместит ваши файлы при установке в /opt/venvs/, но это зависит от версии, читайте readme. Этот путь можно переопределить
control
Source: MY_COOL_PACKAGE Section: python X-Python3-Version: >= 3.3 Priority: extra Maintainer: Choo Choo Build-Depends: debhelper (>= 9), python, dh-virtualenv (>= 0.8), python3-setuptools Standards-Version: 3.9.5


Package: MY_COOL_PACKAGE Architecture: all Depends: ${python:Depends}, ${misc:Depends}, postgresql-client, libpq-dev, postgresql-contrib, python3-all, python3-dev, python3-setuptools, python3-pip, libxml2-dev, libxslt1-dev, zlib1g-dev Description: Таки посмотрите на зависимости, подставьте те, которые нужны вам
В этом, да и makefile обратите внимание на наличие и количество пробелов - вся сборка это ОЧЕНЬ бюрократизированный процесс, не там поставите пробел (или поставите 5 вместо четырех) и долго не будете понимать, в чем дело. С пробелами нужно быть крайне внимательным, читайте в руководствах как конкретно разделяются секции и команды.
compat: 9
changelog: тут вам поможет утилита dch. Пускайте man dch и вам там пояснят за смену версий, утилита простая. Можно жахнуть dch -i, чтобы увеличить версию на 1, заполнить список изменений и информацию о контрибьютере. Получится как-то так:
MY_COOL_PACKAGE (0.5.1) experimental; urgency=medium
* Пофиксил бажную страницу
-- Choo Choo Mon, 10 Apr 2017 17:24:45 +0300
configs: /etc/MY_COOL_PACKAGE/my_config.ini - необходимость в этом файле возникает, если какие-то файлы должны поместиться в особенные каталоги (логи, конфиги).
После этого ваше приложение выглядит как-то примерно так:
my_app: -- .git -- sources ---- debian/ ------ changelog ------ compat ------ control ------ files -------- rules ---- source_files/ ---- requirements.txt ---- setup.py -- .gitignore -- readme.txt
Когда все сделано, все файлы созданы - выполняете команду dpkg-buildpackage -us -uc. Кто-то предпочитает не пользоваться низкоуровневым dpkg, а вместо него использует дебил - debuild
Либо dpkg, либо дебил, если все сделано верно соберут вам пакет и несколько других файлов, они нас пока не касаются - вас интересует только .deb файл. Это обычный архив и вы можете посмотреть его, чтобы убедиться, что все на месте.
Если все на месте, то не спешите радоваться, потому что перед тем, как посылать этот пакет в архив, вам нужно его проверить - за это отвечает утилита lintian - она проверит ваш пакет и выдаст вердикт. Если пакет некачественный, то перед установкой dpkg будет ругаться (и всем будет говорить, что пакет некачественный - стыдно), однако, после подтверждения даже некачественный пакет можно установить.
Также нужно отметить, что приведенное "руководство" - довольно простой пример для маленького приложения. Наверняка вам потребуется изучить, как вставить pre-install, post-install скрипты (например, для миграций), не раз прочитать руководство на предмет остальных служебных файлов и параметров сборки, коих тьма.