apt

package
v0.5.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 11, 2026 License: GPL-3.0 Imports: 9 Imported by: 0

README

APT C Bindings

C-интерфейс поверх libapt для использования через CGO

Структура файлов

include/              — публичные заголовки (C API)
  apt.h               — единый include (подключает всё)
  apt_common.h        — общие типы: AptPackageChanges, callback'и, opaque-указатели
  apt_error.h         — коды ошибок, AptResult, строковые константы ошибок
  apt_system.h        — инициализация APT
  apt_cache.h         — кеш пакетов
  apt_config.h        — конфигурация APT
  apt_transaction.h   — транзакции (install/remove/plan/execute)
  apt_package.h       — метаданные пакетов, поиск
  apt_lock.h          — проверка блокировок
  apt_logging.h       — callback'и логирования
  apt_ext_rpm.h       — обработка RPM-файлов в аргументах
src/                  — внутренние заголовки
*.cpp                 — реализация C API
Информация о пакетах (apt_package.h)
AptResult apt_package_get(AptCache *cache, const char *name, AptPackageInfo *info);
void      apt_package_free(AptPackageInfo *info);

AptResult apt_packages_search(AptCache *cache, const char *pattern, AptPackageList *result);
void      apt_packages_free(AptPackageList *list);

Метолы для работы с информацией о пакетах сильно изменяют и дополняют её:

apt_package_get — резолвит пакет по имени, виртуальному имени или пути к RPM-файлу:

  • Обычное имя (vim) — прямой поиск в кеше
  • Суффикс .32bit (vim.32bit) — срезается, ищется базовый пакет
  • Не найден — пробует i586- префикс (i586-vim)

apt_packages_search — поиск по расширенному regex (имя + описание):

  • Матчит по имени пакета и по LongDesc/ShortDesc
  • Пропускает i586- вариант если базовый пакет имеет кандидата (чтобы не дублировать)

Алиасы (i586/32bit). Оба метода заполняют поле aliases в AptPackageInfo:

  • Для пакета libSDL2 с i586-libSDL2 вариантом — алиасы ["i586-libSDL2", "i586-libSDL2.32bit"]
  • Для пакета i586-libSDL2 с базовым libSDL2 — алиасы ["i586-libSDL2", "i586-libSDL2.32bit"]

Список файлов. Поле files заполняется из RPM hdlist — читается заголовок RPM из файлов /var/lib/apt/lists/*_hdlist.*, извлекаются пути файлов

В итоге мы получаем дистиллированные списки где i586 улетают в алиасы, добавляются "файлы" известные из реп и тд. Работа с i586 никуда не уходит, просто APM скрывает все эти префиксы/суффиксы и пакеты в этом виде уже готовы для отображения на фронтенде

Ремарка: Возможно это неправильно и странно, но делать огромное количество дубликатов мне я не хочу, поэтому я не придумал ничего лучше, фактически эти списки нужны только для внутренней базы, а когда будет происходить установка/удаление APT сам выберет пакет под архитектуру поэтому это влияет только на отображение

Жизненный цикл

1. apt_init_config()               — настройка APT
2. apt_init_system(&system)        — инициализация, получаем AptSystem*
3. apt_cache_open(system, &cache)  — открываем кеш, получаем AptCache*
4. apt_transaction_new(cache, &tx) — создаём транзакцию

5. Наполняем транзакцию:
   - apt_transaction_install(tx, names, count)
   - apt_transaction_remove(tx, names, count, purge, depends)
   - apt_transaction_reinstall(tx, names, count)
   - apt_transaction_dist_upgrade(tx)
   - apt_transaction_autoremove(tx)

6. Либо симулируем, либо выполняем:
   - apt_transaction_plan(tx, &changes)               — что произойдёт (без фактических изменений)
   - apt_transaction_execute(tx, callback, ud, false) — реальная установка/удаление

7. Освобождение всякого последовательно:
   - apt_free_package_changes(&changes) - только если был вызван apt_transaction_plan
   - apt_transaction_free(tx)
   - apt_cache_close(cache)
   - apt_cleanup_system(system)

API по группам

Инициализация (apt_system.h)
AptResult apt_init_config();                    // настроить APT
AptResult apt_init_system(AptSystem **system);  // создать системный handle
void apt_cleanup_system(const AptSystem *sys);  // освободить
Кеш (apt_cache.h)
AptResult apt_cache_open(const AptSystem *sys, AptCache **cache, bool with_lock);
void      apt_cache_close(AptCache *cache);
AptResult apt_cache_refresh(AptCache *cache);   // переоткрыть кеш
AptResult apt_cache_update(AptCache *cache);    // скачать свежие индексы репозиториев

with_lock=true — блокирует доступ (нужно для update/execute). with_lock=false — только чтение (для симуляции, поиска).

Транзакции (apt_transaction.h)
AptResult apt_transaction_new(AptCache *cache, AptTransaction **tx);
void      apt_transaction_free(const AptTransaction *tx);

// Наполнение
AptResult apt_transaction_install(AptTransaction *tx, const char **names, size_t count);
AptResult apt_transaction_remove(AptTransaction *tx, const char **names, size_t count,
                                  bool purge, bool remove_depends);
AptResult apt_transaction_reinstall(AptTransaction *tx, const char **names, size_t count);
AptResult apt_transaction_dist_upgrade(AptTransaction *tx);
AptResult apt_transaction_autoremove(AptTransaction *tx);

// Симуляция — заполняет changes, система не меняется
AptResult apt_transaction_plan(const AptTransaction *tx, AptPackageChanges *changes);

// Выполнение — реально устанавливает/удаляет пакеты
AptResult apt_transaction_execute(const AptTransaction *tx,
                                   AptProgressCallback callback, uintptr_t user_data,
                                   bool download_only);

Транзакцию можно наполнять несколькими вызовами (install + remove в одной транзакции). После plan() или execute() транзакция отработана — для новой операции нужна новая транзакция

Информация о пакетах (apt_package.h)
AptResult apt_package_get(AptCache *cache, const char *name, AptPackageInfo *info);
void      apt_package_free(AptPackageInfo *info);

AptResult apt_packages_search(AptCache *cache, const char *pattern, AptPackageList *result);
void      apt_packages_free(AptPackageList *list);
Блокировки (apt_lock.h)
AptLockStatus apt_check_lock_status();
void          apt_free_lock_status(AptLockStatus *status);
Конфигурация (apt_config.h)
AptErrorCode apt_set_config(const char *key, const char *value);
char        *apt_config_dump(void);          // получить весь конфиг
void        *apt_config_snapshot(void);      // делает копию и сохраняет копию текущего конфига
void         apt_config_restore(void *snap); // Восстанавливает исходный конфиг

Работа с конфигами этими методами удобна тем что можно переопределить конфигурацию APT на фронтенде, например только для одной транзакции или в целом для всей сессии и затем откатить

Логирование (apt_logging.h)
void apt_set_log_callback(AptLogCallback cb, uintptr_t user_data);
void apt_use_go_progress_callback(uintptr_t user_data);
void apt_enable_go_log_callback(uintptr_t user_data);
void apt_capture_stdio(int enable);

Множество операции внутри либы включая работу с rpm ПЫТАЮТСЯ писать в вывод, что бы это запретить есть некоторые "васянские хаки" для перехвата и парсинга

RPM-аргументы (apt_ext_rpm.h)
AptResult apt_preprocess_install_arguments(const char **names, size_t count, bool *added_new);
void      apt_clear_install_arguments(void);

Потокобезопасность

Библиотека не потокобезопасна (колбеки глобальные например) поэтому нельзя делать более одной операции одновременно. Go-обёртка сериализует вызовы через мьютекс, так как в apm своя база данных - ему не нужны info/search методы на каждую операцию, только при общем обновлении или в других редких случаях при работе с rpm файлом.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var T_ = func(msgId string) string { return msgId }

T_ is the string translation hook, defaults to identity

Functions

func Close

func Close()

func SetErrorAnalyzer

func SetErrorAnalyzer(fn func(logs []string, err error) error)

SetErrorAnalyzer sets the error analyzer for APT operations

func SetTranslator

func SetTranslator(fn func(msgId string) string)

SetTranslator sets the translation function for the binding and lib

Types

type Actions

type Actions struct {
	// contains filtered or unexported fields
}

func NewActions

func NewActions() *Actions

func (*Actions) CombineInstallRemovePackages

func (a *Actions) CombineInstallRemovePackages(packagesInstall []string, packagesRemove []string,
	handler lib.ProgressHandler, purge bool, depends bool, downloadOnly bool) error

CombineInstallRemovePackages installs and removes packages in one transaction

func (*Actions) DistUpgrade

func (a *Actions) DistUpgrade(handler lib.ProgressHandler, downloadOnly bool) error

DistUpgrade upgrades the system

func (*Actions) DownloadSourcePackages added in v0.5.2

func (a *Actions) DownloadSourcePackages(packageNames []string, destDir string,
	handler lib.ProgressHandler) (packages []lib.SourcePackage, err error)

DownloadSourcePackages downloads .src.rpm files for the given names into destDir

func (*Actions) GetConfigOverrides

func (a *Actions) GetConfigOverrides() map[string]string

GetConfigOverrides returns current APT configuration overrides

func (*Actions) GetInfo

func (a *Actions) GetInfo(packageName string) (packageInfo *lib.PackageInfo, err error)

GetInfo returns info for a single package

func (*Actions) InstallPackages

func (a *Actions) InstallPackages(packageNames []string, handler lib.ProgressHandler, downloadOnly bool) error

InstallPackages installs packages

func (*Actions) ReinstallPackages

func (a *Actions) ReinstallPackages(packageNames []string, handler lib.ProgressHandler) error

ReinstallPackages reinstalls packages

func (*Actions) RemovePackages

func (a *Actions) RemovePackages(packageNames []string, purge bool, depends bool, handler lib.ProgressHandler) error

RemovePackages removes packages

func (*Actions) RpmGetInstalledPackages

func (a *Actions) RpmGetInstalledPackages(ctx context.Context, commandPrefix string, noLock ...bool) (map[string]string, error)

RpmGetInstalledPackages returns a map of installed packages (name -> version)

func (*Actions) RpmInstallSourcePackages added in v0.5.2

func (a *Actions) RpmInstallSourcePackages(ctx context.Context, commandPrefix string, files []string) error

RpmInstallSourcePackages installs .src.rpm files into the rpm build tree

func (*Actions) RpmIsAnyPackageInstalled

func (a *Actions) RpmIsAnyPackageInstalled(packageNames []string) (bool, error)

RpmIsAnyPackageInstalled checks whether at least one of the packages is installed

func (*Actions) RpmIsPackageInstalled

func (a *Actions) RpmIsPackageInstalled(packageName string) (bool, error)

RpmIsPackageInstalled checks whether the package is installed

func (*Actions) RpmQueryKernelPackages

func (a *Actions) RpmQueryKernelPackages(ctx context.Context) ([]KernelRPMInfo, error)

RpmQueryKernelPackages returns installed kernels via rpm

func (*Actions) Search

func (a *Actions) Search(pattern string, noLock ...bool) (packages []lib.PackageInfo, err error)

Search searches packages

func (*Actions) SetConfigOverrides

func (a *Actions) SetConfigOverrides(overrides map[string]string)

SetConfigOverrides sets APT configuration overrides

func (*Actions) SimulateAutoRemove

func (a *Actions) SimulateAutoRemove() (packageChanges *lib.PackageChanges, err error)

SimulateAutoRemove simulates removal of unused packages

func (*Actions) SimulateChange

func (a *Actions) SimulateChange(installNames []string, removeNames []string, purge bool, depends bool) (packageChanges *lib.PackageChanges, err error)

SimulateChange simulates combined install and remove

func (*Actions) SimulateChangeWithRpmInfo

func (a *Actions) SimulateChangeWithRpmInfo(installNames []string, removeNames []string, purge bool, depends bool, rpmFiles []string) (packageChanges *lib.PackageChanges, rpmInfos []*lib.PackageInfo, err error)

SimulateChangeWithRpmInfo simulates changes and fetches RPM file info in a single cache session

func (*Actions) SimulateDistUpgrade

func (a *Actions) SimulateDistUpgrade() (packageChanges *lib.PackageChanges, err error)

SimulateDistUpgrade simulates a system upgrade

func (*Actions) SimulateInstall

func (a *Actions) SimulateInstall(packageNames []string) (packageInfo *lib.PackageChanges, err error)

SimulateInstall simulates installation

func (*Actions) SimulateReinstall

func (a *Actions) SimulateReinstall(packageNames []string) (packageInfo *lib.PackageChanges, err error)

SimulateReinstall simulates package reinstallation

func (*Actions) SimulateRemove

func (a *Actions) SimulateRemove(packageNames []string, purge bool, depends bool) (packageInfo *lib.PackageChanges, err error)

SimulateRemove simulates removal

func (*Actions) Update

func (a *Actions) Update(handler lib.ProgressHandler, noLock ...bool) error

Update refreshes the local package database

type InstalledPackageInfo

type InstalledPackageInfo struct {
	Name    string
	Version string
	Arch    string
}

InstalledPackageInfo holds installed package info from rpm

type KernelRPMInfo

type KernelRPMInfo struct {
	Name      string
	Version   string
	Release   string
	BuildTime string
}

KernelRPMInfo holds kernel package info from rpm

type OperationOptions

type OperationOptions struct {
	SkipLock     bool
	RpmArguments []string
}

OperationOptions holds options for APT operations

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL