examples: add usage examples

parent 6aa57a70
"""ACL пакетов и группы мейнтейнера."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
acl = await client.api.acl.by_packages("sisyphus", ["firefox", "openssh"])
print("ACL пакетов:")
for pkg in acl.packages:
print(f" {pkg.name}: {', '.join(pkg.members) or '(группа)'}")
groups = await client.api.acl.maintainer_groups("rider")
print(f"\nГруппы rider:")
for br in groups.branches:
if br.groups:
print(f" {br.name}: {', '.join(br.groups)}")
await client.close()
asyncio.run(main())
"""Работа с API пакетов: информация и поиск."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
# Информация о пакете
result = await client.api.package.package_info("firefox", branch="sisyphus")
pkg = result.packages[0]
print(f"{pkg.name} {pkg.version}-{pkg.release} (arch={pkg.arch})")
print(f" Мейнтейнер: {pkg.packager}")
print(f" SHA1: {pkg.sha1}")
# Поиск пакетов в ветке
found = await client.api.site.find_packages("python3-module-alt", branch="sisyphus")
for p in found.packages[:5]:
print(f" {p.name}")
await client.close()
asyncio.run(main())
"""Работа с задачами через rdb API: поиск и информация."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
# Поиск задач мейнтейнера
result = await client.api.task.progress.find_tasks(
input=["fiersik"], branch="sisyphus", by_package=False
)
for task in result.tasks[:5]:
print(f"#{task.task_id} [{task.task_state}] {task.task_owner}")
# Информация о конкретной задаче
if result.tasks:
info = await client.api.task.task_info(result.tasks[0].task_id)
print(f"\nЗадача #{info.id}: {info.state} ({info.branch})")
await client.close()
asyncio.run(main())
"""AppStream: поиск приложений по имени пакета."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
await client.appstream.data.load_by_branch(branch, "latest")
for name in ["firefox", "telegram-desktop", "gimp", "vlc"]:
app_id = client.appstream.package.id_by_pkgname(name, branch)
print(f" {name} -> {app_id or '(нет в AppStream)'}")
await client.close()
asyncio.run(main())
"""Помощник бэкпортирования: зависимости для переноса пакета."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
result = await client.api.dependencies.backport_helper(
"sisyphus", "p11", ["ocaml"]
)
print(f"Бэкпорт ocaml из sisyphus в p11 ({result.count} пакетов):")
for level in result.dependencies:
for pkg in level.packages:
print(f" {pkg.name} {pkg.version}-{pkg.release} ({pkg.arch})")
await client.close()
asyncio.run(main())
"""Сравнение веток: различия между sisyphus и p11."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
pkgsets = await client.api.packageset.active_packagesets()
print(f"Активные ветки: {', '.join(pkgsets.packagesets)}")
diff = await client.api.packageset.compare_packagesets("sisyphus", "p11")
print(f"\nsisyphus vs p11 ({len(diff.packages)} записей):")
for p in diff.packages[:10]:
p1, p2 = p.package1, p.package2
if p1.name and p2.name:
print(f" {p1.name}: {p1.version} vs {p2.version}")
elif p1.name:
print(f" {p1.name}: {p1.version} (только sisyphus)")
await client.close()
asyncio.run(main())
"""Обновления безопасности: эрраты и advisory."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
branches = await client.api.errata.errata_branches()
print(f"Ветки с эрратами: {', '.join(branches.branches)}")
adv = await client.api.errata.advisory(branch="p11", limit=10)
if adv.erratas:
print(f"\nПоследние advisory для p11:")
for e in adv.erratas:
print(f" {e.id}: {e.type} ({e.updated})")
await client.close()
asyncio.run(main())
"""Образы ALT Linux: ISO и активные релизы."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
images = await client.api.image.iso_all_images()
print(f"Всего ISO-образов: {len(images.images)}")
for img in images.images[:5]:
print(f" {img.name} ({img.branch}, {img.date})")
active = await client.api.image.active_images(branch="p11")
if active.images:
print(f"\nАктивные образы p11:")
for img in active.images:
print(f" {img.edition}")
await client.close()
asyncio.run(main())
"""Дашборд мейнтейнера: пакеты, баги, устаревшие версии."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
nickname = "fiersik"
branch = "sisyphus"
info = await client.api.site.maintainer_info(branch, nickname)
mi = info.information
print(f"{mi.packager_name} ({mi.packager_nickname}), пакетов: {mi.count_source_pkg}")
pkgs = await client.api.site.maintainer_packages(branch, nickname)
print(f"\nПакеты в {branch}:")
for pkg in pkgs.packages[:5]:
print(f" {pkg.name} {pkg.version}-{pkg.release}")
bugs = await client.api.bug.bugzilla_by_maintainer(nickname)
if bugs and bugs.bugs:
print(f"\nБаги ({len(bugs.bugs)}):")
for bug in bugs.bugs[:5]:
print(f" #{bug.id} {bug.status}: {bug.summary}")
watch = await client.parser.packages.watch_by_maintainer(nickname, "by-acl")
if watch:
print(f"\nУстаревшие ({len(watch)}):")
for pkg in watch[:5]:
print(f" {pkg.pkg_name}: {pkg.old_version} -> {pkg.new_version}")
await client.close()
asyncio.run(main())
"""Зависимости пакета: сборочные и обратные."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
name = "firefox"
found = await client.api.site.find_packages(name, branch=branch)
pkghash = int(found.packages[0].versions[0].pkghash)
deps = await client.api.dependencies.source_package_dependencies(pkghash, branch)
print(f"Зависимости сборки {name} ({len(deps.dependencies)}):")
for dep in deps.dependencies[:10]:
print(f" {dep.name} ({dep.type})")
rdeps = await client.api.dependencies.what_depends_src(name, branch)
print(f"\nОт {name} зависят ({len(rdeps.dependencies)}):")
for dep in rdeps.dependencies[:10]:
print(f" {dep.name}")
await client.close()
asyncio.run(main())
"""Поиск по файлам: какой пакет содержит нужный файл."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
files = await client.api.file.search(branch, "nginx.conf")
print(f"Файлы nginx.conf ({len(files.files)}):")
for f in files.files[:5]:
print(f" {f.file_name} ({f.file_class})")
result = await client.api.file.packages_by_file(branch, "/usr/bin/python3")
print(f"\n/usr/bin/python3:")
for pkg in result.packages:
print(f" {pkg.name} {pkg.version}-{pkg.release} ({pkg.arch})")
await client.close()
asyncio.run(main())
"""Парсер новостей из рассылки sisyphus-cybertalk."""
import asyncio
from datetime import date
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
# Свежие новости Sisyphus
news = await client.parser.news.sisyphus()
if news:
print(f"Добавлено: {len(news.added or [])}")
print(f"Обновлено: {len(news.updated or [])}")
print(f"Удалено: {len(news.removed or [])}")
for pkg in (news.added or [])[:5]:
print(f" + {pkg.name} ({pkg.maintainer_nick})")
else:
print("Новостей нет")
# Агрегированные новости за период
news = await client.parser.news.packages_by_range(
date(2026, 3, 1), date(2026, 3, 10)
)
if news:
total = len(news.added or []) + len(news.updated or []) + len(news.removed or [])
print(f"\nЗа период: {total} изменений")
await client.close()
asyncio.run(main())
"""Watch (устаревшие пакеты) и FTBFS (ошибки пересборки)."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
# Устаревшие пакеты мейнтейнера
watch = await client.parser.packages.watch_by_maintainer("fiersik", "by-acl")
print(f"Устаревших пакетов: {len(watch)}")
for pkg in watch[:5]:
print(f" {pkg.pkg_name}: {pkg.old_version} -> {pkg.new_version}")
# Полный список устаревших пакетов
total = await client.parser.packages.watch_total()
print(f"\nВсего устаревших пакетов: {len(total)}")
# FTBFS
ftbfs = await client.parser.packages.ftbfs()
print(f"\nПакетов с ошибками пересборки: {len(ftbfs)}")
for pkg in ftbfs[:5]:
print(f" {pkg.name} {pkg.version} ({pkg.ftbfs_weeks} нед.)")
await client.close()
asyncio.run(main())
"""Безопасность: CVE-фиксы и эрраты пакета."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
fixes = await client.api.vuln.cve_fixes("CVE-2024-6387")
print(f"CVE-2024-6387 — исправлено в {len(fixes.packages)} пакетах:")
for pkg in fixes.packages[:5]:
print(f" {pkg.name} {pkg.version}-{pkg.release} ({pkg.branch})")
erratas = await client.api.errata.search(branch="p11", name="openssh")
if erratas.erratas:
print(f"\nЭрраты openssh в p11:")
for e in erratas.erratas[:5]:
print(f" {e.id}: {e.type} ({e.updated})")
await client.close()
asyncio.run(main())
"""Taskoteka: задачи girar через HTTP API."""
import asyncio
from altrepo import ALTRepo
async def main():
client = ALTRepo()
await client.init()
# Состояние сервиса
health = await client.taskoteka.health()
print(f"Статус: {health.status}, задач: {health.total_tasks}")
# Список владельцев задач
owners = await client.taskoteka.owners()
print(f"Владельцев: {len(owners)}")
# Активные задачи
tasks = await client.taskoteka.tasks()
print(f"\nАктивных задач: {len(tasks)}")
# Фильтрация по состоянию и репозиторию
tasks = await client.taskoteka.tasks(state="EPERM", repo="p11")
print(f"EPERM в p11: {len(tasks)}")
# Задачи конкретного пользователя
tasks = await client.taskoteka.tasks(user="rider")
print(f"Задачи rider: {len(tasks)}")
# Полнотекстовый поиск
tasks = await client.taskoteka.tasks(q="EPERM p11")
for t in tasks[:3]:
print(f" #{t.id} [{t.state}] {t.owner} matches={t.matches}")
# Только ID задач (brief)
ids = await client.taskoteka.tasks(state="BUILDING", brief=True)
print(f"\nID собирающихся задач: {ids}")
# Полная информация о задаче
if ids:
task = await client.taskoteka.tasks(task_id=ids[0])
print(f"\n#{task.taskid} [{task.state}] {task.repo} {task.owner}")
print(f" Сообщение: {task.message}")
for num, sub in task.subtasks.items():
print(f" Подзадача {num}: {sub.pkgname} ({sub.type})")
await client.close()
asyncio.run(main())
"""Taskoteka SSE: подписка на изменения задач в реальном времени."""
import asyncio
from altrepo import ALTRepo
from altrepo.taskoteka.models import TaskUpdatedEventModel, TaskNewEventModel, TaskRemovedEventModel
async def main():
client = ALTRepo()
await client.init()
print("Ожидание событий (Ctrl+C для выхода)...")
async for event in client.taskoteka.events():
if isinstance(event, TaskNewEventModel):
print(f"[NEW] #{event.data.id} {event.data.state} ({event.data.owner})", flush=True)
elif isinstance(event, TaskUpdatedEventModel):
print(f"[UPD] #{event.data.id} {event.data.prev_state} -> {event.data.state} ({event.data.owner})", flush=True)
elif isinstance(event, TaskRemovedEventModel):
print(f"[DEL] #{event.data.id}", flush=True)
else:
print(f"[{event.event}] {event.data}", flush=True)
await client.close()
asyncio.run(main())
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment