From 04134c30963678e98e29d7d29413e64c87023355 Mon Sep 17 00:00:00 2001 From: emirhanmamak-blueforce Date: Thu, 17 Sep 2026 08:51:28 +0300 Subject: [PATCH] Add tests for window layout and responsiveness in GUI - Verify that the window starts in a compact size with a minimum size floor. - Ensure that the overview and sidebar adapt correctly to narrow widths. --- bfos/ui_gui.py | 42 +- repomix-output.xml | 93881 ++++++++++++++++++++++++++++++-- tests/test_bfos_gui_static.py | 14 + 3 files changed, 88885 insertions(+), 5052 deletions(-) diff --git a/bfos/ui_gui.py b/bfos/ui_gui.py index 691a771..1cd6af0 100644 --- a/bfos/ui_gui.py +++ b/bfos/ui_gui.py @@ -2715,6 +2715,8 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) self._browser_inner: dict[str, Any] = {} self._detail_body: dict[str, Any] = {} self._activity: list[tuple[str, str, str, str, str]] = [] + self._overview_card_frames: list[Any] = [] + self._overview_quick_buttons: list[Any] = [] self._elapsed = widgets.Elapsed() self._exec_title_text = "Etkin işlem yok." self._current_page = CATEGORIES[0] @@ -2723,13 +2725,19 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) # gecerli olmali, sonradan boyamak gri bir pencere ve titreme uretir. self.styles = theme.apply_theme(root) root.title(WINDOW_TITLE) - root.minsize(1040, 760) + # Tk, geometry verilmezse en buyuk istegi olan cikti/alt cubuk + # kombinasyonuna gore pencereyi ekranin tamamindan da buyuk acabiliyor. + # Saha laptoplarinda ilk bakis tek ekrana sigmali; kullanici yine + # pencereyi buyutebilir. 860x620, detayli moddaki iki kolonun + # kullanilabilir en dar guvenli tabanidir. + root.geometry("1180x720") + root.minsize(860, 620) root.columnconfigure(0, weight=1) # Bantlar: baslik -> uyarilar -> hedef -> govde -> cikti -> eylem. - # minsize: minimum pencerede (1040x760) islem listesi de cikti kuyusu da + # minsize: minimum pencerede (860x620) islem listesi de cikti kuyusu da # gorunur kalir; ikisi de agirlikla buyur, hicbiri digerini yutamaz. root.rowconfigure(3, weight=3, minsize=200) - root.rowconfigure(4, weight=2, minsize=170) + root.rowconfigure(4, weight=1, minsize=120) self._build_header() self._build_notices() @@ -2747,11 +2755,12 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) output_area.grid(row=4, column=0, sticky="nsew", padx=theme.SP_4, pady=(theme.SP_3, 0)) self._build_exec_header(output_area) - self.output = OutputPane(output_area, self.styles, height=7, + self.output = OutputPane(output_area, self.styles, height=5, log_path=ctx.console_log) self.output.drain() self._build_footer() self._apply_privilege_controls() + self.root.bind("", self._on_window_resized) self.show_mode(full=full_mode) self._load_inventory() @@ -3167,6 +3176,7 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) pady=(theme.SP_1, theme.SP_3)) self._bind_wrap(card, sub, theme.SP_7) self._overview_values[key] = (value, sub) + self._overview_card_frames.append(card) self._refresh_overview() box = ttk.Frame(page, style=self.styles["panel"]) @@ -3187,7 +3197,9 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) else self.styles["big_button"]) button = ttk.Button(inner, text=label, command=command, style=style_name, width=18) - button.pack(fill="x", pady=theme.SP_2) + button.pack(side="left", fill="x", expand=True, + padx=(0, theme.SP_2), pady=theme.SP_2) + self._overview_quick_buttons.append(button) if label == "Kur": self.install_button = button ttk.Label( @@ -3399,14 +3411,28 @@ class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) self._paint_nav() def _on_window_resized(self, event) -> None: - """Dar pencerede kenar cubugu katlanir (icerik nefes alir).""" + """Dar pencerede kabugu ve Genel Bakis kartlarini toplar.""" if event.widget is not self.root: return if event.width < 900: - self._sidebar.grid_remove() - else: + if hasattr(self, "_sidebar"): + self._sidebar.grid_remove() + elif hasattr(self, "_sidebar"): self._sidebar.grid() + cards = getattr(self, "_overview_card_frames", ()) + if cards: + columns = 2 if event.width < 1120 else 4 + for index, card in enumerate(cards): + card.grid_configure( + row=index // columns, + column=index % columns, + padx=(0, theme.SP_3) if index % columns < columns - 1 else (0, 0), + pady=(0, theme.SP_2) if columns == 2 and index // columns == 0 else (0, 0), + ) + for column in range(4): + self._overview_cards.columnconfigure(column, weight=1 if column < columns else 0) + def _build_category_page(self, parent, category: str): """Kategori sayfasi: solda islem tarayici, sagda ayrinti paneli.""" page = ttk.Frame(parent, style=self.styles["frame"]) diff --git a/repomix-output.xml b/repomix-output.xml index 0eeb8ad..f7aae01 100644 --- a/repomix-output.xml +++ b/repomix-output.xml @@ -40,6 +40,16 @@ The content is organized as follows: +admin/ + lib/ + creds.sh + targets.sh + tui.sh + bf + bf-bootstrap.sh + bf-creds + bf-menu + README.md ansible/ inventory/ group_vars/ @@ -52,12 +62,17 @@ ansible/ bf-deploy-update.yml bf-disk-check.yml bf-docker-status.yml + bf-enrollment-status.yml + bf-fieldos-version.yml bf-gui-off.yml bf-gui-on.yml + bf-offline-ready-check.yml bf-package-check.yml bf-ping.yml + bf-provisioning-status.yml bf-rdp-restart.yml bf-reboot.yml + bf-remote-channels-check.yml bf-run-script.yml bf-rustdesk-restart.yml bf-security-updates-check.yml @@ -92,6 +107,16 @@ ansible/ main.yml README.md .gitkeep +bfos/ + __init__.py + __main__.py + cli.py + config.py + operations.py + runner.py + tui.py + ui_gui.py + ui_theme.py config/ docker/ .gitkeep @@ -113,6 +138,8 @@ config/ bf-gui-off.service bf-gui-on.service blueforce-docker-firewall.service + blueforce-enroll.service + blueforce-enroll.timer journald-blueforce.conf logrotate-blueforce wireguard/ @@ -147,9 +174,16 @@ docs/ 23-SECURITY-AND-LICENSE-AUDIT.md 24-DECISION-LOG.md 25-IMPLEMENTATION-ROADMAP.md + 26-BLUEFORCE-FIELD-OS-ISO.md + 27-OFFLINE-PROVISIONING.md + 28-WINDOWS-TO-LINUX-MIGRATION.md + 29-DEVICE-ENROLLMENT.md + 30-FIELD-OS-RELEASE-MANAGEMENT.md + 31-LEARNING-GUIDE.md + 32-REPOSITORY-AUDIT-AND-CONFLICTS.md + 33-OPERATOR-CONSOLE.md + DESIGN.md docs-site/ - docs/ - .gitkeep src/ css/ custom.css @@ -164,6 +198,8 @@ docs-site/ sidebars.js sync-docs.sh tsconfig.json +migration/ + README.md monitoring/ grafana/ dashboards/ @@ -182,6 +218,1372 @@ monitoring/ .gitkeep docker-compose.yml README.md +provisioning/ + autoinstall/ + autoinstall.yaml + meta-data + README.md + user-data + enrollment/ + schemas/ + enrollment-request.schema.json + enrollment-response.schema.json + README.md + firstboot/ + bf-firstboot + blueforce-firstboot.service + README.md + iso/ + build-blueforce-iso.sh + field-os-version + README.md + test-iso.sh + ubuntu-26.04.1-SHA256SUMS + verify-upstream-iso.sh + offline-repo/ + built/ + pool/ + 3cpio_0.14.0-1ubuntu1_amd64.deb + accountsservice_23.13.9-8ubuntu5.2_amd64.deb + acl_2.3.2-2_amd64.deb + adwaita-icon-theme_50.0-1_all.deb + alsa-base_1.0.25+dfsg-0ubuntu9_all.deb + alsa-topology-conf_1.2.5.1-3build1_all.deb + alsa-ucm-conf_1.2.15.3-1ubuntu1.5_all.deb + alsa-utils_1.2.15.2-1ubuntu1_amd64.deb + anacron_2.3-45ubuntu1_amd64.deb + apparmor_5.0.2-0ubuntu1~26.04.1_amd64.deb + apport_2.34.1-0ubuntu0.1_all.deb + apport-core-dump-handler_2.34.1-0ubuntu0.1_all.deb + apport-gtk_2.34.1-0ubuntu0.1_all.deb + apport-symptoms_0.25build1_all.deb + appstream_1.1.2-1_amd64.deb + apt-config-icons_1.1.2-1_all.deb + apt-config-icons-hidpi_1.1.2-1_all.deb + apt-transport-https_3.2.0_all.deb + aptdaemon_2.0.2build1_all.deb + aptdaemon-data_2.0.2build1_all.deb + aspell_0.60.8.2-3_amd64.deb + aspell-en_2020.12.07-0-1.1build1_all.deb + at-spi2-common_2.60.4-0ubuntu0.1_all.deb + at-spi2-core_2.60.4-0ubuntu0.1_amd64.deb + avahi-daemon_0.8-18ubuntu1.1_amd64.deb + baobab_49.1-2_amd64.deb + bc_1.07.1-4build1_amd64.deb + bind9-dnsutils_1%3a9.20.24-1ubuntu0.3_amd64.deb + bind9-host_1%3a9.20.24-1ubuntu0.3_amd64.deb + bind9-libs_1%3a9.20.24-1ubuntu0.3_amd64.deb + binutils_2.46-3ubuntu2_amd64.deb + binutils-common_2.46-3ubuntu2_amd64.deb + binutils-x86-64-linux-gnu_2.46-3ubuntu2_amd64.deb + bluez_5.85-4ubuntu0.2_amd64.deb + bluez-cups_5.85-4ubuntu0.2_amd64.deb + bluez-obexd_5.85-4ubuntu0.2_amd64.deb + bolt_0.9.10-1_amd64.deb + brltty_6.7-1ubuntu6_amd64.deb + bsdextrautils_2.41.3-3ubuntu2.2_amd64.deb + bubblewrap_0.11.1-1ubuntu0.1_amd64.deb + busybox-initramfs_1%3a1.37.0-7ubuntu1_amd64.deb + busybox-static_1%3a1.37.0-7ubuntu1_amd64.deb + ca-certificates_20260601~26.04.1_all.deb + cloud-guest-utils_0.33-1build1_all.deb + cloud-init_26.1-0ubuntu3~26.04.1_all.deb + cloud-init-base_26.1-0ubuntu3~26.04.1_all.deb + colord_1.4.8-3_amd64.deb + colord-data_1.4.8-3_all.deb + console-setup_1.237ubuntu3.1_all.deb + console-setup-linux_1.237ubuntu3.1_all.deb + containerd.io_2.3.5-1~ubuntu.26.04~resolute_amd64.deb + cpp_4%3a15.2.0-5ubuntu1_amd64.deb + cpp-15_15.2.0-16ubuntu1_amd64.deb + cpp-15-x86-64-linux-gnu_15.2.0-16ubuntu1_amd64.deb + cpp-x86-64-linux-gnu_4%3a15.2.0-5ubuntu1_amd64.deb + cracklib-runtime_2.9.6-5.2build3_amd64.deb + crash_9.0.1+~16.3-1ubuntu1_amd64.deb + cron_3.0pl1-200ubuntu1_amd64.deb + cron-daemon-common_3.0pl1-200ubuntu1_all.deb + cups_2.4.16-1ubuntu1.3_amd64.deb + cups-browsed_2.1.1-0ubuntu3_amd64.deb + cups-bsd_2.4.16-1ubuntu1.3_amd64.deb + cups-client_2.4.16-1ubuntu1.3_amd64.deb + cups-common_2.4.16-1ubuntu1.3_all.deb + cups-core-drivers_2.4.16-1ubuntu1.3_amd64.deb + cups-daemon_2.4.16-1ubuntu1.3_amd64.deb + cups-filters_2.0.1-0ubuntu4.1_amd64.deb + cups-filters-core-drivers_2.0.1-0ubuntu4.1_amd64.deb + cups-ipp-utils_2.4.16-1ubuntu1.3_amd64.deb + cups-pk-helper_0.2.6-2.1build1_amd64.deb + cups-ppdc_2.4.16-1ubuntu1.3_amd64.deb + cups-server-common_2.4.16-1ubuntu1.3_all.deb + curl_8.18.0-1ubuntu2.5_amd64.deb + dbus_1.16.2-2ubuntu4_amd64.deb + dbus-bin_1.16.2-2ubuntu4_amd64.deb + dbus-daemon_1.16.2-2ubuntu4_amd64.deb + dbus-session-bus-common_1.16.2-2ubuntu4_all.deb + dbus-system-bus-common_1.16.2-2ubuntu4_all.deb + dbus-user-session_1.16.2-2ubuntu4_amd64.deb + dc_1.07.1-4build1_amd64.deb + dconf-cli_0.49.0-4_amd64.deb + dconf-gsettings-backend_0.49.0-4_amd64.deb + dconf-service_0.49.0-4_amd64.deb + desktop-file-utils_0.28-1build1_amd64.deb + dhcpcd-base_1%3a10.3.0-7_amd64.deb + dictionaries-common_1.31.4_all.deb + distro-info_1.15_amd64.deb + distro-info-data_0.72-0ubuntu0.26.04.1_all.deb + dmidecode_3.6-2ubuntu1_amd64.deb + dmsetup_2%3a1.02.205-2ubuntu3_amd64.deb + dmz-cursor-theme_0.4.5.3build1_all.deb + dns-root-data_2025080400build1_all.deb + dnsmasq-base_2.92-1ubuntu0.4_amd64.deb + docbook-xml_4.5-13build1_all.deb + docker-buildx-plugin_0.37.1-1~ubuntu.26.04~resolute_amd64.deb + docker-ce_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb + docker-ce-cli_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb + docker-ce-rootless-extras_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb + docker-compose-plugin_5.5.1-1~ubuntu.26.04~resolute_amd64.deb + dosfstools_4.2-1.2build1_amd64.deb + dracut_110-11ubuntu0.1_all.deb + dracut-core_110-11ubuntu0.1_amd64.deb + dracut-install_110-11ubuntu0.1_amd64.deb + eatmydata_131-2build1_all.deb + eject_2.41.3-3ubuntu2.2_amd64.deb + emacsen-common_3.0.8build1_all.deb + enchant-2_2.8.2+dfsg1-3build1_amd64.deb + espeak-ng-data_1.52.0+dfsg-5build1_amd64.deb + ethtool_1%3a6.19-1_amd64.deb + evolution-data-server_3.56.2-8_amd64.deb + evolution-data-server-common_3.56.2-8_all.deb + exfatprogs_1.3.2-1_amd64.deb + fdisk_2.41.3-3ubuntu2.2_amd64.deb + file_1%3a5.46-5build2_amd64.deb + firefox_1%3a1snap1-0ubuntu9.1_amd64.deb + fontconfig_2.17.1-3ubuntu1_amd64.deb + fontconfig-config_2.17.1-3ubuntu1_amd64.deb + fonts-adwaita_49.0+dfsg-2_all.deb + fonts-adwaita-sans_49.0+dfsg-2_all.deb + fonts-dejavu-core_2.37-8build1_all.deb + fonts-dejavu-mono_2.37-8build1_all.deb + fonts-droid-fallback_1%3a8.1.0r7-1~1.gbp36536bbuild1_all.deb + fonts-liberation_1%3a2.1.5-3build1_all.deb + fonts-liberation-sans-narrow_1%3a1.07.6-4build1_all.deb + fonts-noto-cjk_1%3a20240730+repack1-1build1_all.deb + fonts-noto-color-emoji_2.051-1build1_all.deb + fonts-noto-core_20201225-2build1_all.deb + fonts-noto-mono_20201225-2build1_all.deb + fonts-ubuntu_0.869+git20240321-0ubuntu2_all.deb + fonts-urw-base35_20200910-8build1_all.deb + foomatic-db-compressed-ppds_20250819-1build1_all.deb + fprintd_1.94.5-4_amd64.deb + freeipmi-common_1.6.16-1ubuntu0.1_all.deb + fuse3_3.18.2-1_amd64.deb + fwupd_2.1.1-1ubuntu3.1_amd64.deb + fwupd-signed_1.55+1.7-1_amd64.deb + gamemode_1.8.2-2build1_amd64.deb + gamemode-daemon_1.8.2-2build1_amd64.deb + gcc-15-base_15.2.0-16ubuntu1_amd64.deb + gcr_3.41.2-6_amd64.deb + gcr4_4.4.0.1-8_amd64.deb + gdb_17.1-2ubuntu1_amd64.deb + gdisk_1.0.10-2build1_amd64.deb + gdm3_50.1-0ubuntu0.1_amd64.deb + geoclue-2.0_2.7.2-2ubuntu3_amd64.deb + geocode-glib-common_3.26.4-3_all.deb + gettext-base_0.23.2-1_amd64.deb + ghostscript_10.06.0~dfsg-3ubuntu1_amd64.deb + gir1.2-accountsservice-1.0_23.13.9-8ubuntu5.2_amd64.deb + gir1.2-adw-1_1.9.1-0ubuntu0.1_amd64.deb + gir1.2-atk-1.0_2.60.4-0ubuntu0.1_amd64.deb + gir1.2-atspi-2.0_2.60.4-0ubuntu0.1_amd64.deb + gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-4build1_amd64.deb + gir1.2-freedesktop_1.86.0-6build1_amd64.deb + gir1.2-gck-2_4.4.0.1-8_amd64.deb + gir1.2-gcr-4_4.4.0.1-8_amd64.deb + gir1.2-gdesktopenums-3.0_50.0-1ubuntu2_amd64.deb + gir1.2-gdkpixbuf-2.0_2.44.5+dfsg-4ubuntu1_amd64.deb + gir1.2-gdm-1.0_50.1-0ubuntu0.1_amd64.deb + gir1.2-geoclue-2.0_2.7.2-2ubuntu3_amd64.deb + gir1.2-girepository-3.0_2.88.0-1_amd64.deb + gir1.2-glib-2.0_2.88.0-1_amd64.deb + gir1.2-gmenu-3.0_3.38.1-1ubuntu1_amd64.deb + gir1.2-gnomeautoar-0.1_0.4.5-5_amd64.deb + gir1.2-gnomebg-4.0_44.5-1ubuntu1_amd64.deb + gir1.2-gnomebluetooth-3.0_47.1-5_amd64.deb + gir1.2-gnomedesktop-3.0_44.5-1ubuntu1_amd64.deb + gir1.2-gnomedesktop-4.0_44.5-1ubuntu1_amd64.deb + gir1.2-gnomeqr-4.0_44.5-1ubuntu1_amd64.deb + gir1.2-graphene-1.0_1.10.8-5build1_amd64.deb + gir1.2-gstreamer-1.0_1.28.2-1_amd64.deb + gir1.2-gtk-3.0_3.24.52-0ubuntu1_amd64.deb + gir1.2-gtk-4.0_4.22.4+ds-0ubuntu0.1_amd64.deb + gir1.2-gweather-4.0_4.4.4-4_amd64.deb + gir1.2-handy-1_1.8.3-3build1_amd64.deb + gir1.2-harfbuzz-0.0_12.3.2-2_amd64.deb + gir1.2-ibus-1.0_1.5.34~rc2-1_amd64.deb + gir1.2-javascriptcoregtk-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb + gir1.2-mutter-18_50.1-0ubuntu2.2_amd64.deb + gir1.2-nm-1.0_1.54.3-2ubuntu3_amd64.deb + gir1.2-nma4-1.0_1.10.6-7_amd64.deb + gir1.2-notify-0.7_0.8.8-1_amd64.deb + gir1.2-packagekitglib-1.0_1.3.4-3ubuntu1.2_amd64.deb + gir1.2-pango-1.0_1.57.0-1_amd64.deb + gir1.2-polkit-1.0_127-2ubuntu1.1_amd64.deb + gir1.2-rsvg-2.0_2.61.3+dfsg-3_amd64.deb + gir1.2-secret-1_0.21.7-2build1_amd64.deb + gir1.2-snapd-2_1.72-0ubuntu3_amd64.deb + gir1.2-soup-3.0_3.6.6-1_amd64.deb + gir1.2-upowerglib-1.0_1.91.1-1_amd64.deb + gir1.2-vte-2.91_0.84.0-2_amd64.deb + gir1.2-webkit2-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb + gir1.2-wnck-3.0_43.3-1build1_amd64.deb + git_1%3a2.53.0-1ubuntu1_amd64.deb + git-man_1%3a2.53.0-1ubuntu1_all.deb + gjs_1.88.0-1_amd64.deb + glib-networking_2.80.1-1build2_amd64.deb + glib-networking-common_2.80.1-1build2_all.deb + glib-networking-services_2.80.1-1build2_amd64.deb + glycin-loaders_2.1.1+ds-0ubuntu1_amd64.deb + glycin-thumbnailers_2.1.1+ds-0ubuntu1_amd64.deb + gnome-accessibility-themes_3.28-5_all.deb + gnome-bluetooth-3-common_47.1-5_all.deb + gnome-bluetooth-sendto_47.1-5_amd64.deb + gnome-calculator_1%3a50.0-1ubuntu1_amd64.deb + gnome-characters_50.0-1_amd64.deb + gnome-clocks_50.0-1_amd64.deb + gnome-control-center_1%3a50.3-0ubuntu0.2_amd64.deb + gnome-control-center-data_1%3a50.3-0ubuntu0.2_all.deb + gnome-control-center-faces_1%3a50.3-0ubuntu0.2_all.deb + gnome-desktop3-data_44.5-1ubuntu1_all.deb + gnome-disk-utility_46.1-2ubuntu2_amd64.deb + gnome-font-viewer_49.0-1_amd64.deb + gnome-initial-setup_50.0-0ubuntu7.1_amd64.deb + gnome-keyring_50.0-1_amd64.deb + gnome-keyring-pkcs11_50.0-1_amd64.deb + gnome-logs_49.0-1_amd64.deb + gnome-menus_3.38.1-1ubuntu1_amd64.deb + gnome-online-accounts_3.58.0-1_amd64.deb + gnome-remote-desktop_50.2-0ubuntu0.1_amd64.deb + gnome-session_50.1-0ubuntu0.1_all.deb + gnome-session-bin_50.1-0ubuntu0.1_amd64.deb + gnome-session-canberra_0.30-18ubuntu3_amd64.deb + gnome-session-common_50.1-0ubuntu0.1_all.deb + gnome-settings-daemon_50.0-1ubuntu1_amd64.deb + gnome-settings-daemon-common_50.0-1ubuntu1_all.deb + gnome-shell_50.1-0ubuntu1.2_amd64.deb + gnome-shell-common_50.1-0ubuntu1.2_all.deb + gnome-shell-ubuntu-extensions_50.26.04.7ubuntu_all.deb + gnome-terminal_3.58.0-1ubuntu1_amd64.deb + gnome-terminal-data_3.58.0-1ubuntu1_all.deb + gnome-text-editor_50.1-0ubuntu0.1_amd64.deb + gnome-themes-extra_3.28-5_amd64.deb + gnome-themes-extra-data_3.28-5_all.deb + gnome-user-docs_50.0-0ubuntu1_all.deb + gnupg_2.4.8-4ubuntu3.1_all.deb + gpg-wks-client_2.4.8-4ubuntu3.1_amd64.deb + groff-base_1.23.0-10_amd64.deb + grub-common_2.14-2ubuntu2.1_amd64.deb + grub2-common_2.14-2ubuntu2.1_amd64.deb + gsettings-desktop-schemas_50.0-1ubuntu2_all.deb + gsettings-ubuntu-schemas_0.0.7+21.10.20210712-0ubuntu4_all.deb + gst-audio-thumbnailer_1.0.0-0ubuntu1_amd64.deb + gst-video-thumbnailer_1.0.0-0ubuntu1_amd64.deb + gstreamer1.0-alsa_1.28.2-1_amd64.deb + gstreamer1.0-gl_1.28.2-1_amd64.deb + gstreamer1.0-packagekit_1.3.4-3ubuntu1.2_amd64.deb + gstreamer1.0-pipewire_1.6.2-1ubuntu1.1_amd64.deb + gstreamer1.0-plugins-base_1.28.2-1_amd64.deb + gstreamer1.0-plugins-base-apps_1.28.2-1_amd64.deb + gstreamer1.0-plugins-good_1.28.2-2ubuntu0.1_amd64.deb + gstreamer1.0-tools_1.28.2-1_amd64.deb + gstreamer1.0-x_1.28.2-1_amd64.deb + gtk-update-icon-cache_4.22.4+ds-0ubuntu0.1_amd64.deb + gtk2-engines-murrine_0.98.2-4ubuntu1_amd64.deb + gtk2-engines-pixbuf_2.24.33-10_amd64.deb + gvfs_1.60.0-1_amd64.deb + gvfs-backends_1.60.0-1_amd64.deb + gvfs-common_1.60.0-1_all.deb + gvfs-daemons_1.60.0-1_amd64.deb + gvfs-fuse_1.60.0-1_amd64.deb + gvfs-libs_1.60.0-1_amd64.deb + heif-gdk-pixbuf_1.21.2-3ubuntu0.4_amd64.deb + heif-thumbnailer_1.21.2-3ubuntu0.4_amd64.deb + hicolor-icon-theme_0.18-2build1_all.deb + hplip_3.24.4+dfsg0-0ubuntu8.1_amd64.deb + hplip-data_3.24.4+dfsg0-0ubuntu8.1_all.deb + hunspell-en-us_1%3a2020.12.07-4build1_all.deb + hwctl_0.11.0-0ubuntu1_amd64.deb + ibus_1.5.34~rc2-1_amd64.deb + ibus-data_1.5.34~rc2-1_all.deb + ibus-gtk_1.5.34~rc2-1_amd64.deb + ibus-gtk3_1.5.34~rc2-1_amd64.deb + ibus-gtk4_1.5.34~rc2-1_amd64.deb + ibus-table_1.17.16-1build1_all.deb + ibverbs-providers_61.0-2ubuntu3_amd64.deb + iio-sensor-proxy_3.8-1_amd64.deb + im-config_0.62_all.deb + initramfs-tools-bin_0.151ubuntu1_amd64.deb + initramfs-tools-core_0.151ubuntu1_all.deb + inputattach_1%3a1.8.1-2build2_amd64.deb + ipmitool_1.8.19-10ubuntu1_amd64.deb + ipp-usb_0.9.31-1_amd64.deb + iproute2_6.19.0-1ubuntu1.1_amd64.deb + iptables_1.8.11-2ubuntu3_amd64.deb + iso-codes_4.20.1-1_all.deb + iw_6.17-1_amd64.deb + jq_1.8.1-4ubuntu2_amd64.deb + kbd_2.7.1-2ubuntu2_amd64.deb + kdump-tools_1%3a1.10.7ubuntu3_amd64.deb + kexec-tools_1%3a2.0.32-3ubuntu1_amd64.deb + keyboard-configuration_1.237ubuntu3.1_all.deb + klibc-utils_2.0.14-1ubuntu2_amd64.deb + kmod_34.2-2ubuntu2_amd64.deb + language-selector-common_0.228build1_all.deb + language-selector-gnome_0.228build1_all.deb + laptop-detect_0.16+nmu1build1_all.deb + ldap-utils_2.6.10+dfsg-1ubuntu5_amd64.deb + less_668-1build1_amd64.deb + libaa1_1.4p5-51.1build1_amd64.deb + libabsl20260107_20260107.0-4_amd64.deb + libaccountsservice0_23.13.9-8ubuntu5.2_amd64.deb + libadwaita-1-0_1.9.1-0ubuntu0.1_amd64.deb + libao-common_1.2.2+20180113-1.2ubuntu2_all.deb + libao4_1.2.2+20180113-1.2ubuntu2_amd64.deb + libaom3_3.13.1-2ubuntu0.1_amd64.deb + libapparmor1_5.0.2-0ubuntu1~26.04.1_amd64.deb + libappstream5_1.1.2-1_amd64.deb + libarchive13t64_3.8.5-1ubuntu2.2_amd64.deb + libasound2-data_1.2.15.3-1ubuntu1.1_all.deb + libasound2t64_1.2.15.3-1ubuntu1.1_amd64.deb + libaspell15_0.60.8.2-3_amd64.deb + libasyncns0_0.8-7_amd64.deb + libatasmart4_0.19-6_amd64.deb + libatk-adaptor_2.60.4-0ubuntu0.1_amd64.deb + libatk-bridge2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb + libatk1.0-0t64_2.60.4-0ubuntu0.1_amd64.deb + libatomic1_16-20260322-1ubuntu1_amd64.deb + libatopology2t64_1.2.15.3-1ubuntu1.1_amd64.deb + libatspi2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb + libauthen-sasl-perl_2.2000-1_all.deb + libavahi-client3_0.8-18ubuntu1.1_amd64.deb + libavahi-common-data_0.8-18ubuntu1.1_amd64.deb + libavahi-common3_0.8-18ubuntu1.1_amd64.deb + libavahi-core7_0.8-18ubuntu1.1_amd64.deb + libavahi-glib1_0.8-18ubuntu1.1_amd64.deb + libavc1394-0_0.5.4-5build4_amd64.deb + libayatana-appindicator3-1_0.5.94-1build1_amd64.deb + libayatana-ido3-0.4-0_0.10.4-1build1_amd64.deb + libayatana-indicator3-7_0.9.4-2_amd64.deb + libbabeltrace1_1.5.11-5build1_amd64.deb + libbasicobjects0t64_0.6.2-3build1_amd64.deb + libbinutils_2.46-3ubuntu2_amd64.deb + libblockdev-crypto3_3.4.0-1_amd64.deb + libblockdev-fs3_3.4.0-1_amd64.deb + libblockdev-loop3_3.4.0-1_amd64.deb + libblockdev-mdraid3_3.4.0-1_amd64.deb + libblockdev-nvme3_3.4.0-1_amd64.deb + libblockdev-part3_3.4.0-1_amd64.deb + libblockdev-smart3_3.4.0-1_amd64.deb + libblockdev-swap3_3.4.0-1_amd64.deb + libblockdev-utils3_3.4.0-1_amd64.deb + libblockdev3_3.4.0-1_amd64.deb + libbluetooth3_5.85-4ubuntu0.2_amd64.deb + libbpf1_1%3a1.6.3-1ubuntu1_amd64.deb + libbrlapi0.8_6.7-1ubuntu6_amd64.deb + libbrotli1_1.2.0-3build1_amd64.deb + libbytesize-common_2.12-1_all.deb + libbytesize1_2.12-1_amd64.deb + libc6-dbg_2.43-2ubuntu2.4_amd64.deb + libcaca0_0.99.beta20-6ubuntu2.1_amd64.deb + libcairo-gobject-perl_1.005-4build4_amd64.deb + libcairo-gobject2_1.18.4-3_amd64.deb + libcairo-perl_1.109-5build1_amd64.deb + libcairo-script-interpreter2_1.18.4-3_amd64.deb + libcairo2_1.18.4-3_amd64.deb + libcamel-1.2-64t64_3.56.2-8_amd64.deb + libcanberra-gtk3-0_0.30-18ubuntu3_amd64.deb + libcanberra-gtk3-module_0.30-18ubuntu3_amd64.deb + libcanberra-pulse_0.30-18ubuntu3_amd64.deb + libcanberra0_0.30-18ubuntu3_amd64.deb + libcap2_1%3a2.75-10ubuntu2_amd64.deb + libcap2-bin_1%3a2.75-10ubuntu2_amd64.deb + libcares2_1.34.6-1_amd64.deb + libcbor0.10_0.10.2-2ubuntu3_amd64.deb + libcdio-cdda2t64_10.2+2.0.2-2_amd64.deb + libcdio-paranoia2t64_10.2+2.0.2-2_amd64.deb + libcdio19t64_2.2.0-4build1_amd64.deb + libcdparanoia0_3.10.2+debian-14ubuntu2_amd64.deb + libclone-perl_0.47-1_amd64.deb + libcollection4t64_0.6.2-3build1_amd64.deb + libcolord-gtk4-1t64_0.3.1-2_amd64.deb + libcolord2_1.4.8-3_amd64.deb + libcolorhug2_1.4.8-3_amd64.deb + libcrack2_2.9.6-5.2build3_amd64.deb + libcrypt-urandom-perl_0.55-1_amd64.deb + libcryptsetup12_2%3a2.8.4-1ubuntu4_amd64.deb + libctf-nobfd0_2.46-3ubuntu2_amd64.deb + libctf0_2.46-3ubuntu2_amd64.deb + libcue2_2.2.1-4.2_amd64.deb + libcups2t64_2.4.16-1ubuntu1.3_amd64.deb + libcupsfilters2-common_2.1.1-0ubuntu5_all.deb + libcupsfilters2t64_2.1.1-0ubuntu5_amd64.deb + libcupsimage2t64_2.4.16-1ubuntu1.3_amd64.deb + libcurl3t64-gnutls_8.18.0-1ubuntu2.5_amd64.deb + libdaemon0_0.14-7.1ubuntu5_amd64.deb + libdata-dump-perl_1.25-1_all.deb + libdatrie1_0.2.14-1_amd64.deb + libdbus-1-3_1.16.2-2ubuntu4_amd64.deb + libdbusmenu-glib4_18.10.20180917~bzr492+repack1-4build1_amd64.deb + libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-4build1_amd64.deb + libdconf1_0.49.0-4_amd64.deb + libdebuginfod-common_0.194-4_all.deb + libdebuginfod1t64_0.194-4_amd64.deb + libdecor-0-0_0.2.5-1_amd64.deb + libdecor-0-plugin-1-gtk_0.2.5-1_amd64.deb + libdee-1.0-4_1.2.7+17.10.20170616-8build1_amd64.deb + libdeflate0_1.23-2ubuntu1_amd64.deb + libdevmapper1.02.1_2%3a1.02.205-2ubuntu3_amd64.deb + libdex-1-1_1.1.0-1_amd64.deb + libdhash1t64_0.6.2-3build1_amd64.deb + libdisplay-info3_0.3.0-1_amd64.deb + libdjvulibre-text_3.5.29-1_all.deb + libdjvulibre21_3.5.29-1_amd64.deb + libdotconf0_1.4.1-1build1_amd64.deb + libdrm-amdgpu1_2.4.131-1_amd64.deb + libdrm-common_2.4.131-1_all.deb + libdrm-intel1_2.4.131-1_amd64.deb + libdrm-nouveau2_2.4.131-1_amd64.deb + libdrm-radeon1_2.4.131-1_amd64.deb + libdrm2_2.4.131-1_amd64.deb + libduktape207_2.7.0+tests-0ubuntu4_amd64.deb + libdv4t64_1.0.0-17.1build2_amd64.deb + libdw1t64_0.194-4_amd64.deb + libeatmydata1_131-2build1_amd64.deb + libebackend-1.2-11t64_3.56.2-8_amd64.deb + libebook-1.2-21t64_3.56.2-8_amd64.deb + libebook-contacts-1.2-4t64_3.56.2-8_amd64.deb + libecal-2.0-3_3.56.2-8_amd64.deb + libedata-book-1.2-27t64_3.56.2-8_amd64.deb + libedata-cal-2.0-2t64_3.56.2-8_amd64.deb + libedataserver-1.2-27t64_3.56.2-8_amd64.deb + libedataserverui-1.2-4t64_3.56.2-8_amd64.deb + libedit2_3.1-20251016-1_amd64.deb + libeditorconfig0_0.12.10+~0.17.1-3ubuntu0.1_amd64.deb + libefiboot1t64_39-2_amd64.deb + libefivar1t64_39-2_amd64.deb + libegl-mesa0_26.0.8-1ubuntu0.3_amd64.deb + libegl1_1.7.0-3_amd64.deb + libei1_1.5.0-3_amd64.deb + libeis1_1.5.0-3_amd64.deb + libelf1t64_0.194-4_amd64.deb + libenchant-2-2_2.8.2+dfsg1-3build1_amd64.deb + libencode-locale-perl_1.05-3_all.deb + libepoxy0_1.5.10-2build1_amd64.deb + liberror-perl_0.17030-1_all.deb + libespeak-ng1_1.52.0+dfsg-5build1_amd64.deb + libevdev2_1.13.6+dfsg-1_amd64.deb + libexempi8_2.6.6-2build1_amd64.deb + libexif12_0.6.25-2ubuntu0.1_amd64.deb + libexiv2-28_0.28.8+dfsg-1_amd64.deb + libexiv2-data_0.28.8+dfsg-1_all.deb + libexpat1_2.7.4-1_amd64.deb + libextutils-depends-perl_0.8002-1_all.deb + libfdisk1_2.41.3-3ubuntu2.2_amd64.deb + libffi8_3.5.2-4_amd64.deb + libfftw3-single3_3.3.10-2fakesync1build3_amd64.deb + libfido2-1_1.16.0-2build1_amd64.deb + libfile-basedir-perl_0.09-2_all.deb + libfile-desktopentry-perl_0.23-1_all.deb + libfile-listing-perl_6.16-1_all.deb + libfile-mimeinfo-perl_0.36-2_all.deb + libflac14_1.5.0+ds-5_amd64.deb + libflashrom1_1.6.0-2ubuntu1.1_amd64.deb + libfont-afm-perl_1.20-4_all.deb + libfontconfig1_2.17.1-3ubuntu1_amd64.deb + libfontenc1_1%3a1.1.8-1build2_amd64.deb + libfprint-2-2_1%3a1.95.1+tod1-0ubuntu2_amd64.deb + libfprint-2-tod1_1%3a1.95.1+tod1-0ubuntu2_amd64.deb + libfreeaptx0_0.2.2-1build1_amd64.deb + libfreeipmi17_1.6.16-1ubuntu0.1_amd64.deb + libfreerdp-server3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb + libfreerdp3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb + libfreetype6_2.14.2+dfsg-1ubuntu0.1_amd64.deb + libfribidi0_1.0.16-5_amd64.deb + libftdi1-2_1.6~rc1-1build1_amd64.deb + libfuse3-4_3.18.2-1_amd64.deb + libfwupd3_2.1.1-1ubuntu3.1_amd64.deb + libfyaml0_0.9.4-1_amd64.deb + libgamemode0_1.8.2-2build1_amd64.deb + libgamemodeauto0_1.8.2-2build1_amd64.deb + libgbm1_26.0.8-1ubuntu0.3_amd64.deb + libgck-1-0_3.41.2-6_amd64.deb + libgck-2-2_4.4.0.1-8_amd64.deb + libgcr-4-4_4.4.0.1-8_amd64.deb + libgcr-base-3-1_3.41.2-6_amd64.deb + libgcr-ui-3-1_3.41.2-6_amd64.deb + libgd3_2.3.3-13ubuntu2_amd64.deb + libgdbm-compat4t64_1.26-1build1_amd64.deb + libgdbm6t64_1.26-1build1_amd64.deb + libgdk-pixbuf-2.0-0_2.44.5+dfsg-4ubuntu1_amd64.deb + libgdk-pixbuf2.0-bin_2.44.5+dfsg-4ubuntu1_amd64.deb + libgdk-pixbuf2.0-common_2.44.5+dfsg-4ubuntu1_all.deb + libgdm1_50.1-0ubuntu0.1_amd64.deb + libgee-0.8-2_0.20.8-2_amd64.deb + libgeoclue-2-0_2.7.2-2ubuntu3_amd64.deb + libgeocode-glib-2-0_3.26.4-3_amd64.deb + libgexiv2-2_0.14.6-2_amd64.deb + libgif7_5.2.2-1ubuntu3.2_amd64.deb + libgirepository-1.0-1_1.86.0-6build1_amd64.deb + libgirepository-2.0-0_2.88.0-1_amd64.deb + libgjs0_1.88.0-1_amd64.deb + libgl1_1.7.0-3_amd64.deb + libgl1-mesa-dri_26.0.8-1ubuntu0.3_amd64.deb + libgles2_1.7.0-3_amd64.deb + libglib-object-introspection-perl_0.052-1_amd64.deb + libglib-perl_3%3a1.329.4-1_amd64.deb + libglib2.0-0t64_2.88.0-1_amd64.deb + libglib2.0-bin_2.88.0-1_amd64.deb + libglib2.0-data_2.88.0-1_all.deb + libglu1-mesa_9.0.2-1.1build2_amd64.deb + libglvnd0_1.7.0-3_amd64.deb + libglx-mesa0_26.0.8-1ubuntu0.3_amd64.deb + libglx0_1.7.0-3_amd64.deb + libglycin-2-0_2.1.1+ds-0ubuntu1_amd64.deb + libglycin-gtk4-2-0_2.1.1+ds-0ubuntu1_amd64.deb + libgnome-autoar-0-0_0.4.5-5_amd64.deb + libgnome-bg-4-2t64_44.5-1ubuntu1_amd64.deb + libgnome-bluetooth-3.0-13_47.1-5_amd64.deb + libgnome-bluetooth-ui-3.0-13_47.1-5_amd64.deb + libgnome-desktop-3-20t64_44.5-1ubuntu1_amd64.deb + libgnome-desktop-4-2t64_44.5-1ubuntu1_amd64.deb + libgnome-menu-3-0_3.38.1-1ubuntu1_amd64.deb + libgnome-qr-4-0_44.5-1ubuntu1_amd64.deb + libgnome-qr-gtk-4-0_44.5-1ubuntu1_amd64.deb + libgoa-1.0-0b_3.58.0-1_amd64.deb + libgoa-1.0-common_3.58.0-1_all.deb + libgoa-backend-1.0-2_3.58.0-1_amd64.deb + libgomp1_16-20260322-1ubuntu1_amd64.deb + libgpgme45_2.0.1-2build1_amd64.deb + libgpgmepp7_2.0.0-2_amd64.deb + libgphoto2-6t64_2.5.33-1ubuntu1.1_amd64.deb + libgphoto2-l10n_2.5.33-1ubuntu1.1_all.deb + libgphoto2-port12t64_2.5.33-1ubuntu1.1_amd64.deb + libgpm2_1.20.7-12build1_amd64.deb + libgprofng0_2.46-3ubuntu2_amd64.deb + libgraphene-1.0-0_1.10.8-5build1_amd64.deb + libgraphite2-3_1.3.14-11ubuntu1.1_amd64.deb + libgs-common_10.06.0~dfsg-3ubuntu1_all.deb + libgs10_10.06.0~dfsg-3ubuntu1_amd64.deb + libgs10-common_10.06.0~dfsg-3ubuntu1_all.deb + libgsf-1-114_1.14.53-1.1_amd64.deb + libgsf-1-common_1.14.53-1.1_all.deb + libgsound0t64_1.0.3-4_amd64.deb + libgssdp-1.6-0_1.6.4-5_amd64.deb + libgstreamer-gl1.0-0_1.28.2-1_amd64.deb + libgstreamer-plugins-base1.0-0_1.28.2-1_amd64.deb + libgstreamer-plugins-extra1.0-0_1.28.2-1ubuntu1.1_amd64.deb + libgstreamer1.0-0_1.28.2-1_amd64.deb + libgtk-3-0t64_3.24.52-0ubuntu1_amd64.deb + libgtk-3-bin_3.24.52-0ubuntu1_amd64.deb + libgtk-3-common_3.24.52-0ubuntu1_all.deb + libgtk-4-1_4.22.4+ds-0ubuntu0.1_amd64.deb + libgtk-4-bin_4.22.4+ds-0ubuntu0.1_amd64.deb + libgtk-4-common_4.22.4+ds-0ubuntu0.1_all.deb + libgtk3-perl_0.038-3_all.deb + libgtksourceview-5-0_5.18.0-3_amd64.deb + libgtksourceview-5-common_5.18.0-3_all.deb + libgtop-2.0-11_2.41.3-2ubuntu1_amd64.deb + libgtop2-common_2.41.3-2ubuntu1_all.deb + libgudev-1.0-0_1%3a238-7build1_amd64.deb + libgupnp-1.6-0_1.6.9-4_amd64.deb + libgupnp-av-1.0-3_0.14.4-3_amd64.deb + libgupnp-dlna-2.0-4_0.12.0-8_amd64.deb + libgusb2a_0.4.9-7_amd64.deb + libgweather-4-0t64_4.4.4-4_amd64.deb + libgweather-4-common_4.4.4-4_all.deb + libgxps2t64_0.3.2-6_amd64.deb + libhandy-1-0_1.8.3-3build1_amd64.deb + libharfbuzz-gobject0_12.3.2-2_amd64.deb + libharfbuzz-icu0_12.3.2-2_amd64.deb + libharfbuzz-subset0_12.3.2-2_amd64.deb + libharfbuzz0b_12.3.2-2_amd64.deb + libheif-plugin-aomdec_1.21.2-3ubuntu0.4_amd64.deb + libheif-plugin-aomenc_1.21.2-3ubuntu0.4_amd64.deb + libheif1_1.21.2-3ubuntu0.4_amd64.deb + libhpmud0_3.24.4+dfsg0-0ubuntu8.1_amd64.deb + libhtml-form-perl_6.13-1build1_all.deb + libhtml-format-perl_2.16-2_all.deb + libhtml-parser-perl_3.83-1ubuntu0.1_amd64.deb + libhtml-tagset-perl_3.24-1_all.deb + libhtml-tree-perl_5.07-3_all.deb + libhttp-cookies-perl_6.11-1_all.deb + libhttp-daemon-perl_6.16-1ubuntu0.26.04.1_all.deb + libhttp-date-perl_6.06-1ubuntu0.26.04.1_all.deb + libhttp-message-perl_7.01-1ubuntu1_all.deb + libhttp-negotiate-perl_6.01-2_all.deb + libhunspell-1.7-0_1.7.2+really1.7.2-11_amd64.deb + libhwy1t64_1.3.0-2_amd64.deb + libhyphen0_2.8.8-7build4_amd64.deb + libibus-1.0-5_1.5.34~rc2-1_amd64.deb + libibverbs1_61.0-2ubuntu3_amd64.deb + libical3t64_3.0.20-2build1_amd64.deb + libice6_2%3a1.1.1-1build1_amd64.deb + libicu78_78.2-2ubuntu1_amd64.deb + libidn12_1.43-2ubuntu0.26.04.1_amd64.deb + libiec61883-0_1.2.0-8_amd64.deb + libieee1284-3t64_0.2.11-14.1build2_amd64.deb + libijs-0.35_0.35-16_amd64.deb + libimagequant0_4.4.1-1_amd64.deb + libimobiledevice-1.0-6_1.4.0-1build1_amd64.deb + libimobiledevice-glue-1.0-0_1.3.2-2build1_amd64.deb + libini-config5t64_0.6.2-3build1_amd64.deb + libinih1_61-1ubuntu1_amd64.deb + libinireader0_61-1ubuntu1_amd64.deb + libinput-bin_1.31.1-1ubuntu1.2_amd64.deb + libinput10_1.31.1-1ubuntu1.2_amd64.deb + libinsights0_0.9.3ubuntu_amd64.deb + libio-html-perl_1.004-3_all.deb + libio-pty-perl_1%3a1.20-1build3_amd64.deb + libio-socket-ssl-perl_2.098-1_all.deb + libio-stringy-perl_2.113-2_all.deb + libip4tc2_1.8.11-2ubuntu3_amd64.deb + libip6tc2_1.8.11-2ubuntu3_amd64.deb + libipa-hbac0t64_2.12.0-1ubuntu5.4_amd64.deb + libipc-run-perl_20250809.0-1build1_all.deb + libipc-system-simple-perl_1.30-2_all.deb + libipt2_2.1.2-3_amd64.deb + libisl23_0.27-1build1_amd64.deb + libjansson4_2.14-2build4_amd64.deb + libjavascriptcoregtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb + libjavascriptcoregtk-6.0-1_2.52.6-0ubuntu0.26.04.1_amd64.deb + libjbig0_2.1-6.1ubuntu3_amd64.deb + libjbig2dec0_0.20-1ubuntu0.26.04.1_amd64.deb + libjcat1_0.2.5-1build1_amd64.deb + libjemalloc2_5.3.0-4_amd64.deb + libjpeg-turbo8_2.1.5-4ubuntu4_amd64.deb + libjpeg8_8c-2ubuntu12_amd64.deb + libjq1_1.8.1-4ubuntu2_amd64.deb + libjs-sphinxdoc_8.2.3-12_all.deb + libjson-c5_0.18+ds-3_amd64.deb + libjson-glib-1.0-0_1.10.8+ds-2_amd64.deb + libjson-glib-1.0-common_1.10.8+ds-2_all.deb + libjxl-gdk-pixbuf_0.11.1-6ubuntu4.2_amd64.deb + libjxl0.11_0.11.1-6ubuntu4.2_amd64.deb + libklibc_2.0.14-1ubuntu2_amd64.deb + libkmod2_34.2-2ubuntu2_amd64.deb + liblc3-1_1.1.3+dfsg-1build1_amd64.deb + liblcms2-2_2.17-1ubuntu0.2_amd64.deb + liblcms2-utils_2.17-1ubuntu0.2_amd64.deb + libldacbt-abr2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb + libldacbt-enc2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb + libldb2_2%3a2.11.0+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb + liblerc4_4.0.0+ds-5ubuntu2_amd64.deb + libllvm21_1%3a21.1.8-6ubuntu1_amd64.deb + liblmdb0_0.9.31-1build2_amd64.deb + liblocale-gettext-perl_1.07-8_amd64.deb + liblouis-data_3.36.0-1_all.deb + liblouis20_3.36.0-1_amd64.deb + liblouisutdml-bin_2.12.0-8build1_amd64.deb + liblouisutdml-data_2.12.0-8build1_all.deb + liblouisutdml9t64_2.12.0-8build1_amd64.deb + liblsof0_4.99.4+dfsg-2build2_amd64.deb + libltdl7_2.5.4-9_amd64.deb + liblua5.4-0_5.4.8-1build1_amd64.deb + liblwp-mediatypes-perl_6.04-2_all.deb + liblwp-protocol-https-perl_6.14-1_all.deb + liblzo2-2_2.10-3build2_amd64.deb + libmagic-mgc_1%3a5.46-5build2_amd64.deb + libmagic1t64_1%3a5.46-5build2_amd64.deb + libmailtools-perl_2.22-1_all.deb + libmalcontent-0-0_0.14.0-0ubuntu1.2_amd64.deb + libmalcontent-common_0.14.0-0ubuntu1.2_all.deb + libmaxminddb0_1.12.2-1build2_amd64.deb + libmbim-glib4_1.32.0-2ubuntu1_amd64.deb + libmbim-proxy_1.32.0-2ubuntu1_amd64.deb + libmbim-utils_1.32.0-2ubuntu1_amd64.deb + libmediaart-2.0-0_1.9.7-3_amd64.deb + libmm-glib0_1.25.95-1ubuntu1_amd64.deb + libmnl0_1.0.5-3build1_amd64.deb + libmozjs-140-0_140.8.0-4_amd64.deb + libmp3lame0_3.101~svn6525+dfsg-2_amd64.deb + libmpc3_1.3.1-3_amd64.deb + libmpfr6_4.2.2-3_amd64.deb + libmpg123-0t64_1.33.3-2_amd64.deb + libmsgraph-1-1_0.3.3-3build1_amd64.deb + libmtdev1t64_1.1.7-1build1_amd64.deb + libmtp-common_1.1.22-1ubuntu1_all.deb + libmtp-runtime_1.1.22-1ubuntu1_amd64.deb + libmtp9t64_1.1.22-1ubuntu1_amd64.deb + libmutter-18-0_50.1-0ubuntu2.2_amd64.deb + libnautilus-extension4_1%3a50.2.2-0ubuntu0.1_amd64.deb + libncurses6_6.6+20251231-1_amd64.deb + libndp0_1.9-1build1_amd64.deb + libnet-dbus-perl_1.2.0-2build4_amd64.deb + libnet-http-perl_6.24-1build1_all.deb + libnet-smtp-ssl-perl_1.04-2_all.deb + libnet-ssleay-perl_1.94-3_amd64.deb + libnetfilter-conntrack3_1.1.1-1_amd64.deb + libnetplan1_1.2-1ubuntu5.1_amd64.deb + libnewt0.52_0.52.25-1ubuntu3_amd64.deb + libnfnetlink0_1.0.2-3build1_amd64.deb + libnfs14_5.0.2-1ubuntu1.1_amd64.deb + libnfsidmap1_1%3a2.8.5-1ubuntu1_amd64.deb + libnftables1_1.1.6-1_amd64.deb + libnftnl11_1.3.1-1_amd64.deb + libnl-3-200_3.12.0-2_amd64.deb + libnl-genl-3-200_3.12.0-2_amd64.deb + libnl-route-3-200_3.12.0-2_amd64.deb + libnm0_1.54.3-2ubuntu3_amd64.deb + libnma-common_1.10.6-7_all.deb + libnma-gtk4-0_1.10.6-7_amd64.deb + libnma0_1.10.6-7_amd64.deb + libnotify-bin_0.8.8-1_amd64.deb + libnotify4_0.8.8-1_amd64.deb + libnspr4_2%3a4.38.2-1ubuntu1_amd64.deb + libnss-mdns_0.15.1-5_amd64.deb + libnss-sss_2.12.0-1ubuntu5.4_amd64.deb + libnss-systemd_259.5-0ubuntu3.4_amd64.deb + libnss3_2%3a3.120-1ubuntu2.1_amd64.deb + libntfs-3g89t64_1%3a2022.10.3-5ubuntu1.1_amd64.deb + libnvme1t64_1.16.1-4_amd64.deb + liboeffis1_1.5.0-3_amd64.deb + libogg0_1.3.6-2_amd64.deb + libonig5_6.9.10-1build1_amd64.deb + libopengl0_1.7.0-3_amd64.deb + libopenipmi0t64_2.0.37-1build1_amd64.deb + libopenjp2-7_2.5.4-1ubuntu0.1_amd64.deb + libopus0_1.6.1-1_amd64.deb + liborc-0.4-0t64_1%3a0.4.42-2_amd64.deb + libpackagekit-glib2-18_1.3.4-3ubuntu1.2_amd64.deb + libpam-cap_1%3a2.75-10ubuntu2_amd64.deb + libpam-fprintd_1.94.5-4_amd64.deb + libpam-gnome-keyring_50.0-1_amd64.deb + libpam-pwquality_1.4.5-5build1_amd64.deb + libpam-sss_2.12.0-1ubuntu5.4_amd64.deb + libpam-systemd_259.5-0ubuntu3.4_amd64.deb + libpanel-1-1_1.10.3-1_amd64.deb + libpanel-common_1.10.3-1_all.deb + libpango-1.0-0_1.57.0-1_amd64.deb + libpangocairo-1.0-0_1.57.0-1_amd64.deb + libpangoft2-1.0-0_1.57.0-1_amd64.deb + libpangoxft-1.0-0_1.57.0-1_amd64.deb + libpaper-utils_2.2.5-0.3maysync1_amd64.deb + libpaper2_2.2.5-0.3maysync1_amd64.deb + libparted2t64_3.6-6_amd64.deb + libpath-utils1t64_0.6.2-3build1_amd64.deb + libpcap0.8t64_1.10.6-1ubuntu1_amd64.deb + libpcaudio0_1.3-1build1_amd64.deb + libpci3_1%3a3.14.0-1build2_amd64.deb + libpciaccess0_0.18.1-1ubuntu4.1_amd64.deb + libpcre2-32-0_10.46-1build1_amd64.deb + libpcsclite1_2.4.1-1_amd64.deb + libperl5.40_5.40.1-7ubuntu0.3_amd64.deb + libphonenumber8_8.13.51+ds-5_amd64.deb + libpipeline1_1.5.8-2_amd64.deb + libpipewire-0.3-0t64_1.6.2-1ubuntu1.1_amd64.deb + libpipewire-0.3-common_1.6.2-1ubuntu1.1_all.deb + libpipewire-0.3-modules_1.6.2-1ubuntu1.1_amd64.deb + libpixman-1-0_0.46.4-1_amd64.deb + libpkcs11-helper1t64_1.31.0-1_amd64.deb + libplist-2.0-4_2.7.0+git20250820-1build1_amd64.deb + libplymouth5_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb + libpng16-16t64_1.6.57-1_amd64.deb + libpolkit-agent-1-0_127-2ubuntu1.1_amd64.deb + libpolkit-gobject-1-0_127-2ubuntu1.1_amd64.deb + libpoppler-cpp3_26.01.0-2ubuntu0.1_amd64.deb + libpoppler-glib8t64_26.01.0-2ubuntu0.1_amd64.deb + libpoppler156_26.01.0-2ubuntu0.1_amd64.deb + libpopt0_1.19+dfsg-2build1_amd64.deb + libportal-gtk4-1_0.9.1-2build1_amd64.deb + libportal1_0.9.1-2build1_amd64.deb + libppd2_2%3a2.1.1-0ubuntu2_amd64.deb + libppd2-common_2%3a2.1.1-0ubuntu2_all.deb + libppsdocument-4.0-6_50.2-0ubuntu0.1_amd64.deb + libppsview-4.0-5_50.2-0ubuntu0.1_amd64.deb + libprotobuf32t64_3.21.12-15ubuntu1_amd64.deb + libproxy1v5_0.5.12-1_amd64.deb + libpulse-mainloop-glib0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb + libpulse0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb + libpwquality-common_1.4.5-5build1_all.deb + libpwquality1_1.4.5-5build1_amd64.deb + libpython3-stdlib_3.14.3-0ubuntu2_amd64.deb + libpython3.14_3.14.4-1ubuntu0.2_amd64.deb + libpython3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb + libpython3.14-stdlib_3.14.4-1ubuntu0.2_amd64.deb + libqmi-glib5_1.38.0-1_amd64.deb + libqmi-proxy_1.38.0-1_amd64.deb + libqmi-utils_1.38.0-1_amd64.deb + libqpdf30_12.3.2-1_amd64.deb + libqrtr-glib0_1.2.2-2ubuntu1_amd64.deb + libraqm0_0.10.4-1_amd64.deb + libraw1394-11_2.1.2-2build4_amd64.deb + libreadline8t64_8.3-4_amd64.deb + libref-array1t64_0.6.2-3build1_amd64.deb + librest-1.0-0_0.10.2-1_amd64.deb + libroc0.4_0.4.0+dfsg-5ubuntu3.1_amd64.deb + librsvg2-2_2.61.3+dfsg-3_amd64.deb + librsvg2-common_2.61.3+dfsg-3_amd64.deb + librygel-core-2.8-0_45.0-1ubuntu1_amd64.deb + librygel-db-2.8-0_45.0-1ubuntu1_amd64.deb + librygel-renderer-2.8-0_45.0-1ubuntu1_amd64.deb + librygel-server-2.8-0_45.0-1ubuntu1_amd64.deb + libsamplerate0_0.2.2-4build2_amd64.deb + libsane-common_1.4.0-1ubuntu1_all.deb + libsane-hpaio_3.24.4+dfsg0-0ubuntu8.1_amd64.deb + libsane1_1.4.0-1ubuntu1_amd64.deb + libsasl2-modules_2.1.28+dfsg1-9ubuntu3_amd64.deb + libsasl2-modules-gssapi-mit_2.1.28+dfsg1-9ubuntu3_amd64.deb + libsbc1_2.1-1build1_amd64.deb + libsecret-1-0_0.21.7-2build1_amd64.deb + libsecret-common_0.21.7-2build1_all.deb + libsensors-config_1%3a3.6.2-2build1_all.deb + libsensors5_1%3a3.6.2-2build1_amd64.deb + libsframe3_2.46-3ubuntu2_amd64.deb + libsharpyuv0_1.5.0-0.1build1_amd64.deb + libshout3_2.4.6-1build3_amd64.deb + libsimdutf31_8.0.0-1_amd64.deb + libslang2_2.3.3-5build1_amd64.deb + libsm6_2%3a1.2.6-1build1_amd64.deb + libsmbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb + libsnapd-glib-2-1_1.72-0ubuntu3_amd64.deb + libsnappy1v5_1.2.2-2_amd64.deb + libsndfile1_1.2.2-4_amd64.deb + libsnmp-base_5.9.4+dfsg-2ubuntu3_all.deb + libsnmp40t64_5.9.4+dfsg-2ubuntu3_amd64.deb + libsonic0_0.2.0-13build2_amd64.deb + libsoup-3.0-0_3.6.6-1_amd64.deb + libsoup-3.0-common_3.6.6-1_all.deb + libsource-highlight-common_3.1.9-4.3build2_all.deb + libsource-highlight4t64_3.1.9-4.3build2_amd64.deb + libspa-0.2-bluetooth_1.6.2-1ubuntu1.1_amd64.deb + libspa-0.2-modules_1.6.2-1ubuntu1.1_amd64.deb + libspeechd-module0_0.12.1-2ubuntu1_amd64.deb + libspeechd2_0.12.1-2ubuntu1_amd64.deb + libspeex1_1.2.1-3build1_amd64.deb + libspeexdsp1_1.2.1-3build1_amd64.deb + libspelling-1-2_0.4.9-1build1_amd64.deb + libspelling-common_0.4.9-1build1_all.deb + libsqlite3-0_3.46.1-9ubuntu0.2_amd64.deb + libsss-certmap0_2.12.0-1ubuntu5.4_amd64.deb + libsss-idmap0_2.12.0-1ubuntu5.4_amd64.deb + libsss-nss-idmap0_2.12.0-1ubuntu5.4_amd64.deb + libstartup-notification0_0.12-8build1_amd64.deb + libstemmer0d_3.0.1-1_amd64.deb + libsysprof-6-6_50.0-1_amd64.deb + libsysprof-6-modules_50.0-1_amd64.deb + libsystemd-shared_259.5-0ubuntu3.4_amd64.deb + libtag2_2.2.1-3_amd64.deb + libtalloc2_2%3a2.4.3+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb + libtcl8.6_8.6.17+dfsg-1build1_amd64.deb + libtdb1_2%3a1.4.14+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb + libteamdctl0_1.31-1build4_amd64.deb + libtevent0t64_2%3a0.17.1+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb + libtext-charwidth-perl_0.04-11build4_amd64.deb + libtext-iconv-perl_1.7-8.1_amd64.deb + libtext-wrapi18n-perl_0.06-10_all.deb + libthai-data_0.1.30-1_all.deb + libthai0_0.1.30-1_amd64.deb + libtheora1_1.2.0+dfsg-6_amd64.deb + libtheoradec2_1.2.0+dfsg-6_amd64.deb + libtheoraenc2_1.2.0+dfsg-6_amd64.deb + libtie-ixhash-perl_1.23-4_all.deb + libtiff6_4.7.0-3ubuntu5_amd64.deb + libtime-duration-perl_1.21-2_all.deb + libtimedate-perl_2.3300-2_all.deb + libtinysparql-3.0-0_3.11.0-1_amd64.deb + libtirpc-common_1.3.7-0.1_all.deb + libtirpc3t64_1.3.7-0.1_amd64.deb + libtk8.6_8.6.17-1build1_amd64.deb + libtotem-plparser-common_3.26.6-3_all.deb + libtotem-plparser18_3.26.6-3_amd64.deb + libtry-tiny-perl_0.32-1_all.deb + libtss2-esys-3.0.2-0t64_4.1.3-6_amd64.deb + libtss2-mu-4.0.1-0t64_4.1.3-6_amd64.deb + libtss2-rc0t64_4.1.3-6_amd64.deb + libtss2-sys1t64_4.1.3-6_amd64.deb + libtss2-tcti-cmd0t64_4.1.3-6_amd64.deb + libtss2-tcti-device0t64_4.1.3-6_amd64.deb + libtss2-tcti-libtpms0t64_4.1.3-6_amd64.deb + libtss2-tcti-mssim0t64_4.1.3-6_amd64.deb + libtss2-tcti-spi-helper0t64_4.1.3-6_amd64.deb + libtss2-tcti-swtpm0t64_4.1.3-6_amd64.deb + libtss2-tctildr0t64_4.1.3-6_amd64.deb + libtwolame0_0.4.0-2build4_amd64.deb + libuchardet0_0.0.8-2_amd64.deb + libudisks2-0_2.10.91-1ubuntu2.1_amd64.deb + libunity-protocol-private0_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb + libunity-scopes-json-def-desktop_7.1.4+19.04.20190319-6.1ubuntu1_all.deb + libunity9_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb + libunwind8_1.8.3-0ubuntu1_amd64.deb + libupower-glib3_1.91.1-1_amd64.deb + liburcu8t64_0.15.6-1_amd64.deb + liburi-perl_5.34-2build1_all.deb + liburing2_2.14-1_amd64.deb + libusb-1.0-0_2%3a1.0.29-2build1_amd64.deb + libusbmuxd-2.0-7_2.1.1-1_amd64.deb + libuv1t64_1.51.0-2ubuntu1_amd64.deb + libv4l-0t64_1.32.0-2ubuntu1_amd64.deb + libv4lconvert0t64_1.32.0-2ubuntu1_amd64.deb + libva-drm2_2.23.0-1ubuntu1_amd64.deb + libva-x11-2_2.23.0-1ubuntu1_amd64.deb + libva2_2.23.0-1ubuntu1_amd64.deb + libvisual-0.4-0_0.4.2-4_amd64.deb + libvolume-key1_0.3.12-10build2_amd64.deb + libvorbis0a_1.3.7-3build2_amd64.deb + libvorbisenc2_1.3.7-3build2_amd64.deb + libvorbisfile3_1.3.7-3build2_amd64.deb + libvpx12_1.16.0-3_amd64.deb + libvte-2.91-0_0.84.0-2_amd64.deb + libvte-2.91-common_0.84.0-2_amd64.deb + libvte-2.91-gtk4-0_0.84.0-2_amd64.deb + libvulkan1_1.4.341.0-1_amd64.deb + libwacom-common_2.18.0-1_all.deb + libwacom9_2.18.0-1_amd64.deb + libwavpack1_5.9.0-1_amd64.deb + libwayland-client0_1.24.0-2_amd64.deb + libwayland-cursor0_1.24.0-2_amd64.deb + libwayland-egl1_1.24.0-2_amd64.deb + libwayland-server0_1.24.0-2_amd64.deb + libwbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb + libwebkit2gtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb + libwebkitgtk-6.0-4_2.52.6-0ubuntu0.26.04.1_amd64.deb + libwebp7_1.5.0-0.1build1_amd64.deb + libwebpdemux2_1.5.0-0.1build1_amd64.deb + libwebpmux3_1.5.0-0.1build1_amd64.deb + libwebrtc-audio-processing-1-3_1.3-3build2_amd64.deb + libwhoopsie-preferences0_23build4_amd64.deb + libwhoopsie0_0.2.82ubuntu_amd64.deb + libwinpr3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb + libwireplumber-0.5-0_0.5.13-1ubuntu1_amd64.deb + libwmf-0.2-7_0.2.14-1_amd64.deb + libwmf-0.2-7-gtk_0.2.14-1_amd64.deb + libwmflite-0.2-7_0.2.14-1_amd64.deb + libwnck-3-0_43.3-1build1_amd64.deb + libwnck-3-common_43.3-1build1_all.deb + libwrap0_7.6.q-36build2_amd64.deb + libwww-perl_6.81-1ubuntu0.1_all.deb + libwww-robotrules-perl_6.02-1build1_all.deb + libx11-6_2%3a1.8.13-1_amd64.deb + libx11-data_2%3a1.8.13-1_all.deb + libx11-protocol-perl_0.56-9_all.deb + libx11-xcb1_2%3a1.8.13-1_amd64.deb + libxau6_1%3a1.0.11-1build2_amd64.deb + libxaw7_2%3a1.0.16-1build1_amd64.deb + libxcb-damage0_1.17.0-2ubuntu1_amd64.deb + libxcb-dri2-0_1.17.0-2ubuntu1_amd64.deb + libxcb-dri3-0_1.17.0-2ubuntu1_amd64.deb + libxcb-glx0_1.17.0-2ubuntu1_amd64.deb + libxcb-present0_1.17.0-2ubuntu1_amd64.deb + libxcb-randr0_1.17.0-2ubuntu1_amd64.deb + libxcb-render0_1.17.0-2ubuntu1_amd64.deb + libxcb-res0_1.17.0-2ubuntu1_amd64.deb + libxcb-shape0_1.17.0-2ubuntu1_amd64.deb + libxcb-shm0_1.17.0-2ubuntu1_amd64.deb + libxcb-sync1_1.17.0-2ubuntu1_amd64.deb + libxcb-util1_0.4.1-1build1_amd64.deb + libxcb-xfixes0_1.17.0-2ubuntu1_amd64.deb + libxcb1_1.17.0-2ubuntu1_amd64.deb + libxcomposite1_1%3a0.4.6-1build1_amd64.deb + libxcursor1_1%3a1.2.3-1build1_amd64.deb + libxcvt0_0.1.3-1build1_amd64.deb + libxdamage1_1%3a1.1.7-1_amd64.deb + libxdmcp6_1%3a1.1.5-2_amd64.deb + libxdo3_1%3a3.20160805.1-5.1build1_amd64.deb + libxext6_2%3a1.3.4-1build3_amd64.deb + libxfixes3_1%3a6.0.0-2build2_amd64.deb + libxfont2_1%3a2.0.6-2ubuntu0.2_amd64.deb + libxft2_2.3.6-1build2_amd64.deb + libxi6_2%3a1.8.2-2_amd64.deb + libxinerama1_2%3a1.1.4-3build2_amd64.deb + libxkbcommon0_1.13.1-1_amd64.deb + libxkbfile1_1%3a1.1.0-1build5_amd64.deb + libxkbregistry0_1.13.1-1_amd64.deb + libxml-parser-perl_2.47-1ubuntu1_amd64.deb + libxml-twig-perl_1%3a3.54-1build1_all.deb + libxml-xpathengine-perl_0.14-2_all.deb + libxml2-16_2.15.2+dfsg-0.1ubuntu0.1_amd64.deb + libxmlb2_0.3.24-2_amd64.deb + libxmu6_2%3a1.1.3-4_amd64.deb + libxmuu1_2%3a1.1.3-4_amd64.deb + libxpm4_1%3a3.5.17-1ubuntu0.26.04.1_amd64.deb + libxrandr2_2%3a1.5.4-1build1_amd64.deb + libxrender1_1%3a0.9.12-1build1_amd64.deb + libxres1_2%3a1.2.1-1build2_amd64.deb + libxshmfence1_1.3.3-1build1_amd64.deb + libxslt1.1_1.1.45-0.1_amd64.deb + libxss1_1%3a1.2.3-1build4_amd64.deb + libxt6t64_1%3a1.2.1-1.3build1_amd64.deb + libxtables12_1.8.11-2ubuntu3_amd64.deb + libxtst6_2%3a1.2.5-1build1_amd64.deb + libxv1_2%3a1.0.13-1_amd64.deb + libxvmc1_2%3a1.0.12-2build4_amd64.deb + libxxf86dga1_2%3a1.1.5-1build2_amd64.deb + libxxf86vm1_1%3a1.1.4-2_amd64.deb + libyaml-0-2_0.2.5-2build3_amd64.deb + libyelp-1-0_49.0-5ubuntu0.1_amd64.deb + linux-base_4.15ubuntu5_all.deb + linux-sound-base_1.0.25+dfsg-0ubuntu9_all.deb + linux-sysctl-defaults_4.15ubuntu5_all.deb + locales_2.43-2ubuntu2.4_all.deb + localsearch_3.11.0-1ubuntu1.1_amd64.deb + loupe_50.0-0ubuntu2_amd64.deb + lsb-release_12.1-2build1_all.deb + lsof_4.99.4+dfsg-2build2_amd64.deb + luit_2.0.20250912-1_amd64.deb + makedumpfile_1%3a1.7.7-1_amd64.deb + man-db_2.13.1-1build1_amd64.deb + media-types_14.0.0build1_all.deb + memtest86+_8.00-3_amd64.deb + mesa-libgallium_26.0.8-1ubuntu0.3_amd64.deb + mesa-vulkan-drivers_26.0.8-1ubuntu0.3_amd64.deb + mobile-broadband-provider-info_20251101-1build1_all.deb + modemmanager_1.25.95-1ubuntu1_amd64.deb + mokutil_0.7.2-2_amd64.deb + moreutils_0.69-1build1_amd64.deb + mscompress_0.4-10build2_amd64.deb + mutter-common_50.1-0ubuntu2.2_all.deb + mutter-common-bin_50.1-0ubuntu2.2_amd64.deb + nautilus_1%3a50.2.2-0ubuntu0.1_amd64.deb + nautilus-data_1%3a50.2.2-0ubuntu0.1_all.deb + nautilus-sendto_3.8.6-8ubuntu1_amd64.deb + ncurses-term_6.6+20251231-1_all.deb + netbase_6.5build1_all.deb + netcat-openbsd_1.234-1_amd64.deb + netplan-generator_1.2-1ubuntu5.1_amd64.deb + netplan.io_1.2-1ubuntu5.1_amd64.deb + network-manager_1.54.3-2ubuntu3_amd64.deb + network-manager-config-connectivity-ubuntu_1.54.3-2ubuntu3_all.deb + network-manager-l10n_1.54.3-2ubuntu3_all.deb + network-manager-openvpn_1.12.5-1_amd64.deb + network-manager-openvpn-gnome_1.12.5-1_amd64.deb + network-manager-pptp_1.2.12-6_amd64.deb + network-manager-pptp-gnome_1.2.12-6_amd64.deb + nftables_1.1.6-1_amd64.deb + nm-connection-editor_1.36.0-4ubuntu1_amd64.deb + ntfs-3g_1%3a2022.10.3-5ubuntu1.1_amd64.deb + nvme-cli_2.16-1_amd64.deb + openipmi_2.0.37-1build1_amd64.deb + openprinting-ppds_20250819-1build1_all.deb + openssh-client_1%3a10.2p1-2ubuntu3.6_amd64.deb + openssh-server_1%3a10.2p1-2ubuntu3.6_amd64.deb + openssh-sftp-server_1%3a10.2p1-2ubuntu3.6_amd64.deb + openssl_3.5.5-1ubuntu3.5_amd64.deb + openvpn_2.7.0-1ubuntu1.2_amd64.deb + orca_50.2-0ubuntu0.1_all.deb + os-prober_1.84ubuntu1_amd64.deb + p11-kit_0.26.2-2_amd64.deb + p11-kit-modules_0.26.2-2_amd64.deb + packagekit_1.3.4-3ubuntu1.2_amd64.deb + papers_50.2-0ubuntu0.1_amd64.deb + papers-common_50.2-0ubuntu0.1_all.deb + parted_3.6-6_amd64.deb + patch_2.8-2build1_amd64.deb + pci.ids_0.0~2026.02.12-1_all.deb + pciutils_1%3a3.14.0-1build2_amd64.deb + pcmciautils_018-19_amd64.deb + perl_5.40.1-7ubuntu0.3_amd64.deb + perl-modules-5.40_5.40.1-7ubuntu0.3_all.deb + perl-openssl-defaults_7build4_amd64.deb + pigz_2.8-1build1_amd64.deb + pinentry-gnome3_1.3.2-3ubuntu1_amd64.deb + pipewire_1.6.2-1ubuntu1.1_amd64.deb + pipewire-alsa_1.6.2-1ubuntu1.1_amd64.deb + pipewire-audio_1.6.2-1ubuntu1.1_all.deb + pipewire-bin_1.6.2-1ubuntu1.1_amd64.deb + pipewire-pulse_1.6.2-1ubuntu1.1_amd64.deb + pkexec_127-2ubuntu1.1_amd64.deb + plymouth_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb + plymouth-label_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb + plymouth-theme-spinner_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb + policykit-desktop-privileges_0.22build1_all.deb + polkitd_127-2ubuntu1.1_amd64.deb + poppler-data_0.4.12-1build1_all.deb + poppler-utils_26.01.0-2ubuntu0.1_amd64.deb + power-profiles-daemon_0.30-2_amd64.deb + ppp_2.5.2-1+1.2_amd64.deb + pptp-linux_1.10.0-2build1_amd64.deb + printer-driver-brlaser_6.2.8-1_amd64.deb + printer-driver-c2esp_27-11ubuntu8_amd64.deb + printer-driver-foo2zjs_20200505dfsg0-3ubuntu1_amd64.deb + printer-driver-foo2zjs-common_20200505dfsg0-3ubuntu1_all.deb + printer-driver-hpcups_3.24.4+dfsg0-0ubuntu8.1_amd64.deb + printer-driver-m2300w_0.51-15build3_amd64.deb + printer-driver-min12xxw_0.0.9-11build4_amd64.deb + printer-driver-pnm2ppa_1.13+nondbs-0ubuntu11_amd64.deb + printer-driver-postscript-hp_3.24.4+dfsg0-0ubuntu8.1_amd64.deb + printer-driver-ptouch_1.7.1-1build1_amd64.deb + printer-driver-pxljr_1.4+repack0-6build3_amd64.deb + printer-driver-sag-gdi_0.1-8build1_all.deb + printer-driver-splix_2.0.1-2_amd64.deb + prometheus-node-exporter_1.10.2-1_amd64.deb + prometheus-node-exporter-collectors_0.0~git20241119.a2b43e1-1build1_all.deb + psmisc_23.7-2ubuntu2_amd64.deb + ptyxis_50.1-1ubuntu2_amd64.deb + python-apt-common_3.1.0ubuntu1.1_all.deb + python-babel-localedata_2.17.0-2_all.deb + python3_3.14.3-0ubuntu2_amd64.deb + python3-apport_2.34.1-0ubuntu0.1_all.deb + python3-apt_3.1.0ubuntu1.1_amd64.deb + python3-aptdaemon_2.0.2build1_all.deb + python3-aptdaemon.gtk3widgets_2.0.2build1_all.deb + python3-attr_25.4.0-1build1_all.deb + python3-autocommand_2.2.2-4_all.deb + python3-babel_2.17.0-2_all.deb + python3-bcrypt_5.0.0-3build1_amd64.deb + python3-blinker_1.9.0-2build1_all.deb + python3-brlapi_6.7-1ubuntu6_amd64.deb + python3-cairo_1.27.0-2build2_amd64.deb + python3-certifi_2026.1.4+ds-1_all.deb + python3-cffi-backend_2.0.0-3build1_amd64.deb + python3-chardet_5.2.0+dfsg-2build1_all.deb + python3-click_8.2.0+0.really.8.1.8-1build1_all.deb + python3-configobj_5.0.9-1build1_all.deb + python3-cryptography_46.0.5-1ubuntu2_amd64.deb + python3-cups_2.0.4-3build1_amd64.deb + python3-cupshelpers_1.5.18-4ubuntu2_all.deb + python3-dasbus_1.7-2build1_all.deb + python3-dbus_1.4.0-1build2_amd64.deb + python3-debconf_1.5.92_all.deb + python3-debian_1.0.1ubuntu2_all.deb + python3-decorator_5.2.1-2_all.deb + python3-defer_1.0.6-2.1ubuntu2_all.deb + python3-distro_1.9.0-1build1_all.deb + python3-distro-info_1.15_all.deb + python3-distupgrade_1%3a26.04.23_all.deb + python3-gi_3.56.2-1_amd64.deb + python3-httplib2_0.22.0-1ubuntu0.1_all.deb + python3-ibus-1.0_1.5.34~rc2-1_all.deb + python3-idna_3.11-1ubuntu0.1_all.deb + python3-inflect_7.5.0-1build1_all.deb + python3-jaraco.context_6.0.1-2_all.deb + python3-jaraco.functools_4.1.0-1build1_all.deb + python3-jaraco.text_4.0.0-1build1_all.deb + python3-jinja2_3.1.6-1build1_all.deb + python3-json-pointer_2.4-4_all.deb + python3-jsonpatch_1.32-6_all.deb + python3-jsonschema_4.19.2-6ubuntu2_all.deb + python3-jsonschema-specifications_2023.12.1-4_all.deb + python3-jwt_2.10.1-4ubuntu1_all.deb + python3-launchpadlib_2.1.0-1build1_all.deb + python3-lazr.restfulclient_0.14.6-3build1_all.deb + python3-lazr.uri_1.0.6-7build1_all.deb + python3-linkify-it_2.0.3-1ubuntu3_all.deb + python3-louis_3.36.0-1_all.deb + python3-markdown-it_3.0.0-3build1_all.deb + python3-markupsafe_3.0.3-1build1_amd64.deb + python3-mdurl_0.1.2-1build1_all.deb + python3-minimal_3.14.3-0ubuntu2_amd64.deb + python3-more-itertools_10.8.0-1build1_all.deb + python3-netplan_1.2-1ubuntu5.1_amd64.deb + python3-oauthlib_3.3.1-1build1_all.deb + python3-olefile_0.47-1build1_all.deb + python3-passlib_1.9.3-1ubuntu1_all.deb + python3-pexpect_4.9-4_all.deb + python3-pil_12.1.1-2ubuntu1.3_amd64.deb + python3-pkg-resources_78.1.1-0.1build1_all.deb + python3-problem-report_2.34.1-0ubuntu0.1_all.deb + python3-prometheus-client_0.21.1+ds1-1build1_all.deb + python3-psutil_7.1.0-1ubuntu1_amd64.deb + python3-ptyprocess_0.7.0-6build1_all.deb + python3-pygments_2.19.2+dfsg-1_all.deb + python3-pyparsing_3.3.2-2_all.deb + python3-referencing_0.36.2-1ubuntu2_all.deb + python3-requests_2.32.5+dfsg-1ubuntu1_all.deb + python3-rich_13.9.4-1.2_all.deb + python3-rpds-py_0.27.1-2ubuntu3_amd64.deb + python3-serial_3.5-2build1_all.deb + python3-setproctitle_1.3.7-2build1_amd64.deb + python3-setuptools_78.1.1-0.1build1_all.deb + python3-software-properties_0.120.1_all.deb + python3-speechd_0.12.1-2ubuntu1_all.deb + python3-sss_2.12.0-1ubuntu5.4_amd64.deb + python3-systemd_235-1build9_amd64.deb + python3-tk_3.14.3-0ubuntu2_amd64.deb + python3-typeguard_4.4.4-2_all.deb + python3-typing-extensions_4.15.0-2_all.deb + python3-uc-micro_1.0.3-1build1_all.deb + python3-update-manager_1%3a26.04.5_all.deb + python3-urllib3_2.6.3-1ubuntu1.1_all.deb + python3-wadllib_2.0.0-3_all.deb + python3-xdg_0.28-3_all.deb + python3-xkit_0.5.0ubuntu8_all.deb + python3-yaml_6.0.3-1build1_amd64.deb + python3-zipp_3.23.0-1build1_all.deb + python3.14_3.14.4-1ubuntu0.2_amd64.deb + python3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb + python3.14-tk_3.14.4-1ubuntu0.2_amd64.deb + readline-common_8.3-4_all.deb + resources_1.10.2-0ubuntu3.1_amd64.deb + rfkill_2.41.3-3ubuntu2.2_amd64.deb + rtkit_0.14-1_amd64.deb + rustdesk-1.4.9-x86_64.deb + rygel_45.0-1ubuntu1_amd64.deb + samba-libs_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb + sane-airscan_0.99.36-2ubuntu1_amd64.deb + sane-utils_1.4.0-1ubuntu1_amd64.deb + sbsigntool_0.9.4-3.1ubuntu9_amd64.deb + screen_4.9.1-3ubuntu2_amd64.deb + seahorse_47.0.1-3build1_amd64.deb + secureboot-db_1.9build2_amd64.deb + sgml-base_1.31+nmu1build1_all.deb + sgml-data_2.0.11+nmu1build1_all.deb + shared-mime-info_2.4-5build3_amd64.deb + smartmontools_7.5-2_amd64.deb + snapd_2.76.3+ubuntu26.04_amd64.deb + software-properties-common_0.120.1_all.deb + sound-icons_0.1-8build1_all.deb + sound-theme-freedesktop_0.8-7build1_all.deb + speech-dispatcher_0.12.1-2ubuntu1_amd64.deb + speech-dispatcher-audio-plugins_0.12.1-2ubuntu1_amd64.deb + speech-dispatcher-espeak-ng_0.12.1-2ubuntu1_amd64.deb + spice-vdagent_0.23.0-1ubuntu0.1_amd64.deb + squashfs-tools_1%3a4.7.5-1_amd64.deb + ssh-import-id_5.11-0ubuntu4_all.deb + ssl-cert_1.1.3ubuntu2_all.deb + sssd_2.12.0-1ubuntu5.4_amd64.deb + sssd-ad_2.12.0-1ubuntu5.4_amd64.deb + sssd-ad-common_2.12.0-1ubuntu5.4_amd64.deb + sssd-common_2.12.0-1ubuntu5.4_amd64.deb + sssd-ipa_2.12.0-1ubuntu5.4_amd64.deb + sssd-krb5_2.12.0-1ubuntu5.4_amd64.deb + sssd-krb5-common_2.12.0-1ubuntu5.4_amd64.deb + sssd-ldap_2.12.0-1ubuntu5.4_amd64.deb + sssd-proxy_2.12.0-1ubuntu5.4_amd64.deb + switcheroo-control_3.0-2_amd64.deb + sysprof_50.0-1_amd64.deb + system-config-printer-common_1.5.18-4ubuntu2_all.deb + system-config-printer-udev_1.5.18-4ubuntu2_amd64.deb + systemd_259.5-0ubuntu3.4_amd64.deb + systemd-cryptsetup_259.5-0ubuntu3.4_amd64.deb + systemd-hwe-hwdb_259.5.3ubuntu_all.deb + systemd-oomd_259.5-0ubuntu3.4_amd64.deb + systemd-resolved_259.5-0ubuntu3.4_amd64.deb + systemd-sysv_259.5-0ubuntu3.4_amd64.deb + systemd-timesyncd_259.5-0ubuntu3.4_amd64.deb + tcl_8.6.16build1_amd64.deb + tcl8.6_8.6.17+dfsg-1build1_amd64.deb + tecla_49.0-2_amd64.deb + tinysparql_3.11.0-1_amd64.deb + tpm-udev_4.1.3-6_all.deb + tzdata_2026c-0ubuntu0.26.04.1_all.deb + ubuntu-advantage-desktop-daemon_1.13build1_amd64.deb + ubuntu-desktop-minimal_1.570.3_amd64.deb + ubuntu-docs_26.04.1_all.deb + ubuntu-drivers-common_1%3a0.10.9_amd64.deb + ubuntu-insights_0.9.3ubuntu_amd64.deb + ubuntu-pro-client_37.2ubuntu0.1_amd64.deb + ubuntu-pro-client-l10n_37.2ubuntu0.1_amd64.deb + ubuntu-release-upgrader-core_1%3a26.04.23_all.deb + ubuntu-release-upgrader-gtk_1%3a26.04.23_all.deb + ubuntu-report_1.7.3ubuntu4_amd64.deb + ubuntu-session_50.1-0ubuntu0.1_all.deb + ubuntu-settings_26.04.6_all.deb + ubuntu-wallpapers_26.04.2_all.deb + ubuntu-wallpapers-resolute_26.04.2_all.deb + ucf_3.0052ubuntu1_all.deb + udev_259.5-0ubuntu3.4_amd64.deb + udisks2_2.10.91-1ubuntu2.1_amd64.deb + ufw_0.36.2-9build1_all.deb + unattended-upgrades_2.12ubuntu9_all.deb + unzip_6.0-29ubuntu1_amd64.deb + update-inetd_4.54build1_all.deb + update-manager_1%3a26.04.5_all.deb + update-manager-core_1%3a26.04.5_all.deb + update-notifier_3.207.2_amd64.deb + update-notifier-common_3.207.2_all.deb + upower_1.91.1-1_amd64.deb + usb-modeswitch_2.6.2-1ubuntu1_amd64.deb + usb-modeswitch-data_20191128-7build1_all.deb + usb.ids_2025.12.13-1_all.deb + usbmuxd_1.1.1-7_amd64.deb + usbutils_1%3a019-1_amd64.deb + user-session-migration_0.5.1_amd64.deb + uuid-runtime_2.41.3-3ubuntu2.2_amd64.deb + wamerican_2020.12.07-4build1_all.deb + webp-pixbuf-loader_0.2.7-3_amd64.deb + wget_1.25.0-2ubuntu4.4_amd64.deb + whoopsie_0.2.82ubuntu_amd64.deb + whoopsie-preferences_23build4_amd64.deb + wireguard-tools_1.0.20250521-1ubuntu1_amd64.deb + wireless-regdb_2026.05.30-0ubuntu1~26.04.1_all.deb + wireplumber_0.5.13-1ubuntu1_amd64.deb + wpasupplicant_2%3a2.11-0ubuntu5_amd64.deb + wsdd_2%3a0.8-5ubuntu1_all.deb + x11-apps_7.7+11build4_amd64.deb + x11-common_1%3a7.7+26ubuntu1_all.deb + x11-session-utils_7.7+6build3_amd64.deb + x11-utils_7.7+7build1_amd64.deb + x11-xkb-utils_7.7+9build1_amd64.deb + x11-xserver-utils_7.7+11build1_amd64.deb + xauth_1%3a1.1.2-1.1build1_amd64.deb + xbitmaps_1.1.1-2.2build1_all.deb + xbrlapi_6.7-1ubuntu6_amd64.deb + xcursor-themes_1.0.6-0ubuntu2_all.deb + xcvt_0.1.3-1build1_amd64.deb + xdg-dbus-proxy_0.1.7-1_amd64.deb + xdg-desktop-portal_1.21.1+ds-1ubuntu3_amd64.deb + xdg-desktop-portal-gnome_50.0-0ubuntu1_amd64.deb + xdg-desktop-portal-gtk_1.15.3-2ubuntu1_amd64.deb + xdg-terminal-exec_0.14.0-1ubuntu0.1_all.deb + xdg-user-dirs_0.19-1_amd64.deb + xdg-user-dirs-gtk_0.16-1_amd64.deb + xdg-utils_1.2.1-2ubuntu2_all.deb + xfonts-base_1%3a1.0.5+nmu1build1_all.deb + xfonts-encodings_1%3a1.0.5-0ubuntu3_all.deb + xfonts-scalable_1%3a1.0.3-1.3build1_all.deb + xfonts-utils_1%3a7.7+7build1_amd64.deb + xinit_1.4.2-1build1_amd64.deb + xinput_1.6.4-1build2_amd64.deb + xkb-data_2.46-2_all.deb + xml-core_0.19build1_all.deb + xorg_1%3a7.7+26ubuntu1_amd64.deb + xorg-docs-core_1%3a1.7.3-1_all.deb + xorgxrdp_1%3a0.10.2-1build1_amd64.deb + xrdp_0.10.1-4.1_amd64.deb + xserver-common_2%3a21.1.22-1ubuntu1_all.deb + xserver-xorg_1%3a7.7+26ubuntu1_amd64.deb + xserver-xorg-core_2%3a21.1.22-1ubuntu1_amd64.deb + xserver-xorg-legacy_2%3a21.1.22-1ubuntu1_amd64.deb + xserver-xorg-video-all_1%3a7.7+26ubuntu1_amd64.deb + xserver-xorg-video-amdgpu_25.0.0-1_amd64.deb + xserver-xorg-video-ati_1%3a22.0.0-1build2_amd64.deb + xserver-xorg-video-fbdev_1%3a0.5.0-2build3_amd64.deb + xserver-xorg-video-intel_2%3a2.99.917+git20210115-1build2_amd64.deb + xserver-xorg-video-nouveau_1%3a1.0.18-1build1_amd64.deb + xserver-xorg-video-qxl_0.1.6-1.1build1_amd64.deb + xserver-xorg-video-radeon_1%3a22.0.0-1build2_amd64.deb + xserver-xorg-video-vesa_1%3a2.6.0-2build1_amd64.deb + xwayland_2%3a24.1.10-1_amd64.deb + xz-utils_5.8.3-1_amd64.deb + yaru-theme-gnome-shell_26.04.5.1ubuntu_all.deb + yaru-theme-gtk_26.04.5.1ubuntu_all.deb + yaru-theme-icon_26.04.5.1ubuntu_all.deb + yaru-theme-sound_26.04.5.1ubuntu_all.deb + yelp_49.0-5ubuntu0.1_amd64.deb + yelp-xsl_49.0-2_all.deb + zenity_4.2.1-1_amd64.deb + zenity-common_4.2.1-1_all.deb + zip_3.0-15ubuntu3_amd64.deb + zstd_1.5.7+dfsg-3_amd64.deb + Packages + Packages.gz + packages.lock.tsv + repo-manifest.yaml + SHA256SUMS + manifests/ + base-packages.txt + docker.txt + packages.lock.schema.tsv + remote-access.txt + requirements.tsv + add-packages.sh + build-index.sh + build-offline-repo.sh + README.md + repo-manifest.yaml + release/ + manifest.yaml + README.md + README.md research/ .gitkeep A-os-gui-wireguard-docker.md @@ -194,8 +1596,17 @@ rustdesk/ scripts/ diagnostics/ .gitkeep + bf-check-enrollment + bf-check-local + bf-check-ready bf-diagnostics + bf-enroll + bf-enroll-now + bf-enrollment-status bf-hardware-inventory.sh + bf-live-hw-check + bf-release + bf-remote-status bf-status bf-support-bundle install/ @@ -219,6 +1630,10 @@ scripts/ 16-gui.sh 17-healthcheck.sh 18-final-check.sh + offline-apt.sh + optional/ + anydesk/ + install-anydesk.sh .gitkeep blueforce-install.sh README.md @@ -226,14 +1641,79 @@ scripts/ .gitkeep bf-gui-off bf-gui-on + migration/ + windows/ + BF-WindowsDataExport.ps1 + BF-WindowsPreMigrationInventory.ps1 + README.md recovery/ .gitkeep tests/ .gitkeep + check-admin-static.sh + check-ansible-static.sh check-configs.sh + check-migration-static.sh + check-offline-repo-static.sh + check-provisioning-static.sh check-specs.sh + qemu-field-os-test-plan.md + run-all.sh semaphore-community-limits.md + test_bfos_gui_static.py + test_bfos.py + test_web_static.py + test-field-os-lifecycle.sh + test-firstboot-static.sh +web/ + data/ + fleet.example.json + static/ + app.css + tokens.css + templates/ + about_channel_row.html + about_vocabulary_row.html + about_wave_row.html + about.html + base.html + channel_row.html + detail_empty.html + detail_unknown.html + detail.html + device_row.html + empty_note.html + filter_bar.html + fleet.html + gated_action.html + invalid_block.html + invalid_item.html + not_found_body.html + note_block.html + notes_item.html + notes_list.html + option.html + primary_action.html + reason_block.html + refused_body.html + rule_item.html + selection_note.html + summary_cell.html + warning_item.html + warnings.html + wave_item.html + wave_strip.html + __init__.py + fleet_data.py + panel.py + README.md + render.py + server.py +.gitattributes .gitignore +IMPLEMENTATION-REPORT.md +PRODUCT.md +pyproject.toml README.md SUMMARY.md @@ -241,6 +1721,8719 @@ SUMMARY.md This section contains the contents of the repository's files. + +"""bfos/ui_theme.py -- design tokens for the device console. + +The values in this file MIRROR ``web/static/tokens.css``, which is the single +source of truth for both operator surfaces (the device console and the central +panel). Nothing here invents a colour: a colour means a device state, a +severity, or the action accent, and a fifth hue would be a bug (docs/DESIGN.md, +"Rules"). The mirror is not a comment-level promise -- ``TOKENS`` carries the +CSS custom-property name of every value, and ``tests/test_bfos_gui_static.py`` +parses ``tokens.css`` and compares the two files, so a token changed on one +surface and not the other fails the suite instead of drifting. + +Why light, not dark +------------------- +The console runs in workshops, dealer service areas and customer sites: bright +overhead light, daylight from a roller door, a 14" laptop panel. A near-black +console loses its own body text there and its state colours collapse into +equal-brightness smudges. So the ground is light (``BG_APP``), the panels are +white (``BG_PANEL``), the one dark region is the header (``BG_HEADER``), and +saturation is spent only where it carries meaning. + +Faces +----- +No webfont, and no font download: the fleet installs offline, so the UI face is +whatever the platform ships and the data face is monospace (ids, counts, exit +codes, timestamps line up in a column). ``apply_theme`` picks the first family +the platform actually has, from a candidate list -- never a missing font name, +which is a silently different layout. + +Sizes and the 4px rhythm +------------------------ +Type sizes and space steps are kept in the token's own unit (CSS px) so the +mirror is exact. Tk font sizes are points, so ``point_size`` converts with the +96 dpi relation the tokens assume; padding and row heights are already pixels +in Tk, so they are used as ``SP_*`` values directly. + +Usage +----- + theme = ui_theme.apply_theme(root) # once, before any widget is built + ttk.Label(parent, style=theme.panel_label) +""" + +from __future__ import annotations + +from typing import Dict, Mapping, Sequence + +try: # pragma: no cover - environment dependent + from tkinter import ttk + + HAVE_TKINTER = True +except Exception: # pragma: no cover - environment dependent + ttk = None # type: ignore[assignment] + HAVE_TKINTER = False + + +# --------------------------------------------------------------------------- +# Ground and structure -- tokens.css: "Ground and structure" +# --------------------------------------------------------------------------- +BG_APP = "#f6f7f8" # window ground +BG_PANEL = "#ffffff" # raised surfaces, cards, table body +BG_SUNKEN = "#eef0f2" # wells: log output, code, inactive rows +BG_HEADER = "#1d2530" # app header; the one dark region +BORDER = "#d5d9de" # hairline between regions +BORDER_STRONG = "#b6bcc4" # input borders, table rules + +# --------------------------------------------------------------------------- +# Text +# --------------------------------------------------------------------------- +TEXT = "#1a1f26" # body +TEXT_MUTED = "#5c6570" # secondary lines, labels +TEXT_FAINT = "#8b939c" # timestamps, hints, placeholders +TEXT_ON_DARK = "#e8ebee" # header text +TEXT_ON_ACCENT = "#ffffff" + +# --------------------------------------------------------------------------- +# Action -- one accent: the action the operator came to take, and the +# selected row. Nothing else. +# --------------------------------------------------------------------------- +ACCENT = "#1d4ed8" +ACCENT_HOVER = "#1a43bd" +ACCENT_ACTIVE = "#16389e" +ACCENT_SOFT = "#e8eeff" # selected row, focus ring fill +FOCUS_RING = "#1d4ed8" + +# --------------------------------------------------------------------------- +# State severities -- four, each with a strong form for text and a soft form +# for fills, so a badge is built from one palette without inventing a second. +# --------------------------------------------------------------------------- +OK = "#15803d" +OK_SOFT = "#e6f4ea" +WARN = "#b45309" +WARN_SOFT = "#fdf3e3" +DANGER = "#b91c1c" +DANGER_SOFT = "#fdecec" +INFO = "#1d4ed8" +INFO_SOFT = "#e8eeff" +IDLE = "#5c6570" # not yet acted on: not a failure +IDLE_SOFT = "#eef0f2" + +# --------------------------------------------------------------------------- +# Device state machine -- PROVISIONED_OFFLINE -> ENROLLED -> READY, plus the +# failure and the absence that sit outside the sequence. Named so no surface +# repaints a stage by accident. +# +# PROVISIONED is deliberately NOT the action accent (tokens.css states the +# reason): the accent means "the action you came to take" and "the selected +# row", so a KURULDU badge built from it made a state and a selection the same +# blue. It is a slate of its own, one step along the path and distinct from the +# neutral --idle. +# --------------------------------------------------------------------------- +STATE_PROVISIONED = "#475569" +STATE_ENROLLED = WARN +STATE_READY = OK +STATE_FAILED = DANGER +STATE_ABSENT = IDLE + +# --------------------------------------------------------------------------- +# Type (px, as the tokens declare them) +# --------------------------------------------------------------------------- +SIZE_XS = 12 +SIZE_SM = 13 +SIZE_MD = 15 +SIZE_LG = 18 +SIZE_XL = 22 +SIZE_2XL = 30 + +LEADING_TIGHT = 1.25 +LEADING_NORMAL = 1.5 + +# --------------------------------------------------------------------------- +# Space -- a 4px rhythm, named so a component never hand-picks 7px +# --------------------------------------------------------------------------- +SP_1 = 4 +SP_2 = 8 +SP_3 = 12 +SP_4 = 16 +SP_5 = 24 +SP_6 = 32 +SP_7 = 48 + +RADIUS = 6 +RADIUS_LG = 10 + +# --------------------------------------------------------------------------- +# Metrics +# --------------------------------------------------------------------------- +ROW_H = 44 # fleet table row: comfortable at arm's length +CONTROL_H = 36 # buttons and inputs share one height +HEADER_H = 56 +SIDEBAR_W = 220 + +# Elevation is a token with no Tk equivalent (Tk has no box-shadow); the names +# are kept so the two token sets stay comparable and the absence is explicit. +SHADOW_SM = "0 1px 2px rgba(16, 24, 40, .06)" +SHADOW_MD = "0 4px 12px rgba(16, 24, 40, .10)" + +# --------------------------------------------------------------------------- +# Fonts -- candidates in preference order, resolved against the platform +# --------------------------------------------------------------------------- +FONT_UI_CANDIDATES: Sequence[str] = ( + "Noto Sans", + "DejaVu Sans", + "Ubuntu", + "Liberation Sans", + "Segoe UI", + "Helvetica", +) +FONT_DATA_CANDIDATES: Sequence[str] = ( + "DejaVu Sans Mono", + "Liberation Mono", + "Noto Sans Mono", + "Consolas", + "Menlo", + "Courier New", +) +FONT_UI_FALLBACK = "TkDefaultFont" +FONT_DATA_FALLBACK = "TkFixedFont" + +#: CSS px -> Tk points, at the 96 dpi the tokens assume. Table, not a formula: +#: rounding is per size so the console keeps the token's steps instead of +#: collapsing two of them onto the same point size. +POINT_SIZES: Mapping[int, int] = { + SIZE_XS: 9, + SIZE_SM: 10, + SIZE_MD: 11, + SIZE_LG: 14, + SIZE_XL: 16, + SIZE_2XL: 22, +} + +# --------------------------------------------------------------------------- +# The mirror table -- CSS custom property -> value. Kept as data so the parity +# test reads the same list the code uses. +# --------------------------------------------------------------------------- +TOKENS: Mapping[str, str] = { + "--bg-app": BG_APP, + "--bg-panel": BG_PANEL, + "--bg-sunken": BG_SUNKEN, + "--bg-header": BG_HEADER, + "--border": BORDER, + "--border-strong": BORDER_STRONG, + "--text": TEXT, + "--text-muted": TEXT_MUTED, + "--text-faint": TEXT_FAINT, + "--text-on-dark": TEXT_ON_DARK, + "--text-on-accent": TEXT_ON_ACCENT, + "--accent": ACCENT, + "--accent-hover": ACCENT_HOVER, + "--accent-active": ACCENT_ACTIVE, + "--accent-soft": ACCENT_SOFT, + "--focus-ring": FOCUS_RING, + "--ok": OK, + "--ok-soft": OK_SOFT, + "--warn": WARN, + "--warn-soft": WARN_SOFT, + "--danger": DANGER, + "--danger-soft": DANGER_SOFT, + "--info": INFO, + "--info-soft": INFO_SOFT, + "--idle": IDLE, + "--idle-soft": IDLE_SOFT, + "--state-provisioned": STATE_PROVISIONED, + "--state-enrolled": STATE_ENROLLED, + "--state-ready": STATE_READY, + "--state-failed": STATE_FAILED, + "--state-absent": STATE_ABSENT, +} + +#: Space tokens, mirrored by name (the parity test compares these too). +SPACE_TOKENS: Mapping[str, int] = { + "--sp-1": SP_1, + "--sp-2": SP_2, + "--sp-3": SP_3, + "--sp-4": SP_4, + "--sp-5": SP_5, + "--sp-6": SP_6, + "--sp-7": SP_7, +} + +#: Type-size tokens, mirrored by name. +SIZE_TOKENS: Mapping[str, int] = { + "--size-xs": SIZE_XS, + "--size-sm": SIZE_SM, + "--size-md": SIZE_MD, + "--size-lg": SIZE_LG, + "--size-xl": SIZE_XL, + "--size-2xl": SIZE_2XL, +} + +#: Metric tokens, mirrored by name. +METRIC_TOKENS: Mapping[str, int] = { + "--row-h": ROW_H, + "--control-h": CONTROL_H, + "--header-h": HEADER_H, + "--sidebar-w": SIDEBAR_W, +} + +#: Every mirrored value, by CSS token name (used by the parity test). +ALL_TOKENS: Mapping[str, str] = { + **TOKENS, + **{name: str(value) for name, value in SPACE_TOKENS.items()}, + **{name: str(value) for name, value in SIZE_TOKENS.items()}, + **{name: str(value) for name, value in METRIC_TOKENS.items()}, +} + +# --------------------------------------------------------------------------- +# Severity vocabulary -- the fill/text pair a badge or a row is built from +# --------------------------------------------------------------------------- +SEVERITIES: Sequence[str] = ("ok", "warn", "danger", "info", "idle") + +SEVERITY_FILL: Mapping[str, str] = { + "ok": OK_SOFT, + "warn": WARN_SOFT, + "danger": DANGER_SOFT, + "info": INFO_SOFT, + "idle": IDLE_SOFT, +} +SEVERITY_TEXT: Mapping[str, str] = { + "ok": OK, + "warn": WARN, + "danger": DANGER, + "info": INFO, + "idle": IDLE, +} + +#: State vocabulary, exactly the words both surfaces use (docs/DESIGN.md). +STATE_WORDS: Mapping[str, str] = { + "provisioned": "KURULDU", + "enrolled": "KAYITLI", + "ready": "HAZIR", + "failed": "HATA", + "absent": "YOK", +} +STATE_FILL: Mapping[str, str] = { + # The tokens give no soft form for provisioned; the console borrows the + # sunken well fill rather than inventing a hue, so a KURULDU badge cannot be + # mistaken for the accent-soft selection (see tokens.css, device state). + "provisioned": BG_SUNKEN, + "enrolled": WARN_SOFT, + "ready": OK_SOFT, + "failed": DANGER_SOFT, + "absent": IDLE_SOFT, +} +STATE_TEXT_COLOUR: Mapping[str, str] = { + "provisioned": STATE_PROVISIONED, + "enrolled": STATE_ENROLLED, + "ready": STATE_READY, + "failed": STATE_FAILED, + "absent": STATE_ABSENT, +} + +#: Privilege is a state, not a log line (docs/DESIGN.md, "Privilege"). +PRIVILEGE_STYLE: Mapping[bool, str] = {True: "ok", False: "warn"} + +#: ttk style names, resolved once by apply_theme and read by the view. +_FAMILIES: Dict[str, str] = {} + + +# --------------------------------------------------------------------------- +# Small helpers +# --------------------------------------------------------------------------- +def point_size(px: int) -> int: + """Token px -> Tk point size (see POINT_SIZES).""" + return POINT_SIZES.get(px, max(7, round(px * 0.75))) + + +def ui_family() -> str: + """The UI face resolved by :func:`apply_theme` (platform default before).""" + return _FAMILIES.get("ui", FONT_UI_FALLBACK) + + +def data_family() -> str: + """The monospace face resolved by :func:`apply_theme`.""" + return _FAMILIES.get("data", FONT_DATA_FALLBACK) + + +def ui_font(size: int = SIZE_MD, weight: str = "normal") -> tuple: + """A Tk font tuple in the platform UI face.""" + if weight == "normal": + return (ui_family(), point_size(size)) + return (ui_family(), point_size(size), weight) + + +def data_font(size: int = SIZE_SM, weight: str = "normal") -> tuple: + """A Tk font tuple in the data (monospace) face.""" + if weight == "normal": + return (data_family(), point_size(size)) + return (data_family(), point_size(size), weight) + + +def state_style(state: str) -> str: + """ttk style name for a state badge ("KURULDU" ...).""" + return f"State{state.capitalize()}.Badge.TLabel" + + +#: State key -> badge style, built from STATE_WORDS so the word and the colour +#: can never be paired up wrongly on one surface. +STATE_BADGE_STYLE: Mapping[str, str] = { + key: f"State{key.capitalize()}.Badge.TLabel" for key in STATE_WORDS +} + +#: Privilege level -> badge style ("Privilege" for full, "ReadOnly" else). +PRIVILEGE_BADGE_STYLE: Mapping[str, str] = { + "full": "Privilege.Badge.TLabel", + "read_only": "ReadOnly.Badge.TLabel", +} + + +def severity_style(severity: str) -> str: + """ttk style name for a severity pill (ok / warn / danger / info / idle).""" + return f"{severity.capitalize()}.Status.TLabel" + + +def _resolve_family(root, candidates: Sequence[str], fallback: str) -> str: + """First family the platform actually has; the Tk default otherwise.""" + try: + from tkinter import font as tkfont + + available = {name.lower() for name in tkfont.families(root)} + except Exception: # pragma: no cover - font database unavailable + return fallback + for name in candidates: + if name.lower() in available: + return name + return fallback + + +def _configure(style, name: str, **options) -> None: + """Configure a ttk style, ignoring options the platform's theme rejects. + + ttk style elements differ between Tk builds (clam vs default, Tk 8.6 vs + 9.x): a missing element option raises TclError. Losing one border colour is + a cosmetic difference; crashing the console on startup is not. + """ + try: + style.configure(name, **options) + except Exception: + for key, value in options.items(): + try: + style.configure(name, **{key: value}) + except Exception: + continue + + +def _map(style, name: str, **options) -> None: + """State map for a ttk style, same tolerance as :func:`_configure`.""" + try: + style.map(name, **options) + except Exception: + for key, value in options.items(): + try: + style.map(name, **{key: value}) + except Exception: + continue + + +# --------------------------------------------------------------------------- +# The one setup function, called once at startup +# --------------------------------------------------------------------------- +def apply_theme(root) -> Mapping[str, str]: + """Install the token set on ``root``'s ttk styles; returns the style names. + + Idempotent and cheap: the GUI calls it once before building any widget, and + a second call simply re-applies the same values (tests may build several + roots in one process). + """ + if not HAVE_TKINTER: # pragma: no cover - environment dependent + raise RuntimeError("tkinter yok: tema uygulanamaz") + assert ttk is not None # narrowing for the type checker + + _FAMILIES["ui"] = _resolve_family(root, FONT_UI_CANDIDATES, FONT_UI_FALLBACK) + _FAMILIES["data"] = _resolve_family(root, FONT_DATA_CANDIDATES, FONT_DATA_FALLBACK) + + try: + root.configure(bg=BG_APP) + except Exception: # pragma: no cover - non-Tk root + pass + + style = ttk.Style(root) + # clam honours background/bordercolor on the widget elements we restyle; + # the 'default' theme on Linux ignores most of them, which is how a + # console ends up grey whatever the tokens say. + try: + if "clam" in style.theme_names(): + style.theme_use("clam") + except Exception: # pragma: no cover - theme list unavailable + pass + + base_font = ui_font(SIZE_MD) + _configure( + style, ".", + background=BG_APP, + foreground=TEXT, + font=base_font, + bordercolor=BORDER, + lightcolor=BORDER, + darkcolor=BORDER, + troughcolor=BG_SUNKEN, + focuscolor=FOCUS_RING, + ) + + # -- frames: the ground, the raised panel, the well, the one dark band -- + _configure(style, "TFrame", background=BG_APP, borderwidth=0) + _configure(style, "Panel.TFrame", background=BG_PANEL, borderwidth=1, + relief="solid", bordercolor=BORDER, lightcolor=BORDER, darkcolor=BORDER) + _configure(style, "Sunken.TFrame", background=BG_SUNKEN, borderwidth=1, + relief="solid", bordercolor=BORDER, lightcolor=BORDER, darkcolor=BORDER) + _configure(style, "Header.TFrame", background=BG_HEADER, borderwidth=0) + _configure(style, "Warn.TFrame", background=WARN_SOFT, borderwidth=1, + relief="solid", bordercolor=WARN, lightcolor=WARN_SOFT, + darkcolor=WARN_SOFT) + _configure(style, "Info.TFrame", background=INFO_SOFT, borderwidth=1, + relief="solid", bordercolor=INFO, lightcolor=INFO_SOFT, + darkcolor=INFO_SOFT) + _configure(style, "Accent.TFrame", background=ACCENT_SOFT, borderwidth=1, + relief="solid", bordercolor=ACCENT, lightcolor=ACCENT_SOFT, + darkcolor=ACCENT_SOFT) + + # -- labels ------------------------------------------------------------- + _configure(style, "TLabel", background=BG_APP, foreground=TEXT, font=base_font) + _configure(style, "Panel.TLabel", background=BG_PANEL, foreground=TEXT) + _configure(style, "Sunken.TLabel", background=BG_SUNKEN, foreground=TEXT) + _configure(style, "Muted.TLabel", background=BG_APP, foreground=TEXT_MUTED, + font=ui_font(SIZE_SM)) + _configure(style, "PanelMuted.TLabel", background=BG_PANEL, + foreground=TEXT_MUTED, font=ui_font(SIZE_SM)) + _configure(style, "Faint.TLabel", background=BG_APP, foreground=TEXT_FAINT, + font=ui_font(SIZE_XS)) + _configure(style, "PanelFaint.TLabel", background=BG_PANEL, + foreground=TEXT_FAINT, font=ui_font(SIZE_XS)) + _configure(style, "FieldLabel.TLabel", background=BG_PANEL, foreground=TEXT_MUTED, + font=ui_font(SIZE_SM), anchor="e") + _configure(style, "Section.TLabel", background=BG_APP, foreground=TEXT, + font=ui_font(SIZE_LG, "bold")) + _configure(style, "PanelTitle.TLabel", background=BG_PANEL, foreground=TEXT_MUTED, + font=ui_font(SIZE_XS, "bold")) + # The one loud figure per view. + _configure(style, "Figure.TLabel", background=BG_APP, foreground=TEXT, + font=ui_font(SIZE_2XL, "bold")) + _configure(style, "Ok.TLabel", background=BG_PANEL, foreground=OK, + font=ui_font(SIZE_SM)) + _configure(style, "Warn.TLabel", background=WARN_SOFT, foreground=WARN, + font=ui_font(SIZE_SM)) + _configure(style, "InfoText.TLabel", background=INFO_SOFT, foreground=INFO, + font=ui_font(SIZE_SM)) + _configure(style, "Danger.TLabel", background=BG_PANEL, foreground=DANGER, + font=ui_font(SIZE_SM)) + _configure(style, "AppWarn.TLabel", background=BG_APP, foreground=WARN, + font=ui_font(SIZE_SM, "bold")) + _configure(style, "PanelOk.TLabel", background=BG_PANEL, foreground=OK, + font=ui_font(SIZE_SM, "bold")) + _configure(style, "PanelDanger.TLabel", background=BG_PANEL, foreground=DANGER, + font=ui_font(SIZE_SM, "bold")) + # Dialogs sit on the app ground, not on a panel. + _configure(style, "Dialog.TLabel", background=BG_APP, foreground=TEXT, + font=ui_font(SIZE_MD)) + _configure(style, "DialogTitle.TLabel", background=BG_APP, foreground=TEXT, + font=ui_font(SIZE_LG, "bold")) + _configure(style, "DialogMuted.TLabel", background=BG_APP, + foreground=TEXT_MUTED, font=ui_font(SIZE_SM)) + # Header (dark) region. + _configure(style, "HeaderTitle.TLabel", background=BG_HEADER, + foreground=TEXT_ON_DARK, font=ui_font(SIZE_XL, "bold")) + _configure(style, "HeaderMeta.TLabel", background=BG_HEADER, + foreground=TEXT_FAINT, font=ui_font(SIZE_SM)) + _configure(style, "HeaderTarget.TLabel", background=BG_HEADER, + foreground=TEXT_ON_DARK, font=data_font(SIZE_SM)) + _configure(style, "HeaderFigure.TLabel", background=BG_HEADER, + foreground=TEXT_ON_DARK, font=data_font(SIZE_MD, "bold")) + + # -- badges: state word + colour, never colour alone ------------------- + _configure(style, "Badge.TLabel", background=IDLE_SOFT, foreground=IDLE, + font=ui_font(SIZE_SM, "bold"), padding=(SP_2, SP_1)) + for key, word_style in (("provisioned", "Provisioned"), ("enrolled", "Enrolled"), + ("ready", "Ready"), ("failed", "Failed"), + ("absent", "Absent")): + _configure( + style, f"State{word_style}.Badge.TLabel", + background=STATE_FILL[key], foreground=STATE_TEXT_COLOUR[key], + font=ui_font(SIZE_SM, "bold"), padding=(SP_2, SP_1), + ) + _configure(style, "Privilege.Badge.TLabel", background=OK_SOFT, foreground=OK, + font=ui_font(SIZE_SM, "bold"), padding=(SP_3, SP_1)) + _configure(style, "ReadOnly.Badge.TLabel", background=WARN_SOFT, foreground=WARN, + font=ui_font(SIZE_SM, "bold"), padding=(SP_3, SP_1)) + _configure(style, "Type.Destructive.Badge.TLabel", background=DANGER_SOFT, + foreground=DANGER, font=ui_font(SIZE_XS, "bold"), padding=(SP_2, SP_1)) + _configure(style, "Type.ReadOnly.Badge.TLabel", background=IDLE_SOFT, + foreground=IDLE, font=ui_font(SIZE_XS, "bold"), padding=(SP_2, SP_1)) + _configure(style, "Open.Badge.TLabel", background=OK_SOFT, foreground=OK, + font=ui_font(SIZE_XS, "bold"), padding=(SP_2, SP_1)) + _configure(style, "Closed.Badge.TLabel", background=WARN_SOFT, foreground=WARN, + font=ui_font(SIZE_XS, "bold"), padding=(SP_2, SP_1)) + _configure(style, "Info.Badge.TLabel", background=INFO_SOFT, foreground=INFO, + font=ui_font(SIZE_SM, "bold"), padding=(SP_3, SP_1)) + _configure(style, "Neutral.Badge.TLabel", background=BG_SUNKEN, foreground=IDLE, + font=ui_font(SIZE_XS, "bold"), padding=(SP_2, SP_1)) + + # -- status pill (footer): the console's own state --------------------- + _configure(style, "Status.TLabel", background=IDLE_SOFT, foreground=IDLE, + font=ui_font(SIZE_SM, "bold"), padding=(SP_3, SP_2)) + for severity in SEVERITIES: + _configure( + style, f"{severity.capitalize()}.Status.TLabel", + background=SEVERITY_FILL[severity], foreground=SEVERITY_TEXT[severity], + font=ui_font(SIZE_SM, "bold"), padding=(SP_3, SP_2), + ) + + # -- inputs: one height with the buttons --------------------------------- + entry_opts = dict( + fieldbackground=BG_PANEL, + background=BG_PANEL, + foreground=TEXT, + bordercolor=BORDER_STRONG, + lightcolor=BORDER_STRONG, + darkcolor=BORDER_STRONG, + insertcolor=TEXT, + padding=(SP_2, SP_1), + font=ui_font(SIZE_MD), + ) + _configure(style, "TEntry", **entry_opts) + _map(style, "TEntry", + bordercolor=[("focus", FOCUS_RING), ("disabled", BORDER)], + foreground=[("disabled", TEXT_FAINT)], + fieldbackground=[("disabled", BG_SUNKEN)]) + _configure(style, "Invalid.TEntry", **entry_opts) + _configure(style, "Invalid.TEntry", bordercolor=DANGER, lightcolor=DANGER, + darkcolor=DANGER) + _map(style, "Invalid.TEntry", bordercolor=[("focus", DANGER)]) + + _configure(style, "TCombobox", **entry_opts) + _configure(style, "TCombobox", arrowcolor=TEXT_MUTED, selectbackground=ACCENT_SOFT, + selectforeground=TEXT, padding=(SP_2, SP_1)) + _map(style, "TCombobox", + fieldbackground=[("readonly", BG_PANEL), ("disabled", BG_SUNKEN)], + foreground=[("disabled", TEXT_FAINT)], + bordercolor=[("focus", FOCUS_RING)]) + + _configure(style, "TCheckbutton", background=BG_APP, foreground=TEXT, + font=ui_font(SIZE_SM), focuscolor=BG_APP, padding=(SP_1, SP_1)) + _map(style, "TCheckbutton", + background=[("active", BG_APP)], + foreground=[("disabled", TEXT_FAINT)], + indicatorcolor=[("selected", ACCENT), ("pressed", ACCENT_ACTIVE)]) + _configure(style, "Panel.TCheckbutton", background=BG_PANEL, foreground=TEXT, + font=ui_font(SIZE_SM), padding=(SP_1, SP_1)) + _map(style, "Panel.TCheckbutton", + background=[("active", BG_PANEL), ("disabled", BG_PANEL)], + foreground=[("disabled", TEXT_FAINT)]) + + # -- buttons: hairline secondary, one accent primary, danger for + # destructive work ------------------------------------------------ + _configure(style, "TButton", background=BG_PANEL, foreground=TEXT, + bordercolor=BORDER_STRONG, lightcolor=BG_PANEL, darkcolor=BG_PANEL, + font=ui_font(SIZE_MD), padding=(SP_3, SP_2), relief="solid", + focusthickness=1, focuscolor=FOCUS_RING, anchor="center") + _map(style, "TButton", + background=[("disabled", BG_SUNKEN), ("pressed", BG_SUNKEN), + ("active", ACCENT_SOFT)], + foreground=[("disabled", TEXT_FAINT), ("pressed", ACCENT_ACTIVE)], + bordercolor=[("focus", FOCUS_RING)], + lightcolor=[("active", ACCENT_SOFT), ("pressed", BG_SUNKEN)], + darkcolor=[("active", ACCENT_SOFT), ("pressed", BG_SUNKEN)]) + _configure(style, "Accent.TButton", background=ACCENT, foreground=TEXT_ON_ACCENT, + bordercolor=ACCENT, lightcolor=ACCENT, darkcolor=ACCENT) + _map(style, "Accent.TButton", + background=[("disabled", IDLE_SOFT), ("pressed", ACCENT_ACTIVE), + ("active", ACCENT_HOVER)], + foreground=[("disabled", TEXT_FAINT)], + bordercolor=[("focus", ACCENT_ACTIVE), ("active", ACCENT_HOVER)], + lightcolor=[("active", ACCENT_HOVER), ("pressed", ACCENT_ACTIVE)], + darkcolor=[("active", ACCENT_HOVER), ("pressed", ACCENT_ACTIVE)]) + _configure(style, "Danger.TButton", background=DANGER, foreground=TEXT_ON_ACCENT, + bordercolor=DANGER, lightcolor=DANGER, darkcolor=DANGER) + _map(style, "Danger.TButton", + background=[("disabled", IDLE_SOFT), ("pressed", DANGER_SOFT), + ("active", DANGER_SOFT)], + foreground=[("disabled", TEXT_FAINT), ("active", DANGER), + ("pressed", DANGER)], + bordercolor=[("focus", DANGER)], + lightcolor=[("active", DANGER_SOFT), ("pressed", DANGER_SOFT)], + darkcolor=[("active", DANGER_SOFT), ("pressed", DANGER_SOFT)]) + # Simple mode: the three big buttons, one of them the action accent. + _configure(style, "Big.TButton", font=ui_font(SIZE_LG), + padding=(SP_5, SP_4), anchor="w") + _configure(style, "Accent.Big.TButton", background=ACCENT, + foreground=TEXT_ON_ACCENT, bordercolor=ACCENT, lightcolor=ACCENT, + darkcolor=ACCENT) + _map(style, "Accent.Big.TButton", + background=[("disabled", IDLE_SOFT), ("pressed", ACCENT_ACTIVE), + ("active", ACCENT_HOVER)], + foreground=[("disabled", TEXT_FAINT)], + lightcolor=[("active", ACCENT_HOVER), ("pressed", ACCENT_ACTIVE)], + darkcolor=[("active", ACCENT_HOVER), ("pressed", ACCENT_ACTIVE)]) + _configure(style, "Quiet.TButton", background=BG_SUNKEN, bordercolor=BORDER) + + # -- table: the fleet/operation list ------------------------------------ + _configure(style, "Treeview", background=BG_PANEL, fieldbackground=BG_PANEL, + foreground=TEXT, bordercolor=BORDER, lightcolor=BORDER, + darkcolor=BORDER, font=ui_font(SIZE_SM), rowheight=ROW_H) + _configure(style, "Treeview.Heading", background=BG_SUNKEN, + foreground=TEXT_MUTED, font=ui_font(SIZE_XS, "bold"), + relief="flat", padding=(SP_2, SP_2)) + _map(style, "Treeview", + background=[("selected", ACCENT_SOFT)], + foreground=[("selected", TEXT)]) + _map(style, "Treeview.Heading", background=[("active", BG_SUNKEN)]) + + # -- tabs, separators, scrollbars -------------------------------------- + _configure(style, "TNotebook", background=BG_APP, bordercolor=BORDER, + lightcolor=BORDER, darkcolor=BORDER, tabmargins=(0, 0, 0, 0)) + _configure(style, "TNotebook.Tab", background=BG_SUNKEN, foreground=TEXT_MUTED, + font=ui_font(SIZE_SM), padding=(SP_3, SP_2), bordercolor=BORDER) + _map(style, "TNotebook.Tab", + background=[("selected", BG_PANEL), ("active", BG_PANEL)], + foreground=[("selected", TEXT), ("active", TEXT)], + expand=[("selected", (0, 0, 0, 0))]) + _configure(style, "TSeparator", background=BORDER) + for orient in ("Vertical", "Horizontal"): + _configure(style, f"{orient}.TScrollbar", background=BG_SUNKEN, + troughcolor=BG_APP, bordercolor=BORDER, arrowcolor=TEXT_MUTED, + lightcolor=BG_SUNKEN, darkcolor=BG_SUNKEN) + _map(style, f"{orient}.TScrollbar", + background=[("active", BORDER_STRONG)]) + + return { + "frame": "TFrame", + "panel": "Panel.TFrame", + "sunken": "Sunken.TFrame", + "header": "Header.TFrame", + "warn_band": "Warn.TFrame", + "info_band": "Info.TFrame", + "label": "TLabel", + "panel_label": "Panel.TLabel", + "panel_title": "PanelTitle.TLabel", + "muted": "Muted.TLabel", + "panel_muted": "PanelMuted.TLabel", + "faint": "Faint.TLabel", + "panel_faint": "PanelFaint.TLabel", + "field_label": "FieldLabel.TLabel", + "section": "Section.TLabel", + "figure": "Figure.TLabel", + "ok_label": "Ok.TLabel", + "warn_label": "Warn.TLabel", + "info_label": "InfoText.TLabel", + "danger_label": "Danger.TLabel", + "app_warn": "AppWarn.TLabel", + "panel_ok": "PanelOk.TLabel", + "panel_danger": "PanelDanger.TLabel", + "header_title": "HeaderTitle.TLabel", + "header_meta": "HeaderMeta.TLabel", + "header_target": "HeaderTarget.TLabel", + "header_figure": "HeaderFigure.TLabel", + "badge": "Badge.TLabel", + "badge_info": "Info.Badge.TLabel", + "badge_neutral": "Neutral.Badge.TLabel", + "badge_destructive": "Type.Destructive.Badge.TLabel", + "badge_readonly": "Type.ReadOnly.Badge.TLabel", + "badge_open": "Open.Badge.TLabel", + "badge_closed": "Closed.Badge.TLabel", + "privilege": "Privilege.Badge.TLabel", + "readonly": "ReadOnly.Badge.TLabel", + "status": "Status.TLabel", + "button": "TButton", + "accent_button": "Accent.TButton", + "danger_button": "Danger.TButton", + "big_button": "Big.TButton", + "big_accent_button": "Accent.Big.TButton", + "quiet_button": "Quiet.TButton", + "entry": "TEntry", + "invalid_entry": "Invalid.TEntry", + "panel_check": "Panel.TCheckbutton", + "check": "TCheckbutton", + "dialog": "Dialog.TLabel", + "dialog_title": "DialogTitle.TLabel", + "dialog_muted": "DialogMuted.TLabel", + } + + +def DANGER_ACTIVE_SAFE() -> str: # pragma: no cover - trivial + """The danger colour used for a focused destructive control. + + A named function (rather than a bare literal) so the fifth-hue rule stays + visible: focus on a dangerous action reuses the danger token. + """ + return DANGER + + + +#!/usr/bin/env python3 +"""web panel — static and contract tests (stdlib unittest). + +No port is bound, no browser is opened and no server process is started: the +whole HTTP surface is covered through ``web.panel.route()``, which is a pure +function, and every rendering claim is checked on the rendered bytes. + +What these tests defend (the things that could silently regress): + + * the Turkish status vocabulary still matches docs/DESIGN.md exactly, so the + device console and the central panel cannot drift apart; + * every user-visible string is non-empty, Turkish and free of placeholders; + * no external URL, no webfont, no hex colour and no new colour token anywhere + in the templates or stylesheets: colour comes from tokens.css only; + * the panel imports nothing outside the standard library and can therefore be + installed on the air-gapped fleet it manages; + * only GET/HEAD are served, static assets are allow-listed, and a full sweep + over every endpoint leaves the filesystem untouched; + * the first viewport is ordered and populated as docs/DESIGN.md requires. + +Run: + python3 tests/test_web_static.py -v +""" + +from __future__ import annotations + +import ast +import contextlib +import io +import json +import re +import sys +import tempfile +import unittest +from pathlib import Path +from typing import Any + +REPO_ROOT = Path(__file__).resolve().parents[1] +WEB_DIR = REPO_ROOT / "web" +TEMPLATES_DIR = WEB_DIR / "templates" +STATIC_DIR = WEB_DIR / "static" +TOKENS_CSS = STATIC_DIR / "tokens.css" +DESIGN_DOC = REPO_ROOT / "docs" / "DESIGN.md" + +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +import web # noqa: E402 (path set above) +from web import fleet_data, panel, render, server # noqa: E402 + +# The panel must be the one in this checkout, not some unrelated "web" package. +assert Path(web.__file__).resolve().parent == WEB_DIR, f"yanlis paket: {web.__file__}" + +NOW = "2026-09-16T22:00:00+03:00" +STATE_WORDS = ("KURULDU", "KAYITLI", "HAZIR", "HATA", "YOK") + +# Everything an air-gapped, framework-free surface must never contain. +FORBIDDEN_ASSET_MARKERS = ( + "http://", + "https://", + "//cdn", + "cdn.jsdelivr", + "cdnjs", + "unpkg", + "fonts.googleapis", + "fonts.gstatic", + "@import", + "@font-face", + "src=", + "xlink:href=", +) +FORBIDDEN_IMPORT_ROOTS = ("fastapi", "flask", "jinja2", "uvicorn", "django", "werkzeug", "starlette", "requests") +FORBIDDEN_IMPORTS = ("urllib.request", "http.client", "socket", "subprocess", "shutil", "ftplib") +FORBIDDEN_SOURCE_MARKERS = ("os.system(", "subprocess.", "urllib.request", "requests.", "eval(", "exec(") + +HEX_COLOUR = re.compile(r"#[0-9a-fA-F]{3,8}\b") +CUSTOM_PROPERTY = re.compile(r"^\s*--[A-Za-z0-9-]+\s*:", re.M) +# A custom-property declaration, e.g. `--state-ready: var(--ok);` +CUSTOM_PROPERTY_DECL = re.compile(r"^\s*--([A-Za-z0-9-]+)\s*:\s*([^;]+);", re.M) +# A single `var(--name)` reference inside a value. +VAR_REFERENCE = re.compile(r"var\(\s*--([A-Za-z0-9-]+)\s*\)") +DEFINED_TOKEN = re.compile(r"^\s*(--[a-z0-9-]+)\s*:", re.M) +USED_TOKEN = re.compile(r"var\((--[a-z0-9-]+)\)") +TEXT_TAGS = ("td", "th", "span", "h1", "h2", "h3", "p", "li", "option", "dd", "dt", "button", "a", "caption", "label") +ELEMENT = re.compile(r"<(%s)\b[^>]*>(.*?)" % "|".join(TEXT_TAGS), re.S) +ROW_BADGE = re.compile(r']*>([^<]*)') + + +# -------------------------------------------------------------------------- +# helpers +# -------------------------------------------------------------------------- + + +def token_values(text: str) -> dict[str, str]: + """Every custom-property declaration in a stylesheet, name -> raw value.""" + return { + name: value.strip() + for name, value in CUSTOM_PROPERTY_DECL.findall(text) + } + + +def resolved_colour(name: str, values: dict[str, str], limit: int = 12) -> str | None: + """Follow ``var(--x)`` aliases to the colour a token actually paints. + + Comparing raw declarations is not enough to prove two tokens differ: a + mutation writing ``--state-provisioned: var(--accent)`` leaves the strings + unequal while painting exactly the same blue. Only the resolved value is + evidence. + """ + seen: set[str] = set() + while limit > 0: + value = values.get(name) + if value is None: + return None + reference = VAR_REFERENCE.fullmatch(value) + if reference is None: + return value + name = reference.group(1) + if name in seen: + return value # a cycle: report what was declared rather than loop + seen.add(name) + limit -= 1 + return values.get(name) + + +def design_vocabulary() -> list[tuple[str, str]]: + """Read the status vocabulary table out of docs/DESIGN.md.""" + text = DESIGN_DOC.read_text(encoding="utf-8") + row = re.compile(r"^\|\s*`([^`]+)`\s*\|\s*`(--state-[a-z-]+)`\s*\|", re.M) + return row.findall(text) + + +def text_files() -> list[Path]: + """Templates and stylesheets: everything the browser receives from disk.""" + return sorted(TEMPLATES_DIR.glob("*.html")) + sorted(STATIC_DIR.glob("*.css")) + + +def empty_elements(markup: str) -> list[str]: + """Visible elements that carry no text at all (an empty label is a bug).""" + problems: list[str] = [] + for match in ELEMENT.finditer(markup): + inner = re.sub(r"<[^>]+>", "", match.group(2)) + if not inner.strip(): + problems.append(match.group(0)[:140]) + return problems + + +def tree_fingerprint(root: Path) -> tuple: + """Sizes and mtimes of every source file, ignoring interpreter caches.""" + entries = [] + for path in sorted(root.rglob("*")): + if "__pycache__" in path.parts or not path.is_file(): + continue + stat = path.stat() + entries.append((str(path.relative_to(root)), stat.st_size, stat.st_mtime_ns)) + return tuple(entries) + + +class PanelCase(unittest.TestCase): + """Shared fixture: the labelled demo snapshot and both privilege levels.""" + + @classmethod + def setUpClass(cls) -> None: + cls.snapshot = fleet_data.demo_snapshot(NOW) + cls.read_only = render.privilege_from_level("read-only") + cls.full = render.privilege_from_level("full") + cls.info = render.ServerInfo( + host="127.0.0.1", + port=8787, + privilege=cls.read_only, + python_version="3.13.0", + started_at=NOW, + ) + cls.context = panel.PanelContext( + snapshot=cls.snapshot, privilege=cls.read_only, server_info=cls.info + ) + full_info = render.ServerInfo( + host="127.0.0.1", + port=8787, + privilege=cls.full, + python_version="3.13.0", + started_at=NOW, + ) + cls.full_context = panel.PanelContext( + snapshot=cls.snapshot, privilege=cls.full, server_info=full_info + ) + + # -- request helpers --------------------------------------------------- + def get(self, target: str, method: str = "GET", context: panel.PanelContext | None = None): + return panel.route(context or self.context, method, target) + + def page(self, target: str = "/", method: str = "GET", context: panel.PanelContext | None = None) -> str: + response = self.get(target, method, context) + self.assertEqual(response.status, 200, f"{target}: {response.status} (beklenen 200)") + return response.body.decode("utf-8") + + def list_region(self, page: str) -> str: + """The device table only, so about/detail badges never leak into a scan.""" + start = page.index('data-region="list"') + end = page.index('data-region="detail"') + return page[start:end] + + def row_words(self, page: str) -> list[str]: + return [word for _, word in ROW_BADGE.findall(self.list_region(page))] + + def snapshot_from(self, document: object, *, now: str = NOW, filename: str = "fleet.json"): + """Write a temporary inventory document and load it through the loader.""" + directory = tempfile.TemporaryDirectory(prefix="bf-panel-test-") + self.addCleanup(directory.cleanup) + path = Path(directory.name) / filename + if isinstance(document, str): + path.write_text(document, encoding="utf-8") + else: + path.write_text(json.dumps(document, ensure_ascii=False), encoding="utf-8") + return fleet_data.load_fleet(path, env={}, now=now) + + +# -------------------------------------------------------------------------- +# vocabulary and design contract +# -------------------------------------------------------------------------- + + +class TestVocabularyMatchesDesign(PanelCase): + def test_vocabulary_matches_docs_design_exactly(self) -> None: + """One word per state, shared with the device console; no fifth word.""" + self.assertEqual( + design_vocabulary(), + [(spec.word, spec.token) for spec in fleet_data.STATE_VOCABULARY], + ) + + def test_design_document_still_has_the_five_words(self) -> None: + words = [word for word, _ in design_vocabulary()] + self.assertEqual(words, list(STATE_WORDS)) + + def test_every_word_is_upper_case_turkish_and_non_empty(self) -> None: + for spec in fleet_data.STATE_VOCABULARY: + with self.subTest(state=spec.state): + self.assertTrue(spec.word.strip(), spec.state) + self.assertEqual(spec.word, spec.word.upper()) + self.assertTrue(spec.meaning.strip(), spec.word) + self.assertNotIn("None", spec.meaning) + + def test_tokens_exist_in_tokens_css(self) -> None: + css = TOKENS_CSS.read_text(encoding="utf-8") + for spec in fleet_data.STATE_VOCABULARY: + with self.subTest(state=spec.state): + self.assertIn(f"{spec.token}:", css) + self.assertIn(f"{spec.soft_token}:", css) + + def test_non_ready_states_sort_before_ready(self) -> None: + self.assertEqual(fleet_data.STATE_ORDER[-1], "READY") + self.assertEqual(set(fleet_data.STATE_ORDER), set(fleet_data.STATE_BY_NAME)) + + def test_demo_data_exercises_every_state_word(self) -> None: + counts = self.snapshot.counts + self.assertEqual(list(counts), list(STATE_WORDS)) + for word, count in counts.items(): + with self.subTest(word=word): + self.assertGreaterEqual(count, 1, f"{word} demo veride yok; sözlük test edilemez") + + def test_demo_data_exercises_every_wave(self) -> None: + counts = fleet_data.wave_counts(self.snapshot.devices) + self.assertEqual(list(counts), [wave.code for wave in fleet_data.WAVES]) + for code, count in counts.items(): + with self.subTest(wave=code): + self.assertGreaterEqual(count, 1) + + def test_waves_match_the_rollout_document(self) -> None: + """docs/18: LAB(2) -> P1(5) -> P2(20) -> W1(50) -> W2(100) -> PROD.""" + self.assertEqual( + [(wave.code, wave.target) for wave in fleet_data.WAVES], + [("LAB", 2), ("P1", 5), ("P2", 20), ("W1", 50), ("W2", 100), ("PROD", 523)], + ) + + def test_four_documented_channels(self) -> None: + self.assertEqual( + [channel.label for channel in fleet_data.CHANNELS], + ["SSH-over-WG", "xRDP", "RustDesk", "MeshCentral"], + ) + self.assertEqual( + [channel.key for channel in fleet_data.CHANNELS], + ["ssh_over_wg", "xrdp", "rustdesk", "meshcentral"], + ) + + def test_channel_status_words_are_turkish_and_non_empty(self) -> None: + for status, word in fleet_data.CHANNEL_STATUS_WORDS.items(): + with self.subTest(status=status): + self.assertTrue(word.strip()) + self.assertNotIn("None", word) + self.assertEqual(set(fleet_data.CHANNEL_STATUS_WORDS), set(fleet_data.CHANNEL_STATUSES)) + + +# -------------------------------------------------------------------------- +# no external assets, no invented colour +# -------------------------------------------------------------------------- + + +class TestAssetsAndColour(PanelCase): + def test_no_external_url_or_remote_asset_in_any_template_or_stylesheet(self) -> None: + for path in text_files(): + text = path.read_text(encoding="utf-8").lower() + for marker in FORBIDDEN_ASSET_MARKERS: + with self.subTest(file=path.name, marker=marker): + self.assertNotIn(marker, text) + + def test_no_javascript_ships_with_the_panel(self) -> None: + for path in text_files(): + text = path.read_text(encoding="utf-8").lower() + with self.subTest(file=path.name): + self.assertNotIn(" None: + for path in text_files(): + text = path.read_text(encoding="utf-8") + if path == TOKENS_CSS: + self.assertTrue(HEX_COLOUR.search(text), "tokens.css palet içermiyor") + continue + with self.subTest(file=path.name): + self.assertEqual(HEX_COLOUR.findall(text), [], f"{path.name} hex renk içeriyor") + + def test_templates_and_app_css_declare_no_custom_property(self) -> None: + for path in text_files(): + if path == TOKENS_CSS: + continue + text = path.read_text(encoding="utf-8") + with self.subTest(file=path.name): + self.assertEqual(CUSTOM_PROPERTY.findall(text), [], f"{path.name} belirteç tanımlıyor") + + def test_every_colour_token_used_is_defined_in_tokens_css(self) -> None: + defined = set(DEFINED_TOKEN.findall(TOKENS_CSS.read_text(encoding="utf-8"))) + self.assertTrue(defined) + used: dict[str, str] = {} + for path in text_files(): + if path == TOKENS_CSS: + continue + for token in USED_TOKEN.findall(path.read_text(encoding="utf-8")): + used[token] = path.name + unknown = {token: name for token, name in used.items() if token not in defined} + self.assertEqual(unknown, {}, f"tokens.css'te tanımsız belirteç: {unknown}") + self.assertTrue(used, "hiç belirteç kullanılmıyor") + + def test_the_action_accent_is_not_a_device_state_colour(self) -> None: + """The accent means "the action you came to take" and "the selected row". + + A state that borrows it makes a KURULDU badge and a selected row the same + blue, so the list can no longer say which of the two it is showing. Aliases + are resolved before comparing: a token may chain (``--state-ready`` to + ``--ok``), and ``var(--accent)`` is the accent whatever the string says. + """ + values = token_values(TOKENS_CSS.read_text(encoding="utf-8")) + self.assertIn("accent", values, "tokens.css'te --accent yok") + accent = resolved_colour("accent", values) + states = {n: v for n, v in values.items() if n.startswith("state-")} + self.assertTrue(states, "tokens.css'te cihaz durumu belirteci yok") + for name in states: + with self.subTest(token=name): + resolved = resolved_colour(name, values) + self.assertIsNotNone(resolved, f"--{name} çözümlenemedi") + self.assertNotEqual( + resolved, accent, + f"--{name} ile --accent aynı rengi veriyor ({resolved}); " + "seçili satır ile durum rozeti ayırt edilemez", + ) + + def test_wave_is_rendered_once_and_not_as_the_bare_code_plus_full_label(self) -> None: + """``detail.html`` printed ``$wave_code`` and then ``$wave_label``, and the + label already begins with the code, so one device read "P2 P2 — PILOT-2" + (the list row was the same). A wave cell must name each wave once. + """ + device = next( + d for d in self.snapshot.devices if d.wave_code == "P2" + ) + target = f"/?cihaz={device.device_id}" + body = panel.route(self.context, "GET", target).body.decode("utf-8") + self.assertNotIn("$wave_name", body, "şablon değişkeni değiştirilmedi") + self.assertNotIn("$wave_code", body, "şablon değişkeni değiştirilmedi") + self.assertNotIn(device.wave_code * 2, body, f"dalga kodu iki kez basılıyor: {device.wave_code}") + self.assertIn(device.wave_label, body, "dalga tam etiketi görünmüyor") + + def test_only_local_stylesheets_are_linked(self) -> None: + base = (TEMPLATES_DIR / "base.html").read_text(encoding="utf-8") + linked = re.findall(r']*href="([^"]+)"', base) + self.assertEqual(linked, ["/static/tokens.css", "/static/app.css"]) + + def test_templates_are_utf8_with_turkish_characters(self) -> None: + for path in sorted(TEMPLATES_DIR.glob("*.html")): + text = path.read_text(encoding="utf-8") + with self.subTest(file=path.name): + self.assertTrue(text.strip()) + base = (TEMPLATES_DIR / "base.html").read_text(encoding="utf-8") + self.assertIn('', base) + + def test_state_badge_styles_use_the_shared_tokens(self) -> None: + css = (STATIC_DIR / "app.css").read_text(encoding="utf-8") + for spec in fleet_data.STATE_VOCABULARY: + with self.subTest(state=spec.state): + self.assertIn(f".badge--state-{spec.token_suffix}", css) + self.assertIn("var(--accent-soft)", css) + self.assertIn(".fleet-row--selected", css) + + +# -------------------------------------------------------------------------- +# standard library only: the fleet installs offline +# -------------------------------------------------------------------------- + + +class TestStdlibOnly(PanelCase): + def web_sources(self) -> list[Path]: + return sorted(WEB_DIR.glob("*.py")) + + def test_web_modules_exist(self) -> None: + names = {path.name for path in self.web_sources()} + self.assertEqual( + names, {"__init__.py", "fleet_data.py", "render.py", "panel.py", "server.py"} + ) + + def test_every_import_resolves_to_the_standard_library(self) -> None: + stdlib = set(sys.stdlib_module_names) + for path in self.web_sources(): + tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path)) + for node in ast.walk(tree): + if isinstance(node, ast.Import): + roots = [alias.name.split(".")[0] for alias in node.names] + elif isinstance(node, ast.ImportFrom): + if node.level: + continue + roots = [(node.module or "").split(".")[0]] + else: + continue + for root in roots: + with self.subTest(file=path.name, module=root): + self.assertIn(root, stdlib | {"web"}) + + def test_no_third_party_web_framework_is_referenced(self) -> None: + for path in self.web_sources(): + text = path.read_text(encoding="utf-8").lower() + for marker in FORBIDDEN_IMPORT_ROOTS: + with self.subTest(file=path.name, marker=marker): + self.assertNotIn(f"import {marker}", text) + self.assertNotIn(f"from {marker}", text) + + def test_no_outbound_client_and_no_process_execution(self) -> None: + for path in self.web_sources(): + text = path.read_text(encoding="utf-8") + for marker in FORBIDDEN_IMPORTS: + with self.subTest(file=path.name, marker=marker): + self.assertNotIn(f"import {marker}", text) + lowered = text.lower() + for marker in FORBIDDEN_SOURCE_MARKERS: + with self.subTest(file=path.name, marker=marker): + self.assertNotIn(marker, lowered) + + def test_route_is_a_pure_function_with_a_small_signature(self) -> None: + import inspect + + signature = inspect.signature(panel.route) + self.assertEqual(list(signature.parameters), ["context", "method", "target"]) + + def test_server_module_takes_host_and_port_from_the_command_line(self) -> None: + args = server.parse_args([]) + self.assertEqual(args.host, "127.0.0.1") + self.assertEqual(args.host, web.DEFAULT_HOST) + self.assertEqual(args.port, web.DEFAULT_PORT) + self.assertEqual(args.privilege, "read-only") + self.assertEqual(args.data, None) + + def test_check_mode_reports_without_binding_a_port(self) -> None: + buffer = io.StringIO() + with contextlib.redirect_stdout(buffer): + code = server.main(["--check"]) + self.assertEqual(code, 0) + output = buffer.getvalue() + self.assertIn(web.PANEL_VERSION, output) + self.assertIn("Veri kaynağı", output) + self.assertIn("Yetki", output) + self.assertIn("sunucu başlatılmadı", output) + + def test_version_and_privilege_flags(self) -> None: + with contextlib.redirect_stdout(io.StringIO()): + with self.assertRaises(SystemExit) as raised: + server.parse_args(["--version"]) + self.assertEqual(raised.exception.code, 0) + with contextlib.redirect_stderr(io.StringIO()): + with self.assertRaises(SystemExit): + server.parse_args(["--privilege", "root"]) + + def test_data_flag_selects_the_inventory_file(self) -> None: + snapshot = self.snapshot_from(self.example_document()) + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "fleet.json" + path.write_text(self.example_document(), encoding="utf-8") + context = server.build_context(server.parse_args(["--data", str(path)])) + self.assertTrue(context.snapshot.is_file) + self.assertEqual(context.snapshot.total, snapshot.total) + self.assertEqual(context.server_info.data_path, str(path)) + + def example_document(self) -> str: + return (WEB_DIR / "data" / "fleet.example.json").read_text(encoding="utf-8") + + def test_example_document_matches_the_panel_schema(self) -> None: + """The shipped example must load cleanly, or it teaches the wrong schema.""" + snapshot = self.snapshot_from(self.example_document()) + self.assertTrue(snapshot.is_file, snapshot.error or "örnek belge okunamadı") + self.assertEqual(snapshot.invalid, ()) + self.assertGreaterEqual(snapshot.total, 5) + self.assertGreater(snapshot.ready_count, 0) + + +# -------------------------------------------------------------------------- +# loader: state machines, refusal paths, provenance +# -------------------------------------------------------------------------- + + +class TestLoader(PanelCase): + READY_RECORD: dict[str, Any] = { + "dealer_id": "12010193", + "wave": "P1", + "state": "READY", + "channels": { + "ssh_over_wg": "verified", + "xrdp": "verified", + "rustdesk": "verified", + "meshcentral": "verified", + }, + } + + def document(self, *records: object) -> dict: + return {"schema_version": 1, "generated_at": NOW, "devices": list(records)} + + def test_missing_default_file_falls_back_to_labelled_demo(self) -> None: + snapshot = fleet_data.load_fleet(None, env={}, now=NOW, default_path="/yok/fleet.json") + self.assertTrue(snapshot.is_demo) + self.assertEqual(snapshot.total, len(fleet_data.DEMO_DEVICES)) + self.assertIn("demo", snapshot.source_label.lower()) + self.assertEqual(snapshot.banner_word, "DEMO VERİ") + self.assertIn("sentetik", snapshot.banner_text) + + def test_missing_explicit_file_is_an_error_and_does_not_become_demo(self) -> None: + snapshot = fleet_data.load_fleet("/yok/boyle/bir/dosya.json", env={}, now=NOW) + self.assertTrue(snapshot.is_error) + self.assertEqual(snapshot.total, 0) + self.assertEqual(snapshot.banner_word, "VERİ YOK") + self.assertIn("bulunamadı", snapshot.error or "") + self.assertIn("Demo veriye düşülmedi", snapshot.banner_text) + + def test_environment_variable_selects_the_document(self) -> None: + document = json.dumps(self.document(self.READY_RECORD)) + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "fleet.json" + path.write_text(document, encoding="utf-8") + snapshot = fleet_data.load_fleet(None, env={fleet_data.DATA_PATH_ENV: str(path)}, now=NOW) + self.assertTrue(snapshot.is_file) + self.assertEqual(snapshot.total, 1) + + def test_identity_is_derived_from_the_dealer_number(self) -> None: + snapshot = self.snapshot_from(self.document(self.READY_RECORD)) + device = snapshot.devices[0] + self.assertEqual(device.device_id, "BF-12010193") + self.assertEqual(device.hostname, "bf-12010193") + self.assertEqual(device.dealer_id, "12010193") + self.assertEqual(snapshot.schema_version, 1) + self.assertEqual(snapshot.generated_at, NOW) + + def test_wave_aliases_resolve_to_the_rollout_codes(self) -> None: + for raw, expected in ( + ("pilot_1", "P1"), + ("LAB", "LAB"), + ("wave_2", "W2"), + ("production", "PROD"), + ): + with self.subTest(wave=raw): + record = dict(self.READY_RECORD, wave=raw) + snapshot = self.snapshot_from(self.document(record)) + self.assertEqual(snapshot.devices[0].wave_code, expected) + + def test_turkish_state_words_are_accepted_as_input(self) -> None: + for raw, expected in (("HAZIR", "READY"), ("Hazır", "READY"), ("hazir", "READY")): + with self.subTest(state=raw): + record = dict(self.READY_RECORD, state=raw) + snapshot = self.snapshot_from(self.document(record)) + self.assertEqual(snapshot.devices[0].state, expected) + + def test_broken_json_is_an_error_that_names_the_document(self) -> None: + snapshot = self.snapshot_from('{"schema_version": 1, "devices": [') + self.assertTrue(snapshot.is_error) + self.assertIn("JSON", snapshot.error or "") + + def test_unsupported_schema_version_is_refused(self) -> None: + for version in (2, 99): + with self.subTest(version=version): + document = {"schema_version": version, "devices": []} + snapshot = self.snapshot_from(document) + self.assertTrue(snapshot.is_error) + self.assertIn("şema sürümü", snapshot.error or "") + + def test_missing_schema_version_or_devices_list_is_refused(self) -> None: + for document in ({"devices": []}, {"schema_version": 1}): + with self.subTest(document=document): + snapshot = self.snapshot_from(document) + self.assertTrue(snapshot.is_error) + + def test_bad_dealer_number_is_shown_not_dropped(self) -> None: + record = dict(self.READY_RECORD, dealer_id="1201019") + snapshot = self.snapshot_from(self.document(record)) + self.assertEqual(snapshot.total, 0) + self.assertEqual(len(snapshot.invalid), 1) + reason = snapshot.invalid[0].reason + self.assertIn("8 hane", reason) + self.assertIn("1201019", reason) + + def test_duplicate_dealer_number_is_refused(self) -> None: + snapshot = self.snapshot_from(self.document(self.READY_RECORD, dict(self.READY_RECORD))) + self.assertEqual(snapshot.total, 1) + self.assertEqual(len(snapshot.invalid), 1) + self.assertIn("Yinelenen", snapshot.invalid[0].reason) + + def test_unknown_wave_is_refused_with_a_turkish_reason(self) -> None: + record = dict(self.READY_RECORD, wave="WAVE-9") + snapshot = self.snapshot_from(self.document(record)) + self.assertEqual(snapshot.total, 0) + self.assertIn("Bilinmeyen dalga", snapshot.invalid[0].reason) + + def test_mismatching_device_id_is_refused(self) -> None: + record = dict(self.READY_RECORD, device_id="BF-12010999") + snapshot = self.snapshot_from(self.document(record)) + self.assertEqual(snapshot.total, 0) + self.assertIn("kurala uymuyor", snapshot.invalid[0].reason) + + def test_unknown_state_becomes_hata_with_the_reason(self) -> None: + record = dict(self.READY_RECORD, state="BOZUK") + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "HATA") + self.assertEqual(device.claimed_state, "BOZUK") + self.assertIn("tanınmıyor", device.reason or "") + + def test_missing_state_becomes_hata_and_is_never_invented(self) -> None: + record = {key: value for key, value in self.READY_RECORD.items() if key != "state"} + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "HATA") + self.assertIn("Durum alanı yok", device.reason or "") + + def test_ready_claim_without_verified_channels_is_refused(self) -> None: + """docs/27: READY is refused unless every channel reports verified.""" + record = dict(self.READY_RECORD) + record["channels"] = dict(self.READY_RECORD["channels"], xrdp="pending") + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "HATA") + self.assertEqual(device.claimed_state, "READY") + self.assertIn("HAZIR iddiası reddedildi", device.reason or "") + self.assertIn("xRDP", device.reason or "") + self.assertIn("xRDP", device.unverified_channels) + + def test_ready_claim_with_every_channel_verified_is_ready(self) -> None: + snapshot = self.snapshot_from(self.document(self.READY_RECORD)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "HAZIR") + self.assertEqual(device.verified_channel_count, 4) + self.assertEqual(device.unverified_channels, ()) + self.assertIn("dört kanalın dördü de doğrulandı", device.ready_gate_note) + + def test_failed_channel_marks_the_device_hata(self) -> None: + record = dict(self.READY_RECORD, state="ENROLLED") + record["channels"] = dict(self.READY_RECORD["channels"], rustdesk="failed") + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "HATA") + self.assertIn("başarısız", device.reason or "") + + def test_panel_never_promotes_a_device(self) -> None: + record = dict(self.READY_RECORD, state="ENROLLED") + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(device.state_label, "KAYITLI") + self.assertTrue(any("yükseltmez" in note for note in device.notes), device.notes) + + def test_missing_channels_are_all_reported_as_missing(self) -> None: + record = {"dealer_id": "12010193", "wave": "P1", "state": "PROVISIONED_OFFLINE"} + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertEqual(len(device.channels), 4) + self.assertEqual({check.status for check in device.channels}, {"missing"}) + self.assertEqual({check.status_word for check in device.channels}, {"yok"}) + self.assertTrue(any("Kanallar bildirilmemiş" in note for note in device.notes)) + + def test_unknown_channel_keys_are_reported_not_silently_ignored(self) -> None: + record = dict(self.READY_RECORD) + record["channels"] = dict(self.READY_RECORD["channels"], telnet="verified") + snapshot = self.snapshot_from(self.document(record)) + device = snapshot.devices[0] + self.assertTrue(any("telnet" in note for note in device.notes), device.notes) + self.assertEqual(len(device.channels), 4) + + def test_loader_is_deterministic(self) -> None: + document = self.document(self.READY_RECORD) + first = self.snapshot_from(document) + second = self.snapshot_from(document) + self.assertEqual(first.devices, second.devices) + + +# -------------------------------------------------------------------------- +# ordering and filtering +# -------------------------------------------------------------------------- + + +class TestOrderingAndFiltering(PanelCase): + def sorted_demo(self): + return fleet_data.sort_devices(self.snapshot.devices) + + def test_non_ready_devices_come_first(self) -> None: + flags = [device.is_ready for device in self.sorted_demo()] + self.assertEqual(flags, sorted(flags), "hazır cihaz hazır olmayanın önünde") + self.assertIn(True, flags) + self.assertIn(False, flags) + + def test_failed_devices_are_at_the_top(self) -> None: + ordered = self.sorted_demo() + self.assertEqual(ordered[0].state_label, "HATA") + + def test_sort_keeps_every_device_exactly_once(self) -> None: + ordered = self.sorted_demo() + self.assertEqual(len(ordered), self.snapshot.total) + self.assertEqual( + {device.device_id for device in ordered}, + {device.device_id for device in self.snapshot.devices}, + ) + + def test_query_filter_matches_identity_hostname_and_dealer(self) -> None: + for needle in ("BF-12010193", "bf-12010193", "12010193"): + with self.subTest(needle=needle): + criteria, warnings = fleet_data.parse_filter({"q": [needle]}) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + self.assertEqual(len(shown), 1, needle) + self.assertEqual(shown[0].device_id, "BF-12010193") + self.assertEqual(warnings, ()) + + def test_filter_query_is_case_insensitive(self) -> None: + criteria, _ = fleet_data.parse_filter({"q": ["bf-1201019"]}) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + self.assertEqual( + {device.device_id for device in shown}, + {"BF-12010193", "BF-12010194", "BF-12010195"}, + ) + + def test_state_filter_accepts_word_machine_name_and_folded_input(self) -> None: + for raw in ("HAZIR", "ready", "hazir", "Hazır"): + with self.subTest(raw=raw): + criteria, warnings = fleet_data.parse_filter({"durum": [raw]}) + self.assertEqual(criteria.state, "READY") + self.assertEqual(warnings, ()) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + self.assertTrue(shown) + self.assertEqual({device.state_label for device in shown}, {"HAZIR"}) + + def test_wave_filter_accepts_repo_group_names(self) -> None: + for raw, code in (("pilot_1", "P1"), ("W1", "W1"), ("production", "PROD")): + with self.subTest(raw=raw): + criteria, _ = fleet_data.parse_filter({"dalga": [raw]}) + self.assertEqual(criteria.wave, code) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + self.assertTrue(shown) + self.assertEqual({device.wave_code for device in shown}, {code}) + + def test_unknown_filter_values_are_ignored_with_a_turkish_warning(self) -> None: + criteria, warnings = fleet_data.parse_filter({"durum": ["MOR"], "dalga": ["W9"]}) + self.assertEqual(criteria.state, "") + self.assertEqual(criteria.wave, "") + self.assertEqual(len(warnings), 2) + for warning in warnings: + self.assertIn("yok sayıldı", warning) + page = self.page("/?durum=MOR&dalga=W9") + self.assertIn("yok sayıldı", page) + self.assertIn("Uyarılar", page) + + def test_only_not_ready_filter(self) -> None: + criteria, _ = fleet_data.parse_filter({"hazir_degil": ["1"]}) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + self.assertTrue(shown) + self.assertTrue(all(not device.is_ready for device in shown)) + + def test_counts_are_zero_filled_and_add_up(self) -> None: + counts = fleet_data.state_counts(self.snapshot.devices) + self.assertEqual(list(counts), list(STATE_WORDS)) + self.assertEqual(sum(counts.values()), self.snapshot.total) + self.assertEqual(counts, self.snapshot.counts) + self.assertEqual(self.snapshot.ready_count + self.snapshot.not_ready_count, self.snapshot.total) + + def test_filter_matches_the_rendered_count(self) -> None: + criteria, _ = fleet_data.parse_filter({"durum": ["YOK"]}) + shown = fleet_data.filter_devices(self.snapshot.devices, criteria) + page = self.page("/?durum=YOK") + self.assertEqual(len(self.row_words(page)), len(shown)) + self.assertTrue(all(word == "YOK" for word in self.row_words(page))) + + +# -------------------------------------------------------------------------- +# the first viewport +# -------------------------------------------------------------------------- + + +class TestFleetPage(PanelCase): + def test_served_as_utf8_turkish_html(self) -> None: + response = self.get("/") + self.assertEqual(response.status, 200) + self.assertEqual(response.content_type, "text/html; charset=utf-8") + markup = response.body.decode("utf-8") + self.assertIn('', markup) + # Turkish characters must survive the byte round trip, not just the string. + self.assertIn("doğrulandı".encode("utf-8"), response.body) + self.assertEqual(response.content_length, len(response.body)) + + def test_first_viewport_regions_are_ordered(self) -> None: + page = self.page("/") + positions = [ + page.index('data-region="header"'), + page.index('data-region="summary"'), + page.index('data-region="list"'), + page.index('data-region="detail"'), + ] + self.assertEqual(positions, sorted(positions), "bölge sırası DESIGN.md'ye uymuyor") + + def test_header_carries_product_target_and_privilege(self) -> None: + page = self.page("/") + header = page[: page.index('data-region="summary"')] + self.assertIn(web.PANEL_NAME, header) + self.assertIn(web.PANEL_SURFACE, header) + self.assertIn("Hedef", header) + self.assertIn(f"Tüm filo · {self.snapshot.total} cihaz", header) + self.assertIn("Yetki", header) + self.assertIn("Salt-okunur", header) + self.assertIn(self.read_only.reason, header) + + def test_privilege_level_is_the_right_most_header_readout(self) -> None: + """docs/DESIGN.md: 'privilege level on the right -- never a buried sentence'.""" + page = self.page("/") + header = page[: page.index('data-region="summary"')] + privilege = header.index("app-header__privilege") + self.assertGreater(privilege, header.index("app-header__identity")) + self.assertGreater(privilege, header.index("app-header__target")) + self.assertGreater(privilege, header.index("app-header__actions")) + + def test_primary_action_sits_in_the_header_not_below_the_fold(self) -> None: + page = self.page("/") + self.assertLess( + page.index("Filo durumunu yenile"), + page.index('data-region="summary"'), + "birincil eylem başlık bandında değil", + ) + self.assertIn('class="button button--primary"', page) + + def test_unprivileged_write_action_is_disabled_with_the_reason_on_the_control(self) -> None: + page = self.page("/") + self.assertIn('disabled aria-disabled="true" aria-describedby="gated-reason"', page) + self.assertIn('id="gated-reason"', page) + self.assertIn(self.read_only.reason, page) + + def test_every_state_word_appears_in_the_summary_strip(self) -> None: + page = self.page("/") + summary = page[page.index('data-region="summary"') : page.index('data-region="list"')] + for word in STATE_WORDS: + with self.subTest(word=word): + self.assertIn(word, summary) + + def test_summary_strip_has_exactly_one_large_figure(self) -> None: + page = self.page("/") + self.assertEqual(page.count("summary__lead-figure"), 1) + self.assertEqual( + page.count("summary__cell-value"), len(fleet_data.STATE_VOCABULARY) + ) + counts = self.snapshot.counts + summary = page[page.index('data-region="summary"') : page.index('data-region="list"')] + self.assertIn(f'>{counts["HAZIR"]}<', summary) + + def test_every_row_carries_a_state_word_in_monospace_columns(self) -> None: + page = self.page("/") + self.assertEqual(len(self.row_words(page)), self.snapshot.total) + for device in self.snapshot.devices: + with self.subTest(device=device.device_id): + self.assertIn( + f'' + f"{device.device_id}", + page, + ) + self.assertIn(f'class="badge badge--state-{device.state_token_suffix}"', page) + self.assertIn(f'{device.hostname}', page) + + def test_wave_column_names_the_wave_once_in_monospace(self) -> None: + """The Dalga column is a data cell, and it names each wave exactly once.""" + region = self.list_region(self.page("/")) + rows = re.findall(r'(BF-[0-9]{8})", row) + if match is None: + self.fail(f"satırda cihaz kimliği yok: {row[:120]}") + device = by_id[match.group(1)] + cells = re.findall(r"]*>(.*?)", row, flags=re.S) + self.assertEqual(len(cells), 5, row[:200]) + self.assertEqual( + cells[3], f'{device.wave.label}', row[:200] + ) + + def test_rows_are_sorted_non_ready_first(self) -> None: + words = self.row_words(self.page("/")) + ready_flags = [ + fleet_data.STATE_BY_WORD[word].state == "READY" for word in words + ] + self.assertEqual(ready_flags, sorted(ready_flags)) + self.assertEqual(ready_flags[0], False) + self.assertEqual(ready_flags[-1], True) + + def test_selected_row_uses_the_accent_soft_fill(self) -> None: + page = self.page("/") + self.assertEqual(page.count("fleet-row--selected"), 1) + selected_row = page[page.index("fleet-row--selected") :] + selected_row = selected_row[: selected_row.index("")] + detail = page[page.index('data-region="detail"') :] + device_id = re.search(r">(BF-[0-9]{8})", selected_row).group(1) + self.assertIn(device_id, detail) + css = (STATIC_DIR / "app.css").read_text(encoding="utf-8") + self.assertIn(".fleet-row--selected td { background: var(--accent-soft); }", css) + + def test_default_selection_is_the_first_row_of_the_list(self) -> None: + page = self.page("/") + first_row = self.list_region(page) + first_row = first_row[first_row.index("") :] + device_id = re.search(r">(BF-[0-9]{8})", first_row).group(1) + detail = page[page.index('data-region="detail"') :] + self.assertIn(device_id, detail) + self.assertIn("Hedef kimliği", detail) + + def test_detail_region_shows_state_identity_wave_and_channels(self) -> None: + page = self.page("/?cihaz=BF-12010193") + detail = page[page.index('data-region="detail"') :] + device = next(d for d in self.snapshot.devices if d.device_id == "BF-12010193") + self.assertIn(device.state_label, detail) + self.assertIn(device.device_id, detail) + self.assertIn(device.hostname, detail) + self.assertIn(device.wave_code, detail) + self.assertIn("Kanal doğrulaması", detail) + for channel in fleet_data.CHANNELS: + with self.subTest(channel=channel.label): + self.assertIn(channel.label, detail) + self.assertIn("Doğrulanan kanal: 4/4", detail) + self.assertIn("doğrulandı", detail) + + def test_channel_status_words_are_shown_in_turkish(self) -> None: + """Every channel status word reaches the screen, not only a colour.""" + cases = { + "BF-12010193": ("doğrulandı",), # all four verified + "BF-12010194": ("bekliyor",), # RustDesk pending + "BF-12010205": ("başarısız", "bilinmiyor"), # failed + unknown + "BF-12010195": ("yok",), # never checked + } + for device_id, words in cases.items(): + with self.subTest(device=device_id): + page = self.page(f"/?cihaz={device_id}") + detail = page[page.index('data-region="detail"') :] + for word in words: + self.assertIn(f">{word}", detail) + + def test_ready_device_detail_confirms_the_gate(self) -> None: + page = self.page("/?cihaz=BF-12010193") + self.assertIn("dört kanalın dördü de doğrulandı", page) + self.assertNotIn("HAZIR için eksik kanallar", page) + + def test_not_ready_device_detail_names_the_blocking_channels(self) -> None: + page = self.page("/?cihaz=BF-12010194") + self.assertIn("HAZIR için eksik kanallar: RustDesk", page) + self.assertIn("Doğrulanan kanal: 3/4", page) + + def test_hostname_selects_the_same_device_as_device_id(self) -> None: + by_id = self.page("/?cihaz=BF-12010193") + by_host = self.page("/?cihaz=bf-12010193") + self.assertEqual(self.row_words(by_id), self.row_words(by_host)) + self.assertIn("BF-12010193", by_host[by_host.index('data-region="detail"') :]) + + def test_unknown_device_id_is_reported_and_not_invented(self) -> None: + page = self.page("/?cihaz=BF-99999999") + detail = page[page.index('data-region="detail"') :] + self.assertIn("BF-99999999", detail) + self.assertIn("envanterde yok", detail.lower()) + self.assertIn("uydurmaz", detail) + + def test_filter_is_reflected_in_the_list_and_the_header(self) -> None: + page = self.page("/?durum=HAZIR") + self.assertEqual(set(self.row_words(page)), {"HAZIR"}) + self.assertIn("Durum HAZIR", page) + self.assertIn(f"Gösterilen: {self.snapshot.ready_count}", page) + + def test_selection_outside_the_filter_is_flagged_not_hidden(self) -> None: + page = self.page("/?durum=HAZIR&cihaz=BF-12010205") + detail = page[page.index('data-region="detail"') :] + self.assertIn("BF-12010205", detail) + self.assertIn("geçerli filtreye uymuyor", detail) + + def test_empty_result_gets_a_turkish_note_and_keeps_the_header(self) -> None: + page = self.page("/?durum=YOK&dalga=PROD") + self.assertEqual(self.row_words(page), []) + self.assertIn("Bu filtreye uyan cihaz yok", page) + self.assertIn("Filtreyi temizle", page) + self.assertIn('data-region="header"', page) + + def test_wave_strip_shows_every_wave_against_its_target(self) -> None: + page = self.page("/") + counts = fleet_data.wave_counts(self.snapshot.devices) + for wave in fleet_data.WAVES: + with self.subTest(wave=wave.code): + self.assertIn( + f'{wave.code} {counts[wave.code]}/{wave.target}', + page, + ) + + def test_demo_data_is_labelled_on_the_page(self) -> None: + page = self.page("/") + self.assertIn("DEMO VERİ", page) + self.assertIn("sentetik", page) + self.assertIn("hiçbir cihazı temsil etmez", page) + self.assertIn("Veri kaynağı: sentetik demo veri", page) + + def test_inventory_file_source_is_labelled_on_the_page(self) -> None: + document = { + "schema_version": 1, + "generated_at": NOW, + "devices": [ + { + "dealer_id": "12010193", + "wave": "P1", + "state": "ENROLLED", + "channels": {"ssh_over_wg": "verified"}, + } + ], + } + snapshot = self.snapshot_from(document) + context = panel.PanelContext( + snapshot=snapshot, privilege=self.read_only, server_info=self.info + ) + page = self.page("/", context=context) + self.assertIn("ENVANTER", page) + self.assertIn(snapshot.source_path, page) + self.assertNotIn("DEMO VERİ", page) + + def test_error_source_says_veri_yok_and_never_shows_demo_data(self) -> None: + snapshot = fleet_data.load_fleet("/yok/boyle/bir/dosya.json", env={}, now=NOW) + context = panel.PanelContext( + snapshot=snapshot, privilege=self.read_only, server_info=self.info + ) + page = self.page("/", context=context) + self.assertIn("VERİ YOK", page) + self.assertIn("Demo veriye düşülmedi", page) + self.assertNotIn("DEMO VERİ", page) + self.assertEqual(self.row_words(page), []) + self.assertIn("Envanterde gösterilecek cihaz yok", page) + + def test_invalid_records_are_surfaced_with_their_reason(self) -> None: + document = { + "schema_version": 1, + "devices": [{"dealer_id": "1201019", "wave": "P1", "state": "READY"}], + } + snapshot = self.snapshot_from(document) + context = panel.PanelContext( + snapshot=snapshot, privilege=self.read_only, server_info=self.info + ) + page = self.page("/", context=context) + self.assertIn("Geçersiz kayıtlar", page) + self.assertIn("8 hane", page) + + def test_every_visible_string_is_non_empty(self) -> None: + for target in ("/", "/?durum=HAZIR", "/?cihaz=BF-99999999", "/hakkinda"): + with self.subTest(target=target): + self.assertEqual(empty_elements(self.page(target)), []) + + def test_error_pages_keep_the_frame_and_stay_readable(self) -> None: + for target, status in (("/yok", 404),): + with self.subTest(target=target): + response = self.get(target) + self.assertEqual(response.status, status) + markup = response.body.decode("utf-8") + self.assertEqual(empty_elements(markup), []) + self.assertIn('data-region="header"', markup) + + def test_no_placeholder_or_python_none_leaks_into_the_page(self) -> None: + for target in ("/", "/hakkinda", "/?cihaz=BF-12010193", "/?durum=MOR"): + with self.subTest(target=target): + page = self.page(target) + self.assertNotIn("$", page) + self.assertNotIn("None", page) + self.assertNotIn("KeyError", page) + + def test_page_renders_without_a_live_server_context(self) -> None: + """render_fleet_page is usable on its own (tests, --check, future CLI).""" + page = render.render_fleet_page(self.snapshot) + self.assertIn(' None: + page = self.page("/hakkinda") + self.assertIn(web.PANEL_VERSION, page) + self.assertIn(render.PANEL_VERSION, page) + self.assertIn("Panel sürümü", page) + self.assertIn("127.0.0.1:8787", page) + self.assertIn("Salt-okunur", page) + self.assertIn(self.read_only.reason, page) + self.assertIn(self.info.python_version, page) + + def test_reports_the_data_source_and_its_limits(self) -> None: + page = self.page("/hakkinda") + self.assertIn("Veri kaynağı", page) + self.assertIn("sentetik demo veri", page) + self.assertIn("kullanılmadı (demo veri)", page) + self.assertIn(f"{self.snapshot.ready_count} hazır", page) + self.assertIn("Okuma hatası", page) + self.assertIn("yok", page) + + def test_lists_the_vocabulary_with_tokens_and_meanings(self) -> None: + page = self.page("/hakkinda") + for spec in fleet_data.STATE_VOCABULARY: + with self.subTest(state=spec.state): + self.assertIn(spec.word, page) + self.assertIn(spec.token, page) + self.assertIn(spec.meaning, page) + + def test_lists_every_wave_and_channel(self) -> None: + page = self.page("/hakkinda") + for wave in fleet_data.WAVES: + with self.subTest(wave=wave.code): + self.assertIn(wave.code, page) + for channel in fleet_data.CHANNELS: + with self.subTest(channel=channel.key): + self.assertIn(channel.key, page) + self.assertIn(channel.label, page) + + def test_states_the_panel_rules(self) -> None: + page = self.page("/hakkinda") + self.assertGreaterEqual(len(render.PANEL_RULES), 5) + for rule in render.PANEL_RULES: + with self.subTest(rule=rule[:30]): + self.assertTrue(rule.strip()) + self.assertIn(rule[:24], page) + self.assertIn("Panel kuralları", page) + + def test_full_privilege_level_is_distinct_and_honest(self) -> None: + page = self.page("/", context=self.full_context) + self.assertIn("badge--privilege-full", page) + self.assertIn("Tam yetki", page) + self.assertIn("yazma uç noktası uygulanmadı", page) + self.assertNotIn("badge--privilege-read-only", page) + + def test_about_page_has_no_external_url(self) -> None: + page = self.page("/hakkinda") + self.assertNotIn("http://", page) + self.assertNotIn("https://", page) + + +# -------------------------------------------------------------------------- +# routing and the privilege gate +# -------------------------------------------------------------------------- + + +class TestRoutingAndGate(PanelCase): + def test_only_read_methods_are_served(self) -> None: + for method in ("POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE"): + with self.subTest(method=method): + response = self.get("/", method) + self.assertEqual(response.status, 405) + markup = response.body.decode("utf-8") + self.assertIn("Yöntem reddedildi", markup) + self.assertIn(method, markup) + self.assertIn("yalnız okuma yapar", markup) + headers = dict(response.headers) + self.assertEqual(headers.get("Allow"), "GET, HEAD") + + def test_write_methods_are_refused_even_with_full_privilege(self) -> None: + response = self.get("/", "POST", self.full_context) + self.assertEqual(response.status, 405) + + def test_head_returns_the_same_length_without_a_body(self) -> None: + head = self.get("/", "HEAD") + get = self.get("/", "GET") + self.assertEqual(head.status, 200) + self.assertEqual(head.body, b"") + self.assertEqual(head.content_length, get.content_length) + self.assertEqual(head.content_type, get.content_type) + + def test_static_assets_are_served_from_disk_byte_for_byte(self) -> None: + for name in ("tokens.css", "app.css"): + with self.subTest(name=name): + response = self.get(f"/static/{name}") + self.assertEqual(response.status, 200) + self.assertEqual(response.content_type, "text/css; charset=utf-8") + self.assertEqual(response.body, (STATIC_DIR / name).read_bytes()) + + def test_unknown_static_asset_is_a_404(self) -> None: + response = self.get("/static/gizli.txt") + self.assertEqual(response.status, 404) + self.assertIn("Sayfa yok", response.body.decode("utf-8")) + + def test_path_traversal_is_refused(self) -> None: + for target in ( + "/static/../server.py", + "/static/..%2fserver.py", + "/static/%2e%2e/fleet_data.py", + "/../web/server.py", + "/static/.%2e/%2e%2e/etc/passwd", + ): + with self.subTest(target=target): + response = self.get(target) + self.assertEqual(response.status, 404) + body = response.body.decode("utf-8") + self.assertNotIn("BaseHTTPRequestHandler", body) + self.assertNotIn("route(context", body) + + def test_unknown_path_is_a_turkish_404(self) -> None: + response = self.get("/boyle-bir-sayfa-yok") + self.assertEqual(response.status, 404) + markup = response.body.decode("utf-8") + self.assertIn("Sayfa yok", markup) + self.assertIn("/boyle-bir-sayfa-yok", markup) + + def test_security_headers_keep_the_panel_local_and_script_free(self) -> None: + headers = dict(self.get("/").headers) + self.assertEqual(headers["X-Content-Type-Options"], "nosniff") + self.assertEqual(headers["Referrer-Policy"], "no-referrer") + csp = headers["Content-Security-Policy"] + self.assertIn("default-src 'self'", csp) + self.assertIn("script-src 'none'", csp) + self.assertIn("form-action 'self'", csp) + self.assertNotIn("http", csp) + self.assertEqual(headers["Cache-Control"], "no-store") + + def test_route_is_pure_and_repeatable(self) -> None: + targets = ("/", "/hakkinda", "/static/app.css", "/?durum=HAZIR&q=1201", "/yok", "/static/../x") + for target in targets: + with self.subTest(target=target): + first = self.get(target) + second = self.get(target) + self.assertEqual(first, second) + + def test_bogus_query_values_do_not_crash_the_page(self) -> None: + for target in ( + "/?q=&durum=&dalga=&cihaz=&hazir_degil=abc", + "/?durum=READY&durum=YOK", + "/?q=%C4%B0stanbul%20%2F%20test", + "/?cihaz=" + "x" * 500, + ): + with self.subTest(target=target[:40]): + response = self.get(target) + self.assertEqual(response.status, 200) + self.assertEqual(empty_elements(response.body.decode("utf-8")), []) + + def test_a_full_sweep_of_every_endpoint_writes_nothing(self) -> None: + """Read-only is a property of the surface, not a promise in a docstring.""" + before = tree_fingerprint(WEB_DIR) + requests = ( + ("GET", "/"), + ("GET", "/filo"), + ("GET", "/fleet"), + ("GET", "/hakkinda"), + ("GET", "/hakkinda/"), + ("GET", "/about"), + ("GET", "/static/tokens.css"), + ("GET", "/static/app.css"), + ("GET", "/?q=1201&durum=HAZIR&dalga=P1&hazir_degil=1&cihaz=BF-12010193"), + ("GET", "/yok"), + ("POST", "/"), + ("PUT", "/hakkinda"), + ("DELETE", "/static/app.css"), + ("HEAD", "/"), + ) + for method, target in requests: + with self.subTest(method=method, target=target): + response = self.get(target, method) + self.assertIn(response.status, (200, 404, 405)) + self.assertEqual(tree_fingerprint(WEB_DIR), before) + + +if __name__ == "__main__": + unittest.main(verbosity=2) + + + +{ + "_aciklama": "Filo envanteri örneği. Bu dosya bir şablondur; panel varsayılan olarak web/data/fleet.json okur. Alanlar docs/02 (kimlik) ve docs/27 (durum makinesi) sözleşmesine uyar. Örnek cihazlar sentetiktir.", + "schema_version": 1, + "generated_at": "2026-09-16T09:30:00+03:00", + "source": "merkezi envanter (örnek)", + "devices": [ + { + "dealer_id": "12010193", + "wave": "P1", + "state": "READY", + "last_seen": "2026-09-16T09:05:00+03:00", + "note": "Pilot cihaz; dört kanal da doğrulandı.", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-14T10:00:00+03:00"}, + "xrdp": {"status": "verified", "checked_at": "2026-09-14T10:02:00+03:00"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-14T10:04:00+03:00"}, + "meshcentral": {"status": "verified", "checked_at": "2026-09-14T10:06:00+03:00"} + } + }, + { + "dealer_id": "12010194", + "wave": "pilot_1", + "state": "ENROLLED", + "last_seen": "2026-09-16T09:04:00+03:00", + "channels": { + "ssh_over_wg": "verified", + "xrdp": "verified", + "rustdesk": "pending", + "meshcentral": "verified" + } + }, + { + "dealer_id": "12010195", + "wave": "P1", + "state": "PROVISIONED_OFFLINE", + "last_seen": "2026-09-13T16:20:00+03:00", + "channels": {} + }, + { + "dealer_id": "12010205", + "wave": "P2", + "state": "ENROLLED", + "last_seen": "2026-09-16T06:20:00+03:00", + "channels": { + "ssh_over_wg": "verified", + "xrdp": "failed", + "rustdesk": "verified", + "meshcentral": "pending" + } + }, + { + "dealer_id": "12010208", + "wave": "wave_1", + "state": "ABSENT", + "last_seen": null, + "channels": {} + }, + { + "dealer_id": "12010210", + "wave": "PROD", + "state": "PROVISIONED_OFFLINE", + "last_seen": "2026-09-09T09:00:00+03:00", + "channels": {} + } + ] +} + + + +/* + * Blueforce Field OS — central panel stylesheet. + * --------------------------------------------------------------------------- + * Colour and metrics come from web/static/tokens.css and from nowhere else. + * This file declares no custom property and no literal colour: one palette + * change in tokens.css moves both operator surfaces. A colour here is a state + * or the action accent, never decoration (docs/DESIGN.md, Rules 1 and 2). + * + * Layout follows docs/DESIGN.md FIRST VIEWPORT: dark header band, one large + * figure in the summary strip, then the fleet list beside the selected device's + * detail region. + */ + +*, *::before, *::after { box-sizing: border-box; } + +html { background: var(--bg-app); } + +body { + margin: 0; + background: var(--bg-app); + color: var(--text); + font-family: var(--font-ui); + font-size: var(--size-md); + line-height: var(--leading-normal); +} + +a { color: var(--accent); } +a:hover { color: var(--accent-hover); } + +.mono { font-family: var(--font-data); font-variant-numeric: tabular-nums; } + +:focus-visible { + outline: 2px solid var(--focus-ring); + outline-offset: 2px; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} + +.skip-link { + position: absolute; + left: var(--sp-2); + top: calc(-1 * var(--sp-7)); + z-index: 2; + padding: var(--sp-2) var(--sp-3); + background: var(--bg-panel); + color: var(--accent); + border: 1px solid var(--border-strong); + border-radius: var(--radius); + transition: top .1s linear; +} + +.skip-link:focus { top: var(--sp-2); } + +/* -- Header band: the one dark region ---------------------------------- */ + +.app-header { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--sp-2) var(--sp-5); + min-height: var(--header-h); + padding: var(--sp-2) var(--sp-4); + background: var(--bg-header); + color: var(--text-on-dark); +} + +.app-header__identity { + display: flex; + flex-direction: column; +} + +.app-header__product { + margin: 0; + font-size: var(--size-lg); + font-weight: 600; + line-height: var(--leading-tight); + letter-spacing: .01em; +} + +.app-header__surface { + font-size: var(--size-xs); + color: var(--text-on-dark); + opacity: .75; +} + +.app-header__target, +.app-header__privilege { + display: flex; + flex-direction: column; + gap: var(--sp-1); + margin: 0; + font-size: var(--size-sm); +} + +.app-header__label { + font-size: var(--size-xs); + letter-spacing: .06em; + text-transform: uppercase; + color: var(--text-on-dark); + opacity: .7; +} + +.app-header__value { color: var(--text-on-dark); } + +.app-header__reason { + max-width: 34ch; + font-size: var(--size-xs); + color: var(--text-on-dark); + opacity: .8; +} + +.app-header__actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--sp-2); +} + +.app-header__privilege { + max-width: 40ch; + text-align: right; +} + +.gated-reason { + max-width: 30ch; + font-size: var(--size-xs); + color: var(--text-on-dark); + opacity: .8; +} + +.app-header__nav { + display: flex; + gap: var(--sp-3); + margin-right: auto; +} + +.nav-link { + color: var(--text-on-dark); + font-size: var(--size-sm); + text-decoration: none; + padding-bottom: var(--sp-1); + border-bottom: 2px solid transparent; +} + +.nav-link[aria-current="page"] { border-bottom-color: var(--text-on-dark); } + +/* -- Buttons and inputs: one height ------------------------------------ */ + +.button { + display: inline-flex; + align-items: center; + justify-content: center; + height: var(--control-h); + padding: 0 var(--sp-3); + font-family: inherit; + font-size: var(--size-sm); + font-weight: 600; + text-decoration: none; + color: var(--text); + background: var(--bg-panel); + border: 1px solid var(--border-strong); + border-radius: var(--radius); + cursor: pointer; +} + +.button--primary { + color: var(--text-on-accent); + background: var(--accent); + border-color: var(--accent); +} + +.button--primary:hover { + color: var(--text-on-accent); + background: var(--accent-hover); +} + +.button--gated:disabled { + color: var(--text-faint); + background: var(--bg-sunken); + border-color: var(--border); + cursor: not-allowed; +} + +input[type="search"], +select { + height: var(--control-h); + padding: 0 var(--sp-2); + font-family: inherit; + font-size: var(--size-sm); + color: var(--text); + background: var(--bg-panel); + border: 1px solid var(--border-strong); + border-radius: var(--radius); +} + +/* -- Page frame -------------------------------------------------------- */ + +.app-main { + display: flex; + flex-direction: column; + gap: var(--sp-4); + padding: var(--sp-4); + max-width: 1600px; + margin: 0 auto; +} + +.app-footer { + display: flex; + flex-wrap: wrap; + gap: var(--sp-4); + padding: var(--sp-3) var(--sp-4); + font-size: var(--size-xs); + color: var(--text-muted); + border-top: 1px solid var(--border); +} + +.section-title { + margin: 0 0 var(--sp-2); + font-size: var(--size-xl); + line-height: var(--leading-tight); +} + +.subsection-title { + margin: 0 0 var(--sp-2); + font-size: var(--size-lg); + line-height: var(--leading-tight); +} + +.section-note { + margin: 0 0 var(--sp-2); + font-size: var(--size-sm); + color: var(--text-muted); +} + +.cell-note { + font-size: var(--size-xs); + color: var(--text-muted); +} + +/* -- Data-source banner: what the operator is looking at --------------- */ + +.data-banner { + display: flex; + align-items: baseline; + gap: var(--sp-3); + padding: var(--sp-2) var(--sp-3); + font-size: var(--size-sm); + border: 1px solid var(--border-strong); + border-radius: var(--radius); +} + +.data-banner--info { background: var(--info-soft); border-color: var(--info); } +.data-banner--warn { background: var(--warn-soft); border-color: var(--warn); } +.data-banner--danger { background: var(--danger-soft); border-color: var(--danger); } + +.data-banner__word { + font-size: var(--size-xs); + font-weight: 700; + letter-spacing: .06em; +} + +/* -- Summary strip: the one loud figure -------------------------------- */ + +.summary { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--sp-4) var(--sp-6); + padding: var(--sp-4); + background: var(--bg-panel); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); +} + +.summary__lead { + display: grid; + gap: var(--sp-1); + padding-right: var(--sp-5); + border-right: 1px solid var(--border); +} + +.summary__lead-figure { + font-size: var(--size-2xl); + font-weight: 700; + line-height: var(--leading-tight); + color: var(--state-ready); +} + +.summary__lead-label { font-size: var(--size-sm); font-weight: 600; } + +.summary__lead-note { font-size: var(--size-xs); color: var(--text-muted); } + +.summary__grid { + display: flex; + flex-wrap: wrap; + gap: var(--sp-5); + margin: 0; + padding: 0; + list-style: none; +} + +.summary__cell { display: grid; gap: var(--sp-1); } + +.summary__cell-value { + font-size: var(--size-lg); + font-weight: 600; + line-height: var(--leading-tight); +} + +.summary__cell-word { + font-size: var(--size-xs); + font-weight: 700; + letter-spacing: .04em; +} + +.summary__cell-note { font-size: var(--size-xs); color: var(--text-muted); } + +/* -- Two-column body: list beside detail ------------------------------- */ + +.split { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(320px, 400px); + gap: var(--sp-4); + align-items: start; +} + +@media (max-width: 1100px) { + .split { grid-template-columns: minmax(0, 1fr); } +} + +.split__list, +.split__detail { + padding: var(--sp-4); + background: var(--bg-panel); + border: 1px solid var(--border); + border-radius: var(--radius-lg); +} + +/* -- Filter bar -------------------------------------------------------- */ + +.filter-bar { + display: grid; + gap: var(--sp-2); + margin-bottom: var(--sp-3); + padding: var(--sp-3); + background: var(--bg-sunken); + border-radius: var(--radius); +} + +.filter-bar__form { + display: flex; + flex-wrap: wrap; + align-items: end; + gap: var(--sp-3); + margin: 0; +} + +.filter-field { + display: grid; + gap: var(--sp-1); + margin: 0; + font-size: var(--size-xs); + color: var(--text-muted); +} + +.filter-field--check { + grid-auto-flow: column; + align-items: center; + gap: var(--sp-2); + height: var(--control-h); +} + +.filter-field--actions { + grid-auto-flow: column; + align-items: center; + gap: var(--sp-2); + font-size: var(--size-sm); +} + +.filter-bar__summary { + margin: 0; + font-size: var(--size-xs); + color: var(--text-muted); +} + +.wave-strip { + margin: 0 0 var(--sp-3); + font-size: var(--size-xs); + color: var(--text-muted); +} + +.wave-strip__item { white-space: nowrap; } + +/* -- Fleet table ------------------------------------------------------- */ + +.fleet-table { + width: 100%; + border-collapse: collapse; + font-size: var(--size-sm); +} + +.fleet-table th { + padding: var(--sp-2); + text-align: left; + font-size: var(--size-xs); + font-weight: 600; + letter-spacing: .04em; + text-transform: uppercase; + color: var(--text-muted); + border-bottom: 1px solid var(--border-strong); +} + +.fleet-table td { + height: var(--row-h); + padding: var(--sp-2); + border-bottom: 1px solid var(--border); + vertical-align: middle; +} + +.fleet-row:hover td { background: var(--bg-sunken); } + +.fleet-row--selected td { background: var(--accent-soft); } + +.row-select { text-decoration: none; } +.row-select:hover { text-decoration: underline; } + +/* -- Badges: a word plus a state colour -------------------------------- */ + +.badge { + display: inline-flex; + align-items: center; + padding: var(--sp-1) var(--sp-2); + font-family: var(--font-data); + font-size: var(--size-xs); + font-weight: 700; + letter-spacing: .04em; + border: 1px solid; + border-radius: var(--radius); +} + +.badge--state-provisioned { + color: var(--state-provisioned); + background: var(--info-soft); + border-color: var(--state-provisioned); +} + +.badge--state-enrolled { + color: var(--state-enrolled); + background: var(--warn-soft); + border-color: var(--state-enrolled); +} + +.badge--state-ready { + color: var(--state-ready); + background: var(--ok-soft); + border-color: var(--state-ready); +} + +.badge--state-failed { + color: var(--state-failed); + background: var(--danger-soft); + border-color: var(--state-failed); +} + +.badge--state-absent { + color: var(--state-absent); + background: var(--idle-soft); + border-color: var(--state-absent); +} + +.badge--privilege-read-only { + color: var(--text-on-dark); + background: transparent; + border-color: var(--text-on-dark); +} + +.badge--privilege-full { + color: var(--warn); + background: var(--warn-soft); + border-color: var(--warn); +} + +/* -- Detail region ----------------------------------------------------- */ + +.detail__state { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--sp-2); + margin: 0 0 var(--sp-3); +} + +.detail__meaning { font-size: var(--size-sm); color: var(--text-muted); } + +.selection-note, +.reason { + margin: 0 0 var(--sp-3); + padding: var(--sp-2) var(--sp-3); + font-size: var(--size-sm); + border: 1px solid; + border-radius: var(--radius); +} + +.selection-note { + background: var(--idle-soft); + border-color: var(--state-absent); +} + +.reason { + background: var(--danger-soft); + border-color: var(--state-failed); + color: var(--text); +} + +.facts { + display: grid; + grid-template-columns: max-content minmax(0, 1fr); + gap: var(--sp-2) var(--sp-3); + margin: 0 0 var(--sp-4); + font-size: var(--size-sm); +} + +.facts dt { + font-size: var(--size-xs); + letter-spacing: .04em; + text-transform: uppercase; + color: var(--text-muted); + align-self: center; +} + +.facts dd { margin: 0; } + +.channels { + display: grid; + gap: var(--sp-2); + margin: 0 0 var(--sp-2); + padding: 0; + list-style: none; +} + +.channel { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: var(--sp-1) var(--sp-2); + padding: var(--sp-2); + background: var(--bg-sunken); + border-radius: var(--radius); +} + +.channel__name { font-weight: 600; font-size: var(--size-sm); } + +.channel__status { + justify-self: end; + font-size: var(--size-xs); + font-weight: 700; +} + +.channel__status--ok { color: var(--ok); } +.channel__status--warn { color: var(--warn); } +.channel__status--danger { color: var(--danger); } +.channel__status--idle { color: var(--idle); } + +.channel__meta { font-size: var(--size-xs); color: var(--text-faint); } + +.channel__hint { font-size: var(--size-xs); color: var(--text-muted); } + +.notes__list { + display: grid; + gap: var(--sp-1); + margin: 0 0 var(--sp-3); + padding-left: var(--sp-4); + font-size: var(--size-xs); + color: var(--text-muted); +} + +/* -- Warnings and invalid records -------------------------------------- */ + +.warnings, +.invalid { + padding: var(--sp-3); + margin-bottom: var(--sp-3); + border: 1px solid; + border-radius: var(--radius); +} + +.warnings { background: var(--info-soft); border-color: var(--info); } +.invalid { background: var(--danger-soft); border-color: var(--state-failed); } + +.warnings__list, +.invalid__list { + display: grid; + gap: var(--sp-1); + margin: 0; + padding-left: var(--sp-4); + font-size: var(--size-sm); +} + +.empty-note { + margin: var(--sp-3) 0 0; + padding: var(--sp-3); + font-size: var(--size-sm); + background: var(--bg-sunken); + border-radius: var(--radius); +} + +/* -- About/durum view -------------------------------------------------- */ + +.about { display: grid; gap: var(--sp-4); } + +.card { + padding: var(--sp-4); + background: var(--bg-panel); + border: 1px solid var(--border); + border-radius: var(--radius-lg); +} + +.card--danger { + background: var(--danger-soft); + border-color: var(--state-failed); +} + +.about-table { + width: 100%; + border-collapse: collapse; + font-size: var(--size-sm); +} + +.about-table th { + padding: var(--sp-2); + text-align: left; + font-size: var(--size-xs); + letter-spacing: .04em; + text-transform: uppercase; + color: var(--text-muted); + border-bottom: 1px solid var(--border-strong); +} + +.about-table td { + padding: var(--sp-2); + border-bottom: 1px solid var(--border); + vertical-align: top; +} + +.rules { + display: grid; + gap: var(--sp-2); + margin: 0; + padding-left: var(--sp-4); + font-size: var(--size-sm); +} + + + +$label$key$hint + + + +$word$token$meaning + + + +$code $label$target$in_panel + + + +
+

Hakkında ve durum

+

Bu sayfa panelin kendi sürümünü ve hangi veriyi gösterdiğini yazar; operatör neye baktığını tahmin etmez.

+ +
+

Panel

+
+
Ürün
$panel_name
+
Yüzey
$panel_surface
+
Panel sürümü
$panel_version
+
Python
$python_version
+
Dinlenen adres
$bind_address
+
Yetki düzeyi
$privilege_word $privilege_reason
+
Sunucu başlangıcı
$started_at
+
+
+ +
+

Veri kaynağı

+

+ $data_banner_word + $data_banner_text +

+
+
Kaynak türü
$source_kind_word
+
Dosya
$source_path_text
+
Şema sürümü
$schema_version_text
+
Dosya üretimi
$generated_at_text
+
Yükleme zamanı
$loaded_at
+
Cihaz sayısı
$total_text
+
Hazır / hazır değil
$ready_text
+
Geçersiz kayıt
$invalid_count_text
+
Okuma hatası
$error_text
+
+
+ +
+

Durum sözlüğü

+

İki operatör yüzeyi aynı sözlüğü kullanır (docs/DESIGN.md); cihaz konsolu ve bu panel aynı kelimeyi yazar. Renk yalnız taşıyıcı değildir: rozet her zaman kelimesini taşır.

+ + + + + + +$vocabulary_rows + +
Durum sözlüğü: Türkçe kelime, renk belirteci ve anlamı
DurumRenk belirteciAnlam
+
+ +
+

Dalgalar

+

Yayılım sırası ve dalga hedefi (docs/18). Panelde $total_text cihaz var.

+ + + + + + +$wave_rows + +
Yayılım dalgaları, hedef cihaz sayısı ve panelde görünen cihaz sayısı
DalgaHedef cihazPanelde
+
+ +
+

Kanal doğrulaması

+

HAZIR yalnız dört kanalın hepsi doğrulandığında verilir; panel bunu denetler (docs/27).

+ + + + + + +$channel_rows + +
Dört uzak erişim kanalı ve envanter alan adları
KanalAlan adıNe doğrulanır
+
+ +
+

Panel kuralları

+
    +$rule_items +
+
+
+
+ + + + + + + +$page_title + + + + + +
+
+

$panel_name

+ $panel_surface +
+ +

+ Hedef + $target_identity +

+
+ $primary_action + $gated_action +
+

+ Yetki + $privilege_word + $privilege_reason +

+
+
+$content +
+
+ $footer_source + $footer_meta +
+ + +
+ + +
  • + $label + $status_word + $checked_at_text + $hint +
  • +
    + + +

    Seçili cihaz

    +

    $empty_text

    +
    + + +

    Seçili cihaz

    +

    + HATA + Bu kimlik envanterde yok. +

    +

    İstenen cihaz kimliği: $device_id. Envanterde bu kimliğe sahip bir kayıt yok; panel eksik kaydı uydurmaz.

    +

    Tüm filoyu göster

    +
    + + +

    Seçili cihaz

    +

    + $state_label + $state_meaning +

    +$selection_note_block +$reason_block +
    +
    Hedef kimliği
    $device_id
    +
    Hostname
    $hostname
    +
    Bayi no
    $dealer_id
    +
    Dalga
    $wave_label hedef $wave_target cihaz
    +
    Son görülme
    $last_seen_text
    +
    Kayıt kaynağı
    $record_source
    +
    +$note_block +$notes_block +

    Kanal doğrulaması

    +

    $ready_gate_note

    +
      +$channel_rows +
    +

    $channel_count_note

    +
    + + + + $state_label + $device_id + $hostname + $wave_name + $last_seen_text + + + + +

    $text Filtreyi temizle

    +
    + + +
    +
    +

    + + +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    + + Filtreyi temizle +

    +
    +

    Gösterilen: $shown_count / $total_count · $filter_description

    +
    +
    + + +
    + $data_banner_word + $data_banner_text +
    + +
    +
    + $lead_figure + $lead_label + $lead_note +
    +
      +$summary_cells +
    +
    + +$warnings_block + +
    +
    +

    Filo cihazları

    +

    Hazır olmayan cihazlar listede önce gelir. $list_count_text

    +$filter_bar +$wave_strip +$invalid_block + + + + + + + + + + + + +$device_rows + +
    Filo cihazları: durum, cihaz kimliği, hostname, dalga ve son görülme
    DurumCihaz kimliğiHostnameDalgaSon görülme
    +$empty_note +
    + +
    +
    + + + +Kapalı: $reason + + + +
    +

    Geçersiz kayıtlar: $invalid_count

    +

    Kimliği kurulamayan kayıt sessizce düşürülmez; aşağıda nedeniyle birlikte durur (docs/02).

    +
      +$invalid_items +
    +
    +
    + + +
  • $record_ref — $reason
  • +
    + + +
    +

    Sayfa yok

    +

    İstenen adres bu panelde tanımlı değil: $request_path

    +

    Panel sayfaları: Filo · Hakkında ve durum

    +
    +
    + + +

    Not: $text

    +
    + + +
  • $text
  • +
    + + +
      +$items +
    +
    + + + + + + +Filo durumunu yenile + + + +

    $text

    +
    + + +
    +

    Yöntem reddedildi

    +

    Gelen yöntem: $method

    +

    Bu panel yalnız okuma yapar: hiçbir uç nokta cihazda değişiklik yapmaz, komut çalıştırmaz ve dosya yazmaz.

    +

    Kabul edilen yöntemler: GET, HEAD. Yetki düzeyi: $privilege_word.

    +
    +
    + + +
  • $text
  • +
    + + +

    $text

    +
    + + +
  • + $count + $word + $note +
  • +
    + + +
  • $text
  • +
    + + +
    +

    Uyarılar

    +
      +$warning_items +
    +
    +
    + + +$code $count/$target + + + +

    Dalga doluluğu: $wave_items

    +
    + + +"""Blueforce Field OS — central fleet panel (Python standard library only). + +The operator surface of the fleet: one browser page that answers "which devices +are installed, which rollout wave are they in, and what is the one next action". +It is the companion of the on-device console (``bfos``, tkinter): both surfaces +describe the same fleet from opposite ends and share one status vocabulary +(docs/DESIGN.md). + +Why the standard library and nothing else: the fleet installs offline from a +committed package pool, so ``fastapi``/``uvicorn``/``flask`` are simply not +installable on the devices this panel manages (PRODUCT.md, "Stack"). No template +engine, no webfont and no CDN either -- the panel is one directory of Python and +local assets. + +Modules +------- +``fleet_data`` inventory model, the PROVISIONED_OFFLINE -> ENROLLED -> READY + rules, filtering and sorting (no I/O beyond reading one file). +``render`` server-rendered HTML pages from local templates. +``panel`` request routing and the privilege gate (read-only by default). +``server`` ``http.server`` glue and the command line. +""" + +from __future__ import annotations + +__all__ = [ + "PANEL_NAME", + "PANEL_SURFACE", + "PANEL_TITLE", + "PANEL_VERSION", + "DEFAULT_PORT", + "DEFAULT_HOST", +] + +# Product voice comes from PRODUCT.md; the surface name is what the operator +# reads in the header band (docs/DESIGN.md FIRST VIEWPORT). +PANEL_NAME = "Blueforce Field OS" +PANEL_SURFACE = "Filo Paneli" +PANEL_TITLE = f"{PANEL_NAME} — {PANEL_SURFACE}" + +PANEL_VERSION = "0.1.0" + +# The panel is an operator tool on an office workstation, reached over +# WireGuard; it binds to the loopback interface unless told otherwise. +DEFAULT_HOST = "127.0.0.1" +DEFAULT_PORT = 8787 + + + +"""Fleet inventory model for the central Blueforce panel (Python stdlib only). + +Read-only by construction: this module reads one inventory JSON document (or +falls back to clearly labelled synthetic demo data), turns it into the device +records the panel renders, and does nothing else. It never writes to disk, never +opens a network connection and never invents a state. + +Product rules this module enforces, because they are the fleet's rules +(docs/02 §9, docs/18 §9, docs/27 §9): + +* one identity per dealer number, derived, never guessed: ``BF-`` for the + human surface and ``bf-`` for the hostname, ``^[0-9]{8}$``; +* the state machine is ``PROVISIONED_OFFLINE -> ENROLLED -> READY`` with + ``FAILED`` and ``ABSENT`` outside the sequence, and the panel never promotes a + device -- a stage claim the centre has not made stays unmade here; +* ``READY`` is refused while any of the four channels is unverified: such a + record is surfaced as ``HATA`` with the reason, not as a claim the fleet + cannot back (docs/27); +* a channel check that failed means the device needs a person, so the device is + ``HATA``; +* a record that cannot be identified is never dropped silently -- it leaves an + ``InvalidRecord`` that the panel shows. + +Vocabulary, Turkish words and colour tokens are taken from docs/DESIGN.md; +tests/test_web_static.py asserts this module still matches that document, so the +two operator surfaces cannot drift apart. +""" + +from __future__ import annotations + +import json +import os +import re +from dataclasses import dataclass, field +from datetime import datetime +from pathlib import Path +from typing import Any, Iterable, Mapping, Sequence + +# -------------------------------------------------------------------------- +# Identity (docs/02) +# -------------------------------------------------------------------------- + +DEALER_PATTERN = re.compile(r"^[0-9]{8}$") +DEVICE_ID_PREFIX = "BF-" +HOSTNAME_PREFIX = "bf-" + +# -------------------------------------------------------------------------- +# Status vocabulary (docs/DESIGN.md "Status vocabulary") -- one word per state, +# Turkish, used identically by the device console and this panel. +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class StateSpec: + """One state of the fleet vocabulary, as docs/DESIGN.md defines it.""" + + state: str + """Machine name used by the state machine: PROVISIONED_OFFLINE, ENROLLED...""" + + word: str + """The Turkish word an operator reads. Both surfaces show this word.""" + + token: str + """Colour token in web/static/tokens.css. Never a literal colour here.""" + + soft_token: str + """Soft (fill) form of the same colour, for badge backgrounds.""" + + meaning: str + """Turkish one-liner: what the state means to the operator.""" + + @property + def token_suffix(self) -> str: + """``--state-provisioned`` -> ``provisioned`` (used in CSS class names).""" + return self.token[len("--state-"):] + + +STATE_VOCABULARY: tuple[StateSpec, ...] = ( + StateSpec( + "PROVISIONED_OFFLINE", + "KURULDU", + "--state-provisioned", + "--info-soft", + "Çevrimdışı kuruldu; merkeze kayıtlı değil.", + ), + StateSpec( + "ENROLLED", + "KAYITLI", + "--state-enrolled", + "--warn-soft", + "Kayıtlı; dört kanalın hepsi doğrulanmadı.", + ), + StateSpec( + "READY", + "HAZIR", + "--state-ready", + "--ok-soft", + "Dört kanal da doğrulandı; tek sevk edilebilir durum.", + ), + StateSpec( + "FAILED", + "HATA", + "--state-failed", + "--danger-soft", + "Bir denetim başarısız; cihaz bir insan bekliyor.", + ), + StateSpec( + "ABSENT", + "YOK", + "--state-absent", + "--idle-soft", + "Erişilemiyor ya da hiç görülmedi.", + ), +) + +STATE_BY_NAME: dict[str, StateSpec] = {spec.state: spec for spec in STATE_VOCABULARY} + +#: Lookup by the Turkish word, for the surfaces that read a word back. +STATE_BY_WORD: dict[str, StateSpec] = {spec.word: spec for spec in STATE_VOCABULARY} + +# Sorted so that non-ready devices surface first (docs/DESIGN.md: "the fleet +# table sorts non-ready first, so the list is readable in greyscale"). FAILED +# and ABSENT need a person; READY -- the only shippable state -- is last. +STATE_ORDER: tuple[str, ...] = ( + "FAILED", + "ABSENT", + "PROVISIONED_OFFLINE", + "ENROLLED", + "READY", +) + +# -------------------------------------------------------------------------- +# Rollout waves (docs/18 §9) +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class Wave: + """One rollout wave: ``LAB(2) -> P1(5) -> P2(20) -> W1(50) -> W2(100) -> PROD``.""" + + code: str + label: str + target: int + order: int + aliases: tuple[str, ...] = () + + @property + def full_label(self) -> str: + return f"{self.code} — {self.label}" if self.label != self.code else self.code + + +WAVES: tuple[Wave, ...] = ( + Wave("LAB", "LAB", 2, 0, ("lab",)), + Wave("P1", "PILOT-1", 5, 1, ("pilot_1", "pilot-1", "pilot1")), + Wave("P2", "PILOT-2", 20, 2, ("pilot_2", "pilot-2", "pilot2")), + Wave("W1", "WAVE-1", 50, 3, ("wave_1", "wave-1", "wave1")), + Wave("W2", "WAVE-2", 100, 4, ("wave_2", "wave-2", "wave2")), + Wave("PROD", "PROD", 523, 5, ("production", "prod")), +) + +WAVE_BY_CODE: dict[str, Wave] = {wave.code: wave for wave in WAVES} + +# -------------------------------------------------------------------------- +# Channels (docs/27: READY requires every channel verified) +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class ChannelSpec: + """One of the four remote-access channels every device must verify.""" + + key: str + label: str + hint: str + + +CHANNELS: tuple[ChannelSpec, ...] = ( + ChannelSpec("ssh_over_wg", "SSH-over-WG", "WireGuard üzerinden SSH (K-13)"), + ChannelSpec("xrdp", "xRDP", "GNOME masaüstü oturumu (K-22)"), + ChannelSpec("rustdesk", "RustDesk", "RustDesk OSS istemcisi"), + ChannelSpec("meshcentral", "MeshCentral", "MeshCentral ajanı"), +) + +CHANNEL_STATUSES: tuple[str, ...] = ("verified", "pending", "failed", "unknown", "missing") + +# Turkish word per channel status. The panel never shows a bare colour: the word +# is what carries the meaning (docs/DESIGN.md rule 2). +CHANNEL_STATUS_WORDS: dict[str, str] = { + "verified": "doğrulandı", + "pending": "bekliyor", + "failed": "başarısız", + "unknown": "bilinmiyor", + "missing": "yok", +} + +# Severity class for the local stylesheet. Tokens only, no colours in Python. +CHANNEL_STATUS_TONES: dict[str, str] = { + "verified": "ok", + "pending": "warn", + "failed": "danger", + "unknown": "idle", + "missing": "idle", +} + +# -------------------------------------------------------------------------- +# Document contract +# -------------------------------------------------------------------------- + +SUPPORTED_SCHEMA_VERSION = 1 +DATA_PATH_ENV = "BF_FLEET_DATA" +DEFAULT_DATA_PATH = Path(__file__).resolve().parent / "data" / "fleet.json" + +DEMO_SOURCE_LABEL = "sentetik demo veri (gerçek filo envanteri bağlı değil)" + +# Synthetic records for a first look at the panel without a live fleet. They go +# through the same parse path as a real document, and the UI labels every page +# that renders them -- demo data must never be mistaken for fleet state. +DEMO_DEVICES: tuple[Mapping[str, Any], ...] = ( + { + "dealer_id": "12010101", + "wave": "LAB", + "state": "READY", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-15T09:10:00+03:00"}, + "xrdp": {"status": "verified", "checked_at": "2026-09-15T09:12:00+03:00"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-15T09:15:00+03:00"}, + "meshcentral": {"status": "verified", "checked_at": "2026-09-15T09:18:00+03:00"}, + }, + "last_seen": "2026-09-16T08:40:00+03:00", + }, + { + "dealer_id": "12010102", + "wave": "LAB", + "state": "ENROLLED", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-16T08:02:00+03:00"}, + "xrdp": {"status": "pending"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-16T08:05:00+03:00"}, + "meshcentral": {"status": "pending"}, + }, + "last_seen": "2026-09-16T08:41:00+03:00", + }, + { + "dealer_id": "12010193", + "wave": "pilot_1", + "state": "READY", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-14T10:00:00+03:00"}, + "xrdp": {"status": "verified", "checked_at": "2026-09-14T10:02:00+03:00"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-14T10:04:00+03:00"}, + "meshcentral": {"status": "verified", "checked_at": "2026-09-14T10:06:00+03:00"}, + }, + "last_seen": "2026-09-16T09:05:00+03:00", + }, + { + "dealer_id": "12010194", + "wave": "P1", + "state": "ENROLLED", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-16T07:30:00+03:00"}, + "xrdp": {"status": "verified", "checked_at": "2026-09-16T07:32:00+03:00"}, + "rustdesk": {"status": "pending"}, + "meshcentral": {"status": "verified", "checked_at": "2026-09-16T07:35:00+03:00"}, + }, + "last_seen": "2026-09-16T09:04:00+03:00", + }, + { + "dealer_id": "12010195", + "wave": "P1", + "state": "PROVISIONED_OFFLINE", + "channels": {}, + "last_seen": "2026-09-13T16:20:00+03:00", + }, + { + "dealer_id": "12010204", + "wave": "P2", + "state": "PROVISIONED_OFFLINE", + "channels": {}, + "last_seen": "2026-09-12T11:00:00+03:00", + }, + { + "dealer_id": "12010205", + "wave": "P2", + "state": "ENROLLED", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-16T06:10:00+03:00"}, + "xrdp": {"status": "failed", "checked_at": "2026-09-16T06:12:00+03:00"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-16T06:14:00+03:00"}, + "meshcentral": {"status": "unknown"}, + }, + "last_seen": "2026-09-16T06:20:00+03:00", + }, + { + "dealer_id": "12010206", + "wave": "P2", + "state": "PROVISIONED_OFFLINE", + "channels": {}, + "last_seen": "2026-09-11T14:45:00+03:00", + }, + { + "dealer_id": "12010207", + "wave": "W1", + "state": "PROVISIONED_OFFLINE", + "channels": {}, + "last_seen": "2026-09-10T10:05:00+03:00", + }, + { + "dealer_id": "12010208", + "wave": "W1", + "state": "ABSENT", + "channels": {}, + "last_seen": None, + "note": "Envanterde var, merkez hiç görmedi.", + }, + { + "dealer_id": "12010209", + "wave": "W2", + "state": "ABSENT", + "channels": {}, + "last_seen": None, + }, + { + "dealer_id": "12010210", + "wave": "PROD", + "state": "PROVISIONED_OFFLINE", + "channels": {}, + "last_seen": "2026-09-09T09:00:00+03:00", + }, + { + "dealer_id": "12010211", + "wave": "W2", + "state": "READY", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-15T13:00:00+03:00"}, + "xrdp": {"status": "verified", "checked_at": "2026-09-15T13:02:00+03:00"}, + "rustdesk": {"status": "verified", "checked_at": "2026-09-15T13:04:00+03:00"}, + "meshcentral": {"status": "verified", "checked_at": "2026-09-15T13:06:00+03:00"}, + }, + "last_seen": "2026-09-16T09:01:00+03:00", + }, +) + + +# -------------------------------------------------------------------------- +# Records +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class ChannelCheck: + """Verification state of one channel on one device.""" + + key: str + label: str + hint: str + status: str + checked_at: str | None = None + + @property + def status_word(self) -> str: + return CHANNEL_STATUS_WORDS[self.status] + + @property + def tone(self) -> str: + return CHANNEL_STATUS_TONES[self.status] + + @property + def is_verified(self) -> bool: + return self.status == "verified" + + @property + def checked_at_text(self) -> str: + """Never a bare ``None`` on screen: an operator reads Turkish words.""" + return self.checked_at or "kayıt yok" + + @property + def status_word_title(self) -> str: + return f"{self.label}: {self.status_word}" + + +@dataclass(frozen=True) +class InvalidRecord: + """A record that could not be identified. Shown, never silently dropped.""" + + record_ref: str + reason: str + + +@dataclass(frozen=True) +class Device: + """One fleet device, as the panel describes it.""" + + device_id: str + hostname: str + dealer_id: str + wave_code: str + state: str + channels: tuple[ChannelCheck, ...] = () + last_seen: str | None = None + note: str | None = None + claimed_state: str | None = None + reason: str | None = None + notes: tuple[str, ...] = field(default=()) + + @property + def spec(self) -> StateSpec: + return STATE_BY_NAME[self.state] + + @property + def state_label(self) -> str: + return self.spec.word + + @property + def state_meaning(self) -> str: + return self.spec.meaning + + @property + def state_token_suffix(self) -> str: + return self.spec.token_suffix + + @property + def wave(self) -> Wave: + return WAVE_BY_CODE[self.wave_code] + + @property + def wave_label(self) -> str: + return self.wave.full_label + + @property + def is_ready(self) -> bool: + return self.state == "READY" + + @property + def unverified_channels(self) -> tuple[str, ...]: + return tuple(check.label for check in self.channels if not check.is_verified) + + @property + def verified_channel_count(self) -> int: + return sum(1 for check in self.channels if check.is_verified) + + @property + def last_seen_text(self) -> str: + return self.last_seen or "kayıt yok" + + @property + def ready_gate_note(self) -> str: + """The Turkish sentence that explains the READY gate for this device.""" + if self.is_ready: + return "Bu cihaz HAZIR: dört kanalın dördü de doğrulandı (docs/27)." + unverified = self.unverified_channels + if not unverified: + return ( + "Dört kanal da doğrulandı, ancak merkez kaydı HAZIR demiyor. " + "Panel durumu yükseltmez (docs/27)." + ) + return ( + "HAZIR için eksik kanallar: " + ", ".join(unverified) + + ". READY yalnız dördü de doğrulandığında verilir (docs/27)." + ) + + +@dataclass(frozen=True) +class FleetSnapshot: + """Everything the panel knows: devices, refused records and the source.""" + + devices: tuple[Device, ...] + invalid: tuple[InvalidRecord, ...] + source_kind: str # "file" | "demo" | "error" + source_path: str | None + source_label: str + error: str | None + loaded_at: str + generated_at: str | None = None + schema_version: int | None = None + + @property + def is_demo(self) -> bool: + return self.source_kind == "demo" + + @property + def is_file(self) -> bool: + return self.source_kind == "file" + + @property + def is_error(self) -> bool: + return self.source_kind == "error" + + @property + def total(self) -> int: + return len(self.devices) + + @property + def counts(self) -> dict[str, int]: + """Count of devices per Turkish state word, zero filled, word order kept.""" + counted = {spec.word: 0 for spec in STATE_VOCABULARY} + for device in self.devices: + counted[device.state_label] += 1 + return counted + + @property + def ready_count(self) -> int: + return self.counts["HAZIR"] + + @property + def not_ready_count(self) -> int: + return self.total - self.ready_count + + @property + def wave_counts(self) -> dict[str, int]: + counted = {wave.code: 0 for wave in WAVES} + for device in self.devices: + counted[device.wave_code] += 1 + return counted + + @property + def source_kind_word(self) -> str: + return { + "file": "envanter dosyası", + "demo": "sentetik demo veri", + "error": "okunamadı", + }[self.source_kind] + + @property + def banner_word(self) -> str: + """One Turkish word that names what the operator is looking at.""" + return {"file": "ENVANTER", "demo": "DEMO VERİ", "error": "VERİ YOK"}[self.source_kind] + + @property + def banner_tone(self) -> str: + return {"file": "info", "demo": "warn", "error": "danger"}[self.source_kind] + + @property + def banner_text(self) -> str: + """The sentence under the word: what the data is, and what it is not.""" + if self.is_demo: + return ( + f"Gerçek filo envanteri bağlı değil: aşağıdaki {self.total} kayıt " + "sentetiktir ve hiçbir cihazı temsil etmez. Gerçek veri için paneli " + "«--data » ile başlatın." + ) + if self.is_file: + generated = self.generated_at or "bildirilmemiş" + return ( + f"Kaynak: {self.source_path} · şema sürümü {self.schema_version} · " + f"dosya üretimi: {generated} · yükleme: {self.loaded_at}" + ) + return f"{self.error} Demo veriye düşülmedi; filo durumu bilinmiyor." + + +@dataclass(frozen=True) +class FleetFilter: + """What the operator narrowed the list to.""" + + query: str = "" + state: str = "" # machine state name, "" means every state + wave: str = "" # wave code, "" means every wave + only_not_ready: bool = False + + @property + def is_active(self) -> bool: + return bool(self.query or self.state or self.wave or self.only_not_ready) + + def matches(self, device: Device) -> bool: + if self.state and device.state != self.state: + return False + if self.wave and device.wave_code != self.wave: + return False + if self.only_not_ready and device.is_ready: + return False + if self.query: + needle = fold(self.query) + haystack = " ".join((device.device_id, device.hostname, device.dealer_id)) + if needle not in fold(haystack): + return False + return True + + @property + def description(self) -> str: + """Turkish summary of the filter, for the header band and the empty note.""" + parts: list[str] = [] + if self.query: + parts.append(f"metin «{self.query}»") + if self.state: + parts.append(f"durum {STATE_BY_NAME[self.state].word}") + if self.wave: + parts.append(f"dalga {self.wave}") + if self.only_not_ready: + parts.append("yalnız hazır olmayanlar") + return " · ".join(parts) if parts else "filtre yok" + + +# -------------------------------------------------------------------------- +# Text helpers (Turkish aware: the vocabulary contains ı/İ/ş/ğ/ç/ö/ü) +# -------------------------------------------------------------------------- + +_FOLD_TABLE = str.maketrans( + { + "ı": "i", "İ": "i", "I": "i", "ş": "s", "Ş": "s", "ğ": "g", "Ğ": "g", + "ç": "c", "Ç": "c", "ö": "o", "Ö": "o", "ü": "u", "Ü": "u", + } +) + + +def fold(text: str) -> str: + """Case- and accent-insensitive key for operator input (Turkish included). + + ``HAZIR``, ``Hazır`` and ``hazir`` must all mean the same filter value, and + ``str.lower()`` alone does not get there: ``"HAZIR".lower()`` is ``hazir`` + while ``"hazır".lower()`` is ``hazır``. + """ + return text.translate(_FOLD_TABLE).lower() + + +def _text(value: Any) -> str | None: + """Non-empty string, or ``None`` -- the panel never shows a bare ``None``.""" + if isinstance(value, str): + stripped = value.strip() + return stripped or None + if isinstance(value, bool): + return None + if isinstance(value, (int, float)): + return str(value) + return None + + +def first_param(params: Mapping[str, Any], key: str) -> str: + """First value of a query parameter, in both ``str`` and ``list`` shapes.""" + value = params.get(key) + if value is None: + return "" + if isinstance(value, (list, tuple)): + value = value[0] if value else "" + return _text(str(value)) or "" + + +def timestamp_now() -> str: + return datetime.now().astimezone().isoformat(timespec="seconds") + + +def _alias_index(items: Iterable[tuple[str, str]]) -> dict[str, str]: + """Build a folded lookup table, complaining loudly about collisions.""" + table: dict[str, str] = {} + for key, value in items: + folded = fold(key) + existing = table.get(folded) + if existing is not None and existing != value: + raise ValueError(f"alias collision: {key!r} -> {value!r} / {existing!r}") + table[folded] = value + return table + + +STATE_ALIASES: dict[str, str] = _alias_index( + [(spec.state, spec.state) for spec in STATE_VOCABULARY] + + [(spec.word, spec.state) for spec in STATE_VOCABULARY] + + [(spec.token_suffix, spec.state) for spec in STATE_VOCABULARY] +) + +WAVE_ALIASES: dict[str, str] = _alias_index( + [(wave.code, wave.code) for wave in WAVES] + + [(alias, wave.code) for wave in WAVES for alias in wave.aliases] +) + +CHANNEL_ALIASES: dict[str, str] = _alias_index( + [(spec.key, spec.key) for spec in CHANNELS] + + [(spec.label, spec.key) for spec in CHANNELS] + + [ + ("ssh", "ssh_over_wg"), + ("ssh-over-wg", "ssh_over_wg"), + ("ssh_over_wireguard", "ssh_over_wg"), + ("wireguard-ssh", "ssh_over_wg"), + ("rdp", "xrdp"), + ("rust_desk", "rustdesk"), + ("mesh", "meshcentral"), + ] +) + +CHANNEL_STATUS_ALIASES: dict[str, str] = _alias_index( + [(status, status) for status in CHANNEL_STATUSES] + + [(word, status) for status, word in CHANNEL_STATUS_WORDS.items()] +) + + +# -------------------------------------------------------------------------- +# Parsing +# -------------------------------------------------------------------------- + + +def _record_ref(record: Any, index: int) -> str: + if isinstance(record, Mapping): + for key in ("device_id", "dealer_id", "bayi_no", "hostname"): + value = _text(record.get(key)) + if value: + return value + return f"kayıt {index + 1}" + + +def _parse_channel(raw: Any) -> tuple[str, str | None, str | None]: + """-> (status, checked_at, advisory). Unknown shapes never crash the panel.""" + if raw is None: + return "missing", None, None + if isinstance(raw, str): + claimed, checked_at = raw, None + elif isinstance(raw, Mapping): + claimed = _text(raw.get("status")) or "unknown" + checked_at = _text(raw.get("checked_at")) or _text(raw.get("checked")) + else: + return "unknown", None, "Kanal kaydı okunamadı: nesne ya da metin bekleniyor." + status = CHANNEL_STATUS_ALIASES.get(fold(claimed)) + if status is None: + return "unknown", checked_at, f"Bilinmeyen kanal durumu yok sayıldı: «{claimed}»." + return status, checked_at, None + + +def parse_record(record: Any, index: int = 0) -> tuple[Device | None, InvalidRecord | None]: + """Turn one raw inventory record into a ``Device`` or a refused record. + + A record is refused only when it cannot be identified at all; anything the + panel can name it shows, with the reason it could not be trusted attached. + """ + ref = _record_ref(record, index) + if not isinstance(record, Mapping): + return None, InvalidRecord(ref, "Kayıt nesne değil; JSON nesnesi bekleniyor.") + + dealer_id = _text(record.get("dealer_id")) or _text(record.get("dealer")) \ + or _text(record.get("bayi_no")) + if not dealer_id: + return None, InvalidRecord(ref, "Bayi no yok; cihaz kimliği türetilemez (docs/02 §9).") + if not DEALER_PATTERN.match(dealer_id): + return None, InvalidRecord( + ref, + f"Bayi no 8 hane değil: «{dealer_id}» (kural ^[0-9]{{8}}$).", + ) + + device_id = DEVICE_ID_PREFIX + dealer_id + hostname = HOSTNAME_PREFIX + dealer_id + + declared_id = _text(record.get("device_id")) + if declared_id and declared_id != device_id: + return None, InvalidRecord( + ref, f"Cihaz kimliği kurala uymuyor: «{declared_id}» yerine «{device_id}» olmalı (docs/02)." + ) + declared_host = _text(record.get("hostname")) + if declared_host and declared_host != hostname: + return None, InvalidRecord( + ref, f"Hostname kurala uymuyor: «{declared_host}» yerine «{hostname}» olmalı (docs/02)." + ) + + wave_raw = _text(record.get("wave")) or _text(record.get("dalga")) + if not wave_raw: + return None, InvalidRecord(ref, "Dalga yok; cihaz bir yayılım dalgasına bağlanamaz (docs/18).") + wave_code = WAVE_ALIASES.get(fold(wave_raw)) + if wave_code is None: + return None, InvalidRecord( + ref, f"Bilinmeyen dalga: «{wave_raw}» (LAB, P1, P2, W1, W2, PROD)." + ) + + notes: list[str] = [] + state_raw = _text(record.get("state")) or _text(record.get("durum")) + claimed_state: str | None = None + reason: str | None = None + if state_raw is None: + state = "FAILED" + reason = ( + "Durum alanı yok. Panel durum uydurmaz; cihaz HATA olarak işaretlendi " + "(docs/27)." + ) + else: + resolved = STATE_ALIASES.get(fold(state_raw)) + if resolved is None: + state = "FAILED" + claimed_state = state_raw + reason = ( + f"Durum alanı tanınmıyor: «{state_raw}». Panel durum uydurmaz; cihaz " + "HATA olarak işaretlendi (docs/27)." + ) + else: + state = resolved + + raw_channels = record.get("channels") + statuses: dict[str, tuple[str, str | None]] = {} + if raw_channels is None: + notes.append("Kanallar bildirilmemiş; dört kanal «yok» sayıldı (docs/27).") + elif not isinstance(raw_channels, Mapping): + notes.append("«channels» alanı nesne değil; dört kanal «yok» sayıldı (docs/27).") + else: + for raw_key, raw_value in raw_channels.items(): + key = CHANNEL_ALIASES.get(fold(str(raw_key))) + if key is None: + notes.append(f"Bilinmeyen kanal anahtarı yok sayıldı: «{raw_key}».") + continue + status, checked_at, advisory = _parse_channel(raw_value) + statuses[key] = (status, checked_at) + if advisory: + notes.append(advisory) + + checks: list[ChannelCheck] = [] + for spec in CHANNELS: + status, checked_at = statuses.get(spec.key, ("missing", None)) + checks.append(ChannelCheck(spec.key, spec.label, spec.hint, status, checked_at)) + + # READY gate (docs/27 §9.4): the claim is refused while a channel is + # unverified. The panel does not downgrade the word to a warning -- a claim + # the fleet cannot back is a failure and needs a person. + if state == "READY": + blocked = [check.label for check in checks if not check.is_verified] + if blocked: + claimed_state = "READY" + state = "FAILED" + reason = ( + "HAZIR iddiası reddedildi: " + ", ".join(blocked) + + " doğrulanmadı. READY yalnız dört kanalın hepsi doğrulandığında " + "verilir (docs/27)." + ) + + # A channel check that failed means the device needs a person. + failed = [check.label for check in checks if check.status == "failed"] + if failed and state not in ("FAILED",): + reason = ( + "Kanal doğrulaması başarısız: " + ", ".join(failed) + + ". Cihaz bir insan bekliyor (docs/27)." + ) + state = "FAILED" + + # The panel never promotes: a record may lag behind the centre, never lead it. + if state in ("PROVISIONED_OFFLINE", "ENROLLED") and all( + check.is_verified for check in checks + ): + notes.append( + "Dört kanal da doğrulandı, ancak merkez kaydı daha ileri bir durum " + "demiyor; panel durumu yükseltmez (docs/27)." + ) + + return ( + Device( + device_id=device_id, + hostname=hostname, + dealer_id=dealer_id, + wave_code=wave_code, + state=state, + channels=tuple(checks), + last_seen=_text(record.get("last_seen")) or _text(record.get("son_gorulme")), + note=_text(record.get("note")), + claimed_state=claimed_state, + reason=reason, + notes=tuple(notes), + ), + None, + ) + + +def parse_records(records: Sequence[Any]) -> tuple[tuple[Device, ...], tuple[InvalidRecord, ...]]: + """Parse a whole document body; duplicate dealer numbers are refused (docs/02).""" + devices: list[Device] = [] + invalid: list[InvalidRecord] = [] + seen: dict[str, str] = {} + for index, record in enumerate(records): + device, refused = parse_record(record, index) + if refused is not None: + invalid.append(refused) + continue + assert device is not None + if device.dealer_id in seen: + invalid.append( + InvalidRecord( + device.device_id, + "Yinelenen bayi no; ikinci kayıt reddedildi (docs/02 §8).", + ) + ) + continue + seen[device.dealer_id] = device.device_id + devices.append(device) + return tuple(devices), tuple(invalid) + + +# -------------------------------------------------------------------------- +# Loading +# -------------------------------------------------------------------------- + + +def _error_snapshot(path: Path | None, error: str, stamp: str) -> FleetSnapshot: + return FleetSnapshot( + devices=(), + invalid=(), + source_kind="error", + source_path=str(path) if path is not None else None, + source_label=f"veri okunamadı: {path}" if path is not None else "veri okunamadı", + error=error, + loaded_at=stamp, + ) + + +def demo_snapshot(stamp: str | None = None) -> FleetSnapshot: + """Labelled synthetic data, for a first look with no fleet attached.""" + devices, invalid = parse_records(DEMO_DEVICES) + return FleetSnapshot( + devices=devices, + invalid=invalid, + source_kind="demo", + source_path=None, + source_label=DEMO_SOURCE_LABEL, + error=None, + loaded_at=stamp or timestamp_now(), + generated_at=None, + schema_version=SUPPORTED_SCHEMA_VERSION, + ) + + +def load_fleet( + path: str | Path | None = None, + *, + env: Mapping[str, str] | None = None, + now: str | None = None, + default_path: str | Path | None = None, +) -> FleetSnapshot: + """Read one inventory document into a ``FleetSnapshot``. + + Fall-back rules, deliberately different for the two cases: + + * no document requested and the default location is empty -> labelled demo + data, so a first look is possible without a fleet; + * a document *was* requested (``path`` or ``BF_FLEET_DATA``) but cannot be + read, is not JSON, or breaks the schema -> an error snapshot. A broken + feed never becomes demo data and never becomes an empty fleet. + + ``env``, ``now`` and ``default_path`` exist so a test can pin the source and + the clock; the panel itself passes none of them. + """ + environment = os.environ if env is None else env + stamp = now or timestamp_now() + + requested: str | None = None + if path is not None: + requested = str(path) + else: + from_env = _text(environment.get(DATA_PATH_ENV)) + if from_env: + requested = from_env + explicit = requested is not None + target = Path(requested) if requested is not None else Path( + str(default_path) if default_path is not None else str(DEFAULT_DATA_PATH) + ) + + if not target.is_file(): + if explicit: + return _error_snapshot( + target, + f"Envanter dosyası bulunamadı: {target}. Panel demo veriye düşmedi; " + "filo durumu bilinmiyor.", + stamp, + ) + return demo_snapshot(stamp) + + try: + document = json.loads(target.read_text(encoding="utf-8")) + except OSError as exc: + return _error_snapshot( + target, + f"Envanter dosyası okunamadı: {target} ({exc.strerror or exc}).", + stamp, + ) + except json.JSONDecodeError as exc: + return _error_snapshot( + target, + f"Envanter dosyası JSON olarak çözümlenemedi: {target} " + f"(satır {exc.lineno}, sütun {exc.colno}).", + stamp, + ) + + if not isinstance(document, Mapping): + return _error_snapshot( + target, f"Envanter belgesi nesne değil: {target} (JSON nesnesi bekleniyor).", stamp + ) + + schema_version = document.get("schema_version") + if not isinstance(schema_version, int) or isinstance(schema_version, bool): + return _error_snapshot( + target, + f"Envanter belgesinde schema_version yok ya da sayı değil: {target}. " + f"Bu panel şema sürümü {SUPPORTED_SCHEMA_VERSION} okur.", + stamp, + ) + if schema_version > SUPPORTED_SCHEMA_VERSION: + return _error_snapshot( + target, + f"Desteklenmeyen şema sürümü: {schema_version}; bu panel " + f"{SUPPORTED_SCHEMA_VERSION} okur. Panel fail-closed durdu.", + stamp, + ) + + records = document.get("devices") + if not isinstance(records, list): + return _error_snapshot( + target, f"Envanter belgesinde «devices» listesi yok: {target}.", stamp + ) + + devices, invalid = parse_records(records) + return FleetSnapshot( + devices=devices, + invalid=invalid, + source_kind="file", + source_path=str(target), + source_label=f"envanter dosyası: {target}", + error=None, + loaded_at=stamp, + generated_at=_text(document.get("generated_at")), + schema_version=schema_version, + ) + + +# -------------------------------------------------------------------------- +# Ordering and filtering +# -------------------------------------------------------------------------- + + +def sort_devices(devices: Iterable[Device]) -> tuple[Device, ...]: + """Non-ready first (docs/DESIGN.md), then wave order, then identity. + + Reading order for an operator: what needs a person, then the rollout order, + with the id as the last, stable tie-breaker. + """ + return tuple( + sorted( + devices, + key=lambda device: ( + STATE_ORDER.index(device.state), + device.wave.order, + device.device_id, + ), + ) + ) + + +def filter_devices(devices: Iterable[Device], criteria: FleetFilter) -> tuple[Device, ...]: + return tuple(device for device in devices if criteria.matches(device)) + + +def parse_filter(params: Mapping[str, Any]) -> tuple[FleetFilter, tuple[str, ...]]: + """Normalise operator input; unknown values are ignored *visibly*.""" + warnings: list[str] = [] + + state_raw = first_param(params, "durum") + state = "" + if state_raw: + state = STATE_ALIASES.get(fold(state_raw), "") + if not state: + warnings.append( + f"Bilinmeyen durum filtresi yok sayıldı: «{state_raw}». " + "Sözlük: " + ", ".join(spec.word for spec in STATE_VOCABULARY) + "." + ) + + wave_raw = first_param(params, "dalga") + wave = "" + if wave_raw: + wave = WAVE_ALIASES.get(fold(wave_raw), "") + if not wave: + warnings.append( + f"Bilinmeyen dalga filtresi yok sayıldı: «{wave_raw}». " + "Dalgalar: " + ", ".join(w.code for w in WAVES) + "." + ) + + only_not_ready = fold(first_param(params, "hazir_degil")) in ("1", "var", "true", "on", "evet") + + criteria = FleetFilter( + query=first_param(params, "q"), + state=state, + wave=wave, + only_not_ready=only_not_ready, + ) + return criteria, tuple(warnings) + + +def state_counts(devices: Iterable[Device]) -> dict[str, int]: + counted = {spec.word: 0 for spec in STATE_VOCABULARY} + for device in devices: + counted[device.state_label] += 1 + return counted + + +def wave_counts(devices: Iterable[Device]) -> dict[str, int]: + counted = {wave.code: 0 for wave in WAVES} + for device in devices: + counted[device.wave_code] += 1 + return counted + + + +"""Request routing and the privilege gate for the central panel (stdlib only). + +``route`` is a pure function: it takes the panel context, an HTTP method and a +request target, and returns a ``Response``. Nothing in this module starts a +process, writes a file or opens an outbound connection -- the panel's read-only +claim is structural, not a promise in a comment: + +* only ``GET`` and ``HEAD`` are served; every other method is answered with 405 + and a Turkish explanation, never by an action; +* static assets are served from an explicit allow-list, so a request can never + walk the filesystem (``/static/../server.py`` is a 404); +* an unknown path is a Turkish 404, not a redirect anywhere. + +Because ``route`` is pure, tests exercise the whole HTTP surface without binding +a port. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from urllib.parse import parse_qs, unquote + +from . import render +from .fleet_data import FleetSnapshot +from .render import Privilege, ServerInfo + +#: Local assets only. Adding a name here is the only way to serve a new file. +STATIC_FILES: dict[str, str] = { + "tokens.css": "text/css; charset=utf-8", + "app.css": "text/css; charset=utf-8", +} + +READ_METHODS: tuple[str, ...] = ("GET", "HEAD") + +#: Response headers that keep an air-gapped panel inert: no script runs, no +#: remote origin is reachable, and the browser is told not to sniff types. +SECURITY_HEADERS: tuple[tuple[str, str], ...] = ( + ("X-Content-Type-Options", "nosniff"), + ("Referrer-Policy", "no-referrer"), + ( + "Content-Security-Policy", + "default-src 'self'; img-src 'self' data:; style-src 'self'; " + "script-src 'none'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'", + ), +) + + +@dataclass(frozen=True) +class Response: + """One HTTP answer, fully decided before the socket sees it.""" + + status: int + content_type: str + body: bytes + content_length: int + headers: tuple[tuple[str, str], ...] = () + + @property + def is_html(self) -> bool: + return self.content_type.startswith("text/html") + + +@dataclass(frozen=True) +class PanelContext: + """Everything a request needs: the snapshot, the privilege level, the facts.""" + + snapshot: FleetSnapshot + privilege: Privilege + server_info: ServerInfo + static_dir: Path = render.STATIC_DIR + + +def route(context: PanelContext, method: str, target: str) -> Response: + """Decide one request. Pure: same inputs, same bytes, no side effects.""" + verb = (method or "").upper() + raw_path, _, query_string = target.partition("?") + + if verb not in READ_METHODS: + return _html( + 405, + render.render_refused_page( + verb or "BİLİNMİYOR", + snapshot=context.snapshot, + privilege=context.privilege, + server_info=context.server_info, + ), + verb, + extra_headers=(("Allow", ", ".join(READ_METHODS)),), + ) + + decoded = unquote(raw_path) + if ".." in decoded or "\x00" in decoded: + return _not_found(context, decoded, verb) + + params = parse_qs(query_string, keep_blank_values=True) + + if decoded in ("/", "/filo", "/fleet"): + page = render.render_fleet_page( + context.snapshot, + params, + privilege=context.privilege, + server_info=context.server_info, + ) + return _html(200, page, verb) + + if decoded in ("/hakkinda", "/hakkinda/", "/about"): + page = render.render_about_page( + context.snapshot, + privilege=context.privilege, + server_info=context.server_info, + ) + return _html(200, page, verb) + + if decoded.startswith("/static/"): + return _static(context, decoded[len("/static/"):], verb) + + return _not_found(context, decoded, verb) + + +def _html( + status: int, + page: str, + verb: str, + *, + extra_headers: tuple[tuple[str, str], ...] = (), +) -> Response: + body = page.encode("utf-8") + headers = SECURITY_HEADERS + (("Cache-Control", "no-store"),) + extra_headers + if verb == "HEAD": + return Response(status, "text/html; charset=utf-8", b"", len(body), headers) + return Response(status, "text/html; charset=utf-8", body, len(body), headers) + + +def _not_found(context: PanelContext, request_path: str, verb: str) -> Response: + page = render.render_not_found_page( + request_path, + snapshot=context.snapshot, + privilege=context.privilege, + server_info=context.server_info, + ) + return _html(404, page, verb) + + +def _static(context: PanelContext, name: str, verb: str) -> Response: + # Allow-list first: anything not named here is a 404, so no path trick can + # reach a file this panel did not decide to publish. + content_type = STATIC_FILES.get(name) + if content_type is None: + return _not_found(context, f"/static/{name}", verb) + + path = context.static_dir / name + if not path.is_file(): + return _not_found(context, f"/static/{name}", verb) + + body = path.read_bytes() + headers = SECURITY_HEADERS + ( + ("Cache-Control", "no-cache"), + ) + if verb == "HEAD": + return Response(200, content_type, b"", len(body), headers) + return Response(200, content_type, body, len(body), headers) + + + +# Blueforce Field OS — Filo Paneli (merkez web paneli) + +Operatörün ofis tarayıcısından filoyu gördüğü yüzey: **hangi cihaz kuruldu, +hangi yayılım dalgasında ve sıradaki tek iş ne**. Cihaz başına operatör arayüzü +`sudo bf` (tkinter konsolu, `bfos/`) ile aynı filoyu iki uçtan anlatır; iki yüzey +tek durum sözlüğünü paylaşır (`docs/DESIGN.md`). + +## Neden yalnız Python standart kütüphanesi + +Filo çevrimdışı kurulur ve paketler commit'lenmiş havuzdan gelir; `fastapi`, +`uvicorn`, `flask`, `jinja2` bu havuzda **yok**. Panel bunları import etse +yönettiği cihazlara kurulamaz (bkz. `PRODUCT.md`, "Stack"; karar kullanıcıyla +birlikte alındı). Bu yüzden: `http.server` + `string.Template`, harici CDN veya +webfont yok, tüm varlıklar yerel. + +## Çalıştırma + +```bash +# 1) Hiçbir şey vermeden: 127.0.0.1:8787, etiketli DEMO VERİ, salt-okunur +python3 -m web.server +# (python3 web/server.py de aynı şekilde çalışır) + +# 2) Gerçek envanter dosyasıyla +python3 -m web.server --data /var/lib/blueforce/inventory/fleet.json + +# 3) Sunucuyu başlatmadan veri kaynağını denetle (CI/operatör kontrolü) +python3 -m web.server --check --data ./web/data/fleet.json + +# 4) Tam yetki (bu sürümde yazma uç noktası yoktur; yalnız arayüz farkı) +python3 -m web.server --privilege full +``` + +Seçenekler: `--host` (varsayılan `127.0.0.1`), `--port` (varsayılan `8787`), +`--data`, `--privilege {read-only,full}`, `--check`, `--version`. +Panel varsayılan olarak **yalnız yerel arayüze** bağlanır. + +## Uç noktalar (hepsi okuma) + +| Yol | Ne döner | +|---|---| +| `/` (veya `/filo`) | İlk ekran: başlık bandı, durum özeti, cihaz listesi, seçili cihaz ayrıntısı | +| `/?q=&durum=&dalga=&hazir_degil=1&cihaz=` | Aynı ekran, sunucu tarafında filtrelenmiş (JavaScript yok) | +| `/hakkinda` | Panelin sürümü, veri kaynağı, durum sözlüğü, dalgalar, kanallar ve panel kuralları | +| `/static/tokens.css`, `/static/app.css` | Yerel stil dosyaları (allow-list; listeye eklenmeyen dosya 404) | + +`GET` ve `HEAD` dışındaki yöntemler **405** ile ve Türkçe gerekçeyle reddedilir. +Hiçbir uç nokta komut çalıştırmaz, dosya yazmaz veya cihazda değişiklik yapmaz. + +## Veri sözleşmesi (`schema_version: 1`) + +```json +{ + "schema_version": 1, + "generated_at": "2026-09-16T09:30:00+03:00", + "devices": [ + { + "dealer_id": "12010193", + "wave": "P1", + "state": "READY", + "last_seen": "2026-09-16T09:05:00+03:00", + "channels": { + "ssh_over_wg": {"status": "verified", "checked_at": "2026-09-14T10:00:00+03:00"}, + "xrdp": "pending", + "rustdesk": "verified", + "meshcentral": "verified" + } + } + ] +} +``` + +- `dealer_id`: 8 hane (`^[0-9]{8}$`). Cihaz kimliği ve hostname **türetilir**: + `BF-` / `bf-` (`docs/02`). Dosyada `device_id`/`hostname` de varsa + yalnız kurala uyduğunda kabul edilir. +- `wave`: `LAB`, `P1`, `P2`, `W1`, `W2`, `PROD` (Ansible grup adları da kabul: + `lab`, `pilot_1`, `wave_1`, `production`). +- `state`: `PROVISIONED_OFFLINE`, `ENROLLED`, `READY`, `FAILED`, `ABSENT` + (Türkçe kelimeler de kabul: `KURULDU`, `KAYITLI`, `HAZIR`, `HATA`, `YOK`). +- `channels`: dört kanal (`ssh_over_wg`, `xrdp`, `rustdesk`, `meshcentral`), + durum `verified` / `pending` / `failed` / `unknown` / `missing`. +- Örnek dosya: `web/data/fleet.example.json`. + +## Panelin uyguladığı kurallar (fail-closed) + +1. **HAZIR kapısı:** `READY` iddiası dört kanal da `verified` olmadan reddedilir; + cihaz `HATA` olarak ve gerekçesiyle gösterilir (`docs/27`). Panel bir iddiayı + uyarıya yumuşatmaz. +2. **Başarısız kanal:** denetimi başarısız (`failed`) bir kanal varsa cihaz + `HATA` sayılır — cihaz bir insan bekliyor demektir. +3. **Yükseltme yok:** panel hiçbir cihazın durumunu ilerletmez; `KAYITLI`yı + kendiliğinden `HAZIR` yapmaz. +4. **Geçersiz kayıt görünür:** kimliği kurulamayan kayıt (hatalı bayi no, + yinelenen bayi no, bilinmeyen dalga) sessizce düşürülmez; sayfada + "Geçersiz kayıtlar" altında nedeniyle listelenir. +5. **Bozuk veri demo veriye dönüşmez:** `--data`/`BF_FLEET_DATA` ile verilen + dosya yoksa, JSON değilse veya şema sürümü desteklenmiyorsa panel `VERİ YOK` + der; uydurmaz. + +## Test + +```bash +python3 tests/test_web_static.py -v # statik + sözleşme testleri (port açmaz) +bash tests/run-all.sh # depo genelindeki tüm testler +``` + +Testler HTTP yüzeyini `web/panel.py:route()` (saf fonksiyon) üzerinden kapsar; +bu yüzden hiçbir test gerçek port bağlamaz, tarayıcı açmaz. + + + +"""Server-rendered pages for the central Blueforce panel (Python stdlib only). + +Rendering happens on the server through ``string.Template`` from the standard +library. No template engine is imported: ``jinja2`` is not installable on an +air-gapped fleet (PRODUCT.md, "Stack"). Every page is plain HTML; the palette +lives in the local stylesheets and this module never writes a colour, a webfont +or a URL into the markup -- ``tests/test_web_static.py`` enforces that. + +Layout contract (docs/DESIGN.md, FIRST VIEWPORT): the dark header band carries +the product name, the target identity and the privilege level on the right; then +the data-source banner, the summary strip with the one large figure, the fleet +list (a state badge per row, non-ready first, filter bar, selected row in the +accent-soft fill) and the selected device's detail region with the channel +verification list. + +Colour is never the only carrier of meaning: every badge carries its Turkish +word, so the page survives greyscale. +""" + +from __future__ import annotations + +import html +from dataclasses import dataclass +from pathlib import Path +from string import Template +from urllib.parse import urlencode +from typing import Any, Mapping, Sequence + +from . import PANEL_NAME, PANEL_SURFACE, PANEL_VERSION +from . import fleet_data +from .fleet_data import ( + CHANNELS, + CHANNEL_STATUS_WORDS, + STATE_VOCABULARY, + WAVES, + Device, + FleetFilter, + FleetSnapshot, + Wave, +) + +TEMPLATES_DIR = Path(__file__).resolve().parent / "templates" +STATIC_DIR = Path(__file__).resolve().parent / "static" + +FLEET_PATH = "/" +ABOUT_PATH = "/hakkinda" + +# Short Turkish note per state, for the quiet part of the summary strip. The +# long meaning lives on the about page and in the badge tooltip. +STATE_SHORT_NOTES: dict[str, str] = { + "KURULDU": "kuruldu, kayıt bekliyor", + "KAYITLI": "kanallar eksik", + "HAZIR": "sevk edilebilir", + "HATA": "bir insan gerekiyor", + "YOK": "hiç görülmedi", +} + +# The panel's own rules, shown to the operator instead of being a comment. +PANEL_RULES: tuple[str, ...] = ( + "Panel yalnız okuma yapar: hiçbir uç nokta komut çalıştırmaz, dosya yazmaz ve cihazda değişiklik yapmaz.", + "Dış kaynak yok: yazı tipi, CDN veya internet erişimi kullanılmaz; stil dosyaları yereldir (air-gapped filo).", + "Durum uydurulmaz: «HAZIR» iddiası dört kanal doğrulanmadıkça reddedilir ve cihaz HATA olur (docs/27).", + "Kanal denetimi başarısız olduysa cihaz HATA sayılır: cihaz bir insan bekliyor demektir.", + "Panel hiçbir durumu yükseltmez; HAZIR kararı merkezindir (KAYITLI -> HAZIR).", + "Kimliği kurulamayan kayıt sessizce düşürülmez; «Geçersiz kayıtlar» altında nedeniyle görünür (docs/02).", + "Envanter dosyası okunamazsa panel demo veriye düşmez; «VERİ YOK» der ve filo durumunu bilinmiyor olarak bırakır.", +) + +_TEMPLATE_CACHE: dict[str, Template] = {} + + +def template(name: str) -> Template: + """Load and cache one local template by file name.""" + cached = _TEMPLATE_CACHE.get(name) + if cached is None: + cached = Template((TEMPLATES_DIR / name).read_text(encoding="utf-8")) + _TEMPLATE_CACHE[name] = cached + return cached + + +def render(name: str, **context: Any) -> str: + """Fill one template. A missing placeholder raises instead of rendering empty.""" + return template(name).substitute(**context) + + +def esc(value: Any) -> str: + """Escape anything that reaches the markup; inventory text is operator input.""" + return html.escape(str(value), quote=True) + + +# -------------------------------------------------------------------------- +# Privilege (docs/DESIGN.md "Privilege") +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class Privilege: + """The panel's privilege level: a state on screen, not a buried sentence.""" + + level: str + word: str + reason: str + + @property + def is_read_only(self) -> bool: + return self.level == PRIVILEGE_READ_ONLY_LEVEL + + +PRIVILEGE_READ_ONLY_LEVEL = "read-only" +PRIVILEGE_FULL_LEVEL = "full" + +PRIVILEGES: dict[str, Privilege] = { + PRIVILEGE_READ_ONLY_LEVEL: Privilege( + PRIVILEGE_READ_ONLY_LEVEL, + "Salt-okunur", + "Yazma reddedilir: bu panel yalnız okuma yapar (GET, HEAD).", + ), + PRIVILEGE_FULL_LEVEL: Privilege( + PRIVILEGE_FULL_LEVEL, + "Tam yetki", + "Yazma yetkisi açık, ancak bu sürümde yazma uç noktası uygulanmadı; hiçbir uç nokta cihazda değişiklik yapmaz.", + ), +} + + +def privilege_from_level(level: str) -> Privilege: + try: + return PRIVILEGES[level] + except KeyError: # pragma: no cover - argparse restricts the value + raise ValueError(f"bilinmeyen yetki düzeyi: {level!r}") from None + + +@dataclass(frozen=True) +class ServerInfo: + """Facts about the running panel, for the about/durum page.""" + + host: str + port: int + privilege: Privilege + python_version: str + started_at: str + data_path: str | None = None + + @property + def bind_address(self) -> str: + return f"{self.host}:{self.port}" + + +# -------------------------------------------------------------------------- +# Query (server-side filtering: no JavaScript ships with this panel) +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class PanelQuery: + """The operator's request: a filter, an optional explicit device.""" + + criteria: FleetFilter + device: str = "" + warnings: tuple[str, ...] = () + + @classmethod + def parse(cls, params: Mapping[str, Any]) -> "PanelQuery": + criteria, warnings = fleet_data.parse_filter(params) + device = fleet_data.first_param(params, "cihaz") or fleet_data.first_param(params, "device") + return cls(criteria=criteria, device=device, warnings=warnings) + + @property + def has_filter(self) -> bool: + return self.criteria.is_active + + def _params(self, device: str | None) -> dict[str, str]: + params: dict[str, str] = {} + if self.criteria.query: + params["q"] = self.criteria.query + if self.criteria.state: + params["durum"] = self.criteria.state + if self.criteria.wave: + params["dalga"] = self.criteria.wave + if self.criteria.only_not_ready: + params["hazir_degil"] = "1" + if device: + params["cihaz"] = device + return params + + def href(self, path: str = FLEET_PATH, *, device: str | None = None) -> str: + """Link that keeps the current filter, optionally selecting a device.""" + query = urlencode(self._params(device)) + return f"{path}?{query}" if query else path + + @property + def reload_href(self) -> str: + """The primary action: re-read the inventory, keep the filter.""" + return self.href(FLEET_PATH) + + +# -------------------------------------------------------------------------- +# Fragments +# -------------------------------------------------------------------------- + + +def _route_link(href: str) -> str: + return esc(href) + + +def _summary(snapshot: FleetSnapshot, shown: Sequence[Device]) -> dict[str, str]: + counts = fleet_data.state_counts(shown) + ready = counts["HAZIR"] + cells = "".join( + render( + "summary_cell.html", + count=str(counts[spec.word]), + word=spec.word, + note=STATE_SHORT_NOTES[spec.word], + ) + for spec in STATE_VOCABULARY + ) + return { + "lead_figure": str(ready), + "lead_label": "HAZIR — tek sevk edilebilir durum", + "lead_note": ( + f"Gösterilen {len(shown)} cihaz içinde: hazır {ready}, hazır değil " + f"{len(shown) - ready}." + ), + "summary_cells": cells, + } + + +def _device_rows(shown: Sequence[Device], selected_id: str, query: PanelQuery) -> str: + rows: list[str] = [] + for device in shown: + is_selected = device.device_id == selected_id + rows.append( + render( + "device_row.html", + row_selected_class=" fleet-row--selected" if is_selected else "", + row_selected_attr=' aria-current="true"' if is_selected else "", + state_token_suffix=device.state_token_suffix, + state_meaning=esc(f"{device.state_label}: {device.state_meaning}"), + state_label=esc(device.state_label), + device_id=esc(device.device_id), + hostname=esc(device.hostname), + wave_code=esc(device.wave_code), + wave_label=esc(device.wave_label), + wave_name=esc(device.wave.label), + last_seen_text=esc(device.last_seen_text), + select_href=esc(query.href(FLEET_PATH, device=device.device_id)), + ) + ) + return "\n".join(rows) + + +def _channel_rows(device: Device) -> str: + rows: list[str] = [] + for check in device.channels: + rows.append( + render( + "channel_row.html", + label=esc(check.label), + tone=check.tone, + status_word=esc(check.status_word), + checked_at_text=esc(check.checked_at_text), + hint=esc(check.hint), + ) + ) + return "\n".join(rows) + + +def _detail( + snapshot: FleetSnapshot, + shown: Sequence[Device], + selection: Device | None, + query: PanelQuery, + case: str, +) -> str: + if case == "unknown": + return render( + "detail_unknown.html", + device_id=esc(query.device), + reset_href=esc(FLEET_PATH), + ) + if case == "empty" or selection is None: + if snapshot.total == 0: + empty = ( + "Envanterde cihaz kaydı yok. Veri kaynağı sayfanın üstünde ve " + "«Hakkında ve durum» sayfasında yazılı." + ) + else: + empty = ( + "Bu filtreye uyan cihaz yok · uygulanan filtre: " + f"{esc(query.criteria.description)}." + ) + return render("detail_empty.html", empty_text=empty) + + if snapshot.is_demo: + record_source = "sentetik demo kaydı (gerçek cihaz değil)" + elif snapshot.source_path: + record_source = f"envanter dosyası: {esc(snapshot.source_path)}" + else: + record_source = "envanter dosyası" + + selection_note_block = "" + if selection not in shown: + selection_note_block = render( + "selection_note.html", + text=( + "Seçili cihaz geçerli filtreye uymuyor; ayrıntısı yine de " + "gösteriliyor." + ), + ) + + reason_block = "" + if selection.reason: + reason = selection.reason + if selection.claimed_state: + reason += f" Bildirilen durum: {selection.claimed_state}." + reason_block = render("reason_block.html", text=esc(reason)) + + note_block = "" + if selection.note: + note_block = render("note_block.html", text=esc(selection.note)) + + notes_block = "" + if selection.notes: + items = "\n".join( + render("notes_item.html", text=esc(note)) for note in selection.notes + ) + notes_block = render("notes_list.html", items=items) + + return render( + "detail.html", + state_token_suffix=selection.state_token_suffix, + state_meaning=esc(f"{selection.state_label}: {selection.state_meaning}"), + state_label=esc(selection.state_label), + selection_note_block=selection_note_block, + reason_block=reason_block, + note_block=note_block, + notes_block=notes_block, + device_id=esc(selection.device_id), + hostname=esc(selection.hostname), + dealer_id=esc(selection.dealer_id), + wave_code=esc(selection.wave_code), + wave_label=esc(selection.wave_label), + wave_name=esc(selection.wave.label), + wave_target=str(selection.wave.target), + last_seen_text=esc(selection.last_seen_text), + record_source=record_source, + ready_gate_note=esc(selection.ready_gate_note), + channel_rows=_channel_rows(selection), + channel_count_note=( + f"Doğrulanan kanal: {selection.verified_channel_count}/{len(CHANNELS)}. " + "HAZIR yalnız dördü de «doğrulandı» olduğunda verilir (docs/27)." + ), + ) + + +def _filter_bar(snapshot: FleetSnapshot, shown: Sequence[Device], query: PanelQuery) -> str: + state_options = [render("option.html", value="", selected="", label="Tüm durumlar")] + for spec in STATE_VOCABULARY: + state_options.append( + render( + "option.html", + value=esc(spec.state), + selected=' selected' if query.criteria.state == spec.state else "", + label=esc(f"{spec.word} — {STATE_SHORT_NOTES[spec.word]}"), + ) + ) + wave_options = [render("option.html", value="", selected="", label="Tüm dalgalar")] + for wave in WAVES: + wave_options.append( + render( + "option.html", + value=esc(wave.code), + selected=' selected' if query.criteria.wave == wave.code else "", + label=esc(f"{wave.full_label} — hedef {wave.target} cihaz"), + ) + ) + return render( + "filter_bar.html", + form_action=FLEET_PATH, + query=esc(query.criteria.query), + state_options="\n".join(state_options), + wave_options="\n".join(wave_options), + only_not_ready_checked=' checked' if query.criteria.only_not_ready else "", + reset_href=esc(FLEET_PATH), + shown_count=str(len(shown)), + total_count=str(snapshot.total), + filter_description=esc(query.criteria.description), + ) + + +def _wave_strip(snapshot: FleetSnapshot) -> str: + counts = fleet_data.wave_counts(snapshot.devices) + items = " · ".join( + render( + "wave_item.html", + code=esc(wave.code), + count=str(counts[wave.code]), + target=str(wave.target), + ) + for wave in WAVES + ) + return render("wave_strip.html", wave_items=items) + + +def _warnings_block(warnings: Sequence[str]) -> str: + if not warnings: + return "" + items = "\n".join(render("warning_item.html", text=esc(text)) for text in warnings) + return render("warnings.html", warning_items=items) + + +def _invalid_block(snapshot: FleetSnapshot) -> str: + if not snapshot.invalid: + return "" + items = "\n".join( + render("invalid_item.html", record_ref=esc(record.record_ref), reason=esc(record.reason)) + for record in snapshot.invalid + ) + return render( + "invalid_block.html", + invalid_count=str(len(snapshot.invalid)), + invalid_items=items, + ) + + +def _empty_note(snapshot: FleetSnapshot, shown: Sequence[Device], query: PanelQuery) -> str: + if shown: + return "" + if snapshot.total == 0: + return render( + "empty_note.html", + text="Envanterde gösterilecek cihaz yok.", + ) + return render( + "empty_note.html", + text=f"Bu filtreye uyan cihaz yok · uygulanan filtre: {esc(query.criteria.description)}.", + ) + + +# -------------------------------------------------------------------------- +# Selections +# -------------------------------------------------------------------------- + + +def resolve_selection( + snapshot: FleetSnapshot, shown: Sequence[Device], query: PanelQuery +) -> tuple[Device | None, str]: + """-> (device, case) with case in ``selected`` / ``unknown`` / ``empty``. + + No explicit device means the first row of the list is the selection, so the + first viewport is never half empty; an explicit id the inventory does not + know is reported as ``unknown`` rather than invented. + """ + if query.device: + wanted = fleet_data.fold(query.device) + for device in snapshot.devices: + if wanted in ( + fleet_data.fold(device.device_id), + fleet_data.fold(device.hostname), + device.dealer_id, + ): + return device, "selected" + return None, "unknown" + if shown: + return shown[0], "selected" + return None, "empty" + + +def target_identity( + snapshot: FleetSnapshot, + shown: Sequence[Device], + selection: Device | None, + query: PanelQuery, +) -> str: + """The header band's target identity: what this page is about.""" + if query.device: + if selection is not None: + return f"{selection.device_id} · {selection.hostname}" + return f"{query.device} (envanterde yok)" + if query.criteria.wave: + wave: Wave = fleet_data.WAVE_BY_CODE[query.criteria.wave] + return f"Dalga {wave.full_label} · hedef {wave.target} cihaz" + if query.criteria.state: + spec = fleet_data.STATE_BY_NAME[query.criteria.state] + return f"Durum {spec.word} · gösterilen {len(shown)} cihaz" + if query.criteria.is_active: + return f"Filtre · gösterilen {len(shown)} / {snapshot.total} cihaz" + return f"Tüm filo · {snapshot.total} cihaz" + + +# -------------------------------------------------------------------------- +# Shell +# -------------------------------------------------------------------------- + + +def _shell( + *, + page_title: str, + content: str, + snapshot: FleetSnapshot, + privilege: Privilege, + server_info: ServerInfo, + target: str, + nav_section: str, + primary_href: str, +) -> str: + footer_source = f"Veri kaynağı: {snapshot.source_label}" + footer_meta = ( + f"{PANEL_SURFACE} {PANEL_VERSION} · veri yüklemesi: {snapshot.loaded_at} · " + f"yetki: {privilege.word} · Python {server_info.python_version}" + ) + return render( + "base.html", + page_title=esc(page_title), + panel_name=esc(PANEL_NAME), + panel_surface=esc(PANEL_SURFACE), + target_identity=esc(target), + privilege_level=privilege.level, + privilege_word=esc(privilege.word), + privilege_reason=esc(privilege.reason), + primary_action=render("primary_action.html", href=esc(primary_href)), + gated_action=render("gated_action.html", reason=esc(privilege.reason)), + nav_fleet_attr=' aria-current="page"' if nav_section == "fleet" else "", + nav_about_attr=' aria-current="page"' if nav_section == "about" else "", + content=content, + footer_source=esc(footer_source), + footer_meta=esc(footer_meta), + ) + + +# -------------------------------------------------------------------------- +# Pages +# -------------------------------------------------------------------------- + + +def render_fleet_page( + snapshot: FleetSnapshot, + params: Mapping[str, Any] | None = None, + *, + privilege: Privilege | None = None, + server_info: ServerInfo | None = None, +) -> str: + """The first screen: which devices are installed, and in which wave.""" + query = PanelQuery.parse(params or {}) + shown = fleet_data.sort_devices( + fleet_data.filter_devices(snapshot.devices, query.criteria) + ) + selection, case = resolve_selection(snapshot, shown, query) + selected_id = selection.device_id if selection is not None and selection in shown else "" + + summary = _summary(snapshot, shown) + content = render( + "fleet.html", + data_banner_tone=snapshot.banner_tone, + data_banner_word=esc(snapshot.banner_word), + data_banner_text=esc(snapshot.banner_text), + warnings_block=_warnings_block(query.warnings), + list_count_text=f"{len(shown)} / {snapshot.total} cihaz", + filter_bar=_filter_bar(snapshot, shown, query), + wave_strip=_wave_strip(snapshot), + invalid_block=_invalid_block(snapshot), + device_rows=_device_rows(shown, selected_id, query), + empty_note=_empty_note(snapshot, shown, query), + device_detail=_detail(snapshot, shown, selection, query, case), + **summary, + ) + return _shell( + page_title=f"{PANEL_NAME} — {PANEL_SURFACE} · Filo", + content=content, + snapshot=snapshot, + privilege=privilege or PRIVILEGES[PRIVILEGE_READ_ONLY_LEVEL], + server_info=server_info or _fallback_server_info(privilege), + target=target_identity(snapshot, shown, selection, query), + nav_section="fleet", + primary_href=query.reload_href, + ) + + +def render_about_page( + snapshot: FleetSnapshot, + *, + privilege: Privilege | None = None, + server_info: ServerInfo | None = None, +) -> str: + """The panel's own facts: version, data source and the rules it applies.""" + privilege = privilege or PRIVILEGES[PRIVILEGE_READ_ONLY_LEVEL] + server_info = server_info or _fallback_server_info(privilege) + + vocabulary_rows = "\n".join( + render( + "about_vocabulary_row.html", + state_token_suffix=spec.token_suffix, + word=esc(spec.word), + token=esc(spec.token), + meaning=esc(spec.meaning), + ) + for spec in STATE_VOCABULARY + ) + counts = fleet_data.wave_counts(snapshot.devices) + wave_rows = "\n".join( + render( + "about_wave_row.html", + code=esc(wave.code), + label=esc(wave.label), + target=str(wave.target), + in_panel=str(counts[wave.code]), + ) + for wave in WAVES + ) + channel_rows = "\n".join( + render( + "about_channel_row.html", + label=esc(spec.label), + key=esc(spec.key), + hint=esc(spec.hint), + ) + for spec in CHANNELS + ) + rule_items = "\n".join(render("rule_item.html", text=esc(rule)) for rule in PANEL_RULES) + + content = render( + "about.html", + panel_name=esc(PANEL_NAME), + panel_surface=esc(PANEL_SURFACE), + panel_version=esc(PANEL_VERSION), + python_version=esc(server_info.python_version), + bind_address=esc(server_info.bind_address), + privilege_level=privilege.level, + privilege_word=esc(privilege.word), + privilege_reason=esc(privilege.reason), + started_at=esc(server_info.started_at), + data_banner_tone=snapshot.banner_tone, + data_banner_word=esc(snapshot.banner_word), + data_banner_text=esc(snapshot.banner_text), + source_kind_word=esc(snapshot.source_kind_word), + source_path_text=esc(snapshot.source_path or "kullanılmadı (demo veri)"), + schema_version_text=esc(str(snapshot.schema_version) if snapshot.schema_version else "yok"), + generated_at_text=esc(snapshot.generated_at or "bildirilmemiş"), + loaded_at=esc(snapshot.loaded_at), + total_text=str(snapshot.total), + ready_text=f"{snapshot.ready_count} hazır · {snapshot.not_ready_count} hazır değil", + invalid_count_text=str(len(snapshot.invalid)), + error_text=esc(snapshot.error or "yok"), + vocabulary_rows=vocabulary_rows, + wave_rows=wave_rows, + channel_rows=channel_rows, + rule_items=rule_items, + ) + return _shell( + page_title=f"{PANEL_NAME} — {PANEL_SURFACE} · Hakkında ve durum", + content=content, + snapshot=snapshot, + privilege=privilege, + server_info=server_info, + target=f"Panel · sürüm {PANEL_VERSION}", + nav_section="about", + primary_href=ABOUT_PATH, + ) + + +def render_refused_page( + method: str, + *, + snapshot: FleetSnapshot, + privilege: Privilege, + server_info: ServerInfo, +) -> str: + content = render( + "refused_body.html", + method=esc(method), + privilege_word=esc(privilege.word), + ) + return _shell( + page_title=f"{PANEL_NAME} — Yöntem reddedildi", + content=content, + snapshot=snapshot, + privilege=privilege, + server_info=server_info, + target=f"Reddedilen istek · {method}", + nav_section="", + primary_href=FLEET_PATH, + ) + + +def render_not_found_page( + request_path: str, + *, + snapshot: FleetSnapshot, + privilege: Privilege, + server_info: ServerInfo, +) -> str: + content = render("not_found_body.html", request_path=esc(request_path)) + return _shell( + page_title=f"{PANEL_NAME} — Sayfa yok", + content=content, + snapshot=snapshot, + privilege=privilege, + server_info=server_info, + target=f"Tanımsız adres · {request_path}", + nav_section="", + primary_href=FLEET_PATH, + ) + + +def _fallback_server_info(privilege: Privilege | None) -> ServerInfo: + """Used when a page is rendered outside the server (tests, --check).""" + import sys + + level = privilege.level if privilege is not None else PRIVILEGE_READ_ONLY_LEVEL + return ServerInfo( + host="127.0.0.1", + port=0, + privilege=PRIVILEGES[level], + python_version=f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}", + started_at=fleet_data.timestamp_now(), + ) + + + +#!/usr/bin/env python3 +"""HTTP glue and command line for the central Blueforce panel (stdlib only). + + python3 -m web.server # loopback, demo data, read-only + python3 -m web.server --data ./fleet.json # a real inventory document + python3 -m web.server --port 9100 --privilege full + python3 -m web.server --check # verify the data source, no bind + +``http.server`` is the whole server: ``fastapi``/``uvicorn``/``flask`` are not in +the committed offline package pool, so the panel cannot ship with them +(PRODUCT.md, "Stack"). The routing itself lives in ``web/panel.py`` and is a pure +function, which is why the test suite can cover every endpoint without binding a +port. +""" + +from __future__ import annotations + +import argparse +import http.server +import sys +from pathlib import Path +from typing import Sequence + +try: # `python3 -m web.server` + from . import ( + DEFAULT_HOST, + DEFAULT_PORT, + PANEL_NAME, + PANEL_SURFACE, + PANEL_TITLE, + PANEL_VERSION, + ) + from . import fleet_data, render + from .panel import PanelContext, Response, route +except ImportError: # `python3 web/server.py` + sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + from web import ( # type: ignore[no-redef] + DEFAULT_HOST, + DEFAULT_PORT, + PANEL_NAME, + PANEL_SURFACE, + PANEL_TITLE, + PANEL_VERSION, + ) + from web import fleet_data, render # type: ignore[no-redef] + from web.panel import PanelContext, Response, route # type: ignore[no-redef] + +__all__ = [ + "PanelRequestHandler", + "build_context", + "main", + "make_server", + "parse_args", +] + + +class PanelRequestHandler(http.server.BaseHTTPRequestHandler): + """One handler for every method: the panel answers, it never acts. + + Only the two read methods can produce a page; everything else is refused by + ``route`` with 405 and the connection is closed, so a write request cannot + leave half-read state behind. + """ + + server_version = f"BlueforcePanel/{PANEL_VERSION}" + protocol_version = "HTTP/1.1" + + def do_GET(self) -> None: # noqa: N802 - stdlib naming + self._respond("GET") + + def do_HEAD(self) -> None: # noqa: N802 - stdlib naming + self._respond("HEAD") + + def do_POST(self) -> None: # noqa: N802 - stdlib naming + self._respond("POST") + + def do_PUT(self) -> None: # noqa: N802 - stdlib naming + self._respond("PUT") + + def do_PATCH(self) -> None: # noqa: N802 - stdlib naming + self._respond("PATCH") + + def do_DELETE(self) -> None: # noqa: N802 - stdlib naming + self._respond("DELETE") + + def do_OPTIONS(self) -> None: # noqa: N802 - stdlib naming + self._respond("OPTIONS") + + def do_TRACE(self) -> None: # noqa: N802 - stdlib naming + self._respond("TRACE") + + # -- internals --------------------------------------------------------- + + def _respond(self, method: str) -> None: + context: PanelContext = self.server.context # type: ignore[attr-defined] + response: Response = route(context, method, self.path) + self.send_response(response.status) + self.send_header("Content-Type", response.content_type) + for name, value in response.headers: + self.send_header(name, value) + self.send_header("Content-Length", str(response.content_length)) + self.end_headers() + if method != "HEAD" and response.body: + self.wfile.write(response.body) + if method not in ("GET", "HEAD"): + self.close_connection = True + + def log_message(self, format: str, *args: object) -> None: # noqa: A002 + sys.stderr.write("[panel] %s %s\n" % (self.address_string(), format % args)) + + +def make_server(context: PanelContext, host: str, port: int) -> http.server.ThreadingHTTPServer: + """Bind the panel. Threaded so a slow page never blocks the operator.""" + server = http.server.ThreadingHTTPServer((host, port), PanelRequestHandler) + server.context = context # type: ignore[attr-defined] + return server + + +def build_context(args: argparse.Namespace) -> PanelContext: + """Load the inventory and describe the running panel.""" + snapshot = fleet_data.load_fleet(args.data) + privilege = render.privilege_from_level(args.privilege) + server_info = render.ServerInfo( + host=args.host, + port=args.port, + privilege=privilege, + python_version=f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}", + started_at=fleet_data.timestamp_now(), + data_path=args.data, + ) + return PanelContext(snapshot=snapshot, privilege=privilege, server_info=server_info) + + +def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser( + prog="web/server.py", + description=f"{PANEL_TITLE} — filo yönetim paneli (yalnız okuma).", + ) + parser.add_argument( + "--host", + default=DEFAULT_HOST, + help=f"Dinlenecek adres (varsayılan {DEFAULT_HOST}: yalnız yerel arayüz).", + ) + parser.add_argument( + "--port", + type=int, + default=DEFAULT_PORT, + help=f"Dinlenecek port (varsayılan {DEFAULT_PORT}).", + ) + parser.add_argument( + "--data", + default=None, + help=( + "Filo envanteri JSON dosyası. Verilmezse ve varsayılan konum boşsa " + "etiketli demo veri gösterilir; verilir de okunamazsa panel demo veriye " + "düşmez, «VERİ YOK» der." + ), + ) + parser.add_argument( + "--privilege", + choices=(render.PRIVILEGE_READ_ONLY_LEVEL, render.PRIVILEGE_FULL_LEVEL), + default=render.PRIVILEGE_READ_ONLY_LEVEL, + help="Yetki düzeyi: salt-okunur (varsayılan) ya da tam yetki.", + ) + parser.add_argument( + "--check", + action="store_true", + help="Sunucuyu başlatmadan veri kaynağını denetle ve Türkçe durum yazıp çık.", + ) + parser.add_argument( + "--version", + action="version", + version=f"{PANEL_TITLE} {PANEL_VERSION}", + ) + return parser.parse_args(argv) + + +def _print_status(context: PanelContext) -> None: + snapshot = context.snapshot + print(f"{PANEL_NAME} — {PANEL_SURFACE} {PANEL_VERSION}") + print(f"Veri kaynağı : {snapshot.source_label}") + print(f"Veri durumu : {snapshot.banner_word} — {snapshot.banner_text}") + print( + f"Cihazlar : {snapshot.total} cihaz · hazır {snapshot.ready_count} · " + f"hazır değil {snapshot.not_ready_count} · geçersiz kayıt {len(snapshot.invalid)}" + ) + print(f"Yetki : {context.privilege.word} — {context.privilege.reason}") + print(f"Adres : {context.server_info.bind_address} (yalnız okuma, yerel arayüz)") + + +def main(argv: Sequence[str] | None = None) -> int: + args = parse_args(argv) + context = build_context(args) + _print_status(context) + + if args.check: + print("Denetim tamam; sunucu başlatılmadı (--check).") + return 0 + + server = make_server(context, args.host, args.port) + print("Durdurmak için Ctrl+C.") + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nPanel durduruldu.") + finally: + server.server_close() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) + + + +#!/usr/bin/env bash +# +# creds.sh — shared helpers for the Blueforce credential tooling (admin/bf-creds). +# +# Contract +# * No helper here ever writes a secret to stdout, stderr, or a log file. +# Secrets travel through files only: root-owned, mode 0600, inside a mode +# 0700 directory. Callers capture generated values with `$( ... )` (which +# never prints) and must never echo, printf, export, or log them. +# * Lookup helpers are read-only. Only the `bf_write_secret_file` / +# `bf_deliver_secret` helpers touch the filesystem, and only at the target +# the caller names explicitly. +# * A WireGuard *private key is never read* by this library: only its path is +# ever reported. The same rule applies to every other private key material. +# * This library does not change the remote-access decision recorded in +# docs/06-USERS-SSH-AND-PERMISSIONS.md: OpenSSH password authentication +# stays disabled (`PasswordAuthentication no`) and the `blueforce` +# maintenance account stays locked. bf-creds is an optional *local* +# delivery helper: it never edits sshd_config, never unlocks an account, +# and never opens a password login path. See the header of admin/bf-creds +# and the "admin/" section of README.md. +# +# Usage: sourced by admin/bf-creds. Not meant to be executed on its own. +# +set -euo pipefail + +# Executing the library directly would silently do nothing useful; say so. +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + printf 'creds.sh is a library: source it (see admin/bf-creds).\n' >&2 + exit 2 +fi + +if [[ -n "${BF_CREDS_LIB_LOADED:-}" ]]; then + return 0 +fi +BF_CREDS_LIB_LOADED=1 + +# --------------------------------------------------------------------------- # +# Locations. Every path is overridable so tests can point the helpers at a +# sandbox and so a site can relocate the credential record deliberately. +# --------------------------------------------------------------------------- # +: "${BF_STATE_FILE:=/var/lib/blueforce/state.json}" +: "${BF_WG_DIR:=/etc/wireguard}" +: "${BF_RUSTDESK_ID_FILE:=/var/lib/blueforce/rustdesk-id}" +: "${BF_CREDENTIALS_FILE:=/root/blueforce-credentials.txt}" +: "${BF_SECRETS_SUBDIR:=admin/secrets}" +: "${BF_CREDENTIALS_MODE:=600}" +: "${BF_SECRETS_DIR_MODE:=700}" + +# --------------------------------------------------------------------------- # +# Logging. Messages are always descriptions, never values. +# --------------------------------------------------------------------------- # +bf_log() { printf '[bf-creds] %s\n' "$*" >&2; } +bf_warn() { printf '[bf-creds] WARN: %s\n' "$*" >&2; } +bf_die() { printf '[bf-creds] ERROR: %s\n' "$*" >&2; exit 1; } + +# --------------------------------------------------------------------------- # +# Read-only identity helpers. +# --------------------------------------------------------------------------- # + +# bf_detect_device_id -> prints BF-<8 digits> (BF_DEVICE, then the installer +# state file, then the hostname); prints nothing and returns 1 when unknown. +bf_detect_device_id() { + local id="" + if [[ "${BF_DEVICE:-}" =~ ^BF-[0-9]{8}$ ]]; then + printf '%s' "$BF_DEVICE" + return 0 + fi + if [[ -r "$BF_STATE_FILE" ]] && grep -q 'device_id' "$BF_STATE_FILE" 2>/dev/null; then + id="$(grep -oE 'BF-[0-9]{8}' "$BF_STATE_FILE" 2>/dev/null | head -n 1 || true)" + fi + if [[ -z "$id" ]]; then + id="$(hostname 2>/dev/null | tr '[:lower:]' '[:upper:]' || true)" + fi + if [[ "$id" =~ ^BF-[0-9]{8}$ ]]; then + printf '%s' "$id" + return 0 + fi + return 1 +} + +# bf_dealer_number -> prints the 8-digit dealer number, else nothing. +bf_dealer_number() { + local id="${1:-}" + if [[ "$id" =~ ^BF-([0-9]{8})$ ]]; then + printf '%s' "${BASH_REMATCH[1]}" + return 0 + fi + return 1 +} + +# bf_wireguard_public_key -> prints the public key (safe to display); nothing +# and return 1 when the installer has not created a keypair yet. +bf_wireguard_public_key() { + local f="$BF_WG_DIR/publickey" key="" + if [[ -s "$f" ]]; then + key="$(tr -d '[:space:]' < "$f" 2>/dev/null || true)" + fi + if [[ -n "$key" ]]; then + printf '%s' "$key" + return 0 + fi + return 1 +} + +# bf_wireguard_private_key_path -> prints the PATH of the private key only. +# The contents are never opened: only the file's existence is checked. +bf_wireguard_private_key_path() { + local f="$BF_WG_DIR/privatekey" + if [[ -e "$f" ]]; then + printf '%s' "$f" + return 0 + fi + return 1 +} + +# bf_rustdesk_id -> prints the RustDesk peer ID recorded by module 09-rustdesk. +bf_rustdesk_id() { + local f="$BF_RUSTDESK_ID_FILE" id="" + if [[ -s "$f" ]]; then + id="$(tr -d '[:space:]' < "$f" 2>/dev/null || true)" + fi + if [[ "$id" =~ ^[0-9]+$ ]]; then + printf '%s' "$id" + return 0 + fi + return 1 +} + +# --------------------------------------------------------------------------- # +# Secret generation and file handling. +# --------------------------------------------------------------------------- # + +# bf_generate_secret -> prints a fresh random secret on stdout (openssl, then +# /dev/urandom as a fallback). Capturing the result with `$( ... )` never +# prints it; the value must reach a mode-0600 file and nothing else. It is +# deliberately never passed through argv or a command line. +bf_generate_secret() { + local secret="" + if command -v openssl >/dev/null 2>&1; then + secret="$(openssl rand -base64 24 2>/dev/null | tr -d '\n' || true)" + fi + if [[ -z "$secret" ]] && [[ -r /dev/urandom ]] && command -v base64 >/dev/null 2>&1; then + secret="$(head -c 32 /dev/urandom 2>/dev/null | base64 | tr -d '\n' || true)" + fi + if [[ -z "$secret" ]]; then + return 1 + fi + printf '%s' "$secret" +} + +# bf_file_mode -> prints the octal mode (Linux stat). +bf_file_mode() { stat -c '%a' "$1" 2>/dev/null || true; } + +# bf_has_generated_password -> 0 when the record carries a password line. +bf_has_generated_password() { + local f="${1:-}" + if [[ -s "$f" ]] && grep -qE '^local_administrator_password:[[:space:]]*[^[:space:]]+' "$f"; then + return 0 + fi + return 1 +} + +# bf_write_secret_file (stdin: entire file body) +# Writes stdin to atomically, forces mode 0600 on the file and 0700 on +# the parent directory, and verifies the result. Never echoes the body. +bf_write_secret_file() { + local dest="${1:-}" tmp="" + if [[ -z "$dest" ]]; then + bf_warn 'bf_write_secret_file: destination required' + return 1 + fi + if [[ -L "$dest" ]]; then + bf_warn "refusing to write through a symlink: $dest" + return 1 + fi + tmp="$(mktemp "${TMPDIR:-/tmp}/bf-creds.XXXXXX" 2>/dev/null || true)" + if [[ -z "$tmp" ]]; then + bf_warn 'cannot create a temporary staging file' + return 1 + fi + chmod 600 "$tmp" || { rm -f "$tmp"; return 1; } + if ! cat > "$tmp"; then + rm -f "$tmp" + bf_warn 'cannot stage the credential body' + return 1 + fi + if ! install -d -m "$BF_SECRETS_DIR_MODE" -- "$(dirname "$dest")"; then + rm -f "$tmp" + bf_warn "cannot create the credential directory: $(dirname "$dest")" + return 1 + fi + if ! install -m "$BF_CREDENTIALS_MODE" -- "$tmp" "$dest"; then + rm -f "$tmp" + bf_warn "cannot write the credential file: $dest" + return 1 + fi + rm -f "$tmp" + if [[ "$(bf_file_mode "$dest")" != "$BF_CREDENTIALS_MODE" ]]; then + bf_warn "credential file mode is not $BF_CREDENTIALS_MODE: $dest" + return 1 + fi + return 0 +} + +# --------------------------------------------------------------------------- # +# Delivery. +# --------------------------------------------------------------------------- # + +# bf_secrets_target_path -> destination path. +bf_secrets_target_path() { + local repo_root="${1:-}" dealer="${2:-}" + if [[ -z "$repo_root" || -z "$dealer" ]]; then + return 1 + fi + printf '%s/%s/%s.txt' "$repo_root" "$BF_SECRETS_SUBDIR" "$dealer" +} + +# bf_deliver_secret +# Copies a credential file to the delivery target: directory mode 0700, file +# mode 0600. Prints nothing; the caller reports the path only. +bf_deliver_secret() { + local src="${1:-}" dest="${2:-}" + if [[ ! -s "$src" ]]; then + bf_warn "credential file is missing or empty: $src" + return 1 + fi + if [[ -z "$dest" ]]; then + bf_warn 'bf_deliver_secret: destination required' + return 1 + fi + if [[ -L "$dest" ]]; then + bf_warn "refusing to write through a symlink: $dest" + return 1 + fi + if ! install -d -m "$BF_SECRETS_DIR_MODE" -- "$(dirname "$dest")"; then + bf_warn "cannot create the delivery directory: $(dirname "$dest")" + return 1 + fi + if ! install -m "$BF_CREDENTIALS_MODE" -- "$src" "$dest"; then + bf_warn "cannot deliver the credential file to: $dest" + return 1 + fi + if [[ "$(bf_file_mode "$dest")" != "$BF_CREDENTIALS_MODE" ]]; then + bf_warn "delivered file mode is not $BF_CREDENTIALS_MODE: $dest" + return 1 + fi + return 0 +} + + + +#!/usr/bin/env bash +# admin/lib/targets.sh -- device identity, inventory parsing and target selection. +# +# Sourced by admin/bf-menu. Contains no UI rendering and no execution: it answers +# "which hosts does this operation apply to, and which Ansible --limit does that +# become". +# +# Contracts it enforces (sources of truth in parentheses): +# * dealer number matches ^[0-9]{8}$ exactly (docs/02) +# * machine hostname is bf-, human id is BF- (docs/02) +# * waves are lab(2) -> pilot_1(5) -> pilot_2(20) -> wave_1(50) -> wave_2(100) +# -> production, in that order (docs/10) +# * the inventory is the Ansible inventory; no device is ever addressed that is +# not in it (docs/09) +# +# Inputs (set by bf-menu before calling): +# BF_REPO repository root +# BF_INVENTORY resolved inventory path, or empty to trigger auto-discovery +# +# shellcheck shell=bash + +# Canonical wave order. Kept in one place so the menu, the gate checks and the +# fleet-wide loop can never disagree. +BF_WAVES=(lab pilot_1 pilot_2 wave_1 wave_2 production) + +# --------------------------------------------------------------------------- +# Identity helpers +# --------------------------------------------------------------------------- +# BF_DEALER_RE -- the single validation rule for dealer numbers. +BF_DEALER_RE='^[0-9]{8}$' + +bf_dealer_validate() { + [[ "$1" =~ $BF_DEALER_RE ]] +} + +bf_dealer_to_host() { + printf 'bf-%s\n' "$1" +} + +bf_dealer_to_device_id() { + printf 'BF-%s\n' "$1" +} + +# bf_host_to_dealer HOST -> dealer number, empty when the name is not bf-<8 digits>. +bf_host_to_dealer() { + local host="$1" + if [[ "$host" =~ ^bf-([0-9]{8})$ ]]; then + printf '%s\n' "${BASH_REMATCH[1]}" + return 0 + fi + return 1 +} + +# bf_is_wave NAME -- true for the six approved wave groups (docs/10). +bf_is_wave() { + local name="$1" wave + for wave in "${BF_WAVES[@]}"; do + [[ "$name" == "$wave" ]] && return 0 + done + return 1 +} + +bf_waves_csv() { + local IFS=, + printf '%s\n' "${BF_WAVES[*]}" +} + +# --------------------------------------------------------------------------- +# Inventory discovery and parsing +# --------------------------------------------------------------------------- +# bf_inventory_candidates -- every path we are willing to read, best first. +# hosts.example.yml is listed last on purpose: it is a template with example +# device IDs, so it is only usable after an explicit acknowledgement. +bf_inventory_candidates() { + local dir="${BF_REPO:-.}/ansible/inventory" + if [[ -n "${BF_INVENTORY:-}" ]]; then + printf '%s\n' "$BF_INVENTORY" + return 0 + fi + printf '%s\n' \ + "$dir/hosts.yml" \ + "$dir/hosts.yaml" \ + "$dir/hosts" \ + "$dir/hosts.ini" +} + +# bf_inventory_resolve -- pick the inventory file. Prints the path on success. +# Prints a remediation message to stderr and returns 1 when nothing is usable. +bf_inventory_resolve() { + local candidate example="${BF_REPO:-.}/ansible/inventory/hosts.example.yml" + if [[ -n "${BF_INVENTORY:-}" ]]; then + if [[ -r "$BF_INVENTORY" ]]; then + printf '%s\n' "$BF_INVENTORY" + return 0 + fi + tui_error "Inventory not readable: $BF_INVENTORY" + tui_note "Pass a real path with --inventory PATH or unset it to auto-discover." >&2 + return 1 + fi + while IFS= read -r candidate; do + [[ -n "$candidate" ]] || continue + if [[ -r "$candidate" ]]; then + printf '%s\n' "$candidate" + return 0 + fi + done < <(bf_inventory_candidates) + + tui_error "No Ansible inventory found under ${BF_REPO:-.}/ansible/inventory/." + # These remediation lines go to stderr on purpose: the resolver's stdout is + # captured as the resolved path by the caller. + if [[ -r "$example" ]]; then + tui_note "Only the example inventory exists: $example" >&2 + tui_note "It carries example device IDs (bf-1201xxxx) and must not be used against real devices." >&2 + tui_note "Create the real inventory first:" >&2 + tui_note " cp $example ${BF_REPO:-.}/ansible/inventory/hosts.yml" >&2 + tui_note " \$EDITOR ${BF_REPO:-.}/ansible/inventory/hosts.yml" >&2 + else + tui_note "Create ansible/inventory/hosts.yml with your bf-<8-digit dealer> hosts (docs/02, docs/09)." >&2 + fi + return 1 +} + +# bf_inventory_pairs FILE -- "grouphost" for every host in the inventory. +# A deliberately small YAML reader: the inventory is a nested map of +# all.children..children..hosts.. It tracks indentation +# instead of pulling in a YAML parser (none is guaranteed on a field console). +bf_inventory_pairs() { + local inv="$1" + [[ -r "$inv" ]] || return 1 + awk ' + function trim(s) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", s); return s } + function unquote(s) { gsub(/^["\x27]|["\x27]$/, "", s); return s } + { + line = $0 + if (line ~ /^[[:space:]]*#/) next + if (line ~ /^[[:space:]]*$/) next + if (line ~ /^[[:space:]]*-/) next + if (line !~ /:/) next + + match(line, /^ */); ind = RLENGTH + key = line; sub(/^[[:space:]]*/, "", key); sub(/:.*$/, "", key) + key = unquote(trim(key)) + val = line; sub(/^[^:]*:/, "", val); val = trim(val) + if (key == "") next + + while (depth > 0 && sind[depth] >= ind) depth-- + + # A "hosts:" block owns the nearest enclosing group key. + if (key == "hosts" && val == "") { + h_active = 1; h_ind = ind; h_step = 0 + h_grp = (depth > 0) ? skey[depth] : "" + skey[++depth] = key; sind[depth] = ind + next + } + # Anything at or above the "hosts:" indentation ends that block. + if (h_active && ind <= h_ind) h_active = 0 + + if (h_active && ind > h_ind) { + if (h_step == 0) h_step = ind + if (ind == h_step) { + print h_grp "\t" key + skey[++depth] = key; sind[depth] = ind + next + } + } + if (val == "") { skey[++depth] = key; sind[depth] = ind } + } + ' "$inv" +} + +# Reads the inventory and caches the pairs; repeated calls are cheap and the +# cache is invalidated by BF_INVENTORY_CACHE_FILE going away. +bf_inventory_cache() { + local inv="${BF_INVENTORY:-}" + [[ -n "$inv" ]] || return 1 + if [[ -z "${BF_INVENTORY_CACHE_FILE:-}" ]]; then + BF_INVENTORY_CACHE_FILE="$(mktemp "${TMPDIR:-/tmp}/bf-inventory.XXXXXX")" + export BF_INVENTORY_CACHE_FILE + fi + if [[ ! -s "$BF_INVENTORY_CACHE_FILE" ]]; then + bf_inventory_pairs "$inv" >"$BF_INVENTORY_CACHE_FILE" || return 1 + fi + return 0 +} + +bf_inventory_groups() { + bf_inventory_cache || return 1 + awk -F '\t' 'NF == 2 && !seen[$1]++ { print $1 }' "$BF_INVENTORY_CACHE_FILE" | grep -v '^$' || true +} + +bf_inventory_hosts() { + bf_inventory_cache || return 1 + awk -F '\t' 'NF == 2 && !seen[$2]++ { print $2 }' "$BF_INVENTORY_CACHE_FILE" | grep -v '^$' || true +} + +bf_inventory_hosts_of_group() { + local group="$1" + bf_inventory_cache || return 1 + awk -F '\t' -v g="$group" '$1 == g { print $2 }' "$BF_INVENTORY_CACHE_FILE" +} + +# bf_count_lines -- wc -l without the set -e trap of grep -c returning 1 on zero. +bf_count_lines() { + local n + n="$(printf '%s\n' "$1" | grep -c . || true)" + printf '%s\n' "${n:-0}" +} + +bf_inventory_group_exists() { + local group="$1" + bf_inventory_cache || return 1 + awk -F '\t' -v g="$group" '$1 == g { found = 1; exit } END { exit !found }' "$BF_INVENTORY_CACHE_FILE" +} + +bf_inventory_host_exists() { + local host="$1" + bf_inventory_cache || return 1 + awk -F '\t' -v h="$host" '$2 == h { found = 1; exit } END { exit !found }' "$BF_INVENTORY_CACHE_FILE" +} + +bf_inventory_count_all() { + bf_count_lines "$(bf_inventory_hosts || true)" +} + +# bf_inventory_host_wave HOST -- the approved wave that contains HOST. +# Prints nothing and returns 1 when the device sits outside every wave group. +bf_inventory_host_wave() { + local host="$1" wave + bf_inventory_cache || return 1 + for wave in "${BF_WAVES[@]}"; do + bf_inventory_group_exists "$wave" || continue + if bf_inventory_hosts_of_group "$wave" | grep -qx -- "$host"; then + printf '%s\n' "$wave" + return 0 + fi + done + return 1 +} + +# bf_wave_groups_present -- canonical waves that actually exist in the inventory, +# always in rollout order. +bf_wave_groups_present() { + local wave + for wave in "${BF_WAVES[@]}"; do + if bf_inventory_group_exists "$wave"; then + printf '%s\n' "$wave" + fi + done +} + +# --------------------------------------------------------------------------- +# Target selection +# --------------------------------------------------------------------------- +bf_target_reset() { + BF_TARGET_KIND="" + BF_TARGET_LIMIT="" + BF_TARGET_WAVE="" + BF_TARGET_LABEL="" + BF_TARGET_COUNT=0 +} + +bf_target_is_set() { + [[ -n "${BF_TARGET_KIND:-}" && -n "${BF_TARGET_LIMIT:-}" ]] +} + +# bf_target_set_host DEALER [MODE] +# MODE: any|wave|release. Returns 1 (after explaining) when the mode forbids a +# single-device selection or the device is unknown to the inventory. +bf_target_set_host() { + local dealer="$1" mode="${2:-any}" host wave + if ! bf_dealer_validate "$dealer"; then + tui_error "Invalid dealer number '$dealer': it must match ${BF_DEALER_RE} (8 digits, no spaces)." + return 1 + fi + if [[ "$mode" == "release" ]]; then + tui_error "Release-gated operations are wave-scoped (docs/10): select a wave group, not a single device." + return 1 + fi + host="$(bf_dealer_to_host "$dealer")" + if ! bf_inventory_host_exists "$host"; then + tui_error "$host is not in the inventory (${BF_INVENTORY:-unresolved})." + tui_note "Add the device to its wave group first, then retry (see admin/README.md, docs/02)." + return 1 + fi + wave="$(bf_inventory_host_wave "$host" || true)" + if [[ -z "$wave" && "$mode" != "any" ]]; then + tui_error "$host is not inside an approved wave group ($(bf_waves_csv))." + tui_note "Wave-scoped playbooks refuse a device that no wave covers (fail-closed)." + return 1 + fi + BF_TARGET_KIND="host" + BF_TARGET_LIMIT="$host" + BF_TARGET_WAVE="$wave" + BF_TARGET_COUNT=1 + if [[ -n "$wave" ]]; then + BF_TARGET_LABEL="device $(bf_dealer_to_device_id "$dealer") ($host) in wave '$wave'" + else + BF_TARGET_LABEL="device $(bf_dealer_to_device_id "$dealer") ($host)" + fi + return 0 +} + +# bf_target_set_group GROUP [MODE] +bf_target_set_group() { + local group="$1" mode="${2:-any}" count + if [[ "$group" == "all" ]]; then + bf_target_set_all "$mode" + return $? + fi + if ! bf_inventory_group_exists "$group"; then + tui_error "Group '$group' is not in the inventory (${BF_INVENTORY:-unresolved})." + tui_note "Known groups: $(bf_inventory_groups | tr '\n' ' ')" + return 1 + fi + if [[ "$mode" == "wave" || "$mode" == "release" ]] && ! bf_is_wave "$group"; then + tui_error "Group '$group' is not an approved wave; wave-scoped operations need one of: $(bf_waves_csv)." + return 1 + fi + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$group" || true)")" + if [[ "$count" -eq 0 ]]; then + tui_error "Group '$group' contains no hosts; refusing an empty target." + return 1 + fi + BF_TARGET_KIND="group" + BF_TARGET_LIMIT="$group" + BF_TARGET_WAVE="$group" + # shellcheck disable=SC2034 # read by bf-menu (library contract) + BF_TARGET_COUNT="$count" + if bf_is_wave "$group"; then + BF_TARGET_LABEL="wave '$group' ($count device(s))" + else + BF_TARGET_LABEL="group '$group' ($count device(s))" + fi + return 0 +} + +# bf_target_set_all MODE -- the whole fleet. +# For release-gated operations this is refused: the update/reboot playbooks are +# gated wave by wave and a fleet-wide limit would defeat the gate (docs/10). +bf_target_set_all() { + local mode="${1:-any}" count + if [[ "$mode" == "release" ]]; then + tui_error "Fleet-wide scope is refused for release-gated operations: roll out one wave at a time (docs/10)." + return 1 + fi + count="$(bf_inventory_count_all)" + if [[ "$count" -eq 0 ]]; then + tui_error "The inventory lists no hosts; refusing an empty target." + return 1 + fi + BF_TARGET_KIND="all" + BF_TARGET_LIMIT="all" + BF_TARGET_WAVE="" + # shellcheck disable=SC2034 # read by bf-menu (library contract) + BF_TARGET_COUNT="$count" + BF_TARGET_LABEL="all devices in the fleet ($count device(s))" + return 0 +} + +# bf_target_parse WORD MODE -- accept what the operator typed in one prompt: +# an 8-digit dealer number, a group/wave name, or "all". +bf_target_parse() { + local word="$1" mode="${2:-any}" + bf_target_reset + if [[ -z "$word" ]]; then + tui_error "No target given." + return 1 + fi + if [[ "$word" == "all" ]]; then + bf_target_set_all "$mode" + return $? + fi + if bf_dealer_validate "$word"; then + bf_target_set_host "$word" "$mode" + return $? + fi + if bf_inventory_group_exists "$word"; then + bf_target_set_group "$word" "$mode" + return $? + fi + # A bf- hostname is accepted as a convenience. + if [[ "$word" =~ ^bf-[0-9]{8}$ ]]; then + if bf_dealer_validate "${word#bf-}"; then + bf_target_set_host "${word#bf-}" "$mode" + return $? + fi + fi + tui_error "'$word' is not a dealer number (${BF_DEALER_RE}), a group, or 'all'." + tui_note "Known groups: $(bf_inventory_groups | tr '\n' ' ')" + return 1 +} + +# bf_target_describe -- one line for the confirmation screen. +bf_target_describe() { + printf '%s --limit %s%s\n' "${BF_TARGET_LABEL:-unset}" "${BF_TARGET_LIMIT:-unset}" \ + "$([[ -n "${BF_TARGET_WAVE:-}" ]] && printf ' (wave %s)' "$BF_TARGET_WAVE")" +} + +# bf_target_select MODE +# Interactive target picker. MODE: +# any single device, any group, or the whole fleet +# wave single device, approved wave group, or the whole fleet wave by wave +# release approved wave group only +# On success the BF_TARGET_* globals describe the selection. +bf_target_select() { + local mode="${1:-any}" choice word count index group_list=() + bf_target_reset + while true; do + tui_section "Target selection (mode: $mode)" + tui_item 1 "Single device by dealer number" "8 digits, e.g. 12010101" + tui_item 2 "Group / wave" "lab, pilot_1, pilot_2, wave_1, wave_2, production" + if [[ "$mode" == "release" ]]; then + tui_note " all) not offered: release-gated operations run one wave at a time" + else + tui_item 3 "All devices in the fleet" "wave-scoped playbooks ask per wave" + fi + tui_item 9 "Type the target directly" "dealer number, group or 'all'" + tui_footer "Back to the operation" + printf '\n' + if ! tui_read "Target > "; then return 1; fi + choice="$TUI_REPLY" + case "$choice" in + ""|0|q|Q) return 1 ;; + 1) + tui_read "Dealer number (8 digits) > " || return 1 + word="$TUI_REPLY" + bf_target_set_host "$word" "$mode" && return 0 + ;; + 2) + tui_section "Groups in the inventory" + group_list=() + while IFS= read -r group; do + [[ -n "$group" ]] || continue + group_list+=("$group") + done < <(if [[ "$mode" == "any" ]]; then bf_inventory_groups || true; else bf_wave_groups_present || true; fi) + if [[ ${#group_list[@]} -eq 0 ]]; then + tui_error "No usable group in the inventory (${BF_INVENTORY:-unresolved})." + return 1 + fi + index=0 + for group in "${group_list[@]}"; do + index=$((index + 1)) + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$group" || true)")" + if bf_is_wave "$group"; then + tui_item "$index" "$group" "$count device(s), approved wave" + else + tui_item "$index" "$group" "$count device(s)" + fi + done + printf '\n' + tui_note "Approved waves: $(bf_waves_csv) -- source: $(basename "${BF_INVENTORY:-unresolved}")" + if ! tui_read "Group number > "; then return 1; fi + choice="$TUI_REPLY" + if ! tui_menu_index "$choice" "$index"; then + tui_error "Enter a number between 1 and $index." + continue + fi + bf_target_set_group "${group_list[$((choice - 1))]}" "$mode" && return 0 + ;; + 3) + if [[ "$mode" == "release" ]]; then + tui_error "Fleet-wide scope is refused here." + continue + fi + bf_target_set_all "$mode" && return 0 + ;; + 9) + tui_read "Target (dealer number, group or all) > " || return 1 + bf_target_parse "$TUI_REPLY" "$mode" && return 0 + ;; + *) tui_error "Unknown choice '$choice'." ;; + esac + printf '\n' + tui_pause + done +} + + + +#!/usr/bin/env bash +# admin/lib/tui.sh -- terminal UI helpers for the Blueforce operator console. +# +# Sourced by admin/bf-menu. This file contains presentation and input helpers +# only: no fleet logic, no inventory parsing, and no side effects when sourced. +# +# Contract: +# * user-facing output goes to stdout, diagnostics/warnings to stderr, +# * no helper calls exit except tui_die (and it only does so when called), +# * no helper ever prints a secret, and nothing here writes to the log, +# * every helper tolerates `set -u`: optional arguments use ${x:-} defaults. +# +# shellcheck shell=bash + +# --------------------------------------------------------------------------- +# Colors. Disabled automatically when stdout is not a terminal, when NO_COLOR +# is set, or when the caller asks for "never". +# --------------------------------------------------------------------------- +TUI_COLOR_MODE="${TUI_COLOR_MODE:-auto}" + +# shellcheck disable=SC2034 # color variables are consumed by bf-menu +tui_init_colors() { + local want="${1:-$TUI_COLOR_MODE}" + local enable=0 + case "$want" in + always) enable=1 ;; + never) enable=0 ;; + *) + if [[ -t 1 && -z "${NO_COLOR:-}" ]]; then + enable=1 + fi + ;; + esac + if [[ "$enable" -eq 1 ]]; then + C_RESET=$'\033[0m' + C_BOLD=$'\033[1m' + C_DIM=$'\033[2m' + C_RED=$'\033[31m' + C_GREEN=$'\033[32m' + C_YELLOW=$'\033[33m' + C_BLUE=$'\033[34m' + C_MAGENTA=$'\033[35m' + C_CYAN=$'\033[36m' + else + C_RESET="" C_BOLD="" C_DIM="" C_RED="" C_GREEN="" C_YELLOW="" + C_BLUE="" C_MAGENTA="" C_CYAN="" + fi + export C_RESET C_BOLD C_DIM C_RED C_GREEN C_YELLOW C_BLUE C_MAGENTA C_CYAN +} + +# --------------------------------------------------------------------------- +# Layout +# --------------------------------------------------------------------------- +TUI_WIDTH="${TUI_WIDTH:-78}" + +tui_hr() { + local char="${1:--}" + local line + line="$(printf "%*s" "$TUI_WIDTH" "" | tr ' ' "$char")" + printf '%s%s%s\n' "$C_DIM" "$line" "$C_RESET" +} + +# tui_banner TITLE [SUBTITLE] +tui_banner() { + local title="$1" subtitle="${2:-}" + printf '\n' + tui_hr '=' + printf ' %s%s%s\n' "$C_BOLD$C_CYAN" "$title" "$C_RESET" + if [[ -n "$subtitle" ]]; then + printf ' %s%s%s\n' "$C_DIM" "$subtitle" "$C_RESET" + fi + tui_hr '=' + printf '\n' +} + +# tui_screen TITLE [SUBTITLE] +# Clears the terminal first when interactive so one screen fits one page; the +# clear is skipped for non-interactive runs (pipes, tests, logs). +tui_screen() { + if [[ -t 1 && "${TUI_CLEAR:-yes}" == "yes" ]]; then + printf '\033[H\033[2J' + fi + tui_banner "${1:-}" "${2:-}" +} + +# tui_item NUMBER LABEL [DESCRIPTION] +tui_item() { + local number="$1" label="$2" desc="${3:-}" + if [[ -n "$desc" ]]; then + printf ' %s%2s%s) %-46s %s%s%s\n' "$C_BOLD" "$number" "$C_RESET" "$label" "$C_DIM" "$desc" "$C_RESET" + else + printf ' %s%2s%s) %s\n' "$C_BOLD" "$number" "$C_RESET" "$label" + fi +} + +# tui_section LABEL -- visual separator inside a long menu. +tui_section() { + printf '\n %s%s%s\n' "$C_MAGENTA" "${1:-}" "$C_RESET" +} + +# tui_footer [BACK_LABEL] -- every screen ends with back and quit. +tui_footer() { + local back="${1:-Back}" + printf '\n' + tui_hr '-' + printf ' %s%2s%s) %-46s %s%2s%s) %s\n' \ + "$C_BOLD" "0" "$C_RESET" "$back" "$C_BOLD" "q" "$C_RESET" "Quit the console" + tui_hr '-' +} + +# --------------------------------------------------------------------------- +# Input +# --------------------------------------------------------------------------- +# tui_read PROMPT -> TUI_REPLY +# Returns 0 on a line, 1 on EOF (stdin closed / non-interactive); on EOF the +# reply is "q" so the caller's menu loop quits instead of spinning forever. +tui_read() { + local prompt="${1:-} " + TUI_REPLY="" + printf '%s' "$prompt" + if ! IFS= read -r TUI_REPLY; then + TUI_REPLY="q" + printf '\n' + return 1 + fi + # Trim surrounding whitespace so " 2 " is accepted like "2". + TUI_REPLY="${TUI_REPLY#"${TUI_REPLY%%[![:space:]]*}"}" + TUI_REPLY="${TUI_REPLY%"${TUI_REPLY##*[![:space:]]}"}" + return 0 +} + +# tui_prompt LABEL [DEFAULT] -> TUI_REPLY +tui_prompt() { + local label="$1" default="${2:-}" suffix="" + if [[ -n "$default" ]]; then + suffix=" [$default]" + fi + tui_read "${label}${suffix}: " || true + if [[ -z "$TUI_REPLY" ]]; then + TUI_REPLY="$default" + fi +} + +# tui_confirm QUESTION [yes|no] -- default is NO: only an explicit y/yes proceeds. +tui_confirm() { + local question="$1" default="${2:-no}" suffix="[y/N]" + [[ "$default" == "yes" ]] && suffix="[Y/n]" + tui_read "${question} ${suffix} " || true + case "${TUI_REPLY,,}" in + y|yes) return 0 ;; + n|no) return 1 ;; + "") + [[ "$default" == "yes" ]] && return 0 + return 1 + ;; + *) return 1 ;; + esac +} + +# tui_confirm_token QUESTION TOKEN -- the operator must type the exact token. +# Used for the highest-risk operations (production waves, fleet-wide runs). +tui_confirm_token() { + local question="$1" token="$2" + tui_warn "$question" + tui_read "$(printf 'Type %s%s%s to confirm (anything else cancels): ' "$C_BOLD" "$token" "$C_RESET")" || true + [[ "$TUI_REPLY" == "$token" ]] +} + +# tui_ask_run QUESTION -> 0 = run, 2 = run with --check, 1 = cancel +tui_ask_run() { + local question="$1" + tui_read "${question} [y=run / c=run with --check / N=cancel] " || true + case "${TUI_REPLY,,}" in + y|yes) return 0 ;; + c|check) return 2 ;; + *) return 1 ;; + esac +} + +# tui_menu_index NUMBER MAX -- true when NUMBER selects an item of the menu. +tui_menu_index() { + local number="$1" max="$2" + [[ "$number" =~ ^[0-9]+$ ]] || return 1 + ((number >= 1 && number <= max)) || return 1 + return 0 +} + +tui_pause() { + local message="${1:-Press Enter to continue}" + if [[ -t 0 ]]; then + tui_read "${C_DIM}${message}${C_RESET}" || true + fi +} + +# --------------------------------------------------------------------------- +# Messages +# --------------------------------------------------------------------------- +tui_msg() { printf '%s\n' "$*"; } +tui_info() { printf '%s[i]%s %s\n' "$C_CYAN" "$C_RESET" "$*"; } +tui_ok() { printf '%s[OK]%s %s\n' "$C_GREEN" "$C_RESET" "$*"; } +tui_warn() { printf '%s[WARN]%s %s\n' "$C_YELLOW" "$C_RESET" "$*" >&2; } +tui_error(){ printf '%s[ERROR]%s %s\n' "$C_RED" "$C_RESET" "$*" >&2; } +tui_note() { printf '%s%s%s\n' "$C_DIM" "$*" "$C_RESET"; } + +# tui_kv KEY VALUE -- aligned key/value line for information screens. +tui_kv() { + printf ' %-24s %s\n' "$1" "$2" +} + +# tui_die MESSAGE [EXIT_CODE] -- last resort: report and exit with a non-zero +# status. Everything user-recoverable should return a status instead. +tui_die() { + local message="$1" code="${2:-1}" + tui_error "$message" + exit "$code" +} + + + +#!/bin/sh +''''command -v python3 >/dev/null 2>&1 || { printf '%s\n' "HATA: python3 bulunamadı. bfos operatör konsolu için Python 3.8 veya üzeri gerekir." "" "Yedek yol (bash): sudo admin/bf-menu ya da kuruluysa: sudo bf-menu" >&2; exit 3; }; exec python3 "$0" "$@" # ''' +"""bfos operator console — thin entry point (sh/Python polyglot). + +The file is valid POSIX shell *and* valid Python: + +* run as ``admin/bf`` (or as the ``bf`` symlink that + ``admin/bf-bootstrap.sh`` creates), the shell line above checks that + ``python3`` exists and, when it does not, prints a Turkish error and points at + the proven bash console (``admin/bf-menu``) — a device without Python is still + operational, +* everything after that line is the Python entry point: it puts the repository + root on ``sys.path`` and calls :func:`bfos.cli.main`. Nothing else lives here; + all logic is in the ``bfos`` package next to it. + +Usage: sudo bfos [--full] [--dry-run] [--check] [--repo YOL] [--version] [--lang tr] +""" + +import os +import sys + +MIN_PYTHON = (3, 8) + +if sys.version_info < MIN_PYTHON: # pragma: no cover - depends on the interpreter + sys.stderr.write( + "HATA: Python sürümü çok eski: {0}. bfos için Python {1}.{2}+ gerekir.\n".format( + sys.version.split()[0], MIN_PYTHON[0], MIN_PYTHON[1] + ) + ) + sys.stderr.write("Yedek yol (bash): sudo admin/bf-menu\n") + raise SystemExit(3) + + +def _repository_root(): + """First candidate directory that actually contains the bfos package.""" + here = os.path.dirname(os.path.realpath(__file__)) + candidates = [ + os.environ.get("BF_REPO", ""), + os.path.dirname(here), # /admin/bf -> + here, + os.getcwd(), + ] + for candidate in candidates: + if candidate and os.path.isfile(os.path.join(candidate, "bfos", "__init__.py")): + return candidate + return "" + + +ROOT = _repository_root() +if not ROOT: + sys.stderr.write( + "HATA: bfos paketi bulunamadı. Konsolu Blueforce deposunun içinden çalıştırın,\n" + "ya da --repo YOL ile depo yolunu belirtin.\n" + "Yedek yol (bash): sudo admin/bf-menu\n" + ) + raise SystemExit(3) + +if ROOT not in sys.path: + sys.path.insert(0, ROOT) + +from bfos.cli import main # noqa: E402 (sys.path is prepared above) + +if __name__ == "__main__": + raise SystemExit(main()) + + + +#!/usr/bin/env bash +# +# bf-creds — optional, default-OFF credential generation and local delivery. +# +# Scope (deliberate, decided with the operator) +# * DEFAULT BEHAVIOUR: nothing is generated. Unless `--generate` (or +# BF_GENERATE_CREDENTIALS=1) is given, no password is created and the +# command says so explicitly. +# * With `--generate`: a device credential record is written to +# /root/blueforce-credentials.txt with mode 0600. It carries the device +# identity (BF-), the hostname, the creation time, the WireGuard +# PUBLIC key plus the private key PATH (never its contents), the RustDesk +# ID when the installer recorded one, and a freshly generated local +# administrator password. +# * With `--fetch`: the record is copied to +# /admin/secrets/.txt (directory 0700, file 0600). +# That path is git-ignored; it must never be committed. +# * Secrets are written to files only. No password is ever printed to +# stdout/stderr, written to a log, or passed through argv — so it cannot +# land in the shell history or the process list. +# +# What this tool does NOT do +# Remote access stays exactly as the installer left it: OpenSSH password +# authentication stays disabled (`PasswordAuthentication no`, +# docs/06-USERS-SSH-AND-PERMISSIONS.md, docs/11-SECURITY-HARDENING.md) and +# the `blueforce` maintenance account stays locked. bf-creds never edits +# sshd_config, never unlocks an account, and never enables a password login +# path; it is only an optional *local* delivery helper. See README.md +# ("admin/" section). +# +# Usage: sudo bf-creds [--generate] [--fetch] [--repo DIR] [--dealer-id N] [--help] +# +set -euo pipefail + +SELF="${BASH_SOURCE[0]:-}" +SELF_REAL="$(readlink -f "$SELF" 2>/dev/null || printf '%s' "$SELF")" +SCRIPT_DIR="$(cd "$(dirname "$SELF_REAL")" && pwd)" +# shellcheck source=lib/creds.sh +source "$SCRIPT_DIR/lib/creds.sh" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +GENERATE=0 +FETCH=0 +REPO_OVERRIDE="" +DEALER_OVERRIDE="" + +usage() { + cat <<'EOF' +Usage: sudo bf-creds [--generate] [--fetch] [--repo DIR] [--dealer-id NNNNNNNN] [--help] + +Report the device identity and the secrets that already exist on this host, and +optionally generate a local credential record and deliver it into the repository +checkout. + +Options: + --generate Create the credential record (default path: + /root/blueforce-credentials.txt, mode 0600). Without this + flag NO password is generated and the command says so. + --fetch Copy the credential record to /admin/secrets/.txt + (directory 0700, file 0600, git-ignored). + --repo DIR Repository root used as the --fetch destination + (default: the checkout this tool lives in). + --dealer-id N Eight-digit dealer number. Default: detected from the device + identity (installer state file, then the hostname). + --help, -h Show this help and exit. + +Environment: + BF_GENERATE_CREDENTIALS=1 Same as --generate (still opt-in; the default is off). + BF_CREDENTIALS_FILE=PATH Override the credential record path. + BF_WG_DIR=PATH Override the WireGuard directory. + BF_STATE_FILE=PATH Override the installer state file. + BF_RUSTDESK_ID_FILE=PATH Override the recorded RustDesk ID file. + +Guarantees: + * The generated password is written to the record file only. It is never + printed, never logged, and never placed on a command line. + * The WireGuard private key is never read: only its path is reported. + * Remote access is not changed: SSH password authentication stays disabled + and the `blueforce` account stays locked. +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --generate) GENERATE=1; shift ;; + --fetch) FETCH=1; shift ;; + --repo) REPO_OVERRIDE="${2:?missing value for --repo}"; shift 2 ;; + --dealer-id) DEALER_OVERRIDE="${2:?missing value for --dealer-id}"; shift 2 ;; + --help|-h) usage; exit 0 ;; + *) printf 'ERROR: unknown argument: %s\n\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +if [[ "${BF_GENERATE_CREDENTIALS:-0}" == "1" ]]; then + GENERATE=1 +fi +if [[ -n "$DEALER_OVERRIDE" ]] && [[ ! "$DEALER_OVERRIDE" =~ ^[0-9]{8}$ ]]; then + printf 'ERROR: --dealer-id must be exactly 8 digits\n' >&2 + exit 2 +fi +if [[ -n "$REPO_OVERRIDE" ]]; then + if [[ ! -d "$REPO_OVERRIDE" ]]; then + printf 'ERROR: --repo must name an existing directory: %s\n' "$REPO_OVERRIDE" >&2 + exit 2 + fi + REPO_ROOT="$(cd "$REPO_OVERRIDE" && pwd)" +fi + +resolve_dealer_number() { + local id="" + if [[ -n "$DEALER_OVERRIDE" ]]; then + printf '%s' "$DEALER_OVERRIDE" + return 0 + fi + id="$(bf_detect_device_id || true)" + bf_dealer_number "$id" +} + +print_report() { + local id="" dealer="" host="" wg_pub="" wg_path="" rustdesk="" + id="$(bf_detect_device_id || true)" + dealer="$(resolve_dealer_number || true)" + host="$(hostname 2>/dev/null || echo unknown)" + printf 'device\n' + printf ' device_id : %s\n' "${id:-unknown}" + printf ' dealer_number : %s\n' "${dealer:-unknown}" + printf ' hostname : %s\n' "$host" + printf 'wireguard\n' + if wg_pub="$(bf_wireguard_public_key)"; then + printf ' public_key : %s\n' "$wg_pub" + else + printf ' public_key : not present\n' + fi + if wg_path="$(bf_wireguard_private_key_path)"; then + printf ' private_key_path : %s (contents are never read or recorded)\n' "$wg_path" + else + printf ' private_key_path : not present\n' + fi + printf 'rustdesk\n' + if rustdesk="$(bf_rustdesk_id)"; then + printf ' id : %s\n' "$rustdesk" + else + printf ' id : not present\n' + fi + printf 'credential record\n' + printf ' path : %s\n' "$BF_CREDENTIALS_FILE" + if [[ -f "$BF_CREDENTIALS_FILE" ]]; then + printf ' present : yes (mode %s)\n' "$(bf_file_mode "$BF_CREDENTIALS_FILE")" + if bf_has_generated_password "$BF_CREDENTIALS_FILE"; then + printf ' administrator password recorded : yes (the value lives only in the file)\n' + else + printf ' administrator password recorded : no\n' + fi + else + printf ' present : no\n' + fi +} + +# credentials_body (stdout = the record file body) +# The only caller pipes this straight into bf_write_secret_file; the body is +# never printed anywhere else. +credentials_body() { + local ts="$1" password="$2" + local id="" dealer="" host="" wg_pub="" wg_path="" rustdesk="" + id="$(bf_detect_device_id || true)" + dealer="$(resolve_dealer_number || true)" + host="$(hostname 2>/dev/null || echo unknown)" + wg_pub="$(bf_wireguard_public_key || true)" + wg_path="$(bf_wireguard_private_key_path || true)" + rustdesk="$(bf_rustdesk_id || true)" + cat </${BF_SECRETS_SUBDIR}/.txt +# That path is git-ignored and must never be committed. +# +# Remote access is NOT changed by this tool: OpenSSH password authentication +# stays disabled (PasswordAuthentication no) and the blueforce maintenance +# account stays locked. See docs/06-USERS-SSH-AND-PERMISSIONS.md. + +device_id: ${id:-unknown} +dealer_number: ${dealer:-unknown} +hostname: ${host} +generated_at: ${ts} +generator: bf-creds + +[wireguard] +public_key: ${wg_pub:-not-present} +private_key_path: ${wg_path:-not-present} +private_key: NOT RECORDED (the WireGuard private key never leaves the device) + +[rustdesk] +id: ${rustdesk:-not-present} + +[generated] +local_administrator_password: ${password} +note: recorded for delivery only; bf-creds does not apply this password to any + account, does not edit sshd_config, and does not open a password login path. + Applying it stays a deliberate operator action on the device console. +EOF +} + +print_report + +if [[ "$GENERATE" -eq 1 ]]; then + generated_at="$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo unknown)" + password="$(bf_generate_secret)" || bf_die 'cannot generate a random secret (openssl and /dev/urandom are both unavailable)' + if ! credentials_body "$generated_at" "$password" | bf_write_secret_file "$BF_CREDENTIALS_FILE"; then + bf_die "could not write the credential record: $BF_CREDENTIALS_FILE" + fi + unset password + printf '\ncredential record written : %s (mode 600)\n' "$BF_CREDENTIALS_FILE" + printf ' the generated local administrator password exists in that file only;\n' + printf ' bf-creds does not apply it to an account, does not enable SSH password\n' + printf ' login, and leaves the blueforce account locked.\n' +else + printf '\ncredential generation : DISABLED (this is the default)\n' + printf ' no password was generated. Re-run with --generate (or BF_GENERATE_CREDENTIALS=1)\n' + printf ' to create %s.\n' "$BF_CREDENTIALS_FILE" +fi + +if [[ "$FETCH" -eq 1 ]]; then + if [[ ! -s "$BF_CREDENTIALS_FILE" ]]; then + bf_die "--fetch needs an existing credential record: $BF_CREDENTIALS_FILE (run --generate first)" + fi + dealer="$(resolve_dealer_number || true)" + if [[ -z "$dealer" ]]; then + bf_die 'cannot determine the dealer number; pass --dealer-id <8 digits> (fail-closed: the delivery file name depends on it)' + fi + destination="$(bf_secrets_target_path "$REPO_ROOT" "$dealer")" || bf_die 'cannot build the delivery path' + if ! bf_deliver_secret "$BF_CREDENTIALS_FILE" "$destination"; then + bf_die "could not deliver the credential record to: $destination" + fi + printf '\ncredential record delivered : %s (mode 600, directory 700, git-ignored)\n' "$destination" +fi + + + +#!/usr/bin/env bash +# +# bf-menu -- numbered operator console for the Blueforce fleet. +# +# One entry point for two very different jobs: +# * category 1 installs THIS device locally, on the machine you are sitting at +# * categories 2 and 5 drive the fleet through the existing Ansible playbooks +# with an explicit --limit and never invent a new playbook +# +# Safety rules this console is built around: +# * every command is printed before it runs and must be confirmed, +# * destructive operations ask a second, explicit question, +# * wave-gated playbooks are never handed a gate flag silently: the operator +# has to confirm the gate (and type "production" for the production wave), +# * the audit log is mode 600 and never receives a secret: only the sanitized +# command, its exit status and the target are recorded (raw playbook output +# is shown on screen but never written to the log), +# * a missing Ansible, inventory or playbook produces an explanation, never a +# silent fallback to "something similar". +# +# Usage: admin/bf-menu [options] (see --help) +# +set -euo pipefail + +BF_MENU_VERSION="1.0.0" +BF_MENU_NAME="admin/bf-menu" +DEFAULT_LOG_FILE="/var/log/blueforce-console.log" +INSTALLER_REL="scripts/install/blueforce-install.sh" +PLAYBOOK_DIR_REL="ansible/playbooks" + +# --------------------------------------------------------------------------- +# Globals (set by argument parsing / discovery) +# --------------------------------------------------------------------------- +BF_REPO="${BF_REPO:-}" +BF_INVENTORY="${BF_INVENTORY:-}" +BF_LOG_FILE="${BF_CONSOLE_LOG:-$DEFAULT_LOG_FILE}" +BF_LOG_READY=0 +BF_DRY_RUN=0 +BF_INVENTORY_CACHE_FILE="" +BF_CMD=() +BF_EXTRA=() +BF_LAST_RC=0 + +# --------------------------------------------------------------------------- +# Usage +# --------------------------------------------------------------------------- +bf_usage() { + cat <&2; exit 2; }; BF_REPO="$2"; shift 2 ;; + --inventory) [[ $# -ge 2 ]] || { printf 'ERROR: --inventory needs a path\n' >&2; exit 2; }; BF_INVENTORY="$2"; shift 2 ;; + --log-file) [[ $# -ge 2 ]] || { printf 'ERROR: --log-file needs a path\n' >&2; exit 2; }; BF_LOG_FILE="$2"; shift 2 ;; + --dry-run) BF_DRY_RUN=1; shift ;; + --no-color) TUI_COLOR_MODE=never; shift ;; + --list) BF_LIST=1; shift ;; + --list-targets) BF_LIST_TARGETS=1; shift ;; + *) printf 'ERROR: unknown argument: %s\n' "$1" >&2; bf_usage >&2; exit 2 ;; + esac + done +} +BF_LIST=0 +BF_LIST_TARGETS=0 + +# --------------------------------------------------------------------------- +# Repository discovery +# --------------------------------------------------------------------------- +bf_resolve_repo() { + local self self_real self_dir + if [[ -z "$BF_REPO" ]]; then + # bf-bootstrap.sh links this script into a bin directory, so the path we + # were invoked through is usually a symlink: resolve it before deriving + # the repository root. + self="${BASH_SOURCE[0]}" + self_real="$(readlink -f -- "$self" 2>/dev/null || printf '%s' "$self")" + self_dir="$(cd "$(dirname "$self_real")" && pwd)" + BF_REPO="$(cd "$self_dir/.." && pwd)" + fi + if [[ ! -d "$BF_REPO/ansible" || ! -d "$BF_REPO/scripts" ]]; then + printf 'ERROR: %s does not look like the Blueforce repository (no ansible/ and scripts/).\n' "$BF_REPO" >&2 + printf ' Clone it and run the console from the checkout, or pass --repo PATH.\n' >&2 + exit 2 + fi + if [[ ! -r "$BF_REPO/admin/lib/tui.sh" || ! -r "$BF_REPO/admin/lib/targets.sh" ]]; then + printf 'ERROR: %s/admin/lib/tui.sh or targets.sh is missing.\n' "$BF_REPO" >&2 + printf ' The console needs its libraries next to it (admin/lib/).\n' >&2 + exit 2 + fi + export BF_REPO +} + +# --------------------------------------------------------------------------- +# Audit log: mode 600, sanitized, never a secret +# --------------------------------------------------------------------------- +# bf_log_sanitize -- single choke point before anything reaches the log file. +bf_log_sanitize() { + sed -E \ + -e 's/((password|passwd|passphrase|secret|token|api[_-]?key|private[_-]?key|preshared[_-]?key|psk|credential)[A-Za-z0-9_.-]*[[:space:]]*[=:])[^[:space:]]+/\1/Ig' \ + -e 's/(BEGIN [A-Z ]*PRIVATE KEY).*/\1 /g' +} + +bf_log() { + local level="$1"; shift + [[ "$BF_LOG_READY" -eq 1 ]] || return 0 + printf '%s [%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$level" "$(printf '%s' "$*" | bf_log_sanitize)" >>"$BF_LOG_FILE" +} + +# bf_log_init -- keep the log at mode 600 or refuse to log into an insecure +# path. Falls back to a per-user state directory when /var/log is not writable. +bf_log_init() { + local fallback_dir candidate + fallback_dir="${XDG_STATE_HOME:-$HOME/.local/state}/blueforce" + for candidate in "$BF_LOG_FILE" "$fallback_dir/blueforce-console.log"; do + [[ -n "$candidate" ]] || continue + if [[ -e "$candidate" ]]; then + [[ -w "$candidate" ]] || continue + else + mkdir -p "$(dirname "$candidate")" 2>/dev/null || continue + [[ -w "$(dirname "$candidate")" ]] || continue + fi + if [[ -e "$candidate" ]]; then + chmod 600 "$candidate" 2>/dev/null || continue + else + ( umask 077; : >"$candidate" ) 2>/dev/null || continue + chmod 600 "$candidate" 2>/dev/null || continue + fi + BF_LOG_FILE="$candidate" + BF_LOG_READY=1 + if [[ "$candidate" != "${BF_LOG_REQUESTED:-$DEFAULT_LOG_FILE}" ]]; then + printf '[WARN] %s is not writable; logging to %s instead (mode 600).\n' \ + "${BF_LOG_REQUESTED:-$DEFAULT_LOG_FILE}" "$candidate" >&2 + fi + return 0 + done + BF_LOG_READY=0 + printf '[WARN] no writable audit log found; this session will not be logged.\n' >&2 + return 0 +} + +bf_cleanup() { + if [[ -n "$BF_INVENTORY_CACHE_FILE" && -f "$BF_INVENTORY_CACHE_FILE" ]]; then + rm -f "$BF_INVENTORY_CACHE_FILE" + fi +} + +bf_quit() { + local code="${1:-0}" + tui_note "Leaving the Blueforce console." + exit "$code" +} + +# --------------------------------------------------------------------------- +# Runtime checks with explanations instead of guesses +# --------------------------------------------------------------------------- +bf_have_ansible() { + command -v ansible-playbook >/dev/null 2>&1 +} + +bf_require_ansible() { + if bf_have_ansible; then + return 0 + fi + tui_error "ansible-playbook was not found on this machine; fleet operations cannot run." + tui_note "The console does not emulate Ansible: it drives the repository's playbooks (docs/09)." + tui_note "Install it on the admin machine, e.g.:" + tui_note " sudo apt install ansible # or: pipx install ansible-core" + return 1 +} + +bf_require_inventory() { + local resolved + # stdout carries the resolved path, stderr carries the explanation: never + # merge them, or an error message would end up inside the path. + if resolved="$(bf_inventory_resolve)"; then + BF_INVENTORY="$resolved" + export BF_INVENTORY + return 0 + fi + return 1 +} + +bf_require_root() { + if [[ "$(id -u)" -eq 0 ]]; then + return 0 + fi + tui_error "This operation needs root on THIS device." + tui_note "Re-run the console with sudo: sudo $BF_MENU_NAME" + return 1 +} + +# bf_tool_path NAME -> preferred path of a diagnostics/maintenance tool. +# A tool installed under /usr/local/bin wins (that is the canonical Field OS +# location); otherwise the copy in this checkout is used. +bf_tool_path() { + local name="$1" + local sys="/usr/local/bin/$name" + local repo="$BF_REPO/scripts/diagnostics/$name" + local maint="$BF_REPO/scripts/maintenance/$name" + if [[ -x "$sys" ]]; then printf '%s\n' "$sys"; return 0; fi + if [[ -x "$repo" ]]; then printf '%s\n' "$repo"; return 0; fi + if [[ -x "$maint" ]]; then printf '%s\n' "$maint"; return 0; fi + return 1 +} + +bf_installer_path() { + local p="$BF_REPO/$INSTALLER_REL" + [[ -f "$p" ]] && printf '%s\n' "$p" +} + +# --------------------------------------------------------------------------- +# Execution +# --------------------------------------------------------------------------- +# bf_cmd_string -- the command as a copy/pasteable shell line. +bf_cmd_string() { + printf '%q ' "${BF_CMD[@]}" +} + +# bf_exec -- run BF_CMD (or print it under --dry-run). Sets BF_LAST_RC. +bf_exec() { + local printable rc=0 + printable="$(bf_cmd_string)" + printf '\n' + tui_section "Command" + printf ' %s\n\n' "$printable" + if [[ "$BF_DRY_RUN" -eq 1 ]]; then + tui_warn "dry-run: the command above was NOT executed." + bf_log "DRYRUN" "$printable" + BF_LAST_RC=0 + return 0 + fi + bf_log "RUN" "$printable" + set +e + "${BF_CMD[@]}" + rc=$? + set -e + BF_LAST_RC="$rc" + if [[ "$rc" -eq 0 ]]; then + tui_ok "Command finished successfully (exit 0)." + bf_log "OK" "exit=0 :: $printable" + else + tui_error "Command failed with exit $rc." + bf_log "FAIL" "exit=$rc :: $printable" + fi + return 0 +} + +# bf_confirm_and_exec LABEL DESTRUCTIVE +# Shows the command, asks for confirmation, then runs it. Returns 0 when the +# command was executed (including a confirmed --check run), 1 when cancelled. +bf_confirm_and_exec() { + local label="$1" destructive="${2:-no}" answer=0 + if [[ "$BF_DRY_RUN" -eq 1 ]]; then + bf_exec + return 0 + fi + if [[ "$destructive" == "yes" ]]; then + tui_warn "State-changing operation: $label" + tui_warn "Read the command above before confirming; it changes the selected target(s)." + tui_ask_run "Proceed? " || answer=$? + else + tui_ask_run "Run this command?" || answer=$? + fi + case "$answer" in + 0) : ;; + 2) + BF_CMD+=(--check) + tui_info "check mode: the command runs with --check and applies no change." + ;; + *) + tui_info "Cancelled; nothing was run." + bf_log "CANCEL" "aborted by operator :: $(bf_cmd_string)" + return 1 + ;; + esac + bf_exec + return 0 +} + +# --------------------------------------------------------------------------- +# Operation catalogue +# --------------------------------------------------------------------------- +# Fields: id|label|playbook|scope|destructive|prompt|description +# scope simple | wave | release (cross-checked against the playbook) +# destructive yes|no (second confirmation) +# prompt none | packages | service | script | grace | disk_pct | +# log_lines | expected_version +BF_OPS_REPORT=( + "ping|Ping / reachability|bf-ping.yml|simple|no|none|SSH reachability check (read-only)" + "uptime|Uptime|bf-uptime.yml|simple|no|none|Uptime and load (read-only)" + "disk|Disk usage|bf-disk-check.yml|simple|no|disk_pct|Disk usage, warns above a threshold" + "docker|Docker status|bf-docker-status.yml|simple|no|none|Docker daemon and containers (read-only)" + "packages|Package versions|bf-package-check.yml|simple|no|none|Installed versions of pinned packages" + "security-updates|Pending security updates|bf-security-updates-check.yml|simple|no|none|Report only, never installs" + "provisioning-status|Provisioning phase report|bf-provisioning-status.yml|wave|no|none|state.json phase per device" + "enrollment-status|Enrollment + central evidence|bf-enrollment-status.yml|wave|no|none|ENROLLED/READY claims vs central proof" + "fieldos-version|Field OS version report|bf-fieldos-version.yml|wave|no|expected_version|Version per device, optional drift check" + "remote-channels|Remote access channels|bf-remote-channels-check.yml|wave|no|none|SSH/xRDP/RustDesk/WireGuard readiness" + "offline-ready|Offline readiness report|bf-offline-ready-check.yml|wave|no|none|Local preconditions for offline provisioning" +) + +BF_OPS_MAINTENANCE=( + "rdp-restart|Restart RDP|bf-rdp-restart.yml|simple|yes|none|Restart xrdp" + "rustdesk-restart|Restart RustDesk|bf-rustdesk-restart.yml|simple|yes|none|Restart the RustDesk service" + "wireguard-restart|Restart WireGuard|bf-wireguard-restart.yml|simple|yes|none|Restart wg-quick@wg0" + "service-restart|Restart an allowlisted service|bf-service-restart.yml|simple|yes|service|Allowlisted service names only" + "gui-off|GUI off (headless)|bf-gui-off.yml|wave|yes|none|Switch the wave to multi-user.target" + "gui-on|GUI on (maintenance)|bf-gui-on.yml|wave|yes|none|Start the graphical session again" + "collect-logs|Collect logs / support bundle|bf-collect-logs.yml|wave|no|log_lines|Timestamped journal + snapshot bundle" + "run-script|Run an approved script|bf-run-script.yml|wave|yes|script|Only /opt/blueforce/bin and /usr/local/sbin" + "reboot|Controlled reboot|bf-reboot.yml|release|yes|grace|Serial reboots with a health gate" + "deploy-update|Deploy approved package update|bf-deploy-update.yml|release|yes|packages|Pinned package=version, health-gated" +) + +bf_op_field() { + local row="$1" field="$2" + printf '%s' "$row" | awk -F'|' -v n="$field" '{print $n}' +} + +# --------------------------------------------------------------------------- +# Playbook helpers: the playbook file stays the source of truth for its gates +# --------------------------------------------------------------------------- +# bf_playbook_var_present PLAYBOOK VAR -- true when VAR is used outside comments. +bf_playbook_var_present() { + local pb="$1" var="$2" file="$BF_REPO/$PLAYBOOK_DIR_REL/$1" + [[ -r "$file" ]] || return 1 + grep -vE '^[[:space:]]*#' "$file" | grep -qE "\\b${var}\\b" +} + +# bf_playbook_scope PLAYBOOK -> wave|release|simple, derived from the playbook. +bf_playbook_scope() { + local pb="$1" + if bf_playbook_var_present "$pb" release_wave; then + printf 'release\n' + return 0 + fi + if bf_playbook_var_present "$pb" operation_wave; then + printf 'wave\n' + return 0 + fi + printf 'simple\n' +} + +# bf_playbook_check PLAYBOOK DECLARED_SCOPE -- existence plus a metadata +# cross-check, so a console table that drifted from the playbook can never +# silently drop a wave gate. +bf_playbook_check() { + local pb="$1" declared="$2" file="$BF_REPO/$PLAYBOOK_DIR_REL/$1" actual + if [[ ! -r "$file" ]]; then + tui_error "Playbook not found: ansible/playbooks/$pb" + tui_note "Expected at: $file" + tui_note "Set --repo to the repository checkout that contains it." + return 1 + fi + actual="$(bf_playbook_scope "$pb")" + if [[ "$actual" != "$declared" ]]; then + tui_error "Refusing to run $pb: the console expects scope '$declared' but the playbook declares '$actual'." + tui_note "The playbook is the source of truth for its gates; update admin/bf-menu before using it." + return 1 + fi + return 0 +} + +# --------------------------------------------------------------------------- +# Extra -e variables, validated with the same rules the playbooks enforce +# --------------------------------------------------------------------------- +BF_SERVICE_ALLOWLIST=(blueforce-agent docker ssh sshd systemd-journald cron) +BF_SCRIPT_DIRS=(/opt/blueforce/bin /usr/local/sbin) + +bf_prompt_extra() { + local kind="$1" + BF_EXTRA=() + case "$kind" in + none) return 0 ;; + packages) bf_prompt_packages ;; + service) bf_prompt_service ;; + script) bf_prompt_script ;; + grace) bf_prompt_grace ;; + disk_pct) bf_prompt_disk_pct ;; + log_lines) bf_prompt_log_lines ;; + expected_version) bf_prompt_expected_version ;; + *) tui_error "Console bug: unknown prompt kind '$kind'."; return 1 ;; + esac +} + +bf_prompt_packages() { + local pins=() pin array=() + tui_note "Exact pins only: package=version (the playbook refuses ranges, 'latest' and empty lists)." + tui_prompt "Packages (comma separated)" "" || return 1 + if [[ -z "$TUI_REPLY" ]]; then + tui_error "At least one pinned package is required." + return 1 + fi + IFS=',' read -r -a pins <<<"$TUI_REPLY" + for pin in "${pins[@]}"; do + pin="${pin#"${pin%%[![:space:]]*}"}" + pin="${pin%"${pin##*[![:space:]]}"}" + [[ -n "$pin" ]] || continue + if [[ ! "$pin" =~ ^[A-Za-z0-9][A-Za-z0-9+_.:-]*=.+$ ]]; then + tui_error "Invalid pin '$pin': expected package=version (e.g. docker-ce=5:27.0.3-1~ubuntu.24.04~noble)." + return 1 + fi + array+=("\"$pin\"") + done + [[ ${#array[@]} -gt 0 ]] || { tui_error "No usable package pin was given."; return 1; } + BF_EXTRA=(-e "update_packages=[$(IFS=,; printf '%s' "${array[*]}")]") + return 0 +} + +bf_prompt_service() { + local name + tui_note "Allowlist: ${BF_SERVICE_ALLOWLIST[*]}" + tui_prompt "Service name" "" || return 1 + name="$TUI_REPLY" + for allowed in "${BF_SERVICE_ALLOWLIST[@]}"; do + if [[ "$name" == "$allowed" ]]; then + BF_EXTRA=(-e "service_name=$name") + return 0 + fi + done + tui_error "Refusing '$name': not in the service allowlist (the playbook would fail closed anyway)." + return 1 +} + +bf_prompt_script() { + local path args dir ok=0 + tui_note "Allowed directories: ${BF_SCRIPT_DIRS[*]}" + tui_prompt "Script path" "" || return 1 + path="$TUI_REPLY" + if [[ "$path" != /* ]]; then + tui_error "Script path must be absolute." + return 1 + fi + for dir in "${BF_SCRIPT_DIRS[@]}"; do + [[ "$path" == "$dir"/* ]] && ok=1 + done + if [[ "$ok" -ne 1 ]]; then + tui_error "Refusing '$path': outside the approved directories (the playbook would refuse it too)." + return 1 + fi + tui_prompt "Script arguments (optional)" "" || return 1 + args="$TUI_REPLY" + BF_EXTRA=(-e "script_path=$path") + if [[ -n "$args" ]]; then + BF_EXTRA+=(-e "script_args=$args") + fi + return 0 +} + +bf_prompt_grace() { + local seconds + tui_prompt "Reboot grace period in seconds" "300" || return 1 + seconds="$TUI_REPLY" + if [[ ! "$seconds" =~ ^[0-9]+$ || "$seconds" -lt 0 ]]; then + tui_error "Grace period must be a whole number of seconds." + return 1 + fi + BF_EXTRA=(-e "reboot_grace_seconds=$seconds") + return 0 +} + +bf_prompt_disk_pct() { + local pct + tui_prompt "Warn above percent (blank = playbook default 80)" "" || return 1 + pct="$TUI_REPLY" + if [[ -z "$pct" ]]; then + return 0 + fi + if [[ ! "$pct" =~ ^[0-9]+$ || "$pct" -lt 1 || "$pct" -gt 100 ]]; then + tui_error "Threshold must be between 1 and 100." + return 1 + fi + BF_EXTRA=(-e "disk_warn_pct=$pct") + return 0 +} + +bf_prompt_log_lines() { + local lines + tui_prompt "Journal lines per device" "500" || return 1 + lines="$TUI_REPLY" + if [[ ! "$lines" =~ ^[0-9]+$ || "$lines" -lt 1 ]]; then + tui_error "Line count must be a positive whole number." + return 1 + fi + BF_EXTRA=(-e "log_lines=$lines") + return 0 +} + +bf_prompt_expected_version() { + local version + tui_prompt "Expected Field OS version (blank = no drift check)" "" || return 1 + version="$TUI_REPLY" + if [[ -z "$version" ]]; then + return 0 + fi + BF_EXTRA=(-e "fieldos_expected_version=$version") + return 0 +} + +# --------------------------------------------------------------------------- +# Ansible command construction +# --------------------------------------------------------------------------- +bf_build_ansible_cmd() { + local pb="$1" scope="$2" wave="${3:-}" gate_confirmed="${4:-no}" + # Single choke point: no playbook command is ever built without a target. + if ! bf_target_is_set; then + return 1 + fi + BF_CMD=(ansible-playbook -i "$BF_INVENTORY" "$BF_REPO/$PLAYBOOK_DIR_REL/$pb" --limit "$BF_TARGET_LIMIT") + case "$scope" in + wave) + BF_CMD+=(-e "operation_wave=$wave" -e operation_confirmed=true) + if [[ "$wave" == "production" ]]; then + if bf_playbook_var_present "$pb" production_override; then + BF_CMD+=(-e production_override=true) + fi + fi + ;; + release) + BF_CMD+=(-e "release_wave=$wave") + if [[ "$gate_confirmed" == "yes" ]] && bf_playbook_var_present "$pb" wave_gate_confirmed; then + BF_CMD+=(-e wave_gate_confirmed=true) + fi + if bf_playbook_var_present "$pb" reboot_confirmed; then + BF_CMD+=(-e reboot_confirmed=true) + fi + if [[ "$wave" == "production" ]]; then + if bf_playbook_var_present "$pb" production_override; then + BF_CMD+=(-e production_override=true) + fi + if bf_playbook_var_present "$pb" allow_production_reboot; then + BF_CMD+=(-e allow_production_reboot=true) + fi + fi + ;; + esac + if [[ ${#BF_EXTRA[@]} -gt 0 ]]; then + BF_CMD+=("${BF_EXTRA[@]}") + fi + return 0 +} + +# bf_confirm_wave_gate WAVE PLAYBOOK -- reproduce the playbook's own gate +# contract as an explicit operator statement. Nothing is auto-confirmed. +bf_confirm_wave_gate() { + local wave="$1" pb="$2" + if [[ "$wave" != "production" ]]; then + return 0 + fi + tui_warn "Wave 'production' is the live fleet: $pb refuses to run without an explicit production override." + if ! tui_confirm_token "Type production to confirm a PRODUCTION run." "production"; then + tui_info "Production confirmation not given." + return 1 + fi + return 0 +} + +bf_confirm_release_gate() { + local pb="$1" + if ! bf_playbook_var_present "$pb" wave_gate_confirmed; then + return 0 + fi + tui_warn "$pb refuses to run unless the wave gate is confirmed." + tui_warn "Confirm only after the previous wave's health gate and the central approval have passed (docs/10)." + if ! tui_confirm_token "Wave gate confirmation." "GATE"; then + tui_info "Wave gate not confirmed." + return 1 + fi + return 0 +} + +# --------------------------------------------------------------------------- +# The device-operation runner +# --------------------------------------------------------------------------- +# bf_show_operation_header ROW -- always show what is about to happen. +bf_show_operation_header() { + local row="$1" + tui_kv "Operation" "$(bf_op_field "$row" 2)" + tui_kv "Playbook" "ansible/playbooks/$(bf_op_field "$row" 3)" + tui_kv "Scope" "$(bf_op_field "$row" 4)" + tui_kv "Inventory" "${BF_INVENTORY:-unresolved}" + tui_kv "Target" "${BF_TARGET_LABEL:-unset}" + if [[ -n "${BF_TARGET_WAVE:-}" ]]; then + tui_kv "Wave" "$BF_TARGET_WAVE" + fi + printf '\n' +} + +# bf_run_wave_once ROW WAVE -- build, confirm and run one wave. +bf_run_wave_once() { + local row="$1" wave="$2" pb="$3" destructive="$4" gate="no" scope + scope="$(bf_op_field "$row" 4)" + # The production token only applies where the playbook actually carries a + # wave/release gate; a simple playbook on a production device does not. + if [[ "$scope" != "simple" ]] && ! bf_confirm_wave_gate "$wave" "$pb"; then + return 1 + fi + if ! bf_confirm_release_gate "$pb"; then + return 1 + fi + if bf_playbook_var_present "$pb" wave_gate_confirmed; then + gate="yes" + fi + if ! bf_build_ansible_cmd "$pb" "$(bf_op_field "$row" 4)" "$wave" "$gate"; then + tui_error "No target is selected; refusing to build a command." + return 1 + fi + printf '\n' + tui_section "Command" + printf ' %s\n\n' "$(bf_cmd_string)" + # Fleet-wide scope is the one selection that can hurt many devices at once: + # it needs its own explicit confirmation, not just the run prompt. + if [[ "${BF_TARGET_KIND:-}" == "all" ]]; then + tui_warn "FLEET-WIDE: this command targets every device in the inventory (${BF_TARGET_COUNT} device(s))." + if ! tui_confirm_token "Fleet-wide scope confirmation." "all"; then + tui_info "Fleet-wide confirmation not given." + bf_log "CANCEL" "fleet-wide confirmation withheld :: $(bf_cmd_string)" + return 1 + fi + fi + bf_confirm_and_exec "$(bf_op_field "$row" 2) on wave '$wave'" "$destructive" || return 1 + return 0 +} + +# bf_run_row ROW -- full flow: target selection, extra vars, execution. +bf_run_row() { + local row="$1" id pb declared scope prompt destructive mode wave count + id="$(bf_op_field "$row" 1)" + pb="$(bf_op_field "$row" 3)" + declared="$(bf_op_field "$row" 4)" + destructive="$(bf_op_field "$row" 5)" + prompt="$(bf_op_field "$row" 6)" + + bf_require_ansible || return 1 + bf_require_inventory || return 1 + bf_playbook_check "$pb" "$declared" || return 1 + scope="$declared" + + case "$scope" in + wave) mode="wave" ;; + release) mode="release" ;; + *) mode="any" ;; + esac + + tui_screen "$(bf_op_field "$row" 2)" "$(bf_op_field "$row" 7)" + tui_note "Choose the target: dealer number, group, or all." + if [[ "$scope" == "release" ]]; then + tui_note "Release-gated playbooks accept one approved wave, never a single device." + fi + printf '\n' + if ! bf_target_select "$mode"; then + return 0 + fi + + if ! bf_prompt_extra "$prompt"; then + tui_warn "No command was built." + tui_pause + return 0 + fi + bf_log "TARGET" "$id target=${BF_TARGET_LIMIT} kind=${BF_TARGET_KIND} wave=${BF_TARGET_WAVE:-none}" + + if [[ "$scope" == "wave" && "$BF_TARGET_KIND" == "all" ]]; then + tui_screen "$(bf_op_field "$row" 2)" "wave by wave, stops at the first failure" + tui_warn "This playbook is wave-scoped: the fleet is processed one wave at a time." + tui_warn "Order: $(bf_waves_csv | tr ',' ' '). Each wave is shown and confirmed separately." + printf '\n' + if ! tui_confirm "Start with the first wave?"; then + tui_info "Cancelled; nothing was run." + return 0 + fi + # An array, not `while read < <(...)`: a redirection on a loop would also + # hijack the stdin that the confirmation prompts read from. + local waves=() + mapfile -t waves < <(bf_wave_groups_present || true) + for wave in "${waves[@]}"; do + [[ -n "$wave" ]] || continue + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$wave" || true)")" + tui_screen "$(bf_op_field "$row" 2)" "wave $wave -- $count device(s)" + if ! tui_confirm_token "About to run on wave '$wave' ($count device(s))." "$wave"; then + tui_info "Wave '$wave' skipped by the operator." + tui_pause + continue + fi + BF_TARGET_KIND="group" + BF_TARGET_LIMIT="$wave" + BF_TARGET_WAVE="$wave" + BF_TARGET_COUNT="$count" + BF_TARGET_LABEL="wave '$wave' ($count device(s))" + if ! bf_run_wave_once "$row" "$wave" "$pb" "$destructive"; then + tui_error "Wave '$wave' did not run to completion; stopping the sequence (no later wave is touched)." + bf_log "STOP" "$id stopped after wave=$wave" + tui_pause + return 1 + fi + if [[ "$BF_LAST_RC" -ne 0 ]]; then + tui_error "Wave '$wave' failed (exit $BF_LAST_RC); stopping the sequence." + bf_log "STOP" "$id failed at wave=$wave" + tui_pause + return 1 + fi + tui_pause + done + return 0 + fi + + wave="${BF_TARGET_WAVE:-}" + if [[ "$scope" == "wave" && -z "$wave" ]]; then + tui_error "This playbook is wave-scoped but the target carries no approved wave." + tui_note "Pick a wave group (or a device that belongs to one)." + tui_pause + return 1 + fi + if [[ "$scope" == "release" && -z "$wave" ]]; then + tui_error "Release-gated playbooks need an approved wave group as the target." + tui_pause + return 1 + fi + + tui_screen "$(bf_op_field "$row" 2)" "$(bf_op_field "$row" 7)" + bf_show_operation_header "$row" + bf_run_wave_once "$row" "$wave" "$pb" "$destructive" || return 0 + tui_pause + return 0 +} + +# --------------------------------------------------------------------------- +# Local (on this device) command runner +# --------------------------------------------------------------------------- +# bf_local LABEL DESTRUCTIVE -- cmd... : show, confirm, run a local command. +bf_local() { + local label="$1" destructive="$2" + shift 2 + BF_CMD=("$@") + printf '\n' + tui_section "$label" + bf_confirm_and_exec "$label" "$destructive" || return 1 + return 0 +} + +# bf_show_local_cmd LABEL -- cmd... : run a read-only command without ceremony. +# The command is passed as arguments; when it is omitted, the caller's BF_CMD is +# used as-is (defensive: an accidental empty argument list must not erase it). +bf_show_local_cmd() { + local label="$1" + shift + if [[ $# -gt 0 ]]; then + BF_CMD=("$@") + fi + printf '\n' + tui_section "$label" + printf ' %s\n\n' "$(bf_cmd_string)" + if [[ "$BF_DRY_RUN" -eq 1 ]]; then + tui_warn "dry-run: the command above was NOT executed." + return 0 + fi + bf_log "RUN" "$(bf_cmd_string)" + set +e + "${BF_CMD[@]}" + BF_LAST_RC=$? + set -e + if [[ "$BF_LAST_RC" -eq 0 ]]; then + bf_log "OK" "exit=0 :: $(bf_cmd_string)" + else + tui_warn "Command exited with $BF_LAST_RC." + bf_log "FAIL" "exit=$BF_LAST_RC :: $(bf_cmd_string)" + fi + return 0 +} + +# bf_run_tool NAME [ARGS...] -- run a diagnostics tool from the preferred path. +bf_run_tool() { + local name="$1" + shift + local path + if ! path="$(bf_tool_path "$name")"; then + tui_warn "$name is not available (neither /usr/local/bin/$name nor the checkout copy)." + tui_note "Install it from this checkout: sudo install -m 0755 scripts/diagnostics/$name /usr/local/bin/$name" + return 1 + fi + bf_show_local_cmd "$name" "$path" "$@" + return 0 +} + +# --------------------------------------------------------------------------- +# Category 1 -- local installation of THIS device +# --------------------------------------------------------------------------- +bf_installer_or_error() { + local path + if ! path="$(bf_installer_path)"; then + tui_error "Installer not found: $INSTALLER_REL" + tui_note "Set --repo to the checkout that contains it, or clone the repository first:" + tui_note " git clone Blueforce-Linux && cd Blueforce-Linux" + return 1 + fi + printf '%s\n' "$path" +} + +bf_cat_install() { + local installer choice dealer offline=0 resume=0 + while true; do + tui_screen "1) Installation (this device)" "Local install only -- no fleet device is touched here" + tui_item 1 "Pre-flight check" "installer --check, writes nothing" + tui_item 2 "Install this device" "full run, asks dealer number" + tui_item 3 "Resume after a failed run" "installer --resume" + tui_item 4 "Run a single module" "installer --only" + tui_item 5 "Show module state" "/var/lib/blueforce/install-state" + tui_item 6 "Show the installer log" "tail of /var/log/blueforce-install.log" + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + 1) + installer="$(bf_installer_or_error)" || { tui_pause; continue; } + tui_note "Read-only pre-flight: the installer creates no log, state or directory in --check mode." + tui_read "Dealer number (8 digits) > " || bf_quit + dealer="$TUI_REPLY" + if ! bf_dealer_validate "$dealer"; then + tui_error "Invalid dealer number '$dealer': it must match ${BF_DEALER_RE}." + tui_pause; continue + fi + BF_CMD=(bash "$installer" --dealer-id "$dealer" --check) + bf_show_local_cmd "Pre-flight check for $(bf_dealer_to_device_id "$dealer")" "${BF_CMD[@]}" + tui_pause + ;; + 2|3|4) + installer="$(bf_installer_or_error)" || { tui_pause; continue; } + bf_require_root || { tui_pause; continue; } + printf '\n' + tui_read "Dealer number (8 digits) > " || bf_quit + dealer="$TUI_REPLY" + if ! bf_dealer_validate "$dealer"; then + tui_error "Invalid dealer number '$dealer': it must match ${BF_DEALER_RE}." + tui_pause; continue + fi + offline=0 resume=0 + if [[ "$choice" == "3" ]]; then + resume=1 + else + if tui_confirm "Install from the local offline repository (--offline)?"; then + offline=1 + fi + if [[ "$choice" == "2" ]] && tui_confirm "Resume: skip modules already recorded as OK?"; then + resume=1 + fi + fi + BF_CMD=(bash "$installer" --dealer-id "$dealer") + [[ "$offline" -eq 1 ]] && BF_CMD+=(--offline) + [[ "$resume" -eq 1 ]] && BF_CMD+=(--resume) + if [[ "$choice" == "4" ]]; then + bf_pick_module "$installer" || { tui_pause; continue; } + fi + printf '\n' + tui_info "Target device: $(bf_dealer_to_device_id "$dealer") ($(bf_dealer_to_host "$dealer"))" + bf_confirm_and_exec "install on $(bf_dealer_to_device_id "$dealer")" "yes" || true + tui_pause + ;; + 5) + BF_CMD=(cat /var/lib/blueforce/install-state) + bf_show_local_cmd "Installer module state" "${BF_CMD[@]}" + tui_pause + ;; + 6) + BF_CMD=(tail -n 40 /var/log/blueforce-install.log) + bf_show_local_cmd "Installer log (last 40 lines)" "${BF_CMD[@]}" + tui_pause + ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +# bf_pick_module INSTALLER -- choose one installer module and append --only. +bf_pick_module() { + local installer="$1" dir index=0 name choice i=0 pick="" modules=() + dir="$BF_REPO/scripts/install/installer/modules" + if [[ ! -d "$dir" ]]; then + tui_error "Module directory not found: $dir" + return 1 + fi + while IFS= read -r name; do + [[ -n "$name" ]] || continue + modules+=("$name") + done < <(find "$dir" -maxdepth 1 -type f -name '[0-9][0-9]-*.sh' -printf '%f\n' 2>/dev/null | sort) + if [[ ${#modules[@]} -eq 0 ]]; then + tui_error "No installer modules found under $dir" + return 1 + fi + printf '\n' + for name in "${modules[@]}"; do + index=$((index + 1)) + tui_item "$index" "${name%.sh}" "" + done + tui_footer "Cancel the module selection" + printf '\n' + tui_read "Module number > " || return 1 + choice="$TUI_REPLY" + if ! tui_menu_index "$choice" "${#modules[@]}"; then + tui_error "Enter a number between 1 and ${#modules[@]}." + return 1 + fi + for name in "${modules[@]}"; do + i=$((i + 1)) + if [[ "$i" -eq "$choice" ]]; then + pick="${name%.sh}" + break + fi + done + [[ -n "$pick" ]] || return 1 + BF_CMD+=(--only "$pick") + tui_info "Selected module: $pick" + return 0 +} + +# --------------------------------------------------------------------------- +# Category 2 -- device operations through Ansible +# --------------------------------------------------------------------------- +bf_ops_menu() { + local title="$1" subtitle="$2" + shift 2 + local rows=("$@") row index=0 choice + while true; do + tui_screen "$title" "$subtitle" + for row in "${rows[@]}"; do + index=$((index + 1)) + tui_item "$index" "$(bf_op_field "$row" 2)" "$(bf_op_field "$row" 7)" + done + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + *) + index=0 + if tui_menu_index "$choice" "${#rows[@]}"; then + bf_run_row "${rows[$((choice - 1))]}" + else + tui_error "Unknown choice '$choice'." + tui_pause + fi + ;; + esac + index=0 + done +} + +bf_cat_devices() { + local choice + while true; do + tui_screen "2) Device operations" "Existing playbooks only, always with an explicit target" + if ! bf_have_ansible; then + tui_warn "ansible-playbook is not installed on this machine: fleet operations will refuse to run." + fi + tui_item 1 "Read-only reports" "${#BF_OPS_REPORT[@]} operations, no change on any device" + tui_item 2 "Maintenance actions" "${#BF_OPS_MAINTENANCE[@]} operations, some destructive" + tui_item 3 "Show inventory targets" "groups, hosts and counts" + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + 1) bf_ops_menu "2.1) Read-only fleet reports" "No playbook in this list changes a device" "${BF_OPS_REPORT[@]}" ;; + 2) bf_ops_menu "2.2) Fleet maintenance" "Destructive operations ask twice" "${BF_OPS_MAINTENANCE[@]}" ;; + 3) bf_show_targets; tui_pause ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +bf_show_targets() { + if ! bf_require_inventory; then + return 1 + fi + local group count host waves=() groups=() hosts=() + mapfile -t waves < <(bf_wave_groups_present || true) + mapfile -t groups < <(bf_inventory_groups || true) + mapfile -t hosts < <(bf_inventory_hosts || true) + printf '\n' + tui_section "Waves (rollout order)" + for group in "${waves[@]}"; do + [[ -n "$group" ]] || continue + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$group" || true)")" + tui_kv "$group" "$count device(s)" + done + printf '\n' + tui_section "Other groups in the inventory" + for group in "${groups[@]}"; do + [[ -n "$group" ]] || continue + bf_is_wave "$group" && continue + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$group" || true)")" + tui_kv "$group" "$count device(s)" + done + printf '\n' + tui_section "Devices" + for host in "${hosts[@]}"; do + [[ -n "$host" ]] || continue + printf ' %s\n' "$host" + done + printf '\n' + tui_kv "Inventory" "$BF_INVENTORY" + tui_kv "Devices total" "$(bf_inventory_count_all)" + return 0 +} + +# --------------------------------------------------------------------------- +# Category 3 -- central side preparation (no central server is installed here) +# --------------------------------------------------------------------------- +bf_cat_central() { + local choice + while true; do + tui_screen "3) Central (preparation)" "This console prepares and verifies central integration; it installs no central server" + tui_item 1 "Central readiness report" "inventory, placeholders, admin key" + tui_item 2 "Show configured central endpoints" "WireGuard hub, monitoring, mirror" + tui_item 3 "Probe central endpoints" "DNS + TCP, read-only" + tui_item 4 "Wave rollout gate state" "per-wave device counts and gate rules" + tui_item 5 "Central preparation checklist" "what must exist before enrollment" + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + 1) bf_central_readiness; tui_pause ;; + 2) bf_central_endpoints; tui_pause ;; + 3) bf_central_probe; tui_pause ;; + 4) bf_wave_gate_state; tui_pause ;; + 5) bf_central_checklist; tui_pause ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +bf_group_vars_path() { + local p="$BF_REPO/ansible/inventory/group_vars/all.yml" + [[ -r "$p" ]] && printf '%s\n' "$p" +} + +bf_group_vars_value() { + local key="$1" file + file="$(bf_group_vars_path)" || return 1 + awk -v k="$key" ' + $0 ~ "^[[:space:]]*" k "[[:space:]]*:" { + sub(/^[^:]*:/, ""); gsub(/^[[:space:]]+|[[:space:]]+$/, "") + gsub(/^["\x27]|["\x27]$/, ""); gsub(/[[:space:]]*#.*$/, ""); print; exit + }' "$file" +} + +bf_central_readiness() { + local file placeholders keyfile + printf '\n' + tui_section "Central readiness" + if ! bf_require_inventory; then + return 1 + fi + tui_ok "Inventory found: $BF_INVENTORY ($(bf_inventory_count_all) device(s))" + + if file="$(bf_group_vars_path)"; then + placeholders="$(grep -c 'PLACEHOLDER' "$file" || true)" + if [[ "${placeholders:-0}" -gt 0 ]]; then + tui_warn "group_vars/all.yml still contains ${placeholders} PLACEHOLDER value(s):" + grep -n 'PLACEHOLDER' "$file" | sed 's/^/ /' + tui_note "Replace them before a production run; the console refuses nothing here on purpose, it reports." + else + tui_ok "No PLACEHOLDER left in group_vars/all.yml" + fi + else + tui_warn "ansible/inventory/group_vars/all.yml was not found." + fi + + keyfile="${HOME}/.ssh/blueforce_id_ed25519" + if [[ -r "$keyfile" ]]; then + tui_ok "Admin SSH key present: $keyfile (contents are never read or printed)" + else + tui_warn "Admin SSH key not found at $keyfile (docs/06)." + tui_note "The inventory may point somewhere else: ansible_ssh_private_key_file." + fi + + if grep -q 'example' "$BF_INVENTORY" 2>/dev/null || [[ "$BF_INVENTORY" == *example* ]]; then + tui_warn "This looks like an example inventory; do not aim it at real devices." + fi + return 0 +} + +bf_central_endpoints() { + local key value + printf '\n' + tui_section "Configured central endpoints" + for key in wg_subnet wg_interface wg_hub_endpoint monitoring_endpoint monitoring_job update_repo_url meg_image_tag support_bundle_dir; do + value="$(bf_group_vars_value "$key" || true)" + if [[ -n "$value" ]]; then + tui_kv "$key" "$value" + fi + done + tui_note "Values come from ansible/inventory/group_vars/all.yml; no secret is stored there or printed here." + return 0 +} + +bf_central_probe() { + local endpoint host port resolved + printf '\n' + tui_section "Central endpoint probe (read-only)" + for endpoint in "$(bf_group_vars_value wg_hub_endpoint || true)" "$(bf_group_vars_value monitoring_endpoint || true)" "$(bf_group_vars_value update_repo_url || true)"; do + [[ -n "$endpoint" ]] || continue + host="${endpoint#*//}" + host="${host%%/*}" + host="${host%%:*}" + port="" + if [[ "$endpoint" =~ :([0-9]+)$ ]]; then + port="${BASH_REMATCH[1]}" + elif [[ "$endpoint" == http://* ]]; then + port=80 + elif [[ "$endpoint" == https://* ]]; then + port=443 + fi + if [[ -z "$host" ]]; then + continue + fi + if resolved="$(getent hosts "$host" 2>/dev/null | awk 'NR==1{print $1}')" && [[ -n "$resolved" ]]; then + if [[ -n "$port" ]]; then + if timeout 3 bash -c "/dev/null; then + tui_ok "$host:$port reachable (resolves to $resolved)" + else + tui_warn "$host:$port not reachable (resolves to $resolved)" + fi + else + tui_ok "$host resolves to $resolved (no port derived from the value)" + fi + else + tui_warn "$host does not resolve -- expected while the placeholder is unfilled" + fi + done + return 0 +} + +bf_wave_gate_state() { + local wave count + printf '\n' + tui_section "Wave rollout gate state" + if ! bf_require_inventory; then + return 1 + fi + if ! bf_inventory_cache; then + tui_error "Inventory could not be parsed: $BF_INVENTORY" + return 1 + fi + for wave in "${BF_WAVES[@]}"; do + if bf_inventory_group_exists "$wave"; then + count="$(bf_count_lines "$(bf_inventory_hosts_of_group "$wave" || true)")" + tui_kv "$wave" "$count device(s)" + else + tui_kv "$wave" "absent from the inventory" + fi + done + tui_note "Gate rule: a wave may only start after the previous wave passed its health gate and central approval (docs/10)." + tui_note "Production additionally needs the typed 'production' confirmation in this console and its override flag." + return 0 +} + +bf_central_checklist() { + printf '\n' + tui_section "Central preparation checklist (informational)" + tui_msg " 1. WireGuard hub: endpoint, keys and peer allocation for each bf- (docs/08)." + tui_msg " 2. Enrollment token service: one-time, TTL-limited tokens (docs/29)." + tui_msg " 3. Monitoring: Prometheus/VictoriaMetrics + Grafana, device_id label = BF- (docs/14)." + tui_msg " 4. Remote access: RustDesk hbbs/hbbr or MeshCentral reachable over WireGuard (docs/07)." + tui_msg " 5. Package mirror + offline snapshot for field installs (docs/10, docs/27)." + tui_msg " 6. Ansible inventory with real hostnames and a per-admin SSH key (docs/02, docs/06, docs/09)." + tui_note "This console verifies 6 and prepares 1-5; it installs no central component." + return 0 +} + +# --------------------------------------------------------------------------- +# Category 4 -- tools +# --------------------------------------------------------------------------- +bf_cat_tools() { + local choice out_dir + while true; do + tui_screen "4) Tools" "Local helpers; the ISO build is intentionally not part of this console" + tui_section "Repository" + tui_item 1 "Update this checkout" "git pull --ff-only" + tui_item 2 "Environment and reference info" "paths, versions, resolved settings" + tui_item 3 "Show the operation catalogue" "--list output" + tui_section "Local device tools" + tui_item 4 "Local offline gate" "bf-check-local" + tui_item 5 "Enrollment gate" "bf-check-enrollment" + tui_item 6 "Ready gate" "bf-check-ready" + tui_item 7 "Deep diagnostics" "bf-diagnostics (or bf-status)" + tui_item 8 "Live hardware / OS check" "bf-live-hw-check, read-only" + tui_item 9 "Remote access channels" "bf-remote-status --check" + tui_item 10 "Field OS release identity" "bf-release" + tui_item 11 "Hardware inventory" "bf-hardware-inventory.sh" + tui_item 12 "Support bundle" "bf-support-bundle --out-dir" + tui_section "This console" + tui_item 13 "Show the console log" "last 40 lines of the audit log" + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + 1) + BF_CMD=(git -C "$BF_REPO" pull --ff-only) + if bf_confirm_and_exec "update the checkout at $BF_REPO" "yes"; then + tui_note "The console itself may have changed; restart it after a pull." + fi + tui_pause + ;; + 2) bf_show_environment; tui_pause ;; + 3) bf_print_catalogue; tui_pause ;; + 4) bf_run_tool bf-check-local --check; tui_pause ;; + 5) bf_run_tool bf-check-enrollment --check; tui_pause ;; + 6) bf_run_tool bf-check-ready --check; tui_pause ;; + 7) + if ! bf_run_tool bf-diagnostics; then + bf_run_tool bf-status || true + fi + tui_pause + ;; + 8) bf_run_tool bf-live-hw-check; tui_pause ;; + 9) bf_run_tool bf-remote-status --check; tui_pause ;; + 10) bf_run_tool bf-release; tui_pause ;; + 11) + if [[ "$(id -u)" -eq 0 ]]; then + out_dir="/var/lib/blueforce/inventory" + else + out_dir="${XDG_STATE_HOME:-$HOME/.local/state}/blueforce/inventory" + fi + if bf_tool_path bf-hardware-inventory.sh >/dev/null 2>&1; then + tui_prompt "Dealer number (8 digits)" "" || continue + if ! bf_dealer_validate "$TUI_REPLY"; then + tui_error "Invalid dealer number; it must match ${BF_DEALER_RE}." + tui_pause; continue + fi + bf_show_local_cmd "Hardware inventory for $(bf_dealer_to_device_id "$TUI_REPLY")" \ + "$(bf_tool_path bf-hardware-inventory.sh)" --dealer-id "$TUI_REPLY" --out-dir "$out_dir" + else + tui_warn "bf-hardware-inventory.sh is not available." + fi + tui_pause + ;; + 12) + if bf_tool_path bf-support-bundle >/dev/null 2>&1; then + bf_local "Support bundle" "no" "$(bf_tool_path bf-support-bundle)" --out-dir /var/tmp + else + tui_warn "bf-support-bundle is not available." + fi + tui_pause + ;; + 13) + BF_CMD=(tail -n 40 "$BF_LOG_FILE") + bf_show_local_cmd "Console log ($BF_LOG_FILE)" "${BF_CMD[@]}" + tui_pause + ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +bf_show_environment() { + printf '\n' + tui_section "Environment" + tui_kv "Console" "$BF_MENU_NAME $BF_MENU_VERSION" + tui_kv "Repository" "$BF_REPO" + tui_kv "Inventory" "${BF_INVENTORY:-not resolved yet}" + tui_kv "Audit log" "$BF_LOG_FILE (mode $(stat -c '%a' "$BF_LOG_FILE" 2>/dev/null || echo '?'))" + tui_kv "dry-run" "$([[ "$BF_DRY_RUN" -eq 1 ]] && echo yes || echo no)" + tui_kv "Running as" "uid $(id -u) ($(id -un 2>/dev/null || echo unknown))" + tui_kv "Ansible" "$(command -v ansible-playbook 2>/dev/null || echo 'not installed')" + if bf_have_ansible; then + tui_kv "ansible-core" "$(ansible --version 2>/dev/null | awk 'NR==1{print $2}' || echo unknown)" + fi + tui_kv "Installer" "$(bf_installer_path || echo 'not found')" + tui_kv "Playbook dir" "$BF_REPO/$PLAYBOOK_DIR_REL" + printf '\n' + tui_section "Resolved tool paths" + for tool in bf-status bf-diagnostics bf-check-local bf-check-enrollment bf-check-ready bf-release bf-remote-status bf-support-bundle bf-hardware-inventory.sh; do + tui_kv "$tool" "$(bf_tool_path "$tool" || echo 'not available')" + done + return 0 +} + +bf_print_catalogue() { + local row index + printf '\n' + tui_section "Category 2.1 -- read-only fleet reports" + index=0 + for row in "${BF_OPS_REPORT[@]}"; do + index=$((index + 1)) + printf ' %2s) %-34s %-36s scope=%-8s destructive=%s\n' "$index" "$(bf_op_field "$row" 1)" \ + "$(bf_op_field "$row" 3)" "$(bf_op_field "$row" 4)" "$(bf_op_field "$row" 5)" + done + printf '\n' + tui_section "Category 2.2 -- fleet maintenance" + index=0 + for row in "${BF_OPS_MAINTENANCE[@]}"; do + index=$((index + 1)) + printf ' %2s) %-34s %-36s scope=%-8s destructive=%s\n' "$index" "$(bf_op_field "$row" 1)" \ + "$(bf_op_field "$row" 3)" "$(bf_op_field "$row" 4)" "$(bf_op_field "$row" 5)" + done + printf '\n' + tui_note "scope=wave needs -e operation_wave= -e operation_confirmed=true (set by this console after confirmation)." + tui_note "scope=release needs -e release_wave= plus the wave gate typed confirmation." + return 0 +} + +# --------------------------------------------------------------------------- +# Category 5 -- device information +# --------------------------------------------------------------------------- +bf_cat_info() { + local choice + while true; do + tui_screen "5) Device information" "Read-only: nothing here changes a device" + tui_section "This device" + tui_item 1 "Identity" "hostname, device id, dealer number" + tui_item 2 "Health summary" "bf-status" + tui_item 3 "Provisioning and enrollment state" "state.json whitelist + bf-enrollment-status" + tui_item 4 "Network" "addresses, route, DNS, WireGuard peers" + tui_item 5 "Disk, memory, CPU" "df, free, load" + tui_item 6 "Installed pinned packages" "dpkg-query" + tui_item 7 "Service status" "ssh, xrdp, rustdesk, docker, wg, meshagent" + tui_item 8 "Recent journal errors" "journalctl -p err" + tui_section "The fleet" + tui_item 9 "Inventory summary" "waves, groups, counts" + tui_item 10 "Resolve a target" "check a dealer number or group" + tui_footer + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 0) return 0 ;; + q|Q) bf_quit ;; + 1) bf_info_identity; tui_pause ;; + 2) bf_run_tool bf-status; tui_pause ;; + 3) bf_info_state; tui_pause ;; + 4) bf_info_network; tui_pause ;; + 5) bf_info_resources; tui_pause ;; + 6) bf_info_packages; tui_pause ;; + 7) bf_info_services; tui_pause ;; + 8) bf_info_journal; tui_pause ;; + 9) bf_show_targets; tui_pause ;; + 10) bf_info_resolve_target; tui_pause ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +bf_info_identity() { + local host dealer device_id + host="$(hostname 2>/dev/null || echo unknown)" + printf '\n' + tui_section "Identity" + tui_kv "Hostname (machine)" "$host" + if dealer="$(bf_host_to_dealer "$host")"; then + tui_kv "Dealer number" "$dealer" + tui_kv "Device ID (human)" "$(bf_dealer_to_device_id "$dealer")" + else + tui_warn "Hostname is not bf-<8 digits>; it does not match the naming standard (docs/02)." + tui_note "The installer sets it from --dealer-id: sudo $BF_MENU_NAME -> category 1" + fi + if [[ -r /var/lib/blueforce/state.json ]]; then + device_id="$(bf_state_value device_id || true)" + [[ -n "$device_id" ]] && tui_kv "state.json device_id" "$device_id" + fi + tui_kv "Kernel" "$(uname -sr 2>/dev/null || echo unknown)" + tui_kv "Console" "$BF_MENU_NAME $BF_MENU_VERSION" + return 0 +} + +# bf_state_value KEY -- read one whitelisted key from /var/lib/blueforce/state.json. +# Only non-secret identity/lifecycle fields are ever extracted: the file is read +# through a whitelist so a future token field can never leak into the UI or log. +BF_STATE_ALLOWED_KEYS="phase enrollment_status fleet_status device_id provisioning_id" +bf_state_value() { + local key="$1" state="/var/lib/blueforce/state.json" + [[ -r "$state" ]] || return 1 + [[ " $BF_STATE_ALLOWED_KEYS " == *" $key "* ]] || return 1 + if command -v python3 >/dev/null 2>&1; then + python3 -c ' +import json, sys +try: + with open(sys.argv[1], encoding="utf-8") as handle: + data = json.load(handle) +except Exception: + sys.exit(1) +if not isinstance(data, dict): + sys.exit(1) +value = data.get(sys.argv[2]) +if value is None or isinstance(value, bool): + sys.exit(1) +sys.stdout.write(str(value) + "\n") +' "$state" "$key" 2>/dev/null || return 1 + return 0 + fi + awk -v pattern="\"$key\"" ' + index($0, pattern) { + line = $0 + sub(/^[^:]*:[[:space:]]*/, "", line) + gsub(/^"|"[,]?$/, "", line) + print line; exit + }' "$state" || return 1 + return 0 +} + +bf_info_state() { + local key value + printf '\n' + tui_section "Provisioning and enrollment state" + if [[ -r /var/lib/blueforce/state.json ]]; then + for key in phase enrollment_status fleet_status device_id provisioning_id; do + value="$(bf_state_value "$key" || true)" + [[ -n "$value" ]] && tui_kv "$key" "$value" + done + tui_note "Only the identity/lifecycle whitelist above is read; tokens and keys are never printed." + else + tui_warn "/var/lib/blueforce/state.json is missing: the device has not been provisioned by the installer." + fi + printf '\n' + printf ' %sProvisioning : PROVISIONED_OFFLINE -> Enrollment : ENROLLED -> Fleet State : READY%s\n' "$C_DIM" "$C_RESET" + tui_note "Forward-only state machine; READY requires verified central evidence (docs/29)." + return 0 +} + +bf_info_network() { + printf '\n' + tui_section "Network" + if command -v ip >/dev/null 2>&1; then + bf_show_local_cmd "Interfaces" ip -brief address + fi + if command -v ip >/dev/null 2>&1; then + bf_show_local_cmd "Default routes" ip route show default + fi + if [[ -r /etc/resolv.conf ]]; then + bf_show_local_cmd "DNS servers (nameserver lines only)" awk '/^nameserver/{print}' /etc/resolv.conf + fi + if command -v wg >/dev/null 2>&1; then + bf_show_local_cmd "WireGuard listen port" wg show wg0 listen-port + bf_show_local_cmd "WireGuard peer count" sh -c 'wg show wg0 peers | wc -l' + bf_show_local_cmd "WireGuard handshakes (epoch, no keys)" wg show wg0 latest-handshakes + else + tui_note "wg is not installed; WireGuard channels are not configured on this device." + fi + tui_note "WireGuard private and preshared keys are never requested, displayed or logged." + return 0 +} + +bf_info_resources() { + printf '\n' + tui_section "Resources" + bf_show_local_cmd "Filesystems" df -h + bf_show_local_cmd "Memory" free -h + bf_show_local_cmd "Load average and uptime" uptime + return 0 +} + +bf_info_packages() { + printf '\n' + tui_section "Installed versions" + if command -v dpkg-query >/dev/null 2>&1; then + # shellcheck disable=SC2016 # dpkg field syntax, not a shell expansion + bf_show_local_cmd "Pinned packages" dpkg-query -W -f='${Package} ${Version} ${Status}\n' \ + docker-ce wireguard rustdesk xrdp openssh-server + else + tui_warn "dpkg-query is not available on this machine." + fi + return 0 +} + +bf_info_services() { + printf '\n' + tui_section "Service status (read-only)" + if ! command -v systemctl >/dev/null 2>&1; then + tui_warn "systemctl is not available on this machine." + return 0 + fi + bf_show_local_cmd "Units" systemctl is-active ssh sshd xrdp rustdesk docker wg-quick@wg0 meshagent cron + return 0 +} + +bf_info_journal() { + printf '\n' + tui_section "Recent journal errors" + if command -v journalctl >/dev/null 2>&1; then + bf_show_local_cmd "Errors (last 20)" journalctl -p err -n 20 --no-pager + else + tui_warn "journalctl is not available on this machine." + fi + return 0 +} + +bf_info_resolve_target() { + local word mode="any" answer + printf '\n' + tui_section "Resolve a target" + tui_note "Accepts a dealer number, a group name, 'all' or a bf- hostname." + tui_read "Target > " || return 1 + word="$TUI_REPLY" + if [[ -z "$word" ]]; then + return 1 + fi + if ! bf_require_inventory; then + return 1 + fi + if tui_confirm "Is this target for a wave-scoped operation?"; then + mode="wave" + fi + answer="$word" + if bf_target_parse "$answer" "$mode"; then + printf '\n' + tui_kv "Kind" "$BF_TARGET_KIND" + tui_kv "Ansible --limit" "$BF_TARGET_LIMIT" + tui_kv "Wave" "${BF_TARGET_WAVE:-none}" + tui_kv "Devices" "$BF_TARGET_COUNT" + printf '\n' + tui_note "Example: ansible-playbook -i $BF_INVENTORY $BF_REPO/$PLAYBOOK_DIR_REL/bf-ping.yml --limit $BF_TARGET_LIMIT" + else + tui_warn "That target cannot be used." + fi + return 0 +} + +# --------------------------------------------------------------------------- +# Main menu +# --------------------------------------------------------------------------- +bf_main_menu() { + local choice + while true; do + tui_screen "Blueforce operator console $BF_MENU_VERSION" "repo: $BF_REPO" + if [[ "$BF_DRY_RUN" -eq 1 ]]; then + tui_warn "DRY-RUN MODE: commands are printed, never executed." + fi + if ! bf_have_ansible; then + tui_warn "ansible-playbook not found: categories 2, 3 and 5-fleet need Ansible." + fi + tui_section "Categories" + tui_item 1 "Installation" "this device, local one-click installer" + tui_item 2 "Device operations" "fleet playbooks, explicit target" + tui_item 3 "Central (preparation)" "verify and prepare central integration" + tui_item 4 "Tools" "repository and local helpers" + tui_item 5 "Device information" "read-only information screens" + printf '\n' + tui_hr '-' + printf ' %s%2s%s) %s\n' "$C_BOLD" "q" "$C_RESET" "Quit the console" + printf ' %sLog:%s %s\n' "$C_DIM" "$C_RESET" "$BF_LOG_FILE" + tui_hr '-' + if ! tui_read "Choice > "; then bf_quit; fi + choice="$TUI_REPLY" + case "$choice" in + 1) bf_cat_install ;; + 2) bf_cat_devices ;; + 3) bf_cat_central ;; + 4) bf_cat_tools ;; + 5) bf_cat_info ;; + q|Q) bf_quit ;; + 0) tui_note "Already at the top level."; tui_pause ;; + *) tui_error "Unknown choice '$choice'."; tui_pause ;; + esac + done +} + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +main() { + bf_parse_args "$@" + BF_LOG_REQUESTED="$BF_LOG_FILE" + bf_resolve_repo + trap bf_cleanup EXIT + # shellcheck source=lib/tui.sh disable=SC1091 + source "$BF_REPO/admin/lib/tui.sh" + tui_init_colors "${TUI_COLOR_MODE:-auto}" + # shellcheck source=lib/targets.sh disable=SC1091 + source "$BF_REPO/admin/lib/targets.sh" + bf_log_init + + if [[ "$BF_LIST_TARGETS" -eq 1 ]]; then + bf_show_targets + exit $? + fi + if [[ "$BF_LIST" -eq 1 ]]; then + bf_print_catalogue + exit 0 + fi + + bf_log "SESSION" "$BF_MENU_NAME $BF_MENU_VERSION start uid=$(id -u) repo=$BF_REPO dry_run=$BF_DRY_RUN" + if ! bf_require_inventory; then + tui_warn "Starting without a usable inventory: fleet categories will explain what is missing." + BF_INVENTORY="" + fi + bf_main_menu +} + +main "$@" + + + +# Blueforce operator console (`bf-menu`) + +Numbered terminal console for the Blueforce field fleet. One entry point for the +operator: no command has to be memorised, every command is printed before it +runs, and the dangerous ones ask twice. + +Three layers, one screen: + +| Layer | What it is | Where | +|---|---|---| +| Local install | This device, brought to the Field OS standard | category **1** | +| Fleet operations | The repository's existing Ansible playbooks, always with an explicit `--limit` | category **2** | +| Read-only information | Device and fleet state, no change anywhere | categories **3, 4, 5** | + +The console is a thin front end. It does not reimplement installer logic, does +not invent playbooks, and does not talk to devices itself: it selects the right +`bf-*` tool, playbook and target, then executes exactly that. + +--- + +## 1. Requirements + +- Ubuntu LTS field device or admin workstation (the console is plain bash 4+). +- `git` for the checkout; `ansible-core`/`ansible` **only** on the machine that + drives fleet operations (categories 2 and 3). A field device that only installs + itself needs neither Ansible nor an inventory. +- `sudo` for category 1 (local install) and for writing to + `/var/log/blueforce-console.log`. +- Optional, per category: `python3` (reads `state.json`), `wireguard-tools` + (`wg`), `systemd`, `dpkg`. + +## 2. Quick start + +```bash +git clone Blueforce-Linux +cd Blueforce-Linux + +sudo admin/bf-bootstrap.sh # optional: links the tools into /usr/local/bin +sudo admin/bf-menu # or: sudo bf-menu, once bootstrap ran +``` + +An install is `git`-based on purpose: the running revision is traceable with +`git log`, and the device identity (dealer number) is never baked into an image +— it is typed in the first console session. ISO/firstboot remain a secondary, +optional path (`docs/26`, `docs/27`). + +Options: + +``` +-h, --help usage +-V, --version console version + --repo PATH repository root (default: parent of this script, symlinks resolved) + --inventory PATH Ansible inventory (default: /ansible/inventory/hosts.yml) + --log-file PATH audit log (default: /var/log/blueforce-console.log) + --dry-run print every command instead of running it + --no-color disable ANSI colors (NO_COLOR is honored too) + --list print the operation catalogue and exit (non-interactive) + --list-targets print inventory groups and host counts, then exit +``` + +Environment: `BF_REPO`, `BF_INVENTORY`, `BF_CONSOLE_LOG` mirror the options. + +Exit status: `0` success or clean quit, `1` failure, `2` usage error. + +## 3. Menu map + +`0` is **Back** on every screen, `q` is **Quit** on every screen. The console +never changes anything from a menu that only displays information. + +**1) Installation — this device, locally** + +| # | Action | Under the hood | +|---|---|---| +| 1 | Pre-flight check | `blueforce-install.sh --dealer-id --check` (writes nothing) | +| 2 | Install this device | `--dealer-id [--offline] [--resume]` | +| 3 | Resume a failed run | `--dealer-id --resume` | +| 4 | Run a single module | `--dealer-id --only ` | +| 5 | Show module state | `/var/lib/blueforce/install-state` | +| 6 | Show the installer log | `tail -n 40 /var/log/blueforce-install.log` | + +Dealer numbers are validated against `^[0-9]{8}$` before anything runs; a wrong +format stops the flow immediately. Actions 2–4 require root and will say so. + +**2) Device operations — the fleet, via Ansible** + +*2.1 Read-only reports* (11 operations, nothing is changed): + +| # | Operation | Playbook | +|---|---|---| +| 1 | Ping / reachability | `bf-ping.yml` | +| 2 | Uptime | `bf-uptime.yml` | +| 3 | Disk usage | `bf-disk-check.yml` | +| 4 | Docker status | `bf-docker-status.yml` | +| 5 | Package versions | `bf-package-check.yml` | +| 6 | Pending security updates | `bf-security-updates-check.yml` | +| 7 | Provisioning phase report | `bf-provisioning-status.yml` | +| 8 | Enrollment + central evidence | `bf-enrollment-status.yml` | +| 9 | Field OS version report | `bf-fieldos-version.yml` | +| 10 | Remote access channels | `bf-remote-channels-check.yml` | +| 11 | Offline readiness report | `bf-offline-ready-check.yml` | + +*2.2 Maintenance* (10 operations, destructive ones ask twice): + +| # | Operation | Playbook | Scope | +|---|---|---|---| +| 1 | Restart RDP | `bf-rdp-restart.yml` | simple | +| 2 | Restart RustDesk | `bf-rustdesk-restart.yml` | simple | +| 3 | Restart WireGuard | `bf-wireguard-restart.yml` | simple | +| 4 | Restart an allowlisted service | `bf-service-restart.yml` | simple | +| 5 | GUI off (headless) | `bf-gui-off.yml` | wave | +| 6 | GUI on (maintenance) | `bf-gui-on.yml` | wave | +| 7 | Collect logs / support bundle | `bf-collect-logs.yml` | wave | +| 8 | Run an approved script | `bf-run-script.yml` | wave | +| 9 | Controlled reboot | `bf-reboot.yml` | release | +| 10 | Deploy approved update | `bf-deploy-update.yml` | release | + +*2.3 Show inventory targets* lists the waves with their device counts. + +The console cross-checks its own table against the playbook file before running +(see §5); a playbook whose gates changed refuses to run rather than run ungated. + +**3) Central (preparation)** — verifies and prepares central integration; it +installs no central component. Central readiness report (inventory, placeholders +in `group_vars/all.yml`, admin key path), configured endpoints, a read-only +DNS/TCP probe of those endpoints, the per-wave gate state, and the preparation +checklist. + +**4) Tools** — `git pull --ff-only` of the checkout, environment/reference info, +the operation catalogue, the local gates (`bf-check-local`, `bf-check-enrollment`, +`bf-check-ready`), `bf-diagnostics`, `bf-live-hw-check`, `bf-remote-status --check`, +`bf-release`, `bf-hardware-inventory.sh`, `bf-support-bundle`, and the console's +own log. + +**5) Device information** — identity (hostname, `BF-`, dealer number), +`bf-status`, provisioning/enrollment state, network (addresses, routes, DNS, +WireGuard **peer counts and handshake ages**), disk/memory/CPU, installed pinned +packages, service status, recent journal errors, plus the fleet inventory summary +and a "resolve a target" helper that shows the exact `--limit` for copy/paste. + +## 4. Target selection + +Every device operation asks for a target first — never a default: + +``` +Target selection (mode: any|wave|release) + 1) Single device by dealer number -> bf-<8 digits> + 2) Group / wave -> lab, pilot_1, pilot_2, wave_1, wave_2, production + 3) All devices in the fleet -> --limit all + 9) Type the target directly -> dealer number, group, hostname or 'all' + 0) Back q) Quit +``` + +Rules the console enforces: + +- **Single device** — the dealer number must match `^[0-9]{8}$` and the device + must exist in the inventory. The wave is derived from the inventory, so a + wave-scoped playbook gets `-e operation_wave=`. A device outside + every wave cannot be used for a wave-scoped operation. +- **Group / wave** — the group must exist in the inventory. For wave-scoped and + release-gated operations only the six approved waves are offered. +- **All devices** — allowed for simple and wave-scoped playbooks. It shows how + many devices are affected and requires typing `all` before anything runs. For + wave-scoped playbooks the fleet is processed **one wave at a time** in + `lab → pilot_1 → pilot_2 → wave_1 → wave_2 → production`, each wave shown and + confirmed on its own, stopping at the first failure so no later wave is touched. +- **Release-gated playbooks** (`bf-reboot.yml`, `bf-deploy-update.yml`) accept an + approved wave group only: no single device, no fleet-wide run. That is the + playbooks' own gate (docs/10) and the console does not work around it. + +## 5. What gets added to a command + +The console derives the gate variables from the playbook file itself (its +non-comment lines), so the table in the menu can never silently drop a gate: + +| Scope | Detected by | Variables added | +|---|---|---| +| `simple` | neither wave variable | only `--limit` | +| `wave` | uses `operation_wave` | `-e operation_wave= -e operation_confirmed=true`, plus `-e production_override=true` for the production wave | +| `release` | uses `release_wave` | `-e release_wave=`, `-e reboot_confirmed=true` / `-e wave_gate_confirmed=true` when the playbook declares them, plus the production override for the production wave | + +Confirmations, in order: + +1. the target and the full command are printed; +2. for `release` scope, the **wave gate** must be typed as `GATE` (the console + never sets `wave_gate_confirmed=true` on its own — only after the previous + wave's health gate and central approval, docs/10); +3. for the production wave, the word `production` must be typed; +4. for fleet-wide scope, the word `all` must be typed; +5. `y` runs, `c` runs with `--check` (dry run of the playbook), anything else cancels. + +Extra variables are validated with the same rules the playbooks enforce, so the +operator gets a clear message instead of an Ansible assertion failure: package +pins must be `package=version`; service names must be in the playbook allowlist; +script paths must be inside `/opt/blueforce/bin` or `/usr/local/sbin`; the reboot +grace period must be a whole number of seconds. + +## 6. Dry runs + +- `--dry-run` prints every command and executes nothing. +- Answering `c` at the run prompt executes the command with `--check` appended, + which is a real Ansible dry run. +- Category 1's pre-flight already is the installer's own `--check`. + +## 7. Audit log + +Default `/var/log/blueforce-console.log`, created with mode **600** (it is +re-`chmod`ed to 600 if it already exists). If it is not writable, the console +warns and falls back to `$XDG_STATE_HOME/blueforce/blueforce-console.log`; it +never logs into a world-readable file. + +Each run records one line per event: session start, target, the exact command, +and the exit status. It does **not** store raw playbook output: tool output may +contain whatever a device script prints, and copying it into a log is how a +secret ends up on disk. Output is shown on screen and stays there. + +Before anything reaches the log it passes a single sanitizer that redacts +`password=`, `token=`, `secret=`, `api_key=`, `private_key=`, `passphrase=`, +`psk=` and `BEGIN … PRIVATE KEY` payloads. The console itself never asks for a +secret: no password, token or private key is typed into or stored by it. + +## 8. Security notes + +- **No secret material is read, printed or logged.** The console never runs bare + `wg show` (private and preshared keys stay off the screen) — only the listen + port, peer count and handshake ages. +- **`state.json` is read through a whitelist** of non-secret keys (`phase`, + `enrollment_status`, `fleet_status`, `device_id`, `provisioning_id`). A future + token field cannot leak into the UI or the log. +- **No ungated update.** There is no `apt upgrade`, no `latest` pull and no + free-form command anywhere in the menu; updates go through the release-gated + playbook or not at all (docs/10). +- **Destructive actions ask twice**: a warning plus an explicit `y`, and the + highest-risk scopes need a typed word (`GATE`, `production`, `all`, or the wave + name in a fleet-wide loop). +- **Fail-closed on drift**: if the playbook's declared gates do not match the + console's expectations, the console refuses to run that playbook at all. +- **Root is used where the underlying tool needs it** (local installer, support + bundle). Read-only information screens are careful about what they read. +- The console **never edits the inventory**. Adding a device stays a reviewed + edit of `ansible/inventory/hosts.yml`: + +```yaml + pilot_1: + hosts: + bf-12010193: + ansible_host: 10.42.1.20 +``` + +## 9. Deliberately out of scope + +- **No distro/ISO build.** ISO and firstboot remain a secondary path (`docs/26`, + `docs/27`); the primary install path is `git clone` + install. Category 4 does + not offer `provisioning/iso/build-blueforce-iso.sh`. +- **No password generation.** Credential files are the separate, optional + `admin/bf-creds` tool and default to **off**; the console does not call it. +- **No central server installation.** Category 3 verifies and prepares; + installing the hub, monitoring or the token service is infrastructure work. +- **No new playbooks, no free-form commands.** If an operation is not one of the + 21 existing playbooks, the console does not fake it. + +## 10. Troubleshooting + +| Symptom | Why | What to do | +|---|---|---| +| `ansible-playbook was not found on this machine` | categories 2/3 need Ansible on the driving machine | `sudo apt install ansible` (or `pipx install ansible-core`), or run the command from another admin host | +| `No Ansible inventory found under …` | no `ansible/inventory/hosts.yml` yet | `cp ansible/inventory/hosts.example.yml ansible/inventory/hosts.yml`, then fill in real `bf-` hosts | +| Only `hosts.example.yml` exists | it holds example IDs and is never used automatically | copy it and replace the example devices | +| `Invalid dealer number ''` | must be exactly 8 digits | type the number as printed on the device record, leading zeros included | +| `bf- is not in the inventory` | the device is not registered | add it to the right wave group (§8), then retry | +| `… is not an approved wave` | a wave-scoped or release-gated operation got a non-wave group | pick one of `lab, pilot_1, pilot_2, wave_1, wave_2, production` | +| `Refusing to run : the console expects scope …` | the playbook's gates changed since the console table was written | update `admin/bf-menu` before using that playbook | +| `This operation needs root on THIS device` | local install runs as root | `sudo bf-menu` | +| Log warning about `/var/log/blueforce-console.log` | not writable, another admin owns it, or the mode is wrong | run with `sudo`, or pass `--log-file ` | + +## 11. Files + +| File | Role | +|---|---| +| `admin/bf-menu` | entry point: menu screens, operation catalogue, command building, confirmations, audit log | +| `admin/lib/tui.sh` | presentation and input helpers (screens, items, prompts, confirmations, messages) | +| `admin/lib/targets.sh` | device identity, inventory parsing, target selection, `--limit` construction | + +Library contract: `bf-menu` sets `BF_REPO`/`BF_INVENTORY` and sources both +libraries; `targets.sh` fills `BF_TARGET_KIND`, `BF_TARGET_LIMIT`, +`BF_TARGET_WAVE`, `BF_TARGET_COUNT`, `BF_TARGET_LABEL` and never renders UI or +executes anything; `tui.sh` never exits the process except in `tui_die`. + +Both libraries are safe to source on their own, which is how the target logic and +the inventory parser can be tested without a terminal. + +## 12. Verifying a change + +```bash +bash -n admin/bf-menu admin/lib/tui.sh admin/lib/targets.sh +shellcheck -x admin/bf-menu admin/lib/tui.sh admin/lib/targets.sh +admin/bf-menu --list # catalogue, no inventory needed +admin/bf-menu --list-targets # groups, hosts and counts +``` + +`--list` and `--list-targets` are the non-interactive entry points: they exercise +the catalogue and the inventory parser without touching a device. + +The console was checked on an admin workstation with a stub `ansible-playbook` +that echoes its arguments, covering: every scope/target combination and the exact +`-e` variables produced, the refusal paths (single device for release scope, +fleet-wide release run, wrong wave for a wave-scoped run, bad dealer number, +unknown device, bad package pin, service outside the allowlist, script outside +the approved directories, production/gate/fleet-wide words withheld), `--dry-run` +executing nothing, `--check` being appended, the missing-Ansible and +missing-inventory explanations, the log's 600 mode and its redaction of a test +secret, and clean EOF behaviour on a closed stdin. Playbook coverage was +cross-checked programmatically: all 21 playbooks in `ansible/playbooks/` appear +exactly once and every declared scope matches the playbook's own gate variables. +Real devices have not been touched yet — the LAB run is what turns these +expectations into evidence. + + # Shared variables for all Blueforce fleet hosts. # Fill placeholders before first production run. @@ -266,6 +10459,10 @@ reboot_grace_seconds: 300 support_bundle_dir: /var/lib/blueforce/support-bundles + + + + # Blueforce fleet inventory (EXAMPLE - copy to hosts.yml and fill real IDs). # Naming: bf-<8-digit-dealer-no> per docs/02-DEVICE-NAMING-AND-INVENTORY.md. @@ -323,6 +10520,10 @@ all: ansible_python_interpreter: /usr/bin/python3 + + + + --- # Collect timestamped journald logs and a support snapshot from one approved wave. @@ -543,6 +10744,428 @@ all: msg: "{{ inventory_hostname }} docker={{ docker_svc.status.ActiveState | default('unknown') }} containers={{ docker_ps.stdout_lines | default([]) }}" + +--- +# Blueforce enrollment durum raporu -- READ-ONLY, dalga kapsamlı. +# Ne yapar: her cihaz için enrollment_status + fleet_status + faz yazar; ENROLLED/READY iddiası +# olup merkezi doğrulama kanıtı (central_verification: status + verification_id + +# monitoring/remote/management kanalları) eksik olan cihazları listeler. +# Sözleşme: docs/29 (merkezi doğrulama yanıtı), docs/14 (bf-status). +# Kanıt: /var/lib/blueforce/state.json ve kanonik /usr/local/bin/bf-enrollment-status çıktısı. +# Hiçbir görev durum değiştirmez: yalnız stat/slurp ve read-only CLI çıktısı okunur; tüm +# command görevleri changed_when: false taşır. +# Kuru koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-enrollment-status.yml -e operation_wave=lab -e operation_confirmed=true --check +# Koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-enrollment-status.yml -e operation_wave=lab -e operation_confirmed=true +# Semaphore Pro bağımlılığı yok. +# Dalga kapısı: operation_wave + operation_confirmed (+ production_override) rapor play'inden ÖNCE, +# hiçbir hosta dokunmadan doğrulanır; --limit dalga ile kesişmezse koşu reddedilir (fail-closed). +- name: Dalga ve onay kapısı -- hiçbir hosta dokunmadan önce (mutasyon yok) + hosts: "{{ ansible_limit | default('localhost') }}" + gather_facts: false + become: false + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + operation_wave_gate: "{{ operation_wave | default('invalid-wave', true) }}" + tasks: + - name: Require an approved confirmed operation wave before any host is touched + ansible.builtin.assert: + that: + - operation_wave_gate in approved_operation_waves + - operation_confirmed | default(false) | bool + - operation_wave_gate in groups + - groups[operation_wave_gate] | length > 0 + - (operation_wave_gate != 'production') or (production_override | default(false) | bool) + fail_msg: "operation_wave must name a non-empty approved inventory group (lab/pilot_1/pilot_2/wave_1/wave_2/production), operation_confirmed=true is required, and production additionally requires production_override=true." + run_once: true + + - name: Require the --limit selection to intersect the declared wave + ansible.builtin.assert: + that: + - (((ansible_limit | default('') | split(',') | intersect(groups[operation_wave_gate]) | length) > 0) + or ((ansible_limit | default('') | split(',') | select('in', groups) | map('extract', groups) | flatten | unique | intersect(groups[operation_wave_gate]) | length) > 0)) + fail_msg: "--limit selection '{{ ansible_limit }}' does not intersect the '{{ operation_wave_gate }}' wave; refusing a mis-scoped run." + when: + - (ansible_limit | default('') | length) > 0 + - not (ansible_limit | default('') is search('[][*?]')) + run_once: true + +- name: Enrollment ve merkez kanıtı durumunu raporla (read-only) + hosts: "{{ operation_wave | default('invalid-wave', true) }}" + gather_facts: false + become: true # Yalnız root sahipli kanıt dosyalarını (state.json 0600) OKUMAK için; mutasyon yok. + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + enrollment_state_file: /var/lib/blueforce/state.json + enrollment_status_bin: /usr/local/bin/bf-enrollment-status + enrollment_central_channels: [monitoring, remote, management] + enrollment_central_required_for: [ENROLLED, READY] + pre_tasks: + - name: Require confirmed approved operation wave scope + ansible.builtin.assert: + that: + - operation_wave in approved_operation_waves + - operation_confirmed | bool + - operation_wave in groups + - groups[operation_wave] | length > 0 + - ansible_play_hosts_all | length > 0 + - ansible_play_hosts_all | difference(groups[operation_wave]) | length == 0 + fail_msg: "Set operation_wave to one inventory wave and operation_confirmed=true; full-fleet scope is refused." + run_once: true + + - name: Require separate production override + ansible.builtin.assert: + that: + - operation_wave != 'production' or production_override | bool + fail_msg: "Production operation requires production_override=true in addition to operation_confirmed=true." + run_once: true + tasks: + - name: Enrollment kanıt yollarını denetle (read-only) + ansible.builtin.stat: + path: "{{ item }}" + loop: + - "{{ enrollment_state_file }}" + - "{{ enrollment_status_bin }}" + register: enrollment_evidence + + - name: Kanıt durumlarını yol ile indeksle + ansible.builtin.set_fact: + enrollment_evidence_by_path: "{{ enrollment_evidence.results | items2dict(key_name='item', value_name='stat') }}" + + - name: Durum dosyasını oku (read-only) + ansible.builtin.slurp: + src: "{{ enrollment_state_file }}" + register: enrollment_state_raw + when: + - enrollment_evidence_by_path[enrollment_state_file].exists | default(false) + - enrollment_evidence_by_path[enrollment_state_file].size | default(0) | int > 0 + + - name: Kanonik enrollment durumunu oku (bf-enrollment-status, read-only) + ansible.builtin.command: "{{ enrollment_status_bin }}" + register: enrollment_status_cli + changed_when: false + failed_when: false + when: enrollment_evidence_by_path[enrollment_status_bin].exists | default(false) + + - name: Durum dosyası içeriğini çöz (bozuk dosyada rapor PENDING kalır, koşu durmaz) + ansible.builtin.set_fact: + enrollment_state_parsed: "{{ enrollment_state_raw.content | b64decode | from_json }}" + when: enrollment_state_raw.content is defined + ignore_errors: true + + - name: Enrollment alanlarını ve merkez kanıtını belirle + ansible.builtin.set_fact: + bf_enr_device_id: "{{ (enrollment_state_parsed | default({}, true)).get('device_id', inventory_hostname | upper) }}" + bf_enr_phase: >- + {{ (enrollment_state_parsed | default({}, true)).get('phase', '') | default('', true) + if (enrollment_state_parsed | default({}, true)).get('phase', '') in ['PROVISIONED_OFFLINE', 'ENROLLED', 'READY'] + else 'PENDING' }} + bf_enr_enrollment_status: "{{ (enrollment_state_parsed | default({}, true)).get('enrollment_status', 'PENDING') | default('PENDING', true) }}" + bf_enr_fleet_status: "{{ (enrollment_state_parsed | default({}, true)).get('fleet_status', 'PENDING') | default('PENDING', true) }}" + bf_enr_central: "{{ (enrollment_state_parsed | default({}, true)).get('central_verification', {}) | default({}, true) }}" + bf_enr_cli_lifecycle: "{{ enrollment_status_cli.stdout | default('') | regex_findall('(?m)^Lifecycle: (.+)$') | first | default('', true) }}" + bf_enr_cli_enrollment: "{{ enrollment_status_cli.stdout | default('') | regex_findall('(?m)^Enrollment: (.+)$') | first | default('', true) }}" + + - name: Merkez doğrulama kanallarını çıkar + ansible.builtin.set_fact: + bf_enr_central_status: "{{ bf_enr_central.get('status', '') | default('', true) }}" + bf_enr_central_id: "{{ bf_enr_central.get('verification_id', '') | default('', true) }}" + bf_enr_central_channel_states: "{{ dict(enrollment_central_channels | zip(enrollment_central_channels | map('extract', bf_enr_central, 'status') | map('default', 'pending', true) | list)) }}" + bf_enr_central_channel_ids: "{{ dict(enrollment_central_channels | zip(enrollment_central_channels | map('extract', bf_enr_central, 'verification_id') | map('default', '', true) | list)) }}" + + - name: Merkez kanıtı tam mı hesapla + ansible.builtin.set_fact: + bf_enr_central_ok: >- + {{ (bf_enr_central_status == 'verified') + and (bf_enr_central_id | length > 0) + and (bf_enr_central_channel_states.values() | select('equalto', 'verified') | list | length == bf_enr_central_channel_states | length) + and (bf_enr_central_channel_ids.values() | select('equalto', '') | list | length == 0) }} + bf_enr_cli_mismatch: "{{ 'MISMATCH' if (bf_enr_cli_lifecycle | length > 0) and (bf_enr_cli_lifecycle != bf_enr_phase) else 'OK' }}" + + - name: Merkez kanıtı durumunu etiketle + ansible.builtin.set_fact: + bf_enr_central_state: >- + {{ 'not-required' if (bf_enr_enrollment_status != 'ENROLLED' and bf_enr_phase not in enrollment_central_required_for) + else ('verified' if bf_enr_central_ok | bool else 'MISSING') }} + bf_enr_missing_central: >- + {{ (bf_enr_enrollment_status == 'ENROLLED' or bf_enr_phase in enrollment_central_required_for) + and not (bf_enr_central_ok | bool) }} + + - name: Cihaz enrollment satırını raporla + ansible.builtin.debug: + msg: >- + {{ bf_enr_device_id }} phase={{ bf_enr_phase }} enrollment={{ bf_enr_enrollment_status }} + fleet={{ bf_enr_fleet_status }} merkez_kaniti={{ bf_enr_central_state }} + kanallar={{ bf_enr_central_channel_states }} kanit_id={{ 'SET' if bf_enr_central_id | length > 0 else 'ABSENT' }} + + - name: Eksik merkez kanıtı olan cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ bf_enr_device_id }}: enrollment/faz iddiası var ama merkez kanıtı eksik ({{ bf_enr_central_state }}); READY verilemez (docs/29)." + when: bf_enr_missing_central | bool + + - name: Merkez kanıtı eksik kanalları ayrıntılı yaz + ansible.builtin.debug: + msg: "UYARI {{ bf_enr_device_id }}: kanal kanıtı eksik -> {{ bf_enr_incomplete_channels }}" + vars: + bf_enr_incomplete_channels: "{{ bf_enr_central_channel_states | dict2items | rejectattr('value', 'equalto', 'verified') | map(attribute='key') | list }}" + when: bf_enr_missing_central | bool + + - name: Kalıcı faz ile kanonik CLI çıktısı çelişen cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ bf_enr_device_id }}: state.json phase={{ bf_enr_phase }} ama bf-enrollment-status Lifecycle={{ bf_enr_cli_lifecycle }}." + when: bf_enr_cli_mismatch == 'MISMATCH' + + - name: Enrollment durum dağılımını hesapla + ansible.builtin.set_fact: + bf_enr_status_histogram: "{{ bf_enr_status_histogram | default({}) | combine({ item: bf_enr_wave_states | select('equalto', item) | list | length }) }}" + loop: "{{ bf_enr_wave_states | unique | sort }}" + vars: + bf_enr_wave_states: "{{ ansible_play_hosts_all | map('extract', hostvars, 'bf_enr_enrollment_status') | map('default', 'PENDING', true) | list }}" + run_once: true + + - name: Fleet durum dağılımını hesapla + ansible.builtin.set_fact: + bf_enr_fleet_histogram: "{{ bf_enr_fleet_histogram | default({}) | combine({ item: bf_enr_wave_fleet | select('equalto', item) | list | length }) }}" + loop: "{{ bf_enr_wave_fleet | unique | sort }}" + vars: + bf_enr_wave_fleet: "{{ ansible_play_hosts_all | map('extract', hostvars, 'bf_enr_fleet_status') | map('default', 'PENDING', true) | list }}" + run_once: true + + - name: Dalga enrollment özetini yaz + ansible.builtin.debug: + msg: + - "Dalga {{ operation_wave }} | raporlanan cihaz: {{ ansible_play_hosts_all | length }}" + - "enrollment_status: {{ bf_enr_status_histogram | default({}) }}" + - "fleet_status: {{ bf_enr_fleet_histogram | default({}) }}" + run_once: true + + - name: Eksik merkez kanıtı olan cihazların dalga listesini yaz + ansible.builtin.debug: + msg: "Merkez kanıtı eksik cihazlar: {{ bf_enr_missing_central_hosts }}" + vars: + bf_enr_missing_central_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_enr_central_state') | map('default', 'MISSING', true) | list)) | dict2items | selectattr('value', 'equalto', 'MISSING') | map(attribute='key') | list }}" + run_once: true + + - name: Kanonik CLI ile çelişen cihazların dalga listesini yaz + ansible.builtin.debug: + msg: "state.json ve bf-enrollment-status çelişkili cihazlar: {{ bf_enr_cli_mismatch_hosts }}" + vars: + bf_enr_cli_mismatch_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_enr_cli_mismatch') | map('default', 'OK', true) | list)) | dict2items | selectattr('value', 'equalto', 'MISMATCH') | map(attribute='key') | list }}" + run_once: true + + + +--- +# Blueforce Field OS sürüm raporu -- READ-ONLY, dalga kapsamlı. +# Ne yapar: bir dalgadaki cihazların Field OS sürümünü kanıt dosyalarından toplar, cihaz başına +# tek satır yazar ve sürüm başına cihaz sayısını (toplu özet) üretir. +# Kanıt sırası: /usr/local/bin/bf-release (kanonik) -> /etc/blueforce/release-manifest.yaml +# -> eski /etc/blueforce-release (KEY=VALUE) -> /var/lib/blueforce/state.json. +# Hiçbir görev durum değiştirmez: yalnız stat/slurp ve read-only CLI çıktısı okunur; tüm +# command görevleri changed_when: false taşır. +# Kuru koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-fieldos-version.yml -e operation_wave=lab -e operation_confirmed=true --check +# Koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-fieldos-version.yml -e operation_wave=lab -e operation_confirmed=true +# Opsiyonel drift denetimi: -e fieldos_expected_version=1.0.0 +# Semaphore Pro bağımlılığı yok. +# Dalga kapısı: operation_wave + operation_confirmed (+ production_override) rapor play'inden ÖNCE, +# hiçbir hosta dokunmadan doğrulanır; --limit dalga ile kesişmezse koşu reddedilir (fail-closed). +- name: Dalga ve onay kapısı -- hiçbir hosta dokunmadan önce (mutasyon yok) + hosts: "{{ ansible_limit | default('localhost') }}" + gather_facts: false + become: false + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + operation_wave_gate: "{{ operation_wave | default('invalid-wave', true) }}" + tasks: + - name: Require an approved confirmed operation wave before any host is touched + ansible.builtin.assert: + that: + - operation_wave_gate in approved_operation_waves + - operation_confirmed | default(false) | bool + - operation_wave_gate in groups + - groups[operation_wave_gate] | length > 0 + - (operation_wave_gate != 'production') or (production_override | default(false) | bool) + fail_msg: "operation_wave must name a non-empty approved inventory group (lab/pilot_1/pilot_2/wave_1/wave_2/production), operation_confirmed=true is required, and production additionally requires production_override=true." + run_once: true + + - name: Require the --limit selection to intersect the declared wave + ansible.builtin.assert: + that: + - (((ansible_limit | default('') | split(',') | intersect(groups[operation_wave_gate]) | length) > 0) + or ((ansible_limit | default('') | split(',') | select('in', groups) | map('extract', groups) | flatten | unique | intersect(groups[operation_wave_gate]) | length) > 0)) + fail_msg: "--limit selection '{{ ansible_limit }}' does not intersect the '{{ operation_wave_gate }}' wave; refusing a mis-scoped run." + when: + - (ansible_limit | default('') | length) > 0 + - not (ansible_limit | default('') is search('[][*?]')) + run_once: true + +- name: Field OS sürümünü toplu raporla (read-only) + hosts: "{{ operation_wave | default('invalid-wave', true) }}" + gather_facts: false + become: true # Yalnız root sahipli kanıt dosyalarını (state.json 0600) OKUMAK için; mutasyon yok. + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + fieldos_release_bin: /usr/local/bin/bf-release + fieldos_manifest_file: /etc/blueforce/release-manifest.yaml + fieldos_legacy_file: /etc/blueforce-release + fieldos_state_file: /var/lib/blueforce/state.json + fieldos_expected_version: "" + fieldos_unknown_label: UNKNOWN + pre_tasks: + - name: Require confirmed approved operation wave scope + ansible.builtin.assert: + that: + - operation_wave in approved_operation_waves + - operation_confirmed | bool + - operation_wave in groups + - groups[operation_wave] | length > 0 + - ansible_play_hosts_all | length > 0 + - ansible_play_hosts_all | difference(groups[operation_wave]) | length == 0 + fail_msg: "Set operation_wave to one inventory wave and operation_confirmed=true; full-fleet scope is refused." + run_once: true + + - name: Require separate production override + ansible.builtin.assert: + that: + - operation_wave != 'production' or production_override | bool + fail_msg: "Production operation requires production_override=true in addition to operation_confirmed=true." + run_once: true + tasks: + - name: Kanıt yollarının varlığını denetle (read-only) + ansible.builtin.stat: + path: "{{ item }}" + loop: + - "{{ fieldos_release_bin }}" + - "{{ fieldos_manifest_file }}" + - "{{ fieldos_legacy_file }}" + - "{{ fieldos_state_file }}" + register: fieldos_evidence + + - name: Kanıt durumlarını yol ile indeksle + ansible.builtin.set_fact: + fieldos_evidence_by_path: "{{ fieldos_evidence.results | items2dict(key_name='item', value_name='stat') }}" + + - name: Kanonik sürüm raporunu oku (bf-release, read-only) + ansible.builtin.command: "{{ fieldos_release_bin }}" + register: fieldos_release_out + changed_when: false + failed_when: fieldos_release_out.rc not in [0, 1] + when: fieldos_evidence_by_path[fieldos_release_bin].exists | default(false) + + - name: Release manifestini oku (read-only) + ansible.builtin.slurp: + src: "{{ fieldos_manifest_file }}" + register: fieldos_manifest_raw + when: + - fieldos_evidence_by_path[fieldos_manifest_file].exists | default(false) + - fieldos_evidence_by_path[fieldos_manifest_file].size | default(0) | int > 0 + + - name: Eski /etc/blueforce-release dosyasını oku (read-only) + ansible.builtin.slurp: + src: "{{ fieldos_legacy_file }}" + register: fieldos_legacy_raw + when: + - fieldos_evidence_by_path[fieldos_legacy_file].exists | default(false) + - fieldos_evidence_by_path[fieldos_legacy_file].size | default(0) | int > 0 + + - name: Field OS durum dosyasını oku (read-only) + ansible.builtin.slurp: + src: "{{ fieldos_state_file }}" + register: fieldos_state_raw + when: + - fieldos_evidence_by_path[fieldos_state_file].exists | default(false) + - fieldos_evidence_by_path[fieldos_state_file].size | default(0) | int > 0 + + - name: Durum dosyası içeriğini çöz (bozuk dosyada rapor UNKNOWN kalır, koşu durmaz) + ansible.builtin.set_fact: + fieldos_state_parsed: "{{ fieldos_state_raw.content | b64decode | from_json }}" + when: fieldos_state_raw.content is defined + ignore_errors: true + + - name: Kanıt metinlerini çözümle + ansible.builtin.set_fact: + fieldos_manifest_text: "{{ (fieldos_manifest_raw.content | b64decode) if fieldos_manifest_raw.content is defined else '' }}" + fieldos_legacy_text: "{{ (fieldos_legacy_raw.content | b64decode) if fieldos_legacy_raw.content is defined else '' }}" + fieldos_state_ok: "{{ fieldos_state_parsed is defined and fieldos_state_parsed is mapping }}" + + - name: Sürüm alanlarını kanıtlardan çıkar + ansible.builtin.set_fact: + fieldos_release_line: "{{ fieldos_release_out.stdout_lines | default([]) | select('search', '^Field OS: ') | list | first | default('', true) }}" + fieldos_manifest_name_raw: "{{ fieldos_manifest_text | regex_findall('(?m)^[ ]+name: ([^ ]+)') | first | default('', true) }}" + fieldos_manifest_version_raw: "{{ fieldos_manifest_text | regex_findall('(?m)^[ ]+version: ([^ ]+)') | first | default('', true) }}" + fieldos_manifest_status_raw: "{{ fieldos_manifest_text | regex_findall('(?m)^[ ]+status: ([^ ]+)') | first | default('', true) }}" + fieldos_legacy_version_raw: "{{ fieldos_legacy_text | regex_findall('(?mi)^version=(.+)$') | first | default('', true) }}" + fieldos_state_version_raw: "{{ (fieldos_state_parsed | default({}, true)).get('field_os_version', (fieldos_state_parsed | default({}, true)).get('release_version', '')) | default('', true) }}" + fieldos_device_id: "{{ (fieldos_state_parsed | default({}, true)).get('device_id', inventory_hostname | upper) }}" + + - name: Sürüm değerlerini normalize et (unknown/boş değer geçersiz sayılır) + ansible.builtin.set_fact: + fieldos_release_version: "{{ fieldos_release_line | trim | regex_replace('(?i)^unknown$', '') }}" + fieldos_manifest_version: "{{ fieldos_manifest_version_raw | trim | regex_replace('(?i)^(unknown|skeleton)$', '') }}" + fieldos_legacy_version: "{{ fieldos_legacy_version_raw | trim | regex_replace('(?i)^unknown$', '') }}" + fieldos_state_version: "{{ fieldos_state_version_raw | trim | regex_replace('(?i)^unknown$', '') }}" + + - name: Field OS sürümünü ve kanıt kaynağını belirle + ansible.builtin.set_fact: + fieldos_version: "{{ [fieldos_release_version, fieldos_manifest_version, fieldos_legacy_version, fieldos_state_version] | reject('equalto', '') | list | first | default(fieldos_unknown_label, true) }}" + fieldos_version_source: >- + {{ 'bf-release' if fieldos_release_version | length > 0 + else ('release-manifest' if fieldos_manifest_version | length > 0 + else ('blueforce-release' if fieldos_legacy_version | length > 0 + else ('state.json' if fieldos_state_version | length > 0 else 'none'))) }} + fieldos_release_status: >- + {{ 'UNAPPROVED_SKELETON' if fieldos_manifest_status_raw | trim | lower == 'skeleton' + else (fieldos_manifest_status_raw | trim | upper if fieldos_manifest_status_raw | trim | length > 0 else 'UNKNOWN') }} + fieldos_release_name: "{{ fieldos_manifest_name_raw | trim | default('', true) }}" + + - name: Cihaz sürüm satırını raporla + ansible.builtin.debug: + msg: "{{ fieldos_device_id }} -> {{ fieldos_version }} (kaynak={{ fieldos_version_source }}, release={{ fieldos_release_status }})" + + - name: Sürümü doğrulanamayan cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ fieldos_device_id }}: Field OS sürüm kanıtı yok (kaynak=none); cihaz inceleme/yeniden provision gerektirir." + when: fieldos_version == fieldos_unknown_label + + - name: Onaysız iskelet release taşıyan cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ fieldos_device_id }}: release status UNAPPROVED_SKELETON; saha cihazı olarak kabul edilmez." + when: fieldos_release_status == 'UNAPPROVED_SKELETON' + + - name: Beklenen sürümden sapan cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ fieldos_device_id }}: sürüm {{ fieldos_version }}, beklenen {{ fieldos_expected_version }}." + when: + - fieldos_expected_version | length > 0 + - fieldos_version != fieldos_expected_version + + - name: Dalga sürüm dağılımını hesapla (sürüm -> cihaz sayısı) + ansible.builtin.set_fact: + fieldos_version_histogram: "{{ fieldos_version_histogram | default({}) | combine({ item: fieldos_wave_versions | select('equalto', item) | list | length }) }}" + loop: "{{ fieldos_wave_versions | unique | sort }}" + vars: + fieldos_wave_versions: "{{ ansible_play_hosts_all | map('extract', hostvars, 'fieldos_version') | map('default', fieldos_unknown_label, true) | list }}" + run_once: true + + - name: Dalga sürüm özetini yaz + ansible.builtin.debug: + msg: + - "Dalga {{ operation_wave }} | raporlanan cihaz: {{ ansible_play_hosts_all | length }}" + - "Sürüm dağılımı: {{ fieldos_version_histogram | default({}) }}" + - "Beklenen sürüm: {{ fieldos_expected_version if fieldos_expected_version | length > 0 else '(verilmedi, drift denetimi atlandi)' }}" + run_once: true + + - name: Sürüm kanıtı olmayan cihazların dalga listesini yaz + ansible.builtin.debug: + msg: "Sürüm kanıtı olmayan cihazlar: {{ fieldos_missing_version_hosts }}" + vars: + fieldos_missing_version_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'fieldos_version') | map('default', fieldos_unknown_label, true) | list)) | dict2items | selectattr('value', 'equalto', fieldos_unknown_label) | map(attribute='key') | list }}" + run_once: true + + --- # Disable the GUI for a confirmed maintenance wave (kiosk/headless mode). @@ -629,6 +11252,281 @@ all: failed_when: current_default_target.stdout != 'multi-user.target' + +--- +# Blueforce offline hazırlık raporu -- READ-ONLY, dalga kapsamlı. +# Ne yapar: internet olmadan PROVISIONED_OFFLINE durumuna ulaşmayı sağlayan yerel ön koşulları +# kanıtlarıyla raporlar: +# 1) offline APT repo mevcut mu (BF_OFFLINE_REPO, varsayılan /opt/blueforce/offline-repo, +# zorunlu Packages/Packages.gz/packages.lock.tsv/SHA256SUMS dosyaları), +# 2) yerel paketler doğrulanmış mı (sha256sum -c SHA256SUMS, paket kilidi şeması, +# havuzda pinlenen .deb dosyaları), +# 3) firstboot tamamlanma damgası var mı (/var/lib/blueforce/firstboot-complete), +# 4) onaysız update kapısı aktif mi (20auto-upgrades değerleri 0 + apt-daily timer +# maskeleme + apt/dpkg kilidi meşgul değil). +# Sözleşme: docs/27 (offline provisioning), docs/10 (update kapısı), docs/05 modül 14. +# Hiçbir görev durum değiştirmez: yalnız stat/slurp ve read-only CLI çıktısı okunur; tüm command +# görevleri changed_when: false taşır. +# Kuru koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-offline-ready-check.yml -e operation_wave=lab -e operation_confirmed=true --check +# Koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-offline-ready-check.yml -e operation_wave=lab -e operation_confirmed=true +# SHA256 doğrulamasını atlamak için: -e bf_offline_verify_hashes=false +# Semaphore Pro bağımlılığı yok. +# Dalga kapısı: operation_wave + operation_confirmed (+ production_override) rapor play'inden ÖNCE, +# hiçbir hosta dokunmadan doğrulanır; --limit dalga ile kesişmezse koşu reddedilir (fail-closed). +- name: Dalga ve onay kapısı -- hiçbir hosta dokunmadan önce (mutasyon yok) + hosts: "{{ ansible_limit | default('localhost') }}" + gather_facts: false + become: false + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + operation_wave_gate: "{{ operation_wave | default('invalid-wave', true) }}" + tasks: + - name: Require an approved confirmed operation wave before any host is touched + ansible.builtin.assert: + that: + - operation_wave_gate in approved_operation_waves + - operation_confirmed | default(false) | bool + - operation_wave_gate in groups + - groups[operation_wave_gate] | length > 0 + - (operation_wave_gate != 'production') or (production_override | default(false) | bool) + fail_msg: "operation_wave must name a non-empty approved inventory group (lab/pilot_1/pilot_2/wave_1/wave_2/production), operation_confirmed=true is required, and production additionally requires production_override=true." + run_once: true + + - name: Require the --limit selection to intersect the declared wave + ansible.builtin.assert: + that: + - (((ansible_limit | default('') | split(',') | intersect(groups[operation_wave_gate]) | length) > 0) + or ((ansible_limit | default('') | split(',') | select('in', groups) | map('extract', groups) | flatten | unique | intersect(groups[operation_wave_gate]) | length) > 0)) + fail_msg: "--limit selection '{{ ansible_limit }}' does not intersect the '{{ operation_wave_gate }}' wave; refusing a mis-scoped run." + when: + - (ansible_limit | default('') | length) > 0 + - not (ansible_limit | default('') is search('[][*?]')) + run_once: true + +- name: Offline hazırlık ön koşullarını raporla (read-only) + hosts: "{{ operation_wave | default('invalid-wave', true) }}" + gather_facts: false + become: true # Yalnız root sahipli offline repo/durum dosyalarını OKUMAK için; mutasyon yok. + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + bf_offline_repo: "{{ bf_offline_repo_path | default('/opt/blueforce/offline-repo') }}" + bf_offline_verify_hashes: true + offline_firstboot_marker: /var/lib/blueforce/firstboot-complete + offline_list_file: /var/lib/blueforce/offline.list + offline_installer: /usr/local/sbin/blueforce-install.sh + offline_dealer_id_file: /etc/blueforce/dealer-id + offline_apt_periodic_conf: /etc/apt/apt.conf.d/20auto-upgrades + offline_required_repo_files: [Packages, Packages.gz, packages.lock.tsv, SHA256SUMS] + offline_update_timers: [apt-daily.timer, apt-daily-upgrade.timer] + offline_pkg_processes: [apt-get, apt, dpkg] + pre_tasks: + - name: Require confirmed approved operation wave scope + ansible.builtin.assert: + that: + - operation_wave in approved_operation_waves + - operation_confirmed | bool + - operation_wave in groups + - groups[operation_wave] | length > 0 + - ansible_play_hosts_all | length > 0 + - ansible_play_hosts_all | difference(groups[operation_wave]) | length == 0 + fail_msg: "Set operation_wave to one inventory wave and operation_confirmed=true; full-fleet scope is refused." + run_once: true + + - name: Require separate production override + ansible.builtin.assert: + that: + - operation_wave != 'production' or production_override | bool + fail_msg: "Production operation requires production_override=true in addition to operation_confirmed=true." + run_once: true + tasks: + - name: Offline kanıt yollarını denetle (read-only) + ansible.builtin.stat: + path: "{{ item }}" + loop: + - "{{ bf_offline_repo }}" + - "{{ offline_firstboot_marker }}" + - "{{ offline_list_file }}" + - "{{ offline_installer }}" + - "{{ offline_dealer_id_file }}" + - "{{ offline_apt_periodic_conf }}" + register: offline_evidence + + - name: Zorunlu offline repo dosyalarını denetle (read-only) + ansible.builtin.stat: + path: "{{ bf_offline_repo }}/{{ item }}" + loop: "{{ offline_required_repo_files }}" + register: offline_repo_file_stats + + - name: Kanıt durumlarını yol ile indeksle + ansible.builtin.set_fact: + offline_evidence_by_path: "{{ offline_evidence.results | items2dict(key_name='item', value_name='stat') }}" + bf_off_repo_files: "{{ dict(offline_repo_file_stats.results | map(attribute='item') | list | zip(offline_repo_file_stats.results | map(attribute='stat') | list)) }}" + bf_off_missing_files: >- + {{ (offline_repo_file_stats.results | selectattr('stat', 'defined') | rejectattr('stat.exists') | map(attribute='item') | list) + + (offline_repo_file_stats.results | selectattr('stat', 'defined') | selectattr('stat.exists') | selectattr('stat.size', 'equalto', 0) | map(attribute='item') | list) }} + + - name: Paket kilidi satırlarını doğrula (awk, read-only) + ansible.builtin.command: + argv: + - awk + - 'NR==1 {hdr = ($1=="package" && $2=="version" && $3=="architecture" && $4=="sha256" && $5=="source") ? 1 : 0; next} /^[[:space:]]*#/ || NF==0 {next} {rows++; if (NF==5 && $1 ~ /^[a-z0-9][a-z0-9+.-]*$/ && $4 ~ /^[a-f0-9]{64}$/ && $2!="" && $3!="" && $5!="") {ok++}} END {printf "header=%d rows=%d valid=%d\n", hdr, rows, ok}' + - "{{ bf_offline_repo }}/packages.lock.tsv" + register: offline_lock_probe + changed_when: false + failed_when: false + when: + - bf_off_repo_files['packages.lock.tsv'].exists | default(false) + - bf_off_repo_files['packages.lock.tsv'].size | default(0) | int > 0 + + - name: Kilitli paket kaynak yollarını listele (awk, read-only) + ansible.builtin.command: + argv: + - awk + - 'NR>1 && NF>0 && $0 !~ /^[[:space:]]*#/ {print $5}' + - "{{ bf_offline_repo }}/packages.lock.tsv" + register: offline_lock_sources + changed_when: false + failed_when: false + when: + - bf_off_repo_files['packages.lock.tsv'].exists | default(false) + - bf_off_repo_files['packages.lock.tsv'].size | default(0) | int > 0 + + - name: Pinlenen paketlerin havuz dosyalarını denetle (read-only) + ansible.builtin.stat: + path: "{{ bf_offline_repo }}/pool/{{ item }}" + loop: "{{ offline_lock_sources.stdout_lines | default([]) }}" + register: offline_pool_files + + - name: Yerel APT indekslerinin SHA256 doğrulamasını yap (read-only) + ansible.builtin.command: + argv: + - sha256sum + - -c + - --quiet + - SHA256SUMS + chdir: "{{ bf_offline_repo }}" + register: offline_checksums + changed_when: false + failed_when: false + when: + - bf_offline_verify_hashes | bool + - bf_off_repo_files['SHA256SUMS'].exists | default(false) + - bf_off_repo_files['SHA256SUMS'].size | default(0) | int > 0 + + - name: Update kapısı yapılandırmasını oku (read-only) + ansible.builtin.slurp: + src: "{{ offline_apt_periodic_conf }}" + register: offline_apt_periodic_raw + when: + - offline_evidence_by_path[offline_apt_periodic_conf].exists | default(false) + - offline_evidence_by_path[offline_apt_periodic_conf].size | default(0) | int > 0 + + - name: Otomatik güncelleme timer maskelemesini oku (read-only) + ansible.builtin.command: + argv: + - systemctl + - is-enabled + - "{{ item }}" + loop: "{{ offline_update_timers }}" + register: offline_timer_states + changed_when: false + failed_when: false + + - name: Paket işlemi çalışıyor mu denetle (read-only) + ansible.builtin.command: + argv: + - pgrep + - -x + - "{{ item }}" + loop: "{{ offline_pkg_processes }}" + register: offline_pkg_procs + changed_when: false + failed_when: false + + - name: Offline hazırlık ölçümlerini hesapla + ansible.builtin.set_fact: + bf_off_repo_present: "{{ offline_evidence_by_path[bf_offline_repo].exists | default(false) and offline_evidence_by_path[bf_offline_repo].isdir | default(false) }}" + bf_off_missing_count: "{{ bf_off_missing_files | length }}" + bf_off_lock_header_ok: "{{ offline_lock_probe.stdout | default('') | regex_findall('header=([0-9]+)') | first | default('0', true) == '1' }}" + bf_off_lock_rows: "{{ offline_lock_probe.stdout | default('') | regex_findall('rows=([0-9]+)') | first | default('0', true) | int }}" + bf_off_lock_valid: "{{ offline_lock_probe.stdout | default('') | regex_findall('valid=([0-9]+)') | first | default('0', true) | int }}" + bf_off_pool_checked: "{{ offline_pool_files.results | default([]) | selectattr('stat', 'defined') | list | length }}" + bf_off_pool_missing: >- + {{ offline_pool_files.results | default([]) | selectattr('stat', 'defined') | map(attribute='stat') + | selectattr('exists', 'defined') | rejectattr('exists') | list | length }} + bf_off_firstboot_marker: "{{ offline_evidence_by_path[offline_firstboot_marker].exists | default(false) }}" + bf_off_installer_present: "{{ (offline_evidence_by_path[offline_installer].exists | default(false)) and (offline_evidence_by_path[offline_installer].executable | default(false)) }}" + bf_off_dealer_id_present: "{{ offline_evidence_by_path[offline_dealer_id_file].exists | default(false) }}" + bf_off_offline_list_present: "{{ offline_evidence_by_path[offline_list_file].exists | default(false) }}" + bf_off_apt_periodic: "{{ dict(bf_off_apt_periodic_values | map('first') | map('lower') | list | zip(bf_off_apt_periodic_values | map('last') | list)) }}" + bf_off_update_timers_masked: "{{ offline_timer_states.results | default([]) | map(attribute='stdout') | map('trim') | reject('equalto', 'masked') | list | length == 0 }}" + bf_off_pkg_lock_busy: "{{ offline_pkg_procs.results | default([]) | selectattr('rc', 'equalto', 0) | list | length > 0 }}" + vars: + bf_off_apt_periodic_values: >- + {{ offline_apt_periodic_raw.content | default('', true) | b64decode + | regex_findall('(?m)^APT::Periodic::([A-Za-z-]+)[ =]+[^0-9]*([0-9]+)') }} + + - name: Yerel paket doğrulama ve update kapısı durumunu etiketle + ansible.builtin.set_fact: + bf_off_checksum_state: >- + {{ 'SKIPPED' if not (bf_offline_verify_hashes | bool) + else ('VERIFIED' if offline_checksums.rc | default(1) == 0 + else ('MISSING' if not (bf_off_repo_files['SHA256SUMS'].exists | default(false)) else 'FAILED')) }} + bf_off_update_gate: >- + {{ 'ACTIVE' if (bf_off_apt_periodic.get('unattended-upgrade', '1') == '0' + and bf_off_apt_periodic.get('enable', '1') == '0' + and bf_off_update_timers_masked | bool) + else 'INACTIVE' }} + + - name: Offline hazırlık engellerini topla + ansible.builtin.set_fact: + bf_off_blockers: >- + {{ (['offline repo yok veya dizin değil: ' ~ bf_offline_repo] if not (bf_off_repo_present | bool) else []) + + ([('zorunlu offline dosyası eksik/boş: ' ~ (bf_off_missing_files | join(', ')))] if (bf_off_missing_count | int) > 0 else []) + + (['paket kilidi başlığı geçersiz (package/version/architecture/sha256/source)'] if not (bf_off_lock_header_ok | bool) else []) + + ([('paket kilidi geçersiz veya boş satırlar: ' ~ (bf_off_lock_valid | string) ~ '/' ~ (bf_off_lock_rows | string))] if ((bf_off_lock_rows | int) == 0 or (bf_off_lock_valid | int) != (bf_off_lock_rows | int)) else []) + + ([('havuzda eksik paket dosyası: ' ~ (bf_off_pool_missing | string))] if (bf_off_pool_missing | int) > 0 else []) + + (['yerel APT indeksi SHA256 doğrulaması BAŞARISIZ'] if bf_off_checksum_state == 'FAILED' else []) + + (['onaysız update kapısı kapalı (unattended-upgrades veya apt-daily timer açık)'] if bf_off_update_gate != 'ACTIVE' else []) + + (['başka bir paket işlemi koşuyor (apt/dpkg kilidi meşgul)'] if bf_off_pkg_lock_busy | bool else []) }} + + - name: Offline hazırlık kararını yaz + ansible.builtin.set_fact: + bf_off_verdict: "{{ 'PROVISIONED_OFFLINE-READY' if (bf_off_blockers | length) == 0 else 'BLOCKED' }}" + + - name: Cihaz offline hazırlık satırını raporla + ansible.builtin.debug: + msg: + - "{{ inventory_hostname | upper }} offline_repo={{ 'VAR' if bf_off_repo_present | bool else 'YOK' }} eksik_dosya={{ bf_off_missing_count }} paket_kilidi={{ bf_off_lock_valid }}/{{ bf_off_lock_rows }} havuz={{ bf_off_pool_checked }} eksik_havuz={{ bf_off_pool_missing }}" + - "{{ inventory_hostname | upper }} sha256={{ bf_off_checksum_state }} firstboot_damgasi={{ 'VAR' if bf_off_firstboot_marker | bool else 'YOK' }} update_kapisi={{ bf_off_update_gate }} paket_islemi_mesgul={{ bf_off_pkg_lock_busy }}" + - "{{ inventory_hostname | upper }} kurucu={{ 'VAR' if bf_off_installer_present | bool else 'YOK' }} bayi_kimligi={{ 'VAR' if bf_off_dealer_id_present | bool else 'YOK' }} offline.list={{ 'VAR' if bf_off_offline_list_present | bool else 'YOK' }} karar={{ bf_off_verdict }}" + + - name: Offline ön koşulu eksik cihaz için engelleri yaz + ansible.builtin.debug: + msg: "ENGELLER {{ inventory_hostname | upper }}: {{ bf_off_blockers }}" + when: bf_off_blockers | length > 0 + + - name: Offline hazırlık karar dağılımını hesapla + ansible.builtin.set_fact: + bf_off_verdict_histogram: "{{ bf_off_verdict_histogram | default({}) | combine({ item: bf_off_wave_verdicts | select('equalto', item) | list | length }) }}" + loop: "{{ bf_off_wave_verdicts | unique | sort }}" + vars: + bf_off_wave_verdicts: "{{ ansible_play_hosts_all | map('extract', hostvars, 'bf_off_verdict') | map('default', 'BLOCKED', true) | list }}" + run_once: true + + - name: Dalga offline hazırlık özetini yaz + ansible.builtin.debug: + msg: + - "Dalga {{ operation_wave }} | raporlanan cihaz: {{ ansible_play_hosts_all | length }}" + - "Karar dağılımı: {{ bf_off_verdict_histogram | default({}) }}" + - "Offline ön koşulu eksik cihazlar: {{ bf_off_blocked_hosts }}" + vars: + bf_off_blocked_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_off_verdict') | map('default', 'BLOCKED', true) | list)) | dict2items | selectattr('value', 'equalto', 'BLOCKED') | map(attribute='key') | list }}" + run_once: true + + --- # Report installed versions of pinned packages (read-only). @@ -671,6 +11569,192 @@ all: ansible.builtin.ping: + +--- +# Blueforce provisioning faz raporu -- READ-ONLY, dalga kapsamlı. +# Ne yapar: /var/lib/blueforce/state.json kanıtından cihazların provisioning fazını çıkarır +# (PROVISIONED_OFFLINE / ENROLLED / READY / PENDING / INVALID), faz dağılımını ve +# faz ile yerel kanıtlar arasındaki çelişkileri (offline cihazda wg0.conf, damgasız +# firstboot) toplu raporlar. Durum makinesi sözleşmesi: docs/27 ve docs/29. +# Hiçbir görev durum değiştirmez: yalnız stat/slurp ve read-only CLI çıktısı okunur; tüm +# command görevleri changed_when: false taşır. +# Kuru koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-provisioning-status.yml -e operation_wave=lab -e operation_confirmed=true --check +# Koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-provisioning-status.yml -e operation_wave=lab -e operation_confirmed=true +# Semaphore Pro bağımlılığı yok. +# Dalga kapısı: operation_wave + operation_confirmed (+ production_override) rapor play'inden ÖNCE, +# hiçbir hosta dokunmadan doğrulanır; --limit dalga ile kesişmezse koşu reddedilir (fail-closed). +- name: Dalga ve onay kapısı -- hiçbir hosta dokunmadan önce (mutasyon yok) + hosts: "{{ ansible_limit | default('localhost') }}" + gather_facts: false + become: false + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + operation_wave_gate: "{{ operation_wave | default('invalid-wave', true) }}" + tasks: + - name: Require an approved confirmed operation wave before any host is touched + ansible.builtin.assert: + that: + - operation_wave_gate in approved_operation_waves + - operation_confirmed | default(false) | bool + - operation_wave_gate in groups + - groups[operation_wave_gate] | length > 0 + - (operation_wave_gate != 'production') or (production_override | default(false) | bool) + fail_msg: "operation_wave must name a non-empty approved inventory group (lab/pilot_1/pilot_2/wave_1/wave_2/production), operation_confirmed=true is required, and production additionally requires production_override=true." + run_once: true + + - name: Require the --limit selection to intersect the declared wave + ansible.builtin.assert: + that: + - (((ansible_limit | default('') | split(',') | intersect(groups[operation_wave_gate]) | length) > 0) + or ((ansible_limit | default('') | split(',') | select('in', groups) | map('extract', groups) | flatten | unique | intersect(groups[operation_wave_gate]) | length) > 0)) + fail_msg: "--limit selection '{{ ansible_limit }}' does not intersect the '{{ operation_wave_gate }}' wave; refusing a mis-scoped run." + when: + - (ansible_limit | default('') | length) > 0 + - not (ansible_limit | default('') is search('[][*?]')) + run_once: true + +- name: Provisioning faz dağılımını raporla (read-only) + hosts: "{{ operation_wave | default('invalid-wave', true) }}" + gather_facts: false + become: true # Yalnız root sahipli kanıt dosyalarını (state.json 0600) OKUMAK için; mutasyon yok. + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + provisioning_state_file: /var/lib/blueforce/state.json + provisioning_firstboot_marker: /var/lib/blueforce/firstboot-complete + provisioning_wg_conf: /etc/wireguard/wg0.conf + provisioning_canonical_phases: [PROVISIONED_OFFLINE, ENROLLED, READY] + pre_tasks: + - name: Require confirmed approved operation wave scope + ansible.builtin.assert: + that: + - operation_wave in approved_operation_waves + - operation_confirmed | bool + - operation_wave in groups + - groups[operation_wave] | length > 0 + - ansible_play_hosts_all | length > 0 + - ansible_play_hosts_all | difference(groups[operation_wave]) | length == 0 + fail_msg: "Set operation_wave to one inventory wave and operation_confirmed=true; full-fleet scope is refused." + run_once: true + + - name: Require separate production override + ansible.builtin.assert: + that: + - operation_wave != 'production' or production_override | bool + fail_msg: "Production operation requires production_override=true in addition to operation_confirmed=true." + run_once: true + tasks: + - name: Provisioning kanıt yollarını denetle (read-only) + ansible.builtin.stat: + path: "{{ item }}" + loop: + - "{{ provisioning_state_file }}" + - "{{ provisioning_firstboot_marker }}" + - "{{ provisioning_wg_conf }}" + register: provisioning_evidence + + - name: Kanıt durumlarını yol ile indeksle + ansible.builtin.set_fact: + provisioning_evidence_by_path: "{{ provisioning_evidence.results | items2dict(key_name='item', value_name='stat') }}" + + - name: Durum dosyasını oku (read-only) + ansible.builtin.slurp: + src: "{{ provisioning_state_file }}" + register: provisioning_state_raw + when: + - provisioning_evidence_by_path[provisioning_state_file].exists | default(false) + - provisioning_evidence_by_path[provisioning_state_file].size | default(0) | int > 0 + + - name: Durum dosyası içeriğini çöz (bozuk dosyada rapor INVALID kalır, koşu durmaz) + ansible.builtin.set_fact: + provisioning_state_parsed: "{{ provisioning_state_raw.content | b64decode | from_json }}" + when: provisioning_state_raw.content is defined + ignore_errors: true + + - name: Provisioning fazını ve yerel kanıt durumunu belirle + ansible.builtin.set_fact: + bf_state_present: "{{ provisioning_state_raw.content is defined }}" + bf_state_parsed: "{{ provisioning_state_parsed | default({}, true) if provisioning_state_parsed is defined else {} }}" + bf_firstboot_marker_exists: "{{ provisioning_evidence_by_path[provisioning_firstboot_marker].exists | default(false) }}" + bf_offline_wg_conf_exists: "{{ provisioning_evidence_by_path[provisioning_wg_conf].exists | default(false) }}" + bf_provisioning_id_present: "{{ (provisioning_state_parsed | default({}, true)).get('provisioning_id', '') | length > 0 }}" + bf_device_id: "{{ (provisioning_state_parsed | default({}, true)).get('device_id', inventory_hostname | upper) }}" + + - name: Provisioning fazını sınıflandır + ansible.builtin.set_fact: + bf_phase_raw: "{{ (provisioning_state_parsed | default({}, true)).get('phase', '') | default('', true) }}" + bf_enrollment_status: "{{ (provisioning_state_parsed | default({}, true)).get('enrollment_status', 'PENDING') | default('PENDING', true) }}" + bf_fleet_status: "{{ (provisioning_state_parsed | default({}, true)).get('fleet_status', 'PENDING') | default('PENDING', true) }}" + + - name: Faz etiketini ve durum dosyası sağlığını belirle + ansible.builtin.set_fact: + bf_phase: >- + {{ 'PENDING' if not bf_state_present + else (bf_phase_raw if bf_phase_raw in provisioning_canonical_phases else 'INVALID') }} + bf_state_status: >- + {{ 'MISSING' if not bf_state_present + else ('OK' if bf_phase_raw in provisioning_canonical_phases else 'INVALID') }} + + - name: Yerel kanıt çelişkilerini belirle + ansible.builtin.set_fact: + bf_offline_wg_conflict: "{{ bf_phase == 'PROVISIONED_OFFLINE' and bf_offline_wg_conf_exists }}" + bf_firstboot_conflict: "{{ bf_phase == 'PENDING' and bf_firstboot_marker_exists }}" + + - name: Yerel kanıt çelişkisini tek etikete indir + ansible.builtin.set_fact: + bf_phase_conflict_line: >- + {{ 'OFFLINE_WG_CONFLICT' if bf_offline_wg_conflict | bool + else ('FIRSTBOOT_CONFLICT' if bf_firstboot_conflict | bool else 'OK') }} + + - name: Cihaz provisioning satırını raporla + ansible.builtin.debug: + msg: >- + {{ bf_device_id }} phase={{ bf_phase }} enrollment={{ bf_enrollment_status }} fleet={{ bf_fleet_status }} + state.json={{ bf_state_status }} provisioning_id={{ 'SET' if bf_provisioning_id_present else 'ABSENT' }} + firstboot_damgasi={{ 'VAR' if bf_firstboot_marker_exists else 'YOK' }} + + - name: Henüz provision edilmemiş cihazı işaretle + ansible.builtin.debug: + msg: "UYARI {{ bf_device_id }}: provisioning fazı {{ bf_phase }}; cihaz kurulum/enrollment bekliyor." + when: bf_phase in ['PENDING', 'INVALID'] + + - name: PROVISIONED_OFFLINE cihazda WireGuard hub yapılandırması çelişkisini işaretle + ansible.builtin.debug: + msg: "UYARI {{ bf_device_id }}: faz PROVISIONED_OFFLINE ama /etc/wireguard/wg0.conf var; offline provisioning hub config yazmamalıdır (docs/27)." + when: bf_offline_wg_conflict | bool + + - name: Damgasız firstboot çelişkisini işaretle + ansible.builtin.debug: + msg: "UYARI {{ bf_device_id }}: state.json yok ama firstboot damgası var; kurulum yarım kalmış olabilir (bkz. docs/05 modül 18)." + when: bf_firstboot_conflict | bool + + - name: Faz dağılımını hesapla (faz -> cihaz sayısı) + ansible.builtin.set_fact: + bf_phase_histogram: "{{ bf_phase_histogram | default({}) | combine({ item: bf_wave_phases | select('equalto', item) | list | length }) }}" + loop: "{{ bf_wave_phases | unique | sort }}" + vars: + bf_wave_phases: "{{ ansible_play_hosts_all | map('extract', hostvars, 'bf_phase') | map('default', 'INVALID', true) | list }}" + run_once: true + + - name: Dalga provisioning özetini yaz + ansible.builtin.debug: + msg: + - "Dalga {{ operation_wave }} | raporlanan cihaz: {{ ansible_play_hosts_all | length }}" + - "Faz dağılımı: {{ bf_phase_histogram | default({}) }}" + - "Kanıtsız/geçersiz cihazlar: {{ bf_unprovisioned_hosts }}" + vars: + bf_unprovisioned_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_phase') | map('default', 'INVALID', true) | list)) | dict2items | rejectattr('value', 'in', provisioning_canonical_phases) | map(attribute='key') | list }}" + run_once: true + + - name: Yerel kanıt çelişkisi olan cihazların dalga listesini yaz + ansible.builtin.debug: + msg: "Çelişkili cihazlar (offline wg0.conf / damgasız firstboot): {{ bf_conflict_hosts }}" + vars: + bf_conflict_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_phase_conflict_line') | map('default', 'OK', true) | list)) | dict2items | rejectattr('value', 'equalto', 'OK') | map(attribute='key') | list }}" + run_once: true + + --- # Restart the RDP service (xrdp). @@ -742,6 +11826,276 @@ all: failed_when: reboot_health.rc != 0 + +--- +# Blueforce uzak erişim kanalı raporu -- READ-ONLY, dalga kapsamlı. +# Ne yapar: SSH, xRDP, RustDesk, MeshCentral ve WireGuard kanallarının birim (unit) durumunu +# raporlar; MeshCentral ve AnyDesk OPSİYONELDİR (AnyDesk kurulu değilse açıkça +# "NOT INSTALLED (OPTIONAL)" yazılır). Kanonik /usr/local/bin/bf-remote-status --check +# çıktısı bağımsız doğrulama olarak eklenir (docs/07, docs/11 K-04). +# Hiçbir görev durum değiştirmez: yalnız stat ve read-only CLI çıktısı okunur; tüm command +# görevleri changed_when: false taşır. +# Kuru koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-remote-channels-check.yml -e operation_wave=lab -e operation_confirmed=true --check +# Koşu: ansible-playbook -i inventory/hosts.yml playbooks/bf-remote-channels-check.yml -e operation_wave=lab -e operation_confirmed=true +# Semaphore Pro bağımlılığı yok. +# Dalga kapısı: operation_wave + operation_confirmed (+ production_override) rapor play'inden ÖNCE, +# hiçbir hosta dokunmadan doğrulanır; --limit dalga ile kesişmezse koşu reddedilir (fail-closed). +- name: Dalga ve onay kapısı -- hiçbir hosta dokunmadan önce (mutasyon yok) + hosts: "{{ ansible_limit | default('localhost') }}" + gather_facts: false + become: false + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + operation_wave_gate: "{{ operation_wave | default('invalid-wave', true) }}" + tasks: + - name: Require an approved confirmed operation wave before any host is touched + ansible.builtin.assert: + that: + - operation_wave_gate in approved_operation_waves + - operation_confirmed | default(false) | bool + - operation_wave_gate in groups + - groups[operation_wave_gate] | length > 0 + - (operation_wave_gate != 'production') or (production_override | default(false) | bool) + fail_msg: "operation_wave must name a non-empty approved inventory group (lab/pilot_1/pilot_2/wave_1/wave_2/production), operation_confirmed=true is required, and production additionally requires production_override=true." + run_once: true + + - name: Require the --limit selection to intersect the declared wave + ansible.builtin.assert: + that: + - (((ansible_limit | default('') | split(',') | intersect(groups[operation_wave_gate]) | length) > 0) + or ((ansible_limit | default('') | split(',') | select('in', groups) | map('extract', groups) | flatten | unique | intersect(groups[operation_wave_gate]) | length) > 0)) + fail_msg: "--limit selection '{{ ansible_limit }}' does not intersect the '{{ operation_wave_gate }}' wave; refusing a mis-scoped run." + when: + - (ansible_limit | default('') | length) > 0 + - not (ansible_limit | default('') is search('[][*?]')) + run_once: true + +- name: Uzak erişim kanallarının durumunu raporla (read-only) + hosts: "{{ operation_wave | default('invalid-wave', true) }}" + gather_facts: false + become: true # Yalnız wg show ve root okuma gerektiren kanıtı (birim/state) OKUMAK için; mutasyon yok. + vars: + approved_operation_waves: [lab, pilot_1, pilot_2, wave_1, wave_2, production] + production_override: false + remote_channel_units: [ssh, sshd, xrdp, xrdp-sesman, rustdesk, meshagent, wg-quick@wg0] + remote_channel_props: [is-enabled, is-active] + remote_wg_interface: "{{ wg_interface | default('wg0') }}" + remote_wg_handshake_max_age: "{{ wg_handshake_max_age_seconds | default(180) }}" + remote_rustdesk_system_config: /etc/rustdesk/RustDesk2.toml + remote_rustdesk_user_config: /home/blueforce/.config/RustDesk/RustDesk2.toml + remote_mesh_config: /etc/meshagent/meshagent.json + remote_status_bin: /usr/local/bin/bf-remote-status + pre_tasks: + - name: Require confirmed approved operation wave scope + ansible.builtin.assert: + that: + - operation_wave in approved_operation_waves + - operation_confirmed | bool + - operation_wave in groups + - groups[operation_wave] | length > 0 + - ansible_play_hosts_all | length > 0 + - ansible_play_hosts_all | difference(groups[operation_wave]) | length == 0 + fail_msg: "Set operation_wave to one inventory wave and operation_confirmed=true; full-fleet scope is refused." + run_once: true + + - name: Require separate production override + ansible.builtin.assert: + that: + - operation_wave != 'production' or production_override | bool + fail_msg: "Production operation requires production_override=true in addition to operation_confirmed=true." + run_once: true + tasks: + - name: Kanal yapılandırma dosyalarını denetle (read-only) + ansible.builtin.stat: + path: "{{ item }}" + loop: + - "{{ remote_rustdesk_system_config }}" + - "{{ remote_rustdesk_user_config }}" + - "{{ remote_mesh_config }}" + - "{{ remote_status_bin }}" + register: remote_channel_files + + - name: Yapılandırma durumlarını yol ile indeksle + ansible.builtin.set_fact: + remote_channel_files_by_path: "{{ remote_channel_files.results | items2dict(key_name='item', value_name='stat') }}" + + - name: Birim etkin/aktif durumlarını oku (systemctl, read-only) + ansible.builtin.command: + argv: + - systemctl + - "{{ item[1] }}" + - --quiet + - "{{ item[0] }}" + loop: "{{ remote_channel_units | product(remote_channel_props) | list }}" + register: remote_channel_probe + changed_when: false + failed_when: false + + - name: Birim durumlarını tek sözlükte topla + ansible.builtin.set_fact: + bf_unit_states: "{{ bf_unit_states | default({}) | combine({ item.item[0] ~ ':' ~ item.item[1]: (item.rc == 0) }) }}" + loop: "{{ remote_channel_probe.results }}" + + - name: RustDesk paket durumunu oku (read-only) + ansible.builtin.command: + argv: + - dpkg-query + - -W + - -f=${Status} + - rustdesk + register: remote_rustdesk_pkg + changed_when: false + failed_when: false + + - name: AnyDesk (opsiyonel) paket durumunu oku (read-only) + ansible.builtin.command: + argv: + - dpkg-query + - -W + - -f=${Status} + - anydesk + register: remote_anydesk_pkg + changed_when: false + failed_when: false + + - name: WireGuard son handshake kaydını oku (read-only) + ansible.builtin.command: + argv: + - wg + - show + - "{{ remote_wg_interface }}" + - latest-handshakes + register: remote_wg_handshakes + changed_when: false + failed_when: false + + - name: Kontrol saatinin epoch değerini oku (read-only) + ansible.builtin.command: date +%s + register: remote_now_epoch + changed_when: false + + - name: Kanonik uzak erişim doğrulamasını çalıştır (bf-remote-status --check, read-only) + ansible.builtin.command: "{{ remote_status_bin }} --check" + register: remote_status_cli + changed_when: false + failed_when: false + when: remote_channel_files_by_path[remote_status_bin].exists | default(false) + + - name: Kanal hükümlerini hesapla + ansible.builtin.set_fact: + bf_ch_ssh: >- + {{ 'enabled-active' + if ((bf_unit_states.get('ssh:is-enabled', false) | bool and bf_unit_states.get('ssh:is-active', false) | bool) + or (bf_unit_states.get('sshd:is-enabled', false) | bool and bf_unit_states.get('sshd:is-active', false) | bool)) + else 'not-ready' }} + bf_ch_xrdp: >- + {{ 'enabled-active' + if (bf_unit_states.get('xrdp:is-enabled', false) | bool and bf_unit_states.get('xrdp:is-active', false) | bool + and bf_unit_states.get('xrdp-sesman:is-enabled', false) | bool and bf_unit_states.get('xrdp-sesman:is-active', false) | bool) + else 'not-ready' }} + bf_ch_rustdesk: >- + {{ 'installed-active' + if (remote_rustdesk_pkg.rc | default(1) == 0 and bf_unit_states.get('rustdesk:is-active', false) | bool) + else ('not-installed' if remote_rustdesk_pkg.rc | default(1) != 0 else 'not-ready') }} + bf_ch_meshcentral: >- + {{ 'not-configured' if not (remote_channel_files_by_path[remote_mesh_config].exists | default(false)) + else ('configured-active' + if (bf_unit_states.get('meshagent:is-enabled', false) | bool and bf_unit_states.get('meshagent:is-active', false) | bool) + else 'not-ready') }} + bf_ch_anydesk: "{{ 'installed (optional)' if remote_anydesk_pkg.rc | default(1) == 0 else 'NOT INSTALLED (OPTIONAL)' }}" + bf_ch_rustdesk_config: >- + {{ 'configured' if (remote_channel_files_by_path[remote_rustdesk_system_config].exists | default(false) + and remote_channel_files_by_path[remote_rustdesk_user_config].exists | default(false)) + else 'not-configured' }} + bf_ch_canonical_ready: "{{ 'ALL-READY' if remote_status_cli.rc | default(1) == 0 else 'NOT-READY' }}" + + - name: WireGuard handshake epoch listesini çıkar (read-only kanıt) + ansible.builtin.set_fact: + bf_wg_epochs: "{{ remote_wg_handshakes.stdout | default('') | regex_findall('(?m)([0-9]+)$') | map('int') | list }}" + + - name: WireGuard en yeni handshake kaydını belirle + ansible.builtin.set_fact: + bf_wg_latest_epoch: "{{ (bf_wg_epochs | max | int) if bf_wg_epochs | length > 0 else 0 }}" + + - name: WireGuard handshake yaşını hesapla + ansible.builtin.set_fact: + bf_wg_handshake_age: "{{ (remote_now_epoch.stdout | default('0') | int) - (bf_wg_latest_epoch | int) }}" + + - name: WireGuard kanal hükmünü yaz + ansible.builtin.set_fact: + bf_ch_wireguard: >- + {{ 'no-handshake' if bf_wg_latest_epoch | int <= 0 + else ('fresh-handshake' if bf_wg_handshake_age | int <= remote_wg_handshake_max_age | int else 'stale-handshake') }} + + - name: Zorunlu kanal hazır/ready satırını yaz + ansible.builtin.set_fact: + bf_required_channel_line: >- + ssh:{{ 'READY' if bf_ch_ssh == 'enabled-active' else 'NOT-READY' }} + xrdp:{{ 'READY' if bf_ch_xrdp == 'enabled-active' else 'NOT-READY' }} + rustdesk:{{ 'READY' if bf_ch_rustdesk == 'installed-active' else 'NOT-READY' }} + wireguard:{{ 'READY' if bf_ch_wireguard == 'fresh-handshake' else 'NOT-READY' }} + + - name: Zorunlu kanalların hazır durumunu ve sayısını belirle + ansible.builtin.set_fact: + bf_required_channel_ready: "{{ [bf_ch_ssh == 'enabled-active', bf_ch_xrdp == 'enabled-active', bf_ch_rustdesk == 'installed-active', bf_ch_wireguard == 'fresh-handshake'] | select | list | length }}" + + - name: Kanal satırlarını raporla + ansible.builtin.debug: + msg: + - "{{ bf_device_label }} ssh={{ bf_ch_ssh }} xrdp={{ bf_ch_xrdp }} rustdesk={{ bf_ch_rustdesk }} wireguard={{ bf_ch_wireguard }}" + - "{{ bf_device_label }} meshcentral={{ bf_ch_meshcentral }} (opsiyonel) anydesk={{ bf_ch_anydesk }} rustdesk_config={{ bf_ch_rustdesk_config }}" + - "{{ bf_device_label }} hazır zorunlu kanal={{ bf_required_channel_ready }}/4 kanonik_bf_remote_status={{ bf_ch_canonical_ready }}" + vars: + bf_device_label: "{{ inventory_hostname | upper }}" + + - name: Kanonik doğrulama çıktısını yaz (bağımsız kanıt) + ansible.builtin.debug: + msg: "bf-remote-status --check rc={{ remote_status_cli.rc | default(1) }} cikti={{ remote_status_cli.stdout_lines | default([]) }}" + when: remote_channel_files_by_path[remote_status_bin].exists | default(false) + + - name: Hazır olmayan kanalı işaretle (opsiyoneller hariç) + ansible.builtin.debug: + msg: "UYARI {{ inventory_hostname | upper }}: kanal hazır değil -> {{ bf_not_ready_channels }}" + vars: + bf_not_ready_channels: >- + {{ (['ssh'] if bf_ch_ssh != 'enabled-active' else []) + + (['xrdp'] if bf_ch_xrdp != 'enabled-active' else []) + + (['rustdesk'] if bf_ch_rustdesk != 'installed-active' else []) + + (['wireguard'] if bf_ch_wireguard != 'fresh-handshake' else []) }} + when: bf_not_ready_channels | length > 0 + + - name: MeshCentral (opsiyonel) kanalının kapalı olduğunu bilgi olarak yaz + ansible.builtin.debug: + msg: "BİLGİ {{ inventory_hostname | upper }}: MeshCentral durumu={{ bf_ch_meshcentral }}; MeshCentral/AnyDesk opsiyoneldir, READY kapısının parçası değildir." + when: bf_ch_meshcentral != 'configured-active' + + - name: Kanal başına hazır cihaz sayısını hesapla + ansible.builtin.set_fact: + bf_channel_ready_counts: "{{ bf_channel_ready_counts | default({}) | combine({ item: bf_channel_lines | select('search', item ~ ':READY') | list | length }) }}" + loop: [ssh, xrdp, rustdesk, wireguard] + vars: + bf_channel_lines: "{{ ansible_play_hosts_all | map('extract', hostvars, 'bf_required_channel_line') | map('default', '', true) | list }}" + run_once: true + + - name: Dalga kanal özetini yaz + ansible.builtin.debug: + msg: + - "Dalga {{ operation_wave }} | raporlanan cihaz: {{ ansible_play_hosts_all | length }}" + - "Hazır kanal başına cihaz sayısı: {{ bf_channel_ready_counts | default({}) }}" + - "İki kanaldan az erişimi olan cihazlar: {{ bf_single_channel_hosts }}" + vars: + bf_single_channel_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_required_channel_ready') | map('default', 0) | map('int') | list)) | dict2items | selectattr('value', 'lt', 2) | map(attribute='key') | list }}" + run_once: true + + - name: Kanonik doğrulamada hazır olmayan cihazların dalga listesini yaz + ansible.builtin.debug: + msg: "bf-remote-status --check başarısız (merkez kanıtı dahil): {{ bf_canonical_not_ready_hosts }}" + vars: + bf_canonical_not_ready_hosts: "{{ dict(ansible_play_hosts_all | zip(ansible_play_hosts_all | map('extract', hostvars, 'bf_ch_canonical_ready') | map('default', 'NOT-READY', true) | list)) | dict2items | selectattr('value', 'equalto', 'NOT-READY') | map(attribute='key') | list }}" + run_once: true + + --- # Run an approved script already present on a confirmed maintenance wave. @@ -1303,6 +12657,1741 @@ The role fails closed when any required tunnel value is empty. ``` + + + + + +"""bfos — Blueforce Field OS operator console. + +Python operator console for the Blueforce field fleet, in Turkish, with a +simple default view (``1) Kur``, ``2) Durum``, ``3) Çıkış``) and a detailed view +(``--full``) that exposes the full operation catalogue. + +The console is a thin front end: it drives the existing installer, the existing +Ansible playbooks and the existing ``bf-*`` diagnostics tools. It never invents +a playbook, never edits the inventory and never talks to a device itself. + +No third-party dependency: standard library only (Python 3.8+). +""" + +from .config import VERSION + +__version__ = VERSION +__all__ = ["VERSION", "__version__"] + + + +"""``python3 -m bfos`` — module entry point for the operator console.""" + +from .cli import main + +if __name__ == "__main__": + raise SystemExit(main()) + + + +"""Operation model for the bfos operator console. + +This module is the behaviour contract of the console, ported from the proven +bash console (``admin/bf-menu`` + ``admin/lib/targets.sh``) so the two entry +points can never disagree: + + * the 21 Ansible playbooks of ``ansible/playbooks/`` with their declared + scope (simple / wave / release) and destructive flag, + * the local install flow (``scripts/install/blueforce-install.sh``), + * the local diagnostics tools (``bf-status``, ``bf-diagnostics``, + ``bf-support-bundle``, ``bf-release``, ``bf-remote-status`` ...), + * target selection: dealer number ``^[0-9]{8}$``, group/wave, or ``all``, + * the safety gates: scope cross-check against the playbook file, production + override, release/wave tokens, destructive second confirmation, the + fleet-wide wave-by-wave loop that stops at the first failure. + +Design rules: + * no UI and no execution: every function here is pure or reads a file, and + every command is *produced* as an argv list for :mod:`bfos.runner`, + * refusals are raised as :class:`Refused` carrying a Turkish operator + message; nothing is auto-confirmed or silently downgraded, + * standard library only, Python 3.8+. +""" + +from __future__ import annotations + +import json +import os +import platform +import re +import socket +import stat +from dataclasses import dataclass, field, replace +from typing import Dict, Iterable, List, Optional, Sequence, Tuple + +from . import config + +# --------------------------------------------------------------------------- +# Refusals +# --------------------------------------------------------------------------- + + +class Refused(Exception): + """A refusal with an operator-facing Turkish explanation. + + ``detail`` holds optional extra lines (hints, remediation) so the UI can + print the message and the hint separately. + """ + + def __init__(self, message: str, detail: str = "") -> None: + super().__init__(message) + self.message = message + self.detail = detail + + +# --------------------------------------------------------------------------- +# Identity helpers (mirrors admin/lib/targets.sh) +# --------------------------------------------------------------------------- +DEALER_RE = re.compile(config.DEALER_PATTERN) +HOST_RE = re.compile(config.HOST_PATTERN) + + +def dealer_is_valid(value: str) -> bool: + return bool(DEALER_RE.match(value or "")) + + +def dealer_to_host(dealer: str) -> str: + return "bf-{0}".format(dealer) + + +def dealer_to_device_id(dealer: str) -> str: + return "BF-{0}".format(dealer) + + +def host_to_dealer(host: str) -> Optional[str]: + match = HOST_RE.match(host or "") + return match.group(0)[3:] if match else None + + +def is_wave(name: str) -> bool: + return name in config.WAVES + + +def waves_csv() -> str: + return ",".join(config.WAVES) + + +def waves_readable() -> str: + return ", ".join(config.WAVES) + + +# --------------------------------------------------------------------------- +# Operation catalogue -- 21 playbooks, one row each +# --------------------------------------------------------------------------- +PROMPT_NONE = "none" +PROMPT_PACKAGES = "packages" +PROMPT_SERVICE = "service" +PROMPT_SCRIPT = "script" +PROMPT_GRACE = "grace" +PROMPT_DISK_PCT = "disk_pct" +PROMPT_LOG_LINES = "log_lines" +PROMPT_VERSION = "expected_version" + +CATEGORY_REPORT = "report" +CATEGORY_MAINTENANCE = "maintenance" + + +@dataclass(frozen=True) +class Operation: + """One fleet operation, bound to exactly one existing playbook.""" + + ident: str + label: str + playbook: str + declared_scope: str + destructive: bool + prompt: str + description: str + category: str + + @property + def target_mode(self) -> str: + """Target mode the operator is offered for this operation.""" + if self.declared_scope == config.SCOPE_RELEASE: + return config.MODE_RELEASE + if self.declared_scope == config.SCOPE_WAVE: + return config.MODE_WAVE + return config.MODE_ANY + + +# 2.1 Read-only fleet reports -- no playbook in this list changes a device. +REPORT_OPERATIONS: Tuple[Operation, ...] = ( + Operation("ping", "Erişilebilirlik testi (ping)", "bf-ping.yml", "simple", False, PROMPT_NONE, + "SSH erişimi kontrol edilir (salt okunur)", CATEGORY_REPORT), + Operation("uptime", "Çalışma süresi", "bf-uptime.yml", "simple", False, PROMPT_NONE, + "Açık kalma süresi ve sistem yükü", CATEGORY_REPORT), + Operation("disk", "Disk kullanımı", "bf-disk-check.yml", "simple", False, PROMPT_DISK_PCT, + "Disk doluluğu; eşik üstünde uyarı verir", CATEGORY_REPORT), + Operation("docker", "Docker durumu", "bf-docker-status.yml", "simple", False, PROMPT_NONE, + "Docker servisi ve konteynerler (salt okunur)", CATEGORY_REPORT), + Operation("packages", "Paket sürümleri", "bf-package-check.yml", "simple", False, PROMPT_NONE, + "Sabitlenmiş paketlerin kurulu sürümleri", CATEGORY_REPORT), + Operation("security-updates", "Bekleyen güvenlik güncellemeleri", + "bf-security-updates-check.yml", "simple", False, PROMPT_NONE, + "Yalnız rapor; hiçbir paket kurmaz", CATEGORY_REPORT), + Operation("provisioning-status", "Kurulum fazı raporu", "bf-provisioning-status.yml", "wave", + False, PROMPT_NONE, "Cihaz başına state.json fazı", CATEGORY_REPORT), + Operation("enrollment-status", "Kayıt ve merkez kanıtı", "bf-enrollment-status.yml", "wave", + False, PROMPT_NONE, "ENROLLED/READY iddiası ↔ merkez kanıtı", CATEGORY_REPORT), + Operation("fieldos-version", "Field OS sürüm raporu", "bf-fieldos-version.yml", "wave", + False, PROMPT_VERSION, "Cihaz başına sürüm; isteğe bağlı sapma denetimi", + CATEGORY_REPORT), + Operation("remote-channels", "Uzak erişim kanalları", "bf-remote-channels-check.yml", "wave", + False, PROMPT_NONE, "SSH/xRDP/RustDesk/WireGuard hazırlığı", CATEGORY_REPORT), + Operation("offline-ready", "Çevrimdışı hazırlık raporu", "bf-offline-ready-check.yml", "wave", + False, PROMPT_NONE, "İnternetsiz kurulum için yerel ön koşullar", CATEGORY_REPORT), +) + +# 2.2 Fleet maintenance -- destructive rows ask a second, explicit question. +MAINTENANCE_OPERATIONS: Tuple[Operation, ...] = ( + Operation("rdp-restart", "RDP servisini yeniden başlat", "bf-rdp-restart.yml", "simple", True, + PROMPT_NONE, "xrdp servisini yeniden başlatır", CATEGORY_MAINTENANCE), + Operation("rustdesk-restart", "RustDesk servisini yeniden başlat", "bf-rustdesk-restart.yml", + "simple", True, PROMPT_NONE, "RustDesk servisini yeniden başlatır", + CATEGORY_MAINTENANCE), + Operation("wireguard-restart", "WireGuard servisini yeniden başlat", + "bf-wireguard-restart.yml", "simple", True, PROMPT_NONE, + "wg-quick@wg0 servisini yeniden başlatır", CATEGORY_MAINTENANCE), + Operation("service-restart", "İzinli bir servisi yeniden başlat", "bf-service-restart.yml", + "simple", True, PROMPT_SERVICE, "Yalnız izinli servis adları kabul edilir", + CATEGORY_MAINTENANCE), + Operation("gui-off", "Grafik arayüzü kapat (headless)", "bf-gui-off.yml", "wave", True, + PROMPT_NONE, "Dalgayı multi-user.target'e alır", CATEGORY_MAINTENANCE), + Operation("gui-on", "Grafik arayüzü aç (bakım)", "bf-gui-on.yml", "wave", True, PROMPT_NONE, + "Grafik oturumu yeniden başlatır", CATEGORY_MAINTENANCE), + Operation("collect-logs", "Log topla / destek paketi", "bf-collect-logs.yml", "wave", False, + PROMPT_LOG_LINES, "Zaman damgalı journal kaydı ve destek paketi", + CATEGORY_MAINTENANCE), + Operation("run-script", "Onaylı betik çalıştır", "bf-run-script.yml", "wave", True, + PROMPT_SCRIPT, "Yalnız /opt/blueforce/bin ve /usr/local/sbin", + CATEGORY_MAINTENANCE), + Operation("reboot", "Kontrollü yeniden başlatma", "bf-reboot.yml", "release", True, + PROMPT_GRACE, "Sağlık kapılı, sıralı yeniden başlatma", CATEGORY_MAINTENANCE), + Operation("deploy-update", "Onaylı paket güncellemesi kur", "bf-deploy-update.yml", "release", + True, PROMPT_PACKAGES, "Sabit sürümlü paketler, sağlık kapılı", CATEGORY_MAINTENANCE), +) + +ALL_OPERATIONS: Tuple[Operation, ...] = REPORT_OPERATIONS + MAINTENANCE_OPERATIONS + +#: Variables the playbooks use to express their own gates. The console derives +#: the scope from the playbook file and adds a variable only when the playbook +#: actually declares it (a permanent parity rule with admin/bf-menu). +VAR_OPERATION_WAVE = "operation_wave" +VAR_RELEASE_WAVE = "release_wave" +VAR_OPERATION_CONFIRMED = "operation_confirmed" +VAR_WAVE_GATE_CONFIRMED = "wave_gate_confirmed" +VAR_REBOOT_CONFIRMED = "reboot_confirmed" +VAR_PRODUCTION_OVERRIDE = "production_override" +VAR_ALLOW_PRODUCTION_REBOOT = "allow_production_reboot" + +GATE_VARIABLES = ( + VAR_OPERATION_WAVE, + VAR_RELEASE_WAVE, + VAR_WAVE_GATE_CONFIRMED, + VAR_REBOOT_CONFIRMED, + VAR_PRODUCTION_OVERRIDE, + VAR_ALLOW_PRODUCTION_REBOOT, +) + + +def find_operation(ident: str) -> Optional[Operation]: + for operation in ALL_OPERATIONS: + if operation.ident == ident: + return operation + return None + + +def operations_of(category: str) -> Tuple[Operation, ...]: + return tuple(op for op in ALL_OPERATIONS if op.category == category) + + +def catalogue_rows() -> Tuple[Operation, ...]: + """All operations ordered exactly like the bash catalogue.""" + return tuple(sorted(ALL_OPERATIONS, key=lambda op: (op.category != CATEGORY_REPORT, op.ident))) + + +# --------------------------------------------------------------------------- +# Playbook file: the source of truth for a playbook's own gates +# --------------------------------------------------------------------------- +def non_comment_text(text: str) -> str: + """The playbook text without full-line comments. + + Deliberately identical to ``grep -vE '^[[:space:]]*#'`` in bf-menu: a + trailing comment is kept, so the console and the bash console can never + disagree about what a playbook declares. + """ + keep = [line for line in text.splitlines() if not line.lstrip().startswith("#")] + return "\n".join(keep) + + +def playbook_uses_var(text: str, var: str) -> bool: + """True when VAR appears as a whole word outside the playbook's comments.""" + pattern = r"\b{0}\b".format(re.escape(var)) + return re.search(pattern, non_comment_text(text)) is not None + + +def playbook_scope(text: str) -> str: + """Derive wave / release / simple from the playbook's own variables.""" + if playbook_uses_var(text, VAR_RELEASE_WAVE): + return config.SCOPE_RELEASE + if playbook_uses_var(text, VAR_OPERATION_WAVE): + return config.SCOPE_WAVE + return config.SCOPE_SIMPLE + + +class Repository: + """Read-only view of the Blueforce checkout the console runs from.""" + + def __init__(self, root: str) -> None: + self.root = os.path.abspath(root) + + # -- discovery --------------------------------------------------------- + def path(self, rel: str) -> str: + return os.path.join(self.root, rel) + + def looks_valid(self) -> bool: + return os.path.isdir(self.path("ansible")) and os.path.isdir(self.path("scripts")) + + def playbook_path(self, playbook: str) -> str: + return self.path(os.path.join(config.PLAYBOOK_DIR_REL, playbook)) + + def playbook_text(self, playbook: str) -> str: + path = self.playbook_path(playbook) + try: + with open(path, "r", encoding="utf-8") as handle: + return handle.read() + except OSError as exc: + raise Refused( + config.MSG_PLAYBOOK_MISSING.format(path=path), str(exc) + ) from exc + + def verify_scope(self, operation: Operation) -> str: + """Cross-check the catalogue scope against the playbook file. + + The playbook is the source of truth for its own gates: a table that + drifted must refuse to run instead of silently dropping a gate. + """ + text = self.playbook_text(operation.playbook) + actual = playbook_scope(text) + if actual != operation.declared_scope: + raise Refused( + config.MSG_GATE_SCOPE_MISMATCH.format( + playbook=operation.playbook, + declared=operation.declared_scope, + actual=actual, + ) + ) + return actual + + def playbook_uses(self, playbook: str, var: str) -> bool: + return playbook_uses_var(self.playbook_text(playbook), var) + + # -- local assets ------------------------------------------------------ + def installer_path(self) -> str: + path = self.path(config.INSTALLER_REL) + if not os.path.isfile(path): + raise Refused(config.MSG_INSTALLER_MISSING.format(path=path)) + return path + + def tool_path(self, tool: str) -> str: + """Preferred path of a diagnostics/maintenance tool (bf_tool_path).""" + candidates = ( + os.path.join(config.TOOL_BIN_DIR, tool), + self.path(os.path.join(config.DIAGNOSTICS_DIR_REL, tool)), + self.path(os.path.join("scripts/maintenance", tool)), + ) + for candidate in candidates: + if os.access(candidate, os.X_OK) and os.path.isfile(candidate): + return candidate + raise Refused(config.MSG_TOOL_MISSING.format(tool=tool)) + + def group_vars_path(self) -> Optional[str]: + path = self.path(config.GROUP_VARS_REL) + return path if os.path.isfile(path) else None + + # -- inventory --------------------------------------------------------- + def inventory_candidates(self) -> Tuple[str, ...]: + base = self.path(config.INVENTORY_DIR_REL) + return tuple(os.path.join(base, name) for name in config.INVENTORY_CANDIDATES) + + def find_inventory(self, explicit: str = "") -> str: + """Resolve the Ansible inventory, or refuse with remediation. + + ``hosts.example.yml`` is never selected automatically: it carries + example device IDs and must only be used after a deliberate copy. + """ + if explicit: + if os.path.isfile(explicit) and os.access(explicit, os.R_OK): + return os.path.abspath(explicit) + raise Refused(config.MSG_INVENTORY_UNREADABLE.format(path=explicit)) + for candidate in self.inventory_candidates(): + if os.path.isfile(candidate) and os.access(candidate, os.R_OK): + return candidate + example = self.path(config.INVENTORY_EXAMPLE_REL) + detail = "" + if os.path.isfile(example): + detail = config.MSG_INVENTORY_EXAMPLE_ONLY.format(path=example) + raise Refused( + config.MSG_INVENTORY_MISSING.format(dir=self.path(config.INVENTORY_DIR_REL)), + detail, + ) + + +# --------------------------------------------------------------------------- +# Inventory parsing (a deliberately small YAML reader, mirrors targets.sh) +# --------------------------------------------------------------------------- +@dataclass +class Inventory: + """group -> ordered hosts, parsed from the Ansible inventory.""" + + path: Optional[str] = None + groups: Dict[str, List[str]] = field(default_factory=dict) + + # -- construction ------------------------------------------------------ + @classmethod + def parse(cls, text: str, path: Optional[str] = None) -> "Inventory": + groups: Dict[str, List[str]] = {} + # Stack of (key, indent) for keys whose value is an empty mapping. + stack: List[Tuple[str, int]] = [] + host_block = False + host_indent = 0 + host_step: Optional[int] = None + host_group = "" + + for raw in text.splitlines(): + line = raw.rstrip() + stripped = line.strip() + if not stripped or stripped.startswith("#") or stripped.startswith("-"): + continue + if ":" not in line: + continue + indent = len(line) - len(line.lstrip(" ")) + key_part, _, value_part = line.partition(":") + key = key_part.strip().strip("'\"").strip() + value = value_part.strip() + if not key: + continue + + # Close blocks that are at or above this key's indentation. + while stack and stack[-1][1] >= indent: + stack.pop() + if host_block and indent <= host_indent: + host_block = False + + if key == "hosts" and not value: + host_block = True + host_indent = indent + host_step = None + host_group = stack[-1][0] if stack else "" + stack.append((key, indent)) + continue + + if host_block and indent > host_indent: + if host_step is None: + host_step = indent + if indent == host_step: + groups.setdefault(host_group, []) + if key not in groups[host_group]: + groups[host_group].append(key) + stack.append((key, indent)) + continue + + if not value: + stack.append((key, indent)) + + return cls(path=path, groups=groups) + + @classmethod + def load(cls, path: str) -> "Inventory": + with open(path, "r", encoding="utf-8") as handle: + return cls.parse(handle.read(), path=path) + + @classmethod + def load_repository(cls, repo: Repository, explicit: str = "") -> "Inventory": + """Load the inventory, or return an empty one marked as unresolved. + + Callers that must refuse on a missing inventory ask the repository + directly (:meth:`Repository.find_inventory`); the UI keeps working with + an unresolved inventory so read-only screens can still explain what is + missing instead of crashing. + """ + try: + resolved = repo.find_inventory(explicit) + except Refused: + return cls(path=None, groups={}) + try: + return cls.load(resolved) + except (OSError, ValueError): + return cls(path=None, groups={}) + + # -- queries ----------------------------------------------------------- + @property + def resolved(self) -> bool: + """True when an inventory was actually found and parsed. + + A path is not required: an inventory parsed from text (tests, callers + that hold the YAML themselves) is just as usable as a file on disk. + """ + return self.path is not None or bool(self.groups) + + def labels(self) -> str: + return self.path or "çözümlenmedi" + + def group_names(self) -> Tuple[str, ...]: + return tuple(self.groups) + + def hosts_of(self, group: str) -> Tuple[str, ...]: + return tuple(self.groups.get(group, ())) + + def group_exists(self, group: str) -> bool: + return group in self.groups + + def host_exists(self, host: str) -> bool: + return any(host in hosts for hosts in self.groups.values()) + + def all_hosts(self) -> Tuple[str, ...]: + hosts: List[str] = [] + for group_hosts in self.groups.values(): + for host in group_hosts: + if host not in hosts: + hosts.append(host) + return tuple(hosts) + + def count_all(self) -> int: + return len(self.all_hosts()) + + def waves_present(self) -> Tuple[str, ...]: + """Canonical waves that exist in the inventory, in rollout order.""" + return tuple(wave for wave in config.WAVES if self.group_exists(wave)) + + def host_wave(self, host: str) -> Optional[str]: + """The approved wave containing HOST, or None.""" + for wave in config.WAVES: + if host in self.groups.get(wave, ()): + return wave + return None + + +# --------------------------------------------------------------------------- +# Target selection (mirrors bf_target_*) +# --------------------------------------------------------------------------- +KIND_HOST = "host" +KIND_GROUP = "group" +KIND_ALL = "all" + + +@dataclass(frozen=True) +class Target: + kind: str + limit: str + wave: str + count: int + label: str + + +def _target_host(dealer: str, mode: str, inventory: Inventory) -> Target: + if not dealer_is_valid(dealer): + raise Refused(config.MSG_TARGET_DEALER_INVALID.format(value=dealer)) + if mode == config.MODE_RELEASE: + raise Refused(config.MSG_TARGET_RELEASE_DEVICE) + if not inventory.resolved: + raise Refused(config.MSG_TARGET_DEVICE_UNKNOWN.format( + host=dealer_to_host(dealer), inventory=inventory.labels())) + host = dealer_to_host(dealer) + if not inventory.host_exists(host): + raise Refused(config.MSG_TARGET_DEVICE_UNKNOWN.format(host=host, inventory=inventory.labels())) + wave = inventory.host_wave(host) or "" + if not wave and mode != config.MODE_ANY: + raise Refused(config.MSG_TARGET_DEVICE_NO_WAVE.format(host=host)) + label = "cihaz {0} ({1})".format(dealer_to_device_id(dealer), host) + if wave: + label += " — dalga '{0}'".format(wave) + return Target(kind=KIND_HOST, limit=host, wave=wave, count=1, label=label) + + +def _target_group(group: str, mode: str, inventory: Inventory) -> Target: + if not inventory.resolved or not inventory.group_exists(group): + raise Refused( + config.MSG_TARGET_GROUP_UNKNOWN.format( + group=group, groups=" ".join(inventory.group_names()) or "-" + ) + ) + if mode in (config.MODE_WAVE, config.MODE_RELEASE) and not is_wave(group): + raise Refused(config.MSG_TARGET_GROUP_NOT_WAVE.format(group=group, waves=waves_readable())) + count = len(inventory.hosts_of(group)) + if count == 0: + raise Refused(config.MSG_TARGET_GROUP_EMPTY.format(group=group)) + label = "dalga '{0}' ({1} cihaz)".format(group, count) if is_wave(group) else \ + "grup '{0}' ({1} cihaz)".format(group, count) + wave = group if is_wave(group) else "" + return Target(kind=KIND_GROUP, limit=group, wave=wave, count=count, label=label) + + +def _target_all(mode: str, inventory: Inventory) -> Target: + if mode == config.MODE_RELEASE: + raise Refused(config.MSG_TARGET_RELEASE_ALL) + if not inventory.resolved or inventory.count_all() == 0: + raise Refused(config.MSG_TARGET_ALL_EMPTY) + count = inventory.count_all() + return Target(kind=KIND_ALL, limit="all", wave="", count=count, + label="filo geneli ({0} cihaz)".format(count)) + + +def resolve_target(word: str, mode: str, inventory: Inventory) -> Target: + """Turn one operator word into a validated target. + + Accepts an 8-digit dealer number, a ``bf-`` hostname (convenience), + a group/wave name, or ``all``. Anything else is refused with a Turkish + explanation; nothing is guessed. + """ + word = (word or "").strip() + if not word: + raise Refused(config.MSG_TARGET_EMPTY) + if word == "all": + return _target_all(mode, inventory) + if dealer_is_valid(word): + return _target_host(word, mode, inventory) + if inventory.resolved and inventory.group_exists(word): + return _target_group(word, mode, inventory) + if HOST_RE.match(word) and dealer_is_valid(word[3:]): + return _target_host(word[3:], mode, inventory) + raise Refused( + config.MSG_TARGET_UNKNOWN.format(value=word), + config.MSG_TARGET_KNOWN_GROUPS.format(groups=" ".join(inventory.group_names()) or "-"), + ) + + +def wave_sequence(inventory: Inventory) -> Tuple[Tuple[str, int], ...]: + """Waves present in the inventory with their device counts, in order.""" + return tuple((wave, len(inventory.hosts_of(wave))) for wave in inventory.waves_present()) + + +# --------------------------------------------------------------------------- +# Gates: the confirmation plan (what the operator must state explicitly) +# --------------------------------------------------------------------------- +STEP_TOKEN = "token" +STEP_APPROVAL = "approval" + + +@dataclass(frozen=True) +class GateStep: + """One explicit confirmation the operator has to give before a run.""" + + kind: str + key: str + prompt: str + message: str = "" + token: str = "" + unlocks: Tuple[str, ...] = () + + +@dataclass +class GatesGranted: + """Flags granted by the operator's confirmations. + + ``build_ansible_command`` adds a gate variable only when the matching flag + is granted AND the playbook declares that variable, so a command can never + become less gated than the playbook expects. + """ + + wave_gate_confirmed: bool = False + production_override: bool = False + allow_production_reboot: bool = False + fleet_wide: bool = False + + def grant(self, step: GateStep) -> "GatesGranted": + changes = {name: True for name in step.unlocks if hasattr(self, name)} + return replace(self, **changes) if changes else self + + +def confirmation_plan( + operation: Operation, + scope: str, + target: Target, + wave: str = "", + wave_gate_supported: bool = False, +) -> List[GateStep]: + """The ordered list of confirmations required for one operation run. + + Rules (all preserved from the bash console): + * the production wave requires the word ``production`` **and** a separate + production approval that unlocks ``production_override=true``, + * a release-gated operation (reboot, deploy-update) requires its wave name + to be written out before anything is built; a wave-scoped read-only + report does not (the bash console asks no token for it either), + * a destructive operation requires a second, explicit approval, + * a fleet-wide simple run requires the word ``all``. + """ + steps: List[GateStep] = [] + effective_wave = wave or target.wave + + if scope in (config.SCOPE_WAVE, config.SCOPE_RELEASE): + if effective_wave == config.PRODUCTION_WAVE: + message = config.MSG_GATE_PRODUCTION + if wave_gate_supported: + message = message + "\n" + config.MSG_GATE_GATE_FLAG + steps.append( + GateStep( + kind=STEP_TOKEN, + key="production_token", + prompt=config.MSG_GATE_PRODUCTION_ASK, + message=message, + token=config.PRODUCTION_WAVE, + unlocks=(VAR_WAVE_GATE_CONFIRMED,) if wave_gate_supported else (), + ) + ) + steps.append( + GateStep( + kind=STEP_APPROVAL, + key="production_approval", + prompt=config.MSG_GATE_PRODUCTION_APPROVAL, + message=config.MSG_GATE_PRODUCTION, + unlocks=(VAR_PRODUCTION_OVERRIDE, VAR_ALLOW_PRODUCTION_REBOOT), + ) + ) + elif effective_wave and scope == config.SCOPE_RELEASE: + # Release-gated operations never run from a typed word alone: the + # operator has to name the exact wave that is being released. + message = config.MSG_GATE_WAVE_TOKEN.format(wave=effective_wave) + if wave_gate_supported: + message = message + "\n" + config.MSG_GATE_GATE_FLAG + steps.append( + GateStep( + kind=STEP_TOKEN, + key="wave_token", + prompt=config.MSG_GATE_WAVE_TOKEN_ASK.format(wave=effective_wave), + message=message, + token=effective_wave, + unlocks=(VAR_WAVE_GATE_CONFIRMED,) if wave_gate_supported else (), + ) + ) + + if target.kind == KIND_ALL and scope == config.SCOPE_SIMPLE: + steps.append( + GateStep( + kind=STEP_TOKEN, + key="fleet_token", + prompt=config.MSG_GATE_FLEET_TOKEN_ASK, + message=config.MSG_GATE_FLEET_TOKEN.format(count=target.count), + token="all", + unlocks=("fleet_wide",), + ) + ) + + if operation.destructive and not any(step.key == "production_approval" for step in steps): + # The second, explicit approval for a state-changing operation. It is a + # gate (it happens before the command is even built); the run prompt + # after the command has been shown is a separate, final confirmation. + steps.append( + GateStep( + kind=STEP_APPROVAL, + key="destructive_approval", + prompt=config.MSG_DESTRUCTIVE_SUB, + message=config.MSG_DESTRUCTIVE_GATE.format(label=operation.label), + ) + ) + return steps + + +# --------------------------------------------------------------------------- +# Extra -e variables, validated with the rules the playbooks enforce +# --------------------------------------------------------------------------- +PIN_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9+_.:-]*=.+$") + + +def parse_packages(text: str) -> List[str]: + pins: List[str] = [] + for chunk in (text or "").split(","): + pin = chunk.strip() + if not pin: + continue + if not PIN_RE.match(pin): + raise Refused(config.MSG_PKG_INVALID.format(value=pin)) + version = pin.partition("=")[2].strip("=").strip() + if not version or version.lower().startswith("latest"): + raise Refused(config.MSG_PKG_LATEST.format(value=pin)) + pins.append(pin) + if not pins: + raise Refused(config.MSG_PKG_REQUIRED) + return pins + + +def packages_expression(pins: Sequence[str]) -> str: + """The ``update_packages`` value: ``["pkg=ver",...]`` like bf_prompt_packages. + + Only the value is returned; the caller pairs it with the variable name, so + exactly one ``update_packages=`` prefix ever reaches the command line. + """ + return "[{0}]".format(",".join('"{0}"'.format(pin) for pin in pins)) + + +def parse_service(text: str) -> str: + name = (text or "").strip() + if name not in config.SERVICE_ALLOWLIST: + raise Refused( + config.MSG_SERVICE_INVALID.format(value=name), + config.MSG_SERVICE_HINT.format(allowlist=" ".join(config.SERVICE_ALLOWLIST)), + ) + return name + + +def parse_script(path: str, args: str = "") -> List[Tuple[str, str]]: + script = (path or "").strip() + if not script.startswith("/"): + raise Refused(config.MSG_SCRIPT_ABSOLUTE) + if not any(script.startswith(directory + "/") for directory in config.SCRIPT_DIRS): + raise Refused( + config.MSG_SCRIPT_OUTSIDE.format(value=script, dirs=" ".join(config.SCRIPT_DIRS)) + ) + pairs = [("script_path", script)] + if (args or "").strip(): + pairs.append(("script_args", args.strip())) + return pairs + + +def parse_grace(text: str) -> str: + value = (text or "").strip() or str(config.DEFAULT_REBOOT_GRACE) + if not value.isdigit(): + raise Refused(config.MSG_GRACE_INVALID) + return value + + +def parse_disk_pct(text: str) -> List[Tuple[str, str]]: + value = (text or "").strip() + if not value: + return [] + if not value.isdigit() or not (config.DISK_WARN_MIN <= int(value) <= config.DISK_WARN_MAX): + raise Refused(config.MSG_PCT_INVALID.format(min=config.DISK_WARN_MIN, max=config.DISK_WARN_MAX)) + return [("disk_warn_pct", value)] + + +def parse_log_lines(text: str) -> str: + value = (text or "").strip() or str(config.DEFAULT_LOG_LINES) + if not value.isdigit() or int(value) < 1: + raise Refused(config.MSG_LINES_INVALID) + return value + + +def parse_expected_version(text: str) -> List[Tuple[str, str]]: + value = (text or "").strip() + return [("fieldos_expected_version", value)] if value else [] + + +def build_extra_vars(prompt: str, answers: Dict[str, str]) -> List[Tuple[str, str]]: + """Validate the operator's answers for one operation's prompt kind.""" + if prompt == PROMPT_NONE: + return [] + if prompt == PROMPT_PACKAGES: + return [("update_packages", packages_expression(parse_packages(answers.get("packages", ""))))] + if prompt == PROMPT_SERVICE: + return [("service_name", parse_service(answers.get("service", "")))] + if prompt == PROMPT_SCRIPT: + return parse_script(answers.get("script", ""), answers.get("script_args", "")) + if prompt == PROMPT_GRACE: + return [("reboot_grace_seconds", parse_grace(answers.get("grace", "")))] + if prompt == PROMPT_DISK_PCT: + return parse_disk_pct(answers.get("disk_pct", "")) + if prompt == PROMPT_LOG_LINES: + return [("log_lines", parse_log_lines(answers.get("log_lines", "")))] + if prompt == PROMPT_VERSION: + return parse_expected_version(answers.get("expected_version", "")) + raise Refused("Konsol hatası: bilinmeyen soru türü '{0}'.".format(prompt)) + + +# --------------------------------------------------------------------------- +# Command construction +# --------------------------------------------------------------------------- +def build_ansible_command( + repo: Repository, + inventory_path: str, + operation: Operation, + scope: str, + target: Optional[Target], + wave: str = "", + extra_vars: Sequence[Tuple[str, str]] = (), + gates: Optional[GatesGranted] = None, + check_mode: bool = False, +) -> List[str]: + """Build the ansible-playbook argv for one operation and one target. + + Single choke point: no command is ever built without a target, and a gated + scope is never built without a wave. + """ + gates = gates or GatesGranted() + if target is None: + raise Refused(config.MSG_GATE_NO_TARGET) + playbook = operation.playbook + + def uses(var: str) -> bool: + return repo.playbook_uses(playbook, var) + + argv = [ + "ansible-playbook", + "-i", inventory_path, + repo.playbook_path(playbook), + "--limit", target.limit, + ] + effective_wave = wave or target.wave + + if scope == config.SCOPE_WAVE: + if not effective_wave: + raise Refused(config.MSG_TARGET_DEVICE_NO_WAVE.format(host=target.limit)) + argv += ["-e", "{0}={1}".format(VAR_OPERATION_WAVE, effective_wave), + "-e", "{0}=true".format(VAR_OPERATION_CONFIRMED)] + if effective_wave == config.PRODUCTION_WAVE and gates.production_override \ + and uses(VAR_PRODUCTION_OVERRIDE): + argv += ["-e", "{0}=true".format(VAR_PRODUCTION_OVERRIDE)] + elif scope == config.SCOPE_RELEASE: + if not effective_wave or not is_wave(effective_wave): + raise Refused(config.MSG_TARGET_RELEASE_DEVICE) + argv += ["-e", "{0}={1}".format(VAR_RELEASE_WAVE, effective_wave)] + if gates.wave_gate_confirmed and uses(VAR_WAVE_GATE_CONFIRMED): + argv += ["-e", "{0}=true".format(VAR_WAVE_GATE_CONFIRMED)] + if uses(VAR_REBOOT_CONFIRMED): + argv += ["-e", "{0}=true".format(VAR_REBOOT_CONFIRMED)] + if effective_wave == config.PRODUCTION_WAVE: + if gates.production_override and uses(VAR_PRODUCTION_OVERRIDE): + argv += ["-e", "{0}=true".format(VAR_PRODUCTION_OVERRIDE)] + if gates.allow_production_reboot and uses(VAR_ALLOW_PRODUCTION_REBOOT): + argv += ["-e", "{0}=true".format(VAR_ALLOW_PRODUCTION_REBOOT)] + + for name, value in extra_vars: + argv += ["-e", "{0}={1}".format(name, value)] + if check_mode: + argv.append("--check") + return argv + + +def build_install_command( + installer: str, + dealer: str, + offline: bool = False, + resume: bool = False, + only: str = "", + check_mode: bool = False, +) -> List[str]: + """The local installer argv (bash --dealer-id ...).""" + if not dealer_is_valid(dealer): + raise Refused(config.MSG_TARGET_DEALER_INVALID.format(value=dealer)) + argv = ["bash", installer, "--dealer-id", dealer] + if offline: + argv.append("--offline") + if resume: + argv.append("--resume") + if only: + argv += ["--only", only] + if check_mode: + argv.append("--check") + return argv + + +def build_tool_command(tool: str, args: Sequence[str] = (), check_mode: bool = False) -> List[str]: + argv = [tool] + list(args) + if check_mode: + argv.append("--check") + return argv + + +def module_names(repo: Repository) -> Tuple[str, ...]: + """Installer modules (``NN-name.sh``) offered by the single-module action.""" + modules_dir = repo.path(os.path.join("scripts/install/installer/modules")) + try: + names = sorted( + entry for entry in os.listdir(modules_dir) + if re.match(r"^[0-9]{2}-.*\.sh$", entry) + ) + except OSError: + return () + return tuple(name[:-3] for name in names) + + +# --------------------------------------------------------------------------- +# Read-only information reports (returned as text lines for the UI) +# --------------------------------------------------------------------------- +def targets_lines(inventory: Inventory) -> List[str]: + lines: List[str] = [] + lines.append("DALGALAR (yayılma sırası)") + for wave in config.WAVES: + if inventory.group_exists(wave): + lines.append(" {0:<14} {1} cihaz".format(wave, len(inventory.hosts_of(wave)))) + else: + lines.append(" {0:<14} envanterde yok".format(wave)) + others = [group for group in inventory.group_names() if not is_wave(group)] + if others: + lines.append("") + lines.append("DİĞER GRUPLAR") + for group in others: + lines.append(" {0:<14} {1} cihaz".format(group, len(inventory.hosts_of(group)))) + lines.append("") + lines.append("CİHAZLAR") + for host in inventory.all_hosts(): + lines.append(" {0}".format(host)) + lines.append("") + lines.append("Envanter: {0}".format(inventory.labels())) + lines.append("Toplam cihaz: {0}".format(inventory.count_all())) + return lines + + +def wave_gate_state_lines(inventory: Inventory) -> List[str]: + lines = ["DALGA GEÇİŞ KAPISI DURUMU"] + for wave in config.WAVES: + if inventory.group_exists(wave): + lines.append(" {0:<14} {1} cihaz".format(wave, len(inventory.hosts_of(wave)))) + else: + lines.append(" {0:<14} envanterde yok".format(wave)) + lines.append("") + lines.append("Kural: bir dalga, ancak önceki dalga sağlık kapısını ve merkez onayını geçtikten sonra başlar.") + lines.append("Üretim (production) ayrıca yazılı 'production' onayı ve production_override=true gerektirir.") + lines.append("Kaynak: docs/10 — güncelleme ve geri alma politikası.") + return lines + + +def central_checklist_lines() -> List[str]: + return [ + "MERKEZ HAZIRLIK LİSTESİ (bilgilendirme)", + " 1. WireGuard hub: uç nokta, anahtarlar ve her bf- için eş tahsisi (docs/08).", + " 2. Kayıt (enrollment) jeton servisi: tek kullanımlık, TTL sınırlı (docs/29).", + " 3. İzleme: Prometheus/VictoriaMetrics + Grafana, device_id etiketi BF- (docs/14).", + " 4. Uzak erişim: RustDesk hbbs/hbbr veya MeshCentral, WireGuard üzerinden (docs/07).", + " 5. Paket deposu + çevrimdışı anlık görüntü (docs/10, docs/27).", + " 6. Gerçek ana makine adlarıyla Ansible envanteri ve yönetici SSH anahtarı (docs/02, 06, 09).", + "Bu konsol 6'yı doğrular, 1-5'i hazırlar; merkez bileşeni kurmaz.", + ] + + +def _group_vars_value(path: Optional[str], key: str) -> str: + if not path or not os.path.isfile(path): + return "" + pattern = re.compile(r"^[ \t]*{0}[ \t]*:(.*)$".format(re.escape(key))) + try: + with open(path, "r", encoding="utf-8") as handle: + for line in handle: + match = pattern.match(line.rstrip("\n")) + if match: + value = match.group(1) + value = value.split("#", 1)[0].strip() + return value.strip("'\"") + except OSError: + return "" + return "" + + +def central_endpoint_lines(repo: Repository) -> List[str]: + path = repo.group_vars_path() + lines = ["MERKEZ UÇ NOKTALARI (group_vars/all.yml)"] + if path is None: + lines.append(" group_vars/all.yml bulunamadı: {0}".format(repo.path(config.GROUP_VARS_REL))) + return lines + for key in config.CENTRAL_ENDPOINT_KEYS: + value = _group_vars_value(path, key) + if value: + lines.append(" {0:<22} {1}".format(key, value)) + lines.append("") + lines.append("Değerler group_vars/all.yml dosyasından okunur; burada hiçbir sır saklanmaz veya yazılmaz.") + return lines + + +def central_readiness_lines(repo: Repository, inventory: Inventory, inventory_error: str = "") -> List[str]: + lines = ["MERKEZ HAZIRLIK DURUMU"] + if inventory.resolved: + lines.append(" [OK] Envanter: {0} ({1} cihaz)".format(inventory.path, inventory.count_all())) + else: + lines.append(" [UYARI] Envanter çözümlenemedi.") + if inventory_error: + lines.extend(" " + part for part in inventory_error.splitlines()) + path = repo.group_vars_path() + if path: + try: + with open(path, "r", encoding="utf-8") as handle: + placeholders = [line.strip() for line in handle if "PLACEHOLDER" in line] + except OSError: + placeholders = [] + if placeholders: + lines.append(" [UYARI] group_vars/all.yml içinde {0} PLACEHOLDER değeri var:".format(len(placeholders))) + lines.extend(" " + line for line in placeholders) + else: + lines.append(" [OK] group_vars/all.yml içinde PLACEHOLDER kalmamış.") + else: + lines.append(" [UYARI] ansible/inventory/group_vars/all.yml bulunamadı.") + key_path = os.path.expanduser(config.ADMIN_KEY_FILE) + if os.path.isfile(key_path): + lines.append(" [OK] Yönetici SSH anahtarı var: {0} (içeriği okunmaz/yazılmaz)".format(config.ADMIN_KEY_FILE)) + else: + lines.append(" [UYARI] Yönetici SSH anahtarı yok: {0} (docs/06)".format(config.ADMIN_KEY_FILE)) + if inventory.path and "example" in os.path.basename(inventory.path): + lines.append(" [UYARI] Bu örnek bir envanter; gerçek cihazlara yöneltmeyin.") + return lines + + +def split_endpoint(endpoint: str) -> Tuple[str, Optional[int]]: + """Split a configured endpoint into (host, port) — no network access.""" + value = (endpoint or "").strip() + if not value: + return "", None + if "//" in value: + value = value.split("//", 1)[1] + value = value.split("/", 1)[0] + if value.startswith("["): # IPv6 literal + host, _, rest = value.partition("]") + host = host.lstrip("[") + port = int(rest[1:]) if rest.startswith(":") and rest[1:].isdigit() else None + return host, port + if ":" in value: + host, _, port_text = value.rpartition(":") + if port_text.isdigit(): + return host, int(port_text) + return value, None + if endpoint.startswith("http://"): + return value, 80 + if endpoint.startswith("https://"): + return value, 443 + return value, None + + +def probe_endpoint(host: str, port: Optional[int], timeout: float = 3.0) -> Tuple[str, bool]: + """Resolve HOST and, when PORT is known, try one TCP connection.""" + if not host: + return "", False + try: + infos = socket.getaddrinfo(host, port, proto=socket.IPPROTO_TCP) + except OSError: + return "", False + if not infos: + return "", False + resolved = str(infos[0][4][0]) + if port is None: + return resolved, True + try: + with socket.create_connection((resolved, port), timeout=timeout): + return resolved, True + except OSError: + return resolved, False + + +def central_probe_lines(repo: Repository, timeout: float = 3.0) -> List[str]: + path = repo.group_vars_path() + lines = ["MERKEZ UÇ NOKTASI DENEMESİ (salt okunur)"] + if path is None: + lines.append(" group_vars/all.yml bulunamadı.") + return lines + for key in ("wg_hub_endpoint", "monitoring_endpoint", "update_repo_url"): + endpoint = _group_vars_value(path, key) + if not endpoint: + continue + host, port = split_endpoint(endpoint) + if not host: + continue + resolved, reachable = probe_endpoint(host, port, timeout=timeout) + if not resolved: + lines.append(" [UYARI] {0}: çözümlenemedi (yer tutucu olabilir)".format(host)) + elif port is None: + lines.append(" [OK] {0} -> {1} (port türetilemedi)".format(host, resolved)) + elif reachable: + lines.append(" [OK] {0}:{1} erişilebilir ({2})".format(host, port, resolved)) + else: + lines.append(" [UYARI] {0}:{1} erişilemiyor ({2})".format(host, port, resolved)) + return lines + + +def state_values(path: str = config.STATE_FILE) -> Dict[str, str]: + """Read state.json through a whitelist of non-secret keys. + + A future token field can never leak into the UI or the audit log. + """ + values: Dict[str, str] = {} + try: + with open(path, "r", encoding="utf-8") as handle: + data = json.load(handle) + except (OSError, ValueError): + return values + if not isinstance(data, dict): + return values + for key in config.STATE_ALLOWED_KEYS: + value = data.get(key) + if value is None or isinstance(value, bool): + continue + values[key] = str(value) + return values + + +def identity_lines(hostname: str = "") -> List[str]: + host = hostname or platform.node() or "bilinmiyor" + dealer = host_to_dealer(host) + lines = ["KİMLİK", " Ana makine adı : {0}".format(host)] + if dealer: + lines.append(" Bayi numarası : {0}".format(dealer)) + lines.append(" Cihaz kimliği (insan) : {0}".format(dealer_to_device_id(dealer))) + else: + lines.append(" [UYARI] Ana makine adı bf-<8 hane> biçiminde değil (docs/02).") + lines.append(" Çekirdek : {0}".format(platform.platform())) + values = state_values() + for key in ("device_id", "phase"): + if key in values: + lines.append(" state.json {0:<10}: {1}".format(key, values[key])) + return lines + + +def state_lines(path: str = config.STATE_FILE) -> List[str]: + lines = ["KURULUM / KAYIT DURUMU"] + values = state_values(path) + if not values: + lines.append(" [UYARI] {0} yok veya okunamadı: cihaz kurulmamış olabilir.".format(path)) + return lines + for key in config.STATE_ALLOWED_KEYS: + if key in values: + lines.append(" {0:<18} {1}".format(key, values[key])) + lines.append("") + lines.append("Yalnız yukarıdaki kimlik/yaşam döngüsü alanları okunur; jeton ve anahtarlar asla yazılmaz.") + lines.append("İleri yönlü durum makinesi: PROVISIONED_OFFLINE -> ENROLLED -> READY (docs/29).") + return lines + + +def environment_lines( + repo: Repository, + log_file: str, + inventory: Inventory, + dry_run: bool, + check_mode: bool, +) -> List[str]: + lines = [ + "ORTAM", + " Konsol : {0} {1}".format(config.PROGRAM_NAME, config.VERSION), + " Depo : {0}".format(repo.root), + " Envanter : {0}".format(inventory.labels()), + " Denetim kaydı : {0}".format(log_file), + " dry-run : {0}".format("evet" if dry_run else "hayır"), + " check modu : {0}".format("evet" if check_mode else "hayır"), + " Python : {0}".format(platform.python_version()), + ] + for tool in (config.TOOL_ENROLL_STATUS, config.TOOL_LIVE_HW_CHECK): + try: + lines.append(" {0:<21}: {1}".format(tool, repo.tool_path(tool))) + except Refused: + lines.append(" {0:<21}: yok".format(tool)) + return lines + + +def file_mode(path: str) -> str: + """Octal permission bits of PATH, or "?" when it cannot be read.""" + try: + return oct(stat.S_IMODE(os.stat(path).st_mode))[2:].zfill(3) + except OSError: + return "?" + + + +"""ANSI terminal interface for the bfos operator console. + +Two presentations, one contract: + + * **simple mode** (default): one screen with three numbered actions — + ``1) Kur``, ``2) Durum``, ``3) Çıkış`` — plus a single shortcut that opens + the detailed mode. A beginner is never shown 21 playbooks, wave tooling or + central preparation, + * **detailed mode** (``--full`` or the ``d`` shortcut): the five categories of + the bash console — Kurulum, Cihaz işlemleri, Merkez hazırlığı, Araçlar, + Cihaz bilgisi. + +Rules: + * every screen ends with ``0) Geri`` and ``q) Çıkış``, + * every operator message is Turkish, every code identifier stays English, + * colours are pure ANSI escapes written by hand (no textual/rich/curses), + * input is validated; a wrong answer gets a polite Turkish warning instead of + a traceback or a silent default, + * rendering is a pure function of the screen description, so the menu + contract can be unit-tested without a terminal. +""" + +from __future__ import annotations + +import io # noqa: F401 - kept for callers that build an in-memory Console +import sys +from dataclasses import dataclass +from typing import Callable, Iterable, List, Optional, Sequence, Tuple + +from . import config + +# Values returned by :meth:`Console.ask_run`. They match +# bfos.runner.RUN_MODE_* on purpose (asserted by the test suite). +RUN = "run" +CHECK = "check" +CANCEL = "cancel" + +# Outcomes of :func:`interpret_menu_choice`. +CHOICE_QUIT = "quit" +CHOICE_BACK = "back" +CHOICE_ITEM = "item" +CHOICE_INVALID = "invalid" + +ENTRY_ITEM = "item" +ENTRY_SHORTCUT = "shortcut" +ENTRY_SECTION = "section" + + +# --------------------------------------------------------------------------- +# Colour handling +# --------------------------------------------------------------------------- +def color_enabled(no_color: bool = False, mode: str = "auto", is_tty: bool = True) -> bool: + """Decide whether ANSI colour may be written to the stream.""" + if no_color: + return False + if mode == "never": + return False + if mode == "always": + return True + return is_tty and not bool(_env("NO_COLOR")) + + +def _env(name: str) -> str: + import os + + return os.environ.get(name, "") + + +def stream_is_tty(stream) -> bool: + try: + return bool(stream.isatty()) + except (AttributeError, ValueError): + return False + + +# --------------------------------------------------------------------------- +# Screen description (pure data, unit-testable) +# --------------------------------------------------------------------------- +@dataclass(frozen=True) +class Entry: + """One line of a screen. + + ``kind=ENTRY_ITEM`` is numbered by its position among the items; + ``kind=ENTRY_SHORTCUT`` carries its own key (``d``) and is rendered next to + the footer; ``kind=ENTRY_SECTION`` is a heading. + """ + + kind: str + label: str = "" + description: str = "" + key: str = "" + + +@dataclass(frozen=True) +class Screen: + title: str + subtitle: str = "" + entries: Tuple[Entry, ...] = () + notes: Tuple[str, ...] = () + + def items(self) -> Tuple[Tuple[str, Entry], ...]: + """(key, entry) for every numbered item, key = "1", "2", ... """ + numbered = [entry for entry in self.entries if entry.kind == ENTRY_ITEM] + return tuple((str(index + 1), entry) for index, entry in enumerate(numbered)) + + def shortcuts(self) -> Tuple[Entry, ...]: + return tuple(entry for entry in self.entries if entry.kind == ENTRY_SHORTCUT) + + def keys(self) -> Tuple[str, ...]: + """Every selectable key: numbered items first, then shortcuts.""" + return tuple(key for key, _ in self.items()) + tuple( + entry.key for entry in self.shortcuts() + ) + + +def item(label: str, description: str = "") -> Entry: + return Entry(ENTRY_ITEM, label=label, description=description) + + +def shortcut(key: str, label: str, description: str = "") -> Entry: + return Entry(ENTRY_SHORTCUT, label=label, description=description, key=key) + + +def section(label: str) -> Entry: + return Entry(ENTRY_SECTION, label=label) + + +# --------------------------------------------------------------------------- +# The menus +# --------------------------------------------------------------------------- +def simple_menu() -> Screen: + """Default view: exactly three basic actions, nothing else. + + The only extra key is the ``d`` shortcut that opens the detailed mode; it is + rendered next to the numbered actions as a clearly-marked advanced entry, so + a beginner is never dropped into 21 playbooks and wave tooling by accident. + """ + return Screen( + title=config.SIMPLE_MENU_TITLE, + subtitle=config.SIMPLE_MENU_SUBTITLE, + entries=( + item(config.SIMPLE_ITEM_INSTALL_LABEL, config.SIMPLE_ITEM_INSTALL_DESC), + item(config.SIMPLE_ITEM_STATUS_LABEL, config.SIMPLE_ITEM_STATUS_DESC), + item(config.SIMPLE_ITEM_EXIT_LABEL, config.SIMPLE_ITEM_EXIT_DESC), + shortcut("d", config.SIMPLE_ADVANCED_LABEL, config.SIMPLE_ADVANCED_DESC), + ), + notes=(config.MSG_SIMPLE_MODE_HINT,), + ) + + +def detailed_menu() -> Screen: + """Detailed mode: the five categories of the bash console.""" + return Screen( + title=config.FULL_MENU_TITLE, + subtitle=config.FULL_MENU_SUBTITLE, + entries=( + section("Kategoriler"), + item(config.CAT_INSTALL, "Bu cihazı yerel olarak kur ve doğrula"), + item(config.CAT_DEVICES, "Filo playbook'ları, her zaman açık hedefle"), + item(config.CAT_CENTRAL, "Merkez entegrasyonunu doğrula ve hazırla"), + item(config.CAT_TOOLS, "Depo ve yerel yardımcı araçlar"), + item(config.CAT_INFO, "Salt okunur bilgi ekranları"), + shortcut("s", "Basit mod", "Yalnız Kur / Durum / Çıkış"), + ), + notes=(config.MSG_FULL_MODE_HINT,), + ) + + +def install_menu(items: Sequence[Tuple[str, str]]) -> Screen: + """Kurulum category (this device only).""" + return Screen( + title="{0} — {1}".format(config.CAT_INSTALL, "bu cihaz"), + subtitle="Yalnız bu cihaz kurulur; hiçbir filo cihazına dokunulmaz", + entries=(section("Yerel kurulum"),) + tuple(item(label, desc) for label, desc in items), + ) + + +def devices_menu(report_count: int, maintenance_count: int) -> Screen: + return Screen( + title=config.CAT_DEVICES, + subtitle="Yalnızca depodaki mevcut playbook'lar, her zaman açık hedefle", + entries=( + section("Filo işlemleri"), + item("Salt okunur raporlar", "{0} işlem, hiçbir cihazı değiştirmez".format(report_count)), + item("Bakım işlemleri", "{0} işlem; yıkıcı olanlar iki kez onay ister".format(maintenance_count)), + item("Envanter hedeflerini göster", "dalgalar, gruplar ve cihaz sayıları"), + ), + ) + + +def central_menu() -> Screen: + return Screen( + title=config.CAT_CENTRAL, + subtitle="Merkez entegrasyonunu doğrular ve hazırlar; merkez sunucu kurmaz", + entries=( + section("Hazırlık ve doğrulama"), + item("Merkez hazırlık durumu", "envanter, yer tutucular, yönetici anahtarı"), + item("Merkez uç noktalarını göster", "WireGuard hub, izleme, paket aynası"), + item("Merkez uç noktalarını dene", "DNS + TCP, salt okunur"), + item("Dalga geçiş kapısı durumu", "dalga başına cihaz sayısı ve kapı kuralı"), + item("Merkez hazırlık listesi", "kayıt öncesi gerekenler"), + ), + ) + + +def tools_menu() -> Screen: + return Screen( + title=config.CAT_TOOLS, + subtitle="Yerel yardımcılar; ISO derleme bu konsolun kapsamı dışındadır", + entries=( + section("Depo"), + item("Depoyu güncelle", "git pull --ff-only"), + item("Ortam ve sürüm bilgisi", "yollar, sürümler, çözümlenen ayarlar"), + item("İşlem kataloğunu göster", "--list çıktısı"), + section("Bu cihazın araçları"), + item("Yerel çevrimdışı kapı", "bf-check-local"), + item("Kayıt (enrollment) kapısı", "bf-check-enrollment"), + item("Hazır (READY) kapısı", "bf-check-ready"), + item("Derin tanılama", "bf-diagnostics (yoksa bf-status)"), + item("Canlı donanım / OS kontrolü", "bf-live-hw-check, salt okunur"), + item("Uzak erişim kanalları", "bf-remote-status --check"), + item("Field OS sürüm kimliği", "bf-release"), + item("Donanım envanteri", "bf-hardware-inventory.sh"), + item("Destek paketi", "bf-support-bundle --out-dir"), + section("Bu konsol"), + item("Konsol denetim kaydını göster", "denetim kaydının son 40 satırı"), + ), + ) + + +def info_menu() -> Screen: + return Screen( + title=config.CAT_INFO, + subtitle="Salt okunur: buradaki hiçbir işlem cihazı değiştirmez", + entries=( + section("Bu cihaz"), + item("Kimlik", "ana makine adı, cihaz kimliği, bayi numarası"), + item("Sağlık özeti", "bf-status"), + item("Kurulum ve kayıt durumu", "state.json beyaz listesi"), + item("Ağ", "adresler, rota, DNS, WireGuard eş sayısı"), + item("Disk, bellek, CPU", "df, free, yük"), + item("Kurulu sabit paketler", "dpkg-query"), + item("Servis durumu", "ssh, xrdp, rustdesk, docker, wg"), + item("Son journal hataları", "journalctl -p err"), + section("Filo"), + item("Envanter özeti", "dalgalar, gruplar, sayılar"), + item("Hedefi çözümle", "bayi numarası veya grubu doğrula"), + ), + ) + + +def target_menu() -> Screen: + return Screen( + title="Hedef seçimi", + subtitle="Hedef sorulmadan hiçbir komut üretilmez", + entries=( + item("Tek cihaz (bayi numarası)", "8 hane, örn. 12010101"), + item("Grup / dalga", ", ".join(config.WAVES)), + item("Filo geneli", "dalga kapsamlı playbook'lar dalga dalga sorar"), + item("Hedefi doğrudan yaz", "bayi numarası, grup ya da 'all'"), + ), + ) + + +def yes_no_suffix(default_yes: bool = False) -> str: + return "[e/H]" if not default_yes else "[E/h]" + + +# --------------------------------------------------------------------------- +# Rendering (pure functions) +# --------------------------------------------------------------------------- +def horizontal_rule(char: str = "-", width: int = config.CONSOLE_WIDTH) -> str: + return char * width + + +def render_item(key: str, label: str, description: str = "", palette: Optional[config.Palette] = None) -> str: + palette = palette or config.Palette(False) + head = " {0:>2}) {1:<46}".format(key, label) + if description: + return head + " " + palette.paint(description, "dim") + return head.rstrip() + + +def render_screen(screen: Screen, palette: Optional[config.Palette] = None, width: int = config.CONSOLE_WIDTH) -> str: + """The complete text of one screen (banner, items, footer).""" + palette = palette or config.Palette(False) + lines: List[str] = [""] + lines.append(palette.paint(horizontal_rule("=", width), "dim")) + lines.append(" " + palette.paint(screen.title, "bold", "cyan")) + if screen.subtitle: + lines.append(" " + palette.paint(screen.subtitle, "dim")) + lines.append(palette.paint(horizontal_rule("=", width), "dim")) + lines.append("") + + item_keys = dict((entry, key) for key, entry in screen.items()) + for entry in screen.entries: + if entry.kind == ENTRY_SECTION: + lines.append("") + lines.append(" " + palette.paint(entry.label, "magenta")) + elif entry.kind == ENTRY_ITEM: + lines.append(render_item(item_keys[entry], entry.label, entry.description, palette)) + for entry in screen.shortcuts(): + lines.append(render_item(entry.key, entry.label, entry.description, palette)) + + for note in screen.notes: + lines.append("") + lines.append(" " + palette.paint(note, "dim")) + + lines.append("") + lines.append(palette.paint(horizontal_rule("-", width), "dim")) + footer = " {0:>2}) {1:<46} {2:>2}) {3}".format( + "0", config.MSG_BACK, "q", config.MSG_QUIT_ITEM + ) + lines.append(footer) + lines.append(palette.paint(horizontal_rule("-", width), "dim")) + lines.append("") + return "\n".join(lines) + + +def interpret_menu_choice(choice: str, keys: Sequence[str]) -> Tuple[str, str]: + """Classify what the operator typed on a menu screen. + + ``""``/``0`` -> back, ``q``/``Q`` -> quit, a known key -> item, everything + else -> invalid (the caller prints a polite Turkish warning). + """ + value = (choice or "").strip() + if value == "" or value == "0": + return CHOICE_BACK, "" + if value.lower() == "q": + return CHOICE_QUIT, "" + for key in keys: + if value == key: + return CHOICE_ITEM, key + return CHOICE_INVALID, value + + +# --------------------------------------------------------------------------- +# Console I/O +# --------------------------------------------------------------------------- +class Console: + """Thin ANSI console: writes to a stream, reads lines, validates input. + + ``reader`` can be injected (a callable taking the prompt and returning a + line, or ``None`` for EOF) which is how the console is tested without a + terminal. + """ + + def __init__( + self, + out=None, + inp=None, + palette: Optional[config.Palette] = None, + interactive: Optional[bool] = None, + reader: Optional[Callable[[str], Optional[str]]] = None, + clear: bool = True, + ) -> None: + self.out = out if out is not None else sys.stdout + self.inp = inp if inp is not None else sys.stdin + self.reader = reader + tty = stream_is_tty(self.inp) and stream_is_tty(self.out) + self.interactive = tty if interactive is None else interactive + self.palette = palette or config.Palette(False) + self.clear = clear + + # -- output ------------------------------------------------------------ + def write(self, text: str = "") -> None: + self.out.write(text + "\n") + + def paint(self, text: str, *names: str) -> str: + return self.palette.paint(text, *names) + + def section(self, label: str) -> None: + self.write("") + self.write(" " + self.paint(label, "magenta")) + + def kv(self, key: str, value: str) -> None: + self.write(" {0:<24} {1}".format(key, value)) + + def note(self, text: str) -> None: + self.write(self.paint(text, "dim")) + + def info(self, text: str) -> None: + self.write("{0} {1}".format(self.paint("[i]", "cyan"), text)) + + def ok(self, text: str) -> None: + self.write("{0} {1}".format(self.paint("[OK]", "green"), text)) + + def warn(self, text: str) -> None: + for line in str(text).splitlines() or [""]: + self.write("{0} {1}".format(self.paint("[UYARI]", "yellow"), line)) + + def error(self, text: str) -> None: + for line in str(text).splitlines() or [""]: + self.write("{0} {1}".format(self.paint("[HATA]", "red"), line)) + + def banner(self, title: str, subtitle: str = "") -> None: + self.write(render_screen(Screen(title=title, subtitle=subtitle), self.palette)) + + def screen(self, screen: Screen) -> None: + if self.interactive and self.clear: + self.out.write("\033[H\033[2J") + self.write(render_screen(screen, self.palette)) + + def show_lines(self, lines: Iterable[str]) -> None: + for line in lines: + self.write(line) + + def exception(self, refused) -> None: + """Report a :class:`bfos.operations.Refused` nicely.""" + self.error(refused.message) + if getattr(refused, "detail", ""): + for line in refused.detail.splitlines(): + self.note(" " + line) + + # -- input ------------------------------------------------------------- + def read(self, prompt: str = "") -> Optional[str]: + """Read one line; ``None`` means EOF (stdin closed / non-interactive).""" + if self.reader is not None: + self.out.write(prompt) + return self.reader(prompt) + self.out.write(prompt) + self.out.flush() + try: + line = self.inp.readline() + except (ValueError, OSError): + return None + if line == "": + return None + return line.rstrip("\n") + + def ask(self, prompt: str, allow_empty: bool = False) -> Optional[str]: + """Read a non-empty answer; re-asks politely on an empty line.""" + while True: + value = self.read(prompt) + if value is None: + return None + value = value.strip() + if value or allow_empty: + return value + self.warn(config.MSG_REQUIRED) + + def ask_with_default(self, prompt: str, default: str) -> Optional[str]: + value = self.read(prompt) + if value is None: + return None + value = value.strip() + return value or default + + def confirm(self, question: str, default_yes: bool = False) -> Optional[bool]: + """Turkish yes/no question. Only an explicit yes proceeds.""" + while True: + value = self.read("{0} {1}: ".format(question, yes_no_suffix(default_yes))) + if value is None: + return None + answer = value.strip().lower() + if answer in ("e", "evet", "y", "yes"): + return True + if answer in ("h", "hayir", "hayır", "n", "no"): + return False + if answer == "": + return default_yes + self.warn(config.MSG_INVALID_INPUT.format(value=value)) + + def confirm_token(self, message: str, token: str, prompt: str) -> Optional[bool]: + """The operator must type TOKEN exactly (highest-risk confirmations).""" + if message: + self.warn(message) + value = self.read(prompt) + if value is None: + return None + return value.strip() == token + + def ask_run(self, question: str = config.MSG_RUN_ASK) -> str: + """y = run, c = run with --check, anything else = cancel.""" + value = self.read(question) + if value is None: + return CANCEL + answer = value.strip().lower() + if answer in ("y", "yes", "e", "evet"): + return RUN + if answer in ("c", "check"): + return CHECK + return CANCEL + + def pause(self, message: str = config.MSG_PRESS_ENTER) -> None: + if self.interactive: + self.read(self.paint(message + " ", "dim")) + + def ask_menu_choice(self, screen: Screen) -> Tuple[str, str]: + """Read and classify a menu answer, warning on invalid input.""" + value = self.read(config.MSG_PROMPT_CHOICE) + if value is None: + return CHOICE_QUIT, "" + outcome, payload = interpret_menu_choice(value, screen.keys()) + if outcome == CHOICE_INVALID: + self.warn(config.MSG_UNKNOWN_CHOICE.format(choice=payload)) + self.write(" " + config.MSG_MENU_RANGE.format(max=len(screen.items()))) + return CHOICE_INVALID, payload + return outcome, payload + + + + + + { "_note": [ @@ -1320,6 +14409,10 @@ The role fails closed when any required tunnel value is empty. } + + + + #!/usr/bin/env bash # Apply Blueforce's reviewed Docker published-port policy to DOCKER-USER. @@ -1449,6 +14542,10 @@ ClientAliveInterval 300 ClientAliveCountMax 2 + + + + # Start the firewall after every Docker start; the firewall unit orders itself after Docker. [Unit] @@ -1465,6 +14562,10 @@ Restart=always RestartSec=5 + + + + # Purpose: Manually return a field device to terminal mode after maintenance. # This unit is deliberately not enabled by any boot target. @@ -1507,6 +14608,68 @@ RemainAfterExit=yes WantedBy=multi-user.target + +# Blueforce enrollment controlled attempt: PROVISIONED_OFFLINE -> ENROLLED. +# +# Behaviour (docs/29-DEVICE-ENROLLMENT.md, provisioning/enrollment/README.md): +# * One bounded attempt per start. The unit never reboots the device and never +# loops: a device without internet or without a staged token prints PENDING, +# exits 0 and stays PROVISIONED_OFFLINE. +# * When a one-time token has been staged (bf-enroll --token-stdin --stage, +# mode 0600, TTL bounded) the attempt enrolls by itself as soon as central is +# reachable. RestartSec plus the StartLimit below cap that at six attempts +# per hour and then leave the cadence to blueforce-enroll.timer, so a device +# that stays offline for weeks is never hammered. +# * No credential lives in this unit: bf-enroll reads the staged root-only +# token once and deletes it on success or on a definitive rejection. +# * Restart= is on-failure only, so a successful run, a READY device and an +# unprovisioned device are never retried. +# * Trigger: blueforce-enroll.timer (OnBootSec=10min, then daily). An operator +# can also run `bf-enroll-now` interactively at any time. +[Unit] +Description=Blueforce enrollment controlled attempt (bounded retries, never reboots) +After=network-online.target +Wants=network-online.target +StartLimitIntervalSec=1h +StartLimitBurst=6 + +[Service] +Type=exec +# Central control plane endpoint and timing, delivered by central configuration. +# Optional on purpose: the attempt reports PENDING when it is not configured yet. +EnvironmentFile=-/etc/blueforce/enrollment.env +ExecStart=/usr/local/bin/bf-enroll --systemd +# Bounded retry: enough to join automatically when connectivity returns, never +# aggressive while the device is offline (systemd holds the next attempt for +# RestartSec instead of spinning). +Restart=on-failure +RestartSec=5min +TimeoutStartSec=180 +User=root +UMask=0077 +NoNewPrivileges=yes +PrivateTmp=yes +ProtectSystem=strict +ProtectHome=yes +# Writable paths only: lifecycle state plus staged token, WireGuard configuration +# (including the wg-quick enable symlink) and central configuration. +ReadWritePaths=/var/lib/blueforce /etc/wireguard /etc/blueforce /etc/systemd/system + + + +[Unit] +Description=Blueforce enrollment pending reminder + +[Timer] +OnBootSec=10min +OnUnitActiveSec=24h +Persistent=true +Unit=blueforce-enroll.service + +[Install] +WantedBy=timers.target + + # Purpose: Bound journald disk use on field devices while keeping history. # Scope: Persistent storage with caps; install to /etc/systemd/journald.conf.d/. @@ -1542,6 +14705,10 @@ MaxFileSec=14day # NOTE: install.log and update-history.log stay append-only and are excluded here. + + + + @@ -1606,2813 +14773,6 @@ AllowedIPs = 10.8.0.0/16 PersistentKeepalive = 25 - -Generated by ../sync-docs.sh; do not edit by hand. - - - -/* Blueforce docs theme overrides. Dark mode is the default (see docusaurus.config.ts). */ -:root { - --ifm-color-primary: #4aa8ff; -} - - - -import React from 'react'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; - -export default function Home() { - const {siteConfig} = useDocusaurusContext(); - return ( - -
    -

    {siteConfig.title}

    -

    {siteConfig.tagline}

    - - Open docs - -
    -
    - ); -} -
    - - -node_modules/ -build/ -.docusaurus/ -# Generated content (recreated by sync-docs.sh on prestart/prebuild). -docs/*.md -!docs/.gitkeep - - - -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; - - - -import {themes as prismThemes} from 'prism-react-renderer'; -import type {Config} from '@docusaurus/types'; -import type * as Preset from '@docusaurus/preset-classic'; - -// Blueforce fleet documentation site. Content source: ../docs/*.md. -const config: Config = { - title: 'Blueforce Docs', - tagline: 'Fleet runbooks and architecture', - url: 'http://docs.blueforce.intranet', - baseUrl: '/', - onBrokenLinks: 'throw', - i18n: { defaultLocale: 'tr', locales: ['tr'] }, - markdown: { - mermaid: true, - hooks: { onBrokenMarkdownLinks: 'warn' }, - }, - themes: ['@docusaurus/theme-mermaid', '@easyops-cn/docusaurus-search-local'], - presets: [ - ['classic', { - docs: { path: 'docs', routeBasePath: '/', sidebarPath: './sidebars.js' }, - blog: false, - theme: { customCss: './src/css/custom.css' }, - } satisfies Preset.Options], - ], - themeConfig: { - colorMode: { defaultMode: 'dark', disableSwitch: false, respectPrefersColorScheme: false }, - navbar: { title: 'Blueforce Docs', items: [{ type: 'docSidebar', sidebarId: 'docs', position: 'left', label: 'Docs' }] }, - } satisfies Preset.ThemeConfig, -}; -export default config; - - - -{ - "name": "blueforce-docs", - "version": "0.1.0", - "private": true, - "description": "Blueforce fleet documentation site. Source of truth is ../docs/*.md; this package only builds the site.", - "scripts": { - "sync": "./sync-docs.sh", - "prestart": "./sync-docs.sh", - "prebuild": "./sync-docs.sh", - "start": "docusaurus start --host 127.0.0.1 --port 3000", - "start:intranet": "docusaurus start --host 0.0.0.0 --port 3000", - "build": "docusaurus build", - "serve": "docusaurus serve build --host 127.0.0.1 --port 3000", - "serve:intranet": "docusaurus serve build --host 0.0.0.0 --port 3000", - "clear": "docusaurus clear" - }, - "dependencies": { - "@docusaurus/core": "3.10.2", - "@docusaurus/preset-classic": "3.10.2", - "@docusaurus/theme-mermaid": "3.10.2", - "@easyops-cn/docusaurus-search-local": "0.49.2", - "@mermaid-js/layout-elk": "0.1.9", - "@mdx-js/react": "3.0.1", - "clsx": "2.1.1", - "prism-react-renderer": "2.4.0", - "react": "18.3.1", - "react-dom": "18.3.1" - }, - "devDependencies": { "typescript": "5.5.4" }, - "engines": { "node": ">=18.0" } -} - - - -# Blueforce docs site (Docusaurus) - -Static documentation is synced one-way from `../docs/*.md` into `./docs/`; never edit generated `./docs/` directly. - -## Local development - -```bash -cd docs-site -npm install -npm start # http://127.0.0.1:3000 (loopback only) -npm run build -npm run serve # local static preview on 127.0.0.1:3000 -``` - -For an explicitly approved intranet preview, use `npm run start:intranet` or `npm run serve:intranet`; those commands bind `0.0.0.0:3000`. - -## Deploy - -Publish `build/` through the intranet web server. The site has no favicon reference until a maintained favicon asset is added. - - - -// Auto-generated sidebar: every synced Markdown file appears without manual entries. -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - docs: [{type: 'autogenerated', dirName: '.'}], -}; - -export default sidebars; - - - -#!/usr/bin/env bash -# One-way sync: repo docs (../docs/*.md) -> site content (./docs/). -# The repo Markdown files are the single source of truth; never edit ./docs by hand. -set -euo pipefail - -SITE_DIR="$(cd "$(dirname "$0")" && pwd)" -SRC_DIR="$SITE_DIR/../docs" -DST_DIR="$SITE_DIR/docs" - -mkdir -p "$DST_DIR" - -# Copy current sources. -cp -f "$SRC_DIR"/*.md "$DST_DIR"/ - -# Remove stale files that no longer exist upstream (keep .gitkeep). -for f in "$DST_DIR"/*.md; do - base="$(basename "$f")" - if [ ! -f "$SRC_DIR/$base" ]; then - rm -f "$f" - fi -done - -# MDX compatibility: a bare "<" followed by a letter/digit in prose is parsed -# as JSX and breaks the build (e.g. "<15 dk"). Escape it as "<" ONLY -# outside fenced code blocks and inline code spans, where "<" is safe -# (mermaid "
    ", placeholders like `BF-`). Rendered text is unchanged. -python3 - "$DST_DIR" <<'EOF' -import re, sys, glob, os -dst = sys.argv[1] -pat = re.compile(r'<(?=[A-Za-z0-9])') -for f in glob.glob(os.path.join(dst, '*.md')): - out, in_fence = [], False - for line in open(f, encoding='utf-8'): - if line.startswith('```'): - in_fence = not in_fence - out.append(line) - continue - if in_fence: - out.append(line) - continue - # Split inline code spans; escape only the prose parts. - parts = re.split(r'(`[^`]*`)', line) - for i in range(0, len(parts), 2): - parts[i] = pat.sub('<', parts[i]) - out.append(''.join(parts)) - open(f, 'w', encoding='utf-8').write(''.join(out)) -EOF - -echo "Synced $(ls "$SRC_DIR"/*.md | wc -l) files into docs-site/docs." -
    - - -{ - "extends": "@docusaurus/tsconfig", - "compilerOptions": { - "baseUrl": "." - } -} - - - -{"annotations": {"list": []}, "editable": false, "graphTooltip": 0, "panels": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Devices answering scrapes (up==1) vs silent (up==0).", "fieldConfig": {"defaults": {"mappings": [{"options": {"0": {"text": "OFFLINE"}, "1": {"text": "ONLINE"}}, "type": "value"}], "thresholds": {"mode": "absolute", "steps": [{"color": "red", "value": 0}, {"color": "green", "value": 1}]}}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 0, "y": 0}, "id": 1, "options": {"colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "up{job=\"node\",device_id=\"$device\"}", "refId": "A"}], "title": "Online / Offline", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "100 - available% across reporting devices.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 70}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 8, "y": 0}, "id": 2, "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - node_memory_MemAvailable_bytes{job=\"node\",device_id=\"$device\"} / node_memory_MemTotal_bytes{job=\"node\",device_id=\"$device\"})", "refId": "A"}], "title": "RAM used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Average CPU over 5m from node_cpu_seconds_total.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 70}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 16, "y": 0}, "id": 3, "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{job=\"node\",device_id=\"$device\",mode=\"idle\"}[5m])) / count(rate(node_cpu_seconds_total{job=\"node\",device_id=\"$device\",mode=\"idle\"}[5m])))", "refId": "A"}], "title": "CPU used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Root filesystem usage %.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 75}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 6, "w": 12, "x": 0, "y": 4}, "id": 4, "options": {"colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - node_filesystem_avail_bytes{job=\"node\",device_id=\"$device\",mountpoint=\"/\"} / node_filesystem_size_bytes{job=\"node\",device_id=\"$device\",mountpoint=\"/\"})", "refId": "A"}], "title": "Disk / used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Seconds since the last WireGuard handshake; rising values mean a stale tunnel. Source: textfile metric wireguard_last_handshake_seconds.", "fieldConfig": {"defaults": {"thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 180}, {"color": "red", "value": 600}]}, "unit": "s"}, "overrides": []}, "gridPos": {"h": 6, "w": 12, "x": 12, "y": 4}, "id": 5, "options": {"colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "time() - wireguard_last_handshake_seconds{job=\"node\",device_id=\"$device\"}", "refId": "A"}], "title": "WireGuard handshake age", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Running containers (1) vs stopped (0), including MEG. Source: textfile metric docker_container_running.", "fieldConfig": {"defaults": {"mappings": [{"options": {"0": {"text": "STOPPED"}, "1": {"text": "RUNNING"}}, "type": "value"}], "thresholds": {"mode": "absolute", "steps": [{"color": "red", "value": 0}, {"color": "green", "value": 1}]}}, "overrides": []}, "gridPos": {"h": 6, "w": 24, "x": 0, "y": 10}, "id": 6, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "docker_container_running{job=\"node\",device_id=\"$device\"}", "legendFormat": "{{name}}", "refId": "A"}], "title": "Docker containers", "type": "timeseries"}], "refresh": "30s", "schemaVersion": 39, "tags": ["blueforce", "fleet"], "templating": {"list": [{"current": {}, "datasource": {"type": "prometheus", "uid": "prometheus"}, "definition": "label_values(up{job=\"node\"}, device_id)", "includeAll": false, "multi": false, "name": "device", "options": [], "query": {"query": "label_values(up{job=\"node\"}, device_id)", "refId": "PrometheusVariableQueryEditor-VariableQuery"}, "refresh": 1, "regex": "", "type": "query"}]}, "time": {"from": "now-6h", "to": "now"}, "timepicker": {}, "timezone": "", "title": "Blueforce Fleet Overview", "uid": "bf-fleet-overview", "version": 1} - - - -# Auto-provision the fleet dashboard from disk (no manual import). -apiVersion: 1 - -providers: - - name: blueforce-fleet - orgId: 1 - folder: Blueforce - type: file - disableDeletion: false - updateIntervalSeconds: 30 - allowUiUpdates: false - options: - path: /etc/grafana/dashboards - - - -# Auto-provisioned Prometheus datasource for Grafana OSS. -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - access: proxy - url: http://prometheus:9090 - isDefault: true - editable: false - - - -[ - { - "targets": ["10.7.0.11"], - "labels": { - "device_id": "BF-12010193", - "site": "pilot", - "job": "node" - } - } -] - - - -# File-based service discovery for the 700-device fleet. -# -# Prometheus watches this directory (refresh 30s); adding or removing a -# `*.json` file takes effect without a reload or restart. -# -# Per-device entry template (WireGuard address as target, identity label -# contract `device_id="BF-"` on every target): -# -# [ -# { -# "targets": ["10.7.0.11"], -# "labels": {"device_id": "BF-12010193", "site": "pilot", "job": "node"} -# } -# ] -# -# Scale-out: generate one file per site/region (e.g. `site-ankara.json`) -# from the Ansible inventory; keep each file under a few thousand targets. - - - -# Fleet alert rules. Severity: critical pages the on-call admin (14-MONITORING). -# Notification endpoints (SMS/e-mail/webhook) are wired in the central -# Grafana Alerting / Alertmanager setup, not in this file. -# All expressions assume 60s scrape interval. - -groups: - - name: fleet - interval: 60s - rules: - # Device does not answer scrapes for 5 minutes -> presumed offline. - - alert: FleetOffline - expr: up{job="node"} == 0 - for: 5m - labels: - severity: critical - annotations: - summary: "Device {{ $labels.device_id }} is offline" - description: "No successful scrape for 5m (instance {{ $labels.instance }}). Check Uptime Kuma last-seen and field power/network." - - # Root filesystem less than 10% available for 10 minutes. - - alert: FleetDiskFull - expr: | - ( - node_filesystem_avail_bytes{job="node", mountpoint="/", fstype!~"tmpfs|overlay"} - / - node_filesystem_size_bytes{job="node", mountpoint="/", fstype!~"tmpfs|overlay"} - ) < 0.10 - for: 10m - labels: - severity: critical - annotations: - summary: "Device {{ $labels.device_id }} disk almost full" - description: "Root filesystem <10% available for 10m on {{ $labels.instance }}." - - # Boot time changed recently -> unexpected reboot (power loss or crash). - - alert: FleetUnexpectedReboot - expr: time() - node_boot_time_seconds{job="node"} < 15 * 60 - for: 5m - labels: - severity: critical - annotations: - summary: "Device {{ $labels.device_id }} rebooted unexpectedly" - description: "{{ $labels.instance }} booted less than 15m ago. Correlate with power-loss recovery (16-POWER-LOSS)." - - # unattended-upgrades must stay DISABLED (K-11); 1 means the lock was broken. - # Source: textfile metric unattended_upgrade_active. - - alert: FleetSecurityUpdatesViolation - expr: unattended_upgrade_active{job="node"} == 1 - for: 5m - labels: - severity: critical - annotations: - summary: "Device {{ $labels.device_id }} has unattended-upgrades enabled" - description: "Update policy lock (K-11) violated on {{ $labels.instance }}. Disable unattended-upgrades per 10-UPDATE." - - - -# Prometheus configuration for the Blueforce fleet. -# Scrape interval 60s keeps cardinality/storage tractable at 700 nodes. -# Fleet targets scale via file-based service discovery: add/remove entries -# in targets/fleet.json without reloading Prometheus (refresh_interval 30s). - -global: - scrape_interval: 60s - scrape_timeout: 10s - evaluation_interval: 60s - external_labels: - fleet: blueforce - -rule_files: - - alerts.yml - -scrape_configs: - # Prometheus self-monitoring. - - job_name: prometheus - static_configs: - - targets: ["localhost:9090"] - - # Field devices: Node Exporter (:9100) + textfile collector metrics. - # Identity label contract: device_id="BF-" on every target. - - job_name: node - file_sd_configs: - - files: ["/etc/prometheus/targets/*.json"] - refresh_interval: 30s - relabel_configs: - - source_labels: [__address__] - target_label: __address__ - regex: (.+) - replacement: ${1}:9100 - - source_labels: [device_id] - target_label: device_id - regex: (.+) - replacement: ${1} - metric_relabel_configs: - # Enforce the device_id label contract; drop series without it. - - source_labels: [device_id] - regex: .+ - action: keep - - - -# Central monitoring stack for the Blueforce fleet. -# Grafana requires GF_SECURITY_ADMIN_PASSWORD__FILE on first startup; no default credential exists. -services: - prometheus: - image: prom/prometheus:v3.1.0 - container_name: bf-prometheus - restart: unless-stopped - volumes: - - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - - ./prometheus/alerts.yml:/etc/prometheus/alerts.yml:ro - - ./prometheus/targets:/etc/prometheus/targets:ro - - prometheus-data:/prometheus - command: [--config.file=/etc/prometheus/prometheus.yml, --storage.tsdb.path=/prometheus, --storage.tsdb.retention.time=90d, --web.enable-lifecycle] - ports: ["127.0.0.1:9090:9090"] - networks: [monitoring] - grafana: - image: grafana/grafana-oss:11 - container_name: bf-grafana - restart: unless-stopped - depends_on: [prometheus] - environment: - GF_SECURITY_ADMIN_USER: "${GF_SECURITY_ADMIN_USER:-admin}" - GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password - secrets: [grafana_admin_password] - volumes: - - grafana-data:/var/lib/grafana - - ./grafana/provisioning:/etc/grafana/provisioning:ro - - ./grafana/dashboards:/etc/grafana/dashboards:ro - ports: ["127.0.0.1:3001:3000"] - networks: [monitoring] - uptime-kuma: - image: louislam/uptime-kuma:1 - container_name: bf-uptime-kuma - restart: unless-stopped - volumes: [uptime-kuma-data:/app/data] - ports: ["127.0.0.1:3002:3001"] - networks: [monitoring] -secrets: - grafana_admin_password: - file: "${GRAFANA_ADMIN_PASSWORD_FILE:?Set GRAFANA_ADMIN_PASSWORD_FILE to a root-owned password file}" -volumes: - prometheus-data: - grafana-data: - uptime-kuma-data: -networks: - monitoring: - driver: bridge - - - -# Central monitoring stack (Prometheus + Grafana OSS + Uptime Kuma) - -## Start - -Create a root-owned password file whose contents are the Grafana first-admin password (no newline is preferred), then start with its absolute path: - -```bash -install -m 600 -o root -g root /dev/null /etc/blueforce/grafana-admin-password -# Write the generated password directly to /etc/blueforce/grafana-admin-password. -cd monitoring -GRAFANA_ADMIN_PASSWORD_FILE=/etc/blueforce/grafana-admin-password docker compose up -d -``` - -`GRAFANA_ADMIN_PASSWORD_FILE` is mandatory. Compose mounts that host file as a Docker secret; it is not stored in the repository or printed in the compose environment. The process owner must keep the file root-owned and mode `0600`. Grafana is available at `http://127.0.0.1:3001`; Prometheus at `:9090`; Uptime Kuma at `:3002`. - -## Fleet targets - -Field devices are scraped via file-based service discovery in `prometheus/targets/*.json` (see `prometheus/targets/README.md`). - -## Alerts - -Validate changes with `promtool check rules prometheus/alerts.yml` and `promtool check config prometheus/prometheus.yml`. - - - -# RustDesk self-hosted server (hbbs + hbbr) on the central VDS. -# OSS edition (AGPL-3.0), unlimited clients, no license cost. -# Docs: https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ -# -# Port contract (VDS firewall must allow these from field-device internet): -# 21115/TCP hbbs NAT-type test -# 21116/TCP hbbs ID registration / heartbeat -# 21116/UDP hbbs TCP hole punching -# 21117/TCP hbbr relay traffic -# Optional, keep CLOSED unless the web client is used: -# 21118/TCP hbbs web client support -# 21119/TCP hbbr web client support -# Pro-only (not used here): -# 21114/TCP Pro web console -# -# network_mode: host is REQUIRED so hbbs/hbbr see the real client source -# IPs (rendezvous + relay decisions break behind Docker NAT). - -services: - hbbs: - image: rustdesk/rustdesk-server:1.1.16 - container_name: bf-hbbs - network_mode: host - restart: unless-stopped - volumes: - - ./data:/root - command: hbbs - - hbbr: - image: rustdesk/rustdesk-server:1.1.16 - container_name: bf-hbbr - network_mode: host - restart: unless-stopped - volumes: - - ./data:/root - command: hbbr - - - -# RustDesk Self-Hosted Server (hbbs + hbbr) - -OSS rendezvous + relay server for the Blueforce fleet. Field clients reach -the VDS public address directly over the internet, independent of WireGuard: -if the tunnel drops, this channel stays up (requires field internet + VDS up). - -## Prerequisites - -- A central VDS with a public DNS name (example: `rustdesk.example.com`). - Use your real DNS name; the value below is a placeholder. -- TCP/UDP ports 21115-21117 reachable from the internet (see port table in - `docker-compose.yml`). Keep 21118/21119 closed unless the web client is used. -- Docker Engine + Docker Compose plugin on the VDS. - -## Setup - -```bash -cd rustdesk -docker compose up -d -# First start generates the keypair in ./data (id_ed25519 + id_ed25519.pub). -cat data/id_ed25519.pub # <-- public key; embed in field clients -docker logs bf-hbbs # verify hbbs listening -docker logs bf-hbbr # verify hbbr listening -``` - -## Key distribution (field clients) - -1. Read the public key: `cat data/id_ed25519.pub` (single line, no newline issues). -2. Bake into the golden image / deployment script together with the server address: - `rustdesk.example.com` (replace with the real VDS DNS name). -3. Client config keys: `host = rustdesk.example.com`, `key = `. -4. Tag each client with its device identity `BF-` so the RustDesk address - book matches the Ansible inventory and MeshCentral names. -5. Key rotation: deploy the new key alongside the old one, confirm clients - connect, then retire the old key. - -## Health monitoring - -Point Uptime Kuma (see `../monitoring`) at: - -- TCP 21116 (hbbs heartbeat) -- TCP 21117 (hbbr relay) - -## Notes - -- `network_mode: host` is intentional; do not add port mappings. -- Data directory `./data` holds the keypair; back it up (see 17-BACKUP-RECOVERY). -- Never commit the private key (`data/id_ed25519`) to Git. - - - -#!/usr/bin/env bash -# -# bf-diagnostics - Deep health check for a Blueforce field terminal. -# -# Detailed version of bf-status: SMART, journal errors, docker ps, -# WireGuard state, unattended-upgrades lock, sockets, inodes, textfiles. -# Never prints secrets, keys, or passwords (handshake keys are redacted). -# -# Install: install -m 0755 bf-diagnostics /usr/local/bin/bf-diagnostics -# Usage: bf-diagnostics [--help] -# -set -euo pipefail - -usage() { - cat <<'EOF' -Usage: bf-diagnostics [--help] - -Run deep checks: SMART, journal errors, docker ps, wg show, -unattended-upgrades lock state, sockets, inodes, textfile collectors. - -Options: - --help Show this help and exit -EOF -} - -if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then - usage - exit 0 -elif [[ $# -gt 0 ]]; then - echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 -fi - -set +e # report, don't abort - -sec() { printf '\n### %s\n' "$*"; } - -sec "HOST" -hostname; uptime; systemctl get-default 2>/dev/null || echo "target: unknown" - -sec "SMART" -if command -v smartctl >/dev/null 2>&1; then - for dev in /dev/sd? /dev/nvme?n1; do - [[ -b "${dev}" ]] || continue - echo "--- ${dev} ---" - smartctl -H -A "${dev}" 2>/dev/null | grep -Ei 'health|reallocated|pending|uncorrect|wear|temperature|power_on' || echo "no SMART attributes parsed" - done -else - echo "smartctl not installed; skipping SMART." -fi - -sec "JOURNAL ERRORS (last 24h, top 20)" -if command -v journalctl >/dev/null 2>&1; then - journalctl --since "24 hours ago" -p err --no-pager -o short 2>/dev/null | tail -20 || echo "no journal access" -else - echo "journalctl not available." -fi - -sec "FAILED SYSTEMD UNITS" -if command -v systemctl >/dev/null 2>&1; then - systemctl --failed --no-pager 2>/dev/null || echo "no failed units" -else - echo "systemctl not available." -fi - -sec "DOCKER PS" -if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then - docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' 2>/dev/null || echo "docker ps failed" - echo "--- restart counts ---" - docker ps --format '{{.Names}} restarts={{.RestartCount}}' 2>/dev/null || true -else - echo "docker daemon not reachable." -fi - -sec "WIREGUARD (keys redacted)" -if command -v wg >/dev/null 2>&1; then - wg show 2>/dev/null | sed -E 's/(private-key|public-key|preshared-key): .*/\1: /' || echo "no WireGuard interfaces" - echo "--- latest handshakes ---" - wg show all latest-handshakes 2>/dev/null || echo "no handshake data" -else - echo "wg tool not installed." -fi - -sec "UNATTENDED-UPGRADES LOCK (must be DISABLED)" -grep -H . /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null || echo "20auto-upgrades file missing" -for t in apt-daily.timer apt-daily-upgrade.timer; do - printf '%s: %s\n' "$t" "$(systemctl is-enabled "$t" 2>/dev/null || echo unknown)" -done - -sec "SOCKETS (listening)" -ss -ltnp 2>/dev/null || ss -ltn 2>/dev/null || echo "ss not available" - -sec "DISK + INODES" -df -h / /var 2>/dev/null -df -i / /var 2>/dev/null | head -5 - -sec "TEXTFILE COLLECTORS" -ls -l /var/lib/node_exporter/textfile/ 2>/dev/null || echo "textfile dir missing" -for f in /var/lib/node_exporter/textfile/*.prom; do - [[ -f "$f" ]] || continue - echo "--- $f ---"; head -10 "$f" -done - -sec "SECURITY UPDATES PENDING" -if command -v apt >/dev/null 2>&1; then - apt list --upgradable 2>/dev/null | grep -ci security || echo "0 security updates (or apt list unavailable)" -else - echo "apt not available." -fi - -sec "REBOOT REQUIRED" -if [[ -f /var/run/reboot-required ]]; then echo "YES"; cat /var/run/reboot-required.pkgs 2>/dev/null || true -else echo "NO"; fi - -echo -echo "Diagnostics complete. For remote triage run: bf-support-bundle" -exit 0 - - - -#!/usr/bin/env bash -# -# bf-hardware-inventory.sh - Scan field-terminal hardware and emit JSON + Markdown. -# -# Covers every field in docs/02-DEVICE-NAMING-AND-INVENTORY.md §9: -# Manufacturer/Model/Serial/BIOS/CPU/RAM/Disk/SMART/NIC/MAC/GPU/USB/ -# SerialPorts/Kernel/Arch/TPM/Virt/Temps. Missing probes report -# "unknown" instead of aborting. Never prints secrets, keys, or passwords. -# -# Install: install -m 0755 bf-hardware-inventory.sh /usr/local/bin/bf-hardware-inventory.sh -# Usage: bf-hardware-inventory.sh [--dealer-id ID] [--out-dir DIR] [--json] [--markdown] [--help] -# -set -euo pipefail - -DEALER_ID="" -OUT_DIR="" -MODE="both" # json | markdown | both - -usage() { - cat <<'EOF' -Usage: bf-hardware-inventory.sh [--dealer-id ID] [--out-dir DIR] [--json] [--markdown] [--help] - -Scan hardware and emit inventory (JSON for machines, Markdown for humans). - -Options: - --dealer-id ID 8-digit dealer number (validates ^[0-9]{8}$ when given) - --out-dir DIR Write BF-.json and BF-.md into DIR - (requires --dealer-id; default filenames use hostname) - --json Print only JSON to stdout - --markdown Print only Markdown to stdout - --help Show this help and exit - -Fields (doc 02 §9): Manufacturer, Model, Serial, BIOS, CPU, RAM, -Disk, SMART, NIC, MAC, GPU, USB, SerialPorts, Kernel, Arch, TPM, -Virt, Temps. Unavailable probes report "unknown". -EOF -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --dealer-id) DEALER_ID="${2:?missing value for --dealer-id}"; shift 2 ;; - --out-dir) OUT_DIR="${2:?missing value for --out-dir}"; shift 2 ;; - --json) MODE="json"; shift ;; - --markdown) MODE="markdown"; shift ;; - --help|-h) usage; exit 0 ;; - *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; - esac -done - -if [[ -n "${DEALER_ID}" ]] && ! [[ "${DEALER_ID}" =~ ^[0-9]{8}$ ]]; then - echo "ERROR: --dealer-id must match ^[0-9]{8}$ (got: ${DEALER_ID})" >&2 - exit 2 -fi -if [[ -n "${OUT_DIR}" && -z "${DEALER_ID}" ]]; then - echo "ERROR: --out-dir requires --dealer-id" >&2 - exit 2 -fi - -set +e # probes must not abort the report - -HOST="$(hostname 2>/dev/null || echo unknown)" -if [[ -n "${DEALER_ID}" ]]; then - DEVICE_ID="BF-${DEALER_ID}" - LOWER_HOST="bf-${DEALER_ID}" -else - DEVICE_ID="$(echo "${HOST}" | tr '[:lower:]' '[:upper:]')" - LOWER_HOST="$(echo "${HOST}" | tr '[:upper:]' '[:lower:]')" -fi -NOW="$(date '+%Y-%m-%dT%H:%M:%S%z' 2>/dev/null || echo unknown)" - -json_escape() { # stdin -> JSON string body - python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || sed 's/"/\\"/g' | tr -d '\n' -} -val() { # $1 raw -> "unknown" fallback, no newlines - local v="$1" - v="$(echo "${v}" | head -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" - [[ -z "${v}" ]] && echo "unknown" || echo "${v}" -} - -# --- Probes (all fields from doc 02) --- -MANUFACTURER="$(val "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null || dmidecode -s system-manufacturer 2>/dev/null)")" -MODEL="$(val "$(cat /sys/class/dmi/id/product_name 2>/dev/null || dmidecode -s system-product-name 2>/dev/null)")" -SERIAL="$(val "$(cat /sys/class/dmi/id/product_serial 2>/dev/null || dmidecode -s system-serial-number 2>/dev/null)")" -BIOS_VENDOR="$(val "$(cat /sys/class/dmi/id/bios_vendor 2>/dev/null || dmidecode -s bios-vendor 2>/dev/null)")" -BIOS_VERSION="$(val "$(cat /sys/class/dmi/id/bios_version 2>/dev/null || dmidecode -s bios-version 2>/dev/null)")" -BIOS_DATE="$(val "$(cat /sys/class/dmi/id/bios_date 2>/dev/null || dmidecode -s bios-release-date 2>/dev/null)")" -CPU_MODEL="$(val "$(awk -F': ' '/^model name/ {print $2; exit}' /proc/cpuinfo 2>/dev/null || lscpu 2>/dev/null | awk -F': *' '/Model name/ {print $2; exit}')")" -CPU_CORES="$(val "$(nproc 2>/dev/null || grep -c '^processor' /proc/cpuinfo 2>/dev/null)")" -ARCH="$(val "$(uname -m 2>/dev/null)")" -KERNEL="$(val "$(uname -sr 2>/dev/null)")" -MEM_KB="$(awk '/MemTotal/ {print $2}' /proc/meminfo 2>/dev/null)" -MEMORY_MB="$([ -n "${MEM_KB}" ] && echo $((MEM_KB / 1024)) || echo "unknown")" -MEMORY_STR="$([ "${MEMORY_MB}" != "unknown" ] && echo "${MEMORY_MB} MB" || echo "unknown")" - -DISKS="$(lsblk -d -n -o NAME,SIZE,TYPE,ROTA 2>/dev/null || echo unknown)" -GPU="$(val "$(lspci 2>/dev/null | grep -iE 'vga|3d|display' | head -3 | sed 's/^[^:]*: //')")" -NIC_LIST="$(val "$(ls /sys/class/net 2>/dev/null | grep -v '^lo$' | tr '\n' ',' | sed 's/,$//')")" -MAC_LIST="$(val "$(for n in /sys/class/net/*; do [[ "$(basename "$n")" == lo ]] && continue; cat "$n/address" 2>/dev/null; done | tr '\n' ',' | sed 's/,$//')")" -USB_LIST="$(val "$(lsusb 2>/dev/null | head -20 || echo '')")" -SERIAL_PORTS="$(val "$(ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | tr '\n' ',' | sed 's/,$//')")" -TPM="$(val "$( ([ -c /dev/tpm0 ] && echo -n 'present (/dev/tpm0)') ; dmesg 2>/dev/null | grep -im1 'tpm' | head -1 | sed 's/^/ /')")" -VIRT="$(val "$(systemd-detect-virt 2>/dev/null || echo none)")" -TEMPS="$(val "$( (cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | head -5 | tr '\n' ' '); sensors 2>/dev/null | grep -iE 'core|temp|package' | head -5 | tr '\n' ';')")" - -SMART_SUMMARY="unknown" -if command -v smartctl >/dev/null 2>&1; then - SMART_SUMMARY="$(for dev in /dev/sd? /dev/nvme?n1; do - [[ -b "${dev}" ]] || continue - echo -n "${dev}: " - smartctl -H "${dev}" 2>/dev/null | grep -im1 'health\|result' | sed 's/^[[:space:]]*//' | head -1 - echo -n '; ' - done)" - SMART_SUMMARY="$(val "${SMART_SUMMARY}")" -else - SMART_SUMMARY="smartctl not installed" -fi - -OS_PRETTY="$(val "$(grep -E '^PRETTY_NAME=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"')")" - -E() { printf '%s' "$1" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || printf '%s' "$1"; } - -JSON="$(cat < "${OUT_DIR}/BF-${DEALER_ID}.json" - printf '%s\n' "${MD}" > "${OUT_DIR}/BF-${DEALER_ID}.md" - echo "wrote ${OUT_DIR}/BF-${DEALER_ID}.json ${OUT_DIR}/BF-${DEALER_ID}.md" - else - printf '%s\n\n%s\n' "${JSON}" "${MD}" - fi - ;; -esac - - - -#!/usr/bin/env bash -# -# bf-status - Quick 16-line health glance for a Blueforce field terminal. -# -# Output contract: docs/14-MONITORING-AND-HEALTH.md ("bf-status ornek ciktisi"). -# Never prints secrets, keys, or passwords. -# -# Install: install -m 0755 bf-status /usr/local/bin/bf-status -# Usage: bf-status [--help] -# -set -euo pipefail - -usage() { - cat <<'EOF' -Usage: bf-status [--help] - -Print the 16-line BLUEFORCE FIELD TERMINAL health summary. - -Options: - --help Show this help and exit - -Exit status is always 0; individual failing probes report DOWN/UNKNOWN -inline instead of aborting the report. -EOF -} - -if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then - usage - exit 0 -elif [[ $# -gt 0 ]]; then - echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 -fi - -# Never abort the report on a failing probe. -set +e - -HOST="$(hostname 2>/dev/null || echo unknown)" -DEVICE_ID="$(echo "${HOST}" | tr '[:lower:]' '[:upper:]')" -NOW="$(date '+%Y-%m-%d %H:%M %z' 2>/dev/null || echo unknown)" -OVERALL="OK" - -uptime_str() { - uptime -p 2>/dev/null | sed 's/^up //' || echo unknown -} -load_str() { - awk '{print $1, $2, $3}' /proc/loadavg 2>/dev/null || echo "unknown" -} -cpu_pct() { - # 1-second sample from /proc/stat. - read -r _ a b c d e f g h i j < /proc/stat 2>/dev/null || { echo "?"; return; } - idle1=$((d + e)); total1=$((a+b+c+d+e+f+g+h+i+j)) - sleep 1 - read -r _ a b c d e f g h i j < /proc/stat 2>/dev/null || { echo "?"; return; } - idle2=$((d + e)); total2=$((a+b+c+d+e+f+g+h+i+j)) - dt=$((total2 - total1)); di=$((idle2 - idle1)) - if [[ "${dt}" -le 0 ]]; then echo "?"; else echo $(( (100 * (dt - di)) / dt )); fi -} -mem_str() { - local avail total - avail="$(awk '/MemAvailable/ {print $2}' /proc/meminfo 2>/dev/null)" - total="$(awk '/MemTotal/ {print $2}' /proc/meminfo 2>/dev/null)" - if [[ -n "${avail}" && -n "${total}" && "${total}" -gt 0 ]]; then - local used=$((total - avail)) - local pct=$((100 * used / total)) - printf '%s/%sG (%s%%)' \ - "$(awk -v v="${used}" 'BEGIN{printf "%.1f", v/1048576}')" \ - "$(awk -v v="${total}" 'BEGIN{printf "%.1f", v/1048576}')" \ - "${pct}" - else - echo "unknown" - fi -} -disk_str() { - df -BG / 2>/dev/null | awk 'NR==2 {gsub(/G/,"",$2); gsub(/G/,"",$3); gsub(/%/,"",$5); printf "%s/%sG (%s%%)", $3, $2, $5}' || echo "unknown" -} -svc_state() { # $1 = unit - if ! command -v systemctl >/dev/null 2>&1; then echo "UNKNOWN"; return; fi - if systemctl is-active --quiet "$1" 2>/dev/null; then echo "OK"; return; fi - if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^$1"; then echo "DOWN"; else echo "OFF"; fi -} -wg_info() { - if ! command -v wg >/dev/null 2>&1; then echo "wg0 MISSING (no wg tool)"; return; fi - if ! ip link show wg0 >/dev/null 2>&1; then echo "wg0 DOWN (no interface)"; return; fi - local hs - hs="$(wg show wg0 latest-handshakes 2>/dev/null | awk '{print $2}' | head -1)" - if [[ -z "${hs}" || "${hs}" == "0" ]]; then echo "wg0 UP, no handshake yet"; return; fi - local now ago - now="$(date +%s)"; ago=$((now - hs)) - echo "wg0 UP, handshake ${ago}s ago" -} -net_counters() { - local rx=0 tx=0 f - for f in /sys/class/net/*/statistics/rx_bytes; do rx=$((rx + $(cat "$f" 2>/dev/null || echo 0))); done - for f in /sys/class/net/*/statistics/tx_bytes; do tx=$((tx + $(cat "$f" 2>/dev/null || echo 0))); done - echo "rx $(numfmt --to=iec "$rx" 2>/dev/null || echo "$rx") tx $(numfmt --to=iec "$tx" 2>/dev/null || echo "$tx")" -} -docker_info() { - if ! command -v docker >/dev/null 2>&1; then echo "daemon MISSING"; return; fi - if docker info >/dev/null 2>&1; then echo "daemon UP"; else echo "daemon DOWN"; fi -} -meg_info() { - # MEG container name convention: meg-* ; report first match. - if ! command -v docker >/dev/null 2>&1 || ! docker info >/dev/null 2>&1; then echo "meg:unknown (docker down)"; return; fi - local line - line="$(docker ps --format '{{.Names}} {{.Status}} {{.RestartCount}}' 2>/dev/null | grep -i '^meg' | head -1)" - if [[ -z "${line}" ]]; then echo "meg NOT RUNNING"; return; fi - echo "${line}" -} -meg_last_success() { - local f="/var/lib/blueforce/meg_last_success" - if [[ -f "${f}" ]]; then - local ts now - ts="$(cat "${f}" 2>/dev/null | tr -d '[:space:]')" - now="$(date +%s)" - if [[ "${ts}" =~ ^[0-9]+$ ]]; then echo "UP, last success $((now - ts))s ago"; else echo "UP, last success unknown"; fi - else - echo "unknown (no timestamp file)" - fi -} -unattended_state() { - local masked="no" cfg="unknown" - if systemctl is-enabled apt-daily.timer 2>/dev/null | grep -q masked; then masked="yes"; fi - if grep -Eq '"0"' /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null; then cfg="0"; fi - if [[ "${masked}" == "yes" && "${cfg}" == "0" ]]; then echo "DISABLED (timer masked)"; else echo "CHECK (timer/cfg drift)"; fi -} -ufw_str() { - if ! command -v ufw >/dev/null 2>&1; then echo "ufw not installed"; return; fi - if ufw status 2>/dev/null | head -1 | grep -qi active; then echo "active, default DENY in | 22/3389 wg0-only"; else echo "INACTIVE"; fi -} -gui_str() { - local target sessions="0" - target="$(systemctl get-default 2>/dev/null || echo unknown)" - if ss -ltn 2>/dev/null | grep -q ':3389 '; then sessions="$(ss -tn state established '( dport = :3389 or sport = :3389 )' 2>/dev/null | tail -n +2 | wc -l | tr -d ' ')"; fi - if [[ "${target}" == "graphical.target" ]]; then echo "ON (graphical) | rdp sessions: ${sessions}"; else echo "OFF (multi-user) | rdp sessions: ${sessions}"; fi -} -kuma_str() { - local f="/var/lib/blueforce/kuma_last_push" - if [[ -f "${f}" ]]; then - local ts now - ts="$(cat "${f}" 2>/dev/null | tr -d '[:space:]')" - now="$(date +%s)" - if [[ "${ts}" =~ ^[0-9]+$ ]]; then echo "OK $((now - ts))s ago"; else echo "unknown"; fi - else - echo "unknown (no push record)" - fi -} -scrape_str() { - local f="/var/lib/node_exporter/textfile/last_scrape" - if [[ -f "${f}" ]]; then echo "OK ($(cat "${f}" 2>/dev/null | tr -d '[:space:]'))"; else echo "unknown"; fi -} -rustdesk_str() { - if pgrep -x rustdesk >/dev/null 2>&1 || systemctl is-active --quiet rustdesk 2>/dev/null; then echo "online"; else echo "offline"; fi -} -mesh_str() { - if pgrep -i meshcentral >/dev/null 2>&1 || systemctl is-active --quiet meshagent 2>/dev/null; then echo "online"; else echo "offline"; fi -} -boot_str() { - local b - b="$(who -b 2>/dev/null | awk '{print $3, $4}' || echo unknown)" - echo "${b} (power-loss recovery OK)" -} -alerts_str() { - # Warning heuristic: disk use > 80% counts one warning. - local pct - pct="$(df / 2>/dev/null | awk 'NR==2 {gsub(/%/,"",$5); print $5}')" - if [[ -n "${pct}" && "${pct}" -ge 90 ]] 2>/dev/null; then echo "1 critical, 0 warning (disk ${pct}%)"; - elif [[ -n "${pct}" && "${pct}" -ge 80 ]] 2>/dev/null; then echo "0 critical, 1 warning (disk trend)"; - else echo "0 critical, 0 warning"; fi -} - -DOCKER_SVC="$(svc_state docker)" -WG_SVC="$(svc_state "wg-quick@wg0")" -XRDP_SVC="$(svc_state xrdp)" -NODE_SVC="$(svc_state node_exporter)" - -printf '%s %s %s\n' "${DEVICE_ID}" "${NOW}" "${OVERALL}" -printf 'uptime: %s | load: %s\n' "$(uptime_str)" "$(load_str)" -printf 'cpu: %s%% | mem: %s | disk /: %s\n' "$(cpu_pct)" "$(mem_str)" "$(disk_str)" -printf 'net: %s | %s\n' "$(wg_info)" "$(net_counters)" -printf 'docker: %s | %s\n' "$(docker_info)" "$(meg_info)" -printf 'meg: %s\n' "$(meg_last_success)" -printf 'systemd: docker %s | wg-quick@wg0 %s | xrdp %s | node_exporter %s\n' "${DOCKER_SVC}" "${WG_SVC}" "${XRDP_SVC}" "${NODE_SVC}" -printf 'unattended-upgrades: %s\n' "$(unattended_state)" -printf 'ufw: %s\n' "$(ufw_str)" -printf 'gui: %s\n' "$(gui_str)" -printf 'kuma push: %s | prometheus scrape: %s\n' "$(kuma_str)" "$(scrape_str)" -printf 'rustdesk: %s | meshcentral: %s\n' "$(rustdesk_str)" "$(mesh_str)" -printf 'boot: %s\n' "$(boot_str)" -printf 'alerts: %s\n' "$(alerts_str)" -printf 'next: support bundle: bf-support-bundle\n' - - - -#!/usr/bin/env bash -# -# bf-support-bundle - Collect a secret-free support tarball for a Blueforce field terminal. -# -# Gathers bf-status + bf-diagnostics output, journal tail, textfile collectors -# and basic system facts into a tar.gz. Files matching secret patterns -# (*.key, *secret*, password material, private keys) are NEVER included, -# and key-like values in captured command output are redacted. -# A manifest.txt inside the bundle lists every file + collection time. -# -# Output contract: docs/14-MONITORING-AND-HEALTH.md ("bf-support-bundle ... -# secret ... ASLA pakete girmez"). -# -# Install: install -m 0755 bf-support-bundle /usr/local/bin/bf-support-bundle -# Usage: bf-support-bundle [--out-dir DIR] [--help] -# -set -euo pipefail - -OUT_DIR="/var/tmp" -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -usage() { - cat <<'EOF' -Usage: bf-support-bundle [--out-dir DIR] [--help] - -Collect a secret-free support bundle (tar.gz with manifest.txt). - -Options: - --out-dir DIR Directory for the tarball (default: /var/tmp) - --help Show this help and exit - -Excluded (never packaged): - *.key, *secret*, *password*, *passwd*, *private*, - *id_rsa*, *id_ed25519*, *.pem, WireGuard private keys, - RustDesk passwords, SSH private keys. - -Manifest: - manifest.txt inside the tarball lists each file, byte size, - collection timestamp, and the exclusion patterns applied. -EOF -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --out-dir) OUT_DIR="${2:?missing value for --out-dir}"; shift 2 ;; - --help|-h) usage; exit 0 ;; - *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; - esac -done - -HOST="$(hostname 2>/dev/null || echo unknown)" -STAMP="$(date '+%Y%m%d-%H%M%S' 2>/dev/null || echo unknown)" -WORK="$(mktemp -d)" -trap 'rm -rf "${WORK}"' EXIT - -BUNDLE_NAME="blueforce-support-${HOST}-${STAMP}" -STAGE="${WORK}/${BUNDLE_NAME}" -mkdir -p "${STAGE}" - -log() { echo "[bf-support-bundle] $*" >&2; } - -# Exclude patterns: filename-level, applied to every copy step and tar. -EXCLUDE_PATTERNS=( - '*.key' '*secret*' '*password*' '*passwd*' '*private*' - '*id_rsa*' '*id_ed25519*' '*.pem' '*.p12' '*.pfx' -) -is_excluded() { # $1 = basename - local base="$1" pat - for pat in "${EXCLUDE_PATTERNS[@]}"; do - # shellcheck disable=SC2053 - [[ "${base}" == ${pat} ]] && return 0 - done - return 1 -} - -redact() { # stdin -> stdout: mask key-like values - sed -E \ - -e 's/(private-key|public-key|preshared-key)([[:space:]]*[:=][[:space:]]*).*/\1\2/I' \ - -e 's/(password|passwd|secret|token)([[:space:]]*[:=][[:space:]]*)[^[:space:]]+/\1\2/I' -} - -collect_cmd() { # $1 = outfile, $@ = command - local out="$1"; shift - { "$@" 2>&1 || echo "(command failed: $*)"; } | redact > "${out}" || true -} - -log "collecting into ${STAGE}" - -collect_cmd "${STAGE}/bf-status.txt" "${SCRIPT_DIR}/bf-status" || true -if [[ -x "${SCRIPT_DIR}/bf-diagnostics" ]]; then - collect_cmd "${STAGE}/bf-diagnostics.txt" "${SCRIPT_DIR}/bf-diagnostics" || true -fi -collect_cmd "${STAGE}/system.txt" bash -c 'hostname; uptime; uname -a; systemctl get-default 2>/dev/null || echo "target: unknown"' -collect_cmd "${STAGE}/disk-df.txt" bash -c 'df -h / /var 2>/dev/null; echo ---; df -i / /var 2>/dev/null' -collect_cmd "${STAGE}/sockets.txt" bash -c 'ss -ltnp 2>/dev/null || ss -ltn 2>/dev/null || echo "ss not available"' -collect_cmd "${STAGE}/failed-units.txt" bash -c 'systemctl --failed --no-pager 2>/dev/null || echo "no failed units"' - -if command -v journalctl >/dev/null 2>&1; then - journalctl --since "24 hours ago" -p err --no-pager -o short 2>/dev/null | redact | tail -200 > "${STAGE}/journal-err-24h.txt" || echo "no journal access" > "${STAGE}/journal-err-24h.txt" -else - echo "journalctl not available." > "${STAGE}/journal-err-24h.txt" -fi - -if command -v wg >/dev/null 2>&1; then - { wg show 2>/dev/null | redact || echo "no WireGuard interfaces"; echo "--- latest handshakes ---"; wg show all latest-handshakes 2>/dev/null || echo "no handshake data"; } > "${STAGE}/wireguard.txt" || true -else - echo "wg tool not installed." > "${STAGE}/wireguard.txt" -fi - -# Textfile collectors: copy *.prom only, never anything matching excludes. -mkdir -p "${STAGE}/textfile" -if [[ -d /var/lib/node_exporter/textfile ]]; then - while IFS= read -r -d '' f; do - base="$(basename "${f}")" - if is_excluded "${base}"; then - log "skipping excluded file: ${base}" - continue - fi - cp "${f}" "${STAGE}/textfile/${base}" 2>/dev/null || true - done < <(find /var/lib/node_exporter/textfile -maxdepth 1 -name '*.prom' -type f -print0 2>/dev/null || true) - if [[ -z "$(ls -A "${STAGE}/textfile" 2>/dev/null)" ]]; then - echo "textfile dir empty." > "${STAGE}/textfile/README.txt" - fi -else - echo "textfile dir missing." > "${STAGE}/textfile/README.txt" -fi - -# Manifest: file list + sizes + timestamp + exclusion rules. -{ - echo "blueforce support bundle manifest" - echo "host: ${HOST}" - echo "collected_at: $(date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || echo unknown)" - echo "generator: bf-support-bundle" - echo "excluded_patterns: ${EXCLUDE_PATTERNS[*]}" - echo "note: secrets, private keys and passwords are never included; key-like values redacted." - echo "" - echo "files:" - ( cd "${STAGE}" && find . -type f -printf '%p %s bytes\n' 2>/dev/null | sort ) || ( cd "${STAGE}" && find . -type f -exec wc -c {} + | sort ) -} > "${STAGE}/manifest.txt" - -mkdir -p "${OUT_DIR}" -TARBALL="${OUT_DIR}/${BUNDLE_NAME}.tar.gz" -tar --sort=name --mtime='UTC 2020-01-01' \ - --exclude='*.key' --exclude='*secret*' --exclude='*password*' \ - --exclude='*passwd*' --exclude='*private*' \ - --exclude='*id_rsa*' --exclude='*id_ed25519*' --exclude='*.pem' \ - -czf "${TARBALL}" -C "${WORK}" "${BUNDLE_NAME}" - -log "wrote ${TARBALL}" -echo "${TARBALL}" - - - -#!/usr/bin/env bash -# Pre-flight checks: root, Ubuntu 26.04, RAM/disk, internet. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="01-precheck" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [01-precheck] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -MIN_RAM_MB=2048 -MIN_DISK_MB=20480 - -fail() { log "FAIL: $1"; echo "FAIL: $1" >&2; exit 1; } - -run_checks() { - [[ "$(id -u)" -eq 0 ]] || fail "must run as root" - if [[ -f /etc/os-release ]]; then - # shellcheck disable=SC1091 - . /etc/os-release - [[ "${VERSION_ID:-}" == 26.04* ]] || fail "unsupported OS: ${NAME:-unknown} ${VERSION_ID:-unknown} (need Ubuntu 26.04)" - else - fail "/etc/os-release not found" - fi - local ram_mb disk_mb - ram_mb=$(awk '/MemTotal/ {printf "%d", $2/1024}' /proc/meminfo) - [[ "$ram_mb" -ge "$MIN_RAM_MB" ]] || fail "RAM too low: ${ram_mb}MB (need >= ${MIN_RAM_MB}MB)" - disk_mb=$(df -m / --output=avail | tail -1 | tr -d ' ') - [[ "$disk_mb" -ge "$MIN_DISK_MB" ]] || fail "disk too low: ${disk_mb}MB free on / (need >= ${MIN_DISK_MB}MB)" - if ! getent hosts archive.ubuntu.com >/dev/null 2>&1 && ! ping -c1 -W5 1.1.1.1 >/dev/null 2>&1; then - fail "no internet connectivity (DNS and ping both failed)" - fi - log "OK: precheck passed (Ubuntu ${VERSION_ID}, RAM ${ram_mb}MB, disk ${disk_mb}MB free)" -} - -run_checks - - - -#!/usr/bin/env bash -# Base APT sources, disable unattended-upgrades, set timezone. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="02-system" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [02-system] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -TIMEZONE="${TIMEZONE:-Europe/Istanbul}" -BASE_PKGS="curl wget ca-certificates gnupg lsb-release" - -check_state() { - local ok=1 - for p in $BASE_PKGS; do dpkg -s "$p" >/dev/null 2>&1 || { echo "missing package: $p"; ok=0; }; done - grep -q '^APT::Periodic::Update-Package-Lists "0"' /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null || { echo "20auto-upgrades not locked"; ok=0; } - for t in apt-daily.service apt-daily.timer apt-daily-upgrade.timer; do - systemctl is-enabled "$t" 2>/dev/null | grep -q "masked" || { echo "timer not masked: $t"; ok=0; } - done - [[ "$(cat /etc/timezone 2>/dev/null || timedatectl show -p Timezone --value 2>/dev/null)" == "$TIMEZONE" ]] || { echo "timezone not $TIMEZONE"; ok=0; } - return $((1 - ok)) -} - -if [[ "$CHECK_MODE" -eq 1 ]]; then - if check_state; then log "OK(check): system baseline matches"; else log "FAIL(check): system baseline drift"; exit 1; fi - exit 0 -fi - -export DEBIAN_FRONTEND=noninteractive -apt-get update -# shellcheck disable=SC2086 -apt-get install -y $BASE_PKGS - -# Lock automatic updates OFF (fleet policy: no unapproved updates). -printf 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";\n' > /tmp/20auto-upgrades.bf -mv /tmp/20auto-upgrades.bf /etc/apt/apt.conf.d/20auto-upgrades -for t in apt-daily.service apt-daily.timer apt-daily-upgrade.timer apt-daily-upgrade.service; do - systemctl mask "$t" >/dev/null 2>&1 || true -done - -if command -v timedatectl >/dev/null 2>&1; then - timedatectl set-timezone "$TIMEZONE" || echo "$TIMEZONE" > /etc/timezone -else - echo "$TIMEZONE" > /etc/timezone -fi -log "OK: base packages installed, unattended-upgrades disabled, timezone $TIMEZONE" - - - -#!/usr/bin/env bash -# Blueforce maintenance user, restricted sudoers, mandatory administrator key. -set -euo pipefail -MODULE="03-user" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -SUDOERS_FILE="/etc/sudoers.d/blueforce" -AUTHORIZED_KEYS="/home/blueforce/.ssh/authorized_keys" -BF_ADMIN_PUBLIC_KEY="${BF_ADMIN_PUBLIC_KEY:-}" -BF_ADMIN_PUBLIC_KEY_FILE="${BF_ADMIN_PUBLIC_KEY_FILE:-}" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [03-user] $1" | tee -a "$LOG_FILE"; } -valid_key_file() { [[ -s "$AUTHORIZED_KEYS" ]] && ssh-keygen -l -f "$AUTHORIZED_KEYS" >/dev/null 2>&1; } -load_admin_key() { - if [[ -n "$BF_ADMIN_PUBLIC_KEY" && -n "$BF_ADMIN_PUBLIC_KEY_FILE" ]]; then - log "FAIL: set only one of BF_ADMIN_PUBLIC_KEY or BF_ADMIN_PUBLIC_KEY_FILE"; return 1 - elif [[ -n "$BF_ADMIN_PUBLIC_KEY" ]]; then - printf '%s\n' "$BF_ADMIN_PUBLIC_KEY" - elif [[ -n "$BF_ADMIN_PUBLIC_KEY_FILE" && -r "$BF_ADMIN_PUBLIC_KEY_FILE" ]]; then - cat "$BF_ADMIN_PUBLIC_KEY_FILE" - else - log "FAIL: BF_ADMIN_PUBLIC_KEY or BF_ADMIN_PUBLIC_KEY_FILE is required before SSH hardening"; return 1 - fi -} -if [[ "$CHECK_MODE" -eq 1 ]]; then - id blueforce >/dev/null 2>&1 || { log "FAIL(check): user blueforce missing"; exit 1; } - [[ -f "$SUDOERS_FILE" ]] && visudo -cf "$SUDOERS_FILE" >/dev/null 2>&1 || { log "FAIL(check): sudoers invalid"; exit 1; } - valid_key_file || { log "FAIL(check): authorized_keys is empty or invalid"; exit 1; } - log "OK(check): user, sudoers, and a valid administrator key are present"; exit 0 -fi -key_data="$(load_admin_key)" || exit 1 -[[ -n "${key_data//[[:space:]]/}" ]] || { log "FAIL: administrator key is empty"; exit 1; } -tmp_key="$(mktemp)"; trap 'rm -f "$tmp_key"' EXIT -printf '%s\n' "$key_data" > "$tmp_key" -ssh-keygen -l -f "$tmp_key" >/dev/null 2>&1 || { log "FAIL: supplied administrator public key is invalid"; exit 1; } -if ! id blueforce >/dev/null 2>&1; then useradd -m -s /bin/bash blueforce; fi -passwd -l blueforce >/dev/null 2>&1 || true -install -d -m 700 -o blueforce -g blueforce /home/blueforce/.ssh -install -m 600 -o blueforce -g blueforce "$tmp_key" "$AUTHORIZED_KEYS" -valid_key_file || { log "FAIL: atomic authorized_keys install did not validate"; exit 1; } -cat > /tmp/blueforce.sudoers <<'EOF' -# Managed by blueforce-installer (03-user). Local edits will be overwritten. -blueforce ALL=(root) NOPASSWD: /usr/local/bin/bf-status, /usr/local/bin/bf-gui-on, /usr/local/bin/bf-gui-off, /bin/systemctl status *, /bin/systemctl is-active *, /bin/systemctl is-enabled *, /usr/bin/docker ps, /usr/bin/docker logs * -EOF -visudo -cf /tmp/blueforce.sudoers -install -m 440 /tmp/blueforce.sudoers "$SUDOERS_FILE" -log "OK: user blueforce has a validated administrator key and restricted sudoers" - - - -#!/usr/bin/env bash -# Set hostname bf- from validated dealer number. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="04-hostname" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [04-hostname] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -[[ -n "$DEALER_ID" ]] || { log "FAIL: DEALER_ID env is empty"; echo "FAIL: DEALER_ID env is empty" >&2; exit 1; } -[[ "$DEALER_ID" =~ ^[0-9]{8}$ ]] || { log "FAIL: bad DEALER_ID format: $DEALER_ID"; echo "FAIL: bad DEALER_ID" >&2; exit 1; } -TARGET="bf-${DEALER_ID}" - -if [[ "$CHECK_MODE" -eq 1 ]]; then - [[ "$(hostname)" == "$TARGET" ]] || { log "FAIL(check): hostname is $(hostname), want $TARGET"; exit 1; } - log "OK(check): hostname is $TARGET" - exit 0 -fi - -if [[ "$(hostname)" == "$TARGET" ]]; then - log "hostname already $TARGET, keeping" -else - hostnamectl set-hostname "$TARGET" - if grep -q "127.0.1.1" /etc/hosts; then - sed -i "s/^127.0.1.1.*/127.0.1.1\t$TARGET/" /etc/hosts - else - echo -e "127.0.1.1\t$TARGET" >> /etc/hosts - fi - log "hostname set to $TARGET" -fi -mkdir -p "$STATE_DIR" -echo "$DEALER_ID" > "$STATE_DIR/dealer-id" -echo "bf-${DEALER_ID}" > "$STATE_DIR/hostname" -echo "BF-${DEALER_ID}" > "$STATE_DIR/device-id" -log "OK: identity files written (BF-${DEALER_ID} / bf-${DEALER_ID})" - - - -#!/usr/bin/env bash -# Wait for NetworkManager, verify DNS and connectivity. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="05-network" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [05-network] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -WAIT_SECS="${NM_WAIT_SECS:-90}" - -if [[ "$CHECK_MODE" -eq 1 ]]; then - getent hosts archive.ubuntu.com >/dev/null 2>&1 || { log "FAIL(check): DNS resolution broken"; exit 1; } - log "OK(check): DNS resolves" - exit 0 -fi - -elapsed=0 -while [[ "$elapsed" -lt "$WAIT_SECS" ]]; do - if systemctl is-active --quiet NetworkManager 2>/dev/null || systemctl is-active --quiet systemd-networkd 2>/dev/null; then - break - fi - sleep 5; elapsed=$((elapsed + 5)) -done -systemctl is-active --quiet NetworkManager 2>/dev/null || systemctl is-active --quiet systemd-networkd 2>/dev/null || { log "FAIL: no network manager active after ${WAIT_SECS}s"; exit 1; } - -getent hosts archive.ubuntu.com >/dev/null 2>&1 || { log "FAIL: DNS resolution failed"; exit 1; } -[[ -f /etc/resolv.conf ]] || { log "FAIL: /etc/resolv.conf missing"; exit 1; } -log "OK: network manager active, DNS resolves" - - - -#!/usr/bin/env bash -# WireGuard per-device configuration; refuse placeholders or shared defaults. -# Idempotent: safe to re-run. Supports --check for read-only verification. -set -euo pipefail - -MODULE="06-wireguard" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -WG_DIR="/etc/wireguard" -WG_CONF="$WG_DIR/wg0.conf" -WG_ADDRESS="${WG_ADDRESS:-}" -WG_ENDPOINT="${WG_ENDPOINT:-}" -WG_PEER_PUBKEY="${WG_PEER_PUBKEY:-}" -REQUIRE_WIREGUARD="${REQUIRE_WIREGUARD:-true}" -BF_WG_HANDSHAKE_MAX_AGE="${BF_WG_HANDSHAKE_MAX_AGE:-180}" - -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [06-wireguard] $1" | tee -a "$LOG_FILE"; } -valid_address() { - local address="$1" ip prefix octet - [[ "$address" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[12][0-9]|3[0-2])$ ]] && [[ "$address" != "10.88.0.0/24" ]] || return 1 - ip="${address%/*}"; prefix="${address#*/}" - IFS=. read -r -a octets <<< "$ip" - for octet in "${octets[@]}"; do ((10#$octet <= 255)) || return 1; done - ((10#$prefix <= 32)) -} -valid_endpoint() { - local host port - [[ "$1" =~ ^[A-Za-z0-9][A-Za-z0-9.-]*:[1-9][0-9]{0,4}$ ]] && [[ "$1" != "vpn.example.com:51820" ]] || return 1 - host="${1%:*}"; port="${1##*:}" - [[ -n "$host" ]] && ((10#$port <= 65535)) -} -valid_pubkey() { [[ "$1" =~ ^[A-Za-z0-9+/]{43}=$ ]] && [[ "$1" != "REPLACE_WITH_SERVER_PUBLIC_KEY" ]]; } -valid_handshake_age() { [[ "$BF_WG_HANDSHAKE_MAX_AGE" =~ ^[0-9]+$ ]] && ((10#$BF_WG_HANDSHAKE_MAX_AGE > 0)); } -config_is_complete() { - [[ -f "$WG_CONF" ]] && - ! grep -qE '10\.88\.0\.0/24|vpn\.example\.com:51820|REPLACE_WITH_SERVER_PUBLIC_KEY' "$WG_CONF" && - grep -qE '^Address = ([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[12][0-9]|3[0-2])$' "$WG_CONF" && - grep -qE '^Endpoint = [A-Za-z0-9][A-Za-z0-9.-]*:[1-9][0-9]{0,4}$' "$WG_CONF" && - grep -qE '^PublicKey = [A-Za-z0-9+/]{43}=$' "$WG_CONF" -} -handshake_is_fresh() { - local now - valid_handshake_age || return 1 - now="$(date +%s)" - wg show wg0 latest-handshakes 2>/dev/null | awk -v now="$now" -v max_age="$BF_WG_HANDSHAKE_MAX_AGE" '$2 > 0 && now >= $2 && now - $2 <= max_age { found=1 } END { exit(found ? 0 : 1) }' -} - -if [[ "$CHECK_MODE" -eq 1 ]]; then - [[ "$REQUIRE_WIREGUARD" == "true" || "$REQUIRE_WIREGUARD" == "false" ]] || { log "FAIL(check): REQUIRE_WIREGUARD must be true or false"; exit 1; } - [[ -f "$WG_DIR/privatekey" && -f "$WG_DIR/publickey" ]] || { log "FAIL(check): wireguard keys missing"; exit 1; } - config_is_complete || { log "FAIL(check): wg0.conf is missing or contains incomplete/placeholder peer data"; exit 1; } - systemctl is-enabled --quiet wg-quick@wg0 || { log "FAIL(check): wg-quick@wg0 not enabled"; exit 1; } - systemctl is-active --quiet wg-quick@wg0 || { log "FAIL(check): wg-quick@wg0 not active"; exit 1; } - wg show interfaces | tr ' ' '\n' | grep -qx wg0 || { log "FAIL(check): wg0 interface missing"; exit 1; } - if [[ "$REQUIRE_WIREGUARD" == "true" ]]; then - handshake_is_fresh || { log "FAIL(check): no WireGuard peer handshake within ${BF_WG_HANDSHAKE_MAX_AGE}s"; exit 1; } - fi - log "OK(check): wireguard config is complete, wg0 is active, and required handshake is fresh" - exit 0 -fi - -valid_address "$WG_ADDRESS" || { log "FAIL: WG_ADDRESS must be a unique device CIDR, not a default or placeholder"; exit 1; } -valid_endpoint "$WG_ENDPOINT" || { log "FAIL: WG_ENDPOINT must be a non-placeholder host:port"; exit 1; } -valid_pubkey "$WG_PEER_PUBKEY" || { log "FAIL: WG_PEER_PUBKEY must be a valid non-placeholder WireGuard public key"; exit 1; } -[[ "$REQUIRE_WIREGUARD" == "true" || "$REQUIRE_WIREGUARD" == "false" ]] || { log "FAIL: REQUIRE_WIREGUARD must be true or false"; exit 1; } -valid_handshake_age || { log "FAIL: BF_WG_HANDSHAKE_MAX_AGE must be a positive number of seconds"; exit 1; } -command -v wg >/dev/null 2>&1 || { export DEBIAN_FRONTEND=noninteractive; apt-get update && apt-get install -y wireguard; } -install -d -m 700 "$WG_DIR" -if [[ ! -f "$WG_DIR/privatekey" ]]; then - umask 077 - wg genkey | tee "$WG_DIR/privatekey" | wg pubkey > "$WG_DIR/publickey" - chmod 600 "$WG_DIR/privatekey" "$WG_DIR/publickey" - log "wireguard keypair generated" -fi -PRIVKEY="$(<"$WG_DIR/privatekey")" -PEER_NAME="${BF_HOSTNAME:-bf-${DEALER_ID:-unknown}}" -tmp_conf="$(mktemp "$WG_DIR/wg0.conf.XXXXXX")" -cat > "$tmp_conf" < - - -#!/usr/bin/env bash -# Harden sshd only after a validated Blueforce administrator key is installed. -set -euo pipefail -MODULE="07-ssh" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -DROPIN="/etc/ssh/sshd_config.d/99-blueforce.conf" -AUTHORIZED_KEYS="/home/blueforce/.ssh/authorized_keys" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [07-ssh] $1" | tee -a "$LOG_FILE"; } -key_ready() { [[ -s "$AUTHORIZED_KEYS" ]] && ssh-keygen -l -f "$AUTHORIZED_KEYS" >/dev/null 2>&1; } -read -r -d '' WANT <<'EOF' || true -# Managed by blueforce-installer (07-ssh). Local edits will be overwritten. -PermitRootLogin no -PasswordAuthentication no -PubkeyAuthentication yes -ChallengeResponseAuthentication no -UsePAM yes -X11Forwarding no -ClientAliveInterval 300 -ClientAliveCountMax 2 -MaxAuthTries 3 -AllowUsers blueforce -EOF -if [[ "$CHECK_MODE" -eq 1 ]]; then - [[ -f "$DROPIN" ]] || { log "FAIL(check): sshd drop-in missing"; exit 1; } - key_ready || { log "FAIL(check): no valid non-empty blueforce authorized_keys"; exit 1; } - grep -qx 'AllowUsers blueforce' "$DROPIN" || { log "FAIL(check): AllowUsers policy is incorrect"; exit 1; } - sshd -t 2>/dev/null || { log "FAIL(check): sshd config test failed"; exit 1; } - log "OK(check): hardened SSH permits only blueforce with a valid key"; exit 0 -fi -export DEBIAN_FRONTEND=noninteractive -command -v sshd >/dev/null 2>&1 || apt-get install -y openssh-server -key_ready || { log "FAIL: valid non-empty /home/blueforce/.ssh/authorized_keys is required before SSH hardening"; exit 1; } -printf '%s\n' "$WANT" > /tmp/99-blueforce.conf.bf -install -m 644 /tmp/99-blueforce.conf.bf "$DROPIN" -sshd -t || { log "FAIL: sshd -t rejected the new config"; exit 1; } -if systemctl list-unit-files | grep -q '^sshd\.service'; then SVC=sshd; else SVC=ssh; fi -systemctl enable "$SVC" >/dev/null 2>&1 || true -systemctl reload-or-restart "$SVC" -log "OK: hardened SSH installed after valid key verification; AllowUsers=blueforce" - - - -#!/usr/bin/env bash -# xRDP + GNOME session, terminal boot default, multi-user. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="08-rdp" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [08-rdp] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -if [[ "$CHECK_MODE" -eq 1 ]]; then - dpkg -s xrdp >/dev/null 2>&1 || { log "FAIL(check): xrdp not installed"; exit 1; } - systemctl is-enabled --quiet xrdp 2>/dev/null || { log "FAIL(check): xrdp not enabled"; exit 1; } - [[ "$(systemctl get-default)" == "multi-user.target" ]] || { log "FAIL(check): default target is not multi-user"; exit 1; } - log "OK(check): xrdp installed+enabled, terminal boot default" - exit 0 -fi - -export DEBIAN_FRONTEND=noninteractive -dpkg -s xrdp >/dev/null 2>&1 || apt-get install -y xrdp -dpkg -s gnome-session >/dev/null 2>&1 || apt-get install -y gnome-session - -# Default GNOME session for RDP logins (per-user override still wins). -if [[ ! -f /etc/skel/.xsession ]]; then - echo "gnome-session" > /etc/skel/.xsession -fi -if id blueforce >/dev/null 2>&1 && [[ ! -f /home/blueforce/.xsession ]]; then - echo "gnome-session" > /home/blueforce/.xsession - chown blueforce:blueforce /home/blueforce/.xsession -fi - -systemctl enable xrdp xrdp-sesman >/dev/null 2>&1 || systemctl enable xrdp -systemctl set-default multi-user.target -log "OK: xrdp ready, gnome-session default, boot target multi-user" - - - -#!/usr/bin/env bash -# RustDesk is a required remote channel: only a pinned supplied package is accepted. -set -euo pipefail -MODULE="09-rustdesk" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -RUSTDESK_SERVER="${RUSTDESK_SERVER:-}" -RUSTDESK_DEB="${RUSTDESK_DEB:-}" -SYSTEM_CONFIG="/etc/rustdesk/RustDesk2.toml" -USER_CONFIG="/home/blueforce/.config/RustDesk/RustDesk2.toml" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [09-rustdesk] $1" | tee -a "$LOG_FILE"; } -valid_server() { - local endpoint="$1" host port - [[ -n "$endpoint" ]] || return 1 - [[ "$endpoint" != *example* && "$endpoint" != *invalid* && "$endpoint" != *REPLACE* && "$endpoint" != *replace* && "$endpoint" != *'<'* && "$endpoint" != *'>'* && "$endpoint" != localhost* ]] || return 1 - [[ "$endpoint" =~ ^[A-Za-z0-9][A-Za-z0-9.-]*(:[1-9][0-9]{0,4})?$ ]] || return 1 - host="${endpoint%%:*}" - [[ -n "$host" ]] || return 1 - if [[ "$endpoint" == *:* ]]; then - port="${endpoint##*:}" - ((10#$port <= 65535)) || return 1 - fi -} -config_endpoint() { - sed -n "s/^rendezvous-server = '\([^']*\)'$/\1/p" "$SYSTEM_CONFIG" 2>/dev/null | head -n 1 -} -configured() { - local endpoint - endpoint="$(config_endpoint)" - valid_server "$endpoint" || return 1 - grep -Fqx "rendezvous-server = '${endpoint}'" "$SYSTEM_CONFIG" >/dev/null 2>&1 && - grep -Fqx "relay-server = '${endpoint}'" "$SYSTEM_CONFIG" >/dev/null 2>&1 && - grep -Fqx "rendezvous-server = '${endpoint}'" "$USER_CONFIG" >/dev/null 2>&1 && - grep -Fqx "relay-server = '${endpoint}'" "$USER_CONFIG" >/dev/null 2>&1 -} -if [[ "$CHECK_MODE" -eq 1 ]]; then - dpkg -s rustdesk >/dev/null 2>&1 || { log "FAIL(check): rustdesk remote channel is not installed"; exit 1; } - configured || { log "FAIL(check): RustDesk client config is missing, inconsistent, or uses a placeholder/non-self-hosted endpoint"; exit 1; } - rustdesk --get-id 2>/dev/null | grep -qE '^[0-9]+$' || { log "FAIL(check): RustDesk client cannot provide a device ID"; exit 1; } - log "OK(check): RustDesk remote channel is installed with a self-hosted client configuration" - exit 0 -fi -[[ -n "$RUSTDESK_DEB" && -f "$RUSTDESK_DEB" ]] || { log "FAIL: RUSTDESK_DEB must name a supplied pinned RustDesk .deb; apt sources are not used"; exit 1; } -valid_server "$RUSTDESK_SERVER" || { log "FAIL: RUSTDESK_SERVER must be a non-placeholder self-hosted host or host:port"; exit 1; } -export DEBIAN_FRONTEND=noninteractive -dpkg -s rustdesk >/dev/null 2>&1 || { dpkg -i "$RUSTDESK_DEB" || apt-get install -f -y; } -for cfgdir in /etc/rustdesk /home/blueforce/.config/RustDesk; do - install -d -m 700 "$cfgdir" - cat > "$cfgdir/RustDesk2.toml" </dev/null || true -configured || { log "FAIL: RustDesk client configuration did not persist"; exit 1; } -install -d -m 700 "$STATE_DIR" -rustdesk --get-id 2>/dev/null | head -1 > "$STATE_DIR/rustdesk-id" || true -[[ -s "$STATE_DIR/rustdesk-id" ]] || { log "FAIL: RustDesk client did not provide a device ID"; exit 1; } -log "OK: RustDesk pinned package installed and self-hosted channel configured" - - - -#!/usr/bin/env bash -# Docker CE + daemon.json with log rotation, service enabled. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="10-docker" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [10-docker] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -DAEMON_JSON="/etc/docker/daemon.json" -WANT_JSON='{ - "log-driver": "json-file", - "log-opts": {"max-size": "10m", "max-file": "3"}, - "live-restore": true -}' - -if [[ "$CHECK_MODE" -eq 1 ]]; then - command -v docker >/dev/null 2>&1 || { log "FAIL(check): docker missing"; exit 1; } - systemctl is-enabled --quiet docker 2>/dev/null || { log "FAIL(check): docker not enabled"; exit 1; } - [[ -f "$DAEMON_JSON" ]] || { log "FAIL(check): daemon.json missing"; exit 1; } - log "OK(check): docker installed, enabled, daemon.json present" - exit 0 -fi - -if ! command -v docker >/dev/null 2>&1; then - export DEBIAN_FRONTEND=noninteractive - apt-get install -y ca-certificates curl gnupg - if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then - install -d -m 0755 /etc/apt/keyrings - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg - chmod a+r /etc/apt/keyrings/docker.gpg - # shellcheck disable=SC1091 - . /etc/os-release - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list - apt-get update - fi - apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || apt-get install -y docker.io -fi - -printf '%s\n' "$WANT_JSON" > /tmp/daemon.json.bf -mkdir -p /etc/docker -mv /tmp/daemon.json.bf "$DAEMON_JSON" -systemctl enable --now docker -systemctl is-active --quiet docker || { log "FAIL: docker installed but service not running"; exit 1; } -log "OK: docker ready with log rotation (10m x3) and live-restore" - - - -#!/usr/bin/env bash -# MEG placeholder: install vendor .deb if present, else SKIP + acceptance checklist. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="11-meg" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [11-meg] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -MEG_DEB="${MEG_DEB:-$(ls /opt/blueforce/debs/meg*.deb /opt/blueforce/meg*.deb 2>/dev/null | head -1)}" -MEG_CONTAINER="${MEG_CONTAINER:-meg}" - -acceptance_checklist() { - local fails=0 - # Gate 2: pinned version, never latest. - local img - img=$(docker inspect --format '{{.Config.Image}}' "$MEG_CONTAINER" 2>/dev/null || echo "") - if [[ -z "$img" ]]; then echo "CHECK container-running: SKIP (no container $MEG_CONTAINER yet)"; else echo "CHECK container-running: PASS ($img)"; fi - if [[ "$img" == *":latest" ]]; then echo "CHECK pinned-tag: FAIL (latest forbidden)"; fails=$((fails+1)); else echo "CHECK pinned-tag: PASS"; fi - # Gate 4: restart policy unless-stopped. - if [[ -n "$img" ]]; then - local pol - pol=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$MEG_CONTAINER" 2>/dev/null) - [[ "$pol" == "unless-stopped" ]] && echo "CHECK restart-policy: PASS" || { echo "CHECK restart-policy: FAIL ($pol)"; fails=$((fails+1)); } - fi - # Gate 5: no 0.0.0.0 port bind to the outside. - if ss -tlnp 2>/dev/null | grep -q "0.0.0.0"; then echo "CHECK port-bind: WARN (external bind present — review)"; else echo "CHECK port-bind: PASS"; fi - return "$fails" -} - -if [[ "$CHECK_MODE" -eq 1 ]]; then - if [[ -z "${MEG_DEB:-}" || ! -f "$MEG_DEB" ]] && ! dpkg -s meg >/dev/null 2>&1 && ! docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "$MEG_CONTAINER"; then - log "OK(check): MEG not supplied yet (SKIP state)" - exit 0 - fi - acceptance_checklist || { log "FAIL(check): MEG acceptance checklist failed"; exit 1; } - log "OK(check): MEG acceptance checklist passed" - exit 0 -fi - -if [[ "${MEG_SKIP:-0}" == "1" ]]; then log "SKIP: MEG_SKIP=1"; exit 3; fi - -if ! dpkg -s meg >/dev/null 2>&1 && ! docker ps -a --format '{{.Names}}' 2>/dev/null | grep -qx "$MEG_CONTAINER"; then - if [[ -n "${MEG_DEB:-}" && -f "$MEG_DEB" ]]; then - export DEBIAN_FRONTEND=noninteractive - dpkg -i "$MEG_DEB" || apt-get install -f -y - log "MEG package installed from $MEG_DEB" - else - log "SKIP: no MEG .deb supplied — vendor package pending, continuing" - exit 3 - fi -else - log "MEG already present, keeping" -fi - -if ! acceptance_checklist; then - log "FAIL: MEG acceptance checklist failed — see output above" - exit 1 -fi -log "OK: MEG present and acceptance checklist passed" - - - -#!/usr/bin/env bash -# Node exporter + textfile collector directory. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="12-monitoring" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [12-monitoring] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -TEXTFILE_DIR="/var/lib/node_exporter/textfile" - -if [[ "$CHECK_MODE" -eq 1 ]]; then - systemctl is-enabled --quiet prometheus-node-exporter 2>/dev/null || systemctl is-enabled --quiet node_exporter 2>/dev/null || { log "FAIL(check): node exporter not enabled"; exit 1; } - [[ -d "$TEXTFILE_DIR" ]] || { log "FAIL(check): textfile dir missing"; exit 1; } - log "OK(check): node exporter enabled, textfile dir present" - exit 0 -fi - -export DEBIAN_FRONTEND=noninteractive -dpkg -s prometheus-node-exporter >/dev/null 2>&1 || apt-get install -y prometheus-node-exporter - -install -d -m 755 "$TEXTFILE_DIR" -# Ensure the textfile collector flag is set (package default may omit it). -OVERRIDE="/etc/systemd/system/prometheus-node-exporter.service.d/blueforce.conf" -mkdir -p "$(dirname "$OVERRIDE")" -printf '[Service]\nExecStart=\nExecStart=/usr/bin/prometheus-node-exporter --collector.textfile.directory=%s\n' "$TEXTFILE_DIR" > /tmp/override.bf -mv /tmp/override.bf "$OVERRIDE" -systemctl daemon-reload -systemctl enable --now prometheus-node-exporter 2>/dev/null || systemctl enable --now node_exporter -log "OK: node exporter enabled with textfile dir $TEXTFILE_DIR" - - - -#!/usr/bin/env bash -# Apply UFW deny-in baseline and persist Docker published-port policy. -set -euo pipefail -MODULE="13-firewall" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -SSH_PORT="${SSH_PORT:-22}" -RDP_PORT="${RDP_PORT:-3389}" -DOCKER_ALLOWLIST="/etc/blueforce/docker-published-port-allowlist.conf" -DOCKER_POLICY_BIN="/usr/local/sbin/blueforce-docker-firewall" -DOCKER_POLICY_UNIT="blueforce-docker-firewall.service" -DOCKER_POLICY_DROPIN="/etc/systemd/system/docker.service.d/blueforce-docker-firewall.conf" -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [13-firewall] $1" | tee -a "$LOG_FILE"; } - -if [[ "$CHECK_MODE" -eq 1 ]]; then - ufw status 2>/dev/null | grep -q 'Status: active' || { log "FAIL(check): ufw not active"; exit 1; } - ufw status 2>/dev/null | grep -Eq "${SSH_PORT}/tcp.*on wg0|${SSH_PORT}/tcp.*wg0" || { log "FAIL(check): SSH is not restricted to wg0"; exit 1; } - ufw status 2>/dev/null | grep -Eq "${RDP_PORT}/tcp.*on wg0|${RDP_PORT}/tcp.*wg0" || { log "FAIL(check): RDP is not restricted to wg0"; exit 1; } - [[ -f "$DOCKER_ALLOWLIST" && -x "$DOCKER_POLICY_BIN" && -f "$DOCKER_POLICY_DROPIN" ]] || { log "FAIL(check): persistent Docker firewall assets missing"; exit 1; } - systemctl is-enabled --quiet "$DOCKER_POLICY_UNIT" || { log "FAIL(check): persistent Docker firewall unit is not enabled"; exit 1; } - "$DOCKER_POLICY_BIN" --check || { log "FAIL(check): Docker published-port policy is not enforced"; exit 1; } - log "OK(check): SSH/RDP restricted to wg0 and Docker policy persists through systemd" - exit 0 -fi - -export DEBIAN_FRONTEND=noninteractive -command -v ufw >/dev/null 2>&1 || apt-get install -y ufw -command -v iptables >/dev/null 2>&1 || apt-get install -y iptables -ufw default deny incoming -ufw default allow outgoing -ufw delete allow "$SSH_PORT/tcp" 2>/dev/null || true -ufw delete allow "$RDP_PORT/tcp" 2>/dev/null || true -ufw allow in on wg0 to any port "$SSH_PORT" proto tcp comment 'SSH over WireGuard only' -ufw allow in on wg0 to any port "$RDP_PORT" proto tcp comment 'RDP over WireGuard only' -install -d -m 755 /etc/blueforce /etc/iptables -if [[ ! -f "$DOCKER_ALLOWLIST" ]]; then - cat > "$DOCKER_ALLOWLIST" <<'EOF' -# Explicit Docker published-port exceptions. One reviewed entry per line: -# tcp 8443 -# udp 51820 -# This allowlist intentionally permits no externally published Docker ports by default. -EOF -fi -chown root:root "$DOCKER_ALLOWLIST" -chmod 640 "$DOCKER_ALLOWLIST" -install -o root -g root -m 700 "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" "$DOCKER_POLICY_BIN" -install -o root -g root -m 644 "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" "/etc/systemd/system/$DOCKER_POLICY_UNIT" -install -d -m 755 "$(dirname "$DOCKER_POLICY_DROPIN")" -install -o root -g root -m 644 "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" "$DOCKER_POLICY_DROPIN" -systemctl daemon-reload -systemctl enable "$DOCKER_POLICY_UNIT" -# Docker creates DOCKER-USER during startup; applying now proves the parsed policy. -systemctl start docker -"$DOCKER_POLICY_BIN" -ufw --force enable -log "OK: UFW allows SSH/RDP only on wg0; persisted Docker policy denies all unapproved published ports" - - - -#!/usr/bin/env bash -# APT holds + disable automatic update timers. -set -euo pipefail -MODULE="14-update-policy" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -APT_HOLDS="${APT_HOLDS:-}" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [14-update-policy] $1" | tee -a "$LOG_FILE"; } -if [[ "$CHECK_MODE" -eq 1 ]]; then - for t in apt-daily.timer apt-daily-upgrade.timer; do systemctl is-enabled "$t" 2>/dev/null | grep -q masked || { log "FAIL(check): $t not masked"; exit 1; }; done - log "OK(check): update timers masked"; exit 0 -fi -for t in apt-daily.service apt-daily.timer apt-daily-upgrade.service apt-daily-upgrade.timer; do systemctl mask "$t" >/dev/null 2>&1 || true; systemctl stop "$t" >/dev/null 2>&1 || true; done -printf 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";\nAPT::Periodic::Enable "0";\n' > /tmp/20auto-upgrades.bf -mv /tmp/20auto-upgrades.bf /etc/apt/apt.conf.d/20auto-upgrades -if [[ -n "$APT_HOLDS" ]]; then - read -r -a apt_holds <<< "$APT_HOLDS" - ((${#apt_holds[@]})) && apt-mark hold -- "${apt_holds[@]}" - log "holds applied: ${apt_holds[*]}" -fi -log "OK: automatic updates locked off (timers masked, periodic=0)" - - - -#!/usr/bin/env bash -# journald caps + app logrotate policy. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="15-logrotate" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [15-logrotate] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -JOURNAL_DROPIN="/etc/systemd/journald.conf.d/99-blueforce.conf" -APP_ROTATE="/etc/logrotate.d/blueforce" - -if [[ "$CHECK_MODE" -eq 1 ]]; then - [[ -f "$JOURNAL_DROPIN" && -f "$APP_ROTATE" ]] || { log "FAIL(check): logrotate configs missing"; exit 1; } - log "OK(check): journald caps + app logrotate present" - exit 0 -fi - -mkdir -p /etc/systemd/journald.conf.d -cat > /tmp/journald.bf <<'EOF' -# Managed by blueforce-installer (15-logrotate). -[Journal] -SystemMaxUse=500M -RuntimeMaxUse=100M -MaxRetentionSec=30day -ForwardToSyslog=no -EOF -mv /tmp/journald.bf "$JOURNAL_DROPIN" -systemctl restart systemd-journald 2>/dev/null || true - -cat > /tmp/blueforce-rotate.bf <<'EOF' -# Managed by blueforce-installer (15-logrotate). -/var/log/blueforce*.log /var/log/bf-*.log { - size 10M - rotate 5 - compress - delaycompress - missingok - notifempty - copytruncate -} -EOF -mv /tmp/blueforce-rotate.bf "$APP_ROTATE" -chmod 644 "$APP_ROTATE" -logrotate --debug "$APP_ROTATE" 2>&1 | head -3 || true -log "OK: journald capped (500M/30d), app logs rotate at 10M x5" - - - -#!/usr/bin/env bash -# GNOME minimal and maintained GUI maintenance tools; terminal boot remains default. -set -euo pipefail -MODULE="16-gui" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [16-gui] $1" | tee -a "$LOG_FILE"; } -if [[ "$CHECK_MODE" -eq 1 ]]; then - dpkg -s ubuntu-desktop-minimal >/dev/null 2>&1 || { log "FAIL(check): ubuntu-desktop-minimal missing"; exit 1; } - [[ -x /usr/local/bin/bf-gui-on && -x /usr/local/bin/bf-gui-off ]] || { log "FAIL(check): maintained bf-gui switches missing"; exit 1; } - [[ -f /etc/systemd/system/bf-gui-on.service && -f /etc/systemd/system/bf-gui-off.service ]] || { log "FAIL(check): manual GUI service units missing"; exit 1; } - [[ "$(systemctl get-default)" == multi-user.target ]] || { log "FAIL(check): terminal boot default was changed"; exit 1; } - log "OK(check): GNOME minimal, maintained switches, and terminal boot default present"; exit 0 -fi -export DEBIAN_FRONTEND=noninteractive -dpkg -s ubuntu-desktop-minimal >/dev/null 2>&1 || apt-get install -y ubuntu-desktop-minimal -for tool in bf-gui-on bf-gui-off; do install -m 755 "$SCRIPT_ROOT/maintenance/$tool" "/usr/local/bin/$tool"; done -for unit in bf-gui-on.service bf-gui-off.service; do install -m 644 "$SCRIPT_ROOT/../config/systemd/$unit" "/etc/systemd/system/$unit"; done -systemctl daemon-reload -systemctl set-default multi-user.target -systemctl disable gdm3 2>/dev/null || systemctl disable gdm 2>/dev/null || true -log "OK: maintained GUI tools and manual units installed; boot default is multi-user" - - - -#!/usr/bin/env bash -# Install bf-status and run it for the first time. -# Idempotent: safe to re-run. Supports --check for read-only verification. -# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). -set -euo pipefail - -MODULE="17-healthcheck" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" - -log() { - local msg="$1" - mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true - echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [17-healthcheck] $msg" | tee -a "$LOG_FILE" -} - -CHECK_MODE=0 -if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi -STATUS_BIN="/usr/local/bin/bf-status" - -write_bf_status() { - cat > /tmp/bf-status.bf <<'EOF' -#!/usr/bin/env bash -# bf-status: quick device health summary. Exit 0 = healthy, 1 = problem. -set -uo pipefail -fails=0 -say() { local st="$1"; shift; echo "[$st] $*"; [[ "$st" == "PASS" ]] || fails=$((fails+1)); } - -ID_FILE="/var/lib/blueforce/dealer-id" -if [[ -f "$ID_FILE" && "$(cat $ID_FILE)" =~ ^[0-9]{8}$ ]]; then - DID=$(cat "$ID_FILE") - [[ "$(hostname)" == "bf-$DID" ]] && say PASS "identity BF-$DID / $(hostname)" || say FAIL "hostname $(hostname) != bf-$DID" -else - say FAIL "dealer-id file missing or invalid" -fi -systemctl is-enabled --quiet wg-quick@wg0 2>/dev/null && say PASS "wireguard enabled" || say FAIL "wireguard not enabled" -systemctl is-active --quiet docker 2>/dev/null && say PASS "docker running" || say FAIL "docker not running" -ufw status 2>/dev/null | grep -q "Status: active" && say PASS "firewall active" || say FAIL "firewall inactive" -systemctl is-enabled apt-daily.timer 2>/dev/null | grep -q masked && say PASS "auto-update off" || say FAIL "auto-update timer live" -systemctl is-enabled --quiet prometheus-node-exporter 2>/dev/null || systemctl is-enabled --quiet node_exporter 2>/dev/null && say PASS "monitoring enabled" || say FAIL "monitoring not enabled" -echo "bf-status: $fails failing check(s)" -exit "$fails" -EOF - mv /tmp/bf-status.bf "$STATUS_BIN" - chmod 755 "$STATUS_BIN" -} - -if [[ "$CHECK_MODE" -eq 1 ]]; then - [[ -x "$STATUS_BIN" ]] || { log "FAIL(check): bf-status missing"; exit 1; } - log "OK(check): bf-status installed" - exit 0 -fi - -mkdir -p "$STATE_DIR" -if [[ -n "$DEALER_ID" ]]; then echo "$DEALER_ID" > "$STATE_DIR/dealer-id"; fi -write_bf_status -"$STATUS_BIN" | tee "$STATE_DIR/bf-status-first-run.log" >/dev/null || log "WARN: first bf-status run reports failures (see $STATE_DIR/bf-status-first-run.log)" -log "OK: bf-status installed, first run saved" - - - -#!/usr/bin/env bash -# Gate all installer modules; READY is written only when every required channel passes. -set -euo pipefail -MODULE="18-final-check" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -DEALER_ID="${DEALER_ID:-}" -BF_HOSTNAME="${BF_HOSTNAME:-}" -BF_DEVICE="${BF_DEVICE:-}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" -CHECK_MODE=0 -[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -GATES=(01-precheck 02-system 03-user 04-hostname 05-network 06-wireguard 07-ssh 08-rdp 09-rustdesk 10-docker 11-meg 12-monitoring 13-firewall 14-update-policy 15-logrotate 16-gui 17-healthcheck) -READY_FILE="$STATE_DIR/READY" -log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [18-final-check] $1" | tee -a "$LOG_FILE"; } -self_gate() { [[ -n "$DEALER_ID" && "$DEALER_ID" =~ ^[0-9]{8}$ ]] && [[ "$(hostname)" == "bf-${DEALER_ID}" ]]; } -run_gates() { - local fails=0 skipped=0 out rc g - for g in "${GATES[@]}"; do - set +e; out=$(DEALER_ID="$DEALER_ID" BF_HOSTNAME="$BF_HOSTNAME" BF_DEVICE="$BF_DEVICE" STATE_DIR="$STATE_DIR" REQUIRE_WIREGUARD="${REQUIRE_WIREGUARD:-true}" BF_WG_HANDSHAKE_MAX_AGE="${BF_WG_HANDSHAKE_MAX_AGE:-180}" LOG_FILE=/dev/null bash "$SCRIPT_DIR/$g.sh" --check 2>&1); rc=$?; set -e - case "$rc" in 0) echo "GATE $g: PASS";; 3) echo "GATE $g: SKIP (not READY)"; skipped=$((skipped+1)); fails=$((fails+1));; *) echo "GATE $g: FAIL"; echo "$out" | tail -3; fails=$((fails+1));; esac - done - if self_gate; then echo 'GATE 18-final-check: PASS'; else echo 'GATE 18-final-check: FAIL'; fails=$((fails+1)); fi - echo "---"; echo "gates: 18 total, $fails failed, $skipped skipped"; return "$fails" -} -if [[ "$CHECK_MODE" -eq 1 ]]; then run_gates; exit $?; fi -if run_gates; then - install -d -m 700 "$STATE_DIR" - printf 'READY dealer=BF-%s host=bf-%s date=%s\n' "$DEALER_ID" "$DEALER_ID" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$READY_FILE" - log "OK: ALL REQUIRED GATES PASSED — device READY (BF-${DEALER_ID})" -else - log "FAIL: final-check gates failed — device NOT READY"; exit 1 -fi - - - -#!/usr/bin/env bash -# Blueforce one-click installer — single entry point for field setup. -set -euo pipefail -INSTALLER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -MODULES_DIR="$INSTALLER_DIR/installer/modules" -LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" -STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" -STATE_FILE="$STATE_DIR/install-state" -MODULES=(01-precheck 02-system 03-user 04-hostname 05-network 06-wireguard 07-ssh 08-rdp 09-rustdesk 10-docker 11-meg 12-monitoring 13-firewall 14-update-policy 15-logrotate 16-gui 17-healthcheck 18-final-check) -DEALER_ID="" FROM="" ONLY="" CHECK_MODE=0 RESUME=0 ASSUME_YES=0 -usage() { cat <<'EOF' -Usage: sudo ./blueforce-install.sh --dealer-id <8 digits> [--from NN] [--only NAME] [--check] [--resume] [--yes] ---check is read-only: it creates no logs, state, or directories. -EOF -} -while [[ $# -gt 0 ]]; do case "$1" in --dealer-id) DEALER_ID="${2:-}"; shift 2;; --from) FROM="${2:-}"; shift 2;; --only) ONLY="${2:-}"; shift 2;; --check) CHECK_MODE=1; shift;; --resume) RESUME=1; shift;; --yes|-y) ASSUME_YES=1; shift;; --help|-h) usage; exit 0;; *) echo "Unknown argument: $1" >&2; usage >&2; exit 2;; esac; done -[[ -n "$DEALER_ID" ]] || { echo "Missing --dealer-id (8 digits)" >&2; exit 2; } -[[ "$DEALER_ID" =~ ^[0-9]{8}$ ]] || { echo "Invalid dealer id '$DEALER_ID': must match ^[0-9]{8}$" >&2; exit 2; } -log() { if [[ "$CHECK_MODE" -eq 1 ]]; then printf '[installer check] %s\n' "$1" >&2; else mkdir -p "$(dirname "$LOG_FILE")" "$STATE_DIR"; echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [installer] $1" | tee -a "$LOG_FILE"; fi; } -record_state() { mkdir -p "$STATE_DIR"; local tmp="$STATE_FILE.tmp"; grep -v "^$1=" "$STATE_FILE" 2>/dev/null > "$tmp" || true; echo "$1=$2" >> "$tmp"; mv "$tmp" "$STATE_FILE"; } -state_of() { grep "^$1=" "$STATE_FILE" 2>/dev/null | cut -d= -f2 || true; } -export DEALER_ID BF_HOSTNAME="bf-${DEALER_ID}" BF_DEVICE="BF-${DEALER_ID}" STATE_DIR -if [[ "$CHECK_MODE" -eq 0 && "$ASSUME_YES" -eq 0 ]]; then read -r -p "Proceed with installation as $BF_DEVICE? [y/N] " answer; [[ "$answer" =~ ^[Yy]$ ]] || { echo Aborted.; exit 2; }; fi -RUN=(); for m in "${MODULES[@]}"; do - if [[ -n "$ONLY" ]]; then [[ "$m" == "$ONLY" || "$m" == "$ONLY"* ]] && RUN+=("$m"); continue; fi - [[ -n "$FROM" && "${m%%-*}" < "$FROM" ]] && continue - if [[ "$CHECK_MODE" -eq 0 && "$RESUME" -eq 1 && "$(state_of "$m")" == OK ]]; then log "SKIP $m (already OK)"; continue; fi - RUN+=("$m") -done -[[ ${#RUN[@]} -gt 0 ]] || { echo "No modules selected." >&2; exit 2; } -log "=== install start dealer=$BF_DEVICE mode=$([[ "$CHECK_MODE" -eq 1 ]] && echo check || echo apply) modules=${RUN[*]} ===" -failures=0 -for m in "${RUN[@]}"; do - script="$MODULES_DIR/$m.sh"; if [[ ! -x "$script" ]]; then log "FAIL $m (script missing)"; [[ "$CHECK_MODE" -eq 0 ]] && record_state "$m" FAIL; failures=$((failures+1)); break; fi - args=(); [[ "$CHECK_MODE" -eq 1 ]] && args+=(--check) - set +e; if [[ "$CHECK_MODE" -eq 1 ]]; then LOG_FILE=/dev/null bash "$script" "${args[@]}"; else LOG_FILE="$LOG_FILE" bash "$script"; fi; rc=$?; set -e - case "$rc" in 0) log "OK $m"; [[ "$CHECK_MODE" -eq 0 ]] && record_state "$m" OK;; 3) log "SKIP $m"; [[ "$CHECK_MODE" -eq 0 ]] && record_state "$m" SKIP;; *) log "FAIL $m (exit $rc)"; [[ "$CHECK_MODE" -eq 0 ]] && record_state "$m" FAIL; failures=$((failures+1)); [[ "$CHECK_MODE" -eq 0 ]] && exit 1;; esac -done -[[ "$CHECK_MODE" -eq 1 && "$failures" -gt 0 ]] && exit 1 -log "=== install done dealer=$BF_DEVICE failures=$failures ===" - - - -# Blueforce installer (`scripts/install/`) - -Single entry point: `sudo ./blueforce-install.sh --dealer-id <8 digits>`. - -- Orchestrator: `blueforce-install.sh` (dealer-id gate `^[0-9]{8}$`, - hostname `bf-` + device `BF-`, ordered module runs, `--resume`, - results to `/var/log/blueforce-install.log` + `/var/lib/blueforce/install-state`). -- Modules: `installer/modules/01-*.sh` … `18-*.sh`. Every module is idempotent - and supports `--check` (read-only audit). Exit `0` = OK, `3` = SKIP. -- Required remote-channel preconditions: set per-device `WG_ADDRESS`, `WG_ENDPOINT`, - and `WG_PEER_PUBKEY`; WireGuard readiness requires a peer handshake no older than - `BF_WG_HANDSHAKE_MAX_AGE` seconds (default `180`) unless `REQUIRE_WIREGUARD=false`. - Set `RUSTDESK_SERVER` to a real self-hosted endpoint and provide the pinned local - `RUSTDESK_DEB`; placeholders are rejected. -- Docker published ports default to deny. Add only reviewed `tcp PORT` or `udp PORT` - entries to `/etc/blueforce/docker-published-port-allowlist.conf`; the enabled - `blueforce-docker-firewall.service` reapplies that policy after Docker starts. -- Exit codes: `0` READY · `1` module failure · `2` argument/format error. - -Module map: 01-precheck · 02-system · 03-user · 04-hostname · 05-network · -06-wireguard · 07-ssh · 08-rdp · 09-rustdesk · 10-docker · 11-meg · -12-monitoring · 13-firewall · 14-update-policy · 15-logrotate · 16-gui · -17-healthcheck · 18-final-check. - -NOTE on AnyDesk: there is deliberately no AnyDesk module. Remote access is -covered by SSH-over-WireGuard, xRDP and RustDesk. AnyDesk stays a manual, -per-device exception outside this installer. - - - -#!/usr/bin/env bash -# -# bf-gui-off - Switch the field terminal back to console (multi-user) mode. -# -# Stops graphical services (xRDP + display manager) and isolates -# multi-user.target. Idempotent: already-console systems are left untouched. -# -# Install: install -m 0755 bf-gui-off /usr/local/bin/bf-gui-off -# Usage: sudo bf-gui-off -# -set -euo pipefail - -usage() { - cat <<'EOF' -Usage: bf-gui-off [--help] - -Stop the graphical layer and return the device to console mode. - -Options: - --help Show this help and exit - -Behavior: - - Stops xrdp, xrdp-sesman and the display manager (gdm3/gdm/...) - - Disables them so they do not restart on boot - - Runs 'systemctl isolate multi-user.target' -EOF -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --help|-h) usage; exit 0 ;; - *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; - esac -done - -if [[ "$(id -u)" -ne 0 ]]; then - echo "ERROR: bf-gui-off must run as root (use sudo)." >&2 - exit 1 -fi - -log() { echo "[bf-gui-off] $*"; } - -UNITS=(xrdp xrdp-sesman gdm3 gdm sddm lightdm) - -for unit in "${UNITS[@]}"; do - if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then - if systemctl is-active --quiet "${unit}"; then - log "Stopping ${unit} ..." - systemctl stop "${unit}" || log "WARNING: failed to stop ${unit}." - else - log "${unit} already stopped." - fi - systemctl disable "${unit}" >/dev/null 2>&1 || true - fi -done - -log "Isolating multi-user.target ..." -systemctl isolate multi-user.target - -log "GUI is OFF (console mode)." - - - -#!/usr/bin/env bash -# -# bf-gui-on - Switch the field terminal to graphical mode and prepare RDP. -# -# Enables and starts the display manager plus xRDP services, isolates the -# graphical target, then waits until RDP is ready to accept sessions. -# Idempotent: already-graphical systems are left untouched. -# -# Install: install -m 0755 bf-gui-on /usr/local/bin/bf-gui-on -# Usage: sudo bf-gui-on [--timeout SECS] -# -set -euo pipefail - -TIMEOUT=60 -DISPLAY_MANAGER="" - -usage() { - cat <<'EOF' -Usage: bf-gui-on [--timeout SECS] [--help] - -Switch the device to graphical mode and wait until RDP is ready. - -Options: - --timeout SECS Seconds to wait for RDP port 3389 (default: 60) - --help Show this help and exit - -Behavior: - - Enables and starts the display manager (gdm3/gdm) + xrdp + xrdp-sesman - - Runs 'systemctl isolate graphical.target' - - Waits until TCP/3389 accepts connections (RDP ready standby) -EOF -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --timeout) TIMEOUT="${2:?missing value for --timeout}"; shift 2 ;; - --help|-h) usage; exit 0 ;; - *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; - esac -done - -if [[ "$(id -u)" -ne 0 ]]; then - echo "ERROR: bf-gui-on must run as root (use sudo)." >&2 - exit 1 -fi - -log() { echo "[bf-gui-on] $*"; } - -# Detect installed display manager unit (LAB validates exact names on 26.04.1). -detect_dm() { - local candidate - for candidate in gdm3.service gdm.service sddm.service lightdm.service; do - if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${candidate}"; then - echo "${candidate%.service}" - return 0 - fi - done - return 1 -} - -if DISPLAY_MANAGER="$(detect_dm)"; then - log "Display manager detected: ${DISPLAY_MANAGER}" -else - log "WARNING: no display manager unit found; proceeding with xrdp only." -fi - -UNITS=() -[[ -n "${DISPLAY_MANAGER}" ]] && UNITS+=("${DISPLAY_MANAGER}") -UNITS+=(xrdp xrdp-sesman) - -# Enable units that exist so GUI survives reboot while switched on. -for unit in "${UNITS[@]}"; do - if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then - systemctl enable "${unit}" >/dev/null 2>&1 || true - else - log "WARNING: unit ${unit} not installed; skipping." - fi -done - -CURRENT="$(systemctl get-default 2>/dev/null || echo unknown)" -log "Current default target: ${CURRENT}" - -log "Isolating graphical.target ..." -systemctl isolate graphical.target - -for unit in "${UNITS[@]}"; do - if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then - if ! systemctl is-active --quiet "${unit}"; then - log "Starting ${unit} ..." - systemctl start "${unit}" || log "WARNING: failed to start ${unit}." - else - log "${unit} already active." - fi - fi -done - -# Wait for RDP standby on TCP/3389. -log "Waiting for RDP (TCP/3389) up to ${TIMEOUT}s ..." -elapsed=0 -while [[ "${elapsed}" -lt "${TIMEOUT}" ]]; do - if (exec 3<>/dev/tcp/127.0.0.1/3389) >/dev/null 2>&1; then - exec 3>&- 2>/dev/null || true - log "RDP is ready (graphical ON)." - exit 0 - fi - sleep 2 - elapsed=$((elapsed + 2)) -done - -echo "ERROR: RDP port 3389 did not open within ${TIMEOUT}s." >&2 -echo "HINT: check 'systemctl status xrdp xrdp-sesman' and journal." >&2 -exit 1 - - - -#!/usr/bin/env bash -# Parse fleet configuration and validate executable shell scripts without running them. -set -euo pipefail - -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FAIL=0 -fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } -pass() { printf 'OK: %s\n' "$*"; } - -# Every Bash script under scripts/ must pass syntax parsing. Non-Bash assets are ignored. -while IFS= read -r -d '' script; do - if head -n 1 "$script" | grep -qE '^#!/usr/bin/env bash|^#!/bin/bash'; then - bash -n "$script" && pass "bash parses: ${script#$REPO_ROOT/}" || fail "bash parse error: ${script#$REPO_ROOT/}" - fi -done < <(find "$REPO_ROOT/scripts" -type f -print0) - -# All Ansible and deployable configuration YAML must parse through PyYAML safe_load. -while IFS= read -r -d '' yaml_file; do - if python3 - "$yaml_file" <<'PY' -import sys -import yaml -with open(sys.argv[1], encoding='utf-8') as handle: - yaml.safe_load(handle) -PY - then - pass "yaml parses: ${yaml_file#$REPO_ROOT/}" - else - fail "yaml parse error: ${yaml_file#$REPO_ROOT/}" - fi -done < <(find "$REPO_ROOT/ansible" "$REPO_ROOT/config" "$REPO_ROOT/monitoring" -type f \( -name '*.yml' -o -name '*.yaml' \) -print0) - -# JSON configuration must parse as JSON, not merely as JavaScript. -while IFS= read -r -d '' json_file; do - if python3 - "$json_file" <<'PY' -import json -import sys -with open(sys.argv[1], encoding='utf-8') as handle: - json.load(handle) -PY - then - pass "json parses: ${json_file#$REPO_ROOT/}" - else - fail "json parse error: ${json_file#$REPO_ROOT/}" - fi -done < <(find "$REPO_ROOT/config" "$REPO_ROOT/monitoring" -type f -name '*.json' -print0) - -# Required values preserve the naming and wave policy in docs/09 and docs/10. -INV="$REPO_ROOT/ansible/inventory/hosts.example.yml" -GV="$REPO_ROOT/ansible/inventory/group_vars/all.yml" -[[ -f "$INV" ]] || fail "missing inventory example: $INV" -[[ -f "$GV" ]] || fail "missing shared group variables: $GV" -for group in lab pilot_1 pilot_2 wave_1 wave_2 production; do - grep -q "^[[:space:]]*$group:" "$INV" || fail "inventory missing wave group: $group" -done -for key in wg_subnet wg_interface monitoring_endpoint meg_image_tag reboot_grace_seconds support_bundle_dir; do - grep -q "^$key:" "$GV" || fail "group_vars/all.yml missing key: $key" -done -for pb in bf-collect-logs.yml bf-gui-on.yml bf-gui-off.yml bf-run-script.yml; do - grep -q '^ hosts: "{{ operation_wave' "$REPO_ROOT/ansible/playbooks/$pb" || fail "$pb must dynamically target operation_wave" - grep -q 'production_override: false' "$REPO_ROOT/ansible/playbooks/$pb" || fail "$pb must default production_override to false" -done -FIREWALL_POLICY="$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" -bash -n "$FIREWALL_POLICY" && pass 'bash parses: config/firewall/blueforce-docker-user-restore.sh' || fail 'bash parse error: config/firewall/blueforce-docker-user-restore.sh' -grep -q '^After=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must wait for Docker' -grep -q '^Wants=blueforce-docker-firewall.service$' "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" || fail 'Docker drop-in must start firewall policy' -if grep -RniE --include='*.yml' --include='*.yaml' --include='*.json' '^[[:space:]]*[^#].*(image:[^#]*:latest([[:space:]#]|$)|watchtower)' "$REPO_ROOT/ansible" "$REPO_ROOT/config" "$REPO_ROOT/monitoring"; then - fail "forbidden moving tag or Watchtower configuration found" -fi - -if [[ "$FAIL" -ne 0 ]]; then - printf 'check-configs: FAILED\n' >&2 - exit 1 -fi -printf 'check-configs: all passed\n' - - - -#!/usr/bin/env bash -# Validate repository specifications and Ansible safety contracts. -set -euo pipefail - -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PB="$REPO_ROOT/ansible/playbooks" -ROLES="$REPO_ROOT/ansible/roles" -FAIL=0 -fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } -pass() { printf 'OK: %s\n' "$*"; } - -# The canonical documentation set is exactly docs/00 through docs/25. -mapfile -t DOCS < <(printf '%s\n' "$REPO_ROOT"/docs/[0-9][0-9]-*.md | sort) -if [[ ${#DOCS[@]} -ne 26 ]]; then - fail "expected 26 numbered docs, found ${#DOCS[@]}" -else - for number in $(seq -w 0 25); do - matches=("$REPO_ROOT"/docs/"$number"-*.md) - [[ -f ${matches[0]} ]] || fail "missing numbered doc: $number" - done - pass "26 numbered docs present" -fi - -# Each numbered doc must retain ordered sections 1 through 13 and at least one diagram. -mermaid_total=0 -for doc in "${DOCS[@]}"; do - heading_list="$(grep -E '^## [0-9]+\.' "$doc" | sed -E 's/^## ([0-9]+)\..*/\1/' | paste -sd, -)" - if [[ "$heading_list" != '1,2,3,4,5,6,7,8,9,10,11,12,13' ]]; then - fail "non-sequential numbered headings in ${doc#$REPO_ROOT/}: ${heading_list:-none}" - fi - count="$(grep -c '^```mermaid$' "$doc" || true)" - if [[ "$count" -lt 1 ]]; then - fail "missing Mermaid block in ${doc#$REPO_ROOT/}" - fi - mermaid_total=$((mermaid_total + count)) -done -if [[ "$mermaid_total" -ne 28 ]]; then - fail "expected 28 Mermaid blocks across docs, found $mermaid_total" -else - pass "28 Mermaid blocks present" -fi - -EXPECTED_PLAYBOOKS=(bf-ping.yml bf-uptime.yml bf-reboot.yml bf-docker-status.yml bf-service-restart.yml bf-wireguard-restart.yml bf-rustdesk-restart.yml bf-rdp-restart.yml bf-collect-logs.yml bf-disk-check.yml bf-package-check.yml bf-security-updates-check.yml bf-deploy-update.yml bf-run-script.yml bf-gui-on.yml bf-gui-off.yml) -for pb in "${EXPECTED_PLAYBOOKS[@]}"; do - [[ -f "$PB/$pb" ]] && pass "playbook present: $pb" || fail "missing playbook: $pb" -done - -for role in common wireguard docker monitoring; do - for file in tasks/main.yml defaults/main.yml README.md; do - [[ -f "$ROLES/$role/$file" ]] && pass "role file present: $role/$file" || fail "missing role file: $role/$file" - done -done - -# Safety contracts from docs/09 and docs/10. -grep -q 'serial' "$PB/bf-reboot.yml" || fail 'bf-reboot.yml must batch hosts with serial' -grep -q 'any_errors_fatal: true' "$PB/bf-reboot.yml" || fail 'bf-reboot.yml must halt on errors' -grep -q 'release_wave' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a release wave' -grep -q 'wave_gate_confirmed' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a wave gate' -grep -q 'halt_on_fail' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must enforce halt_on_fail' -grep -q 'max_fail_percentage: 0' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must stop the wave on failure' -grep -q 'serial: 5' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must use the fixed batch size' -grep -q 'production_override' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a separate production override' -grep -q 'ansible_play_hosts_all' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must verify selected hosts against the release wave' -grep -q 'Run mandatory post-batch health gate' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must run a post-batch health gate' -for pb in bf-collect-logs.yml bf-gui-on.yml bf-run-script.yml bf-gui-off.yml; do - grep -q 'operation_wave' "$PB/$pb" || fail "$pb must require operation_wave" - grep -q 'operation_confirmed' "$PB/$pb" || fail "$pb must require operation_confirmed" - grep -q 'ansible_play_hosts_all' "$PB/$pb" || fail "$pb must verify its selected hosts" - grep -q 'production_override' "$PB/$pb" || fail "$pb must require a separate production override" - grep -q "operation_wave != 'production' or production_override | bool" "$PB/$pb" || fail "$pb must refuse production without production_override=true" -done -if grep -q '^ hosts: blueforce$' "$PB/bf-gui-off.yml"; then - fail 'bf-gui-off.yml must not target the blueforce group by default' -fi -grep -q '^operation_wave:' "$REPO_ROOT/ansible/inventory/group_vars/all.yml" || fail 'shared operation_wave variable missing' -grep -q '^operation_confirmed:' "$REPO_ROOT/ansible/inventory/group_vars/all.yml" || fail 'shared operation_confirmed variable missing' -for asset in config/firewall/blueforce-docker-user-restore.sh config/systemd/blueforce-docker-firewall.service config/systemd/docker.service.d/blueforce-docker-firewall.conf; do - [[ -f "$REPO_ROOT/$asset" ]] || fail "missing persistent Docker firewall asset: $asset" -done -grep -q 'systemctl enable "$DOCKER_POLICY_UNIT"' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module must enable persistent Docker firewall unit' -grep -q 'docker.service.d/blueforce-docker-firewall.conf' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module must install Docker restart coupling' -grep -q 'DOCKER_POLICY_BIN" --check' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module check must verify Docker policy rules' -grep -q '13-firewall' "$REPO_ROOT/scripts/install/installer/modules/18-final-check.sh" || fail 'final check must include the firewall rule verification gate' -grep -q 'bash "$SCRIPT_DIR/$g.sh" --check' "$REPO_ROOT/scripts/install/installer/modules/18-final-check.sh" || fail 'final check must execute every gate in check mode' -grep -q 'ctorigdstport' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall must consume published-port allowlist rules' -grep -q 'iptables -C DOCKER-USER' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall check must verify every installed allowlist rule' -grep -q -- '-i br+ -j RETURN' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall must permit egress from user-defined bridge interfaces' -grep -q '^BindsTo=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must bind to Docker lifecycle' -grep -q '^PartOf=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must restart with Docker' -grep -q '^Wants=blueforce-docker-firewall.service$' "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" || fail 'Docker must start the firewall service on every start' -grep -q 'BF_WG_HANDSHAKE_MAX_AGE' "$REPO_ROOT/scripts/install/installer/modules/06-wireguard.sh" || fail 'WireGuard module must enforce handshake freshness' -grep -q 'configured ||' "$REPO_ROOT/scripts/install/installer/modules/09-rustdesk.sh" || fail 'RustDesk module must prove client configuration' -grep -q 'service_allowlist' "$PB/bf-service-restart.yml" || fail 'bf-service-restart.yml must enforce an allowlist' -grep -q 'script_allowed_dirs' "$PB/bf-run-script.yml" || fail 'bf-run-script.yml must enforce allowed script paths' -grep -Fq "collect_logs_dir is match('^/var/lib/blueforce/support-bundles" "$PB/bf-collect-logs.yml" || fail 'bf-collect-logs.yml must restrict bundles to the approved support directory' -if [[ "$(grep -Fc '| quote' "$PB/bf-collect-logs.yml")" -lt 2 ]]; then - fail 'bf-collect-logs.yml must shell-quote every generated bundle path' -fi - -if grep -RniE --include='*.yml' '^[[:space:]]*[^#].*(image:[^#]*:latest([[:space:]#]|$)|watchtower)' "$PB" "$ROLES/docker"; then - fail "forbidden moving tag or Watchtower configuration found in deploy paths" -else - pass 'no moving tags or auto-updaters in deploy paths' -fi - -if grep -qniE 'state:[[:space:]]*(present|latest)|apt-get .*(upgrade|dist-upgrade)[[:space:]]+-y|apt:.*name:' "$PB/bf-security-updates-check.yml"; then - fail 'bf-security-updates-check.yml must remain report-only' -else - pass 'security update check is report-only' -fi - -if [[ "$FAIL" -ne 0 ]]; then - printf 'check-specs: FAILED\n' >&2 - exit 1 -fi -printf 'check-specs: all passed\n' - - - -# Semaphore Community limits (working rules for the Blueforce fleet) - -Source: `docs/09-FLEET-MANAGEMENT.md` section 9, "Semaphore Community sinirlari". -This file restates the limits in English as an executable checklist for -playbook authors and Semaphore operators. No Pro/Enterprise feature may be -used anywhere in `ansible/` or in any Semaphore task template. - -## Limits - -1. No OIDC/SSO: Semaphore users are local accounts; access only behind WireGuard. -2. No 2FA: password policy + mandatory VPN compensates; admin accounts are inventoried. -3. No external Vault integration: secrets live in the Semaphore built-in encrypted - Key Store; production secrets are never embedded in playbooks. -4. Concurrency limits (runners/forks): load-test against 700 nodes first, then tune - runner count + Ansible `serial`/`forks`/batch settings. Destructive playbooks - (`bf-reboot.yml`, `bf-deploy-update.yml`) already enforce `serial` + - `max_fail_percentage: 0` + `any_errors_fatal: true`. -5. No workflow may depend on a Pro-only feature. Anything that does not run on - Community is rejected in review (`tests/check-specs.sh` greps for it). - -## Operator checklist - -- [ ] Semaphore reachable only via WireGuard. -- [ ] Every destructive template runs `--check` dry run + `--limit ` first. -- [ ] Waves follow docs/10: lab(2) -> pilot-1(5) -> pilot-2(20) -> wave-1(50) -> wave-2(100) -> production. -- [ ] Secrets referenced from Key Store, never committed to Git. -- [ ] `tests/check-specs.sh` and `tests/check-configs.sh` pass before merge. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# - -> Kısa özet: bu doküman neyi kapsar, kimin içindir, hangi kararı verir. (2–3 cümle) - -- Dosya: `docs/NN-KONU.md` -- İlgili kararlar: `24-DECISION-LOG.md#` -- Durum: [ ] Taslak / [ ] İncelemede / [ ] Onaylı - ---- - -## 1. Amaç - -Bu dokümanın neden var olduğu, hangi sorunu çözdüğü. - -## 2. Kapsam - -Kapsam içi ve kapsam dışı maddeler: - -- Kapsam içi: ... -- Kapsam dışı: ... - -## 3. Kararlar - -Her teknik karar için aşağıdaki karar bloğunu kullan: - -```text -KARAR: -GEREKÇE: -ALTERNATİF: -RİSK: -MALİYET: <Ücretsiz / Ücretli (işaretli) + not> -LİSANS: -``` - -Örnek: - -```text -KARAR: Filo yönetiminde Ansible + Semaphore UI Community kullanılır. -GEREKÇE: Agent gerektirmez, SSH tabanlıdır, 700 cihaz ölçeğinde yeterlidir. -ALTERNATİF: SaltStack — daha karmaşık kurulum nedeniyle elendi. -RİSK: Playbook hatası filoya yayılabilir; önce LAB(2) grubunda çalıştırılır. -MALİYET: Ücretsiz (self-hosted). -LİSANS: Semaphore Community (kaynak doğrulanacak) — URL + sürüm + tarih eklenecek. -``` - -## 4. Neden Bu Karar? - -Kararların arkasındaki teknik ve operasyonel gerekçeler. Sadelik kuralı burada denetlenir: Kubernetes, microservice, gereksiz agent/DB/cloud öneriliyorsa neden reddedildiği yazılır. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| ... | ... | ... | Elendi / Yedek | - -## 6. Avantajlar - -- ... - -## 7. Dezavantajlar - -- ... - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| ... | Düşük/Orta/Yüksek | ... | ... | - -## 9. Uygulama Planı - -Numaralı adımlar; komutlar İngilizce orijinal adıyla, açıklamalar Türkçe: - -1. ... -2. ... - -```bash -# örnek komut bloğu -hostnamectl set-hostname bf-12010193 -``` - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| ... | ... | LAB(2) | - -## 11. Rollback - -Başarısızlıkta önceki duruma dönüş adımları: - -1. ... -2. ... - -## 12. Kontrol Listesi - -- [ ] ... -- [ ] ... - -## 13. Açık Sorular - -- [ ] ... (sahibi + tarih ile) - ---- - -## Ek: Mermaid Örneği - -```mermaid -flowchart LR - Saha["bf-12010193
    (saha PC'si)"] -->|WireGuard| Merkez["Merkez sunucu"] - Merkez --> Ansible["Ansible/Semaphore"] - Merkez --> Monitor["Monitoring"] -``` -
    - # 00 — Ana Plan (Master Plan) @@ -4551,163 +14911,6 @@ flowchart LR | 24 | Karar günlüğü | Kilit kaynak | - -# 01 — Sistem Mimarisi - -> Kısa özet: 700 saha cihazlı Blueforce filosunun uçtan uca mimarisi: saha PC'si, WireGuard ağı, 4 erişim kanalı, filo otomasyonu, monitoring ve update zinciri tek bakışta. Kararların görsel karşılığıdır. -> -> - Dosya: `docs/01-ARCHITECTURE.md` -> - İlgili kararlar: `24-DECISION-LOG.md#K-01…K-14` (tüm mimari bu kararlara dayanır) -> - Durum: [x] Onaylı (Faz 2 kilidi) - ---- - -## 1. Amaç - -Başka bir DevOps mühendisinin filoyu tek dosyadan anlayıp kurmaya başlayabilmesi: hangi bileşen nerede koşar, trafik nasıl akar, cihaz nasıl boot eder, update nasıl yayılır. - -## 2. Kapsam - -- Kapsam içi: saha cihazı katmanları, merkez (VDS) servisleri, ağ/erişim akışı, boot zinciri, update onay akışı. -- Kapsam dışı: kurulum komutları (03/04/05), playbook detayları (09), metrik listesi detayı (14) — ilgili dokümanlara havale. - -## 3. Kararlar - -```text -KARAR: Filo mimarisi: saha = Ubuntu Server 26.04.1+ GNOME + Docker(MEG) + WireGuard spoke; merkez = WireGuard hub + RustDesk hbbs/hbbr + MeshCentral + Ansible/Semaphore + Prometheus/Grafana + Uptime Kuma (hepsi self-hosted, ücretsiz katman). -GEREKÇE: 24-DECISION-LOG K-01…K-08'in birleşimi; hareketli parça en aza indirildi (agent'sız filo, tek Go binary UI, tek konteyner uptime), iki WireGuard-bağımsız erişim kanalıyla tek-nokta körlüğü engellendi. -ALTERNATİF: K8s-tabanlı yönetim / Cloud-merkezli monitoring — sadelik kuralını bozduğu için elendi (bkz. 24 §4). -RİSK: Merkez VDS tek fiziksel nokta; azaltma: yedekleme + hızlı yeniden kurulum (17-RECOVERY), kritik kanalların ayrı VDS'e taşınabilirliği. -MALİYET: Ücretsiz (lisans $0; VDS kira bedeli altyapı maliyetidir). -LİSANS: Bileşen lisansları için 24-DECISION-LOG Ek A'ya bakılır. -``` - -## 4. Neden Bu Karar? - -Öncelik sırası (kesintisiz çalışma > veri kaybı yok > uzaktan erişim > bakım kolaylığı) mimariyi şekillendirdi: boot zinciri her katmanda otomatik toparlanır (systemd + `unless-stopped` + `wg-quick` enable), erişim 4 kanalla yedeklenir (ikisi WireGuard-bağımsız), update'ler onay zincirinden geçmeden sahaya inmez. Hiçbir katman ücretli lisansa dayanmaz. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Tek kanal (yalnızca SSH) | En sade | Tünel çökerse körlük | Elendi | -| Cloud monitoring (Netdata Cloud vb.) | Hızlı kurulum | 5 node free kotası, 700 cihaz ücretli | Elendi | -| K8s-orkestrasyonlu saha | Ölçek esnekliği | 700 mini PC'de gereksiz yük | Elendi | - -## 6. Avantajlar - -- Tek kimlik (`BF-`/`bf-`) tüm katmanlarda join anahtarı — envanterden monitoring'e aynı ad. -- Her akış (erişim/boot/update) diyagramla sabit; runbook'lar bu diyagramlara prosedür yazar. - -## 7. Dezavantajlar - -- Merkez servis sayısı (hub + 2 erişim + fleet + 2 monitoring + docs) ilk kurulumda tek VDS'e sığsa da yük testinden geçmeli. -- Diyagramlar sözleşmedir: bileşen değişirse 3 Mermaid de aynı PR'da güncellenmeli. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Merkez VDS kesintisi | Düşük | Yüksek | Hızlı yeniden kurulum + yedek VDS planı (17) | -| Boot zincirinde race (Docker WG'den önce kalkar) | Orta | Orta | systemd bağımlılıkları + After= kuralları (16) | -| Onaysız update zinciri bypass eder | Düşük | Yüksek | K-11 kilitleri + Semaphore'da onay adımı (10) | - -## 9. Uygulama Planı - -1. Merkez VDS: WireGuard hub → hbbs/hbbr → MeshCentral → Semaphore → Prometheus/Grafana/Kuma sırasıyla kurulur. -2. Saha imajı: Ubuntu Server → GNOME → Docker → WireGuard spoke → RustDesk/MeshCentral agent → Node Exporter. -3. İlk 2 LAB cihazı bu mimariye göre uca eklenir, 3 akış (erişim/boot/update) testlenir. - -```bash -# örnek: cihaz kimliği standardı (K-12) -hostnamectl set-hostname bf-12010193 -``` - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| 3 Mermaid'deki her ok için bağlantı testi | Uçtan uca akış çalışır | LAB(2) | -| VDS down simülasyonu (hbbs kapalı) | SSH-over-WG + MeshCentral ayakta | P1(5) | -| Güç kesintisi simülasyonu | Boot zinciri sırayla toparlanır | LAB(2) | - -## 11. Rollback - -Mimari değişikliği 24-DECISION-LOG PR'ı ile yapılır; bu dosyanın diyagramları aynı PR'da güncellenir. Yanlış bileşen seçimi sahaya yayılmadan LAB'da geri alınır (10-UPDATE rollback zinciri). - -## 12. Kontrol Listesi - -- [ ] 3 Mermaid bloğu render oluyor (Docusaurus + GitHub preview). -- [ ] Her bileşen adının kararı 24'te var (K-01…K-14). -- [ ] `bf-` / `BF-` adlandırması diyagramlarda tutarlı. - -## 13. Açık Sorular - -- [ ] Merkez servislerin tek VDS'e sığıp sığmadığı — LAB yük testi (sahibi: 25-ROADMAP). -- [ ] Prometheus federasyonu gerekip gerekmediği — 700 node ölçümü (sahibi: 14-MONITORING). - ---- - -## Ek: Mermaid — 1. Erişim ve yönetim akışı (Internet → WireGuard → SSH/RDP/Mgmt) - -```mermaid -flowchart LR - subgraph SAHA["Saha (bf-)"] - PC["Ubuntu Server 26.04.1
    GNOME + Docker/MEG"] - end - subgraph MERKEZ["Merkez VDS"] - WG["WireGuard hub"] - SEM["Ansible/Semaphore"] - MON["Prometheus/Grafana
    Uptime Kuma"] - RD["RustDesk hbbs/hbbr"] - MC["MeshCentral"] - end - PC -->|Internet: WG tüneli
    PersistentKeepalive=25| WG - WG --> SEM - WG --> MON - WG -->|SSH 22, RDP 3389
    yalnızca tünel içi| PC - PC -->|Internet doğrudan
    VDS genel adresi| RD - PC -->|Internet doğrudan
    VDS genel adresi| MC - RD -.->|WG çökse bile
    ayakta| PC - MC -.->|WG çökse bile
    ayakta| PC -``` - -## Ek: Mermaid — 2. Power boot zinciri - -```mermaid -flowchart TB - PWR["Power ON
    (BIOS: Restore on AC Power Loss = Power On)"] --> BIOS["BIOS/UEFI"] - BIOS --> UB["Ubuntu Server 26.04.1
    multi-user terminal boot"] - UB --> NET["Network
    (NetworkManager/systemd-networkd)"] - NET --> WGV["WireGuard
    (wg-quick@wg0 enable)"] - WGV --> DKR["Docker daemon
    (log rotasyonlu)"] - DKR --> MEG["MEG konteyneri
    (unless-stopped)"] - MEG --> BF["Blueforce servisleri"] - BF --> REM["Remote: SSH + xRDP +
    RustDesk + MeshCentral agent"] - REM --> MON["Monitoring:
    Node Exporter + Uptime Push"] -``` - -## Ek: Mermaid — 3. Update onay akışı - -```mermaid -flowchart LR - F["Bulundu
    (güvenlik bülteni / MEG sürümü)"] --> R["Rapor
    (etki + geri alma planı)"] - R --> O{"Onay
    (merkezi admin)"} - O -->|Red| F - O -->|Onay| LAB["LAB 2 cihaz"] - LAB -->|Başarılı| P1["PILOT-1 5 cihaz"] - P1 -->|Başarılı| P2["PILOT-2 20 cihaz"] - P2 -->|Başarılı| W1["WAVE-1 50 cihaz"] - W1 -->|Başarılı| W2["WAVE-2 100 cihaz"] - W2 -->|Başarılı| PROD["PRODUCTION
    kalan ~523 cihaz"] - LAB -->|Başarısız| RB["Rollback
    (10-UPDATE zinciri)"] - P1 -->|Başarısız| RB - P2 -->|Başarısız| RB - W1 -->|Başarısız| RB - W2 -->|Başarısız| RB -``` -
    - # 02 — Cihaz Adlandırma ve Envanter @@ -4876,464 +15079,6 @@ flowchart LR ``` - -# 03 — Ubuntu Baseline - -> Kısa özet: Saha PC'lerinin standart zemini: Ubuntu Server 26.04.1+ LTS minimal kurulum, GNOME sonradan eklenir, terminale boot edilir, `unattended-upgrades` kapalıdır. BIOS güç-kurtarma ayarı ve GUI aç/kapa anahtarları bu dosyadadır. - -- Dosya: `docs/03-UBUNTU-BASELINE.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-01` (OS/sürüm), `K-02` (GNOME), `K-03` (boot + bf-gui), `K-11` (otomatik update kapalı) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Her saha PC'sinin aynı minimal zeminden başlamasını garanti etmek: hangi ISO, hangi masaüstü, hangi boot hedefi, hangi servisler açık/kapalı. Bu zemin 04'teki imajın ve 05'teki kurucunun varsayımıdır. - -## 2. Kapsam - -- Kapsam içi: ISO seçimi, BIOS güç-kurtarma ayarı, boot hedefi (multi-user), GUI katmanı (GNOME + xRDP + `bf-gui-*`), `unattended-upgrades` kapatma, açılışta koşan servis listesi. -- Kapsam dışı: imaj üretim yöntemi (04), kurucu modül detayları (05), WireGuard/SSH sertleştirme (06/08/11). - -## 3. Kararlar - -```text -KARAR: Saha standardı Ubuntu Server 26.04.1+ LTS'tir (GUI'siz minimal kurulum; GNOME sonradan eklenir). -GEREKÇE: 26.04.1 LTS resmi indirme sayfasında yayında (kod adı Resolute Raccoon); Server ISO'su varsayılan olarak GUI kurmaz, minimal zemin + ihtiyaca göre GUI standart yoldur. Noktasürüm (.1+) baz alınır çünkü ilk .0 dalgasındaki kurulumcu hataları genelde .1'de toplanır. -ALTERNATİF: Ubuntu 24.04 LTS — 26.04 doğrulanamasaydı yedekti; doğrulandığı için yedekte bekler. Ubuntu Desktop 26.04 (6 GB RAM şartı) saha bütçesini zorladığı için elendi. -RİSK: 26.04.x noktasürümlerinde donanım sürücü farkı; azaltma: golden image LAB(2)'de her saha donanım profilinde test edilir. -MALİYET: Ücretsiz. -LİSANS: Ubuntu LTS ücretsiz (ESM kapsamına bel bağlanmaz) — https://releases.ubuntu.com/ (26.04.1, doğrulanma: 2026-09-15) + https://ubuntu.com/download/desktop (sistem gereksinimi, doğrulanma: 2026-09-15). -``` - -```text -KARAR: Saha masaüstü ortamı GNOME'dur (Ubuntu Desktop standardı); XFCE elendi. -GEREKÇE: Kullanıcı kararı + Ubuntu Desktop standardı: tanıdık modern masaüstü, teknisyen akışıyla birebir uyum. -ALTERNATİF: XFCE — hafif ve düşük kaynak tüketimine rağmen kullanıcı kararıyla elendi; yedekte tutulmaz. -RİSK: xRDP+GNOME kombinasyonu ek ayar isteyebilir (uyarı: GNOME oturumu RDP'de ek yapılandırma gerektirebilir); azaltma: 13-MEG-LINUX-ACCEPTANCE testi GNOME üzerinde koşar, `bf-gui-*` LAB'da 26.04.1 imajında doğrulanmadan dondurulmaz. -MALİYET: Ücretsiz. -LİSANS: GNOME (GPL/LGPL bileşenler), ücretsiz — https://www.gnome.org/ (doğrulanma: 2026-09-15). -``` - -```text -KARAR: Cihazlar terminale (multi-user) boot eder; grafik katman `bf-gui-on` / `bf-gui-off` ile systemd üzerinden açılıp kapatılır. -GEREKÇE: xRDP mimarisi oturum yöneticisi (sesman) + systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerine kuruludur; GUI, display-manager + xRDP servisleri üzerinden yönetilebilir bir katman olarak modellenir. Varsayılan kapalı GUI = düşük RAM, düşük saldırı yüzeyi, öngörülebilir boot. -ALTERNATİF: Her zaman grafik boot — kaynak israfı ve 700 cihazda gereksiz hata yüzeyi nedeniyle elendi. -RİSK: Kesin birim adları ve GNOME oturum başlatma satırı 26.04.1'e göre değişebilir; azaltma: LAB'da 26.04.1 imajında doğrulanmadan `bf-gui-*` dondurulmaz. -MALİYET: Ücretsiz. -LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15). -``` - -```text -KARAR: Golden image'da `unattended-upgrades` kapatılır (`/etc/apt/apt.conf.d/20auto-upgrades` değerleri `0` + `apt-daily*.timer` maskeleme). -GEREKÇE: `unattended-upgrades` Ubuntu Server'da varsayılan kurulu ve etkindir, günde bir kez çalışır; kapatılmazsa 700 cihaz ilk açılışta güncellemeye kalkar ("onaysız update yasak" ilkesi delinir). -ALTERNATİF: Otomatik security update'e izin verme — eşzamanlı indirme + onaysız değişim riski nedeniyle elendi. -RİSK: Kapatma adımı imajda atlanırsa filo kendiliğinden güncellenir; azaltma: kurucu final-check + monitoring metriği. -MALİYET: Ücretsiz. -LİSANS: Yok (OS yapılandırması) — https://ubuntu.com/server/docs/how-to/software/automatic-updates/ (doğrulanma: 2026-09-15). -``` - -## 4. Neden Bu Karar? - -Server minimal kurulum + sonradan GNOME (Ubuntu Desktop standardı, kullanıcı kararı). Terminale boot, 700 cihazın varsayılan durumunu en öngörülebilir hale getirir; grafik yalnızca bakım penceresinde açılır. Otomatik update'in kapatılması, update zincirinin (10-UPDATE) "onay olmadan değişim yok" ilkesinin teknik kilididir. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Ubuntu 24.04 LTS | Olgun donanım desteği | Daha kısa destek penceresi | Yedek | -| Ubuntu Desktop 26.04 | Tek adımda GUI | 6 GB RAM şartı, şişkin zemin | Elendi | -| XFCE | Hafif, düşük kaynak | Kullanıcı kararıyla elendi (saha standardı GNOME) | Elendi | -| Her zaman grafik boot | Teknisyen rahatlığı | Kaynak israfı, geniş hata yüzeyi | Elendi | - -## 6. Avantajlar - -- Minimal zemin = küçük imaj, hızlı kurulum, az saldırı yüzeyi. -- Kapalı GUI varsayılanı = düşük RAM + öngörülebilir boot 700 cihazda çarpan etkisi yapar. -- Kapalı otomatik update = filo sürüm determinizmi. - -## 7. Dezavantajlar - -- GNOME oturum başlatma satırı ve display-manager birim adları 26.04.1'e göre LAB'da doğrulanmadan dondurulamaz. -- Teknisyen grafik istediğinde ek komut (`bf-gui-on`) gerekir — runbook'a işlenir. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| 26.04.x sürücü farkı heterojen donanımda | Orta | Orta | LAB profil testi (04) | -| `bf-gui-*` birim adları 26.04.1'de farklı | Orta | Düşük | LAB doğrulaması, §13 açık soru | -| `unattended-upgrades` açık unutulur | Orta | Yüksek | final-check + monitoring metriği | - -## 9. Uygulama Planı - -1. BIOS ayarı (her saha PC'sinde, elektrik kesintisi sonrası otomatik açılış için): - - `Restore on AC Power Loss = Power On` (üretici menüsünde `After Power Loss: Power On` / `AC Recovery: Power On` adlarıyla da geçer; teknisyen imaj öncesi menüden doğrular). -2. Ubuntu Server 26.04.1+ minimal kurulum (GUI seçilmez). -3. Boot hedefi terminale sabitlenir: - -```bash -sudo systemctl set-default multi-user.target -systemctl get-default # multi-user.target beklenir -``` - -4. GNOME + xRDP katmanı kurulur (kurucu 05 üzerinden): - -```bash -sudo apt install -y ubuntu-desktop-minimal xrdp -sudo systemctl enable xrdp xrdp-sesman -# GNOME oturumu varsayılan yapılır (LAB'da 26.04.1'e göre doğrulanacak satır): -echo "gnome-session" > ~/.xsession -``` - -5. GUI aç/kapa anahtarları (kurucu tarafından `/usr/local/bin/` altına yazılır): - -```bash -sudo bf-gui-on # display-manager + xrdp/xrdp-sesman başlatılır, RDP oturumu açılır -sudo bf-gui-off # grafik katman durdurulur, cihaz terminale döner -``` - -6. Otomatik update kapatılır: - -```bash -# /etc/apt/apt.conf.d/20auto-upgrades içinde her iki değer 0: -# APT::Periodic::Update-Package-Lists "0"; -# APT::Periodic::Unattended-Upgrade "0"; -sudo systemctl mask apt-daily.timer apt-daily-upgrade.timer -``` - -7. Açılışta koşması beklenen servisler (final-check bunları denetler): `NetworkManager` (veya `systemd-networkd`), `wg-quick@wg0`, `docker`, `xrdp`+`xrdp-sesman` (yalnızca GUI-açık modda), `node_exporter`, RustDesk/MeshCentral agent, `bf-health-push.timer`. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| `get-default` | `multi-user.target` | LAB(2) | -| Güç kesintisi simülasyonu | BIOS ayarı ile cihaz kendiliğinden açılır | LAB(2) | -| `bf-gui-on/off` sonrası RDP | GNOME oturumu açılır/kapanır | LAB(2) | -| `20auto-upgrades` değerleri `0`, timer'lar maskeli | Otomatik apt çalışmaz | LAB(2) imaj denetimi | - -## 11. Rollback - -1. Yanlış boot hedefi: `sudo systemctl set-default multi-user.target` ile geri alınır. -2. Bozuk GNOME/xRDP katmanı: `bf-gui-off` + paket yeniden kurulumu; son çare imajdan yeniden kurulum (04). -3. Otomatik update yanlışlıkla açıldıysa §9 adım 6 yeniden uygulanır, `apt-daily*` timer durumu denetlenir. - -## 12. Kontrol Listesi - -- [ ] ISO sürümü 26.04.1+ (LAB'da `lsb_release -a` çıktısı kayıtlı). -- [ ] BIOS `Restore on AC Power Loss = Power On` her profilde doğrulandı. -- [ ] `get-default` = `multi-user.target`. -- [ ] `bf-gui-on/off` LAB 26.04.1 imajında test edildi. -- [ ] `unattended-upgrades` kapalı + timer'lar maskeli. - -## 13. Açık Sorular - -- [ ] GNOME oturum başlatma satırı + `bf-gui-*` kesin birim listesi — LAB 26.04.1 imajında (sahibi: Faz 3). -- [ ] `NetworkManager` vs `systemd-networkd` seçimi — netplan profiliyle birlikte LAB'da netleşecek (sahibi: Faz 3, 08 yazarı). - ---- - -## Ek: Zemin Katmanları - -```mermaid -flowchart TB - ISO["Ubuntu Server 26.04.1+ ISO
    (GUI'siz minimal)"] --> BOOT["Boot hedefi: multi-user.target
    (terminale boot)"] - BOOT --> GUI["GUI katmanı (kapalı varsayılan)
    GNOME + xRDP + bf-gui-on/off"] - GUI --> KILIT["Update kilidi
    unattended-upgrades kapalı + timer maskeli"] - KILIT --> SERVIS["Açılış servisleri
    wg-quick + docker + node_exporter + agent'lar"] -``` -
    - - -# 04 — Golden Image ve Provisioning - -> Kısa özet: Saha imajının nasıl üretildiği ve cihaza nasıl basıldığı: autoinstall-tabanlı Ubuntu zemini + ilk açılışta kimlik enjeksiyonu. Hedef akış: USB → Ubuntu → tek script → bayi no → READY. - -- Dosya: `docs/04-GOLDEN-IMAGE-AND-PROVISIONING.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-09` (golden image yöntemi), `K-01` (OS), `K-11` (update kapalı), `K-12` (kimlik imajda değil, ilk boot'ta) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Heterojen 700 saha PC'sinde aynı zemini tekrarlanabilir şekilde kurmak: imajın ne içerdiği, ne içermediği (cihaz kimliği), hangi araçla üretildiği ve sahada hangi akışla basıldığı. - -## 2. Kapsam - -- Kapsam içi: yöntem seçimi (karşılaştırma tablosu), imaj içeriği, autoinstall rolü, USB basım akışı, kimlik enjeksiyonu, LAB test matrisi. -- Kapsam dışı: kurucu modül detayları (05), BIOS ayarı detayı (03), rollout lojistiği (18-RECOVERY/18-ROLLOUT). - -## 3. Kararlar - -```text -KARAR: Golden image = Ubuntu Server 26.04.1+ minimal + `unattended-upgrades` kapalı + `blueforce-install.sh` tek kurucu (bayi no → READY); imaj, preseed/autoinstall dosyasıyla üretilir, cihaz-spesifik kimlik (`bf-`) imajda DEĞİL ilk açılışta verilir. -GEREKÇE: Donanım heterojenliği bilinmediği için bit-kopya klon (Clonezilla) tek imajda kırılgandır; autoinstall + idempotent kurulum scripti her donanım profilinde aynı zemini kurar, kimlik ilk boot'ta enjekte edilir. Hedef akış: USB → Ubuntu → tek script → bayi no → READY. -ALTERNATİF: Clonezilla bit-kopya (hızlı ama donanım-fragil → yedek yöntem olarak tutulur); Packer/custom ISO (ek derleme hattı yükü → elendi); cloud-init (autoinstall'a göre saha-USB akışına daha az uygun → elendi). -RİSK: İlk imaj heterojen donanımda sürücü eksiltebilir; azaltma: önce `bf-hardware-inventory.sh` taraması (18-ROLLOUT), LAB'da her profilde test. -MALİYET: Ücretsiz. -LİSANS: Ubuntu autoinstall/subiquity (ücretsiz, Ubuntu lisans seti içinde) — https://releases.ubuntu.com/26.04/ (doğrulanma: 2026-09-15). NOT: resmi autoinstall sözdizimi LAB çıktısıyla kesinleşir. -``` - -## 4. Neden Bu Karar? - -Bit-kopya klon, kaynak makinenin sürücü setini dondurur; farklı anakart/ağ kartı olan sahada açılmayan cihaz üretir. Autoinstall her makinede donanıma göre kurulum yapar, ardından aynı kurucu script aynı zemini kurar — sonuç donanımdan bağımsız deterministik zemin + ilk boot'ta enjekte edilen benzersiz kimliktir. Custom ISO/Packer ek derleme hattı (imzalı ISO, build sunucusu, sürüm takibi) getirir; sadelik kuralını bozar. - -## 5. Alternatifler - -| Yöntem | Artı | Eksi | Sonuç | -|---|---|---|---| -| Ubuntu autoinstall (user-data) | Resmi yol, donanım-bağımsız, USB'den katılımsız | Sözdizimi LAB'da doğrulanmalı | **Seçildi** | -| Clonezilla bit-kopya | Çok hızlı klon, basit | Donanım-fragil, kimlik çakışması riski | Yedek yöntem | -| cloud-init (NoCloud USB) | Esnek ilk-boot yapılandırma | Saha-USB akışına autoinstall kadar uygun değil, ek katman | Elendi | -| Custom ISO (cubic/live-build) | Her şey gömülü tek ISO | Derleme hattı + imza + sürüm yükü | Elendi | -| Packer + QEMU build | Tekrarlanabilir build | Ek altyapı, öğrenme eğrisi, 700 PC için aşırı | Elendi | -| Ansible-only (kurulu OS üstüne) | İmaja gerek yok | Temel OS kurulumu yine manuel/USB gerektirir | Tamamlayıcı (kurucu sonrası filo) | - -## 6. Avantajlar - -- İmaj kimliksizdir: tek USB tüm sahada kullanılır, yanlış kimlikli cihaz çıkmaz. -- Kurucu idempotent olduğu için yarım kalan kurulum kaldığı yerden tamamlanır. -- Yedek yöntem (Clonezilla) hazırda bekler; autoinstall bir profilde takılırsa sahada blokaj olmaz. - -## 7. Dezavantajlar - -- Autoinstall sözdizimi Faz 1'de resmi-doğrulamalı değil; LAB çıktısı beklenir. -- İlk kurulum Clonezilla'ya göre daha yavaştır (paket kurulumu her cihazda tekrarlanır). - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Heterojen donanımda sürücü eksikliği | Orta | Orta | Envanter taraması + LAB profil matrisi | -| Autoinstall sözdizimi sürüm farkı | Orta | Düşük | LAB 26.04.1 çıktısı dondurulur, dosyası repo'da sürümlenir | -| USB medyası bozuk/eskimiş | Düşük | Düşük | Çift USB + SHA256 doğrulama | - -## 9. Uygulama Planı - -1. İmaj içeriği (kimliksiz zemin): - - Ubuntu Server 26.04.1+ minimal (GUI yok). - - `unattended-upgrades` kapalı (03 §9 adım 6). - - `blueforce-install.sh` + modüller USB'de `/opt/blueforce-installer/` altında (veya ilk boot'ta merkezi depodan çekilir — LAB'da netleşir). - - Bootstrap SSH anahtarı (ilk Ansible run'ında rotasyon, K-13). -2. Saha akışı (hedef: teknisyen başına <15 dk aktif iş): - -```text -USB tak → Ubuntu Server kur (autoinstall, katılımsız) - → ilk açılışta: sudo ./blueforce-install.sh --dealer-id <8hane> - → script bitince: bf-status → READY - → USB çıkar, cihaz sahaya alınır -``` - -```bash -# sahada tek komut (kimlik ilk kez burada verilir) -sudo ./blueforce-install.sh --dealer-id 12010193 -``` - -3. Kimlik enjeksiyonu ilk boot'ta olur: hostname + WireGuard peer + envanter kaydı kurucu tarafından yazılır; imajda hiçbir `bf-` artığı bulunmaz (final-check denetler). -4. LAB test matrisi: envanterde çıkan her donanım profili × (kurulum + güç-kesintisi + `bf-gui-on/off` + final-check) — matris dolmadan WAVE açılmaz. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Aynı USB ile 2 farklı donanım profili | İkisi de READY | LAB(2) | -| İmajda kimlik artığı taraması (`bf-*`, peer key) | Hiçbir cihaz-spesifik değer yok | LAB(2) | -| Yarım kesilen kurulumun tekrarı | İkinci koşu tamamlar, exit 0 | LAB(2) | -| Clonezilla yedek yöntemi | Autoinstall takılan profilde READY | LAB(2) | - -## 11. Rollback - -1. Bozuk imaj: önceki USB sürümüne dönüş (USB'ler sürüm etiketli saklanır). -2. Kurulum sonrası hata: kurucu idempotent yeniden koşar; düzelmezse 17-RECOVERY LEVEL 9 (imajdan temiz kurulum). -3. Autoinstall dosyası hatalıysa düzeltme repo PR'ı ile sürümlenir, SHA256 yeniden yayımlanır. - -## 12. Kontrol Listesi - -- [ ] Autoinstall dosyası repo'da sürümlü + LAB çıktısıyla doğrulanmış. -- [ ] USB SHA256 değeri yayımlanmış ve sahada doğrulanıyor. -- [ ] İmajda kimlik artığı yok (otomatik tarama). -- [ ] Her donanım profili LAB matrisinde READY almış. -- [ ] Clonezilla yedek prosedürü yazılı ve test edilmiş. - -## 13. Açık Sorular - -- [ ] Kurucu USB'de mi taşınacak, ilk boot'ta merkezden mi çekilecek (saha interneti varsayımı) (sahibi: Faz 3). -- [ ] Autoinstall kesin direktif seti — LAB 26.04.1 çıktısı (sahibi: Faz 3, bu dosyanın yazarı). -- [ ] USB hazırlama standardı (Ventoy vs dd vs Balena) (sahibi: Faz 3). - ---- - -## Ek: Provisioning Akışı - -```mermaid -flowchart LR - USB["USB
    (autoinstall + kurucu)"] --> KUR["Ubuntu Server 26.04.1
    katılımsız kurulum"] - KUR --> TEK["sudo ./blueforce-install.sh
    --dealer-id <8hane>"] - TEK --> KIMLIK["Kimlik enjeksiyonu
    bf- + peer + envanter"] - KIMLIK --> HAZIR["bf-status → READY"] - HAZIR --> SAHA["Sahaya alım"] -``` -
    - - -# 05 — Tek-Tık Kurucu (One-Click Installer) - -> Kısa özet: Sahada tek komutla cihazı READY yapan `blueforce-install.sh`: bayi no doğrulaması, 18 modül, idempotent yeniden-koşu ve final-check kapısı. Teknisyenin çalıştırdığı tek şeydir. - -- Dosya: `docs/05-ONE-CLICK-INSTALLER.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-09` (tek kurucu), `K-11` (update kapalı), `K-12` (kimlik formatı), `K-03` (bf-gui), `K-10` (Docker disiplini) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Saha teknisyeninin uzmanlık gerektirmeden cihazı standarda getirmesi: tek komut, tek girdi (bayi no), net sonuç (READY / hata + log yolu). Yarım kalan veya hatalı kurulumun güvenli tekrarı. - -## 2. Kapsam - -- Kapsam içi: komut arayüzü, bayi-no doğrulama, 18 modül listesi ve sırası, idempotency kuralları, log/bundle çıktısı, çıkış kodları. -- Kapsam dışı: modül iç kodları (repo `scripts/install/`), imaj üretim yöntemi (04), filo-side yapılandırma (09). - -## 3. Kararlar - -```text -KARAR: Saha kurulumu tek giriş noktasıdır: `sudo ./blueforce-install.sh --dealer-id <8hane>`; bayi no `^[0-9]{8}$` ile doğrulanır, uymayan girdi kurucuyu başlatmaz. -GEREKÇE: Tek komut teknisyen hatasını en aza indirir; format kapısı yanlış kimliğin 9 sisteme yayılmasını baştan engeller (K-12). -ALTERNATİF: Çok scriptli kurulum (ağ.sh, gui.sh, …) — sıra hatası ve atlanan adım riski nedeniyle elendi. -RİSK: Tek dosya büyüdükçe bakımı zorlaşır; azaltma: 18 bağımsız modül + ana orkestratör ayrımı. -MALİYET: Ücretsiz. -LİSANS: Yok (şirket içi script). -``` - -```text -KARAR: Kurucu 18 modülden oluşur (`01-precheck` … `18-final-check`); her modül idempotenttir — yeniden koşu güvenli ve kaldığı yerden tamamlayıcıdır. -GEREKÇE: Saha elektriği/kesintisi yarım kurulum üretir; idempotency olmadan her kesinti temiz-kurulum demektir. Final-check kapısı (modül 18) exit 0 vermeden cihaz READY sayılmaz. -ALTERNATİF: Tek seferlik (non-idempotent) script — kesinti durumunda belirsiz ara durum nedeniyle elendi. -RİSK: Modülün idempotent yazılmaması (çift kayıt, çift key); azaltma: §10'daki çift-koşu testi her modül için zorunlu. -MALİYET: Ücretsiz. -LİSANS: Yok. -``` - -## 4. Neden Bu Karar? - -700 cihaz × teknisyen başına değişen beceri = kurulumun "tek komut + tek soru" olması şarttır. 18 modül, her kararın (update-kapalı, Docker-disiplini, GUI-anahtarı, kimlik, servisler) ayrı denetlenebilir adımdır; modül numarası log satırında görünür, arıza hangi adımda kaldıysa oradan devam edilir. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Çok scriptli kurulum | Küçük dosyalar | Sıra/atlama hatası | Elendi | -| Non-idempotent tek script | Daha basit kod | Kesintide temiz-kurulum zorunluluğu | Elendi | -| İnteraktif sihirbaz (çok sorulu) | Esnek | Teknisyen hatası, otomasyona kapalı | Elendi | - -## 6. Avantajlar - -- Tek komut = eğitim maliyeti minimum, runbook tek sayfa. -- Idempotency = kesinti korkusu yok, "bir daha koş" her sorunun ilk cevabı. -- Final-check = READY iddiası ölçülebilir, dalga kapılarına bağlanır. - -## 7. Dezavantajlar - -- 18 modülün her biri için idempotency testi yazma maliyeti. -- Tek giriş noktası, modül-atlama (debug) ihtiyacında `--from/--only` bayraklarını zorunlu kılar. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Modül idempotent değil (çift kayıt) | Orta | Orta | Çift-koşu testi (§10) + code review kuralı | -| Teknisyen yanlış no girer | Orta | Orta | Format kapısı + onay ekranı (`BF-xxxx, onaylıyor musunuz?`) | -| Kurucu yarıda kesilir, cihaz ara durumda sahaya alınır | Düşük | Yüksek | Final-check exit 0 olmadan READY yok; `bf-status` bunu gösterir | - -## 9. Uygulama Planı - -1. Komut arayüzü: - -```bash -sudo ./blueforce-install.sh --dealer-id 12010193 [--from 07] [--only 18-final-check] [--check] -# --check: değişiklik yapmadan denetim (final-check + modül durumları) -# --from: belirtilen modülden devam et | --only: tek modül koş -``` - -2. Bayi-no doğrulama: `^[0-9]{8}$`; uymazsa exit 2 + kullanım mesajı. Geçerse onay ekranı (`BF-12010193` + hostname `bf-12010193` gösterilir). -3. 18 modül (sıra sözleşmedir, yeri `scripts/install/`): - -| # | Modül | İşlev (dayandığı karar) | -|---|---|---| -| 01 | `01-precheck` | OS sürümü (26.04.1+), disk/RAM minimumu, root yetkisi, internet kontrolü | -| 02 | `02-dealer-id` | No doğrulama + hostname `bf-` atama (K-12) | -| 03 | `03-base-packages` | Temel paketler + `unattended-upgrades` kapatma (K-11) | -| 04 | `04-gnome` | GNOME kurulumu (K-02) | -| 05 | `05-xrdp` | xRDP + sesman + `bf-gui-on/off` yazımı (K-03) | -| 06 | `06-ssh-hardening` | `blueforce` kullanıcısı, key-auth, root/password kapalı (K-13) | -| 07 | `07-wireguard` | Spoke config, peer `bf-`, keepalive 25, `wg-quick@wg0` enable (K-05) | -| 08 | `08-docker` | Docker CE + `unless-stopped` + log rotasyonu + localhost-bind (K-10) | -| 09 | `09-meg` | MEG konteyneri (sabit tag, `latest` yok) (K-10) | -| 10 | `10-rustdesk` | RustDesk istemci + VDS adresi + `BF-` etiketi (K-04) | -| 11 | `11-meshcentral` | MeshCentral agent + `BF-` adı (K-04) | -| 12 | `12-monitoring` | Node Exporter + textfile + Uptime Push (K-07) | -| 13 | `13-firewall` | UFW profili (SSH/RDP yalnızca WG) (K-05) | -| 14 | `14-inventory` | `bf-hardware-inventory.sh` koşusu, JSON+MD üretimi (02) | -| 15 | `15-logging` | journald + Docker rotasyon + `bf-status/bf-diagnostics` (K-14) | -| 16 | `16-boot` | multi-user default + BIOS notu + servis enable denetimi (K-03) | -| 17 | `17-ansible-bootstrap` | Bootstrap SSH key + ilk pull/Ansible kaydı (K-06/K-13) | -| 18 | `18-final-check` | Tüm kapılar: kimlik, servisler, update-kapalı, Docker politikası, READY damgası | - -4. Idempotency kuralları (her modül için zorunlu): - - Varlık kontrolü önce (`id blueforce`, `dpkg -l`, `systemctl is-enabled`): varsa atla, yoksa kur. - - Dosya yazımları atomik (tmp + rename) ve tekrarlanabilir (aynı girdi → aynı çıktı). - - Anahtar/secret üretimi bir kez (`/var/lib/blueforce/.modül-done` damgası); `--force` olmadan yeniden üretilmez. - - Her modül `/var/log/blueforce-install.log` dosyasına `MODÜL-NO + OK/SKIP/FAIL` satırı yazar. -5. Çıkış kodları: `0` READY, `1` modül hatası (no logda), `2` argüman/format hatası. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Geçersiz no (7/9 hane, harf, boş) | exit 2, kurulum başlamaz | LAB(2) | -| Her modülün çift-koşusu | İkinci koşu exit 0, durum değişmez (diff boş) | LAB(2) | -| Elektrik-kesintisi simülasyonu (modül 09 ortasında kill) | `--from 09` ile tamamlanır, final exit 0 | LAB(2) | -| `18-final-check` tüm kapıları | Eksik adımda FAIL + modül nosu, READY yok | LAB(2) | -| `--check` kuru koşusu | Değişiklik yapmaz, rapor üretir | P1(5) | - -## 11. Rollback - -1. Modül hatası: logdaki modül nosundan `--from ` ile devam edilir. -2. Yanlış no: doğru no ile tam yeniden koşu (idempotent, kimlik modülü üzerine yazar). -3. Düzelmeyen cihaz: 17-RECOVERY LEVEL 9 (temiz imaj + kurucu). - -## 12. Kontrol Listesi - -- [ ] 18 modül dosyası `scripts/install/` altında numaralı ve çalışır durumda. -- [ ] Her modülde varlık-kontrolü + damga + log satırı var. -- [ ] Format regex'i 02 ile aynı (`^[0-9]{8}$`). -- [ ] `18-final-check` K-10/K-11 kapılarını denetliyor (unless-stopped, latest yok, update kapalı). -- [ ] `--check/--from/--only` bayrakları çalışıyor. - -## 13. Açık Sorular - -- [ ] Kurucu USB'de mi, merkezden `curl` ile mi alınacak (saha interneti varsayımı) (sahibi: Faz 3, 04 yazarı ile ortak). -- [ ] MEG sabit tag'inin kim tarafından, hangi onay ile güncelleneceği (sahibi: 10-UPDATE / 12-DOCKER yazarları). - ---- - -## Ek: Kurucu Akış - -```mermaid -flowchart TB - CMD["sudo ./blueforce-install.sh
    --dealer-id <8hane>"] --> FMT{"^[0-9]8$ ?"} - FMT -->|Hayır| EXIT2["exit 2
    kullanım mesajı"] - FMT -->|Evet| M01["01-precheck … 17-bootstrap
    (idempotent modüller)"] - M01 --> M18["18-final-check"] - M18 -->|Tümü OK| READY["READY damgası
    bf-status yeşil"] - M18 -->|FAIL| LOG["modül nosu + log yolu
    --from ile devam"] -``` -
    - # 06 — Kullanıcılar, SSH ve Yetkiler @@ -5476,307 +15221,6 @@ flowchart LR ``` - -# 07 — Uzaktan Erişim (4 Kanal) - -> Kısa özet: Saha cihazlarına 4 bağımsız erişim kanalı: SSH-over-WireGuard, xRDP + GNOME, RustDesk OSS self-hosted (birincil grafik), MeshCentral self-hosted (ikincil yönetim). AnyDesk mimariden çıkarılmıştır; yalnızca müşteri sahasında zaten lisanslıysa opsiyonel modül olarak kurulur. - -- Dosya: `docs/07-REMOTE-ACCESS.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-04` (4 kanal + AnyDesk hükmü), `K-03` (xRDP + bf-gui), `K-05` (WireGuard arkası), `K-02` (GNOME) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -WireGuard çökse bile sahaya erişimi sürdürecek yedekli uzak-erişim mimarisini sabitlemek: hangi kanal ne için kullanılır, hangisi hangi arızada ayakta kalır, AnyDesk neden yoktur. - -## 2. Kapsam - -- Kapsam içi: 4 kanalın rolü/kurulumu/boot davranışı, WG-çöküşü analizi, AnyDesk hükmü + opsiyonel modül notu, kanal seçim matrisi. -- Kapsam dışı: WireGuard tünel kurulumu (08), SSH anahtar politikası (06), filo otomasyonu (09). - -## 3. Kararlar - -```text -KARAR: Dört erişim kanalı: (1) SSH-over-WireGuard (yönetim/otomasyon), (2) xRDP + GNOME (grafik bakım), (3) RustDesk OSS self-hosted hbbs/hbbr (birincil grafik uzak erişim, WireGuard-bağımsız), (4) MeshCentral self-hosted (ikincil yönetim: terminal/dosya/envanter, WireGuard-bağımsız). AnyDesk mimariden ÇIKARILDI. -GEREKÇE: RustDesk OSS sınırsız istemci, kendi ID+röle altyapısı, E2E şifreli oturum, dosya transferi ve katılımsız erişimi ücretsiz verir; istemcide VDS genel adresi kullanıldığında WireGuard çökse bile kanal ayakta kalır. MeshCentral Apache-2.0 ile ikinci bağımsız düzlemi sağlar. AnyDesk ücretsiz sürümü yalnızca kişisel kullanımı kapsar; 700 kurumsal cihaz ticari kullanımdır ve lisanssız kullanım ihlal olur. -ALTERNATİF: AnyDesk (lisans maliyeti + kapalı kaynak + self-hosted yalnızca en üst planda → elendi; yalnızca müşteri sahasında zaten lisanslıysa opsiyonel installer modülü). Tailscale/ZeroTier (freemium, merkezi kimlik → elendi). -RİSK: İki VDS-bağımlı kanalın tek ortak noktası VDS + genel internet; azaltma: hbbs/hbbr + MeshCentral health monitörü (Uptime Kuma) + yedek VDS planı 17-RECOVERY'de. -MALİYET: Ücretsiz (kendi VDS'i üzerinde; VDS kira bedeli hariç — altyapı maliyeti, lisans değil). -LİSANS: RustDesk istemci+sunucu AGPL-3.0 (1.4.9 / 1.1.16) — https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ + https://rustdesk.com/docs/en/self-host/client-deployment/ (doğrulanma: 2026-09-15); MeshCentral Apache-2.0 (1.2.5) — https://github.com/Ylianst/MeshCentral (doğrulanma: 2026-09-15); AnyDesk hükmü — https://support.anydesk.com/docs/anydesk-licenses.md (doğrulanma: 2026-09-15) + https://anydesk.com/en/pricing. -``` - -```text -KARAR: xRDP grafik bakımı verir (GNOME oturumu), yalnızca WireGuard arkasında dinler; GUI varsayılan kapalıdır, bakım penceresinde `bf-gui-on` ile açılır. -GEREKÇE: xRDP systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerinden yönetilebilir bir katmandır; WG-arkası dinleme RDP'yi internet taramasından gizler, kapalı GUI varsayılanı RAM'i korur. -ALTERNATİF: RDP'yi doğrudan internete açma — tarama + kaba-kuvvet riski nedeniyle elendi. -RİSK: Kesin birim adları ve GNOME oturum satırı 26.04.1'de değişebilir; azaltma: LAB doğrulaması olmadan `bf-gui-*` dondurulmaz (03). -MALİYET: Ücretsiz. -LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15). -``` - -```text -KARAR: Dört kanalın agent/servisleri boot'ta otomatik başlar (systemd enable): `wg-quick@wg0`, `rustdesk` katılımsız servis, MeshCentral agent, xRDP servisleri (GUI kapalı olsa da sesman hazır). -GEREKÇE: Elektrik kesintisi sonrası cihaz açılınca VPN + yedek kanallar kendiliğinden gelir; 16-POWER-LOSS boot zincirinin varsayımıdır. -ALTERNATİF: Manuel başlatma — 700 dokunulmaz cihazda her kesintide saha ziyareti demek → elendi. -RİSK: Boot race (agent ağdan önce kalkar); azaltma: systemd `After=network-online.target` + yeniden deneme, LAB güç-kesinti testiyle doğrulanır. -MALİYET: Ücretsiz. -LİSANS: Yok (OS yapılandırması). -``` - -## 4. Neden Bu Karar? - -Tek tünel körlüğü engellenir: SSH ve RDP WireGuard'a bağımlıdır (güvenlik için), RustDesk ve MeshCentral ise VDS genel adresine doğrudan çıkar (erişilebilirlik için). RustDesk birincil grafiktir çünkü katılımsız erişim + dosya transferini OSS'te verir; MeshCentral ikinci düzlemdir çünkü terminal/dosya/envanter sunar ve RustDesk arızasında devreye girer. AnyDesk'in ücretsiz katmanı ticari kullanımı kapsamadığı için 700 cihazda lisans ihlali doğurur — bu hukuki risk teknik kolaylığa ağır basar. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| AnyDesk (ücretsiz) | Tanınmış, kolay | Ticari kullanımda lisans ihlali | Elendi | -| AnyDesk (lisanslı) | Kurumsal destek | 700 cihaz lisans bedeli + kapalı kaynak | Opsiyonel modül (bkz. §9) | -| Tailscale/ZeroTier | Kolay mesh | Freemium, merkezi kimlik | Elendi | -| Tek kanal (yalnızca SSH) | En sade | Tünel çökerse körlük | Elendi | -| VNC doğrudan | Basit | Şifresiz/zayıf varyantlar, WG-dışı risk | Elendi | - -## 6. Avantajlar - -- WireGuard çökse bile 2 kanal (RustDesk, MeshCentral) ayakta — filo kör kalmaz. -- Tüm kanallar ücretsiz/self-hosted; veri üçüncü parti buluta çıkmaz. -- Kanal başına rol ayrımı (otomasyon / grafik bakım / grafik erişim / envanter) runbook'ları sadeleştirir. - -## 7. Dezavantajlar - -- 4 kanal = 4 agent/servis bakımı, 4 izleme hedefi (14-MONITORING'e yük). -- RustDesk + MeshCentral aynı VDS'teyse ortak arıza noktası (yedek VDS planı gerekir). -- Teknisyenin hangi kanalı ne zaman kullanacağı eğitim gerektirir (kanal matrisi §9). - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| WireGuard çöküşü (istemci/saha tarafı) | Orta | Orta | RustDesk/MeshCentral bağımsız kanallar (§9 analizi) | -| VDS kesintisi (hbbs+hbbr+MeshCentral) | Düşük | Yüksek | Health monitörü + yedek VDS planı (17) | -| RustDesk ID çakışması / key sızıntısı | Düşük | Orta | Self-hosted key, `bf-` etiketi, key rotasyon prosedürü | -| xRDP + GNOME ek ayar ihtiyacı (26.04.1) | Orta | Orta | LAB'da `bf-gui-*` doğrulaması (03) | - -## 9. Uygulama Planı - -1. Merkez VDS: `hbbs`/`hbbr` (`--net=host` önerilir) + MeshCentral kurulumu, health monitörü (Uptime Kuma) bağlanır. -2. Golden image: RustDesk istemcisi (self-hosted key + VDS adresi gömülü) + MeshCentral agent + xRDP kurulu gelir; dördü de systemd enable. -3. Cihaz kimliği (`bf-`, 02) RustDesk etiketi + MeshCentral adı + Ansible inventory adı olarak aynı yazılır. -4. Opsiyonel AnyDesk modülü: SADECE müşterinin sahasında geçerli ticari AnyDesk lisansı varsa, `blueforce-install.sh --with-anydesk` bayrağıyla kurulur; lisans anahtarı müşteri tarafından sağlanır, AMC lisans sağlamaz. Lisanssız cihaza kurulmaz. - -```bash -# örnek: kanal durum denetimi (saha cihazında) -systemctl is-active wg-quick@wg0 xrdp rustdesk meshcentral 2>/dev/null -ss -tlnp | grep -E ':(22|3389)' # yalnızca WG arayüzünde dinlemeli -``` - -### Kanal seçim matrisi - -| Durum | Kullanılacak kanal | -|---|---| -| Normal bakım (komut/config) | SSH-over-WireGuard | -| Grafik bakım (teknisyen) | xRDP + GNOME (WG üzerinden) | -| WireGuard çöktü, grafik lazım | RustDesk OSS (birincil yedek) | -| WireGuard + RustDesk çöktü | MeshCentral terminal/dosya | -| Otomasyon (filo) | Ansible-over-SSH (09), kanal değil araç | - -### WG çökerse RustDesk analizi - -RustDesk istemcisi tünele değil VDS genel adresine (`hbbs`/`hbbr` portları) doğrudan internetten çıkar; WireGuard arayüzü down olsa bile `eth0/wlan0` üzerinden röle/ID sunucusuna ulaşır. Bu bağımsızlığın iki önkoşulu vardır: (1) saha interneti ayaktadır (elektrik + ISS), (2) VDS ayaktadır. İkisi de varsa teknisyen RustDesk'ten girip `wg-quick@wg0`'ı onarır — yani RustDesk hem yedek kanal hem WG kurtarma aracıdır. Tek ortak arıza: saha internet kesintisi (o zaman hiçbir uzaktan kanal çalışmaz, 16/17 prosedürleri) veya VDS kesintisi (o zaman MeshCentral da gider; yedek VDS planı 17'de). - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| 4 kanalın normal durumda erişilebilirliği | Tümü OK | LAB(2) | -| `wg-quick@wg0` stop → RustDesk oturumu | Bağlantı kurulur | LAB(2) | -| WG down + RustDesk kapalı → MeshCentral terminal | Komut çalışır | P1(5) | -| Güç kesintisi → 4 kanalın otomatik dönüşü | Tümü 5 dk içinde OK | LAB(2) | -| RDP portu internetten tarama | Kapalı (yalnızca WG) | LAB(2) | - -## 11. Rollback - -1. Arızalı kanalın önceki agent sürümüne dönüşü 10-UPDATE dalga zinciriyle yapılır. -2. RustDesk key değişikliğinde eski key geçiş süresi boyunca tutulur, sonra iptal edilir. -3. Son çare: kanal agent'ı kaldırılıp kalan 3 kanalla işletim sürdürülür (17-RECOVERY). - -## 12. Kontrol Listesi - -- [ ] hbbs/hbbr + MeshCentral VDS'te ayakta, Uptime Kuma izliyor. -- [ ] 4 servisin tamamı boot-enable, güç-kesinti testinden geçti. -- [ ] SSH/RDP yalnızca WG arayüzünde dinliyor. -- [ ] RustDesk etiketleri `bf-` ile eşleşiyor. -- [ ] AnyDesk hiçbir lisanssız cihaza kurulu değil. - -## 13. Açık Sorular - -- [ ] hbbs/hbbr ile MeshCentral aynı VDS'te mi, ayrı mı — yük testiyle karar (sahibi: 25-ROADMAP). -- [ ] RustDesk self-hosted key rotasyon sıklığı (sahibi: 11-SECURITY yazarı). - ---- - -## Ek: Mermaid — kanal bağımsızlığı - -```mermaid -flowchart LR - PC["Saha bf-"] -->|WG tüneli| WG["WireGuard hub"] - WG --> SSH["SSH / Ansible"] - WG --> RDP["xRDP + GNOME"] - PC -->|doğrudan internet
    VDS genel adresi| RD["RustDesk hbbs/hbbr"] - PC -->|doğrudan internet
    VDS genel adresi| MC["MeshCentral"] - WG -.->|çökerse| DOWN{"WG down?"} - DOWN -->|evet| RD - DOWN -->|evet| MC -``` -
    - - -# 08 — WireGuard Ağı ve Network - -> Kısa özet: Hub-spoke WireGuard topolojisi: merkez hub, her saha cihazı `bf-<8hane>` peer'ı, `PersistentKeepalive = 25`, boot'ta otomatik tünel. SSH/RDP yalnızca tünel içinden erişilir; saha internetindeki Turkcell paket bitimi/dönüşü etkileri bu dosyadadır. - -- Dosya: `docs/08-WIREGUARD-AND-NETWORK.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-05` (hub-spoke + keepalive + otomatik reconnect), `K-12` (peer adı = cihaz kimliği), `K-04` (WG çökerse yedek kanallar) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -700 cihazlık VPN topolojisini, peer adlandırma sözleşmesini, NAT arkasında tüneli ayakta tutan keepalive değerini ve saha interneti (Turkcell mobil veri) gerçekleriyle başa çıkma planını sabitlemek. - -## 2. Kapsam - -- Kapsam içi: hub-spoke topoloji, peer = bayi ID eşleşmesi, keepalive, `wg-quick@wg0` otostart, subnet/IP planı, SSH/RDP'nin WG-arkası kuralı, Turkcell paket bitimi/dönüşü notu. -- Kapsam dışı: SSH anahtar politikası (06), RustDesk/MeshCentral kurulumu (07), firewall detayları (11). - -## 3. Kararlar - -```text -KARAR: Hub-spoke WireGuard: merkez sunucu hub, her saha cihazı spoke (peer adı = `bf-<8hane>`); istemcide `PersistentKeepalive = 25` + `wg-quick@wg0` systemd enable; RDP/SSH dış dünyaya kapalı, yalnızca WireGuard arkasında. -GEREKÇE: Resmi QuickStart NAT arkasındaki eş için 25 sn keepalive'i "geniş güvenlik-duvarı yelpazesiyle çalışan makul aralık" olarak verir; `wg-quick@.service` Ubuntu paketinden gelir, enable = açılışta otomatik VPN. Elektrik kesintisi sonrası cihaz açılınca VPN kendiliğinden gelir. -ALTERNATİF: Keepalive kapalı / agresif 10 sn — kapalı NAT eşlemesini düşürür, agresif değer saha verisi olmadan yazılmaz; PİLOT-1 kopma sayacına göre ayarlanır. -RİSK: Turkcell CGNAT davranışı resmi kaynaktan doğrulanamaz (operatör bilgisi); azaltma: PİLOT-1'de 7/24 kopma sayacı, aralık saha verisiyle ayarlanır. -MALİYET: Ücretsiz. -LİSANS: WireGuard OSS (Ubuntu paketi `wireguard-tools 1.0.20250521-1ubuntu1`) — https://www.wireguard.com/quickstart/ + https://packages.ubuntu.com/resolute/wireguard-tools (doğrulanma: 2026-09-15). -``` - -```text -KARAR: Her WireGuard peer adı cihaz kimliğine eşittir (`bf-<8hane>` = hostname = Ansible inventory adı = monitoring etiketi); hub tarafında peer başına sabit tünel IP'si atanır. -GEREKÇE: Tek kimlik (K-12) 9 sistemde join anahtarıdır; peer adı farklı olsaydı WG log'undan cihaz bulmak manuel eşleştirme gerektirirdi. Sabit IP = envanterde `bf- → 10.x` haritası, runbook ve monitoring sorguları deterministik olur. -ALTERNATİF: Rastgele peer adı / dinamik IP — okunamaz, izlenemez → elendi. -RİSK: Bayi no değişirse peer yeniden adlandırılmalı; azaltma: 02-NAMING yeniden-no prosedürü. -MALİYET: Ücretsiz. -LİSANS: Yok (isimlendirme standardı). -``` - -## 4. Neden Bu Karar? - -Saha cihazları NAT/CGNAT arkasındadır; merkez onlara ulaşamaz, onlar merkeze çıkar. Hub-spoke bu gerçeğe uyar: spoke keepalive ile NAT eşlemesini canlı tutar, hub yalnızca dinler. 25 sn, resmi dokümanın "makul aralık" değeridir — saha ölçümü olmadan daha agresif yazmak veri israfı, kapatmak kopma demektir. Peer = bayi ID kuralı, 700 peer'lı hub config'ini insan tarafından okunabilir tutar. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Keepalive kapalı | Az trafik | NAT eşlemesi düşer, tünel ölür | Elendi | -| Keepalive 10 sn | Daha canlı eşleme | Saha verisi olmadan veri israfı | Yedek (PİLOT-1 verisine göre) | -| Full-mesh | Spoke'lar arası doğrudan | 700 cihazda key/config patlaması | Elendi | -| Tailscale/ZeroTier | Kolay | Freemium, merkezi kimlik | Elendi (K-04) | - -## 6. Avantajlar - -- Kernel-seviyesi VPN: düşük CPU, düşük gecikme, mini PC dostu. -- Otostart: elektrik kesintisi sonrası teknisyen müdahalesi gerekmez. -- Sabit IP + peer adı = monitoring ve Ansible'da doğrudan adresleme. - -## 7. Dezavantajlar - -- Hub tek darboğaz: 700 eşin handshake + trafiği tek VDS'ten geçer (yük testi gerekir). -- CGNAT davranışları (özellikle mobil) resmi kaynaktan doğrulanamaz; ayar saha verisine bağımlıdır. -- Peer ekleme/çıkarma merkez config'inde yapılır; otomasyonsuz 700 peer yönetilemez (09'a bağımlılık). - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Turkcell CGNAT NAT eşlemesini erken düşürür | Orta | Orta | PİLOT-1 7/24 kopma sayacı; aralık saha verisiyle ayarlanır | -| Turkcell paket bitimi → veri durur | Orta | Yüksek | Paket izleme + bitim alarmı (bkz. §9); kota-dostu keepalive | -| Hub VDS darboğazı (700 eş) | Orta | Yüksek | Yük testi + peer başına trafik limiti; gerekirse 2. hub | -| Peer private key sızıntısı | Düşük | Orta | Peer bazlı iptal (tek peer silinir, filo etkilenmez) | - -## 9. Uygulama Planı - -1. Merkez hub kurulur, subnet planı dondurulur (ör. `10.8.0.0/16`, hub `10.8.0.1`, cihazlara sabit `/32`). -2. Her cihaz için peer üretilir: adı `bf-<8hane>`, tünel IP'si envanter haritasından. -3. İstemci config'i (`/etc/wireguard/wg0.conf`): hub endpoint + `PersistentKeepalive = 25` + `wg-quick@wg0 enable`. -4. Peer ekleme/çıkarma Ansible rolüyle yapılır (09); hub config'i Git'te sürümlenir. -5. PİLOT-1'de kopma sayacı koşar (handshake yaşı metriği 14'te), keepalive saha verisiyle ayarlanır. - -```bash -# örnek: istemci konfigürasyonu (değerler envanterden gelir) -# /etc/wireguard/wg0.conf -# [Interface] PrivateKey = / Address = 10.8.0.15/32 -# [Peer] PublicKey = / Endpoint = :51820 -# PersistentKeepalive = 25 / AllowedIPs = 10.8.0.0/16 - -sudo systemctl enable --now wg-quick@wg0 -sudo wg show wg0 latest-handshakes # kopma sayacı girdisi -``` - -### Turkcell paket bitimi / dönüşü notu - -Saha bağlantısı Turkcell mobil veri ise iki gerçek vardır: (1) hat CGNAT arkasındadır — merkez cihaza ulaşamaz, keepalive'lı giden tünel zorunludur; (2) kota bitiminde veri durur veya hız düşer — tünel sessizce ölür, cihaz "çevrimdışı" görünür ama arıza değildir. Önlemler: kota-dostu keepalive (25 sn varsayılan, PİLOT verisiyle ayarlanır; gereksiz agresif değer kotayı eritir), paket bitimine Uptime Kuma "last seen" alarmı + sorumlu bayiye bildirim akışı (14), kota dönüşünde tünelin kendiliğinden toparlanması (`wg-quick` + keepalive yeniden handshake eder, ek işlem gerekmez). Paket yenileme/dönüş prosedürü (hat sahibi, yenileme adımı) 18-ROLLOUT runbook'una yazılır — bu dosya yalnızca teknik davranışı sabitler. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Boot sonrası `wg show` handshake | 3 dk içinde güncel handshake | LAB(2) | -| NAT arkasında 24 saat tünel | Kopma yok (sayaç temiz) | P1(5) | -| Kota simülasyonu (veri kes) → geri ver | Tünel kendiliğinden toparlanır | LAB(2) | -| SSH/RDP internetten tarama | Kapalı; yalnızca `10.8.0.0/16` içinden açık | LAB(2) | -| 700 eş yük projeksiyonu | Hub CPU/bant genişliği sınırlar içinde | Yük testi | - -## 11. Rollback - -1. Hatalı hub config'i Git'teki önceki sürüme döndürülür, `systemctl reload wg-quick@wg0`. -2. Keepalive değişikliği sorun çıkarırsa önceki değere Ansible ile toplu dönüş (10-UPDATE dalga sırası). -3. Son çare: WG down iken RustDesk/MeshCentral (07) ile cihaza girilip config elle düzeltilir. - -## 12. Kontrol Listesi - -- [ ] Peer adları `bf-<8hane>` ile birebir, envanterle eşleşiyor. -- [ ] Tüm istemcilerde `PersistentKeepalive = 25` (veya PİLOT-onaylı değer). -- [ ] `wg-quick@wg0` tüm sahada enable. -- [ ] SSH/RDP yalnızca WG arayüzünde dinliyor. -- [ ] PİLOT-1 kopma sayacı koşuyor, sonuç 24-DECISION-LOG'a işlenecek. - -## 13. Açık Sorular - -- [ ] Keepalive'ın PİLOT-1 verisine göre 25 sn'de kalıp kalmayacağı (sahibi: 08 yazarı, P1 sonrası). -- [ ] Hub'un 700 eşi tek VDS'te taşıyıp taşımayacağı — yük testi (sahibi: 25-ROADMAP). -- [ ] Turkcell kota/bitim prosedürünün işletme sahibi (sahibi: 18-ROLLOUT yazarı). - ---- - -## Ek: Mermaid — hub-spoke + keepalive - -```mermaid -flowchart TB - subgraph SAHA["Saha (NAT/CGNAT arkası)"] - S1["bf-12010193
    10.8.0.15"] - S2["bf-12010194
    10.8.0.16"] - end - HUB["WireGuard hub
    10.8.0.1:51820"] - S1 -->|handshake + keepalive 25sn
    giden bağlantı| HUB - S2 -->|handshake + keepalive 25sn
    giden bağlantı| HUB - HUB -->|SSH/RDP yalnızca
    tünel içi| S1 -``` -
    - # 09 — Filo Yönetimi (Ansible + Semaphore) @@ -6592,202 +16036,6 @@ flowchart LR ``` - -# 14 — İzleme ve Sağlık (Monitoring & Health) - -> Kısa özet: 17 metrik + Prometheus/Node Exporter/Grafana OSS + Uptime Kuma + `bf-status`/`bf-diagnostics`/`bf-support-bundle` sözleşmeleri. Monitoring operatörü ve saha teknisyeni içindir. -> -> - Dosya: `docs/14-MONITORING-AND-HEALTH.md` -> - İlgili kararlar: `24-DECISION-LOG.md#K-07`, `#K-14` -> - Durum: [ ] Taslak - ---- - -## 1. Amaç - -700 cihazda "hangisi ölü, hangisi hasta, hangisi sağlıklı" sorusuna iki perdede cevap: mühendis için metrik (Prometheus), teknisyen için UP/DOWN + last-seen (Uptime Kuma). - -## 2. Kapsam - -- Kapsam içi: 17 metrik listesi, Prometheus/Node Exporter/Grafana OSS/Uptime Kuma rolleri, scrape/retention ilkeleri, 3 saha komutu sözleşmesi. -- Kapsam dışı: log içerik politikası (15), alarm bildirim hedefleri detayı (kurulum dokümanına havale), merkez donanım siparişi. - -## 3. Kararlar - -```text -KARAR: Birincil metrik yığını Prometheus + Node Exporter + Grafana OSS'tir; 17 metriğin tamamı burada toplanır. -GEREKÇE: 17 metriğin tamamı yalnızca bu yığında ücretsiz ve kotasız toplanır (WireGuard/Docker/MEG sağlığı textfile collector ile). -ALTERNATİF: Netdata Cloud — Free 5 node kotası 700 cihazda ücrete düşer, elendi. Yalnızca Kuma — metrik körlüğü, elendi. -RİSK: 700 node kardinalite/saklama yükü; azaltma: 60 sn scrape, 30–90 gün retention, `BF-` etiket şeması. -MALİYET: Ücretsiz. -LİSANS: Prometheus/Node Exporter Apache-2.0 — https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/ (2026-09-15); Grafana OSS AGPL-3.0 — https://grafana.com/oss/ (2026-09-15). -``` - -```text -KARAR: Tamamlayıcı olarak Uptime Kuma: saha-teknisyeni dostu UP/DOWN panosu + Push "last seen" + bildirimler. -GEREKÇE: Metrik bilmeyen teknisyene en basit çevrimdışı alarmını verir (20 sn aralık, 90+ bildirim servisi, tek konteyner). -ALTERNATİF: Yalnızca Grafana alarmı — teknisyen için karmaşık, elendi. -RİSK: Kuma metrik vermez; azaltma: Prometheus ile birlikte koşar, rol çakışması yok. -MALİYET: Ücretsiz. -LİSANS: Uptime Kuma MIT — https://github.com/louislam/uptime-kuma (2026-09-15). -``` - -```text -KARAR: Özel metrikler (WireGuard handshake, Docker, MEG) Node Exporter textfile collector `.prom` dosyalarıyla verilir. -GEREKÇE: Standart Prometheus yolu; özel exporter yazma yükü yok. -ALTERNATİF: Özel exporter geliştirme — bakım yükü, elendi. -RİSK: `.prom` yazım hatası scrape'i bozar; azaltma: cron/systemd timer çıktısı atomik yazılır. -MALİYET: Ücretsiz. -LİSANS: Node Exporter Apache-2.0 — https://github.com/prometheus/node_exporter (2026-09-15). -``` - -```text -KARAR: Saha sağlık sözleşmeleri: `bf-status` (hızlı bakış), `bf-diagnostics` (derin tanı), `bf-support-bundle` (secret sızdırmaz paket). -GEREKÇE: 700 dokunulmaz cihazda logsuz metrik kör, metriksiz log sağırdır; bundle secret dışlama kuralıyla güvenli uzaktan tanı sağlar. -ALTERNATİF: Harici log platformu (Loki/ELK) ilk fazda — ek servis yükü, elendi (Faz-sonrası hedef). -RİSK: Bundle'a secret kaçması; azaltma: dışlama listesi + üreticide maskeleme testi. -MALİYET: Ücretsiz. -LİSANS: systemd-journald / textfile (Apache-2.0) — https://github.com/prometheus/node_exporter (2026-09-15). -``` - -## 4. Neden Bu Karar? - -İki kullanıcı, iki hız: mühendis kök nedeni metrikten bulur, teknisyen kesintiyi Kuma'dan görür. Scrape 60 sn + retention 30–90 gün, 700 node'da merkez yükünü taşınabilir tutar. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Yalnızca Uptime Kuma | Çok kolay | Metrik körlüğü | Elendi | -| Netdata Cloud | Zengin agent | Free 5 node kotası | Elendi | -| Netdata Parent self-hosted | Zengin | Merkezi tasarım yükü + kota riski | Elendi | -| Loki/ELK ilk fazda | Güçlü log | Ek servis yükü, sadelik ihlali | Faz-sonrasına ertelendi | - -## 6. Avantajlar - -- Tamamı ücretsiz ve kotasız; 700 cihaz lisans duvarına çarpmaz. -- Tek kimlik (`BF-`) metrikten loga join anahtarıdır. - -## 7. Dezavantajlar - -- Prometheus 700 node işletme bilgisi ister; retention LAB ölçümü olmadan donanım siparişi verilmemeli. -- Kuma + Prometheus çift kurulum merkezde iki servis demektir. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Kardinalite patlaması | Orta | Orta | 60 sn scrape, etiket disiplini, federasyon hedefi | -| Retention şişmesi | Orta | Orta | 30–90 gün, PİLOT hacim ölçümü | -| Bundle secret sızıntısı | Düşük | Yüksek | Dışlama listesi + maskeleme testi | - -## 9. Uygulama Planı - -1. Merkez: Prometheus + Grafana OSS + Uptime Kuma kurulur. -2. Saha: Node Exporter + textfile cron/timer + Kuma Push kurulur. -3. Etiket şeması `device_id="BF-"` tüm metriklerde uygulanır. -4. `bf-status` / `bf-diagnostics` / `bf-support-bundle` sahaya dağıtılır. - -```bash -# saha: Node Exporter + textfile dizini (örnek) -systemctl enable --now node_exporter -ls /var/lib/node_exporter/textfile/ # *.prom buraya atomik yazılır - -# WireGuard handshake örneği (üretici script özeti) -# wg show wg0 latest-handshakes > /var/lib/node_exporter/textfile/wireguard.prom.tmp \ -# && mv .../wireguard.prom.tmp .../wireguard.prom -``` - -### 17 metrik listesi - -| # | Metrik | Kaynak | Ne için | -|---|---|---|---| -| 1 | `up` | Prometheus scrape | Cihaz scrape edilebilir mi (ölü/diri) | -| 2 | `node_cpu_seconds_total` | Node Exporter | CPU yükü | -| 3 | `node_memory_MemAvailable_bytes` | Node Exporter | RAM baskısı | -| 4 | `node_filesystem_avail_bytes` | Node Exporter | Disk dolumu | -| 5 | `node_load1/5/15` | Node Exporter | Yük ortalaması | -| 6 | `node_network_receive/transmit_bytes_total` | Node Exporter | Ağ trafiği | -| 7 | `node_systemd_unit_state` | Node Exporter (systemd) | Kritik servis ayakta mı | -| 8 | `node_timex_offset_seconds` | Node Exporter | Saat kayması (TLS/WG için kritik) | -| 9 | `node_boot_time_seconds` | Node Exporter | Beklenmedik reboot tespiti | -| 10 | `wireguard_last_handshake_seconds` | textfile | Tünel canlılığı (stale = kopuk) | -| 11 | `wireguard_transfer_bytes` | textfile | Tünel trafiği | -| 12 | `docker_container_running` | textfile | MEG/yan konteyner ayakta mı | -| 13 | `docker_container_restart_count` | textfile | Crash-loop tespiti | -| 14 | `meg_up` | textfile | MEG sağlığı (kabul madde 6 ile aynı kaynaktan) | -| 15 | `meg_last_success_timestamp` | textfile | MEG iş yapıyor mu (stale = takılı) | -| 16 | `unattended_upgrade_active` | textfile | K-11 kilidi delinmiş mi (1 = ihlal) | -| 17 | `kuma_push_last_seen` | Uptime Kuma Push | Teknisyen "last seen" görünümü | - -Scrape: 60 sn. Retention: 30–90 gün (LAB ölçümüyle kesinleşir). - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Scrape + 17 metrik | Grafana panosu dolu | P1(5) | -| WG down simülasyonu | Metrik 10 stale + Kuma DOWN | P1(5) | -| Konteyner kill | Metrik 12/13 alarm | LAB(2) | -| `unattended-upgrade` açma | Metrik 16 = 1 alarm | LAB(2) | -| Kuma Push kesintisi | last-seen bayatlar | P1(5) | - -## 11. Rollback - -1. Bozuk exporter/push, önceki sürüme Ansible ile geri alınır. -2. Prometheus config hatasında önceki config + `promtool check config` ile dönüş. -3. Son çare: monitoring'siz işletim (erişim kanalları bağımsızdır — 01). - -## 12. Kontrol Listesi - -- [ ] 17 metriğin tamamı Grafana'da görünüyor. -- [ ] Kuma UP/DOWN + Push last-seen çalışıyor. -- [ ] Etiket şeması `BF-` tutarlı. -- [ ] Scrape 60 sn, retention 30–90 gün aralığında. - -### `bf-status` örnek çıktısı (16 satır sözleşmesi) - -```text -BF-12010193 2026-09-15 12:00 +03 OK -uptime: 6d 4h 12m | load: 0.31 0.28 0.22 -cpu: 8% | mem: 1.1/3.8G (29%) | disk /: 9.2/28G (33%) -net: wg0 UP, handshake 12s ago | rx 41M tx 18M -docker: daemon UP | meg:1.2.3 running 6d (restarts 0) -meg: UP, last success 40s ago -systemd: docker OK | wg-quick@wg0 OK | xrdp OFF | node_exporter OK -unattended-upgrades: DISABLED (timer masked) -ufw: active, default DENY in | 22/3389 wg0-only -gui: OFF (multi-user) | rdp sessions: 0 -kuma push: OK 30s ago | prometheus scrape: OK 45s ago -rustdesk: online | meshcentral: online -boot: 2026-09-09 07:48 (power-loss recovery OK) -alerts: 0 critical, 1 warning (disk trend) -next: support bundle: bf-support-bundle -``` - -`bf-diagnostics`: yukarıdakinin detaylı sürümü (servis log kuyrukları + `ss` + `df -i` + textfile içerikleri). `bf-support-bundle`: aynı paketin tarball'ı; WireGuard private key, RustDesk şifresi, SSH private key ve `authorized_keys` dışı secret'lar ASLA pakete girmez (üretici maskeleme testinden geçer). - -## 13. Açık Sorular - -- [ ] Prometheus retention/kardinalite hesabı (700 × 60 sn) — LAB ölçümü (sahibi: 14 yazarı). -- [ ] Bildirim hedefleri (SMS/e-posta/webhook) — merkez kurulumunda netleşecek (sahibi: Faz 3). -- [ ] Federasyon gerekip gerekmediği — 700 node ölçümü (sahibi: 14 yazarı). - ---- - -## Ek: Mermaid — Metrik akışı - -```mermaid -flowchart LR - SAHA["Saha bf-
    Node Exporter + textfile"] -->|scrape 60sn| PROM["Prometheus"] - PROM --> GRAF["Grafana OSS"] - SAHA -->|Push last-seen| KUMA["Uptime Kuma"] - KUMA --> TECH["Teknisyen panosu"] - GRAF --> ENG["Mühendis panosu"] - SAHA -->|bf-status| CONSOLE["Saha konsolu"] -``` -
    - # 15 — Loglama (Logging) @@ -6944,165 +16192,6 @@ flowchart LR ``` - -# 16 — Elektrik Kesintisi ve Otomatik Kurtarma - -> Kısa özet: güç geldikten sonra cihazın dokunulmadan işe dönmesi: BIOS ayarı, boot zinciri, systemd bağımlılıkları, kurtarma doğrulaması. Saha ve LAB ekibi içindir. -> -> - Dosya: `docs/16-POWER-LOSS-AND-AUTO-RECOVERY.md` -> - İlgili kararlar: `24-DECISION-LOG.md#K-03`, `#K-05`, `#K-10` -> - Durum: [ ] Taslak - ---- - -## 1. Amaç - -Elektrik kesintisini sıradan olay haline getirmek: güç gelir, cihaz açılır, VPN kurulur, konteynerler kalkar, MEG işe döner — teknisyen dokunmaz. - -## 2. Kapsam - -- Kapsam içi: BIOS güç ayarı, boot hedefi, systemd sıralaması ve bağımlılıkları, kurtarma testi. -- Kapsam dışı: UPS yatırımı, veri yedekleme (17), update rollback (10). - -## 3. Kararlar - -```text -KARAR: BIOS "Restore on AC Power Loss = Power On" tüm sahada standarttır; cihaz terminale (multi-user) boot eder. -GEREKÇE: Güç gelince açılmayan cihaz kurtarma zincirine hiç giremez; terminal boot en düşük kaynakla en öngörülebilir zemindir (K-03). -ALTERNATİF: Grafik boot / manuel açma — kaynak israfı + saha ziyareti, elendi. -RİSK: Heterojen BIOS menülerinde ayar adı farklı olabilir; azaltma: donanım profil başına LAB kaydı. -MALİYET: Ücretsiz. -LİSANS: Yok (donanım ayarı). -``` - -```text -KARAR: Boot zinciri systemd bağımlılıklarıyla sıralanır: network → `wg-quick@wg0` → `docker.service` → MEG/uygulama birimleri → remote/monitoring ajanları. -GEREKÇE: Sırasız boot race üretir (Docker WG'den önce kalkar, MEG ağ bulamaz); `After=`/`Wants=` zinciri her açılışta aynı sırayı garanti eder. -ALTERNATİF: Bağımlılıksız "hepsi enable" — açılışta rastgele sıra, elendi. -RİSK: Birim adları 26.04.1'e göre değişebilir; azaltma: LAB imajında doğrulanmadan dondurulmaz (K-03 riski). -MALİYET: Ücretsiz. -LİSANS: Yok (systemd yapılandırması). -``` - -```text -KARAR: Kurtarma `unless-stopped` + `wg-quick enable` + daemon enable üzerine kurulur; kesinti "manuel stop" sayılmaz. -GEREKÇE: K-10 gereği kesinti sonrası konteynerler kendiliğinden kalkar; K-05 gereği VPN kendiliğinden gelir. Ek kurtarma servisi gerekmez. -ALTERNATİF: Özel kurtarma scripti/cron — hareketli parça artar, elendi. -RİSK: Yanlışlıkla stop edilen kritik konteyner kalkmaz (tasarlanan davranış); azaltma: `bf-status` ile görünürlük. -MALİYET: Ücretsiz. -LİSANS: Docker CE ücretsiz — https://docs.docker.com/engine/containers/start-containers-automatically/ (doğrulanma: 2026-09-15). -``` - -## 4. Neden Bu Karar? - -Kurtarma, ek yazılımla değil sıralamayla çözülür: her katman bir öncekinin hazır olduğuna bakarak kalkar. Sadelik kuralı burada en literally uygulanır — zincirde özel bileşen yok. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| UPS ile kesintiyi önleme | Kesinti yaşanmaz | 700 cihazda donanım maliyeti | Saha kararına bırakıldı (bu dokümanın dışı) | -| Özel kurtarma servisi | Esnek | Ek bakım yükü | Elendi | -| Grafik boot | Teknisyene tanıdık | Kaynak + hata yüzeyi | Elendi | - -## 6. Avantajlar - -- Kurtarma testi tek komutla tekrarlanır (fişi çek / reboot); sonuç deterministiktir. -- Zincirdeki her halka standart systemd mekanizmasıdır, özel bilgi gerektirmez. - -## 7. Dezavantajlar - -- Uzun kesintide saat kayması olabilir; NTP senkronu zincire dahildir ama ilk WG handshake gecikebilir. -- Bozuk diskte (kirli filesystem) boot fsck'e takılabilir; journal + ext4 varsayılanı bu riski küçültür. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Boot race (sıra bozuk) | Orta | Orta | `After=` zinciri + LAB güç testi | -| BIOS ayarı profilde yok | Düşük | Yüksek | Profil başına LAB kaydı | -| Saat kaymasıyla WG/TLS gecikmesi | Orta | Düşük | NTP bekleme + handshake metriği (14) | - -## 9. Uygulama Planı - -1. BIOS güç ayarı profillere işlenir. -2. Boot hedefi multi-user yapılır; GUI kapalı standarttır. -3. systemd bağımlılıkları yazılır, enable zinciri kurulur. -4. Güç kesintisi simülasyonuyla doğrulanır. - -```bash -# boot hedefi (terminal standart) -systemctl set-default multi-user.target -systemctl get-default - -# enable zinciri -systemctl enable wg-quick@wg0 docker node_exporter -# MEG/uygulama birimleri docker sonrası kalkar: -# /etc/systemd/system/meg-app.service.d/override.conf -# [Unit] -# After=docker.service wg-quick@wg0.service network-online.target -# Wants=network-online.target -# [Install] -# WantedBy=multi-user.target - -# zincir denetimi -systemd-analyze critical-chain docker.service -systemd-analyze critical-chain wg-quick@wg0.service -``` - -```bash -# kurtarma doğrulaması (güç testi sonrası) -uptime -s -systemctl is-active wg-quick@wg0 docker -docker ps --format '{{.Names}} {{.Status}}' -bf-status -``` - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Fiş çekme simülasyonu (güç kesintisi) | Müdahalesiz tam zincir kalkar | LAB(2) | -| Reboot sonrası sıra | network → WG → Docker → MEG | LAB(2) | -| Manuel stop + reboot | Durdurulan kalkmaz (tasarlanan) | LAB(2) | -| 10 ardışık güç döngüsü | 10/10 kurtarma | P1(5) | -| WG handshake süresi | Metrik 10 makul aralıkta tazelenir | P1(5) | - -## 11. Rollback - -1. Bozuk bağımlılıkta override dosyası kaldırılır, daemon-reload + reboot ile önceki sıra geri gelir. -2. Boot hedefine takılmada konsoldan `systemctl set-default` düzeltilir. -3. Son çare: golden image yeniden kurulumu (17-RECOVERY LEVEL 9). - -## 12. Kontrol Listesi - -- [ ] BIOS güç ayarı profilde kayıtlı. -- [ ] Boot hedefi multi-user. -- [ ] `wg-quick@wg0`, `docker`, ajanlar enable. -- [ ] `After=` zinciri dosyada ve LAB'da doğrulandı. -- [ ] Güç testi 10/10 geçti (P1). - -## 13. Açık Sorular - -- [ ] Kesin birim adları + GNOME oturum satırı — LAB 26.04.1 imajı (sahibi: Faz 3, 03/04 yazarları). -- [ ] NTP bekleme süresi eşiği — P1 ölçümü (sahibi: 16 yazarı). - ---- - -## Ek: Mermaid — Boot zinciri ve systemd bağımlılıkları - -```mermaid -flowchart TB - PWR["Power ON
    (BIOS Power On)"] --> TGT["multi-user.target
    (terminal boot)"] - TGT --> NET["network-online.target"] - NET --> WG["wg-quick@wg0
    After network-online"] - WG --> DKR["docker.service
    After network"] - DKR --> MEG["MEG / uygulama birimleri
    After docker + wg-quick"] - MEG --> AGT["RustDesk + MeshCentral
    + node_exporter + Kuma Push"] - AGT --> BF["bf-status OK"] -``` -
    - # 17 — Yedekleme, Kurtarma ve Yeniden Kurulum (Backup, Recovery & Reinstall) @@ -7421,518 +16510,6 @@ flowchart LR ``` - -# 19 — Sorun Giderme (Troubleshooting) - -> Kısa özet: Sahada ve merkezde en sık görülen arızaların belirti → neden → komut → çözüm tablosu. 17-RECOVERY "hangi seviye" sorusunu, bu doküman "o seviyede hangi komut" sorusunu cevaplar. - -- Dosya: `docs/19-TROUBLESHOOTING.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-03` (xRDP/GUI), `#K-04` (erişim kanalları), `#K-05` (WireGuard), `#K-10` (Docker), `#K-14` (`bf-status`, support-bundle) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Tekrar eden arızalarda teşhisi hızlandırmak: belirtiyi bulan teknisyen/admin, tabloya bakıp ilk komutu 30 saniyede çalıştırır. Her girdide "ne zaman üst seviyeye çık" notu vardır. - -## 2. Kapsam - -- Kapsam içi: boot, ağ/VPN, SSH, RDP/GUI, RustDesk, MeshCentral, Docker/MEG, disk, monitoring belirti tabloları. -- Kapsam dışı: seviye kararları (17), adım-adım kurulum (20), merkez onay akışı (21). - -## 3. Kararlar - -```text -KARAR: Her arıza girdisi aynı formatta yazılır: Belirti → Olası nedenler (olasılık sırasıyla) → Tanı komutları → Çözüm → Yükseltme kriteri. -GEREKÇE: Standart format, acemi teknisyenin bile doğru sırayla (tanıdan önce çözüm yok) ilerlemesini sağlar; her çözüm denenebilir komutla verilir. -ALTERNATİF: Serbest-anlatım sorun listesi — komutlar dağınık kalır, otomasyona çevrilemez; elendi. -RİSK: Tablo eskirse yanlış yönlendirir; azaltma: her PİLOT dalgası sonrası tablo gözden geçirilir. -MALİYET: Ücretsiz. -LİSANS: Yok. -``` - -## 4. Neden Bu Karar? - -Sorun giderme, kurtarma merdiveninin (17) "içini" doldurur: 17 hangi LEVEL, 19 o LEVEL'de hangi komut. Olasılık sırası önemlidir — en yaygın neden önce yazılır, teknisyen zamanı boşa harcanmaz. Yükseltme kriteri her girdinin sigortasıdır (inatla aynı komutu tekrarlamak yasak). - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Harici bilgi tabanı (Wiki araması) | Aranabilir | Çevrimdışı sahada erişilemez, Git akışı yok | Elendi (22'de Docusaurus içinde bu dosya zaten aranabilir) | -| Her arıza için ayrı sayfa | Detaylı | 700 cihazda 100 sayfa yönetilemez | Elendi (gerekirse Ek'e taşınır) | - -## 6. Avantajlar - -- Tek dosya, çevrimdışı da okunur (USB'de veya basılı). -- Komutlar kopyala-yapıştırılabilir; açıklamalar Türkçe, komut adları İngilizce orijinal. - -## 7. Dezavantajlar - -- 26.04.1'e özgü çıktı farkları LAB'da güncellenmelidir (kesin servis adları, log yolları). -- MEG'e özgü arızalar 13-MEG-ACCEPTANCE'tan beslenmelidir; bu dosya iskelettir. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Eski komut (servis adı değişti) | Orta | Orta | LAB'da her komut çalıştırılıp doğrulanır | -| Secret'lı komut geçmişe düşer | Düşük | Yüksek | Support-bundle kuralı (K-14); komutlarda secret yazılmaz | - -## 9. Uygulama Planı - -Önce genel tanı (her arızada ilk 60 saniye): - -```bash -bf-status -systemctl --failed -ip -brief addr; ip route show default -wg show wg0 2>&1 | head -20 -docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.RestartPolicy}}' -df -h / /var/lib/docker | cat -``` - -### T-1 — Cihaz açılmıyor / ekranda hiçbir şey yok - -| # | Neden (olasılık sırası) | Tanı | Çözüm | -|---|---|---|---| -| 1 | Elektrik yok / BIOS güç ayarı | Priz, adaptör, güç LED'i | BIOS "Restore on AC Power Loss = Power On" (16) | -| 2 | Monitör/kablo | Başka kablo/ekran dene | Değiştir | -| 3 | Disk ölmüş | BIOS diski görmüyor | Donanım değişimi → L8 yeni diskte | - -Yükseltme: donanım sağlamsa ama OS açılmıyorsa T-2'ye geç. - -### T-2 — Boot terminale düşmüyor / servisler kalkmıyor - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | Failed servis var | `systemctl --failed`, `journalctl -xb -p err` | İlgili servis girdisine git (T-3…T-6) | -| 2 | Disk dolu | `df -h /` | Docker log temizliği + rotasyon kontrolü (T-7) | -| 3 | Bozuk çekirdek/paket | `dpkg --audit`, `apt --fix-broken install` | 17-L7; olmazsa L8 | - -### T-3 — WireGuard tüneli yok (`wg show` boş / handshake eski) - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | Servis inaktif | `systemctl status wg-quick@wg0` | `sudo systemctl enable --now wg-quick@wg0` | -| 2 | Anahtar/config hatası | `journalctl -u wg-quick@wg0 --no-pager`, `wg show wg0 latest-handshakes` | Config'i merkezden yeniden bas (17-L5); peer adı `bf-` mi kontrol et | -| 3 | Saha interneti yok / CGNAT | `ping -c3 8.8.8.8`, modem arayüzü | Yerel ağ düzeltilir; kopma sayacı not edilir (P1 görevi) | -| 4 | Merkez hub down | Başka cihazdan hub'a bak | 17-L9 kolu işletilir | - -Yükseltme: WG kalkmıyorsa RustDesk/MeshCentral ile devam (17-L4); onlar de yoksa saha ziyareti. - -### T-4 — SSH bağlanmıyor (WG ayaktayken) - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | sshd down / anahtar eşleşmiyor | `systemctl status ssh`, `ssh -vvv blueforce@bf-` | Anahtarı merkezden yeniden dağıt (K-13); password denemesi YOK | -| 2 | Yanlış IP/hostname | `ip -brief addr`, envanter karşılaştır | 02-NAMING'e göre düzelt | -| 3 | Güvenlik duvarı | `sudo ufw status`, `ss -tlnp` | 11-HARDENING standardına döndür | - -### T-5 — RDP açılmıyor / siyah ekran / hemen kopuyor - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | GUI katmanı kapalı | `systemctl status display-manager xrdp xrdp-sesman` | `bf-gui-on`, tekrar dene | -| 2 | Oturum çakışması (yerel + RDP aynı kullanıcı) | `who`, `loginctl list-sessions` | Ayrı kullanıcı/oturum; eski oturumu kapat | -| 3 | xRDP config bozulmuş | `journalctl -u xrdp --no-pager` | Bilinen-iyi config'i bas (17-L5) | - -### T-6 — RustDesk bağlanmıyor - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | İstemci servis/uygulama kapalı | RustDesk durumu, ID görünüyor mu | Servisi başlat; ID+röle adresi merkez değerlerle aynı mı | -| 2 | Key uyuşmazlığı | İstemci key vs hbbs key | Merkezi key'i yeniden bas (07-REMOTE-ACCESS) | -| 3 | hbbs/hbbr down | Merkezden konteyner/servis durumu | Merkez tarafını ayağa kaldır; health monitörü (Kuma) ne diyor | - -### T-7 — Docker/MEG kalkmıyor veya sürekli restart - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | Restart loop (config/entrypoint) | `docker ps`, `docker logs --tail 100 ` | Config düzelt + `docker compose up -d` (17-L6) | -| 2 | Disk dolu (rotasyonsuz log) | `df -h /var/lib/docker`, `du -sh /var/lib/docker/containers/*` | `daemon.json` rotasyonu uygula; taşan logu buda | -| 3 | `latest` çekilmiş / sürüm kaymış | `docker images`, compose tag kontrolü | Sabit tag'e döndür (K-10); Watchtower varsa kaldır | -| 4 | Port çakışması / UFW bypass | `ss -tlnp`, `docker port ` | `127.0.0.1`-bind standardına döndür (K-10) | - -### T-8 — Disk doluyor - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | Docker json-file logları | `du -sh /var/lib/docker/containers/*` | Rotasyon + budama, `docker system prune` (dikkatli) | -| 2 | journald şişmiş | `journalctl --disk-usage` | `SystemMaxUse` limiti + `journalctl --vacuum-size=` | -| 3 | Prometheus retention (merkez) | `df -h`, retention ayarı | 30–90 gün bandına çek (K-07) | - -### T-9 — Monitoring'de cihaz gri/kayıp - -| # | Neden | Tanı | Çözüm | -|---|---|---|---| -| 1 | Node Exporter down | `systemctl status node_exporter`, hedef scrape logu | Servisi başlat; textfile dizin izni | -| 2 | Uptime Push gelmiyor | Kuma "last seen" | Cihaz interneti + push job'ı (T-3'e dön) | -| 3 | Etiket yanlış (`BF-`) | Prometheus target etiketleri | Envanterle eşitle (02) | - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Her T girdisindeki ilk tanı komutu LAB'da çalışır | Komut + örnek çıktı bu dosyada | LAB(2) | -| WG-kill → T-3 → L4 onarım tatbikatı | < hedef sürede tünel döner | P1(5) | -| Disk-doldur simülasyonu → T-8 | Alarm + temizlik çalışır | LAB(2) | - -## 11. Rollback - -Yanlış çözüm uygulandıysa 17-L3 (son değişikliği geri alma) işletilir; tanı komutlarının kendisi read-only'dir, rollback gerektirmez. - -## 12. Kontrol Listesi - -- [ ] Her girdide Yükseltme kriteri var. -- [ ] Komutların tamamı LAB 26.04.1 imajında denendi. -- [ ] Hiçbir girdide secret/şifre yazılmıyor. -- [ ] MEG'e özgü satırlar 13 ile çapraz linkli. - -## 13. Açık Sorular - -- [ ] Kesin `bf-gui-*` birim adları + GNOME oturum satırı — LAB çıktısı (sahibi: Faz 3). -- [ ] MEG log hacmi ölçümü → T-8 eşikleri (sahibi: 12-DOCKER yazarı). -- [ ] Turkcell CGNAT tanı notları — P1 verisi (sahibi: 08-WIREGUARD yazarı). - ---- - -## Ek: Triyaj Akışı (hangi T girdisi?) - -```mermaid -flowchart TB - SORUN["Arıza bildirimi
    bf-status + systemctl --failed"] --> ACILIR{"Cihaz açılıyor mu?"} - ACILIR -->|Hayır| T1["T-1: güç / BIOS / disk"] - ACILIR -->|Evet| BOOTOK{"Servisler kalkıyor mu?"} - BOOTOK -->|Hayır| T2["T-2: failed servis / disk dolu"] - BOOTOK -->|Evet| WG{"wg show handshake güncel mi?"} - WG -->|Hayır| T3["T-3: WireGuard + L4 yedek kanal"] - WG -->|Evet| SSH{"SSH oluyor mu?"} - SSH -->|Hayır| T4["T-4: sshd / anahtar / UFW"] - SSH -->|Evet| RDP{"RDP açılıyor mu?"} - RDP -->|Hayır| T5["T-5: bf-gui-on / xRDP"] - RDP -->|Evet| DERIN["T-6+: Docker / MEG / disk (T-7/T-8)"] -``` -
    - - -# 20 — Saha Teknisyeni Runbook - -> Kısa özet: Sahada cihaz başına giden teknisyenin el kitabı. Tek akış: USB'yi tak → kur → bayi numarasını gir → READY'yi gör → çık. Komut ezberi istenmez; her adımda "ne göreceksin, ne yazacaksın" vardır. - -- Dosya: `docs/20-FIELD-TECHNICIAN-RUNBOOK.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-09` (USB → script → bayi no → READY), `#K-12` (bayi no → `BF-`), `#K-14` (`bf-status`, support-bundle) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Teknisyenin sahada tek başına, telefonsuz bile cihazı READY hale getirmesi. Bu dosya "neden" anlatmaz, "ne yap" söyler. Neden merak eden 01'e bakar. - -## 2. Kapsam - -- Kapsam içi: USB ile sıfır kurulum, bayi no girişi, READY kontrolü, arızalı cihazda ilk 3 hareket, merkeze ne zaman telefon açılacağı. -- Kapsam dışı: merkez onayları (21), arıza teşhis tablosu detayı (19 — sadece yönlendirme), update dalgaları (10). - -## 3. Kararlar - -```text -KARAR: Teknisyen akışı 4 adımdır: USB → kur → bayi no → READY. Teknisyen hostname, IP, anahtar, config dosyası ile uğraşmaz; hepsini `blueforce-install.sh` yapar. -GEREKÇE: K-09'un hedef akışı; insan hatası en çok elle config'de olur. Teknisyenin tek manuel girdisi 8 haneli bayi numarasıdır (K-12). -ALTERNATİF: Teknisyene tam Linux eğitimi + manuel kurulum — 700 cihazda standardizasyon bozulur; elendi. -RİSK: Script USB'si eski sürüm kalır; azaltma: USB etiketinde sürüm + merkezden "şu sürümden eski USB'yi kullanma" duyurusu. -MALİYET: Ücretsiz. -LİSANS: Yok. -``` - -## 4. Neden Bu Karar? - -Teknisyenin işi "bilgisayarcılık" değil "bayi cihazını çalışır teslim etmek"tir. Karar, teknisyenin dikkatini tek kritik noktaya toplar: bayi numarasını doğru girmek. Geri kalan her şey script + merkez otomasyonudur. Bu yüzden bu dosya kısa cümlelerle, emir kipiyle yazılır. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Detaylı Linux kılavuzu | Bilgili teknisyen | Uzun, hata açık, herkes okumaz | Elendi | -| Merkezden uzaktan kurulum (teknisyensiz) | Saha maliyeti yok | İlk kurulumda cihazda internet/VPN yok | Elendi (ilk kurulum sahada) | - -## 6. Avantajlar - -- Yeni teknisyen 1 saatlik eğitimle sahaya çıkar. -- Her cihaz aynı adımla kurulur; "ustalık farkı" kapanır. - -## 7. Dezavantajlar - -- Script'in yapmadığını teknisyen de yapamaz; olağandışı durumda merkeze bağımlıdır (bilerek böyle). -- USB medyası fiziksel lojistik ister (sürüm takibi). - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Bayi no yanlış girilir | Orta | Yüksek | Script ekranda `BF-`'yu gösterir, teknisyen bayiye onaylatır | -| Eski USB ile kurulum | Orta | Orta | USB sürüm etiketi + kurucu açılışta sürümü söyler | -| READY görülmeden sahadan çıkılır | Düşük | Yüksek | Kontrol listesi imzalanmadan iş kapanmaz | - -## 9. Uygulama Planı - -### A. Sıfır kurulum (yeni cihaz) — 4 adım - -**ADIM 1 — USB'yi tak, bilgisayarı aç.** - -1. Kurulum USB'sini tak. -2. Bilgisayarı aç, USB'den başlat (açılışta genelde F12/F8/F2 — ekranda yazar). -3. Ubuntu kurulum ekranı gelene kadar bekle. - -> Göreceğin: Ubuntu kurulum ekranı. Bunu görmüyorsan: USB tam takılı mı, BIOS boot sırası USB mi? Olmazsa merkeze telefon aç. - -**ADIM 2 — Ubuntu'yu kur.** - -1. Ekrandaki kurulumu varsayılanlarla tamamla (dil: Türkçe, disk: tamamını kullan). -2. Kurulum bitince USB'yi çıkarma, bilgisayarı yeniden başlat. - -**ADIM 3 — Kurucu scripti çalıştır, bayi numarasını gir.** - -1. Terminali aç, şunu yaz: - -```bash -sudo ./blueforce-install.sh -``` - -2. Script senden **8 haneli bayi numarasını** ister. Faturadaki/sistemdeki numarayı yaz, Enter'a bas. Örnek: `12010193`. -3. Script ekranda şunu gösterecek: - -```text -Device ID: BF-12010193 -Hostname: bf-12010193 -``` - -4. Numarayı bayiye sesli onaylat: "Cihaz numaranız BF-12010193, doğru mu?" Yanlışsa scriptten çık, tekrar çalıştır. - -**ADIM 4 — READY'yi gör, çık.** - -1. Script bitene kadar bekle (kapatma, fişi çekme). -2. Sonunda şunu çalıştır: - -```bash -bf-status -``` - -3. Ekranda **READY** (veya tüm satırlar yeşil/OK) görmelisin. -4. Kontrol listesini doldur (§12), sahadan çık. - -### B. Arızalı cihaza gittin — ilk 3 hareket - -1. `bf-status` çalıştır. Kırmızı satır hangisi? Not al. -2. Bilgisayarı bir kez yeniden başlat. Düzelirse READY'yi gör, çık. -3. Düzelmezse support paketini al, merkeze gönder: - -```bash -bf-support-bundle --out /tmp/bf--bundle.tar.gz -``` - -Paketi merkeze ilet (telefonla nasıl göndereceğin söylenir), merkez sana söylemeden başka komut çalıştırma. - -### C. Merkeze telefon açma kuralları - -Hemen ara: READY alamıyorsan, aynı arıza 2 cihazda üst üste çıktıysa, donanım kırık/yanık kokusu varsa, bayi numarasından emin değilsen. -Arama: cihaz başında ol, `BF-`'yu ve `bf-status` çıktısını hazır tut. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Sıfır teknisyen 4 adımı desteksiz yapar | READY < hedef süre | LAB(2) | -| Yanlış bayi no girilir | Script uyarır, kuruluma devam etmez | LAB(2) | -| Elektrik kesintisi simülasyonu sonrası `bf-status` | READY döner | LAB(2) | - -## 11. Rollback - -Teknisyen rollback yapmaz. Kurulum yarıda kesildiyse: baştan başla (ADIM 1). İkinci denemede de olmazsa merkeze telefon aç — merkez 17-RECOVERY'den seviyeyi seçer. - -## 12. Kontrol Listesi - -- [ ] USB sürümü güncel (etiket + merkez duyurusu eşleşiyor). -- [ ] `BF-` bayiye onaylatıldı. -- [ ] `bf-status` → READY görüldü. -- [ ] Cihaz fişe + internete bağlı bırakıldı. -- [ ] İş formu dolduruldu (bayi no, tarih, teknisyen adı). - -## 13. Açık Sorular - -- [ ] Kurulum USB'sinin dağıtım/sürüm takip yöntemi (sahibi: merkezi admin, 21). -- [ ] İş formu kağıt mı mobil mi (sahibi: 25-ROADMAP). -- [ ] Hedef kurulum süresi (öneri: P2'de ölçülecek). - ---- - -## Ek: Mermaid — teknisyen akışı - -```mermaid -flowchart TB - USB["USB tak → aç"] --> KUR["Ubuntu kur"] - KUR --> SCR["sudo ./blueforce-install.sh"] - SCR --> NO["Bayi no gir
    (8 hane)"] - NO --> ONAY["BF-no'yu bayiye onaylat"] - ONAY --> BEKLE["Script bitsin"] - BEKLE --> READY["bf-status → READY?"] - READY -->|evet| CIK["Formu doldur → çık"] - READY -->|hayır| TEL["Merkeze telefon aç"] -``` -
    - - -# 21 — Merkezi Yönetici Runbook - -> Kısa özet: Merkezdeki yöneticinin el kitabı: hangi işlemi kim onaylar, update'i kim başlatır, dalga kapıları nasıl açılır, teknisyen ne zaman sahaya sürülür. Yetki ve sıra bu dosyadadır. - -- Dosya: `docs/21-CENTRAL-ADMIN-RUNBOOK.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-06` (Ansible/Semaphore), `#K-11` (onay zinciri + dalgalar), `#K-13` (anahtar dağıtımı) -- Durum: [ ] Taslak - ---- - -## 1. Amaç - -Merkezde "kim, neyi, hangi sırayla yapar" sorusunu kapatmak. Update'i kim başlatır, dalgayı kim onaylar, acil durumda kim karar verir — hepsi burada yazar, kriz anında aranmaz. - -## 2. Kapsam - -- Kapsam içi: rol ve onay yetkileri, update başlatma akışı, dalga kapı prosedürü, anahtar/erişim yönetimi, acil durum yetkisi, günlük/haftalık rutinler. -- Kapsam dışı: tek cihaz kurulum adımları (20), komut-seviyesi teşhis (19), kurtarma seviye tablosu (17 — buradan çağrılır). - -## 3. Kararlar - -```text -KARAR: Update'i yalnızca merkezi yönetici başlatır; teknisyen, bayi veya otomatik zamanlayıcı update tetikleyemez. Her dalga geçişi açık onay (Semaphore kapı adımı + kayıt) gerektirir. -GEREKÇE: K-11 "onaysız update yasak" ilkesinin operasyonel karşılığıdır; tek başlatma noktası = denetlenebilirlik. Otomatik tetikleyici olmaması, zamanlanmış sürprizleri engeller. -ALTERNATİF: Takvimli otomatik dalga başlatma — onay kaydı zayıflar, arızada "kim başlattı" belirsizleşir; elendi. -RİSK: Yönetici izindeyken update kilitlenir; azaltma: en az 2 onay yetkilisi tanımlanır (asıl + vekil). -MALİYET: Ücretsiz. -LİSANS: Yok. -``` - -```text -KARAR: Acil güvenlik update'inde dalga sırası atlanamaz ama gözetim süreleri kısaltılabilir; kısaltma kararı ve gerekçesi kayda geçirilir. -GEREKÇE: Sıra atlamak (LAB'ı geçmeden PROD'a çıkmak) filo-çapı riskidir; süre kısaltmak ise bilinçli hızlandırmadır. Kayıt, sonradan denetimi sağlar. -ALTERNATİF: Acilde direkt PROD — geri dönüşü olmayan hata riski; elendi. -RİSK: "Acil" etiketi suistimal edilir; azaltma: acil tanımı (CVSS eşiği / aktif sömürü) 10-UPDATE'ta yazılıdır. -MALİYET: Ücretsiz. -LİSANS: Yok. -``` - -## 4. Neden Bu Karar? - -700 cihazda en tehlikeli cümle "ben başlattım sandım"dır. Başlatma yetkisini tek role toplamak, hem hatayı hem suçu önler: hata olursa kayıttan bulunur, suçlama olursa kayıt konuşur. Vekil kuralı, tek kişiye bağımlılığı kaldırır. - -## 5. Alternatifler - -| Alternatif | Artı | Eksi | Sonuç | -|---|---|---|---| -| Herkes update başlatabilir | Hızlı | Onaysız yayılım, denetimsizlik | Elendi | -| Tam otomatik pipeline | Eforsuz | Politika ihlali (K-11) | Elendi | -| Tek onay yetkilisi | Net | İzin/hastalıkta kilit | Elendi (asıl+vekil) | - -## 6. Avantajlar - -- Her update'in "kim başlattı, kim onayladı, ne zaman" kaydı vardır. -- Acil durumda bile sıra korunur; hız, sıranın içinde ayarlanır. - -## 7. Dezavantajlar - -- Onay adımı update'i yavaşlatır (bilerek; hız 25-ROADMAP'ta acil yoluyla dengelenir). -- Semaphore kapı adımı atlanırsa politika kağıtta kalır — teknik zorunluluk şarttır. - -## 8. Riskler - -| Risk | Olasılık | Etki | Azaltma | -|---|---|---|---| -| Kapı adımı bypass edilir (CLI'dan direkt run) | Orta | Yüksek | Semaphore dışı prod run'ı yasaktır; denetim logu izlenir | -| İki yetkili de ulaşılamaz | Düşük | Orta | Acil iletişim zinciri + önceden tanımlı duraklatma (devam etme, durdur) | -| Anahtar sızıntısı | Düşük | Yüksek | Per-admin anahtar iptali + rotasyon (K-13) | - -## 9. Uygulama Planı - -### Roller - -| Rol | Kim | Yetkisi | -|---|---|---| -| Onay yetkilisi (asıl + vekil) | İsimle tanımlanır | Dalga başlatma/onay, acil kısaltma kararı, L8/L9 kararı | -| Operatör | Merkez ekibi | Onaylanmış job'u çalıştırma, monitoring izleme, teknisyen yönlendirme | -| Teknisyen | Saha ekibi | 20'deki akış; update/dalga başlatamaz | -| İzleyici (read-only) | Yönetim | Panoları görür, işlem yapamaz | - -### Standart update akışı (yönetici gözüyle) - -1. Update talebi gelir (güvenlik bülteni / MEG sürümü / OS yaması) → etki + geri alma planı raporlanır. -2. Onay yetkilisi LAB'ı başlatır: Semaphore'da job + kayıt. -3. LAB çıkış kriteri tuttuysa P1 → P2 → W1 → W2 → PROD, her kapıda açık onay. -4. Herhangi bir dalgada halt kuralı (18) tetiklenirse: yayılım DURUR, 17-L3 işletilir, kök neden bulunmadan kapı açılmaz. -5. PROD bitiminde kapanış kaydı (başarı/arıza sayısı, süre). - -```bash -# örnek: onaylı dalga run (operatör, onay sonrası) -ansible-playbook playbooks/update.yml --limit wave_p1 -# örnek: kapı kontrolü — onaysız PROD engeli (ilke; teknik karşılığı Semaphore'da) -# PROD limiti yalnızca "prod-onay" etiketli job ile koşar -``` - -### Anahtar ve erişim yönetimi - -1. Yeni admin: anahtarı üretilir, `authorized_keys`'e Ansible ile dağıtılır (K-13); eski/ayrılan adminin anahtarı aynı yolla kaldırılır. -2. Paylaşılan tek private key YOKTUR; böyle bir dosya görülürse olay kaydı açılır. -3. Semaphore yalnızca WireGuard arkasından erişilir; gizliler yerleşik şifreli Key Store'dadır (K-06). - -### Günlük / haftalık rutinler - -- Günlük (operatör, 10 dk): Uptime Kuma UP/DOWN, Prometheus `up` == 0 listesi, gece reboot olanlar, yedek job durumu. -- Haftalık (yönetici, 30 dk): dalga takvimi, açık halt'lar, anahtar/envanter uyumsuzlukları, L9 tatbikat sayacı. - -## 10. Test Planı - -| Test | Beklenen sonuç | Ortam | -|---|---|---| -| Onaysız PROD run denemesi | Engellenir + log düşer | Merkez test | -| Semaphore kapalıyken Ansible CLI run | Onaylı iş CLI'dan koşar (K-06) | LAB(2) | -| Vekil ile dalga onayı | Kayıtta vekil adı görünür | Merkez test | - -## 11. Rollback - -1. Hatalı dalga: 17-L3 + 10-UPDATE rollback zinciri; kapı bir sonraki dalgaya kapatılır. -2. Hatalı onay: aynı yetkili (veya vekil) durdurma kararı verir; "devam" kararı verilemez, yalnızca "dur + geri al". - -## 12. Kontrol Listesi - -- [ ] Asıl + vekil isimle tanımlı ve iletişim bilgileri güncel. -- [ ] Semaphore'da PROD kapı adımı teknik olarak zorunlu. -- [ ] Her dalga onayı kayıtlı (kim, ne zaman, hangi sürüm). -- [ ] Ayrılan personelin anahtarı kaldırıldı. - -## 13. Açık Sorular - -- [ ] Acil tanımı eşikleri (CVSS/aktif sömürü) — 10-UPDATE ile ortak onay (sahibi: yönetici). -- [ ] Kapanış raporu formatı ve saklama süresi (sahibi: 25-ROADMAP). -- [ ] Read-only yönetim panosu kapsamı (sahibi: 14-MONITORING yazarı). - ---- - -## Ek: Update Onay Akışı (yönetici gözüyle) - -```mermaid -flowchart TB - TALEP["Update talebi
    (güvenlik / MEG / OS)"] --> KAYIT["Değişiklik kaydı
    kapsam + geri alma planı"] - KAYIT --> ONAY{"Onay yetkilisi
    (asıl veya vekil)"} - ONAY -->|Ret| KAPANIR["Kapanış kaydı (ret)"] - ONAY -->|Onay| LAB["LAB(2) → P1(5) → P2(20)"] - LAB --> KAPI{"Sağlık kapısı temiz mi?"} - KAPI -->|Halt| DUR["Yayılım DURUR → 17-L3 rollback"] - KAPI -->|Temiz| WAVE["W1(50) → W2(100) → PROD(~523)"] - WAVE --> RAPOR["Kapanış kaydı
    (başarı/arıza/süre)"] -``` -
    - # 22 — Dokümantasyon Platformu (Documentation Platform) @@ -8198,500 +16775,41177 @@ flowchart TB ``` - -# 24 — Karar Günlüğü (Decision Log) + +# 26 — Blueforce Field OS ISO -> Kısa özet: Blueforce 700 cihaz Linux filosunun tüm nihai mimari kararları tek tabloda; her karar KARAR/GEREKÇE/ALTERNATİF/RİSK/MALİYET/LİSANS bloğu + resmi kaynak URL ile. Diğer 25 dokümanın başvurduğu kilit dosyadır. +> Kısa özet: Blueforce Field OS, Ubuntu LTS tabanında GNOME katmanı olan saha standardıdır. **Autoinstall kurulum motorudur; Blueforce Field OS ISO ise paketleme/dağıtım yöntemidir** — ikisi rakip değil, birlikte kullanılır (K-20). **V1 kurulum medyası TEK USB Field OS ISO'dur** (medya kökünde `autoinstall.yaml` + offline APT repo + firstboot; `interactive-sections: [storage]` korunur, otomatik disk silme yoktur). Resmi upstream ISO + ayrı NoCloud seed USB, tek yol değil **geri dönüş/fallback yolu** olarak sıcak tutulur (K-15 yedek yol olarak korunur). ISO ilk kez gerçekten üretilmiştir: `dist/Blueforce-Field-OS-1.0.0-amd64.iso` (6 481 917 952 byte, ISO SHA256 `cb0cc56f…d431296`); boot kabulü (UEFI/Legacy/Secure Boot) ve air-gapped kurulum hâlâ LAB işidir. > -> - Dosya: `docs/24-DECISION-LOG.md` -> - İlgili kararlar: bu dosyanın kendisi kilit kaynaktır; `01-ARCHITECTURE.md` bu kararları diyagramlaştırır. -> - Durum: [x] Onaylı (Faz 2 kilidi; değişiklik bu dosyadan PR ile yapılır) -> - Kural: tüm kararlarda FREE sürümler baz alınır; Pro/Enterprise zorunlu mimariye girmez. -> - Doğrulama günü: 2026-09-15 (tüm URL'ler bu tarihte HTTP 200 ile çekildi; ayrıntı `research/` dosyalarında). +> - Dosya: `docs/26-BLUEFORCE-FIELD-OS-ISO.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-20` (medya stratejisi), `#K-15` (yedek medya yolu), `#K-16`/`#K-21` (offline + durum modeli), `#K-01`, `#K-02`, `#K-03`, `#K-09` +> - Durum: [ ] Taslak — ISO artefaktı üretildi; boot ve air-gapped kurulum kabulü LAB ile yapılmalıdır --- ## 1. Amaç -27 izlenebilirlik sorusunun (bkz. §13 ve Ek B) her birinin hangi karara dayandığını tek yerden göstermek; kararsız veya varsayıma dayalı seçim bırakmamak. +Field OS'un ne olduğunu, hangi ISO'nun sahaya gideceğini ve ISO'nun hangi sınırlar içinde üretilebileceğini sabitlemek. ## 2. Kapsam -- Kapsam içi: OS/GUI/boot, 4 erişim kanalı, WireGuard, fleet, monitoring, docs, golden image, Docker, cihaz kimliği, update dalgaları — aşağıdaki K-01…K-14 kararları. -- Kapsam dışı: script kodları, VDS kurulum komutları, gerçek cihaz test sonuçları (Faz 3+ işi; ilgili dokümanlara havale edilir). +- Kapsam içi: V1 tek-USB Field OS ISO, autoinstall motoru, offline APT repo, firstboot, NoCloud seed (geri dönüş yolu), medya bütünlüğü, üretilen artefaktın doğrulama kaydı ve LAB kabulü. +- Kapsam dışı: cihaz kimliği/enrollment işlemi (29), offline paket seti içeriği (27), sürüm yayını (30), PXE/tam unattended provisioning (F6, 25). ## 3. Kararlar -### K-01 — Baz işletim sistemi ve sürüm - ```text -KARAR: Saha standardı Ubuntu Server 26.04.1+ LTS'tir (GUI'siz minimal kurulum; GNOME sonradan eklenir). -GEREKÇE: 26.04.1 LTS resmi indirme sayfasında yayında (kod adı Resolute Raccoon); Server ISO'su varsayılan olarak GUI kurmaz, minimal zemin + ihtiyaca göre GUI standart yoldur. Noktasürüm (.1+) baz alınır çünkü ilk .0 dalgasındaki kurulumcu hataları genelde .1'de toplanır (LAB imaj testiyle kesinleşir). -ALTERNATİF: Ubuntu 24.04 LTS — 26.04 doğrulanamasaydı yedekti; doğrulandığı için yedekte bekler. Ubuntu Desktop 26.04 (6 GB RAM şartı) saha bütçesini zorladığı için elendi. -RİSK: 26.04.x noktasürümlerinde donanım sürücü farkı; azaltma: golden image LAB(2)'de her saha donanım profilinde test edilir. +KARAR: V1 kurulum medyası TEK USB Blueforce Field OS ISO'dur: `dist/Blueforce-Field-OS--amd64.iso`. ISO kökünde `/autoinstall.yaml` (kurulum motoru), `/blueforce-provisioning/` (autoinstall seed kopyası, firstboot, offline-repo araçları/pinleri, release) bulunur; boot konfigürasyonu her kernel satırında autoinstall ister. Autoinstall ile custom ISO birbirinin alternatifi DEĞİL tamamlayıcısıdır (K-20): ISO, autoinstall motorunu paketler. Güvenlik için `interactive-sections: [storage]` KORUNUR — kurulum katılımsız ilerler ama diski operatör seçip onaylar; otomatik disk silme YOKTUR. Resmi Ubuntu ISO + ayrı NoCloud seed USB, V1'in tek yolu değil geri dönüş/fallback yoludur ve her zaman sıcak tutulur (K-15 bu rolde korunur). +GEREKÇE: Tek USB, saha teknisyeni için tek medya demektir (yanlış seed takma hatası ortadan kalkar) ve offline APT repo ile firstboot aynı medyada taşınır. Subiquity resmi referansı autoinstall yapılandırmasını `/autoinstall.yaml` yolundan okur ("irrespective of how it was provided") ve `interactive-sections`'ı resmi olarak destekler; `apt.fallback` varsayılanı `offline-install`'dır. Remaster boot zinciri ise LAB kabulüne bağlanmıştır: ISO üretilse bile UEFI/Legacy/Secure Boot ve air-gapped kurulum kanıtı gelmeden saha medyası ilan edilmez. +ALTERNATİF: Yalnız upstream ISO + NoCloud seed USB — tek-medya deneyimi yok; V1'in tek yolu olmaktan çıktı, geri dönüş yolu olarak kalır. Yalnız remaster ISO + LAB kanıtsız saha — boot zinciri kanıtlanmadan dağıtım riski nedeniyle reddedildi. Otomatik disk wipe'lı unattended ISO — veri kaybı riski nedeniyle yasak (F6 kapsamı, onay kapılı). +RİSK: Remaster boot zinciri (UEFI/Legacy/Secure Boot) veya air-gapped kurulum kanıtlanmazsa medya sahaya çıkamaz; azaltma: F2B çıkış kapısı (iki LAB cihazında assisted kurulum kanıtı), aksi halde upstream ISO + seed yoluna dönülür. İkinci risk: ISO'ya secret/kimlik sızması; azaltma: builder'ın giriş taraması + artefakt secret/cihaz verisi taraması. MALİYET: Ücretsiz. -LİSANS: Ubuntu LTS ücretsiz (açık kaynak bileşenler; ESM kapsamına bel bağlanmaz) — https://releases.ubuntu.com/ (26.04.1, doğrulanma: 2026-09-15) + https://ubuntu.com/download/desktop (sistem gereksinimi, doğrulanma: 2026-09-15). +LİSANS: Ubuntu resmi ISO — https://releases.ubuntu.com/26.04/ ; Subiquity autoinstall — https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html (doğrulama: 2026-09-16, HTTP 200); cloud-init NoCloud — https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html (doğrulama: 2026-09-16); xorriso (El Torito recipe) — https://www.gnu.org/software/xorriso/ . ``` -### K-02 — Masaüstü ortamı (GNOME) - -```text -KARAR: Saha masaüstü ortamı GNOME'dur (Ubuntu Desktop standardı); XFCE elendi. -GEREKÇE: Kullanıcı kararı + Ubuntu Desktop standardı: tanıdık modern masaüstü, teknisyen akışıyla birebir uyum. -ALTERNATİF: XFCE — hafif ve düşük kaynak tüketimine rağmen kullanıcı kararıyla elendi; yedekte tutulmaz. -RİSK: xRDP+GNOME kombinasyonu ek ayar isteyebilir (uyarı: GNOME oturumu RDP'de ek yapılandırma gerektirebilir); azaltma: 13-MEG-LINUX-ACCEPTANCE testi GNOME üzerinde koşar, `bf-gui-*` LAB'da 26.04.1 imajında doğrulanmadan dondurulmaz. -MALİYET: Ücretsiz. -LİSANS: GNOME (GPL/LGPL bileşenler), ücretsiz — https://www.gnome.org/ (doğrulanma: 2026-09-15). -``` - -### K-03 — Boot davranışı ve GUI aç/kapa - -```text -KARAR: Cihazlar terminale (multi-user) boot eder; grafik katman `bf-gui-on` / `bf-gui-off` ile systemd üzerinden açılıp kapatılır. -GEREKÇE: xRDP mimarisi oturum yöneticisi (sesman) + systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerine kuruludur; GUI, display-manager + xRDP servisleri üzerinden yönetilebilir bir katman olarak modellenir. Varsayılan kapalı GUI = düşük RAM, düşük saldırı yüzeyi, öngörülebilir boot. -ALTERNATİF: Her zaman grafik boot — kaynak israfı ve 700 cihazda gereksiz hata yüzeyi nedeniyle elendi. -RİSK: Kesin birim adları ve GNOME oturum başlatma satırı 26.04.1'e göre değişebilir; azaltma: LAB'da 26.04.1 imajında doğrulanmadan `bf-gui-*` dondurulmaz. -MALİYET: Ücretsiz. -LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15). -``` - -### K-04 — Uzaktan erişim kanalları (4 kanal) - -```text -KARAR: Dört erişim kanalı: (1) SSH-over-WireGuard (yönetim/otomasyon), (2) xRDP + GNOME (grafik bakım), (3) RustDesk OSS self-hosted hbbs/hbbr (birincil grafik uzak erişim, WireGuard-bağımsız), (4) MeshCentral self-hosted (ikincil yönetim: terminal/dosya/envanter, WireGuard-bağımsız). AnyDesk mimariden ÇIKARILDI. -GEREKÇE: RustDesk OSS sınırsız istemci, kendi ID+röle altyapısı, E2E şifreli oturum, dosya transferi ve katılımsız erişimi ücretsiz verir; istemcide VDS genel adresi kullanıldığında WireGuard çökse bile kanal ayakta kalır. MeshCentral Apache-2.0 ile ikinci bağımsız düzlemi sağlar. AnyDesk ücretsiz sürümü yalnızca kişisel kullanımı kapsar; 700 kurumsal cihaz ticari kullanımdır ve lisanssız kullanım ihlal olur (en az Advanced planı gerekirdi). -ALTERNATİF: AnyDesk (lisans maliyeti + kapalı kaynak + self-hosted yalnızca en üst planda → elendi; yalnızca müşteri sahasında zaten lisanslıysa opsiyonel installer modülü). Tailscale/ZeroTier (freemium, merkezi kimlik → elendi). -RİSK: İki VDS-bağımlı kanalın tek ortak noktası VDS + genel internet; azaltma: hbbs/hbbr `--net=host` + health monitörü (Uptime Kuma) + yedek VDS planı 17-RECOVERY'de. -MALİYET: Ücretsiz (kendi VDS'i üzerinde; VDS kira bedeli hariç — altyapı maliyeti, lisans değil). -LİSANS: RustDesk istemci+sunucu AGPL-3.0 (1.4.9 / 1.1.16) — https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ + https://rustdesk.com/docs/en/self-host/client-deployment/ (doğrulanma: 2026-09-15); MeshCentral Apache-2.0 (1.2.5) — https://github.com/Ylianst/MeshCentral (doğrulanma: 2026-09-15); AnyDesk hükmü — https://support.anydesk.com/docs/anydesk-licenses.md (doğrulanma: 2026-09-15) + https://anydesk.com/en/pricing. -``` - -### K-05 — WireGuard modeli - -```text -KARAR: Hub-spoke WireGuard: merkez sunucu hub, her saha cihazı spoke (peer adı = `bf-<8hane>`); istemcide `PersistentKeepalive = 25` + `wg-quick@wg0` systemd enable; RDP/SSH dış dünyaya kapalı, yalnızca WireGuard arkasında. -GEREKÇE: Resmi QuickStart NAT arkasındaki eş için 25 sn keepalive'i "geniş güvenlik-duvarı yelpazesiyle çalışan makul aralık" olarak verir; `wg-quick@.service` Ubuntu paketinden gelir, enable = açılışta otomatik VPN. Elektrik kesintisi sonrası cihaz açılınca VPN kendiliğinden gelir. -ALTERNATİF: Keepalive kapalı / agresif 10 sn — kapalı NAT eşlemesini düşürür, agresif değer saha verisi olmadan yazılmaz; PİLOT-1 kopma sayacına göre ayarlanır. -RİSK: Turkcell CGNAT davranışı resmi kaynaktan doğrulanamaz (operatör bilgisi); azaltma: PİLOT-1'de 7/24 kopma sayacı, aralık saha verisiyle ayarlanır. -MALİYET: Ücretsiz. -LİSANS: WireGuard OSS (Ubuntu paketi `wireguard-tools 1.0.20250521-1ubuntu1`) — https://www.wireguard.com/quickstart/ + https://packages.ubuntu.com/resolute/wireguard-tools (doğrulanma: 2026-09-15). -``` - -### K-06 — Filo yönetimi - -```text -KARAR: Birincil filo otomasyonu Ansible CLI (SSH, agent'sız); operatör arayüzü Semaphore UI Community (self-hosted, MIT). Hiçbir playbook Pro/Enterprise özelliğine bağlanmaz. -GEREKÇE: En düşük hareketli parça (SSH + YAML + tek Go binary); 700 cihazda ek agent/master/K8s maliyeti yok. Community ücretsizliği resmi fiyat sayfasıyla kanıtlı ("$0, free forever"); Pro en fazla 500 managed node desteklediği için 700 cihazda ücretli yol zaten kapalı. -ALTERNATİF: AWX (K8s yükü + release'ler refactoring nedeniyle duraklatıldı → elendi); Salt (minion agent + master PKI → elendi); Rudder Community (relay/Enterprise modülleri + öğrenme eğrisi → elendi); MeshCentral (erişim aracı, filo otomasyonu değil → bu rolde elendi). -RİSK: Semaphore tek nokta arızası → Ansible CLI bağımsız çalışır (UI çökse filo durmaz). Community'de OIDC/2FA/Vault yok → Semaphore yalnızca WireGuard arkasında, erişim VPN + SSH anahtarı ile; gizliler yerleşik şifreli Key Store'da. -MALİYET: Ücretsiz (kendi VDS'i üzerinde). -LİSANS: Ansible GPL-3.0 — https://github.com/ansible/ansible; Semaphore Community MIT — https://github.com/semaphoreui/semaphore + https://semaphoreui.com/pricing (doğrulanma: 2026-09-15). -``` - -### K-07 — Monitoring - -```text -KARAR: Birincil Prometheus + Node Exporter + Grafana OSS (17 metriğin tamamı); tamamlayıcı Uptime Kuma (saha-teknisyeni dostu UP/DOWN panosu + Push "last seen" + bildirimler). Netdata elendi. -GEREKÇE: 17 metriğin tamamı yalnızca Prometheus yığınında ücretsiz ve kotasız toplanır (WireGuard handshake, Docker, MEG sağlığı textfile collector ile). Netdata Cloud Free 5 node kotası 700 cihazda ücrete düşer. Uptime Kuma metrik vermez ama en basit çevrimdışı alarmını verir (20 sn aralık, 90+ bildirim servisi, tek konteyner). -ALTERNATİF: Yalnızca Uptime Kuma (metrik körlüğü → elendi); Netdata self-hosted Parent (merkezi tasarım yükü + kota riski → elendi). -RİSK: 700 node'da saklama/kardinalite; azaltma: scrape 60 sn, retention 30–90 gün, etiket şeması `BF-` standardında, federasyon/fazlı rollout. -MALİYET: Ücretsiz. -LİSANS: Prometheus/Node Exporter Apache-2.0 — https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/; Grafana OSS AGPL-3.0 (değişikliksiz self-host) — https://grafana.com/oss/; Uptime Kuma MIT — https://github.com/louislam/uptime-kuma (doğrulanma: 2026-09-15). -``` - -### K-08 — Doküman platformu - -```text -KARAR: Docusaurus (`docs-site/` iskeleti; `docs/*.md` tek kaynak, site derlemesi CI'da). -GEREKÇE: "AI-güncelleme" kriterini yalnızca Git-yerleşik Markdown çözer (ajan `.md`'yi doğrudan yazar, review PR'dan geçer). Wiki.js'nin DB+servis yükü sadelik kuralını bozar; TriliumNext tek-kullanıcı bilgi tabanıdır. MkDocs'a karşı Docusaurus: yerleşik sürümleme + yerleşik i18n + MDX; derleme maliyeti eşdeğerdir. -ALTERNATİF: MkDocs + Material (eşdeğer sadelikte güçlü ikinci; Docusaurus derleme hattı sorun çıkarırsa geçiş maliyeti düşük çünkü kaynak yine düz Markdown — yedekte tutulur). Wiki.js (DB yükü → elendi). TriliumNext (ekip akışı yok → elendi). -RİSK: Node derleme hattı bozulabilir; azaltma: kilitli bağımlılıklar + CI derleme testi; derleme bozulsa bile `docs/*.md` ham haliyle okunur. -MALİYET: Ücretsiz. -LİSANS: Docusaurus MIT — https://github.com/facebook/docusaurus + https://docusaurus.io/docs/markdown-features/diagrams (doğrulanma: 2026-09-15). -``` - -### K-09 — Golden image yöntemi - -```text -KARAR: Golden image = Ubuntu Server 26.04.1+ minimal + `unattended-upgrades` kapalı + `blueforce-install.sh` tek kurucu (bayi no → READY); imaj, preseed/autoinstall dosyasıyla üretilir, cihaz-spesifik kimlik (`bf-`) imajda DEĞİL ilk açılışta verilir. -GEREKÇE: Donanım heterojenliği bilinmediği için bit-kopya klon (Clonezilla) tek imajda kırılgandır; autoinstall + idempotent kurulum scripti her donanım profilinde aynı zemini kurar, kimlik ilk boot'ta enjekte edilir. Hedef akış: USB → Ubuntu → tek script → bayi no → READY. -ALTERNATİF: Clonezilla bit-kopya (hızlı ama donanım-fragil → yedek yöntem olarak tutulur); Packer/custom ISO (ek derleme hattı yükü → elendi); cloud-init (autoinstall'a göre saha-USB akışına daha az uygun → elendi). -RİSK: İlk imaj heterojen donanımda sürücü eksiltebilir; azaltma: önce `bf-hardware-inventory.sh` taraması (18-ROLLOUT), LAB'da her profilde test. -MALİYET: Ücretsiz. -LİSANS: Ubuntu autoinstall/subiquity (ücretsiz, Ubuntu lisans seti içinde) — https://releases.ubuntu.com/26.04/ (doğrulanma: 2026-09-15). NOT: Faz 1'de resmi autoinstall sözdizimi ayrıca doğrulanmadı; kesin direktifler 04-GOLDEN-IMAGE'da LAB çıktısıyla yazılır. -``` - -### K-10 — Docker restart politikası ve imaj disiplini - -```text -KARAR: Tüm saha konteynerlerinde restart politikası `unless-stopped`; `latest` etiketi yasak (sabit tag zorunlu); Watchtower yok; log rotasyonu (`max-size`/`max-file`) daemon.json'da zorunlu; yayımlanan portlar `127.0.0.1`'e bağlanır (UFW bypass'a karşı). -GEREKÇE: `unless-stopped`, `always`'in aksine teknisyenin bakım için durdurduğu konteyneri reboot sonrası sürpriz kalkıştan korur; elektrik kesintisi kurtarması aynen çalışır (kesinti "manuel stop" sayılmaz). Hareketli `latest` etiketi 700 cihazda determinizmi bozar ("onaysız update yasak" politikası). Watchtower hem politikayı ihlal eder (otomatik updater) hem upstream'de arşivlenmiştir. Docker varsayılan `json-file` logu rotasyon yapmaz → dolan disk = kilitlenen cihaz. Docker yayımlanan portlarda UFW'yi baypas eder (resmi belgeli) → localhost-bind + WireGuard üzerinden erişim. -ALTERNATİF: `always` (öngörülemez bakım davranışı → elendi); `iptables:false` (resmi doküman "çoğu kullanıcı için uygun değil" diye uyarır → varsayılan çözüm değil); digest pinleme (`@sha256`) PİLOT-2'de değerlendirilecek ek sıkılık adımı. -RİSK: `max-size/max-file` değerleri MEG log hacmine göre ayarlanmazsa ya disk dolar ya log kaybolur; azaltma: PİLOT'ta hacim ölçülür, 12-DOCKER'da sabitlenir. -MALİYET: Ücretsiz (Docker CE). -LİSANS: Docker CE ücretsiz (Business/Scout mimaride yok) — https://docs.docker.com/engine/containers/start-containers-automatically/ + https://docs.docker.com/engine/logging/configure/ + https://docs.docker.com/engine/network/packet-filtering-firewalls/ (doğrulanma: 2026-09-15); Watchtower arşiv durumu — https://github.com/containrrr/watchtower (doğrulanma: 2026-09-15). -``` - -### K-11 — Otomatik güncelleme yasağı - -```text -KARAR: Golden image'da `unattended-upgrades` kapatılır (`/etc/apt/apt.conf.d/20auto-upgrades` değerleri `0` + `apt-daily*.timer` maskeleme); tüm güncellemeler LAB→PİLOT→WAVE→PROD onay zincirinden geçer (dalgalar: LAB(2)/P1(5)/P2(20)/W1(50)/W2(100)/PROD). -GEREKÇE: `unattended-upgrades` Ubuntu Server'da varsayılan kurulu ve etkindir, günde bir kez çalışır; kapatılmazsa 700 cihaz ilk açılışta güncellemeye kalkar ("onaysız update yasak" ilkesi delinir). Kaçan timer makine açılışında hemen tetiklenir (`Persistent=true` davranışı) — saha PC'leri sık kapanan makinelerdir. -ALTERNATİF: Otomatik security update'e izin verme — 700 cihazda eşzamanlı indirme + onaysız değişim riski nedeniyle elendi; security update'ler öncelik işaretli onaylı dalga ile çıkar. -RİSK: Kapatma adımı imajda atlanırsa filo kendiliğinden güncellenir; azaltma: `blueforce-install.sh` final-check + monitoring'de `Unattended-Upgrade` durumu metriği. -MALİYET: Ücretsiz. -LİSANS: Yok (işletim sistemi yapılandırması) — https://ubuntu.com/server/docs/how-to/software/automatic-updates/ + https://manpages.ubuntu.com/manpages/resolute/en/man8/unattended-upgrade.8.html (doğrulanma: 2026-09-15). -``` - -### K-12 — Cihaz kimliği standardı - -```text -KARAR: 8 haneli bayi no → Device ID `BF-` (büyük), hostname `bf-` (küçük); WireGuard peer adı, RustDesk etiketi, Ansible inventory adı, monitoring etiketi hepsi aynı ID'yi kullanır. Örnek: `BF-12010193` / `bf-12010193`. -GEREKÇE: Tek kimlik = 9 sistemde (DNS/hostname, WireGuard, RustDesk, MeshCentral, Ansible, Prometheus, log, envanter, runbook) join anahtarı; büyük/küçük ayrımı insan-makine karışıklığını önler (insan `BF-`, makine `bf-`). -ALTERNATİF: Rastgele UUID / MAC-tabanlı ad — saha teknisyeni için okunamaz, bayi eşleşmesi manuel olur → elendi. -RİSK: Bayi no değişirse kimlik çakışması; azaltma: 02-NAMING'de yeniden-no prosedürü + envanter benzersizlik kontrolü. -MALİYET: Ücretsiz. -LİSANS: Yok (isimlendirme standardı). -``` - -### K-13 — SSH kimlik doğrulama mimarisi - -```text -KARAR: `blueforce` bakım kullanıcısı + anahtar zorunlu (password SSH kapalı, root SSH kapalı); 700 cihaza tek private key YAYILMAZ — admin başına anahtar + cihazlarda `authorized_keys` merkezi dağıtımı (Ansible), uzun vadede SSH CA hedefi. -GEREKÇE: Tek private key'in sızıntı blast-radius'u 700 cihazdır; per-admin anahtar + merkezi dağıtım sızıntıyı tek anahtarın iptaline indirger. Servisler ayrı system user ile çalışır, sudo kontrollüdür. -ALTERNATİF: Tek paylaşılan private key (basit ama 700 cihazlık blast-radius → elendi); password auth (kaba-kuvvet yüzeyi → elendi). -RİSK: Anahtar dağıtım gecikmesi yeni cihazda erişimsizlik; azaltma: golden image'da bootstrap anahtarı + ilk Ansible run'ında rotasyon. -MALİYET: Ücretsiz. -LİSANS: OpenSSH (BSD-lisanslı), ücretsiz. -``` - -### K-14 — Log ve sağlık disiplini - -```text -KARAR: Birincil metrik/monitoring K-07; log tarafında journald + Docker `json-file` rotasyonlu + textfile `.prom` (WireGuard handshake, Docker, MEG) + `bf-status` / `bf-diagnostics` / `bf-support-bundle` (secret sızdırmaz) sözleşmeleri. -GEREKÇE: 700 dokunulmaz cihazda logsuz metrik kör, metriksiz log sağırdır; textfile collector özel metriklerin (WireGuard/MEG) standart Prometheus yoludur. Support-bundle secret dışlama kuralıyla güvenli uzaktan tanı sağlar. -ALTERNATİF: Harici log platformu (Loki/ELK) ilk fazda — ek servis yükü, sadelik kuralını bozar → Faz-sonrası hedef olarak 15-LOGGING'e not edilir. -RİSK: Log hacmi retention'ı şişirir; azaltma: PİLOT'ta hacim ölçümü + limitler 15-LOGGING'de. -MALİYET: Ücretsiz. -LİSANS: systemd-journald / Node Exporter textfile (Apache-2.0) — https://github.com/prometheus/node_exporter (doğrulanma: 2026-09-15). -``` - ---- +> **Güncelleme (2026-09-16, K-20/K-21):** Bu dosyanın eski §3/§5/§12 ifadeleri ("V1 kurulum medyası upstream ISO + ayrı seed USB'dir", "yalnız custom remaster ISO V1 için elendi") geçersizdir. Kanonik karar: **V1 = tek USB Field OS ISO (autoinstall motoru olarak kullanılır); upstream ISO + seed = yedek/geri dönüş yolu.** Ayrıca ISO artık **gerçekten üretilmiştir** (bkz. §9 "Üretilen artefakt"). Ayrıntı: `24-DECISION-LOG.md#K-20`. ## 4. Neden Bu Karar? -Tüm kararlarda aynı üç filtre uygulandı: (1) %100 ücretsiz/self-hosted — resmi URL + sürüm + tarih olmadan lisans iddiası yazılmadı; (2) sadelik — Kubernetes, microservice, gereksiz agent/DB/cloud önerisi reddedildi (AWX'in K8s zorunluluğu, Salt master PKI, Wiki.js DB yükü, harici log platformu); (3) onaysız update yasağı — unattended-upgrades, `latest`, Watchtower aynı ilkeden elendi. 700 ölçeğinde her "küçük varsayılan" (günlük otomatik update, rotasyonsuz log, UFW bypass) filo-çapı arızaya dönüşür; kararlar bu çarpanı küçültür. +Autoinstall kurulum otomasyonudur; Field OS ISO ise dağıtım **paketleme** biçimidir — ISO, autoinstall'ın yerine geçmez, onu taşır. Tek medya saha değişkenlerini (offline repo, firstboot, release manifesti) tek taşıma noktasında birleştirir ve yanlış seed takma hatasını ortadan kaldırır; cihaz-spesifik veri (bayi no, key, token) yine medyada tutulmaz, firstboot'ta toplanır. Ayrı seed USB ise tamamen kaldırılmaz: ISO boot etmezse aynı sonucu veren sıcak geri dönüş yoludur. ## 5. Alternatifler | Alternatif | Artı | Eksi | Sonuç | |---|---|---|---| -| Ubuntu 24.04 LTS | Olgun donanım desteği | 26.04 doğrulandı, daha kısa destek penceresi | Yedek | -| XFCE | Hafif, düşük kaynak | Kullanıcı kararıyla elendi (saha standardı GNOME) | Elendi | -| AnyDesk | Tanınmış, kolay | Ticari lisans zorunlu (700 cihaz), kapalı kaynak | Elendi | -| Tailscale/ZeroTier | Kolay mesh | Freemium, merkezi kimlik | Elendi | -| AWX | Güçlü UI | K8s zorunlu, release'ler duraklatıldı | Elendi | -| Salt / Rudder | Ölçeklenir | Agent+master/relay yükü, öğrenme eğrisi | Elendi | -| Netdata Cloud | Zengin agent | Free 5 node kotası, 700 cihaz ücretli | Elendi | -| Yalnızca Uptime Kuma | Çok kolay | Metrik körlüğü | Elendi | -| Wiki.js | Güçlü editör | DB+servis yükü, Git akışı dolaylı | Elendi | -| MkDocs + Material | Eşdeğer sade | Sürümleme/i18n eklentiyle | Yedek (güçlü ikinci) | -| TriliumNext | Hafif | Tek kullanıcı, ekip akışı yok | Elendi | -| Clonezilla bit-kopya | Hızlı klon | Donanım-fragil | Yedek yöntem | -| Docker `always` | Her koşulda ayakta | Bakım-stop'u reboot'ta deler | Elendi | -| Watchtower | Otomatik imaj | Politika ihlali + arşivlenmiş upstream | Elendi | -| Tek paylaşılan SSH key | Basit | 700 cihazlık blast-radius | Elendi | +| Tek USB Field OS ISO (remaster, autoinstall + offline repo + firstboot) | Tek medya; teknisyen hatası azalır; offline içerik yanında | UEFI/Legacy/Secure Boot LAB yükü | **V1 seçildi (F2B)** | +| Upstream ISO + NoCloud seed USB | En az özel build; imzalı upstream taban | İki medya taşınır | Geri dönüş/fallback yolu (sıcak) | +| Yalnız remaster ISO (LAB kanıtı olmadan) | — | Boot zinciri kanıtlanmamış medya sahaya çıkar | Reddedildi | +| Clonezilla | Hızlı | Donanım-fragil | Yedek yöntem | ## 6. Avantajlar -- 14 kararın tamamı ücretsiz katmanda kanıtlı; zorunlu mimaride lisans bedeli yok. -- Her kararın resmi kaynak URL'si + sürümü + doğrulama tarihi var; varsayıma dayalı karar yok (belirsizler LAB/PİLOT'a havale edildi). -- 4 erişim kanalından ikisi WireGuard-bağımsız; tek tünel arızası filoyu kör etmez. +- İmzalı upstream taban; değişiklik alanı ISO kökü + `/blueforce-provisioning/` ile sınırlı, mevcut boot dosyaları (boot.catalog, eltorito.img, casper/*) bayt-özdeş bırakılır. +- Field OS sürümü, medya manifesti (`dist/-manifest.yaml`), release manifesti ve kurucu sürümü ayrı izlenebilir. +- Offline APT repo + firstboot + release dosyaları aynı medyada; internet olmayan sahada tek USB yeter (K-16). ## 7. Dezavantajlar -- K-09 (golden image) Faz 1'de tam resmi-doğrulamalı değil; autoinstall sözdizimi LAB çıktısına bağımlı. -- Semaphore Community'de OIDC/2FA/Vault yokluğu operasyonel disiplinle (VPN-arkası + Key Store) kapatılıyor; bu disiplin bozulursa güvenlik açığı doğar. -- Prometheus 700 node işletme bilgisi ister; retention/kardinalite LAB'da ölçülmeden donanım siparişi verilmemeli. +- Remaster boot zinciri UEFI/Legacy/Secure Boot'ta kanıtlanmadan medya sahaya çıkamaz; bu, F2B çıkış kapısını bloke edebilir. +- Medya tek noktada tüm saha değişkenlerini taşır: bozuk/kopyalanmış ISO yanlış sürüm yayar → SHA256 doğrulaması ve sürüm etiketi zorunludur. +- LAB medyası şu an Ubuntu **Desktop** flavour'ıyla üretildi; baseline (Server) ile sapma manifestte açıkça kayıtlıdır (bkz. §9). ## 8. Riskler | Risk | Olasılık | Etki | Azaltma | |---|---|---|---| -| `unattended-upgrades` imajda açık unutulur | Orta | Yüksek (filo kendiliğinden güncellenir) | install.sh final-check + monitoring metriği (K-11) | -| Docker UFW bypass ile MEG portu dışa açılır | Orta | Yüksek | localhost-bind standardı + 11-HARDENING denetimi (K-10) | -| Semaphore çöker, filo yönetimsiz kalır | Düşük | Orta | Ansible CLI bağımsız çalışır (K-06) | -| 26.04.x sürücü farkı heterojen donanımda | Orta | Orta | LAB'da profil başına imaj testi (K-01/K-09) | -| Tek VDS iki bağımsız kanalı da barındırırsa ortak arıza | Düşük | Yüksek | hbbs/hbbr + MeshCentral ayrı VDS veya yedek planı (K-04) | -| 700 node Prometheus kardinalite patlaması | Orta | Orta | 60 sn scrape, 30–90 gün retention, `BF-` etiket şeması (K-07) | +| 26.04 autoinstall davranışı değişir | Orta | Yüksek | Her sürüm LAB kabulü | +| Remaster boot etmez (UEFI/Legacy/Secure Boot) | Orta | Yüksek | UEFI/Legacy/Secure Boot matrisi; aksi halde medya yayınlanmaz, upstream ISO + seed yoluna dönülür | +| ISO'ya secret/kimlik girer | Düşük | Yüksek | Builder giriş taraması + artefakt secret ve cihaz verisi taraması | +| Medya tabanı sapması (Desktop flavour) sahaya fark edilmeden çıkar | Orta | Orta | `manifest.yaml` içinde `base_flavor` + `baseline_deviation` bloğu, `media-info.yaml` ve `/etc/blueforce-release` aynasında; işletim öncesi Server ISO ile yeniden build kararı | +| Offline repo medyaya gömülmediği için kurulum `OFFLINE BLOCKED` ile durur | Yüksek (mevcut durum) | Orta | `offline_repo_status: not-included` açıkça raporlanır; `--require-offline-repo` release build'lerinde build'i durdurur | ## 9. Uygulama Planı -1. Golden image'a K-01/K-02/K-03/K-10/K-11 uygulanır (04-GOLDEN-IMAGE). -2. WireGuard hub + ilk peer'lar K-05'e göre kurulur (08-WIREGUARD). -3. hbbs/hbbr + MeshCentral VDS'leri K-04'e göre ayağa kaldırılır (07-REMOTE-ACCESS). -4. Ansible + Semaphore K-06'ya göre kurulur; ilk playbook LAB(2)'de koşar (09-FLEET). -5. Prometheus + Uptime Kuma K-07'ye göre kurulur; 17 metrik LAB'da doğrulanır (14-MONITORING). -6. Update zinciri K-11 dalgalarıyla işletilir (10-UPDATE). +1. Base ISO'nun SHA256 bilgisini Canonical kaynak kaydından al ve yerel yayın kaydına yaz (`provisioning/iso/ubuntu-26.04.1-SHA256SUMS`). +2. Medyayı üret (`provisioning/iso/build-blueforce-iso.sh`); üretim sırasında girilen `autoinstall.yaml` + firstboot + offline-repo + release payload'ları medyaya yazılır, `interactive-sections: [storage]` ve `apt.fallback: offline-install` işaretleri korunur. +3. Medyaya bayi no, WireGuard private key, enrollment token veya SSH private key KOYMA; builder giriş taraması bunları bulursa durur. +4. Kurulumdan sonra cihaz `PROVISIONED_OFFLINE` olur; merkezi doğrulama tamamlanmadan `READY` olmaz (K-21). +5. Release yolunda medya manifesti + checksum + test raporu üretilir; cihaz verisi taşınmaz. ```bash -# örnek: cihaz kimliği standardı (K-12) -hostnamectl set-hostname bf-12010193 +# medyayı üret (base ISO ve checksum kaydı yerelde olmalı; hiçbir şey indirilmez) +provisioning/iso/build-blueforce-iso.sh \ + --upstream-iso /media/ubuntu-26.04.1-desktop-amd64.iso \ + --checksum-file provisioning/iso/ubuntu-26.04.1-SHA256SUMS +# üretilen artefaktı YAZMADAN doğrula (checksum + El Torito metadata) +provisioning/iso/test-iso.sh dist/Blueforce-Field-OS-1.0.0-amd64.iso +sha256sum -c dist/Blueforce-Field-OS-1.0.0-amd64.iso.sha256 ``` +### Üretilen artefakt (2026-09-16 — gerçek üretim, mock değil) + +| Alan | Değer | +|---|---| +| ISO | `dist/Blueforce-Field-OS-1.0.0-amd64.iso` | +| ISO boyutu | 6 481 917 952 byte (~6.48 GB, 6.04 GiB) | +| ISO SHA256 | `cb0cc56f0442fbd1418e0d0f35521522f4ec9aa3f203779a67e96d587d431296` | +| Checksum dosyası | `dist/Blueforce-Field-OS-1.0.0-amd64.iso.sha256` (aynı değer, yerelde `sha256sum -c` ile doğrulandı) | +| Manifest | `dist/1.0.0-manifest.yaml` (`release_status: lab-artifact`, `build_date: 2026-09-16T08:00:29Z`) | +| Base medya | Ubuntu 26.04.1 **desktop** amd64 (`ubuntu-26.04.1-desktop-amd64.iso`, SHA256 `601e30fbf5d97759367c632e2c33630665039b7e2158fd068403da3ccf1bda1f` — build host'ta yeniden hesaplanıp doğrulandı) | +| Boot | El Torito **BIOS + UEFI** girdileri base ISO'dan korunmuş (builder build sonrası xorriso ile yeniden doğrular; eksikse artefaktı siler) | +| Live içerik bütünlüğü | `casper/minimal.squashfs` 3 432 136 704 byte ve SHA256 `b5ec27b9570e77abb62831a8b652b50eaf089d537e62046189a52231a4fa9bec` — base ISO'daki dosyayla **birebir aynı** | +| Autoinstall | Medya kökünde `/autoinstall.yaml`; `interactive-sections: [storage]` aktif, `apt_fallback: offline-install` | +| Payload | `/blueforce-provisioning/{autoinstall,firstboot,offline-repo,release}` medyada mevcut | +| Secret durumu | `device_identity_embedded: false`, `automatic_disk_wipe: false`; kimlik firstboot'ta toplanır | +| Baseline sapması | Medya **Desktop** flavour ile üretildi (baseline Server). `manifest.yaml` → `baseline_deviation` bloğu: gerekçe (build host'ta checksum'ı doğrulanmış tek medya Desktop ISO'ydu, build indirme yapmaz), etki (GNOME zaten gelir), gereken karar (LAB için Desktop tabanını kabul et **veya** üretim öncesi Server ISO ile yeniden build) | +| Henüz yapılmayanlar | UEFI/Legacy/Secure Boot boot kabulü, Secure Boot imza davranışı, air-gapped tam kurulum, offline APT repo gömülmesi (`offline_repo_status: not-included`, pinler `UNPINNED`) — hepsi LAB/F2B işi | + ## 10. Test Planı | Test | Beklenen sonuç | Ortam | |---|---|---| -| `20auto-upgrades` değerleri `0`, timer'lar maskeli | Otomatik apt çalışmaz | LAB(2) imaj denetimi | -| `bf-gui-on/off` sonrası RDP oturumu | GNOME oturumu açılır/kapanır | LAB(2) | -| WireGuard down iken RustDesk oturumu | Bağlantı kurulur (bağımsız kanal) | P1(5) | -| `docker inspect` restart politikası | `unless-stopped` tüm saha konteynerlerinde | LAB(2) | -| Semaphore kapalı iken Ansible CLI run | Playbook başarıyla koşar | LAB(2) | -| Scrape + 17 metrik + Uptime Push | Grafana + Kuma panoları dolu | P1(5) | +| Base ISO checksum | Yayın kaydıyla eşleşir (`601e30fb…`) | LAB(2) | +| Üretilen ISO checksum | `sha256sum -c dist/*.iso.sha256` geçer | LAB(2)/CI | +| ISO içerik bütünlüğü | `casper/*` dosyaları base ISO ile bayt-özdeş; `boot.catalog`/`eltorito.img` korunmuş | CI (xorriso) + LAB | +| Tek-USB assisted kurulum | Kimliksiz sistem kurulur; storage adımı operatör onayı bekler, otomatik silme yok | LAB(2) UEFI+Legacy | +| Field OS ISO UEFI/Legacy/Secure Boot | Her desteklenen profil boot eder | Zorunlu LAB (F2B çıkış kapısı) | +| Air-gapped kurulum (offline repo gömülüyken) | Dış indirme yok; `PROVISIONED_OFFLINE` | LAB(2) air-gapped | +| Geri dönüş yolu (upstream ISO + seed) | Aynı sonucu verir, sıcak tutulur | LAB(2) | +| Artefact taraması | Cihaz kimliği/secret yok; `device_identity_embedded: false` | Build CI + LAB | ## 11. Rollback -1. Yanlış karar tespitinde bu dosya PR ile düzeltilir; bağımlı dokümanlar (01, 03, 07, 08, 09, 12, 14) aynı PR'da güncellenir. -2. İmaj-kritik karar (K-01/K-11) geri alınırsa golden image yeniden üretilir, sahaya sürülmüş dalga 10-UPDATE rollback zinciriyle geri alınır. -3. Son çare: karar öncesi imaj sürümüne dönüş (17-RECOVERY LEVEL 9). +1. Field OS ISO başarısızsa (boot etmez, autoinstall almaz) derhal upstream ISO + son onaylı seed USB yoluna dönülür; bu yol her zaman sıcak tutulur (K-20). +2. Hatalı ISO/seed geri çekilir, önceki onaylı medya sürümü (sürüm etiketli USB) kullanılır. +3. Cihaz kurulmuş fakat kabul edilmemişse 27/29 prosedürüyle yeniden provision edilir. ## 12. Kontrol Listesi -- [ ] 14 kararın her birinde KARAR/GEREKÇE/ALTERNATİF/RİSK/MALİYET/LİSANS + kaynak URL var. -- [ ] Ücretli hiçbir araç zorunlu mimaride değil; AnyDesk hükmü resmi URL'li. -- [ ] `unattended-upgrades`, `latest`, Watchtower yasakları üç dosyada da tutarlı (03/10/12). -- [ ] Ek B'deki 27 sorunun her biri ≥1 karara bağlı (boş hücre yok). +- [ ] Base ISO checksum ve kaynak URL kaydı var; üretilen ISO checksum'ı yayımlanmış. +- [ ] Medya genel yapılandırma dışında cihaz verisi/secret içermiyor (kimlik firstboot'ta). +- [ ] V1 etiketi **tek USB Field OS ISO** olarak basıldı; upstream ISO + seed geri dönüş yolu olarak hazır. +- [ ] Medyada `interactive-sections: [storage]` aktif, otomatik disk silme yok. +- [ ] UEFI/Legacy/Secure Boot LAB kabulü tamam (F2B çıkış kapısı) — tamamlanmadan saha dağıtımı yok. +- [ ] Medya tabanı sapması (Desktop flavour) kayıtlı ve işletim öncesi karar verilmiş. +- [ ] Offline APT repo gömülü (yoksa `OFFLINE BLOCKED` davranışı bilerek kabul edilmiş ve release build'i bloke ediyor). ## 13. Açık Sorular -- [ ] GNOME oturum başlatma satırı + `bf-gui-*` kesin birim listesi — LAB 26.04.1 imajında (sahibi: Faz 3, 03/04 yazarları). -- [ ] MEG log hacmine göre `max-size/max-file` kesin değerleri — PİLOT ölçümü (sahibi: 12-DOCKER yazarı). -- [ ] Turkcell NAT kopma sayacı + keepalive ayarı — P1 7/24 sayaç (sahibi: 08-WIREGUARD yazarı). -- [ ] Digest pinleme (`@sha256`) kararı — PİLOT-2 değerlendirmesi (sahibi: 12-DOCKER yazarı). -- [ ] Prometheus retention/kardinalite hesabı (700 × 60 sn) — LAB ölçümü (sahibi: 14-MONITORING yazarı). -- [ ] Semaphore Global Runner sayısı + eşzamanlılık — 700 node yük testi (sahibi: 09-FLEET yazarı). +- [ ] Ubuntu 26.04.1'in kesin autoinstall/subiquity davranışı ve Desktop flavour'da autoinstall yolu — LAB (sahibi: platform ekibi) [K-20]. +- [ ] Desteklenecek Legacy BIOS donanım profilleri — sahibi: envanter ekibi. +- [ ] UEFI/Legacy/Secure Boot boot kabul matrisi ve Secure Boot imza davranışı — F2B (sahibi: provisioning/release yöneticisi) [K-20]. +- [ ] Medya tabanı: Desktop flavour kabul mü, Server ISO ile yeniden build mi — F2B çıkış kapısı (sahibi: release yöneticisi) [K-01/K-20]. +- [ ] Offline APT repo'nun medyaya gömülmesi (bugün `offline_repo_status: not-included`) — F2B (sahibi: release yöneticisi) [K-16/K-20]. --- -## Ek A: Kaynak Tablosu (URL + sürüm + tarih) - -| # | Kaynak | Sürüm/tarih | -|---|---|---| -| 1 | https://releases.ubuntu.com/ | 26.04.1 LTS Resolute Raccoon, 2026-09-15 | -| 2 | https://releases.ubuntu.com/26.04/ | Server GUI kurmaz notu, 2026-09-15 | -| 3 | https://ubuntu.com/download/desktop | 2 GHz / 6 GB / 25 GB, 2026-09-15 | -| 4 | https://ubuntu.com/server/docs/how-to/software/automatic-updates/ | güncel Server docs, 2026-09-15 | -| 5 | https://manpages.ubuntu.com/manpages/resolute/en/man8/unattended-upgrade.8.html | 2.12ubuntu9, 2026-09-15 | -| 6 | https://www.gnome.org/ | Desktop standardı beyanı, 2026-09-15 | -| 7 | https://github.com/neutrinolabs/xrdp | v0.10.6.1 (2026-07-07), 2026-09-15 | -| 8 | https://www.wireguard.com/quickstart/ | keepalive 25 sn, 2026-09-15 | -| 9 | https://packages.ubuntu.com/resolute/wireguard-tools | 1.0.20250521-1ubuntu1, 2026-09-15 | -| 10 | https://docs.docker.com/engine/network/packet-filtering-firewalls/ | UFW bypass, 2026-09-15 | -| 11 | https://docs.docker.com/engine/logging/configure/ | log rotasyon, 2026-09-15 | -| 12 | https://docs.docker.com/engine/containers/start-containers-automatically/ | unless-stopped, 2026-09-15 | -| 13 | https://github.com/containrrr/watchtower | arşivli, 2026-09-15 | -| 14 | https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ | mimari hbbs/hbbr, 2026-09-15 | -| 15 | https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/ | compose + portlar, 2026-09-15 | -| 16 | https://rustdesk.com/docs/en/self-host/client-deployment/ | OSS toplu dağıtım, 2026-09-15 | -| 17 | https://rustdesk.com/pricing/ | Individual ~11,88 / Basic ~23,88 USD/ay, 2026-09-15 | -| 18 | https://support.anydesk.com/docs/anydesk-licenses.md | ticari lisans şartı (güncelleme 2025-10-30), 2026-09-15 | -| 19 | https://anydesk.com/en/pricing | Solo/Standard/Advanced/Ultimate, 2026-09-15 | -| 20 | https://github.com/Ylianst/MeshCentral | 1.2.5 (2026-08-12), Apache-2.0, 2026-09-15 | -| 21 | https://github.com/ansible/ansible | GPL-3.0, 2026-09-15 | -| 22 | https://github.com/semaphoreui/semaphore + https://semaphoreui.com/pricing | MIT, Community $0, 2026-09-15 | -| 23 | https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/ | Apache-2.0, 2026-09-15 | -| 24 | https://grafana.com/oss/ | AGPL-3.0 OSS, 2026-09-15 | -| 25 | https://github.com/louislam/uptime-kuma | MIT, 2026-09-15 | -| 26 | https://github.com/facebook/docusaurus + https://docusaurus.io/docs/markdown-features/diagrams | MIT, 2026-09-15 | -| 27 | https://github.com/prometheus/node_exporter | textfile collector, 2026-09-15 | - ---- - -## Ek B: 27 Soru → Karar İzlenebilirliği - -> NOT: `SUMMARY.md` Faz 4'te üretilecek; aşağıdaki S-01…S-27 listesi şartname + plandaki 27 kritik sorunun Faz 2 karşılığıdır. SUMMARY yazıldığında her cevap buradaki karara linklenecek. - -| # | Soru | Karar | Doküman | -|---|---|---|---| -| S-01 | Hangi Ubuntu sürümü? | K-01 (Server 26.04.1+ LTS) | 03-UBUNTU-BASELINE | -| S-02 | Server mı Desktop mı? | K-01 (Server, GUI'siz kurulum) | 03 | -| S-03 | GNOME mu XFCE mi? | K-02 (GNOME; XFCE elendi) | 03, 07 | -| S-04 | Boot terminale mi grafiğe mi? | K-03 (terminal + bf-gui-on/off) | 03, 16 | -| S-05 | SSH nasıl (kullanıcı, auth, root)? | K-13 (key zorunlu, root kapalı) | 06 | -| S-06 | 700 cihazda tek key riski nasıl çözülür? | K-13 (per-admin key + CA hedefi) | 06 | -| S-07 | RDP hangi sunucu/masaüstü ile? | K-03 (xRDP + GNOME) | 07 | -| S-08 | RustDesk OSS neyi kapsar, Pro gerekir mi? | K-04 (OSS yeterli, Pro yok) | 07 | -| S-09 | WireGuard çökerse uzak erişim sürer mi? | K-04 (RustDesk/MeshCentral bağımsız) | 07, 08 | -| S-10 | 4. erişim kanalı hangisi? | K-04 (MeshCentral) | 07 | -| S-11 | AnyDesk ücretsiz kullanılabilir mi? | K-04 (HAYIR — mimariden çıkarıldı) | 07, 23 | -| S-12 | WireGuard modeli + keepalive + otomatik reconnect? | K-05 (hub-spoke, 25 sn, wg-quick enable) | 08 | -| S-13 | RDP/SSH dış dünyaya açık mı? | K-05 (hayır — WireGuard arkası) | 08, 11 | -| S-14 | Filo yönetimi hangi araç? | K-06 (Ansible + Semaphore Community) | 09 | -| S-15 | Semaphore Pro gerekir mi? | K-06 (hayır — kanıtlı) | 09, 23 | -| S-16 | Monitoring hangi yığın, 17 metrik nasıl? | K-07 (Prometheus + Kuma) | 14 | -| S-17 | Çevrimdışı/last-seen nasıl izlenir? | K-07 (`up` + Push monitör) | 14 | -| S-18 | Onaysız update politikası nedir? | K-11 (yasak + dalgalı onay zinciri) | 10 | -| S-19 | `unattended-upgrades` ne olacak? | K-11 (imajda kapalı) | 03, 10 | -| S-20 | Update dalgaları neler? | K-11 (LAB(2)/P1(5)/P2(20)/W1(50)/W2(100)/PROD) | 10, 18 | -| S-21 | Docker restart politikası ne? | K-10 (`unless-stopped`) | 12 | -| S-22 | `latest` / Watchtower serbest mi? | K-10 (ikisi de yasak) | 12 | -| S-23 | Docker + UFW çakışması nasıl çözülür? | K-10 (localhost-bind) | 11, 12 | -| S-24 | Log disiplini nedir? | K-10 + K-14 (rotasyon + textfile + bundle) | 12, 15 | -| S-25 | Golden image yöntemi ne? | K-09 (autoinstall + install.sh) | 04, 05 | -| S-26 | Cihaz kimliği standardı ne? | K-12 (`BF-` / `bf-`) | 02 | -| S-27 | Doküman platformu hangisi? | K-08 (Docusaurus) | 22 | - ---- - -## Ek: Karar Haritası (hangi soru hangi karara?) +## Ek: Medya ilişkisi (K-20) ```mermaid flowchart LR - SORU["27 soru (Ek B)
    S-01…S-27"] --> ZEMIN["Zemin: K-01/K-02/K-03
    K-09/K-10/K-11/K-12"] - SORU --> AG["Ağ + erişim: K-04/K-05/K-13"] - SORU --> OPS["Operasyon: K-06/K-07/K-14"] - SORU --> DOC["Docs: K-08"] - ZEMIN --> D1["03/04/05/10/12/02"] - AG --> D2["07/08/06/11"] - OPS --> D3["09/14/15"] - DOC --> D4["22"] + CUSTOM["V1 medya: TEK USB Field OS ISO
    /autoinstall.yaml (motor) + /blueforce-provisioning/
    offline APT + firstboot + release
    interactive-sections: [storage]"] --> OS["Kimliksiz Ubuntu zemin
    (operatör disk onayı, otomatik silme YOK)"] + OS --> P["PROVISIONED_OFFLINE"] + P --> EN["ENROLLED (token) → READY (merkezi kanıt)"] + UP["Geri dönüş yolu: upstream Ubuntu ISO"] --> OS + SEED["NoCloud seed USB (user-data + meta-data)"] --> OS + UP -. "F2B geri alınırsa sıcak yol" .-> CUSTOM ```
    - -# 25 — Uygulama Yol Haritası (Implementation Roadmap) + +# 28 — Windows'tan Linux'e Geçiş -> Kısa özet: Blueforce 700 cihaz projesinin FAZ'lı yol haritası: FAZ 0 hazırlık → FAZ 1 merkez → FAZ 2 imaj → FAZ 3 LAB/P1 → FAZ 4 dalgalar → FAZ 5 PROD + işletme. Katılımsız provisioning (unattended) ayrı FAZ'dır; temel akış çalışmadan otomasyona geçilmez. - -- Dosya: `docs/25-IMPLEMENTATION-ROADMAP.md` -- İlgili kararlar: `24-DECISION-LOG.md#K-09` (imaj + unattended sırası), `#K-11` (dalgalar), tüm K-01…K-14 (fazlara dağılım) -- Durum: [ ] Taslak +> Kısa özet: Windows saha cihazının Blueforce Field OS'a kontrollü dönüşümü: envanter, uygulama/veri kabulü, geri dönüş noktası, temiz kurulum ve teslim doğrulaması. Windows image'ı geri dönüş kanıtıdır; Linux kurulumu onu otomatik silmez. +> +> - Dosya: `docs/28-WINDOWS-TO-LINUX-MIGRATION.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-19`, `#K-01`, `#K-09`, `#K-11` +> - Durum: [ ] Taslak --- ## 1. Amaç -Projeyi "ne, hangi sırada, hangi kapıdan geçerek" sorusuyla yönetmek. Her FAZ'ın girişi, çıkışı ve sahibi bellidir; bir FAZ kapanmadan sonrakine iş taşınmaz. +Windows'tan geçişte veri, uygulama bağımlılığı veya geri dönüş kanıtını kaybetmeden saha cihazını Field OS standardına almak. ## 2. Kapsam -- Kapsam içi: FAZ tanımı, sıra ve bağımlılıklar, her FAZ'ın çıkış kriteri, unattended provisioning FAZ'ının yeri, doküman-faz eşleşmesi. -- Kapsam dışı: dalga cihaz sayıları detayı (18), update onay akışı (10), komut-seviyesi kurulum (03/04/05). +- Kapsam içi: ön envanter (araçlar: `scripts/migration/windows/`), kabul kaydı, Windows geri dönüş imajı, Field OS kurulumu, fonksiyonel kabul, araç adı/konum eşlemesi. +- Kapsam dışı: Windows uygulamasını Wine/VM ile çalıştırma kararı; bu ancak ayrı kabul sonrası ele alınır. ## 3. Kararlar ```text -KARAR: Yol haritası 7 FAZ'dır: F0 Hazırlık+Envanter → F1 Merkez VDS → F2 Golden image (katılımlı) → F3 LAB+P1 → F4 Dalgalar (P2/W1/W2) → F5 PROD+İşletme → F6 Katılımsız provisioning (unattended, ayrı FAZ). -GEREKÇE: Sıra bağımlılıkları zorlar: envanter olmadan imaj (K-09), imaj olmadan LAB, LAB olmadan dalga (K-11) olmaz. Unattended provisioning ayrı FAZ'dır çünkü katılımlı akış (USB→script→bayi no) sahada kanıtlanmadan PXE/preseed otomasyonu ek yük ve ek arıza yüzeyi demektir. -ALTERNATİF: Unattended'i en başa koyma — temel akıştaki hata otomasyonla çarpılır; elendi. Tek-faz "hepsini yap" planı — kapısız ilerleme, filo-çapı risk; elendi. -RİSK: FAZ atlama baskısı (takvim); azaltma: her FAZ çıkışı 21'deki onay yetkilisinin imzasına bağlıdır. -MALİYET: Ücretsiz (işgücü planlaması; VDS kira hariç). -LİSANS: Yok. +KARAR: Her Windows cihazı önce envanter ve geri dönüş kanıtı alır, sonra temiz Field OS kurulumu yapılır; Windows üzerinde yerinde yükseltme veya çift-boot V1 standardı değildir. +GEREKÇE: Temiz kurulum, taşınan Windows drift'ini ve lisans/driver belirsizliğini azaltır. Geri dönüş imajı kabul başarısızlığında hızlı geri sağlar. +ALTERNATİF: Yerinde dönüşüm/dual-boot — disk bölümü, bootloader ve işletim sorumluluğunu büyüttüğü için elendi. +RİSK: Gizli uygulama/veri bağımlılığı; saha kabul listesi ve imaj alma kapısıyla azaltılır. +MALİYET: Ücretsiz araçlar kullanılabilir; yedek disk/depoya altyapı maliyeti uygulanabilir. +LİSANS: Microsoft Windows geçiş lisans durumu kurum tarafından doğrulanır; Ubuntu — https://ubuntu.com/download/server ; Clonezilla — https://clonezilla.org/ (LAB gerekli). ``` ## 4. Neden Bu Karar? -Klasik hata sırası tersine çevirmektir: önce otomasyon, sonra temel. Bu harita bilerek "sıkıcı" sırayı seçer — önce elle çalışan, sonra kendiliğinden çalışan. F6'nın ayrı FAZ olması, unattended'in iptal edilebilir (proje yine de biter) ama atlanamaz (sırası gelmeden yapılmaz) olduğunu söyler. Her FAZ bir karar grubunu hayata geçirir; harita ile 24-DECISION-LOG arasındaki bağ tabloyla sabittir. +İşletim sistemi dönüşümü yalnız disk yazma işlemi değildir. Önce çalışan iş akışı ve geri dönüş seçeneği belirlenir; Field OS ancak kabul senaryosu geçince kalıcı teslim sayılır. ## 5. Alternatifler | Alternatif | Artı | Eksi | Sonuç | |---|---|---|---| -| Unattended ilk FAZ | Erken otomasyon | Kanıtlanmamış akışın otomasyonu | Elendi (F6'ya taşındı) | -| Az FAZ (3 büyük) | Kısa plan | Kapılar seyrek, risk büyük | Elendi | -| Çok FAZ (12+) | Detaylı | Yönetim yükü, faz yorgunluğu | Elendi | +| Envanter + image + temiz kurulum | Deterministik | İlk adım daha uzun | **Seçildi** | +| Yerinde yükseltme | Az ilk iş | Desteklenmeyen drift | Elendi | +| Dual-boot | Anında geri dönüş | Boot/disk karmaşıklığı | Elendi | ## 6. Avantajlar -- Her FAZ bağımsız kapanır; proje yarıda kalsa bile kazanım (örn. F1 merkezi) kalır. -- F6 opsiyoneldir: katılımlı akışla PROD bitebilir, unattended sonradan eklenir. +- Her geçiş denetlenebilir ve geri alınabilir. +- Linux kabulü gerçek saha işi üzerinden ölçülür. ## 7. Dezavantajlar -- FAZ disiplini yavaş görünür; paydaşa "neden F6 en sonda" açıklaması gerekir (gerekçe §4'tür). -- FAZ'lar arası bekleme (gözetim süreleri) takvimi uzatır. +- Image depolama ve saklama süresi gerekir. +- Uygulama sahibi kabul vermeden cihaz üretime çıkamaz. ## 8. Riskler | Risk | Olasılık | Etki | Azaltma | |---|---|---|---| -| FAZ çıkışı atlanır, sonrakine geçilir | Orta | Yüksek | Onay yetkilisi imzası zorunlu (21) | -| Merkez VDS donanımı yetersiz çıkar (F1) | Orta | Orta | LAB yük testi; servisleri ikinci VDS'e bölme planı (01) | -| Donanım profili imajı kırar (F2→F3) | Orta | Orta | F0 envanteri + F3 profil matrisi | +| Veri kaybı | Düşük | Yüksek | İmaj hash + restore prova | +| MEG/çevre birimi uyumsuzluğu | Orta | Yüksek | 13 kabul testi + LAB profil matrisi | +| Yanlış cihaz silinir | Düşük | Yüksek | `BF-` ve seri no çift doğrulama | ## 9. Uygulama Planı -| FAZ | Ad | Kararlar | Çıkış kriteri | Dokümanlar | -|---|---|---|---|---| -| F0 | Hazırlık + donanım envanteri | K-12 (kimlik), K-09 (tarama-önce) | Profil listesi + envanter şeması onaylı | 02, 18 (FAZ 0), 00 | -| F1 | Merkez VDS kurulumu | K-04, K-05, K-06, K-07, K-08 | WG hub + hbbs/hbbr + MeshCentral + Semaphore + Prometheus/Kuma ayakta; L9 tatbikatı yapıldı | 06, 07, 08, 09, 14, 17-L9 | -| F2 | Golden image (katılımlı) | K-01, K-02, K-03, K-09, K-10, K-11 | `blueforce-install.sh` USB→READY akışı LAB donanımında çalışıyor; `unattended-upgrades` kapalı; tag/`unless-stopped` denetli | 03, 04, 05, 12 | -| F3 | LAB(2) + P1(5) | K-11 (dalga), K-14 (bundle), K-05 (kopma sayacı) | 3 akış yeşil; teknisyen desteksiz kurulum yaptı; kopma sayacı toplandı | 18, 19, 20, 10 | -| F4 | Dalgalar P2/W1/W2 | K-11, K-06, K-07 | Her dalga çıkış kriteri + halt kaydı; destek yükü hedefte | 18, 21, 14 | -| F5 | PROD (~523) + işletmeye alma | Tümü | Filo READY; rutinler (günlük/haftalık) devrede; `v1` doküman kesildi | 21, 22, 23 | -| F6 | Katılımsız provisioning (unattended) | K-09 (hedef) | Teknisyen girdisiz (veya minimum-girdili) kurulum P2 ölçeğinde kanıtlı; katılımlı akış yedekte duruyor | 04 (F6 eki) | - -F6 notu: F6, F5'ten sonra başlar; F5'in kapanmasına engel değildir. F6 kapsamı (PXE/preseed derinliği, ağ gereksinimleri) F3 verisine göre F4 içinde netleştirilir. F6 başarısız olursa proje F5 haliyle tamam sayılır. +1. Windows cihaz seri no, bayi no, disk durumu, çevre birimi ve kritik iş akışını kaydet. +2. Onaylı araçla geri dönüş imajı al, hash doğrula, saklama kaydı oluştur. +3. İş sahibi kesinti penceresini onaylar; ardından Field OS temiz kurulumu ve 27/29 akışı uygulanır. +4. 13-MEG kabulü, remote erişim, güç dönüşü ve monitoring doğrulanır; yalnız `READY` sonrası teslim yapılır. ```bash -# örnek: FAZ kapısı kontrolü (merkez) -# F3 çıkışı için LAB doğrulama seti -ansible-playbook playbooks/verify-lab.yml --limit lab -bf-support-bundle --out /tmp/f3-gate-bundle.tar.gz +# Linux kurulum USB'sinden önce: imaj aracının kendi hash doğrulaması kayıt altına alınır. +# Kurulumdan sonra: +bf-status +systemctl is-active docker wg-quick@wg0 +``` + +### 9.1 Araç konumu (gerçek durum) + +Windows ön-geçiş araçları repo kökündeki `migration/` altında DEĞİL, **`scripts/migration/windows/`** altındadır (operasyonel scriptlerin tamamı `scripts/{install,maintenance,diagnostics,recovery,migration}` düzeninde tutulur): + +| İstenen ad/yol (brief) | Depodaki gerçek ad/yol | Not | +|---|---|---| +| `migration/windows/` | `scripts/migration/windows/` | Kökteki `migration/README.md` yalnız **işaret dosyasıdır** (pointer); aynı aracın iki gerçek kopyası drift üretir ve `tests/check-migration-static.sh` tek kanonik dizini zorunlu tutar | +| `bf-win-inventory.ps1` | `scripts/migration/windows/BF-WindowsPreMigrationInventory.ps1` | Kimlik/donanım/OS/disk blokları | +| `bf-win-network-export.ps1` | aynı script (`network` + `serial_ports` + `usb` bölümleri) | Ayrı dosya değil, birleştirildi | +| `bf-win-software-export.ps1` | aynı script (`installed_software`/`services`/`scheduled_tasks`/`drivers`/`docker`/`vpn`/`remote_access`/`meg`; `-NoSoftware` ile atlanabilir) | Ayrı dosya değil, birleştirildi | +| `bf-win-device-export.ps1` | `scripts/migration/windows/BF-WindowsDataExport.ps1` | `BF--windows-inventory-export.json/.md` üretir; hiçbir veri kopyalamaz (metadata-only) | + +Kanonik eşleme/ayrıntı: `scripts/migration/windows/README.md` (yetkili ad sapma kaydı), konum denetim kaydı: `docs/32-REPOSITORY-AUDIT-AND-CONFLICTS.md` §B-6. **Dosyalar yeniden adlandırılmaz**; eşleme tablosu tek doğruluk kaynağıdır. + +```powershell +# LAB/atölye: araçları bu yoldan çalıştır (yönetici PowerShell) +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\migration\windows\BF-WindowsPreMigrationInventory.ps1 -DealerId 12010193 -OutputDirectory C:\Blueforce\migration +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\migration\windows\BF-WindowsDataExport.ps1 -DealerId 12010193 -OutputDirectory C:\Blueforce\migration +``` + +### 9.2 Araçların sınırları + +- İki araç da **okuma-only**'dir: veri kopyalamaz, disk bölmez, Windows ayarı değiştirmez, credential toplamaz (`tests/check-migration-static.sh` mutasyon/credential yasağını denetler). +- Çıktı `BF-` etiketiyle dosyalanır ve iş sahibi onayına eklenir; çıktıda private key/token/parola bulunmaz. +- Linux tarafındaki karşılığı `scripts/diagnostics/bf-live-hw-check` (kurulum sonrası salt-okuma donanım kapısı) ve `bf-hardware-inventory.sh`'tir. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Windows image restore provası | Kaynak iş akışı geri gelir | LAB temsilci cihaz | +| Field OS temiz kurulum | PROVISIONED_OFFLINE veya ENROLLED | LAB(2) | +| Ön-geçiş araçları (okuma-only) | Envanter + veri manifesti üretilir; mutasyon/credential yok | LAB temsilci cihaz | +| Araç yolu denetimi | Araçlar `scripts/migration/windows/` altından koşar; kökteki `migration/` yalnız pointer | CI (`check-migration-static`) | +| MEG/periferik kabul | 13 kriterleri geçer | Pilot | +| Geri dönüş kararı | Tanımlı RTO içinde uygulanır | Pilot tatbikat | + +## 11. Rollback + +1. Field OS kabulü başarısızsa cihaz üretime verilmez. +2. Onaylı Windows image geri yüklenir, hash ve iş akışı doğrulanır. +3. Hata kaydı cihaz profiline eklenir; düzeltilmiş Field OS release'i LAB'dan tekrar geçmeden yeni deneme yapılmaz. + +## 12. Kontrol Listesi + +- [ ] Windows envanteri ve iş sahibi onayı var. +- [ ] Geri dönüş image'ı hash ile doğrulandı. +- [ ] Cihaz/seri no iki kişi veya iki kayıtla eşleştirildi. +- [ ] Field OS yalnız kabul + READY sonrası teslim edildi. +- [ ] Envanter/veri manifesti `scripts/migration/windows/` araçlarıyla üretildi (ad eşlemesi §9.1'e göre doğrulandı). + +## 13. Açık Sorular + +- [ ] Windows image saklama süresi ve erişim yetkisi — sahibi: güvenlik/operasyon. +- [ ] Her periferik için Linux sürücü kabul matrisi — sahibi: MEG sahibi. +- [ ] Ön-geçiş araçlarının ad sapması (`bf-win-*` → `BF-Windows*`) `docs/32` §B-6 kaydıyla kapanmış sayılır mı, yoksa brief adlarıyla uyumluluk için sarmalayıcı mı gerekir — karar sahibi: 32 yazarı + operasyon. + +> **Güncelleme (2026-09-16):** §9.1/§9.2 eklendi. Eski metin araç adlarını/konumlarını belirtmiyordu; bu turda **gerçek durum** yazıldı: araçlar `scripts/migration/windows/BF-WindowsPreMigrationInventory.ps1` ve `BF-WindowsDataExport.ps1`, kökteki `migration/` yalnız işaret dosyasıdır. Brief'te geçen `bf-win-inventory.ps1`, `bf-win-network-export.ps1`, `bf-win-software-export.ps1`, `bf-win-device-export.ps1` adları **eşleme tablosuyla** karşılandı; dosyalar yeniden adlandırılmadı (tek kanonik dizin kuralı). + +--- + +## Ek: Geçiş kapısı + +```mermaid +flowchart LR + W["Windows envanter + image"] --> A["İş sahibi onayı"] + A --> F["Field OS temiz kurulum"] + F --> C["MEG / erişim / güç kabulü"] + C -->|Geçti| R["READY + teslim"] + C -->|Kaldı| B["Windows image restore"] +``` + + + +# 29 — Cihaz Enrollment + +> Kısa özet: Device enrollment, offline provision edilmiş cihazın merkezi envantere bir kez bağlanması ve merkezi kanallarca doğrulanmasıdır. Durum modeli **tek yönlüdür**: `PROVISIONED_OFFLINE → ENROLLED → READY`; geri dönüş kenarı ve durum atlama yoktur (`PROVISIONED_OFFLINE → READY` doğrudan olamaz). Tek kullanımlık token `ENROLLED` verir; yalnız WireGuard, erişim ve monitoring doğrulanınca `READY` verilir. `READY` sonrası kurtarma yolu **yeniden provision**'dır (27), durumu geri sarmak değil. +> +> - Dosya: `docs/29-DEVICE-ENROLLMENT.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-17` (enrollment), `#K-21` (tek durum kaynağı ve ileri-yönlü geçişler), `#K-12`, `#K-05`, `#K-07` +> - Durum: [ ] Taslak + +--- + +## 1. Amaç + +Cihaz kimliğinin, ağ kaydının ve merkezi gözlemin sahada güvenli sırayla birleştirilmesini tanımlamak. + +## 2. Kapsam + +- Kapsam içi: durum makinesi, token özellikleri, merkezi kayıt, WG/remote/monitoring kapıları, token iptal kaydı. +- Kapsam dışı: offline işletim sistemi kurulumu (27), SSH anahtar yaşam döngüsü (06), release seçimi (30). + +## 3. Kararlar + +```text +KARAR: Enrollment bir kez kullanılan, süreli ve cihaz kimliğine bağlı token ile yapılır. Durum modeli üç durumdur ve TEK YÖNLÜDÜR: PROVISIONED_OFFLINE → ENROLLED → READY. Geçişler ileri yönlüdür; **geri dönüş kenarı yoktur ve durum atlanamaz** (PROVISIONED_OFFLINE → READY doğrudan olamaz, READY → ENROLLED geri alınmaz). READY sonrası kurtarma yolu durumu geri sarmak değil, cihazı 27'ye göre YENİDEN PROVISION etmektir (yeni yaşam döngüsü: PROVISIONED_OFFLINE'dan başlar). Tek kaynak `/var/lib/blueforce/state.json` + `bf-enrollment-status` çıktısıdır. +GEREKÇE: Offline medya secret taşımaz; token yalnız bağlantı oluştuğunda kullanılır. READY, token kullanımından değil merkezi erişim ve health kanallarının gerçek doğrulamasından doğar. Geçmişi geri sarma kenarları "hangi cihaz ne zaman READY oldu" denetimini bulanıklaştırır ve yanlış teslim üretir; kurtarmayı yeniden provision'a bağlamak denetim izini tek yönlü ve kanıtlı tutar. Uygulanan kod bu sözleşmeyi zorlar: `bf-enrollment-status` yalnız üç durumu geçerli sayar, `bf-enroll` yalnız PROVISIONED_OFFLINE/ENROLLED fazından enrollment kabul eder. +ALTERNATİF: Kalıcı ortak bootstrap token — sızıntıda tüm filoyu etkiler; elendi. Geri alınabilir durum geçişleri (READY → ENROLLED) — denetim izini belirsizleştirir ve "READY gerçekten alındı mı" sorusunu cevapsız bırakır; reddedildi. Ayrı bir RETIRED/REVOKED durumu eklemek — açık soru olarak §13'te (bugünkü sözleşme `INVALID`/`PENDING` + exit≠0 ile fail-closed davranır). +RİSK: Token çalınması veya yanlış cihazda kullanılması; kısa TTL, tek kullanım, `BF-` bağlama ve anlık iptal ile azaltılır. READY sonrası kurtarmanın yeniden provision gerektirmesi saha süresi maliyeti doğurur; azaltma: 17-RECOVERY kademeleri (L1→L9) önce denenir, yeniden provision son çare. +MALİYET: Ücretsiz. +LİSANS: OpenSSH — https://www.openssh.com/ ; WireGuard — https://www.wireguard.com/ ; token API davranışı kurum içi uygulama ve LAB doğrulamasıdır. +``` + +> **Güncelleme (2026-09-16, K-21):** Bu dosyanın ek diyagramındaki iki geri dönüş kenarı (`ENROLLED → PROVISIONED_OFFLINE`, `READY → ENROLLED`) uygulanan kuralla çelişiyordu ve kaldırılmıştır. Uygulanan kural: **geçişler ileri yönlüdür; geri dönüş ve atlama yoktur.** READY sonrası kurtarma yolu yeniden provision'dır (27) — ayrıntı §11 ve Ek'teki ikinci diyagram. + +## 4. Neden Bu Karar? + +İlk kurulumdaki cihaz, merkez açısından henüz bilinmeyen bir uçtur. Token yalnız kimlik bağlama yetkisi verir; merkezi kanalların gerçekten çalıştığını ispatlamaz. Bu ayrım yanlış READY teslimini engeller. Durumun tek yönlü olması da aynı amaca hizmet eder: "kuruldu → bağlandı → doğrulandı" sırası kanıt zinciridir; geri sarmalı kenarlar bu zinciri koparır ve denetimde hangi durumun ne zaman gerçek olduğunu belirsizleştirir. Bir cihaz READY'den düşürülmesi gerekiyorsa yapılan iş **yeni bir provision + enrollment + READY kanıtı** üretmektir (27), eski durumu geri yazmak değil. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Tek-kullanımlık, TTL'li token | Küçük sızıntı alanı | Token üretim hizmeti gerekir | **Seçildi** | +| Ortak kalıcı token | Basit | Filo çapı sızıntı | Elendi | +| Manuel merkezi kayıt | Ek sistem yok | Hata/audit zayıf | Elendi | + +## 6. Avantajlar + +- Her kayıt hangi cihaz, kim ve ne zaman ile ilişkilidir. +- READY bağımsız sağlık kanıtına bağlıdır. + +## 7. Dezavantajlar + +- Cihazın internete kavuşması gerekir. +- Token hizmeti ve iptal kaydı işletilir. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Token tekrar kullanımı | Düşük | Yüksek | Atomik tüketim + audit | +| Kimlik çakışması | Düşük | Yüksek | Envanter benzersizlik kapısı | +| WG var ama health yok | Orta | Orta | READY için üç kanal şartı | +| READY sonrası kurtarma yolu yanlış modellenir (durum geri sarma denemesi) | Orta | Orta | Geçişler ileri yönlü; kurtarma = 27 yeniden provision; `bf-enrollment-status` yalnız üç durumu geçerli sayar, aksi halde `INVALID`/`PENDING` + exit≠0 | +| `central_verification` alanları `pending` kalır, cihaz ENROLLED'da bekler | Orta | Orta | Fail-closed READY kapısı + enrollment yanıt sözleşmesinin zorunlu alanları | + +## 9. Uygulama Planı + +1. Merkezi admin, doğrulanmış bayi no için `BF-` bağlı, kısa ömürlü token üretir ve kayda açar. +2. Teknisyen tokenı yalnız cihaz ekranına girer; USB'ye, loga veya support bundle'a yazmaz. +3. Başarılı yanıtın tamamı doğrulanır; yalnız bundan sonra WireGuard yapılandırması atomik kurulur ve servis etkin/aktif ise durum `ENROLLED` olur. +4. `bf-check-ready`, kalıcı `READY` değerini okumaz: güncel WG handshake, etkin xRDP, RustDesk yapılandırması, isteğe bağlı Mesh ajanı ve merkezden gelen doğrulama kanıtını bağımsız denetler. Tümü geçerse `18-final-check` `READY` yazar. +5. **İleri-yönlü geçiş kuralı (uygulanan sözleşme):** durumlar yalnız `PROVISIONED_OFFLINE → ENROLLED → READY` sırasıyla ilerler. `PROVISIONED_OFFLINE → READY` doğrudan geçiş yoktur (merkezi kanal kanıtı token olmadan üretilemez); `ENROLLED → PROVISIONED_OFFLINE` veya `READY → ENROLLED` geri dönüş kenarı yoktur. Bir cihaz READY'den çıkarılması gerekiyorsa: + - önce 17-RECOVERY kademeleri (L1 servis restart → … → L8 USB ile sıfırdan imaj) denenir, + - kimlik/merkez kaydı ciddi biçimde bozuksa cihaz merkezi erişimden çekilir, token/peer iptal edilir ve **27'ye göre yeniden provision edilir**; yeniden provision yeni bir yaşam döngüsü başlatır (`PROVISIONED_OFFLINE` → yeni token → `ENROLLED` → yeni READY kanıtı). + - Yani kurtarma "durumu geri sarmak" değil, "kanıtı yeniden üretmek"tir. + +```bash +# BF_ENROLLMENT_ENDPOINT is supplied by the approved central control plane configuration. +printf '%s\n' '' | sudo -E bf-enroll --token-stdin +bf-enrollment-status # yalnız PROVISIONED_OFFLINE | ENROLLED | READY; aksi halde INVALID/PENDING + exit≠0 +bf-check-ready ``` ## 10. Test Planı | Test | Beklenen sonuç | Ortam | |---|---|---| -| F1 L9 tatbikatı (boş VDS'e kur) | Tüm merkez servisleri ayağa kalkar | İzole VDS | -| F2 imaj denetim seti (K-10/K-11 kilitleri) | `latest` yok, timer'lar maskeli, politika `unless-stopped` | LAB(2) | -| F3 3-akış + rollback | Erişim/boot/update + geri alma yeşil | LAB(2)/P1(5) | -| F6 unattended prova | Minimum-girdi ile READY | P2 ölçeği | +| Geçerli token | PROVISIONED_OFFLINE → ENROLLED | LAB(2) | +| Aynı token ikinci kez | Reddedilir, audit kaydı | LAB(2) | +| Süresi geçmiş/yanlış cihaz tokenı | Reddedilir | LAB(2) | +| Merkezi kanallar eksik | ENROLLED kalır, READY olmaz | LAB(2) | +| Token olmadan READY denemesi | READY yazılmaz (atlama yok) | LAB(2) | +| READY sonrası kurtarma provası | Durum geri sarmak yerine 27 yeniden provision yolu çalışır | LAB(2) | ## 11. Rollback -1. FAZ içi hata: ilgili dalga/iş 17-RECOVERY veya 10-UPDATE zinciriyle geri alınır; FAZ tekrarlanır. -2. FAZ kararı yanlışsa (örn. imaj yöntemi): 24-DECISION-LOG PR'ı + bağımlı FAZ'ların tekrarı. -3. F6 geri alınırsa katılımlı akışa dönülür (yedek her zaman sıcak tutulur). +1. Token yanlış kullanılırsa merkezi admin tokenı iptal eder ve geçici kayıtları kapatır (cihaz ENROLLED'da kalır; READY'ye ilerlemez). +2. Yanlış WireGuard peer/etiket, `ENROLLED` durumunda düzeltilir ve yeniden doğrulanır. +3. READY sonrası ciddi kimlik sorunu varsa cihaz merkezi erişimden çekilir, token/peer iptal edilir ve **27'den yeniden provision edilir**. Bu "rollback" bir durum geri alma değildir: yeni yaşam döngüsü PROVISIONED_OFFLINE'dan başlar ve READY yeniden kanıtlanır (geçişler ileri yönlüdür). ## 12. Kontrol Listesi -- [ ] Her FAZ'ın çıkış kriteri + sahibi yazılı ve onaylı. -- [ ] F6'nın F5 sonrası ayrı FAZ olduğu paydaşça kabul edildi. -- [ ] Doküman-faz eşleşmesi (tablodaki son sütun) güncel. -- [ ] Onay yetkilisi (asıl+vekil) tanımlı (21). +- [ ] Token tek kullanımlık, TTL'li ve `BF-` bağlı. +- [ ] Token hiçbir medya/log/support bundle içinde yok. +- [ ] ENROLLED ve READY farklı, görünür durumlar. +- [ ] WG + remote + monitoring doğrulaması kayda bağlı. +- [ ] Merkez yanıtındaki `central_verification` kanıtı olmayan veya `pending` olan cihaz READY olmaz. +- [ ] Diyagramda/metinde geri dönüş kenarı ve durum atlama yok; READY sonrası kurtarma 27 yeniden provision olarak yazılı. ## 13. Açık Sorular -- [ ] FAZ tarihleri ve teknisyen kapasite planı (sahibi: yönetim + 18). -- [ ] F1 VDS donanım siparişi için LAB yük ölçümü (sahibi: 14-MONITORING yazarı). -- [ ] F6 kapsamı (PXE şart mı, USB-preseed yeter mi) — F3 verisi sonrası (sahibi: 04 yazarı). +- [ ] Token TTL süresi ve yetkili üretici rolleri — sahibi: güvenlik yöneticisi. +- [ ] Enrollment API audit saklama süresi — sahibi: merkezi admin. +- [ ] Geri dönüşsüz modelde "cihaz işletmeden çekildi" durumu için ayrı bir kalıcı damga (ör. `retired`) gerekir mi — karar sahibi: platform ekibi + 27 yazarı [K-21]. --- -## Ek: Mermaid — FAZ akışı +## Ek: Merkezi doğrulama yanıt sözleşmesi ve güven sınırı + +Enrollment yanıtı `central_verification` alanını **zorunlu** taşır. Alan secret, URL, erişim tokenı, RustDesk parolası veya WireGuard private key taşımaz; yalnız merkezde denetlenebilen referansları taşır: + +```json +{ + "central_verification": { + "status": "pending | verified", + "verification_id": "merkez-kayit-referansi", + "monitoring": {"status": "pending | verified", "verification_id": "izleme-referansi"}, + "remote": {"status": "pending | verified", "verification_id": "uzak-erisim-referansi"}, + "management": {"status": "pending | verified", "verification_id": "yonetim-referansi"} + } +} +``` + +İstemci merkez URL'si veya kanıt uydurmaz. `bf-remote-status` yalnız imzalanmış/kimliği doğrulanmış enrollment yanıtından kalıcılaştırılan bu referansların tümü `verified` olduğunda merkezi kanıtı geçer; alan eksik, biçimsiz veya `pending` ise `PENDING` ile fail-closed olur. Yerel xRDP, RustDesk, isteğe bağlı Mesh ve güncel WG handshake bu merkez kanıtından ayrı olarak kontrol edilir. + +## Ek: Durum makinesi (tek yönlü — geri dönüş kenarı yok) + +```mermaid +stateDiagram-v2 + [*] --> PROVISIONED_OFFLINE + PROVISIONED_OFFLINE --> ENROLLED: tek kullanımlık token (ileri) + ENROLLED --> READY: WG + remote + monitoring kanıtı (ileri) + note right of READY + Geri dönüş kenarı YOKTUR ve durum atlanamaz + (PROVISIONED_OFFLINE -> READY doğrudan olamaz). + READY sonrası kurtarma: 27'ye göre yeniden provision. + end note +``` + +## Ek: READY sonrası kurtarma yolu (yeni yaşam döngüsü) ```mermaid flowchart LR - F0["F0 Hazırlık
    + envanter"] --> F1["F1 Merkez VDS"] - F1 --> F2["F2 Golden image
    (katılımlı)"] - F2 --> F3["F3 LAB 2 + P1 5"] - F3 --> F4["F4 P2/W1/W2"] - F4 --> F5["F5 PROD + işletme"] - F5 --> F6["F6 Unattended
    (ayrı FAZ)"] + RDY["READY cihaz: kimlik/merkez kaydı ciddi biçimde bozuk"] --> CEK["Merkezi erişimden çek + token/peer iptal"] + CEK --> RP["27'ye göre YENİDEN PROVISION
    (yeni yaşam döngüsü başlar)"] + RP --> PO["PROVISIONED_OFFLINE"] + PO -->|yeni tek kullanımlık token| EN["ENROLLED"] + EN -->|yeni WG + remote + monitoring kanıtı| YENI["READY (yeniden kanıtlandı)"] + GERI["Durumu geri sarma (READY → ENROLLED vb.)"] -.->|"YASAK"| RDY ```
    + +# 30 — Field OS Release Yönetimi + +> Kısa özet: Field OS release'i ISO/seed, offline APT snapshot, kurucu, Ansible içerikleri ve manifestten oluşan değişmez bir sette yönetilir. Her release LAB→P1→P2→W1→W2→PROD kapılarından geçer; rollback önceki onaylı release'e döner. +> +> - Dosya: `docs/30-FIELD-OS-RELEASE-MANAGEMENT.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-18`, `#K-11`, `#K-15`, `#K-16` +> - Durum: [ ] Taslak + +--- + +## 1. Amaç + +Field OS değişikliklerini reproducible, onaylı ve geri alınabilir release'lere dönüştürmek. + +## 2. Kapsam + +- Kapsam içi: release bileşenleri, sürüm/manifest, imza-checksum, dalga kapıları, support penceresi ve rollback. +- Kapsam dışı: tek paketin teknik upgrade komutları (10), cihaz enrollment (29). + +## 3. Kararlar + +```text +KARAR: Field OS release'i değişmez manifestli artefact setidir: upstream ISO referansı, seed, offline APT snapshot, kurucu/Ansible commit'i, paket sürümleri ve checksum'lar birlikte sürümlenir. +GEREKÇE: "26.04.1" tek başına çalışır sistemi anlatmaz; seed ve installer değişirse davranış değişir. Manifest, aynı release'in yeniden kurulmasını ve kanıtlanmasını sağlar. +ALTERNATİF: Yalnız Git branch veya latest ISO etiketi — hangi bileşenin sahaya gittiği belirsiz kalır; elendi. +RİSK: Artefact uyumsuzluğu veya imzasız medya; build kapısı, checksum ve LAB kabulü ile azaltılır. +MALİYET: Ücretsiz. +LİSANS: Git — https://git-scm.com/doc ; Ubuntu releases — https://releases.ubuntu.com/ ; Docker image tag ilkeleri — https://docs.docker.com/reference/cli/docker/image/pull/ (26.04 davranışı LAB gerektirir). +``` + +## 4. Neden Bu Karar? + +Release, bir kurulum medyası değil çalışan sistem sözleşmesidir. İmaj, seed, paket snapshot'ı ve kurucu farklı tarihlerden seçilirse hata tekrar üretilemez ve rollback güvenilmez olur. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Immutable manifest release | İzlenebilir/rollbackli | Release disiplini | **Seçildi** | +| `latest`/hareketli medya | Kolay görünür | Determinizm yok | Elendi | +| Sadece cihazda sürüm notu | Az merkez işi | Filo görünürlüğü yok | Elendi | + +## 6. Avantajlar + +- Bir cihazın hangi release ile kurulduğu kesin olarak bulunur. +- Önceki onaylı release, gerçek rollback hedefidir. + +## 7. Dezavantajlar + +- Artefact deposu ve release kaydı işletilir. +- Küçük değişiklik bile manifest/review gerektirir. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Artefact eksikliği | Orta | Yüksek | Release gate: manifest + checksum zorunlu | +| Rollback test edilmez | Orta | Yüksek | LAB restore/rollback kanıtı | +| Eski release güvenlik riski | Orta | Orta | Support penceresi, hızlandırılmış dalga | + +## 9. Uygulama Planı + +1. Release adı örneği: `field-os-26.04.1-r001`; manifestte ISO/seed/APT/installer/Ansible/MEG sürümlerini açık yaz. +2. Her artefact için SHA256 ve kaynak/oluşturma kaydı üret; secret manifestte bulunmaz. +3. LAB'da fresh install, offline install, enrollment, erişim, power-loss ve rollback kanıtı üret. +4. Merkezi admin 10'daki dalga kapılarıyla yayını onaylar; başarısızlıkta yeni dalga açılmaz. + +```bash +sha256sum field-os-26.04.1-r001-manifest.json +# Manifest içerikleri release imzası/checksum süreciyle doğrulanır. +git tag -v field-os-26.04.1-r001 # imzalı tag kullanılıyorsa +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Manifest bütünlüğü | Tüm artefact hash'leri eşleşir | Build/LAB | +| Fresh + offline install | Aynı release kimliği görünür | LAB(2) | +| Rollback | Önceki onaylı release'e döner | LAB(2) | +| P1 gözlem | 24–48 saat sağlık kapısı temiz | P1(5) | + +## 11. Rollback + +1. Yayılım durdurulur; etkilenen dalga önceki onaylı manifestteki paket/config/artefact sürümüne döner. +2. `bf-status`, merkezi metrikler ve cihaz release kimliği doğrulanır. +3. İmaj seviyesinde sorun varsa 26'daki upstream ISO + önceki onaylı seed ile yeniden kurulum son çaredir. + +## 12. Kontrol Listesi + +- [ ] Release ID ve immutable manifest var. +- [ ] ISO, seed, APT snapshot, installer ve uygulama sürümleri kaydedildi. +- [ ] Checksums/imza ve LAB kanıtı var. +- [ ] Dalga onayı ve rollback kanıtı kaydedildi. + +## 13. Açık Sorular + +- [ ] Artefact depolama/retention ve imza anahtarı sahibi — sahibi: release yöneticisi. +- [ ] Release cadence ve EOL politikası — sahibi: merkezi admin. + +--- + +## Ek: Release kapısı + +```mermaid +flowchart LR + B["Build + manifest"] --> L["LAB: install/enroll/power/rollback"] + L --> P1["P1"] --> P2["P2"] --> W["W1/W2"] --> R["PROD"] + L -->|Kaldı| O["Önceki onaylı release rollback"] + P1 -->|Kaldı| O +``` + + + +# 31 — Blueforce Field OS Öğrenme Rehberi + +> Kısa özet: Bu rehber, Field OS'u güvenle işletmek için gereken Linux, ağ, otomasyon ve release kavramlarını öğretir. Her konu **Nedir / Neden / Nerede / Arıza belirtisi / Komutlar** biçimindedir; üretimde değişiklik yapmadan önce LAB'da uygulanır. +> +> - Dosya: `docs/31-LEARNING-GUIDE.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-01…K-24` (özellikle medya için `#K-20`, durum modeli için `#K-21`, RDP/yerel GUI için `#K-22`, GNOME vs XFCE ölçümü için `#K-23`) +> - Durum: [ ] Taslak — komutlar örnektir; 26.04 ve RustDesk headless ayrıntıları LAB'da doğrulanmalıdır + +--- + +## 1. Amaç + +Teknisyen ve merkezi operatörün, Field OS'un neden böyle tasarlandığını ve temel kontrolleri hangi sırayla yapacağını öğrenmesini sağlamak. + +## 2. Kapsam + +- Kapsam içi: filesystem, paket yönetimi, servis/log, Git/Bash, SSH/ağ, WireGuard, Docker/Ansible/Semaphore/Prometheus, uzak erişim, autoinstall/NoCloud/ISO/offline APT, enrollment, golden image, release ve rollback. +- Kapsam dışı: gizli anahtar üretimi, prod değişikliği veya 13/20/21 yerine geçecek işletim yetkisi. + +## 3. Kararlar + +```text +KARAR: Eğitim, komut ezberi yerine Nedir/Neden/Nerede/Arıza belirtisi/Komutlar çerçevesiyle ve yalnız LAB pratiğiyle verilir. +GEREKÇE: 700 cihazda yanlış komutun etkisi büyüktür; kavramı bilen operatör belirtileri doğru runbook'a yönlendirir ve onaysız değişiklik yapmaz. +ALTERNATİF: Sadece kısa komut listesi — bağlam olmadan yanlış kullanım riski yüksek olduğu için elendi. +RİSK: Doküman, sürüme özgü davranışı kesinmiş gibi gösterebilir; Ubuntu 26.04 ve RustDesk headless ayrıntıları açık LAB etiketiyle tutulur. +MALİYET: Ücretsiz. +LİSANS: Resmi kaynak URL'leri her konu altında verilmiştir; kurum içi runbook'lar kendi lisansına tabidir. +``` + +> **Güncelleme (2026-09-16, K-20/K-21/K-22/K-23):** Bu rehberdeki medya, RDP ve durum modeli anlatımları ikinci tur kararlarla hizalandı: (1) V1 medyası **tek USB Field OS ISO**, upstream ISO + seed **geri dönüş yolu**; (2) **xRDP her zaman hazır**, `bf-gui-*` yalnız yerel fiziksel GUI; (3) durum geçişleri **ileri yönlü**, READY sonrası kurtarma 27'ye göre yeniden provision; (4) LAB'da **GNOME vs XFCE A/B ölçümü** yapılır (XFCE saha standardı değil). + +## 4. Neden Bu Karar? + +Field OS; standart Linux araçlarını, merkezi otomasyonu ve katmanlı güvenlik kapılarını birlikte kullanır. Bir katmanın anlamını bilmek, örneğin `READY` ile yalnızca çalışan bir servisi karıştırmayı önler. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Kavram + güvenli komut + LAB | Kalıcı öğrenme | Başlangıçta daha uzun | **Seçildi** | +| Ezber komut kartı | Hızlı | Hata teşhisi zayıf | Elendi | +| Prod üzerinde deneme | Gerçek ortam | Filo riski | Yasak | + +## 6. Avantajlar + +- Runbook'ların ardındaki teknik bağ görünür olur. +- Her komutun beklenen sonucu ve arıza belirtisi vardır. + +## 7. Dezavantajlar + +- Rehber resmi ürün dokümanının yerine geçmez. +- Bazı davranışlar donanım ve Ubuntu nokta sürümüne bağlıdır. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Prod'da deney komutu | Orta | Yüksek | LAB-only etiketi, 20/21 yetki sınırı | +| Secret'ın komuta/loga girmesi | Orta | Yüksek | Placeholder kullan, secret yazma | +| Sürüm farkı | Orta | Orta | Resmi URL + LAB kayıtları | + +## 9. Uygulama Planı + +### 1. Filesystem ve Bash + +**Nedir:** Linux filesystem; `/etc` yapılandırma, `/var` değişen veri/log, `/usr` programlar, `/home` kullanıcı verisidir. Bash kabuk ve komut dili olarak bunlarla çalışır. + +**Neden:** Yanlış dosyayı düzenlemek veya alanı dolu diski kaçırmak servis arızası üretir. + +**Nerede:** `/etc/wireguard/wg0.conf`, `/var/log/`, `/var/lib/blueforce/`, `/usr/local/bin/`. + +**Arıza belirtisi:** `No space left on device`, izin reddi, servis config'i okumuyor. + +**Komutlar (LAB):** +```bash +pwd; ls -lah /etc /var/lib/blueforce +df -h; df -i +findmnt /; stat /etc/hostname +``` +Resmi kaynak: https://www.gnu.org/software/bash/manual/ ; https://www.freedesktop.org/software/systemd/man/latest/file-hierarchy.html + +### 2. APT ve dpkg + +**Nedir:** `apt` paket bağımlılıklarını çözen yüksek seviye araçtır; `dpkg` kurulu `.deb` paket veritabanını yönetir. + +**Neden:** Offline medya veya yarım kurulumda paketin kurulu olup olmadığını ve yarım işlemi anlamak gerekir. + +**Nerede:** `/etc/apt/`, `/var/lib/dpkg/`, offline APT snapshot (27). + +**Arıza belirtisi:** `dpkg was interrupted`, bağımlılık hatası, yanlış paket sürümü. + +**Komutlar (LAB):** +```bash +apt-cache policy xrdp +dpkg -l xrdp +dpkg -S /usr/sbin/xrdp +sudo dpkg --configure -a +``` +Resmi kaynak: https://manpages.ubuntu.com/manpages/noble/en/man8/apt.8.html ; https://manpages.ubuntu.com/manpages/noble/en/man1/dpkg.1.html + +### 3. systemd ve journalctl + +**Nedir:** systemd servisleri ve boot hedeflerini yönetir; journald olay günlüklerini tutar, `journalctl` okur. + +**Neden:** Field OS boot zinciri `multi-user.target` → network → WireGuard → Docker/ajanlar şeklindedir. + +**Nerede:** `/etc/systemd/system/`, drop-in `*.service.d/`, journal. + +**Arıza belirtisi:** `failed` servis, boot race, tekrar başlayan konteyner/ajan. + +**Komutlar (LAB):** +```bash +systemctl get-default +systemctl status wg-quick@wg0 --no-pager +journalctl -u wg-quick@wg0 -b --no-pager +systemd-analyze critical-chain docker.service +``` +Resmi kaynak: https://www.freedesktop.org/software/systemd/man/latest/systemctl.html ; https://www.freedesktop.org/software/systemd/man/latest/journalctl.html + +### 4. Git ve Bash çalışma disiplini + +**Nedir:** Git, doküman/config değişiklik geçmişidir; Bash scriptleri kurucu ve tanı komutlarını taşır. + +**Neden:** Release manifesti, seed ve Ansible değişiklikleri review ve geri alma olmadan sahaya gitmez. + +**Nerede:** Bu repo, `scripts/`, `ansible/`, release tag'leri. + +**Arıza belirtisi:** yanlış branch, temiz olmayan worktree, aynı dosyada iki farklı değişiklik. + +**Komutlar (LAB/yerel checkout):** +```bash +git status --short --branch +git log --oneline -5 +git diff --check +bash -n scripts/install/blueforce-install.sh +``` +Resmi kaynak: https://git-scm.com/docs ; https://www.gnu.org/software/bash/manual/ + +### 5. SSH ve anahtarlar + +**Nedir:** SSH şifreli yönetim bağlantısıdır; public key cihazda, private key yalnız yetkili admindedir. + +**Neden:** K-13'e göre parola/root SSH kapalı ve paylaşılan private key yasaktır. + +**Nerede:** `~/.ssh/`, `/etc/ssh/sshd_config.d/`, `authorized_keys`. + +**Arıza belirtisi:** `Permission denied (publickey)`, host key değişikliği, çok geniş yetki. + +**Komutlar (LAB):** +```bash +ssh -vvv blueforce@bf-12010193 +ssh-keygen -lf ~/.ssh/id_ed25519.pub +sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin' +``` +Resmi kaynak: https://www.openssh.com/manual.html ; https://man.openbsd.org/sshd_config + +### 6. Networking ve WireGuard + +**Nedir:** IP routing ağın yoludur; WireGuard, hub-spoke şifreli tüneldir. `PersistentKeepalive=25`, NAT arkasındaki spoke için varsayımdır. + +**Neden:** SSH/xRDP yalnız WireGuard içinden; RustDesk/MeshCentral WG-dışı yedek kanaldır. + +**Nerede:** `ip route`, `/etc/wireguard/wg0.conf`, hub peer envanteri. + +**Arıza belirtisi:** eski handshake, route yok, DNS/WAN hatası. + +**Komutlar (LAB):** +```bash +ip addr; ip route +sudo wg show wg0 latest-handshakes +ping -c 3 10.8.0.1 +ss -tlnp +``` +Resmi kaynak: https://www.wireguard.com/quickstart/ ; https://man7.org/linux/man-pages/man8/ip.8.html + +### 7. Docker + +**Nedir:** Docker uygulamaları container olarak paketler. Field OS'ta `unless-stopped`, sabit tag ve log rotasyonu zorunludur. + +**Neden:** Güç dönüşünde MEG kalkmalı; `latest` veya otomatik updater determinizmi bozar. + +**Nerede:** `/etc/docker/daemon.json`, compose dosyaları, Docker journal/logları. + +**Arıza belirtisi:** restart loop, disk dolumu, dışa açık port. + +**Komutlar (LAB):** +```bash +docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}' +docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' +docker logs --tail 100 +``` +Resmi kaynak: https://docs.docker.com/engine/containers/start-containers-automatically/ ; https://docs.docker.com/engine/logging/configure/ + +### 8. Ansible ve Semaphore + +**Nedir:** Ansible SSH üzerinden idempotent playbook çalıştırır; Semaphore bunun self-hosted operasyon arayüzüdür. + +**Neden:** 700 cihazda aynı değişiklik kontrollü dalgalarla uygulanır; UI bozulsa Ansible CLI yedektir. + +**Nerede:** `ansible/inventory/`, `ansible/playbooks/`, Semaphore projesi/key store. + +**Arıza belirtisi:** unreachable host, playbook drift'i, onaysız prod run denemesi. + +**Komutlar (LAB):** +```bash +ansible-inventory -i ansible/inventory/hosts.example.yml --graph +ansible-playbook -i ansible/inventory/hosts.example.yml ansible/playbooks/bf-ping.yml --check +``` +Resmi kaynak: https://docs.ansible.com/ansible/latest/ ; https://docs.semaphoreui.com/ + +### 9. Prometheus ve sağlık + +**Nedir:** Prometheus metrikleri scrape eder; Node Exporter host metriklerini verir; Grafana gösterir, Kuma last-seen sunar. + +**Neden:** `READY`, yalnız kurulum bitişi değil merkezi metrik/erişim kanıtıdır. + +**Nerede:** Node Exporter textfile dizini, Prometheus targets, Grafana/Kuma panoları. + +**Arıza belirtisi:** `up=0`, stale WG handshake, disk/RAM trendi, missing scrape. + +**Komutlar (LAB):** +```bash +systemctl is-active node_exporter +curl -fsS http://127.0.0.1:9100/metrics | grep '^node_boot_time_seconds' +ls -l /var/lib/node_exporter/textfile/ +bf-status +``` +Resmi kaynak: https://prometheus.io/docs/introduction/overview/ ; https://github.com/prometheus/node_exporter ; https://github.com/louislam/uptime-kuma + +### 10. RustDesk ve xRDP + +**Nedir:** xRDP GNOME'a WireGuard üzerinden RDP verir ve servisi **her zaman hazırdır** (`xrdp` + `xrdp-sesman` enable+active). `bf-gui-on` / `bf-gui-off` yalnız **yerel fiziksel** grafik katmanını (display-manager + default target) açar/kapatır; RDP'yi kontrol etmez. RustDesk, self-hosted `hbbs`/`hbbr` ile WireGuard'dan bağımsız grafik yedek erişimdir. + +**Neden:** RDP internete açılmaz; WG arızasında RustDesk/MeshCentral kurtarma yolu olur. "GUI kapalı ≠ RDP kapalı" ayrımı, yerel GUI kapatılmış bir saha cihazında uzaktan grafik kurtarmayı korur (K-22). + +**Nerede:** xRDP systemd birimleri (`xrdp`, `xrdp-sesman`), GNOME session ayarı, RustDesk client/server yapılandırması. + +**Arıza belirtisi:** RDP oturumu açılmıyor ama `systemctl is-active xrdp` "inactive" diyor (servis kapatılmış = sözleşme ihlali), boş GNOME oturumu, xRDP service hatası, RustDesk'te katılımsız erişim yok. + +**Komutlar (LAB):** +```bash +systemctl status xrdp xrdp-sesman --no-pager +sudo bf-gui-off; systemctl is-active xrdp xrdp-sesman # ikisi de "active" kalmalı (K-22 kanıtı) +ss -tlnp | grep ':3389' +journalctl -u xrdp -b --no-pager +``` +Resmi kaynak: https://github.com/neutrinolabs/xrdp ; https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ . **LAB gerekli:** Ubuntu 26.04.1 GNOME+xRDP ve RustDesk'in tam headless/katılımsız servis davranışı sürüm ve paketleme ile doğrulanmadan üretim sözü değildir. Aynı LAB'da **GNOME vs XFCE A/B ölçümü** yapılır: RAM, CPU, boot süresi, RDP güvenilirliği, RustDesk reboot sonrası davranışı, login screen erişimi, dummy display, 24/72 saat stabilite (K-23; XFCE saha standardı değildir, yalnız ölçüm koludur). + +### 11. Autoinstall, cloud-init, NoCloud ve ISO + +**Nedir:** Autoinstall Ubuntu kurulumunu otomatikleştiren **motordur**; cloud-init ilk boot yapılandırma çerçevesidir; NoCloud, `user-data`/`meta-data` sağlayan veri kaynağıdır. **Blueforce Field OS ISO ise paketleme/dağıtım yöntemidir**: autoinstall'ı, offline APT repo'yu ve firstboot'u tek medyada taşır — ikisi rakip değil, birlikte kullanılır (K-20). + +**Neden:** V1 medyası **tek USB Field OS ISO**'dur; teknisyen tek medya takar, kurulum katılımsız ilerler ve **yalnız disk adımı operatör onayı bekler** (`interactive-sections: [storage]` → otomatik disk silme YOK). Upstream ISO + ayrı NoCloud seed USB yolu kaldırılmadı: ISO boot etmezse aynı sonucu veren sıcak geri dönüş yoludur. + +**Nerede:** Medya kökü `/autoinstall.yaml`, `/blueforce-provisioning/{autoinstall,firstboot,offline-repo,release}`, seed USB kökü (`user-data`, `meta-data`), `/var/log/cloud-init*`. + +**Arıza belirtisi:** interaktif kurulum ekranı, schema hatası, seed bulunamadı, yanlış boot modu, ISO checksum uyuşmazlığı, `OFFLINE BLOCKED` (medyaya gömülü offline repo/pin yok). + +**Komutlar (LAB):** +```bash +provisioning/iso/test-iso.sh dist/Blueforce-Field-OS-1.0.0-amd64.iso # checksum + El Torito metadata +sha256sum -c dist/Blueforce-Field-OS-1.0.0-amd64.iso.sha256 +cloud-init status --long +cloud-init schema --config-file user-data +``` +Resmi kaynak: https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html ; https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html ; https://releases.ubuntu.com/ . **LAB gerekli:** 26.04.1'in kesin Subiquity/cloud-init söz dizimi, UEFI/Legacy/Secure Boot boot zinciri ve air-gapped kurulum. Not: LAB ISO'su Desktop flavour ile üretildi; baseline (Server) sapması `dist/1.0.0-manifest.yaml` → `baseline_deviation` bloğunda kayıtlıdır. + +### 12. Offline APT ve offline provisioning + +**Nedir:** Offline APT, sürümlü yerel repo/snapshot'tan paket kurmaktır; offline provisioning internetsiz cihazı `PROVISIONED_OFFLINE` durumuna getirir. + +**Neden:** Saha bağlantısı yokken kurulum yapılır; fakat merkezi doğrulama olmadan READY verilmez. + +**Nerede:** offline medya, `sources.list`, `/var/lib/dpkg/`, 27 prosedürü. + +**Arıza belirtisi:** paket bulunamadı, bağımlılık eksik, dpkg yarım kaldı, cihaz yanlışlıkla READY gösteriyor. + +**Komutlar (LAB):** +```bash +apt-cache policy +dpkg -l +sudo dpkg --configure -a +bf-status +``` +Resmi kaynak: https://manpages.ubuntu.com/manpages/noble/en/man8/apt.8.html ; https://manpages.ubuntu.com/manpages/noble/en/man1/dpkg.1.html + +### 13. Enrollment ve golden image + +**Nedir:** Golden image kimliksiz tekrar kurulabilir zemin (V1'de tek USB Field OS ISO ile paketlenir); enrollment merkezi kimlik bağlama ve kanal doğrulamasıdır. Durum modeli **tek yönlüdür**: `PROVISIONED_OFFLINE → ENROLLED → READY`; geri dönüş kenarı ve durum atlama yoktur (K-21). + +**Neden:** Seed/ISO, bayi no, private key veya kalıcı token taşımaz. `PROVISIONED_OFFLINE → ENROLLED → READY` birbirinden farklı güven durumlarıdır ve sıra kanıt zinciridir; `PROVISIONED_OFFLINE → READY` doğrudan geçiş (token atlama) yanlış teslim üretir. READY sonrası kurtarma durumu geri sarmak değil, 27'ye göre **yeniden provision** etmektir. + +**Nerede:** 26–29 dokümanları, `/var/lib/blueforce/state.json`, merkezi envanter, WireGuard peer, monitoring/remote kayıtları. + +**Arıza belirtisi:** token tekrar kullanımı, kimlik çakışması, WG çalışırken monitoring eksik ve yanlış READY, `bf-enrollment-status` çıktısında `INVALID`/`PENDING` (exit≠0). + +**Komutlar (LAB):** +```bash +bf-status +bf-enrollment-status # PROVISIONED_OFFLINE | ENROLLED | READY dışındaki her değer fail-closed +printf '%s\n' '' | sudo -E bf-enroll --token-stdin +bf-check-ready +``` +Resmi kaynak: https://cloudinit.readthedocs.io/ ; https://www.wireguard.com/ . Token API ve 26.04 kesin kurulum akışı kurum içi **LAB gerekli** konularıdır. + +### 14. Releases ve rollback + +**Nedir:** Release; ISO referansı, seed, offline APT snapshot, installer/Ansible commit'i ve checksum'ları içeren immutable manifesttir. Rollback önceki onaylı release'e dönüş kanıtıdır. + +**Neden:** `latest` veya yalnız OS sürümü hangi sistemin sahada olduğunu açıklamaz. Her değişiklik 10'daki LAB→P1→P2→W1→W2→PROD kapılarından geçer. Medya seviyesinde geri dönüş yolu upstream ISO + son onaylı seed'dir (K-20). + +**Nerede:** release manifest/tag, `dist/-manifest.yaml`, artefact deposu, 30 yönetim kaydı, monitoring ve change kaydı. + +**Arıza belirtisi:** hash uyuşmazlığı, rollback planı yok, dalga kapısı atlanmış, sürüm drift'i, `bf-release` çıktısında `UNAPPROVED_SKELETON`. + +**Komutlar (LAB):** +```bash +bf-release +sha256sum -c dist/Blueforce-Field-OS-1.0.0-amd64.iso.sha256 +git tag --list 'field-os-*' +bf-status +``` +Resmi kaynak: https://git-scm.com/docs ; https://releases.ubuntu.com/ ; https://docs.docker.com/ + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Her konu için komut pratiği | Beklenen durum/arıza farkı anlatılır | LAB | +| Air-gapped provisioning | `PROVISIONED_OFFLINE`, READY değil | LAB(2) | +| Enrollment kapısı | Tek kullanım + READY doğrulaması | LAB(2) | +| Durum modeli ileri yönlü | `PROVISIONED_OFFLINE → READY` atlaması reddedilir; READY sonrası kurtarma 27 yeniden provision | LAB(2) | +| Yerel GUI kapalıyken RDP | `xrdp`/`xrdp-sesman` active kalır (K-22) | LAB(2) | +| Medya doğrulama | `test-iso.sh` + `sha256sum -c` geçer | LAB/CI | +| Power/rollback tatbikatı | Önceki onaylı duruma dönüş | LAB/P1 | + +## 11. Rollback + +1. Eğitim sırasında yapılan LAB değişikliği snapshot veya yeniden kurulumla geri alınır. +2. Üretimde arıza görülürse bu rehber yerine 19, 20, 21, 10 ve 17 runbook'ları uygulanır. +3. Yanlış release/konfigürasyon 30'daki manifestli rollback ile geri alınır; medya seviyesinde geri dönüş upstream ISO + son onaylı seed yoludur (K-20). + +## 12. Kontrol Listesi + +- [ ] Katılımcı filesystem, paket, service ve log ayrımını gösterebiliyor. +- [ ] SSH private key/token'ın neden paylaşılmadığını açıklayabiliyor. +- [ ] `PROVISIONED_OFFLINE`, `ENROLLED`, `READY` farkını **ve geçişlerin ileri yönlü olduğunu** biliyor. +- [ ] "GUI kapalı ≠ RDP kapalı" ayrımını (K-22) ve `bf-gui-*` kapsamını açıklayabiliyor. +- [ ] Tek USB Field OS ISO ile upstream ISO + seed geri dönüş yolunu ayırt edebiliyor (K-20). +- [ ] Ubuntu 26.04/RustDesk headless maddelerinin LAB gerekli olduğunu işaretledi. +- [ ] Rollback ve onay kapısının prod değişiklikten önce zorunlu olduğunu biliyor. + +## 13. Açık Sorular + +- [ ] Rol bazlı eğitim süresi ve LAB cihaz sayısı — sahibi: merkezi admin. +- [ ] 26.04.1 autoinstall/xRDP/RustDesk headless LAB sonuçları — sahibi: platform ekibi. +- [ ] Release artefact imzalama standardı — sahibi: release yöneticisi. +- [ ] GNOME vs XFCE A/B ölçüm sonuçlarının eğitim materyaline işlenmesi (K-23) — sahibi: platform ekibi + bu rehberin yazarı. + +--- + +## Ek: Öğrenme sırası + +```mermaid +flowchart LR + L["Linux: filesystem/APT/systemd/log"] --> A["SSH + networking + WireGuard"] + A --> O["Docker + Ansible + monitoring"] + O --> P["Medya: Field OS ISO / autoinstall / NoCloud / offline
    + enrollment (ileri yönlü durum modeli)"] + P --> R["Release + rollback"] + R --> X["Uzak erişim derinleşme:
    xRDP her zaman hazır + RustDesk headless (LAB)"] + X --> AB["LAB A/B: GNOME vs XFCE ölçümü (K-23)"] +``` +
    + + +# 32 — Repository Denetimi ve Çelişki Raporu + +> Kısa özet: `Blueforce-Linux` deposunun Field OS provisioning hedefine karşı denetimi ve çelişki envanteri. Bulgular kanıta dayanır; B-1…B-7'nin bu turda (2026-09-16, ikinci tur) hangi kısmının giderildiği, hangisinin açık kaldığı ve kimin kapsamında olduğu burada dürüstçe kayıtlıdır. + +- Dosya: `docs/32-REPOSITORY-AUDIT-AND-CONFLICTS.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-20` (medya stratejisi), `#K-21` (durum modeli), `#K-22` (RDP/`bf-gui-*`), `#K-23` (GNOME vs XFCE A/B), `#K-24` (sürüm kimliği); çelişki giderimi ayrıca `#K-01`…`#K-19` ile karşılaştırılmıştır +- Durum: [x] Rapor (denetim güncellemesi: 2026-09-16); [ ] Açık maddeler (`§9`) kapanmadan kapatılmaz + +--- + +## 1. Amaç + +İki amaç: (1) Field OS hedefiyle mevcut çalışan sistem arasındaki farkı kanıtla göstermek, (2) dokümanlar arasındaki **çelişkileri** görünür kılmak ve her birinin giderim durumunu izlemek. Doğrulanamayan hiçbir iddia "tamam" sayılmaz. + +## 2. Kapsam + +- Kapsam içi: dosya sistemi kanıtı, `git status`/`git log`, test sonuçları, resmi kaynak doğrulaması, doküman çelişkileri ve giderim durumu. +- Kapsam dışı: gerçek donanım/QEMU/Windows testleri, gerçek ISO ve offline paket deposunun üretimi (F2B işi), merkezi kontrol düzlemi kodlaması. + +## 3. Bulgular + +```text +KARAR: Bu doküman salt-okunur bir DENETİM raporudur; kendisi mimari karar üretmez, karar günlüğünü (24) ve yol haritasını (25) denetler ve çelişkileri kayıt altına alır. +GEREKÇE: Denetim bulgusunun karar yerine geçmesi, "kanıt" ile "tercih" ayrımını bozar; bu yüzden her bulgu ya bir K-kararına bağlanır ya da açık madde olarak yazılır. +ALTERNATİF: Bulguları doğrudan karar olarak yazmak — aynı konunun iki yerde farklı kararla anılması çelişkisi doğar → elendi. +RİSK: Rapor bayatlarsa yanlış "tamam" izlenimi üretir; azaltma: her turda tarih + giderim durumu tablosu güncellenir (§9). +MALİYET: Ücretsiz. +LİSANS: Yok (kurum içi denetim raporu). +``` + +### 3.1 Özet (ilk tur, 2026-09-16 — tarihsel kayıt) + +Depo, prompt'un büyük bölümünü **zaten uygulamış durumda**; ancak ilk turda iki kritik çıktı eksikti: gerçek bir Field OS ISO'su üretilmiyordu ve offline paket deposu boştu. V1 medya kararı (upstream ISO + seed USB) prompt'un istediği tek-medya deneyimiyle çelişiyordu. + +| Durum (ilk tur) | Sayı | +|---|---| +| Tüm statik testler | **GEÇTİ** (5/5) — *ikinci turda test seti 7 scripte çıktı ve 2 script kırmızı; bkz. §10* | +| Doküman | 32 (26–31 dahil) — *ikinci turda 33 (32 dahil)* | +| Commit edilmemiş değişiklik | 1 büyük çalışma ağacı | + +> **Anlık görüntü uyarısı:** Bu depo 2026-09-16 turunda **paralel çalışma akışlarıyla** aynı anda düzenlenmektedir (offline repo, firstboot, testler, playbook'lar ve bu rapor dahil). §9 ve §10'daki durumlar **10:52 itibarıyla** doğrulanmış anlık görüntüdür; aynı gün içinde başka bir akış tarafından değiştirilebilir. Bir maddeyi kapatmadan önce ilgili komutu yeniden çalıştırın. + +### 3.2 Git durumu + +``` +HEAD: 64a557f chore: keep local .hermes plans out of the repo + 0b56649 docs: Blueforce 700-device fleet architecture (TR) - GNOME baseline + 6402e85 first init. +``` + +- 14 doküman `modified` (README, SUMMARY, docs/01,03,04,05,07,08,14,16,20,21,24,25) +- ~70+ yeni dosya `untracked` (ansible, config, monitoring, provisioning, scripts, tests, rustdesk, docs-site, docs/26–31, IMPLEMENTATION-REPORT.md) +- **Hiçbiri commit edilmemiş.** Bu turda da commit atılmadı (bilinçli). + +### 3.3 Zaten var olanlar (korunacak — yeniden yazılmayacak) + +| Alan | Kanıt | +|---|---| +| `blueforce-install.sh` + 18 modül | `scripts/install/installer/modules/01..18` | +| `BF-<8>/bf-<8>` standardı | `blueforce-install.sh` bayi no kapısı `^[0-9]{8}$` | +| `bf-status`, `bf-diagnostics`, `bf-support-bundle`, `bf-hardware-inventory.sh` | `scripts/diagnostics/` | +| 3-aşamalı durum scriptleri | `bf-check-local`, `bf-check-enrollment`, `bf-check-ready` | +| Yeni komutlar | `bf-enroll`, `bf-enroll-now`, `bf-enrollment-status`, `bf-release`, `bf-remote-status` | +| Canlı HW kontrolü | `scripts/diagnostics/bf-live-hw-check` (91 satır, mutasyonsuz) | +| Windows geçiş araçları | `scripts/migration/windows/BF-WindowsPreMigrationInventory.ps1`, `BF-WindowsDataExport.ps1` | +| Ansible | 16 playbook + 4 rol + inventory (dalga grupları `pilot_1/wave_1` Ansible-uyumlu) | +| Update kapıları | `bf-deploy-update.yml` dalga + `production_override` + `halt_on_fail` | +| WireGuard/SSH/xRDP/RustDesk | config/ + installer modülleri 06,07,08,09 | +| MeshCentral | erişim kanalı olarak dokümante (docs/07) | +| Docker politikaları | `config/docker/daemon.json`, `DOCKER-USER` kalıcı servis | +| Monitoring | `monitoring/` Prometheus + Grafana OSS + Uptime Kuma | +| Docusaurus | `docs-site/` (build PASS) | +| Firewall / logging / recovery | config/ + docs/15, 17 | +| Provisioning iskeleti | `provisioning/{autoinstall,iso,offline-repo,firstboot,enrollment,release}` | +| Testler | 5 script + QEMU planı | + +## 4. Neden Bu Karar? + +Denetim, "çalışıyor mu?" sorusunu **kanıtla** yanıtlamak için vardır. Bu depoda en pahalı hata tipi, "dokümanda yazıyor" ile "gerçekten üretildi" farkının karışmasıdır: ISO dosyası, offline paket deposu ve merkezi enrollment endpoint'i olmadan "offline kurulum çalışıyor" denemez. Aynı şekilde iki doküman aynı konuda farklı şey söylüyorsa (RDP bir yerde `bf-gui-on` gerektirir, başka yerde her zaman hazır; GNOME bir yerde tamamen kapanmış, başka yerde ölçüm adayı), saha teknisyeni yanlış prosedürü uygular. Bu rapor o farkı görünür tutar. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Kanıt-temelli yazılı denetim (bu rapor) | Tekrarlanabilir, izlenebilir | Gerçek donanım kanıtı vermez | **Seçildi** | +| Yalnız test çıktısıyla denetim | Hızlı | Doküman çelişkilerini görmez | Yetersiz | +| Yalnız gözle denetim | Esnek | Kanıtsız, tekrar üretilemez | Elendi | + +## 6. Avantajlar + +- Her bulgu dosya/satır kanıtına bağlı; "tamam" iddiası yalnız çalıştırılan komutla veriliyor. +- Giderim durumu tur tur izlenebiliyor (§9), böylece kimse "bu madde kapandı mı?" diye tahmin etmiyor. +- Yazma yetkisi dışında kalan artıklar (örn. `docs/26`) açıkça sahiplendiriliyor; sessiz çelişki kalmıyor. + +## 7. Dezavantajlar + +- Rapor, doküman setinin "kanonik" sayısını artırır (33 numaralı dosya) ve `tests/check-specs.sh` sabitleriyle uyumsuzluk doğurur (§10). +- Bazı maddeler (B-1/B-2) kod gerektirir; rapor onları kapatamaz, yalnız işaretler. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Rapor bayatlar, kapanmış madde açık görünür | Orta | Orta | Her turda §9 tablosu ve tarih güncellenir | +| "Doküman kapandı" diye kod işi (ISO/offline repo) kapanmış sayılır | Orta | Yüksek | §9'da "doküman katmanı" ile "kod/artefact" ayrımı ayrı sütunlarda | +| Yazma yetkisi dışındaki dosyalarda çelişki kalır ve sahaya yansır | Orta | Yüksek | §9'daki "kalan artık + sahip" listesi; PR sahibi atanır | + +## 9. Uygulama Planı — Giderim Durumu (2026-09-16, ikinci tur) + +> Sütunlar: **Durum** = bu turda değişti mi · **Kalan artık** = hâlâ açık olan kısım ve sahibi. + +| ID | İş | Öncelik | Durum (ikinci tur) | Kalan artık | +|---|---|---|---|---| +| B-1 | Gerçek bootable ISO builder | KRİTİK | **KAPANDI (kod)** — builder gerçek medya üretiyor. Boot düzeni `xorriso -report_el_torito as_mkisofs` reçetesinden okunup `-as mkisofs` ile yeniden kuruluyor (sabit değer gömülü değil); üretilen artefakt doğrulandı: `dist/Blueforce-Field-OS-1.0.0-amd64.iso`, 6 481 917 952 byte, SHA256 `cb0cc56f…d431296`, El Torito BIOS+UEFI korunmuş, `/autoinstall.yaml` kökte, `interactive-sections:[storage]`, kimlik/secret yok, `casper/minimal.squashfs` base ile birebir aynı | LAB işi: UEFI/Legacy/Secure Boot boot kabulü, Desktop autoinstall kabulü, air-gapped kurulum (sahibi: LAB; F2B/F3) | +| B-2 | Offline paket manifestleri (somut pin) + repo üretimi | KRİTİK | **KISMEN İLERLEDİ** — manifestler artık yalnız yorum değil: pin biçim sözleşmesi + `requirements.tsv` denetim tablosu + `packages.lock.schema.tsv` yazıldı, `build-offline-repo.sh` `--dry-run-plan` ile sapma denetliyor, `tests/check-offline-repo-static.sh` **PASS**. **Ama pinler hâlâ `UNPINNED` sentinel** (base-packages 14, docker 7, remote-access 7 satır), `packages.lock.tsv` ve `.deb` havuzu yok, `provisioning/offline-repo/packages/` boş | Onaylanmış `.deb` havuzu + gerçek `package=version` pinleri + `packages.lock.tsv` + air-gapped kurulum kanıtı (sahibi: release yöneticisi; F2B) | +| B-3 | Medya kararını uyumlaştır (tek USB, yine assisted) | KRİTİK | **KISMEN KAPANDI (doküman katmanı)** — `docs/24` K-20 eklendi (autoinstall = motor, Field OS ISO = paketleme; `interactive-sections: [storage]` korunur), README/SUMMARY/`docs/25` bu karara göre yazıldı; K-15 silinmedi, yedek yol olarak korundu | `docs/26` hâlâ "V1 medya = upstream ISO + seed, custom ISO tamamlayıcı" diyor; `docs/26` K-20 ile hizalanmalı (sahibi: 26 yazarı). ISO'nun kendisi B-1'de | +| B-4 | Firstboot terminal wizard | YÜKSEK | **BÜYÜK ÖLÇÜDE İLERLEDİ** — `provisioning/firstboot/bf-firstboot` 23 → **381 satır**: Türkçe etiketli interaktif konsol wizard (konsol varsa varsayılan), `--interactive`, `--dealer-id`, `--dealer-id-file`, `--force-reidentity`, `--check` ve test modu. Statik kanıt kapısı bu tur içinde **yeşile döndü** (`tests/test-firstboot-static.sh` PASS, 10:52) | Gerçek konsol/LAB kanıtı (wizard + installer uçtan uca, kimlik değişim prosedürü) ve 3.5'teki `docs/28` bağlantısı (sahibi: provisioning; F2B) | +| B-5 | `--offline` bayrağı doğrula + uygula | YÜKSEK | **KAPANDI (kanıtlı)** — `scripts/install/blueforce-install.sh` `--offline` bayrağını gerçekten destekliyor: yalnız yerel `file:` APT kaynağı, uzak indirme yok, başarıda `state.json`'a `phase=PROVISIONED_OFFLINE` yazıyor; `bf-firstboot` bu bayrağı kullanıyor; `--offline` olmadan damga yazılmıyor | Yok (paket seti için B-2) | +| B-6 | Migration/hw-check konum ve adlarını dokümante et | ORTA | **KAPANDI (dokümante)** — eşleme aşağıda (3.4) yazılı; konum farkı `scripts/` tutarlılığı lehine kabul edildi | Yok | +| B-7 | Doküman çelişkilerini gider | ORTA | **KISMEN KAPANDI** — README başlığı/`Faz 3'te dolar` ifadesi düzeltildi; GNOME/XFCE çelişkisi `docs/24` K-02 güncellemesi + K-23 ile çözüldü; custom ISO/Field OS ISO çelişkisi K-20 ile çözüldü; SUMMARY'nin 11. cevabı (RDP) ve 4. cevabı (`bf-gui-*`) düzeltildi; `docs/24` Ek B notu ("SUMMARY Faz 4'te üretilecek") güncellendi | Aşağıdaki **6 artık** (§3.5) — hepsi yazma kapsamı dışındaki dosyalarda | + +### 3.4 B-6 kapanış kaydı: ad ve konum eşlemesi + +| Prompt'ta istenen | Depodaki gerçek | Not | +|---|---|---| +| `migration/windows/bf-win-inventory.ps1` | `scripts/migration/windows/BF-WindowsPreMigrationInventory.ps1` | Konum `scripts/` altında kabul edildi (depo tutarlılığı); içerik mutasyonsuz/credential'sız (test edilir) | +| `migration/windows/bf-win-network-export.ps1` + `bf-win-software-export.ps1` + `bf-win-device-export.ps1` | `scripts/migration/windows/BF-WindowsDataExport.ps1` | Tek script aynı veri sınıflarını dışa aktarır | +| `scripts/live/bf-live-hw-check` | `scripts/diagnostics/bf-live-hw-check` | Canlı HW kontrolü tanı grubunda | +| `scripts/live/…` AnyDesk modülü | `scripts/install/optional/anydesk/install-anydesk.sh` | Opsiyonel modül; lisans onayı olmadan indirme/kurulum yapmaz | + +### 3.5 B-7 artıkları (bu turda giderilemeyen çelişkiler — yazma kapsamı dışı) + +| Konu | Dosya (düzeltilmeli) | Sorun | Öneri | +|---|---|---|---| +| GNOME/XFCE | `docs/03-UBUNTU-BASELINE.md` (§3 K-02 bloğu, §5 tablo satırı) | "XFCE elendi; yedekte tutulmaz" — `docs/24` K-02+K-23 ile artık ölçüme bağlı | §3'te ALTERNATİF satırını "LAB A/B ölçüm adayı (K-23), saha standardı GNOME" yap; §5 tablosunda sonucu "LAB A/B ölçümü" yaz | +| Custom ISO / Field OS ISO | `docs/04-GOLDEN-IMAGE-AND-PROVISIONING.md` (§3 KARAR, §4, §5) | (a) "Custom ISO/Packer elendi" ve "Custom Field ISO → LAB artefact / **F6**" — K-20 ile assisted Field ISO **F2B**'ye taşındı (Packer hâlâ elenmiş durumda); (b) §3 KARAR "V1'de resmi upstream ISO + ayrı NoCloud seed USB kullanılır" — K-20'de birincil teslim medyası F2B tek-USB'dir, upstream ISO + seed **geri dönüş** yoludur | §4'ü "autoinstall motoru + Field OS ISO paketleme (K-20)" olarak ayır; §5 satırını "F2B assisted artefact; Packer elendi" yap; §3'te "V1'de resmi upstream ISO + seed" cümlesine "geri dönüş yolu" nitelemesi ekle | +| V1 medya (mimari) | `docs/01-ARCHITECTURE.md` (§3 KARAR) | "V1 medya = upstream ISO + ayrı NoCloud seed USB" — K-20/F2B ile birincil medya tek USB Field OS ISO, upstream+seed yedek yol | Cümleyi "birincil: F2B tek-USB Field OS ISO; yedek: upstream ISO + seed (K-20)" olarak güncelle | +| V1 medya (öğrenme rehberi) | `docs/31-LEARNING-GUIDE.md` (§9 konu 11) | "V1'de upstream ISO + ayrı NoCloud seed USB, custom Field ISO'dan daha az risklidir; ikisi tamamlayıcıdır" — F2B hedefiyle çelişir | "assisted tek-USB Field OS ISO (K-20) esas; upstream ISO + seed geri dönüş yolu" olarak düzelt | +| V1 medya (ISO dokümanı) | `docs/26-BLUEFORCE-FIELD-OS-ISO.md` (§3 KARAR, §5 tablo, §7, §12 kontrol listesi) | "V1 kurulum medyası = upstream ISO + ayrı NoCloud seed USB; custom ISO tamamlayıcı" ve "V1 etiketi upstream ISO + seed olarak basıldı" — K-20 ile birincil teslim F2B tek-USB assisted medyadır | K-15 bloğuna "K-20 ile birlikte okunur" notu ekle; §5 tablosunda V1/F2B eşlemesini düzelt; §12 kontrol listesini "F2B tek-USB ISO etiketi" olarak güncelle | +| RDP / `bf-gui-on` | `docs/07-REMOTE-ACCESS.md` (§3 ilk KARAR bloğu) | "GUI varsayılan kapalıdır, bakım penceresinde `bf-gui-on` ile açılır" ifadesi RDP'yi anahtara bağlı gösterir; aynı dosyanın ikinci KARAR bloğu ve `docs/16` xrdp'in her zaman ready olduğunu söyler | İlk blokta "GUI" yerine "**yerel fiziksel** GUI" yaz ve xRDP'in bundan bağımsız her zaman aktif olduğunu ekle (K-22) | +| Windows geçiş kapsamı | `docs/28` §9.2 "Onaylı araçla geri dönüş imajı al…" | Araç adı (`BF-Windows…ps1`) anılmıyor — B-6 kapanışıyla hizalanması iyi olur | §9.2'ye script adlarını ekle | + +### 3.6 Bu turda eklenen yeni bulgular + +| ID | Bulgu | Kanıt | Açık mı? | +|---|---|---|---| +| B-9 | `/etc/blueforce-release` **yazılmıyor**: yalnız `bf-release` okuma yolu + legacy KEY=VALUE uyumluluğu var; yazan bir release pipeline adımı depoda yok | `grep -rn blueforce-release` → sadece `bf-release` (okuma) ve `17-healthcheck`'in `/etc/blueforce/release-manifest.yaml` kopyası | **AÇIK** — sahibi 30-release; K-24 risk satırında kayıtlı | +| B-10 | `tests/check-specs.sh` sabitleri bayat: "exactly docs/00 through docs/31" (32 dosya) ve "expected 34 Mermaid blocks" — depo gerçekte 33 numaralı dosya ve 35 Mermaid bloğu içeriyor | `bash tests/check-specs.sh` → `FAIL: expected 32 numbered docs, found 33` / `FAIL: expected 34 Mermaid blocks, found 35` | **AÇIK** — düzeltme `tests/` kapsamında (bu raporun yazma kapsamı dışı) | +| B-11 | Kanonik doküman sayısı ikinci turda 32→33 oldu; bu rapor da numaralı namespace'te olduğu için B-10'un kök nedeni buradadır | `ls docs/[0-9][0-9]-*.md \| wc -l` = 33 | **AÇIK** — iki seçenek: sabitleri güncelle, veya bu raporu numaralı namespace dışına taşı | +| B-12 | **Paralel düzenleme çakışması:** aynı gün başka bir çalışma akışı bu dosyayı (10:37:21) düzenledi; bu raporun güncellemesi (10:39:32) onun sürümünün üzerine yazıldı ve **o sürüm kurtarılamadı** (dosya git'te untracked, yedek yok) | Hermes araç uyarısı: *"was modified by sibling subagent … after this agent's last read"*; `git status` → `?? docs/32-…`; session kayıtlarında içerik izi yok | **AÇIK (süreç)** — o akışın eklemek istediği bilgi varsa yeniden yazılmalı. Ders: aynı dosyaya iki akış yazacaksa tek sahip atanmalı veya yazmadan önce dosya yeniden okunmalı | + +### 3.7 Açık ve doğrulanmamış iddialar (bilgi amaçlı, değişmedi) + +- Hiç ISO build edilmedi (rapor da kabul ediyor). +- Hiç offline repo üretilmedi. +- Merkezi enrollment endpoint'i yok. +- Gerçek donanım/Windows/QEMU testi yapılmadı. +- `sudo` gerektiren komutlar bu turda çalıştırılmadı (parolasız sudo yok). + +## 10. Test Planı (bu turda çalıştırılanlar ve sonuçları) + +> Anlık görüntü: **2026-09-16 10:52**. Paralel çalışma akışları test setini aynı gün genişlettiği için bu tablo bir iddia değil, **zaman damgalı kanıttır**. + +| Komut | Sonuç | Not | +|---|---|---| +| `tests/check-specs.sh` | **FAIL** | (B-10) iki bayat sabit: `expected 32 numbered docs, found 33` ve `expected 34 Mermaid blocks, found 35`; ayrıca içindeki çağrıyla `test-field-os-lifecycle.sh` düşüyor (aşağıdaki satır) | +| `tests/check-offline-repo-static.sh` | **PASS** | Bu tur eklenen offline repo pin/biçim sözleşmesi denetimi | +| `tests/check-provisioning-static.sh` | **PASS** | — | +| `tests/check-migration-static.sh` | **PASS** | — | +| `tests/check-configs.sh` | **PASS** | — | +| `tests/test-field-os-lifecycle.sh` | **FAIL** | `ENROLLED state with independent local and central evidence must become ready-check eligible` — durum makinesi/READY kapısı üzerinde devam eden akış (K-21/K-22 ile ilişkili) | +| `tests/test-firstboot-static.sh` | **PASS** *(10:52)* | Firstboot wizard/installer bayrak sözleşmesi bu tur içinde yeşile döndü; gerçek konsol LAB kanıtı yine de gerekir (B-4) | +| Doküman yapı denetimi (`docs/[0-9][0-9]-*.md`) | **33/33 uyumlu** | Her dosyada §1–§13 sırası + ≥1 Mermaid (bu rapor bu turda §1–§13 + 1 diyagrama getirildi) | +| Üretim artefaktı denetimi | **YOK** | `*.iso` yok, `*.deb` yok, `packages.lock.tsv` yok, `provisioning/offline-repo/packages/` boş | +| URL doğrulaması (curl, HTTP 200) | **PASS** | Subiquity autoinstall referansı, cloud-init NoCloud, gnome.org, xfce.org, neutrinolabs/xrdp | + +**Test sonucu yorumu:** Altı script yeşil; tek kırmızı `test-field-os-lifecycle.sh` ve bu, K-21/K-22 (durum modeli + RDP/READY sözleşmesi) üzerinde hâlâ çalışılan akışa işaret ediyor. Bu rapor kırmızı testi olan sözleşmeyi **kapalı** saymaz. + +Resmi kaynak doğrulaması (canlı, 2026-09-16 — `canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html`, HTTP 200): + +1. **`/autoinstall.yaml` yolu sabit:** *"The autoinstall configuration is available at `/autoinstall.yaml` (irrespective of how it was provided)"* → ISO köküne konan autoinstall desteklenir. +2. **`interactive-sections` destekli:** *"A list of configuration keys to still show in the user interface (UI)"*. +3. **`storage` interactive olabilir:** *"can be interactive: true"* + varsayılan *"use the lvm layout on single-disk systems"* → storage interactive bırakılmazsa en büyük disk kendiliğinden bölümlenir; bu yüzden `interactive-sections: [storage]` hem tek-USB deneyimini hem "otomatik disk silme yok" şartını sağlar. +4. **Offline davranış resmi anahtar:** `apt.fallback` varsayılanı **`offline-install`** — *"revert to an offline installation"*. +5. **`seed` yolu ve NoCloud** resmi quickstart'ta belgeli (`cloud-localds`, `user-data` + `meta-data`, `ds=nocloud`). + +**Doğrulanamayan:** `xorriso`/remaster ile 26.04 UEFI/Legacy/Secure Boot davranışı — LAB testi gerekir (B-1). + +## 11. Rollback + +1. Bu rapor bir denetim kaydıdır; hatalı bir bulgu düzeltilecekse aynı dosyada tarihli düzeltme notu düşülür (silme yok). +2. Bu turda yapılan doküman değişiklikleri commit edilmediği için geri alma `git checkout -- README.md SUMMARY.md docs/24-*.md docs/25-*.md docs/32-*.md` ile tek adımda yapılabilir. +3. Karar seviyesindeki geri alma (örn. K-20 medya stratejisi) `docs/24` PR'ı ile yapılır ve bağımlı dosyalar (README, SUMMARY, 25, 26, 31) aynı PR'da güncellenir. + +## 12. Kontrol Listesi + +- [x] B-1…B-7'nin her biri için bu turdaki durum yazıldı (kapandı / kısmen / açık). +- [x] Kapanan maddeler kanıtla desteklendi (B-5: `--offline` + `state.json`; B-6: eşleme tablosu). +- [x] Giderilemeyen çelişkiler dosya + öneri ile listelendi (§3.5). +- [x] Yeni bulgular (B-9…B-12) kayda geçti. +- [ ] B-1 (ISO), B-2 (gerçek paket pinleri/pool) ve B-4 (firstboot testleri yeşil) kapanmadan bu rapor "tamam" sayılmaz. +- [ ] §3.5 artıkları (docs/03, 04, 26, 07, 28) doküman PR'ıyla kapatılmalı. +- [ ] `tests/check-specs.sh` sabitleri güncellenmeli (B-10) veya bu rapor numaralı namespace dışına taşınmalı (B-11). +- [ ] Kırmızı testler (`test-field-os-lifecycle.sh`, `test-firstboot-static.sh`) yeşile dönmeli; kapanış ancak bundan sonra ilan edilir. +- [ ] Bu rapora aynı gün içinde tek sahip atanmalı (B-12: paralel yazım çakışması bir tur kaybettirdi). + +## 13. Açık Sorular + +- [ ] Remaster edilmiş Field OS ISO'nun UEFI/Legacy/Secure Boot matrisi — LAB (sahibi: provisioning/release, F2B). +- [ ] Offline APT snapshot'ın yenileme sıklığı ve paket onay süreci (sahibi: release yöneticisi, F2B). +- [ ] `docs/32` kanonik doküman sayılsın mı, yoksa numaralı namespace dışına mı taşınsın (sahibi: doküman sahibi + test sahibi). +- [ ] Bu raporun `docs-site`'a dahil edilip edilmeyeceği (numaralı dosya olduğu için şu an sitede yayınlanıyor) (sahibi: 22 yazarı). + +--- + +## Ek: Çelişki ve giderim haritası + +```mermaid +flowchart TB + subgraph KONU["Çelişki konuları"] + G["GNOME / XFCE"] + M["Custom ISO / Field OS ISO"] + R["RDP / bf-gui-on"] + S["READY / 3 durum"] + F["Unattended F6 / Assisted F2"] + O["Offline / network zorunlu mu"] + end + subgraph KARAR["Karar günlüğü (kilit kaynak)"] + K02["K-02 + K-23"] + K20["K-20 (K-15 ile)"] + K22["K-22 (K-03 ile)"] + K21["K-21 (K-16/K-17 ile)"] + K25["Roadmap F2A/F2B + F6"] + K16["K-16 + K-21"] + end + subgraph DURUM["Bu turdaki durum"] + D1["Giderildi: README/SUMMARY/24/25
    Artık: docs/03"] + D2["Giderildi: 24/README/SUMMARY/25
    Artık: docs/04, docs/26"] + D3["Giderildi: SUMMARY/24
    Artık: docs/07"] + D4["Giderildi: 24/25/README/SUMMARY
    Artık yok"] + D5["Giderildi: 25 F2A/F2B/F6
    Artık yok"] + D6["Giderildi: 24/SUMMARY
    Artık yok"] + end + G --> K02 --> D1 + M --> K20 --> D2 + R --> K22 --> D3 + S --> K21 --> D4 + F --> K25 --> D5 + O --> K16 --> D6 +``` +
    + + +# Blueforce Field OS — Design System + +Two operator surfaces, one visual language: the **device console** (Python/tkinter, +ships on each field PC) and the **central panel** (Python stdlib `http.server`, +browser). Both describe the same fleet from opposite ends, so they share a status +vocabulary and a token set. Palette values live in `web/static/tokens.css`; the +console reads the same values through `bfos/ui_theme.py`. + +## Direction contract + +**THESIS.** The device's state is the subject, and it must be legible from a step +back — on a workshop laptop, in daylight, with someone waiting. This surface +refuses the category default it would otherwise inherit: a near-black "ops +console" with grey body text, six hues fighting for meaning, and status buried in +a log. Instead: a light ground, dark text with real contrast, and saturation +spent only where it carries a state. + +**OWN-WORLD.** Light neutral ground (`--bg-app #f6f7f8`) with white raised panels +and hairline borders; one dark region, the app header, which anchors the frame. +One action accent (`--accent #1d4ed8`) marking the action the operator came to +take and the selected row, nothing else. Four state severities — ok / warn / +danger / info — each with a strong and a soft form, so a badge or a row can be +built from one palette without inventing a second. Data (ids, counts, exit codes, +timestamps) set in monospace so columns align; UI text in the platform face. +Buttons and inputs share one height; rows share one height; a 4px space rhythm. + +**STORY.** The operator sees at a glance whether the device (or the fleet) is +ready, what stage it reached, and what the one next action is. A technician +understands an install's outcome without reading the log; an operator scanning +700 devices finds the ones that need attention without opening them. + +**FIRST VIEWPORT.** Header band (dark, 56px) carrying the product name, the +target identity, and privilege level on the right — privilege is never a buried +sentence. Below it, a two-column body: left, the fleet/device list with a state +badge per row, sorted so non-ready devices surface first, with a filter bar and a +summary strip of counts by state (the one large figure per view). Right, the +selected device's detail: state, target id, hostname, wave, and the channel +verification list. The primary action sits in the header, not below the fold. + +**FORM.** Operate surface. The world is a *control room board*: fixed regions, +legible readouts, one accent, state as signal. No decorative motion; the only +transition is a state change and a row selection. + +**FINISH.** unreviewed and undocumented is unfinished; this build ends with the +finish review, the verdict, DESIGN.md, and every shipping raster carrying its +provenance. + +## Status vocabulary + +One word per state, Turkish, used identically in both surfaces. + +| State | Token | Meaning | +|---|---|---| +| `KURULDU` | `--state-provisioned` | Provisioned offline, not yet enrolled | +| `KAYITLI` | `--state-enrolled` | Enrolled, channels not all verified | +| `HAZIR` | `--state-ready` | Every channel verified; the only shippable state | +| `HATA` | `--state-failed` | A check failed; the device needs a person | +| `YOK` | `--state-absent` | Not reachable / never seen | + +Colour is never the only carrier: every badge ships its word, and the fleet table +sorts non-ready first, so the list is readable in greyscale. + +## Privilege + +Read-only and full privilege are visually distinct states, not a log line: the +header states the current level, and the console disables rather than hides +write operations when unprivileged, with the reason on the control. + +## Rules + +1. Saturation carries meaning. A colour is a state or the action accent; it is + never decoration, and a fifth hue is a bug. +2. Badges carry words. Greyscale must not lose the state. +3. One loud figure per view. Everything else is quiet and aligned. +4. No webfont. The fleet installs offline; the UI face is whatever the platform + ships and the data face is monospace. +5. Destructive actions look different and ask twice. Approval and the root gate + are design, not an afterthought. +6. The log is evidence, not the interface. Outcomes surface as state and + structure first; raw output stays available, collapsed. + + + +/* Blueforce docs theme overrides. Dark mode is the default (see docusaurus.config.ts). */ +:root { + --ifm-color-primary: #4aa8ff; +} + + + +import React from 'react'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + +
    +

    {siteConfig.title}

    +

    {siteConfig.tagline}

    + + Open docs + +
    +
    + ); +} +
    + + +node_modules/ +build/ +.docusaurus/ +# Generated content (recreated by sync-docs.sh on prestart/prebuild). +docs/*.md +!docs/.gitkeep + + + +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; + + + +import {themes as prismThemes} from 'prism-react-renderer'; +import type {Config} from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; + +// Blueforce fleet documentation site. Content source: ../docs/*.md. +const config: Config = { + title: 'Blueforce Docs', + tagline: 'Fleet runbooks and architecture', + url: 'http://docs.blueforce.intranet', + baseUrl: '/', + onBrokenLinks: 'throw', + i18n: { defaultLocale: 'tr', locales: ['tr'] }, + markdown: { + mermaid: true, + hooks: { onBrokenMarkdownLinks: 'warn' }, + }, + themes: ['@docusaurus/theme-mermaid', '@easyops-cn/docusaurus-search-local'], + presets: [ + ['classic', { + docs: { path: 'docs', routeBasePath: '/', sidebarPath: './sidebars.js' }, + blog: false, + theme: { customCss: './src/css/custom.css' }, + } satisfies Preset.Options], + ], + themeConfig: { + colorMode: { defaultMode: 'dark', disableSwitch: false, respectPrefersColorScheme: false }, + navbar: { title: 'Blueforce Docs', items: [{ type: 'docSidebar', sidebarId: 'docs', position: 'left', label: 'Docs' }] }, + } satisfies Preset.ThemeConfig, +}; +export default config; + + + +{ + "name": "blueforce-docs", + "version": "0.1.0", + "private": true, + "description": "Blueforce fleet documentation site. Source of truth is ../docs/*.md; this package only builds the site.", + "scripts": { + "sync": "./sync-docs.sh", + "prestart": "./sync-docs.sh", + "prebuild": "./sync-docs.sh", + "start": "docusaurus start --host 127.0.0.1 --port 3000", + "start:intranet": "docusaurus start --host 0.0.0.0 --port 3000", + "build": "docusaurus build", + "serve": "docusaurus serve build --host 127.0.0.1 --port 3000", + "serve:intranet": "docusaurus serve build --host 0.0.0.0 --port 3000", + "clear": "docusaurus clear" + }, + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/preset-classic": "3.10.2", + "@docusaurus/theme-mermaid": "3.10.2", + "@easyops-cn/docusaurus-search-local": "0.49.2", + "@mermaid-js/layout-elk": "0.1.9", + "@mdx-js/react": "3.0.1", + "clsx": "2.1.1", + "prism-react-renderer": "2.4.0", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { "typescript": "5.5.4" }, + "engines": { "node": ">=18.0" } +} + + + +# Blueforce docs site (Docusaurus) + +Static documentation is synced one-way from `../docs/*.md` into `./docs/`; never edit generated `./docs/` directly. + +## Local development + +```bash +cd docs-site +npm install +npm start # http://127.0.0.1:3000 (loopback only) +npm run build +npm run serve # local static preview on 127.0.0.1:3000 +``` + +For an explicitly approved intranet preview, use `npm run start:intranet` or `npm run serve:intranet`; those commands bind `0.0.0.0:3000`. + +## Deploy + +Publish `build/` through the intranet web server. The site has no favicon reference until a maintained favicon asset is added. + + + +// Auto-generated sidebar: every synced Markdown file appears without manual entries. +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + docs: [{type: 'autogenerated', dirName: '.'}], +}; + +export default sidebars; + + + +#!/usr/bin/env bash +# One-way sync: repo docs (../docs/*.md) -> site content (./docs/). +# The repo Markdown files are the single source of truth; never edit ./docs by hand. +set -euo pipefail + +SITE_DIR="$(cd "$(dirname "$0")" && pwd)" +SRC_DIR="$SITE_DIR/../docs" +DST_DIR="$SITE_DIR/docs" + +mkdir -p "$DST_DIR" + +# Copy only numbered canonical sources; docs/_TEMPLATE.md is never site content. +shopt -s nullglob +sources=("$SRC_DIR"/[0-9][0-9]-*.md) +if [ "${#sources[@]}" -eq 0 ]; then + echo "No numbered Markdown sources found in $SRC_DIR" >&2 + exit 1 +fi +cp -f "${sources[@]}" "$DST_DIR"/ + +# Remove stale or non-numbered site documents, including _TEMPLATE.md. +for f in "$DST_DIR"/*.md; do + base="$(basename "$f")" + if [[ ! "$base" =~ ^[0-9][0-9]-.*\.md$ ]] || [ ! -f "$SRC_DIR/$base" ]; then + rm -f "$f" + fi +done + +echo "Synced ${#sources[@]} numbered files into docs-site/docs." + + + +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + } +} + + + +# `migration/` — location pointer + +This directory exists only as a **pointer**. The migration tooling is not here. + +- **Actual location:** `scripts/migration/windows/` + (`BF-WindowsPreMigrationInventory.ps1`, `BF-WindowsDataExport.ps1`, `README.md`) +- **Requested location:** `migration/windows/` (the layout the original brief + described). + +The repository keeps every operational script under `scripts/` +(`scripts/{install,maintenance,diagnostics,recovery,migration}`), so the Windows +pre-migration tooling lives in `scripts/migration/windows/` for consistency with +`blueforce-install.sh`, `bf-status`, `bf-hardware-inventory.sh` and the +diagnostics set. The same rule placed `bf-live-hw-check` under +`scripts/diagnostics/` instead of `scripts/live/`. + +## Where to go + +| Need | Path | +|---|---| +| Windows inventory / data-export scripts + full usage | `scripts/migration/windows/README.md` | +| Requested-name ↔ repo-name mapping table | `scripts/migration/windows/README.md` | +| Migration procedure, acceptance gate, rollback | `docs/28-WINDOWS-TO-LINUX-MIGRATION.md` | +| Location/name deviation audit entry (§B-6) | `docs/32-REPOSITORY-AUDIT-AND-CONFLICTS.md` | +| Post-migration read-only hardware gate | `scripts/diagnostics/bf-live-hw-check` | +| Static safety tests for the migration tooling | `tests/check-migration-static.sh` | + +No script, wrapper or symlink is placed here on purpose: two real locations for +the same tooling would drift, and the static test asserts the single canonical +directory (`scripts/migration/windows/`). + + + +{"annotations": {"list": []}, "editable": false, "graphTooltip": 0, "panels": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Devices answering scrapes (up==1) vs silent (up==0).", "fieldConfig": {"defaults": {"mappings": [{"options": {"0": {"text": "OFFLINE"}, "1": {"text": "ONLINE"}}, "type": "value"}], "thresholds": {"mode": "absolute", "steps": [{"color": "red", "value": 0}, {"color": "green", "value": 1}]}}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 0, "y": 0}, "id": 1, "options": {"colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "up{job=\"node\",device_id=\"$device\"}", "refId": "A"}], "title": "Online / Offline", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "100 - available% across reporting devices.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 70}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 8, "y": 0}, "id": 2, "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - node_memory_MemAvailable_bytes{job=\"node\",device_id=\"$device\"} / node_memory_MemTotal_bytes{job=\"node\",device_id=\"$device\"})", "refId": "A"}], "title": "RAM used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Average CPU over 5m from node_cpu_seconds_total.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 70}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 4, "w": 8, "x": 16, "y": 0}, "id": 3, "options": {"colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{job=\"node\",device_id=\"$device\",mode=\"idle\"}[5m])) / count(rate(node_cpu_seconds_total{job=\"node\",device_id=\"$device\",mode=\"idle\"}[5m])))", "refId": "A"}], "title": "CPU used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Root filesystem usage %.", "fieldConfig": {"defaults": {"max": 100, "min": 0, "thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 75}, {"color": "red", "value": 90}]}, "unit": "percent"}, "overrides": []}, "gridPos": {"h": 6, "w": 12, "x": 0, "y": 4}, "id": 4, "options": {"colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "100 * (1 - node_filesystem_avail_bytes{job=\"node\",device_id=\"$device\",mountpoint=\"/\"} / node_filesystem_size_bytes{job=\"node\",device_id=\"$device\",mountpoint=\"/\"})", "refId": "A"}], "title": "Disk / used %", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Seconds since the last WireGuard handshake; rising values mean a stale tunnel. Source: textfile metric wireguard_last_handshake_seconds.", "fieldConfig": {"defaults": {"thresholds": {"mode": "absolute", "steps": [{"color": "green", "value": 0}, {"color": "yellow", "value": 180}, {"color": "red", "value": 600}]}, "unit": "s"}, "overrides": []}, "gridPos": {"h": 6, "w": 12, "x": 12, "y": 4}, "id": 5, "options": {"colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false}, "textMode": "auto"}, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "time() - wireguard_last_handshake_seconds{job=\"node\",device_id=\"$device\"}", "refId": "A"}], "title": "WireGuard handshake age", "type": "stat"}, {"datasource": {"type": "prometheus", "uid": "prometheus"}, "description": "Running containers (1) vs stopped (0), including MEG. Source: textfile metric docker_container_running.", "fieldConfig": {"defaults": {"mappings": [{"options": {"0": {"text": "STOPPED"}, "1": {"text": "RUNNING"}}, "type": "value"}], "thresholds": {"mode": "absolute", "steps": [{"color": "red", "value": 0}, {"color": "green", "value": 1}]}}, "overrides": []}, "gridPos": {"h": 6, "w": 24, "x": 0, "y": 10}, "id": 6, "targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "docker_container_running{job=\"node\",device_id=\"$device\"}", "legendFormat": "{{name}}", "refId": "A"}], "title": "Docker containers", "type": "timeseries"}], "refresh": "30s", "schemaVersion": 39, "tags": ["blueforce", "fleet"], "templating": {"list": [{"current": {}, "datasource": {"type": "prometheus", "uid": "prometheus"}, "definition": "label_values(up{job=\"node\"}, device_id)", "includeAll": false, "multi": false, "name": "device", "options": [], "query": {"query": "label_values(up{job=\"node\"}, device_id)", "refId": "PrometheusVariableQueryEditor-VariableQuery"}, "refresh": 1, "regex": "", "type": "query"}]}, "time": {"from": "now-6h", "to": "now"}, "timepicker": {}, "timezone": "", "title": "Blueforce Fleet Overview", "uid": "bf-fleet-overview", "version": 1} + + + +# Auto-provision the fleet dashboard from disk (no manual import). +apiVersion: 1 + +providers: + - name: blueforce-fleet + orgId: 1 + folder: Blueforce + type: file + disableDeletion: false + updateIntervalSeconds: 30 + allowUiUpdates: false + options: + path: /etc/grafana/dashboards + + + +# Auto-provisioned Prometheus datasource for Grafana OSS. +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true + editable: false + + + +[ + { + "targets": ["10.7.0.11"], + "labels": { + "device_id": "BF-12010193", + "site": "pilot", + "job": "node" + } + } +] + + + +# File-based service discovery for the 700-device fleet. +# +# Prometheus watches this directory (refresh 30s); adding or removing a +# `*.json` file takes effect without a reload or restart. +# +# Per-device entry template (WireGuard address as target, identity label +# contract `device_id="BF-"` on every target): +# +# [ +# { +# "targets": ["10.7.0.11"], +# "labels": {"device_id": "BF-12010193", "site": "pilot", "job": "node"} +# } +# ] +# +# Scale-out: generate one file per site/region (e.g. `site-ankara.json`) +# from the Ansible inventory; keep each file under a few thousand targets. + + + +# Fleet alert rules. Severity: critical pages the on-call admin (14-MONITORING). +# Notification endpoints (SMS/e-mail/webhook) are wired in the central +# Grafana Alerting / Alertmanager setup, not in this file. +# All expressions assume 60s scrape interval. + +groups: + - name: fleet + interval: 60s + rules: + # Device does not answer scrapes for 5 minutes -> presumed offline. + - alert: FleetOffline + expr: up{job="node"} == 0 + for: 5m + labels: + severity: critical + annotations: + summary: "Device {{ $labels.device_id }} is offline" + description: "No successful scrape for 5m (instance {{ $labels.instance }}). Check Uptime Kuma last-seen and field power/network." + + # Root filesystem less than 10% available for 10 minutes. + - alert: FleetDiskFull + expr: | + ( + node_filesystem_avail_bytes{job="node", mountpoint="/", fstype!~"tmpfs|overlay"} + / + node_filesystem_size_bytes{job="node", mountpoint="/", fstype!~"tmpfs|overlay"} + ) < 0.10 + for: 10m + labels: + severity: critical + annotations: + summary: "Device {{ $labels.device_id }} disk almost full" + description: "Root filesystem <10% available for 10m on {{ $labels.instance }}." + + # Boot time changed recently -> unexpected reboot (power loss or crash). + - alert: FleetUnexpectedReboot + expr: time() - node_boot_time_seconds{job="node"} < 15 * 60 + for: 5m + labels: + severity: critical + annotations: + summary: "Device {{ $labels.device_id }} rebooted unexpectedly" + description: "{{ $labels.instance }} booted less than 15m ago. Correlate with power-loss recovery (16-POWER-LOSS)." + + # unattended-upgrades must stay DISABLED (K-11); 1 means the lock was broken. + # Source: textfile metric unattended_upgrade_active. + - alert: FleetSecurityUpdatesViolation + expr: unattended_upgrade_active{job="node"} == 1 + for: 5m + labels: + severity: critical + annotations: + summary: "Device {{ $labels.device_id }} has unattended-upgrades enabled" + description: "Update policy lock (K-11) violated on {{ $labels.instance }}. Disable unattended-upgrades per 10-UPDATE." + + + +# Prometheus configuration for the Blueforce fleet. +# Scrape interval 60s keeps cardinality/storage tractable at 700 nodes. +# Fleet targets scale via file-based service discovery: add/remove entries +# in targets/fleet.json without reloading Prometheus (refresh_interval 30s). + +global: + scrape_interval: 60s + scrape_timeout: 10s + evaluation_interval: 60s + external_labels: + fleet: blueforce + +rule_files: + - alerts.yml + +scrape_configs: + # Prometheus self-monitoring. + - job_name: prometheus + static_configs: + - targets: ["localhost:9090"] + + # Field devices: Node Exporter (:9100) + textfile collector metrics. + # Identity label contract: device_id="BF-" on every target. + - job_name: node + file_sd_configs: + - files: ["/etc/prometheus/targets/*.json"] + refresh_interval: 30s + relabel_configs: + - source_labels: [__address__] + target_label: __address__ + regex: (.+) + replacement: ${1}:9100 + - source_labels: [device_id] + target_label: device_id + regex: (.+) + replacement: ${1} + metric_relabel_configs: + # Enforce the device_id label contract; drop series without it. + - source_labels: [device_id] + regex: .+ + action: keep + + + +# Central monitoring stack for the Blueforce fleet. +# Grafana requires GF_SECURITY_ADMIN_PASSWORD__FILE on first startup; no default credential exists. +services: + prometheus: + image: prom/prometheus:v3.1.0 + container_name: bf-prometheus + restart: unless-stopped + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro + - ./prometheus/alerts.yml:/etc/prometheus/alerts.yml:ro + - ./prometheus/targets:/etc/prometheus/targets:ro + - prometheus-data:/prometheus + command: [--config.file=/etc/prometheus/prometheus.yml, --storage.tsdb.path=/prometheus, --storage.tsdb.retention.time=90d, --web.enable-lifecycle] + ports: ["127.0.0.1:9090:9090"] + networks: [monitoring] + grafana: + image: grafana/grafana-oss:11 + container_name: bf-grafana + restart: unless-stopped + depends_on: [prometheus] + environment: + GF_SECURITY_ADMIN_USER: "${GF_SECURITY_ADMIN_USER:-admin}" + GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password + secrets: [grafana_admin_password] + volumes: + - grafana-data:/var/lib/grafana + - ./grafana/provisioning:/etc/grafana/provisioning:ro + - ./grafana/dashboards:/etc/grafana/dashboards:ro + ports: ["127.0.0.1:3001:3000"] + networks: [monitoring] + uptime-kuma: + image: louislam/uptime-kuma:1 + container_name: bf-uptime-kuma + restart: unless-stopped + volumes: [uptime-kuma-data:/app/data] + ports: ["127.0.0.1:3002:3001"] + networks: [monitoring] +secrets: + grafana_admin_password: + file: "${GRAFANA_ADMIN_PASSWORD_FILE:?Set GRAFANA_ADMIN_PASSWORD_FILE to a root-owned password file}" +volumes: + prometheus-data: + grafana-data: + uptime-kuma-data: +networks: + monitoring: + driver: bridge + + + +# Central monitoring stack (Prometheus + Grafana OSS + Uptime Kuma) + +## Start + +Create a root-owned password file whose contents are the Grafana first-admin password (no newline is preferred), then start with its absolute path: + +```bash +install -m 600 -o root -g root /dev/null /etc/blueforce/grafana-admin-password +# Write the generated password directly to /etc/blueforce/grafana-admin-password. +cd monitoring +GRAFANA_ADMIN_PASSWORD_FILE=/etc/blueforce/grafana-admin-password docker compose up -d +``` + +`GRAFANA_ADMIN_PASSWORD_FILE` is mandatory. Compose mounts that host file as a Docker secret; it is not stored in the repository or printed in the compose environment. The process owner must keep the file root-owned and mode `0600`. Grafana is available at `http://127.0.0.1:3001`; Prometheus at `:9090`; Uptime Kuma at `:3002`. + +## Fleet targets + +Field devices are scraped via file-based service discovery in `prometheus/targets/*.json` (see `prometheus/targets/README.md`). + +## Alerts + +Validate changes with `promtool check rules prometheus/alerts.yml` and `promtool check config prometheus/prometheus.yml`. + + + +# Ubuntu Subiquity autoinstall v1 for the Blueforce Field OS installation medium. +# +# This file is copied to the root of the installation medium as /autoinstall.yaml, +# which is where Subiquity looks for configuration on the medium itself. No separate +# NoCloud seed USB is needed, and the same content is shipped under +# /blueforce-provisioning/autoinstall/ for the seed-based V1 flow. +# +# Storage stays interactive on purpose: the operator selects and confirms the target +# disk on the installer screen. This file contains no layout, match, wipe, path or +# identity directive, and device identity is collected at firstboot. +autoinstall: + version: 1 + interactive-sections: [storage] + # No primary mirror is reachable at an air-gapped site: install from the medium. + apt: + fallback: offline-install + late-commands: + # Medium contents: /autoinstall.yaml plus /blueforce-provisioning/{autoinstall, + # firstboot,offline-repo,release}. These commands only copy reviewed medium + # content into the target; no device identity is created or embedded here. + - mkdir -p /target/opt/blueforce + - cp -a /cdrom/blueforce-provisioning/offline-repo /target/opt/blueforce/offline-repo + - "curtin in-target -- sh -c 'cp -a /opt/blueforce/offline-repo/built/. /opt/blueforce/offline-repo/ 2>/dev/null || true'" + - "curtin in-target -- sh -c 'rmdir /opt/blueforce/offline-repo/built 2>/dev/null || true'" + - install -D -m 0755 /cdrom/blueforce-provisioning/firstboot/bf-firstboot /target/usr/local/sbin/bf-firstboot + - install -D -m 0644 /cdrom/blueforce-provisioning/firstboot/blueforce-firstboot.service /target/etc/systemd/system/blueforce-firstboot.service + - install -D -m 0644 /cdrom/blueforce-provisioning/release/blueforce-release /target/etc/blueforce-release + - curtin in-target -- systemctl enable blueforce-firstboot.service + + + +# Intentionally empty NoCloud metadata. No instance or machine identity is embedded. +{} + + + +# Autoinstall + +Ubuntu Subiquity autoinstall v1 baseline for the Blueforce Field OS medium. It is +identity-free and stays operator-assisted. + +- `autoinstall.yaml` is copied to the root of the installation medium as + `/autoinstall.yaml`, which is where Subiquity reads configuration from the medium + itself; `build-blueforce-iso.sh` also ships a copy under + `/blueforce-provisioning/autoinstall/`. +- `user-data` is the NoCloud transport for the V1 "official ISO + seed USB" flow. Its + autoinstall block is kept identical to `autoinstall.yaml` so both flows behave the same. +- `interactive-sections: [storage]` is mandatory. The technician selects and confirms the + target disk on the installer screen; V1 never wipes a disk automatically. +- `apt.fallback: offline-install` is explicit: when no primary mirror is reachable, + Subiquity reverts to an offline installation from the medium instead of aborting. +- `late-commands` only copy reviewed medium content into the target: the offline APT + repository to `/opt/blueforce/offline-repo`, the firstboot payload to + `/usr/local/sbin/bf-firstboot`, its service unit to `/etc/systemd/system/`, the release + identity to `/etc/blueforce-release`, and the service is enabled. It stays inert until + an operator supplies the dealer ID and the authorised public key on the installed + system (`ConditionPathExists=` guards in the unit). +- No `identity` block, user, password, SSH key, dealer id or disk directive belongs here; + device identity is collected at firstboot (K-09/K-12). The static test suite enforces + this, and `build-blueforce-iso.sh` re-scans its inputs before it writes a medium. + +Flavour note: this configuration is written for the Ubuntu installer's autoinstall +contract. The LAB build base is currently the Desktop flavour ISO (see `../iso/README.md`); +the autoinstall path on that flavour must be accepted in the LAB matrix before production +use. + + + +#cloud-config +# NoCloud payload for the V1 "official ISO + seed USB" flow. The autoinstall block is +# kept identical to provisioning/autoinstall/autoinstall.yaml: the custom Field OS +# medium carries the same configuration at /autoinstall.yaml, so both flows behave the +# same way and storage always stays operator-confirmed. +autoinstall: + version: 1 + interactive-sections: [storage] + # No primary mirror is reachable at an air-gapped site: install from the medium. + apt: + fallback: offline-install + late-commands: + - mkdir -p /target/opt/blueforce + - cp -a /cdrom/blueforce-provisioning/offline-repo /target/opt/blueforce/offline-repo + - "curtin in-target -- sh -c 'cp -a /opt/blueforce/offline-repo/built/. /opt/blueforce/offline-repo/ 2>/dev/null || true'" + - "curtin in-target -- sh -c 'rmdir /opt/blueforce/offline-repo/built 2>/dev/null || true'" + - install -D -m 0755 /cdrom/blueforce-provisioning/firstboot/bf-firstboot /target/usr/local/sbin/bf-firstboot + - install -D -m 0644 /cdrom/blueforce-provisioning/firstboot/blueforce-firstboot.service /target/etc/systemd/system/blueforce-firstboot.service + - install -D -m 0644 /cdrom/blueforce-provisioning/release/blueforce-release /target/etc/blueforce-release + - curtin in-target -- systemctl enable blueforce-firstboot.service + + + +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Blueforce enrollment V1 request", + "description": "Sent by bf-enroll from a PROVISIONED_OFFLINE device. Carries public facts only: the WireGuard private key, the one-time token value and every other credential stay on the device. The single-use token travels in the Authorization header, never in this document.", + "type": "object", + "additionalProperties": false, + "required": ["device_id", "wireguard_public_key", "idempotency_key", "hardware", "release"], + "properties": { + "device_id": { + "type": "string", + "pattern": "^BF-[0-9]{8}$", + "description": "Fleet identity derived from the validated dealer number." + }, + "wireguard_public_key": { + "type": "string", + "pattern": "^[A-Za-z0-9+/]{43}=$", + "description": "Device public key only. The matching private key never leaves the device." + }, + "idempotency_key": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "description": "sha256(provisioning_id | device_id | wireguard_public_key). Stable across retries so central can deduplicate retries while the one-time credential stays single-use." + }, + "hardware": { + "type": "object", + "additionalProperties": false, + "required": ["machine_id", "product_uuid", "sys_vendor"], + "properties": { + "machine_id": {"type": "string"}, + "product_uuid": {"type": "string"}, + "sys_vendor": {"type": "string"} + } + }, + "release": { + "type": "object", + "additionalProperties": false, + "required": ["os_release", "kernel"], + "properties": { + "os_release": {"type": "string"}, + "kernel": {"type": "string"} + } + } + } +} + + + +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Blueforce enrollment V1 response", + "description": "Accepted enrollment response. It carries the assigned WireGuard peer, the deterministic idempotency key and mandatory central_verification evidence references. It never carries a WireGuard private key, a credential, a URL, a RustDesk credential or any other confidential value. The device assembles its own configuration and keeps its own private key.", + "type": "object", + "additionalProperties": false, + "required": ["status", "device_id", "idempotency_key", "wireguard", "central_verification"], + "properties": { + "status": { + "const": "accepted", + "description": "Any other value must be treated as a rejection; the device stays PENDING." + }, + "device_id": { + "type": "string", + "pattern": "^BF-[0-9]{8}$" + }, + "idempotency_key": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "description": "Echo of the request key. A mismatch rejects the whole response." + }, + "enrollment_id": { + "type": "string", + "minLength": 1, + "description": "Central audit reference for this enrollment record." + }, + "wireguard": { + "type": "object", + "additionalProperties": false, + "required": ["address", "endpoint", "server_public_key", "allowed_ips"], + "properties": { + "address": { + "type": "string", + "pattern": "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}/(?:[0-9]|[12][0-9]|3[0-2])$", + "description": "Device tunnel address with prefix, for example 10.20.0.17/32." + }, + "endpoint": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*:[1-9][0-9]{0,4}$", + "description": "Central hub endpoint as host:port. Placeholder values are rejected locally." + }, + "server_public_key": { + "type": "string", + "pattern": "^[A-Za-z0-9+/]{43}=$", + "description": "Hub public key only; a private key is never accepted here." + }, + "allowed_ips": { + "type": "string", + "minLength": 1, + "description": "Comma-separated tunnel routes; must be a single line." + } + } + }, + "central_verification": { + "type": "object", + "additionalProperties": false, + "required": ["status", "verification_id", "monitoring", "remote", "management"], + "properties": { + "status": {"enum": ["pending", "verified"]}, + "verification_id": {"type": "string", "minLength": 1}, + "monitoring": {"$ref": "#/$defs/verification"}, + "remote": {"$ref": "#/$defs/verification"}, + "management": {"$ref": "#/$defs/verification"} + }, + "description": "Central evidence references. The device never invents them: without a well-formed record the ENROLLED gate fails closed, and READY additionally requires every channel to be verified." + } + }, + "$defs": { + "verification": { + "type": "object", + "additionalProperties": false, + "required": ["status", "verification_id"], + "properties": { + "status": {"enum": ["pending", "verified"]}, + "verification_id": {"type": "string", "minLength": 1} + } + } + } +} + + + +# Enrollment sözleşmesi (Field OS yaşam döngüsü) + +Bu dizin **sözleşmedir, uç nokta değildir**: istemci davranışı, istek/yanıt şemaları ve +güven modeli burada tanımlanır. Merkezi enrollment API'si bu repoda uygulanmaz; +uygulanması ayrı bir güvenlik incelemesi gerektirir (prompt §18, `docs/29` §13). + +İlgili dosyalar: `docs/29-DEVICE-ENROLLMENT.md` (karar K-17), `docs/26` (K-15), +`schemas/enrollment-request.schema.json`, `schemas/enrollment-response.schema.json`. + +## 1. Durum makinesi (ileri yönlü, atlama yok) + +```text +(yok) --yerel kurulum--> PROVISIONED_OFFLINE --tek kullanımlık token--> ENROLLED --tüm kanallar doğrulandı--> READY +``` + +| Aşama | Ne kanıtlanır | Gerekli kanıt | İnternet | +|---|---|---|---| +| `PROVISIONED_OFFLINE` | Yerel kurulum tamam; cihaz çevrimdışı işe hazır | `bf-check-local`: yerel sistem durumu, xRDP, WireGuard anahtar çifti | Gerekmez | +| `ENROLLED` | Merkez cihazı tanıdı, WireGuard peer atandı, monitoring/inventory/RustDesk yapılandırması uygulandı | Doğrulanmış enrollment yanıtı + `central_verification` referansları + yeni WG handshake | Gerekir | +| `READY` | Yerel sağlık **ve** üç merkezi kanal doğrulandı | `bf-check-ready`: `bf-check-local` + `bf-check-enrollment` + `bf-remote-status --check` | Gerekir | + +Geçiş kuralları (yazıcı ve okuyucu tarafında birlikte uygulanır): + +- **Geriye dönüş yok.** `ENROLLED -> PROVISIONED_OFFLINE` ve `READY -> ENROLLED` yazılmaz; + `bf-enroll` READY cihazda çalışmayı reddeder. READY sonrası ciddi kimlik sorunu + `docs/27` akışıyla yeniden provision edilir. +- **Atlama yok.** `PROVISIONED_OFFLINE -> READY` doğrudan yazılamaz. READY yalnız + `bf-check-ready` geçtikten sonra final gate tarafından yazılır; okuma tarafında + `bf-enrollment-status` böyle bir durumu `INVALID` ve sıfırdan farklı çıkış kodu ile + bildirir (fail-closed). +- **Atomik yazım.** Her geçiş aynı dizinde `tmp + rename` ile yapılır, dosya modu `0600`, + `fsync` uygulanır. Yazıcılar `.state.lock` üzerinde `flock` ile serileştirilir ve geçiş + kilit altında yeniden doğrulanır (boot timer ile teknisyen yarışı). +- **Yetkili yazıcılar.** `PROVISIONED_OFFLINE` yerel kurulum, `ENROLLED` `bf-enroll`, + `READY` final kurulum kapısı. Başka hiçbir araç yaşam döngüsü durumunu değiştirmez: + `bf-status`, `bf-enrollment-status`, `bf-check-*` yalnız okur. + +Durum dosyası sözleşmesi (`/var/lib/blueforce/state.json`, `chmod 600`, `BF_STATE_FILE` +ile geçersiz kılınabilir): `phase`, `enrollment_status`, `fleet_status`, `device_id` +(`BF-`), `provisioning_id`. Bilinmeyen ek alanlar korunur ve yok sayılır. + +## 2. İstek / yanıt sözleşmesi + +**İstek** (`bf-enroll`, `schemas/enrollment-request.schema.json`): `device_id`, +`wireguard_public_key`, `idempotency_key`, `hardware`, `release`. İstek gövdesinde +secret yoktur: WireGuard private key, token değeri ve diğer kimlik bilgileri gövdeye +girmez. Tek kullanımlık token `Authorization` başlığında, argv'ye düşmeyen anonim bir +process-substitution fd'si üzerinden taşınır; başlık dosyaya, state'e veya loga yazılmaz. + +**Yanıt** (`schemas/enrollment-response.schema.json`): `status` (`accepted`), `device_id`, +`idempotency_key` (istekle birebir aynı olmalı), isteğe bağlı `enrollment_id`, +`wireguard` (hub public key + adres + endpoint + allowed_ips) ve **zorunlu** +`central_verification` (`status`, `verification_id` ve her biri `status` + +`verification_id` taşıyan `monitoring`, `remote`, `management`). Yanıt bütünüyle +doğrulanır: fazla alan, uyuşmayan kimlik ya da `idempotency_key` tüm yanıtı reddettirir. +Yerel WireGuard yapılandırması yalnız bu doğrulamadan sonra kurulur; private key +merkezden **kabul edilmez**, cihazda kalır. + +`central_verification` referansları istemci tarafından üretilmez; yalnız doğrulanmış +enrollment yanıtından kalıcılaştırılır. Eksik/biçimsiz kayıt ENROLLED kapısını, `pending` +kanal ise READY kapısını fail-closed düşürür (cihaz ENROLLED kalır). + +## 3. Güven modeli: alternatifler + +| Seçenek | Artı | Eksi | 700 cihaz ölçeği | Sonuç | +|---|---|---|---|---| +| **Tek kullanımlık, TTL'li token** | Küçük sızıntı alanı; kayıp başına iptal edilebilir; cihaz bağlama (`BF-`) | Token üretim/i̇ptal hizmeti gerekir | Cihaz başına ayrı kayıt izi | **Seçildi** (K-17) | +| İmzalı bootstrap bundle (merkez imzalı dosya, cihaz sadece tüketir) | Çevrimiçi token hizmeti gerekmez; imza ile kimlik doğrulama | İmza anahtarı rotasyonu, bundle dağıtım kanalı ve çevrimdışı "eski bundle" riski; geri çekme zor | Bundle sürüm/iptal yönetimi filo çapında iş yükü | Elendi (V1) | +| Paylaşılan kalıcı bootstrap secret | Kurulumu basit | Tek sızıntı tüm filoyu etkiler; cihaz başına iptal imkânsız | Kabul edilemez blast-radius | Elendi | +| Manuel merkezi kayıt | Ek sistem yok | Denetim izi zayıf, insan hatası | 700 kayıt için sürdürülemez | Elendi | + +Hiçbir seçenekte **700 cihaza ortak kalıcı secret konmaz**. Karar kaydı: `docs/24` K-17, +alternatif analizi `docs/29` §5. + +### 3.1 Çevrimdışı → çevrimiçi geçiş (katılım) mekanizması + +Teknisyen tokenı cihaz başına bir kez iletir: + +```bash +# İnternet varken anında enrollment (önerilen): +printf '%s\n' '' | sudo -E bf-enroll --token-stdin + +# İnternet yokken: token'ı cihazda bırakmadan boot denemesine hazırla: +printf '%s\n' '' | sudo -E bf-enroll-now --stage +``` + +`--stage` gerekçesi: saha cihazı çoğu kez önce çevrimdışı kurulur. İnternet geldiğinde +"kendiliğinden katılma" için tek kullanımlık token'ın cihazda **sınırlı ömürlü** bir +bekleme dosyasında durması gerekir. Uygulanan sınırlar: + +- Dosya `/enrollment.token`, mod `0600`, sahibi çalıştıran kullanıcı (root), + TTL `BF_ENROLLMENT_TOKEN_MAX_AGE` (varsayılan 1800 sn, süre sonunda silinir). +- Token argv'ye, state dosyasına, support bundle'a ve kurulum medyasına (USB/ISO) hiç + yazılmaz; yalnız bu tek dosyada ve yalnız boot denemesi okuyabilir. +- Token başarılı enrollment'ta veya kesin (HTTP 4xx) reddedilmede **hemen** silinir. + Yalnız geçici hata (DNS/TCP/TLS/zaman aşımı) token'ı sınırlı yeniden deneme için korur. +- Support bundle bu dosyayı toplamaz; `--stage` yalnız root tarafından kullanılabilir. + +Bu mekanizma tek kullanımlık token'ın replay engelini değiştirmez: aynı token merkezde +yalnız bir kez tüketilir, `idempotency_key` retry'leri birleştirir. + +## 4. Başarısızlık davranışı (reboot loop yok) + +1. HTTP isteği başarısız: yaşam döngüsü önceki aşamada kalır (`PENDING` / + `PROVISIONED_OFFLINE`); hiçbir yapılandırma kurulmaz. +2. Yanıt doğrulaması başarısız: durum dosyası değişmez, geçici dosyalar silinir. +3. WireGuard etkinleştirmesi başarısız: yeni `wg0.conf` geri alınır (öncesi varsa eski + hali geri yüklenir, yoksa unit devre dışı bırakılır), durum dosyası yazılmaz. +4. Cihaz reboot edilmez: `blueforce-enroll.service` `Restart=on-failure` + + `RestartSec=5min` + `StartLimitBurst=6` / `StartLimitIntervalSec=1h` ile en fazla + saati 6 deneme yapar, sonrası `blueforce-enroll.timer` kadansına döner. İnternet yokken + agresif deneme yapılmaz; internet gelince cihaz kendiliğinden katılır. +5. Token yoksa veya durum `READY`/kurulmamış ise deneme hiçbir iş yapmadan `0` ile çıkar + (`PENDING` mesajı ile): yeniden deneme fırtınası oluşmaz. + +## 5. Araçlar ve aşama kapıları + +| Araç / unit | Aşama | Not | +|---|---|---| +| `bf-check-local` | `PROVISIONED_OFFLINE` | İnternet, handshake ve merkez kanıtı **gerekmez**; eksik `wg0.conf` yalnız uyarıdır | +| `bf-enroll` | `PROVISIONED_OFFLINE -> ENROLLED` | Token stdin'den ya da sahnelenmiş dosyadan; `--check` dry-run | +| `bf-check-enrollment` | `ENROLLED` | Merkez kaydı + atanmış peer + canlı tünel + yeni handshake; handshake yokluğu **başarısızlık** | +| `bf-check-ready` | `READY` | Yerel sağlık + tüm merkezi kanallar; kalıcı READY'a güvenmez | +| `bf-enrollment-status` | tümü (salt-okunur) | Sözleşme doğrulayıcı; `INVALID` durumda çıkış kodu ≠ 0 | +| `bf-status` | tümü (salt-okunur) | `Provisioning` / `Enrollment` / `Fleet State` özet bloğu | +| `blueforce-enroll.service` + `blueforce-enroll.timer` | otomatik deneme | Boot +10 dk, sonra günlük; sınırlı `Restart=` | + +`blueforce-enrollment.timer` **ayrıca oluşturulmaz**: kurucu modül (`17-healthcheck`) yalnız +`blueforce-enroll.service` ve `blueforce-enroll.timer` dosyalarını cihaza kurar; ikinci bir +timer kurulmadığı için ölü yapılandırma olurdu. Periyodik kadans mevcut timer ve +servisin sınırlı `Restart=` davranışından gelir. + +## 6. Doğrulama + +```bash +bash tests/test-field-os-lifecycle.sh # sözleşme, aşama geçişleri, fail-closed davranışı +bash tests/check-provisioning-static.sh # şema/secret/cihaz-kimliği taraması +``` + +Şemalar JSON Schema 2020-12'dir ve `bf-enroll`'in gerçek davranışıyla birebir hizalanır +(zorunlu alanlar, `wireguard` alt alanları, `central_verification` biçimi). Endpoint +uygulaması, kimlik doğrulama, imzalama, iptal ve deneme politikası ayrı güvenlik +incelemesi olmadan eklenmeyecektir. + + + +#!/usr/bin/env bash +# Blueforce Field OS first-boot entry point. +# +# Role: obtain the 8-digit dealer number (console wizard for a technician, or a flag/file +# for automation), validate it, verify the offline prerequisites, run the local offline +# installer exactly once, then stamp the completion marker. +# +# Every comment and identifier in this file is English. The only Turkish strings are the +# technician-facing wizard labels, because the field console UI is Turkish. +# +# Guarantees: +# * idempotent: when the marker exists the run changes nothing and exits 0; +# * identity is write-once: the device identity cannot be changed through the normal +# path or through the wizard; changing it needs the separate admin procedure +# (--force-reidentity), which stays disabled unless BF_ALLOW_REIDENTITY=1; +# * fail-closed: an invalid dealer number, a missing terminal, or an unacceptable +# administrator public key aborts with an explicit message and a non-zero exit; +# * no secret material is ever printed, logged, or copied. Only key paths, never key +# content, are used in messages. +set -euo pipefail + +PROG='bf-firstboot' +DEALER_ID_RE='^[0-9]{8}$' +DEFAULT_DEALER_FILE='/etc/blueforce/dealer-id' +DEFAULT_ADMIN_KEY_FILE='/etc/blueforce/admin-authorized-key.pub' +DEFAULT_MARKER='/var/lib/blueforce/firstboot-complete' +DEFAULT_INSTALLER='/usr/local/sbin/blueforce-install.sh' +AUDIT_LOG="${BF_REIDENTITY_AUDIT_LOG:-/var/log/blueforce-reidentity.log}" + +MARKER="${BF_FIRSTBOOT_MARKER:-$DEFAULT_MARKER}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +INPUT_TIMEOUT="${BF_FIRSTBOOT_INPUT_TIMEOUT:-300}" +MAX_ATTEMPTS="${BF_FIRSTBOOT_MAX_ATTEMPTS:-3}" + +DEALER_ID='' +DEALER_FILE="$DEFAULT_DEALER_FILE" +DEALER_FILE_GIVEN=0 +CHECK_ONLY=0 +FORCE_REIDENTITY=0 +FORCED_INTERACTIVE=0 +NONINTERACTIVE="${BF_FIRSTBOOT_NONINTERACTIVE:-0}" +TTY_FD='' +WIZ_OUT_FD='1' +INSTALLER='' +KEY_FILE='' + +usage() { + cat <<'EOF' +Usage: bf-firstboot [--dealer-id 8DIGITS] [--dealer-id-file PATH] + [--interactive] [--non-interactive] [--check] + +Interactive (default when a console is present): the wizard prints the field console +banner, asks for the 8-digit dealer number, shows the resulting Device ID and hostname, +and asks for confirmation before anything is installed. + +Automation: --dealer-id or --dealer-id-file (or BF_FIRSTBOOT_NONINTERACTIVE=1 with the +seeded dealer id file) never prompts, so the offline installer can run unattended. + + --check validate the inputs and report; creates no state and no marker + --interactive force the wizard, even when a seeded dealer id file exists + --non-interactive never prompt; use --dealer-id-file or the seeded dealer id file + +Identity changes are not part of this command. They use the separate admin-only +--force-reidentity path, which is documented in provisioning/firstboot/README.md and +stays disabled unless BF_ALLOW_REIDENTITY=1 is set by an operator at the console. +EOF +} + +# Every message carries dealer ids, device ids and paths only. Secret material (key +# contents, tokens, passwords) is never formatted into them, so printing them is safe. +# The systemd unit sends stdout/stderr to the console TTY, so each line is also mirrored +# to the journal through logger when that tool is present. +journal() { + command -v logger >/dev/null 2>&1 || return 0 + printf '%s [%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$PROG" "$*" | logger -t "$PROG" 2>/dev/null || true +} +log() { printf '%s [%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$PROG" "$*"; journal "$*"; } +warn() { printf '%s [%s] WARNING: %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$PROG" "$*" >&2; journal "WARNING: $*"; } +err() { printf '%s [%s] ERROR: %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$PROG" "$*" >&2; journal "ERROR: $*"; } + +bf_device_id() { printf 'BF-%s' "$1"; } +bf_hostname() { printf 'bf-%s' "$1"; } +valid_dealer_id() { [[ "$1" =~ $DEALER_ID_RE ]]; } + +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + --dealer-id) + [[ -n "${2:-}" ]] || { err '--dealer-id needs a value: exactly 8 digits'; usage >&2; exit 2; } + DEALER_ID="$2"; shift 2;; + --dealer-id-file) + [[ -n "${2:-}" ]] || { err '--dealer-id-file needs a path'; usage >&2; exit 2; } + DEALER_FILE="$2"; DEALER_FILE_GIVEN=1; shift 2;; + --check) CHECK_ONLY=1; shift;; + --force-reidentity) FORCE_REIDENTITY=1; shift;; + --interactive) FORCED_INTERACTIVE=1; shift;; + --non-interactive) NONINTERACTIVE=1; shift;; + --help|-h) usage; exit 0;; + *) err "unknown argument: $1"; usage >&2; exit 2;; + esac + done + [[ "$MAX_ATTEMPTS" =~ ^[1-9][0-9]*$ ]] || { err 'BF_FIRSTBOOT_MAX_ATTEMPTS must be a positive integer'; exit 2; } + [[ "$INPUT_TIMEOUT" =~ ^[0-9]+$ ]] || { err 'BF_FIRSTBOOT_INPUT_TIMEOUT must be a number of seconds'; exit 2; } + [[ "$NONINTERACTIVE" == 0 || "$NONINTERACTIVE" == 1 ]] || { err 'BF_FIRSTBOOT_NONINTERACTIVE must be 0 or 1'; exit 2; } +} + +read_dealer_id_file() { + local path="$1" value + [[ -f "$path" && -r "$path" ]] || { err "dealer id file is missing or unreadable: $path"; exit 2; } + value="$(tr -d '[:space:]' < "$path" || true)" + [[ -n "$value" ]] || { err "dealer id file is empty: $path"; exit 2; } + printf '%s' "$value" +} + +marker_exists() { [[ -e "$MARKER" ]]; } + +marker_device_id() { + [[ -f "$MARKER" ]] || return 0 + tr -d '[:space:]' < "$MARKER" || true +} + +write_marker() { + local tmp + install -d -m 700 "$(dirname "$MARKER")" + tmp="$MARKER.tmp.$$" + printf '%s\n' "$DEALER_ID" > "$tmp" + chmod 600 "$tmp" + mv -f "$tmp" "$MARKER" + log "marker written: $MARKER (device $(bf_device_id "$DEALER_ID"))" +} + +# Attach the wizard to a terminal. stdin is used when it already is a terminal (this is +# the systemd StandardInput=tty-force case); otherwise /dev/tty is opened, and when that +# fails too the caller falls back to the automation input path. +open_tty() { + if [[ -t 0 ]]; then TTY_FD=0; WIZ_OUT_FD=1; return 0; fi + if { exec 3<>/dev/tty; } 2>/dev/null; then TTY_FD=3; WIZ_OUT_FD=3; return 0; fi + return 1 +} + +require_tty() { + open_tty && return 0 + err 'a terminal is required for the interactive wizard, but none is available; pass --dealer-id or --dealer-id-file instead' + exit 2 +} + +wizard_out() { printf '%s\n' "$*" >&"$WIZ_OUT_FD"; } +wizard_write() { printf '%s' "$*" >&"$WIZ_OUT_FD"; } + +wizard_read() { + local __name="$1" __value='' + read -r -t "$INPUT_TIMEOUT" -u "$TTY_FD" __value || return 1 + printf -v "$__name" '%s' "${__value%$'\r'}" +} + +# Trim surrounding whitespace only: a pasted value keeps working, while any other +# deviation from the 8-digit identity is rejected and asked again. +trim_space() { + local value="$1" + value="${value#"${value%%[![:space:]]*}"}" + value="${value%"${value##*[![:space:]]}"}" + printf '%s' "$value" +} + +# Interactive identity collection. A malformed number or a refused confirmation is never +# accepted: after MAX_ATTEMPTS the run aborts without changing anything. +wizard_collect() { + local attempt=1 line answer + wizard_out '# BLUEFORCE FIELD OS' + while (( attempt <= MAX_ATTEMPTS )); do + wizard_out '8 Haneli Bayi Numarası:' + wizard_write '> ' + if ! wizard_read line; then + err 'no terminal input arrived (timed out); first boot aborted without changes' + exit 2 + fi + wizard_out '' + line="$(trim_space "$line")" + if valid_dealer_id "$line"; then + wizard_out "Device ID (cihaz kimliği): $(bf_device_id "$line")" + wizard_out "Hostname (makine adı) : $(bf_hostname "$line")" + wizard_write "Kurulum bu kimlikle başlatılsın mı? [e/H]: " + if ! wizard_read answer; then + err 'no terminal input arrived (timed out); first boot aborted without changes' + exit 2 + fi + wizard_out '' + if [[ "$answer" =~ ^([eE]|[eE]vet|y|Y|yes|YES)$ ]]; then + DEALER_ID="$line" + log "dealer number accepted at the console as $(bf_device_id "$DEALER_ID") on $(bf_hostname "$DEALER_ID")" + return 0 + fi + wizard_out "Onay verilmedi; yeniden soruluyor. (deneme $attempt/$MAX_ATTEMPTS)" + else + wizard_out "Geçersiz giriş; 8 hane rakam gerekli. (deneme $attempt/$MAX_ATTEMPTS)" + fi + attempt=$((attempt + 1)) + done + err "dealer number was not accepted after $MAX_ATTEMPTS attempts; first boot aborted without changes" + exit 2 +} + +# Identity resolution order: explicit flag, explicit file, forced wizard, explicit +# non-interactive mode, seeded dealer id file, wizard, hard failure. +resolve_dealer_id() { + local value + if [[ -n "$DEALER_ID" ]]; then + log 'dealer number supplied on the command line (non-interactive)' + return 0 + fi + if [[ "$DEALER_FILE_GIVEN" == 1 ]]; then + DEALER_ID="$(read_dealer_id_file "$DEALER_FILE")" + log "dealer number read from $DEALER_FILE (non-interactive)" + return 0 + fi + if [[ "$FORCED_INTERACTIVE" == 1 ]]; then + require_tty + wizard_collect + return 0 + fi + if [[ "$NONINTERACTIVE" == 1 ]]; then + DEALER_ID="$(read_dealer_id_file "$DEALER_FILE")" + log "non-interactive mode: dealer number read from $DEALER_FILE" + return 0 + fi + if [[ -f "$DEALER_FILE" && -r "$DEALER_FILE" ]]; then + value="$(tr -d '[:space:]' < "$DEALER_FILE" || true)" + if valid_dealer_id "$value"; then + DEALER_ID="$value" + log "seeded dealer id file used: $DEALER_FILE (wizard skipped)" + return 0 + fi + warn "seeded dealer id file exists but is not acceptable: $DEALER_FILE" + fi + if open_tty; then + wizard_collect + return 0 + fi + err "no terminal is available for the wizard and no dealer number was supplied; pass --dealer-id, --dealer-id-file, or seed $DEALER_FILE" + exit 2 +} + +require_dealer_id() { + [[ -n "$DEALER_ID" ]] || { err 'a dealer number is required (8 digits)'; exit 2; } + valid_dealer_id "$DEALER_ID" || { err 'invalid dealer number: exactly 8 digits are required'; exit 2; } +} + +# The administrator public key is a mandatory offline prerequisite. Only a public key in +# a root-owned, not group/world writable file is accepted; private or inline key material +# is refused and never echoed. +validate_admin_key() { + KEY_FILE="${BF_ADMIN_PUBLIC_KEY_FILE:-}" + if [[ -z "$KEY_FILE" && -r "$DEFAULT_ADMIN_KEY_FILE" ]]; then KEY_FILE="$DEFAULT_ADMIN_KEY_FILE"; fi + [[ -n "$KEY_FILE" && -f "$KEY_FILE" && -r "$KEY_FILE" ]] || { echo 'OFFLINE BLOCKED: seed-provided BF_ADMIN_PUBLIC_KEY_FILE is required.' >&2; exit 1; } + [[ "$(stat -c '%U:%a' "$KEY_FILE")" =~ ^root:6[04]0$ ]] || { echo 'OFFLINE BLOCKED: administrator public-key file must be root-owned and not group/world writable.' >&2; exit 1; } + grep -qE '^(ssh-(ed25519|rsa|ecdsa)|sk-ssh-ed25519)' "$KEY_FILE" && ! grep -q 'PRIVATE KEY' "$KEY_FILE" || { echo 'OFFLINE BLOCKED: BF_ADMIN_PUBLIC_KEY_FILE must contain only a public SSH key.' >&2; exit 1; } + export BF_ADMIN_PUBLIC_KEY_FILE="$KEY_FILE" + log "administrator public key file accepted: $KEY_FILE" +} + +resolve_installer() { + INSTALLER="${BF_INSTALLER_PATH:-$DEFAULT_INSTALLER}" + if [[ ! -x "$INSTALLER" ]]; then + INSTALLER="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../scripts/install" 2>/dev/null && pwd || true)/blueforce-install.sh" + fi + [[ -x "$INSTALLER" ]] || { err "offline installer is unavailable: $INSTALLER"; exit 1; } + log "offline installer: $INSTALLER" +} + +# The installer is always called offline with the validated dealer number and --yes, +# because this script already obtained the operator decision (wizard) or runs in an +# explicitly requested automation mode. A previous partial run is resumed. +run_installer() { + local -a args=(--offline --dealer-id "$DEALER_ID" --yes) + if [[ -s "$STATE_DIR/install-state" ]]; then + args+=(--resume) + log "partial install state found in $STATE_DIR/install-state; resuming instead of restarting" + fi + if [[ "${BF_FIRSTBOOT_TEST_MODE:-0}" == 1 ]]; then + echo "TEST: would run $INSTALLER ${args[*]}" + exit 0 + fi + "$INSTALLER" "${args[@]}" +} + +audit_log() { + local message="$1" + install -d -m 700 "$(dirname "$AUDIT_LOG")" 2>/dev/null || true + printf '%s uid=%s %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$(id -u)" "$message" >> "$AUDIT_LOG" || { + err "identity change refused: audit log is not writable ($AUDIT_LOG)" + return 1 + } + chmod 600 "$AUDIT_LOG" 2>/dev/null || true + log "AUDIT: $message" +} + +# Admin/recovery path for changing the device identity. Disabled by default: it needs +# root, the BF_ALLOW_REIDENTITY=1 operator gate, a warning, a typed confirmation of the +# new dealer number, and a written audit record. The normal path and the wizard never +# reach this function. +reidentity() { + local existing new_id typed stamp + existing="$(marker_device_id)" + [[ "$(id -u)" -eq 0 ]] || { err '--force-reidentity is an administrative procedure and requires root'; exit 1; } + [[ "${BF_ALLOW_REIDENTITY:-0}" == 1 ]] || { + err 'identity change is disabled by default; an operator must set BF_ALLOW_REIDENTITY=1 and run --force-reidentity from the console as root' + exit 1 + } + resolve_dealer_id + require_dealer_id + new_id="$DEALER_ID" + warn 'IDENTITY CHANGE: this machine will be re-identified and re-provisioned.' + warn "old identity: ${existing:-} new identity: $(bf_device_id "$new_id") / $(bf_hostname "$new_id")" + warn 'All nine central systems that carry the identity must be updated after this step.' + require_tty + wizard_out '' + wizard_out "DİKKAT: kimlik değişimi. Eski: ${existing:-yok} Yeni: $(bf_device_id "$new_id")" + wizard_write "Onaylamak için yeni bayi numarasını yeniden yazın: " + if ! wizard_read typed; then + err 'no terminal input arrived (timed out); identity change aborted without changes' + exit 2 + fi + wizard_out '' + typed="$(trim_space "$typed")" + [[ "$typed" == "$new_id" ]] || { err 'confirmation did not match; identity change aborted without changes'; exit 2; } + + audit_log "identity-change requested old=${existing:-none} new=$(bf_device_id "$new_id")" || exit 1 + validate_admin_key + resolve_installer + run_installer + stamp="$(date -u +%Y%m%dT%H%M%SZ)" + if [[ -f "$MARKER" ]]; then + cp -p "$MARKER" "$MARKER.reidentified-$stamp" || true + chmod 600 "$MARKER.reidentified-$stamp" 2>/dev/null || true + fi + write_marker + audit_log "identity-change applied old=${existing:-none} new=$(bf_device_id "$new_id") marker-archive=$MARKER.reidentified-$stamp" + log "identity change complete; update the remaining central systems before the device is used" +} + +main() { + local existing + parse_args "$@" + + # Check mode is read-only: it never prompts, never writes state, and never installs. + if [[ "$CHECK_ONLY" == 1 ]]; then + if marker_exists; then + existing="$(marker_device_id)" + log "check: first boot already completed${existing:+ for $existing}; nothing would change" + exit 0 + fi + if [[ -z "$DEALER_ID" ]]; then + if [[ -f "$DEALER_FILE" && -r "$DEALER_FILE" ]]; then + DEALER_ID="$(read_dealer_id_file "$DEALER_FILE")" + else + err 'check mode needs a dealer number: pass --dealer-id or --dealer-id-file (no prompt is used in check mode)' + exit 2 + fi + fi + require_dealer_id + log "check: dealer number $(bf_device_id "$DEALER_ID") is acceptable on $(bf_hostname "$DEALER_ID"); no changes were made" + exit 0 + fi + + # Idempotency: a stamped device is finished. Nothing is prompted, written, or installed. + if marker_exists && [[ "$FORCE_REIDENTITY" != 1 ]]; then + existing="$(marker_device_id)" + log "first boot already completed${existing:+ for $existing}; nothing to do" + if [[ -n "$DEALER_ID" && -n "$existing" && "$DEALER_ID" != "$existing" ]]; then + warn "requested dealer number differs from the provisioned identity ($existing); identity changes use the admin procedure described in provisioning/firstboot/README.md" + fi + exit 0 + fi + + if [[ "$FORCE_REIDENTITY" == 1 ]]; then + reidentity + exit 0 + fi + + resolve_dealer_id + require_dealer_id + [[ "$(id -u)" -eq 0 ]] || { err 'first boot provisioning must run as root'; exit 1; } + validate_admin_key + resolve_installer + run_installer + write_marker + log "first boot finished for $(bf_device_id "$DEALER_ID"); enrollment and READY are separate steps" +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then main "$@"; fi + + + +[Unit] +Description=Blueforce Field OS first-boot offline provisioning (terminal wizard) +Documentation=file:/usr/share/doc/blueforce/firstboot/README.md +After=multi-user.target +# Prerequisites that must exist before the wizard may run: the seed-provided administrator +# public key is mandatory for the offline installer. The dealer number is NOT a condition, +# because a technician at the field console enters it through the wizard. +ConditionPathExists=/etc/blueforce/admin-authorized-key.pub +# Run once per machine: once the completion marker exists the unit is skipped (not failed). +ConditionPathExists=!/var/lib/blueforce/firstboot-complete + +[Service] +Type=oneshot +Environment=BF_ADMIN_PUBLIC_KEY_FILE=/etc/blueforce/admin-authorized-key.pub +ExecStart=/usr/local/sbin/bf-firstboot +# The wizard reads and writes the field console. If no TTY can be set up (headless unit, +# no console attached) systemd fails this unit and boot continues; the script itself also +# falls back to the --dealer-id/--dealer-id-file path when no terminal is available. +StandardInput=tty-force +StandardOutput=tty +StandardError=tty +TTYPath=/dev/tty1 +TTYReset=yes +TTYVHangup=yes +# Upper bound so a console that nobody answers can never hold the boot job open. The +# wizard's own input read is bounded too (BF_FIRSTBOOT_INPUT_TIMEOUT). +TimeoutStartSec=45min +RemainAfterExit=yes +# Hardening that the offline installer tolerates. ProtectSystem=strict, ProtectHome=yes +# and similar sandboxing are deliberately absent: the installer legitimately writes /etc, +# /usr and /home/blueforce, and those options would break apt/dpkg and the user module. +NoNewPrivileges=yes +PrivateTmp=yes + +[Install] +WantedBy=multi-user.target + + + +1.0.0 + + + +# ISO builder + +`build-blueforce-iso.sh` produces the blueforce field-installation medium from a local, +SHA256-verified Ubuntu ISO. Nothing is downloaded: the base ISO and its checksum record +must already exist on the build host. + +```bash +# validate every precondition, write nothing +./build-blueforce-iso.sh \ + --upstream-iso /media/ubuntu.iso \ + --checksum-file ./ubuntu-26.04.1-SHA256SUMS \ + --check + +# real build (writes dist/Blueforce-Field-OS--amd64.iso and its manifest) +./build-blueforce-iso.sh \ + --upstream-iso /media/ubuntu.iso \ + --checksum-file ./ubuntu-26.04.1-SHA256SUMS +``` + +## Output contract + +| Artifact | Path | +|---|---| +| Bootable medium | `dist/Blueforce-Field-OS--amd64.iso` | +| ISO checksum | `dist/Blueforce-Field-OS--amd64.iso.sha256` | +| Release manifest | `dist/-manifest.yaml` | + +The manifest carries `field_os_version`, `base_os`, `base_flavor`, `base_iso_filename`, +`ubuntu_version`, `ubuntu_iso_sha256`, `git_commit`, `build_date`, `architecture`, +`iso_sha256` and the `packages` block (`rustdesk`, `docker`, `xrdp`, `wireguard`, +`meg_package_version`, `blueforce_installer_version`). `ubuntu_iso_sha256` is always +recomputed from the real base ISO file; no digest is hard-coded anywhere in the tooling. +Package versions are read from the embedded offline APT lock file; when no built +offline repository is embedded they are reported as `unknown` on purpose instead of +being invented. + +## Media layout + +```text +/autoinstall.yaml assisted autoinstall, read from the medium itself +/boot/grub/grub.cfg boot config: every kernel line requests autoinstall +/boot/grub/grub.cfg.blueforce-orig pristine copy of the original boot config +/blueforce-provisioning/autoinstall/ same configuration in NoCloud/seed form +/blueforce-provisioning/firstboot/ bf-firstboot + blueforce-firstboot.service +/blueforce-provisioning/offline-repo/ offline APT tooling, pin manifests, optional built repo +/blueforce-provisioning/release/ blueforce-release, media-info.yaml, release manifest +``` + +`interactive-sections: [storage]` is preserved, so the medium installs unattended but the +operator still selects and confirms the target disk on the installer screen. There is no +automatic wipe. Device identity (`BF-`), dealer id, private keys and passwords are +never embedded in the medium; they are collected at firstboot, and the builder refuses to +run when its input scan finds them. + +## Boot layout: why the boot structure is rebuilt, not replayed + +Ubuntu live ISOs keep part of their boot information outside the ISO 9660 tree, so +`xorriso -boot_image any replay` cannot re-establish it: + +1. the **GRUB2 MBR boot code** lives in the first 16 sectors of the source image, and +2. the **EFI system partition is an appended partition**, i.e. a byte range after the ISO + filesystem rather than a file in it. + +Replaying that layout fails with `Cannot enable EL Torito boot image #1 because it is not +a data file in the ISO filesystem` and with the GRUB2 MBR error that it cannot refer to +data outside the ISO 9660 filesystem. + +The builder therefore asks the base ISO for its own recipe — `xorriso -indev +-report_el_torito as_mkisofs` — and writes the new medium with `xorriso -as mkisofs` plus +that recipe (`--grub2-mbr`, `-partition_offset`, `-append_partition 2 `, +`-appended_part_as_gpt`, the BIOS `-b /boot/grub/i386-pc/eltorito.img` entry with +`--grub2-boot-info`, and the alternate UEFI entry). Interval references in the recipe are +rewritten to point at the base ISO, never at the output, and the builder fails closed when +the recipe has no `-append_partition` line. Nothing about the layout is hard-coded, so a +Server ISO or a later Ubuntu revision works without editing the script. + +The extracted tree is only ever *added to*: `autoinstall.yaml`, `/blueforce-provisioning/` +and the patched boot configuration (with its `.blueforce-orig` backup). Existing boot +files (`boot.catalog`, `eltorito.img`, `casper/*`) are left byte-identical. + +## Flavour-agnostic base ISO (and the recorded baseline deviation) + +`--upstream-iso` accepts an Ubuntu Server **or** Ubuntu Desktop ISO. The flavour is read +from the ISO volume label (`Ubuntu-Server 26.04.1 LTS amd64` → `server`, +`Ubuntu 26.04.1 LTS amd64` → `desktop`), recorded as `base_flavor`, and never guessed +from the file name. + +The architecture documents fix the baseline as *Ubuntu Server 26.04.1+ LTS* +(`docs/24` K-01, `docs/26`). The verified installation medium available on this build +host is the **Desktop** flavour ISO, so builds made from it deviate from that baseline. +The deviation is not hidden: it is written into `manifest.yaml` as `base_flavor: desktop` +plus a `baseline_deviation` block (reason, impact, decision needed, `lab_required: true`), +and mirrored into `media-info.yaml` and `/etc/blueforce-release` on the medium. + +* The Desktop medium already ships GNOME, so the desktop/GNOME layer needs no extra + installation step on the target (`docs/24` K-02, `docs/07` xrdp + GNOME). +* A Server-based build remains a single flag away: + `--upstream-iso /path/ubuntu-26.04.1-live-server-amd64.iso` produces a medium whose + manifest reports `base_flavor: server` and `baseline_deviation: none`. +* The autoinstall path on the Desktop flavour still requires LAB acceptance before any + production use; see `tests/qemu-field-os-test-plan.md`. + +## Offline APT repository + +* `--offline-repo DIR` embeds a built repository (`Packages`, `Packages.gz`, `SHA256SUMS`, + `packages.lock.tsv` are mandatory; an incomplete directory is rejected with a clear + error). Without the flag, `provisioning/offline-repo/build` is auto-detected. +* The repository is placed at `/blueforce-provisioning/offline-repo/built/` on the medium + and late-commands merge it into `/opt/blueforce/offline-repo` on the installed system, + which is where `blueforce-install.sh --offline` expects it. +* When no built repository is available the medium still ships the pin manifests and + tooling, `media-info.yaml` records `offline_repo_status: not-included`, and the target + keeps failing closed with `OFFLINE BLOCKED` until a repository is built and re-embedded. + `--require-offline-repo` turns that condition into a build failure for release builds. + +## Scratch space and determinism + +* The build extracts the base ISO and writes a new one, so it needs about **2x the base + ISO size** free. `--work-dir` overrides the scratch location; otherwise the output + filesystem, `$TMPDIR` and `/var/tmp` are tried in order and the build stops with an + explicit error when none has room. It never downloads anything to work around space. +* No build timestamp is written into the medium (the date lives in the dist manifest + only) and generated files get a fixed modification time. `--reproducible` pins the + volume-level date through the mkisofs-compatible `--modification-date=` option; + the base ISO's own `--modification-date` recipe line is deliberately dropped so the + stamp stays under this script's control. +* The ISO volume label defaults to the base ISO's label, which keeps live-media discovery + untouched; `--volid` overrides it (xorriso warns when a label does not follow ISO 9660 + rules, for example spaces) and the value is recorded in the manifest. + +## Verification steps performed by the builder + +1. xorriso is present and can read the base ISO's El Torito boot metadata. +2. Base ISO SHA256 is recomputed and matched against `--checksum-file`. +3. Media inputs are scanned for device identity, private keys and credentials. +4. The pristine GRUB configuration is kept as `grub.cfg.blueforce-orig` before injection; + injection is idempotent and `autoinstall` is placed ahead of the `---` separator. +5. After writing, the produced ISO is re-opened with xorriso: BIOS **and** UEFI El Torito + entries must still exist, `/autoinstall.yaml` must contain the interactive-storage and + `offline-install` markers, the GRUB configuration must request autoinstall, and the + firstboot/release/offline-repo payloads must be present. Any failure removes the broken + output instead of leaving a half-good artifact behind. + +## Still LAB work + +Booting the medium with UEFI, Legacy BIOS and Secure Boot, verifying that the autoinstall +configuration is picked up on the chosen flavour, and a full air-gapped install are LAB +tasks; no VM is started by the tooling or by this repository's tests. Use +`tests/qemu-field-os-test-plan.md`. + +## Files + +| File | Role | +|---|---| +| `build-blueforce-iso.sh` | the builder (real build, `--check` for dry runs) | +| `verify-upstream-iso.sh` | SHA256 verification of a local ISO against a checksum record | +| `test-iso.sh` | non-destructive checks of an existing ISO artifact | +| `field-os-version` | Field OS version used in artifact names (`--version` overrides) | +| `ubuntu-26.04.1-SHA256SUMS` | checksum record fetched verbatim from `https://releases.ubuntu.com/26.04.1/SHA256SUMS`; the Desktop ISO used for LAB builds matches its `ubuntu-26.04.1-desktop-amd64.iso` line | + + + +#!/usr/bin/env bash +# Perform non-destructive checks on an explicitly supplied ISO artifact. +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: test-iso.sh --iso PATH --checksum PATH [--check] + +Verifies SHA256 and, when xorriso is installed, reads El Torito boot metadata. +This script neither boots nor writes media. +EOF +} +ISO=""; CHECKSUM="" +while [[ $# -gt 0 ]]; do + case "$1" in + --iso) ISO="${2:-}"; shift 2 ;; + --checksum) CHECKSUM="${2:-}"; shift 2 ;; + --check) shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done +[[ -n "$ISO" && -n "$CHECKSUM" ]] || { usage >&2; exit 2; } +"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/verify-upstream-iso.sh" --iso "$ISO" --checksum "$CHECKSUM" --check +command -v xorriso >/dev/null 2>&1 || { printf 'xorriso unavailable: SHA256 passed, boot metadata test is fail-closed.\n' >&2; exit 1; } +xorriso -indev "$ISO" -report_el_torito plain >/dev/null 2>&1 || { printf 'Boot metadata test failed.\n' >&2; exit 1; } +printf 'Non-destructive ISO checks passed: %s\n' "$ISO" + + + +487f87faaf547ea30e0aba4d5b53346292571256b25333a978db1692bcee9dd2 *ubuntu-26.04-desktop-amd64.iso +dec49008a71f6098d0bcfc822021f4d042d5f2db279e4d75bdd981304f1ca5d9 *ubuntu-26.04-live-server-amd64.iso +96c7f5fb28a7fe28245331f9bfbe4375f18dd29a4850116ad3c4f60f6700c55c *ubuntu-26.04-wsl-amd64.wsl +601e30fbf5d97759367c632e2c33630665039b7e2158fd068403da3ccf1bda1f *ubuntu-26.04.1-desktop-amd64.iso +cc8a95cde20f6ced61a322420de00f10cc3c90ced545daa46cb9c1a117f1d927 *ubuntu-26.04.1-live-server-amd64.iso +48d56724b5c8e60f24893e83e73bbb58c60b3ca22fba3da977075420acd54104 *ubuntu-26.04.1-wsl-amd64.wsl + + + +#!/usr/bin/env bash +# Verify a locally supplied upstream ISO against an explicitly supplied SHA256 record. +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: verify-upstream-iso.sh --iso PATH --checksum PATH [--check] + +Verifies a local ISO without downloading anything. --checksum may contain a +SHA256SUMS-style line for the ISO or a single 64-character digest. +EOF +} +ISO=""; CHECKSUM=""; CHECK_ONLY=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --iso) ISO="${2:-}"; shift 2 ;; + --checksum) CHECKSUM="${2:-}"; shift 2 ;; + --check) CHECK_ONLY=1; shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done +[[ -n "$ISO" && -n "$CHECKSUM" ]] || { usage >&2; exit 2; } +[[ -f "$ISO" ]] || { printf 'ISO not found: %s\n' "$ISO" >&2; exit 2; } +[[ -f "$CHECKSUM" ]] || { printf 'Checksum file not found: %s\n' "$CHECKSUM" >&2; exit 2; } +expected="$(awk -v base="$(basename "$ISO")" '$1 ~ /^[[:xdigit:]]{64}$/ && (NF == 1 || $2 == base || $2 == "*" base) {print tolower($1); exit}' "$CHECKSUM")" +[[ "$expected" =~ ^[0-9a-f]{64}$ ]] || { printf 'No SHA256 entry for ISO basename in: %s\n' "$CHECKSUM" >&2; exit 2; } +actual="$(sha256sum "$ISO" | awk '{print $1}')" +if [[ "$actual" != "$expected" ]]; then + printf 'SHA256 verification FAILED for %s\nexpected: %s\nactual: %s\n' "$ISO" "$expected" "$actual" >&2 + exit 1 +fi +printf 'SHA256 verified: %s\n' "$ISO" +[[ "$CHECK_ONLY" -eq 1 ]] && printf 'Check mode: no files were changed.\n' + + + +Package: 3cpio +Architecture: amd64 +Version: 0.14.0-1ubuntu1 +Static-Built-Using: rust-defaults (= 1.88.0ubuntu3) +Priority: optional +Section: utils +Source: rust-threecpio +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Rust Maintainers +Installed-Size: 713 +Depends: libc6 (>= 2.39), libgcc-s1 (>= 4.2) +Recommends: zstd +Suggests: bzip2, lz4, lzop, xz-utils +Filename: pool/3cpio_0.14.0-1ubuntu1_amd64.deb +Size: 285342 +MD5sum: 5829d45e7440bc9aa6127588f17b28b3 +SHA1: 1700e6198a346d5ed82a0981bdac6509fba6af89 +SHA256: f5c5134cfde8015c24a511b1f3087af7387280ddf009e0d83e92676bf8b9c4ac +SHA512: c6d8da36367859f89810be93810c0a23210ce0933e7cd409049839496fc0f01bed7793a050d0085a2d175409c837e3ab421a1d4fbc3bec30973cd6dc48a6dc34 +Homepage: https://github.com/bdrung/3cpio +Description: Manage initrd cpio archives + 3cpio is a tool to manage initramfs cpio files for the Linux kernel. The Linux + kernel's initramfs buffer format is based around the newc or crc cpio formats. + Multiple cpio archives can be concatenated and the last archive can be + compressed. Different compression algorithms can be used depending on what + support was compiled into the Linux kernel. 3cpio is tailored to initramfs + cpio files and will not gain support for other cpio formats. + . + 3cpio supports creating, examining, listing, and extracting the content of + the initramfs cpio. + +Package: accountsservice +Architecture: amd64 +Version: 23.13.9-8ubuntu5.2 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 536 +Depends: default-dbus-system-bus | dbus-system-bus, libaccountsservice0 (= 23.13.9-8ubuntu5.2), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.83.0), libpolkit-gobject-1-0 (>= 0.99) +Recommends: default-logind | logind, polkitd +Suggests: gnome-control-center +Filename: pool/accountsservice_23.13.9-8ubuntu5.2_amd64.deb +Size: 72650 +MD5sum: 807c69e443e56acad4e0512c39bf860e +SHA1: 82fb20f38a5c622304a3d2c19a2259ade9374d12 +SHA256: f4aa92d98b523787aab1582487b7099448cd01ad56cabdbb596f3ea20f09d072 +SHA512: 55ea10ba9e4df9ebb3f5a4d2dd4498474cb2a4021083acec8d0a6541f7e82724efd97f325f7f4c0b6799e42c3decd279774af943d3d6a5c0cd653ce2d2f80c62 +Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/ +Description: query and manipulate user account information + The AccountService project provides a set of D-Bus + interfaces for querying and manipulating user account + information and an implementation of these interfaces, + based on the useradd, usermod and userdel commands. + +Package: acl +Architecture: amd64 +Version: 2.3.2-2 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 192 +Depends: libacl1 (= 2.3.2-2), libc6 (>= 2.38) +Filename: pool/acl_2.3.2-2_amd64.deb +Size: 39366 +MD5sum: 67416bb769b7729971cbc47ad9818e1d +SHA1: 974d99b36f0c173136769bb83a7b02300a10a27d +SHA256: 74bb8008be63c1deb1cd9e9ebde8189a762962a6cc4e0a36d4943380ed46a15f +SHA512: e3671b824b556fae019f98137c2e6199de2565c22065aa63ba6be2425e93e1eea37e1fbdff0be3c58b73a316f5441ca39385d5ef387172fa868742ced63aa207 +Homepage: https://savannah.nongnu.org/projects/acl/ +Description: access control list - utilities + This package contains the getfacl and setfacl utilities needed for + manipulating access control lists. It also contains the chacl IRIX + compatible utility. + +Package: adwaita-icon-theme +Architecture: all +Version: 50.0-1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 13488 +Provides: adwaita-icon-theme-full (= 50.0-1), gnome-icon-theme-symbolic +Depends: gtk-update-icon-cache, hicolor-icon-theme +Recommends: librsvg2-common +Suggests: adwaita-icon-theme-legacy +Breaks: adwaita-icon-theme-full (<< 45.1), gnome-themes-standard-data (<< 3.18.0-2~), libmutter-12-0 (<< 44.8-3~), libmutter-13-0 (<< 45.3-3~) +Replaces: adwaita-icon-theme-full (<< 45.1), gnome-themes-standard-data (<< 3.18.0-2~) +Filename: pool/adwaita-icon-theme_50.0-1_all.deb +Size: 580384 +MD5sum: cf8c9551043ac778781871584471ddfe +SHA1: 59c58d0761c9338309d172ada5dd48d7a5f1855c +SHA256: db9f11a94f993de589e7d8879664cb371eb8aefc8a2bce100d923951e4ef30c8 +SHA512: ca5c46452485b18cda25c5588e86547148306282b257a3086fe81561ca23098e31bdadcff260085e83f3f1097b1f393057afadf7b7572a07b2cca63f7a28160f +Homepage: https://gitlab.gnome.org/GNOME/adwaita-icon-theme +Description: default icon theme of GNOME + This package contains the default icon theme used by the GNOME desktop. + The icons are used in core apps like Settings, Files, and GNOME Shell. + . + Other apps are recommended to include their own icons using the GNOME + Design Team's Icon Development Kit. + +Package: alsa-base +Architecture: all +Version: 1.0.25+dfsg-0ubuntu9 +Multi-Arch: foreign +Priority: optional +Section: sound +Source: alsa-driver +Maintainer: Ubuntu Core Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 441 +Provides: alsa +Depends: kmod (>= 17-1), linux-sound-base, udev +Recommends: alsa-utils +Suggests: apmd (>= 3.0.2-1), alsa-oss, oss-compat +Filename: pool/alsa-base_1.0.25+dfsg-0ubuntu9_all.deb +Size: 144288 +MD5sum: e02e408591493f6ffa7cab9271ea6524 +SHA1: 3f95344a0892d3ab4ffce0f4d2dfa7e23937678f +SHA256: e8eabd601da99025d1c1e3cbff5dea11d9ec3792dd18485ef957e486d21eb679 +SHA512: 57dc842e5d0d9726eeaedcbad75e4e092d22412a493daae7461f891aeb414838750908bb177312f0bd69423e5fcdfcbee2cfd134f51a294dbee3037c2daf7e26 +Homepage: http://www.alsa-project.org/ +Description: ALSA driver configuration files + This package contains various configuration files for + the ALSA drivers. + . + For ALSA to work on a system with a given sound card, + there must be an ALSA driver for that card in the kernel. + Linux 2.6 as shipped in linux-image packages contains + ALSA drivers for all supported sound cards in the form + of loadable modules. A custom alsa-modules package can + be built from the sources in the alsa-source package + using the m-a utility (included in the module-assistant + package). Please read the README.Debian file for more + information about loading and building modules. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: alsa-topology-conf +Architecture: all +Version: 1.2.5.1-3build1 +Multi-Arch: foreign +Priority: optional +Section: libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 420 +Breaks: libasound2-data (<< 1.2.1) +Replaces: libasound2-data (<< 1.2.1) +Enhances: libasound2-data +Filename: pool/alsa-topology-conf_1.2.5.1-3build1_all.deb +Size: 15646 +MD5sum: d9cdd8cb35161f306e7f1caee9583ba9 +SHA1: 2efdfc89592d67330813511b2589b39625f9a119 +SHA256: bbc3fc573a85d8dfbc30f83c5ee709f76963bb72a96d10943dc149ce1fdf8074 +SHA512: 76ed4aedd08d5758ce9eeb29dd2892cc830589271eb2888041791426efc1414f51a14e06385585dea37c009fc28dcbe3febb300db67e5e61f513e545e87e3faa +Homepage: https://www.alsa-project.org/ +Description: ALSA topology configuration files + This package contains ALSA topology configuration files that can be used + by libasound2 for specific audio hardware. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: alsa-ucm-conf +Architecture: all +Version: 1.2.15.3-1ubuntu1.5 +Multi-Arch: foreign +Priority: optional +Section: libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 1530 +Depends: libasound2t64 (>= 1.2.15) +Filename: pool/alsa-ucm-conf_1.2.15.3-1ubuntu1.5_all.deb +Size: 106020 +MD5sum: 094d0fae654a944fc419f66267363205 +SHA1: 0fee06a99475bdf87fc2b8932f514507eac6c673 +SHA256: a086022cda58b905cab9a0b8d9be50bab1e2f854724b874f44862cdf00f15f5d +SHA512: b4dc2d85d402b20cc3f782b7bed6a9cfb48cd96dc66ab52053cc0358b95996ae3729ea85d8553005545db1de86b225cf776c3893fda2796e63a14f88f95ddde9 +Homepage: https://www.alsa-project.org/ +Description: ALSA Use Case Manager configuration files + This package contains ALSA Use Case Manager configuration of audio + input/output names and routing for specific audio hardware. They can be + used with the alsaucm tool. + . + Installing these configuration files is absolutely necessary to make some + sound hardware work. Its installation is highly recommended in order to + use ALSA-backed hardware. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: alsa-utils +Architecture: amd64 +Version: 1.2.15.2-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: sound +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 2752 +Provides: audio-mixer +Depends: kmod (>= 17-1~), libasound2t64 (>= 1.2.15), libatopology2t64 (>= 1.2.2), libc6 (>= 2.38), libfftw3-single3 (>= 3.3.10), libncursesw6 (>= 6), libsamplerate0 (>= 0.1.7), libtinfo6 (>= 6) +Suggests: dialog +Filename: pool/alsa-utils_1.2.15.2-1ubuntu1_amd64.deb +Size: 1217576 +MD5sum: 41c9f8bc0f7f625032b64022fda1fae8 +SHA1: 99e5c5946b4e6aca00985bad7f3e838aff484053 +SHA256: d24c8b4b7155fe184873a808482f317c23fa8858e36cf9712235c9accdd43884 +SHA512: 8f59f94338198269f157b59a3fa8642a1889e304da5853b29af74fb5f272d80ec04124594ea516ee9994eff32a790a42b5fb954395f8b1a4444d7cfcc7dccf12 +Homepage: https://www.alsa-project.org/ +Description: Utilities for configuring and using ALSA + Included tools: + - alsactl: advanced controls for ALSA sound drivers + - alsaloop: create loopbacks between PCM capture and playback devices + - alsamixer: curses mixer + - alsaucm: alsa use case manager + - amixer: command line mixer + - amidi: read from and write to ALSA RawMIDI ports + - aplay, arecord: command line playback and recording + - aplaymidi, arecordmidi: command line MIDI playback and recording + - aconnect, aseqnet, aseqdump: command line MIDI sequencer control + - iecset: set or dump IEC958 status bits + - speaker-test: speaker test tone generator + . + ALSA is the Advanced Linux Sound Architecture. + +Package: anacron +Architecture: amd64 +Version: 2.3-45ubuntu1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Lance Lin +Installed-Size: 99 +Depends: libc6 (>= 2.38) +Recommends: cron | cron-daemon +Suggests: default-mta | mail-transport-agent, rsyslog | system-log-daemon, powermgmt-base +Filename: pool/anacron_2.3-45ubuntu1_amd64.deb +Size: 29528 +MD5sum: f1b7f18e85d50657716f4c2bda414a0c +SHA1: c5d75a9d7a774c2a18fb9c572799a79ab331acd9 +SHA256: 243d09f952b9d9d83f0717e1ad2b41436e99b4352e79eb94d791483740e05189 +SHA512: 37ae1e95407eb18e066dbe815be3eb58f307ff743f8063ccda91eb8df6f20a35b8eb2021037e50a1963033f5c80b5e1564cce5165d883e956b22f33379a05cd7 +Homepage: http://sourceforge.net/projects/anacron/ +Description: cron-like program that doesn't go by time + Anacron (like "anac(h)ronistic") is a periodic command scheduler. It + executes commands at intervals specified in days. Unlike cron, it + does not assume that the system is running continuously. It can + therefore be used to control the execution of daily, weekly, monthly, + and yearly jobs (or anything with a period of n days), on systems that + don't run 24 hours a day. When installed and configured properly, + Anacron will make sure that the commands are run at the specified + intervals as closely as machine uptime permits. + . + This package is pre-configured to execute the daily jobs of the + Debian system. You should install this program if your system isn't + powered on 24 hours a day to make sure the maintenance jobs of other + Debian packages are executed each day. + +Package: apparmor +Architecture: amd64 +Version: 5.0.2-0ubuntu1~26.04.1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian AppArmor Team +Installed-Size: 2456 +Depends: debconf, debconf (>= 0.5) | debconf-2.0, libapparmor1 (>= 5.0.1), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 14), libzstd1 (>= 1.5.5) +Suggests: apparmor-profiles-extra, apparmor-utils +Breaks: apparmor-profiles-extra (<< 1.21), fcitx-data (<< 1:4.2.9.1-1ubuntu2), snapd (<< 2.44.3+20.04~) +Replaces: fcitx-data (<< 1:4.2.9.1-1ubuntu2) +Filename: pool/apparmor_5.0.2-0ubuntu1~26.04.1_amd64.deb +Size: 379516 +MD5sum: 0d3f28acb16ab74c429506d713cb6be0 +SHA1: f3276738467fb911e6819480a17dcc7d34258152 +SHA256: 8621170a44534ef32ab4f7e26a5cacabb2077a5a95bcb5236c0652f118032820 +SHA512: cb462837eaa34dfbbd5e2bff0b97a8687285fdc947379896b0405db3e94ed4e99c795e10da87eb424742ec197a70afdf38d61776f645feb9127af9d9b0cf376c +Homepage: https://apparmor.net/ +Description: user-space parser utility for AppArmor + apparmor provides the system initialization scripts needed to use the + AppArmor Mandatory Access Control system, including the AppArmor Parser + which is required to convert AppArmor text profiles into machine-readable + policies that are loaded into the kernel for use with the AppArmor Linux + Security Module. + +Package: apport +Architecture: all +Version: 2.34.1-0ubuntu0.1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Installed-Size: 640 +Depends: apport-core-dump-handler | python3-systemd, apport-core-dump-handler | python3-zstandard, apport-core-dump-handler | systemd-coredump, gir1.2-glib-2.0 (>= 1.29.17), python3, python3-apport (>= 2.34.1-0ubuntu0.1), python3-gi, sensible-utils +Recommends: apport-symptoms, python3-systemd +Suggests: apport-gtk | apport-kde, pkexec, polkitd +Breaks: python-apport (<< 2.2-0ubuntu1) +Replaces: python-apport (<< 2.2-0ubuntu1) +Filename: pool/apport_2.34.1-0ubuntu0.1_all.deb +Size: 83878 +MD5sum: cce9d9b2e6eeb29c57bfefd0923f0fda +SHA1: 43197abfc35151753a951225b1fc6630ce537f74 +SHA256: f9daec86d175e75040b9723fad22ce54d1ccec9d0a00829ab3e8a7f4add603a9 +SHA512: ccb75393c130197916c4afcc8dd85395717e3211e861b174f5293d32c8fb7a939472a92fd933deb4c0269313658e6c18b7aa58e290d5ac7bd930da6acbc7f13c +Homepage: https://wiki.ubuntu.com/Apport +Description: automatically generate crash reports for debugging + apport automatically collects data from crashed processes and + compiles a problem report in /var/crash/. This utilizes the crashdump + helper hook provided by the Ubuntu kernel. + . + This package also provides a command line frontend for browsing and + handling the crash reports. For desktops, you should consider + installing the GTK+ or Qt user interface (apport-gtk or apport-kde). + +Package: apport-core-dump-handler +Architecture: all +Version: 2.34.1-0ubuntu0.1 +Priority: optional +Section: utils +Source: apport +Maintainer: Ubuntu Developers +Installed-Size: 28 +Provides: core-dump-handler +Depends: apport (>= 2.27.0-0ubuntu7~) +Conflicts: core-dump-handler +Breaks: apport (<< 2.27.0-0ubuntu7~) +Replaces: apport (<< 2.27.0-0ubuntu7~), core-dump-handler +Filename: pool/apport-core-dump-handler_2.34.1-0ubuntu0.1_all.deb +Size: 9674 +MD5sum: 82320924f7528d59fbd4291cf080ec51 +SHA1: 8f058188c34f47436fb7e57d5196793f9bc50a57 +SHA256: 7a52cb6a63084a6bc4b3cbdcb966323027209dbe62ff868c4235713aae96104c +SHA512: 5adb5475bd6632ffe61d89438043b039a46e1a6ff44977aeb1863ea8039dd19462640ecece55ebcbb972ee71cdd656cfd0e6608d3a7093bcf9047d754b7aa399 +Homepage: https://wiki.ubuntu.com/Apport +Description: Kernel core dump handler for Apport + apport automatically collects data from crashed processes and + compiles a problem report in /var/crash/. This utilizes the crashdump + helper hook provided by the Ubuntu kernel. + . + This package provides the service that configures the kernel (via + /proc/sys/kernel/core_pattern) to forward the crash dumps to apport. + +Package: apport-gtk +Architecture: all +Version: 2.34.1-0ubuntu0.1 +Priority: optional +Section: gnome +Source: apport +Maintainer: Ubuntu Developers +Installed-Size: 69 +Depends: apport (>= 0.41), gir1.2-gtk-3.0 (>= 3.1.90), gir1.2-wnck-3.0, gnome-terminal | x-terminal-emulator, procps, python3, python3-apport (>= 2.34.1-0ubuntu0.1), python3-gi, whoopsie-preferences +Recommends: gdb | gdb-minimal, update-notifier +Filename: pool/apport-gtk_2.34.1-0ubuntu0.1_all.deb +Size: 9852 +MD5sum: f7d96b3d7d98044f1cff59fff1ea9cf8 +SHA1: 2850390894776d57108d1149e2f4d6d2a7afa59a +SHA256: 38cd5d6f4a1fe3f77b517ee32f06a0fd10c140fb1f8ca65e664aca023179d9d2 +SHA512: 9ba9e12e39a305f88024165e7ffa812dc6ae59ead548b7397cb134d80f586c9724209f834a8a2b8dc8840829652c0717ea3d387fb26f15bb7ff0fc572a59799f +Homepage: https://wiki.ubuntu.com/Apport +Description: GTK+ frontend for the apport crash report system + apport automatically collects data from crashed processes and + compiles a problem report in /var/crash/. This utilizes the crashdump + helper hook provided by the Ubuntu kernel. + . + This package provides a GTK+ frontend for browsing and handling the + crash reports. + +Package: apport-symptoms +Architecture: all +Version: 0.25build1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Installed-Size: 60 +Recommends: apport +Filename: pool/apport-symptoms_0.25build1_all.deb +Size: 13038 +MD5sum: dc8c4dd5b47ba8439669dd8ed1c0f76c +SHA1: 791930d29eae1a9fa0a63f7e8520c150128f4e5a +SHA256: 4d84a8ade9b48c128e53cfd871a254104b4d0c443837642a6bf5817f5b8f77ba +SHA512: 2481aced394a2dc983e07a4a05772b860ead323f17cca9cc1ee0334c5ab6318da785db7b16fec6c46b96f690275a2c84f43930ac150df795ac6aaee3e8be0e90 +Homepage: https://wiki.ubuntu.com/Apport +Description: symptom scripts for apport + Apport intercepts program crashes, collects debugging information about the + crash and the operating system environment, and sends it to bug trackers in a + standardized form. It also offers the user to report a bug about a package, + with again collecting as much information about it as possible. + . + This package extends Apport by some "symptom" scripts, so that bug reporters + do not have to guess the correct package, but report problems based on + symptoms that they have (like "sound problem"), through an interactive process. + +Package: appstream +Architecture: amd64 +Version: 1.1.2-1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 352 +Depends: shared-mime-info, libappstream5 (>= 1.0.0), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0) +Suggests: apt-config-icons +Filename: pool/appstream_1.1.2-1_amd64.deb +Size: 72440 +MD5sum: 805ca5f98a56517faf06f78a68b52528 +SHA1: 7b23a2cc889c01b52fcdf766926c785e37948c9b +SHA256: a4b97af1709a6809619afeb18b73a15100e70b0683544027ca1ba8f0655b8643 +SHA512: a2af44f2692c0b2f722c3e33695853f818b93f09325e61e7b2862fb4889d0a3ff6666f4014cc7359e183f4b4339312a5ea7b4efa541aa5710e97ccce0638e793 +Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ +Description: Software component metadata management + AppStream is a metadata specification which permits software components to + provide information about themselves to automated systems and end-users + before the software is actually installed. + The AppStream project provides facilities to easily access and transform + this metadata, as well as a few additional services to allow building + feature-rich software centers and similar applications. + . + This package provides tools to generate, maintain and query the AppStream + data pool of installed and available software, and enables integration + with the APT package manager. + . + The 'appstreamcli' tool can be used for accessing the software component + pool as well as for working with AppStream metadata directly, including + validating it for compliance with the specification. + +Package: apt-config-icons +Architecture: all +Version: 1.1.2-1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: appstream +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 23 +Depends: appstream +Filename: pool/apt-config-icons_1.1.2-1_all.deb +Size: 4328 +MD5sum: 007ad34a84eafe0feefdf815b04bf969 +SHA1: 0115320b544395aa501ec167fbdce38f3500ce7d +SHA256: 4c8fdfa01d54c5b58d4d0aee2ba4cf54b261b88b9b834ae6d369b41cc06cb7a0 +SHA512: e74641e800f8c602034d81a5bebc3de261f9b90f66f948d7132dc4f41564e39d944741720d131dc1712015af1ebc39673d89d8526dea2a09cb910864d059f11e +Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ +Description: APT configuration snippet to enable icon downloads + This package contains an APT configuration snippet that enables the + download of an icon tarball containing application icons for display in + software centers. + Icons get downloaded directly from the archive via regular cache updates, + and match the software currently available in the respective archive suites. + . + This snippet enables icons of the default icon size set in the AppStream + specification for software centers, 64x64px. It also enables downloads + of smaller 48x48px icons. + +Package: apt-config-icons-hidpi +Architecture: all +Version: 1.1.2-1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: appstream +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 23 +Depends: apt-config-icons +Filename: pool/apt-config-icons-hidpi_1.1.2-1_all.deb +Size: 4252 +MD5sum: 9706f639d83857a8aef4d261f02d3776 +SHA1: ccdedebd5292dc35a73eecdd6cb168f45015da1e +SHA256: 90d3b2b81892c79e3b3d7ee5fbf6cfccdb38cf9559354ed6b2d438bf537350a9 +SHA512: b9e245237ae1ff22dbff30f465a6aa8a8fac1d8a0ac2758dfb82863ba563e24c4b01fefb41834fcf7322093b4bf70b7b2fed960c19cfd2e21fd52476715b43c8 +Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ +Description: APT configuration snippet to enable HiDPI icon downloads + This package contains an APT configuration snippet that enables the + download of an icon tarball containing application icons for display in + software centers. + Icons get downloaded directly from the archive via regular cache updates, + and match the software currently available in the respective archive suites. + . + This snippet enables icons in the size of 64x64@2, that are suitable for + HiDPI displays. + +Package: apt-transport-https +Architecture: all +Version: 3.2.0 +Multi-Arch: foreign +Priority: optional +Section: oldlibs +Source: apt +Maintainer: Ubuntu Developers +Original-Maintainer: APT Development Team +Installed-Size: 36 +Depends: apt (>= 1.5~alpha4) +Filename: pool/apt-transport-https_3.2.0_all.deb +Size: 3928 +MD5sum: d2415080538340aecfc56a4c5ea90488 +SHA1: d4f38cd0aa1dad7601548b7f61199789b9efa0c1 +SHA256: 1b87f0d3826ddecffd7c584332abc779696855a5c7da114a1778e988e4e664ea +SHA512: 78290338afbbc780e74a713570d1382e1f79e7be151e28e61e148307953ebbd422fb28b18dadab6cc4d0729d29ca70eede9164dc9c9f3d967d9101984bfc7fbd +Description: transitional package for https support + This is a dummy transitional package - https support has been moved into + the apt package in 1.5. It can be safely removed. + +Package: aptdaemon +Architecture: all +Version: 2.0.2build1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Julian Andres Klode +Installed-Size: 156 +Depends: gir1.2-glib-2.0, polkitd | policykit-1, python3-aptdaemon (= 2.0.2build1), python3-gi, python3:any +Breaks: python3-aptdaemon.pkcompat, software-center (<< 1.1.21) +Replaces: python3-aptdaemon.pkcompat +Filename: pool/aptdaemon_2.0.2build1_all.deb +Size: 12394 +MD5sum: 56b43aa717d75b623ad2fb6bcec74034 +SHA1: 50a9e579c20eab2ec5ce736478361053861c9d1b +SHA256: f61792620f6b4a59f7ae66cbde2e60aa2e1e43f80acb2d603e1764de851959d7 +SHA512: 86b532dabfc197125f25f98ab2aeb6dbdba0d6108d79b9f687f0868b46a45d9f9178425d2df84ef87e2a763929dcce8888e53e0fe6273a214798abf558271f92 +Homepage: https://launchpad.net/aptdaemon +Description: transaction based package management service + Aptdaemon allows normal users to perform package management tasks, e.g. + refreshing the cache, upgrading the system, installing or removing software + packages. + . + Currently it comes with the following main features: + . + - Programming language independent D-Bus interface, which allows one to + write clients in several languages + - Runs only if required (D-Bus activation) + - Fine grained privilege management using PolicyKit, e.g. allowing all + desktop user to query for updates without entering a password + - Support for media changes during installation from DVD/CDROM + - Support for debconf (Debian's package configuration system) + - Support for attaching a terminal to the underlying dpkg call + . + This package contains the aptd script and all the data files required to run + the daemon. Moreover it contains the aptdcon script, which is a command + line client for aptdaemon. The API is not stable yet. + +Package: aptdaemon-data +Architecture: all +Version: 2.0.2build1 +Priority: optional +Section: admin +Source: aptdaemon +Maintainer: Ubuntu Developers +Original-Maintainer: Julian Andres Klode +Installed-Size: 459 +Replaces: python-aptdaemon-gtk (<= 0.41+bzr580-0ubuntu1) +Filename: pool/aptdaemon-data_2.0.2build1_all.deb +Size: 179964 +MD5sum: 8e4169cdb7a9f83e3cf65d823f1e567b +SHA1: 2f4e90c7d8c736282e14896baefac293f5d60f9f +SHA256: 470cc371c84a8d305387c4fe9ea02ce41cffb2a483b947c056a47198d87040b3 +SHA512: 10b6284d107de2f9e08062a9460d76ae4dfe9bbf05ff9a7397629aec981cd2f003a8e645526c0115204c008cabafec95456524f14ee52099f276a30b96e02fb3 +Homepage: https://launchpad.net/aptdaemon +Description: data files for clients + Aptdaemon is a transaction based package management daemon. It allows + normal users to perform package management tasks, e.g. refreshing the + cache, upgrading the system, installing or removing software packages. + . + This package provides common data files (e.g. icons) for aptdaemon + clients. + +Package: aspell +Architecture: amd64 +Version: 0.60.8.2-3 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Agustin Martin Domingo +Installed-Size: 340 +Provides: aspell-bin +Depends: libaspell15 (= 0.60.8.2-3), libc6 (>= 2.38), libncursesw6 (>= 6), libstdc++6 (>= 5), libtinfo6 (>= 6), dictionaries-common +Recommends: aspell-en | aspell-dictionary | aspell6a-dictionary +Suggests: aspell-doc, spellutils +Breaks: aspell-bin (<< 0.60.3-2) +Replaces: aspell-bin (<< 0.60.3-2) +Filename: pool/aspell_0.60.8.2-3_amd64.deb +Size: 89708 +MD5sum: 172666cdcfeaa8baa3621bf62023fd89 +SHA1: c23a55361d30a3d272d30aee0c58be27c9dd8143 +SHA256: fc682bc1080e5ceb6ca1e620e817d009bf37d5acae9077cbb834af2d594a6a45 +SHA512: 59a51e8e232be5a21d530e516edcdf5c8efae435798c5b573be5d5e82208e2d9a3cba6561b8cf2c21a87c2854afd055f7d46b5e704c889731480ae95ec5a2d86 +Homepage: http://aspell.net/ +Description: GNU Aspell spell-checker + GNU Aspell is a spell-checker which can be used either as a standalone + application or embedded in other programs. Its main feature is that it + does a much better job of suggesting possible spellings than just about + any other spell-checker available for the English language, including + Ispell and Microsoft Word. It also has many other technical + enhancements over Ispell such as using shared memory for dictionaries + and intelligently handling personal dictionaries when more than one + Aspell process is open at once. + . + Aspell is designed to be a drop-in replacement for Ispell. + +Package: aspell-en +Architecture: all +Version: 2020.12.07-0-1.1build1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Dr. Tobias Quathamer +Installed-Size: 429 +Provides: aspell-dictionary +Depends: aspell, dictionaries-common +Filename: pool/aspell-en_2020.12.07-0-1.1build1_all.deb +Size: 303032 +MD5sum: 9ed064d6ff53e2f1b079cfc868a38958 +SHA1: 364a5af165792f90c4ce52db269abfdebc29571a +SHA256: 02e624fc2537d0268330b214039941ff4a41116c89c99b11f7f43110f7bf33ff +SHA512: ac1a225f9297b1807b037fadc64b6a5e17d4582aaf57647706aee4cf6561deac256f59a3539c15a045d05070df462cfec9190a87eba5c1723daf8e445332e7e4 +Homepage: http://aspell.net/ +Description: English dictionary for GNU Aspell + This package contains all the required files to add support for English + language to the GNU Aspell spell checker. + . + American, British, Canadian and Australian spellings are included. + +Package: at-spi2-common +Architecture: all +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 52 +Breaks: at-spi2-core (<< 2.46.0-2~) +Replaces: at-spi2-core (<< 2.46.0-2~) +Filename: pool/at-spi2-common_2.60.4-0ubuntu0.1_all.deb +Size: 6604 +MD5sum: 4038f8bc537bbf62cd1b3b22bc799a83 +SHA1: 94a011301f9289483fd9de395ffb3d6c1026ea96 +SHA256: 2ed4e9bf31e9d76c65ec60c79dcdde5be27979b67d7c5e1a8b7d32cc97c82c41 +SHA512: 27af839d811da282d38684cf94c5765ac4b90eac73b149f295475252d323a92a88d88570b72ee3b69cc7b93600d8e2b7866b8cc3d21548b9a102b25233ca395b +Homepage: https://wiki.gnome.org/Accessibility +Description: Assistive Technology Service Provider Interface (common files) + This package contains the common resource files of GNOME Accessibility. + +Package: at-spi2-core +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 182 +Depends: libatspi2.0-0t64 (= 2.60.4-0ubuntu0.1), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.80.0), libsystemd0, libx11-6, libxtst6 (>= 2:1.2.5), at-spi2-common, gsettings-desktop-schemas +Filename: pool/at-spi2-core_2.60.4-0ubuntu0.1_amd64.deb +Size: 59560 +MD5sum: 43407dc5af14d65f2a6af6b2e62d6cb3 +SHA1: 6bfa9349c6968a171af8f80989346a3721a07375 +SHA256: 8de8d211ef7f517bb2182cf50bd25d36bfce546030f30519ebdfd230612cb209 +SHA512: e6add52375574ab7942bbe444144038d6ca8acd66c69f9b8038bc29f6a6d3756b7653103e8c374235e19a12b15af3b0864c25f96f58f50db4d7f3c0beff75689 +Homepage: https://wiki.gnome.org/Accessibility +Description: Assistive Technology Service Provider Interface (D-Bus core) + This package contains the core components of GNOME Accessibility. + +Package: avahi-daemon +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: net +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 262 +Depends: libavahi-common3 (= 0.8-18ubuntu1.1), libavahi-core7 (= 0.8-18ubuntu1.1), libc6 (>= 2.38), libcap2 (>= 1:2.10), libdaemon0 (>= 0.14), libdbus-1-3 (>= 1.10), libexpat1 (>= 2.0.1), libsystemd0, adduser, default-dbus-system-bus | dbus-system-bus +Recommends: libnss-mdns +Suggests: avahi-autoipd +Filename: pool/avahi-daemon_0.8-18ubuntu1.1_amd64.deb +Size: 64024 +MD5sum: edce00d9cf644a314157fe8dc22c32bf +SHA1: 7a9b643381da88f80f9fea9141b2fdf71a1951d9 +SHA256: 2ee0d3765a2bc7eba82fdb4fe9a1e3d37d4b795276cd9001bdb33d59458d4b40 +SHA512: 9ab6836bc66c43d6abf276e13618ddd89e5958cf3d7330a2726956c77083c042b48a0db2834ba04ba79803d8777f73e34e09fa9cf9988dca8cb7c65aeaba06a1 +Homepage: https://avahi.org/ +Description: Avahi mDNS/DNS-SD daemon + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This package contains the Avahi Daemon which represents your machine + on the network and allows other applications to publish and resolve + mDNS/DNS-SD records. + +Package: baobab +Architecture: amd64 +Version: 49.1-2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 876 +Depends: dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.34), libcairo2 (>= 1.2.4), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.15.1), libpango-1.0-0 (>= 1.14.0) +Recommends: yelp +Filename: pool/baobab_49.1-2_amd64.deb +Size: 137630 +MD5sum: d68279b6e75e08233deb9c829e9aaf92 +SHA1: c85c0853a04ba94471b684101dcfb90849ab6ba5 +SHA256: 6330bfc7d5b90188e5194f61bb2dd2a1bfef95828347701892b889821f5778e7 +SHA512: ae1d58766b11ae987d858c38a0e47376536ef85e7be39da4e612be974a135cc4a995f825951ec8bca197b1c08eda8dbd3b6a6377703421c4c869a0293e7afa66 +Homepage: https://apps.gnome.org/Baobab/ +Description: GNOME disk usage analyzer + Disk Usage Analyzer is a graphical, menu-driven application to analyse + disk usage in a GNOME environment. It can easily scan either the whole + filesystem tree, or a specific user-requested directory branch (local or + remote). + . + It also auto-detects in real-time any changes made to your home + directory as far as any mounted/unmounted device. Disk Usage Analyzer + also provides a full graphical treemap window for each selected folder. + +Package: bc +Architecture: amd64 +Version: 1.07.1-4build1 +Multi-Arch: foreign +Priority: standard +Section: math +Maintainer: Ubuntu Developers +Original-Maintainer: Ryan Kavanagh +Installed-Size: 211 +Depends: libc6 (>= 2.38), libreadline8t64 (>= 6.0) +Filename: pool/bc_1.07.1-4build1_amd64.deb +Size: 86458 +MD5sum: bf9547a6a1404f543f70033eb5f7ec35 +SHA1: f10d4fe8f62e950c91c4adf3b806d025caa113a5 +SHA256: cbc2e84d1f5dfe8debebebf24869988b8cf12151de5a66cce298d3f370dfe919 +SHA512: 5821f5fdcd9b048f2f7b12e740c916c64088583416d68f80598d63dc4cdcfb9b0b6f72f77df3287020c0df63da0286024ded9b91c309e83ac6afeb5fb1a7da00 +Homepage: https://www.gnu.org/software/bc/ +Description: GNU bc arbitrary precision calculator language + GNU bc is an interactive algebraic language with arbitrary precision which + follows the POSIX 1003.2 draft standard, with several extensions including + multi-character variable names, an `else' statement and full Boolean + expressions. GNU bc does not require the separate GNU dc program. + +Package: bind9-dnsutils +Architecture: amd64 +Version: 1:9.20.24-1ubuntu0.3 +Multi-Arch: foreign +Priority: standard +Section: net +Source: bind9 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian DNS Team +Installed-Size: 517 +Provides: dnsutils +Depends: bind9-host | host, bind9-libs (= 1:9.20.24-1ubuntu0.3), libc6 (>= 2.38), libedit2 (>= 2.11-20080614-0), libidn2-0 (>= 2.0.0), libjemalloc2 (>= 2.1.1), libkrb5-3 (>= 1.6.dfsg.2) +Filename: pool/bind9-dnsutils_1%3a9.20.24-1ubuntu0.3_amd64.deb +Size: 163510 +MD5sum: 8dd59423f3a85ad60620be4bb0a7d1d9 +SHA1: 31f4064b781077d5cb2a137b6e3f909800c77bcc +SHA256: e149f6d40e29b4915b237aed92ba972c6c5ff565a056066e7fd5d20204cca832 +SHA512: d2868182ee1de4a019f3a53ab6798fe15b9299d4d85c8e3066bd35d67b184edfc5914410f584767d95b26837a141c772910b3ce81c9efb54b667b0071a4b59f7 +Homepage: https://www.isc.org/downloads/bind/ +Description: Clients provided with BIND 9 + The Berkeley Internet Name Domain (BIND 9) implements an Internet domain + name server. BIND 9 is the most widely-used name server software on the + Internet, and is supported by the Internet Software Consortium, www.isc.org. + . + This package delivers various client programs related to DNS that are + derived from the BIND 9 source tree. + . + - dig - query the DNS in various ways + - nslookup - the older way to do it + - nsupdate - perform dynamic updates (See RFC2136) + +Package: bind9-host +Architecture: amd64 +Version: 1:9.20.24-1ubuntu0.3 +Multi-Arch: foreign +Priority: standard +Section: net +Source: bind9 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian DNS Team +Installed-Size: 141 +Provides: host +Depends: bind9-libs (= 1:9.20.24-1ubuntu0.3), libc6 (>= 2.38), libidn2-0 (>= 2.0.0) +Breaks: bind-host (<< 1:9.13.6~) +Replaces: bind-host (<< 1:9.13.6~) +Filename: pool/bind9-host_1%3a9.20.24-1ubuntu0.3_amd64.deb +Size: 49658 +MD5sum: 456a590a551f18b87894a41184efba00 +SHA1: 96272193a812155c918273d6d3d25cc2283400f7 +SHA256: 0506d3148a63e5fd2ca3df54a6024fb275d4cdc179f431afd89afbcc3d201910 +SHA512: e380b1deffc4dbe2f88cb77dfcf59773ab03c0a389677ec9a6513d896aec2bbf5f72baf7fd6c1af40b73b780a1663e6ca93507685aa77340fabf3b3f59093cde +Homepage: https://www.isc.org/downloads/bind/ +Description: DNS Lookup Utility + This package provides the 'host' DNS lookup utility in the form that + is bundled with the BIND 9 sources. + +Package: bind9-libs +Architecture: amd64 +Version: 1:9.20.24-1ubuntu0.3 +Multi-Arch: same +Priority: standard +Section: libs +Source: bind9 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian DNS Team +Installed-Size: 3530 +Depends: libc6 (>= 2.38), libgssapi-krb5-2 (>= 1.17), libjemalloc2 (>= 4.0.0), libjson-c5 (>= 0.15), libkrb5-3 (>= 1.6.dfsg.2), liblmdb0 (>= 0.9.7), libmaxminddb0 (>= 1.3.0), libnghttp2-14 (>= 1.12.0), libssl3t64 (>= 3.4.0), liburcu8t64 (>= 0.13.0), libuv1t64 (>= 1.38.0), libxml2-16 (>= 2.14.1), zlib1g (>= 1:1.1.4) +Breaks: bind-libs (<< 1:9.13.6~) +Replaces: bind-libs (<< 1:9.13.6~) +Filename: pool/bind9-libs_1%3a9.20.24-1ubuntu0.3_amd64.deb +Size: 1312808 +MD5sum: 75ecee0b571a4fbd7c0c17fc4022121e +SHA1: 0938aee91e7a8288a77b73da7138870c4c393058 +SHA256: 7b0826714aea9c412452d0e7c310218e0dd6114e763fc6f1b9e90d1091dd3547 +SHA512: 69b8de12f3e4e806cf47e1ff4f812f5c025ac1f75a25d0dae34db93acd6a6480376f3360d16c14e6323070f8afa2f4ac876b9f9b00ab69ef2975aea4dd2884e3 +Homepage: https://www.isc.org/downloads/bind/ +Description: Shared Libraries used by BIND 9 + The Berkeley Internet Name Domain (BIND 9) implements an Internet domain + name server. BIND 9 is the most widely-used name server software on the + Internet, and is supported by the Internet Software Consortium, www.isc.org. + . + This package contains a bundle of shared libraries used by BIND 9. + +Package: binutils +Architecture: amd64 +Version: 2.46-3ubuntu2 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 1150 +Provides: elf-binutils +Depends: libbinutils (= 2.46-3ubuntu2), libc6 (>= 2.38), libgcc-s1 (>= 3.0), libgprofng0 (>= 2.45.50), libstdc++6 (>= 13.1), binutils-common (= 2.46-3ubuntu2), binutils-x86-64-linux-gnu (= 2.46-3ubuntu2) +Suggests: binutils-doc (>= 2.46-3ubuntu2), gprofng-gui, binutils-gold +Conflicts: binutils-mingw-w64-i686 (<< 2.23.52.20130612-1+3), binutils-mingw-w64-x86-64 (<< 2.23.52.20130612-1+3), binutils-multiarch (<< 2.27-8), modutils (<< 2.4.19-1) +Breaks: binutils-aarch64-linux-gnu (<< 2.43.90), binutils-i686-linux-gnu (<< 2.43.90), binutils-riscv64-linux-gnu (<< 2.43.90), binutils-x86-64-linux-gnu (<< 2.43.90), libc6-dev (<< 2.42-2ubuntu4) +Replaces: binutils-aarch64-linux-gnu (<< 2.43.90), binutils-common (<< 2.43.90), binutils-i686-linux-gnu (<< 2.43.90), binutils-riscv64-linux-gnu (<< 2.43.90), binutils-x86-64-linux-gnu (<< 2.43.90) +Filename: pool/binutils_2.46-3ubuntu2_amd64.deb +Size: 224544 +MD5sum: 4d502fcb112601b6c9ee161abe58be92 +SHA1: 4d3b67c256691c950eb0a729ab33002094bee3cd +SHA256: d14fc7bf644b495083f77c99ff168f1a2215c8b3b7ad5202e0345dc1092002b0 +SHA512: 01b80afdbd3ad15b3f0c9bd42d6a87131fbe424f8ab11045fa89dccea91f35589863f33e9b287b469d77d86189a24ebd43183b22ed396d1554ad4cd8953fa382 +Homepage: https://www.gnu.org/software/binutils/ +Description: GNU assembler, linker and binary utilities + The programs in this package are used to assemble, link and manipulate + binary and object files. They may be used in conjunction with a compiler + and various libraries to build programs. + +Package: binutils-common +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 532 +Breaks: binutils (<< 2.38.50.20220527-2), binutils-multiarch (<< 2.38.50.20220527-2) +Replaces: binutils (<< 2.38.50.20220527-2), binutils-multiarch (<< 2.38.50.20220527-2) +Filename: pool/binutils-common_2.46-3ubuntu2_amd64.deb +Size: 221612 +MD5sum: 4a4945a63f96a6c145d33bae0c9bfa7a +SHA1: 7baef0b7bf5e99a6932af03dac6eff7cb94a8087 +SHA256: 3c846f001d87b16e5038a3919ca975276808a2db17459308a9d0f965c1cddac5 +SHA512: 040d0fd46db6f74805a8e1fcb3b3cbfb167e5e66ed76c8e0d9434a11eebeb21a596f97df483d2ce28011f7b0be31f789d07c2dbbe348c4ac59f3ea6866fff9bf +Homepage: https://www.gnu.org/software/binutils/ +Description: Common files for the GNU assembler, linker and binary utilities + This package contains the localization files used by binutils packages for + various target architectures and parts of the binutils documentation. It is + not useful on its own. + +Package: binutils-x86-64-linux-gnu +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: allowed +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 6109 +Depends: binutils-common (= 2.46-3ubuntu2), libbinutils (= 2.46-3ubuntu2), libc6 (>= 2.38), libctf-nobfd0 (>= 2.36), libctf0 (>= 2.36), libjansson4 (>= 2.14), libsframe3 (>= 2.45.50), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Suggests: binutils-doc (= 2.46-3ubuntu2) +Breaks: binutils (<< 2.29-6), binutils-dev (<< 2.38.50.20220609-2) +Replaces: binutils (<< 2.29-6), binutils-dev (<< 2.38.50.20220609-2) +Filename: pool/binutils-x86-64-linux-gnu_2.46-3ubuntu2_amd64.deb +Size: 1150176 +MD5sum: aed2ce183c049598d07b44fa25b71a32 +SHA1: d4244b9992f4455fc8a351297d9dba9cd7c9eead +SHA256: 91fa094c31783f7ccf0f0df8ed06447655c40476ba61fc95dbd245a313f8171e +SHA512: 64fbe100e6c2e6ad1ed3328f12233a514408eafd50d2fab16fadf759e1544fd0bd1bf5bdecf2db54873fc4bb443c853e5fbec07b16441166f9cc024135b9dd7b +Homepage: https://www.gnu.org/software/binutils/ +Description: GNU binary utilities, for x86-64-linux-gnu target + This package provides GNU assembler, linker and binary utilities + for the x86-64-linux-gnu target. + . + You don't need this package unless you plan to cross-compile programs + for x86-64-linux-gnu and x86-64-linux-gnu is not your native + platform. + +Package: bluez +Architecture: amd64 +Version: 5.85-4ubuntu0.2 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Bluetooth Maintainers +Installed-Size: 4899 +Depends: default-dbus-system-bus | dbus-system-bus, kmod, udev, systemd | systemd-standalone-sysusers | systemd-sysusers, libasound2t64 (>= 1.0.17), libc6 (>= 2.42), libdbus-1-3 (>= 1.10), libdw1t64 (>= 0.127), libglib2.0-0t64 (>= 2.76.0), libreadline8t64 (>= 7.0~rc1), libudev1 (>= 196) +Suggests: pulseaudio-module-bluetooth +Filename: pool/bluez_5.85-4ubuntu0.2_amd64.deb +Size: 1550492 +MD5sum: c05dae64656ba5b7d1b90d81c3091750 +SHA1: 96d57fbba6a7f801ffa098c228a6033abd198f87 +SHA256: 3d10739644e47a795ca5605b8693f9821b0812c28daf95b11aa2d1f12d567d08 +SHA512: 38d8c8177a0c78e53e7f590839d3560e939c86688a338779752ff892fb087135b53f19b543ce533d703f6b8271d5ea956da668706186fe84d049bb4e81468f61 +Homepage: http://www.bluez.org +Description: Bluetooth tools and daemons + This package contains tools and system daemons for using Bluetooth devices. + . + BlueZ is the official Linux Bluetooth protocol stack. It is an Open Source + project distributed under GNU General Public License (GPL). + +Package: bluez-cups +Architecture: amd64 +Version: 5.85-4ubuntu0.2 +Priority: optional +Section: admin +Source: bluez +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Bluetooth Maintainers +Installed-Size: 85 +Depends: cups, libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.12.0) +Filename: pool/bluez-cups_5.85-4ubuntu0.2_amd64.deb +Size: 27846 +MD5sum: badd42475882107ae17ddfa1bf970353 +SHA1: caac7f77790dc53cd59ecdc6989c4d96c5d48f84 +SHA256: 9204262033d802191aecee9f47c3d970c7147ea846bbd22f609c0793ce51ab7a +SHA512: 8388d5b7cf56896bdf96a76ce640cdd2f169604e6d98a3e482c8bf926c78a54ca0707730f39ca00a442d5d6f3b5beac0ce2fec49ef3074108e1256752fba3a2f +Homepage: http://www.bluez.org +Description: Bluetooth printer driver for CUPS + This package contains a driver to let CUPS print to Bluetooth-connected + printers. + . + BlueZ is the official Linux Bluetooth protocol stack. It is an Open Source + project distributed under GNU General Public License (GPL). + +Package: bluez-obexd +Architecture: amd64 +Version: 5.85-4ubuntu0.2 +Priority: optional +Section: admin +Source: bluez +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Bluetooth Maintainers +Installed-Size: 727 +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libebook-1.2-21t64 (>= 3.17), libebook-contacts-1.2-4t64 (>= 3.16.2), libedataserver-1.2-27t64 (>= 3.17), libglib2.0-0t64 (>= 2.78.0), libsystemd0 +Recommends: dbus-user-session +Suggests: evolution-data-server +Filename: pool/bluez-obexd_5.85-4ubuntu0.2_amd64.deb +Size: 243752 +MD5sum: 6209be33e5d7ca6ec413584918c4d589 +SHA1: c97b62bf3300bb377e5f3f213d0da2a9f2226dae +SHA256: 287ddfddf6074fb4dd4586e474bec54d7cccebc77dd2933b193dfcd125cbf1d3 +SHA512: e8bc9d82febd06066ecc773a4497b41e6db0583737ba75a086356fc00c913c13075433a8d849116e33c0330734d4e82bf32b28dcdf04a6b34422b34061ac4cc5 +Homepage: http://www.bluez.org +Description: bluez obex daemon + This package contains a OBEX(OBject EXchange) daemon. + . + OBEX is communication protocol to facilitate the exchange of the binary + object between the devices. + . + This was the software that is independent as obexd, but this has been + integrated into BlueZ from BlueZ 5.0. + . + BlueZ is the official Linux Bluetooth protocol stack. It is an Open Source + project distributed under GNU General Public License (GPL). + +Package: bolt +Architecture: amd64 +Version: 0.9.10-1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 454 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libpolkit-gobject-1-0 (>= 0.99), libudev1 (>= 183) +Filename: pool/bolt_0.9.10-1_amd64.deb +Size: 142144 +MD5sum: 890de3709120c2e2e67d60ea1183a4cc +SHA1: 87648b64d6aa3bb2e94da0f8f5ff96bade932318 +SHA256: 2a91d14abab644e9bb7f0250459e6f5b5c75b109b9244cd12282c753a5d42c1f +SHA512: 7c2f65c35553c8e6b573e042d77f77681d7197e33a79989ef48861443002e460589d0eb082363faeae72a376c2579c915fb39b271037ab42f8ba4b2e598d9a08 +Homepage: https://gitlab.freedesktop.org/bolt/bolt +Description: system daemon to manage thunderbolt 3 devices + Thunderbolt 3 features different security modes that require + devices to be authorized before they can be used. The D-Bus API can be + used to list devices, enroll them (authorize and store them in the + local database) and forget them again (remove previously enrolled + devices). It also emits signals if new devices are connected (or + removed). During enrollment devices can be set to be automatically + authorized as soon as they are connected. A command line tool, called + boltctl, can be used to control the daemon and perform all the above + mentioned tasks. + +Package: brltty +Architecture: amd64 +Version: 6.7-1ubuntu6 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 10332 +Depends: libasound2t64 (>= 1.0.16), libbluetooth3 (>= 4.91), libbrlapi0.8 (>= 6.7), libc6 (>= 2.42), libcap2 (>= 1:2.10), libdbus-1-3 (>= 1.10), libexpat1 (>= 2.0.1), libglib2.0-0t64 (>= 2.76.0), libgpm2 (>= 1.20.7), libicu78 (>= 78.1-1~), liblouis20 (>= 3.36.0), libncursesw6 (>= 6), libpcre2-32-0 (>= 10.22), libpolkit-gobject-1-0 (>= 0.101), libsystemd0, libtinfo6 (>= 6), polkitd | policykit-1 +Recommends: python3 +Suggests: brltty-speechd, brltty-x11, console-braille, unicode-cldr-core +Replaces: libbrlapi1 (<< 3.7.2-7.1) +Filename: pool/brltty_6.7-1ubuntu6_amd64.deb +Size: 1654728 +MD5sum: a987e95dd3c784afc9cf8ae57029b546 +SHA1: 713686084467c4c5252b02658bead8197b2c0369 +SHA256: 81b7adffacea9ecf86cab24b66fd0b2bc0f7272106afa285c4b6e3f8891c45d8 +SHA512: eb7176eeba5b1c783378d1a8cbb0b7b32660f9953322558188c192183c1cdad0ed60ff4e108343d63e76f69d6bb28b42fbd704254b29d71a52d495599f67761b +Homepage: https://brltty.com +Description: Access software for a blind person using a braille display + BRLTTY is a daemon which provides access to the console (text mode) + for a blind person using a braille display. It drives the braille + display and provides complete screen review functionality. + The following display models are supported: + * Alva/Optelec (ABT3xx, Delphi, Satellite, Braille System 40, BC 640/680) + * Baum + * BrailComm + * BrailleLite + * BrailleNote + * Cebra + * EcoBraille + * EuroBraille (AzerBraille, Clio, Esys, Iris, NoteBraille, Scriba) + * Freedom Scientific (Focus and PacMate) + * Handy Tech + * HIMS (Braille Sense, SyncBraille) + * HumanWare (Brailliant) + * Iris + * LogText 32 + * MDV + * Metec (BD-40) + * NinePoint + * Papenmeier + * Pegasus + * Seika + * Tieman (Voyager, CombiBraille, MiniBraille, MultiBraille, + BraillePen/EasyLink) + * Tivomatic (Albatross) + * TSI (Navigator, PowerBraille) + * VideoBraille + * VisioBraille + . + BRLTTY also provides a client/server based infrastructure for applications + wishing to utilize a Braille display. The daemon process listens for incoming + TCP/IP connections on a certain port. A shared object library for clients is + provided in the package libbrlapi0.8. A static library, header files and + documentation is provided in package libbrlapi-dev. Bindings to other + programming languages can be found in cl-brlapi (Lisp), libbrlapi-java (Java) + and python3-brlapi (Python). + +Package: bsdextrautils +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 285 +Depends: libc6 (>= 2.38), libsmartcols1 (= 2.41.3-3ubuntu2.2), libtinfo6 (>= 6) +Breaks: bsdmainutils (<< 12.1.3), util-linux (<< 2.41.2-2~) +Replaces: bsdmainutils (<< 12.1.3), util-linux (<< 2.41.2-2~) +Filename: pool/bsdextrautils_2.41.3-3ubuntu2.2_amd64.deb +Size: 86650 +MD5sum: 96d6f317e6e39eb96086215110bea895 +SHA1: 9782af97509cefe727866ae59cab0ea6630e2205 +SHA256: a711db104cbae55b4b4bdbc646111b819164446c6762826d8a39983635729603 +SHA512: e34eaacb60b8a4ed3452a68d62b26a9bd0e19b2bf80ed4dd41030ea2ab9d8847b55ecf9aff84271a60ff3240a82fdfc0a741a74f581bbbacf1ed69b737288396 +Homepage: https://github.com/util-linux/util-linux +Description: extra utilities from 4.4BSD-Lite + This package contains some extra BSD utilities: col, colcrt, colrm, column, + hd, hexdump, look, rev, ul. + Other BSD utilities are provided by bsdutils and calendar. + +Package: bubblewrap +Architecture: amd64 +Version: 0.11.1-1ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 133 +Depends: libc6 (>= 2.38), libcap2 (>= 1:2.10), libselinux1 (>= 3.1~) +Filename: pool/bubblewrap_0.11.1-1ubuntu0.1_amd64.deb +Size: 50806 +MD5sum: f81933e1f30821aad1bf079f500b0659 +SHA1: d819730ad8554be4426f741f2e8909b0f2d30001 +SHA256: b353088d1003adb3f760deeccfb84c47928a36c8dc102bf680efc94eb19f4408 +SHA512: d801b63aab8d38e4485805fc41ad5e96ecf5b9bfcfcc08941dae8caeedb87bf894fbd8939e01804158bf5501a5f8347d45049b56655ce88db4e9e57754192481 +Homepage: https://github.com/containers/bubblewrap +Description: utility for unprivileged chroot and namespace manipulation + bubblewrap uses Linux namespaces to launch unprivileged containers. + These containers can be used to sandbox semi-trusted applications such + as Flatpak apps, image/video thumbnailers and web browser components, + or to run programs in a different library stack such as a Flatpak runtime + or a different Debian release. + . + By default, this package relies on a kernel with user namespaces enabled. + Official Debian and Ubuntu kernels are suitable. + . + On kernels without user namespaces, system administrators can make the + bwrap executable setuid root, allowing it to create unprivileged + containers even though ordinary user processes cannot. + +Package: busybox-initramfs +Architecture: amd64 +Version: 1:1.37.0-7ubuntu1 +Priority: optional +Section: shells +Source: busybox +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 351 +Depends: libc6 (>= 2.42) +Filename: pool/busybox-initramfs_1%3a1.37.0-7ubuntu1_amd64.deb +Size: 190892 +MD5sum: c74beea2aef9c4411704a0d727df93d7 +SHA1: 1c074e51d398c45dbff6889cd0ef945fd13ad227 +SHA256: ce2e5af197a7e16931a32470beec9750e6f6c3cb1b1572c936aec0638a6503a2 +SHA512: 5c01f9a8d2be29a784c88ded1d910924c138ff301c253f1174ec2cf1f88f5c883ed8cd2f03c6f68d55444c2f26539f1da3daaaf12a2d3421fd9ca6f08906e249 +Homepage: http://www.busybox.net +Description: Standalone shell setup for initramfs + BusyBox combines tiny versions of many common UNIX utilities into a single + small executable. It provides minimalist replacements for the most common + utilities you would usually find on your desktop system (i.e., ls, cp, mv, + mount, tar, etc.). The utilities in BusyBox generally have fewer options than + their full-featured GNU cousins; however, the options that are included + provide the expected functionality and behave very much like their GNU + counterparts. + . + busybox-initramfs provides a simple stand alone shell that provides + only the basic utilities needed for the initramfs. + +Package: busybox-static +Architecture: amd64 +Version: 1:1.37.0-7ubuntu1 +Built-Using: glibc (= 2.42-2ubuntu4) +Priority: optional +Section: shells +Source: busybox +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 2188 +Provides: busybox +Conflicts: busybox +Replaces: busybox +Filename: pool/busybox-static_1%3a1.37.0-7ubuntu1_amd64.deb +Size: 1033568 +MD5sum: c769d47dcf081de11e94e0e86a02cd78 +SHA1: 17479fa0538ccdac4ed0a458fbb7ef87bab24fed +SHA256: fd605342f62268753076aa7d9321ff098b36ba53e47434145a9aedc28fd141a4 +SHA512: e0aecebefd23bd437a00a385ebfa5e316374922f8fcdb8faba81208c189130da924434cc514b4ab56c69f83cf756905a6e469158290d72bf8db99ac8dd34bd8c +Homepage: http://www.busybox.net +Description: Standalone rescue shell with tons of builtin utilities + BusyBox combines tiny versions of many common UNIX utilities into a single + small executable. It provides minimalist replacements for the most common + utilities you would usually find on your desktop system (i.e., ls, cp, mv, + mount, tar, etc.). The utilities in BusyBox generally have fewer options than + their full-featured GNU cousins; however, the options that are included + provide the expected functionality and behave very much like their GNU + counterparts. + . + busybox-static provides you with a statically linked simple stand alone shell + that provides all the utilities available in BusyBox. This package is + intended to be used as a rescue shell, in the event that you screw up your + system. Invoke "busybox sh" and you have a standalone shell ready to save + your system from certain destruction. Invoke "busybox", and it will list the + available builtin commands. + +Package: ca-certificates +Architecture: all +Version: 20260601~26.04.1 +Multi-Arch: foreign +Priority: standard +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Julien Cristau +Installed-Size: 333 +Depends: openssl (>= 1.1.1), debconf (>= 0.5) | debconf-2.0 +Breaks: ca-certificates-java (<< 20121112+nmu1) +Enhances: openssl +Filename: pool/ca-certificates_20260601~26.04.1_all.deb +Size: 138514 +MD5sum: e50f4530af1a3b5ed95af39a3e7e2739 +SHA1: e7afdc5a5ea4be7e61aa70ba532615c0d8213823 +SHA256: 6077d27c6b6f8b23590cb01ff877ed8c804a67a5442cc32b5a33da10d2bd0e90 +SHA512: d7d7406d19810f3c88471673e40ad6a7dcf00c689fed1634f1d68f7498a4d0bb6418a48d0c7020e2ef56333ed973bbda7787b863702e575ef0e4d2ed0dd044da +Description: Common CA certificates + Contains the certificate authorities shipped with Mozilla's browser to allow + SSL-based applications to check for the authenticity of SSL connections. + . + Please note that Debian can neither confirm nor deny whether the + certificate authorities whose certificates are included in this package + have in any way been audited for trustworthiness or RFC 3647 compliance. + Full responsibility to assess them belongs to the local system + administrator. + +Package: cloud-guest-utils +Architecture: all +Version: 0.33-1build1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: cloud-utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Cloud Team +Installed-Size: 61 +Depends: e2fsprogs, fdisk, python3:any +Recommends: gdisk +Suggests: cloud-init +Filename: pool/cloud-guest-utils_0.33-1build1_all.deb +Size: 18670 +MD5sum: 295c08c58b62965942952650e574aac0 +SHA1: 665330074f0bf7f13b0249712111637889bd200e +SHA256: 23041599f546279bb1fda510cb1154e2f8892444d38be39da9a03289b2bb43b8 +SHA512: d5877d477d46d5416ea70c1cf36d3822b02e8f73c0f630eb894cf62458399e198f6b17c1161eb2b1227a104ad4f52381fb3fa7eb9daf97e8a29638dbd310a0ce +Homepage: https://launchpad.net/cloud-utils +Description: cloud guest utilities + This package contains programs useful inside cloud instance. + It contains 'growpart' for resizing a partition during boot, which is normally + done with the aid of cloud-init. + +Package: cloud-init +Architecture: all +Version: 26.1-0ubuntu3~26.04.1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Installed-Size: 15 +Depends: cloud-init-base (= 26.1-0ubuntu3~26.04.1), python3-serial, python3-passlib +Filename: pool/cloud-init_26.1-0ubuntu3~26.04.1_all.deb +Size: 2110 +MD5sum: c8bea5475e8b8c12964f2cb40f2211f1 +SHA1: 7ea2d2540f07d6cd8d7efda021686ec85de3f119 +SHA256: a9a6115ee0ff0c4e04997f7dccc23a4aec4545cd25c39fcfac527224cf040bba +SHA512: 2d68e18cec333cac513c7bbd6409bb6b2f185d92f45df857ee266363bf73b38905dfa82bcdc6ca6ab936d38d05aacb89df043fc3c51fb2574c85a2c0b2b98fb2 +Homepage: https://cloud-init.io/ +Description: initialization and customization tool for cloud instances + Cloud-init is the industry standard multi-distribution method for + cross-platform cloud instance initialization. It is supported across all major + public cloud providers, provisioning systems for private cloud infrastructure, + and bare-metal installations. + . + Cloud instances are initialized from a disk image and instance data: + . + * Cloud metadata + * User data (optional) + * Vendor data (optional) + . + Cloud-init will identify the cloud it is running on during boot, read any + provided metadata from the cloud and initialize the system accordingly. This + may involve setting up the network and storage devices to configuring SSH + access key and many other aspects of a system. Later on the cloud-init will + also parse and process any optional user or vendor data that was passed to + the instance. + . + This is a metapackage that includes every cloud-init dependency. + +Package: cloud-init-base +Architecture: all +Version: 26.1-0ubuntu3~26.04.1 +Priority: optional +Section: admin +Source: cloud-init +Maintainer: Ubuntu Developers +Installed-Size: 3012 +Depends: cloud-guest-utils | cloud-utils, dhcpcd-base, iproute2, netcat-openbsd, netplan.io, procps, python3, python3-configobj, python3-debconf, python3-requests, python3-jinja2, python3-jsonpatch, python3-jsonschema, python3-oauthlib, python3-yaml, debconf (>= 0.5) | debconf-2.0, python3:any +Recommends: eatmydata, gdisk, gnupg, python3-apt, software-properties-common +Suggests: openssh-server, ssh-import-id +Breaks: cloud-init (<< 25.1.1-0ubuntu2~), cloud-init-base +Replaces: cloud-init (<< 25.1.1-0ubuntu2~), cloud-init-base +Filename: pool/cloud-init-base_26.1-0ubuntu3~26.04.1_all.deb +Size: 587498 +MD5sum: ed9ce243cda02c4c7c6fa9230b555ea3 +SHA1: eed795252827e0ac9bd6c54c6dac39f13f852908 +SHA256: 1ea9b30278090bff9eab18641397ef6d097a286c3ae9e9348759f256b3d91629 +SHA512: b7abedf614f75934c15ad8e3711e1723f4c9354122a8011876e510653bce19c427b9c0baaf035ea76571cb2c14b9b8d6399c456042b1c80f99ebfc8241332c19 +Homepage: https://cloud-init.io/ +Description: initialization and customization tool for cloud instances + Cloud-init with minimal dependencies, refer to cloud-init for more + information. + +Package: colord +Architecture: amd64 +Version: 1.4.8-3 +Multi-Arch: foreign +Priority: optional +Section: graphics +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 1019 +Depends: acl, colord-data, polkitd, dconf-gsettings-backend | gsettings-backend, systemd | systemd-standalone-sysusers | systemd-sysusers, libc6 (>= 2.34), libcolord2 (>= 1.4.3), libcolorhug2 (>= 0.1.30), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.80.0), libgudev-1.0-0 (>= 146), libgusb2a (>= 0.2.2), liblcms2-2 (>= 2.2+git20110628), libpolkit-gobject-1-0 (>= 0.99), libsane1 (>= 1.0.27), libsqlite3-0 (>= 3.5.9), libsystemd0 +Suggests: colord-sensor-argyll +Filename: pool/colord_1.4.8-3_amd64.deb +Size: 219688 +MD5sum: 485a7cd35a61f148e6cf0a098cd54eed +SHA1: 870d811582d22e225163873821a855f8d6b365e8 +SHA256: 0bd99a498f6030db7fb85a1cd7e0bf100615dcab2ba6c0c1c4f231279fc68756 +SHA512: 5c6297695ae8588aea1751a8c5be9ec0f822b1592a8547c7b370bdccce7afbf5c4c7ea8e1dbacb7f3189b8f76bf7b37fd82aa9e7ed96e2fceedb0d4d237ae922 +Homepage: https://www.freedesktop.org/software/colord/ +Description: system service to manage device colour profiles -- system daemon + colord is a system service that makes it easy to manage, install and generate + colour profiles to accurately colour manage input and output devices. + . + It provides a D-Bus API for system frameworks to query, a persistent data + store, and a mechanism for session applications to set system policy. + . + This package contains the dbus-activated colord system daemon. + +Package: colord-data +Architecture: all +Version: 1.4.8-3 +Priority: optional +Section: graphics +Source: colord +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 2596 +Filename: pool/colord-data_1.4.8-3_all.deb +Size: 1255772 +MD5sum: 021aa6459af9711f7fd120288aeb20c8 +SHA1: cb147d4cee335ac7c1689faf018184db503c9d93 +SHA256: ad714cd24a4a30a1e3dd262b002648a1b9deca08008cd3574b7a42e34a51589f +SHA512: 7a33de232515cd5cf5339d2165916e7788651d44aef8bd0d86b05bd1a500490119bc4c61ddf2a140fe5009b405e3879bfcc556e18afbd19d686fabeb0be8afa9 +Homepage: https://www.freedesktop.org/software/colord/ +Description: system service to manage device colour profiles -- data files + colord is a system service that makes it easy to manage, install and generate + colour profiles to accurately colour manage input and output devices. + . + It provides a D-Bus API for system frameworks to query, a persistent data + store, and a mechanism for session applications to set system policy. + . + This package contains data for the colord system daemon. + +Package: console-setup +Architecture: all +Version: 1.237ubuntu3.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 407 +Pre-Depends: debconf | debconf-2.0 +Depends: console-setup-linux | hurd, xkb-data (>= 0.9), keyboard-configuration (= 1.237ubuntu3.1), debconf (>= 0.5) | debconf-2.0 +Suggests: lsb-base (>= 3.0-6), locales +Conflicts: console-setup-mini +Breaks: lsb (<< 2.0-6), lsb-base (<< 3.0-6), lsb-core (<< 2.0-6) +Filename: pool/console-setup_1.237ubuntu3.1_all.deb +Size: 102654 +MD5sum: 701343cd91306f4121b76dd60e924192 +SHA1: 3b56cc0dca7c6083cc894f30574c179643c95ee7 +SHA256: 220b7317f878d2099c7911657fa98507a89ca47bad3c76ae34239b9fda149cf4 +SHA512: 776ebf749c2a621ff9835b86b69efe1c838e948ac8265fab0f2c5eb91875ae67f1313800854b3a8a962359dfa40bee3e59cc5cf956a215ed82e15529bf622832 +Description: console font and keymap setup program + This package provides the console with the same keyboard + configuration scheme as the X Window System. As a result, there is no + need to duplicate or change the keyboard files just to make simple + customizations such as the use of dead keys, the key functioning as + AltGr or Compose key, the key(s) to switch between Latin and + non-Latin mode, etc. + . + The package also installs console fonts supporting many of the + world's languages. It provides an unified set of font faces - the + classic VGA, the simplistic Fixed, and the cleaned Terminus, + TerminusBold and TerminusBoldVGA. + +Package: console-setup-linux +Architecture: all +Version: 1.237ubuntu3.1 +Static-Built-Using: fonts-dejavu (= 2.37-8build1), unifont (= 1:16.0.04-1build1) +Multi-Arch: foreign +Priority: optional +Section: utils +Source: console-setup +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 7291 +Provides: console-terminus +Depends: kbd (>= 0.99-12) | console-tools (>= 1:0.2.3-16), keyboard-configuration (= 1.237ubuntu3.1), init-system-helpers (>= 1.29~) | initscripts +Suggests: console-setup +Breaks: console-cyrillic (<= 0.9-11), console-setup (<< 1.71), console-terminus +Replaces: console-setup (<< 1.71), console-terminus +Filename: pool/console-setup-linux_1.237ubuntu3.1_all.deb +Size: 6206020 +MD5sum: 2bd2c8c4bac5adc4cc40c4f169a4eb6e +SHA1: 18f9a42a6bd7abb7ea1b5241f3cea2e4004697d4 +SHA256: 18f100eb0e3baf792e2c091e00276a3c65e507c15306aebd8d71b09ba1d3804e +SHA512: 511e2f220d1f2afb6c0ae80d9488b6863b884f2db26e54d9cd343ca212c8061e6fbf637131fbd6f93673f3f9d47fe22515b22eca96a1cdf65e9e768fd2bbbb5b +Description: Linux specific part of console-setup + This package includes fonts in psf format and definitions of various + 8-bit charmaps. + +Package: containerd.io +Architecture: amd64 +Version: 2.3.5-1~ubuntu.26.04~resolute +Priority: optional +Section: devel +Maintainer: Containerd team +Installed-Size: 85162 +Provides: containerd, runc +Depends: libc6 (>= 2.38), libseccomp2 (>= 2.6.0) +Conflicts: containerd, runc +Replaces: containerd, runc +Filename: pool/containerd.io_2.3.5-1~ubuntu.26.04~resolute_amd64.deb +Size: 22409096 +MD5sum: 8f1f7ac64b55931eba8a4d123d2e1c63 +SHA1: 30ef76d3da682d8d701c11e2490953b666f381fd +SHA256: a5988582d779e62dd968a1f2312ff8cd25670c185ebf94e4e5331ad1dcc1c287 +SHA512: 85ceae76e2993c10fd95f94912fa659cff4d33d3722c0c497c94669629b31ad16e355ccacae8eff0f551ae309e9c78659d634d7fbe05cd3441f6fc6053f03a4e +Homepage: https://containerd.io +Description: An open and reliable container runtime + +Package: cpp +Architecture: amd64 +Version: 4:15.2.0-5ubuntu1 +Multi-Arch: allowed +Priority: optional +Section: interpreters +Source: gcc-defaults (1.230ubuntu1) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 37 +Depends: cpp-15 (>= 15.2.0-2~), cpp-x86-64-linux-gnu (= 4:15.2.0-5ubuntu1) +Suggests: cpp-doc +Conflicts: cpp-doc (<< 1:2.95.3), gcc (<< 4:13.2.0-3) +Filename: pool/cpp_4%3a15.2.0-5ubuntu1_amd64.deb +Size: 22420 +MD5sum: 472c9b90f4822b3bb55d524419690046 +SHA1: c4d5440ae75299200bfb2961bb4b58217266b053 +SHA256: 05a64873a18fb10d52ba2c8ee1fd0a605a974d75264d824ef2771c799f49ea63 +SHA512: cf8ce02c3a9dbef03d57ef6757196be1fc6479b0fa43376474709e4f0c026ebffee85f42f4f914a4fab3e2d82eb6b758e9c8ae776d04af62826aa43586106643 +Description: GNU C preprocessor (cpp) + The GNU C preprocessor is a macro processor that is used automatically + by the GNU C compiler to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. + . + This is a dependency package providing the default GNU C preprocessor. + +Package: cpp-15 +Architecture: amd64 +Version: 15.2.0-16ubuntu1 +Priority: optional +Section: interpreters +Source: gcc-15 +Maintainer: Ubuntu Core developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 11 +Depends: gcc-15-base (= 15.2.0-16ubuntu1), cpp-15-x86-64-linux-gnu (= 15.2.0-16ubuntu1) +Suggests: gcc-15-locales (>= 15) +Breaks: hardening-wrapper (<< 2.8+nmu3), libmagics++-dev (<< 2.28.0-4) +Filename: pool/cpp-15_15.2.0-16ubuntu1_amd64.deb +Size: 1030 +MD5sum: 02eb788c68e1af8e34b382bbc9ad1d78 +SHA1: 18b51569dea813b82d12a647346c9a7297cfb1b0 +SHA256: baacc9086e17c8cadc3603365e660f907bca483de4446e56e6f1bc25da4c02be +SHA512: afe4d641fd0e29fd7f3726d206c573ec2ac9245c8c06027f3c1518efe062b63a8ebc1ecea790c3263adafb37a1424e6e621b4b1d7be4ddb85570bdf3dbc18c75 +Homepage: http://gcc.gnu.org/ +Description: GNU C preprocessor + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the compiler. + +Package: cpp-15-x86-64-linux-gnu +Architecture: amd64 +Version: 15.2.0-16ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: interpreters +Source: gcc-15 +Maintainer: Ubuntu Core developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 37902 +Depends: gcc-15-base (= 15.2.0-16ubuntu1), libc6 (>= 2.38), libgmp10 (>= 2:6.3.0+dfsg), libisl23 (>= 0.15), libmpc3 (>= 1.1.0), libmpfr6 (>= 3.1.3), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Suggests: gcc-15-locales (>= 15), cpp-15-doc (>= 15) +Breaks: hardening-wrapper (<< 2.8+nmu3), libmagics++-dev (<< 2.28.0-4) +Filename: pool/cpp-15-x86-64-linux-gnu_15.2.0-16ubuntu1_amd64.deb +Size: 12899858 +MD5sum: a5123a7b09ce9e3ae785f33d5fa3c73d +SHA1: b610f7caf3568ae6f2b8db226dfa337b30674351 +SHA256: 1649aa71c45b047feda5b9ca303c94799bdba5befa5c9de9735cbfc59c3ef93f +SHA512: 9bfe5ab8e7240403052c5955ceb0fc3207fff373a84ec3b33e26423df377b30790da34d27054f30b5c8699f9d5c0866fff3d41855e1e708856db318de364d212 +Homepage: http://gcc.gnu.org/ +Description: GNU C preprocessor for x86_64-linux-gnu + A macro processor that is used automatically by the GNU C compiler + to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those + who require the preprocessor configured for the + x86_64-linux-gnu architecture but not the compiler. + +Package: cpp-x86-64-linux-gnu +Architecture: amd64 +Version: 4:15.2.0-5ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: interpreters +Source: gcc-defaults (1.230ubuntu1) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 21 +Depends: cpp-15-x86-64-linux-gnu (>= 15.2.0-2~) +Suggests: cpp-doc +Breaks: cpp (<< 4:13.2.0-3) +Replaces: cpp (<< 4:13.2.0-3) +Filename: pool/cpp-x86-64-linux-gnu_4%3a15.2.0-5ubuntu1_amd64.deb +Size: 5840 +MD5sum: e1cc2dd95d765646f8ee5658a7863f39 +SHA1: 924784868287124949f0d76bdc64983ef2e5d80a +SHA256: 18b35148f64d0bb17b5c34efa6bdeefa4df9ca122ba12130f7245bccd65a950a +SHA512: 20bfdb464992d03d5438c2477aa5dcbd0d0e8d98fd972fe479e213a4cfff2c40b6475861a5ec0341baa5807dd6ecfecf9f7af9379f5008347e6bcb1f4093da05 +Description: GNU C preprocessor (cpp) for the amd64 architecture + The GNU C preprocessor is a macro processor that is used automatically + by the GNU C compiler to transform programs before actual compilation. + . + This package has been separated from gcc for the benefit of those who + require the preprocessor but not the cross-compiler for amd64 architecture. + . + This is a dependency package providing the default GNU C preprocessor + for the amd64 architecture. + +Package: cracklib-runtime +Architecture: amd64 +Version: 2.9.6-5.2build3 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: cracklib2 +Maintainer: Ubuntu Developers +Original-Maintainer: Jan Dittberner +Installed-Size: 583 +Depends: file, libcrack2 (>= 2.9.6-5.2build3), libc6 (>= 2.34) +Recommends: wamerican | wordlist +Filename: pool/cracklib-runtime_2.9.6-5.2build3_amd64.deb +Size: 147498 +MD5sum: 971f37d8f966b9a56f7469ac47d43d7a +SHA1: 450745af5e2d03393b7470f149209da1b44c991f +SHA256: b4796647beb74387211fcf9265ef6aa1e3539585de91f8b81a3fa3645ad8c612 +SHA512: 5d7ecdf229f90506388133ff38c97988cc2a77bce2ce85e1fc6dbc279e54602944997e481163c33c0b9a043ceffc618b2faf8d4b94565c429d1fef8bbd632eb6 +Homepage: https://github.com/cracklib/cracklib +Description: runtime support for password checker library cracklib2 + Run-time support programs which use the shared library in libcrack2 + including programs to build the password dictionary databases used by + the functions in the shared library. + +Package: crash +Architecture: amd64 +Version: 9.0.1+~16.3-1ubuntu1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 14891 +Depends: libc6 (>= 2.42), libgcc-s1 (>= 4.2), libgmp10 (>= 2:6.3.0+dfsg), liblzo2-2 (>= 2.02), libmpfr6 (>= 3.1.3), libncursesw6 (>= 6), libsnappy1v5 (>= 1.2.2), libstdc++6 (>= 14), libtinfo6 (>= 6), libzstd1 (>= 1.5.5), binutils +Suggests: kexec-tools, makedumpfile +Filename: pool/crash_9.0.1+~16.3-1ubuntu1_amd64.deb +Size: 5180566 +MD5sum: 98bdcc5636671f952e7385ee856a8c15 +SHA1: 4b2e3e1d17dbfbfc4b6685dcb331259b978a4858 +SHA256: f233ef2a645cd77830b389e2168b75deec5ccc55cde0f342a7e20851ddbda0b0 +SHA512: 217727315b9268dafd5aa9315a80f455d0160292fdf63d93b9969b9723cad17a64d9be9277cc4e6fffc958ada8c779928fb93a6ba323ae97ec034f7c1383b021 +Homepage: https://crash-utility.github.io/ +Description: kernel debugging utility, allowing gdb like syntax + The core analysis suite is a self-contained tool that can be used to + investigate either live systems, or multiple different core dump formats + including kdump, LKCD, netdump and diskdump. + . + o The tool is loosely based on the SVR4 crash command, but has been + completely integrated with gdb in order to be able to display + formatted kernel data structures, disassemble source code, etc. + . + o The current set of available commands consist of common kernel core + analysis tools such as a context-specific stack traces, source code + disassembly, kernel variable displays, memory display, dumps of + linked-lists, etc. In addition, any gdb command may be entered, + which in turn will be passed onto the gdb module for execution. + . + o There are several commands that delve deeper into specific kernel + subsystems, which also serve as templates for kernel developers + to create new commands for analysis of a specific area of interest. + Adding a new command is a simple affair, and a quick recompile + adds it to the command menu. + . + o The intent is to make the tool independent of Linux version dependencies, + building in recognition of major kernel code changes so as to adapt to + new kernel versions, while maintaining backwards compatibility. + +Package: cron +Architecture: amd64 +Version: 3.0pl1-200ubuntu1 +Multi-Arch: foreign +Priority: important +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Georges Khaznadar +Installed-Size: 235 +Provides: cron-daemon +Pre-Depends: init-system-helpers (>= 1.54~), cron-daemon-common +Depends: libc6 (>= 2.38), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), sensible-utils, libpam-runtime +Suggests: anacron, logrotate, checksecurity, supercat, bat, default-mta | mail-transport-agent +Conflicts: bcron, cronie, systemd-cron +Replaces: bcron, cronie, systemd-cron +Filename: pool/cron_3.0pl1-200ubuntu1_amd64.deb +Size: 88556 +MD5sum: d571cecb65949ddae35bb13337a9629d +SHA1: f1a05500f133fa36eecc2dbc658a5ccd89ec15c6 +SHA256: 6b2b3b88313f35b30f50af59940c0b6ba82d992021585430763ffa3f71fb6b03 +SHA512: 195745735abba43edee4fad1210366b7c76db68c5794e8a3731cc10d40314df85f1bc74bc3ed6ac16c7a29fa1ca9776995e41d0e250286892d1de84594413214 +Homepage: https://ftp.isc.org/isc/cron/ +Description: process scheduling daemon + The cron daemon is a background process that runs particular programs at + particular times (for example, every minute, day, week, or month), as + specified in a crontab. By default, users may also create crontabs of + their own so that processes are run on their behalf. + . + Output from the commands is usually mailed to the system administrator + (or to the user in question); you should probably install a mail system + as well so that you can receive these messages. + . + This cron package does not provide any system maintenance tasks. Basic + periodic maintenance tasks are provided by other packages, such + as checksecurity. + +Package: cron-daemon-common +Architecture: all +Version: 3.0pl1-200ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: cron +Maintainer: Ubuntu Developers +Original-Maintainer: Georges Khaznadar +Installed-Size: 54 +Depends: systemd | systemd-standalone-sysusers | systemd-sysusers, adduser +Conflicts: bcron (<< 0.11-9.1), cron (<< 3.0pl1-140), cronie (<< 1.6.1-5), systemd-cron (<< 1.15.18-1.1) +Breaks: systemd-cron (<< 1.15.19-5~) +Replaces: bcron (<< 0.11-9.1), cron (<< 3.0pl1-140), cronie (<< 1.6.1-5), systemd-cron (<< 1.15.18-1.1) +Filename: pool/cron-daemon-common_3.0pl1-200ubuntu1_all.deb +Size: 15748 +MD5sum: f06cbbec2e882693891331517c1252d1 +SHA1: 7698e9e4a19f8363100c5cb5fb452ec613d9531a +SHA256: 1630217f880e7a6c1a689365fce3b75ce34a2f09f1688ca56d5e4063f9bd5d9c +SHA512: f29a733264203a468dff999fc62c911c209bef85cd1170f516d030a05e6e5eccf053bbf8a58122cd13f0089daac7c385f8d93051d2a13d8b2fd11cf339f59673 +Homepage: https://ftp.isc.org/isc/cron/ +Description: process scheduling daemon's configuration files + The cron daemon is a background process that runs particular programs at + particular times (for example, every minute, day, week, or month), as + specified in a crontab. By default, users may also create crontabs of + their own so that processes are run on their behalf. + . + This package provides configuration files which must be there to + define scheduled process sets. + +Package: cups +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 1040 +Depends: cups-client (>= 2.4.16-1ubuntu1.3), cups-common (>= 2.4.16-1ubuntu1.3), cups-core-drivers (>= 2.4.16-1ubuntu1.3), cups-daemon (>= 2.4.16-1ubuntu1.3), cups-filters, cups-ppdc, cups-server-common (>= 2.4.16-1ubuntu1.3), debconf (>= 0.5) | debconf-2.0, ghostscript, libcups2t64 (= 2.4.16-1ubuntu1.3), poppler-utils, procps, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5), libusb-1.0-0 (>= 2:1.0.16) +Recommends: avahi-daemon, colord +Suggests: cups-bsd, cups-pdf, foomatic-db-compressed-ppds | foomatic-db, smbclient, udev +Filename: pool/cups_2.4.16-1ubuntu1.3_amd64.deb +Size: 292606 +MD5sum: 0b9020931a427381041ea7151b4a7856 +SHA1: a59b8e61cd133f866d44ab53d20dc92852a2e9f1 +SHA256: c164caf8c9c5d41f056895f6737423ae57943cf23440889a4ca16042327f5add +SHA512: a279dbbbb38589146a2d908e65290af1dc4a4f15d1e110e254384db40629b92a37ce50f1380b1c34249ec90311845cdacd5fc91b8989379b493d1b51c7c2cf31 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - PPD/driver support, web interface + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the parts of CUPS which are needed for using printer + drivers. + +Package: cups-browsed +Architecture: amd64 +Version: 2.1.1-0ubuntu3 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 332 +Depends: cups-daemon, lsb-base, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libavahi-glib1 (>= 0.6.16), libc6 (>= 2.42), libcups2t64 (>= 2.0.2), libcupsfilters2t64 (>= 2.0~b4-0ubuntu1), libglib2.0-0t64 (>= 2.80.0), libppd2 (>= 2:2.0~b4-0ubuntu1) +Recommends: avahi-daemon +Breaks: cups-filters (<< 1.4.0~) +Replaces: cups-filters (<< 1.4.0~) +Enhances: cups +Filename: pool/cups-browsed_2.1.1-0ubuntu3_amd64.deb +Size: 118402 +MD5sum: 4a44ea7407b98665caa4e7e3b5b3e143 +SHA1: a54d46df19adcfa1426c76859bbb080006ed732f +SHA256: fca5e52a4504fe6672197635b800323273f2d8221b416a38604fa89f944950b3 +SHA512: ab55cdf0fad9e7616cdc4a8818f67c3079378f8eb5282644163d8f41564c045677d72ff4c13a6caca511a58187c819c5668cf74597c4fbe3551df8dca980e368 +Homepage: http://www.openprinting.org/ +Description: OpenPrinting cups-browsed + This package provides cups-browsed, a daemon which browses the Bonjour + broadcasts of shared remote CUPS printers and makes the printers + available locally, replacing the CUPS broadcasting/browsing which was + dropped in CUPS 1.6.x. This way the old behavior of having the remote + printers available automatically is now re-implemented with Bonjour. + . + cups-browsed is also useful with a CUPS >= 1.6 client to allow the + latter to browse the printer list of CUPS < 1.6 servers (by using the + old 'cups' protocol in BrowseRemoteProtocols). + . + cups-browsed is also useful with a CUPS >= 1.6 server to allow CUPS < + 1.6 clients to browse its printer list (by using the old 'cups' + protocol in BrowseLocalProtocols). + +Package: cups-bsd +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 135 +Provides: lpr +Depends: cups-client (= 2.4.16-1ubuntu1.3), cups-common (>= 2.4.16-1ubuntu1.3), debconf (>= 0.5) | debconf-2.0, libcups2t64 (= 2.4.16-1ubuntu1.3), libc6 (>= 2.38) +Suggests: cups, inetutils-inetd | inet-superserver, update-inetd +Conflicts: lpr, lprng +Replaces: lpr +Filename: pool/cups-bsd_2.4.16-1ubuntu1.3_amd64.deb +Size: 42324 +MD5sum: 0af3db9d321cf50517c2254be7c0df00 +SHA1: ddb7d6abea53f1dcd580e523beca67af543b48ff +SHA256: 26975659cba7ea97371a44c2ac34ce1813f4a691b715881f38b3a28f6f9f7757 +SHA512: c583c8f3dcb7990cf1495c4122992e23de9ede8c3eebb5bf05cdd862578e1a586a7f7e9a13c58d28d586740671df6203efaf0b18f922fa8d2fa62a4ca2f8f03e +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - BSD commands + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpr, lpd and the like. It supports the + Internet Printing Protocol (IPP), and has its own filtering driver + model for handling various document types. + . + This package provides the BSD commands for interacting with CUPS. It + is provided separately to allow CUPS to coexist with other printing + systems (to a small degree). + +Package: cups-client +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 437 +Depends: adduser, cups-common (>= 2.4.16-1ubuntu1.3), libcups2t64 (= 2.4.16-1ubuntu1.3), libc6 (>= 2.38) +Suggests: cups, cups-bsd, smbclient +Conflicts: lprng +Filename: pool/cups-client_2.4.16-1ubuntu1.3_amd64.deb +Size: 153692 +MD5sum: f0ee488fd13f272ed751ce5fbb0118ef +SHA1: 0aff43c1260b67c549aef96b35c07e5f387e4b42 +SHA256: cddb97968598f332299ca17a32137b0936b1b2d11c450fd48548732f805d0818 +SHA512: 785f8e63c8542833c43f5ae39508ececa52114f6f13af491875a042f3acc8300048446edf4c85b74af47688611e7dab092c3804204e192e2958465fa57b87e0c +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - client programs (SysV) + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the System V style print client programs. + +Package: cups-common +Architecture: all +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 4283 +Filename: pool/cups-common_2.4.16-1ubuntu1.3_all.deb +Size: 274412 +MD5sum: 89cd3e4948dfcfe4ec9e0599544981a9 +SHA1: 8be0f0a8e903283a17d75c8f22dbd8f759451246 +SHA256: 2059cf512e584786357d21d89701c67cf7e4e128f6f12e7bbc04a3cb2c408603 +SHA512: ebcf276c73920882cb91aead17e901d286ea462f218d4d0ea9f1c1d4fa2aaf9ba67c9a8cb29f1ee14e14c0a952f20b304718838d93faf093b3ee1212b3b588d6 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - common files + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides common files for CUPS server and client packages. + +Package: cups-core-drivers +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 129 +Depends: cups-daemon (>= 2.4.16-1ubuntu1.3), cups-filters-core-drivers, libcups2t64 (= 2.4.16-1ubuntu1.3), libc6 (>= 2.38) +Recommends: avahi-daemon +Breaks: cups-server-common (<< 2.1.0-7~) +Replaces: cups-server-common (<< 2.1.0-7~) +Filename: pool/cups-core-drivers_2.4.16-1ubuntu1.3_amd64.deb +Size: 28980 +MD5sum: d2aa990a3164f5d9d62722d3aac5ab3d +SHA1: 0b6dd5b81c1951e216115499aca99ede53675035 +SHA256: 7473dec4a2e4eef38861fec60188559cc5e9ebb06fa10290a3f044d1d66a7a63 +SHA512: c8126c0a04421ef2f6d4718119cb05f0562809165df057ce1260e946fb5a5be16743e8f90fd07c64c544c25f23b881920c3730e5b4e50a8dd00c46929e670dd0 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - driverless printing + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the parts of CUPS which are needed for driverless + printing on IPP printers with common data formats. + +Package: cups-daemon +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 916 +Depends: adduser, bc, libcups2t64 (= 2.4.16-1ubuntu1.3), lsb-base, procps, ssl-cert, libapparmor1 (>= 2.7.0~beta1+bzr1772), libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.22.0), libgssapi-krb5-2 (>= 1.17), libpam0g (>= 0.99.7.1), libpaper2 (>= 2.2.5), libsnapd-glib-2-1 (>= 1.61), libsystemd0 +Recommends: avahi-daemon, colord, cups-browsed, ipp-usb +Suggests: cups, cups-bsd, cups-client (>= 2.4.16-1ubuntu1.3), cups-common (>= 2.4.16-1ubuntu1.3), cups-filters, cups-pdf, cups-ppdc, cups-server-common (>= 2.4.16-1ubuntu1.3), foomatic-db-compressed-ppds | foomatic-db, ghostscript, poppler-utils, smbclient, udev +Breaks: cups (<< 2.1.0-6~) +Replaces: cups (<< 2.1.0-6~) +Filename: pool/cups-daemon_2.4.16-1ubuntu1.3_amd64.deb +Size: 366524 +MD5sum: 06a45961a12c3c38ea511be442648882 +SHA1: b97d651908a46f8208d06335390bd1eda696404e +SHA256: 570d4b6c925a999bf127fbb45c732331a2a57864b6889bc54f22ef3a2db10559 +SHA512: dba7349bbc9f61384144bd7080bfde5526f6049eb0dee7a6d00bfc3e4f78d57bca42fe7ad7274871cbe3262d6efe83fd38829329050806b4137da09194b44616 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - daemon + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the CUPS scheduler/daemon. + +Package: cups-filters +Architecture: amd64 +Version: 2.0.1-0ubuntu4.1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 834 +Provides: foomatic-filters, foomatic-filters-beh, ghostscript-cups +Depends: bc, cups-filters-core-drivers (>= 2.0.1-0ubuntu4.1), ghostscript, poppler-utils, libc6 (>= 2.42), libcups2t64 (>= 2.3~b6), libcupsfilters2t64 (>= 2.0~b4-0ubuntu1), libppd2 (>= 2:2.0~b4-0ubuntu1) +Recommends: colord, printer-driver-braille, liblouisutdml-bin | liblouis-bin +Suggests: antiword, docx2txt, foomatic-db-compressed-ppds | foomatic-db, imagemagick, lynx +Conflicts: foomatic-filters, foomatic-filters-beh, ghostscript-cups +Replaces: foomatic-filters, foomatic-filters-beh, ghostscript-cups +Filename: pool/cups-filters_2.0.1-0ubuntu4.1_amd64.deb +Size: 125098 +MD5sum: ab03b33f5cd6e2a5197f973f437bf8fd +SHA1: 4d3390fc104e4467b40c3e6f247f959e2fad0537 +SHA256: 36141549cc52bd2cf2a02eaebcf8646dc4c99bc57b57c06f5c4f749b28e78535 +SHA512: aafa402d196e29719458b5b6b864ffc568e474570e62aa39f69878ae7226c6ae228aa0679d2506cea8a6f30fe8b9024d8b3acefc4ef378416a94b4da320f5517 +Homepage: http://www.openprinting.org/ +Description: OpenPrinting CUPS Filters - Main Package + This package provides additional CUPS filters which are not provided + by the CUPS project itself. This includes filters for a PDF based + printing workflow. + . + This package contains the filters for printing with drivers/PPDs and + for converting non-PDF input files to PDF. + +Package: cups-filters-core-drivers +Architecture: amd64 +Version: 2.0.1-0ubuntu4.1 +Priority: optional +Section: net +Source: cups-filters +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 311 +Depends: bc, cups-ipp-utils, poppler-utils, libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libcupsfilters2t64 (>= 2.0~b4-0ubuntu1), libppd2 (>= 2:2.0~b4-0ubuntu1) +Breaks: cups-filters (<< 2.0.1-0ubuntu3) +Replaces: cups-filters (<< 2.0.1-0ubuntu3) +Filename: pool/cups-filters-core-drivers_2.0.1-0ubuntu4.1_amd64.deb +Size: 51190 +MD5sum: 1198c7b088467c7ec2a76b7a324390ff +SHA1: 8cf712fb8910527c46127388505bb0941cc2e328 +SHA256: c6e09dd33f33620f3cf9f1f71d50c5ce32b0ead0f8c516f3eff38f65f223df6b +SHA512: ee98b23289080a5b5d65b0c385626b3854abc6cb2df96c4c22f78103daf2a8c553a399c3fb2cad1a82a2a5e92844392f2525487281e1d1c7d462642dfe605736 +Homepage: http://www.openprinting.org/ +Description: OpenPrinting CUPS Filters - Driverless printing + This package provides additional CUPS filters which are not provided + by the CUPS project itself. This includes filters for a PDF based + printing workflow. + . + This package contains only the filters needed for driverless printing of + PDF input files on IPP printers with known, common languages (PDF, + PostScript, PWG Raster, Apple Raster, PCL). + +Package: cups-ipp-utils +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 994 +Depends: libcups2t64 (= 2.4.16-1ubuntu1.3), libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libpam0g (>= 0.99.7.1) +Recommends: avahi-daemon +Breaks: cups-client (<< 2.0.3-2~) +Replaces: cups-client (<< 2.0.3-2~) +Filename: pool/cups-ipp-utils_2.4.16-1ubuntu1.3_amd64.deb +Size: 232028 +MD5sum: 39cf54767c8d845d99963669456e23d1 +SHA1: e946cd697fd717ebdab6fcbe533cdafb03905316 +SHA256: d0b65f5076bdc542e714f69659559c3bc5f6104fb061d7b162a9cd90355da7ce +SHA512: ba4f5cd6236ce2b538d4fe2f71e4d4a54068a2379c3e97530aefbd1495b3cb4c2012ffd2c7cc1cb378ee629b7ea3703758985ff19db7b18f715dc9369ff87ce7 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - IPP developer/admin utilities + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides IPP utilities for developers and system administrators + +Package: cups-pk-helper +Architecture: amd64 +Version: 0.2.6-2.1build1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Group +Installed-Size: 300 +Pre-Depends: adduser +Depends: libc6 (>= 2.34), libcups2t64 (>= 1.6.0), libglib2.0-0t64 (>= 2.80.0), libpolkit-gobject-1-0 (>= 0.99) +Filename: pool/cups-pk-helper_0.2.6-2.1build1_amd64.deb +Size: 49076 +MD5sum: b9b73a1a196a876c8262a102b2befd7b +SHA1: 64824ca2e3fe6d78973433cc1123636a88ca1933 +SHA256: 034acb4da654cc54a3dbe1c6c9ffeda3218303b259f833a0fc442056d6b0af24 +SHA512: 7d676210c5c8af16a6ca6fcf9f4c71731769c521bd65f598096b42f3578135f73f8aae571f1723278003035b691bbdec48c661cab3f876485069385b196affd7 +Homepage: https://www.freedesktop.org/wiki/Software/cups-pk-helper +Description: PolicyKit helper to configure cups with fine-grained privileges + This package provides a PolicyKit helper to configure cups with + fine-grained privileges. For example, it's possible to let users + enable/disable printers without requiring a password, while still + requiring a password for editing printer settings. + +Package: cups-ppdc +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 469 +Depends: cups-common (>= 2.4.16-1ubuntu1.3), libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5) +Filename: pool/cups-ppdc_2.4.16-1ubuntu1.3_amd64.deb +Size: 120510 +MD5sum: e99035ee897241dd0767e23ab7fce48a +SHA1: aeeaeeec73e6389ee795e4464057107f824438b1 +SHA256: d64b410c16204a4c51dcf26ad326467356d10fb07d5f35e8067747e520eed3e9 +SHA512: 89f9de0bb7bf24c45718390b3f2a106153b407c87e77f09a19e319f40666b0ce4fb4b520fd18ea52fb143aee196768d7d7446af743779fca8c3eb76a7c1ab891 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - PPD manipulation utilities + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides utilities to generate and manipulate PPD files. + +Package: cups-server-common +Architecture: all +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 2389 +Filename: pool/cups-server-common_2.4.16-1ubuntu1.3_all.deb +Size: 415788 +MD5sum: 3ce068adcafacb300f19e48b6feb148e +SHA1: 46cc7873409b79af80472dd6b94253475a6259c7 +SHA256: 197fa1ab57a888c5013a5e7b8e9a6617a88bc11291a83ac13931415e07130d11 +SHA512: e4a8e501845f86945217f110661b1fa2141c2b148ef68eaa718ffd53c21b7108cff4bf6e119eb3a488eb89b335a8527df26581fb0bddec7f0f6c91874eb9277c +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - server common files + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides common files for CUPS server. + +Package: curl +Architecture: amd64 +Version: 8.18.0-1ubuntu2.5 +Multi-Arch: foreign +Priority: optional +Section: web +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Curl Maintainers +Installed-Size: 511 +Depends: libcurl4t64 (= 8.18.0-1ubuntu2.5), libc6 (>= 2.34), zlib1g (>= 1:1.1.4) +Recommends: bash-completion +Filename: pool/curl_8.18.0-1ubuntu2.5_amd64.deb +Size: 272202 +MD5sum: dce6d3269d7e5dfbbe931d3d2630e84d +SHA1: 6cf691869cf47b2ec3e980b1e0467a16543ae598 +SHA256: 646c41ecab7fa98ea99fb1957f73ce891d0d420e0aa138f8cc6f4b247ef5bde3 +SHA512: a7fdfbb2717509a048ffbbaa45bf0068429b059fcd93f252f74db2e45290ee6d47079ab6dbb96cfed3544938b3e765d1731789c093834b50c98116b7b610cf8d +Homepage: https://curl.se/ +Description: command line tool for transferring data with URL syntax + curl is a command line tool for transferring data with URL syntax, supporting + DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, + POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. + . + curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form + based upload, proxies, cookies, user+password authentication (Basic, Digest, + NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a + busload of other useful tricks. + +Package: dbus +Architecture: amd64 +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: standard +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 141 +Provides: dbus-system-bus (= 1.16.2-2ubuntu4), default-dbus-system-bus +Depends: dbus-bin (= 1.16.2-2ubuntu4), dbus-daemon (= 1.16.2-2ubuntu4), dbus-system-bus-common (>= 1.16.2-2ubuntu4), base-files (>= 13.4~), libc6 (>= 2.34), libdbus-1-3 (= 1.16.2-2ubuntu4), libexpat1 (>= 2.1~beta3) +Suggests: default-dbus-session-bus | dbus-session-bus +Filename: pool/dbus_1.16.2-2ubuntu4_amd64.deb +Size: 24152 +MD5sum: f6d81120b671057a3ee7d453c3bcbb40 +SHA1: 8ece0e85aa47a79d968298637afca6b89113101b +SHA256: 3e19a3e85d696b164a1a0e0419b919ceb19cd9d89b6fdbb0d1c4caa0f6e5e526 +SHA512: 1e26ffa136b84d3236430639dee0d23e6bee8c6000b2d8bd6fc15075fefa24298c10502ed915fb67c04a677caf8608b81c77059541b917c1cc6533a21eb31b7a +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (system message bus) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + D-Bus supports broadcast messages, asynchronous messages (thus + decreasing latency), authentication, and more. It is designed to be + low-overhead; messages are sent using a binary protocol, not using + XML. D-Bus also supports a method call mapping for its messages, but + it is not required; this makes using the system quite simple. + . + It comes with several bindings, including GLib, Python, Qt and Java. + . + This package provides a fully-functional D-Bus system bus with activation + support, used for communication between system services, and depends on + most of the other components of the reference implementation of D-Bus. + . + To provide a complete D-Bus session bus, install one of the packages + that implement the dbus-session-bus virtual package, such as + dbus-user-session. The recommended implementation is indicated by + the default-dbus-session-bus virtual package. + +Package: dbus-bin +Architecture: amd64 +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 193 +Depends: libc6 (>= 2.38), libdbus-1-3 (= 1.16.2-2ubuntu4) +Breaks: dbus (<< 1.13.18-2~) +Replaces: dbus (<< 1.13.18-2~) +Filename: pool/dbus-bin_1.16.2-2ubuntu4_amd64.deb +Size: 40052 +MD5sum: a5c1b4577c1f52850232149aded1430d +SHA1: 55c3b0ee6500585d11710bc25bd2367cb5c45d7c +SHA256: 9c191045a54eae56c583e4c29993ed75c521fbc18f312820387e0e8a514ab76a +SHA512: 11c6501ac77e70f1f8347c094b7d5f8e6657bb4182838b9ff5d21c7dfda8e318afc22c485f272f750c2a7dad8af9a3c47bb4e639675266ee00330a57eab96d2f +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (command line utilities) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + This package contains the D-Bus command-line utilities such as dbus-send + and dbus-monitor. + +Package: dbus-daemon +Architecture: amd64 +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 343 +Depends: dbus-bin (= 1.16.2-2ubuntu4), dbus-session-bus-common (>= 1.16.2-2ubuntu4), libapparmor1 (>= 2.8.94), libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcap-ng0 (>= 0.7.9), libdbus-1-3 (= 1.16.2-2ubuntu4), libexpat1 (>= 2.1~beta3), libselinux1 (>= 3.1~), libsystemd0 +Breaks: dbus (<< 1.13.18-2~) +Replaces: dbus (<< 1.13.18-2~) +Filename: pool/dbus-daemon_1.16.2-2ubuntu4_amd64.deb +Size: 118996 +MD5sum: 418221da9fa6ee61665f8eb10b5c9ed0 +SHA1: 120099c9a5d29c8a53d98ae90767c59275129feb +SHA256: 5e8b9f5527234cfb15f95f8449595e4118aa6a378f71b9472ba718c4e253508b +SHA512: 3e58aa8f967d0cd15a1723108bd28372fd53b1afa6cd28d3b8ae1148c1f9e1185ca8c3b6183e35dadbb36016777a8d17ec0fd7fdcdf4b2451797f145c2830b76 +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (reference message bus) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + This package contains dbus-daemon, the reference implementation of a + D-Bus message bus, and dbus-run-session, a utility to start a temporary + session dbus-daemon in a constrained environment or for automated tests. + . + To provide a complete D-Bus session bus, install one of the packages + that implement the dbus-session-bus virtual package, such as + dbus-user-session. The recommended implementation is indicated by + the default-dbus-session-bus virtual package. + +Package: dbus-session-bus-common +Architecture: all +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 83 +Breaks: dbus (<< 1.13.18-2~) +Replaces: dbus (<< 1.13.18-2~) +Filename: pool/dbus-session-bus-common_1.16.2-2ubuntu4_all.deb +Size: 54462 +MD5sum: 161b7272cebbcf9890f91e236b432c1f +SHA1: a6188ffd8d860c63dbb8c2be73e0a924286c8b19 +SHA256: c4debf213b12e178096ca1eb8c6afd6de74b425da998a7788c42252c1f99ef3d +SHA512: c9e3fc606776a0666cbdd925f6d0bebce9533e392dae15fc513f06c0d649b91a9ec2083f262d33cda564087c14911d8a000f0f2a5b44c5ee29495c014aa7c3dc +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (session bus configuration) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + This package contains the configuration files defining the behaviour of + the D-Bus session bus, used for applications and per-user services. + These are used by the reference implementation in the dbus package, + and by the reimplementation in the dbus-broker package. + . + To provide a complete D-Bus session bus, install one of the packages + that implement the dbus-session-bus virtual package, such as + dbus-user-session. The recommended implementation is indicated by + the default-dbus-session-bus virtual package. + +Package: dbus-system-bus-common +Architecture: all +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 94 +Depends: adduser (>= 3.130) | systemd-sysusers +Breaks: dbus (<< 1.13.18-2~) +Replaces: dbus (<< 1.13.18-2~) +Filename: pool/dbus-system-bus-common_1.16.2-2ubuntu4_all.deb +Size: 55898 +MD5sum: ad9a9d2a1349568e8d63a24b781b9de0 +SHA1: 9a83486e00acd3434fdf0fd9c1ca2a31e54e5f41 +SHA256: 96a330e99f4d130d3aa1842881488f507d11ec46d897f410fe7afad14ed8c3a4 +SHA512: 256b115c022d705283566b7ddf09e76cc9a77481b290b303d9be27691a322fcd61d0dc80145bf2d7a9881cd668f0339b10964c29d6beb9b8f1bdef5ba77d34eb +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (system bus configuration) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + This package contains the configuration files defining the behaviour of + the D-Bus system bus, used for system services such as networking and + storage management services. It is also responsible for creating the + 'messagebus' system user account used to run the system bus. + These are used by the reference implementation in the dbus package, + and by the reimplementation in the dbus-broker package. + . + To provide a complete D-Bus system bus, install one of the packages + that implement the dbus-system-bus virtual package, such as dbus. + The recommended implementation is indicated by the default-dbus-system-bus + virtual package. + +Package: dbus-user-session +Architecture: amd64 +Version: 1.16.2-2ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 87 +Provides: dbus-session-bus, default-dbus-session-bus +Depends: dbus-daemon (= 1.16.2-2ubuntu4) | dbus-broker, dbus-session-bus-common (>= 1.16.2-2ubuntu4), libpam-systemd, systemd +Recommends: systemd-sysv +Filename: pool/dbus-user-session_1.16.2-2ubuntu4_amd64.deb +Size: 9682 +MD5sum: 34a13aeb3996378cecf1b385147cde78 +SHA1: ba008a8d7703e83deace5639146b586cb4c4b8e5 +SHA256: cf0b0c4d223f3465df0e057f1a0810d69643a4d3e64734d72ce5e5b488a9618c +SHA512: 7fae2ad3773319288f560d18a5e942425a8a15c02e95ec46b3e1324f127a47340a64cd97d8491ed37e4366f2ad8fe1551638fefc120661a31be2b934e3edd78e +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (systemd --user integration) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + On systemd systems, this package opts in to the session model in which + a user's session starts the first time they log in, and does not end + until all their login sessions have ended. This model merges all + parallel non-graphical login sessions (text mode, ssh, cron, etc.), and up + to one graphical session, into a single "user-session" or "super-session" + within which all background D-Bus services are shared. + . + Multiple graphical sessions per user are not currently supported in this + mode; as a result, it is particularly suitable for gdm, which responds to + requests to open a parallel graphical session by switching to the existing + graphical session and unlocking it. + . + To retain dbus' traditional session semantics, in which login sessions + are artificially isolated from each other, remove this package and install + dbus-x11 instead. + . + See the dbus package description for more information about D-Bus in general. + +Package: dc +Architecture: amd64 +Version: 1.07.1-4build1 +Multi-Arch: foreign +Priority: standard +Section: math +Source: bc +Maintainer: Ubuntu Developers +Original-Maintainer: Ryan Kavanagh +Installed-Size: 130 +Depends: libc6 (>= 2.38) +Filename: pool/dc_1.07.1-4build1_amd64.deb +Size: 49626 +MD5sum: 2c04f94bfb9fd5ff494c39d8f53d0c44 +SHA1: d839af6e4e62feb71e6b15c65fc0385396c79138 +SHA256: e5e22aa8607bcafb64f03f9fa8c6494f32e33b76f6de3d3f6db40231ce6c92b8 +SHA512: 197b3da61582db4748f0cff3199bb65094c4388f1d628a4eba089a088b0d63fc879033590aedf5db04b26acdd830ae7658264b8670d85aa0094742fda2fbeb88 +Homepage: https://www.gnu.org/software/bc/ +Description: GNU dc arbitrary precision reverse-polish calculator + GNU dc is a reverse-polish desk calculator which supports unlimited + precision arithmetic. It also allows you to define and call macros. + . + A reverse-polish calculator stores numbers on a stack. Entering a number + pushes it on the stack. Arithmetic operations pop arguments off the + stack and push the results. + +Package: dconf-cli +Architecture: amd64 +Version: 0.49.0-4 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: dconf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 88 +Depends: libdconf1 (= 0.49.0-4), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0) +Conflicts: dconf +Filename: pool/dconf-cli_0.49.0-4_amd64.deb +Size: 28548 +MD5sum: 21bee05e1b8d219d67cc661c58f6e7ed +SHA1: 3aefb51506cd0c8f4a9f6efadb738efbc701fcc4 +SHA256: a79fb20ecbb95391aa5df2d2e8442200c150425a0800e89a0d806e196366e51f +SHA512: 293cce0e546345a5607114901e51f93f5e95ca7a91bd608050747e117be72e6c42f3503b916a0b98fe69f04bc70b537d2b038ddf28e916a530bfdb04241f5f81 +Homepage: https://wiki.gnome.org/Projects/dconf +Description: simple configuration storage system - utilities + DConf is a low-level key/value database designed for storing desktop + environment settings. + . + This package contains the command line tools. Note that DConf is not + connected with the older Debian package named dconf. + +Package: dconf-gsettings-backend +Architecture: amd64 +Version: 0.49.0-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: dconf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 74 +Provides: gsettings-backend +Depends: dconf-service (<< 0.49.0-4.1~), dconf-service (>= 0.49.0-4), libdconf1 (= 0.49.0-4), libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/dconf-gsettings-backend_0.49.0-4_amd64.deb +Size: 22172 +MD5sum: 313cba6e380f441833c81c0c0af3525d +SHA1: 70e026f8b09248e87e30a0c4b330210b3bc0bac6 +SHA256: 4da7b8309d49079ebac028c1f3284df02463da451cbd5f90ea61e535534531ac +SHA512: bfd4d5340ae63f3f4994b298b7c24dce4624ccfc1eff1c4daa65057a234f5f84eefd4cb19b5ba0dacb58ac013935d3f0f75d7bc075befb5450026b98e77bc79a +Homepage: https://wiki.gnome.org/Projects/dconf +Description: simple configuration storage system - GSettings back-end + DConf is a low-level key/value database designed for storing desktop + environment settings. + . + This package contains a back-end for GSettings. It is needed by + applications accessing settings through GSettings to set custom values + and listen for changes. + +Package: dconf-service +Architecture: amd64 +Version: 0.49.0-4 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: dconf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 97 +Depends: default-dbus-session-bus | dbus-session-bus, libdconf1 (= 0.49.0-4), procps, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.83.0) +Recommends: dconf-gsettings-backend +Filename: pool/dconf-service_0.49.0-4_amd64.deb +Size: 27696 +MD5sum: dcd25cbe5be756e53d13fa1697dedd8b +SHA1: 690a1e7d870906803deb8541ab16b9c723460e33 +SHA256: 7f247f6032e72f86b1877f0020de77a0f8a11de256cf8f1726c072cf09585d31 +SHA512: 98db874a96b3230a1b0534489d67476290663be8a4bab42c2d606dc30dca88de4c6313cae80a49dfac5633e95578ac4b57e0f72ecfb71a70429562e5adc7eab9 +Homepage: https://wiki.gnome.org/Projects/dconf +Description: simple configuration storage system - D-Bus service + DConf is a low-level key/value database designed for storing desktop + environment settings. + . + This package contains the DConf service, which applications talk to + using D-Bus in order to obtain their settings. It is mostly used by the + GSettings backend. + +Package: desktop-file-utils +Architecture: amd64 +Version: 0.28-1build1 +Multi-Arch: foreign +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 247 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.50.0) +Filename: pool/desktop-file-utils_0.28-1build1_amd64.deb +Size: 54312 +MD5sum: f03571edb1663f8293df03c811b13d77 +SHA1: df3c51919626c594e8b2e51ccd59a0183d4e1ca4 +SHA256: 4bc2c38ed9722d6ccdc7b27e77852f35363d06b8a8d786856aed4ffea98840b7 +SHA512: 89425102d33e3b841fe0aeb58ba0cfcbf5cc21487decf6f03280d75c592318ce87a34ddc559d282886e5b67e9ddbda452b93f4c56ee1dd7084049495b40d4f8e +Homepage: https://www.freedesktop.org/wiki/Software/desktop-file-utils +Description: Utilities for .desktop files + Some utilities to make dealing with .desktop files easier: + * update-desktop-database -- update the desktop-MIME mapping + * desktop-file-validate -- validate a desktop file + * desktop-file-install -- install a desktop file, munging en route. + +Package: dhcpcd-base +Architecture: amd64 +Version: 1:10.3.0-7 +Priority: important +Section: net +Source: dhcpcd +Maintainer: Ubuntu Developers +Original-Maintainer: Martin-Éric Racine +Installed-Size: 537 +Provides: dhcp-client +Depends: systemd | systemd-standalone-sysusers | systemd-sysusers, libc6 (>= 2.42), libssl3t64 (>= 3.0.0), libudev1 (>= 183) +Suggests: openresolv | resolvconf | systemd-resolved +Breaks: dhcpcd5 (<< 1:10.3.0-7~) +Replaces: dhcpcd5 (<< 1:10.3.0-7~) +Filename: pool/dhcpcd-base_1%3a10.3.0-7_amd64.deb +Size: 227896 +MD5sum: 66f423b2b07ed82919b0d64a9d60490a +SHA1: c3f22d0f03b3964ed69b338dad1aa4a654f33f4d +SHA256: 8b58af259355e50864c650dca5f07fc81cd1e3ad87fc5b813048a4653daaefd2 +SHA512: 593641690bd6adf4a43541acd5da46e3c8ea24c8816a62412b05bf9edc4d477d6b827f3db99ce6fecf8ba1132606232adf87c8730368b9ca5f5225e441e079a1 +Homepage: https://github.com/NetworkConfiguration/dhcpcd +Description: DHCPv4 and DHCPv6 dual-stack client (binaries and exit hooks) + dhcpcd provides seamless IPv4 and IPv6 auto-configuration: + * DHCPv4 client + * DHCPv6 client with Prefix Delegation (PD) support + * IPv4LL support (ZeroConf) + * IPv6RS support (SLAAC) + * ARP address conflict resolution + * ARP ping profiles + * Wireless SSID profiles + . + This package provides the binaries, exit hooks and manual pages. + . + It offers a dual-stack substitute for ISC DHCP Client (dhclient) on systems + where interfaces are configured by ifupdown via + using the DHCP method. + . + The init.d script and systemd service required for systems without ifupdown + are packaged separately as dhcpcd. + . + Since Debian 12 (Bookworm), dhcpcd uses Predictable Network Interface Names + on Linux ports. See NEWS.Debian for more details. + +Package: dictionaries-common +Architecture: all +Version: 1.31.4 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Agustin Martin Domingo +Installed-Size: 717 +Provides: openoffice.org-updatedicts +Depends: debconf (>= 0.5) | debconf-2.0, libtext-iconv-perl, emacsen-common +Suggests: ispell | aspell | hunspell, wordlist +Breaks: myspell-ca (<= 0.6-10), myspell-cs-cz (<= 20040229-5), myspell-de-de-oldspell (<= 1:2-27), myspell-eu-es (<= 0.4.20081029-4), myspell-fi (<= 0.7-17.3), myspell-gl-es (<= 2.2a-8), myspell-ku (<= 0.20.0-1.1), myspell-nl (<= 1:2.0-1), myspell-nr (<< 20070206-4ubuntu1), myspell-ns (<< 20070206-4ubuntu1), myspell-sl (<< 1.0-3ubuntu1), myspell-ss (<< 20070206-4ubuntu1), myspell-tn (<< 20070206-4ubuntu1), myspell-ts (<< 20070207-4ubuntu1), myspell-ve (<< 20070206-3ubuntu1), myspell-xh (<< 20070206-4ubuntu1), myspell-zu (<< 20070207-5ubuntu1), openoffice.org-thesaurus-it (<< 2.0.7.gh.deb1-1.1ubuntu3) +Replaces: openoffice.org-updatedicts +Filename: pool/dictionaries-common_1.31.4_all.deb +Size: 176602 +MD5sum: 4018f98667f50e85d0067fbadb51e192 +SHA1: 4176959257495c38773625835e664e0e521991d7 +SHA256: 465aa924e33faecfacf7925f6fb7ab92ecb97505e6bf204db34b93ee5a3fa749 +SHA512: b0c957db0ff067f47e74882c2d4d4b4cb91d649588b1be1298e251b750b45173b13d65a24bea77ce9bebaf9a1a321f59f86dc69e60a4d721028aa5d94f8c88cd +Homepage: https://salsa.debian.org/debian/dictionaries-common +Description: spelling dictionaries - common utilities + This package provides utilities shared between all wordlists and spelling + dictionaries for Ispell, Aspell, or MySpell/Hunspell. It also includes + support infrastructure for software using them (such as JED and Mutt), + and some patched spell-checking Lisp files for better Emacs integration. + . + More information about the availability of these dictionaries and their + naming conventions is available in the README.Debian file. + +Package: distro-info +Architecture: amd64 +Version: 1.15 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Benjamin Drung +Installed-Size: 71 +Depends: distro-info-data (>= 0.59~), libc6 (>= 2.34) +Suggests: shunit2 +Filename: pool/distro-info_1.15_amd64.deb +Size: 20232 +MD5sum: 928944600c3bcba3d35629025ea4dfc6 +SHA1: 05bca03634b121416518702068466e801583a1d4 +SHA256: 9d65499fef4fa9b558ea25a5cfa232d1b96c2c1b52a62919c403e8f7e78700e5 +SHA512: 504a9c1bfe7d6790b30840f82a8dfa712a02d24a203e870f1d8c177f6d730ccb03e7c4324d71b3c58139262014cb590ebd66c1e430c79bf5e2fc66267e76389b +Description: provides information about the distributions' releases + Information about all releases of Debian and Ubuntu. The distro-info script + will give you the codename for e.g. the latest stable release of your + distribution. To get information about a specific distribution there are the + debian-distro-info and the ubuntu-distro-info scripts. + +Package: distro-info-data +Architecture: all +Version: 0.72-0ubuntu0.26.04.1 +Multi-Arch: foreign +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Benjamin Drung +Installed-Size: 20 +Breaks: distro-info (<< 1.0~) +Filename: pool/distro-info-data_0.72-0ubuntu0.26.04.1_all.deb +Size: 6118 +MD5sum: 402a8be56a7301bc80ac0daed84dc711 +SHA1: aa81f796cff78b58f4a10c4b032c08cff51f874b +SHA256: 7dc20e15aa612cbc8cde8b9f07612e462232b57dd81bfdc134d2062f8d7bd90f +SHA512: 60f07b9a340ae34f59e4dcca778d8a6136a03b84e69f1aca12d17972540091a829581175e52f259414382bdfe8f5b95324e4d659fbf26a7568e3e186eae844c0 +Homepage: https://salsa.debian.org/debian/distro-info-data +Description: information about the distributions' releases (data files) + Information about all releases of Debian and Ubuntu. The distro-info script + will give you the codename for e.g. the latest stable release of your + distribution. To get information about a specific distribution there are the + debian-distro-info and the ubuntu-distro-info scripts. + . + This package contains the data files. + +Package: dmidecode +Architecture: amd64 +Version: 3.6-2ubuntu1 +Multi-Arch: foreign +Priority: important +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 227 +Depends: libc6 (>= 2.38) +Filename: pool/dmidecode_3.6-2ubuntu1_amd64.deb +Size: 72828 +MD5sum: c95e1b01ec8b5aaf9a8d0be2c014a267 +SHA1: 263ab29676ba73215bdfc3e018fe5c503c5c5f4d +SHA256: 36ac8fce0b6a4f16faaa824faa67501487f0c91e7b8d24993b3c3e7b4d46073d +SHA512: d83124959e194bc29d688204babcf5dbf0d4b744c247a05bd4126430649488adcac1efd39c3d712979277aeb9046cd08ec48d5cad94cc6d506a70f6bd4df1a8b +Homepage: https://nongnu.org/dmidecode/ +Description: SMBIOS/DMI table decoder + Dmidecode reports information about the system's hardware as described in the + system BIOS according to the SMBIOS/DMI standard. + . + This information typically includes system manufacturer, model name, serial + number, BIOS version, asset tag as well as a lot of other details of varying + level of interest and reliability depending on the manufacturer. This will + often include usage status for the CPU sockets, expansion slots (e.g. AGP, PCI, + ISA) and memory module slots, and the list of I/O ports (e.g. serial, parallel, + USB). + . + Beware that DMI data have proven to be too unreliable to be blindly trusted. + Dmidecode does not scan the hardware, it only reports what the BIOS told it to. + +Package: dmsetup +Architecture: amd64 +Version: 2:1.02.205-2ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: lvm2 (2.03.31-2ubuntu3) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian LVM Team +Installed-Size: 254 +Depends: libc6 (>= 2.38), libdevmapper1.02.1 (>= 2:1.02.197) +Filename: pool/dmsetup_2%3a1.02.205-2ubuntu3_amd64.deb +Size: 79372 +MD5sum: 57c7f833c744ce34467af40619e09aa9 +SHA1: 70ee5f4fe943a1f9e06ace7459b036472eaf9d2d +SHA256: a90c4e24ec00bf166071860671f195b5240b56b9a583813af551a0b68f629a36 +SHA512: f21f8abe975b52f90875dfc9669d186bb9198122afd1c24a8d1925fb6a9f758282eb3cf6e6bd1f1f1e1d9cda216e490c4b607783bddc7a971606858af0f486bb +Homepage: https://sourceware.org/lvm2/ +Description: Linux Kernel Device Mapper userspace library + The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management) + Team's implementation of a minimalistic kernel-space driver that handles + volume management, while keeping knowledge of the underlying device layout + in user-space. This makes it useful for not only LVM, but software raid, + and other drivers that create "virtual" block devices. + . + This package contains a utility for modifying device mappings. + +Package: dmz-cursor-theme +Architecture: all +Version: 0.4.5.3build1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3567 +Filename: pool/dmz-cursor-theme_0.4.5.3build1_all.deb +Size: 247860 +MD5sum: 927ddd2282843f8a89cf43e9848f0ba5 +SHA1: 472020eeb78eff45980489ebabe3baea785f65d7 +SHA256: 85a8b3b0ce547fdbe3dce6e8721ebd1e7a124343e670375a5aa8c50e41bb0f6d +SHA512: 5fe8e636ce2e730bf686052d487bb4e967ffa4cf9f00a2d5e613df4037cfa80d9b7f4e140ee308dc7e05bb2724eda5535ed595c2dd5c843975a0258946289695 +Description: Style neutral, scalable cursor theme + This package contains the DMZ cursor themes, which are derived from + the Industrial theme developed for the Ximian GNOME desktop. Black and + white cursors are provided, in scalable formats. + +Package: dns-root-data +Architecture: all +Version: 2025080400build1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: dns-root-data packagers +Installed-Size: 19 +Filename: pool/dns-root-data_2025080400build1_all.deb +Size: 6022 +MD5sum: a8bd0fbf9da5eb97dfb2baee707a3b5b +SHA1: 0d416bc655528bb7564b06c4f25e1edf3137f03c +SHA256: f246a598331f362860f1360792cf497372a07d84dd0d3dabc2a9344d7d6d5f83 +SHA512: 0c2271f5ddcc018e12223985e057251b615e9fa81d012451f14017e4d82d107b6af41bada64057caf966a6a2e4d9415f59a7667751b6af8147439908cdc9702f +Homepage: https://data.iana.org/root-anchors/ +Description: DNS root hints and DNSSEC trust anchor + This package contains various root zone related data as published + by IANA to be used by various DNS software as a common source + of DNS root zone data, namely: + . + * Root Hints (root.hints) + * Root Trust Anchors (root.key, root.ds) + +Package: dnsmasq-base +Architecture: amd64 +Version: 2.92-1ubuntu0.4 +Multi-Arch: foreign +Priority: optional +Section: net +Source: dnsmasq +Maintainer: Ubuntu Developers +Original-Maintainer: Simon Kelley +Installed-Size: 920 +Provides: dnsmasq-base +Depends: passwd, libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libgmp10 (>= 2:6.3.0+dfsg), libhogweed6t64 (>= 2.4-3), libidn2-0 (>= 2.0.0), libnetfilter-conntrack3 (>= 1.0.1), libnettle8t64 (>= 2.4-3), libnftables1 (>= 1.0.2) +Recommends: dns-root-data +Conflicts: dnsmasq-base-lua +Breaks: dnsmasq (<< 2.63-1~) +Replaces: dnsmasq (<< 2.63-1~), dnsmasq-base +Filename: pool/dnsmasq-base_2.92-1ubuntu0.4_amd64.deb +Size: 438978 +MD5sum: 31d603d64d150351bfd47353ea2b7c81 +SHA1: a8c703a097b7c05c36ca52bb654fea02614e936d +SHA256: fef2ce81dc80dd9099ab0539d169c7f0c2178946c9bb1cc2b9a263c1b00de5ea +SHA512: 308098dbb9e5bf2f35973b2d562f967f96703112745627ba46eeb5d7bf77e7368120c5aa2b7741b14a5771f616eed910f5ef4f8343164597f62ba3f69e7dcc27 +Homepage: https://www.thekelleys.org.uk/dnsmasq/doc.html +Description: Small caching DNS proxy and DHCP/TFTP server - executable + This package contains the dnsmasq executable and documentation, but + not the infrastructure required to run it as a system daemon. For + that, install the dnsmasq package. + +Package: docbook-xml +Architecture: all +Version: 4.5-13build1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 2127 +Provides: docbk-xml +Depends: sgml-data, xml-core (>= 0.14), sgml-base (>= 1.28) +Suggests: docbook, docbook-defguide, docbook-dsssl, docbook-xsl +Filename: pool/docbook-xml_4.5-13build1_all.deb +Size: 73994 +MD5sum: 325329c4a8e56ea37f1bd81118da818d +SHA1: 798bc7e5582156bf389566bca1709658f1b11826 +SHA256: 7e8e0c6b5204aa8816683d29d7f7ca9280cbc866838a4f62adb497e9886a6ae5 +SHA512: 395beb81bedf093510cf89c6dd5d48aec8bca2f6229140b7af7be39f29477812c9da4c64298c0ff1fe3ae649016c46f170f9820bc04e590faa335be8b58b6fd6 +Homepage: https://docbook.org/schemas/4x.html +Description: standard XML documentation system for software and systems + DocBook is an XML document type definition (DTD). That is, it + contains the "DocBook" document structure. This is used by authors + or editors writing documents in the DocBook XML format. DocBook was + designed for books, articles, or reference documentation about + technical matters or software. It has emerged as an open, standard + DTD in the software industry, and is the documentation system of + choice for many free software projects. + . + This package contains the XML DTD for DocBook, which describes the + formal structure for documents following this format. If you wish to + author DocBook documents using SGML rather than XML, use the + 'docbook' package. You will need other packages in order to edit + (psgml), validate (opensp, libxml2-utils) or format (docbook-xsl, + docbook-dsssl) DocBook documents. + . + This package ships with the latest DocBook 4.5 XML DTD, as well as a + selected set of legacy DTDs for use with older documents, including + 4.0, 4.1.2, 4.2, 4.3 and 4.4. + +Package: docker-buildx-plugin +Architecture: amd64 +Version: 0.37.1-1~ubuntu.26.04~resolute +Priority: optional +Section: admin +Maintainer: Docker +Installed-Size: 71358 +Replaces: docker-ce-cli +Enhances: docker-ce-cli +Filename: pool/docker-buildx-plugin_0.37.1-1~ubuntu.26.04~resolute_amd64.deb +Size: 17271368 +MD5sum: 947e77c86210a1c501a9ea52f940b4e8 +SHA1: f7c76f82cefb91d451dd84e40a9d4b6758c3993e +SHA256: 7d74d16440db560d3dc45d5f7ac83fb2cefb964f4edfabf82dd17a804ac42331 +SHA512: c69c3aba72dbe5191a5484339fe65e17867aea8b3aeff5f2671fb32726310e9ad6a33ac2283fed23b53e76a3ba25c598cb40afb4394c99fc9e341eb4c6b3ee27 +Homepage: https://github.com/docker/buildx +Description: Docker Buildx plugin extends build capabilities with BuildKit. + +Package: docker-ce +Architecture: amd64 +Version: 5:29.8.1-1~ubuntu.26.04~resolute +Priority: optional +Section: admin +Maintainer: Docker +Installed-Size: 112484 +Pre-Depends: init-system-helpers (>= 1.54~) +Depends: containerd.io (>= 2.1.5), docker-ce-cli, iptables, nftables, libc6 (>= 2.34), libsystemd0 +Recommends: apparmor, ca-certificates, docker-ce-rootless-extras, git, pigz, procps, xz-utils +Suggests: cgroupfs-mount | cgroup-lite +Conflicts: docker.io +Replaces: docker-ce-cli (<< 5:28.0.0) +Filename: pool/docker-ce_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +Size: 24339208 +MD5sum: dc4d392f5a18c8d54e7235790923661f +SHA1: 40e7e3b10ae08b56bf7701a81ad8b6b6fd6756e0 +SHA256: 9a07ee2e75ebe60f7be95ea27a0d5b5358f8ed01ea93ef91c17ee1eed2eba9b8 +SHA512: 7a821b8a34f36fcc82370f640d43d63085967eaaacbd3727db30bede75831bdab4932f2342fecaf3069e3d4475a6fdd4fa32dd9fd19f41e002db15d6e730cafe +Homepage: https://www.docker.com +Description: Docker: the open-source application container engine + Docker is a product for you to build, ship and run any application as a + lightweight container + . + Docker containers are both hardware-agnostic and platform-agnostic. This means + they can run anywhere, from your laptop to the largest cloud compute instance + and everything in between - and they don't require you to use a particular + language, framework or packaging system. That makes them great building blocks + for deploying and scaling web apps, databases, and backend services without + depending on a particular stack or provider. + +Package: docker-ce-cli +Architecture: amd64 +Version: 5:29.8.1-1~ubuntu.26.04~resolute +Priority: optional +Section: admin +Source: docker-ce +Maintainer: Docker +Installed-Size: 46456 +Depends: libc6 (>= 2.34) +Recommends: docker-buildx-plugin, docker-compose-plugin +Suggests: docker-model-plugin +Conflicts: docker-cli, docker.io +Breaks: docker-ce (<< 5:0) +Replaces: docker-ce (<< 5:0) +Filename: pool/docker-ce-cli_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +Size: 17552060 +MD5sum: d36f6377d30dc92fa2ee9fbd645ca62b +SHA1: ef46f34f2fc997fe027159b776123ef265931502 +SHA256: 3569f6f998c101c499884fc3d1f0d2696a37ae1db381cc1f5cfe4ca4cda143fa +SHA512: 46c588530bce16b1cf90f10b4603c2000ac0a9333c8f4eb5e7d1040568281946bee4f4960d7bafbc55a70471de5e25951ecf5ccf306bd23a041953bdc05145f4 +Homepage: https://www.docker.com +Description: Docker CLI: the open-source application container engine + Docker is a product for you to build, ship and run any application as a + lightweight container + . + Docker containers are both hardware-agnostic and platform-agnostic. This means + they can run anywhere, from your laptop to the largest cloud compute instance + and everything in between - and they don't require you to use a particular + language, framework or packaging system. That makes them great building blocks + for deploying and scaling web apps, databases, and backend services without + depending on a particular stack or provider. + +Package: docker-ce-rootless-extras +Architecture: amd64 +Version: 5:29.8.1-1~ubuntu.26.04~resolute +Priority: optional +Section: admin +Source: docker-ce +Maintainer: Docker +Installed-Size: 25441 +Depends: dbus-user-session, libc6 (>= 2.34) +Conflicts: rootlesskit +Breaks: rootlesskit +Replaces: rootlesskit +Enhances: docker-ce +Filename: pool/docker-ce-rootless-extras_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +Size: 10182052 +MD5sum: 152c7a4ea598fc04750149daba6bedb9 +SHA1: d9dcd0eceeeeb1677e96ea2b6c072bc262c5b724 +SHA256: f97a8dcdb4b5e489e53be3283d58fcd136e918b5b6027ca7f9a5d436d24966ba +SHA512: 36a53adfe3d1e6d4a80bdbe4b6e654bfffb1d65fbc664014b017cf59a94e68aa1b1b18842f9945768c5d798da661e06b4079a7e081e8cea03e7f7c8a6c73dbf3 +Homepage: https://docs.docker.com/go/rootless/ +Description: Rootless support for Docker. + Use dockerd-rootless.sh to run the daemon. + Use dockerd-rootless-setuptool.sh to setup systemd for dockerd-rootless.sh. + +Package: docker-compose-plugin +Architecture: amd64 +Version: 5.5.1-1~ubuntu.26.04~resolute +Priority: optional +Section: admin +Maintainer: Docker +Installed-Size: 31590 +Recommends: docker-buildx-plugin (>= 0.17.0) +Enhances: docker-ce-cli +Filename: pool/docker-compose-plugin_5.5.1-1~ubuntu.26.04~resolute_amd64.deb +Size: 8012592 +MD5sum: 8709cfdb01a691806f28764402b453bd +SHA1: 78ea6359bb964ef0cc862333ae0be22a67d2b466 +SHA256: 49b640226e70a6193ddea8115bec3e1b99493c50a15ac3b7d46d2ec6abeb5464 +SHA512: eb63696d82f1adc14c10f61af0c4389e0b4f63a680a1a845a2a1a19b2587696d24323117039165bb9091b4938bbfce7e781f0fcbcca365a90d19f2a4e4493efd +Homepage: https://github.com/docker/compose +Description: Docker Compose (V2) plugin for the Docker CLI. + . + This plugin provides the 'docker compose' subcommand. + . + The binary can also be run standalone as a direct replacement for + Docker Compose V1 ('docker-compose'). + +Package: dosfstools +Architecture: amd64 +Version: 4.2-1.2build1 +Priority: optional +Section: otherosfs +Maintainer: Ubuntu Developers +Original-Maintainer: Andreas Bombe +Installed-Size: 244 +Depends: libc6 (>= 2.38) +Filename: pool/dosfstools_4.2-1.2build1_amd64.deb +Size: 87860 +MD5sum: 9274be861b0848dd8caad8b123d3ee14 +SHA1: 6778b399124ed915a0078a3edf5fbff978ca84eb +SHA256: 6b1b2bba6458ca4444cae467db7faff6fd2f350373a95be23333d76dd019c58f +SHA512: 5a363b2cd055b824c4c37cc0104ec1946c885924b5153176b3a23c5550dbf33f467eb9d92f77618dd4ff8ef40bab38bf828306b5bed00a3497b3bed18d03a34c +Homepage: https://github.com/dosfstools/dosfstools +Description: utilities for making and checking MS-DOS FAT filesystems + The dosfstools package includes the mkfs.fat and fsck.fat utilities, which + respectively make and check MS-DOS FAT filesystems. + +Package: dracut +Architecture: all +Version: 110-11ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 45 +Provides: linux-initramfs-tool +Depends: dracut-core (<< 110-11ubuntu0.1+b+~), dracut-core (>= 110-11ubuntu0.1), linux-base +Suggests: dracut-network +Conflicts: initramfs-tools, live-tools +Filename: pool/dracut_110-11ubuntu0.1_all.deb +Size: 8240 +MD5sum: 2eabf657a73c1537cc352cee635f6d98 +SHA1: c1a9f1bf974e4654aad6a57eb89b38ae567c1948 +SHA256: 5c889098b7cf533851be933feea66587dd637c2f5de8b1b9009f824d1fc732da +SHA512: c2f995692392d7ac69eedd06e203dfa8b114d31d3d8c0f16546fba5f6c22140082f037eb3311399a67b1a8c19235ea8daabc16510ae54d320c359d50a5822321 +Homepage: https://github.com/dracut-ng/dracut-ng/wiki +Description: Initramfs generator using udev + This package builds a bootable initramfs for Linux kernel packages. The + initramfs is loaded along with the kernel and is responsible for + mounting the root filesystem and starting the main init system. + +Package: dracut-core +Architecture: amd64 +Version: 110-11ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: dracut +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 1279 +Provides: dracut-live +Depends: 3cpio | cpio, dracut-install, e2fsprogs, kmod, systemd-sysv | initscripts | sysvinit-core, udev, libc6 (>= 2.38) +Recommends: binutils, console-setup, systemd, zstd +Suggests: cryptsetup, dmsetup, isomd5sum, kpartx, lvm2, mdadm, parted, squashfs-tools, systemd-cryptsetup +Breaks: dracut-live (<< 109-10~), dracut-network (<< 057+157-2), dracut-squash, rust-coreutils (<< 0.5.0) +Replaces: dracut-live (<< 109-10~), dracut-network (<< 057+157-2), dracut-squash +Filename: pool/dracut-core_110-11ubuntu0.1_amd64.deb +Size: 329650 +MD5sum: bfb603bba09b6e154e98c6b9dfa5b9ba +SHA1: 2eec84622cc44b0e6c7e87f6d217cb8ac8c4a132 +SHA256: a8b9af489e0968620246dbbbbb6e211e49e2f4df0d28de98af22fb860ab7c0b0 +SHA512: fbb27891b6be88048f2125c1b7e9f01c5f8a4f389956198481e1b43a276c8f33f84bfb5477837f424085ce90d67598f65a87f7987f21bbe77c8db83799a38e38 +Homepage: https://github.com/dracut-ng/dracut-ng/wiki +Description: dracut is an event driven initramfs infrastructure (core tools) + Unlike existing initramfs's, this is an attempt at having as little as + possible hard-coded into the initramfs as possible. The initramfs has + (basically) one purpose in life -- getting the rootfs mounted so that + it can transition to the real rootfs. This is all driven off of + device availability. Therefore, instead of scripts hard-coded to do + various things, it depends on udev to create device nodes and + to detect the rootfs. + Having the root on MD, LVM2, LUKS is supported as well as NFS, iSCSI, + NBD and FCOE with dracut-network. + . + These Dracut modules need suggested packages: + * crypt: cryptsetup or systemd-cryptsetup + * dm: dmsetup + * dmraid: kpartx + * dmsquash-live: isomd5sum (optionally) + * dmsquash-live-autooverlay: parted + * dracut-systemd: systemd-cryptsetup (when crypt and systemd are used) + * lvm: lvm2 + * lvmmerge: lvm2 + * lvmthinpool-monitor: lvm2 + * mdraid: mdadm + * multipath: kpartx + * squash-squashfs: squashfs-tools + * systemd-cryptsetup: systemd-cryptsetup + +Package: dracut-install +Architecture: amd64 +Version: 110-11ubuntu0.1 +Priority: optional +Section: utils +Source: dracut +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 108 +Depends: libc6 (>= 2.38), libkmod2 (>= 33~), libsystemd0 (>= 257~rc1) +Breaks: dracut-core (<< 060+5-7~) +Replaces: dracut-core (<< 060+5-7~) +Filename: pool/dracut-install_110-11ubuntu0.1_amd64.deb +Size: 46256 +MD5sum: 1dc3f779902f7a89bc2146858c33f60f +SHA1: ade0d445ffdaa03b0efd051cb78db7faf1e77c53 +SHA256: c4f00013b155a28c726eff14d1d00f70658ba00d5ab874246179d0bd4a72b7dd +SHA512: a47ab9e939904a4be0c3d486782bcaa3b104007783859fdd9a96830292d8a8d24e19149f9fb7fc8508d679aef9f9fc2984f5eee4db3dcce468bc765afb8e7ece +Homepage: https://github.com/dracut-ng/dracut-ng/wiki +Description: dracut is an event driven initramfs infrastructure (dracut-install) + This package just contains the dracut-install command to be used by + initramfs generating tools. + +Package: eatmydata +Architecture: all +Version: 131-2build1 +Priority: optional +Section: utils +Source: libeatmydata +Maintainer: Ubuntu Developers +Original-Maintainer: Mattia Rizzolo +Installed-Size: 21 +Depends: libeatmydata1 (>= 131-2build1) +Filename: pool/eatmydata_131-2build1_all.deb +Size: 5596 +MD5sum: b187032453cfc85badc8164202da6883 +SHA1: b485ee85d2bd6d7a3f392dbb7c5abf37ffd51bb6 +SHA256: f21c9721593142db551fb2671e44c3bc4694a50a9880cd3687eb8700c7eb1186 +SHA512: 31ecd25497cfa80e2e391dc7d3f3448e27adb0af53f7464783d4bcdec84e49742afddd5442dd1fb0a07d8ef0775c7158e9f5a583b93f78d28686aecbfd0792f1 +Homepage: https://www.flamingspork.com/projects/libeatmydata/ +Description: Library and utilities designed to disable fsync and friends + This package contains a small LD_PRELOAD library (libeatmydata) and a couple + of helper utilities designed to transparently disable fsync and friends (like + open(O_SYNC)). This has two side-effects: making software that writes data + safely to disk a lot quicker and making this software no longer crash safe. + . + You will find eatmydata useful if particular software calls fsync(), sync() + etc. frequently but the data it stores is not that valuable to you and you may + afford losing it in case of system crash. Data-to-disk synchronization calls + are typically very slow on modern file systems and their extensive usage might + slow down software significantly. It does not make sense to accept such a hit + in performance if data being manipulated is not very important. + . + On the other hand, do not use eatmydata when you care about what software + stores or it manipulates important components of your system. The library is + called libEAT-MY-DATA for a reason. + +Package: eject +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 103 +Depends: libc6 (>= 2.38), libmount1 (= 2.41.3-3ubuntu2.2) +Filename: pool/eject_2.41.3-3ubuntu2.2_amd64.deb +Size: 40298 +MD5sum: 074e8525adef3b4c63b04b393c0c3012 +SHA1: 2cef4d76f5f5db545e2d3ece59f07c8af6492168 +SHA256: b249154e608cf714cd166cf63be820c26f8124a7657a0258bb139c8ba9741dcc +SHA512: 0778ea3060761be617dc27713b4e8f55995622e19e8d4019d8e81eba2792f1ea5f12fbd87e20a9a821ce772a7b4af744e1c027871dcc120b43b8e0c53c303f27 +Homepage: https://github.com/util-linux/util-linux +Description: ejects CDs and operates CD-Changers under Linux + This program will eject CD-ROMs (assuming your drive supports the CDROMEJECT + ioctl). It also allows setting the autoeject feature. + . + On supported ATAPI/IDE multi-disc CD-ROM changers, it allows changing + the active disc. + . + You can also use eject to properly disconnect external mass-storage + devices like digital cameras or portable music players. + +Package: emacsen-common +Architecture: all +Version: 3.0.8build1 +Priority: optional +Section: editors +Maintainer: Ubuntu Developers +Original-Maintainer: Rob Browning +Installed-Size: 61 +Conflicts: emacs19, emacs20, emacs21-common, emacs22-common, emacs23-common, emacs24-common, emacs25-common, xemacs21-support (<< 21.4.24-6~) +Filename: pool/emacsen-common_3.0.8build1_all.deb +Size: 14032 +MD5sum: a6607df27896b2c3f808c15de0383245 +SHA1: 7961881cd883bcb11635e90bb449305f04ae99a7 +SHA256: e630031549f68eaa2db722d3573b5b86f469df27d967645250050cdbcbcd752e +SHA512: 56027098e2cab103fef3d174ce35a2e17c00a6075fd28eab58411470591581d920818d5d5bc8352ecf7dbb0606ec02a019cc64f38bbf5c53c2af0bc3087cda4a +Description: Common facilities for all emacsen + This package contains code that is needed by all the (x)emacs + packages. It will be automatically installed when needed. + +Package: enchant-2 +Architecture: amd64 +Version: 2.8.2+dfsg1-3build1 +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 79 +Depends: libc6 (>= 2.34), libenchant-2-2 (>= 2.8.2), libglib2.0-0t64 (>= 2.12.0) +Filename: pool/enchant-2_2.8.2+dfsg1-3build1_amd64.deb +Size: 19076 +MD5sum: c2e454eb74e291aaa9e2205002bbb30e +SHA1: 3433eee4d2482596da291112c8621182fb6cba08 +SHA256: f1142906a045a2124c483f47b411865609866b6f7db46da679deaee5869cca99 +SHA512: 66c40c26e42a29af41968c1bb8378baf3d46dcc794b1bc6a9e3b0b4948431c81e27322df717d32d56f71c8c1bb9b541b21f845c0a6b77e64fcc580d0bbe34d9e +Homepage: https://rrthomas.github.io/enchant/ +Description: Wrapper for various spell checker engines (binary programs) + Enchant is a generic spell checking library which uses existing + spell checker engines such as ispell, aspell and myspell as its backends. + . + Enchant steps in to provide uniformity and conformity on top of these + libraries, and implement certain features that may be lacking in any + individual provider library. + . + This package contains standalone runtime binary programs. + +Package: espeak-ng-data +Architecture: amd64 +Version: 1.52.0+dfsg-5build1 +Multi-Arch: same +Priority: optional +Section: sound +Source: espeak-ng +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 24027 +Filename: pool/espeak-ng-data_1.52.0+dfsg-5build1_amd64.deb +Size: 9261438 +MD5sum: f13cc73fd487d259e0a5bd43bc7e3dc2 +SHA1: 5dc8028bf9f39a74b82be9e9ad13560b9c6847d4 +SHA256: 8304ebf2260a5cf16394625a9b6bfc7cea6c29cc30e55d4cfa0e85da0d3cf56a +SHA512: 023d312a7b03d7ace05602e0d69aa207f8fd9388446058f2325f74aed9fd3b9de5852721772947ca3efd1dfe0e0beeb7f0601507d41b56f9e3223e7e31f32e88 +Homepage: https://github.com/espeak-ng/espeak-ng +Description: Multi-lingual software speech synthesizer: speech data files + eSpeak NG is a software speech synthesizer for English, and some other + languages. + . + This package contains necessary synthesizer data files needed + for the espeak-ng program and the shared library. + +Package: ethtool +Architecture: amd64 +Version: 1:6.19-1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 1080 +Depends: libc6 (>= 2.34), libmnl0 (>= 1.0.3-4~) +Filename: pool/ethtool_1%3a6.19-1_amd64.deb +Size: 322774 +MD5sum: e726f1f060da8d9046060dbf238d3836 +SHA1: ecae36ab6d576575b33167e2f44fe1751a33ec44 +SHA256: ccb2f06f17d13410a76f52c69454451751275f036e6faff08acf1de1527fe35a +SHA512: a030053fb7e41ac1e89c99b9e9b3de1fef5ca35d1736c1f0bf1a5f8db1126a0915eeab7ef23e04ca8af400ccd5ab9eb4bd8d8c6bfa054c1d22ae7f1e38aa0e74 +Homepage: https://www.kernel.org/pub/software/network/ethtool/ +Description: display or change Ethernet device settings + ethtool can be used to query and change settings such as speed, auto- + negotiation and checksum offload on many network devices, especially + Ethernet devices. + +Package: evolution-data-server +Architecture: amd64 +Version: 3.56.2-8 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 2608 +Depends: evolution-data-server-common (>= 3.56.2-8), gnome-keyring, libcamel-1.2-64t64 (= 3.56.2-8), libc6 (>= 2.38), libcanberra-gtk3-0 (>= 0.25), libcanberra0 (>= 0.2), libdb5.3t64, libebackend-1.2-11t64 (>= 3.38.0), libebook-1.2-21t64 (>= 3.17), libebook-contacts-1.2-4t64 (>= 3.49.2), libecal-2.0-3 (>= 3.39.2), libedata-book-1.2-27t64 (>= 3.49.2), libedata-cal-2.0-2t64 (>= 3.48.1), libedataserver-1.2-27t64 (>= 3.56.2-8~), libedataserverui-1.2-4t64 (>= 3.45.3), libglib2.0-0t64 (>= 2.70.0), libgoa-1.0-0b (>= 3.11.90), libgtk-3-0t64 (>= 3.3.16), libgweather-4-0t64 (>= 3.91.0), libical3t64 (>= 3.0.0), libjson-glib-1.0-0 (>= 1.5.2), libldap2 (>= 2.6.2), libpango-1.0-0 (>= 1.14.0), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.0.3), libxml2-16 (>= 2.14.1) +Suggests: evolution +Filename: pool/evolution-data-server_3.56.2-8_amd64.deb +Size: 715830 +MD5sum: 758ee216ee48a14e4b4c9589908c9b4d +SHA1: 38cf4b52b2b32677689b4e6d623747e15ea292c6 +SHA256: 7d72ccd1741f4098197505012168bd0d2ef825f294e1f68532b71360f1628b07 +SHA512: 29cebb4855353bc3152b50311b8f68a3c94ef785e469623b356b2b13a675b995c8eeca791d0d75b4fdd71c77a41b277a43250fffd00701a8e166b68b86eb0342 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: evolution database backend server + The data server, called "Evolution Data Server" is responsible for managing + mail, calendar, addressbook, tasks and memo information. + +Package: evolution-data-server-common +Architecture: all +Version: 3.56.2-8 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 508 +Depends: dconf-gsettings-backend | gsettings-backend +Filename: pool/evolution-data-server-common_3.56.2-8_all.deb +Size: 190518 +MD5sum: d25265fa3e84f831bcf615d8508d484a +SHA1: 64933a5ffd29f173de576fb2f00992bdd58ef5c4 +SHA256: e7b82a9c4e3489c86dd1ab1a68a87a79c36213e155d391ff00f43ec41edadbcb +SHA512: 822803060a4722a489fdea2142f1081978fe5816bda739f6b89a2977c3634839e24f91a9fa6b4fd40b19988d2397dc94c3c877d2a345c17796edbd5459f9f5d4 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: architecture independent files for Evolution Data Server + The data server, called "Evolution Data Server" is responsible for managing + calendar and addressbook information. + . + This package contains the architecture independent files needed + by the evolution-data-server package. + +Package: exfatprogs +Architecture: amd64 +Version: 1.3.2-1 +Priority: optional +Section: otherosfs +Maintainer: Ubuntu Developers +Original-Maintainer: Sven Hoexter +Installed-Size: 281 +Depends: libc6 (>= 2.38) +Filename: pool/exfatprogs_1.3.2-1_amd64.deb +Size: 81458 +MD5sum: 46ead5eb1283338b21a6d205d8f150b1 +SHA1: 8789fc1a96667cbd1b0a9779ceaf827e8cec6922 +SHA256: 3ccd90a7a4cd55f088cf5a1abffb0b3348c607ff1c3cfb984630bc7b2f48d3c6 +SHA512: b98e60f0617489137efbc8aba22b7d19db7bb772885934ec829de637020492d46abdc4d684178223ed2709dbe08def7154686c1a02ef3f162fedf7e7aa008073 +Homepage: https://github.com/exfatprogs/exfatprogs +Description: exFAT file system utilities + Tools to manage extended file allocation table filesystem. + This package provides tools to create, check, dump + and label the filesystem. It contains + - mkfs.exfat to create an exFAT filesystem + - fsck.exfat to check and repair an exFAT filesystem + - tune.exfat to print and edit the volume label or serial + - dump.exfat to show on-disk information of an exFAT filesystem + - exfat2img to dump exFAT metadata + The tools included in this package are the exfatprogs + maintained by Samsung and LG engineers, who provided Linux exFAT + support. + +Package: fdisk +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: foreign +Priority: important +Section: utils +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 402 +Depends: libc6 (>= 2.38), libfdisk1 (= 2.41.3-3ubuntu2.2), libmount1 (= 2.41.3-3ubuntu2.2), libncursesw6 (>= 6), libreadline8t64 (>= 6.0), libsmartcols1 (= 2.41.3-3ubuntu2.2), libtinfo6 (>= 6) +Recommends: sensible-utils +Filename: pool/fdisk_2.41.3-3ubuntu2.2_amd64.deb +Size: 139076 +MD5sum: 758f36b52c24d6a7a7ca5db0fbb0c9cf +SHA1: daef3b4305d1ee2804ddc48290f4dd11f40e8996 +SHA256: 1789910902f6c260e5345440fd86b00ac0f34c69795a6f2be67cd4ab3e38fa2b +SHA512: 7a4793c3103a1c29096f9973470fce3dc93fc83ae39d19f989eafd4e6fcbfc8a95e36b83cf6300cb2494e41e49c2aa6901db8f7453a2d6e18b73d57543be42f0 +Homepage: https://github.com/util-linux/util-linux +Description: collection of partitioning utilities + This package contains the classic fdisk, sfdisk and cfdisk partitioning + utilities from the util-linux suite. + . + The utilities included in this package allow you to partition + your hard disk. The utilities supports both modern and legacy + partition tables (eg. GPT, MBR, etc). + . + The fdisk utility is the classical text-mode utility. + The cfdisk utility gives a more userfriendly curses based interface. + The sfdisk utility is mostly for automation and scripting uses. + +Package: file +Architecture: amd64 +Version: 1:5.46-5build2 +Multi-Arch: foreign +Priority: standard +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Christoph Biedl +Installed-Size: 60 +Depends: libc6 (>= 2.38), libmagic1t64 (= 1:5.46-5build2) +Breaks: debhelper (<< 12.2~) +Filename: pool/file_1%3a5.46-5build2_amd64.deb +Size: 22026 +MD5sum: f35d79b1d5c80beb8e8bb215d3e07c8b +SHA1: 30102cc5a42ff266edf3a7d88fb4f1fb609e4f2d +SHA256: 968b0e503f877a81c67bf82b634973e73901f6c4f4c741b5ec09824120791cd3 +SHA512: 56d35105a69d21989e469e9dfe705137bb1c4b652f23427e45d4126027c86c06175808beb518169412fe1adeb62fafcbac3992542c7cf0d8aa534c9d73da09fc +Homepage: https://www.darwinsys.com/file/ +Description: Recognize the type of data in a file using "magic" numbers + The file command is "a file type guesser", a command-line tool that + tells you in words what kind of data a file contains. + . + This package contains the file program itself. + +Package: firefox +Architecture: amd64 +Version: 1:1snap1-0ubuntu9.1 +Priority: optional +Section: oldlibs +Maintainer: Ubuntu Mozilla Team +Installed-Size: 113 +Provides: gnome-www-browser, iceweasel, www-browser, x-www-browser +Pre-Depends: debconf, snapd (>= 2.54) +Depends: debconf (>= 0.5) | debconf-2.0 +Breaks: firefox-dbg (<< 1:1snap1), firefox-dev (<< 1:1snap1), firefox-geckodriver (<< 1:1snap1), firefox-mozsymbols (<< 1:1snap1) +Replaces: firefox-dbg (<< 1:1snap1), firefox-dev (<< 1:1snap1), firefox-geckodriver (<< 1:1snap1), firefox-mozsymbols (<< 1:1snap1) +Filename: pool/firefox_1%3a1snap1-0ubuntu9.1_amd64.deb +Size: 68286 +MD5sum: 7a589661fd047184cfcccbe85a984769 +SHA1: 48dd7aa6c358e408c30a03a57ebb526501ef5cdf +SHA256: abd8b2c56a05c9c15f3f050713ab795e58c2ff1a868869a2bf40e9b26ee4d2ea +SHA512: ea736ae0f7c4e81cccb36aeb1acf9a4ea2cdef99c3ad1325ab3dd7b1f1400e01ed6fc5f5167370439cefc2e43123b29ebdf820f4dc4f7cebccddf671c4ccb5cf +Description: Installs Firefox snap and provides some system integration + This package is almost a transitional package, insofar as its main + purpose is to install the Firefox snap, but it also configures + *www-browser alternatives and provides the corresponding virtual + packages which other deb packages might depend on. + +Package: fontconfig +Architecture: amd64 +Version: 2.17.1-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 468 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.17.1), libfreetype6 (>= 2.2.1), fontconfig-config +Filename: pool/fontconfig_2.17.1-3ubuntu1_amd64.deb +Size: 180360 +MD5sum: 3ca2e704affe4b7389f754f576434263 +SHA1: d60d4b7aad45151d874d3df1be05b56fda254576 +SHA256: 5f87d9f0ff7189e5dbf7bedd1ef6c09ea81747bc68dd5263ea811b471f23ee65 +SHA512: 4a377536711317a29f046f11f764ef00693424584b6843abcba60f68461063123af4324c48c4197c84f7c5f65d3566f5f13d3ed9cc270143edf689dc8ab81755 +Homepage: https://www.freedesktop.org/wiki/Software/fontconfig/ +Description: generic font configuration library - support binaries + Fontconfig is a font configuration and customization library, which + does not depend on the X Window System. It is designed to locate + fonts within the system and select them according to requirements + specified by applications. + . + Fontconfig is not a rasterization library, nor does it impose a + particular rasterization library on the application. The X-specific + library 'Xft' uses fontconfig along with freetype to specify and + rasterize fonts. + . + This package contains a program to maintain the fontconfig cache + (fc-cache), a sample program to list installed fonts (fc-list), a program + to test the matching rules (fc-match) and a program to dump the binary + cache files in string form (fc-cat). It no longer makes fonts managed by defoma + available to fontconfig applications. + +Package: fontconfig-config +Architecture: amd64 +Version: 2.17.1-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fontconfig +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 243 +Depends: fonts-dejavu-core | fonts-liberation | fonts-croscore | fonts-freefont-otf | fonts-freefont-ttf | fonts-urw-base35 | fonts-texgyre | fonts-noto-core +Breaks: libfontconfig1 (<< 2.13.0) +Filename: pool/fontconfig-config_2.17.1-3ubuntu1_amd64.deb +Size: 38454 +MD5sum: daaa71dd76924ef402f4c5f34e044b44 +SHA1: 93db524f7f53e28daf6e5522e92de3122501a4d2 +SHA256: 304cc61f61b94399453db02e1032d9f74a0bd737307acb4ed847f8da9406b8c1 +SHA512: d1bf4086c77a5e2b8175fdbe522b36c1070a9d2fd97ea08c950e9fb38300243a844377490bfd4755ab232c0df077b20d7b67fb98feca7a78f633801562be2621 +Homepage: https://www.freedesktop.org/wiki/Software/fontconfig/ +Description: generic font configuration library - configuration + Fontconfig is a font configuration and customization library, which + does not depend on the X Window System. It is designed to locate + fonts within the system and select them according to requirements + specified by applications. + . + This package contains the configuration files and scripts for fontconfig. + +Package: fonts-adwaita +Architecture: all +Version: 49.0+dfsg-2 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Kirill Rekhov +Installed-Size: 140 +Depends: fonts-adwaita-sans +Filename: pool/fonts-adwaita_49.0+dfsg-2_all.deb +Size: 68348 +MD5sum: c1ab6b8ba6e4167bc3c933d150dcc976 +SHA1: 5e5eb267ac1d9abfe948848f67658e6994da79af +SHA256: f8f0deb9b00788cbe6d52fedb029b411db27bee4f6b43943edad79829e8321eb +SHA512: 79949b3223640d3f0d2204cb45f6af4f5dc4c11462c9254efa1c5e192103a4e6f528f312858e83c667611a6423f3ed65eb76ce415aa248e32c843ea84b83d1e2 +Homepage: https://gitlab.gnome.org/GNOME/adwaita-fonts +Description: Adwaita Fonts Collection + This metapackage installs available Adwaita font families that are + currently buildable in Debian. Mono will be added once its source + dependency (Iosevka) is available in Debian. + +Package: fonts-adwaita-sans +Architecture: all +Version: 49.0+dfsg-2 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-adwaita +Maintainer: Ubuntu Developers +Original-Maintainer: Kirill Rekhov +Installed-Size: 1765 +Filename: pool/fonts-adwaita-sans_49.0+dfsg-2_all.deb +Size: 772754 +MD5sum: 86680e5350c7137207cfe3cc8ad843a7 +SHA1: bbdf07cc424f7c2e0366636e7cf88d185f5e8a79 +SHA256: 69439ea5a600a1b6dd8f17e1a45951e7c100b5acb2df7af849a04558c45acb93 +SHA512: f727a8693edcf52f7b603675faa20bd42539795aefa324fce5432fd9ebfa9ae0a688765ea4630e9a5d9c3f4cd4c337f25bd7f02ead283334364cce9b21d44034 +Homepage: https://gitlab.gnome.org/GNOME/adwaita-fonts +Description: Adwaita Sans Fonts + This package contains the Adwaita Sans fonts, built from Inter variable + fonts with the required OpenType features and naming applied. + +Package: fonts-dejavu-core +Architecture: all +Version: 2.37-8build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-dejavu +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 2292 +Depends: fonts-dejavu-mono +Filename: pool/fonts-dejavu-core_2.37-8build1_all.deb +Size: 834166 +MD5sum: 2b8b6ad2bc939923a1c4eea4df2cc317 +SHA1: 92faf64c620e2663dc25b23f9196c5691eabf488 +SHA256: f4606b12eb41ddf7932d3a1ebc2019f9bbf90d0824943a2dc0c77a00f43019f2 +SHA512: cc4ae3591edd3ef0e7189bbddaf36894701d82a7e54be8bb183ac17ec3b85f4f620cec601186eb48a809df6f5a85abe4fcd7342fd1d1f879a8259260b403db6c +Homepage: https://dejavu-fonts.github.io/ +Description: Vera font family derivate with additional characters + DejaVu provides an expanded version of the Vera font family aiming for + quality and broader Unicode coverage while retaining the original Vera + style. DejaVu currently works towards conformance with the Multilingual + European Standards (MES-1 and MES-2) for Unicode coverage. The DejaVu + fonts provide serif, sans and monospaced variants. + . + This package only contains the sans, sans-bold, serif and serif-bold + variants. For additional variants, see the fonts-dejavu-mono and + fonts-dejavu-extra packages. + . + DejaVu fonts are intended for use on low-resolution devices (mainly + computer screens) but can be used in printing as well. + +Package: fonts-dejavu-mono +Architecture: all +Version: 2.37-8build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-dejavu +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 1281 +Breaks: fonts-dejavu-core (<< 2.37-7~), fonts-dejavu-extra (<< 2.37-7~) +Replaces: fonts-dejavu-core (<< 2.37-7~), fonts-dejavu-extra (<< 2.37-7~) +Filename: pool/fonts-dejavu-mono_2.37-8build1_all.deb +Size: 502164 +MD5sum: 4f1c9daadbdfe60cb176c6910d994a9a +SHA1: efbc0853b6448288b2b6d167baec02fb81475e86 +SHA256: bf5ad873961972ea8f1299ef99c1854715e68d9aa798830fb78c5b222ddeb4b9 +SHA512: 35c74ebbe123990929b397bdc3ab2ff691c6c10a265c3a7a44d72bdeb6583f78f652eb4bf4c4237d5f63b7ec011a4a816bf753dc4b25d136cd4fb891cbd42c8b +Homepage: https://dejavu-fonts.github.io/ +Description: Vera font family derivate with additional characters + DejaVu provides an expanded version of the Vera font family aiming for + quality and broader Unicode coverage while retaining the original Vera + style. DejaVu currently works towards conformance with the Multilingual + European Standards (MES-1 and MES-2) for Unicode coverage. The DejaVu + fonts provide serif, sans and monospaced variants. + . + This package only contains the monospaced variants. For additional + variants, see the fonts-dejavu-core and fonts-dejavu-extra packages. + . + DejaVu fonts are intended for use on low-resolution devices (mainly + computer screens) but can be used in printing as well. + +Package: fonts-droid-fallback +Architecture: all +Version: 1:8.1.0r7-1~1.gbp36536bbuild1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-android +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 7340 +Recommends: fonts-noto-mono +Suggests: fonts-noto +Breaks: fonts-droid (<< 1:6.0.0r26-1~) +Replaces: fonts-droid (<< 1:6.0.0r26-1~) +Filename: pool/fonts-droid-fallback_1%3a8.1.0r7-1~1.gbp36536bbuild1_all.deb +Size: 2011114 +MD5sum: 09541a8d6bac485e4f79aa31e9afc3a4 +SHA1: eace3cb8f859a162184752e96d683f6f404b2e93 +SHA256: ce3303e44d61409ee93d32d2a50e26af7a8c49b6f71fbf4b1ca7077488234651 +SHA512: b6e4180ddba9dcc0ebe22a8cce8015105255b689ce4c8643a9bfc72d0ac2bda76fe72ce5c102cb493d06a1686815f25dc0329078929c0aff3a23a2814e1f2ca3 +Homepage: https://android.googlesource.com/platform/frameworks/base/ +Description: handheld device font with extensive style and language support (fallback) + This package provides DroidSans Fallback variants, Fallback and + FallbackFull. + . + Each contains extensive character set coverage including + Western Europe, Eastern/Central Europe, Baltic, Cyrillic, Greek and + Turkish support. The Droid Sans regular font also includes support for + Arabic, Simplified and Traditional Chinese, Hebrew, Japanese, Korean and + Thai. + . + Droid was designed by Ascender's Steve Matteson and hinted to provide + optimal quality for screen text. + . + Please note that fonts-noto grew out of fonts-droid and is the same but + better. You need fonts-droid-fallback (former fonts-droid) in case you + need to deal with some legacy documents. + +Package: fonts-liberation +Architecture: all +Version: 1:2.1.5-3build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 4286 +Recommends: fonts-liberation-sans-narrow +Breaks: fonts-liberation2 (<< 1:2.1.5-2~) +Replaces: fonts-liberation2 (<< 1:2.1.5-2~) +Filename: pool/fonts-liberation_1%3a2.1.5-3build1_all.deb +Size: 1604662 +MD5sum: 0198a5402d8dcf2611b5f865c1bbbc08 +SHA1: 64d14443a72e1238504a0a96172d167453a6561f +SHA256: 47f156bc945cfc69cf2f2a0c19b8c82b67a685738d3846673462de6a73266e1b +SHA512: 563b7ead8f4af6428d8e7ebe0f1a34dc5664c6a13d9f5296c962f51b341a76803c8ecac093326b2b07cf147e0d0d649ef6f4a66383dc65dcde93b38048c32a4c +Homepage: https://github.com/liberationfonts +Description: fonts with the same metrics as Times, Arial and Courier + The Liberation font family is a set of serif, sans-serif and + monospaced fonts with exactly the same metrics as the non-free + Microsoft fonts Times New Roman, Arial and Courier New. + +Package: fonts-liberation-sans-narrow +Architecture: all +Version: 1:1.07.6-4build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 494 +Breaks: fonts-liberation (<< 1:1.07.6-1~) +Replaces: fonts-liberation (<< 1:1.07.6-1~) +Enhances: fonts-liberation +Filename: pool/fonts-liberation-sans-narrow_1%3a1.07.6-4build1_all.deb +Size: 196390 +MD5sum: 75e6c012b293d9007c3db12fc9f66735 +SHA1: de4e02391f07bec9db064ef85e1b066e5532ebce +SHA256: b860cd58dc89b4d91ff7b775e759aba62561a5d7226508cf5fbdaff01bade9cd +SHA512: 1f54a0a61222c660b2ffe62635850be2e0ceb53002f9be60afb41cfff7539ee98db51c041c0ccf4d48f69f1e13919baf4c930edec38e91ea51291eee90e16a8c +Homepage: https://github.com/liberationfonts/liberation-sans-narrow +Description: Sans-serif Narrow fonts to replace commonly used Arial Narrow + The Liberation Sans Narrow Fonts are intended to be replacements for + the Arial Narrow. + +Package: fonts-noto-cjk +Architecture: all +Version: 1:20240730+repack1-1build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Team +Installed-Size: 91218 +Suggests: fonts-noto-cjk-extra +Filename: pool/fonts-noto-cjk_1%3a20240730+repack1-1build1_all.deb +Size: 61175182 +MD5sum: 4daa7d236123f1bd9ec9aeabc49265af +SHA1: 7a61ac754c591164970e0d52b3bbe9501c3aa2dd +SHA256: be378a571b8f49b4b9146f7d13b31990950d35ee3e0bf1999f554c3ed5670dc0 +SHA512: 4d028e6d6fd7ab17052960ad6284bca77f17f7d442fa72e692e0a6b035d50916b91f5386ad88290c0e3414315c87a3352e9bca76247be6f9f5b21ecb0357fa9b +Homepage: https://github.com/notofonts/noto-cjk +Description: "No Tofu" font families with large Unicode coverage (CJK regular and bold) + Noto is a collection of font families, each visually harmonized across + scripts. + . + This package contains Noto font families for Traditional Chinese, + Simplified Chinese, Japanese and Korean: + . + * Noto Sans CJK JP + * Noto Sans CJK KR + * Noto Sans CJK SC + * Noto Sans CJK TC + * Noto Sans Mono CJK JP + * Noto Sans Mono CJK KR + * Noto Sans Mono CJK SC + * Noto Sans Mono CJK TC + * Noto Serif CJK JP + * Noto Serif CJK KR + * Noto Serif CJK SC + * Noto Serif CJK TC + . + These fonts are derived from the font family Source Han Sans. + . + The name "Noto" is short for "No Tofu", describing the aim of covering + all living Unicode scripts. + . + Tofu (豆腐) is Japanese jargon for unicode replacement character "�" + (U+FFFD) often displayed as replacement for unassigned or unknown + characters. + . + This package contains regular and bold fonts. + +Package: fonts-noto-color-emoji +Architecture: all +Version: 2.051-1build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 10778 +Filename: pool/fonts-noto-color-emoji_2.051-1build1_all.deb +Size: 9967220 +MD5sum: 1c5dfbcaecd9d8fba5538ed1c83f5545 +SHA1: d35cbcb14545f5c950042c513953de38e9764af5 +SHA256: 040b1e0a0700c849b9ce59d97878019e16720d18063f7d0585d906ea609d7235 +SHA512: 134adb4d68fb205ecae2dfdc120bc873e9f7d47b37641fb4c09a6a93076ab45822843318ad32e27c3d0de2aa672004c436528203b26d3e15ae88cf90ec7ed754 +Homepage: https://fonts.google.com/noto/specimen/Noto+Color+Emoji +Description: color emoji font from Google + Noto is a collection of font families, each visually harmonized across + scripts. + . + The name "Noto" is short for "No Tofu", describing the aim of covering + all living Unicode scripts. + . + Tofu (豆腐) is Japanese jargon for unicode replacement character "�" + (U+FFFD) often displayed as replacement for unassigned or unknown + characters. + . + This package contains the color emoji font used on "stock" Android devices + such as the Google Pixel. + +Package: fonts-noto-core +Architecture: all +Version: 20201225-2build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-noto +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 42551 +Depends: fonts-noto-mono +Breaks: fonts-noto (<< 2015-05-11+cjk-1~), fonts-noto-hinted (<< 20181130-2~), fonts-noto-unhinted (<< 20201027-1~) +Replaces: fonts-noto (<< 2015-05-11+cjk-1~), fonts-noto-hinted (<< 20181130-2~), fonts-noto-unhinted (<< 20201027-1~) +Filename: pool/fonts-noto-core_20201225-2build1_all.deb +Size: 13277790 +MD5sum: 3c2dd16ac9aaa4279cc2db724eee8409 +SHA1: d96cf7fa0b14c55507959bb95337a559c7d1116a +SHA256: 25999af6e6665266b1f055d351fc5008534e65c9f7bdda1e7fb5a7574c42372f +SHA512: 1d04c344f85702ac9f37c8e1cd9d1c1c9845819afa759ca5ee5c460c295af875254a5cbeee54b44ad438b58cf05f7430f932465669f1bc579428d8e02708f6b0 +Homepage: https://www.google.com/get/noto/ +Description: "No Tofu" font families with large Unicode coverage (core) + Noto is a collection of font families, + each visually harmonized across scripts. + . + This package contains core weights for these Noto font families: + . + * Noto Kufi Arabic + * Noto Looped Lao Bold + * Noto Looped Lao Regular + * Noto Looped Thai Bold + * Noto Looped Thai Regular + * Noto Music + * Noto Naskh Arabic + * Noto Nastaliq Urdu + * Noto Rashi Hebrew + * Noto Sans + * Noto Sans Adlam + * Noto Sans Adlam Unjoined + * Noto Sans AnatoHiero + * Noto Sans Arabic + * Noto Sans Armenian + * Noto Sans Avestan + * Noto Sans Balinese + * Noto Sans Bamum + * Noto Sans Bassa Vah + * Noto Sans Batak + * Noto Sans Bengali + * Noto Sans Bhaiksuki + * Noto Sans Brahmi + * Noto Sans Buginese + * Noto Sans Buhid + * Noto Sans CanAborig + * Noto Sans Carian + * Noto Sans CaucAlban + * Noto Sans Chakma + * Noto Sans Cham + * Noto Sans Cherokee + * Noto Sans Coptic + * Noto Sans Cuneiform + * Noto Sans Cypriot + * Noto Sans Deseret + * Noto Sans Devanagari + * Noto Sans Display + * Noto Sans Duployan + * Noto Sans EgyptHiero + * Noto Sans Elbasan + * Noto Sans Elymaic + * Noto Sans Ethiopic + * Noto Sans Georgian + * Noto Sans Glagolitic + * Noto Sans Gothic + * Noto Sans Grantha + * Noto Sans Gujarati + * Noto Sans Gunjala Gondi + * Noto Sans Gurmukhi + * Noto Sans Hanifi Rohingya + * Noto Sans Hanunoo + * Noto Sans Hatran + * Noto Sans Hebrew + * Noto Sans ImpAramaic + * Noto Sans Indic Siyaq Numbers + * Noto Sans InsPahlavi + * Noto Sans InsParthi + * Noto Sans Javanese + * Noto Sans Kaithi + * Noto Sans Kannada + * Noto Sans Kayah Li + * Noto Sans Kharoshthi + * Noto Sans Khmer + * Noto Sans Khojki + * Noto Sans Khudawadi + * Noto Sans Lao + * Noto Sans Lepcha + * Noto Sans Limbu + * Noto Sans Linear A + * Noto Sans Linear B + * Noto Sans Lisu + * Noto Sans Lycian + * Noto Sans Lydian + * Noto Sans Mahajani + * Noto Sans Malayalam + * Noto Sans Mandaic + * Noto Sans Manichaean + * Noto Sans Marchen + * Noto Sans Masaram Gondi + * Noto Sans Math + * Noto Sans Mayan Numerals + * Noto Sans Medefaidrin + * Noto Sans MeeteiMayek + * Noto Sans Mende Kikakui + * Noto Sans Meroitic + * Noto Sans Miao + * Noto Sans Modi + * Noto Sans Mongolian + * Noto Sans Mro + * Noto Sans Multani + * Noto Sans Myanmar + * Noto Sans NKo + * Noto Sans Nabataean + * Noto Sans NewTaiLue + * Noto Sans Newa + * Noto Sans Nushu + * Noto Sans Ogham + * Noto Sans Ol Chiki + * Noto Sans Old Italic + * Noto Sans Old Permic + * Noto Sans Old Turkic + * Noto Sans OldHung + * Noto Sans OldNorArab + * Noto Sans OldPersian + * Noto Sans OldSogdian + * Noto Sans OldSouArab + * Noto Sans Oriya + * Noto Sans Osage + * Noto Sans Osmanya + * Noto Sans Pahawh Hmong + * Noto Sans Palmyrene + * Noto Sans PauCinHau + * Noto Sans PhagsPa + * Noto Sans Phoenician + * Noto Sans PsaPahlavi + * Noto Sans Rejang + * Noto Sans Runic + * Noto Sans Samaritan + * Noto Sans Saurashtra + * Noto Sans Sharada + * Noto Sans Shavian + * Noto Sans Siddham + * Noto Sans SignWrit + * Noto Sans Sinhala + * Noto Sans Sogdian + * Noto Sans Sora Sompeng + * Noto Sans Soyombo + * Noto Sans Sundanese + * Noto Sans Syloti Nagri + * Noto Sans Symbols + * Noto Sans Symbols2 + * Noto Sans Syriac + * Noto Sans Tagalog + * Noto Sans Tagbanwa + * Noto Sans Tai Le + * Noto Sans Tai Tham + * Noto Sans Tai Viet + * Noto Sans Takri + * Noto Sans Tamil + * Noto Sans Tamil Supplement + * Noto Sans Telugu + * Noto Sans Thaana + * Noto Sans Thai + * Noto Sans Tifinagh + * Noto Sans Tifinagh APT + * Noto Sans Tifinagh Adrar + * Noto Sans Tifinagh Agraw Imazighen + * Noto Sans Tifinagh Ahaggar + * Noto Sans Tifinagh Air + * Noto Sans Tifinagh Azawagh + * Noto Sans Tifinagh Ghat + * Noto Sans Tifinagh Hawad + * Noto Sans Tifinagh Rhissa Ixa + * Noto Sans Tifinagh SIL + * Noto Sans Tifinagh Tawellemmet + * Noto Sans Tirhuta + * Noto Sans Ugaritic + * Noto Sans Vai + * Noto Sans Wancho + * Noto Sans WarangCiti + * Noto Sans Yi + * Noto Sans Zanabazar + * Noto Serif + * Noto Serif Ahom + * Noto Serif Armenian + * Noto Serif Balinese + * Noto Serif Bengali + * Noto Serif Devanagari + * Noto Serif Display + * Noto Serif Dogra + * Noto Serif Ethiopic + * Noto Serif Georgian + * Noto Serif Grantha + * Noto Serif Gujarati + * Noto Serif Gurmukhi + * Noto Serif Hebrew + * Noto Serif Hmong Nyiakeng + * Noto Serif Kannada + * Noto Serif Khmer + * Noto Serif Khojki + * Noto Serif Lao + * Noto Serif Malayalam + * Noto Serif Myanmar + * Noto Serif Sinhala + * Noto Serif Tamil + * Noto Serif Tangut + * Noto Serif Telugu + * Noto Serif Thai + * Noto Serif Tibetan + * Noto Serif Yezidi + * Noto Traditional Nushu + * NotoSerifTamilSlantedmisc:Depends= + . + This package also pulls the fonts-noto-mono package to make up a + base package set with Noto fonts. + . + The name "Noto" is short for "No Tofu", + describing the aim of covering all living Unicode scripts + (currently 103 are covered, at least partly. + . + Tofu (豆腐) is Japanese jargon + for unicode replacement character "�" (U+FFFD) + often displayed as replacement for unassigned or unknown characters. + +Package: fonts-noto-mono +Architecture: all +Version: 20201225-2build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Source: fonts-noto +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 1156 +Breaks: fonts-noto-core (<< 20201027-2~), fonts-noto-unhinted (<< 20201027-3~) +Replaces: fonts-noto-core (<< 20201027-2~), fonts-noto-unhinted (<< 20201027-3~) +Enhances: fonts-noto-core +Filename: pool/fonts-noto-mono_20201225-2build1_all.deb +Size: 433958 +MD5sum: 9010d063d69ff3b90d76665ab2daa914 +SHA1: b07fe46dc6b7a7b8cb2937cf8ae3ed595fd8e852 +SHA256: b9b3e49f6a6926e3be9817c39587a4eeff48d147cb21fdd799f89a045fe097c5 +SHA512: f0607fdc5201f32250b453956d606f0470a1594b1f04e28810ba4f787c8481d50d78a3cea5d0b1b2d9777222cee79a21ab36ebe996ed52f9753bcb9f2c0c95db +Homepage: https://www.google.com/get/noto/ +Description: "No Tofu" monospaced font family with large Unicode coverage + Noto is a collection of font families, + each visually harmonized across scripts. + . + This package contains Noto Mono font family + (formerly known as Droid Mono), + and core weights for the Noto Sans Mono font family. + Beware that Noto Mono has a much smaller repertoire + than Noto Sans or Noto Serif. + . + The name "Noto" is short for "No Tofu", + describing the aim of covering all living Unicode scripts. + . + Tofu (豆腐) is Japanese jargon + for unicode replacement character "�" (U+FFFD) + often displayed as replacement for unassigned or unknown characters. + +Package: fonts-ubuntu +Architecture: all +Version: 0.869+git20240321-0ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 4308 +Filename: pool/fonts-ubuntu_0.869+git20240321-0ubuntu2_all.deb +Size: 1076616 +MD5sum: fdcd4f1cdecce150126ce699b6c6e191 +SHA1: 8ad4c8bc863b93644dd2e9ae6187e218bc140012 +SHA256: f406a58d53ba6f1b7d0c8b9641ee599181cfaaf433c4fd1276a7fe2f10ae9e38 +SHA512: 7fbdeba384f1a6668a4758fbf00189aa24027af6f2505050e31985afb8b84263fa83162166751f807c177b62555d074dc61933138bbedb275fdedfce75e33cbe +Homepage: https://design.ubuntu.com/font/ +Description: sans-serif font set from Ubuntu + The Ubuntu Font Family is a set of contemporary sans-serif fonts developed + between 2010-2011. Dalton Maag performed the font design work and + implementation with funding from Canonical. The fonts have been the default + fonts for Ubuntu since 2010. + +Package: fonts-urw-base35 +Architecture: all +Version: 20200910-8build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 15560 +Depends: xfonts-utils +Suggests: fonts-freefont-otf | fonts-freefont-ttf, fonts-texgyre +Breaks: gsfonts (<< 2:20200910-2~), gsfonts-x11 (<< 2:20200910-2~) +Replaces: gsfonts (<< 2:20200910-2~), gsfonts-x11 (<< 2:20200910-2~) +Filename: pool/fonts-urw-base35_20200910-8build1_all.deb +Size: 10937814 +MD5sum: 91bb569755602e51a5f17f18c1416fbb +SHA1: 84283250a9daabbef5a9cfd3801e600d76976f8f +SHA256: be59254289c670d5c6580ce381995292aa05c9dd4bc5fa65b9dbaa527b55adda +SHA512: 2641cb1016a69af9b212f6428cade32e4c9e499eefed7a72190a084f2198e662efbd44dd1769194eeac624ce36647a2c0b6935d138f67e5cb5c1f32d1efb79f2 +Homepage: https://github.com/ArtifexSoftware/urw-base35-fonts +Description: font set metric-compatible with the 35 PostScript Level 2 Base Fonts + A commercial-quality set of PostScript Type 1 fonts, metric-compatible + with the 35 PostScript Language Level 2 Base Fonts. This package contains + outlines in .t1 format and metrics in .afm format of the following fonts: + . + C059 + D050000L + Nimbus Mono PS + Nimbus Roman + Nimbus Sans + Nimbus Sans Narrow + P052 + Standard Symbols PS + URW Bookman + URW Gothic + Z003 + . + This package also makes the fonts available to an X server under both + their "urw" names and via fonts.alias under the official "adobe" names. + . + Extensive remakes of these fonts in the OpenType format are available in the + GUST TeX Gyre collection in the fonts-texgyre package. The Cyrillic glyphs + added to the now obsolete urwcyr fork of these fonts have been merged into + the GNU FreeFont collection available in the fonts-freefont-otf or + fonts-freefont-ttf packages. + +Package: foomatic-db-compressed-ppds +Architecture: all +Version: 20250819-1build1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: foomatic-db +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Group +Installed-Size: 446 +Provides: foomatic-db +Depends: python3:any, xz-utils +Recommends: cups, cups-client, cups-filters | foomatic-filters, ghostscript +Suggests: cups-filters, hplip, hplip-cups, openprinting-ppds, printer-driver-all +Conflicts: foomatic-db, foomatic-db-hpijs +Breaks: foomatic-db +Replaces: foomatic-db, foomatic-db-hpijs +Filename: pool/foomatic-db-compressed-ppds_20250819-1build1_all.deb +Size: 322532 +MD5sum: ba41bee9b3ce4e47d2b71965d0325f7f +SHA1: 31bf2a9b4b01c73311a39629206eeef632e6a74b +SHA256: ae9c1af11ce07fc2cb56cb0a87f8c4a7d21a774ca5e10b260fddb1977947c884 +SHA512: e15296ea6564e58ce54006413ddef29327cfea0ceb2c9a8c883a896400942cbba9086fe1d69154160c98a13f8eea439066cc395be09401efb07822ef8b0ad3d2 +Homepage: https://www.openprinting.org/ +Description: OpenPrinting printer support - Compressed PPDs derived from the database + Foomatic is a printing system designed to make it easier to set up + common printers for use with Debian (and other operating systems). + It provides the "glue" between a print spooler (like CUPS or lpr) and + your actual printer, by telling your computer how to process files + sent to the printer. + . + This package contains all PPD files which can be generated from the Foomatic + database as one small compressed archive. This reduces the disk space + consumption compared to the Foomatic XML database vastly and in addition + makes listing of all available PPDs and extracting the needed PPD much faster + than using the Foomatic XML database. + +Package: fprintd +Architecture: amd64 +Version: 1.94.5-4 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: FingerForce Team +Installed-Size: 676 +Depends: dbus, polkitd, libc6 (>= 2.34), libfprint-2-2 (>= 1:1.94.9), libglib2.0-0t64 (>= 2.64), libpolkit-gobject-1-0 (>= 0.99) +Filename: pool/fprintd_1.94.5-4_amd64.deb +Size: 95312 +MD5sum: 8f9eef7ca46c04d5d7516100446ca44d +SHA1: ac64bee65669c7d79eeb5c72be87a343f12c5d6f +SHA256: 52728aed9fa0d1620b24044545482113e75fee59c22acf7fad2fce4f6b631661 +SHA512: 43ec6e45e897c3ccf15b58e7070a59e398dd4b4458acb2e8972a51c42ffedaba2ac1618a400cd6ce5b59ee40bc16dff369741472e3b54e7d0d84d01451f7dd5b +Homepage: https://www.freedesktop.org/wiki/Software/fprint/fprintd +Description: D-Bus daemon for fingerprint reader access + fprintd is a D-Bus daemon that offers libfprint functionality over the + D-Bus interprocess communication bus. By adding this daemon layer above + libfprint, various problems related to multiple applications simultaneously + competing for fingerprint readers get solved. + +Package: freeipmi-common +Architecture: all +Version: 1.6.16-1ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: freeipmi +Maintainer: Ubuntu Developers +Original-Maintainer: Fabio Fantoni +Installed-Size: 368 +Suggests: freeipmi-tools +Breaks: libipmiconsole2 (<< 1.6.8-2~), libipmimonitoring6 (<< 1.6.8-2~) +Replaces: libipmiconsole2 (<< 1.6.8-2~), libipmimonitoring6 (<< 1.6.8-2~) +Filename: pool/freeipmi-common_1.6.16-1ubuntu0.1_all.deb +Size: 180762 +MD5sum: cfb034dff1ed2cf2911393f2031b302d +SHA1: 70f68a709d88f4c255234c788ae8b64520997343 +SHA256: 340a22f204486c0f178a1c1dad70360538b33679af4420b4f72b3dd6bcd82a47 +SHA512: 31537f1b580e483a7dac8a567905cc3ac88699adb9244e26192613cc773c666e2f91953cb7a62666bd50696b0571bea4818665b681c31a7ba847ac54f1c82983 +Homepage: https://www.gnu.org/software/freeipmi/ +Description: GNU implementation of the IPMI protocol - common files + FreeIPMI is a collection of Intelligent Platform Management IPMI + system software. It provides in-band and out-of-band software and a + development library conforming to the Intelligent Platform Management + Interface (IPMI v1.5 and v2.0) standards. + . + This package provides configuration used by the rest of FreeIPMI + framework and generic documentation to orient the user. + +Package: fuse3 +Architecture: amd64 +Version: 3.18.2-1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 97 +Provides: fuse (= 3.18.2-1) +Depends: libc6 (>= 2.38), libfuse3-4 (= 3.18.2-1), adduser, mount (>= 2.19.1), sed (>= 4) +Conflicts: fuse (<< 3.18.2-1) +Filename: pool/fuse3_3.18.2-1_amd64.deb +Size: 27490 +MD5sum: 42278f1d45572520c1c8989bc6bf90a0 +SHA1: e7307e97037f13f7e6abf8d55b532a6491bf54b0 +SHA256: a867fe3be1cbca271df70748b003232592c052233be5976d2a590f02327158db +SHA512: e082bb190d64066e50d1828c7591d072d34a08145eb1bac455bc59f6151ad6057d48ba75b4453b03c7cd040622e06821e0b6cdec575dc57a6b1ac79847c3b12c +Homepage: https://github.com/libfuse/libfuse/wiki +Description: Filesystem in Userspace (3.x version) + Filesystem in Userspace (FUSE) is a simple interface for userspace programs to + export a virtual filesystem to the Linux kernel. It also aims to provide a + secure method for non privileged users to create and mount their own filesystem + implementations. + +Package: fwupd +Architecture: amd64 +Version: 2.1.1-1ubuntu3.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI +Installed-Size: 18524 +Provides: fwupdate +Depends: systemd-sysusers, libblkid1 (>= 2.17.2), libc6 (>= 2.38), libcbor0.10 (>= 0.10.2), libcurl3t64-gnutls (>= 7.63.0), libdrm-amdgpu1 (>= 2.4.73), libdrm2 (>= 2.4.3), libflashrom1 (>= 1.6.0), libfwupd3 (= 2.1.1-1ubuntu3.1), libglib2.0-0t64 (>= 2.83.0), libgnutls30t64 (>= 3.7.3), libjcat1 (>= 0.2.0), liblzma5 (>= 5.1.1alpha+20120614), libmbim-glib4 (>= 1.28.0), libmbim-proxy, libmm-glib0 (>= 1.22.0), libmnl0 (>= 1.0.3-4~), libpolkit-gobject-1-0 (>= 0.99), libqmi-glib5 (>= 1.32.0), libqmi-proxy, libreadline8t64 (>= 6.0), libsqlite3-0 (>= 3.20.0), libsystemd0, libtss2-esys-3.0.2-0t64 (>= 2.3.1), libusb-1.0-0 (>= 2:1.0.27~rc1), libxmlb2 (>= 0.3.22), zlib1g (>= 1:1.2.11), shared-mime-info +Recommends: python3, bolt, default-dbus-system-bus | dbus-system-bus, secureboot-db, udisks2, fwupd-signed, jq +Suggests: gir1.2-fwupd-2.0 +Conflicts: fwupdate-amd64-signed, fwupdate-arm64-signed, fwupdate-armhf-signed, fwupdate-i386-signed +Breaks: fwupdate (<< 12-7), libdfu-dev (<< 0.9.7-1), libdfu1 (<< 0.9.7-1) +Replaces: fwupdate (<< 12-7), gir1.2-dfu-1.0 (<< 0.9.7-1), libdfu-dev (<< 0.9.7-1), libdfu1 (<< 0.9.7-1) +Filename: pool/fwupd_2.1.1-1ubuntu3.1_amd64.deb +Size: 12703386 +MD5sum: 9ae916bf27b986fd59132a2bb66f4820 +SHA1: ff3f8446469990923a7457d2c1e08f7e7e99e47b +SHA256: 19dd482b85dcf1344cfe3e90f52088485426a074cfb019ec7d4ced65734793d9 +SHA512: e2b21c254af7fac16c4f86f19b1f85f1153d60e58eeca6fd7da2a3e8c65003c5f3067b4166ca5a4ac4e5028a39a17efb367d2fa82fa768141787cfd341db816a +Homepage: https://github.com/fwupd/fwupd +Description: Firmware update daemon + fwupd is a daemon to allow session software to update device firmware. + You can either use a GUI software manager like GNOME Software to view and + apply updates, the command-line tool or the system D-Bus interface directly. + Firmware updates are supported for a variety of technologies. + See for details + +Package: fwupd-signed +Architecture: amd64 +Version: 1.55+1.7-1 +Built-Using: fwupd-efi (= 1:1.7-1) +Multi-Arch: foreign +Priority: optional +Section: utils +Source: fwupd-signed (1.55) +Maintainer: Ubuntu Developers +Installed-Size: 81 +Recommends: secureboot-db, fwupd +Filename: pool/fwupd-signed_1.55+1.7-1_amd64.deb +Size: 30618 +MD5sum: 554b0030489c6e5f6e61ccbd219136d8 +SHA1: 47e84ab9b80b01c4de7161a0d50ff305f145ce8b +SHA256: 0ac47da21856267d0cccd81ed0ded0165bfee15375821bf389ed75ae91fa8232 +SHA512: 3d937b3ffef3a4835fa444268f4db702d674d42e898cbad31b52efa3997ac1d50227bce4b973ee1e144bc9aab1c4db19fae3fdc2216cd4cc3acf7956e0263146 +Description: Linux Firmware Updater EFI signed binary + fwupd provides functionality to update system firmware. It has been + initially designed to update firmware using UEFI capsule updates, but + it is designed to be extensible to other firmware update standards. + . + This package contains a version of the fwupd binary signed with + Canonical's UEFI signing key. + +Package: gamemode +Architecture: amd64 +Version: 1.8.2-2build1 +Multi-Arch: allowed +Priority: optional +Section: games +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Games Team +Installed-Size: 81 +Depends: libc6 (>= 2.38), gamemode-daemon, libgamemode0, libgamemodeauto0 +Recommends: libgamemode0:i386, libgamemodeauto0:i386 +Suggests: gnome-shell-extension-gamemode +Filename: pool/gamemode_1.8.2-2build1_amd64.deb +Size: 17512 +MD5sum: e943b86ec0154969d1c7c1e8a32189de +SHA1: 037d19f740d040e9e7303b5a68d2ad4f2251424b +SHA256: 25e566cd0e29c5ea98b3f07d56395e270767c97cd9f37046cfe50f54b150b690 +SHA512: 6dde0e634f647dfb6d9ab9b99c010e374d60e6bcdf7acf07b06ab3852f2ef214b54a0676c0923a789a89713572a4953ae785adc4a39925d299c48330558d33c3 +Homepage: https://github.com/FeralInteractive/gamemode +Description: Optimise Linux system performance on demand + GameMode is a daemon/lib combo for Linux that allows games to request a set + of optimisations be temporarily applied to the host OS. + . + The design has a clear-cut abstraction between the host daemon and library + (gamemoded and libgamemode), and the client loaders (libgamemodeauto and + gamemode_client.h) that allows for safe use without worrying about whether + the daemon is installed or running. This design also means that while the + host library currently relies on systemd for exchanging messages with the + daemon, it's entirely possible to implement other internals that still work + with the same clients. + . + GameMode was designed primarily as a stop-gap solution to problems with + the Intel and AMD CPU powersave or ondemand governors, but is intended to + be expanded beyond just CPU governor states, as there are a wealth of + automation tasks one might want to apply. + . + This package is a metapackage including everything that is necessary to run + gamemode-enabled games or to enable it by hand for applications. It includes + a program called '/usr/games/gamemoderun', which can invoke gamemode into any + application. It also includes '/usr/games/gamemode-simulate-game', which + invokes gamemode, sleeps for 10 seconds and then exits. This allows you to + test whether gamemode is working properly on your system, it will return + gamemode's error message if something went wrong, otherwise it will exit with + a 0 status. + +Package: gamemode-daemon +Architecture: amd64 +Version: 1.8.2-2build1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gamemode +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Games Team +Installed-Size: 246 +Depends: init-system-helpers (>= 1.52), libc6 (>= 2.38), libinih1 (>= 40), libsystemd0 (>= 243), pkexec +Breaks: gamemode (<< 1.5.1-3), libgamemode0 (<< 1.5.1-3) +Filename: pool/gamemode-daemon_1.8.2-2build1_amd64.deb +Size: 70644 +MD5sum: 6635f3c71f9efb79e2d0655e098433e2 +SHA1: eef398e7f70673e76224b1aff2407e16fab65d8c +SHA256: a2238ef709a071223ce579cbcac9c20507731ebf17eff65ee8361fdbdd5369f6 +SHA512: 09dbdd540996f5d71fba68b2a7decd0278498ea935547f4defe4b4d57366003ae657037980078980592febe9ba28234b8b38f8b5ccf408a8de46f5a460af6158 +Homepage: https://github.com/FeralInteractive/gamemode +Description: Optimise Linux system performance on demand (daemon) + GameMode is a daemon/lib combo for Linux that allows games to request a set + of optimisations be temporarily applied to the host OS. + . + The design has a clear-cut abstraction between the host daemon and library + (gamemoded and libgamemode), and the client loaders (libgamemodeauto and + gamemode_client.h) that allows for safe use without worrying about whether + the daemon is installed or running. This design also means that while the + host library currently relies on systemd for exchanging messages with the + daemon, it's entirely possible to implement other internals that still work + with the same clients. + . + GameMode was designed primarily as a stop-gap solution to problems with + the Intel and AMD CPU powersave or ondemand governors, but is intended to + be expanded beyond just CPU governor states, as there are a wealth of + automation tasks one might want to apply. + . + This package provides the daemon and helper files. + +Package: gcc-15-base +Architecture: amd64 +Version: 15.2.0-16ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcc-15 +Maintainer: Ubuntu Core developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 106 +Breaks: gnat (<< 7) +Filename: pool/gcc-15-base_15.2.0-16ubuntu1_amd64.deb +Size: 39040 +MD5sum: ec77f9834440cd64659b206a30eea90d +SHA1: 355bbb025032e85557797640c4d4bc47a8545350 +SHA256: 5a302d705d562fb7e150415b00651c00fed58b633faadff0b332eac1b73fadb3 +SHA512: 27ca560e11dadc33fd99d93ab0b795964f403d39e09a7ff0cbc60377debb97afcc087bda3bef03157bda332888cae7831bfc25bee0ecf58dcbe2daf7fa05cb74 +Homepage: http://gcc.gnu.org/ +Description: GCC, the GNU Compiler Collection (base package) + This package contains files common to all languages and libraries + contained in the GNU Compiler Collection (GCC). + +Package: gcr +Architecture: amd64 +Version: 3.41.2-6 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 372 +Depends: default-dbus-session-bus | dbus-session-bus, gcr4, libgcr-base-3-1 (= 3.41.2-6), libgcr-ui-3-1 (= 3.41.2-6), dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.44.0), libgtk-3-0t64 (>= 3.22.0) +Filename: pool/gcr_3.41.2-6_amd64.deb +Size: 60450 +MD5sum: 8d14865c495ce2ad675d44723967d879 +SHA1: 4bd82d67c48a814039a47ca34887ee09edeaed37 +SHA256: 81fc97e9cac4d5beab2b61cb100705eea14b9d812c9181ea798205bb92844afe +SHA512: c268b2b8b283fb5913726e53f13cbd9ceb75e2605030f27c95f81746d99ccc5c9e0260688993e760d9d299ddb3cfe9b68d3049698621a18b23e5508c698fcf28 +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: GNOME crypto services (daemon and tools) + GCR is a library for crypto UI and related tasks. + . + This package contains the certificate viewer and prompter service. + +Package: gcr4 +Architecture: amd64 +Version: 4.4.0.1-8 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 212 +Depends: default-dbus-session-bus | dbus-session-bus, gcr, libgcr-4-4 (= 4.4.0.1-8), init-system-helpers (>= 1.52), libc6 (>= 2.34), libgck-2-2 (>= 3.3.90), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.0.0), libpango-1.0-0 (>= 1.14.0), libsecret-1-0 (>= 0.20), libsystemd0 +Breaks: gcr (<< 3.41.1-5~) +Replaces: gcr (<< 3.41.1-5~) +Filename: pool/gcr4_4.4.0.1-8_amd64.deb +Size: 43954 +MD5sum: dd3810de941c0e7df0ac2daa26b8b0d0 +SHA1: b07149c70378b2f211854b97f75e151a919ffa94 +SHA256: 89caf5746a48018ac325095ed1371abc4916ef515f9d1c39e87c73757b81cb9d +SHA512: 698deb15464249f1cbe12a59308f111822203e1cfe65fc6843a1251bc98af7869220e29ab18bcd031da3491b4a2727e0c5c330178f76348bcf948fd44b9be514 +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: GNOME crypto services (daemon and tools) + GCR is a library for crypto UI and related tasks. + . + This package contains the certificate viewer and prompter service. + +Package: gdb +Architecture: amd64 +Version: 17.1-2ubuntu1 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GDB Team +Installed-Size: 11728 +Provides: gdb-minimal +Depends: libbabeltrace1 (>= 1.5.4), libc6 (>= 2.42), libdebuginfod1t64 (>= 0.180), libexpat1 (>= 2.0.1), libgcc-s1 (>= 4.2), libgmp10 (>= 2:6.3.0+dfsg), libipt2 (>= 2.0), liblzma5 (>= 5.1.1alpha+20110809), libmpfr6 (>= 3.1.3), libncursesw6 (>= 6), libpython3.14 (>= 3.14.1), libreadline8t64 (>= 8.2~beta), libsource-highlight4t64 (>= 3.1.9), libstdc++6 (>= 14), libtinfo6 (>= 6), libxxhash0 (>= 0.6.5), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.11) +Recommends: libc-dbg +Suggests: gdb-doc, gdbserver +Breaks: gdb-minimal (<< 15.2-2~exp1) +Replaces: gdb-minimal (<< 15.2-2~exp1) +Filename: pool/gdb_17.1-2ubuntu1_amd64.deb +Size: 4173290 +MD5sum: 5ed5d98b67849342f1d03edd4794043a +SHA1: e7fa65b0880e3b80a8f4bf9963e183d6afb1f8fe +SHA256: e1034f3c120b99d9a34964b274d81d7525c4f22bf76f9f31308014a6bec20b3e +SHA512: 504ca9237b24b60f2e83941b6587c3ef2bfd0e404250a7a25883c9373b478654c25b4ff0fc436f0eec068c8b30774dba4e5fa460ec755c9f1a3ac859be194015 +Homepage: https://www.gnu.org/s/gdb/ +Description: GNU Debugger + GDB is a source-level debugger, capable of breaking programs at + any specific line, displaying variable values, and determining + where errors occurred. Currently, gdb supports C, C++, D, + Objective-C, Fortran, Java, OpenCL C, Pascal, assembly, Modula-2, + Go, and Ada. A must-have for any serious programmer. + +Package: gdisk +Architecture: amd64 +Version: 1.0.10-2build1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Jonathan Carter +Installed-Size: 808 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libncursesw6 (>= 6), libpopt0 (>= 1.14), libstdc++6 (>= 13.1), libtinfo6 (>= 6), libuuid1 (>= 2.16) +Recommends: groff-base +Filename: pool/gdisk_1.0.10-2build1_amd64.deb +Size: 258530 +MD5sum: 08939e3eb95ea3e1a181bc152455b994 +SHA1: cf4fd2f7f13fecb78a16b8e794eb7bed5d0c29bb +SHA256: 8bff3d86ac03a3f13312d73c52e594c4572308cf0373439b0567837c774a19e7 +SHA512: 2bf5f3b9103d80174882bcf91f5776fc99459864d70b085e4835518abd3f5e056faddc7426595de0a067316449af33473c685851545cd5d4b95a73208542b614 +Homepage: http://sourceforge.net/projects/gptfdisk/ +Description: GPT fdisk text-mode partitioning tool + GPT fdisk (aka gdisk) is a text-mode partitioning + tool that provides utilities for Globally Unique + Identifier (GUID) Partition Table (GPT) disks. + . + Features: + . + - Edit GUID partition table definitions + - In place conversion of BSD disklabels to GPT + - In place conversion of MBR to GPT + - In place conversion of GPT to MBR + - Create hybrid MBR/GPT layouts + - Repair damaged GPT data structures + - Repair damaged MBR structures + - Back up GPT data to a file (and restore from file) + +Package: gdm3 +Architecture: amd64 +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1536 +Provides: x-display-manager +Depends: accountsservice (>= 0.6.35), bash (>= 4.3), dconf-cli (>= 0.20), dconf-gsettings-backend (>= 0.20), dbus-bin | systemd-sysv, default-dbus-system-bus | dbus-system-bus, default-logind | logind, gir1.2-gdm-1.0 (= 50.1-0ubuntu0.1), ubuntu-session | gnome-session | x-session-manager | x-window-manager | x-terminal-emulator, gnome-session-bin (>= 50~alpha), gnome-session-common (>= 50~alpha), gnome-settings-daemon (>= 3.37.0), gnome-shell (>= 50~alpha), gsettings-desktop-schemas, libgdm1 (= 50.1-0ubuntu0.1), libglib2.0-bin (>= 2.35.0), libnss-systemd, libpam-modules (>= 0.72-1), libpam-runtime (>= 0.76-13.1), librsvg2-common, polkitd, procps, ucf, x11-common (>= 1:7.6+11), x11-xserver-utils, debconf (>= 0.5) | debconf-2.0, systemd | systemd-standalone-sysusers | systemd-sysusers, libaccountsservice0 (>= 0.6.55), libaudit1 (>= 1:2.2.1), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.83.0), libgudev-1.0-0 (>= 232), libjson-glib-1.0-0 (>= 1.5.2), libkeyutils1 (>= 1.5.9), libpam0g (>= 0.99.7.1), libpolkit-gobject-1-0 (>= 0.99), libselinux1 (>= 3.1~), libsystemd0 (>= 259), libxau6 (>= 1:1.0.11) +Recommends: at-spi2-core, ubuntu-session | gnome-session | x-session-manager, x11-xkb-utils, zenity +Suggests: orca, libpam-fprintd (>= 0.8.0-2), libpam-sss (>= 2.3.0-1), libpam-pkcs11, libpam-gnome-keyring +Breaks: gnome-remote-desktop (<< 50~rc) +Filename: pool/gdm3_50.1-0ubuntu0.1_amd64.deb +Size: 246294 +MD5sum: 4d18464682bc70795fa9001ff00c1113 +SHA1: 91423ff59811c1d2951109b4ceefb85015be6f65 +SHA256: 6d979c79ce3492236e9a2467c5a11e4f5355f087f08ca0dfc0e0e3320b5d2aae +SHA512: d19c977dfec1bba4691f4efc7f8e17363ea17f1b34ee3991cffbd90bf3c86d610dc065b093b7ac0f05323d4ba40386f2eb1bff06a5c212dc854163f16d78ecbf +Homepage: https://wiki.gnome.org/Projects/GDM/ +Description: GNOME Display Manager + GDM provides the equivalent of a "login:" prompt for X displays: it + asks for a login and starts graphical sessions. + . + It supports multiple seats and switching between multiple users. + . + The greeter is based on the GNOME libraries and applications, and its + look and design are the same as those of a GNOME session. + +Package: geoclue-2.0 +Architecture: amd64 +Version: 2.7.2-2ubuntu3 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 397 +Depends: adduser, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libavahi-glib1 (>= 0.6.16), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.83.0), libjson-glib-1.0-0 (>= 1.5.2), libmm-glib0 (>= 1.18.2), libnotify4 (>= 0.7.0), libsoup-3.0-0 (>= 3.0.3) +Recommends: avahi-daemon, iio-sensor-proxy, modemmanager, wpasupplicant +Breaks: geoclue (>= 2.0) +Replaces: geoclue (>= 2.0) +Filename: pool/geoclue-2.0_2.7.2-2ubuntu3_amd64.deb +Size: 106006 +MD5sum: f372c3b90150487fb3f2046dd6ea7c7d +SHA1: 01fa6d75aa3f0dd5a5bcaab4d1c56054b2bb8efd +SHA256: 32e3c75cd3ad2acae2c4ef282a816516822306484f7e6605a59126dad2597aba +SHA512: bf24a51fb446e5b7b2210f68a9f37590f210964bdf52934f0b0953ee8eecc5da6e46cc7a16e92fc2446916bb0abcacab5a7aec891066fd74d46c154ec77b7250 +Homepage: https://gitlab.freedesktop.org/geoclue/geoclue/wikis/home +Description: geoinformation service + GeoClue is a D-Bus geoinformation service. The goal of the Geoclue project + is to make creating location-aware applications as simple as possible. + . + This package contains the D-Bus system service for GeoClue. + +Package: geocode-glib-common +Architecture: all +Version: 3.26.4-3 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: geocode-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 107 +Breaks: libgeocode-glib-2-0 (<< 3.26.3-4~) +Replaces: libgeocode-glib-2-0 (<< 3.26.3-4~) +Filename: pool/geocode-glib-common_3.26.4-3_all.deb +Size: 19134 +MD5sum: d8defe5c7a8b6b6fd19fa122a6786085 +SHA1: fa8da86dfb9824bea967990f6ccf967c801ae766 +SHA256: f1261a0a2e3829cf1603b3a4b3dd2f9eec857cdac7d22ad238dc034a3cc7ac3e +SHA512: 35ccd3ef0d762224a4d592a766489df3caef113c95d13d37e4cd7948b19a76a7f9534c2db3a0ca32d0b4ecdf031fac0b016d821934d37c630e2fe30b1ef6f986 +Description: icons for the geocode-glib library + Geocode-glib allows you to do geocoding (going from a place name, + to a longitude/latitude pair) and reverse geocoding (finding a place + name from coordinates) using the Nominatim service. + . + This package contains the icons for the geocode-glib library. + +Package: gettext-base +Architecture: amd64 +Version: 0.23.2-1 +Multi-Arch: foreign +Priority: standard +Section: utils +Source: gettext +Maintainer: Ubuntu Developers +Original-Maintainer: Santiago Vila +Installed-Size: 276 +Depends: libc6 (>= 2.38) +Filename: pool/gettext-base_0.23.2-1_amd64.deb +Size: 42256 +MD5sum: 34a26c888bb6308c187a81334543c479 +SHA1: 1595ed318fb573e6e2960daec96a665738a9df86 +SHA256: 5a1a4cd407a868e766626f551646b00880fc1534db5e6d47208310a17252f306 +SHA512: 56ea32b249aa486fd35815816e58646c69492443b630a7e221702809c239e6b7b78f556fedb16b3523f5906d938480c2aee263b156b3e08fca6c042b8605691f +Homepage: https://www.gnu.org/software/gettext/ +Description: GNU Internationalization utilities for the base system + This package includes the gettext and ngettext programs which allow + other packages to internationalize the messages given by shell scripts. + +Package: ghostscript +Architecture: amd64 +Version: 10.06.0~dfsg-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 187 +Provides: ghostscript-x (= 10.06.0~dfsg-3ubuntu1), postscript-viewer +Depends: libgs10 (= 10.06.0~dfsg-3ubuntu1), libc6 (>= 2.34) +Suggests: texlive-binaries +Conflicts: ghostscript-x (<< 10.02.0~dfsg-1) +Breaks: manpages-l10n (<< 4.22) +Replaces: ghostscript-x (<< 10.02.0~dfsg-1) +Filename: pool/ghostscript_10.06.0~dfsg-3ubuntu1_amd64.deb +Size: 43158 +MD5sum: ddaf3737a8326403f4a85e57dafb7873 +SHA1: ee64e51a063512b2802bcbd6e08b68ec7fe00898 +SHA256: 30a71a4e787afa88617b8f9239fd4ddbccfddb54dc63fef0b1687cecc60e510c +SHA512: 6714a6cec872c8428e2212bb2fc6b820b14aeb5a6419d2283bc39b5a561b2d6e984f3a9884b543cb6f81780b5ba065b26ca7ebf8160667a646265a53902de76f +Homepage: https://www.ghostscript.com/ +Description: interpreter for the PostScript language and for PDF + GPL Ghostscript is used for PostScript/PDF preview and printing. + Usually as a back-end to a program such as ghostview, + it can display PostScript and PDF documents in an X11 environment. + . + Furthermore, it can render PostScript and PDF files as graphics + to be printed on non-PostScript printers. + Supported printers include common dot-matrix, inkjet and laser models. + . + The suggested texlive-binaries package is only required when using dvipdf. + +Package: gir1.2-accountsservice-1.0 +Architecture: amd64 +Version: 23.13.9-8ubuntu5.2 +Multi-Arch: same +Priority: optional +Section: introspection +Source: accountsservice +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 29 +Depends: gir1.2-gio-2.0, gir1.2-gobject-2.0, libaccountsservice0 (>= 23.13.9) +Filename: pool/gir1.2-accountsservice-1.0_23.13.9-8ubuntu5.2_amd64.deb +Size: 5344 +MD5sum: edbcbaf27be433a0c4586c0121ef6c09 +SHA1: 99ea33cba9e1ce5c8baf26cbf02fe2f80e13f67c +SHA256: ebd57ea07ae33b06cf9849d98392dcdc994ea67fb6d875f34eae8dd4c99e3af7 +SHA512: 66a92054bcae690273c7e0eb62638b1bd919a373c438872abd5d9db6aaa0851319b7eacf1d215f9f2f2b9fe0e27e0e02f0e9f0054c03f362b7e5449d50317b4e +Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/ +Description: GObject introspection data for AccountService + The AccountService project provides a set of D-Bus + interfaces for querying and manipulating user account + information and an implementation of these interfaces, + based on the useradd, usermod and userdel commands. + . + This package provides the introspection data for the + AccountService library. + +Package: gir1.2-adw-1 +Architecture: amd64 +Version: 1.9.1-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libadwaita-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 194 +Depends: gir1.2-gio-2.0, gir1.2-gtk-4.0 (>= 4.21.1), libadwaita-1-0 (>= 1.9~beta) +Filename: pool/gir1.2-adw-1_1.9.1-0ubuntu0.1_amd64.deb +Size: 46674 +MD5sum: 8e84c09e8cac00bcc43040199b2ceca2 +SHA1: 84101573aa7d8926ef7605757b823075bc9fab39 +SHA256: 634bc3d42b0fa94559fa5d9841adf42a645c121a6a848f8270ab36e0efd1bdaf +SHA512: b0bafdcb418a3d358f986c9206e01d2bc951237c131fcc47f70eea0edc465cc4ad9dcbef0e33f194e087334dd891a91c77b9e9711efdae32461ae4237bfb312a +Homepage: https://gnome.pages.gitlab.gnome.org/libadwaita/ +Description: GObject introspection files for libadwaita + libadwaita provides GTK widgets and GObjects to ease developing + applications for mobile phones. + . + This package contains the GObject-introspection data in binary typelib format. + +Package: gir1.2-atk-1.0 +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 100 +Depends: gir1.2-gobject-2.0, libatk1.0-0t64 (= 2.60.4-0ubuntu0.1) +Filename: pool/gir1.2-atk-1.0_2.60.4-0ubuntu0.1_amd64.deb +Size: 23176 +MD5sum: 5d7775a81b3e3d401a41c61106d51abf +SHA1: d915d43221539f78789fbba2927547db8e6ffa5b +SHA256: 51c76d8da01f7393cc29229e050addf92a84f1e1fa4d62fb41f2495e14f09e99 +SHA512: 5aef8d8b130681bc28f14890faf09ddb190789cf22e238e7a9155890468f5b5a94c8a3c73629c4e129c8e4ff7e9a966ff07672cb506901908fbd953bfde6ccde +Homepage: https://wiki.gnome.org/Accessibility +Description: ATK accessibility toolkit (GObject introspection) + ATK is a toolkit providing accessibility interfaces for applications or + other toolkits. By implementing these interfaces, those other toolkits or + applications can be used with tools such as screen readers, magnifiers, and + other alternative input devices. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings + +Package: gir1.2-atspi-2.0 +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 95 +Depends: gir1.2-dbus-1.0, gir1.2-glib-2.0, gir1.2-gobject-2.0, libatspi2.0-0t64 (= 2.60.4-0ubuntu0.1), python3:any +Breaks: python3-pyatspi (<< 2.57.0-1) +Replaces: gir1.0-gtk-2.0 (<< 2.22), gobject-introspection-repository +Filename: pool/gir1.2-atspi-2.0_2.60.4-0ubuntu0.1_amd64.deb +Size: 22578 +MD5sum: e1f621a5e783637fe4631f3e6ef4411a +SHA1: 3098b5cd5c2da71128ee4987d3816f9c061d3b1b +SHA256: c1094d9dda13dfa5d0f9dab2270e9eba36968197bb6262d98a4d99186ac59f45 +SHA512: 1f6adade530f67f983b4be0fea7e31110678ea11a92b7d820feb0a1a7a81d1baf390d7697791078f5f533e90d74523e5ba86e702ac193137d3c2cd5b1ca3bd33 +Homepage: https://wiki.gnome.org/Accessibility +Description: Assistive Technology Service Provider (GObject introspection) + This package can be used by other packages using the GIRepository format to + generate dynamic bindings + +Package: gir1.2-dbusmenu-glib-0.4 +Architecture: amd64 +Version: 18.10.20180917~bzr492+repack1-4build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libdbusmenu +Maintainer: Ubuntu Developers +Original-Maintainer: The Ayatana Packagers +Installed-Size: 32 +Depends: libdbusmenu-glib4 (= 18.10.20180917~bzr492+repack1-4build1), gir1.2-gobject-2.0 +Filename: pool/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +Size: 7050 +MD5sum: c271035601f784b722f9f3ccc909eac2 +SHA1: d2d5487e262b26093cad7eb36e538ddbaf97f64b +SHA256: 22daa702e579d72bac3887b0fbd4a54340424a19730aefd2079ef3f1451449f9 +SHA512: b82c85172d28d4d2470c42e6115d332a4e18c8e2fe8e9a239e301907195215f9492acd016edd452a7db309b6ddd06b746fbfbb7421011225f2bc88efff469324 +Homepage: https://launchpad.net/dbusmenu +Description: typelib file for libdbusmenu-glib4 + libdbusmenu passes a menu structure across DBus so that a program can + create a menu simply without worrying about how it is displayed on the + other side of the bus. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings for libdbusmenu-glib4. + +Package: gir1.2-freedesktop +Architecture: amd64 +Version: 1.86.0-6build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gobject-introspection +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 234 +Provides: gir1.2-cairo-1.0 (= 1.86.0-6build1), gir1.2-dbus-1.0 (= 1.86.0-6build1), gir1.2-dbusglib-1.0 (= 1.86.0-6build1), gir1.2-fontconfig-2.0 (= 1.86.0-6build1), gir1.2-freetype2-2.0 (= 1.86.0-6build1), gir1.2-gl-1.0 (= 1.86.0-6build1), gir1.2-libxml2-2.0 (= 1.86.0-6build1), gir1.2-vulkan-1.0 (= 1.86.0-6build1), gir1.2-xfixes-4.0 (= 1.86.0-6build1), gir1.2-xft-2.0 (= 1.86.0-6build1), gir1.2-xlib-2.0 (= 1.86.0-6build1), gir1.2-xrandr-1.3 (= 1.86.0-6build1) +Depends: gir1.2-gobject-2.0 (>= 2.82.0), libcairo-gobject2 (>= 1.18.0) +Filename: pool/gir1.2-freedesktop_1.86.0-6build1_amd64.deb +Size: 66000 +MD5sum: 6ee1edac312031b90aefc96b1ea19535 +SHA1: 6fb3d7c61471a8d85ec65d7a43a497dff84e1852 +SHA256: b03241fd8fcee4ee829ebfecadf28799ec7da36c2e0ab49f2626def937a1f4b6 +SHA512: 9286857b4239328d5009a98160981f677e625ee179cb1f3e75d9d081ad356b27be3f45b9c72c3312cc4045f5d2b73ecb237e1cbcb959ec2639fd2b9c0dc954f2 +Homepage: https://wiki.gnome.org/GObjectIntrospection +Description: Introspection data for some FreeDesktop components + GObject Introspection is a project for providing machine readable + introspection data of the API of C libraries. This introspection + data can be used in several different use cases, for example + automatic code generation for bindings, API verification and documentation + generation. + . + GObject Introspection contains tools to generate and handle the + introspection data. + . + This package contains small pieces of introspection data for the Cairo, + FontConfig, FreeType, GL, and some XOrg libraries, in the typelib format + used to generate bindings for dynamic languages like JavaScript and Python. + They are far from complete and only include what is necessary for other + introspection packages to work properly. + +Package: gir1.2-gck-2 +Architecture: amd64 +Version: 4.4.0.1-8 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gcr4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 49 +Depends: libgck-2-2 (= 4.4.0.1-8), gir1.2-gio-2.0, gir1.2-gobject-2.0 +Filename: pool/gir1.2-gck-2_4.4.0.1-8_amd64.deb +Size: 10752 +MD5sum: 59391adb0644a5f755da61dde6da6f54 +SHA1: 60057c5b6617611243d427c915ead33e2e259c9e +SHA256: 8108abbbcca7b3fcac82d69cd2562a0cc32f6e1e2963eb0610c0534be8fb7533 +SHA512: 5682f9c85e4d198d29d4238279bc4b0516004e3d870e129b049b9128473f378237480278c54d211b8bfa1bcd80fa067a287f8ce25496e72abfa3c87d4bd7c261 +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: GObject introspection data for the GCK library + This package contains introspection data for GCK, a wrapper based on GLib + implementing the PKCS#11 (Cryptoki) interface. + . + It can be used by interpreters understanding the GIRepository format to + write programs using the GCK library. + +Package: gir1.2-gcr-4 +Architecture: amd64 +Version: 4.4.0.1-8 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gcr4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 60 +Depends: libgcr-4-4 (= 4.4.0.1-8), gir1.2-gck-2 (= 4.4.0.1-8), gir1.2-gio-2.0, gir1.2-gobject-2.0 +Filename: pool/gir1.2-gcr-4_4.4.0.1-8_amd64.deb +Size: 13980 +MD5sum: 4d7d446e4a9014e42ab222cf06a9d124 +SHA1: f7b17b52305721b866a5ef324c66119fde20261c +SHA256: 7ae3ce47e33fbfa3b30f30f43fc52625fa72095829748c5d169f47d3e6d61e3e +SHA512: 271d1aeafd17a40e6efca8987a283f8c4a5e59bf5dedc8c23e64b88d098cdaf93c8352865eae7ec1af380d6fb072762dae577462939f64dde57c8ac6f0c8e9dc +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: GObject introspection data for the GCR library + This package contains introspection data for GCR, a library for crypto UI + and related tasks. + . + It can be used by interpreters understanding the GIRepository format to + write programs using the GCR library. + +Package: gir1.2-gdesktopenums-3.0 +Architecture: amd64 +Version: 50.0-1ubuntu2 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gsettings-desktop-schemas +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 28 +Filename: pool/gir1.2-gdesktopenums-3.0_50.0-1ubuntu2_amd64.deb +Size: 10164 +MD5sum: 7bc47e8e25f13569be7bef33741351cf +SHA1: c79f5d5577de237dbccc90d4c0c3301c77fe07cc +SHA256: a9eae556dc799df2b9681714c26a3feaeb200c4206594fcf2cf95f9a376a405d +SHA512: 9c980425e1e9287d1aab1f9422f5621c738eee4de9bd3016cfb7e12fe65c807eacbc4477a5bc5a591d18d9ee4503ed8daf609fb45b049ca7b13f13027bdf24dd +Homepage: https://www.gnome.org/ +Description: GObject introspection for GSettings desktop-wide schemas + gsettings-desktop-schemas contains a collection of GSettings schemas for + settings shared by various components of a desktop. + . + This package contains introspection data for GSettings desktop-wide schemas. It + can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-gdkpixbuf-2.0 +Architecture: amd64 +Version: 2.44.5+dfsg-4ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gdk-pixbuf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 41 +Provides: gir1.2-gdkpixdata-2.0 (= 2.44.5+dfsg-4ubuntu1) +Depends: gir1.2-gio-2.0, gir1.2-gmodule-2.0, libgdk-pixbuf-2.0-0 (>= 2.39.2) +Filename: pool/gir1.2-gdkpixbuf-2.0_2.44.5+dfsg-4ubuntu1_amd64.deb +Size: 9312 +MD5sum: 39b2f430d00a549bc5671a65d1447976 +SHA1: 81aa4920492e1707e9b8384ac0309bc29606c138 +SHA256: 58a8f3f358a96d0039671c697a8241781fc95f70593aafef78b7d09625305d13 +SHA512: ff8f10c4762e9933fe0337bb976829341b2ec114d11b3d9985fc725ba867e7579b656ad767f73cb812a3d375a101e5bc9055cb0334773a184d9a0dbf654ca00f +Homepage: https://www.gtk.org/ +Description: GDK Pixbuf library - GObject-Introspection + The GDK Pixbuf library provides: + - Image loading and saving facilities. + - Fast scaling and compositing of pixbufs. + - Simple animation loading (ie. animated GIFs) + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-gdm-1.0 +Architecture: amd64 +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: introspection +Source: gdm3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 65 +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0, gir1.2-gobject-2.0, libgdm1 (>= 50~beta) +Filename: pool/gir1.2-gdm-1.0_50.1-0ubuntu0.1_amd64.deb +Size: 10004 +MD5sum: 93250f8906f8543f30bdd79f4420c662 +SHA1: c1689184db42ce4048171240e5a8ad70ec864485 +SHA256: a82639e1bb188eeb7cf985f3739427d6e701cbeb69526c020eb39a780570b8ee +SHA512: f881a0da23d999b1730317cc7ce0c5ae5563540faaec02660bf82b4f6386c1700203bfd5f89f600b853125d43d4265cba197bee8b9c8f6ad6452d690d794997e +Homepage: https://wiki.gnome.org/Projects/GDM/ +Description: GObject introspection data for the GNOME Display Manager + GDM provides the equivalent of a "login:" prompt for X displays: it + asks for a login and starts graphical sessions. + . + It supports multiple seats and switching between multiple users. + . + The greeter is based on the GNOME libraries and applications, and its + look and design are the same as those of a GNOME session. + . + This package contains introspection data for the GNOME Display Manager. + +Package: gir1.2-geoclue-2.0 +Architecture: amd64 +Version: 2.7.2-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: introspection +Source: geoclue-2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 42 +Depends: gir1.2-gio-2.0, gir1.2-gobject-2.0, libgeoclue-2-0 (>= 2.6.0) +Filename: pool/gir1.2-geoclue-2.0_2.7.2-2ubuntu3_amd64.deb +Size: 6192 +MD5sum: 8e97de9c8900d6f1738a685c98878f24 +SHA1: f8024c43c747c24759bf5bbe847872f87c520c30 +SHA256: 32534963075b451aa2c723ae2096ddb13d3d4365945392e8ae7ba94dcefb0643 +SHA512: 8c24f4f1351bd362648db23ccd6309a9e71070fc5f458e3566e5f0a1ba5c5e6ade6f9827e5e7fad8f98c0904ddbd469296cddb7564567b02819c63e250fc5994 +Homepage: https://gitlab.freedesktop.org/geoclue/geoclue/wikis/home +Description: convenience library to interact with geoinformation service (introspection) + GeoClue is a D-Bus geoinformation service. The goal of the Geoclue project + is to make creating location-aware applications as simple as possible. + . + This package contains the introspection data. + +Package: gir1.2-girepository-3.0 +Architecture: amd64 +Version: 2.88.0-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 108 +Depends: gir1.2-glib-2.0 (= 2.88.0-1), libgirepository-2.0-0 (= 2.88.0-1) +Filename: pool/gir1.2-girepository-3.0_2.88.0-1_amd64.deb +Size: 25132 +MD5sum: 146e7d8678e2b1d6f5033ee1b9df02cd +SHA1: 7f052efcd5db5c29903ba94b2d86d79c9fc63e39 +SHA256: 0c88684f606a84ba792aa09909e2ef1cc65eba7262789bbb387c4d00f339f9fb +SHA512: c089a7bf0d92b5705c389cb800a1184c454a0b6bfa25b9870d2d34477288f47aeb942990c40035aacd844d9feeed3b84f35a095060fcbbcc6c506f2b38b7f152 +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: Introspection data for GIRepository library, API version 3.0 + GObject Introspection is a project for providing machine readable + introspection data of the API of C libraries. This introspection + data can be used in several different use cases, for example + automatic code generation for bindings, API verification and documentation + generation. + . + This package contains the introspection data for the GIRepository library, + which can be used to manipulate the search path used by language bindings + and load introspection data. + +Package: gir1.2-glib-2.0 +Architecture: amd64 +Version: 2.88.0-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 746 +Provides: gir1.2-gio-2.0 (= 2.88.0-1), gir1.2-giounix-2.0 (= 2.88.0-1), gir1.2-glibunix-2.0 (= 2.88.0-1), gir1.2-gmodule-2.0 (= 2.88.0-1), gir1.2-gobject-2.0 (= 2.88.0-1) +Depends: libglib2.0-0t64 (= 2.88.0-1) +Breaks: awesome (<< 4.3-8~), cinnamon (<< 6.4.12-1~), gnome-menus (<< 3.36.0-4~), gnome-shell (<< 48.5-3~), libgirepository-1.0-1 (<< 1.78.1-3~), libgjs0 (<< 1.87.2~), libgjs0g (<< 1.82.3-2~), python3-gi (<< 3.55.3~) +Filename: pool/gir1.2-glib-2.0_2.88.0-1_amd64.deb +Size: 182516 +MD5sum: c8226113fea81bd4135c878da3f0cfaf +SHA1: c53303a93a6a5636a4ac1df956a8cdd0aec6f7d6 +SHA256: b4b0b4822f5cae347a6ed288adb60a8ebb2f9ea9ee66469e4a810f48b89a87aa +SHA512: 64fdb9f18635775239146a405205922607776f8ca5fd33bfb8ce54fe5181b99e8a4aae6765232e26a06fd6e8124a1f1b1f8dfca02708c010b2fca7869a123b1b +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: Introspection data for GLib, GObject, Gio and GModule + GObject Introspection is a project for providing machine readable + introspection data of the API of C libraries. This introspection + data can be used in several different use cases, for example + automatic code generation for bindings, API verification and documentation + generation. + . + This package contains the introspection data for the GLib, GObject, + GModule and Gio libraries, in the typelib format used to generate + bindings for dynamic languages like JavaScript and Python. + +Package: gir1.2-gmenu-3.0 +Architecture: amd64 +Version: 3.38.1-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-menus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 19 +Depends: gir1.2-gio-2.0, gir1.2-giounix-2.0, libgnome-menu-3-0 (>= 3.6.0) +Filename: pool/gir1.2-gmenu-3.0_3.38.1-1ubuntu1_amd64.deb +Size: 3744 +MD5sum: e0dc052f130d6d1ebb197558b7e53e5c +SHA1: 56c26a5ba33fe99bff1d2f0e6c667774815c198d +SHA256: fafc76d4e7d4ea45ff6bfe9992f1f0d5a547aeae5e7db2c46c35c1731c1bb0de +SHA512: 98a0ed0c211cd628657a2b7ae840719995a127019b9d59354c9d79aaa283c900e7f2edea779801ad1293ec09222593c917d09338a5cbad553467460a1faa6e35 +Description: GObject introspection data for the GNOME menu library + This package contains introspection data for GNOME menu, an + implementation of the desktop menu specification from freedesktop.org. + . + It can be used by languages supporting dynamic bindings with + the GIRepository format. + +Package: gir1.2-gnomeautoar-0.1 +Architecture: amd64 +Version: 0.4.5-5 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-autoar +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 23 +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0, gir1.2-gobject-2.0, libgnome-autoar-0-0 (>= 0.4.4) +Filename: pool/gir1.2-gnomeautoar-0.1_0.4.5-5_amd64.deb +Size: 4528 +MD5sum: ae1966aa7635d0b66aa0a7bcf49422fd +SHA1: d36f4e79b58dcd917bfa3d7d84253bd65938a4f2 +SHA256: 9acd8fb0f912992e1660d81ced96d004e4f4069808a9b84ee0239b74d03993b5 +SHA512: 1e1f88ee1b055f93ac5f90f04b672e34010768f9995b2cbc9f9f9f239d7289b2eaf48fde1d13df5fc0ea7f821e6b9e2e8a1bfe5a16515f4baf644a3acc5d5a73 +Description: GObject introspection data for GnomeAutoar + This package contains GObject introspection information. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-gnomebg-4.0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 29 +Depends: gir1.2-gdk-4.0 (>= 4.12.0), gir1.2-gdkpixbuf-2.0, gir1.2-gnomedesktop-4.0 (= 44.5-1ubuntu1), libgnome-bg-4-2t64 (>= 3.27.90) +Filename: pool/gir1.2-gnomebg-4.0_44.5-1ubuntu1_amd64.deb +Size: 4512 +MD5sum: eafe6b21b0365da50b39e5a543455769 +SHA1: 424f7db6604bd06e934c4d5136ba5b86b3bebadd +SHA256: 3f42af66fec0c50d09b8d31501527b5dd285e689da15f0abce7202f63bb3574b +SHA512: 3bd28faf2f7bff52af9c18177745c4d6b478602db4d2d31ca331413eedfb7562830cea8a1860487770e3e60c74bd6f276f9a9c48abca028fae6bf438a3668042 +Description: Introspection data for GnomeBG (GTK 4) + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This package contains GObject-Introspection bindings for background image + (wallpaper) management. + +Package: gir1.2-gnomebluetooth-3.0 +Architecture: amd64 +Version: 47.1-5 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-bluetooth +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 25 +Depends: gir1.2-gio-2.0, libgnome-bluetooth-3.0-13 (>= 42.3) +Filename: pool/gir1.2-gnomebluetooth-3.0_47.1-5_amd64.deb +Size: 4746 +MD5sum: 02b9a43e757fb29f5b8a5b0df862d411 +SHA1: 69f67be40159c37a4b7087089da9a37e323cba4e +SHA256: d357d32976242090c317647eb19b8e9208ac811e89d1119578c44b00bb800255 +SHA512: 3e9a81f858a40525e633691d1b326ff7f39a354553edd030366b35d0134413df2600e3d44ca1e0fd7cc5d90b3ea77fdd34aa428f1f8dda363522549177d49bc5 +Homepage: https://wiki.gnome.org/Projects/GnomeBluetooth +Description: Introspection data for GnomeBluetooth + This package contains tools for managing and manipulating Bluetooth + devices using the GNOME desktop. + . + The libraries included provide support to gnome-bluetooth. + . + This package contains the introspection data for GnomeBluetooth + +Package: gir1.2-gnomedesktop-3.0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 50 +Depends: gir1.2-gdesktopenums-3.0, gir1.2-gobject-2.0, gir1.2-gtk-3.0, libgnome-desktop-3-20t64 (>= 43~alpha) +Filename: pool/gir1.2-gnomedesktop-3.0_44.5-1ubuntu1_amd64.deb +Size: 10022 +MD5sum: 2876d66254f5ae862780fcfd740014b0 +SHA1: 045a391aa3d43a9afa139c33652bb0c82682348f +SHA256: e793934c521a2d1f9e6a956d9191d198fd62909116c1e810c4dcfab77505bdd9 +SHA512: 06507662ccbb4f80f388d0c587cf250c8c0894b39034ca6d0a53f0d1decf71d3e9848fea7e4a94424b65de74098791e0c3dad6b907b25f9e1896bc334cee5a17 +Description: Introspection data for GnomeDesktop (GTK 3) + This package provides the include files and static library for the GNOME + desktop library functions. + . + This package contains the introspection data for GnomeDesktop + +Package: gir1.2-gnomedesktop-4.0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 34 +Depends: gir1.2-gdesktopenums-3.0, gir1.2-gdkpixbuf-2.0, gir1.2-gio-2.0, gir1.2-gobject-2.0, libgnome-desktop-4-2t64 (>= 43~alpha) +Breaks: gnome-shell (<< 42~alpha) +Filename: pool/gir1.2-gnomedesktop-4.0_44.5-1ubuntu1_amd64.deb +Size: 5846 +MD5sum: df9cc7143cd0bb6ff3f1b6dcb1c46b46 +SHA1: 1970e2a24bf3614e54ea4fabb857d7b4d1a2de91 +SHA256: 8218a177aa366bb3f124bb9364743ebefb1024672d3427d7ab74d94ef812f1db +SHA512: 18fd7eeebc4e7080d17f03e3d7a3f08fa8f0bf392762d3955dc81cc6d926d151f559c4c62ff779870c9f3ffcaac1344919a7144f04da34a170ecbfb8151cead6 +Description: Introspection data for GnomeDesktop (GTK 4) + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This package contains GObject-Introspection bindings for miscellaneous + utility functions. + +Package: gir1.2-gnomeqr-4.0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 26 +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0, libgnome-qr-4-0 (>= 44.5-1ubuntu1) +Filename: pool/gir1.2-gnomeqr-4.0_44.5-1ubuntu1_amd64.deb +Size: 3762 +MD5sum: 53d25edc2a9a1460c6752ddc9809e757 +SHA1: c12ab0c5f087f8b6d45c61fa5d2e79af3b24dc4c +SHA256: 5850a0847902085e922af6008aa5ada8bf3c77e82fb27149425b1a4b25e7e8a0 +SHA512: aab8814ab5822230df99251a4f4c4dc7baf17ffd65acef152bf300acce3f4003e0a3c51295a6496e24571a11db8cb30ce19b078db13105de7a45630f58a2f8d8 +Description: Introspection data for GnomeQR + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This package contains GObject-Introspection bindings for creating QR + codes. + +Package: gir1.2-graphene-1.0 +Architecture: amd64 +Version: 1.10.8-5build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: graphene +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 52 +Depends: gir1.2-gobject-2.0, libgraphene-1.0-0 (>= 1.10.0) +Filename: pool/gir1.2-graphene-1.0_1.10.8-5build1_amd64.deb +Size: 11082 +MD5sum: e7a6c095b21dc625650ee6c7806398be +SHA1: a2a29165c7936c3e8ec8a201c5b41a3681e0e4b2 +SHA256: 83473d0c46e2f0f05e9a74274e8116a919007e01a375c8f9bd281a1c7fc03999 +SHA512: 04fc775fb59d0a9cc8cb2a959b7790603997b6c018da869d026c9428ca089b05025491a67babb77f7767e81a3511f686016b0655e03a3a8fc8406f102b11f593 +Homepage: https://ebassi.github.io/graphene/ +Description: library of graphic data types (introspection files) + Graphene provides a small set of mathematical types needed to implement + graphic libraries that deal with 2D and 3D transformations and projections. + . + This library provides types and their relative API; it does not deal with + windowing system surfaces, drawing, scene graphs, or input. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. + +Package: gir1.2-gstreamer-1.0 +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gstreamer1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 396 +Provides: gir1.2-gst-1.0 (= 1.28.2-1), gir1.2-gstbase-1.0 (= 1.28.2-1), gir1.2-gstcheck-1.0 (= 1.28.2-1), gir1.2-gstcontroller-1.0 (= 1.28.2-1), gir1.2-gstnet-1.0 (= 1.28.2-1) +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0, gir1.2-gmodule-2.0, gir1.2-gobject-2.0, libgstreamer1.0-0 (>= 1.27.90) +Filename: pool/gir1.2-gstreamer-1.0_1.28.2-1_amd64.deb +Size: 97834 +MD5sum: b1b1a4a9c005b4e71dd6797cac9e0e0a +SHA1: 335ba8c0973359f94b859a55478db7741ccf2e1a +SHA256: 211ce8acd5cff28532472a1679d27ac254a8edfa2a901a65e6a1471c66118a5d +SHA512: e2ada63702216eb05b9462024dd9f20b8228af95216f6b0d6d7fce0e5158f087bb8ec4f736de560ea6bbd31427c9f72cd59aae4582f6f1cb50e7c167c31533c8 +Homepage: https://gstreamer.freedesktop.org +Description: GObject introspection data for the GStreamer library + This package contains introspection data for the GStreamer streaming media + framework. + . + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-gtk-3.0 +Architecture: amd64 +Version: 3.24.52-0ubuntu1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gtk+3.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 984 +Provides: gir1.2-gdk-3.0 (= 3.24.52-0ubuntu1), gir1.2-gdkx11-3.0 (= 3.24.52-0ubuntu1) +Depends: gir1.2-atk-1.0 (>= 2.35.1), gir1.2-cairo-1.0, gir1.2-gdkpixbuf-2.0 (>= 2.40.0), gir1.2-gio-2.0, gir1.2-pango-1.0 (>= 1.44.0), gir1.2-xlib-2.0, libgtk-3-0t64 (>= 3.24.30), libgtk-3-common +Filename: pool/gir1.2-gtk-3.0_3.24.52-0ubuntu1_amd64.deb +Size: 240490 +MD5sum: 350ed716404a5adb7e0d07fbe609f327 +SHA1: b65b3ec9ab68d5a4d7b9fcd6dba2f3a1aadbf8c6 +SHA256: d6d33238376565ea10358c946a1eb1dd1d638a0ffd7b4399c3871244d53811f5 +SHA512: 146eb00c31482759973f6031c14d6b0ef8cd336a46cff74ec3a6cf4b869579381c839375fa1d18ce7112fb2df0d12fdf78d00d6f7876838031d4b3a73183f032 +Homepage: https://www.gtk.org/ +Description: GTK graphical user interface library -- gir bindings + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. + +Package: gir1.2-gtk-4.0 +Architecture: amd64 +Version: 4.22.4+ds-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: gtk4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 901 +Provides: gir1.2-gdk-4.0 (= 4.22.4+ds-0ubuntu0.1), gir1.2-gdkwayland-4.0 (= 4.22.4+ds-0ubuntu0.1), gir1.2-gdkx11-4.0 (= 4.22.4+ds-0ubuntu0.1), gir1.2-gsk-4.0 (= 4.22.4+ds-0ubuntu0.1) +Depends: gir1.2-cairo-1.0, gir1.2-gdkpixbuf-2.0, gir1.2-gio-2.0, gir1.2-graphene-1.0, gir1.2-pango-1.0 (>= 1.56.0), gir1.2-pangocairo-1.0 (>= 1.56.0), gir1.2-xlib-2.0, libgtk-4-1 (>= 4.22.0), libgtk-4-common +Filename: pool/gir1.2-gtk-4.0_4.22.4+ds-0ubuntu0.1_amd64.deb +Size: 223874 +MD5sum: cec71f2f057c884808c33c51201fe41d +SHA1: dc18216efb1c57f8a3b32250ec76c1538897503a +SHA256: 4ce9a8d81aa672e3c41afdde78678abdee33ff0bfdeb2d22e5812f1cbfbab2f9 +SHA512: 738b306a0462e50bed178b211b91cda7e7ece44b6101a76b80364b9dcb35d8201a57ef524a7fc874684df169e0e489501d352fb6cae1623fd25002c84b8a8ef9 +Homepage: https://www.gtk.org/ +Description: GTK graphical user interface library -- gir bindings + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. + +Package: gir1.2-gweather-4.0 +Architecture: amd64 +Version: 4.4.4-4 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libgweather4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 36 +Depends: gir1.2-gio-2.0, libgweather-4-0t64 (>= 3.91.0) +Filename: pool/gir1.2-gweather-4.0_4.4.4-4_amd64.deb +Size: 7372 +MD5sum: 8f9458da22769352a6fccf60846fae7f +SHA1: 002710969003cafe6edcdc800ca389270c1a716f +SHA256: 485f336cba9dad6cc0cf33d4257db52f731c76140b82551ad49d57f3b79d600d +SHA512: 5f8cf47650dcbcfaf2a1b5f1d3d3284c6affd691b37cc1a3f64d2c6788d61fb6aad0ac8442275c933c2ab5d7c6e614a185a0a86e062f47d3ccaaad3412c6bdd2 +Homepage: https://wiki.gnome.org/Projects/LibGWeather +Description: GObject introspection data for the GWeather library + libgweather is a library to access weather information from online + services for numerous locations. + . + This package contains introspection data for the GWeather library. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-handy-1 +Architecture: amd64 +Version: 1.8.3-3build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libhandy-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 74 +Depends: gir1.2-gio-2.0, gir1.2-gtk-3.0, libhandy-1-0 (>= 1.5.0) +Filename: pool/gir1.2-handy-1_1.8.3-3build1_amd64.deb +Size: 17874 +MD5sum: 31c9f13562b8f48ca250a004e8410e51 +SHA1: f593347d09b82007b95ba6bba3c5cab3252da598 +SHA256: dc729c1d015c1ae81138af22ed3533f8521296fc8fc85cf0650bec99e1d6bcd4 +SHA512: e7e9b3df51cb41280065b673d28b73c0c54ce21477875fdfd84ea4158bc470d559a101f31f16f1e110a6c45a1cbb92863216773daddbd0644524200257efebe5 +Homepage: https://gnome.pages.gitlab.gnome.org/libhandy/ +Description: GObject introspection files for libhandy + libhandy provides GTK widgets and GObjects to ease developing + applications for mobile phones. + . + This package contains the GObject-introspection data in binary typelib format. + +Package: gir1.2-harfbuzz-0.0 +Architecture: amd64 +Version: 12.3.2-2 +Multi-Arch: same +Priority: optional +Section: introspection +Source: harfbuzz +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 186 +Depends: gir1.2-freetype2-2.0, gir1.2-gobject-2.0, libharfbuzz-gobject0 (>= 7.3.0), libharfbuzz0b (>= 12.1.0) +Filename: pool/gir1.2-harfbuzz-0.0_12.3.2-2_amd64.deb +Size: 44606 +MD5sum: 0d9e0038cb7d87bfddeb4c29b44d8026 +SHA1: 23e0f1e8a8a3967f4aa54f0e5ea1eaaf2b06e7f9 +SHA256: e91702d05c014768a85814efde45133b0e1a75faf1c8ff51a31563644229ffc6 +SHA512: f611ad321fbe6dbe30add0b46944c07cbef09a1db5cecdb7763b992592a47306547a3ca51dcc14e4f0413a710984923a71997ebfc3ffce44d0d2784b015950fb +Homepage: https://harfbuzz.github.io/ +Description: OpenType text shaping engine (GObject introspection data) + HarfBuzz is an implementation of the OpenType Layout engine (aka layout + engine) and the script-specific logic (aka shaping engine). + . + This package contains introspection data for the GObject bindings library. + +Package: gir1.2-ibus-1.0 +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 353 +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0, gir1.2-gobject-2.0, libibus-1.0-5 (>= 1.5.34~beta1) +Filename: pool/gir1.2-ibus-1.0_1.5.34~rc2-1_amd64.deb +Size: 87360 +MD5sum: 62e972fec0168fa703d4af5f9a55dfbe +SHA1: f3ed8bd4cbda182743660fb4bd0667c647edfd8d +SHA256: ef94b3853acdf6c1d1d2ee247ba2aa42e49744eafee58cdf9616020502b39f3f +SHA512: 50bf0746c72bf4a8e18ea9ccb8d8c739f6f5a96811790835f0730347541dc6ec1a1fe603c84119f35f92f813430095a5e44484e79e52eb9922c5f6c71a1b85e4 +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - introspection data + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains the GObject introspection data which are needed + for developing the IBus applications in various programming languages + with GObject introspection support. + +Package: gir1.2-javascriptcoregtk-4.1 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 308 +Provides: gir1.2-javascriptcore-4.1 (= 2.52.6-0ubuntu0.26.04.1) +Depends: libjavascriptcoregtk-4.1-0 (= 2.52.6-0ubuntu0.26.04.1), gir1.2-gobject-2.0 +Filename: pool/gir1.2-javascriptcoregtk-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 38958 +MD5sum: a2837e250de95b0d730875c59ab0fb7b +SHA1: 01b6c43dfaa6e9be5cea6043c0dd2076dbbf4633 +SHA256: d3e152e1b2fb6a9549fc1f733582d90d6049dd88881b536b7c465c71365f0094 +SHA512: 8c7f8adad383c53c5d8fb99389ad329e951523eba6025af74996ffb28e206fabed7aedb99c27586461ef3bb0ffee3c7cc14c63fc17196e16983b72a0991b7f36 +Homepage: https://webkitgtk.org/ +Description: JavaScript engine library from WebKitGTK - GObject introspection data + JavaScriptCore is the JavaScript engine used in WebKit. It consists + of the following building blocks: lexer, parser, start-up interpreter + (LLInt), baseline JIT, a low-latency optimizing JIT (DFG), and a + high-throughput optimizing JIT (FTL). + . + This build comes from the GTK port of WebKit (API version 4.1). + . + This package contains the introspection data, which can be used by + packages using the GIRepository format to generate dynamic bindings. + +Package: gir1.2-mutter-18 +Architecture: amd64 +Version: 50.1-0ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: introspection +Source: mutter +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 548 +Depends: libmutter-18-0 (= 50.1-0ubuntu2.2), gir1.2-atk-1.0, gir1.2-gdesktopenums-3.0 (>= 50~alpha), gir1.2-gio-2.0, gir1.2-gl-1.0, gir1.2-gobject-2.0, gir1.2-graphene-1.0, gir1.2-pango-1.0, gir1.2-xfixes-4.0, gir1.2-xlib-2.0 +Filename: pool/gir1.2-mutter-18_50.1-0ubuntu2.2_amd64.deb +Size: 133512 +MD5sum: 1ee18cc9fac55607d98afcd2a76fda0d +SHA1: 1a2e2a120774ea786348c63cb7f25beb935c53c6 +SHA256: acece18b86d3cb5c6194df5e3401818e81edeb33d4b97ea3ad6a2ed0cecfa7c2 +SHA512: 845471b8044cc4345064ae39f53d1cc67670bdea15071b94fd55b6fb9a7312422eaf535bfa100d5e5ecdddd5c1127ffb99428ade30109a5624122d4d81c4293c +Homepage: https://mutter.gnome.org/ +Description: GObject introspection data for Mutter + Mutter is a Wayland display server and X11 window manager and + compositor library. It contains functionality related to, among other + things, window management, window compositing, focus tracking, workspace + management, keybindings and monitor configuration. + . + Internally it uses a fork of Cogl, a hardware acceleration abstraction + library used to simplify usage of OpenGL pipelines, as well as a fork + of Clutter, a scene graph and user interface toolkit. + . + This package contains the GObject introspection data which may be + used to generate dynamic bindings. + +Package: gir1.2-nm-1.0 +Architecture: amd64 +Version: 1.54.3-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: introspection +Source: network-manager +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 372 +Depends: gir1.2-gio-2.0, libnm0 (>= 1.54.3) +Filename: pool/gir1.2-nm-1.0_1.54.3-2ubuntu3_amd64.deb +Size: 89866 +MD5sum: 113a23149c8a56be3cf729a89c8f1063 +SHA1: 8e67b7f9e46a560e02c2db7e709f5f62b1926fb8 +SHA256: e4ae7fc1a7017518b5e268c444feca597c5996239f282571e1ff382ad3f7de60 +SHA512: 108e8ec98449b9a1ce81186f15ce987aeb96ae2ce908fed3ec2c9642e6df38dcb9060105699d351d2f20b517b2ce3d9a120b537cd3f6e25123ed90611dd9ff92 +Homepage: https://networkmanager.dev/ +Description: GObject introspection data for the libnm library + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package contains introspection data for NetworkManager using libnm. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-nma4-1.0 +Architecture: amd64 +Version: 1.10.6-7 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libnma +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 31 +Depends: gir1.2-gtk-4.0, gir1.2-nm-1.0, libnma-gtk4-0 (>= 1.8.34) +Filename: pool/gir1.2-nma4-1.0_1.10.6-7_amd64.deb +Size: 6348 +MD5sum: db197e9463240b083da9336106c14f22 +SHA1: 1ac4820401a969826325fa8ab1686ee5381634ae +SHA256: 63e0a77707eea2315fe9912d67777cd3b49cd8d9f4b93e65de0385d660bac6ad +SHA512: c9ce6f96b09b23c04e8082fe3c05769985e76d50e9e019ceb11c5e35d381035ad0066a2f741d1592b0188bfb43f64bafa0d368e3a2a54ffad1f8d568eac04284 +Homepage: https://networkmanager.dev +Description: GObject introspection data for libnma-gtk4 + The libnma-gtk4 library provides GTK 4 dialogs for NetworkManager. + . + This package contains introspection data for libnma-gtk4. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-notify-0.7 +Architecture: amd64 +Version: 0.8.8-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libnotify +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 21 +Depends: gir1.2-gdkpixbuf-2.0, gir1.2-glib-2.0, libnotify4 (>= 0.8.7) +Filename: pool/gir1.2-notify-0.7_0.8.8-1_amd64.deb +Size: 4126 +MD5sum: 3b80cfb03dfd13cd4fbe3dd6d73f1bac +SHA1: ee264d26074746794b3f4e18e4b70e78462433b4 +SHA256: 66325b907ce2d3261b1a06b89ac8a32532aa2ed5819bfcc2fc93356c04c6125b +SHA512: 3d75b97c177d0c59c023c827b308df6e09a96ac665646b7270d36335e78bf804067227cad91b4960fdba568df8690d114f16b2219536537a89c4d267a17fb1cc +Description: sends desktop notifications to a notification daemon (Introspection files) + A library that sends desktop notifications to a notification daemon, as + defined in the Desktop Notifications spec. These notifications can be + used to inform the user about an event or display some form of + information without getting in the user's way. + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. + +Package: gir1.2-packagekitglib-1.0 +Architecture: amd64 +Version: 1.3.4-3ubuntu1.2 +Priority: optional +Section: introspection +Source: packagekit +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 111 +Depends: gir1.2-gio-2.0, gir1.2-glib-2.0 (>= 1.36), gir1.2-gobject-2.0, libpackagekit-glib2-18 (>= 1.2.7) +Filename: pool/gir1.2-packagekitglib-1.0_1.3.4-3ubuntu1.2_amd64.deb +Size: 25560 +MD5sum: 17538d39c692c7a70aa625e374986ee8 +SHA1: 7a105f76fe43988ad316b2410146ed3ef7cfaf5a +SHA256: bece2590fc1e6befc4ad99d6146694581cc928db238eaa08b85f3e77577f8e72 +SHA512: 62388042bd4db973c16618681de76e28988a5be937322a965be192bd7a8a393116c1e303b18e0981cb6715a57aa5e9eee1519e722c95ae95ce87ee655f347047 +Homepage: https://www.freedesktop.org/software/PackageKit/ +Description: GObject introspection data for the PackageKit GLib library + PackageKit allows performing simple software management tasks over a DBus + interface e.g. refreshing the cache, updating, installing and removing + software packages or searching for multimedia codecs and file handlers. + . + This package contains introspection data for the PackageKit + GLib interface library. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-pango-1.0 +Architecture: amd64 +Version: 1.57.0-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: pango1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 138 +Provides: gir1.2-pangocairo-1.0 (= 1.57.0-1), gir1.2-pangofc-1.0 (= 1.57.0-1), gir1.2-pangoft2-1.0 (= 1.57.0-1), gir1.2-pangoot-1.0 (= 1.57.0-1), gir1.2-pangoxft-1.0 (= 1.57.0-1) +Depends: gir1.2-cairo-1.0, gir1.2-fontconfig-2.0, gir1.2-freetype2-2.0, gir1.2-gio-2.0, gir1.2-gobject-2.0, gir1.2-harfbuzz-0.0 (>= 11.4.5), gir1.2-xft-2.0, gir1.2-xlib-2.0, libpango-1.0-0 (= 1.57.0-1), libpangocairo-1.0-0 (= 1.57.0-1), libpangoft2-1.0-0 (= 1.57.0-1), libpangoxft-1.0-0 (= 1.57.0-1) +Filename: pool/gir1.2-pango-1.0_1.57.0-1_amd64.deb +Size: 34848 +MD5sum: dbf03b795596d2b5b1f2f0db56dd4151 +SHA1: fe11d5bb3e8bd5f6f43cfb48221d5e361ae466c6 +SHA256: 799885145fe5982478fc53ce0206072a7dd402d6e42f5f7a951a78e9e49bcb84 +SHA512: e99d16bf2bc2580e32ec398071ebe43d3d94978b1add4dbd07ed5ccc7f03e78682ec1b9cdf2ecce03ff3472255749044e0a6b27d9a9dced9f7862e292d6c8f37 +Homepage: https://www.pango.org/ +Description: Layout and rendering of internationalized text - gir bindings + Pango is a library for layout and rendering of text, with an emphasis + on internationalization. Pango can be used anywhere that text layout is + needed. however, most of the work on Pango-1.0 was done using the GTK+ + widget toolkit as a test platform. Pango forms the core of text and + font handling for GTK+-2.0. + . + Pango is designed to be modular; the core Pango layout can be used with + four different font backends: + - Core X windowing system fonts + - Client-side fonts on X using the Xft library + - Direct rendering of scalable fonts using the FreeType library + - Native fonts on Microsoft backends + . + This package can be used by other packages using the GIRepository format to + generate dynamic bindings. + +Package: gir1.2-polkit-1.0 +Architecture: amd64 +Version: 127-2ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: policykit-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 42 +Provides: gir1.2-polkitagent-1.0 (= 127-2ubuntu1.1) +Depends: gir1.2-gio-2.0, libpolkit-agent-1-0 (= 127-2ubuntu1.1), libpolkit-gobject-1-0 (= 127-2ubuntu1.1) +Filename: pool/gir1.2-polkit-1.0_127-2ubuntu1.1_amd64.deb +Size: 8808 +MD5sum: 15cbb538ee6ecac107f24061091fff51 +SHA1: 131f4ab24d681d608aaebf21faaecc9e28b46694 +SHA256: 2e73cbeef4422da0d390523716bbb2d8f63ed74dae73e546412090d1ad75586d +SHA512: 797d710c9c0e315bbd702fe842b0bcb0defb529899707d39220cbbd68da5a59ffb4959188f3244a13844addcafcf92c228d33c74ff6a766f962e709595d67138 +Homepage: https://github.com/polkit-org/polkit/ +Description: GObject introspection data for polkit + polkit is a toolkit for defining and handling the policy that + allows unprivileged processes to speak to privileged processes. + It was previously named PolicyKit. + . + This package contains introspection data for polkit. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-rsvg-2.0 +Architecture: amd64 +Version: 2.61.3+dfsg-3 +Multi-Arch: same +Priority: optional +Section: introspection +Source: librsvg +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 45 +Depends: gir1.2-cairo-1.0, gir1.2-gdkpixbuf-2.0 (>= 2.23.5-2), gir1.2-gio-2.0, gir1.2-glib-2.0, gir1.2-gobject-2.0, librsvg2-2 (>= 2.58.93) +Filename: pool/gir1.2-rsvg-2.0_2.61.3+dfsg-3_amd64.deb +Size: 11076 +MD5sum: adfd206fb408cbd63e8579498860706c +SHA1: 4e85ccb4c34957a9b1699bf945016f39e2a172f2 +SHA256: 35468e313e59a20d9388b554a6d02634c65a17596d928723c228a17f1ce486e0 +SHA512: 5f63e2f9cda891748f3005271b97ad3a37463d7cf892b03e11048967bbe390196e9a10eb376dfc438ba8c6564e19f37b2afaf3d897ef76adb1cdfda0507622a7 +Homepage: https://gnome.pages.gitlab.gnome.org/librsvg/ +Description: gir files for renderer library for SVG files + The rsvg library is an efficient renderer for Scalable Vector Graphics + (SVG) pictures. + . + This package contains GObject-Introspection information. + +Package: gir1.2-secret-1 +Architecture: amd64 +Version: 0.21.7-2build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libsecret +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 42 +Depends: gir1.2-gio-2.0, gir1.2-gobject-2.0, libsecret-1-0 (>= 0.21.2) +Filename: pool/gir1.2-secret-1_0.21.7-2build1_amd64.deb +Size: 9340 +MD5sum: fad6dcb52a975a0c34edaadf7d5a9191 +SHA1: a06424858ca08fb4e49d76620eebd4a0ee752fa5 +SHA256: 9c057deb9c39ae68c803c922aab875cf52bb33bd5b0b3b53ceb638b5dbc843e2 +SHA512: 03d993cc86cfb82769d6b0e3a1b986b5bc4751123ec06c2cd789398ce224da2939352ec49df4c9ca5a26d343e12660e6650f15e899207d6594870862d16e0a96 +Homepage: https://wiki.gnome.org/Projects/Libsecret +Description: Secret store (GObject-Introspection) + This package contains introspection data for libsecret, which can be used + to generate dynamic bindings. + . + libsecret is a library for storing and retrieving passwords and other secrets. + It communicates with the "Secret Service" using DBus. + . + This package contains the introspection datas for the libsecret library. + +Package: gir1.2-snapd-2 +Architecture: amd64 +Version: 1.72-0ubuntu3 +Multi-Arch: same +Priority: optional +Section: introspection +Source: snapd-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 81 +Depends: gir1.2-gio-2.0, gir1.2-gobject-2.0, libsnapd-glib-2-1 (= 1.72-0ubuntu3) +Filename: pool/gir1.2-snapd-2_1.72-0ubuntu3_amd64.deb +Size: 18018 +MD5sum: 940913ae829b850f4138e597f79d224c +SHA1: 85d06a0dfd4eaf39cfd6b54b9e0b31c9abf51fe5 +SHA256: 2f1ce5a6cfdfd15d0bde1b3bc774d5d35a85f2f5fda28e5b32495c8412c46b08 +SHA512: 4d29f8de5d6e2da624c21333c8b92e234f5c2ba89eacc071cac7b586ede3711c7e2f51fe638563935bbceb8e7fe63b5ae91b3d0af75817f496cbac9c99a6a2dc +Homepage: https://github.com/snapcore/snapd-glib +Description: Typelib file for libsnapd-glib1 + snapd-glib is a library to allow GLib based applications access to snapd, + the daemon that controls Snaps. + . + Snaps are 'universal' packages that work across many different Linux + systems, enabling secure distribution of the latest apps and utilities + for cloud, servers, desktops and the internet of things. + . + This package contains introspection data. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-soup-3.0 +Architecture: amd64 +Version: 3.6.6-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libsoup3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 94 +Depends: gir1.2-gio-2.0, libsoup-3.0-0 (= 3.6.6-1) +Filename: pool/gir1.2-soup-3.0_3.6.6-1_amd64.deb +Size: 22486 +MD5sum: 15271417b5b015aa56a52fa34f76dc18 +SHA1: da42e80a8b07963724ee107e79988a2ba739948e +SHA256: 046d809c27d3b31ef3942a72386408a759c328be2a71c81ccc5c201b10eb394d +SHA512: c77a9149e60eb908a503484f13ae87849f765ada2a16a52b5972f4e7a52f411551bfa439171a2acc66e23e32bc6498f9a47b776beb25c352ce040d47e7fba723 +Homepage: https://libsoup.gnome.org/libsoup-3.0/index.html +Description: GObject introspection data for the libsoup HTTP library + This package contains introspection data for the libsoup HTTP library. + . + libsoup uses the Glib main loop and is designed to work well with GTK+ + applications. This enables GNOME applications to access HTTP servers + on the network in a completely asynchronous fashion, very similar to + the GTK+ programming model (a synchronous operation mode is also + supported for those who want it). + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-upowerglib-1.0 +Architecture: amd64 +Version: 1.91.1-1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: upower +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 27 +Depends: gir1.2-gio-2.0, gir1.2-gobject-2.0, libupower-glib3 (>= 0.99.14) +Filename: pool/gir1.2-upowerglib-1.0_1.91.1-1_amd64.deb +Size: 5452 +MD5sum: ed96b9e3267c0c50371fda2007c3887d +SHA1: bbfc150ca8b539a87ac604fa7c9d4ebd7132db7e +SHA256: 3308387bdb13c3da8cf2a5f924f60e180aae9623ff78825579c88ba2636c2578 +SHA512: 91da5046a192f273a16fb0c8ae5cadf554c74479806ad107253aa0204b97a14e5fc278611ce708293d660dc858c953fdda579bd5d4edd8c8b17ef2c2159b75fa +Homepage: https://upower.freedesktop.org/ +Description: GObject introspection data for upower + upower provides an interface to enumerate power sources on the system + and control system-wide power management. Any application can access the + org.freedesktop.UPower service on the system message bus. Some + operations (such as suspending the system) are restricted using PolicyKit. + . + This package contains introspection data for upower. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: gir1.2-vte-2.91 +Architecture: amd64 +Version: 0.84.0-2 +Multi-Arch: same +Priority: optional +Section: introspection +Source: vte2.91 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 76 +Depends: gir1.2-cairo-1.0, gir1.2-gdk-3.0, gir1.2-gtk-3.0, gir1.2-pango-1.0, libvte-2.91-0 (>= 0.84.0) +Filename: pool/gir1.2-vte-2.91_0.84.0-2_amd64.deb +Size: 18486 +MD5sum: 933a3a4e45417b5a539de7dff301cdad +SHA1: 0e99bba0677c02015becc9eb35769e40dfd031d6 +SHA256: 41e72d980945aa13aeac331f62d784fb089edb510a256ba65b6d7142564c59e1 +SHA512: e923092ce51f51e37853e695d64fe681fffcdcbf3c0b935be7f46862b5fb6a9f103f4179e3a962bd03d46703fdb8d15a0631b13e9c137dab15031d67a2fc123a +Homepage: https://wiki.gnome.org/Apps/Terminal/VTE +Description: GObject introspection data for the VTE library (GTK 3 version) + This package contains introspection data for VTE, a terminal emulator + widget for GTK. + . + It can be used by interpreters understanding the GIRepository format to + write programs using the VTE widget for GTK 3. + +Package: gir1.2-webkit2-4.1 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 606 +Provides: gir1.2-webkit2webextension-4.1 (= 2.52.6-0ubuntu0.26.04.1) +Depends: libwebkit2gtk-4.1-0 (= 2.52.6-0ubuntu0.26.04.1), gir1.2-gtk-3.0, gir1.2-javascriptcoregtk-4.1 (= 2.52.6-0ubuntu0.26.04.1), gir1.2-soup-3.0 +Filename: pool/gir1.2-webkit2-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 104994 +MD5sum: e0eea5a0339ef50b83c91765b263a5d5 +SHA1: b8e33179e29d16bf27c6f7b2c6994016a64f0e76 +SHA256: 708bc6befabd6edae038d15b6fbcefa609368aaaf59ec9dc6c77278e152fe482 +SHA512: 151e15873dcc4b937d40e55054680c31e68c3c7f893ed4e235f2e5e207e3dfcf090eb6e1216a7615e013aa9756820332971b337f795d3031e0a3814a2202dcc6 +Homepage: https://webkitgtk.org/ +Description: Web content engine library for GTK - GObject introspection data + WebKit is a web content engine, derived from KHTML and KJS from KDE, and + used primarily in Apple's Safari browser. It is made to be embedded in + other applications, such as mail readers, or web browsers. + . + It is able to display content such as HTML, SVG, XML, and others. It also + supports DOM, XMLHttpRequest, XSLT, CSS, JavaScript/ECMAScript and more. + . + WebKitGTK is a WebKit port designed to be used in GTK applications. + This build provides version 4.1 of the API and uses the GTK 3 widget + toolkit. + . + This package contains introspection data, which can be used by + packages using the GIRepository format to generate dynamic bindings. + +Package: gir1.2-wnck-3.0 +Architecture: amd64 +Version: 43.3-1build1 +Multi-Arch: same +Priority: optional +Section: introspection +Source: libwnck3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 62 +Depends: gir1.2-gdkpixbuf-2.0, gir1.2-gobject-2.0, gir1.2-gtk-3.0 (>= 3.22.0), libwnck-3-0 (>= 43.1) +Filename: pool/gir1.2-wnck-3.0_43.3-1build1_amd64.deb +Size: 10268 +MD5sum: 1cd7f08bedf5d18eb7a19b04f8b78a79 +SHA1: 6961d0683abfc6d2461fa3966ae6a28d84a5aa1e +SHA256: bdef0db4470d6667e6340ad6ef455e8aa81094e662e3875a4d19da6be7081e93 +SHA512: d0d22523ef5f01d0a2905ebde7dabc274460c56545bdccc4bb2cfef8e3ab1d87a10633652ea68a0179ef3ac14682f7c8319b7db352fcbc190b21d16ba8daa7c1 +Homepage: https://gitlab.gnome.org/GNOME/libwnck +Description: GObject introspection data for the WNCK library + This package contains introspection data for Window Navigator + Construction Kit, a library to interact with window managers. + . + It can be used by packages using the GIRepository format to generate + dynamic bindings. + +Package: git +Architecture: amd64 +Version: 1:2.53.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: vcs +Maintainer: Ubuntu Developers +Original-Maintainer: Jonathan Nieder +Installed-Size: 25264 +Provides: git-completion, git-core +Depends: libc6 (>= 2.42), libcurl3t64-gnutls (>= 8.3.0), libexpat1 (>= 2.0.1), libpcre2-8-0 (>= 10.34), zlib1g (>= 1:1.2.2), perl, liberror-perl, git-man (>> 1:2.53.0), git-man (<< 1:2.53.0-.) +Recommends: ca-certificates, patch, less, ssh-client +Suggests: gettext-base, git-doc, git-email, git-gui, gitk, gitweb, git-cvs, git-svn +Breaks: bash-completion (<< 1:1.90-1), cogito (<= 0.18.2+), dgit (<< 5.1~), git-buildpackage (<< 0.6.5), git-el (<< 1:2.32.0~rc2-1~), gitosis (<< 0.2+20090917-7), gitpkg (<< 0.15), guilt (<< 0.33), openssh-client (<< 1:6.8), stgit (<< 0.15), stgit-contrib (<< 0.15) +Filename: pool/git_1%3a2.53.0-1ubuntu1_amd64.deb +Size: 4227374 +MD5sum: 823f37c28c6cb28675271b78ef929c26 +SHA1: e0ca7b6fb325860a08c6e89d5ced970f730cb0be +SHA256: c3b36d7357dea773eefe6c4f97ebff416e5afee22489dc1f729e31d6f47872e9 +SHA512: 572a8ab1e486832c712773336be65f297f540c630cd268c9b25667b4c79b73b917488f0bcde3b637800f9bb945e038cd41c83aac093de33b422508b383236ccd +Homepage: https://git-scm.com/ +Description: fast, scalable, distributed revision control system + Git is popular version control system designed to handle very large + projects with speed and efficiency; it is used for many high profile + open source projects, most notably the Linux kernel. + . + Git falls in the category of distributed source code management tools. + Every Git working directory is a full-fledged repository with full + revision tracking capabilities, not dependent on network access or a + central server. + . + This package provides the git main components with minimal dependencies. + Additional functionality, e.g. a graphical user interface and revision + tree visualizer, tools for interoperating with other VCS's, or a web + interface, is provided as separate git* packages. + +Package: git-man +Architecture: all +Version: 1:2.53.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: doc +Source: git +Maintainer: Ubuntu Developers +Original-Maintainer: Jonathan Nieder +Installed-Size: 2376 +Filename: pool/git-man_1%3a2.53.0-1ubuntu1_all.deb +Size: 1202472 +MD5sum: 3691a56d441b28ef3a6cc7429f19405c +SHA1: 53fc1f1ab077582147e2447644851f5d105b86e4 +SHA256: cc2870c52d3d6845bd792e861930dd6afc5fe165edb0c8c3700332c3bfbd666e +SHA512: 0badfe70a50594e26d7562918717e7c640585b1b67e75b1db57862cef93d05e7e42abcde41292bd5e1485b1fef2d704832a2f789d8e4975028200880b5b91ede +Homepage: https://git-scm.com/ +Description: fast, scalable, distributed revision control system (manual pages) + Git is popular version control system designed to handle very large + projects with speed and efficiency; it is used for many high profile + open source projects, most notably the Linux kernel. + . + Git falls in the category of distributed source code management tools. + Every Git working directory is a full-fledged repository with full + revision tracking capabilities, not dependent on network access or a + central server. + . + This package provides reference documentation for use by the 'man' + utility and the 'git help' command. + +Package: gjs +Architecture: amd64 +Version: 1.88.0-1 +Priority: optional +Section: interpreters +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 197 +Depends: libgjs0 (= 1.88.0-1), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.86.0-7~) +Filename: pool/gjs_1.88.0-1_amd64.deb +Size: 120214 +MD5sum: 501f3925753b35f318e88c261e323914 +SHA1: 7c5f57ecd13981c1468fb12498e028c106fffcd1 +SHA256: 8fe90b1cbdb4ecd6d0f70dbcd60f6b834b858e06ad599f16deaaa73100649767 +SHA512: 31c01234b2a14c2553e5e8922fe5eeee7db805b51c2aa208bf99aa8b6924abcd1478d3dde35c718efd908f36989b3d404db9d667ea3ff650346c6bdc56488d29 +Homepage: https://gitlab.gnome.org/GNOME/gjs/-/blob/master/doc/README.md +Description: Mozilla-based javascript bindings for the GNOME platform (cli tool) + Makes it possible for applications to use all of GNOME's platform + libraries using the JavaScript language. It's mainly based on the + Mozilla JavaScript engine and the GObject introspection framework. + . + This package contains the interactive console application. + +Package: glib-networking +Architecture: amd64 +Version: 2.80.1-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 201 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libgnutls30t64 (>= 3.8.1), libproxy1v5 (>= 0.5.3), glib-networking-services (>= 2.80.1-1build2), glib-networking-services (<< 2.80.1-1build2.1~), glib-networking-common (>= 2.80.1-1build2), gsettings-desktop-schemas +Filename: pool/glib-networking_2.80.1-1build2_amd64.deb +Size: 64812 +MD5sum: 0f2bfaf37207f3cfdb320073ff2a4a79 +SHA1: c75fa5554edcbbf1e4df9d4f4d2b6d1c9fac65d6 +SHA256: 19781460ab64af9244f089d1cb79f57f44dda08a7db5f5ac8b88b3d79215125c +SHA512: b036c69e54023f18218ded9e14b71325c99e3188f30929a6efed2f0547600b278756573ef15711248d79821f2ff7ac4345fbcf1e9c2322f2f1022b250df9ecd9 +Description: network-related giomodules for GLib + This package contains various network related extensions for the GIO + library. + +Package: glib-networking-common +Architecture: all +Version: 2.80.1-1build2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: glib-networking +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 44 +Recommends: glib-networking +Filename: pool/glib-networking-common_2.80.1-1build2_all.deb +Size: 6834 +MD5sum: abd2e9cd10bf868f2d0912d6f76ab5a8 +SHA1: 6e48936d90a6e357d8d678019030bb4a89f13d2e +SHA256: a1189141109b442a85d9dbbd695d10ce0a817fa530bab2b9dd0fc45cbebba09f +SHA512: c26429b75dc5adbf8db5c8cd1477b26413388903a91b0edc29814df3b8081b5423699ccc8ba4873891d6548299f13b3d8288c67ef382557b698e4119013bf5e4 +Description: network-related giomodules for GLib - data files + This package contains data files and translations for the GIO network + extensions in glib-networking. + +Package: glib-networking-services +Architecture: amd64 +Version: 2.80.1-1build2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: glib-networking +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 45 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libproxy1v5 (>= 0.5.3), glib-networking-common (>= 2.80.1-1build2) +Recommends: glib-networking +Filename: pool/glib-networking-services_2.80.1-1build2_amd64.deb +Size: 13086 +MD5sum: 126b17162c8b10e26371d5f0a922d2d4 +SHA1: de9ae86b165f110a5f5d3621a8df58acb0730e15 +SHA256: aff71f4fcc8e493a45ba8e3cd36207747a76633b35769415c74b48e049b2c3b9 +SHA512: e73d19b3ee653b5ede08ee314c130fa941cdefe7cb8238114c167fc826fff6a98ea9c5bc6619d36e1ee74c04b24cf89b477fbd4ce4347d9092e29bf9071e42a8 +Description: network-related giomodules for GLib - D-Bus services + This package contains D-Bus services that are used by the GIO network + extensions in glib-networking, for actions that need to be done in a + separate process. + +Package: glycin-loaders +Architecture: amd64 +Version: 2.1.1+ds-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: glycin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 13288 +Depends: bubblewrap, libc6 (>= 2.39), libcairo2 (>= 1.4.10), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.16.0), libheif1 (>= 1.17.0), libjxl0.11 (>= 0.11.0), librsvg2-2 (>= 2.52.5) +Recommends: libheif-plugin-aomenc | libheif-plugin-rav1e | libheif-plugin-svtenc +Suggests: libheif-plugin-x265 | libheif-plugin-kvazaar +Breaks: loupe (<< 49~) +Filename: pool/glycin-loaders_2.1.1+ds-0ubuntu1_amd64.deb +Size: 2979102 +MD5sum: 96cd67bc54bcda7d1663eba6614057a4 +SHA1: 498276321ded232be15b78a5f38e31f3f9c4c656 +SHA256: 2b94910793dddd6cc6cc689bea65c526e3c3e3dfd2125f4464c239fc6e5856d4 +SHA512: 9223579f44b73baea5454af83bf57b71120c1e81620e5e0e1336f79e62692196263e0ce16a5718b8f93acc25dd622c3be399dc6901194ea655a6a5fab6c1c5e8 +Homepage: https://gitlab.gnome.org/GNOME/glycin +Description: sandboxed image loaders for GNOME + Glycin provides sandboxed modular image loaders for decoding + images as GDK textures, editing images, and extracting image + metadata. Glycin is a newer generation of image loading + compared to gdk-pixbuf. + . + This package contains the image loaders. + +Package: glycin-thumbnailers +Architecture: amd64 +Version: 2.1.1+ds-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: glycin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 502 +Depends: glycin-loaders (>= 2~), libc6 (>= 2.34), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.42.0), libglycin-2-0 (>= 2.0~beta) +Filename: pool/glycin-thumbnailers_2.1.1+ds-0ubuntu1_amd64.deb +Size: 222602 +MD5sum: b5e74d87c0b114606d109a8856b292df +SHA1: 79bb074122cc4b7cf9256fcb7f945c512a799c06 +SHA256: 545e2b60f3a2ceefe6f1b99c98b229806aafde57fdcae6b67030b7a09b808cc2 +SHA512: ae50d5a153333c3b0961bee29759b85e2880c1a152cf04a8ba576c412d1db1430fef71ec3e5c1b7d21e24f10b035697fce5913f7511c978b4e296d5a088dfd6f +Homepage: https://gitlab.gnome.org/GNOME/glycin +Description: sandboxed image loaders for GNOME + Glycin provides sandboxed modular image loaders for decoding + images as GDK textures, editing images, and extracting image + metadata. Glycin is a newer generation of image loading + compared to gdk-pixbuf. + . + This package contains the image file thumbnailers + +Package: gnome-accessibility-themes +Architecture: all +Version: 3.28-5 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-themes-extra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 6221 +Filename: pool/gnome-accessibility-themes_3.28-5_all.deb +Size: 2321952 +MD5sum: ff0fc374931d5c92516d53fcc8998e39 +SHA1: 1985b1d9aea739542a8e932e6f8a6b48fd43b458 +SHA256: 0a93934df79efa3114968521f607c0cddd35c1db3be5ac6cd46d58f66276e236 +SHA512: 7c8a60c1be687764fa31b7218b32f8f8bc2a7052a37d8290429aee41dc49e6155e292b99f45deb374dc97d73ed4b6d00e7d2c973b1ad178fc09f1108ab80ce4d +Description: High Contrast GTK 2 theme and icons + This is the version of GNOME's standard HighContrast theme, for the + GTK 2.x toolkit. An icon theme is also included. + . + The GTK 3.x version is already included in libgtk-3-0. + +Package: gnome-bluetooth-3-common +Architecture: all +Version: 47.1-5 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-bluetooth +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 975 +Filename: pool/gnome-bluetooth-3-common_47.1-5_all.deb +Size: 163656 +MD5sum: 4e479ee7b3150828ed3f714a453aba48 +SHA1: e4befb54ed4b8fce70165e1c9a2044fc07bb5c89 +SHA256: baf5ee3e5e5ba2080d565c57b1a049fc5226c4eaf70c779cad58b8ba30cd25e8 +SHA512: 7a183875a7139e11e5311d87537352dcd2035800a6ae96d076100002cdc7ea739052783ea4eb8868b7e24bd2c4b6458f736147ac4a06adccb3699a40883640b6 +Homepage: https://wiki.gnome.org/Projects/GnomeBluetooth +Description: GNOME Bluetooth 3 common files + This package contains common files for the GNOME Bluetooth tools + and libraries. + +Package: gnome-bluetooth-sendto +Architecture: amd64 +Version: 47.1-5 +Priority: optional +Section: gnome +Source: gnome-bluetooth +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 53 +Depends: bluez, bluez-obexd, udev, libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.44.0), libgnome-bluetooth-3.0-13 (>= 42~beta), libgtk-4-1 (>= 4.15.2) +Recommends: gnome-control-center | budgie-control-center | unity-control-center | ayatana-indicator-bluetooth, gvfs-backends +Filename: pool/gnome-bluetooth-sendto_47.1-5_amd64.deb +Size: 13228 +MD5sum: e8611899e0b47eaa70bbda759b938c12 +SHA1: 4f4ce37f3e5132b79223af66734d8005a2ca8d2f +SHA256: 0fef6d29b9dbbb88e50a30eeb485fcb5acfe76d7dcab444261d38f97a7fc83d8 +SHA512: 4a3dd75939bf43f8a264ee146660f1132a4d12b1454046420dc0166af8e0c628899b3d61ed65be8b84e6818c085bcea5f29f2fc74f07531eecd50cbadf7372ef +Homepage: https://wiki.gnome.org/Projects/GnomeBluetooth +Description: GNOME Bluetooth Send To app + The GNOME Bluetooth Send To app is an easy way to send files + to a Bluetooth device. + +Package: gnome-calculator +Architecture: amd64 +Version: 1:50.0-1ubuntu1 +Priority: optional +Section: math +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3464 +Depends: dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.76.0), libgtk-4-1 (>= 4.17.0), libgtksourceview-5-0 (>= 5.2.0), libmpc3 (>= 1.1.0), libmpfr6 (>= 3.1.3), libsoup-3.0-0 (>= 3.4.0), libxml2-16 (>= 2.14.1) +Recommends: gvfs, yelp +Filename: pool/gnome-calculator_1%3a50.0-1ubuntu1_amd64.deb +Size: 454750 +MD5sum: f908de8350ab299165d9fdb23471c76e +SHA1: 93a6c889e78a9c223fcf18ea153bd70fa0448c25 +SHA256: 959598983285cc7f3c09d0c47524505b9fa5fcc56fc8f1b3aeb581dfe27318db +SHA512: eb6830dcb7c1fadb400eb235898be42cccce7a8d0c88ff90e3e3ccdc32ba92bc95bf3c17d69c6b6b879343ac3e60d15be13eb05078698cc9cc3f391034059235 +Homepage: https://apps.gnome.org/Calculator/ +Description: GNOME desktop calculator + The GNOME calculator is a powerful graphical calculator with financial, + logical and scientific modes. It uses a multiple precision package to do its + arithmetic to give a high degree of accuracy. + +Package: gnome-characters +Architecture: amd64 +Version: 50.0-1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3716 +Depends: gir1.2-adw-1 (>= 1.6), gir1.2-gdkpixbuf-2.0, gir1.2-glib-2.0, gir1.2-gnomedesktop-4.0, gir1.2-gtk-4.0, gjs, libglib2.0-bin, dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.14), libglib2.0-0t64 (>= 2.87) +Recommends: fonts-noto-color-emoji +Filename: pool/gnome-characters_50.0-1_amd64.deb +Size: 485030 +MD5sum: 4214f94c17d9227a08557b0b7b67e116 +SHA1: eaedec46a298d45e16b0f8e5252ddaf813a6ad00 +SHA256: 5af17d8d07ce0ed1ba082cb863b3c4907d8234d0ec78ec9289dfff662a9a5b11 +SHA512: c4119755fbe61c795bf03c96a194622391303e739f591452a2251a31207ac528ade6d958c4b251736a86918cba20cb18e154e3c86a6537205f1743f3a4d4ea02 +Homepage: https://apps.gnome.org/Characters/ +Description: character map application + Characters is a simple utility application to find and + insert unusual characters. + +Package: gnome-clocks +Architecture: amd64 +Version: 50.0-1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 2864 +Depends: geoclue-2.0, dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.8), libc6 (>= 2.38), libgeoclue-2-0 (>= 2.4.0), libgeocode-glib-2-0 (>= 0.99.1), libglib2.0-0t64 (>= 2.76.0), libgnome-desktop-4-2t64 (>= 44~beta), libgtk-4-1 (>= 4.15.3), libgweather-4-0t64 (>= 3.91.0), libicu78 (>= 78.1-1~) +Filename: pool/gnome-clocks_50.0-1_amd64.deb +Size: 1773286 +MD5sum: e999b8afd8df92a19b3ab4cf8bab1113 +SHA1: c33da594f8b4a77377fd5f3aff25e90e01d45a75 +SHA256: dd72b4998e721ad6f3c73dd03981b54d1d579c4a4050dd8c4e32c6eff1a33c61 +SHA512: 9b4b29f45eafd0629ac35f3fd29fb1a0fdf69fea8796f5cc7351e11b363917fb5322808eb430747e08973122e43b28138a4c3755a6a11315aacee0ecee71ec2c +Homepage: https://apps.gnome.org/Clocks/ +Description: Simple GNOME app with stopwatch, timer, and world clock support + GNOME Clocks is a simple application to show the time and date in multiple + locations and set alarms or timers. A stopwatch is also included. + +Package: gnome-control-center +Architecture: amd64 +Version: 1:50.3-0ubuntu0.2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4581 +Depends: accountsservice (>= 23.11.69), colord, desktop-file-utils, gnome-control-center-data (<< 1:51~), gnome-control-center-data (>= 1:50.3-0ubuntu0.2), gnome-desktop3-data, gnome-online-accounts (>= 3.51.0), gnome-settings-daemon (>= 48~rc), gsettings-desktop-schemas (>= 50~alpha), heif-gdk-pixbuf, heif-thumbnailer, language-selector-gnome (>= 0.179~), libjxl-gdk-pixbuf, mutter-common (>= 47), tecla (>= 47), upower, webp-pixbuf-loader, whoopsie-preferences, libaccountsservice0 (>= 23.13.9), libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libcolord-gtk4-1t64 (>= 0.1.24), libcolord2 (>= 1.4.3), libcups2t64 (>= 1.7.0), libdrm2 (>= 2.4.3), libepoxy0 (>= 1.0), libfontconfig1 (>= 2.12.6), libgcr-4-4 (>= 3.8.0), libgdk-pixbuf-2.0-0 (>= 2.30.1), libglib2.0-0t64 (>= 2.83.0), libgnome-bg-4-2t64 (>= 3.27.90), libgnome-bluetooth-ui-3.0-13 (>= 42~beta), libgnome-desktop-4-2t64 (>= 3.33.4), libgnutls30t64 (>= 3.7.0), libgoa-1.0-0b (>= 3.51.0), libgoa-backend-1.0-2 (>= 3.51.0), libgraphene-1.0-0 (>= 1.5.4), libgsound0t64 (>= 1.0.1), libgtk-4-1 (>= 4.21), libgtop-2.0-11 (>= 2.22.3), libgudev-1.0-0 (>= 146), libibus-1.0-5 (>= 1.5.2), libinsights0 (>= 0.8.1), libjson-glib-1.0-0 (>= 1.5.2), libkrb5-3 (>= 1.8+dfsg), libmalcontent-0-0 (>= 0.14~alpha), libmm-glib0 (>= 1.16.6), libnm0 (>= 1.52.0), libnma-gtk4-0 (>= 1.10.2), libpango-1.0-0 (>= 1.37.2), libpolkit-gobject-1-0 (>= 0.99), libpulse-mainloop-glib0 (>= 0.99.1), libpulse0 (>= 0.99.1), libpwquality1 (>= 1.1.0), libsecret-1-0 (>= 0.7), libsmbclient0 (>= 2:4.0.3+dfsg1), libsoup-3.0-0 (>= 3.0.3), libudisks2-0 (>= 2.0.0), libupower-glib3 (>= 1.90.6), libwacom9 (>= 2.0.0), libwayland-client0 (>= 1.20.0), libwhoopsie-preferences0 (>= 0.9), libx11-6, libxml2-16 (>= 2.14.1) +Recommends: cracklib-runtime, cups-pk-helper, fwupd, gnome-bluetooth-sendto, gnome-control-center-faces, gnome-remote-desktop (>= 47), gnome-user-docs, ibus, iso-codes, libcanberra-pulse, libspa-0.2-bluetooth | pulseaudio-module-bluetooth, mobile-broadband-provider-info, nm-connection-editor | network-manager-gnome (<< 1.36.0-3~), polkitd, power-profiles-daemon, rygel | rygel-tracker, system-config-printer-common +Suggests: gnome-software | gnome-packagekit, gnome-user-share, gstreamer1.0-plugins-good (>= 1.18.0), malcontent-gui, realmd +Breaks: gnome-remote-desktop (<< 42), gnome-shell (<< 49) +Filename: pool/gnome-control-center_1%3a50.3-0ubuntu0.2_amd64.deb +Size: 1871210 +MD5sum: 1cd0162160807112b872243500014423 +SHA1: 8efec3e5a25b37fe3f1754d1a47cd30d99c962dc +SHA256: 0c940c78379e37509da54f14b9c2eaa7695280dfda6e16a00090ad77b99c7a77 +SHA512: e38aae4505d436b83b0465db9689406fc7db8f723ceea0c230c936ed40277e0d8e382a7a86e174ce2732f2096111b58fe8223f4c5344a504d50dbb17bbf48bd9 +Description: utilities to configure the GNOME desktop + This package contains configuration applets for the GNOME desktop, + allowing to set accessibility configuration, desktop fonts, keyboard + and mouse properties, sound setup, desktop theme and background, user + interface properties, screen resolution, and other GNOME parameters. + . + It also contains a front end to these applets, which can also be + accessed with the GNOME panel or the Nautilus file manager. + +Package: gnome-control-center-data +Architecture: all +Version: 1:50.3-0ubuntu0.2 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-control-center +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 580 +Depends: dconf-gsettings-backend | gsettings-backend +Filename: pool/gnome-control-center-data_1%3a50.3-0ubuntu0.2_all.deb +Size: 161490 +MD5sum: 45a8465cdde2552d87d3de697698ee7a +SHA1: 49b52a76e07e0d826ded1d05ec56fabb389c53c8 +SHA256: 78ea685c595cd7b0d1d2d3d42359200892eca0e0c96f0b71855c43ccd1a42293 +SHA512: 6c63b0d48de07efb0cdf40eaaa544d6b867efa62e3304eb9a5a62474d73f2462aeb34035217d5b2577ccabe77c56f940713daf0faa0641436db5ae90e3431ad6 +Description: configuration applets for GNOME - data files + This package contains data files (icons, pixmaps, locales files) needed by + the configuration applets in the gnome-control-center package. + +Package: gnome-control-center-faces +Architecture: all +Version: 1:50.3-0ubuntu0.2 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-control-center +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1128 +Provides: unity-control-center-faces +Conflicts: unity-control-center-faces +Replaces: unity-control-center-faces +Filename: pool/gnome-control-center-faces_1%3a50.3-0ubuntu0.2_all.deb +Size: 1115108 +MD5sum: 7f3b964a870d812bf95ddb03903bba42 +SHA1: 5b0750b18e64fbc27b16f403244603ce2e0dda6c +SHA256: f1ee11647b14d1f9f3eabc070d5480928c52415f94654575c3ac8472cad1a680 +SHA512: b3974c5200f491b29db09e8090d9f1d7b53a8d053496794ac79bb22881dc9a22800492b750a026a9fe2f94c355e3d4060f6623b9c44bff28caa38bc28f978efa +Description: utilities to configure the GNOME desktop - faces images + This package contains images that can be used for user profile's icon + +Package: gnome-desktop3-data +Architecture: all +Version: 44.5-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 524 +Breaks: libgnome-desktop-3-17 (<< 3.36), libgnome-desktop-3-18 (<< 3.36) +Filename: pool/gnome-desktop3-data_44.5-1ubuntu1_all.deb +Size: 32158 +MD5sum: 31575a4a981b9d0541987f7a9f2de24c +SHA1: 03bea7d05d7db293a87397d117f198c15f82ba96 +SHA256: 50bdc946d47908d38f3e96d979eb0e2e53a31873fce124b7c8ee93725b6dad47 +SHA512: 0ebf22a0c3f385c025d6d195e2c20fdf8b24f610ff5d9e7aab28cf33717adb91869b8c6388d7e8ab12e944994f44ed00b91aebbd01642a53d77a0a27062de64d +Description: Common files for GNOME desktop apps + This package includes some files that are shared between several GNOME + apps (internationalization files). + +Package: gnome-disk-utility +Architecture: amd64 +Version: 46.1-2ubuntu2 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1012 +Depends: udisks2 (>= 2.7.6), dconf-gsettings-backend | gsettings-backend, libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libcanberra-gtk3-0 (>= 0.25), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.21.5), libhandy-1-0 (>= 1.5.0), liblzma5 (>= 5.1.1alpha+20120614), libnotify4 (>= 0.7.0), libpango-1.0-0 (>= 1.18.0), libpangocairo-1.0-0 (>= 1.14.0), libpwquality1 (>= 1.1.0), libsecret-1-0 (>= 0.7), libsystemd0 (>= 209), libudisks2-0 (>= 2.7.6) +Breaks: gnome-settings-daemon (<< 3.24) +Filename: pool/gnome-disk-utility_46.1-2ubuntu2_amd64.deb +Size: 198886 +MD5sum: faedb1d6dc30a56f3e7c6d869b0b1800 +SHA1: 12fb4e19cc555dde9268593a48c5b22971c3975d +SHA256: ae54e76c2732546561f9444e85e5c04bad89cac5e01a701cd9c098e2bb207cbc +SHA512: 25c7d7665226fed6caa22b9f99504de08c5eda235b74298603fb19b87e615961c96b6ad41dd014d72026e48d9b958cc4ee9f2767319196a762d8ac8b9e1378da +Homepage: https://apps.gnome.org/DiskUtility/ +Description: manage and configure disk drives and media + GNOME Disks is a tool to manage disk drives and media: + . + * Format and partition drives. + * Mount and unmount partitions. + * Query S.M.A.R.T. attributes. + . + It utilizes udisks. + +Package: gnome-font-viewer +Architecture: amd64 +Version: 49.0-1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 304 +Depends: libadwaita-1-0 (>= 1.5), libc6 (>= 2.38), libcairo2 (>= 1.14.0), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), libfribidi0 (>= 0.19.2), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.7.2), libharfbuzz0b (>= 0.9.9), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.22.0) +Filename: pool/gnome-font-viewer_49.0-1_amd64.deb +Size: 62638 +MD5sum: 01d026feeed308a7654b958bad95ecbf +SHA1: d59f80186d0861431ae096eba1a4030b9334bea7 +SHA256: 7510d6480cc138a552ec6e36419f198fa3d61507bba098a47388f0c653ea873b +SHA512: b2fd7201aae4a5b41e3735ba1e39f66fafea3e5c476405fd68a3017e1115f17fb41dff76330dacb3b4a8436945955aa5dfb23f55c939dfad616afe9e90b7bbc1 +Homepage: https://apps.gnome.org/FontViewer/ +Description: font viewer for GNOME + This program can preview fonts and create thumbnails for fonts. + +Package: gnome-initial-setup +Architecture: amd64 +Version: 50.0-0ubuntu7.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3251 +Depends: gnome-settings-daemon (>= 3.24), pkexec (>= 0.103), polkitd (>= 0.103), tecla (>= 45~rc), gnome-control-center-data, systemd | systemd-standalone-sysusers | systemd-sysusers, libaccountsservice0 (>= 0.6.29), libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.34), libdrm2 (>= 2.4.3), libfontconfig1 (>= 2.12.6), libgdk-pixbuf-2.0-0 (>= 2.31.1), libgdm1 (>= 3.8.3), libgeoclue-2-0 (>= 2.6.0), libgeocode-glib-2-0 (>= 0.99.1), libglib2.0-0t64 (>= 2.80.0), libgnome-bg-4-2t64 (>= 3.27.90), libgnome-desktop-4-2t64 (>= 3.17.92), libgnome-qr-gtk-4-0 (>= 44.5-1ubuntu1), libgtk-4-1 (>= 4.17.0), libgweather-4-0t64 (>= 4.1), libharfbuzz0b (>= 0.6.0), libibus-1.0-5 (>= 1.5.2), libinsights0 (>= 0.6.0), libjson-glib-1.0-0 (>= 1.5.2), libkrb5-3 (>= 1.8+dfsg), libnm0 (>= 1.2), libnma-gtk4-0 (>= 1.8.34), libpango-1.0-0 (>= 1.32.5), libpolkit-gobject-1-0 (>= 0.103), libpwquality1 (>= 1.1.0), libwebkitgtk-6.0-4 (>= 2.37.1) +Recommends: accountsservice, geoclue-2.0 (>= 2.6.0), language-selector-common +Suggests: gdm3 +Breaks: gnome-session-bin (<< 50~) +Filename: pool/gnome-initial-setup_50.0-0ubuntu7.1_amd64.deb +Size: 898052 +MD5sum: 9c893ba83a516d841f5e4252b3e52fc3 +SHA1: 163291d2ff36a1cde3151646234990be7863e27a +SHA256: 268d971491abe2fef77925b304f7c3ad22a7a12cf5d6ffae6778c0d0a63a6e0b +SHA512: 53bb98f46a0ddcc7d5598a0f6af671557d8176c86e500783e1f14f3dc9c708d9ed91df368b5d0839f32cab13fecc61d3a37362598aa9ff9aee00d19e726ba864 +Homepage: https://git.gnome.org/browse/gnome-initial-setup/ +Description: Initial GNOME system setup helper + After acquiring or installing a new system there are a few essential things + to set up before use. GNOME Initial Setup aims to provide a simple, easy, + and safe way to prepare a new system. + . + GNOME Initial Setup runs the first time you log in to the GNOME desktop + and lets you easily configure your language, keyboard layout, online accounts + integration, and more. + . + If you want to configure these things at any other time, run the Settings app. + +Package: gnome-keyring +Architecture: amd64 +Version: 50.0-1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 2804 +Depends: default-dbus-session-bus | dbus-session-bus, gcr (>= 3.4), p11-kit (>= 0.16), pinentry-gnome3, dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.38), libgck-1-0 (>= 3.3.90), libgcr-base-3-1 (>= 3.27.90), libgcrypt20 (>= 1.12.0), libglib2.0-0t64 (>= 2.80.0), libsystemd0 +Recommends: gnome-keyring-pkcs11, libpam-gnome-keyring +Filename: pool/gnome-keyring_50.0-1_amd64.deb +Size: 606958 +MD5sum: 5ec5447e2ce64f9d9e3e9654d6d11c92 +SHA1: 5ff2f68e4697f711cd49240e6648bc9064466abe +SHA256: 8b5acd08a0857f8622087271bcfd5c72e8585fa0e02d1a56706b0d1c6bf66a34 +SHA512: d9eed2dbe203360adcd406217755a603ee66bc94accbe8f1f95e8706f0cc5f2e8fcf36abf3479050f1cf92431beea09f18065d16e8a8dc35faf39720890fa5fd +Homepage: https://wiki.gnome.org/GnomeKeyring +Description: GNOME keyring services (daemon and tools) + gnome-keyring is a daemon in the session, similar to ssh-agent, + and other applications can use it to store passwords and other + sensitive information. + . + The program can manage several keyrings, each with its own master + password, and there is also a session keyring which is never stored to + disk, but forgotten when the session ends. + +Package: gnome-keyring-pkcs11 +Architecture: amd64 +Version: 50.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-keyring +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 100 +Depends: libc6 (>= 2.28), libglib2.0-0t64 (>= 2.80) +Filename: pool/gnome-keyring-pkcs11_50.0-1_amd64.deb +Size: 26110 +MD5sum: 9abe17b7db286ef03eb1551235228cb2 +SHA1: 24782ca6736ee0666c57563d91730687d9e699c6 +SHA256: 821956354c95ec78ba601e0c814057a8f99c3f7cc99277fb12cbe79c7a69914c +SHA512: 9f660a4d240b8c4f214ed09581c255b2bcb1c3a9b3bc593929fa1b79cfe3d5c34627dddd568e76c62d34bb2cd89c0e53429ae79efc7d98d73de726d26826cbcb +Homepage: https://wiki.gnome.org/GnomeKeyring +Description: GNOME keyring module for the PKCS#11 module loading library + gnome-keyring is a daemon in the session, similar to ssh-agent, + and other applications can use it to store passwords and other + sensitive information. + . + This package contains a PKCS#11 module that will allow using the GNOME + keyring as a certificate database. + +Package: gnome-logs +Architecture: amd64 +Version: 49.0-1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 780 +Depends: libadwaita-1-0 (>= 1.4~beta), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.9.3), libpango-1.0-0 (>= 1.42.0), libsystemd0, dconf-gsettings-backend | gsettings-backend, gsettings-desktop-schemas +Filename: pool/gnome-logs_49.0-1_amd64.deb +Size: 123842 +MD5sum: 9ee18bb2d762d8aed27891779f50b8a5 +SHA1: daa486e06e3277144135dee850966aecee569a22 +SHA256: bcf68f3dd689353b632262f259330795379c8dcf889cc2bdd21ebb46247c0486 +SHA512: 9e754e2d330de392c52715686350c2c453d3173baecca7741ba2e6e5c2135c102ed86f63b3050eb20fecd3b88b0a3a30debb2f2df352c665b85c99fe8d2d9b0c +Homepage: https://apps.gnome.org/Logs/ +Description: viewer for the systemd journal + The GNOME Logs application is an application to view system logs + (from the systemd journal) for the GNOME Desktop environment. + +Package: gnome-menus +Architecture: amd64 +Version: 3.38.1-1ubuntu1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 240 +Depends: python3:any +Filename: pool/gnome-menus_3.38.1-1ubuntu1_amd64.deb +Size: 10874 +MD5sum: 80629a705ab7440261fc77af72b04fb6 +SHA1: 59f4d56bdb8b7bc30315f88817302e6ec65c4b44 +SHA256: bbc653161f70183310f3ca880bec9e2d90e7b80ad90f31a4e0762ab93055dca4 +SHA512: f9e868abf57607b25ee6012851fab858c7f3d264747e6a93456dce7d321ee53324a52033f6d755972c83ceaa8bacf2561a65d214a3b986ae0f7a0452ca425df0 +Description: GNOME implementation of the freedesktop menu specification + The package contains an implementation of the draft + "Desktop Menu Specification" from freedesktop.org: + . + http://www.freedesktop.org/Standards/menu-spec + . + Also contained here are the GNOME menu layout configuration files, .directory + files and assorted menu related utility programs. + +Package: gnome-online-accounts +Architecture: amd64 +Version: 3.58.0-1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 300 +Depends: libgoa-1.0-0b (= 3.58.0-1), libgoa-backend-1.0-2 (= 3.58.0-1), libc6 (>= 2.34), libgcr-4-4 (>= 3.8.0), libglib2.0-0t64 (>= 2.84.0), libkeyutils1 (>= 1.6.3), libkrb5-3 (>= 1.10+dfsg~alpha1), librest-1.0-0 (>= 0.9.1) +Recommends: gnome-control-center | gnome-online-accounts-gtk +Filename: pool/gnome-online-accounts_3.58.0-1_amd64.deb +Size: 86386 +MD5sum: b05a49a9f1335bf81c9cc1ef5c4844ba +SHA1: 810fc63b365c1a3cac54dffaec2883029a391d6d +SHA256: 306913fb919e3dcf01cda6e3029dacb18644cadd1bcc58fb06e2014e5269d824 +SHA512: 71b4c7c33719fb0ab4c833fb62b7513abb1feb7856a3638dca1b99936d38a2f683b7f3e62af3ef32de263c80da1249afbe82860dbba23dc53bcf7294cf61dc3f +Homepage: https://wiki.gnome.org/Projects/GnomeOnlineAccounts +Description: service to manage online accounts for the GNOME desktop + This package contains the GNOME Online Accounts service, which provides a + centralized place for managing online accounts (Google, etc) for the + GNOME desktop. + +Package: gnome-remote-desktop +Architecture: amd64 +Version: 50.2-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1224 +Depends: fuse3, pipewire (>= 1.2.0), systemd | systemd-sysusers, systemd | systemd-tmpfiles, wireplumber, dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.38), libcairo2 (>= 1.10.0), libdrm2 (>= 2.4.99), libei1 (>= 1.3.901), libepoxy0 (>= 1.4.3), libfreerdp-server3-3 (>= 3.0.0), libfreerdp3-3 (>= 3.22.0), libfuse3-4 (>= 3.17.2), libglib2.0-0t64 (>= 2.83.0), libkrb5-3 (>= 1.6.dfsg.2), libnotify4 (>= 0.7.0), libopus0 (>= 1.1), libpipewire-0.3-0t64 (>= 1.2.0), libpolkit-gobject-1-0 (>= 122), libsecret-1-0 (>= 0.7), libsystemd0, libtss2-esys-3.0.2-0t64 (>= 2.3.1), libtss2-mu-4.0.1-0t64 (>= 3.0.1), libtss2-rc0t64 (>= 3.0.1), libtss2-tctildr0t64 (>= 3.0.1), libva-drm2 (>= 1.1.0), libva2 (>= 2.2.0), libvulkan1 (>= 1.2.131.2), libwinpr3-3 (>= 3.0.0), libxkbcommon0 (>= 1.0.0) +Recommends: libmutter-17-0 | libmutter-18-0 +Breaks: gdm3 (<< 50~rc), gnome-control-center (<< 1:42) +Filename: pool/gnome-remote-desktop_50.2-0ubuntu0.1_amd64.deb +Size: 328892 +MD5sum: 218d9138c8b74de78c12c284e8a8a576 +SHA1: f5c5df0560fb74b319af29373f2428eb920261bf +SHA256: 67f947c0d088ab984bde86657bed7956b9c7abb1a90bf7a705ad258548238e61 +SHA512: fceefebc458080b69765a9268c28b9ce9cc7c730e307e6898ebcb8965cd27f242010aaebadce51deb0bb3bea1891563a85bcec56b1630429f52af5ddad530046 +Homepage: https://wiki.gnome.org/Projects/Mutter/RemoteDesktop +Description: Remote desktop daemon for GNOME using PipeWire + This daemon enables GNOME to offer remote desktop sharing and control + using RDP with PipeWire. It supports GNOME on both X11 and Wayland. + Remote sharing can be enabled and managed in the GNOME Settings app. + +Package: gnome-session +Architecture: all +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 167 +Depends: adwaita-icon-theme, fonts-adwaita, gnome-session-bin (<< 51~), gnome-session-bin (>= 50.1-0ubuntu0.1), gnome-session-common (= 50.1-0ubuntu0.1), gnome-settings-daemon, gnome-shell (>= 50~), xdg-desktop-portal-gnome, xwayland +Suggests: desktop-base, fonts-cantarell, gnome-keyring +Filename: pool/gnome-session_50.1-0ubuntu0.1_all.deb +Size: 54192 +MD5sum: 9baea9e89102514a3c046f7feaa20bed +SHA1: 36ac4e81f7e048a8c6a9c6d944685a789ff3e710 +SHA256: 3425c8e260ca89df3a136b3b55ff372effe306fa5d0ac6981371d0932944ca44 +SHA512: b4cb897491d5a988bcbb436f553b35090275dadf4f79f6021a04d72272030ab54789e74771f167550280a0b4554eed75f9680bb51e9a23c3f367f50a715dbc8d +Homepage: https://gitlab.gnome.org/GNOME/gnome-session +Description: GNOME Session Manager - default GNOME session + The GNOME Session Manager is in charge of starting the core components + of the GNOME desktop, and applications that should be launched at + login time. It also features a way to save and restore currently + running applications. + . + This package contains the required components for the standard GNOME + session, based on the GNOME Shell. It can be started from a display + manager such as GDM, and requires 3D acceleration to work properly. + +Package: gnome-session-bin +Architecture: amd64 +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Source: gnome-session +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 314 +Depends: default-dbus-session-bus | dbus-session-bus, gsettings-desktop-schemas, dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.38), libglib2.0-0t64 (>= 2.83.0), libgnome-desktop-4-2t64 (>= 3.34.2), libsystemd0 +Recommends: default-logind | logind +Breaks: budgie-desktop (<< 10.8.2-3~), gdm3 (<< 50~), gnome-initial-setup (<< 49), gnome-shell (<< 50~rc), gnome-startup-applications (<< 49), phosh (<< 0.50~rc), phrog (<< 0.46.0-3~) +Replaces: gnome-startup-applications (<< 49) +Filename: pool/gnome-session-bin_50.1-0ubuntu0.1_amd64.deb +Size: 85068 +MD5sum: f81435803d79626cbe570957d731dd9f +SHA1: 352f6a58677d08731474d775aad13faa9ad43343 +SHA256: a5e64a55e660b82a732a4a24bbae4529d4040e794232201345efacdb43c07700 +SHA512: 45ca92626ab8e08ee4ebf59e64538a7aa01e5a60eeb47bbc7db6002db6a2df646e3a941ce7554cce45da32dcd81a0131c45dfb75a78824612eeb833af02b41c6 +Homepage: https://gitlab.gnome.org/GNOME/gnome-session +Description: GNOME Session Manager - Minimal runtime + The GNOME Session Manager is in charge of starting the core components + of the GNOME desktop, and applications that should be launched at + login time. It also features a way to save and restore currently + running applications. + . + This package contains the binaries for the GNOME Session Manager, but + no startup scripts. It is meant for those willing to start + gnome-session by hand with the components of their choice, and for + applications such as GDM that use gnome-session internally. + +Package: gnome-session-canberra +Architecture: amd64 +Version: 0.30-18ubuntu3 +Priority: optional +Section: gnome +Source: libcanberra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 43 +Depends: libc6 (>= 2.34), libcanberra-gtk3-0 (>= 0.25), libcanberra0 (>= 0.2), libglib2.0-0t64 (>= 2.16.0), libgtk-3-0t64 (>= 3.0.0) +Filename: pool/gnome-session-canberra_0.30-18ubuntu3_amd64.deb +Size: 6892 +MD5sum: 53347f7eba37b8eeab8e4aa6f0c45059 +SHA1: 6379e16e4546ef055d3ca442c14ef658c169940c +SHA256: 93ffcda57d1cf11abea97c5a484a8424dbad9ed105bd9b106999cbce204a9992 +SHA512: 7cf156eb9bf27d3f785acf19f43366b666ac4f83ec3a3f531c54194e97f98ea4736d505843be5d80588be9846b5efae54b24e22b25298c3c5e325520ef46fafc +Homepage: https://0pointer.de/lennart/projects/libcanberra/ +Description: GNOME session log in and log out sound events + Produce sound events on GNOME session log in and log out. + . + This package is using canberra-gtk-play from libcanberra. + +Package: gnome-session-common +Architecture: all +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Source: gnome-session +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 216 +Filename: pool/gnome-session-common_50.1-0ubuntu0.1_all.deb +Size: 18926 +MD5sum: 0483476056bb655eac7aaa50869471aa +SHA1: 4bbd8b668b33b01f2586647cf0783a07681fd2eb +SHA256: 42428debf5153dce76602b23229c987faac286edf910ac26ade3841350e54f2c +SHA512: 6c5fcb606c8e149489f12b6641736226bcd4005dce4e2085601982cb15d5165a685ecbc971532bf1f39b16d3d69d23ab5efe61f6013d3038aa5a4c80df36157d +Homepage: https://gitlab.gnome.org/GNOME/gnome-session +Description: GNOME Session Manager - common files + The GNOME Session Manager is in charge of starting the core components + of the GNOME desktop, and applications that should be launched at + login time. It also features a way to save and restore currently + running applications. + . + This package contains the translations, data files and startup scripts + which are common to the GNOME and GNOME fallback sessions. + +Package: gnome-settings-daemon +Architecture: amd64 +Version: 50.0-1ubuntu1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Desktop Team +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1218 +Depends: default-logind | logind, gnome-settings-daemon-common (= 50.0-1ubuntu1), gsettings-desktop-schemas (>= 46~beta), libspa-0.2-bluetooth | pulseaudio-module-bluetooth, pipewire-audio | pulseaudio, libaccountsservice0 (>= 0.6.40), libasound2t64 (>= 1.0.16), libc6 (>= 2.38), libcanberra0 (>= 0.16), libcolord2 (>= 0.1.10), libcups2t64 (>= 1.6.0), libfontconfig1 (>= 2.12.6), libgck-2-2 (>= 3.2.2), libgcr-4-4 (>= 3.8.0), libgeoclue-2-0 (>= 2.4.0), libgeocode-glib-2-0 (>= 3.26.3), libglib2.0-0t64 (>= 2.83.0), libgnome-desktop-4-2t64 (>= 3.34.2), libgudev-1.0-0 (>= 146), libgweather-4-0t64 (>= 4.1), libmm-glib0 (>= 0.7.991), libnm0 (>= 1.0.0), libnotify4 (>= 0.8.7), libp11-kit0 (>= 0.25.0), libpolkit-gobject-1-0 (>= 0.114), libpulse-mainloop-glib0 (>= 0.99.1), libpulse0 (>= 0.99.1), libsystemd0 (>= 213), libupower-glib3 (>= 0.99.12), libx11-6, libxfixes3 (>= 1:6.0.0) +Recommends: iio-sensor-proxy, pipewire-audio, pkexec, systemd-oomd, x11-xserver-utils +Suggests: usbguard +Breaks: gnome-shell (<< 47~rc), mutter-common (<< 47~rc), phosh (<< 0.50~rc) +Filename: pool/gnome-settings-daemon_50.0-1ubuntu1_amd64.deb +Size: 308708 +MD5sum: 7a24d5cec51877ba861e9236b5f36224 +SHA1: af6befe2a6446c045ccb99e24468f6d797134ed7 +SHA256: 68cc2bb46f5771a54e292306654bc867cfe18e9ba6ab3a8ae85e5e8ec9058d49 +SHA512: ccd84a52ebb9d7590a6e9a40482c35235698928c83fcf5075ead9f7b678254b858799357fb72de842756be765f29dd0331d38ea644bda80a3c7919bf4b8e9dcf +Homepage: https://gitlab.gnome.org/GNOME/gnome-settings-daemon +Description: daemon handling the GNOME session settings + This package contains the daemon which is responsible for setting the + various parameters of a GNOME session and the applications that run + under it. It handles the following kinds of settings: + . + * Keyboard: layout, accessibility options, shortcuts, media keys + * Clipboard management + * Theming: background, icons, GTK+ applications + * Cleanup of unused files + * Mouse: cursors, speed, accessibility options + * Startup of other daemons: screensaver, sound daemon + . + It also sets various application settings through X resources and + freedesktop.org XSETTINGS. + +Package: gnome-settings-daemon-common +Architecture: all +Version: 50.0-1ubuntu1 +Priority: optional +Section: gnome +Source: gnome-settings-daemon +Maintainer: Ubuntu Desktop Team +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 328 +Provides: gnome-settings-daemon-schemas (= 50.0-1ubuntu1) +Depends: dconf-gsettings-backend | gsettings-backend +Breaks: gdm (<< 49~alpha.1), gnome-initial-setup (<< 49~alpha), gnome-session (<< 49~alpha.1), gnome-shell (<< 49~alpha.1), ubuntu-session (<< 49~alpha.1) +Filename: pool/gnome-settings-daemon-common_50.0-1ubuntu1_all.deb +Size: 21986 +MD5sum: a0d3c24143dd5a2a60adf26987ba889b +SHA1: 53a1e29ecf320dca3265f9c15038b34b7abe8ef4 +SHA256: 1fbbe762169f60a022c37d98059868fad5b4d5bb2ff52522c68edb8ab5ee4380 +SHA512: d68d892d169948d1f2ad57feea86537d7a22d7c70e7e35cee210ed40fb7763455b664706752138a835ba04bfa52722f71d11adccda320c0c4604b1f4544b5815 +Homepage: https://gitlab.gnome.org/GNOME/gnome-settings-daemon +Description: daemon handling the GNOME session settings - common files + This package contains GSettings schemas and other architecture-independent + files for GNOME Settings Daemon. It is probably not interesting on its own for + end users, but packages may depend on this if they only need to read and write + settings & don't themselves care if the settings daemon is actually running or + not. + +Package: gnome-shell +Architecture: amd64 +Version: 50.1-0ubuntu1.2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 7059 +Provides: notification-daemon, polkit-1-auth-agent +Depends: gir1.2-accountsservice-1.0, gir1.2-adw-1, gir1.2-atk-1.0, gir1.2-atspi-2.0, gir1.2-gcr-4 (>= 3.90.0), gir1.2-gdesktopenums-3.0, gir1.2-gdkpixbuf-2.0, gir1.2-gdm-1.0 (>= 47.0-4~), gir1.2-geoclue-2.0, gir1.2-glib-2.0 (>= 2.86.0), gir1.2-gnomebg-4.0, gir1.2-gnomeqr-4.0, gir1.2-gnomebluetooth-3.0 (>= 42.3), gir1.2-gnomedesktop-4.0 (>= 40), gir1.2-graphene-1.0, gir1.2-gstreamer-1.0, gir1.2-gtk-4.0, gir1.2-gweather-4.0 (>= 4.1), gir1.2-freedesktop, gir1.2-ibus-1.0, gir1.2-mutter-18 (>= 50.0), gir1.2-nm-1.0, gir1.2-nma4-1.0 (>= 1.10.4), gir1.2-pango-1.0, gir1.2-polkit-1.0, gir1.2-rsvg-2.0, gir1.2-soup-3.0, gir1.2-upowerglib-1.0, gjs (>= 1.87.1), gnome-control-center (>= 1:46), gnome-settings-daemon (>= 49), gnome-shell-common (= 50.1-0ubuntu1.2), gsettings-desktop-schemas (>= 50~alpha), gstreamer1.0-pipewire (>= 0.3.49), libglib2.0-bin (>= 2.86.0), python3, tecla, ubuntu-wallpapers, dconf-gsettings-backend | gsettings-backend, libatk-bridge2.0-0t64 (>= 2.5.3), libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.38), libcairo2 (>= 1.14.0), libecal-2.0-3 (>= 3.45), libedataserver-1.2-27t64 (>= 3.45), libgcr-4-4 (>= 3.90.0), libgdk-pixbuf-2.0-0 (>= 2.25.2), libgirepository-2.0-0 (>= 2.86.0), libgjs0 (>= 1.87.1), libgles2, libglib2.0-0t64 (>= 2.86.0), libgnome-autoar-0-0 (>= 0.1.1), libgnome-desktop-4-2t64 (>= 40), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.12.0), libical3t64 (>= 3.0.0), libjson-glib-1.0-0 (>= 1.5.2), libmutter-18-0 (>= 50.0), libnm0 (>= 1.4.0), libpango-1.0-0 (>= 1.37.5), libpipewire-0.3-0t64 (>= 0.3.49), libpolkit-agent-1-0 (>= 0.99), libpolkit-gobject-1-0 (>= 0.94), libpulse-mainloop-glib0 (>= 0.99.1), libpulse0 (>= 0.99.1), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.0.3), libsystemd0, libx11-6, libxext6, libxfixes3 +Recommends: bolt, evolution-data-server (>= 3.45), gdm3, gnome-remote-desktop, gnome-menus, gnome-user-docs, ibus, iio-sensor-proxy, power-profiles-daemon, switcheroo-control, ubuntu-session | gnome-session, unzip +Suggests: gir1.2-malcontent-0, gir1.2-telepathyglib-0.12, gir1.2-telepathylogger-0.2, gnome-browser-connector, gnome-shell-extension-prefs +Breaks: authd (<< 0.4.2~), gnome-session (<< 49~beta~), gnome-shell-extension-appindicator (<< 50), gnome-shell-extension-dash-to-panel (<< 55), gnome-shell-extension-dashtodock (<< 79), gnome-shell-extension-desktop-icons (<< 21.04), gnome-shell-extension-desktop-icons-ng (<< 46+really47.0.2-2), gnome-shell-extension-taskbar (<< 57.0-2.1~), gnome-shell-extension-top-icons-plus (<< 27-3~), gnome-shell-extension-workspaces-to-dock (<< 54~), gnome-shell-extensions (<< 40.0~), ubuntu-session (<< 49~beta~) +Filename: pool/gnome-shell_50.1-0ubuntu1.2_amd64.deb +Size: 977594 +MD5sum: 206b79e07100837bd0bfdef66472058f +SHA1: 91ed852c55678b9f61f62632d0b00fec5e33772e +SHA256: c1966176f38017d05eae9ed5e14f54b7d5d798dca7cfcad50b2ab7de2ec32f88 +SHA512: e419c9f6e7cb17e441248546b9712c079f2285addd448790b5fb6f9534f8a2b76477ae6e71bb1fa2a76fc500c1514beafebdbd352a1c32d12e8da3f3869b052e +Homepage: https://gitlab.gnome.org/GNOME/gnome-shell +Description: graphical shell for the GNOME desktop + The GNOME Shell provides core interface functions like switching + windows, launching applications or see your notifications. It takes + advantage of the capabilities of modern graphics hardware and + introduces innovative user interface concepts to provide a + delightful and easy to use experience. GNOME Shell is the defining + technology of the GNOME 3 user experience. + +Package: gnome-shell-common +Architecture: all +Version: 50.1-0ubuntu1.2 +Priority: optional +Section: gnome +Source: gnome-shell +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3128 +Depends: dconf-gsettings-backend | gsettings-backend +Recommends: yaru-theme-gnome-shell (>= 25.10) +Breaks: gnome-session-common (<< 50~alpha) +Filename: pool/gnome-shell-common_50.1-0ubuntu1.2_all.deb +Size: 187668 +MD5sum: bde98d4c6b6c6379cc9e23a342ed2a3f +SHA1: 049e702b39da19448914ea4f0c1d538a1fc44f1e +SHA256: 86da4316ab54d045a96e65b96eb28ec283b63cbb389f55a2e3ae05336eb53dbf +SHA512: 9ffc0e3df13ac182ef158c68e432e28402e5ca694d0eed047f2af647bd3b58ae41bc98180799f9a01a1048482491155fc26eff493869bdf53fb4179359714acd +Homepage: https://gitlab.gnome.org/GNOME/gnome-shell +Description: common files for the GNOME graphical shell + This package contains translations and data files for the GNOME shell. + +Package: gnome-shell-ubuntu-extensions +Architecture: all +Version: 50.26.04.7ubuntu +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Installed-Size: 2532 +Provides: gnome-shell-extension-appindicator, gnome-shell-extension-desktop-icons-ng, gnome-shell-extension-ubuntu-dock, gnome-shell-extension-ubuntu-tiling-assistant +Depends: gnome-shell (>= 49~), gnome-shell (<< 51~), gir1.2-atk-1.0, gir1.2-freedesktop, gir1.2-gdkpixbuf-2.0, gir1.2-adw-1, gir1.2-glib-2.0, gir1.2-gnomeautoar-0.1, gir1.2-gnomedesktop-3.0, gir1.2-gtk-3.0, gir1.2-gtk-4.0, gir1.2-pango-1.0, gir1.2-snapd-2, gjs, dconf-gsettings-backend | gsettings-backend +Recommends: gir1.2-dbusmenu-glib-0.4 +Suggests: gnome-shell-extension-prefs, libappindicator3-1, libayatana-appindicator3-1 +Conflicts: gnome-shell-extension-appindicator, gnome-shell-extension-desktop-icons-ng, gnome-shell-extension-ubuntu-dock, gnome-shell-extension-ubuntu-tiling-assistant +Breaks: gnome-shell-common (<< 50~beta-0ubuntu1~) +Replaces: gnome-shell-common (<< 50~beta-0ubuntu1~), gnome-shell-extension-appindicator, gnome-shell-extension-desktop-icons-ng, gnome-shell-extension-ubuntu-dock, gnome-shell-extension-ubuntu-tiling-assistant +Filename: pool/gnome-shell-ubuntu-extensions_50.26.04.7ubuntu_all.deb +Size: 293280 +MD5sum: 1bae7ceb4c63d4361b1c2488fef54247 +SHA1: c5baed2028a2be1fef2658fb5dec3b4184905a98 +SHA256: ac1bd47a587cb8b803dcf3197782e5f79e3a8d3c795f784024ea9c3f44584458 +SHA512: 66e888fbb5ca9d975672bfcbfc3048bc7f7a0ea8b8bbaecf2d77a032b0a89dc6b11281358ee4b897ac9611d2fe8975914bac820c1ad6a4a6fd2e50fbcec54164 +Homepage: https://github.com/ubuntu/gnome-shell-ubuntu-extensions +Description: Ubuntu official Extensions to extend functionality of GNOME Shell + GNOME Shell is extensible using extensions. This package contains + all the official Ubuntu GNOME Shell extensions. + . + All the ubuntu extensions that are officially supported are included in this + package, and in particular: + - AppIndicators + - Desktop Icons NG + - Dash to Dock + - Tiling Assistant + +Package: gnome-terminal +Architecture: amd64 +Version: 3.58.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 789 +Provides: x-terminal-emulator +Depends: default-dbus-session-bus | dbus-session-bus, fonts-dejavu-mono, gnome-terminal-data (<< 3.60), gnome-terminal-data (>= 3.58), gsettings-desktop-schemas (>= 0.1.0), dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.34), libcairo2 (>= 1.2.4), libgcc-s1 (>= 3.0), libglib2.0-0t64 (>= 2.83.0), libgtk-3-0t64 (>= 3.23.0), libhandy-1-0 (>= 1.5.0), libpango-1.0-0 (>= 1.14.0), libstdc++6 (>= 4.1.1), libuuid1 (>= 2.16), libvte-2.91-0 (>= 0.80.0), libx11-6 +Recommends: gvfs, xdg-terminal-exec, yelp +Filename: pool/gnome-terminal_3.58.0-1ubuntu1_amd64.deb +Size: 224256 +MD5sum: 9665d559aec48f31e929c854f13a551d +SHA1: 6856d2bdff84170c4de7f40f23a3cea370006e27 +SHA256: c0af28a928f92cbcbd6a4262dedbf02240a7ede9c534b8e5c24f00e741d68690 +SHA512: 77007101f14e433feacdc174185715856191bc32bbd11d81ba9edc5c88eaf97b1b44676eea5e0db814b5dd8e9411e3385d342a49211d28b35266eca7a8dd88db +Homepage: https://wiki.gnome.org/Apps/Terminal +Description: GNOME terminal emulator application + GNOME Terminal is a terminal emulation application that you can use to + perform the following actions: + - Access a UNIX shell in the GNOME environment. + - Run any application that is designed to run on VT102, VT220, and xterm + terminals. + . + GNOME Terminal features the ability to use multiple terminals in a single + window (tabs) and profiles support. + +Package: gnome-terminal-data +Architecture: all +Version: 3.58.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-terminal +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1844 +Recommends: gnome-terminal +Filename: pool/gnome-terminal-data_3.58.0-1ubuntu1_all.deb +Size: 40002 +MD5sum: 1a3b8c741ff957d270d61d8accf0aeec +SHA1: 388a9bd589130d802490c280dc65ca25b1e47aff +SHA256: 3edefea99bca8b45f95c03f8e77212ce2c217318742d50084ca4f386975dc7e5 +SHA512: 4daad7b73d5d0144d8e733105c8493b71b34611c5f8c19ac09fbf6c4e0181b445be1d96a32674585e757dcf4061985e3576680bebd9eb4cf5e5aced11bfd17bf +Homepage: https://wiki.gnome.org/Apps/Terminal +Description: Data files for the GNOME terminal emulator + GNOME Terminal is a terminal emulation application that you can use to + perform the following actions: + - Access a UNIX shell in the GNOME environment. + - Run any application that is designed to run on VT102, VT220, and xterm + terminals. + . + This package contains data, help files and localization settings for + gnome-terminal, the GNOME terminal emulator application. + +Package: gnome-text-editor +Architecture: amd64 +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1696 +Depends: dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.34), libeditorconfig0 (>= 0.11.0), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.19.4), libgtksourceview-5-0 (>= 5.15.0), libpango-1.0-0 (>= 1.14.0), libspelling-1-2 (>= 0.3.0) +Filename: pool/gnome-text-editor_50.1-0ubuntu0.1_amd64.deb +Size: 199186 +MD5sum: 5316e4e1936d6f33032e2b9faa38f1ea +SHA1: 5238be8174489c1b3087acc4410c41efd254b3e4 +SHA256: 375aa2fe53a81a570105584ff837a2c6038117b0cc9171349c055e0cc6388c03 +SHA512: 14ae54d1f4e449fbf59ea820f2ff83501f77c9abb2e8379149945d0b89738edcc7760e1a7ad0abe3c0203b5b137c3a03933a7f6bd02593d0bae8f67a3d102839 +Homepage: https://apps.gnome.org/TextEditor/ +Description: simple text editor for GNOME + GNOME Text Editor is a simple editor for GNOME focused on being a good + general purpose default editor. + . + It works hard to keep track of changes and state even if you quit the + application. You can come back to your work even if you've never saved + it to a file. + . + It is simpler than gedit. + +Package: gnome-themes-extra +Architecture: amd64 +Version: 3.28-5 +Multi-Arch: same +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Depends: gnome-themes-extra-data (>= 3.28-5), libc6 (>= 2.4), libcairo2 (>= 1.2.4), libglib2.0-0t64 (>= 2.38.0), gtk2-engines-pixbuf +Recommends: gnome-accessibility-themes, adwaita-icon-theme +Filename: pool/gnome-themes-extra_3.28-5_amd64.deb +Size: 15330 +MD5sum: 34b8c1d6ffd76c4b4b979af230ebf891 +SHA1: 574b0e259c52b2b23c58f8fbd59f5def448393dc +SHA256: 0adbe694cc05b4739a41c7e3cafc0f86d60317f489b91c90771f6b7ff399ba2e +SHA512: f54df73e24dae02d178beb8f427a99429eaa8c4dd8b4af1cba777744e299a66687ee5c4cf84da6a9c46d87288f42dc6ad2dc59cf19f04edd74bf528bf496acc0 +Description: Adwaita GTK 2 theme — engine + This is the version of Adwaita, the standard GNOME theme, for the + GTK 2.x toolkit. + . + The GTK 3.x version is already included in libgtk-3-0. + . + This package contains the Adwaita theme engine. + +Package: gnome-themes-extra-data +Architecture: all +Version: 3.28-5 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gnome-themes-extra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 501 +Filename: pool/gnome-themes-extra-data_3.28-5_all.deb +Size: 69392 +MD5sum: 2e5c8c03f754139097135ce9b19966fe +SHA1: fd403481325c34c9d36e3d401eeae0b337aae8bb +SHA256: 854250372b1e17260666f2f92258aff060c3299b82a220ff348cf5aa2534dbf9 +SHA512: ba49de42b0affaa04053b207b3b518be9e65cd18096cfbf876b8cba3d4fde9a79e35c92c3253af6b3dfb16b693e58345d65e28416f9e48aeea68f05c9ab90176 +Description: Adwaita GTK 2 theme and Adwaita-dark GTK 3 theme — common files + This package contains the common architecture-independent files for + Adwaita, the standard GNOME theme, for the GTK 2 toolkit. The GTK 3 + equivalent is already included in libgtk-3-0. + . + This package also makes the dark variant of Adwaita available for GTK + 3 as a separate Adwaita-dark theme. In newer versions of GTK 3, this + has been superseded by the ability for a single theme to provide both + light and dark variants, which can be selected in the Appearance panel + of GNOME's Settings application (gnome-control-center). + +Package: gnome-user-docs +Architecture: all +Version: 50.0-0ubuntu1 +Priority: optional +Section: doc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4222 +Depends: ubuntu-docs, yelp +Filename: pool/gnome-user-docs_50.0-0ubuntu1_all.deb +Size: 1842124 +MD5sum: b49af3f46bd3c043338b3d9a135f0bc6 +SHA1: 29606dfe1f0571dbad9b0e3d6aa94e6c1d6a7d74 +SHA256: a02b2d43d6761b44d84ec9f4e106869ec23a4cf955c0cb12081f9bbfc8efc637 +SHA512: bbe44c8a73adcd9bd17c5e139ccc8c1c81e1e40b2fd1101bc541ff179af47cf368bde4c5a0d3561e763eea124faf1f6a75aeb0ae8892aa53ef65a59ece3592be +Homepage: https://help.gnome.org/gnome-help/ +Description: GNOME Help + Documentation for using the GNOME desktop environment and its components. + It covers usage and setup of the core GNOME programs. + +Package: gnupg +Architecture: all +Version: 2.4.8-4ubuntu3.1 +Multi-Arch: foreign +Priority: optional +Section: metapackages +Source: gnupg2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuPG Maintainers +Installed-Size: 474 +Depends: dirmngr (<< 2.4.8-4ubuntu3.1.1~), dirmngr (>= 2.4.8-4ubuntu3.1), gpg (<< 2.4.8-4ubuntu3.1.1~), gpg (>= 2.4.8-4ubuntu3.1), gpg-agent (<< 2.4.8-4ubuntu3.1.1~), gpg-agent (>= 2.4.8-4ubuntu3.1), gpgsm (<< 2.4.8-4ubuntu3.1.1~), gpgsm (>= 2.4.8-4ubuntu3.1) +Recommends: gnupg-l10n (= 2.4.8-4ubuntu3.1), gnupg-utils (<< 2.4.8-4ubuntu3.1.1~), gnupg-utils (>= 2.4.8-4ubuntu3.1), gpg-wks-client (<< 2.4.8-4ubuntu3.1.1~), gpg-wks-client (>= 2.4.8-4ubuntu3.1), gpgv (<< 2.4.8-4ubuntu3.1.1~), gpgv (>= 2.4.8-4ubuntu3.1) +Suggests: gpg-wks-server (<< 2.4.8-4ubuntu3.1.1~), gpg-wks-server (>= 2.4.8-4ubuntu3.1), parcimonie, xloadimage +Breaks: debsig-verify (<< 0.15), dirmngr (<< 2.4.8-4ubuntu3.1), libgnupg-interface-perl (<< 0.52-3), libgnupg-perl (<= 0.19-1), libmail-gnupg-perl (<= 0.22-1), monkeysphere (<< 0.38~), php-crypt-gpg (<= 1.4.1-1), python-apt (<= 1.1.0~beta4), python-gnupg (<< 0.3.8-3), python3-apt (<= 1.1.0~beta4) +Filename: pool/gnupg_2.4.8-4ubuntu3.1_all.deb +Size: 310662 +MD5sum: eb55cb95aaf143ffc99371433df5ad9e +SHA1: 6b6049c696f52091f9621260423ac5bd9af663a7 +SHA256: f8e4e754a843b1334e90092aac4c24433836d0756c996f37822d33905f2596e5 +SHA512: 592322b09ccf95a879dc89f713a6c6abea23acfb34e18af5a4a158377fadc796c5dda1e5f21c6c5b58d199ea81d3f8aefabc9c6214a6505b9fbc00f625af3235 +Homepage: https://www.gnupg.org/ +Description: GNU privacy guard - a free PGP replacement + GnuPG is GNU's tool for secure communication and data storage. + It can be used to encrypt data and to create digital signatures. + It includes an advanced key management facility and is compliant + with the proposed OpenPGP Internet standard as described in RFC4880. + . + This package contains the full suite of GnuPG tools for cryptographic + communications and data storage. + +Package: gpg-wks-client +Architecture: amd64 +Version: 2.4.8-4ubuntu3.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: gnupg2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuPG Maintainers +Installed-Size: 182 +Depends: dirmngr (= 2.4.8-4ubuntu3.1), gpg (= 2.4.8-4ubuntu3.1), gpg-agent (= 2.4.8-4ubuntu3.1), libassuan9 (>= 2.5.0), libc6 (>= 2.38), libgcrypt20 (>= 1.12.0), libgpg-error0 (>= 1.48) +Suggests: gnupg (= 2.4.8-4ubuntu3.1) +Filename: pool/gpg-wks-client_2.4.8-4ubuntu3.1_amd64.deb +Size: 71934 +MD5sum: 7c844226a607632b851d2ddc57c0defb +SHA1: f97c2dc709dc3b4da66fb5b329519439da7b261c +SHA256: 5cec1674a1c09cfb5d5eeb0f8fcb37a2ae5396b6271946d133c6755320fc1e0a +SHA512: 9342ce5635e23a7ba8656545dc1f06baa8c5cb7627577287bf47535c5449428d39d6c5af056f62aa644f3ca134505249afba4e3c1f5bdcd1c89dacfce8b5086e +Homepage: https://www.gnupg.org/ +Description: GNU privacy guard - Web Key Service client + GnuPG is GNU's tool for secure communication and data storage. + It can be used to encrypt data and to create digital signatures. + It includes an advanced key management facility and is compliant + with the proposed OpenPGP Internet standard as described in RFC4880. + . + This package provides the GnuPG client for the Web Key Service + protocol. + . + A Web Key Service is a service that allows users to upload keys per + mail to be verified over https as described in + https://tools.ietf.org/html/draft-koch-openpgp-webkey-service + . + For more information see: https://wiki.gnupg.org/WKS + +Package: groff-base +Architecture: amd64 +Version: 1.23.0-10 +Multi-Arch: foreign +Priority: important +Section: text +Source: groff +Maintainer: Colin Watson +Installed-Size: 3734 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 4.0), libstdc++6 (>= 4.1.1), libuchardet0 (>= 0.0.1) +Suggests: groff +Filename: pool/groff-base_1.23.0-10_amd64.deb +Size: 1023374 +MD5sum: b8eab66cd5de6be99c1afe3d8057574b +SHA1: 051b81930d9e263e206c788590458871ae1de4a0 +SHA256: ffd67d3d60092b772b8276fb087f5a328a7ee7dafba197f16fc874cba5320279 +SHA512: 4d0438ee981ab65d299563a82ff0d525668199428d5e57ec009ee78356923664939b5196d7c7f8fa91d880a5575db4c4039b90fc2c48b6c811451fcb86ab3895 +Homepage: https://www.gnu.org/software/groff/ +Description: GNU troff text-formatting system (base system components) + This package contains the traditional UN*X text formatting tools + troff, nroff, tbl, eqn, and pic. These utilities, together with the + man-db package, are essential for displaying the on-line manual pages. + . + groff-base is a stripped-down package containing the necessary components + to read manual pages in ASCII, Latin-1, and UTF-8, plus the PostScript + device (groff's default). Users who want a full groff installation, with + the standard set of devices, fonts, macros, and documentation, should + install the groff package. + +Package: grub-common +Architecture: amd64 +Version: 2.14-2ubuntu2.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: grub2 +Maintainer: Ubuntu Developers +Original-Maintainer: GRUB Maintainers +Installed-Size: 12 +Depends: grub2-common (= 2.14-2ubuntu2.1) +Filename: pool/grub-common_2.14-2ubuntu2.1_amd64.deb +Size: 2238 +MD5sum: aa47511f5c5ac7cae0274e8d21fa0f68 +SHA1: f17c94b218e4c3b6fa0a673ad63850aac0b6731e +SHA256: 7be8b3a7e40ea3f4d125521291cecda828f2051419472d167896d78b011d90f6 +SHA512: 6977580aef6253bed8cc4ff81fa4c7530f019f48329938253e1d53f7eebb72a1442c340dae2923a2d6e1644da9c05eb4f56f03e39c46a7574a97714bcae53c95 +Homepage: https://www.gnu.org/software/grub/ +Description: GRand Unified Bootloader, version 2 (dummy package) + This is a dummy transitional package that depends on grub2-common. + It can be safely removed. + +Package: grub2-common +Architecture: amd64 +Version: 2.14-2ubuntu2.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: grub2 +Maintainer: Ubuntu Developers +Original-Maintainer: GRUB Maintainers +Installed-Size: 16452 +Provides: grub-common (= 2.14-2ubuntu2.1) +Depends: libc6 (>= 2.38), libdevmapper1.02.1 (>= 2:1.02.197), libefiboot1t64 (>= 39), libefivar1t64 (>= 39), libfreetype6 (>= 2.2.1), libfuse3-4 (>= 3.17.2), liblzma5 (>= 5.1.1alpha+20120614), debconf (>= 0.5) | debconf-2.0, gettext-base, python3, python3-apt +Recommends: os-prober +Suggests: multiboot-doc, grub-emu, mtools, xorriso, desktop-base, console-setup +Breaks: grub-common (<< 2.14~), grub-legacy (<< 0.97-83~) +Replaces: grub, grub-common, grub-legacy +Filename: pool/grub2-common_2.14-2ubuntu2.1_amd64.deb +Size: 2585520 +MD5sum: 33a220d7257da22a54a2b86572924853 +SHA1: d662847ca3bf994a1f65a5d81299b6a7f37e106d +SHA256: 588adef32c4e4cb41f3cb82a0d0d24e5200e69071f4febeda91a84889217b2d1 +SHA512: ba824dbc78cf79700b81ee080be80444f3a6297fdc1bf96262ed8fbdd052b0dfcde6008b06ac81da801458c8fa359040023871e8a9c806913bc370a98af660c6 +Homepage: https://www.gnu.org/software/grub/ +Description: GRand Unified Bootloader (common files for version 2) + This package contains common files shared by the distinct flavours of GRUB. + The files in this package are specific to GRUB 2, and would break GRUB + Legacy if installed on the same system. + +Package: gsettings-desktop-schemas +Architecture: all +Version: 50.0-1ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 328 +Depends: dconf-gsettings-backend | gsettings-backend, user-session-migration +Recommends: python3 +Breaks: gnome-panel (<< 3.49), gnome-shell (<< 44), libmutter-11-0 (<< 44), metacity (<< 1:3.49), ukwm (<< 1.2.1) +Filename: pool/gsettings-desktop-schemas_50.0-1ubuntu2_all.deb +Size: 37776 +MD5sum: f52822fd5dffd9cc686ce163f233428c +SHA1: cb9f7de305d7d2cdf7277f403c7319e5433582f4 +SHA256: 491a48fd8f64611584e08be7069ffc0aa2b1a97c8fef38c1c9239a5b590369fd +SHA512: e75cfd800a9225233fc60275656004dda393cca8625879a1e1e2a3b213139699075603786394d264923a2ba75cb2bd9ef5352cd13eb3d1744dced9dc64654ad3 +Homepage: https://www.gnome.org/ +Description: GSettings desktop-wide schemas + gsettings-desktop-schemas contains a collection of GSettings schemas for + settings shared by various components of a desktop. + +Package: gsettings-ubuntu-schemas +Architecture: all +Version: 0.0.7+21.10.20210712-0ubuntu4 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gsettings-ubuntu-touch-schemas +Maintainer: Ubuntu Desktop Team +Installed-Size: 30 +Depends: dconf-gsettings-backend | gsettings-backend +Breaks: gsettings-ubuntu-touch-schemas (<= 0.0.1+14.04.20140130.1-0ubuntu1) +Replaces: gsettings-ubuntu-touch-schemas (<= 0.0.1+14.04.20140130.1-0ubuntu1) +Filename: pool/gsettings-ubuntu-schemas_0.0.7+21.10.20210712-0ubuntu4_all.deb +Size: 5700 +MD5sum: 666605bca278363a274216bb51b1a0ac +SHA1: 004b2ccda2ae56c26e953aae921e4273a181f998 +SHA256: fc2a103eaa71218206013f6f07aa234bf4d8c0f2fd6f412d3addf09d91eef295 +SHA512: bf2f42acc03701a79469a61b234ee320a0cd031663cd87e38669efdab1f5d10ab3e1a7ef5c6573ad4e44c2f82b6a99a1c41610b54ccc8af6a05e15a718bb8e06 +Homepage: https://launchpad.net/gsettings-ubuntu-touch-schemas +Description: GSettings deskop-wide schemas for Ubuntu + gsettings-ubuntu-schemas contains a collection of GSettings schemas for + settings shared by various components of an Ubuntu environment. + +Package: gst-audio-thumbnailer +Architecture: amd64 +Version: 1.0.0-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gst-thumbnailers +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 782 +Depends: libc6 (>= 2.34), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.54.0), libglycin-2-0 (>= 2.0~beta), libgstreamer1.0-0 (>= 1.0.0) +Filename: pool/gst-audio-thumbnailer_1.0.0-0ubuntu1_amd64.deb +Size: 315220 +MD5sum: d5cac78cb76b1d8a3d0c51cfe5031bf4 +SHA1: bc3e43cfa37e32b04cfdd996a9d48b0b224cfdb0 +SHA256: 10c58092417e275eb7eced7dcf3f544f42f892149537ffa6efb3f014d0b6f20d +SHA512: 4b00a74dadd00aedac7c9964525684bc196fa632db11fe59cec7944bf2ba59d8f8a15a1709773f003154157c53c59c5859b35968fd9118d3f95d778503ccf06d +Homepage: https://gitlab.gnome.org/GNOME/gst-thumbnailers +Description: Thumbnailer for audio files, based on GStreamer + Tries to find covert art from an audio container and renders a + thumbnail using libglycin. Primarily for use with Nautilus while + exploring media files. + +Package: gst-video-thumbnailer +Architecture: amd64 +Version: 1.0.0-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gst-thumbnailers +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 826 +Depends: libc6 (>= 2.34), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.54.0), libglycin-2-0 (>= 2.0~beta), libgstreamer-plugins-base1.0-0 (>= 1.10.0), libgstreamer1.0-0 (>= 1.10.0) +Filename: pool/gst-video-thumbnailer_1.0.0-0ubuntu1_amd64.deb +Size: 332054 +MD5sum: 99d7025ddf4a088c9eed653a6fdc41c3 +SHA1: 0a7e541c0367445077a8276c4b87662b532e4835 +SHA256: 92a9e31d167a2e07ce2aec86c334decbba0799ae8b39de09f183932e97b068da +SHA512: a9001a6735426650ff0bae5458460f1574e4d4bb2e5bb01885630ef61a011896f5cb2e17ef2f4febfd6d05c81d35f9164a8ba1cb748fd7d51328cb3c1ce3237d +Homepage: https://gitlab.gnome.org/GNOME/gst-thumbnailers +Description: Thumbnailer for video files, based on GStreamer + Finds a suitably interesting frame from a video and renders a + thumbnail using libglycin. Primarily for use with Nautilus while + exploring media files. + +Package: gstreamer1.0-alsa +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 178 +Provides: gstreamer1.0-audiosink, gstreamer1.0-audiosource +Depends: libasound2t64 (>= 1.0.27), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0) +Suggests: alsa-utils (>= 0.9.0) +Filename: pool/gstreamer1.0-alsa_1.28.2-1_amd64.deb +Size: 50938 +MD5sum: 98e028add570ff54df3d1e68c5b637d2 +SHA1: 2d09ba08d12029dda05d8ab7e741b258eff9f06d +SHA256: 0032c217aa171f4be9f002ee701dfa36e7fa27ffc2e75087a430f4e96fb6e5e3 +SHA512: a7a489e6cfa37a0d61b649d9e6769a2efaaa7ae7d9b1b91754688bed151cc092ea63a0b0599425b67cbfb9e57464dca84e9972e0d178633fe686593ee2ff38ad +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer plugin for ALSA + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugin for the ALSA library. ALSA + is the Advanced Linux Sound Architecture. +Gstreamer-Elements: alsamidisrc, alsasink, alsasrc +Gstreamer-Version: 1.28 + +Package: gstreamer1.0-gl +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 415 +Provides: gstreamer1.0-videosink, gstreamer1.0-videosource +Depends: libc6 (>= 2.27), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgstreamer-gl1.0-0 (>= 1.28.0), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libx11-6 +Breaks: gstreamer1.0-plugins-bad (<< 1.15.1) +Replaces: gstreamer1.0-plugins-bad (<< 1.15.1) +Filename: pool/gstreamer1.0-gl_1.28.2-1_amd64.deb +Size: 128572 +MD5sum: d927b912f9890a223f00ea5c226dc5ac +SHA1: 404878e8c2e233a62af411b938f589c804b59ccf +SHA256: aa92038413d2ed5f07c22fb396840b284bae8399f1ae7786d94bb48fea0d40a5 +SHA512: d0e07a3aa5dcfbd71f5813d7a21c58e1709f21e92f32aa37e735d090ed9247223b4fcb120d4c1e88bb8c69876a128edf792483f153a0afcab01c1ec1c528d76a +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer plugins for GL + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugins for GL. +Gstreamer-Elements: glalpha, glcolorbalance, glcolorconvert, glcolorscale, gldeinterlace, gldifferencematte, gldownload, gleffects, gleffects_blur, gleffects_bulge, gleffects_fisheye, gleffects_glow, gleffects_heat, gleffects_identity, gleffects_laplacian, gleffects_lumaxpro, gleffects_mirror, gleffects_sepia, gleffects_sin, gleffects_sobel, gleffects_square, gleffects_squeeze, gleffects_stretch, gleffects_tunnel, gleffects_twirl, gleffects_xpro, gleffects_xray, glfilterapp, glfilterbin, glfiltercube, glfilterglass, glimagesink, glimagesinkelement, glmixerbin, glmosaic, gloverlay, gloverlaycompositor, glshader, glsinkbin, glsrcbin, glstereomix, glstereosplit, gltestsrc, gltransformation, glupload, glvideoflip, glvideomixer, glvideomixerelement, glviewconvert +Gstreamer-Version: 1.28 + +Package: gstreamer1.0-packagekit +Architecture: amd64 +Version: 1.3.4-3ubuntu1.2 +Priority: optional +Section: libs +Source: packagekit +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 42 +Depends: packagekit (= 1.3.4-3ubuntu1.2), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0), libgstreamer1.0-0 (>= 1.0.0), libpackagekit-glib2-18 (>= 0.9.4) +Recommends: gnome-software | apper | packagekit-installer +Conflicts: gstreamer0.10-packagekit +Replaces: gstreamer0.10-packagekit +Filename: pool/gstreamer1.0-packagekit_1.3.4-3ubuntu1.2_amd64.deb +Size: 9346 +MD5sum: 318e949ad7ef37826d490e6b9debe822 +SHA1: 56bffb0f40c7d5f0134d80044eec84a2ad7a6e1e +SHA256: 4d0a0f3f19a298878ee888cd303305395889416db0995e66276d7beca586cf08 +SHA512: e12e440c124a40179c703f5f23ffd63b1028b066922ba6161e1d3de99160ffcf6facff8757ecf63e7bb2c637e88ba3e6459e04005262002cdae01d4814e15cc0 +Homepage: https://www.freedesktop.org/software/PackageKit/ +Description: GStreamer plugin to install codecs using PackageKit + PackageKit allows performing simple software management tasks over a DBus + interface e.g refreshing the cache, updating, installing and removing + software packages or searching for multimedia codecs and file handlers. + . + This package provides a plugin for the GStreamer multimedia framework + to search and to install audio and video codecs. + +Package: gstreamer1.0-pipewire +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 209 +Depends: pipewire (= 1.6.2-1ubuntu1.1), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgstreamer-plugins-base1.0-0 (>= 1.23.1), libgstreamer1.0-0 (>= 1.16.0), libpipewire-0.3-0t64 (= 1.6.2-1ubuntu1.1) +Filename: pool/gstreamer1.0-pipewire_1.6.2-1ubuntu1.1_amd64.deb +Size: 71960 +MD5sum: 480c037c36871333839b02ff73e1f9af +SHA1: 0d770a9d8ea1a80283b6e4832a003644635d35fd +SHA256: 19295cf1ca0e20eb755f4c0c284e5379d036f96bfb28ff5a4ed7f4eccfe23e3f +SHA512: 9e9e4ffc316d87da075d354b5693a700e805b121a38718e1161d3d2a775d16a414a8111430099b7cc54c79fcd994166c4dc77061a6916dcda6214575506d5b27 +Homepage: https://pipewire.org/ +Description: GStreamer 1.0 plugin for the PipeWire multimedia server + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains a plugin to make devices managed by the PipeWire + server available as GStreamer sources and sinks. + +Package: gstreamer1.0-plugins-base +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 2535 +Provides: gstreamer1.0-audiosource, gstreamer1.0-videosource +Depends: libc6 (>= 2.38), libcdparanoia0 (>= 3.10.2+debian), libglib2.0-0t64 (>= 2.81.1), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0), libogg0 (>= 1.0rc3), libopus0 (>= 1.1), liborc-0.4-0t64 (>= 1:0.4.34), libtheoradec2 (>= 1.2), libtheoraenc2 (>= 1.2), libvisual-0.4-0 (>= 0.4.0), libvorbis0a (>= 1.3.1), libvorbisenc2 (>= 1.3.1) +Suggests: gvfs +Breaks: gstreamer1.0-plugins-bad (<< 1.15.1) +Replaces: gstreamer1.0-plugins-bad (<< 1.15.1) +Filename: pool/gstreamer1.0-plugins-base_1.28.2-1_amd64.deb +Size: 750140 +MD5sum: 5061037d7edbf9885c931f30fd831480 +SHA1: 582ff3b081618ceabf73056114da739d1bc9b0f3 +SHA256: 6389c16d6133e72c6619d295bc3675a89141dbe81868ecf26b55e81baaa26e7a +SHA512: 73d79d530b17c920f9bd479f5e2a536dcf54dd26d94a6f7c2e80b4a24b5f630a3c3d6b50b2174bb1256736250b405142e8101233e9915755ecb71aae36f1f4f7 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer plugins from the "base" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugins from the "base" set, an + essential exemplary set of elements. +Gstreamer-Decoders: application/kate; application/ogg; application/x-ass; application/x-ogg-avi; application/x-ogm-audio; application/x-ogm-text; application/x-ogm-video; application/x-ssa; application/x-subtitle; application/x-subtitle-dks; application/x-subtitle-lrc; application/x-subtitle-mpl2; application/x-subtitle-qttext; application/x-subtitle-sami; application/x-subtitle-tmplayer; application/x-subtitle-vtt; audio/ogg; audio/x-opus, channel-mapping-family=(int)[ 1, 255 ], stream-count=(int)[ 1, 255 ], coupled-count=(int)[ 0, 255 ]; audio/x-opus, channel-mapping-family=(int)0; audio/x-unaligned-raw, format=(string){ F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20_32LE, S20_32BE, U20_32LE, U20_32BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }, layout=(string){ interleaved, non-interleaved }; audio/x-vorbis; video/ogg; video/x-theora; video/x-unaligned-raw, format=(string){ A444_16LE, A444_16BE, Y416_LE, AYUV64, RGBA64_LE, ARGB64, ARGB64_LE, BGRA64_LE, ABGR64_LE, Y416_BE, RGBA64_BE, ARGB64_BE, BGRA64_BE, ABGR64_BE, A422_16LE, A422_16BE, A420_16LE, A420_16BE, A444_12LE, GBRA_12LE, A444_12BE, GBRA_12BE, Y412_LE, Y412_BE, A422_12LE, A422_12BE, A420_12LE, A420_12BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, BGR10A2_LE, RGB10A2_LE, Y410, A444, GBRA, AYUV, VUYA, RGBA, RBGA, ARGB, BGRA, ABGR, A422, A420, AV12, Y444_16LE, GBR_16LE, Y444_16BE, GBR_16BE, Y216_LE, Y216_BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, BGR10x2_LE, RGB10x2_LE, r210, I422_10LE, I422_10BE, NV16_10LE40, NV16_10LE32, Y210, UYVP, v210, I420_10LE, I420_10BE, P010_10LE, NV12_10LE40, NV12_10LE32, P010_10BE, MT2110R, MT2110T, NV12_10BE_8L128, NV12_10LE40_4L4, Y444, BGRP, GBR, RGBP, NV24, v308, IYU2, RGBx, xRGB, BGRx, xBGR, RGB, BGR, Y42B, NV16, NV61, YUY2, YVYU, UYVY, VYUY, I420, YV12, NV12, NV21, NV12_16L32S, NV12_32L32, NV12_4L4, NV12_64Z32, NV12_8L128, Y41B, IYU1, YUV9, YVU9, BGR16, RGB16, BGR15, RGB15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE16, GRAY10_LE32, GRAY8 } +Gstreamer-Elements: adder, appsink, appsrc, audioconvert, audiointerleave, audiomixer, audiorate, audioresample, audiotestsrc, cdparanoiasrc, compositor, decodebin, decodebin3, dsdconvert, encodebin, encodebin2, fakevideodec, giosink, giosrc, giostreamsink, giostreamsrc, liveadder, multifdsink, multisocketsink, oggaviparse, oggdemux, oggmux, oggparse, ogmaudioparse, ogmtextparse, ogmvideoparse, opusdec, opusenc, overlaycomposition, parsebin, playbin, playbin3, playsink, rawaudioparse, rawvideoparse, socketsrc, ssaparse, streamsynchronizer, subparse, subtitleoverlay, tcpclientsink, tcpclientsrc, tcpserversink, tcpserversrc, theoradec, theoraenc, theoraparse, unalignedaudioparse, unalignedvideoparse, uridecodebin, uridecodebin3, urisourcebin, videoconvert, videoconvertscale, videorate, videoscale, videotestsrc, volume, vorbisdec, vorbisenc, vorbisparse, vorbistag +Gstreamer-Encoders: application/ogg; audio/ogg; audio/x-opus; audio/x-vorbis; video/ogg; video/x-theora +Gstreamer-Uri-Sinks: appsink, file, resource +Gstreamer-Uri-Sources: appsrc, cdda, file, resource +Gstreamer-Version: 1.28 + +Package: gstreamer1.0-plugins-base-apps +Architecture: amd64 +Version: 1.28.2-1 +Priority: optional +Section: utils +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 188 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0), libgstreamer-plugins-base1.0-0 (>= 1.20.0), libgstreamer1.0-0 (>= 1.28.0), gstreamer1.0-tools +Filename: pool/gstreamer1.0-plugins-base-apps_1.28.2-1_amd64.deb +Size: 46044 +MD5sum: 828c9a27683d0470c3f702922185f34e +SHA1: 6b0b753e341c8cd8bf26a64a230b5692423aa663 +SHA256: da22a622e6149053492c065c95220cbba91b7d952d2b9a7719c2b091c4a4b7a2 +SHA512: 3566dad97cff188cf9179966f6c4550cad05b01ed63a4f82d00bdb63ab0851a820888f0df754055064efc4977de13814e69dcd50ed58d6c2290254bab8577de6 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer helper programs from the "base" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains helper programs from the "base" set, an essential + exemplary set of elements. + +Package: gstreamer1.0-plugins-good +Architecture: amd64 +Version: 1.28.2-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-good1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 7552 +Provides: gstreamer1.0-audiosink, gstreamer1.0-audiosource, gstreamer1.0-videosink, gstreamer1.0-videosource, gstreamer1.0-visualization +Depends: libaa1 (>= 1.4p5), libavc1394-0 (>= 0.5.3), libbz2-1.0, libc6 (>= 2.38), libcaca0 (>= 0.99.beta20), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.10.0), libdv4t64 (>= 1.0.0), libflac14 (>= 1.5.0), libgcc-s1 (>= 3.3.1), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.81.1), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0), libgudev-1.0-0 (>= 147), libiec61883-0 (>= 1.2.0), libjpeg8 (>= 8c), libmp3lame0 (>= 3.100), libmpg123-0t64 (>= 1.32.3), liborc-0.4-0t64 (>= 1:0.4.34), libpng16-16t64 (>= 1.6.46), libpulse0 (>= 12.99.2), libraw1394-11 (>= 2.1.2), libshout3 (>= 2.4.6), libspeex1 (>= 1.2~), libssl3t64 (>= 3.0.0), libstdc++6 (>= 5), libtag2 (>= 2.0), libtwolame0 (>= 0.3.10), libv4l-0t64 (>= 0.5.0), libvpx12 (>= 1.16.0), libwavpack1 (>= 4.60), libx11-6, libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxml2-16 (>= 2.14.1), libxtst6 (>= 2:1.2.5), zlib1g (>= 1:1.1.4), gstreamer1.0-plugins-base (>= 1.28.0), libsoup-3.0-0 +Recommends: gstreamer1.0-x +Breaks: gstreamer1.0-plugins-bad (<< 1.15.1), gstreamer1.0-plugins-ugly (<< 1.24), gstreamer1.0-pulseaudio (<< 1.18.0), libv4l-0 (<< 1.26.1-4~), libv4lconvert0 (<< 1.26.1-4~) +Replaces: gstreamer1.0-plugins-bad (<< 1.15.1), gstreamer1.0-plugins-ugly (<< 1.24), gstreamer1.0-pulseaudio (<< 1.18.0) +Filename: pool/gstreamer1.0-plugins-good_1.28.2-2ubuntu0.1_amd64.deb +Size: 2311062 +MD5sum: 8c381f1a01ee2aa22dc40c79f1d7b23d +SHA1: f2060a6a4cd6de4504e358f0d624b98f99d45f16 +SHA256: 6d66475d950ef45b4f33908c496f3044deacd0db25f2738b1460b322e87d9916 +SHA512: 4487b8dda7c77977962fecb95beeb092b9910f37d8834a3415fb73868a71e51d0462da412a6f000a95518ea69939448c538471bf8eb4609c8a616f53739f7089 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer plugins from the "good" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugins from the "good" set, a set + of good-quality plug-ins under the LGPL license. +Gstreamer-Decoders: application/x-3gp; application/x-apetag; application/x-icy; application/x-id3; application/x-navi-animation; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string){ TELEPHONE-EVENT, ISAC, SBC, OPUS, X-GST-OPUS-DRAFT-SPITTKA-00, MULTIOPUS }; application/x-rtp, payload=(int)[ 96, 127 ], media=(string){ audio, video }, encoding-name=(string){ X-QT, X-QUICKTIME }; application/x-rtp, media=(string)video, encoding-name=(string)RAW, sampling=(string){ RGB, RGBA, BGR, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1 }; application/x-rtp, media=(string){ video, audio, application }, encoding-name=(string)MPEG4-GENERIC, mode=(string){ generic, CELP-cbr, CELP-vbr, AAC-lbr, AAC-hbr, aac-hbr }; application/x-rtp, media=(string)video, sampling=(string){ RGB, BGR, RGBA, BGRA, YCbCrA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1, GRAYSCALE }, encoding-name=(string)JPEG2000; application/x-rtp, media=(string)video, colorspace=(string){ sRGB, sYUV, GRAY }, encoding-name=(string)JPEG2000; application/x-rtp, media=(string)video, payload=(int)31, encoding-name=(string)H261; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], encoding-name=(string)H261; application/x-rtp, media=(string)audio, encoding-name=(string){ AMR, AMR-WB }, octet-align=(string)1; application/x-rtp, media=(string){ video, audio }, encoding-name=(string)DV, encode=(string){ SD-VCR/525-60, SD-VCR/625-50, HD-VCR/1125-60, HD-VCR/1250-50, SDL-VCR/525-60, SDL-VCR/625-50, 306M/525-60, 306M/625-50, 314M-25/525-60, 314M-25/625-50, 314M-50/525-60, 314M-50/625-50 }; application/x-rtp, media=(string)video, encoding-name=(string){ VP9, VP9-DRAFT-IETF-01, VP8, VP8-DRAFT-IETF-01, THEORA, X-SV3V-ES, X-SORENSON-VIDEO, X-SORENSONVIDEO, X-SorensonVideo, MP4V-ES, MP2T, MP2T-ES, MP1S, JPEG, H265, H264, H263, H263-1998, H263-2000, MPV }; application/x-rtp, media=(string)audio, encoding-name=(string){ VORBIS, SPEEX, SIREN, X-QDM, QCELP, MP4A-LATM, L24, L16, L8, MPA-ROBUST, X-MP3-DRAFT-00, X-MP3-DRAFT-01, X-MP3-DRAFT-02, X-MP3-DRAFT-03, X-MP3-DRAFT-04, X-MP3-DRAFT-05, X-MP3-DRAFT-06, MPA, PCMU, PCMA, GSM, G729, G726, G726-16, G726-24, G726-32, G726-40, AAL2-G726-16, AAL2-G726-24, AAL2-G726-32, AAL2-G726-40, G723, G722, ILBC, CELT, BV16, BV32, AC3 }; application/x-rtp, media=(string)audio, payload=(int){ 12, 10, 11, 14, 0, 8, 3, 18, 4, 9 }; application/x-rtp, media=(string)video, payload=(int){ 33, 26, 34, 32 }; application/x-rtp, media=(string)other, encoding-name=(string)MP1S; application/x-rtp, media=(string)application, encoding-name=(string){ SMPTE336M, X-GST }; application/x-subtitle-avi; application/x-yuv4mpeg, y4mversion=(int)2; audio/ac3; audio/mpeg, mpegversion=(int){ 1, 2, 4 }; audio/webm; audio/x-ac3; audio/x-alaw; audio/x-amr-nb-sh; audio/x-amr-wb-sh; audio/x-au; audio/x-dts; audio/x-eac3; audio/x-flac; audio/x-m4a; audio/x-matroska; audio/x-mulaw; audio/x-private1-ac3; audio/x-private1-dts; audio/x-rf64; audio/x-sbc; audio/x-speex; audio/x-wav; audio/x-wavpack; audio/x-wavpack-correction; image/bmp; image/jpeg; image/png; image/svg; image/svg+xml; image/tiff; image/vnd.wap.wbmp; image/x-MS-bmp; image/x-bitmap; image/x-bmp; image/x-cmu-raster; image/x-icon; image/x-pcx; image/x-pixmap; image/x-portable-anymap; image/x-portable-bitmap; image/x-portable-graymap; image/x-portable-pixmap; image/x-sun-raster; image/x-tga; meta/x-id3; multipart/x-mixed-replace; video/mj2; video/quicktime; video/webm; video/x-dv, systemstream=(boolean){ false, true }; video/x-fli; video/x-flv; video/x-matroska; video/x-matroska-3d; video/x-msvideo; video/x-vp8; video/x-vp9 +Gstreamer-Elements: 3gppmux, aacparse, aasink, aatv, ac3parse, agingtv, alawdec, alawenc, alpha, alphacolor, amrparse, apedemux, apev2mux, aspectratiocrop, asteriskh263, audioamplify, audiochebband, audiocheblimit, audiodynamic, audioecho, audiofirfilter, audioiirfilter, audioinvert, audiokaraoke, audiopanorama, audiowsincband, audiowsinclimit, auparse, autoaudiosink, autoaudiosrc, autovideosink, autovideosrc, avidemux, avimux, avisubtitle, breakmydata, cacasink, cacatv, cairooverlay, capssetter, cpureport, cutter, dcaparse, deinterlace, deinterleave, dicetv, dtmfsrc, dv1394src, dvdec, dvdemux, dynudpsink, edgetv, eflvmux, equalizer-10bands, equalizer-3bands, equalizer-nbands, flacdec, flacenc, flacparse, flactag, flvdemux, flvmux, flxdec, gamma, gdkpixbufdec, gdkpixbufoverlay, gdkpixbufsink, goom, goom2k1, hdv1394src, icydemux, id3demux, id3metaparse, id3v2mux, imagefreeze, imagesequencesrc, interleave, ismlmux, jackaudiosink, jackaudiosrc, jpegdec, jpegenc, lamemp3enc, level, matroskademux, matroskamux, matroskaparse, mj2mux, monoscope, mp4mux, mpegaudioparse, mpg123audiodec, mulawdec, mulawenc, multifilesink, multifilesrc, multipartdemux, multipartmux, multiudpsink, navigationtest, navseek, optv, oss4sink, oss4src, osssink, osssrc, pngdec, pngenc, progressreport, pulsesink, pulsesrc, pushfilesrc, qtdemux, qtmoovrecover, qtmux, quarktv, radioactv, revtv, rganalysis, rglimiter, rgvolume, rippletv, rndbuffersize, rtpL16depay, rtpL16pay, rtpL24depay, rtpL24pay, rtpL8depay, rtpL8pay, rtpac3depay, rtpac3pay, rtpamrdepay, rtpamrpay, rtpbin, rtpbvdepay, rtpbvpay, rtpceltdepay, rtpceltpay, rtpdec, rtpdtmfdepay, rtpdtmfmux, rtpdtmfsrc, rtpdvdepay, rtpdvpay, rtpfunnel, rtpg722depay, rtpg722pay, rtpg723depay, rtpg723pay, rtpg726depay, rtpg726pay, rtpg729depay, rtpg729pay, rtpgsmdepay, rtpgsmpay, rtpgstdepay, rtpgstpay, rtph261depay, rtph261pay, rtph263depay, rtph263pay, rtph263pdepay, rtph263ppay, rtph264depay, rtph264pay, rtph265depay, rtph265pay, rtphdrextclientaudiolevel, rtphdrextcolorspace, rtphdrextmid, rtphdrextntp64, rtphdrextrepairedstreamid, rtphdrextstreamid, rtphdrexttwcc, rtpilbcdepay, rtpilbcpay, rtpisacdepay, rtpisacpay, rtpj2kdepay, rtpj2kpay, rtpjitterbuffer, rtpjpegdepay, rtpjpegpay, rtpklvdepay, rtpklvpay, rtpldacpay, rtpmp1sdepay, rtpmp2tdepay, rtpmp2tpay, rtpmp4adepay, rtpmp4apay, rtpmp4gdepay, rtpmp4gpay, rtpmp4vdepay, rtpmp4vpay, rtpmpadepay, rtpmpapay, rtpmparobustdepay, rtpmpvdepay, rtpmpvpay, rtpmux, rtpopusdepay, rtpopuspay, rtppassthroughpay, rtppcmadepay, rtppcmapay, rtppcmudepay, rtppcmupay, rtpptdemux, rtpqcelpdepay, rtpqdm2depay, rtpreddec, rtpredenc, rtprtxqueue, rtprtxreceive, rtprtxsend, rtpsbcdepay, rtpsbcpay, rtpsession, rtpsirendepay, rtpsirenpay, rtpspeexdepay, rtpspeexpay, rtpssrcdemux, rtpst2022-1-fecdec, rtpst2022-1-fecenc, rtpstorage, rtpstreamdepay, rtpstreampay, rtpsv3vdepay, rtptheoradepay, rtptheorapay, rtpulpfecdec, rtpulpfecenc, rtpvorbisdepay, rtpvorbispay, rtpvp8depay, rtpvp8pay, rtpvp9depay, rtpvp9pay, rtpvrawdepay, rtpvrawpay, rtpxqtdepay, rtspsrc, sbcparse, scaletempo, shagadelictv, shapewipe, shout2send, smpte, smptealpha, spectrum, speexdec, speexenc, splitfilesrc, splitmuxsink, splitmuxsrc, stereo, streaktv, taginject, testsink, twolamemp2enc, udpsink, udpsrc, v4l2radio, v4l2sink, v4l2src, vertigotv, videobalance, videobox, videocrop, videoflip, videomedian, videomixer, vp8dec, vp8enc, vp9dec, vp9enc, warptv, wavenc, wavpackdec, wavpackenc, wavpackparse, wavparse, webmmux, ximagesrc, xingmux, y4mdec, y4menc +Gstreamer-Encoders: application/x-rtcp-stream; application/x-rtp; application/x-rtp-stream; application/x-srtcp-stream; application/x-srtp-stream; application/x-yuv4mpeg, y4mversion=(int)2; audio/mpeg, mpegversion=(int)1, layer=(int){ 1, 2, 3 }; audio/webm; audio/x-alaw; audio/x-flac, framed=(boolean)true; audio/x-matroska; audio/x-mulaw; audio/x-rf64; audio/x-speex; audio/x-wav; audio/x-wavpack-correction, framed=(boolean)true; image/jpeg, sof-marker=(int){ 0, 1, 2, 4, 9 }; image/png; multipart/x-mixed-replace; video/mj2; video/quicktime; video/webm; video/x-flv; video/x-matroska; video/x-matroska-3d; video/x-msvideo; video/x-vp8, profile=(string){ 0, 1, 2, 3 }; video/x-vp9, profile=(string){ 0, 1, 2, 3 } +Gstreamer-Uri-Sinks: udp +Gstreamer-Uri-Sources: dv, hdv, imagesequence, multifile, pushfile, radio, rtsp, rtsp-sdp, rtsph, rtsps, rtspsh, rtspst, rtspsu, rtspt, rtspu, splitfile, splitmux, udp, v4l2 +Gstreamer-Version: 1.28 + +Package: gstreamer1.0-tools +Architecture: amd64 +Version: 1.28.2-1 +Priority: optional +Section: utils +Source: gstreamer1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 280 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.81.1), libgstreamer1.0-0 (>= 1.27.90) +Suggests: gstreamer1.0-plugins-base +Filename: pool/gstreamer1.0-tools_1.28.2-1_amd64.deb +Size: 75806 +MD5sum: a8dc572a088dfe3273cbbfc68d6db287 +SHA1: d36d1534b032610fd2eaf3cef0091237537812fd +SHA256: f78ede6b2d0c94007d462f009b8dff08471f9dec72b1ca0d758f87cb41dc7a2c +SHA512: 56f3e3f94e5333e5fa6a2a1d75b84f1c2c5a8c4d09f6e48a4648819b070c46e47766e9231c9f785dfc4e57e695546cdb74aacf4a1ef6c7143572d06a45c54b98 +Homepage: https://gstreamer.freedesktop.org +Description: Tools for use with GStreamer + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains versioned command-line tools for GStreamer. + +Package: gstreamer1.0-x +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 324 +Provides: gstreamer1.0-videosink +Depends: libc6 (>= 2.38), libcairo2 (>= 1.2.4), libglib2.0-0t64 (>= 2.80.0), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0), libpango-1.0-0 (>= 1.22.0), libpangocairo-1.0-0 (>= 1.22), libx11-6 (>= 2:1.2.99.901), libxext6, libxi6 (>= 2:1.2.99.4), libxv1 (>= 2:1.0.13) +Filename: pool/gstreamer1.0-x_1.28.2-1_amd64.deb +Size: 91746 +MD5sum: 899f655282ba405f9609c363626a7bfe +SHA1: e2b9fc072402e657dce51bf04443a0eca8770103 +SHA256: 4d37e49a702394a3a95dd40ccde5b3c3fbee4139f86eb06e580f3704dd831f56 +SHA512: 6e26c6c1109b19dfc9aa1f975a01e4ec563dcb6ef8c7112d18a208b4ca97a5fde90e127d14d4119b44bdbfba7f57183601926be96f8751c80fca2c38d75dd093 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer plugins for X11 and Pango + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugins for X11 video output, both + for standard Xlib support and for the Xv extension, as well as the + plugin for Pango-based text rendering and overlay. +Gstreamer-Elements: clockoverlay, textoverlay, textrender, timeoverlay, ximagesink, xvimagesink +Gstreamer-Version: 1.28 + +Package: gtk-update-icon-cache +Architecture: amd64 +Version: 4.22.4+ds-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gtk4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 109 +Depends: libc6 (>= 2.38), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0) +Breaks: libgtk-4-bin (<< 4.15) +Replaces: libgtk-4-bin (<< 4.15) +Filename: pool/gtk-update-icon-cache_4.22.4+ds-0ubuntu0.1_amd64.deb +Size: 42654 +MD5sum: 4dc958bc74b6c6d121a125fb16b041ec +SHA1: 7f3c6633519d67c367379b118d7aa92b25cd6001 +SHA256: d9cc7406c53f609ab81cb5b95b965ab926f711d7d7ea0711151cf36d5c1f2826 +SHA512: d1cfc5d050a44103426da7797eba4a3fe10246cb5115c73641d94c108e3b4b41513c21dba63691f22ee02d403481086e999e9015bbc309cacd27b6fceb013d0e +Homepage: https://www.gtk.org/ +Description: icon theme caching utility + gtk-update-icon-cache creates mmap()able cache files for icon themes. + . + GTK can use the cache files created by gtk-update-icon-cache to avoid a lot + of system call and disk seek overhead when the application starts. Since the + format of the cache files allows them to be mmap()ed shared between multiple + applications, the overall memory consumption is reduced as well. + +Package: gtk2-engines-murrine +Architecture: amd64 +Version: 0.98.2-4ubuntu1 +Multi-Arch: same +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Desktop Theme Team +Installed-Size: 336 +Depends: libc6 (>= 2.29), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.38.0), libpangocairo-1.0-0 (>= 1.14.0), libpixman-1-0 (>= 0.30.0) +Suggests: murrine-themes +Filename: pool/gtk2-engines-murrine_0.98.2-4ubuntu1_amd64.deb +Size: 106666 +MD5sum: 42949abad9e1d8db0daf08bc56e02e24 +SHA1: 3a0110d27ef0be0f86a7bd30f879a4ed03d61d27 +SHA256: c31cc39a0c578f3e0bc5f8a75b35ffc66efe12855ac6ea97124d610073f4a0c9 +SHA512: 389f5e20e4573b3a351ab4aad7a6c44e60ee9d4205b3ff2ac82646140aec93060c66cf7535dd61e91e6019c18592903d54a26d56c8d0c54d4d05920b9fd37919 +Description: cairo-based gtk+-2.0 theme engine + "Murrine" is an Italian word meaning the glass artworks done by Venicians + glass blowers. The Engine is cairo-based, and it's very fast compared to + clearlooks-cairo and ubuntulooks. + . + This package includes the Murrine engine. + +Package: gtk2-engines-pixbuf +Architecture: amd64 +Version: 2.24.33-10 +Multi-Arch: same +Priority: optional +Section: oldlibs +Source: gtk+2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 83 +Depends: libc6 (>= 2.14), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.16.0) +Filename: pool/gtk2-engines-pixbuf_2.24.33-10_amd64.deb +Size: 26146 +MD5sum: bc7c08e2f4e73454e0badd1d47ffd447 +SHA1: e45a773bfb78d529f57c52a88f5f3765ecb79f77 +SHA256: 7f3c1edcea66228effc506b3b1a02aff7489d8626b7900419c8afbd4b0b5a141 +SHA512: 5f21677182cae882ab825b5e2e3ce66814e9477fa4bc696963e8bbd78ef527c8db0d6a73cf8b99be7048e2424de73738839e12bf770ac7b6145f95a9fb6bedd7 +Homepage: http://www.gtk.org/ +Description: pixbuf-based theme for GTK 2 + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the pixbuf theme engine. + +Package: gvfs +Architecture: amd64 +Version: 1.60.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 358 +Depends: gvfs-common (= 1.60.0-1), gvfs-daemons (<< 1.60.0-1.1~), gvfs-daemons (>= 1.60.0-1), gvfs-libs (= 1.60.0-1), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.83.0) +Suggests: gvfs-backends +Filename: pool/gvfs_1.60.0-1_amd64.deb +Size: 118520 +MD5sum: 29bfa2d98478239f6405571784d6e668 +SHA1: fe18e797eb425d5b42587a6b87dc74cb43520539 +SHA256: 1d058f1415c579b0c9bb6f6588c85a25240c4fa6c5c334043ef642e5eb1bd9d6 +SHA512: 83ec1c8b1d41c53e7a335270d6407c0c0f7e1b3946e0aedcbb7c4224a2c223312904cab0a278fc18d58f1f839f5a40df1dab6b2d7cb37519db533f0d459ce4ed +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - GIO module + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains the GIO module that lets applications use gvfs + mounts. + +Package: gvfs-backends +Architecture: amd64 +Version: 1.60.0-1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: gvfs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1770 +Depends: gvfs (= 1.60.0-1), gvfs-common (= 1.60.0-1), gvfs-daemons (= 1.60.0-1), gvfs-libs (= 1.60.0-1), psmisc, dconf-gsettings-backend | gsettings-backend, libarchive13t64 (>= 3.0.4), libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libavahi-glib1 (>= 0.6.16), libc6 (>= 2.38), libcdio-cdda2t64 (>= 10.2+2.0.0), libcdio-paranoia2t64 (>= 10.2+2.0.0), libcdio19t64 (>= 2.1.0), libgcrypt20 (>= 1.12.0), libglib2.0-0t64 (>= 2.83.0), libgoa-1.0-0b (>= 3.57.1), libgphoto2-6t64 (>= 2.5.10), libgphoto2-port12t64 (>= 2.5.10), libgudev-1.0-0 (>= 146), libimobiledevice-1.0-6 (>= 1.3.0), libmsgraph-1-1 (>= 0.1.0), libmtp9t64 (>= 1.1.21), libnfs14 (>= 1.9.8), libplist-2.0-4 (>= 2.3.0), libpolkit-gobject-1-0 (>= 0.101), libsmbclient0 (>= 2:4.12.0+dfsg), libsoup-3.0-0 (>= 3.0.3), libusb-1.0-0 (>= 2:1.0.21), libxml2-16 (>= 2.14.1) +Recommends: gnome-keyring | kwalletmanager +Suggests: bluez-obexd, openssh-client, pkexec, samba-common, wsdd +Filename: pool/gvfs-backends_1.60.0-1_amd64.deb +Size: 356068 +MD5sum: 169a374326360f4da8f486bb98f477f7 +SHA1: 1f2c209a211d4d3359489ddd73460a5e5c1370aa +SHA256: 47539a412eddf1cee2177c70bd01da7f2fe21f5a35868edbfe1e777f58f0c178 +SHA512: 7d2eca9bd09a07c2c7603f2d1b4b6fcfec79832027c86036d428ab9486b88fb854aa505b7e2d047e8989ee73942661b59e24c7b4c8d498dcc62be863e4fdd1b4 +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - backends + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains the afc, afp, archive, cdda, dav, dnssd, ftp, + gphoto2, http, mtp, network, sftp, smb, smb-browse and wsdd backends. + +Package: gvfs-common +Architecture: all +Version: 1.60.0-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gvfs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 84 +Depends: desktop-file-utils +Recommends: gvfs +Filename: pool/gvfs-common_1.60.0-1_all.deb +Size: 10894 +MD5sum: f5ba5baa615e32b4bd0eb6047554c90b +SHA1: bd9f958bf059852e21d35d5d2b7b92249bbcbac4 +SHA256: a280c7264c469e06a3df31e5fe8581adddf7a071d7722797738af2bd92488248 +SHA512: 63785099143967324f6a6c92aaef8583401ef5e9ee18b2859af41095ea76272f1b9de3ff7338961278e7f94b35ae53c03f171bcdfc92ea8cb485a06df2610b0d +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - common data files + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains the data files and translations used by all gvfs + components. + +Package: gvfs-daemons +Architecture: amd64 +Version: 1.60.0-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gvfs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 477 +Depends: gvfs-common (= 1.60.0-1), gvfs-libs (= 1.60.0-1), lsof, udisks2, libc6 (>= 2.38), libglib2.0-0t64 (>= 2.83.0), libgudev-1.0-0 (>= 146), libsecret-1-0 (>= 0.7), libsystemd0, libudisks2-0 (>= 2.0.91) +Recommends: dbus, gvfs +Suggests: gvfs-backends +Filename: pool/gvfs-daemons_1.60.0-1_amd64.deb +Size: 110822 +MD5sum: 93c67bb3b4608764b5a4d407e9eae977 +SHA1: 677effbdda562edd111f6da634cddb5ded7f070f +SHA256: dd047e0a614dacc96762a1030314eb2fab2e065e66d1a30f6ecc7cbb5aac426f +SHA512: b5097e5286eb125c8156ac3b894ed343edfec7fde0cf0c74b1cd1bbd441cdd49de2e8dae15fc853e05204cff74bee826e7774604f8163b102ea8dd698b8d9030 +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - servers + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains the gvfs server and the minimal set of backends. + +Package: gvfs-fuse +Architecture: amd64 +Version: 1.60.0-1 +Priority: optional +Section: gnome +Source: gvfs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 63 +Depends: fuse3, gvfs (= 1.60.0-1), libc6 (>= 2.34), libfuse3-4 (>= 3.17.2), libglib2.0-0t64 (>= 2.83.0) +Filename: pool/gvfs-fuse_1.60.0-1_amd64.deb +Size: 21284 +MD5sum: 8436708c7a132faec97faa58c2fe83d1 +SHA1: 19187dd8ac2ee237a9f6e499a530b96c44d2294e +SHA256: b6bce8501e70ee42738e89d5166d18ebff03322782a08e81b5c066249fa97403 +SHA512: e016d058cf21bdd826532acc04a80f9bd898876df9f32a9d506f1cb456be8a7a0697ac158d6ce60c66d14c214d1edbc2298a125e8894d32dd70d2a9d16b2e6d0 +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - fuse server + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains the gvfs-fuse server that exports gvfs mounts to + all applications using FUSE. + +Package: gvfs-libs +Architecture: amd64 +Version: 1.60.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gvfs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 433 +Depends: gsettings-desktop-schemas, gvfs-common (= 1.60.0-1), libc6 (>= 2.38), libgcr-4-4 (>= 3.8.0), libglib2.0-0t64 (>= 2.83.0), libsecret-1-0 (>= 0.7) +Filename: pool/gvfs-libs_1.60.0-1_amd64.deb +Size: 106344 +MD5sum: b48d85e91bf2b28aeb47368110613ded +SHA1: 749cba46571528465e8feb9f021e3237ea81b90e +SHA256: 201416c07aeccf80838f6e2ea7991c2f69039b2259a98b91bfbc1527dc1df433 +SHA512: 0eac629816aa3cd541ce09b4e6e22fffd6da26a8ac74d45123ab1575a72c7959d06004e6387dda360a1b24738ed92ab4264af6759722358b1e27eaa0862688d9 +Homepage: https://wiki.gnome.org/Projects/gvfs +Description: userspace virtual filesystem - private libraries + gvfs is a userspace virtual filesystem where mounts run as separate + processes which you talk to via D-Bus. It also contains a gio module + that seamlessly adds gvfs support to all applications using the gio + API. It also supports exposing the gvfs mounts to non-gio applications + using fuse. + . + This package contains private libraries with common functions between + the daemons and the GIO module. + +Package: heif-gdk-pixbuf +Architecture: amd64 +Version: 1.21.2-3ubuntu0.4 +Multi-Arch: same +Priority: optional +Section: graphics +Source: libheif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 41 +Depends: libheif1 (= 1.21.2-3ubuntu0.4), libc6 (>= 2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.12.0) +Filename: pool/heif-gdk-pixbuf_1.21.2-3ubuntu0.4_amd64.deb +Size: 7760 +MD5sum: 855b885a47eba48819bcb2649e65b951 +SHA1: fa3abb96857be34b0797e4a0f81923009b876253 +SHA256: 6df182c82992359537e1e1440901cf69a9eb64b554d3e295ea3f28266afcdd0c +SHA512: 60fb54a536fb0d4d0b2783763d5853738cb8d3efbdb0c28cf2587d35753a108a3033ff19aecad3294dcbba8a17f8433ba85285867135e22d5d4580835f128d76 +Homepage: http://www.libheif.org +Description: HEIF and AVIF file format decoder and encoder - gdk-pixbuf loader + libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file + format decoder and encoder. There is partial support for ISO/IEC 23008-12:2022 + (2nd Edition) capabilities. + . + HEIF and AVIF are new image file formats employing HEVC (H.265) or AV1 image + coding, respectively, for the best compression ratios currently possible. + . + libheif supports various codecs provided by plugins for image decoding and + encoding. + . + A gdk-pixbuf loader module for applications such as "gpicview" and "pcmanfm" + is provided by this package. + +Package: heif-thumbnailer +Architecture: amd64 +Version: 1.21.2-3ubuntu0.4 +Multi-Arch: foreign +Priority: optional +Section: graphics +Source: libheif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 62 +Depends: libheif1 (= 1.21.2-3ubuntu0.4), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libpng16-16t64 (>= 1.6.46), libstdc++6 (>= 13.1) +Filename: pool/heif-thumbnailer_1.21.2-3ubuntu0.4_amd64.deb +Size: 14764 +MD5sum: aac24d4cd6948375fc3bef1b2448d713 +SHA1: 1155f44b1cb3246a09914102ebdb71ac18e08a64 +SHA256: 95523beeec9ae5c34af9abc41f328864e627c7626dd4c89f77fe116edc7397a6 +SHA512: b83c2bcd5fffd30213a3cbc7ee70e871dfd491566acf89cfd47bd2a0084ae87758344d5614013dfdf60cdeae375c01744290978c41df132b3520ba5169da52b8 +Homepage: http://www.libheif.org +Description: HEIF and AVIF file format decoder and encoder - thumbnailer + libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file + format decoder and encoder. There is partial support for ISO/IEC 23008-12:2022 + (2nd Edition) capabilities. + . + HEIF and AVIF are new image file formats employing HEVC (H.265) or AV1 image + coding, respectively, for the best compression ratios currently possible. + . + libheif supports various codecs provided by plugins for image decoding and + encoding. + . + A thumbnailer for HEIF images that can be used by Nautilus is provided by this + package. + +Package: hicolor-icon-theme +Architecture: all +Version: 0.18-2build1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 780 +Filename: pool/hicolor-icon-theme_0.18-2build1_all.deb +Size: 13154 +MD5sum: c33bdeefa20e88964f7df30c077d329e +SHA1: 3c596595a73c275b9e5a3e0c2bb9e0d61f8738fa +SHA256: d05726c4a4dc15079ed2bd6ef633e7d6dca4c4be20296148b1c558dbd5a6c570 +SHA512: e0f511d47e4da5e6b0ffacaf56071f11079a09c1be0428f21b43f16a6bac752bd00a6aa45df2751b39a94c629e6db8c92344c259868354957af80165847b1036 +Description: default fallback theme for FreeDesktop.org icon themes + This is the default fallback theme used by implementations of the + Freedesktop.org Icon Theme specification. + +Package: hplip +Architecture: amd64 +Version: 3.24.4+dfsg0-0ubuntu8.1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 433 +Depends: adduser, cups, hplip-data (= 3.24.4+dfsg0-0ubuntu8.1), libhpmud0 (= 3.24.4+dfsg0-0ubuntu8.1), libsane-hpaio (= 3.24.4+dfsg0-0ubuntu8.1), lsb-base, printer-driver-hpcups (= 3.24.4+dfsg0-0ubuntu8.1), python3-dbus, python3-gi, python3-pexpect, python3-pil, wget, python3:any, xz-utils, python3 (<< 3.15), python3 (>= 3.14~), libc6 (>= 2.38), libcups2t64 (>= 1.6.0), libdbus-1-3 (>= 1.10), libpython3.14 (>= 3.14.1), libsane1 (>= 1.0.27) +Recommends: avahi-daemon, pkexec, polkitd, printer-driver-postscript-hp, sane-utils +Suggests: hplip-doc, hplip-gui, python3-notify2, python3-reportlab, system-config-printer +Filename: pool/hplip_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +Size: 205862 +MD5sum: 9cf9ce377570c1d865e233379bc05df4 +SHA1: 833fbdcff3cf093f3b4cad4d2002a7ec3892e833 +SHA256: 83840ce5ea10fe5b07129515ac6ab935869f83bbb7dfe47d6303b76ecea1b6d4 +SHA512: c2c72623153e53ee5a588d654dfe7f4134583cc670d89bc4bfcb85cfa76673e02dbacc7f5fa590ae15c5f112e821c83b198332b0083379c981ade2bf879773f8 +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP Linux Printing and Imaging System (HPLIP) + The HP Linux Printing and Imaging System provides full support for + printing on most HP SFP (single function peripheral) inkjets and many + LaserJets, and for scanning, sending faxes and for photo-card access on + most HP MFP (multi-function peripheral) printers. + . + HPLIP is composed of: + * System services to handle communications with the printers + * HP CUPS backend driver (hp:) with bi-directional communication with + HP printers (provides printer status feedback to CUPS and enhanced + HPIJS functionality such as 4-side full-bleed printing support) + * HP CUPS backend driver for sending faxes (hpfax:) + * hpcups CUPS Raster driver to turn rasterized input from the CUPS + filter chain into the printer's native format (PCL, LIDIL, ...). + (hpcups is shipped in a separate package) + * HPIJS Ghostscript IJS driver to rasterize output from PostScript(tm) + files or from any other input format supported by Ghostscript, and + also for PostScript(tm) to fax conversion support + (HPIJS is shipped in a separate package) + * Command line utilities to perform printer maintenance, such as + ink-level monitoring or pen cleaning and calibration + * GUI and command line utility to download data from the photo card + interfaces in MFP devices + * GUI and command line utilities to interface with the fax functions + * A GUI toolbox to access all these functions in a friendly way + * HPAIO SANE backend (hpaio) for flatbed and Automatic Document Feeder + (ADF) scanning using MFP devices + . + USB and JetDirect (network) devices are supported. + +Package: hplip-data +Architecture: all +Version: 3.24.4+dfsg0-0ubuntu8.1 +Priority: optional +Section: utils +Source: hplip +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 10388 +Depends: python3-distro, xz-utils, python3:any +Suggests: hplip +Filename: pool/hplip-data_3.24.4+dfsg0-0ubuntu8.1_all.deb +Size: 6462222 +MD5sum: 6664629d9f7d06fc2329bf98a7166e72 +SHA1: 785ce91960c6344e3e82214b4789f76312509f9a +SHA256: b950f206c33b641217df8102a5e362f7600c58cc27709835904becf5ced3eeec +SHA512: 09fecef3c184b03491994243b0d6940c854e91ec9cdd394e8c1c9e60bb695aa1a5d0d40502fe73edf1f57fce5f3116bb43b5a5972f1bea3cbcb7eea1a9fe9f4e +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP Linux Printing and Imaging - data files + The HP Linux Printing and Imaging System provides full support for + printing on most HP SFP (single function peripheral) inkjets and many + LaserJets, and for scanning, sending faxes and for photo-card access on + most HP MFP (multi-function peripheral) printers. + . + This package contains data files for the HP Linux Printing and Imaging + System. + +Package: hunspell-en-us +Architecture: all +Version: 1:2020.12.07-4build1 +Multi-Arch: foreign +Priority: standard +Section: text +Source: scowl (2020.12.07-4build1) +Maintainer: Ubuntu Developers +Original-Maintainer: Don Armstrong +Installed-Size: 1565 +Provides: hunspell-dictionary, hunspell-dictionary-en, hunspell-dictionary-en-us +Depends: dictionaries-common (>= 0.10) +Suggests: hunspell, openoffice.org-hunspell | openoffice.org-core (>= 2.0.2) +Conflicts: firefox (<< 2.0.0.3-2), iceape-browser (<< 1.1.1-2), icedove (<< 2.0.0.0-4), iceweasel (<< 2.0.0.3-2), libxul0d (= 1.8.0.11-3), mozilla-browser (<< 1.8+1.1.1-2), myspell-en-us, openoffice.org (<= 1.0.3-2), openoffice.org-core (<< 2.1~m190-1), thunderbird (<< 2.0.0.1+dfsg-0) +Replaces: myspell-en-us, openoffice.org-spellcheck-en-us +Filename: pool/hunspell-en-us_1%3a2020.12.07-4build1_all.deb +Size: 585498 +MD5sum: 6614339efac1442396719180802f6cb8 +SHA1: 4169f9d9ec5fafbd3ba41a0ff259a562c1fc5604 +SHA256: 81820320c9bd2cbceef26783ef8d9f78e7deba57b1c47944ef82662a7632ad3e +SHA512: 38a655e81356dbd6d88a23ca3464d87acf54951f06d81ea65281268909aeb1bcc4256cd79596b91b2dbaca567193800db2e6f2a7987ab093eb5082ad92912eda +Homepage: http://wordlist.sourceforge.net/ +Description: English_american dictionary for hunspell + This is the English_american dictionary for use with the hunspell spellchecker + . + Hunspell is a spell checker and morphological analyzer library and program + designed for languages with rich morphology and complex word compounding or + character encoding. It is based on MySpell and features an Ispell-like + terminal interface using Curses library, an Ispell pipe interface and a + LibreOffice UNO module. + +Package: hwctl +Architecture: amd64 +Version: 0.11.0-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: rust +Source: rust-hwlib +Maintainer: Ubuntu Developers +Installed-Size: 1583 +Depends: kmod, libc6 (>= 2.39), libgcc-s1 (>= 4.2), libssl3t64 (>= 3.0.0) +Filename: pool/hwctl_0.11.0-0ubuntu1_amd64.deb +Size: 567132 +MD5sum: f309525e14f5fb9eecee9826631d6ab9 +SHA1: 10f8a58b18a78eccbb42c4ca469c843942f18d7d +SHA256: c4c6393598d467b56a85ae8c1146820ab76a94b83ffe47ea2d50adf5c5e6a7a4 +SHA512: b21f0872fc76c13a93f1dc0c47d571c631b4a9965cbfe2f8075b9176b6ccf962499931fbcc1f3b10d7042d82855ae8567b45a64be3aa23cf3693c0017fa0d89e +Homepage: https://github.com/canonical/hardware-api +Description: Tool for checking Ubuntu hardware certification status - Rust source code + A command-line interface that checks whether your hardware has been certified + for use with Ubuntu. It uses the hwlib library to collect system information + and query Ubuntu's Hardware Certification database. + . + The tool provides an easy way to: + * Check if your exact device model or a similar one is Ubuntu certified + * See which Ubuntu releases your hardware is certified for + * Verify the certification status of your system + . + This tool is particularly useful for system administrators and users who + want to verify hardware compatibility with Ubuntu. + +Package: ibus +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 1359 +Depends: python3:any, libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libdbusmenu-glib4 (>= 0.4.2), libdbusmenu-gtk3-4 (>= 0.4.2), libdconf1 (>= 0.14.0), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.83.0), libgtk-3-0t64 (>= 3.21.5), libibus-1.0-5 (>= 1.5.34~beta1), libnotify4 (>= 0.7.0), libpango-1.0-0 (>= 1.44.3), libpangocairo-1.0-0 (>= 1.14.0), libwayland-client0 (>= 1.20.0), libx11-6, libxfixes3 (>= 1:6.0.0), libxi6 (>= 2:1.2.99.4), libxkbcommon0 (>= 0.5.0), adwaita-icon-theme, dconf-cli, ibus-data (= 1.5.34~rc2-1), gir1.2-gtk-3.0 (>= 3.8.5), gir1.2-ibus-1.0 (= 1.5.34~rc2-1), python3-gi, python3-ibus-1.0 (= 1.5.34~rc2-1) +Recommends: im-config +Suggests: ibus-clutter, ibus-doc +Filename: pool/ibus_1.5.34~rc2-1_amd64.deb +Size: 340792 +MD5sum: d95aa0eca9bfb39e8238fe636d4297ef +SHA1: 8b70b7dfa65ffd18f100f882fa7d3767e55dfa73 +SHA256: 4e08784f24ec54cbd28ffeb05518a684e5afb4d634dcf2e3c3d5a016ff430bc0 +SHA512: 1d9a486ee261ebb140c074991c84b3393a07e6439470ce92cfbce473c514a7795e953a9904fa6c93244cee7355cd767cee62a511f35c9b90444fa957d59a8490 +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - core + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + +Package: ibus-data +Architecture: all +Version: 1.5.34~rc2-1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 147636 +Depends: dconf-gsettings-backend | gsettings-backend, librsvg2-common +Suggests: ibus +Filename: pool/ibus-data_1.5.34~rc2-1_all.deb +Size: 15528472 +MD5sum: e219b38631d47e029682c893a782c410 +SHA1: 15471786c2975c6bda9d2cb3b70eb8b16ca9b5e4 +SHA256: 0a767edbc7cfb46625b582638105e9ccfee8306cb5197c462ce55ec06dd1429b +SHA512: ad27795175ad44ae6061985705cbe582bbbb96dea60619440d51e23380ea9f7980b5ec3059f9f2a8c48aee7637337c45c51c07520f69b1a50f27b57f187c1b53 +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - data files + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains data files. + +Package: ibus-gtk +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: same +Priority: optional +Section: utils +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 82 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libibus-1.0-5 (>= 1.5.33), libpango-1.0-0 (>= 1.14.0) +Filename: pool/ibus-gtk_1.5.34~rc2-1_amd64.deb +Size: 19122 +MD5sum: 463b45e016c0c51e8caedaa706c9f805 +SHA1: 8492e8e470aec5ef0a3fe85de34221491ab9c936 +SHA256: 554addd5de37663a727d1a10533e33cc69d9aed744c37d0a0b6db895e5d3c956 +SHA512: 79bf7442b55cfca9b0b6cb49a39722d12a312aa7ad97adf1c1ca0af1481ad4a199a91eb3f1c0c9fd79d7b8d21a99e672b07d2e04fea70199c857f7b369fa358e +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - GTK2 support + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains the GTK2 IM module. + +Package: ibus-gtk3 +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: same +Priority: optional +Section: utils +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 82 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libibus-1.0-5 (>= 1.5.33), libpango-1.0-0 (>= 1.14.0) +Filename: pool/ibus-gtk3_1.5.34~rc2-1_amd64.deb +Size: 19686 +MD5sum: c702e7964ab1be962a2aba78fa90e4ed +SHA1: 0e6f7e8df5254a0ac9b57a86185dbe9311286ab7 +SHA256: 70ef1c0f5670fd0c1406085426e3ef0ad677aac644b290c0598222648af714b8 +SHA512: afbb60a237ff3973622a9dfdf8725dc5ef2744f4e6cdc1cf4e1523a92d0d067a339004fed730da2293757a3a87e45b68392e3d491cf74fd98f4cca99e3245143 +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - GTK3 support + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains the GTK3 IM module. + +Package: ibus-gtk4 +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: same +Priority: optional +Section: utils +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 82 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libibus-1.0-5 (>= 1.5.33), libpango-1.0-0 (>= 1.14.0) +Filename: pool/ibus-gtk4_1.5.34~rc2-1_amd64.deb +Size: 18942 +MD5sum: 6b045489b432d327b3884422b7037069 +SHA1: 2405c13f9d3cc51a12e284a3a065719e56c11f32 +SHA256: 88208f87c4b68592f652732c55309501c7a51b7962c0641c2a138e8e4f5b6daf +SHA512: 47f5b3138c5afdaa5880c33e0a308e5befefdc4b0807b629558726e651e9d95bddf016865790cdca1914888f7686a5cad27e57ed650324b2fbda3d3513c667fe +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - GTK4 support + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains the GTK4 IM module. + +Package: ibus-table +Architecture: all +Version: 1.17.16-1build1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 2112 +Depends: ibus (>= 1.5.22-2~), dconf-gsettings-backend | gsettings-backend, python3:any +Suggests: ibus-table-array30, ibus-table-cangjie, ibus-table-cangjie-big, ibus-table-cangjie3, ibus-table-cangjie5, ibus-table-cantonese, ibus-table-cantonhk, ibus-table-cns11643, ibus-table-compose, ibus-table-easy, ibus-table-easy-big, ibus-table-emoji, ibus-table-erbi, ibus-table-erbi-qs, ibus-table-ipa-x-sampa, ibus-table-jyutping, ibus-table-latex, ibus-table-quick, ibus-table-quick-classic, ibus-table-quick3, ibus-table-quick5, ibus-table-rustrad, ibus-table-scj6, ibus-table-stroke5, ibus-table-thai, ibus-table-translit, ibus-table-translit-ua, ibus-table-viqr, ibus-table-wu, ibus-table-wubi, ibus-table-yawerty, ibus-table-yong +Breaks: ibus-table-array30 (<< 1.4.6-Source-2~), ibus-table-cangjie (<< 1.4.6-Source-2~), ibus-table-cangjie-big (<< 1.4.6-Source-2~), ibus-table-cangjie3 (<< 1.4.6-Source-2~), ibus-table-cangjie5 (<< 1.4.6-Source-2~), ibus-table-cantonese (<< 1.4.6-Source-2~), ibus-table-cantonhk (<< 1.4.6-Source-2~), ibus-table-cns11643 (<< 1.3.0.20100528-4~), ibus-table-compose (<< 1.3.0.20100528-4~), ibus-table-easy (<< 1.4.6-Source-2~), ibus-table-easy-big (<< 1.4.6-Source-2~), ibus-table-emoji (<< 1.3.0.20100528-4~), ibus-table-erbi (<< 1.4.6-Source-2~), ibus-table-erbi-qs (<< 1.4.6-Source-2~), ibus-table-ipa-x-sampa (<< 1.3.0.20100528-4~), ibus-table-jyutping (<< 1.4.6-Source-2~), ibus-table-latex (<< 1.3.0.20100528-4~), ibus-table-quick (<< 1.4.6-Source-2~), ibus-table-quick-classic (<< 1.4.6-Source-2~), ibus-table-quick3 (<< 1.4.6-Source-2~), ibus-table-quick5 (<< 1.4.6-Source-2~), ibus-table-rustrad (<< 1.3.0.20100528-4~), ibus-table-scj6 (<< 1.4.6-Source-2~), ibus-table-stroke5 (<< 1.4.6-Source-2~), ibus-table-thai (<< 1.3.0.20100528-4~), ibus-table-translit (<< 1.3.0.20100528-4~), ibus-table-translit-ua (<< 1.3.0.20100528-4~), ibus-table-viqr (<< 1.3.0.20100528-4~), ibus-table-wu (<< 1.4.6-Source-2~), ibus-table-wubi (<< 1.4.6-Source-2~), ibus-table-yawerty (<< 1.3.0.20100528-4~), ibus-table-yong (<< 1.4.6-Source-2~) +Filename: pool/ibus-table_1.17.16-1build1_all.deb +Size: 982100 +MD5sum: c284af17a1b0b1882b0480118dc2b3f0 +SHA1: 860b273d49fd1f7f58c4c4419a4b0907dd37beac +SHA256: 76be4846deaa16ad325ea238628dbe628d7c257c0cbdb3f6a6abaca82c541f57 +SHA512: 53664cbfd8701488b70a4dfef90ea474e596cdc6d75e8575d9a6e3fe18637810839c638f0943a7236343d606c7a09f33827b3a72898def72093e6705efa03bb6 +Homepage: https://github.com/kaio/ibus-table +Description: table engine for IBus + IBus-Table is the IM Engine framework for table-based input methods, such as + WuBi, ErBi, CangJie and so on. + . + This package provide the table engine framework and one input method: + * Compose: input special character by compose letter and diacritical mark + . + More input method based on ibus-table can be installed from + ibus-table-cangjie, ibus-table-wubi, ... + +Package: ibverbs-providers +Architecture: amd64 +Version: 61.0-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: net +Source: rdma-core +Maintainer: Benjamin Drung +Installed-Size: 1378 +Provides: libefa1, libipathverbs1, libmana1, libmlx4-1, libmlx5-1, libmthca1 +Depends: libc6 (>= 2.38), libibverbs1 (>= 59) +Breaks: libipathverbs1 (<< 15), libmlx4-1 (<< 15), libmlx5-1 (<< 15), libmthca1 (<< 15) +Replaces: libipathverbs1 (<< 15), libmlx4-1 (<< 15), libmlx5-1 (<< 15), libmthca1 (<< 15) +Filename: pool/ibverbs-providers_61.0-2ubuntu3_amd64.deb +Size: 416890 +MD5sum: f13cfac1136cf243597a4e4b70f91908 +SHA1: 60f99457b902bb6c2797399e2bb553fb07175480 +SHA256: 2bc9b503295271f8dd82cf40644a4a9b3af86e1bfb93c3396aa96c1c56ad34b4 +SHA512: 5a10e0cc9e780f9805f9b504467164857448eedf2fb887a9b25cbbbd4dde806e4d3feaa12bf5c5091c6ee584e88aa28987705f6fc7863d32297e1c4cf90d7aa7 +Homepage: https://github.com/linux-rdma/rdma-core +Description: User space provider drivers for libibverbs + libibverbs is a library that allows userspace processes to use RDMA + "verbs" as described in the InfiniBand Architecture Specification and + the RDMA Protocol Verbs Specification. iWARP ethernet NICs support + RDMA over hardware-offloaded TCP/IP, while InfiniBand is a + high-throughput, low-latency networking technology. InfiniBand host + channel adapters (HCAs) and iWARP NICs commonly support direct + hardware access from userspace (kernel bypass), and libibverbs + supports this when available. + . + An RDMA driver consists of a kernel portion and a user space portion. + This package contains the user space verbs drivers: + . + - bnxt_re: Broadcom NetXtreme-E RoCE HCAs + - cxgb4: Chelsio T4 iWARP HCAs + - efa: Amazon Elastic Fabric Adapter + - erdma: Alibaba Elastic RDMA (iWarp) Adapter + - hfi1verbs: Intel Omni-Path HFI + - hns: HiSilicon Hip06 SoC + - ionic: AMD Pensando Distributed Services Card (DSC) RDMA/RoCE Support + - ipathverbs: QLogic InfiniPath HCAs + - irdma: Intel Ethernet Connection RDMA + - mana: Microsoft Azure Network Adapter + - mlx4: Mellanox ConnectX-3 InfiniBand HCAs + - mlx5: Mellanox Connect-IB/X-4+ InfiniBand HCAs + - mthca: Mellanox InfiniBand HCAs + - ocrdma: Emulex OneConnect RDMA/RoCE device + - qedr: QLogic QL4xxx RoCE HCAs + - rxe: A software implementation of the RoCE protocol + - siw: A software implementation of the iWarp protocol + - vmw_pvrdma: VMware paravirtual RDMA device + +Package: iio-sensor-proxy +Architecture: amd64 +Version: 3.8-1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Ritesh Raj Sarraf +Installed-Size: 142 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.68.0), libgudev-1.0-0 (>= 234), libpolkit-gobject-1-0 (>= 0.99) +Suggests: systemd +Filename: pool/iio-sensor-proxy_3.8-1_amd64.deb +Size: 38732 +MD5sum: 1c991bd728abb523ea841f4def83e106 +SHA1: 8136f7cc734b07e5961c2bc106698753ff034b3a +SHA256: 73b84bd1bb96ab4874d86e2818c3e0a992e8071a959c86650255c2160ea7e074 +SHA512: 9715f198503f53cd85de5ba552bfc5b56cb30547116c02093d89c8febed0dd55ac5d562b1abd53d7ad973ac64e16c152f19c6dcfddc7caa830d01a5e66837b1f +Homepage: https://gitlab.freedesktop.org/hadess/iio-sensor-proxy +Description: IIO sensors to D-Bus proxy + Industrial I/O subsystem is intended to provide support for devices + that in some sense are analog to digital or digital to analog convertors + . + Devices that fall into this category are: + * ADCs + * Accelerometers + * Gyros + * IMUs + * Capacitance to Digital Converters (CDCs) + * Pressure Sensors + * Color, Light and Proximity Sensors + * Temperature Sensors + * Magnetometers + * DACs + * DDS (Direct Digital Synthesis) + * PLLs (Phase Locked Loops) + * Variable/Programmable Gain Amplifiers (VGA, PGA) + . + Many ultrabooks ship with some of these devices. iio-sensor-proxy is + intended to serve as a proxy, providing access to these devices through + a D-Bus interface + +Package: im-config +Architecture: all +Version: 0.62 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 344 +Provides: im-switch +Depends: gettext-base +Recommends: x11-common, zenity | kdialog | kde-baseapps-bin (<< 4:16.08.3-2~) | whiptail +Conflicts: im-switch +Filename: pool/im-config_0.62_all.deb +Size: 29754 +MD5sum: 2a299af261f99199bcaf0555a25a4c78 +SHA1: a749408de647b6a627ed364a545190024b87423b +SHA256: 20a83ff67deb010b3481cb58dfd7a7b099c21342d537d9b9f82714f59dd00e17 +SHA512: 1c395b16bd15b9b92b47814305596968f8cbed3ab51a8d6e7ff350dcb64ca19a9e07754828845aea76a4fed3cb40a3f36daf96e7f0c916a0bb50f4c22f7a11ef +Homepage: https://salsa.debian.org/input-method-team/im-config +Description: Input method configuration framework + For older X11 based GUI desktop environments, this im-config package provides + the framework to configure and to switch the input method framework. + . + For newer Wayland based GUI desktop systems, this im-config package can be + safely removed. These desktop environments should configure their input + method configuration. + . + The input method is the essential mechanism for Japanese, Chinese and Korean + (CJK) languages to enter their non-ASCII native characters. + . + Many modern input methods such as IBus support not only one of these CJK + languages but support almost all languages simultaneously by + dynamically switching keyboard modes with GUI helper program. + . + By installing this package, the most desirable input method and its + backend conversion engine are automatically configured with both the X + Window System Input Method (XIM), GTK input method module, Qt input + method module, and clutter input method module. + . + You can further customize your input method with 'im-config' command. + +Package: initramfs-tools-bin +Architecture: amd64 +Version: 0.151ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: initramfs-tools +Maintainer: Ubuntu Developers +Original-Maintainer: Debian kernel team +Installed-Size: 81 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.0), libudev1 (>= 183) +Breaks: initramfs-tools-core (<< 0.148~) +Replaces: initramfs-tools-core (<< 0.148~) +Filename: pool/initramfs-tools-bin_0.151ubuntu1_amd64.deb +Size: 24218 +MD5sum: dbb0e3841e18adabf7714c58d7d55257 +SHA1: 16851e3fd7c85296702452a4e8b792d9f51a5d0e +SHA256: 83301b7dd2a75b441df2bbfb33effac401c52d5eb61475e206eeaf09151e9db4 +SHA512: 447bce65b4182e2d9b668ad67f27d00e1d590399fe22c05987a60c1e2dd551df4aa81fb65447119ef51f66e29a45a8a85bdb80f63eff8bd12b746d592c98b104 +Description: generic modular initramfs generator (binary tools) + This package contains binaries used inside the initramfs images generated + by initramfs-tools. It also contains the unmkinitramfs program that can be + used to unpack an initramfs image. + +Package: initramfs-tools-core +Architecture: all +Version: 0.151ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: initramfs-tools +Maintainer: Ubuntu Developers +Original-Maintainer: Debian kernel team +Installed-Size: 204 +Depends: 3cpio (>= 0.7), coreutils (>= 8.24), dhcpcd-base, dracut-install, e2fsprogs, initramfs-tools-bin (>= 0.151ubuntu1), klibc-utils (>= 2.0.4-8~), kmod, logsave | e2fsprogs (<< 1.45.3-1~), udev, busybox-initramfs +Recommends: zstd +Suggests: bash-completion +Breaks: amd64-microcode (<< 3.20250311.1ubuntu2~), miniramfs (<< 1.0.3~) +Filename: pool/initramfs-tools-core_0.151ubuntu1_all.deb +Size: 50322 +MD5sum: 738087ece72f6ede78b7147e3946c7e8 +SHA1: 6de631a890a91f0fbfadfc9c1f46840cbd480d2e +SHA256: 09a2413b6d4e5719c795ed9fd3b6b6e3396274513d6d8b232ca79dc6d9ebc46c +SHA512: 895aa3555001e2ed4039bdc42fb676c666b72f91f966e42bdb174f839173dde6f970a3617bb675de9d0ac8ee6a1323d72862d0807f0df22a9f12ef4334dac0b3 +Description: generic modular initramfs generator (core tools) + This package contains the mkinitramfs program that can be used to + create a bootable initramfs for a Linux kernel. The initramfs should + be loaded along with the kernel and is then responsible for mounting + the root filesystem and starting the main init system. + +Package: inputattach +Architecture: amd64 +Version: 1:1.8.1-2build2 +Priority: optional +Section: utils +Source: joystick +Maintainer: Ubuntu Developers +Original-Maintainer: Stephen Kitt +Installed-Size: 65 +Depends: libc6 (>= 2.42), libsystemd0 +Filename: pool/inputattach_1%3a1.8.1-2build2_amd64.deb +Size: 23872 +MD5sum: 1f630b998192adb062b5aa3da5b3dfc6 +SHA1: 1ec4d62532cdc72f2cdf41f8245d653ded934ebf +SHA256: ff86079a30e84f6f2ee1540b4dcdf1ca08e692b9490b4934be5450ecc6e7e51c +SHA512: 2a9859526cd79f5df121efedefd06b637c157530bf894d52ef3b8be20d574290e6c7c43ea92e84148e6fd2f2875df68820c0386a386fc1cdfa97982a86213711 +Homepage: https://sourceforge.net/projects/linuxconsole/ +Description: utility to connect serial-attached peripherals to the input subsystem + inputattach connects legacy serial-attached input peripherals to the input + subsystem: keyboards, mice, joysticks, touch-screens... + . + Amongst other things this allows legacy mice to be accessed via the + /dev/input/mice multiplexer. + . + Supported devices include: + * Serial-attached keyboards including the Apple Newton keyboard, DEC LK201 + / LK401 keyboards, the Stowaway keyboard, Sun type 4 and 5 keyboards, + standard PS/2 keyboards with a serial adapter + * Serial mice using Genius, Logitech, Microsoft or Mouse Systems protocols + * Serial-attached touchscreens including those manufactured by 3M, ELO, + Fujitsu, Penmount, Touchright, Touchwindow + * Serial-attached joysticks including I-Force, SpaceBall, SpaceOrb, Gravis + Stinger, WingMan Warrior + * The Handykey Twiddler used as a joystick or a chording keyboard + +Package: ipmitool +Architecture: amd64 +Version: 1.8.19-10ubuntu1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 6122 +Pre-Depends: init-system-helpers (>= 1.54~) +Depends: libc6 (>= 2.42), libfreeipmi17 (>= 1.1.5), libreadline8t64 (>= 6.0), libssl3t64 (>= 3.0.0) +Recommends: openipmi +Filename: pool/ipmitool_1.8.19-10ubuntu1_amd64.deb +Size: 2122492 +MD5sum: 2859cb6adea9a3ca3781fb5026d077d4 +SHA1: 8ec7dc93785f3b635fd8fb0582e8f70c28f4dc3d +SHA256: 11730b6274a3c1365c43e5a649e96628469394a584eeae12f980ecd84ac9e795 +SHA512: 67b7e2d79deb3c481aa33d642c505245b119ac136be8fd168a02efbae8f44197a0cf49b4e1d882ae6ba7c41377735590a580d99346609c1bcfac3f45e468615f +Homepage: https://codeberg.org/IPMITool/ipmitool +Description: utility for IPMI control with kernel driver or LAN interface (daemon) + A utility for managing and configuring devices that support the + Intelligent Platform Management Interface. IPMI is an open standard + for monitoring, logging, recovery, inventory, and control of hardware + that is implemented independent of the main CPU, BIOS, and OS. The + service processor (or Baseboard Management Controller, BMC) is the + brain behind platform management and its primary purpose is to handle + the autonomous sensor monitoring and event logging features. + . + The ipmitool program provides a simple command-line interface to this + BMC. It features the ability to read the sensor data repository + (SDR) and print sensor values, display the contents of the System + Event Log (SEL), print Field Replaceable Unit (FRU) inventory + information, read and set LAN configuration parameters, and perform + remote chassis power control. + . + This package contains the daemon. + +Package: ipp-usb +Architecture: amd64 +Version: 0.9.31-1 +Built-Using: golang-1.26 (= 1.26.0-1) +Multi-Arch: foreign +Priority: optional +Section: comm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 6893 +Depends: avahi-daemon, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.34), libusb-1.0-0 (>= 2:1.0.21) +Filename: pool/ipp-usb_0.9.31-1_amd64.deb +Size: 2513816 +MD5sum: f7927e916f71daf9edc9019ed40df677 +SHA1: 0fe4df3a66ef94d6eb3d9aee6cd2e1e7df91b2aa +SHA256: e2619fada03a5061350c82db7a45be95ee5837029f8a1b7272adf4fa5398850a +SHA512: edf3e6dd1e8107a3cace1738d4b0689c6e4948c1dea6b71a7322ff8879576b066c465c77aac26152e68e44e7beb1292f448ba1784b2869c44f32b5d8635a2db3 +Homepage: https://github.com/OpenPrinting/ipp-usb +Description: Daemon for IPP over USB printer support + ipp-usb is a userland driver for USB devices (printers, scanners, MFC), + supporting the IPP over USB protocol. It enables these USB devices to + be seen as regular network printers. + . + It is designed to be a replacement of ippusbxd daemon, previously + used for this purpose. It has a greatly rethought architecture, in + comparison with ippusbxd, and fixes all of its major flaws and issues. + +Package: iproute2 +Architecture: amd64 +Version: 6.19.0-1ubuntu1.1 +Multi-Arch: foreign +Priority: important +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 3257 +Provides: arpd +Depends: debconf (>= 0.5) | debconf-2.0, libbpf1 (>= 1:0.6.0), libc6 (>= 2.38), libcap2 (>= 1:2.10), libdb5.3t64, libelf1t64 (>= 0.131), libmnl0 (>= 1.0.3-4~), libselinux1 (>= 3.1~), libtirpc3t64 (>= 1.0.2), libxtables12 (>= 1.6.0+snapshot20161117), libcap2-bin +Suggests: python3:any +Conflicts: arpd +Breaks: iproute2-doc +Replaces: iproute2-doc +Filename: pool/iproute2_6.19.0-1ubuntu1.1_amd64.deb +Size: 1197918 +MD5sum: 2802277fef1b0461f9923f7ea4b6a1aa +SHA1: 74ddc45d30e24f8e138036c74237f330a9944782 +SHA256: 05e53ae079adf844a11d1a531acd96b2b2021be130ac2f0bd49166bce3bd0f98 +SHA512: 4d1316421f7e564f0117f6b798158d13ea1c5ce5922fab2adf2e1e01da64fef8f97a510c80b2ce541744c8a647be7a34f2172775a8b63f84dbc59e99a93978c2 +Homepage: https://wiki.linuxfoundation.org/networking/iproute2 +Description: networking and traffic control tools + The iproute2 suite is a collection of utilities for networking and + traffic control. + . + These tools communicate with the Linux kernel via the (rt)netlink + interface, providing advanced features not available through the + legacy net-tools commands 'ifconfig' and 'route'. + +Package: iptables +Architecture: amd64 +Version: 1.8.11-2ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 2436 +Depends: libip4tc2 (= 1.8.11-2ubuntu3), libip6tc2 (= 1.8.11-2ubuntu3), libxtables12 (= 1.8.11-2ubuntu3), netbase (>= 6.0), libc6 (>= 2.42), libmnl0 (>= 1.0.3-4~), libnetfilter-conntrack3 (>= 1.0.6), libnfnetlink0 (>= 1.0.2), libnftnl11 (>= 1.1.6) +Recommends: nftables +Suggests: firewalld, kmod +Filename: pool/iptables_1.8.11-2ubuntu3_amd64.deb +Size: 381074 +MD5sum: 534a375b05a99a588a957e9735a246dd +SHA1: d42d6de938fd3bddd60fdfe9f2ba1cef4e37002e +SHA256: 187b16f9375f53ce6a1618a29de52bb177b620589ada29e4a3e25de5d594e66f +SHA512: 0c9fb62fdf18347d1a52ab99ad6530875772094a4633e391d5511f2cd1ca0d434c82d489bff6b003cc864fb22737e98a2e8be1418f3aefb8fbaf1782d486c628 +Homepage: https://www.netfilter.org/ +Description: administration tools for packet filtering and NAT + The iptables/xtables framework has been replaced by nftables. You should + consider migrating now. + . + iptables is the userspace command line program used to configure + the Linux packet filtering and NAT ruleset. It is targeted towards systems + and networks administrators. + . + This package contains several different utilities, the most important ones: + . + iptables-nft, iptables-nft-save, iptables-nft-restore (nft-based version) + . + iptables-legacy, iptables-legacy-save, iptables-legacy-restore (legacy version) + . + ip6tables-nft, ip6tables-nft-save, ip6tables-nft-restore (nft-based version) + . + ip6tables-legacy, ip6tables-legacy-save, ip6tables-legacy-restore (legacy + version) + . + arptables-nft, arptables-nft-save, arptables-nft-restore (nft-based version) + . + ebtables-nft, ebtables-nft-save, ebtables-nft-restore (nft-based version) + +Package: iso-codes +Architecture: all +Version: 4.20.1-1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Dr. Tobias Quathamer +Installed-Size: 24021 +Suggests: isoquery +Filename: pool/iso-codes_4.20.1-1_all.deb +Size: 3898972 +MD5sum: 50a9b6edbb34ff1cdf725c9c50e26453 +SHA1: 3587c8d1e126cb152e6bfe35f573232a56d4555c +SHA256: 7df9871f8f18c779cca92b04c87f6e727f4e11caa3bf0f233ff7d10a9ad2bb0d +SHA512: 8ea49c6d38c642ac6f9b6dbd021903f97ff637927c1ebdc35870f75be1b7ff34a48a55771965039ad3a0fb6db4161a324f5296d7c0c1c8c10c6ba7cb73f79192 +Homepage: https://salsa.debian.org/iso-codes-team/iso-codes +Description: ISO language, territory, currency, script codes and their translations + This package provides the ISO 639, ISO 639-3, and ISO 639-5 language + code lists, the ISO 4217 currency code list, the ISO 3166 territory + code list, the ISO 3166-2 sub-territory list, and the ISO 15924 + script code list as JSON files. + . + More importantly, it also provides their translations to be used by + other programs. + +Package: iw +Architecture: amd64 +Version: 6.17-1 +Multi-Arch: foreign +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 332 +Depends: libc6 (>= 2.38), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7) +Recommends: wireless-regdb +Filename: pool/iw_6.17-1_amd64.deb +Size: 117672 +MD5sum: 35ef237b46e11ff3a24dca4481556fe4 +SHA1: bc519eddf775d8ad1acbe3257442afe7869b58f9 +SHA256: 5addb9bf7cddd0b0582d1bfe62f003598368cf15b0604584821a24b81326296a +SHA512: 33643759addae198b64f35ebf76c00cab9ddb33598767b015951ffa11b356c84fbf09ae6da462290ecd708aa107803bc1bb2f85222c832e7ccb046db2798de5a +Homepage: https://wireless.wiki.kernel.org/en/users/documentation/iw +Description: tool for configuring Linux wireless devices + This package contains the 'iw' command line tool which allows one to configure + and show information about wireless devices. + . + iw is based on the nl80211 kernel interface and supports the majority of + fairly recent hardware. The old tool iwconfig, which uses Wireless Extensions + interface, is deprecated and it is strongly recommended to switch to iw and + nl80211. + +Package: jq +Architecture: amd64 +Version: 1.8.1-4ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: ChangZhuo Chen (陳昌倬) +Installed-Size: 122 +Depends: libjq1 (= 1.8.1-4ubuntu2), libc6 (>= 2.38), libonig5 (>= 6.8.1) +Filename: pool/jq_1.8.1-4ubuntu2_amd64.deb +Size: 72432 +MD5sum: 2f9656ec8a129dde699c285b7232711b +SHA1: eb184795f91527c212ad4f976bb02c22aa532e97 +SHA256: bb7f69de12414f6e52eea1da952ed7226b8e3fd9db74f93bb8ea3f2f39f4836f +SHA512: 494ab62460f89153ce352ea2df43868e4afd6abcf5553e88a74f1c698c51d28efe0179d11a53994b1416ad9dfbe949578ec3e3e17b0747fd2020c4a95ac0c0af +Homepage: https://jqlang.github.io/jq +Description: lightweight and flexible command-line JSON processor + jq is like sed for JSON data – you can use it to slice + and filter and map and transform structured data with + the same ease that sed, awk, grep and friends let you + play with text. + . + It is written in portable C, and it has minimal runtime + dependencies. + . + jq can mangle the data format that you have into the + one that you want with very little effort, and the + program to do so is often shorter and simpler than + you’d expect. + +Package: kbd +Architecture: amd64 +Version: 2.7.1-2ubuntu2 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Console utilities maintainers +Installed-Size: 1284 +Provides: console-utilities +Depends: libc6 (>= 2.38), console-setup | console-setup-mini +Conflicts: console-utilities +Filename: pool/kbd_2.7.1-2ubuntu2_amd64.deb +Size: 238014 +MD5sum: 51f5717b15ee54cd0d3e6f0ee0acbc96 +SHA1: 583743d4a4693069ae0150764495ff457db36be3 +SHA256: 1399e779f027563729c1895ba3ac314e2ea966e37e5c984840d689298352934e +SHA512: 5a1fcb79b59441d380b4f6f38198ab4e7b04e50a759580302643ab1f138d88c900145612dfe0861eab37c5f9ebbb6218bc3a5585366be04d4cd00f85efa16050 +Homepage: https://kbd-project.org/ +Description: Linux console font and keytable utilities + This package allows you to set up the Linux console, change the font, + resize text mode virtual consoles and remap the keyboard. + . + You will probably want to install the “console-setup” package which + sets up console font and keymap data files. + +Package: kdump-tools +Architecture: amd64 +Version: 1:1.10.7ubuntu3 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kdump +Installed-Size: 133 +Pre-Depends: init-system-helpers (>= 1.54~) +Depends: bsdextrautils | bsdmainutils, busybox-static | busybox, debconf, file, linux-base, lsb-base (>= 3.0-6), ucf, kexec-tools (>= 1:2.0.10-2), debconf (>= 0.5) | debconf-2.0 +Recommends: initramfs-tools-core, makedumpfile +Filename: pool/kdump-tools_1%3a1.10.7ubuntu3_amd64.deb +Size: 36804 +MD5sum: d5ee9abdf30fb506e67861f9c9a45597 +SHA1: d50eb5ff0f1d67e215e6e8ee33939f364e561c8f +SHA256: d886c44f8171c8cb033ac8e26e494d195c145520911bf1c84cf66364753a6e57 +SHA512: 9f95b236f87b36c483d09ea470cb35b83d220064553af6b0853fb739849a7e944537bd95df376007fe37f27aaeb55f1fe0110a1ee4c94b4fd1a6e5fdc743da6b +Description: scripts and tools for automating kdump (Linux crash dumps) + kdump-tools provides an init script and a configuration script for + automating the use of kdump. It uses the makedumpfile utility to + reduce the size of the /proc/vmcore file based on user preferences. + . + After installing, please see /usr/share/doc/kdump-tools/README.Debian + for information on enabling and configuring kdump. + +Package: kexec-tools +Architecture: amd64 +Version: 1:2.0.32-3ubuntu1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Khalid Aziz +Installed-Size: 308 +Depends: libc6 (>= 2.38), libzstd1 (>= 1.5.5), debconf (>= 0.5) | debconf-2.0, debconf, dpkg (>= 1.15.7.2) +Conflicts: bfh-container (<< 20211009-22~), molly-guard (<< 0.8.4~), progress-linux-container (<< 20221002-11~) +Filename: pool/kexec-tools_1%3a2.0.32-3ubuntu1_amd64.deb +Size: 99890 +MD5sum: 4bcb89508ea66b9de9a0ebd685a6cc01 +SHA1: 05b7fd3451732b6f94a1b91092a7c78ad6c655a0 +SHA256: 13605d639a06aac649ab3181ea02f33a2b9b501e47c6b8ba5dc03bf94b9b5c74 +SHA512: 71e1a2e404b99d87404d1a3fbef71e5acffcbde9db92c497aeb87536beae80f78edf6f7d8311766f01c0e38aa69043100f7d0b020761215877ac1814e4339d70 +Homepage: https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git/ +Description: tools to support fast kexec reboots + This package provides tools to load a kernel into memory and then + "reboot" directly into that kernel using the kexec system call, + bypassing the normal boot process. + +Package: keyboard-configuration +Architecture: all +Version: 1.237ubuntu3.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: console-setup +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 813 +Pre-Depends: debconf | debconf-2.0 +Depends: debconf (>= 0.5) | debconf-2.0, liblocale-gettext-perl, xkb-data (>= 2.46~), xkb-data (<< 2.46A) +Breaks: console-setup (<< 1.71), console-setup-mini (<< 1.47) +Replaces: console-setup (<< 1.47), console-setup-mini (<< 1.47) +Filename: pool/keyboard-configuration_1.237ubuntu3.1_all.deb +Size: 211372 +MD5sum: 31d0582cc353dd3ac652b9884c4bf883 +SHA1: 892f1b2d617b46dbd83ed00f479e839434b97b4d +SHA256: 65b766338253578922435d755873baae2c4c008623181eb85ff7ddbfbfe7cf32 +SHA512: fc8a82af073afb5b0e2fef05fbcc0652aa2bea538017b1dd5dfe1e93fad8e30b9ac0a2400e9f3444e21facb9e06ef03ce15f43ad45ca32a4e8c93bcc0088e36f +Description: system-wide keyboard preferences + This package maintains the keyboard preferences in + /etc/default/keyboard. Other packages can use the information + provided by this package in order to configure the keyboard on the + console or in X Window. + +Package: klibc-utils +Architecture: amd64 +Version: 2.0.14-1ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: klibc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 497 +Depends: libklibc (= 2.0.14-1ubuntu2) +Filename: pool/klibc-utils_2.0.14-1ubuntu2_amd64.deb +Size: 100130 +MD5sum: 812ec0c368eed110e4a5b9e54067009a +SHA1: d3b3cb2f2b6adc6df4106e1f628f71726d2dcad0 +SHA256: 642657e87e56184a3d696f35019531ece1f7fd1b220c3df79776e7dba756cc16 +SHA512: dfee627749fc869a42b22b64147d2b2021acd91bcdcd4e5377107c882150f658281a22a98cb5b4eb4c53f1e124dbacd35c7f0f6910e2843f4c9922c9145512cc +Homepage: https://git.kernel.org/cgit/libs/klibc/klibc.git +Description: small utilities built with klibc for early boot + This package contains a collection of programs that are linked + against klibc. These duplicate some of the functionality of a + regular Linux toolset, but are typically much smaller than their + full-function counterparts. They are intended for inclusion in + initramfs images and embedded systems. + +Package: kmod +Architecture: amd64 +Version: 34.2-2ubuntu2 +Multi-Arch: foreign +Priority: important +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Marco d'Itri +Installed-Size: 264 +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.0.0), libkmod2 (= 34.2-2ubuntu2) +Breaks: bash-completion (<< 1:2.16.0-1) +Replaces: bash-completion (<< 1:2.16.0-1) +Filename: pool/kmod_34.2-2ubuntu2_amd64.deb +Size: 100832 +MD5sum: 00e7ba0696aa4551022eaaff54e51a61 +SHA1: 5f583d0bae18fe4bae1acbf25e9a2b1950b0e360 +SHA256: 5595fb6bb2fba1dc53e005e17d24a389450296bdc5defb19dbcc0aa0ae33ae91 +SHA512: 302e20e9e34eab026148e7079146996a83b158c94d874dd7274dc844ef849c941c639b18e555d3c1f2cd1425892cc78993802e46be8522d0ff3a2311daf03d66 +Description: tools for managing Linux kernel modules + This package contains a set of programs for loading, inserting, and + removing kernel modules for Linux. + It replaces module-init-tools. + +Package: language-selector-common +Architecture: all +Version: 0.228build1 +Priority: optional +Section: admin +Source: language-selector +Maintainer: Ubuntu Developers +Installed-Size: 1796 +Pre-Depends: dpkg (>= 1.15.7.2) +Depends: python3:any, iso-codes, python3-apt, python3-dbus, dbus, accountsservice +Filename: pool/language-selector-common_0.228build1_all.deb +Size: 260882 +MD5sum: 2985fe4db44501db419b36efaf6d7cae +SHA1: a1a0972ac5316d75dec5746f349c7658c43d6866 +SHA256: 4d5dba0f03c9862803a29499bc0010907a4d93898a455cfce65f6a485d3a4bed +SHA512: 553f99896c590b4c55f6ecbfb500541bfa71cded9d2d8bd6d35f8e124482b58604f2de2f7decf6af00d0c3be79bb4ecbfb2b8895a79f3ebf5d43b99398350c7d +Description: Language selector for Ubuntu + This package lets you change and install language packs + in Ubuntu. + . + This package contains the common part of language-selector + +Package: language-selector-gnome +Architecture: all +Version: 0.228build1 +Priority: optional +Section: admin +Source: language-selector +Maintainer: Ubuntu Developers +Installed-Size: 92 +Depends: language-selector-common (= 0.228build1), python3:any, python3-gi, gir1.2-gtk-3.0, python3-apt, aptdaemon, python3-aptdaemon.gtk3widgets +Recommends: im-config, yelp +Filename: pool/language-selector-gnome_0.228build1_all.deb +Size: 19718 +MD5sum: b933da39e52acb549938e6a0fe99e4ce +SHA1: da66450f5f77da760f40ef92ee9096eb99067b83 +SHA256: be0ce5cd9cc184a88dc7c3ce02a2dce23d258b4b2b828c916f9ca08325681f81 +SHA512: f4e40338dd101563d222e46becb86d810ac693d60fd64a7ad448e5526a86a07bbdb13536bc6c339bbbeb8573654659a40f84c3b6b50711dc9eefaecef53e795b +Description: Language selector frontend for Ubuntu + This package lets you change and install language packs + in Ubuntu. + . + This package contains the GTK+ frontend. + +Package: laptop-detect +Architecture: all +Version: 0.16+nmu1build1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Simó Albert i Beltran +Installed-Size: 18 +Recommends: dmidecode +Filename: pool/laptop-detect_0.16+nmu1build1_all.deb +Size: 5076 +MD5sum: e57784504081e512ed8c650ec588b23a +SHA1: 52054865ca847875d747dc406eca2efcd69fb6b2 +SHA256: dec803016e6f7c30d6dfe104ba5874f8342985608d7db96c95cb647a0f91fdf6 +SHA512: cdea2f00f92db7e4c43bfc3ae9caf1a952dd63692ed9cf91e6b39c79a8b902f3fb5759bbe88a28bd71b06f87efa8a3df061787729ac00d2a590a020f72d2d9c9 +Homepage: https://gitlab.com/debiants/laptop-detect +Description: system chassis type checker + This package provides a simple shell script which attempts to determine + whether it is being run on a laptop (or similar portable machine). It is + mainly useful for installers. + +Package: ldap-utils +Architecture: amd64 +Version: 2.6.10+dfsg-1ubuntu5 +Priority: optional +Section: net +Source: openldap +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenLDAP Maintainers +Installed-Size: 696 +Provides: ldap-client, openldap-utils +Depends: libc6 (>= 2.38), libldap2 (= 2.6.10+dfsg-1ubuntu5), libsasl2-2 (>= 2.1.28+dfsg1) +Suggests: libsasl2-modules, libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal +Conflicts: ldap-client +Filename: pool/ldap-utils_2.6.10+dfsg-1ubuntu5_amd64.deb +Size: 152194 +MD5sum: 3d78785275b5d4bfc452c3a7368a64e1 +SHA1: 3cc18d6239e30abefedda7f9fe930da28c795d6a +SHA256: ff4e8b04702304536f412378bcc1271ec196b0e99461245290d4a6cae4fa0fc8 +SHA512: 473116654d6eb8c3da11f8b6fb3f2db29973684ebb5b75a2d221a408a234c1ee9d2e8c070a83c10e07747e5649797de7dff6626d4715367b05deac5ec5348cab +Homepage: https://www.openldap.org/ +Description: OpenLDAP utilities + This package provides utilities from the OpenLDAP (Lightweight + Directory Access Protocol) package. These utilities can access a + local or remote LDAP server and contain all the client programs + required to access LDAP servers. + +Package: less +Architecture: amd64 +Version: 668-1build1 +Multi-Arch: foreign +Priority: important +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Milan Kupcevic +Installed-Size: 373 +Depends: libc6 (>= 2.42), libtinfo6 (>= 6) +Filename: pool/less_668-1build1_amd64.deb +Size: 171848 +MD5sum: e26fe337d1267d3eb0e929bba3c87f86 +SHA1: 3cb73d00887dca4e92bc0e35fd87e022e556ecb0 +SHA256: 45720ff981ef4c34b44e62cf1b5fd73dcb3d16031120387307e899f480d78092 +SHA512: 957502bf7fc7f49b0e146362e9c4bdf094c6c93fcca25dd1a47f47c6f17dec5b525f793c87ea03867411039ebef402a85f702766cd7c46d916beb53c81f0da45 +Homepage: http://www.greenwoodsoftware.com/less/ +Description: pager program similar to more + This package provides "less", a file pager (that is, a memory-efficient + utility for displaying text one screenful at a time). Less has many + more features than the basic pager "more". As part of the GNU project, + it is widely regarded as the standard pager on UNIX-derived systems. + . + Also provided are "lessecho", a simple utility for ensuring arguments + with spaces are correctly quoted; "lesskey", a tool for modifying the + standard (vi-like) keybindings; and "lesspipe", a filter for specific + types of input, such as .doc or .txt.gz files. + +Package: libaa1 +Architecture: amd64 +Version: 1.4p5-51.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: aalib +Maintainer: Ubuntu Developers +Original-Maintainer: Jonathan Carter +Installed-Size: 152 +Provides: aalib1 +Depends: libc6 (>= 2.38), libgpm2 (>= 1.20.7), libncurses6 (>= 6), libslang2 (>= 2.2.4), libtinfo6 (>= 6), libx11-6 +Replaces: aalib1 +Filename: pool/libaa1_1.4p5-51.1build1_amd64.deb +Size: 50800 +MD5sum: a147d388ce2a558512fe8c13bd243956 +SHA1: 80e611d822576b67879069997f9769ac46192cc7 +SHA256: 29d70bf6215e766de874e13b242de0fd168c6e769ae20d93089830d99478aefe +SHA512: 72aff582f687f79ef918f1442b9fb03300a344788b1da9768d8802c3884ef83e58b79a249e7cd1a3da765041f391ab44c44d549c2971a85852fd96a760a6083e +Homepage: http://aa-project.sourceforge.net/aalib/ +Description: ASCII art library + AAlib is a portable ASCII art graphics library. Internally, it works like + a graphics display, but the output is rendered into gorgeous platform + independent ASCII graphics. + +Package: libabsl20260107 +Architecture: amd64 +Version: 20260107.0-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: abseil +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 2794 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.4), libstdc++6 (>= 13.1) +Filename: pool/libabsl20260107_20260107.0-4_amd64.deb +Size: 587956 +MD5sum: 49b17dee9b1d14b05284720b02a7cdf7 +SHA1: cef21dbb9b980749f665b36ba13e4e08becc4030 +SHA256: 84c1afe45fdeada1772ab88be29e21b9e0970174bac3dc348e8f797d8f6f073f +SHA512: bad906edb2a6f9d008996e00f91f0ae687c3f27a2b57b150aca065219627f74fb6638705ffe0038b3de4136978bd4ec44850449af8ae4225a2ee4d340e9a0050 +Homepage: https://abseil.io/ +Description: extensions to the C++ standard library + Abseil is an open-source collection of C++ library code designed to augment the + C++ standard library. The Abseil library code is collected from Google's C++ + codebase and has been extensively tested and used in production. In some cases, + Abseil provides pieces missing from the C++ standard; in others, Abseil + provides alternatives to the standard for special needs. + . + This package contains Abseil's shared libraries. + +Package: libaccountsservice0 +Architecture: amd64 +Version: 23.13.9-8ubuntu5.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: accountsservice +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 250 +Depends: libc6 (>= 2.4), libcrypt1 (>= 1:4.1.0), libglib2.0-0t64 (>= 2.83.0), libsystemd0 (>= 209) +Filename: pool/libaccountsservice0_23.13.9-8ubuntu5.2_amd64.deb +Size: 62844 +MD5sum: b6fe7bd548e49bf8e78af588815e0d2a +SHA1: 1071e9b207ded43e6614099693aba46f9710e889 +SHA256: 4c3bca934a145513f39fbc9ff1baa98e422b4b293a3b4a07534ad995850e01c9 +SHA512: e4931b103ec35302e346bb5b8005ac1394fb4ac217de97a1f8bb54100ee06ffc8eae62eb876e7b0f966b2739d521810b000689cc0dde0dffb27916f8640fba7f +Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/ +Description: query and manipulate user account information - shared libraries + The AccountService project provides a set of D-Bus + interfaces for querying and manipulating user account + information and an implementation of these interfaces, + based on the useradd, usermod and userdel commands. + . + This package provides the shared libraries of the + AccountService library. + +Package: libadwaita-1-0 +Architecture: amd64 +Version: 1.9.1-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libadwaita-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 10604 +Depends: libappstream5 (>= 1.0.0), libc6 (>= 2.43), libfribidi0 (>= 0.19.2), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.21.1), libpango-1.0-0 (>= 1.14.0) +Filename: pool/libadwaita-1-0_1.9.1-0ubuntu0.1_amd64.deb +Size: 529720 +MD5sum: 4b425138ce290146b91e3528458a4124 +SHA1: 836a09dd36353f69349f4d93c64dc5e56f750acf +SHA256: b8634157cc1efd09fee058e19df34faf004e536b0410b13367e814fb3f2b190b +SHA512: 1f5437eedb9f3640e9f2f129bb997941f709630a9d4ba26b6b6162e04ad91affef7f52ce503eaf744bb522b612050cd6633e45af944ceffbb73071a28c339985 +Homepage: https://gnome.pages.gitlab.gnome.org/libadwaita/ +Description: Library with GTK widgets for mobile phones + libadwaita provides GTK widgets and GObjects to ease developing + applications for mobile phones. + . + This package contains the shared library. + +Package: libao-common +Architecture: all +Version: 1.2.2+20180113-1.2ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libao +Maintainer: Ubuntu Developers +Original-Maintainer: Ron Lee +Installed-Size: 20 +Conflicts: libao2 +Breaks: libao4 (<< 1.0.0-2) +Replaces: libao4 (<< 1.0.0-2) +Filename: pool/libao-common_1.2.2+20180113-1.2ubuntu2_all.deb +Size: 5876 +MD5sum: ef77a7917f5dbdee501a158573e23cf1 +SHA1: df43cd11739692ab582b291f9c99f5642c972c0e +SHA256: bf04acc24a9fca9b23b70138668931c73740fc7762e79f5673aa7d36799eaef1 +SHA512: ba9e30f3c9837c8a0b5e389a3c9b8dc16b519a80884c16ad08a2e9a2cce111942518a86637bfa5ebeda3e4dd693692af150156c235ac6fe741ca6b5cad021db7 +Homepage: http://www.xiph.org/ao/ +Description: Cross Platform Audio Output Library (Common files) + Libao is a cross-platform audio library that allows programs to output audio + using a simple API on a wide variety of platforms. It currently supports: + . + * Null output (handy for testing without a sound device) + * WAV files + * AU files + * OSS (Open Sound System, used on Linux and FreeBSD) + * ALSA (Advanced Linux Sound Architecture) + * PulseAudio (next generation GNOME sound server) + * and several others. + . + This package contains config files and man pages for libao. + +Package: libao4 +Architecture: amd64 +Version: 1.2.2+20180113-1.2ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libao +Maintainer: Ubuntu Developers +Original-Maintainer: Ron Lee +Installed-Size: 147 +Depends: libc6 (>= 2.34), libao-common +Suggests: libasound2, libaudio2, libpulse0, libsndio6.1 +Replaces: libao-pulse +Filename: pool/libao4_1.2.2+20180113-1.2ubuntu2_amd64.deb +Size: 33850 +MD5sum: cc6d2031e98aef3cc97e7ddbe4041e34 +SHA1: bd2d8c3af6bb6a5492adc972235394115487e7db +SHA256: e29b0d0da895ed0d6f295f685fdfd15f78902c82cee72d1724f9961f735680f3 +SHA512: e5242f641708450e04ed6b3d5ede9f5aca584d9394eba5cd5d32c95c27053fb8888f07e48c9a53a4013e41dc3054fb9f5d4d8146c33bdac883a603b7e215b4e0 +Homepage: http://www.xiph.org/ao/ +Description: Cross Platform Audio Output Library + Libao is a cross-platform audio library that allows programs to output audio + using a simple API on a wide variety of platforms. It currently supports: + . + * Null output (handy for testing without a sound device) + * WAV files + * AU files + * OSS (Open Sound System, used on Linux and FreeBSD) + * ALSA (Advanced Linux Sound Architecture) + * PulseAudio (next generation GNOME sound server) + * and several others. + +Package: libaom3 +Architecture: amd64 +Version: 3.13.1-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: aom +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 5430 +Depends: libc6 (>= 2.43) +Filename: pool/libaom3_3.13.1-2ubuntu0.1_amd64.deb +Size: 1969262 +MD5sum: 8a2b0de444f8c709e6d19a19edd5aa60 +SHA1: 59697931fde52e5a334364c12fea9e1e1ed729a2 +SHA256: 74d46764b6b336d15682fb7d6203e6e1052be4ffb1ec371237989bab59fa829d +SHA512: ada7b626487d50a0280b7617dfc553629250213b994eb3714c1f1f07be24cdb36cf24dabe31835a8fc899e55a53ad9b919120fba931d33aaf33ec8a8546ac635 +Homepage: https://aomedia.googlesource.com/aom/ +Description: AV1 Video Codec Library + AOMedia Video 1 (AV1) is an open and royalty free video encoding format + optimized for the Internet and the successor of VP9. aom is the + reference encoder and decoder implementation published by the Alliance + for Open Media. + . + This package contains the shared library. + +Package: libapparmor1 +Architecture: amd64 +Version: 5.0.2-0ubuntu1~26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: apparmor +Maintainer: Ubuntu Developers +Original-Maintainer: Debian AppArmor Team +Installed-Size: 122 +Depends: libc6 (>= 2.38) +Breaks: libapparmor-perl (<< 3.0.3-3) +Replaces: libapparmor-perl (<< 3.0.3-3) +Filename: pool/libapparmor1_5.0.2-0ubuntu1~26.04.1_amd64.deb +Size: 51292 +MD5sum: ff6d484ba5ba5cb2f3daae6732b7a70a +SHA1: fcadd98a3a06b7d18c57832e09996ab7e90bfc3b +SHA256: 50570ebe581bbfeead4403571b75ee275955c6bcbd1b4bf342228772549162b9 +SHA512: c6be557550883c6bb205bad7a36a16be85a6698665d907353c164b0fa07624f1749b3ca5e1b2729f40f0d5ccecff4c8eb7a69e5f438b612d0fc664c485c49104 +Homepage: https://apparmor.net/ +Description: changehat AppArmor library + libapparmor1 provides a shared library one can compile programs + against in order to use various AppArmor functionality, + such as transitioning to a different AppArmor profile or hat. + +Package: libappstream5 +Architecture: amd64 +Version: 1.1.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: appstream +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 759 +Depends: libc6 (>= 2.33), libcurl3t64-gnutls (>= 7.63.0), libfyaml0 (>= 0.9), libglib2.0-0t64 (>= 2.80.0), libstemmer0d (>= 0+svn527), libsystemd0 (>= 242), libxml2-16 (>= 2.14.1), libxmlb2 (>= 0.3.13), libzstd1 (>= 1.5.5) +Filename: pool/libappstream5_1.1.2-1_amd64.deb +Size: 240636 +MD5sum: c0d2e397a9da038ccafc9ea852432dee +SHA1: d2cf36859dfb82702705ec4163490c4875ba5596 +SHA256: 7269ad98c70e9696ba3b8d78ca2c876224acfd0b2a3bb960e7f23a2c8d2207cb +SHA512: 720449a10c3d0cc88be51a7e4a121984f62e014a80280d917310f91b72aa758858cbc5a9419bd646b26c19ecfd452af9baa0002417e734820d8eb498530a297a +Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ +Description: Library to access AppStream services + AppStream is a metadata specification which permits software components to + provide information about themselves to automated systems and end-users + before the software is actually installed. + This permits informative displays of new applications to users in software + centers, as well as allowing a system to make decisions on which new software + a user might want to install (e.g. missing firmware or media handlers). + . + This package contains a GObject-based library to access AppStream + services, like the software component metadata pool. + It also contains functions for reading, writing and transforming AppStream + metadata. + +Package: libarchive13t64 +Architecture: amd64 +Version: 3.8.5-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libarchive +Maintainer: Ubuntu Developers +Original-Maintainer: Gabriel Barrantes +Installed-Size: 948 +Provides: libarchive13 (= 3.8.5-1ubuntu2.2) +Depends: libacl1 (>= 2.2.23), libbz2-1.0, libc6 (>= 2.38), liblz4-1 (>= 1.8.0), liblzma5 (>= 5.2.2), libnettle8t64, libxml2-16 (>= 2.14.1), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Suggests: lrzip +Breaks: libarchive13 (<< 3.8.5-1ubuntu2.2) +Replaces: libarchive13 +Filename: pool/libarchive13t64_3.8.5-1ubuntu2.2_amd64.deb +Size: 397050 +MD5sum: d0ef89000d772920f9f63bb0bed4689c +SHA1: e9c7cd561f8df51dc0dda652a2f3d5fab0027fff +SHA256: 3e069924c6d18381485c9cfa148f290dc3e8c8f31720aee8f1943c704116a361 +SHA512: 92427e5070ae8baabd347f2865e7e7a23fdaa783bd04dcd389d0069d75b3e0ed70380fd6e2232adb0088a38e8fa46fc086c38e9c9bb969359e031f734ae49916 +Homepage: https://www.libarchive.org/ +Description: Multi-format archive and compression library (shared library) + The libarchive library provides a flexible interface for reading and writing + archives in various formats such as tar and cpio. libarchive also supports + reading and writing archives compressed using various compression filters such + as gzip and bzip2. The library is inherently stream-oriented; readers serially + iterate through the archive, writers serially add things to the archive. + . + Archive formats supported are: + . + * tar (read and write, including GNU extensions) + * pax (read and write, including GNU and star extensions) + * cpio (read and write, including odc and newc variants) + * iso9660 (read and write, including Joliet and Rockridge extensions, with + some limitations) + * zip (read only, with some limitations, uses zlib) + * mtree (read and write) + * shar (write only) + * ar (read and write, including BSD and GNU/SysV variants) + * empty (read only; in particular, note that no other format will accept an + empty file) + * raw (read only) + * xar (read only) + * rar (read only, with some limitations) + * 7zip (read and write, with some limitations) + . + Filters supported are: + . + * gzip (read and write, uses zlib) + * bzip2 (read and write, uses bzlib) + * compress (read and write, uses an internal implementation) + * uudecode (read only) + * separate command-line compressors with fixed-signature auto-detection + * xz and lzma (read and write using liblzma) + * zstandard (read and write using libzstd) + . + This package provides the libarchive shared library. + +Package: libasound2-data +Architecture: all +Version: 1.2.15.3-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: alsa-lib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 195 +Recommends: alsa-ucm-conf, alsa-topology-conf +Suggests: alsa-utils +Breaks: libasound2t64 (<< 1.2.15.3-1ubuntu1.1) +Replaces: libasound2t64 (<< 1.2.15.3-1ubuntu1.1) +Filename: pool/libasound2-data_1.2.15.3-1ubuntu1.1_all.deb +Size: 19568 +MD5sum: 3bfb55dbe7867f448394aec7fbb4ecb4 +SHA1: ca2cf086c042e2fb8e5bd3b7e35cfd40df362933 +SHA256: aad0eb27b9fab12c9fa9ed0b223c7ce871003fd3a564ad8eca4ecdea978ac347 +SHA512: bd7d7a0d87af558bd08c3129c45bd4fe134e022c0b428e9d1dc3774dcfbd2b5f873ee17f3520970e169079c246de892a4841dc28d3b7056556a04ef2f18e0cb4 +Homepage: https://www.alsa-project.org/ +Description: Configuration files and profiles for ALSA drivers + This package contains configuration files for ALSA drivers. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: libasound2t64 +Architecture: amd64 +Version: 1.2.15.3-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: alsa-lib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 1259 +Provides: libasound2 (= 1.2.15.3-1ubuntu1.1) +Depends: libasound2-data (>= 1.2.15.3-1ubuntu1.1), libc6 (>= 2.43) +Suggests: libasound2-plugins (>= 1.0.24) +Breaks: alsa-utils (<< 1.2.1), libasound2 (<< 1.2.15.3-1ubuntu1.1) +Replaces: libasound2 +Filename: pool/libasound2t64_1.2.15.3-1ubuntu1.1_amd64.deb +Size: 415812 +MD5sum: e33068cbc6099e7cf1d932be5582d935 +SHA1: ffe06ba0e5ea3aa0e4df59c5d6cec905bc20d9e1 +SHA256: 96e20cf5c9095ef54ba46fccffea5c01cf2de17a1012c5683a67e43504a6d726 +SHA512: 21ff255b68cfc1af42881fc6e278126b49db613e48d91d6beabceccbe4c5f51f6fc650ada6157f4abfad17e5207048500b152bb4336ceab0fbc8f626bb2bdb12 +Homepage: https://www.alsa-project.org/ +Description: shared library for ALSA applications + This package contains the ALSA library and its standard plugins, as well + as the required configuration files. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: libaspell15 +Architecture: amd64 +Version: 0.60.8.2-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: aspell +Maintainer: Ubuntu Developers +Original-Maintainer: Agustin Martin Domingo +Installed-Size: 2161 +Depends: libc6 (>= 2.38), libstdc++6 (>= 5) +Recommends: aspell-en | aspell-dictionary | aspell6a-dictionary +Suggests: aspell +Conflicts: aspell6-dictionary +Breaks: aspell-bin (<< 0.60.3-2) +Filename: pool/libaspell15_0.60.8.2-3_amd64.deb +Size: 332956 +MD5sum: 6a20afab66f9007d87c9b6aab10ab70e +SHA1: dd893b14fd61fe46494f609d09588a156f16c38d +SHA256: dca532c0b95cfd23580dfc613f3525efd878c0451c2e85a54bea26324eeb1d56 +SHA512: 85af314b259e4d8c89058111b99045d914273d1fbc09e6d3ad0e47b4068a739ec03dd98de5030048f25e65b0d454ee9e1e3987aec684373860e4d561789c2558 +Homepage: http://aspell.net/ +Description: GNU Aspell spell-checker runtime library + These are the runtime parts of the Aspell and pspell spell-checking + toolkits, needed by applications that use the toolkits at runtime. + . + For a standalone spell-checker, install aspell as well. + +Package: libasyncns0 +Architecture: amd64 +Version: 0.8-7 +Multi-Arch: same +Priority: optional +Section: libs +Source: libasyncns +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 48 +Depends: libc6 (>= 2.34) +Filename: pool/libasyncns0_0.8-7_amd64.deb +Size: 12384 +MD5sum: 57c0c6b35d6cc198aa2de4dcc79fc090 +SHA1: 30212991aa661e30b3fa14b3f270ba9e91f7a119 +SHA256: 952ea8a8d01a4fe98ff8379553a7a3764492897464c2684105f76ebb6b19939a +SHA512: 9af30b8203ff213f91ee95efc9cbdc6e3f09cc01fd476cb1a7e85c79868b9687b72acc300c885c352ae699c34c060a4c4f4cb0f27f052d5a04141c6b3ff2cc40 +Homepage: https://0pointer.de/lennart/projects/libasyncns/ +Description: Asynchronous name service query library + libasyncns is a C library for Linux/Unix for executing name service queries + asynchronously. It is an asynchronous wrapper around getaddrinfo(3), + getnameinfo(3), res_query(3) and res_search(3) from libc and libresolv. + +Package: libatasmart4 +Architecture: amd64 +Version: 0.19-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: libatasmart +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 80 +Depends: libc6 (>= 2.38), libudev1 (>= 183) +Filename: pool/libatasmart4_0.19-6_amd64.deb +Size: 24982 +MD5sum: 8d85a029a0d120e4eaa5528ea28cfd63 +SHA1: 972363ecbc55a814f4eea9eb0fcc2bdac93fd864 +SHA256: 335bc0c05e62ce81e5cc05424bf75baa0a56f288e1e9a3c59618f85b99d44607 +SHA512: eb4b133d91e687f6ccabea01f77193d24e1625b621166a16dee974b5fc91732b54f088bb2d4f6b59ba590f28d816553cc6c97afac58ea45fe2486e324970bab4 +Homepage: http://0pointer.de/blog/projects/being-smart.html +Description: ATA S.M.A.R.T. reading and parsing library + A small and lightweight parser library for ATA S.M.A.R.T. hard disk + health monitoring. + . + This package contains the shared library. + +Package: libatk-adaptor +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: misc +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 56 +Provides: at-spi +Depends: libatk-bridge2.0-0t64 (= 2.60.4-0ubuntu0.1), libglib2.0-0t64 (>= 2.62) +Conflicts: at-spi +Replaces: at-spi +Filename: pool/libatk-adaptor_2.60.4-0ubuntu0.1_amd64.deb +Size: 6256 +MD5sum: f1796c64e3ab13c669df574a5d69ff80 +SHA1: b544c06566b7d3a1aea5ad99e415298fa9ca5522 +SHA256: 79c0fe32b0dd6e5c8eaa6879bc9d5280951247573d5d3dc01a3e81027d2c8e69 +SHA512: cac26a836aa5e953d13e097050fd0ebdd611ef28154e553bad096b9a1373bc1e96acd98199e50bc0d6fbfbd8765f61a945323374671a6dcfc661d364395e49f2 +Homepage: https://wiki.gnome.org/Accessibility +Description: AT-SPI 2 toolkit bridge + This package includes a gtk-module that bridges ATK to the new + D-Bus based AT-SPI. + +Package: libatk-bridge2.0-0t64 +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 283 +Provides: libatk-bridge2.0-0 (= 2.60.4-0ubuntu0.1) +Depends: libatk1.0-0t64 (= 2.60.4-0ubuntu0.1), libatspi2.0-0t64 (= 2.60.4-0ubuntu0.1), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.80.0) +Breaks: libatk-bridge2.0-0 (<< 2.60.4-0ubuntu0.1) +Replaces: libatk-bridge2.0-0 +Filename: pool/libatk-bridge2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +Size: 67230 +MD5sum: d82b065f885bf5d35a8ad572a3230404 +SHA1: 049538ee7ab6089dbf0024656c5647b1c651b6f4 +SHA256: c634e1fd25dff5d0ff5384bf3ac9d784725e776448591283cee67deaced29c27 +SHA512: b35e84c60ffa4e6de787833f6053eeb87e8772b6883613980840aab15bf340a3b638ad62d7f5359398148d6bb00185334aa2cdf758a10ae74c4fd4fd7c1a046c +Homepage: https://wiki.gnome.org/Accessibility +Description: AT-SPI 2 toolkit bridge - shared library + This package contains the ATK bridge shared library. + +Package: libatk1.0-0t64 +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 209 +Provides: libatk1.0-0 (= 2.60.4-0ubuntu0.1) +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), at-spi2-common +Breaks: libatk1.0-0 (<< 2.60.4-0ubuntu0.1) +Replaces: libatk1.0-0 +Filename: pool/libatk1.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +Size: 53538 +MD5sum: 76d7a69d0be6556260aa4a2ee8f087a7 +SHA1: e05e7b42fa6496b6505ce0a3b1d4bd79e9211541 +SHA256: 6308ae8c10599780f0e672a39930c07639523bf3f7406f90ee7dada6acd505a0 +SHA512: bd3d29810a1b1e90bcff69974c2bedf76e2a169f23ed5e58361b6b2f929c7e7e60a04f6075775a1e74168cc29bf8f44c8fe8593e27e85162268176ff3c8ff45e +Homepage: https://wiki.gnome.org/Accessibility +Description: ATK accessibility toolkit + ATK is a toolkit providing accessibility interfaces for applications or + other toolkits. By implementing these interfaces, those other toolkits or + applications can be used with tools such as screen readers, magnifiers, and + other alternative input devices. + . + This is the runtime part of ATK, needed to run applications built with it. + +Package: libatomic1 +Architecture: amd64 +Version: 16-20260322-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcc-16 +Maintainer: Ubuntu Core developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 49 +Depends: gcc-16-base (= 16-20260322-1ubuntu1), libc6 (>= 2.14) +Filename: pool/libatomic1_16-20260322-1ubuntu1_amd64.deb +Size: 11396 +MD5sum: 7349fce829691e7c2cc26f23083d1969 +SHA1: 7511b8239323d8b18085de96823c0021194bc77f +SHA256: 82fa61135e7154d7958feaa91ec1808a688eb1e0e06822ab35e99e2480feb148 +SHA512: 833da1483a80889aa2e31f3be874b451c9d756c3e389ef13d91ec6c77233ef7a6e875ff8bb4d151c830562006eecf451e016e9854bd683be0b3028aad87dff2b +Homepage: http://gcc.gnu.org/ +Description: support library providing __atomic built-in functions + library providing __atomic built-in functions. When an atomic call cannot + be turned into lock-free instructions, GCC will make calls into this library. + +Package: libatopology2t64 +Architecture: amd64 +Version: 1.2.15.3-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: alsa-lib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 135 +Provides: libatopology2 (= 1.2.15.3-1ubuntu1.1) +Depends: libasound2t64 (>= 1.2.15), libc6 (>= 2.38) +Breaks: libasound2t64 (<< 1.2.1.1), libatopology2 (<< 1.2.15.3-1ubuntu1.1) +Replaces: libasound2t64 (<< 1.2.1.1), libatopology2 +Filename: pool/libatopology2t64_1.2.15.3-1ubuntu1.1_amd64.deb +Size: 49944 +MD5sum: 0c58f3fc44ba49e9cce423ab87358a58 +SHA1: e1951d6921577fe60b13d24ce73f41b5c426e7f0 +SHA256: 44018a675fd0fa79176c9f3fa5440f16dfc62ccd5870d0336d7b13dbdab19ad7 +SHA512: 61ddbdd5cecbf10cb4d4dd0198c1b66a58379a3a80f935b9cf94c9f0fe4a68a15382dc1b6ac0845debde4e46828a63403f662ab1992f133e38abbc097b3e63da +Homepage: https://www.alsa-project.org/ +Description: shared library for handling ALSA topology definitions + This package contains the ALSA topology library. + . + ALSA is the Advanced Linux Sound Architecture. + +Package: libatspi2.0-0t64 +Architecture: amd64 +Version: 2.60.4-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: at-spi2-core +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 281 +Provides: libatspi2.0-0 (= 2.60.4-0ubuntu0.1) +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.80.0), libx11-6 (>= 2:1.2.99.901), libxi6 (>= 2:1.2.99.4), libxres1 (>= 2:1.2.1) +Recommends: at-spi2-core (= 2.60.4-0ubuntu0.1) +Breaks: libatspi2.0-0 (<< 2.60.4-0ubuntu0.1) +Replaces: libatspi2.0-0 +Filename: pool/libatspi2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +Size: 85514 +MD5sum: 5b0eeeac768f2aa94d73e8050681a021 +SHA1: 315f1a5df05f8a60d93c4bc15135b2b4961c1cb6 +SHA256: 6db6e1d7d40f15d38ab5ec302463ac502a057560294d9c73ede22998f733fbd8 +SHA512: b6a0284f15446ac6aa6ef73930277b4eb181fd85dc4e1431ab7862989b616ec0db01c24b057a1cd5debfe260f123ea179c6cc0c2788d19b356d3bcfde47e1407 +Homepage: https://wiki.gnome.org/Accessibility +Description: Assistive Technology Service Provider Interface - shared library + This package contains the shared library for applications that wish to use + the at-spi interface. + +Package: libauthen-sasl-perl +Architecture: all +Version: 2.2000-1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 136 +Depends: perl:any, libcrypt-urandom-perl +Suggests: libdigest-hmac-perl, libgssapi-perl +Filename: pool/libauthen-sasl-perl_2.2000-1_all.deb +Size: 47766 +MD5sum: e155cd3f7a79278f0f96041a574ad695 +SHA1: fe7342e29666bc2c57cae542dac402c803b0ba0d +SHA256: 859bdfa2180edb7d88081bb5cbfbc6a31e6560ca4632233d1d0c76d22e77fe27 +SHA512: 6f164b524afc91bdb4c6093454a1d92e027396d932992ef7c82aaa103de119ffd00d62db25045f3f359b3815a0063665caffbd864d755c479105962e4a6e4348 +Homepage: https://metacpan.org/release/Authen-SASL +Description: Authen::SASL - SASL Authentication framework + SASL is a generic mechanism for authentication used by several network + protocols. Authen::SASL provides an implementation framework that all + protocols should be able to share. + . + The framework allows different implementations of the connection class + to be plugged in. At the time of writing there were two such plugins + in Debian: + - Authen::SASL::Perl (in this package) + This module implements several mechanisms and is implemented + entirely in Perl. + - Authen::SASL::XS (in the libauthen-sasl-xs-perl package) + This module uses the Cyrus SASL C-library (both version 1 and 2 are + supported). + +Package: libavahi-client3 +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 122 +Depends: libavahi-common3 (= 0.8-18ubuntu1.1), libc6 (>= 2.34), libdbus-1-3 (>= 1.10) +Filename: pool/libavahi-client3_0.8-18ubuntu1.1_amd64.deb +Size: 27220 +MD5sum: 6d07929497cc26da7de0639658404157 +SHA1: b94a8265cf1766139052b717f68350d455201edc +SHA256: a0677750521663c898d25ddd0566127712ff4803108ec67182330a27fce85774 +SHA512: b071cc354ad3951684bd0c6087cdaa1de8f4855f9a309f8dbd1bb79842d991e388e75ceda9870a5d2e196bc35fb7e7ef8f924746a702a4e127d8c2f04a254f14 +Homepage: https://avahi.org/ +Description: Avahi client library + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This package contains the library for Avahi's C API which allows you + to integrate mDNS/DNS-SD functionality into your application. + +Package: libavahi-common-data +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 96 +Filename: pool/libavahi-common-data_0.8-18ubuntu1.1_amd64.deb +Size: 27194 +MD5sum: 9c1f570afe70163907317d028f4a8938 +SHA1: ff125616ee1d154329e4d84aba5b47aa9091d074 +SHA256: db013cab614418c47073faac4e16f652cb4532458cd8b919f70c717f235d1091 +SHA512: f16c6b19eb076584a752aa4045c00077b8cc1350dc96c83385b0923e42a09b4a5b3b8636ace4f0ab54d8b28f7347a0169b230e1b6157cd907af913999a01a800 +Homepage: https://avahi.org/ +Description: Avahi common data files + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This package contains common data files for avahi. + +Package: libavahi-common3 +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 99 +Depends: libc6 (>= 2.38), libavahi-common-data (= 0.8-18ubuntu1.1) +Filename: pool/libavahi-common3_0.8-18ubuntu1.1_amd64.deb +Size: 23580 +MD5sum: 347964760da474996acb54f42ad0d0ae +SHA1: 3c875771684a3b91c92d2bc4706562888b1e1676 +SHA256: 2213977fd25dab90f3566d3163576955eb74dc89954c48ba6e2bd960fdcd45e2 +SHA512: 003e969dc9cd48987411d6489dd013ad5654f37ae5fd15cf8db14ef0dafc226d92578c70def6699e371083de40ae7978a34022bee8b22a48738d235ca065eb97 +Homepage: https://avahi.org/ +Description: Avahi common library + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This package contains the Avahi common library, which is a set of common + functions used by many of Avahis components and client applications. + +Package: libavahi-core7 +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 276 +Depends: libavahi-common3 (= 0.8-18ubuntu1.1), libc6 (>= 2.25) +Filename: pool/libavahi-core7_0.8-18ubuntu1.1_amd64.deb +Size: 89102 +MD5sum: 78388507097a5e79fca2315ce481ac0b +SHA1: a6561fa580b1d5a78546014c0aab3672afa38aab +SHA256: 5c2b3ffd155675dcfc49f7da3f69648a021feaaeec38c9ff9185f5521015eb63 +SHA512: ed26f1711b0190e36176c81914b37b919ad563ccc03064d3a1afb54c895d1b02f3e30e6251838b742886bc596505eaae6076f92463f092030119ebf7346267be +Homepage: https://avahi.org/ +Description: Avahi's embeddable mDNS/DNS-SD library + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This package contains the library for Avahi's embeddable mDNS/DNS-SD stack. + This can be used by embedded applications to integrate mDNS/DNS-SD + functionality into their applications. + . + You should not however use this library for non-embedded applications, you + should use libavahi-client which interacts with the avahi daemon. + +Package: libavahi-glib1 +Architecture: amd64 +Version: 0.8-18ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: avahi +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 60 +Depends: libavahi-common3 (= 0.8-18ubuntu1.1), libc6 (>= 2.2.5), libglib2.0-0t64 (>= 2.16.0) +Filename: pool/libavahi-glib1_0.8-18ubuntu1.1_amd64.deb +Size: 8246 +MD5sum: 1cfe59936ddd978e51b860cefe443aa3 +SHA1: 7dfe4b6d7785e5519ef67db720b458ac63bb4e0c +SHA256: 4e80e023d5b9d15cb65c15b100a8834d3d59f773d087e54a499e21a2a8e55358 +SHA512: 71c2364f8500dcd02b0ce0740aff8745d9ca27a132c028ce34ac959047a8e9cf494084c047c8bc1ccc741a0727e1051c2b17f589e7e6bfa89bbd8d8946ae5ee8 +Homepage: https://avahi.org/ +Description: Avahi GLib integration library + Avahi is a fully LGPL framework for Multicast DNS Service Discovery. + It allows programs to publish and discover services and hosts + running on a local network with no specific configuration. For + example you can plug into a network and instantly find printers to + print to, files to look at and people to talk to. + . + This library contains the interface to integrate the Avahi libraries + into a GLib main loop application, including GTK+ applications. + +Package: libavc1394-0 +Architecture: amd64 +Version: 0.5.4-5build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libavc1394 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 61 +Depends: libc6 (>= 2.38), libraw1394-11 (>= 2.1.2) +Filename: pool/libavc1394-0_0.5.4-5build4_amd64.deb +Size: 15410 +MD5sum: 8825de81aec878063dd38022e3a24875 +SHA1: 2de7002c935f1a635a973214877e8d42a62fa178 +SHA256: 00d5ebc6da7c640cdd03e4fd398d11e66afd3087f4cd2b73ee0d0efb372a5995 +SHA512: 000629f73172f718aa12793c093fffdd0ae8ea7fa4b0d823a4d827976181a754c29b7045ba1170272fbe078f736bf8a2f1390ef7b70f9b6c4a52a2e33a03279f +Homepage: http://sourceforge.net/projects/libavc1394/ +Description: control IEEE 1394 audio/video devices + libavc1394 is a programming interface for the 1394 Trade Association AV/C + (Audio/Video Control) Digital Interface Command Set. It allows you to + remote control camcorders and similar devices connected to your computer + via an IEEE 1394 (aka Firewire) link. + . + This package includes the libraries needed to run executables using + libavc1394. + +Package: libayatana-appindicator3-1 +Architecture: amd64 +Version: 0.5.94-1build1 +Priority: optional +Section: libs +Source: libayatana-appindicator +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 88 +Provides: libappindicator3-1 (= 12.10) +Depends: libayatana-indicator3-7 (>= 0.6.0), libc6 (>= 2.4), libdbusmenu-glib4 (>= 0.4.2), libdbusmenu-gtk3-4 (>= 0.4.2), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.0.0) +Conflicts: libappindicator3-1 +Replaces: libappindicator3-1 +Filename: pool/libayatana-appindicator3-1_0.5.94-1build1_amd64.deb +Size: 24744 +MD5sum: cf8c2e56ab4a7f504d8e4cc95cbbd1c9 +SHA1: b311f5a507112d38fb068c8fbe9a24cbf95ae9f7 +SHA256: bd33f95efc37c2dfe11d8fd365524d124e96e48e4157c35bf0351fae3c494b9d +SHA512: 5fdc6ca3fccfc43b9b6cbf089ac9b26d912e28bc14fb5574bfcb6ebad03451da79639dd5bf8e19df06e1d4e2d38b64a80b39c3c654674e11f3dd1a64c8a0835e +Homepage: https://github.com/AyatanaIndicators/libayatana-appindicator +Description: Ayatana Application Indicators (GTK-3+ version) + A library and indicator to take menus from applications and place them in + the panel. + . + This package contains shared libraries to be used by applications compiled + against GTK-3+. + +Package: libayatana-ido3-0.4-0 +Architecture: amd64 +Version: 0.10.4-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ayatana-ido +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 189 +Depends: libc6 (>= 2.29), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.23.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.21.4), libpango-1.0-0 (>= 1.20.0), libpangocairo-1.0-0 (>= 1.14.0) +Breaks: ayatana-indicator-datetime (<< 0.9.0), ayatana-indicator-display (<< 0.9.0), ayatana-indicator-keyboard (<< 0.9.0), ayatana-indicator-messages (<< 0.9.0), ayatana-indicator-notifications (<< 0.9.0), ayatana-indicator-session (<< 0.9.0), ayatana-indicator-sound (<< 0.9.0) +Filename: pool/libayatana-ido3-0.4-0_0.10.4-1build1_amd64.deb +Size: 57904 +MD5sum: 86634fe0ea557c0562690da5c383c75b +SHA1: 2d21c9f747475f3869594d848d66ed3d29ae09e1 +SHA256: 4370ae093a09ec3b5193b080937ba73a23197c0d8aefb9b0ef964fbe156bb53a +SHA512: 455b8f2df8be765870751b2085d638e22c09876fd018ce231c99f401c0a154997522929146bb6d2261226d0e0dcb4f4deb6cd9ab0c3dda36aa27b01cf8d6243c +Homepage: https://github.com/AyatanaIndicators/ayatana-ido +Description: Widgets and other objects used for Ayatana Indicators + Shared library providing extra gtk menu items for display in system + Ayatana Indicators. + . + This package contains shared libraries to be used by GTK+ 3 + applications. + +Package: libayatana-indicator3-7 +Architecture: amd64 +Version: 0.9.4-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libayatana-indicator +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 104 +Depends: libayatana-ido3-0.4-0 (>= 0.9.0), libc6 (>= 2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.21.4) +Filename: pool/libayatana-indicator3-7_0.9.4-2_amd64.deb +Size: 32018 +MD5sum: 40713f3d1b25b982ee04b18cb9df8de0 +SHA1: 10204ccd183483c09f920c88ca3f8f3510654f6b +SHA256: e86190cb4138ded3e408527d41e7e2bd56a7c651b17e1a53e6b0eb46a2533309 +SHA512: d324f0ea5edce2071dc48c3859b4d9bc8844dd02f300af065294016814fb44469755d37ba115412be2dcdce58a46e9d6307c4a3a7876aa85dff979f23fee6873 +Homepage: https://github.com/AyatanaIndicators/libayatana-indicator +Description: panel indicator applet - shared library (GTK-3+ variant) + The Ayatana Indicators library contains information to build indicators + to go into modern desktops' indicator applets. + . + This package contains the library itself (GTK-3+ variant). + +Package: libbabeltrace1 +Architecture: amd64 +Version: 1.5.11-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: babeltrace +Maintainer: Ubuntu Developers +Original-Maintainer: Jon Bernard +Installed-Size: 523 +Provides: libbabeltrace-ctf1 (= 1.5.11-5build1) +Depends: libc6 (>= 2.38), libdw1t64 (>= 0.126), libelf1t64 (>= 0.131), libglib2.0-0t64 (>= 2.76.0), libuuid1 (>= 2.16) +Breaks: libbabeltrace-ctf1 (<< 1.5.3-2~) +Replaces: libbabeltrace-ctf1 (<< 1.5.3-2~) +Filename: pool/libbabeltrace1_1.5.11-5build1_amd64.deb +Size: 165286 +MD5sum: cbf5a1d76f8c6af2c7d5d643806905e6 +SHA1: d70e2594b4abd783dacfd319364fcf88ffe0b1d5 +SHA256: ef5b7809f1d7fe9c62056bc970d15a43c621b11674a7a57d0ef2ccd61871014b +SHA512: 414d0af28f9bca99faa6499d12df5b647ffc815e35a255eebb28fd604d8ce49bfa48d5592064b05cf115e50aa51fc04199aca8c1e02a045a5971fb44b0c3d26e +Homepage: https://www.efficios.com/babeltrace +Description: Babeltrace conversion libraries + Babeltrace provides trace reading and writing libraries, as well as a trace + converter. Plugins can be created for any trace format to allow its conversion + to/from any other supported format. + . + This package provides the babeltrace trace reading and conversion library. + +Package: libbasicobjects0t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 32 +Provides: libbasicobjects0 (= 0.6.2-3build1) +Depends: libc6 (>= 2.14) +Breaks: libbasicobjects0 (<< 0.6.2-3build1) +Replaces: libbasicobjects0 +Filename: pool/libbasicobjects0t64_0.6.2-3build1_amd64.deb +Size: 6026 +MD5sum: 60813c608150e26a919554c55c469bdf +SHA1: 7b76d133aa462fbe9c6a0fb8b82c64b9b9dc8a25 +SHA256: f310575ede5513d7f582da23ce4e9e38a10d2cefe08271829c884450e3080c96 +SHA512: be7d96066a1c8852f9f217a60a2d64458993491fbfce0de25a6c93513f7f3af1a7096005e0c4251da1e3ed10a52fb93a6fb3a32c710ec45868f43b54a7c113c6 +Homepage: https://github.com/SSSD/ding-libs +Description: Basic object types for C + Library that add basic object types for C. + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: libbinutils +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 2416 +Depends: libc6 (>= 2.38), libsframe3, libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.11), binutils-common (= 2.46-3ubuntu2) +Breaks: binutils (<< 2.29-6) +Replaces: binutils (<< 2.29-6) +Filename: pool/libbinutils_2.46-3ubuntu2_amd64.deb +Size: 602104 +MD5sum: a93781288e53eb1dc4170cccdd522957 +SHA1: 24b004e824a7dbd326524ffd27894825eddb8a21 +SHA256: 1376a5e49c8dc2ba938fadc15fce40dd01c7fbf1adf2d506a2a7cf7148e347c8 +SHA512: 5162d035ec708c9c987804367c2d0609c4bcd538157ed4f1a3caabf565e5353f9d162aeae4ab33b875030822a945e2a04a37025d4b3733452aa8ab3c7810d0c0 +Homepage: https://www.gnu.org/software/binutils/ +Description: GNU binary utilities (private shared library) + This package includes the private shared libraries libbfd and libopcodes. + +Package: libblockdev-crypto3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 90 +Depends: libblkid1 (>= 2.23.0), libblockdev-utils3 (>= 3.0), libc6 (>= 2.6), libcryptsetup12 (>= 2:2.7), libglib2.0-0t64 (>= 2.42.2), libkeyutils1 (>= 1.4), libnss3 (>= 2:3.13.4-2~), libvolume-key1 (>= 0.3.9) +Filename: pool/libblockdev-crypto3_3.4.0-1_amd64.deb +Size: 24170 +MD5sum: ff6cb77bec26237e1cdfee07090a9b13 +SHA1: 83b99654d59b774f3c102fe4a8ce054ec0ff4ff5 +SHA256: a1eecb757023cbc88ff0f13c9f65d843ca74419417a29e3fea2cff612518b2a0 +SHA512: 50545dec1bbb74061f0e69d3a958ed9b95c4f2132e922a53c4f432df982a14b5f88c297768f2452ece5ecbf4816be219120e2cc33cc9d17947e84650dc16a954 +Homepage: https://github.com/storaged-project/libblockdev +Description: Crypto plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to encrypted devices (LUKS). + +Package: libblockdev-fs3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 128 +Depends: libblkid1 (>= 2.24.2), libblockdev-utils3 (>= 3.0), libc6 (>= 2.7), libext2fs2t64 (>= 1.42.11), libglib2.0-0t64 (>= 2.42.2), libmount1 (>= 2.30.2), libuuid1 (>= 2.16) +Recommends: e2fsprogs +Filename: pool/libblockdev-fs3_3.4.0-1_amd64.deb +Size: 35414 +MD5sum: 53618706fc5b9563be7770ba12bf9d31 +SHA1: 0fb6711d7dc845c37bef27951a0f589798838b30 +SHA256: d18a23d5fdce332738e4784bd44450e57c6046d1b43fc180e69ab9daa4b5875e +SHA512: af44d877927e791b4f0085f2eb9a7d97d9bf733f7c227646ac3a880b32c970d65ca9f6bbd4f87ac27b3ee23575740b3b0091868ba64fd81504eaf5aed09e4a56 +Homepage: https://github.com/storaged-project/libblockdev +Description: file system plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to operations with file systems. + +Package: libblockdev-loop3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 40 +Depends: libblockdev-utils3 (>= 2.14), libc6 (>= 2.27), libglib2.0-0t64 (>= 2.42.2) +Filename: pool/libblockdev-loop3_3.4.0-1_amd64.deb +Size: 7444 +MD5sum: b5015e848bf9fc1e573801c60d53af93 +SHA1: 44ee362b3e58c54830577931e709adaede4614c9 +SHA256: 7c0ce083bd60bfc65fee6d55c4050b39326d55c82afcfdd890d78c61142f7646 +SHA512: c42cf1a3af03f1e04c1f45c99fed5b0d767e9e7bcc08a3a9e39df73d393c13c2fec0a1dca04f54a1d122cf4b35fe2956433892a1b201c460c13de94292a268d1 +Homepage: https://github.com/storaged-project/libblockdev +Description: Loop device plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to loop devices. + +Package: libblockdev-mdraid3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 56 +Depends: libblockdev-utils3 (>= 3.0), libbytesize1 (>= 2.6), libc6 (>= 2.27), libglib2.0-0t64 (>= 2.42.2) +Suggests: mdadm +Filename: pool/libblockdev-mdraid3_3.4.0-1_amd64.deb +Size: 12584 +MD5sum: 0392a3e4d2c9f3f76b3eae165b0a7b6f +SHA1: 471d44df836740327893b94d2d5fcba176ec998c +SHA256: f7ef2ac65630d37adae67180d424ea29f90d2850b73d0c2d904aa62dfad9d0f2 +SHA512: 88787fd4a58bd46cddfaab7112f8f2381580e347bf53711a611f5a56e037ef9de75a4421ed6fb18b06c608cfb91ecc6d1838ed8430831ab91b14f1f777c00e40 +Homepage: https://github.com/storaged-project/libblockdev +Description: MD RAID plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to MD RAID. + +Package: libblockdev-nvme3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 69 +Depends: libblockdev-utils3 (>= 3.0), libc6 (>= 2.6), libglib2.0-0t64 (>= 2.42.2), libnvme1t64 (>= 1.15) +Filename: pool/libblockdev-nvme3_3.4.0-1_amd64.deb +Size: 17526 +MD5sum: 4c2f968ad4605caef68ca035726b2f65 +SHA1: 77e1aaeee2084c567b11a74531a21d13995df201 +SHA256: fa0ac345e58510dcef6102a8102bb09817deef65ab218a0f8216920a1e7e0bd5 +SHA512: 3634ccea24701df11d867ce3e5c13ca683f7da4b00d76b7a7bdb740a32f141b8f47b9725be47d981cb1cbfec292886a05b57183cfae3a638fcbcc1a13053e789 +Homepage: https://github.com/storaged-project/libblockdev +Description: NVMe plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to NVMe. + +Package: libblockdev-part3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 64 +Depends: libblockdev-utils3 (>= 3.0), libc6 (>= 2.6), libfdisk1 (>= 2.31.1), libglib2.0-0t64 (>= 2.42.2) +Filename: pool/libblockdev-part3_3.4.0-1_amd64.deb +Size: 15404 +MD5sum: cf4ac30d0c852114b6d029fffaab57e7 +SHA1: dda219bf6c0e56089415b06b48c4b86207b90044 +SHA256: b9df3dee433e55262dbe0c29c49c70457874c5ac79e97880b78972abf36f9b6f +SHA512: fb7742b4ebc5c7762461796b30f5610c8e3a5943b039bb667650d063f9a57631e21a1ee32e1549515ddaab772f78d38fadf972c53dc249c0f7056559867b18ee +Homepage: https://github.com/storaged-project/libblockdev +Description: Partitioning plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to partitioning devices. + +Package: libblockdev-smart3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 72 +Depends: libatasmart4 (>= 0.13), libblockdev-utils3 (>= 3.0), libc6 (>= 2.6), libglib2.0-0t64 (>= 2.42.2) +Filename: pool/libblockdev-smart3_3.4.0-1_amd64.deb +Size: 10554 +MD5sum: 4ffdf38daeb502aaaecbca9be0cdcfc2 +SHA1: 600a37bca02c200bdc6523a83196c2373408c099 +SHA256: 1c1257fb1cd58cf21cc68e3dd6dcff4dccb65d10ade391047006f329247bd665 +SHA512: 0daa8fdae6f885c47de65dfbc300f3d3fd6cd8d717969b0901fea5db26c0247f6ba5672dc47f52be27fcf1562beefad17238e9f8ba93241e7892976681abb58f +Homepage: https://github.com/storaged-project/libblockdev +Description: SMART plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to S.M.A.R.T. device reporting and + management. + +Package: libblockdev-swap3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 44 +Depends: libblkid1 (>= 2.23.0), libblockdev-utils3 (>= 2.14), libc6 (>= 2.4), libglib2.0-0t64 (>= 2.42.2), libuuid1 (>= 2.16) +Filename: pool/libblockdev-swap3_3.4.0-1_amd64.deb +Size: 7754 +MD5sum: 7c3cf417214ee3a61ad98a81c1a7842a +SHA1: 5bf7d98e36ee8caa281edd13c05908468ff9f96b +SHA256: c138e325d4aa11172ae076d84953b64dda2edacc30c3262fb5d848037c6b3e76 +SHA512: 29e6fbd6d89f5655f7da9fee48a55141c5b6959a6bfe5ec044987471642483f60f0fcab999fd200f9dc66ce56dc3462a67e6ef2977b96f35f70b7d7131f76174 +Homepage: https://github.com/storaged-project/libblockdev +Description: Swap plugin for libblockdev + The libblockdev library plugin (and at the same time a standalone library) + providing the functionality related to swap devices. + +Package: libblockdev-utils3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 65 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.76.0), libkmod2 (>= 19), libudev1 (>= 216) +Filename: pool/libblockdev-utils3_3.4.0-1_amd64.deb +Size: 20104 +MD5sum: be7adcf5527ff6d768f34db62303e11b +SHA1: 53141fa3b1218ddc92da82ca5bf836184cb591fd +SHA256: f70cbf557395fed9df4589d961b281a65450329c9bccd179f4190bb1244c4eb1 +SHA512: 3f76546acb537f204ceb74bc5f23fc21b10cd77457d97aa31fb3d5006661c5560a6cd2017af2ed5050401a1d20fc7a019073c15ffcaaaa63aad3a838bd2efcb2 +Homepage: https://github.com/storaged-project/libblockdev +Description: Utility functions for libblockdev + The libblockdev-utils is a library providing utility functions used by the + libblockdev library and its plugins. + +Package: libblockdev3 +Architecture: amd64 +Version: 3.4.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libblockdev +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 277 +Depends: libblockdev-utils3 (>= 3.0), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.42.2) +Filename: pool/libblockdev3_3.4.0-1_amd64.deb +Size: 49736 +MD5sum: 48c32101293b3cc380e275fa8e7d160e +SHA1: f9d3635918ed43bfc68e98a824bf70e7e274a83b +SHA256: c633448d605b5aa028184c60a1240b942fa2896b46ee1c832ac524c26347cffa +SHA512: 2ea7d0bfce31a629be45a6b60894c6252aadebd647c5c241a5345a114e85dea4a20d78a1d50af4f5f7ea17e6a0f7549299720a459ec9b637d4a38a9b8db80e8a +Homepage: https://github.com/storaged-project/libblockdev +Description: Library for manipulating block devices + libblockdev is a C library with GObject introspection support that can be used + for doing low-level operations with block devices like setting up LVM, BTRFS, + LUKS or MD RAID. + . + The library uses plugins (LVM, BTRFS,...) and serves as a thin wrapper around + its plugins' functionality. All the plugins, however, can be used as + standalone libraries. One of the core principles of libblockdev is that it is + stateless from the storage configuration's perspective (e.g. it has no + information about VGs when creating an LV). + +Package: libbluetooth3 +Architecture: amd64 +Version: 5.85-4ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: bluez +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Bluetooth Maintainers +Installed-Size: 235 +Depends: libc6 (>= 2.38) +Filename: pool/libbluetooth3_5.85-4ubuntu0.2_amd64.deb +Size: 78170 +MD5sum: 3f557ed435fd229bdeb8a9e3ffa61ac3 +SHA1: c1bafb4c45318dd0c844574da672b4f8c1f24e78 +SHA256: b78dddd9ea8caf8ae075be519b79ca69689f6b8ce98727f0942cb81fcb0c69f9 +SHA512: c8f38e17dfa2c66c160288e3388198a38527531f8279e6ad92eb7fe688e9aa2452b710b71530efe79f845b663086cff156bc43c792920eb984e5367956168dba +Homepage: http://www.bluez.org +Description: Library to use the BlueZ Linux Bluetooth stack + BlueZ is the official Linux Bluetooth protocol stack. It is an Open Source + project distributed under GNU General Public License (GPL). + +Package: libbpf1 +Architecture: amd64 +Version: 1:1.6.3-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libbpf (1.6.3-1ubuntu1) +Maintainer: Ubuntu Developers +Original-Maintainer: Sudip Mukherjee +Installed-Size: 459 +Depends: libc6 (>= 2.38), libelf1t64 (>= 0.144), zlib1g (>= 1:1.2.3.4) +Filename: pool/libbpf1_1%3a1.6.3-1ubuntu1_amd64.deb +Size: 184746 +MD5sum: 32be50eadb8328e20d8f4387d68e76e4 +SHA1: fcd137e35ba78eb744eaec5d609f9fb35283a538 +SHA256: ec7e4acb71b824e218da4d78496b44827d2a33100e7230732002d3459872e993 +SHA512: fc9014f138648e2a01ba6e32f7fb411f219d192aeac317f8ad257c106aceaf7f8329acfc4916ca045244e9586c842196bccd24b50afb281412d3eaea9ecb91b9 +Description: eBPF helper library (shared library) + libbpf is a library for loading eBPF programs and reading and + manipulating eBPF objects from user-space. + . + This package contains the shared library. + +Package: libbrlapi0.8 +Architecture: amd64 +Version: 6.7-1ubuntu6 +Multi-Arch: same +Priority: optional +Section: libs +Source: brltty +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 146 +Depends: libc6 (>= 2.38), libsystemd0 +Filename: pool/libbrlapi0.8_6.7-1ubuntu6_amd64.deb +Size: 28614 +MD5sum: 4ac6f251daf0bf0c63c7e9ba264e3df7 +SHA1: cfd2c1787a18d788a6c4013eeb335d2f3363ffd6 +SHA256: b3218fd4461a1b5f59cc28b5213e521cf251f0d55fd068c02c15d2777ff4c305 +SHA512: 4d84a00a217a8bdf88d0e720f6cca645f0e55bff203833e03801fe471e48457e261ed95f07ca555baacd9a18e53b55a65d866cf0129fff25844a1e8dedfebe0a +Homepage: https://brltty.com +Description: braille display access via BRLTTY - shared library + BRLTTY is a daemon which provides access to the console (text mode) + for a blind person using a braille display. It drives the braille + display and provides complete screen review functionality. + . + BrlAPI is a library which gives an application access to a braille display and + lets it write braille. + . + This package contains the shared library necessary to run programs which + need to communicate with a braille display. + +Package: libbrotli1 +Architecture: amd64 +Version: 1.2.0-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: brotli +Maintainer: Ubuntu Developers +Original-Maintainer: Tomasz Buchert +Installed-Size: 886 +Depends: libc6 (>= 2.29) +Filename: pool/libbrotli1_1.2.0-3build1_amd64.deb +Size: 342830 +MD5sum: 1d58f99f3e026fb9db2da3e2d23b1220 +SHA1: d687299efd5e93f0f5a5b50a67946b2da8f19210 +SHA256: 858242571fc2585c1f8eb83ae01d020f0f4a92679d0de8fe31146f6687bdd84a +SHA512: 894b02ccbf30e8b89ed7b3a596d7b0c1d6b77d33a73530a819af5c57f16a1bf341db4c8c65447208359d62751f15f06e5e9055636365b53cef21d83765c401b9 +Homepage: https://github.com/google/brotli +Description: library implementing brotli encoder and decoder (shared libraries) + Brotli is a generic-purpose lossless compression algorithm + that compresses data using a combination of a modern variant + of the LZ77 algorithm, Huffman coding and 2nd order context modeling, + with a compression ratio comparable to the best currently available + general-purpose compression methods. It is similar in speed with + deflate but offers more dense compression. + . + This package installs shared libraries. + +Package: libbytesize-common +Architecture: all +Version: 2.12-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libbytesize +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 40 +Filename: pool/libbytesize-common_2.12-1_all.deb +Size: 3482 +MD5sum: f71b13bcca374e609caf48584cca9e89 +SHA1: c2fe62067db98b19cb5553472c2a8fd53313fb30 +SHA256: cb6b60c0a0f6f0876b3d5cc2ff6d7a8ac678090df3ffb780ed62c45cc74a3448 +SHA512: 7376e63f8247d97e6f4bfddf9470eacc4c192538b588a0d660b03bb8bde5214aa6882241f17b714dcff2aa82ad040fc058d25e1f8bb6284eabf0123f8ca3b831 +Homepage: https://github.com/storaged-project/libbytesize +Description: library for common operations with sizes in bytes - translations + This package contains localization files used by libbytesize. + +Package: libbytesize1 +Architecture: amd64 +Version: 2.12-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libbytesize +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 47 +Depends: libc6 (>= 2.38), libgmp10 (>= 2:6.3.0+dfsg), libmpfr6 (>= 3.1.3), libpcre2-8-0 (>= 10.22), libbytesize-common (= 2.12-1) +Filename: pool/libbytesize1_2.12-1_amd64.deb +Size: 13610 +MD5sum: 53a2018d947dc2473b10118601b053cd +SHA1: 642c9028835ee4684074caecb0283b4bbba6e850 +SHA256: 8360d35d1d98e7ce7a2e0d1084bac7ff2d63abf9c0dcbfa57799b23efe3c3d13 +SHA512: 8101f1cad10dbc895838db6b508b44ba38af47f416ab8785ea89fe48cdc3f3beb5a34197590d0d7161b27642df8b54142c0bb6c1c45a0fea70a47e55dae04d9b +Homepage: https://github.com/storaged-project/libbytesize +Description: library for common operations with sizes in bytes + Many projects need to work with sizes in bytes (be it sizes of storage + space, memory, ...) and all of them need to deal with the same issues + like: + . + * How to get a human-readable string for the given size? + * How to store the given size so that no significant information is lost? + * How to handle sizes bigger than MAXUINT64? + * How to interpret sizes entered by users according to their locale and + typing conventions? + * How to deal with the decimal/binary units (MB vs. MiB) ambiguity? + . + This library aims to be as much generally usable as possible, small, fast and + be easily interfaced from other languages. + +Package: libc6-dbg +Architecture: amd64 +Version: 2.43-2ubuntu2.4 +Multi-Arch: same +Priority: optional +Section: debug +Source: glibc +Maintainer: Ubuntu Developers +Original-Maintainer: GNU Libc Maintainers +Installed-Size: 8907 +Provides: libc-dbg, libc6-dbgsym +Depends: libc6 (= 2.43-2ubuntu2.4) +Filename: pool/libc6-dbg_2.43-2ubuntu2.4_amd64.deb +Size: 6405752 +MD5sum: f515ec8508523ce345ff7e98a591bff1 +SHA1: 375499d0095989734315f7e35c8c1a263412bc90 +SHA256: 523851368691971a1553c7dacc7cf9e0cd54a78ca70bbdd735d932f16e089ae3 +SHA512: 9e0bd4fe8236ad96552c4242b401c2e375dcc5dfe1980c46c583081d666eda629f60932a51e0e930fe9e03f84fc1a2c52be743ed648e99ba6671371a1a100918 +Homepage: https://www.gnu.org/software/libc/libc.html +Description: GNU C Library: detached debugging symbols + This package contains the detached debugging symbols for the GNU C + library. +Build-Ids: 00ff8d887d65c1cdbe8057df8dc56af0167a41bf 03b9aa6cc45dcd42335717d2f0b0724c17756181 066527e430a32768d82741e00b81eebb1a872294 2000a7e6c07f2ef41f3d22f773393360523edc21 3c5e8bfe8616848cfc917c283a1720e91079b834 4024345fd127bfe9437221167a976e2665015e98 40555868112632230b87febb8376af2129baa6f5 55841c89a6fa66ba40b728ac65bbd251912cbea5 5a11f0b004a3befd513c271e8a2d314e59afd437 6353335bb304a2ad5325b24f47e3f3f86f1aef62 64fe8b084404b3739e958bfe0e04c79e6b9c92c2 6b2f4bfcb50bb93f530e1992b8a9d112650bdae7 6d6017be01043b8e9551b4d1553b34c2de98f958 6efea554b9c0984e37b425b1b47eb1bfe08b01f7 71dcf7f247ce22dfe35fd9d3f4fc3d5e10f7859a 71e8c759b80513e6ebb603168ed2b2827e9f43cc 7651fe6d778ba19865fad6fcb89dff0a23387f19 92c1ae3c70adf902951fb0d5d91def870b60d87d 94ef0b151fc9afb4ea418b0236f6a3cac8ac406b acc9ae31fe4fd6bc34d047aca92133d23bbe30ba b9af245e008f9e4e40dcfc4c547b691dbe89696f bb317f0b2b11951e59029876ea1203da6270cbd3 be7d01f2157a7690d75eb680e5a689c92283dd22 cb9f273d6a10fd345ff553f0d49f79b979b66214 cbeab3e9f4f56b4f92df8d591d2efde084d227f9 d2857b7e47528a3ba4cb637442969fe49d7db9a7 e1851c7e623e218ca8ccc7426d14bea9d6b86e79 ef65d7663a968124abf036cce2ea6b4c1c24b44a +Original-Vcs-Browser: https://salsa.debian.org/glibc-team/glibc +Original-Vcs-Git: https://salsa.debian.org/glibc-team/glibc.git + +Package: libcaca0 +Architecture: amd64 +Version: 0.99.beta20-6ubuntu2.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcaca +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 876 +Depends: libc6 (>= 2.38), libncursesw6 (>= 6), libstdc++6 (>= 13.1), libtinfo6 (>= 6), zlib1g (>= 1:1.1.4) +Suggests: libgl1, libglu1-mesa | libglu1, libglut3.12 (>= 3.4.0), libx11-6 +Filename: pool/libcaca0_0.99.beta20-6ubuntu2.1_amd64.deb +Size: 204812 +MD5sum: 623a7a17af2a1d18e4ca43c330e14379 +SHA1: 0b20179b0fd39b15bc2617db8a3e9de251b251a2 +SHA256: b96575004d6529c128492bf21a937f97c7728e4c88a19a50b4d9eee950780170 +SHA512: 01677cd3719cb29c876da1be1014825b9893aadafebce4e43d201c291756ac1178ef71266e6bc7f5a1a0eba7920629d7f0a050cf66a84eaac5ec6a89f2252c3e +Homepage: http://caca.zoy.org/wiki/libcaca +Description: colour ASCII art library + libcaca is the Colour AsCii Art library. It provides high level functions + for colour text drawing, simple primitives for line, polygon and ellipse + drawing, as well as powerful image to text conversion routines. + . + This package contains the shared library for libcaca. + +Package: libcairo-gobject-perl +Architecture: amd64 +Version: 1.005-4build4 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 58 +Depends: perl (>= 5.40.0-6), perlapi-5.40.0, libc6 (>= 2.3), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.10.0), libglib2.0-0t64 (>= 2.12.0), libcairo-perl, libglib-perl +Filename: pool/libcairo-gobject-perl_1.005-4build4_amd64.deb +Size: 11960 +MD5sum: 9f8ae46654922d3e68190043f0b88c74 +SHA1: e878b7ff9f03bd66c6ce63a2eb9cbd4332938dd5 +SHA256: 3156aef0a54b1c864105e951fc61e6fd02c733716a8424895229e5fcbfb0d691 +SHA512: 34ec639b4ccc1e55027a5aac69e08d0db073968e2efe0939fbf1e1c134f67dbf7396240d625c2999da36fc2a0efa0d95e5de83fa1669b41bf8a39f87509d0de5 +Homepage: https://metacpan.org/release/Cairo-GObject +Description: integrate Cairo into the Glib type system in Perl + Cairo::GObject registers Cairo's types (Cairo::Context, Cairo::Surface, + etc.) with Glib's type systems so that they can be used normally + in signals and properties. + +Package: libcairo-gobject2 +Architecture: amd64 +Version: 1.18.4-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cairo +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 193 +Depends: libcairo2 (= 1.18.4-3), libglib2.0-0t64 (>= 2.68.0) +Filename: pool/libcairo-gobject2_1.18.4-3_amd64.deb +Size: 127288 +MD5sum: 5b3c39443948d1d3ec06cf2b71dda63b +SHA1: a5ff96e92afe2a3d58400207de7ae30bc45c59e5 +SHA256: 1d48661d59bb164fc27e88bb8e6a8dab0cdfdbf35ea5d2bbf3ebffe849a38822 +SHA512: 972bd56aea6142d16712da4c3afa397d2e70d5efeeef6078a7981bf715fe5e8ddfb0690f14717733e6cd380b67a50027f34f508394951484577177d3f798edc7 +Homepage: https://cairographics.org/ +Description: Cairo 2D vector graphics library (GObject library) + Cairo is a multi-platform library providing anti-aliased + vector-based rendering for multiple target backends. + . + This package contains the GObject library, providing wrapper GObject types + for all cairo types. + +Package: libcairo-perl +Architecture: amd64 +Version: 1.109-5build1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 387 +Depends: perl (>= 5.40.0-6), perlapi-5.40.0, libc6 (>= 2.34), libcairo2 (>= 1.15.8) +Suggests: libfont-freetype-perl +Filename: pool/libcairo-perl_1.109-5build1_amd64.deb +Size: 93514 +MD5sum: 7c421371877659067215fb5689ca384b +SHA1: ddfa9452b4692d1ea23e096e45696f1761beadf4 +SHA256: e8abeb2e59db3df6384bbc62b1ca1286c011b6ed977a38e6323718421e60a588 +SHA512: 793fa054af37a6878722def2287dae1a9fdd748e587043cf44ce01b4912e47502587fb7e4f08ef0aa31be3746a6d06be21944fc3c39ab4802f8eb1151ff5aba7 +Homepage: https://gtk2-perl.sourceforge.net/ +Description: Perl interface to the Cairo graphics library + libcairo-perl provides access to the Cairo library. + . + Cairo is a 2D graphics library with support for multiple + output devices. It is designed to produce consistent output + on all output media while taking advantage of display hardware + acceleration when available (eg. through the X Render Extension). + . + The cairo API provides operations similar to the drawing + operators of PostScript and PDF. Operations in cairo including + stroking and filling cubic Bézier splines, transforming and compositing + translucent images, and antialiased text rendering. All drawing + operations can be transformed by any affine transformation (scale, + rotation, shear, etc.) + . + Find out more about Cairo at http://www.cairographics.org/. + +Package: libcairo-script-interpreter2 +Architecture: amd64 +Version: 1.18.4-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cairo +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 200 +Depends: libc6 (>= 2.29), libcairo2 (= 1.18.4-3), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), liblzo2-2 (>= 2.02), zlib1g (>= 1:1.1.4) +Filename: pool/libcairo-script-interpreter2_1.18.4-3_amd64.deb +Size: 61364 +MD5sum: 624876972288bdef3ae826b09de683d2 +SHA1: 83bf0e2364fc02f118a46cec6c733d67a583fbb2 +SHA256: 516ad272f711e3c4550307ff6d6e1cbc828e3f4744471ffa0389430739197c81 +SHA512: bb70ba5a188f79e29df5c74ffb198699ba472fc64c18923561ad6452e14de6d3c580b5c579ae0ee6da956b027fc9a7bdbbab9a0795d086c6dddbcd2c93d709d4 +Homepage: https://cairographics.org/ +Description: Cairo 2D vector graphics library (script interpreter) + Cairo is a multi-platform library providing anti-aliased + vector-based rendering for multiple target backends. + . + This package contains the script interpreter for executing and manipulating + cairo execution traces. + +Package: libcairo2 +Architecture: amd64 +Version: 1.18.4-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cairo +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1394 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.11.1), libpixman-1-0 (>= 0.40.0), libpng16-16t64 (>= 1.6.46), libx11-6, libxcb-render0, libxcb-shm0, libxcb1 (>= 1.6), libxext6, libxrender1 (>= 1:0.9.12), zlib1g (>= 1:1.1.4) +Filename: pool/libcairo2_1.18.4-3_amd64.deb +Size: 578678 +MD5sum: 5f75ae212214125db3ba7c8646e64bd8 +SHA1: 7fa78a17f9dfe8145a3b828dc7dcb6762a6434c5 +SHA256: 525ab7b5ad6529ea35aa09308ddd1fd2325c85ad70e7483ba66b526d8ee9f7a7 +SHA512: 66cdb25badf039001bd802220ddab448da4d042d6da121c25bf34f314e162c606182f73b9e1b99f495d5cbb0a11a438e8563fb4a4a6f784e6dd93129f991e190 +Homepage: https://cairographics.org/ +Description: Cairo 2D vector graphics library + Cairo is a multi-platform library providing anti-aliased + vector-based rendering for multiple target backends. Paths consist + of line segments and cubic splines and can be rendered at any width + with various join and cap styles. All colors may be specified with + optional translucence (opacity/alpha) and combined using the + extended Porter/Duff compositing algebra as found in the X Render + Extension. + . + Cairo exports a stateful rendering API similar in spirit to the path + construction, text, and painting operators of PostScript, (with the + significant addition of translucence in the imaging model). When + complete, the API is intended to support the complete imaging model of + PDF 1.4. + . + This package contains the shared libraries. + +Package: libcamel-1.2-64t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1565 +Provides: libcamel-1.2-64 (= 3.56.2-8) +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.68.0), libgssapi-krb5-2 (>= 1.17), libicu78 (>= 78.1-1~), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.16), libsqlite3-0 (>= 3.6.0), zlib1g (>= 1:1.1.4) +Breaks: libcamel-1.2-64 (<< 3.56.2-8) +Replaces: libcamel-1.2-64 +Filename: pool/libcamel-1.2-64t64_3.56.2-8_amd64.deb +Size: 503908 +MD5sum: 54fda57cccf7b5bb71c2408a10e053f1 +SHA1: 58ecbc77466afb71dc71023f26ccd59fa597d41e +SHA256: 2f69745dd71354ee00e4243159168fe73678cc52a8ae4f89afbda91514282971 +SHA512: 50d22979af51b48393dee4279be183ec3e010719a577e9ff96bd2eda08b6d2f82fc8f51b1d4d1d0febd83dcfe394d8e847151396352458051a63fd2f8ecc0558 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Evolution MIME message handling library + Camel is a generic messaging library. It supports the standard + messaging system for receiving and sending messages. It is the + messaging backend for Evolution. + . + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + +Package: libcanberra-gtk3-0 +Architecture: amd64 +Version: 0.30-18ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcanberra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Provides: libcanberra-gtk3-0t64 (= 0.30-18ubuntu3) +Depends: libc6 (>= 2.4), libcanberra0 (>= 0.12), libglib2.0-0t64 (>= 2.12.0), libgtk-3-0t64 (>= 3.0.0), libx11-6 +Recommends: libcanberra-gtk3-module +Breaks: libcanberra-gtk3-0t64 (<< 0.30-13) +Replaces: libcanberra-gtk3-0t64 (<< 0.30-13) +Filename: pool/libcanberra-gtk3-0_0.30-18ubuntu3_amd64.deb +Size: 8270 +MD5sum: 38a8ac600b89a70d208cf4ad42e0a780 +SHA1: 3d84ab09d0e206badf74584a096be433a055821a +SHA256: 454c4152ede8df500babd20649ca94e7865c3fa3a6ba82e5cbfdaf6c28baac32 +SHA512: e2653ec3753c39c34904ba3b8ccc452170eefec0d3d9a74bd4262008e9f88219801e7a7304f6360b20f2bbaf82dfbcf65c39c39a003ff993fd240e01c97ed8cd +Homepage: https://0pointer.de/lennart/projects/libcanberra/ +Description: GTK+ 3.0 helper for playing widget event sounds with libcanberra + libcanberra-gtk provides a few functions that simplify libcanberra + usage from GTK+ 3.0. + . + Contextual information is needed to play event sound. This library + can help to compile directly event sounds property lists based on + active GtkWidget objects or GdkEvent events. + +Package: libcanberra-gtk3-module +Architecture: amd64 +Version: 0.30-18ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcanberra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 49 +Depends: libc6 (>= 2.4), libcanberra-gtk3-0 (>= 0.25), libglib2.0-0t64 (>= 2.16.0), libgtk-3-0t64 (>= 3.0.0), libx11-6 +Filename: pool/libcanberra-gtk3-module_0.30-18ubuntu3_amd64.deb +Size: 10492 +MD5sum: 5eb6e7b73889a32d57baf67fd2b0e2eb +SHA1: 83b53826804816116152666e67a7c82b31e6eccc +SHA256: 6f65c709a9a368b2501c23e007352e402bcc0e8e390609519d557d1d88be4498 +SHA512: 489bd10597c9f36021935e0e04045e03c89c9890846ab8de205e50b8ba660c0046a225194fa158bb20a83e460b79e15c5e73fbdd8a1176351c6340652a681082 +Homepage: https://0pointer.de/lennart/projects/libcanberra/ +Description: translates GTK3 widgets signals to event sounds + A GtkModule which will automatically hook into all kinds of events + inside a GTK+ 3.0 program and generate sound events from them. + +Package: libcanberra-pulse +Architecture: amd64 +Version: 0.30-18ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcanberra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 45 +Depends: libc6 (>= 2.4), libcanberra0 (= 0.30-18ubuntu3), libpulse0 (>= 0.99.1), pipewire-pulse | pulseaudio +Filename: pool/libcanberra-pulse_0.30-18ubuntu3_amd64.deb +Size: 12324 +MD5sum: a8201417f3a708d2ed5eb02b9b6a6d87 +SHA1: 3d0e36febc6b4f8771194ae0beec793ba8353419 +SHA256: 0cd567060da8080ead8656d97370e74918680b612f5fd832ea39afdb154246a4 +SHA512: 649408cab7cd3a3a17ba3c3629718e178c1d9e440f71991ad4bea716ef7c773cf297098b310499444e578a68906428d9d163988e890e10eec22e58d9cfe2fef4 +Homepage: https://0pointer.de/lennart/projects/libcanberra/ +Description: PulseAudio backend for libcanberra + libcanberra defines a simple abstract interface for playing event + sounds. + . + This package contains the PulseAudio backend for libcanberra. + +Package: libcanberra0 +Architecture: amd64 +Version: 0.30-18ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcanberra +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 118 +Provides: libcanberra0t64 (= 0.30-18ubuntu3) +Depends: libasound2t64 (>= 1.0.16), libc6 (>= 2.34), libltdl7 (>= 2.5.4), libtdb1 (>= 1.2.7+git20101214), libvorbisfile3 (>= 1.1.2), sound-theme-freedesktop +Suggests: libcanberra-pulse +Breaks: libcanberra0t64 (<< 0.30-13) +Replaces: libcanberra0t64 (<< 0.30-13) +Filename: pool/libcanberra0_0.30-18ubuntu3_amd64.deb +Size: 40514 +MD5sum: b66ef6b865b857f3091dc80149eb410e +SHA1: fdd661533451e936e71867ba4d201777ed40aa63 +SHA256: c31767686f429f84db8723d7b864bf829e24269f235228415262fb52752cc667 +SHA512: 9899440b17476deaa0b909d61bd1c6ba0d988dce07ba3ee5bcc30742e4b72859241acf2e8401482a7a7a9366741a6f6ea0a9a0c1f9368f47036604fc73e008f5 +Homepage: https://0pointer.de/lennart/projects/libcanberra/ +Description: simple abstract interface for playing event sounds + libcanberra defines a simple abstract interface for playing event + sounds. + . + libcanberra relies on the XDG sound naming specification for + identifying event sounds. On Unix/Linux the right sound to play + is found via the mechanisms defined in the XDG sound theming + specification. + +Package: libcap2 +Architecture: amd64 +Version: 1:2.75-10ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Maintainer: Ubuntu Developers +Original-Maintainer: Christian Kastner +Installed-Size: 93 +Depends: libc6 (>= 2.38) +Filename: pool/libcap2_1%3a2.75-10ubuntu2_amd64.deb +Size: 29264 +MD5sum: e854de00a180b840d7c5eeba8efc3108 +SHA1: c46bf1bcf3e1bc05665cc1e9f257408a918c20dc +SHA256: 150603a0792b1d22aa0bde0a26c27b413018c799284003e4b43cba587a5b3a18 +SHA512: 2981904b1490517cd8c60f66012a3261e859c54d50a5be3d101c1a20b3a166cebe9735f1fce652f4e27aacb498336cbc7007ceaad8b74e682e61922b2930c821 +Homepage: https://sites.google.com/site/fullycapable/ +Description: POSIX 1003.1e capabilities (library) + Libcap implements the user-space interfaces to the POSIX 1003.1e capabilities + available in Linux kernels. These capabilities are a partitioning of the all + powerful root privilege into a set of distinct privileges. + . + This package contains the shared library. + +Package: libcap2-bin +Architecture: amd64 +Version: 1:2.75-10ubuntu2 +Multi-Arch: foreign +Priority: important +Section: utils +Source: libcap2 +Maintainer: Ubuntu Developers +Original-Maintainer: Christian Kastner +Installed-Size: 133 +Depends: libc6 (>= 2.38), libcap2 (>= 1:2.63) +Recommends: libpam-cap +Breaks: libcap-bin +Replaces: libcap-bin +Filename: pool/libcap2-bin_1%3a2.75-10ubuntu2_amd64.deb +Size: 33524 +MD5sum: f9546db2f47d0ae2c21ed7972106dba3 +SHA1: d5717553dfa9233c3a88b4e2367f2c36e1ff2c33 +SHA256: d92a8f9affbd2277d191e65978ba2a194d00d00a04f52ee9d1bca2a2ba26697d +SHA512: 2bdd5a8e27929537c36db7e563bfdecd867381e0a62c5223ebb593439c1dcbcc3a3c39168f0bf742589de40dcf21f3ffa7b98b825351af197127757cd91eecd0 +Homepage: https://sites.google.com/site/fullycapable/ +Description: POSIX 1003.1e capabilities (utilities) + Libcap implements the user-space interfaces to the POSIX 1003.1e capabilities + available in Linux kernels. These capabilities are a partitioning of the all + powerful root privilege into a set of distinct privileges. + . + This package contains additional utilities. + +Package: libcares2 +Architecture: amd64 +Version: 1.34.6-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: c-ares +Maintainer: Ubuntu Developers +Original-Maintainer: Gregor Jasny +Installed-Size: 259 +Provides: libc-ares2 (= 1.34.6-1) +Depends: libc6 (>= 2.38) +Breaks: libc-ares2 (<< 1.34.6-1) +Replaces: libc-ares1, libc-ares2 +Filename: pool/libcares2_1.34.6-1_amd64.deb +Size: 101600 +MD5sum: 340643fb8179d4e2407ad1273a8a8551 +SHA1: ce6ccc23a78b976a21d09cdddace39cea18c854d +SHA256: 163c4c1b52abbd150dd3d1e112cbf2db528d75c09146b36f69f535218319ce23 +SHA512: a1c8c94d74cbc7fefbcfb087fe63ca8c69ffbb5047808f44a705a6ca29c7a7ee5d55352c587d9f54d1573b4a9d1ad7c99e2fc2c1c6fc11e39182a487a0c37206 +Homepage: https://c-ares.org/ +Description: asynchronous name resolver + c-ares is a C library that performs DNS requests and name resolution + asynchronously. + . + It is a fork of the library named "ares", with additional features: + * IPv6 support; + * extended cross-platform portability; + * 64-bit clean sources. + . + This package provides the shared libraries. + +Package: libcbor0.10 +Architecture: amd64 +Version: 0.10.2-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcbor +Maintainer: Ubuntu Developers +Original-Maintainer: Vincent Bernat +Installed-Size: 85 +Depends: libc6 (>= 2.14) +Filename: pool/libcbor0.10_0.10.2-2ubuntu3_amd64.deb +Size: 25286 +MD5sum: 9eeaee3846f3fbe3c9ee3c46435ad244 +SHA1: 997b057a7f9af44f9f8c348ca327370c6367f6d1 +SHA256: 97153fe6f78a737d08227e7df8b185ddb064e69febdea8993ebde37a97b2527f +SHA512: 5bec643a54474fbb3523dd7182968fdae83b3a189b939e60e3ea7b1576cfd120f9686faaa0bc2067f856921d3a1dc04e9853ac890304b33d78b9885c8d3bfd82 +Homepage: https://github.com/PJK/libcbor +Description: library for parsing and generating CBOR (RFC 7049) + CBOR is a general-purpose schema-less binary data format, defined in + RFC 7049. This package provides a C library for parsing and generating + CBOR. The main features are: + . + - Complete RFC conformance + - Robust C99 implementation + - Layered architecture offers both control and convenience + - Flexible memory management + - No shared global state - threading friendly + - Proper handling of UTF-8 + - Full support for streams & incremental processing + - Extensive documentation and test suite + - No runtime dependencies, small footprint + . + This package contains the runtime library. + +Package: libcdio-cdda2t64 +Architecture: amd64 +Version: 10.2+2.0.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcdio-paranoia +Maintainer: Ubuntu Developers +Original-Maintainer: Philippe SWARTVAGHER +Installed-Size: 54 +Provides: libcdio-cdda2 (= 10.2+2.0.2-2) +Depends: libc6 (>= 2.33), libcdio19t64 (>= 2.1.0) +Breaks: libcdio-cdda2 (<< 10.2+2.0.2-2) +Replaces: libcdio-cdda2 +Filename: pool/libcdio-cdda2t64_10.2+2.0.2-2_amd64.deb +Size: 16850 +MD5sum: f9e875ed96acc5ebace141e2bbc1edac +SHA1: cbd0779c842c80dfb696ebf770c6c59d83307593 +SHA256: d9863ed4c0e5591bbb3cbfe163005bcd529cc5fca3d439c1b3ae864e8c3c7440 +SHA512: 942ccf45d45961082547a7d139f255f9e57a33e3ed182e03ee8f5b248b6757df190d194e4b2ba6aa1a91845f2d5479994c3a468f7081845d89a1f04fb0cd0041 +Homepage: https://www.gnu.org/software/libcdio/ +Description: library to read and control digital audio CDs + This library is made to read and control digital audio CDs. It does + not play such CDs, it only reads them digitally. As it uses libcdio as + a backend, it supports the same kind of CDROM drives (and images) as + libcdio. + +Package: libcdio-paranoia2t64 +Architecture: amd64 +Version: 10.2+2.0.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcdio-paranoia +Maintainer: Ubuntu Developers +Original-Maintainer: Philippe SWARTVAGHER +Installed-Size: 53 +Provides: libcdio-paranoia2 (= 10.2+2.0.2-2) +Depends: libc6 (>= 2.14), libcdio-cdda2t64 (>= 10.2+2.0.0), libcdio19t64 (>= 2.1.0) +Breaks: libcdio-paranoia2 (<< 10.2+2.0.2-2) +Replaces: libcdio-paranoia2 +Filename: pool/libcdio-paranoia2t64_10.2+2.0.2-2_amd64.deb +Size: 17134 +MD5sum: 195302702fdbcc4f54f39ca6671d3637 +SHA1: 6e61fcae28a9d34c07d516623dcdda5466f6593c +SHA256: eec8f3e7074d73520122a503ade4620c91151611383451ff9ceffbf98b76aa6c +SHA512: 5943d18c27edc576bd99eca33f10fabda113e3b3d070e5724a370b0951f2164d8cc8709c294d73859c525e31bb1d6249122370d0eb89f6c0e2d890734ad06658 +Homepage: https://www.gnu.org/software/libcdio/ +Description: library to read digital audio CDs with error correction + This library is made to read digital audio CDs, with error + correction. It does its best to correct errors and jitter that happen + when reading such discs. As it uses libcdio as a backend, it supports + the same kind of CDROM drives (and images) as libcdio. + +Package: libcdio19t64 +Architecture: amd64 +Version: 2.2.0-4build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcdio +Maintainer: Ubuntu Developers +Original-Maintainer: Gabriel F. T. Gomes +Installed-Size: 181 +Provides: libcdio19 (= 2.2.0-4build1) +Depends: libc6 (>= 2.38) +Breaks: libcdio19 (<< 2.2.0-4build1), libiso9660++-0 (<< 2.2.0), libiso9660++-0t64 (<< 2.2.0), libiso9660-11 (<< 2.2.0), libiso9660-11t64 (<< 2.2.0) +Replaces: libcdio19 +Filename: pool/libcdio19t64_2.2.0-4build1_amd64.deb +Size: 64266 +MD5sum: 09bb1eaf3d3c9ece91f59d518e69c439 +SHA1: f90f3d7de5284a655b023bc0bf27c7edde4fb2f2 +SHA256: 6643707a81accf28c9a3b6c205e945a460343f9a26867a831ed4e62ef421fadd +SHA512: 971ce74124f9cdbfc354170ee5371f3405fd035302933e7e6a278066af281c037329d86ba3136b2f2897aa073ca75ed1eaf4c4c1b9935bbc56b2566b191caac7 +Homepage: https://www.gnu.org/software/libcdio/ +Description: library to read and control CD-ROM + This library is to encapsulate CD-ROM reading and + control. Applications wishing to be oblivious of the OS- and + device-dependant properties of a CD-ROM can use this library. + . + Some support for disk image types like BIN/CUE and NRG is available, + so applications that use this library also have the ability to read + disc images as though they were CD's. + +Package: libcdparanoia0 +Architecture: amd64 +Version: 3.10.2+debian-14ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: cdparanoia +Maintainer: Ubuntu Developers +Original-Maintainer: Optical Media Tools Team +Installed-Size: 135 +Depends: libc6 (>= 2.33) +Filename: pool/libcdparanoia0_3.10.2+debian-14ubuntu2_amd64.deb +Size: 48274 +MD5sum: a17d7e33dbfe75032b2382a5c98ad09d +SHA1: 20f8ca5c55c1b94478376c0dddc9c06ef9204323 +SHA256: f40173218707554907b32bb3f3d695817f7fb1bf3b0e7acb9746a5ac69a56ebb +SHA512: fb60cea7bff81794c00efed1f7b0c5ec216882352aa9987387d3c48b77cbaf74480f3c5afa1d2078fdd1aa73e544a4801537b931310a0afca9897b15830af2a0 +Homepage: https://www.xiph.org/paranoia/ +Description: audio extraction tool for sampling CDs (library) + An audio extraction tool for sampling CDs. Unlike similar programs such as + cdda2wav, cdparanoia goes to great lengths to try to extract the audio + information without any artifacts such as jitter. + . + This package contains the library of cdparanoia, so that its routines + can be used by other programs. + +Package: libclone-perl +Architecture: amd64 +Version: 0.47-1 +Multi-Arch: same +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 42 +Depends: perl (>= 5.40.0-6), perlapi-5.40.0, libc6 (>= 2.14) +Filename: pool/libclone-perl_0.47-1_amd64.deb +Size: 10710 +MD5sum: 71781d8fd6e88d781c7fd3f968bde7c1 +SHA1: 47a7fc02e0fd806bb74a06f0fd4836492e7fcac0 +SHA256: 93718230fcba6109ee3f7c3076496e85dcfb440692d1a68cd1b011ef749105a0 +SHA512: 2e63108ac0b78831713e48ee07db76d0e42b6bca82f2ac71082da0e2c1c2e46d54fb533391e8688ac573e4f826846d4fb6b5c12678b17fffd3e2451905437ed0 +Homepage: https://metacpan.org/release/Clone +Description: module for recursively copying Perl datatypes + The Clone module provides a clone() method which makes recursive copies of + nested hash, array, scalar and reference types, including tied variables and + objects. + . + It is faster (although less flexible) than Storable's dclone. Its + functionality is _not_ serializing in-memory objects (i.e. as + Data::Dumper or YAML::Dump do), but deep-copying them over to new + in-memory structures. + +Package: libcollection4t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 78 +Provides: libcollection4 (= 0.6.2-3build1) +Depends: libc6 (>= 2.14) +Breaks: libcollection4 (<< 0.6.2-3build1) +Replaces: libcollection4 +Filename: pool/libcollection4t64_0.6.2-3build1_amd64.deb +Size: 23414 +MD5sum: b44e142af7b77644ec3229885d299359 +SHA1: 1f6d4b4743e22267d77a9704d7f1ac801e29506b +SHA256: 92cf4d36ead1d45befaf898944301c9198b2862b6657b24fbab08f4aa119eafc +SHA512: 0e92931a920fb33fb5b5b77624bc0f7ea7b1cb445de59d1d12f98e6e9f746a80416447b8241ac756338b8fda7c37f95672e58c9fa45c138ccae77f3216572469 +Homepage: https://github.com/SSSD/ding-libs +Description: Collection data-type for C + A data-type to collect data in a hierarchical structure for easy iteration + and serialization. + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: libcolord-gtk4-1t64 +Architecture: amd64 +Version: 0.3.1-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: colord-gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 68 +Provides: libcolord-gtk4-1 (= 0.3.1-2) +Depends: libc6 (>= 2.4), libcairo2 (>= 1.2.4), libcolord2 (>= 1.4.3), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.0.0) +Recommends: colord +Breaks: libcolord-gtk4-1 (<< 0.3.1-2) +Replaces: libcolord-gtk4-1 +Filename: pool/libcolord-gtk4-1t64_0.3.1-2_amd64.deb +Size: 17460 +MD5sum: 7e297054f81b79d804d9d151803ee452 +SHA1: cd5f6fb645046a81114ca59f02eb1316a28d7681 +SHA256: a9c38484d7baa9c4a07e5dcde89382d707a6f50d22a9de4a7b15b026154a4e86 +SHA512: 364c2dfc00e9f87144ce652aa82ead523f1c0fb32c5d8a472510d973b826118df0fe9acce59dc5b54405e6eb4a6014241b50cfe8aba2769a948c7c51d2af0c78 +Homepage: https://www.freedesktop.org/software/colord/ +Description: GTK4 convenience library for interacting with colord + colord is a system service that makes it easy to manage, install and generate + colour profiles to accurately colour manage input and output devices. + . + This is a GTK4 convenience library for interacting with colord. It is useful + for both applications which need colour management and applications that wish + to perform colour calibration. + . + This package contains the runtime libraries. + +Package: libcolord2 +Architecture: amd64 +Version: 1.4.8-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: colord +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 607 +Depends: libc6 (>= 2.29), libglib2.0-0t64 (>= 2.80.0), liblcms2-2 (>= 2.6), libudev1 (>= 196) +Suggests: colord +Filename: pool/libcolord2_1.4.8-3_amd64.deb +Size: 149688 +MD5sum: 37246058cd59333f8ade57dd1ce74364 +SHA1: 6bcefaf4cef2ddc23a37b3937b0a46531f1ff24d +SHA256: 063718186165d691f1b14d77d6ae7abefaf567c7331a463cbe97fa4a1e0b0fac +SHA512: 2191eca379bc967bfa30fc11e1f9be97a0710f6d4da83e6f5f423132bb9f144a9866347ab2d0e9a1efd18d44980f96894ee3c199883ec877deacc1d6ef0d396e +Homepage: https://www.freedesktop.org/software/colord/ +Description: system service to manage device colour profiles -- runtime + colord is a system service that makes it easy to manage, install and generate + colour profiles to accurately colour manage input and output devices. + . + It provides a D-Bus API for system frameworks to query, a persistent data + store, and a mechanism for session applications to set system policy. + . + This package contains a gobject-based convenience library for programs to + interact with the colord system daemon. + +Package: libcolorhug2 +Architecture: amd64 +Version: 1.4.8-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: colord +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 134 +Depends: libc6 (>= 2.14), libcolord2 (>= 1.4.3), libglib2.0-0t64 (>= 2.80.0), libgusb2a (>= 0.1.1) +Filename: pool/libcolorhug2_1.4.8-3_amd64.deb +Size: 38318 +MD5sum: 7875e162a5161bf8a7c991080995367a +SHA1: 11ba417405e3cdabdd1ffcd418a76634cd6b87a4 +SHA256: 9788d12ff3b66451918b1689aca52d39ef09775b423fb46846bd2948cef7596d +SHA512: 3d7a7247933f40b1c2259d2b64b0adcefc28d60ddac4dbf8e8ae40f83dcffbe1c4a0ecd771d0a029ac8c9af58c4f1b0511998052ed30e81b002466049b9dffb9 +Homepage: https://www.freedesktop.org/software/colord/ +Description: library to access the ColorHug colourimeter -- runtime + libcolorhug is a gobject-based library for using the ColorHug display + colourimeter. It supports both reading values from the colourimeter and + device administration, such as firmware updates. + . + This package contains a gobject-based convenience library for programs to + interact with the ColorHug colourimeter. + +Package: libcrack2 +Architecture: amd64 +Version: 2.9.6-5.2build3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cracklib2 +Maintainer: Ubuntu Developers +Original-Maintainer: Jan Dittberner +Installed-Size: 144 +Depends: libc6 (>= 2.14) +Recommends: cracklib-runtime +Breaks: cracklib-runtime (<< 2.9.2-4) +Filename: pool/libcrack2_2.9.6-5.2build3_amd64.deb +Size: 27970 +MD5sum: f04230458b5c3dea610dbf8ed54c7e5b +SHA1: 5039bd47df3f51d5c9b19833a4816c0731748ffb +SHA256: 7236fa656d64c8d99fddf1bf108ecc9bb408e821d1bd4f684b1f0ac70467628c +SHA512: 6bf8aa4dce4cfaab86012a3378f660efd6373e35d280eaed631aac267ff1cf0c57b4e351f6e2be607a2fa2dde562c27fb19cb01d5daded985a4d81640c0606c9 +Homepage: https://github.com/cracklib/cracklib +Description: pro-active password checker library + Shared library for cracklib2 which contains a C function which may be + used in a passwd like program. The idea is simple: try to prevent + users from choosing passwords that could be guessed by crack by + filtering them out, at source. cracklib2 is NOT a replacement passwd + program. cracklib2 is a LIBRARY. + +Package: libcrypt-urandom-perl +Architecture: amd64 +Version: 0.55-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 57 +Depends: perl (>= 5.40.1-6build1), perlapi-5.40.1, libc6 (>= 2.25) +Filename: pool/libcrypt-urandom-perl_0.55-1_amd64.deb +Size: 14832 +MD5sum: 1e5f772569fdbfdecb0c8f7f922e91e2 +SHA1: d0baeb4c80cb68dbd09d17a27b62f139b77a0639 +SHA256: a243fe9d0c0a2cba1425031aca048fcc7dfc8a05ec13e59e4da498f9b56d593e +SHA512: bdcabefe8bf07ddfb682195e51a2e38b1b6ceb8ce144fde6042fcc9d2b076e6cc9614102bbb7d14900dc4e7d7e3dea716c3ad70e29a3c49b570e0945e1432f1a +Homepage: https://metacpan.org/release/Crypt-URandom +Description: module that provides non blocking randomness + Crypt::Urandom is intended to provide an interface to the strongest available + source of non-blocking randomness on the current platform. + . + Platforms currently supported are anything supporting /dev/urandom. + +Package: libcryptsetup12 +Architecture: amd64 +Version: 2:2.8.4-1ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: cryptsetup +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Cryptsetup Team +Installed-Size: 660 +Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.38), libdevmapper1.02.1 (>= 2:1.02.197), libjson-c5 (>= 0.15), libssl3t64 (>= 3.2.0), libuuid1 (>= 2.16) +Filename: pool/libcryptsetup12_2%3a2.8.4-1ubuntu4_amd64.deb +Size: 270892 +MD5sum: 4899915f140d2ac56ec5312518016d7d +SHA1: 6d73f12de3ee34dd88ee6acdc10b8cfe7f820c83 +SHA256: b391ec9f41abc8d303c0ac90105a69737f901d427f1c29a267346c0ad73fa56c +SHA512: 24d6f25d689891702b2b92e4711a3e9d7ae125c2fdc9232c367cda2838c1268818527a7247ce4bf620b2a718b1d1ecc8139a2e0f1e7f03561eb731553c45e48a +Homepage: https://gitlab.com/cryptsetup/cryptsetup +Description: disk encryption support - shared library + Cryptsetup provides an interface for configuring encryption on block + devices (such as /home or swap partitions), using the Linux kernel + device mapper target dm-crypt. It features integrated Linux Unified Key + Setup (LUKS) support. + . + This package provides the libcryptsetup shared library. + +Package: libctf-nobfd0 +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 323 +Depends: libc6 (>= 2.14), zlib1g (>= 1:1.2.0) +Breaks: libbinutils (<< 2.33.50.20191128-1~) +Replaces: libbinutils (<< 2.33.50.20191128-1~) +Filename: pool/libctf-nobfd0_2.46-3ubuntu2_amd64.deb +Size: 101990 +MD5sum: bbe480ddc9fbe3db69c92815810dbdb5 +SHA1: 099a0b3f04e227cd08119655a7fcc9934295e8ea +SHA256: 5ca038ae110ddf65e190b9fe88822592abd45cecba5001f3e4ce7692ca1f31be +SHA512: 5a9123a16509bec3f6e11988572f3e0db8b392b4b346cd81b2b6ce38278b42888edcfe596a89150462de311f7a68ad51bcccb645c13e2fe232f5cf9cb7c6a273 +Homepage: https://www.gnu.org/software/binutils/ +Description: Compact C Type Format library (runtime, no BFD dependency) + This package includes the libctf-nobfd shared library. The Compact C Type + Format (CTF) is a way of representing information about a binary program + +Package: libctf0 +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 244 +Depends: libbinutils (= 2.46-3ubuntu2), libc6 (>= 2.33), zlib1g (>= 1:1.2.0) +Filename: pool/libctf0_2.46-3ubuntu2_amd64.deb +Size: 100082 +MD5sum: f61cf32244e746c1bba63ae9daf41a66 +SHA1: fbd03409c8f06c9189f43d13ee7c7187be035007 +SHA256: 34b1757ce619720541c7e1e8d8f3aa506cb327731374e284ffb6ec872a2c566f +SHA512: 47a967e4182cd0be84c8056c9fead7023a0eb2346e040342799013485d3eab34b5c9cb78e2aa1f252d4484c41beafcb11d42db5c19817b38095ce320f01bb0f3 +Homepage: https://www.gnu.org/software/binutils/ +Description: Compact C Type Format library (runtime, BFD dependency) + This package includes the libctf shared library. The Compact C Type + Format (CTF) is a way of representing information about a binary program + +Package: libcue2 +Architecture: amd64 +Version: 2.2.1-4.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcue +Maintainer: Ubuntu Developers +Original-Maintainer: Jack Toh +Installed-Size: 58 +Depends: libc6 (>= 2.38) +Filename: pool/libcue2_2.2.1-4.2_amd64.deb +Size: 18362 +MD5sum: c84db59cea242ec3721000d448ee5892 +SHA1: 21c3fbf5e241346bc10bf085a74fa1950acce042 +SHA256: 6495164789f5e923a7cbb2dc8343a7e773fdce7210e0fcdb2df72c2629860365 +SHA512: e2fafd0ad75dc84c3452df0f3cd55c63516e6d39169233d5ce28548e7a76c8872c16bbebe7619cb9a8a527acba27ce4a3e87c206cb4fb50612b39d1d5e203038 +Homepage: https://github.com/lipnitsk/libcue +Description: CUE Sheet Parser Library + Libcue is intended to parse a so called cue sheet from a + char string or a file pointer. For handling of the parsed + data a convenient API is available. + +Package: libcups2t64 +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 707 +Provides: libcups2 (= 2.4.16-1ubuntu1.3) +Depends: libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libgnutls30t64 (>= 3.8.1), libgssapi-krb5-2 (>= 1.17), zlib1g (>= 1:1.2.0) +Suggests: cups-common +Breaks: libcups2 (<< 2.4.16-1ubuntu1.3) +Replaces: libcups2 +Filename: pool/libcups2t64_2.4.16-1ubuntu1.3_amd64.deb +Size: 268968 +MD5sum: 222d48cdb998071b1b4f9e9322f25314 +SHA1: 9c8b1b0b6cbb373735a0424598f26d1a9b5e64bb +SHA256: 2617a78cbd830310e31813420ea34159347f1121709d2f00c93a87fa666bfcda +SHA512: e5042f86f25037e37675ca09badd71d7fcc69f0b26be7825f4f623de6df6beef7ac736022dbe32ad9166508f67b0575c6497b483037af3099bd0bb883fb47848 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - Core library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the base shared libraries for CUPS. + +Package: libcupsfilters2-common +Architecture: all +Version: 2.1.1-0ubuntu5 +Priority: optional +Section: libs +Source: libcupsfilters +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 643 +Recommends: libcupsfilters2t64 (>= 2.1.1-0ubuntu5) +Breaks: cups-filters (<< 2.0~) +Replaces: cups-filters (<< 2.0~) +Filename: pool/libcupsfilters2-common_2.1.1-0ubuntu5_all.deb +Size: 244486 +MD5sum: 3896d8fb59109519f687519a650f8143 +SHA1: dac1ab915909c12b2976bda6c38d7f41dd5f5aef +SHA256: 36e59e4278b8308c32a6d3a20ddbd6f64a4b20196b5dfbdfcf3eff80de9a845e +SHA512: feb4e50c2ce491fcf2b9090114f6a59116fde1151ee9afeaadcdb2cf28e9adae775efb9b6f8092a257890bc1656d8a1790383a6c95cb51677165c2741895cb7b +Homepage: http://www.openprinting.org/ +Description: OpenPrinting libcupsfilters - Auxiliary files + This package contains system-architecture-independent auxiliary files + for libcupsfilters. These are character sets for the + cfFilterTextToPDF() filter function and banner/test page instruction + files and templates for the cfFilterBannerToPDF() filter function. + +Package: libcupsfilters2t64 +Architecture: amd64 +Version: 2.1.1-0ubuntu5 +Multi-Arch: same +Priority: optional +Section: libs +Source: libcupsfilters +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 844 +Provides: libcupsfilters2 (= 2.1.1-0ubuntu5) +Depends: libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libdbus-1-3 (>= 1.10), libexif12 (>= 0.6.21-1~), libfontconfig1 (>= 2.12.6), libgcc-s1 (>= 3.3.1), libjpeg8 (>= 8c), liblcms2-2 (>= 2.2+git20110628), libpng16-16t64 (>= 1.6.46), libpoppler-cpp3 (>= 26.01.0), libqpdf30 (>> 12.3.2~), libstdc++6 (>= 13.1), libtiff6 (>= 4.0.3), libcupsfilters2-common (>= 2.1.1-0ubuntu5) +Breaks: libcupsfilters2 (<< 2.1.1-0ubuntu5) +Replaces: libcupsfilters2 +Filename: pool/libcupsfilters2t64_2.1.1-0ubuntu5_amd64.deb +Size: 323796 +MD5sum: 658980fa9e26a3f321fbbb87bdcf17fb +SHA1: 5f5eebdf528796582d14062e92e4366b67d71428 +SHA256: 5987ad8579515ddda3b19d5cb8316dd93fd2bf0d2f138bb3f46b59d6f4cb3575 +SHA512: 81f57af3a076a1421f23f8c5715ff1905b03a10661ad0e682268c64114f4d444e6ffaeb34d4ffbd59b759449d03244974f47d3d9ceba876b366a680b45c5c45b +Homepage: http://www.openprinting.org/ +Description: OpenPrinting libcupsfilters - Shared library + This library contains filter functions doing all kinds of file format + conversion used for printing and scanning, to be used in Printer + Applications, CUPS filters, printer drivers, ... also other commonly + used functions for handling print data, like color space/depth + conversion, dithering, IPP message parsing, ... are available. + +Package: libcupsimage2t64 +Architecture: amd64 +Version: 2.4.16-1ubuntu1.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 50 +Provides: libcupsimage2 (= 2.4.16-1ubuntu1.3) +Depends: libcups2t64 (= 2.4.16-1ubuntu1.3), libc6 (>= 2.2.5) +Recommends: libcupsfilters2 +Breaks: libcupsimage2 (<< 2.4.16-1ubuntu1.3) +Replaces: libcupsimage2 +Filename: pool/libcupsimage2t64_2.4.16-1ubuntu1.3_amd64.deb +Size: 6724 +MD5sum: aa14d7b50e970e71de9de3455dd934bf +SHA1: 66fd4b03ae63d27c682ff5fec29382341bd433e3 +SHA256: e84b07b6514be97845303ae010bd759280873bd9b5ce6ac1bec23ee445cc3850 +SHA512: 7b9f0af15c496b667bb6bea687f476f840749e44491f5721ec50cf01df32c27d29092bf75bdac9c1e6f0af846976423484777065e1018f3a82eff9942e9a0261 +Homepage: https://github.com/OpenPrinting/cups/ +Description: Common UNIX Printing System(tm) - Raster image library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the image libraries for handling the CUPS + raster format. + +Package: libcurl3t64-gnutls +Architecture: amd64 +Version: 8.18.0-1ubuntu2.5 +Multi-Arch: same +Priority: optional +Section: libs +Source: curl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Curl Maintainers +Installed-Size: 999 +Provides: libcurl3-gnutls (= 8.18.0-1ubuntu2.5) +Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.34), libgnutls30t64 (>= 3.8.6), libgssapi-krb5-2 (>= 1.17), libidn2-0 (>= 2.0.0), libldap2 (>= 2.6.2), libnettle8t64, libnghttp2-14 (>= 1.50.0), libpsl5t64 (>= 0.16.0), librtmp1 (>= 2.3), libssh2-1t64 (>= 1.11.1), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.3.4) +Recommends: ca-certificates +Breaks: libcurl3-gnutls (<< 8.18.0-1ubuntu2.5) +Replaces: libcurl3-gnutls +Filename: pool/libcurl3t64-gnutls_8.18.0-1ubuntu2.5_amd64.deb +Size: 418616 +MD5sum: 3dfb06c50afa674a5467c6dcb460c940 +SHA1: 7cb3fe3bdf71301258c14f3267a94d05ab6843ed +SHA256: 2b0b6cbb1f025ba565baff58f28a24da6ecaccf8848ec068ca16498362aa1a33 +SHA512: 9311d3925b9bcd61ee0144c16ea0f6ee8b8074433e636c4ff762d48bbaa3e8c67cde7279034f3459684e09a548d02cb19e995c30b6dde03b2a429ec6886d40c7 +Homepage: https://curl.se/ +Description: easy-to-use client-side URL transfer library (GnuTLS flavour) + libcurl is an easy-to-use client-side URL transfer library, supporting DICT, + FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, + RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. + . + libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP + form based upload, proxies, cookies, user+password authentication (Basic, + Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling + and more! + . + libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported, + fast, thoroughly documented and is already used by many known, big and + successful companies and numerous applications. + . + SSL support is provided by GnuTLS. + +Package: libdaemon0 +Architecture: amd64 +Version: 0.14-7.1ubuntu5 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdaemon +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 51 +Depends: libc6 (>= 2.38) +Filename: pool/libdaemon0_0.14-7.1ubuntu5_amd64.deb +Size: 13256 +MD5sum: d260f8d4139d3eec5a2e6ef08f47497d +SHA1: 8356e9b8d985192a840616c202352e1f4e2d9841 +SHA256: 14e59626de6a35cffc5dcac463ca4fbb1c809ff3b81bca267c1edb8161fef7f7 +SHA512: 5bf3b3fed608e0269e7dfc056b09a59de154d0c14868dd1dcb42755b48328a6059a7fe713d992834b5161dd834424a5defdb8b3da0283988f8de8bcccb52183f +Homepage: http://0pointer.de/lennart/projects/libdaemon/ +Description: lightweight C library for daemons - runtime library + libdaemon is a lightweight C library which eases the writing of UNIX daemons. + It consists of the following parts: + . + * Wrapper around fork() for correct daemonization of a process + * Wrapper around syslog() for simple log output to syslog or STDERR + * An API for writing PID files + * An API for serializing signals into a pipe for use with select() or poll() + * An API for running subprocesses with STDOUT and STDERR redirected to syslog + . + Routines like these are included in most of the daemon software available. It + is not simple to get these done right and code duplication is not acceptable. + . + This package includes the libdaemon run time shared library. + +Package: libdata-dump-perl +Architecture: all +Version: 1.25-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 64 +Depends: perl:any +Filename: pool/libdata-dump-perl_1.25-1_all.deb +Size: 25924 +MD5sum: c2c12d73d0e735ef0cff4a902cc8887a +SHA1: 06fc69959420b6cf0c34749cd166c1ac1330a730 +SHA256: 91514d4b78329ea1bdf6f964613149d5b53ceaf90627998d65f13e306712f452 +SHA512: 04b3dcd0f711d5d0919f8e1c4efcd9b75dd621597828b237b590a73c169f40d231c6ac229de7373efb0fe05306f6b599e0ab5a99d9846a295e9237c1eaf49d91 +Homepage: https://metacpan.org/release/Data-Dump +Description: Perl module to help dump data structures + Data::Dump provides a single function called dump that takes a list of values + as its argument and produces a string as its result. The string contains Perl + code that, when evaled, produces a deep copy of the original arguments. The + string is formatted for easy reading. + . + If called in void context, the dump is printed on standard error instead of + being returned. If you don't like importing a function that overrides Perl's + not-so-useful builtin, then you can also import the same function as "pp" + (the mnemonic for "pretty-print"). + +Package: libdatrie1 +Architecture: amd64 +Version: 0.2.14-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdatrie +Maintainer: Ubuntu Developers +Original-Maintainer: Theppitak Karoonboonyanan +Installed-Size: 53 +Depends: libc6 (>= 2.14) +Filename: pool/libdatrie1_0.2.14-1_amd64.deb +Size: 19776 +MD5sum: 194f67ecfddab757263fda37d428d657 +SHA1: 12b85447e8d525f41d99fdd1deb8559420eca76b +SHA256: 1ba5a9190119370912ec5955c8129cdf2780a098ed6c80e9ecca05cc515bd039 +SHA512: 6397804275d967e91389d5ffa30af124ab5de9b085954a9faf9ffd5b437b18c411f0b202cad444eb8b405a901b07ca3412449aab96a4aca5d5a6866088c4b852 +Homepage: https://linux.thai.net/projects/libthai +Description: Double-array trie library + This package provides shared libraries needed to run programs that use the + datrie library. It is usually automatically installed. + +Package: libdbus-1-3 +Architecture: amd64 +Version: 1.16.2-2ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: dbus +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 420 +Depends: libc6 (>= 2.38), libsystemd0 +Recommends: dbus +Filename: pool/libdbus-1-3_1.16.2-2ubuntu4_amd64.deb +Size: 186306 +MD5sum: 14a9db155fd9fd996d7b952d620d51d9 +SHA1: f1b1d8c2b92279307dc706b7d0c437ed88fb79fc +SHA256: af7be2be588d15a16c696ab43ba3e92bd5f9a6850e8780234059b02a67716e58 +SHA512: 8b3070aca3fb964d7a3518f40afe0256d6763581a700b0133d201b901c20d3c725ec8d8c413f0226e361065d4d3e534b8dc5c0f367dd4908a78ec79ba4765d21 +Homepage: https://dbus.freedesktop.org/ +Description: simple interprocess messaging system (library) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + D-Bus supports broadcast messages, asynchronous messages (thus + decreasing latency), authentication, and more. It is designed to be + low-overhead; messages are sent using a binary protocol, not using + XML. D-Bus also supports a method call mapping for its messages, but + it is not required; this makes using the system quite simple. + . + It comes with several bindings, including GLib, Python, Qt and Java. + . + The message bus daemon can be found in the dbus-daemon package. + +Package: libdbusmenu-glib4 +Architecture: amd64 +Version: 18.10.20180917~bzr492+repack1-4build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdbusmenu +Maintainer: Ubuntu Developers +Original-Maintainer: The Ayatana Packagers +Installed-Size: 136 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +Size: 43056 +MD5sum: 31b53ad5fc5ee315781df69d5a1b75bb +SHA1: 08e1121edd79436c9578dab7af903a3b9236e0a3 +SHA256: 92e0340601b2cae7bc3780f309bc7d1bef2812413a03a0430e92da638df8be15 +SHA512: 6baef84426d58434c5c27aa4efcf4e1736f844774cc45515cbfd7947baa01258d729822ddd27d21de481f829f78d5ab58e36f73122907652e9d5fbddbe7e6437 +Homepage: https://launchpad.net/dbusmenu +Description: library for passing menus over DBus + libdbusmenu passes a menu structure across DBus so that a program can + create a menu simply without worrying about how it is displayed on the + other side of the bus. + . + This package contains shared libraries to be used by applications. + +Package: libdbusmenu-gtk3-4 +Architecture: amd64 +Version: 18.10.20180917~bzr492+repack1-4build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdbusmenu +Maintainer: Ubuntu Developers +Original-Maintainer: The Ayatana Packagers +Installed-Size: 102 +Depends: libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.4), libdbusmenu-glib4 (>= 0.5.90), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.16.2), libpango-1.0-0 (>= 1.14.0) +Filename: pool/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +Size: 27974 +MD5sum: cc4dde889f55ca256d5b9e816c301f9e +SHA1: e66918a666e65e373ca9c87f0485408df362e115 +SHA256: 0e36b3dfba6349cd8d35bf59a64049ed43efc88e9f12e4bebd9d3093889ecba5 +SHA512: 8ddc08b4ace47de8ec928939ec95486b2e863d91fc4bb1be51aaba94337390aca474a5653d37850b846dceb7f04163a2d6e34085f8889fd2b44dad95fcb98ce2 +Homepage: https://launchpad.net/dbusmenu +Description: library for passing menus over DBus - GTK-3+ version + libdbusmenu passes a menu structure across DBus so that a program can + create a menu simply without worrying about how it is displayed on the + other side of the bus. + . + This package contains shared libraries to be used by GTK-3+ applications. + +Package: libdconf1 +Architecture: amd64 +Version: 0.49.0-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: dconf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 103 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libdconf1_0.49.0-4_amd64.deb +Size: 40516 +MD5sum: 04b02805404724eafaaed614d2992e5c +SHA1: b11c97020951fa295423538f023b8873139fe9c4 +SHA256: d7a12b52a4803bf3e4c270c9367db4ac20f03412a9dc948e0272348889a151bd +SHA512: 6dcfac5e926601969992fcba96b9f8471bde6899d12768da6ae03cdbd033796637b468aab190b121180e7984c0fbcc88d109df326d8bf0aa8f1bbd756cd43c77 +Homepage: https://wiki.gnome.org/Projects/dconf +Description: simple configuration storage system - runtime library + DConf is a low-level key/value database designed for storing desktop + environment settings. + . + This package contains the runtime library. + +Package: libdebuginfod-common +Architecture: all +Version: 0.194-4 +Multi-Arch: foreign +Priority: optional +Section: devel +Source: elfutils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Elfutils Maintainers +Installed-Size: 49 +Pre-Depends: debconf +Depends: debconf (>= 0.5) | debconf-2.0, ucf +Filename: pool/libdebuginfod-common_0.194-4_all.deb +Size: 12342 +MD5sum: 24f0db9683cb46f8a1303bdebbbc339a +SHA1: c79be9e0dd5d1eb5a9ae084c8ee5b402b848b769 +SHA256: 151b5cfce8702069ef2caaa09bba3af4e28415fcb87bc948465747a370402b0b +SHA512: 243d40ae467000af31cccce46868e984886313183a4977216734d79f487e8ccfb0f5979f83026a29b07d3365ebff26600ee5bb01c469d36a8c5b7558f47ebae5 +Homepage: https://sourceware.org/elfutils/ +Description: configuration to enable the Debian debug info server + This package asks if it should enable use of the Debian debug info + server with debugging tools that use libdebuginfo such as GDB. + . + When this is allowed by the sysadmin, a snippet will be added to the + shell configuration. You will need to restart your shell after + installing this package before the snippet will work. + . + The Debian debug info server will be contacted every time debugging + tools attempt to look up debug info for binaries or libraries but the + server does not log requests for debug info. + . + The Debian debug info server uses https to securely transfer debugging + files but does not offer OpenPGP signing of debug info. + +Package: libdebuginfod1t64 +Architecture: amd64 +Version: 0.194-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: elfutils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Elfutils Maintainers +Installed-Size: 78 +Provides: libdebuginfod1 (= 0.194-4) +Depends: libc6 (>= 2.38), libcurl3t64-gnutls (>= 7.28.0), libelf1t64 (= 0.194-4), libjson-c5 (>= 0.15), libdw1t64 (= 0.194-4), libdebuginfod-common (>= 0.194-4) +Breaks: libdebuginfod1 (<< 0.194-4) +Replaces: libdebuginfod1 +Filename: pool/libdebuginfod1t64_0.194-4_amd64.deb +Size: 20688 +MD5sum: 3dbdcbfc76c3ed934287a61b98ed59ea +SHA1: f988ba3ce7b4b87ed82afec24bec561af8b4f141 +SHA256: 2d1eacbaf69feb2ba6a775e53606b2bf85cd975f7a3832d4d46d414443241b6e +SHA512: d76bd3ad75c71cab3a5b1436adf1289a44c9268922f90a87484231dd3206ff65e599b0a849818029477aa87e2193c806bd636ce331d53b7ab4eb9362b79bcb47 +Homepage: https://sourceware.org/elfutils/ +Description: library to interact with debuginfod (development files) + The libdebuginfo1 package provides a library with an interface to interact + with debuginfod. + . + This library is part of elfutils. + +Package: libdecor-0-0 +Architecture: amd64 +Version: 0.2.5-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdecor-0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SDL packages maintainers +Installed-Size: 59 +Depends: libc6 (>= 2.38), libwayland-client0 (>= 1.20.0) +Recommends: default-libdecor-0-plugin-1 | libdecor-0-plugin-1 +Conflicts: libdecor +Replaces: libdecor +Filename: pool/libdecor-0-0_0.2.5-1_amd64.deb +Size: 16464 +MD5sum: d42f13246bdebb561e8e95ffa7fd1aaa +SHA1: 9cadad1a7874fe7ac2491f56668fbc3fa94cb36a +SHA256: 23ea4cd788fe5bf9883fd125dd1ac973db807b9a888dae70abde5bb9d2584de1 +SHA512: 5fe08b841018a41e81ad1a30e371d2bf7a6d661b7fce5a4444270f96478cf136dfacd85812a56076a471540afa06eb0973383b51a44e1ae79777002dd7b35061 +Homepage: https://gitlab.freedesktop.org/libdecor/libdecor +Description: client-side window decoration library + libdecor is a library that can help Wayland clients draw window + decorations for them. It aims to provide multiple backends that implements the + decoration drawing. + . + This package contains the runtime library. + +Package: libdecor-0-plugin-1-gtk +Architecture: amd64 +Version: 0.2.5-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdecor-0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SDL packages maintainers +Installed-Size: 83 +Provides: default-libdecor-0-plugin-1, libdecor-0-plugin-1 +Depends: libc6 (>= 2.38), libcairo2 (>= 1.14.0), libdbus-1-3 (>= 1.10), libdecor-0-0 (= 0.2.5-1), libglib2.0-0t64 (>= 2.12.0), libgtk-3-0t64 (>= 3.19.12), libwayland-client0 (>= 1.20.0), libwayland-cursor0 (>= 1.0.2) +Conflicts: libdecor-plugin-gtk +Replaces: libdecor-plugin-gtk +Filename: pool/libdecor-0-plugin-1-gtk_0.2.5-1_amd64.deb +Size: 22610 +MD5sum: 81e5c0fedf9d8ac2925983741138ddc2 +SHA1: 32eb6dae78d29f5f768a6a65b2321ccbeeb8169a +SHA256: b4cfcd3a52fe6863fd8fba353fbac279772512333877ac5d7043932da7a85a9f +SHA512: bf0065051653810c9dae7e57c3d423a65a23d8feec5828c6eb70884ed1dbef17bc3c1210916b78fce8f9363edc9a6f446526150443228306e4d090fe96d752ad +Homepage: https://gitlab.freedesktop.org/libdecor/libdecor +Description: libdecor decoration plugin using GTK + libdecor is a library that can help Wayland clients draw window + decorations for them. It aims to provide multiple backends that implements the + decoration drawing. + . + This package contains a backend that draws window decorations using GTK. + +Package: libdee-1.0-4 +Architecture: amd64 +Version: 1.2.7+17.10.20170616-8build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: dee +Maintainer: Ubuntu Developers +Original-Maintainer: Kartik Mistry +Installed-Size: 300 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libicu78 (>= 78.1-1~) +Breaks: libdee-1.0-1 (<< 0.5.22-1) +Replaces: libdee-1.0-1 +Filename: pool/libdee-1.0-4_1.2.7+17.10.20170616-8build1_amd64.deb +Size: 86240 +MD5sum: b5a308e1273019d455d35dddfcec4860 +SHA1: 08c503fe7998eef2ba207228ff32fcc6b1da6a85 +SHA256: 8d42f4debd53f4cfc1ccd53231fce9988ab214dd5df842f4672308afee29ab98 +SHA512: 340ddb2f3013c60f12776f091a4dd269cb1edd149c10d3b62609d07e2684fd1410ae1ecc6fd832aae0dd90a046ac08873ec0d75e013680af970a51afd4643db2 +Homepage: https://launchpad.net/dee +Description: Model to synchronize multiple instances over DBus - shared lib + libdee is a shared library that provides objects that help having multiple + instances communicating over DBus. + . + This package contains shared libraries to be used by applications. + +Package: libdeflate0 +Architecture: amd64 +Version: 1.23-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdeflate +Maintainer: Ubuntu Developers +Original-Maintainer: Deflate Team +Installed-Size: 107 +Depends: libc6 (>= 2.14) +Filename: pool/libdeflate0_1.23-2ubuntu1_amd64.deb +Size: 51702 +MD5sum: cc4e430ed5e114b24a8c06be9b9ed6e3 +SHA1: 0a15dcecc3db652594efdf8b00eea839dd2fc603 +SHA256: 40ee517cffd3730405be6ae30826533bec0ddf8773bb7ac2cccd22a57acafc25 +SHA512: 68bb63cdcfe3a0105b74400a18ef3d185d1ccbe5afa21a7806f5b3e5eac4687a0661865668df380551f1abddb530eb17f6b642f2f596b76cf6d2672dc399d4d5 +Homepage: https://github.com/ebiggers/libdeflate +Description: fast, whole-buffer DEFLATE-based compression and decompression + The supported formats are: + * DEFLATE (raw) + * zlib (a.k.a. DEFLATE with a zlib wrapper) + * gzip (a.k.a. DEFLATE with a gzip wrapper) + . + libdeflate is heavily optimized. It is significantly faster than the zlib + library, both for compression and decompression, and especially on x86 + processors. In addition, libdeflate provides optional high compression modes + that provide a better compression ratio than the zlib's "level 9". + +Package: libdevmapper1.02.1 +Architecture: amd64 +Version: 2:1.02.205-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: lvm2 (2.03.31-2ubuntu3) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian LVM Team +Installed-Size: 484 +Depends: libc6 (>= 2.38), libselinux1 (>= 3.1~), libudev1 (>= 183) +Recommends: dmsetup (>= 2:1.02.205-2ubuntu3~) +Filename: pool/libdevmapper1.02.1_2%3a1.02.205-2ubuntu3_amd64.deb +Size: 142030 +MD5sum: ff2368cf432c19a8329be978b3401b30 +SHA1: 788bc1576dad2d0ce99e806d2f8821c350b1db26 +SHA256: 679251083dfdab47493131744496aac22a027104cce5617df890416891352b7d +SHA512: d95ebae1e9f7fc74bff4433f37ba49224ce2fe6a6b194c605f4e285a7bd3ad45aea26e5182aa854808d9bbe2c58ead3fd8a1e6d4c5ce3999f128d5fc50974889 +Homepage: https://sourceware.org/lvm2/ +Description: Linux Kernel Device Mapper userspace library + The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management) + Team's implementation of a minimalistic kernel-space driver that handles + volume management, while keeping knowledge of the underlying device layout + in user-space. This makes it useful for not only LVM, but software raid, + and other drivers that create "virtual" block devices. + . + This package contains the (user-space) shared library for accessing the + device-mapper; it allows usage of the device-mapper through a clean, + consistent interface (as opposed to through kernel ioctls). + +Package: libdex-1-1 +Architecture: amd64 +Version: 1.1.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdex +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 217 +Depends: libatomic1 (>= 4.8), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.87), liburing2 (>= 2.3) +Filename: pool/libdex-1-1_1.1.0-1_amd64.deb +Size: 70172 +MD5sum: 41121e55d1d14ceb97f460568275f2a0 +SHA1: cfb5a261f4ca5eb93e91d1e893d5611433d3dc9b +SHA256: 17a112de72b8e45083d0a1cb05704d6ba42930ef5ca1cb1bd486b17a7e2de10b +SHA512: 75b07beaa7c5c350859aae1846280c91290eaccf1e1dd08fe8ea61764e400a62a4ed8a734ed5932345d60c2d1648cb4e30e422644361cc910797a4e4a7eab0e3 +Homepage: https://gitlab.gnome.org/GNOME/libdex +Description: Library for deferred execution + Dex is a library supporting "Deferred Execution" with the explicit goal of + integrating with GNOME and GTK-based applications. It provides primatives + for supporting futures in a variety of ways with both read-only and writable + views. Additionally, integration with existing asynchronous-based APIs is + provided through the use of wrapper promises. + . + "Fibers" are implemented which allows for writing synchronous looking code + which calls asynchronous APIs from GIO underneath. + +Package: libdhash1t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 36 +Provides: libdhash1 (= 0.6.2-3build1) +Depends: libc6 (>= 2.14) +Breaks: libdhash1 (<< 0.6.2-3build1) +Replaces: libdhash1 +Filename: pool/libdhash1t64_0.6.2-3build1_amd64.deb +Size: 8900 +MD5sum: d6c6db34a538d7fdf1a138bcb9747f10 +SHA1: 7c1e30ec22f6396dc47272c2a33c2cc19f54d325 +SHA256: 80b86c174c04d4267f143cc66ddec5ba93fb06224636ada6ea2055e39d9ed6a1 +SHA512: ed3ce3052ff4c7b981f6fdb8952d7311d34c9d02415be09716bc0ca0edc52a1fff92ffa114e386e57a83b6644cfbb8ff90469ee873d2a1131a0a6687583bb523 +Homepage: https://github.com/SSSD/ding-libs +Description: Dynamic hash table + A hash table which will dynamically resize to achieve optimal storage & access + time properties. + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: libdisplay-info3 +Architecture: amd64 +Version: 0.3.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdisplay-info +Maintainer: Ubuntu Developers +Original-Maintainer: Marc Dequènes (Duck) +Installed-Size: 260 +Depends: libc6 (>= 2.27) +Filename: pool/libdisplay-info3_0.3.0-1_amd64.deb +Size: 87808 +MD5sum: faf4f76c3391e03b4523c0ccb7ae6980 +SHA1: 0999612dc47a8c60de942f103db77cf65e8bc885 +SHA256: 91ab4717cc8cf4c6c591970e1ad165aace9c91f6283c8b5a2652ceebf571ccea +SHA512: 53b34ef059aff9fa678b8c29210626b84d5f8d635a35593c3d10502d827bda19d716cd5dc70ee8c7705eb209dfd43cbdcf4bbaee927df6d971cf2e7ded72cbc6 +Homepage: https://gitlab.freedesktop.org/emersion/libdisplay-info +Description: EDID and DisplayID library (shared library) + This library parse EDID and DisplayID and focus on: + * Providing a set of high-level, easy-to-use, opinionated functions as well + as low-level functions to access detailed information. + * Simplicity and correctness over performance and resource usage. + * Well-tested and fuzzed. + +Package: libdjvulibre-text +Architecture: all +Version: 3.5.29-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: djvulibre +Maintainer: Ubuntu Developers +Original-Maintainer: Barak A. Pearlmutter +Installed-Size: 340 +Replaces: libdjvulibre15 +Filename: pool/libdjvulibre-text_3.5.29-1_all.deb +Size: 50558 +MD5sum: ea0074d5ba3cad9e7d7e7e45beb2b298 +SHA1: b3566df02c8624376cfc501ff93eda900557e7ca +SHA256: 54300431ee2e613382946baddc01ecd6135bb9d086ec914d0a727b8c14ce497b +SHA512: 8156c676efe05565637be86ad0947e11e763346e3543fd98ea524307de34a10817f26db77c12d787028df5b11e6399f10255ba04c65c82bc8a4165ae7d8316ff +Homepage: https://djvu.sourceforge.net/ +Description: Linguistic support files for libdjvulibre + Runtime linguistic support files for the libdjvulibre library. + +Package: libdjvulibre21 +Architecture: amd64 +Version: 3.5.29-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: djvulibre +Maintainer: Ubuntu Developers +Original-Maintainer: Barak A. Pearlmutter +Installed-Size: 1742 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libjpeg8 (>= 8c), libstdc++6 (>= 14), libdjvulibre-text (>= 3.5.29-1) +Conflicts: libdjvulibre1 +Replaces: libdjvulibre1, libdjvulibre15 +Filename: pool/libdjvulibre21_3.5.29-1_amd64.deb +Size: 646524 +MD5sum: 2b685297326537a62980b097817f862d +SHA1: cef4b0476278ea1cd697718af015e6dd874b3ca5 +SHA256: c0a3ffd95125ef0f12b4c38993f0485738f3a97a4ecfc663aae6b274b4384b0b +SHA512: bece52fd7ae13e914e5c288434d98282f8fc56a7f1efe29597d430a9518fdff727e2e37a24a00c55915c9e0b3ac4dd88208253f1dda00486cb90e773e39106f2 +Homepage: https://djvu.sourceforge.net/ +Description: Runtime support for the DjVu image format + DjVu runtime library. + +Package: libdotconf0 +Architecture: amd64 +Version: 1.4.1-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: dotconf +Maintainer: Ubuntu Developers +Original-Maintainer: Andreas Tille +Installed-Size: 48 +Depends: libc6 (>= 2.38) +Filename: pool/libdotconf0_1.4.1-1build1_amd64.deb +Size: 14772 +MD5sum: 3ec6c554f5292e87ca666564018540e7 +SHA1: ed9c9f433921f925302f0e952c0cca94a3839d55 +SHA256: 30a3316c7a9323238d019a01f37420c96ef8c8d73d3df0ecbe5e8652882821a0 +SHA512: d2e312c715687525461ec220c9a31c7483744c558fe89db34acd0c0cd236bfecdd5ed607ea207b628da176b5177c980e9420482f90c92a4cf372e58f5795877a +Homepage: https://github.com/williamh/dotconf +Description: Configuration file parser library - runtime files + dot.conf is a simple-to-use and powerful configuration-file parser + library written in C. The configuration files created for dot.conf + look very similar to those used by the Apache Webserver. Even + Container-Directives known from httpd.conf can easily be used in the + exact same manner as for Apache-Modules. It supports various types of + arguments, dynamically loadable modules that create their own + configuration options on-the-fly, a here-documents feature to pass + very long ARG_STR data to your app, and on-the-fly inclusion of + additional config files. + +Package: libdrm-amdgpu1 +Architecture: amd64 +Version: 2.4.131-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 72 +Depends: libc6 (>= 2.38), libdrm2 (>= 2.4.108) +Filename: pool/libdrm-amdgpu1_2.4.131-1_amd64.deb +Size: 23178 +MD5sum: c387b3bfd9add4a02bb02cd3999b8cb7 +SHA1: 714830c60f872b56a33bfc4cb9e0a092f368c895 +SHA256: f992d3b87be69d160d433626e2144f6446946143cb83bdc71adef71766783de0 +SHA512: 46af49278b522bf2c6d3f54b173cf0974ed0a5c7d64f2fcca03fcbd626f19827877410e8fcd2197eecbe636d504ad90b95a446a8d68dfcca9344915a93a40452 +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to amdgpu-specific kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + +Package: libdrm-common +Architecture: all +Version: 2.4.131-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 41 +Filename: pool/libdrm-common_2.4.131-1_all.deb +Size: 9774 +MD5sum: 05551c9d99a272316f5a157d5168759e +SHA1: 79b4b6c061f70c10f545ef5ddf99196251d7e499 +SHA256: a32b8d623c04310d049cde28cdbbd339575cdc26c8dc741d7de708a954eff528 +SHA512: 6189c8e605821a6536b80030badd7e1a4a0caf9fb864f25ecf30ac5bcc9466f1a92966357162cfb2c726753d6f94ee0ab2ca30034860211e4fe1fc7e9c586302 +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to kernel DRM services -- common files + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + . + This package provides common files for libdrm. + +Package: libdrm-intel1 +Architecture: amd64 +Version: 2.4.131-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 173 +Depends: libc6 (>= 2.34), libdrm2 (>= 2.4.108), libpciaccess0 +Filename: pool/libdrm-intel1_2.4.131-1_amd64.deb +Size: 66680 +MD5sum: 32f54572ce2f126761ac97c36e4ff9c5 +SHA1: 2035583dea9d91cc49e710a930f15e6d6c0ed4ee +SHA256: 77411c3b93c8756862a18ccaa4413a65777f40819abdd1468954ba859c8aa740 +SHA512: 7f2373dc36609b1e7e53c69593de06b6b7a28037315e61e9c0943e57dfea06259373fae0ae463a5fe01c0e93e9ad6a3f5241506295a992b7aadd2c3b35d39960 +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to intel-specific kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + +Package: libdrm-nouveau2 +Architecture: amd64 +Version: 2.4.131-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 62 +Depends: libc6 (>= 2.38), libdrm2 (>= 2.4.108) +Filename: pool/libdrm-nouveau2_2.4.131-1_amd64.deb +Size: 18808 +MD5sum: 7be04e14096e4ea5c21b6872d396054d +SHA1: f5ce6f11ca1baa0deca9a3fb156c1ee276a06c95 +SHA256: 18d713650e23febe76e127b7419e49eded0ecb83bad4ec8050cd6a11a4adcb71 +SHA512: 010fda5994590d3217a524c9a4860bd584f9505efcc2453b8b02cf36c1ffd7799cabc063b0266fc12641911e47822d5035ba919945c6370dc85c510e26b07f11 +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to nouveau-specific kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + +Package: libdrm-radeon1 +Architecture: amd64 +Version: 2.4.131-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 74 +Depends: libc6 (>= 2.4), libdrm2 (>= 2.4.108) +Filename: pool/libdrm-radeon1_2.4.131-1_amd64.deb +Size: 21466 +MD5sum: c0cd6507623f9ba8de2ef7fdf835ec81 +SHA1: 05dcec3839c73e43429cd6023171de7e5e3c51dd +SHA256: 5497783eae2652128ea00f1f0aeac940ab5b079137191bf6d58d789d4908e841 +SHA512: 2eeef272f9097993c26eb5f93a41f7b1fa147b559588d600281058f7ab8f46db8ea765e6c8f9575d4adef99e19f9422665aac7e8b4fd2e03ab349f4764e80eb8 +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to radeon-specific kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + +Package: libdrm2 +Architecture: amd64 +Version: 2.4.131-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdrm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 119 +Depends: libdrm-common (>= 2.4.131-1), libc6 (>= 2.38) +Filename: pool/libdrm2_2.4.131-1_amd64.deb +Size: 42304 +MD5sum: 84b54630ff177a59765e6a0afe5f4e2a +SHA1: 3084199ad5dd53e7db930a58a78d417b06f2e533 +SHA256: b87e6f715d0795a88b53fbe268004a1acbd0d728da0cc0ab9108aff5ab4e1929 +SHA512: 09107f21859472cf22da7ff60fbb349047a9f85d294db44d6de6632435dd73bf00468e45b8b1ff6ccfdda10e002533c31045be98916e902832a873673606b1eb +Homepage: https://gitlab.freedesktop.org/mesa/drm/ +Description: Userspace interface to kernel DRM services -- runtime + This library implements the userspace interface to the kernel DRM + services. DRM stands for "Direct Rendering Manager", which is the + kernelspace portion of the "Direct Rendering Infrastructure" (DRI). + The DRI is currently used on Linux to provide hardware-accelerated + OpenGL drivers. + . + This package provides the runtime environment for libdrm. + +Package: libduktape207 +Architecture: amd64 +Version: 2.7.0+tests-0ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: duktape +Maintainer: Ubuntu Developers +Original-Maintainer: Debian IoT Maintainers +Installed-Size: 324 +Depends: libc6 (>= 2.38) +Filename: pool/libduktape207_2.7.0+tests-0ubuntu4_amd64.deb +Size: 143678 +MD5sum: 666bd344f87b506d7671dd9ef5678ca4 +SHA1: 889fe7f6f2dda32e38fac01b81a734aa5aca6c3f +SHA256: cf32ab1bc85d6426743ac9f4769d4489519e3ee9967d85d5662f0d52d024712f +SHA512: a97fe51c9b59451641cf33361d65d37946b900a6c2a35092b007edeb3b2ae1f241fb359f9b09ccc11c1dde8edd4bfb5f3c68369c30f880311cc134b38e333653 +Homepage: https://duktape.org +Description: embeddable Javascript engine, library + Duktape is an embeddable Javascript engine, with a focus on portability + and compact footprint. + . + Duktape is easy to integrate into a C/C++ project: add duktape.c, duktape.h, + and duk_config.h to your build, and use the Duktape API to call Ecmascript + functions from C code and vice versa. + . + This package contains the shared library. + +Package: libdv4t64 +Architecture: amd64 +Version: 1.0.0-17.1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libdv +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 166 +Provides: libdv4 (= 1.0.0-17.1build2) +Depends: libc6 (>= 2.38) +Suggests: libdv-bin, oss-compat +Breaks: libdv4 (<< 1.0.0-17.1build2) +Replaces: libdv4 +Filename: pool/libdv4t64_1.0.0-17.1build2_amd64.deb +Size: 64286 +MD5sum: ff097eebd47b35da5fd76757b2a21771 +SHA1: a04c4e8a2077c1b3a20f8d1b7302f38fe6392a1d +SHA256: 1574d30cd72fdb2b26c8c06fd20c69d7f65bb39e4d1ca5db885069202cddb1ee +SHA512: d5d3a53085f61f8672dfc04429642d41f5097ddb2bf4dc3ee7cfcc241266386bf6143617abd99c6ea3457b79252e8f3c81c2d0fd36a7d94802ee0371d24dccf7 +Homepage: http://libdv.sourceforge.net/ +Description: software library for DV format digital video (runtime lib) + The Quasar DV Codec (libdv) is a software decoder for DV format video, as + defined by the IEC 61834 and SMPTE 314M standards. DV is the encoding format + used by consumer-grade digital camcorders. + . + This package contains the library needed to run executables using libdv. + +Package: libdw1t64 +Architecture: amd64 +Version: 0.194-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: elfutils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Elfutils Maintainers +Installed-Size: 831 +Provides: libdw1 (= 0.194-4) +Depends: libbz2-1.0, libc6 (>= 2.38), libelf1t64 (= 0.194-4), liblzma5 (>= 5.1.1alpha+20120614), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.2.3) +Breaks: libdw1 (<< 0.194-4) +Replaces: libdw1 +Filename: pool/libdw1t64_0.194-4_amd64.deb +Size: 284846 +MD5sum: 47c98b73cf391cf055d2dca4c5cb0651 +SHA1: 0999981e4f94e7028f2ab578b138cc33145fc93c +SHA256: 5b3812ee2a663fef35e71fc1b9d6e29379bf9c38ac67ec954390e117513234b7 +SHA512: 52ecdbaf91757b50ac8bfbeab68f96da82dbfd7bd881089f916e717a7025026861b399f9104b3208297fb4511461ff3484ea69edd8ac41a110c672c51fdefe78 +Homepage: https://sourceware.org/elfutils/ +Description: library that provides access to the DWARF debug information + libdw1t64 provides a library that provides access to DWARF debug information + stored inside ELF files. + . + This library is part of elfutils. + +Package: libeatmydata1 +Architecture: amd64 +Version: 131-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libeatmydata +Maintainer: Ubuntu Developers +Original-Maintainer: Mattia Rizzolo +Installed-Size: 35 +Depends: libc6 (>= 2.34) +Filename: pool/libeatmydata1_131-2build1_amd64.deb +Size: 7606 +MD5sum: 6f8c9aab526ab1cb97aa4e15028d7ec2 +SHA1: 42868e7258929a0c2886a7c739e7d03c62589d73 +SHA256: eb5e950cb18e85d26e749a2b9e92a56177038e93c7eef35c388bdccb9a51abb3 +SHA512: 88ab78b0e4a78de882920399a7a96c69d0f9415e4f76a4e6670d52c537f470aa0e95e1e90c32f8585f7ae9eebb8d2ad3e7934a35c49caa813e5e17d6a45f4806 +Homepage: https://www.flamingspork.com/projects/libeatmydata/ +Description: Library and utilities designed to disable fsync and friends - shared library + This package contains the actual LD_PRELOAD library (libeatmydata) supporting + the operation of the eatmydata package. Users typically want to use or depend + on the eatmydata package instead of this one, so see its description for + further information. + +Package: libebackend-1.2-11t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 390 +Provides: libebackend-1.2-11 (= 3.56.2-8) +Depends: libc6 (>= 2.38), libcamel-1.2-64t64 (>= 3.19.92), libdb5.3t64, libedataserver-1.2-27t64 (>= 3.45.2), libglib2.0-0t64 (>= 2.68.0), libsoup-3.0-0 (>= 2.4.0), libsqlite3-0 (>= 3.6.0) +Breaks: libebackend-1.2-11 (<< 3.56.2-8) +Replaces: libebackend-1.2-11 +Filename: pool/libebackend-1.2-11t64_3.56.2-8_amd64.deb +Size: 114992 +MD5sum: 240338b1e8f7ad7fc7c5b968f2638711 +SHA1: b0fb8de1fc73e303bedbb19e4097253ce7060108 +SHA256: 45b91540d36f72e6502a1521a7072180ddfda9d3b63f816b2c124d6f29613a3e +SHA512: ba63566ce62eabc9fe2f5e34b54f411f11df317ccae4e1d108e969961d15129aaaa5e6288f730d825921504f9c2f2a9e102fc0a71d89d15d4417636ab887b05a +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Utility library for evolution data servers + This package is a utility library for evolution-data-servers providing + backend functions to access data. + . + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + +Package: libebook-1.2-21t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 375 +Provides: libebook-1.2-21 (= 3.56.2-8) +Depends: libc6 (>= 2.38), libcamel-1.2-64t64 (>= 3.42.1), libebook-contacts-1.2-4t64 (>= 3.49.2), libedata-book-1.2-27t64 (>= 3.43.2), libedataserver-1.2-27t64 (>= 3.17), libglib2.0-0t64 (>= 2.68.0), libnss3 (>= 2:3.13.4-2~), libxml2-16 (>= 2.14.1) +Breaks: libebook-1.2-21 (<< 3.56.2-8) +Replaces: libebook-1.2-21 +Filename: pool/libebook-1.2-21t64_3.56.2-8_amd64.deb +Size: 91298 +MD5sum: 5e914f3dc1b49f9b58db19a56ef404dd +SHA1: e546d432b3d11450e109de0f7140be7990e651d8 +SHA256: aa0d683f7ca6c7bf76e3eb98a39b83b056cf0ce124f7609b484e5c1981cca489 +SHA512: 840459e2201512eca7fdaf2d39cd44d3b0badb528e839bab882e0f61ba5995288a75f67de85074c491f8e634541de946ea1fa625b5435cf7c78bb8f58ec4f73a +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Client library for evolution address books + This package is a client library for evolution addressbooks. + . + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + +Package: libebook-contacts-1.2-4t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 224 +Provides: libebook-contacts-1.2-4 (= 3.56.2-8) +Depends: libc6 (>= 2.14), libcamel-1.2-64t64 (>= 3.19.92), libedataserver-1.2-27t64 (>= 3.31.90), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.58.0), libphonenumber8t64-protobuf32, libstdc++6 (>= 13.1) +Breaks: libebook-contacts-1.2-4 (<< 3.56.2-8) +Replaces: libebook-contacts-1.2-4 +Filename: pool/libebook-contacts-1.2-4t64_3.56.2-8_amd64.deb +Size: 67592 +MD5sum: efe27dc1f4459890c0d344d3771dae1c +SHA1: f40264476bd754fa4dfacc98135c617c8631af7c +SHA256: 8f5a6766829a6b3e18bd956e2e645316b9f0f54174a3f8b2127bd8004c0def8d +SHA512: c8bf870a2eae6f009c69b12ad4ffdec1f05e8fc9ffe38d081e250b933488a494dd99d25413725999cec5bf0b52135072d00ce2f5b4df25ae5c00e6aca22deac3 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Client library for evolution contacts books + This package is a client library for evolution addressbooks. + . + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + +Package: libecal-2.0-3 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 626 +Depends: libc6 (>= 2.33), libcamel-1.2-64t64 (>= 3.24.1), libedataserver-1.2-27t64 (>= 3.51.2), libglib2.0-0t64 (>= 2.62.0), libical3t64 (>= 3.0.15) +Filename: pool/libecal-2.0-3_3.56.2-8_amd64.deb +Size: 173880 +MD5sum: 229e789aa303401b926f23cba04a40e0 +SHA1: 9f71a91342ecc4b3d85fe8d2f73cd83a63b205ef +SHA256: ed72235014e135632af481346f3eed6f4edc5874c096a0a0d8ee206f0c1459e1 +SHA512: 25aa61fa2ac1f5cca2d50da9418c70728b71162a1ed3ed689148e3a7935b836b6c5043c12093f7b5aa8bb381e83c91fc2aad422a3cb07437f77dfc6ed01ce9b3 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Client library for evolution calendars + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + . + This package is a client library for evolution calendar. + +Package: libedata-book-1.2-27t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 906 +Provides: libedata-book-1.2-27 (= 3.56.2-8) +Depends: libc6 (>= 2.38), libcamel-1.2-64t64 (>= 3.24.1), libebackend-1.2-11t64 (>= 3.49.2), libebook-contacts-1.2-4t64 (>= 3.49.2), libedataserver-1.2-27t64 (>= 3.56.2-8~), libglib2.0-0t64 (>= 2.70.0), libsoup-3.0-0 (>= 2.4.0), libsqlite3-0 (>= 3.5.9) +Breaks: libedata-book-1.2-27 (<< 3.56.2-8) +Replaces: libedata-book-1.2-27 +Filename: pool/libedata-book-1.2-27t64_3.56.2-8_amd64.deb +Size: 262222 +MD5sum: 3e1fa80ac81a3abba6dc9ea0c2a201c5 +SHA1: f80147b8b526531de2f18269f6f8d4aea1703dcc +SHA256: f85a9a99611eb9b3d9cdb191040c4d2d7f49eacfbc945b8794990876c8ef0a7d +SHA512: 8a3b6c24ade807e5fadb46d82a12cc928e5b1d8279785f41064a292c282b50181d33efe936f3967a85be0613e8b3af40acbdd9648e22ea3a9b1310f560763fc5 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Backend library for evolution address books + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + . + This package is a backend library for evolution address book. + +Package: libedata-cal-2.0-2t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 500 +Provides: libedata-cal-2.0-2 (= 3.56.2-8) +Depends: libc6 (>= 2.14), libcamel-1.2-64t64 (>= 3.24.1), libebackend-1.2-11t64 (>= 3.49.2), libecal-2.0-3 (>= 3.47.3), libedataserver-1.2-27t64 (>= 3.56.2-8~), libglib2.0-0t64 (>= 2.70.0), libical3t64 (>= 3.0.0), libsoup-3.0-0 (>= 2.4.0), libsqlite3-0 (>= 3.5.9) +Breaks: libedata-cal-2.0-2 (<< 3.56.2-8) +Replaces: libedata-cal-2.0-2 +Filename: pool/libedata-cal-2.0-2t64_3.56.2-8_amd64.deb +Size: 137212 +MD5sum: 3c2838b3e28f3c82274898f686ff0a27 +SHA1: 2654fc6256732cbfc92b4a442cbcc63140cd2171 +SHA256: e64fd2baaf7597dd1787eda671453962cc996ebcd0c775c2570509d161fbd6f3 +SHA512: a2490364be378230b7e29e54ad194ca152934f4f30499193bdd7ad73416e72aefe2895c214ba2ede02248f25e2f49f28653ffb2f4992e9d6174ff0d222582d58 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Backend library for evolution calendars + Evolution is the integrated mail, calendar, task and address book + distributed suite from Novell, Inc. + . + This package is a backend library for evolution calendar. + +Package: libedataserver-1.2-27t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1040 +Provides: libedataserver-1.2-27 (= 3.56.2-8) +Depends: evolution-data-server-common (>= 3.56), libc6 (>= 2.38), libcamel-1.2-64t64 (>= 3.53.2), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.68.0), libicu78 (>= 78.1-1~), libjson-glib-1.0-0 (>= 1.5.2), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.3.1), libstdc++6 (>= 5.2), libuuid1 (>= 2.16), libxml2-16 (>= 2.14.1) +Breaks: libedataserver-1.2-27 (<< 3.56.2-8) +Replaces: libedataserver-1.2-27 +Filename: pool/libedataserver-1.2-27t64_3.56.2-8_amd64.deb +Size: 287314 +MD5sum: d7453a1af4ff710874c20c2770ab1a0c +SHA1: 83a2a95503b729049ebd8a81fc77425f34071ebf +SHA256: a2ec776c97a2ad89b557ca07e0eecb8133878fcc3e26832c00a75ab8b9c08bfd +SHA512: c57614a0ef18f64ce4a869d7cf1cc7aced1f85b90b072d7fe0b2c983afdcf1cc179c497eecf18b6e8c0efb64c2fc51d57d16afd05d85193ea0899b7be6d49cf1 +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Utility library for evolution data servers + The data server, called "Evolution Data Server" is responsible for managing + calendar and addressbook information. + . + This package is a utility library for evolution-data-server. + +Package: libedataserverui-1.2-4t64 +Architecture: amd64 +Version: 3.56.2-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: evolution-data-server +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 269 +Provides: libedataserverui-1.2-4 (= 3.56.2-8) +Depends: evolution-data-server-common (>= 3.56), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libcamel-1.2-64t64 (>= 3.19.92), libecal-2.0-3 (>= 3.45.2), libedataserver-1.2-27t64 (>= 3.53.2), libglib2.0-0t64 (>= 2.66.0), libgtk-3-0t64 (>= 3.19.12), libical3t64 (>= 3.0.0), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.13.4-2~), libpango-1.0-0 (>= 1.14.0), libsoup-3.0-0 (>= 2.24.3), libwebkit2gtk-4.1-0 (>= 2.31.1) +Breaks: libedataserverui-1.2-4 (<< 3.56.2-8) +Replaces: libedataserverui-1.2-4 +Filename: pool/libedataserverui-1.2-4t64_3.56.2-8_amd64.deb +Size: 78048 +MD5sum: 0ce42e48bd54385daf37ea96b6cdb99b +SHA1: 9bbf547bd7c3cadc88670f115a626c5be2822c05 +SHA256: 1815c1576891c95ac7d417776488aca75e5ac5533f4a3f2459a3d805ae8e2ea3 +SHA512: 13c4d6e080173e9037a2e43855e88b326f4e9c823008b76228bb5607c1d6e46d9a1046b3fc82a3dd645b620ee75431308de08a26ca290d13a100393ae5ac059a +Homepage: https://gitlab.gnome.org/GNOME/evolution/-/wikis/home +Description: Utility library for evolution data servers + The data server, called "Evolution Data Server" is responsible for managing + calendar and addressbook information. + . + This package is a UI utility library for evolution-data-server. + +Package: libedit2 +Architecture: amd64 +Version: 3.1-20251016-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libedit +Maintainer: Ubuntu Developers +Original-Maintainer: LLVM Packaging Team +Installed-Size: 258 +Depends: libbsd0 (>= 0.1.3), libc6 (>= 2.42), libtinfo6 (>= 6) +Replaces: libedit-dev (<< 3.1-20180525-2~) +Filename: pool/libedit2_3.1-20251016-1_amd64.deb +Size: 96920 +MD5sum: db720bdc5f78ca1d6c5eb0d35bcb66b8 +SHA1: 01f0a04c5a3b442d17f5f83a83139eb71cc1ca6a +SHA256: 22338fcbcaae99f67ca7b2e20d1730bc29d3c02bcd2414e457f99be96442ee29 +SHA512: cd253c190fba64631805d13e6de9b1f33cedc5a1e6682579698a73c6c84c5687b145590ca7dbec5ae0b4adc03deb97b081352e4a584dc63cce0120db66b67dec +Homepage: https://www.thrysoee.dk/editline/ +Description: BSD editline and history libraries + Command line editor library provides generic line editing, + history, and tokenization functions. + . + It slightly resembles GNU readline. + +Package: libeditorconfig0 +Architecture: amd64 +Version: 0.12.10+~0.17.1-3ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: editorconfig-core +Maintainer: Jeremy Bícha +Installed-Size: 50 +Depends: libc6 (>= 2.38), libpcre2-8-0 (>= 10.22) +Filename: pool/libeditorconfig0_0.12.10+~0.17.1-3ubuntu0.1_amd64.deb +Size: 14184 +MD5sum: 819dfb715e8579260e4e87014468d8d6 +SHA1: 18a2c925f817c08e3e7d17a611b965de34767867 +SHA256: 382d0dc3141e74be93ea675893168b3a198e5fcfe9c36d7dcb68d40e4b06b0f7 +SHA512: 86d58f6bee84c767a8b88385d932c31e2bed5006a88c31c57301ea1314a94c980f1c244c2808fa0abe5d008cfca5605c634d867d7ad7554547ebb2b3c1f1f644 +Homepage: https://editorconfig.org/ +Description: coding style indenter across editors - library + EditorConfig helps developers define and maintain + consistent coding styles between different editors and IDEs. + The EditorConfig project consists of a file format + for defining coding styles + and a collection of text editor plugins + that enable editors to read the file format + and adhere to defined styles. + . + EditorConfig files are easily readable + and they work nicely with version control systems. + . + This package provides the core library of editorconfig. + +Package: libefiboot1t64 +Architecture: amd64 +Version: 39-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: efivar +Maintainer: Ubuntu Developers +Original-Maintainer: Debian UEFI Maintainers +Installed-Size: 122 +Provides: libefiboot1 (= 39-2) +Depends: libc6 (>= 2.38), libefivar1t64 (>= 39) +Breaks: libefiboot1 (<< 39-2) +Replaces: libefiboot1 +Filename: pool/libefiboot1t64_39-2_amd64.deb +Size: 41728 +MD5sum: 8a379ef2109be23fbccd6f1769784eb9 +SHA1: 87fc021c7276b93a984533a7a51d08d20278c533 +SHA256: 0449451d9aef91d5f7eaa50862908b3f7ce49619f8a7c11ee0a7aea2b5c6b744 +SHA512: d896b1eb73c741b7f2e002260031d045b3237f6a3f7715508f44316da3707bbd4df585779f7234eaa5694f5a5875a53d5b2befa47ae3ab47a79bc3dcaf9fabf4 +Homepage: https://github.com/rhboot/efivar +Description: Library to manage UEFI variables + Library to allow for the manipulation of UEFI variables related to booting. + +Package: libefivar1t64 +Architecture: amd64 +Version: 39-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: efivar +Maintainer: Ubuntu Developers +Original-Maintainer: Debian UEFI Maintainers +Installed-Size: 218 +Provides: libefivar1 (= 39-2) +Depends: libc6 (>= 2.38) +Breaks: libefivar1 (<< 39-2) +Replaces: libefivar1 +Filename: pool/libefivar1t64_39-2_amd64.deb +Size: 61042 +MD5sum: 8090ca62b6438acd9cb739319e092e68 +SHA1: aa8c8d249836b9fa8db0538ab3b196ae85d24180 +SHA256: 32b7887c6a8dcf8d1a71c57702b6d794709fb55fb8013b353197c8e9dfe309ce +SHA512: 1351eec699b3ad290721250c6dac488842040340abbafacd72b8b62c5957fc71dad4189331a8dec906284115496f8fa96dcf4b66531c8c8d47da86316839451e +Homepage: https://github.com/rhboot/efivar +Description: Library to manage UEFI variables + Library to allow for the simple manipulation of UEFI variables. + +Package: libegl-mesa0 +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 466 +Provides: libegl-vendor +Depends: libgbm1 (= 26.0.8-1ubuntu0.3), mesa-libgallium (= 26.0.8-1ubuntu0.3), libc6 (>= 2.38), libdrm2 (>= 2.4.125-1), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.4), libwayland-client0 (>= 1.24.0), libx11-6, libx11-xcb1, libxcb-dri3-0 (>= 1.13), libxcb-present0, libxcb-randr0 (>= 1.3), libxcb-shm0, libxcb-xfixes0, libxcb1 (>= 1.6) +Filename: pool/libegl-mesa0_26.0.8-1ubuntu0.3_amd64.deb +Size: 133774 +MD5sum: c64d4c3a5af46c5bc510eac1be05a5c1 +SHA1: 32916f3d6ab8881fa98f44f7f695e4828be75c10 +SHA256: 938813d9d6bb7ccf8315af1f8bb2770ad4b9d240ad177f0da420db3e94600d6b +SHA512: 0028b4d9ff94ed0776f8562a01542c5b73214d773cf165984975f3d24256eb4fd1f60f41e198fb1320b5a9f77233275ff233f6f121372faaf0b84de7916c85e6 +Homepage: https://mesa3d.org/ +Description: free implementation of the EGL API -- Mesa vendor library + This package contains the EGL native platform graphics interface library. + EGL provides a platform-agnostic mechanism for creating rendering surfaces + for use with other graphics libraries, such as OpenGL|ES. + . + This package contains the Mesa vendor library for EGL. + +Package: libegl1 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 99 +Depends: libc6 (>= 2.38), libglvnd0 (= 1.7.0-3), libegl-mesa0 +Filename: pool/libegl1_1.7.0-3_amd64.deb +Size: 29654 +MD5sum: 301e3d61d776827d2d41b4c77c9b5e6c +SHA1: 4e06a71d5bf4f748417ea0fcc4c8c2e5d08c895d +SHA256: cf2a6549bbc4339671901bde97c0ca41c380c5783179ef68977bf86151f03766 +SHA512: 25f0ae328647a004f076393a87447bfa12a2f729da05326a209ae868d0dab460a31c20349f0606f5ef0e63d48bde5308dfd270ab2e17f56483adb5b841dd6623 +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library -- EGL support + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains support for EGL. + +Package: libei1 +Architecture: amd64 +Version: 1.5.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libei +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 136 +Depends: libc6 (>= 2.17) +Filename: pool/libei1_1.5.0-3_amd64.deb +Size: 42774 +MD5sum: 85d6ea058e6678f78f65411b7aca53c0 +SHA1: 26c17371654f62d88b68e9d4b989b28e688db8e4 +SHA256: d3b0b40cb7cf3686c0aaebf6e6b4e11c8903d295fb9b5ffc9e66d99cf8448f7b +SHA512: c8a0d655ce7b0c81afda12b0c9b7aeace2143ae85c820d73ea3c6a727fd3e26421cd8b947fb85aafb30708a9fb7129df5b6858fe99b491a2661094b72aa1ea04 +Homepage: https://gitlab.freedesktop.org/libinput/libei +Description: Emulated Input client library + libei is a library for Emulated Input, primarily aimed at the Wayland + stack. It provides three parts: + - EI (Emulated Input) for the client side (libei) + - EIS (Emulated Input Server) for the server side (libeis) + - oeffis for D-Bus communication with the XDG RemoteDesktop portal + . + This package provides the Emulated Input client library. + +Package: libeis1 +Architecture: amd64 +Version: 1.5.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libei +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 141 +Depends: libc6 (>= 2.33) +Filename: pool/libeis1_1.5.0-3_amd64.deb +Size: 44010 +MD5sum: e48b6d753eec77347acc7ce74d40763d +SHA1: c42a0e5673baa0fe290a2cfa9b7321460f20abdc +SHA256: c676058cef2ae12884cb63b644c3d7188d5e04e455824307b927af008bf94668 +SHA512: 0a10fa6ba23ba7a390eaa6921cdf197b48133e012f7ee11c12fae0d41ea718227d7d34295d7cd8e4c22d05b3d495993160a407ae669c306615b959da2e9b83d7 +Homepage: https://gitlab.freedesktop.org/libinput/libei +Description: Emulated Input server library + libei is a library for Emulated Input, primarily aimed at the Wayland + stack. It provides three parts: + - EI (Emulated Input) for the client side (libei) + - EIS (Emulated Input Server) for the server side (libeis) + - oeffis for D-Bus communication with the XDG RemoteDesktop portal + . + This package provides the Emulated Input Server library. + +Package: libelf1t64 +Architecture: amd64 +Version: 0.194-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: elfutils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Elfutils Maintainers +Installed-Size: 208 +Provides: libelf1 (= 0.194-4) +Depends: libc6 (>= 2.38), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Breaks: libelf1 (<< 0.194-4) +Replaces: libelf1 +Filename: pool/libelf1t64_0.194-4_amd64.deb +Size: 57140 +MD5sum: 1c2af5bde73c091fd11945e0eca1a4e2 +SHA1: cb04a340cf38c18005c47d34c7a70d0b3ceb2e6c +SHA256: c2feae172b14d2a8317348023c5e0b6572314c097a9f7b8225c62b0988cc8d92 +SHA512: b7601cd6f9e597370bafdee6cf23d9ddd244cb986c7c6b9306424dce6e4abe413a7af319d5f522089059e7de0e653c42b3ba7ec26b1e3d8ed05e46ee8db24e20 +Homepage: https://sourceware.org/elfutils/ +Description: library to read and write ELF files + The libelf1t64 package provides a shared library which allows reading and + writing ELF files on a high level. Third party programs depend on + this package to read internals of ELF files. The programs of the + elfutils package use it also to generate new ELF files. + . + This library is part of elfutils. + +Package: libenchant-2-2 +Architecture: amd64 +Version: 2.8.2+dfsg1-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: enchant-2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 217 +Depends: hunspell-en-us | hunspell-dictionary | myspell-dictionary | aspell-dictionary | ispell-dictionary, libaspell15 (>= 0.60.8.1), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.68.0), libhunspell-1.7-0, libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4) +Recommends: enchant-2 +Suggests: libenchant-2-voikko +Filename: pool/libenchant-2-2_2.8.2+dfsg1-3build1_amd64.deb +Size: 59212 +MD5sum: 5a5afc6f436af9d4bd8113f6c7568370 +SHA1: 0c5cef398bdc96814aec81187d6046b1578650a2 +SHA256: 065fbd885526f31285914daffebcd4a28a65162504fc13f879e188de9e4f7920 +SHA512: fbfd9538cac7a5b8a55da010c00c67fe9794ba896024b0011b88c3ea0dae7b5812e43fa0fea94e374e2c473d58744fb7b0b4852b023be9b37d48c91cea14b69a +Homepage: https://rrthomas.github.io/enchant/ +Description: Wrapper library for various spell checker engines (runtime libs) + Enchant is a generic spell checking library which uses existing + spell checker engines such as ispell, aspell and myspell as its backends. + . + Enchant steps in to provide uniformity and conformity on top of these + libraries, and implement certain features that may be lacking in any + individual provider library. + . + This package contains the shared library and non-Voikko enchant plugins. + +Package: libencode-locale-perl +Architecture: all +Version: 1.05-3 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 31 +Depends: perl:any +Filename: pool/libencode-locale-perl_1.05-3_all.deb +Size: 11568 +MD5sum: 570e21b4244113b966ed9e3327f8b5d0 +SHA1: 6d9bd80a9d54bd9879117eb9e4b0de5acc8d599a +SHA256: 11c7ea66f45a1447cc90b3b12d30f8ae30e0aaa16f6808878ca1be04e1dca763 +SHA512: 1562fd9d7345baaca75ac304f866ab3d8fa67c15e12c89d3230971f92bd6c636dfe75594889a19f2a8381c7e9ff8f86ac81012928c1c70cb1a85ac59aa7107b6 +Homepage: https://metacpan.org/release/Encode-Locale +Description: utility to determine the locale encoding + In many applications it's wise to let Perl use Unicode for the strings it + processes. Most of the interfaces Perl has to the outside world are still byte + based. Programs therefore need to decode byte strings that enter the program + from the outside and encode them again on the way out. + . + The POSIX locale system is used to specify both the language conventions + requested by the user and the preferred character set to consume and output. + The Encode::Locale module looks up the charset and encoding (called a CODESET + in the locale jargon) and arranges for the Encode module to know this encoding + under the name "locale". It means bytes obtained from the environment can be + converted to Unicode strings by calling Encode::encode(locale => $bytes) and + converted back again with Encode::decode(locale => $string). + +Package: libepoxy0 +Architecture: amd64 +Version: 1.5.10-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libepoxy +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 1303 +Depends: libc6 (>= 2.34) +Filename: pool/libepoxy0_1.5.10-2build1_amd64.deb +Size: 226466 +MD5sum: c597123264110d71cb1507e294a8f2b1 +SHA1: b2d5ec95c74d3cf339352724569629c7ea5e6927 +SHA256: 2f4525535b2c7c6d61cc5c131f1cb3f5c0d70177ccf550a05f80d12016dfcfdf +SHA512: 7021a0b33115b900b5b876d1bb7813920abec5848f58857961a04cf363fe51f7ab7247ef5f92e151bc52a58079146c5d35f6fe9c6d41171d4cb118cc880cf901 +Homepage: https://github.com/anholt/libepoxy +Description: OpenGL function pointer management library + It hides the complexity of dlopen(), dlsym(), glXGetProcAddress(), + eglGetProcAddress(), etc. from the app developer, with very little + knowledge needed on their part. They get to read GL specs and write + code using undecorated function names like glCompileShader(). + +Package: liberror-perl +Architecture: all +Version: 0.17030-1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 67 +Depends: perl:any +Filename: pool/liberror-perl_0.17030-1_all.deb +Size: 23518 +MD5sum: 1cefcc75a3d46081567c1bf80f0532df +SHA1: 8c1aa78a4c083c55ddfdc2650bfdd18d9d8a4f1b +SHA256: cb85c869fe056e9e466efcfa3403408b0a87db1da1cafa585140a9be59fe58a1 +SHA512: 95fffd8f47855d8bcc30866c79e60e56152a6e30f1016aedd0a4e8940513a19222e27094232fc4eb54c4753b980d34d7f4a745c8c3f342fb567545d4a35141aa +Homepage: https://metacpan.org/release/Error +Description: Perl module for error/exception handling in an OO-ish way + The Error module provides two interfaces. Firstly "Error" provides a + procedural interface to exception handling. Secondly "Error" is a base class + for errors/exceptions that can either be thrown, for subsequent catch, or can + simply be recorded. + . + Errors in the class "Error" should not be thrown directly, but the user + should throw errors from a sub-class of "Error". + . + Warning: Using the "Error" module is no longer recommended due to the + black-magical nature of its syntactic sugar, which often tends to break. Its + maintainers have stopped actively writing code that uses it, and discourage + people from doing so. + . + Recommended alternatives are Exception::Class (libexception-class-perl), + Error::Exception (not packaged), TryCatch (libtrycatch-perl), and Try::Tiny + (libtry-tiny-perl). + +Package: libespeak-ng1 +Architecture: amd64 +Version: 1.52.0+dfsg-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: espeak-ng +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 518 +Depends: libc6 (>= 2.34), libpcaudio0 (>= 1.3), libsonic0 (>= 0.1.10), espeak-ng-data (= 1.52.0+dfsg-5build1) +Filename: pool/libespeak-ng1_1.52.0+dfsg-5build1_amd64.deb +Size: 211318 +MD5sum: bf46125f58a3098f065e0fb54e546211 +SHA1: 650e32a20e02b98606d078406e61d03de725fd15 +SHA256: 73f01703f367560ca5f4acad10d00058ac103a0db46cf0a722e1eec8de2b7251 +SHA512: bcc7525684fc8b7871c07cc36ae0a5dcc636b55fa4db2424273f88b524c4593a6dd78b4c155b52e75af2149336530319de86c6d88d1a763e647c16d4f5f1a57c +Homepage: https://github.com/espeak-ng/espeak-ng +Description: Multi-lingual software speech synthesizer: shared library + eSpeak NG is a software speech synthesizer for English, and some other + languages. + . + This package contains the espeak NG program in a shared library. + +Package: libevdev2 +Architecture: amd64 +Version: 1.13.6+dfsg-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libevdev +Maintainer: Ubuntu Developers +Original-Maintainer: Stephen Kitt +Installed-Size: 142 +Depends: libc6 (>= 2.33) +Filename: pool/libevdev2_1.13.6+dfsg-1_amd64.deb +Size: 37674 +MD5sum: d2db94a883edcf98ea209e2f0f65f355 +SHA1: 5c255310f8fafb4a0a15a5e500bed7c552fc1cb8 +SHA256: 34bd437962ea3eaf32b75b5f0dd07447d2ace9d9065e76d2ebf69154f3b54d5a +SHA512: dd45c0eecada8800d98d83b92512fb6c2ae5e9c99d893de84d95ca12f4d02c0db1d1f819a0293d3e282497e141cd6e64527146f92be3f19030fc43101848cdc7 +Homepage: https://www.freedesktop.org/wiki/Software/libevdev/ +Description: wrapper library for evdev devices + libevdev is a wrapper library for evdev devices. It provides + functions covering the common tasks when dealing with evdev devices, + thus avoiding erroneous ioctls and other errors. + . + This package contains the files required to run software using + libevdev. + +Package: libexempi8 +Architecture: amd64 +Version: 2.6.6-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: exempi +Maintainer: Ubuntu Developers +Original-Maintainer: Michael Biebl +Installed-Size: 1432 +Depends: libc6 (>= 2.38), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13.1), zlib1g (>= 1:1.2.2) +Filename: pool/libexempi8_2.6.6-2build1_amd64.deb +Size: 546422 +MD5sum: 47caaf9ae3e6bad17e8b844113735454 +SHA1: aed2c6cd12bba624678f72cb1aa19104d83589b1 +SHA256: f08f87b4c41a4ccf6f537e59c504eac03dc1a4b1f6ce547e146bd5056d241f14 +SHA512: c2682cb372b0a7bb8bcb61c9a47b3a1ecc9821b11efbd23e4c9ad464a31fe965d7da5360d96dacd4fd90e53518699d544a859611b52a257494b8c5434c175780 +Homepage: https://libopenraw.freedesktop.org/wiki/Exempi +Description: library to parse XMP metadata (Library) + Exempi is a library to parse XMP metadata as defined by the + specification. + . + XMP (Extensible Metadata Platform) facilitates embedding metadata in files + using a subset of RDF. Most notably XMP supports embedding metadata in PDF + and many image formats, though it is designed to support nearly any file type. + +Package: libexif12 +Architecture: amd64 +Version: 0.6.25-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libexif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 384 +Depends: libc6 (>= 2.29) +Filename: pool/libexif12_0.6.25-2ubuntu0.1_amd64.deb +Size: 83908 +MD5sum: ae01270721ca90cb217e68d7942809e9 +SHA1: c65aa16f9ec745230e7cceec50b172de76f515c6 +SHA256: b367c14a9da0f6c4356cf8b2615ad847242ad7e647daea6f19a45fea644298c4 +SHA512: 811e463ae0a2cd16bbd4e313a2a156ef712e8058ed2d625a60031c7978383a53e2136e9926d57d1a1e8a2b5247480f4ab6cdb4006852b34710ef2a168a302551 +Homepage: https://libexif.github.io/ +Description: library to parse EXIF files + Most digital cameras produce EXIF files, which are JPEG files with + extra tags that contain information about the image. The EXIF library + allows you to parse an EXIF file and read the data from those tags. + +Package: libexiv2-28 +Architecture: amd64 +Version: 0.28.8+dfsg-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: exiv2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian KDE Extras Team +Installed-Size: 3666 +Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.38), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.3.1), libinireader0 (>= 48), libstdc++6 (>= 14), zlib1g (>= 1:1.1.4), libexiv2-data (>= 0.28.8+dfsg-1) +Suggests: exiv2 +Filename: pool/libexiv2-28_0.28.8+dfsg-1_amd64.deb +Size: 976560 +MD5sum: bf0c6713313914964a693c28fbff0d14 +SHA1: 76ab70f8bb409b17f04f0e05712ccfde158ed4d2 +SHA256: d6ce2c1699dcbccf64a5c90c1774ac143c757ca9ab737d9609456e3aed06a97f +SHA512: a3c5ed3ef70438e85c7b231966529fc48bde0e6867d463dc833e197b0323f538b1100e51567602abf9369691a6cb8db7ffa115df53c1a0c92fe0b1eadabe768e +Homepage: https://www.exiv2.org/ +Description: EXIF/IPTC/XMP metadata manipulation library + Exiv2 is a C++ library and a command line utility to manage image metadata. + It provides fast and easy read and write access to the Exif, IPTC and XMP + metadata of images in various formats + . + Exiv2 library provides: + * fast read and write access to the Exif, IPTC, and XMP metadata of an image + * an easy to use and extensively documented API + * conversions of Exif and IPTC metadata to XMP and vice versa + * a smart IPTC implementation that does not affect data that programs like + Photoshop store in the same image segment + * Exif Makernote support: + - Makernote tags can be read and written just like any other metadata + - a sophisticated write algorithm avoids corrupting the Makernote + * a simple interface to extract previews embedded in RAW images and Exif + thumbnails + * set and delete methods for Exif thumbnails + +Package: libexiv2-data +Architecture: all +Version: 0.28.8+dfsg-1 +Multi-Arch: foreign +Priority: optional +Section: graphics +Source: exiv2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian KDE Extras Team +Installed-Size: 80 +Breaks: libexiv2-27 (<< 0.28~) +Replaces: libexiv2-27 (<< 0.28~) +Filename: pool/libexiv2-data_0.28.8+dfsg-1_all.deb +Size: 5700 +MD5sum: 48a4b41cd46476eed5c4c972c34974df +SHA1: f2ba23787d5299b9e093c7bef25915c4e3248332 +SHA256: 5a1796235e89d4eca0703d70029eab9bcf0247e09001075ca62da6e6d534328f +SHA512: 0f4de7d7e72d9157a5664317d88a83d926490d862e63572c784c24cf10c05b4eed827ba8f103cd0ca467fd4d1ea5592fd313b428dd0109d63e1986ae2d1946b2 +Homepage: https://www.exiv2.org/ +Description: EXIF/IPTC/XMP metadata manipulation library - shared data + Exiv2 is a C++ library and a command line utility to manage image metadata. + It provides fast and easy read and write access to the Exif, IPTC and XMP + metadata of images in various formats + . + This package provides the data files of the exiv2 library. + +Package: libexpat1 +Architecture: amd64 +Version: 2.7.4-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: expat +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 411 +Pre-Depends: libc6 (>= 2.38) +Filename: pool/libexpat1_2.7.4-1_amd64.deb +Size: 93950 +MD5sum: 8b15698cf81df6e1c85b07a357ca2cf2 +SHA1: 28e2403c14861b818ccb88486a6d50b204b43da7 +SHA256: ef78089497946219cac03209d951bbfff93480104e791b770a7bf6429452e475 +SHA512: 030b2aed0f37fb7a596246adc70bf3303bc00a0f028687d6b18e12162f93116ef5b5c1ff55bec39c74e510c54254b72d08d80e09f496f16f85bdfd2c46d732ca +Homepage: https://libexpat.github.io/ +Description: XML parsing C library - runtime library + This package contains the runtime, shared library of expat, the C + library for parsing XML. Expat is a stream-oriented parser in + which an application registers handlers for things the parser + might find in the XML document (like start tags). + +Package: libextutils-depends-perl +Architecture: all +Version: 0.8002-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 35 +Depends: perl:any +Filename: pool/libextutils-depends-perl_0.8002-1_all.deb +Size: 14338 +MD5sum: 3168acb54c6a61f3f51a062423738030 +SHA1: 4bf9f796e46d31ffb741db47b4ee358fcae2768b +SHA256: dce81d59f6f8a8c55f31a645ba140c47695c86ded461ef6735fb159ad1332449 +SHA512: 162c6621d24a268eb449da2e07d9f5346ec9763974a5d3d6966ebc7774810107e3727ab54c3b1eced93ab7c2f6ea12acc8aba3b6a882254b07d7d9a9db58151a +Homepage: https://gtk2-perl.sourceforge.net/ +Description: Perl module for building extensions that depend on other extensions + ExtUtils::Depends tries to make it easy to build Perl extensions that use + functions and typemaps provided by other perl extensions. This means that a + perl extension is treated like a shared library that also provides a C and an + XS interface. + +Package: libfdisk1 +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 429 +Depends: libblkid1 (= 2.41.3-3ubuntu2.2), libc6 (>= 2.38), libuuid1 (= 2.41.3-3ubuntu2.2) +Filename: pool/libfdisk1_2.41.3-3ubuntu2.2_amd64.deb +Size: 163734 +MD5sum: 4fb1e5fd9f0e3827feacfaf936c82333 +SHA1: 55ed808e5d1b1ca7c7757f81afd2970c36027bd1 +SHA256: 38c1e94e279ae2bee0e6dd2a7cb8787e2e549f792bf49bde5204dd60a8292441 +SHA512: aafe2c2804755afec34709cbd3cc54545e3b206408c0a54a83fcc3567bba903a0345b7d413154d56c5fe5ca3d8b8c531e11ee781c20cbb505748d02262a6ad95 +Homepage: https://github.com/util-linux/util-linux +Description: fdisk partitioning library + The libfdisk library is used for manipulating partition tables. It is + the core of the fdisk, cfdisk, and sfdisk tools. + +Package: libffi8 +Architecture: amd64 +Version: 3.5.2-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libffi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 87 +Provides: libffi8ubuntu1 (= 3.5.2-4) +Depends: libc6 (>= 2.38) +Breaks: libffi8ubuntu1 (<< 3.4.2-1) +Replaces: libffi8ubuntu1 (<< 3.4.2-1) +Filename: pool/libffi8_3.5.2-4_amd64.deb +Size: 26348 +MD5sum: b2e3b3971e3f6634acaaeb32872a740c +SHA1: 3c30d99c3f835c7da0e87d58a55c52c9afae478f +SHA256: 4a7423124bbd459c0aa38b7389ec7802fa6899654767a95fc27de70967fedd48 +SHA512: 99784f5bc64c16128925e3b740edf147ba2292726b40a4c15dcdffc0234ea7fff6ea04a025021388938971250de96aeb7f5212216dd6540a646e9a692a65b9b0 +Homepage: https://sourceware.org/libffi/ +Description: Foreign Function Interface library runtime + A foreign function interface is the popular name for the interface that + allows code written in one language to call code written in another + language. + +Package: libfftw3-single3 +Architecture: amd64 +Version: 3.3.10-2fakesync1build3 +Multi-Arch: same +Priority: optional +Section: libs +Source: fftw3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Science Maintainers +Installed-Size: 2370 +Depends: libc6 (>= 2.34), libgomp1 (>= 4.9) +Suggests: libfftw3-bin, libfftw3-dev +Filename: pool/libfftw3-single3_3.3.10-2fakesync1build3_amd64.deb +Size: 865152 +MD5sum: 75f706993d5cc113318b13255f484fe7 +SHA1: 94493f579b5d5056d7dfb389d6d150180dbcc3c1 +SHA256: 716e082f8b472d7447d394913ddf0067ab60b31f35ef014dbcecc610e6560e93 +SHA512: 88784b87a2ae86f503003ca54d1ff1cb54c22f17b7b9a81df463ce8edd3ff2c021d0eef1cbe693274fcc7724ab7e88ab12a8618e236d3172d905e896587ae23e +Homepage: https://fftw.org +Description: Library for computing Fast Fourier Transforms - Single precision + The FFTW library computes Fast Fourier Transforms (FFT) in one or more + dimensions. It is extremely fast. This package contains the shared library + for single precision transforms. + . + To get the static library and the header files, you need to install + libfftw3-dev. For documentation, see libfftw3-doc. + +Package: libfido2-1 +Architecture: amd64 +Version: 1.16.0-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libfido2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Authentication Maintainers +Installed-Size: 246 +Depends: libc6 (>= 2.38), libcbor0.10 (>= 0.10.2), libssl3t64 (>= 3.0.0), libudev1 (>= 183), zlib1g (>= 1:1.1.4) +Filename: pool/libfido2-1_1.16.0-2build1_amd64.deb +Size: 84576 +MD5sum: 9b893013cd93c643993f8ba83aa83b66 +SHA1: 0fb5f680a449cb255c43eec06b911ae1acc306af +SHA256: e74f757c08a3c9827453de9986101b43ca1069de6be9b8a7eeb438943f73f11f +SHA512: a8a468a43d99b5ae6fb008dc7c4f667c36319b929c659ef1d8b88c4b23e14dc699987ee1adc3ed7dc60543ed124a20d89a300e06a08e0e8b8cc38d91add701e3 +Homepage: https://developers.yubico.com/libfido2/ +Description: library for generating and verifying FIDO 2.0 objects + A library for communicating with a FIDO device over USB or NFC, and for + verifying attestation and assertion signatures. FIDO U2F (CTAP 1) and FIDO + 2.0 (CTAP 2) are supported. + . + This package contains the library. + +Package: libfile-basedir-perl +Architecture: all +Version: 0.09-2 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 38 +Depends: perl:any, libipc-system-simple-perl +Filename: pool/libfile-basedir-perl_0.09-2_all.deb +Size: 14396 +MD5sum: 4dbb26df88721908022727855c173244 +SHA1: 6faa11bf74bffc976ba436422251b6dbfb9ebc6f +SHA256: 508a573da1e7f57217a03738109cd734a7edb73c43197085004dcdec2b3ad8ea +SHA512: b272788797c90f4e2bd7c7cdfbbd1283c366be1aa469eb9b86abc104d88a6be4530ad141031d4eef7d184f850c11e5c6be217d8cf17d70a07f5c834849f2dcea +Homepage: https://metacpan.org/release/File-BaseDir +Description: Perl module to use the freedesktop basedir specification + The File::BaseDir module can be used to find directories and files as + specified by the XDG Base Directory Specification. It takes care of + defaults and uses File::Spec to make the output platform specific. + . + For this module the XDG basedir specification 0.6 was used. + +Package: libfile-desktopentry-perl +Architecture: all +Version: 0.23-1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 46 +Depends: perl:any, libfile-basedir-perl, liburi-perl +Recommends: x-terminal-emulator +Filename: pool/libfile-desktopentry-perl_0.23-1_all.deb +Size: 16870 +MD5sum: 4a96a49906bf3dfc049e268fb06a34ae +SHA1: cc191ca2f6a5aad0b366bef32b3c59bde6ae279c +SHA256: ee2331bef27fb35121714aba564d57a9fc038f204a8555573bbb66f0898fbc38 +SHA512: 10def5898e57f3a436778e9825033701f1daa45017266aa38ed4ff8105d413150a9c09cb7d3a7b644d71b2399458a5b1a21993c61ee845d5d583f4b1288a46d4 +Homepage: https://metacpan.org/release/File-DesktopEntry +Description: Perl module to handle freedesktop .desktop files + File::DesktopEntry is used to work with .desktop files. The + format of these files is specified by the freedesktop "Desktop + Entry" specification. For this module version 1.0 of the + specification was used: + . + + +Package: libfile-listing-perl +Architecture: all +Version: 6.16-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 31 +Depends: perl:any, libhttp-date-perl +Filename: pool/libfile-listing-perl_6.16-1_all.deb +Size: 11332 +MD5sum: a0f38215a319144e7c28cba8cd302bca +SHA1: 36ce15ce32da5eecbe5152ce954a04b2c93298e8 +SHA256: d37a2a2f6998b3db159f469f04eff9d44fda75d49ebaeb824d047b235d827bbe +SHA512: a5bee91b1d6dd62fedddcf36d962af650bf3b09992bb7dc5dd791e607f4aa5ea44e10cd786075d9eb4e61463ac97549f3b2c6d323bd69d42fd34d226b3357005 +Homepage: https://metacpan.org/release/File-Listing +Description: module to parse directory listings + File::Listing exports a single function called parse_dir(), which can be used + to parse directory listings. + . + The first parameter to parse_dir() is the directory listing to parse. It can + be a scalar, a reference to an array of directory lines or a glob + representing a filehandle to read the directory listing from. + . + The second parameter is the time zone to use when parsing time stamps in the + listing. If this value is undefined, then the local time zone is assumed. + . + The third parameter is the type of listing to assume. Currently supported + formats are 'unix', 'apache' and 'dosftp'. The default value 'unix'. + +Package: libfile-mimeinfo-perl +Architecture: all +Version: 0.36-2 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 108 +Depends: perl:any, libencode-locale-perl, libfile-basedir-perl, libfile-desktopentry-perl, shared-mime-info +Recommends: libio-stringy-perl +Filename: pool/libfile-mimeinfo-perl_0.36-2_all.deb +Size: 40610 +MD5sum: 484c9fe816dc8d1e00aa9399a6c03988 +SHA1: dd2a61b725ad0ca69a92880b6133903ab2da75bb +SHA256: 4d56f38e13b76b11b0c5a2b6216efe14026788905a1c305f2e5af2fd7417c52f +SHA512: ec8fadd8ff1ab39bafe1101d88ac91de222e1bff1ea9a85b95938527b6702414b52993d72367e5ee9f3208b5f0ecb4c9c38d4f88a224ffe1f055dd9aec0ca27a +Homepage: https://metacpan.org/release/File-MimeInfo +Description: Perl module to determine file types + File::MimeInfo can be used to determine the mime type of a file. It tries to + implement the freedesktop specification for a shared MIME database. + . + This package also contains two related utilities: + * mimetype: determine a file's mimetype + * mimeopen: open files according to their mimetype + +Package: libflac14 +Architecture: amd64 +Version: 1.5.0+ds-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: flac +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 438 +Depends: libc6 (>= 2.34), libogg0 (>= 1.1.0) +Filename: pool/libflac14_1.5.0+ds-5_amd64.deb +Size: 167804 +MD5sum: a5885c087866a303c2ff76529e743410 +SHA1: 9de564a7b8e16950f3d3471f590e1021c2ff33bc +SHA256: ea6cbd9399a646b073d36d8d33444f39f9f1dd63f5fa8cd18906573f51cc305b +SHA512: b7b8b1abc1ff9725ff6322f5387c9e0d93ffc076d4b2d2d581a8ac899ba2fe86e20fb8ead731998cc4a8738c59c0f73cd5614e002e530aac6b9a4968802099b1 +Homepage: https://github.com/xiph/flac +Description: Free Lossless Audio Codec - runtime C library + FLAC stands for Free Lossless Audio Codec. Grossly oversimplified, FLAC is + similar to MP3, but lossless. The FLAC project consists of: + . + * The stream format + * libFLAC, which implements a reference encoder, stream decoder, and file + decoder + * flac, which is a command-line wrapper around libFLAC to encode and decode + .flac files + * Input plugins for various music players (Winamp, XMMS, and more in the + works) + . + This package contains the runtime library libFLAC. + +Package: libflashrom1 +Architecture: amd64 +Version: 1.6.0-2ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: flashrom +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI +Installed-Size: 1097 +Depends: libc6 (>= 2.42), libftdi1-2 (>= 1.2), libpci3 (>= 1:3.13.0), libusb-1.0-0 (>= 2:1.0.22) +Filename: pool/libflashrom1_1.6.0-2ubuntu1.1_amd64.deb +Size: 226376 +MD5sum: cc65a1b7e0dd0701ee90060472127628 +SHA1: c0684c24f14b4c33f55780435b805c52d876504f +SHA256: 052e3cbcdc62affe59e8ee596abc0da63cce3e7f86ea46149b18fd06c3da05d4 +SHA512: 4be4a52ca6fb7d49c8db46b7729f887b3d192ad9f764701be9c1f60a219f31121e7f0894597d2a366a1c6a74ef54431d7f4fe991bb58f0b9dfb439939b483513 +Homepage: http://www.flashrom.org +Description: Identify, read, write, erase, and verify BIOS/ROM/flash chips - library + flashrom is a tool for identifying, reading, writing, verifying and erasing + flash chips. It's often used to flash BIOS/EFI/coreboot/firmware/optionROM + images in-system using a supported mainboard, but it also supports flashing of + network cards (NICs), SATA controller cards, and other external devices which + can program flash chips. + . + It supports a wide range of DIP32, PLCC32, DIP8, SO8/SOIC8, TSOP32/40/48, + and BGA chips, which use various protocols such as LPC, FWH, parallel + flash, or SPI. + . + The tool can be used to flash BIOS/firmware images for example -- be it + proprietary BIOS images or coreboot (previously known as LinuxBIOS) images. + . + It can also be used to read the current existing BIOS/firmware from a + flash chip. + . + This package provides flashrom library development files. + +Package: libfont-afm-perl +Architecture: all +Version: 1.20-4 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 68 +Depends: perl:any +Filename: pool/libfont-afm-perl_1.20-4_all.deb +Size: 12990 +MD5sum: 283603bc918498a04fa4d06a2d4432d0 +SHA1: bdfd077c1c3d0bb2235185e5c298fabebcd09a68 +SHA256: 8607b7a6845707e3ff97ee0790e04002710f1aaf4094e0aeca050a104bddb1a6 +SHA512: d2b5c7be13a0b278eaaded9051f9ec19bfe913ae19da6917f2ed43d4435b528e29fd6a30d3f1d5950a97e497d77b4f5bc863a85a005dd70fcf3110a3fdce8d9f +Homepage: https://metacpan.org/release/Font-AFM +Description: Perl interface to Adobe Font Metrics files + This module implements the Font::AFM class. Objects of this class are + initialised from an AFM-file and allow you to obtain information + about the font and the metrics of the various glyphs in the font. + . + All measurements in AFM files are given in terms of units equal to + 1/1000 of the scale factor of the font being used. To compute actual + sizes in a document, these amounts should be multiplied by (scale + factor of font)/1000. + +Package: libfontconfig1 +Architecture: amd64 +Version: 2.17.1-3ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: fontconfig +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 358 +Provides: libfontconfig +Depends: libc6 (>= 2.38), libexpat1 (>= 2.0.1), libfreetype6 (>= 2.9.1), fontconfig-config (>= 2.17.1-3ubuntu1) +Breaks: xpdf (<= 3.03-11) +Filename: pool/libfontconfig1_2.17.1-3ubuntu1_amd64.deb +Size: 144082 +MD5sum: 54aeab8c135be9fe50fe2bed4c2a7af2 +SHA1: 047e067089d01be7a4af354140e74bed544ae6ee +SHA256: 72ba4fc43155566b46442b741a6892d5d1f1581ba58cdfd037aabf47ad9080f7 +SHA512: ab5e518bb927b8de234e6fa0eac6ce50a0e42009c41bb7e207f94fe6e0e8f5d0b936b12efbc5556b554f20f1a4d88449b496c2925687108bcc518eb423ad2d14 +Homepage: https://www.freedesktop.org/wiki/Software/fontconfig/ +Description: generic font configuration library - runtime + Fontconfig is a font configuration and customization library, which + does not depend on the X Window System. It is designed to locate + fonts within the system and select them according to requirements + specified by applications. + . + This package contains the runtime library needed to launch applications + using fontconfig. + +Package: libfontenc1 +Architecture: amd64 +Version: 1:1.1.8-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libfontenc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 53 +Depends: libc6 (>= 2.38), zlib1g (>= 1:1.1.4) +Filename: pool/libfontenc1_1%3a1.1.8-1build2_amd64.deb +Size: 14052 +MD5sum: 758d56b085f23f079f33700200a5a9f8 +SHA1: 21c6944a47f767784b87ac1da09c0736e6ba35a5 +SHA256: 1fab0e125d793da45d91b346c334c496776d69709a7ea78c3b34d5db6db69eab +SHA512: 8a5f13fa321b49f4709f1c147e638078fa3ae52c34e92086eb1fe5e86dc2551cd444da06da59ad729721cf5e8802ae89fa5e3a8a247514eb2ed2b2aa41a49910 +Description: X11 font encoding library + libfontenc is a library which helps font libraries portably determine + and deal with different encodings of fonts. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libfontenc + +Package: libfprint-2-2 +Architecture: amd64 +Version: 1:1.95.1+tod1-0ubuntu2 +Priority: optional +Section: libs +Source: libfprint +Maintainer: Ubuntu Developers +Original-Maintainer: FingerForce Team +Installed-Size: 899 +Depends: libc6 (>= 2.38), libfprint-2-tod1 (>= 1:1.95.1+tod1), libglib2.0-0t64 (>= 2.80.0), libgudev-1.0-0 (>= 146), libgusb2a (>= 0.3.3), libssl3t64 (>= 3.0.0) +Filename: pool/libfprint-2-2_1%3a1.95.1+tod1-0ubuntu2_amd64.deb +Size: 305118 +MD5sum: f93f02a9c5e22f36572ffdf26039ef9e +SHA1: f652e7c9fffbf12bbd07fb014fc82b186730cd88 +SHA256: aa09cc1ac94608ac1dcaca0bfda0b172a466b6d6ad99a2fc8f5477c23222842a +SHA512: dba7faba708fd574909c74befd268f2ef4a520ba1e0f5126531c497da7e5c260da420e8c750c0d5084b159f59181db4ac215e49516f479b4fc9bf23a4f12bf7a +Homepage: https://www.freedesktop.org/wiki/Software/fprint/libfprint +Description: async fingerprint library of fprint project, shared libraries + The fprint project aims to support for consumer fingerprint reader devices. + . + Previously, Linux support for such devices has been scattered amongst different + projects (many incomplete) and inconsistent in that application developers + would have to implement support for each type of fingerprint reader separately. + The idea is to change that by providing a central system to support all the + fingerprint readers as it's possible to get hands on. + . + libfprint is the centre of efforts, this component does the dirty job of + talking to fingerprint reading devices, and processing fingerprint data. + . + This library depends on the new libusb, which performs asynchronous callbacks, + allowing fprint to perform non-blocking device tasks. + . + This package provides shared libraries. + +Package: libfprint-2-tod1 +Architecture: amd64 +Version: 1:1.95.1+tod1-0ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libfprint +Maintainer: Ubuntu Developers +Original-Maintainer: FingerForce Team +Installed-Size: 254 +Depends: libc6 (>= 2.29), libglib2.0-0t64 (>= 2.80.0), libgusb2a (>= 0.2.4), libpixman-1-0 (>= 0.30.0), libssl3t64 (>= 3.0.0) +Filename: pool/libfprint-2-tod1_1%3a1.95.1+tod1-0ubuntu2_amd64.deb +Size: 93324 +MD5sum: 1ca67c35e86f03b5e623bc01e6d3397e +SHA1: 01d95348f7e78abc67e807593d0ebf0074a45269 +SHA256: aad2e14758121dede1d30aafed754374c7716f735e58074105eded2fb1c8ab9e +SHA512: 79613033890bf8af056ffa0f9352b43e5c8dc8ac961397fe2110d8ba218f8d7f3528605d210d59f5da60d226fd16531f01a957d184a0165dbff79c26a54846fe +Homepage: https://www.freedesktop.org/wiki/Software/fprint/libfprint +Description: async fingerprint library of fprint project, drivers shared libraries + The fprint project aims to support for consumer fingerprint reader devices. + . + Previously, Linux support for such devices has been scattered amongst different + projects (many incomplete) and inconsistent in that application developers + would have to implement support for each type of fingerprint reader separately. + The idea is to change that by providing a central system to support all the + fingerprint readers as it's possible to get hands on. + . + libfprint is the centre of efforts, this component does the dirty job of + talking to fingerprint reading devices, and processing fingerprint data. + . + This library depends on the new libusb, which performs asynchronous callbacks, + allowing fprint to perform non-blocking device tasks. + . + This package provides shared libraries for the TOD drivers. + +Package: libfreeaptx0 +Architecture: amd64 +Version: 0.2.2-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libfreeaptx +Maintainer: Ubuntu Developers +Original-Maintainer: Kentaro Hayashi +Installed-Size: 43 +Depends: libc6 (>= 2.4) +Filename: pool/libfreeaptx0_0.2.2-1build1_amd64.deb +Size: 13682 +MD5sum: 0ab0336e88608a27a235df773148a46b +SHA1: 9f4fe89cbe37260e8bf8d8e73d844ae7bd0f53db +SHA256: 34bc0fc4708e3f901f63211715dfd93f647d97d26d02cc335d9b569c8036ce7f +SHA512: cdac6de5df5fdac9dc545ef93789f9c09096ab672ee3b69f93ab672e10b1b9d73a627fc025a3f00d64ce886c28c2bc1aca8350b84cac621043f585599acf0366 +Homepage: https://github.com/iamthehorker/libfreeaptx +Description: Free implementation of aptX + libfreeaptx is based on version 0.2.0 of libopenaptx with the intent of + continuing under a free license without the additional license restriction + added to libopenaptx 0.2.1. + . + The initial version of libfreeaptx was reset to 0.1.0 to prevent confusion + between the two projects. + +Package: libfreeipmi17 +Architecture: amd64 +Version: 1.6.16-1ubuntu0.1 +Priority: optional +Section: libs +Source: freeipmi +Maintainer: Ubuntu Developers +Original-Maintainer: Fabio Fantoni +Installed-Size: 5406 +Depends: freeipmi-common (>= 1.6.16-1ubuntu0.1), libc6 (>= 2.39), libgcrypt20 (>= 1.12.0) +Filename: pool/libfreeipmi17_1.6.16-1ubuntu0.1_amd64.deb +Size: 931172 +MD5sum: 6bbf5df312b60596e3e5de6fbfe8184c +SHA1: 7f097594b3168bcde0b4128147d000826fa1728c +SHA256: b5cbdd3a27d0afef2b6fcc1a4f673af471cec0108c507df852dbd0e6e46c4c3a +SHA512: 0637f335a6ca7f3320f30091c5a74fe04c695a1d2b344374c8900240bda465b295d2b55728bd32c4ca4ad8da37610e326c4876ddf90ed4d647477f201d921d9a +Homepage: https://www.gnu.org/software/freeipmi/ +Description: GNU IPMI - libraries + FreeIPMI is a collection of Intelligent Platform Management IPMI + system software. It provides in-band and out-of-band software and a + development library conforming to the Intelligent Platform Management + Interface (IPMI v1.5 and v2.0) standards. + . + OpenIPMI, KCS, SMIC, SSIF, LAN drivers, and an IPMI API in a C Library. + +Package: libfreerdp-server3-3 +Architecture: amd64 +Version: 3.31.0+dfsg-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: freerdp3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Remote Maintainers +Installed-Size: 317 +Depends: libc6 (>= 2.14), libfreerdp3-3 (= 3.31.0+dfsg-0ubuntu0.26.04.1), libwinpr3-3 (>= 3.31.0) +Filename: pool/libfreerdp-server3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +Size: 102762 +MD5sum: ea011501f54932c1550f26eb193569fa +SHA1: cbd6bc33254377a08be47f516751c6f4e35ca769 +SHA256: 25352bd5c4bcd537b021a2e8d5f703345522ed187a7da90f25c3bdac663bc0d1 +SHA512: 48bd0378f8467cbe806e78d1fd78c89617c38bec2035be1ae384c8a426ce657c31e4f4bc2b0702a7bc572ece6d0b099f0c18ff1044d357cc928ab42b1382984c +Homepage: https://www.freerdp.com/ +Description: Free Remote Desktop Protocol library (server library) + FreeRDP is a libre client/server implementation of the Remote + Desktop Protocol (RDP). + . + This package contains the shared library with common server functionality. + +Package: libfreerdp3-3 +Architecture: amd64 +Version: 3.31.0+dfsg-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: freerdp3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Remote Maintainers +Installed-Size: 2243 +Depends: libc6 (>= 2.32), libcairo2 (>= 1.2.4), libopus0 (>= 1.1), libssl3t64 (>= 3.0.0), libwinpr3-3 (= 3.31.0+dfsg-0ubuntu0.26.04.1), libx11-6, libxkbfile1 (>= 1:1.1.0), zlib1g (>= 1:1.1.4) +Suggests: freerdp-x11 +Filename: pool/libfreerdp3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +Size: 813474 +MD5sum: ccfa3b25b60278fc5e810bc21412acfe +SHA1: 53de5c9bad6e40eec801fe7132ac179a75798925 +SHA256: ba51dbc5c2bce3de8515b04cc287a804424f651a4820ad52d91b8fe4a9461cc0 +SHA512: 499d40120e2989cdf8ea6768a479a7a36d8e29443fe8af7469a510902b769af1be497dd2f49a3ccabc046ed5c55c21b47f613fc5d77366a50aa8265c9bcc9947 +Homepage: https://www.freerdp.com/ +Description: Free Remote Desktop Protocol library (core library) + FreeRDP is a libre client/server implementation of the Remote + Desktop Protocol (RDP). + . + This package contains the shared library with all core functionality. + +Package: libfreetype6 +Architecture: amd64 +Version: 2.14.2+dfsg-1ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: freetype +Maintainer: Ubuntu Developers +Original-Maintainer: Hugh McMaster +Installed-Size: 906 +Depends: libbrotli1 (>= 0.6.0), libbz2-1.0, libc6 (>= 2.38), libpng16-16t64 (>= 1.6.46), zlib1g (>= 1:1.1.4) +Filename: pool/libfreetype6_2.14.2+dfsg-1ubuntu0.1_amd64.deb +Size: 408644 +MD5sum: 0944b49c884cd82670bf0b05a5907f4b +SHA1: 8e087e1f4c4cdde9b662117672aeb09a5529f7de +SHA256: 6b4a9275b158307ecb4f6ba7088f2731b017b775a9b65c61afcb5b15be3e8cf5 +SHA512: bc3746c819208c5068d79758c2da91f393f49e435d65b9dcc26ac6596b5f30163426b602adcd082444a81ace5b23f2365b84c00f747527ce2d65e5ec3daa4f80 +Homepage: https://freetype.org +Description: Freetype 2 font engine, shared library files + The FreeType project is a team of volunteers who develop free, + portable and high-quality software solutions for digital typography. + They specifically target embedded systems and focus on providing small, + efficient and ubiquitous products. + . + The FreeType 2 library is their new software font engine. It has been + designed to provide the following important features: + * A universal and simple API to manage font files + * Support for several font formats through loadable modules + * High-quality anti-aliasing + * High portability & performance + . + Supported font formats include: + * TrueType files (.ttf) and collections (.ttc) + * Type 1 font files both in ASCII (.pfa) or binary (.pfb) format + * Type 1 Multiple Master fonts. The FreeType 2 API also provides + routines to manage design instances easily + * Type 1 CID-keyed fonts + * OpenType/CFF (.otf) fonts + * CFF/Type 2 fonts + * Adobe CEF fonts (.cef), used to embed fonts in SVG documents with + the Adobe SVG viewer plugin. + * Windows FNT/FON bitmap fonts + . + This package contains the files needed to run programs that use the + FreeType 2 library. + +Package: libfribidi0 +Architecture: amd64 +Version: 1.0.16-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: fribidi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Hebrew Packaging Team +Installed-Size: 144 +Depends: libc6 (>= 2.4) +Filename: pool/libfribidi0_1.0.16-5_amd64.deb +Size: 26594 +MD5sum: 8a55f4a89b8ca4965537748efc8a462b +SHA1: f0f12eaadfb3458c9ccdd1eb00f545e581cc8aee +SHA256: 47fb50e96401a46c06d5122cd04cc42316f65530b9f868d2d450576a379d5d34 +SHA512: c32c5d588f0a22f5b2c572bd5fd368808107b002b8118b369a5e31d060afb748889b4d93f07c4d2bc36f561c9672996cf1dcf79571993e5bbd34e250a5368d02 +Homepage: http://www.fribidi.org/ +Description: Free Implementation of the Unicode BiDi algorithm + FriBiDi is a BiDi algorithm implementation for Hebrew and/or Arabic + languages. + This package contains the shared libraries. + +Package: libftdi1-2 +Architecture: amd64 +Version: 1.6~rc1-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libftdi1 +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 88 +Depends: libc6 (>= 2.38), libusb-1.0-0 (>= 2:1.0.16) +Filename: pool/libftdi1-2_1.6~rc1-1build1_amd64.deb +Size: 30670 +MD5sum: 25f3017b1d96c91ac24497acdd3dc12a +SHA1: eeecbd56fa5df953458333521f53e9d7320dea63 +SHA256: 180fb0080df4340c2890e94c08ef089c555521ec9f7e3ee7b85fd217d40acaf7 +SHA512: 8989bf08a5ccbb1f78e267512d0e2f6d0cc2aa35d70e7a8c218db48354c046d622f498cf30593dd25aab65c9aaa6eaf946c6c69d875965a1e866c476a6902d7e +Homepage: https://www.intra2net.com/en/developer/libftdi/ +Description: C Library to control and program the FTDI USB controllers + This library could talk to FTDI's FT232BM, FT245BM, FT2232C, FT2232D, FT245R, + FT232H and FT230X type USB chips from userspace. It uses libusb 1.0 to + communicate with the chips. + . + Functionalities include the possibility to use the chips in standard + mode, in bitbang mode, and to read or write the serial EEPROM. + . + This is the C version of the library. + +Package: libfuse3-4 +Architecture: amd64 +Version: 3.18.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: fuse3 +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 313 +Depends: libc6 (>= 2.38) +Suggests: fuse3 +Filename: pool/libfuse3-4_3.18.2-1_amd64.deb +Size: 92984 +MD5sum: 7707db25a837318d29e60136af58ce0c +SHA1: 0f246457d716dd32d4b78bf6b670bf1f962b6d22 +SHA256: 59ae972173e389eb981aaeae874b3d6aafe7eceff284f94e5c21ee1d049548c6 +SHA512: 0eec9a2bab8cbfff857dd76493cf0de4c3b24ca62ce6c2337770f3139ba7de430dbbdefc17d44f256968a4b517b9b90fd8c50b4e9d2ccf8f69cc50ea89526f9d +Homepage: https://github.com/libfuse/libfuse/wiki +Description: Filesystem in Userspace (library) (3.x version) + Filesystem in Userspace (FUSE) is a simple interface for userspace programs to + export a virtual filesystem to the Linux kernel. It also aims to provide a + secure method for non privileged users to create and mount their own filesystem + implementations. + . + This package contains the shared library. + +Package: libfwupd3 +Architecture: amd64 +Version: 2.1.1-1ubuntu3.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: fwupd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI +Installed-Size: 524 +Depends: libc6 (>= 2.32), libcurl3t64-gnutls (>= 7.63.0), libglib2.0-0t64 (>= 2.80.0), libjcat1 (>= 0.1.0) +Filename: pool/libfwupd3_2.1.1-1ubuntu3.1_amd64.deb +Size: 145132 +MD5sum: a2f58115478b02a2860812e1404885a3 +SHA1: d263679317ee8d62c71cdfea0a0dcc3d8f0a5dc5 +SHA256: 6b2632406478ee905fcc26af5d27bdeabb5fc2a9c08bc218669a40e91a73eadb +SHA512: 5ab109af6caafbcd81b3fd4a2d67c1d02eaf417c483a9af7c0944dc83362371f880eeb882b7c0b57afbc8461d7e98db84b37ace4fa44030e54e123bff596a214 +Homepage: https://github.com/fwupd/fwupd +Description: Firmware update daemon library + fwupd is a daemon to allow session software to update device firmware. + You can either use a GUI software manager like GNOME Software to view and + apply updates, the command-line tool or the system D-Bus interface directly. + Firmware updates are supported for a variety of technologies. + See for details + . + This package provides the library used by the daemon. + +Package: libfyaml0 +Architecture: amd64 +Version: 0.9.4-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libfyaml +Maintainer: Ubuntu Developers +Original-Maintainer: Jose Luis Blanco Claraco +Installed-Size: 797 +Depends: libc6 (>= 2.38) +Filename: pool/libfyaml0_0.9.4-1_amd64.deb +Size: 300734 +MD5sum: 012b6fcb7028d4bbec64a9da07a394ac +SHA1: d89daef2256db347f78482b070241e8d324a6242 +SHA256: fb93f8517a7fbabbe890fe6c35f4854f2890547d2b5b76532ee60060d4de94cd +SHA512: 3efed3c9debf4f7bd1720385e5265e3571cceb2145e13b097fe6dd1b1c17f649e410eee3b664b8721225b5939c81e7cb1deb00b8065801594a72ac7fb88beed9 +Homepage: https://github.com/pantoniou/libfyaml +Description: Fully feature complete YAML parser and emitter (library) + Fully feature complete YAML parser and emitter, supporting the latest YAML + spec and passing the full YAML testsuite. + . + It is designed to be very efficient, avoiding copies of data, and has no + artificial limits like the 1024 character limit for implicit keys. + +Package: libgamemode0 +Architecture: amd64 +Version: 1.8.2-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gamemode +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Games Team +Installed-Size: 45 +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10), gamemode-daemon +Filename: pool/libgamemode0_1.8.2-2build1_amd64.deb +Size: 8236 +MD5sum: 3eb9916f5d9b925bea297b733fe6a1c7 +SHA1: 68e9fd2d2fc6c099353f8980d3c342c3cf757e32 +SHA256: b542a5ecae1c6674768b192ac98a031621d2b73252bb502f584533f28fb9bf31 +SHA512: 130580b649862b6d70eba96471f2b4551f481d15d61ba84198dfe534fac47bc00bdbdccfdd0a732ef91ddf6e28d2fcfc0b907b3371920c6c9f156f9acd60d31c +Homepage: https://github.com/FeralInteractive/gamemode +Description: Optimise Linux system performance on demand (host library) + GameMode is a daemon/lib combo for Linux that allows games to request a set + of optimisations be temporarily applied to the host OS. + . + The design has a clear-cut abstraction between the host daemon and library + (gamemoded and libgamemode), and the client loaders (libgamemodeauto and + gamemode_client.h) that allows for safe use without worrying about whether + the daemon is installed or running. This design also means that while the + host library currently relies on systemd for exchanging messages with the + daemon, it's entirely possible to implement other internals that still work + with the same clients. + . + GameMode was designed primarily as a stop-gap solution to problems with + the Intel and AMD CPU powersave or ondemand governors, but is intended to + be expanded beyond just CPU governor states, as there are a wealth of + automation tasks one might want to apply. + . + This package provides the host library for gamemode. It is an internal + library which communicates with the daemon. + +Package: libgamemodeauto0 +Architecture: amd64 +Version: 1.8.2-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gamemode +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Games Team +Installed-Size: 37 +Depends: libc6 (>= 2.34) +Recommends: libgamemode0 (= 1.8.2-2build1) +Filename: pool/libgamemodeauto0_1.8.2-2build1_amd64.deb +Size: 8772 +MD5sum: 84b942b30f11a097060e23bb642262dc +SHA1: 326a248c9efc20397e1ebe374e0063e0ecef2b5c +SHA256: 9e05312a3ffd06da99a55bd324adc2eb166fb0e5a945d17de4905a10db5648ee +SHA512: 0a9880a607a80502a11488c53e66b7e5d7f19c7ab67313b0163120785f2197309326465ec8838b785b5ac312fdd2b3629e7643bd699de452220e0f19a3ad5b56 +Homepage: https://github.com/FeralInteractive/gamemode +Description: Optimise Linux system performance on demand (client library) + GameMode is a daemon/lib combo for Linux that allows games to request a set + of optimisations be temporarily applied to the host OS. + . + The design has a clear-cut abstraction between the host daemon and library + (gamemoded and libgamemode), and the client loaders (libgamemodeauto and + gamemode_client.h) that allows for safe use without worrying about whether + the daemon is installed or running. This design also means that while the + host library currently relies on systemd for exchanging messages with the + daemon, it's entirely possible to implement other internals that still work + with the same clients. + . + GameMode was designed primarily as a stop-gap solution to problems with + the Intel and AMD CPU powersave or ondemand governors, but is intended to + be expanded beyond just CPU governor states, as there are a wealth of + automation tasks one might want to apply. + . + This package provides the libgamemodeauto library. It is a client library + which loads libgamemode if installed. The library can also be used to inject + gamemode into any program with the LD_PRELOAD environment variable. + +Package: libgbm1 +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 206 +Depends: mesa-libgallium (= 26.0.8-1ubuntu0.3), libc6 (>= 2.38), libdrm2 (>= 2.4.125-1), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.4) +Filename: pool/libgbm1_26.0.8-1ubuntu0.3_amd64.deb +Size: 49194 +MD5sum: a719bdcbbe49b9e32afb6de1f148782b +SHA1: 5971d05cc92beac82ed411246bb595dd9afbc1b3 +SHA256: 5d2d1eaf0f72c5a2c4aef692e5660c6fa61e46542c4d9cb5593ba8bd020b2eea +SHA512: dc3efb8b2c956bc2296d6d528e967b21ad3912ac362119a67cea71d5314516f93c6a23827868334e8ca28a19cf379510973385ab9c97fa1d467beb49e9ad720a +Homepage: https://mesa3d.org/ +Description: generic buffer management API -- runtime + This package contains the GBM buffer management library. It provides a + mechanism for allocating buffers for graphics rendering tied to Mesa. + . + GBM is intended to be used as a native platform for EGL on drm or openwfd. + +Package: libgck-1-0 +Architecture: amd64 +Version: 3.41.2-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcr +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 249 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libp11-kit0 (>= 0.25.0) +Filename: pool/libgck-1-0_3.41.2-6_amd64.deb +Size: 80376 +MD5sum: 1645aab05bfbab0da36e73be55e2792e +SHA1: b153f3a57a24e897dae8350a995de66a49dd50f7 +SHA256: a8dd84aa3583486942728f2266a1d3b9d1fa5b2799b830bfe8e884d5da93cfa1 +SHA512: 17c1bc3a5cf24cdb502c184f1493e85843488b5d7e4cc6fe7f30a538f00231c67372408fcbb9618bb09cde906835ae555165288a1fefcd0c05083d1814a8870b +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: Glib wrapper library for PKCS#11 - runtime + GCK is a wrapper based on GLib implementing the PKCS#11 (Cryptoki) + interface. + . + This package contains the shared libraries needed to run programs + built against the GCK library. + +Package: libgck-2-2 +Architecture: amd64 +Version: 4.4.0.1-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcr4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 233 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.74.0), libp11-kit0 (>= 0.25.0) +Filename: pool/libgck-2-2_4.4.0.1-8_amd64.deb +Size: 78382 +MD5sum: 70eb8b316df565b9c82d6f6099627243 +SHA1: d8f0469d3f89867eac3c51fc75ff67c2f9a3ef1a +SHA256: d002ab48cfd02d17ea577d48871e6d6d47b9a25ea8211df51bee205cb41cf481 +SHA512: 164e8f0c113655a95b6ff1f2a4c2e2a7ad57672ebf1f1ea9b1e47206928d62c238ebb1ceeeb117183112bd0c60fece31b8c72c2ca114bf67176f32dc1eeedfdd +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: Glib wrapper library for PKCS#11 - runtime + GCK is a wrapper based on GLib implementing the PKCS#11 (Cryptoki) + interface. + . + This package contains the shared libraries needed to run programs + built against the GCK library. + +Package: libgcr-4-4 +Architecture: amd64 +Version: 4.4.0.1-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcr4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 686 +Depends: libgck-2-2 (= 4.4.0.1-8), libc6 (>= 2.38), libgcrypt20 (>= 1.11.1), libglib2.0-0t64 (>= 2.74.0), libp11-kit0 (>= 0.25.0) +Filename: pool/libgcr-4-4_4.4.0.1-8_amd64.deb +Size: 204978 +MD5sum: 8cad7608e53fcf041c1e186e7b4b9123 +SHA1: 9b533328354b501e85495c09b29fae1a87690417 +SHA256: ddee1a92057340b19e604403443f23d43afb4d76188ce89576cdfabab0f3f4d7 +SHA512: d2d2d9cc6a7dfe73217b9dbe6726a89f891a640d5b378e3cfb3cbb649122d6b06d62e294bec1cc662321f7381c67eeeff75c5e8fa7efa7017c43341c2c6927d9 +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: Library for Crypto related tasks + GCR is a library for crypto UI and related tasks. + . + This package contains the GObject library for high level crypto + parsing. + +Package: libgcr-base-3-1 +Architecture: amd64 +Version: 3.41.2-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcr +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 657 +Depends: libgck-1-0 (= 3.41.2-6), libc6 (>= 2.38), libgcrypt20 (>= 1.11.1), libglib2.0-0t64 (>= 2.83.0), libp11-kit0 (>= 0.25.0) +Breaks: libgcr-3-1 (<< 3.8.2-2) +Replaces: libgcr-3-1 (<< 3.8.2-2) +Filename: pool/libgcr-base-3-1_3.41.2-6_amd64.deb +Size: 200850 +MD5sum: b57f6d9d04c2f38a6c5ee9efa3eed3f5 +SHA1: 6dc12d1fe42fa6d54f3a28e19fe1bfa171aef390 +SHA256: 9513409787d4dc4242943c0d8a4fb2de12ff21c281612007402bd0d731aa9b64 +SHA512: 77821785ab298892045656692907139ecdfd80e572698225991369a5c8df1c6fa64e3e4f2f01034d5855038f9eadb896d45ee0a75cd2d10848652c4caebe15ee +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: Library for Crypto related tasks + GCR is a library for crypto UI and related tasks. + . + This package contains the GObject library for high level crypto + parsing. + +Package: libgcr-ui-3-1 +Architecture: amd64 +Version: 3.41.2-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcr +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 451 +Depends: libgck-1-0 (= 3.41.2-6), libgcr-base-3-1 (= 3.41.2-6), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.22.0), libpango-1.0-0 (>= 1.18.0) +Breaks: libgcr-3-1 (<< 3.8.2-2) +Replaces: libgcr-3-1 (<< 3.8.2-2) +Filename: pool/libgcr-ui-3-1_3.41.2-6_amd64.deb +Size: 124882 +MD5sum: 687bd602af7a9634922996e0a875071a +SHA1: c280f778452d1ccdbe1077f7378f314c10b73c64 +SHA256: 6181c2e4a574ed06ef2118aeb248c4188f496ce2c06a7dd06ca3f61580c4332b +SHA512: cf2f76aad134a85d74e4a3eefc464483bb48129c8f177f60ea114f34d9ee20b936b98e68c557ef1a0ba30c35b314fbdaec21117d0c191ee87539483c44ae7e09 +Homepage: https://wiki.gnome.org/Projects/GnomeKeyring +Description: Library for Crypto UI related tasks + GCR is a library for crypto UI and related tasks. + . + This package contains the GObject and GUI library for high level + crypto parsing and display. + +Package: libgd3 +Architecture: amd64 +Version: 2.3.3-13ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgd2 +Maintainer: Ubuntu Developers +Original-Maintainer: GD Team +Installed-Size: 441 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), libheif1 (>= 1.3.2), libimagequant0 (>= 2.11.10), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libtiff6 (>= 4.0.3), libwebp7 (>= 1.5.0), libxpm4 +Suggests: libgd-tools +Filename: pool/libgd3_2.3.3-13ubuntu2_amd64.deb +Size: 129548 +MD5sum: 3c8aec40daa5bfa260e039bd69e13df4 +SHA1: b84f8c737bd7697758e23a916ac306bd4ac4ea0b +SHA256: 1a50c33b68c378003223cc30c8eaea2e17e113e7a65ed7cb6baef72983b739a9 +SHA512: 0fff179d17ab845741d6c9da7bf07a1db5729b39638f47627bcfdcfb58ddf50ad6e4dbd38e3abed492d908b195b036b79c6fdb412dcb3c7a28fb50ef0289319a +Homepage: http://www.libgd.org/ +Description: GD Graphics Library + GD is a graphics library. It allows your code to quickly draw images + complete with lines, arcs, text, multiple colours, cut and paste from + other images, flood fills, and write out the result as a PNG file. + This is particularly useful in World Wide Web applications, where PNG is + one of the formats accepted for inline images by most browsers. + . + This is the runtime package of the library. + +Package: libgdbm-compat4t64 +Architecture: amd64 +Version: 1.26-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gdbm +Maintainer: Ubuntu Developers +Original-Maintainer: Nicolas Mora +Installed-Size: 35 +Provides: libgdbm-compat4 (= 1.26-1build1) +Depends: libc6 (>= 2.33), libgdbm6t64 (>= 1.16) +Breaks: libgdbm-compat4 (<< 1.26-1build1) +Replaces: libgdbm-compat4 +Filename: pool/libgdbm-compat4t64_1.26-1build1_amd64.deb +Size: 6796 +MD5sum: 3ed2b7fb4ab2fc76f6d1394a9b543556 +SHA1: 9f467b82441a91e51092f07460a7523fbbf00e37 +SHA256: e9ef750cc8ba426dee52f56aba0150e7e463b2658173bed8c4ca2927eec1c447 +SHA512: d3bb70a317010b454fcc7ecc3e0259b3207fd5383e02443b832eb6d1455c3e78864495c0ebf619caefeea8214baa50b0848b52804990997fe152e7b981bb9da6 +Homepage: https://gnu.org/software/gdbm +Description: GNU dbm database routines (legacy support runtime version) + GNU dbm ('gdbm') is a library of database functions that use extendible + hashing and works similarly to the standard UNIX 'dbm' functions. + . + The basic use of 'gdbm' is to store key/data pairs in a data file, thus + providing a persistent version of the 'dictionary' Abstract Data Type + ('hash' to perl programmers). + This package includes library files, required to run old programs, + that use legacy 'dbm' interface. For new programs, please use modern + interface, provided by libgdbm6t64 and libgdbm-dev. + +Package: libgdbm6t64 +Architecture: amd64 +Version: 1.26-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gdbm +Maintainer: Ubuntu Developers +Original-Maintainer: Nicolas Mora +Installed-Size: 97 +Provides: libgdbm6 (= 1.26-1build1) +Depends: libc6 (>= 2.38) +Suggests: gdbm-l10n (= 1.26-1build1) +Breaks: libgdbm6 (<< 1.26-1build1) +Replaces: libgdbm6 +Filename: pool/libgdbm6t64_1.26-1build1_amd64.deb +Size: 36470 +MD5sum: f7142f9ac6d70f731797901b7ba68fa7 +SHA1: 6f269cbaa77e18fbcc8ad6793e6663a3669a153d +SHA256: 0752eddff4c494d682f433cac2f1d25196f0a405eb8c6b0b10ec46432f6fec71 +SHA512: 94ad8100f710403224212ee2ba86622e7f4e8bcaddce067317cc26ef2a657558b573e8288431512ac42dca8e95a5cd9f26388a8a6b6c57692fbfc58b3702db64 +Homepage: https://gnu.org/software/gdbm +Description: GNU dbm database routines (runtime version) + GNU dbm ('gdbm') is a library of database functions that use extendible + hashing and works similarly to the standard UNIX 'dbm' functions. + . + The basic use of 'gdbm' is to store key/data pairs in a data file, thus + providing a persistent version of the 'dictionary' Abstract Data Type + ('hash' to perl programmers). + +Package: libgdk-pixbuf-2.0-0 +Architecture: amd64 +Version: 2.44.5+dfsg-4ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gdk-pixbuf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 270 +Depends: glycin-thumbnailers (>= 2.0.8), libgdk-pixbuf2.0-common (>= 2.44.5+dfsg-4ubuntu1), shared-mime-info, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libglycin-2-0 (>= 2.0.8) +Filename: pool/libgdk-pixbuf-2.0-0_2.44.5+dfsg-4ubuntu1_amd64.deb +Size: 100992 +MD5sum: f384dcb33aa31e5fc0f7960bf8543b3e +SHA1: 3a086bd1f0f10996df2922f641b05fc64309818c +SHA256: ccd902384546225842384de0c46dad4670ccdda17b697bed4518610ed2e08e89 +SHA512: 091f5ac53ae5a42a15abd151e0061d0a55c58ecde63f55398c9a44a34f1d7455e777b8b0822f3028d323b907b9a88cdeee8c09465a14248bee893f403f977433 +Homepage: https://www.gtk.org/ +Description: GDK Pixbuf library + The GDK Pixbuf library provides: + - Image loading and saving facilities. + - Fast scaling and compositing of pixbufs. + - Simple animation loading (ie. animated GIFs) + +Package: libgdk-pixbuf2.0-bin +Architecture: amd64 +Version: 2.44.5+dfsg-4ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gdk-pixbuf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 52 +Depends: libc6 (>= 2.34), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.12.0) +Filename: pool/libgdk-pixbuf2.0-bin_2.44.5+dfsg-4ubuntu1_amd64.deb +Size: 11198 +MD5sum: fbb57fdecfd741f9e6f15037e3f472e4 +SHA1: bb3b08d1e7a08a983ec25b7cbba4684dd96c46ba +SHA256: ea447cab507c8672e27004be1447c438d0abb3188fffd28aa49381980b294501 +SHA512: 5b4d488e86fb0c0655c317cbf553a6f4e31fe60de3133cafbcabe3534720fbdfd00f4fc3c77e60ea66d63e9e4c38ea9496342c172970106e39d367922e9b2c07 +Homepage: https://www.gtk.org/ +Description: GDK Pixbuf library (thumbnailer) + The GDK Pixbuf library provides: + - Image loading and saving facilities. + - Fast scaling and compositing of pixbufs. + - Simple animation loading (ie. animated GIFs) + . + This package contains the GDK pixdata compression utility, the thumbnailer + and a utility for converting images into C code. + +Package: libgdk-pixbuf2.0-common +Architecture: all +Version: 2.44.5+dfsg-4ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gdk-pixbuf +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 44 +Filename: pool/libgdk-pixbuf2.0-common_2.44.5+dfsg-4ubuntu1_all.deb +Size: 5754 +MD5sum: 248a62034b6f730abfc7b69c3eafa1eb +SHA1: f21e2af6d3557555537c539bb8e397ea053cc2c0 +SHA256: 2476d552009724d9b027236fcd2e4540a46f419d9d8b881f1d92edf10d6fcc13 +SHA512: 8523bbfa836bce1e6738c141fef2619a1d6cde8be55e754268b67013627fedfff9eb24498007e72516be82c6102ebc1e411293a6e025ba698bd2becf47dd7398 +Homepage: https://www.gtk.org/ +Description: GDK Pixbuf library - data files + This package contains the common files and translations for the GDK + Pixbuf library. + +Package: libgdm1 +Architecture: amd64 +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: libs +Source: gdm3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 223 +Depends: dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.33), libglib2.0-0t64 (>= 2.83.0), libsystemd0 (>= 259) +Filename: pool/libgdm1_50.1-0ubuntu0.1_amd64.deb +Size: 60486 +MD5sum: 436b056595187a82cde08b03e77f5a7e +SHA1: 89add1eae71e3f5dc664bd0043b01ebe0d9844d7 +SHA256: 044e3825d2979ebf3d3a6846f9fcd54d71c65ba6459e6704aec10b53f349e5c8 +SHA512: 4f52a0139f95962cfde9d336d42d2fe8ff6f7072c9f3f513a0353de018f4345cedfd269c5a70338259e20b84926739f189e57f94fe90ed7641493359f7b3b59a +Homepage: https://wiki.gnome.org/Projects/GDM/ +Description: GNOME Display Manager (shared library) + GDM provides the equivalent of a "login:" prompt for X displays: it + asks for a login and starts graphical sessions. + . + It supports multiple seats and switching between multiple users. + . + The greeter is based on the GNOME libraries and applications, and its + look and design are the same as those of a GNOME session. + . + This package contains the shared library required by gnome-shell. + +Package: libgee-0.8-2 +Architecture: amd64 +Version: 0.20.8-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgee-0.8 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 832 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.44.0) +Filename: pool/libgee-0.8-2_0.20.8-2_amd64.deb +Size: 230314 +MD5sum: 3043cfb8d92dfa08b3b1d2bac4c633e0 +SHA1: 96beba9fb6ce011bc640a2d041f9e075c76f57f8 +SHA256: e2a87e8415a637d9e44a2ecd0386cee113b0cd3c3e0563e168e81c7ea3c4f637 +SHA512: 6d4cb000948c026cc2c68438aeed2a81a8f2a107d4e07e709260497ac46d890aa26c909b94af813a58c61b417a4be589e279c93d1dce8d2b6e1570309142b0d4 +Homepage: https://wiki.gnome.org/Projects/Libgee +Description: GObject based collection and utility library + libgee is a collection library providing GObject-based interfaces and + classes for commonly used data structures. + . + libgee provides the following interfaces: + * Traversable + - Iterable + + Collection + # List + * BidirList + # Set + * SortedSet + - BidirSortedSet + # MultiSet + # Queue + * Deque + + Map + # SortedMap + * BidirSortedMap + - Iterator + + BidirIterator + # BidirListIterator + + ListIterator + # BidirListIterator + * MultiMap + * Future + . + The ArrayList, ArrauQueue, ConcurrentLinkedList, ConcurrentSet, HashSet, + HashMap, HashMultiSet, HashMultiMap, LinkedList, PriorityQueue, Promise, + TreeSet, TreeMap, TreeMultiSet, and TreeMultiMap classes provide a + reasonable sample implementation of those interfaces. In addition, a set of + abstract classes are provided to ease the implementation of new collections. + . + Around that, the API provides means to retrieve read-only views, efficient + sort algorithms, simple, bi-directional or index-based mutable iterators + depending on the collection type. + . + libgee is written in Vala and can be used like any GObject-based C library. + It's planned to provide bindings for further languages. + . + This package contains the shared libraries. + +Package: libgeoclue-2-0 +Architecture: amd64 +Version: 2.7.2-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: geoclue-2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 161 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.83.0), geoclue-2.0 (= 2.7.2-2ubuntu3) +Filename: pool/libgeoclue-2-0_2.7.2-2ubuntu3_amd64.deb +Size: 33694 +MD5sum: f38e482b15d8225484d813c35e132f51 +SHA1: f89ea20b99841e7ed977dbc3037de72e7d0e3492 +SHA256: 79eab8bb756c10d73a7e9e14db486a513e72e0d92741e0496b0881d5a86a1e62 +SHA512: 0a01e4456e8c9e7859e4d2221f3f6bc5199edd243492c0e318bd4082a99613a0eeb3465ace88d7e625114cfd7d3c4c498b154914444f94c12ce3278071168a12 +Homepage: https://gitlab.freedesktop.org/geoclue/geoclue/wikis/home +Description: convenience library to interact with geoinformation service + GeoClue is a D-Bus geoinformation service. The goal of the Geoclue project + is to make creating location-aware applications as simple as possible. + . + This package contains the shared library. + +Package: libgeocode-glib-2-0 +Architecture: amd64 +Version: 3.26.4-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: geocode-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 154 +Depends: geocode-glib-common (>= 3.26.4-3), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.0.3) +Breaks: gnome-clocks (<< 43~beta-2~), gnome-initial-setup (<< 43~), gnome-maps (<< 43~), gnome-settings-daemon (<< 43~beta-2~) +Filename: pool/libgeocode-glib-2-0_3.26.4-3_amd64.deb +Size: 45884 +MD5sum: 95afd2e24c2dc7541817b8abc9ce04d6 +SHA1: fbec7d8b3c41d03039b9a06ba5088548ca38709a +SHA256: 589ea635e9fb597517d7755cad80e33add17be72c9f62ad769751694bfce3d0e +SHA512: 46bb29cfc546a3ac26aea5c580e149a2549178eb05ae33d4ae992816d315090d28e8acceaa9325a7872956fbc41d724a231da344a5c494805779a250e20961a4 +Description: geocoding and reverse geocoding GLib library using Nominatim + Geocode-glib allows you to do geocoding (going from a place name, + to a longitude/latitude pair) and reverse geocoding (finding a place + name from coordinates) using the Nominatim service. + . + This library should be used in place of Geoclue's D-Bus API for + geocoding and reverse geocoding. + +Package: libgexiv2-2 +Architecture: amd64 +Version: 0.14.6-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: gexiv2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 253 +Depends: libc6 (>= 2.29), libexiv2-28 (>= 0.28.0), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.80.0), libstdc++6 (>= 13.1) +Filename: pool/libgexiv2-2_0.14.6-2_amd64.deb +Size: 78882 +MD5sum: ad3e1503edc1ae3748f205ac69564ddb +SHA1: 94db5e844aac5ef8b1386bc74befa841ce70b8b6 +SHA256: fa4a4d6c5c108396d7c1b218ea6a11b9948672fadaf0463a4a8df70d836b3c79 +SHA512: 72f709212fdf1e668296f63f340dce9c52ed6098ac81d22a42df4cccdde530a4dbcafcebb6e1732c9d7a10cc1e15bf4188cf6930d78ec5a6f777eb7452c861c9 +Homepage: https://wiki.gnome.org/Projects/gexiv2 +Description: GObject-based wrapper around the Exiv2 library + gexiv2 is a GObject-based wrapper around the Exiv2 library. It makes the basic + features of Exiv2 available to GNOME applications. + . + This package contains the shared library. + +Package: libgif7 +Architecture: amd64 +Version: 5.2.2-1ubuntu3.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: giflib +Maintainer: Ubuntu Developers +Original-Maintainer: David Suárez +Installed-Size: 75 +Depends: libc6 (>= 2.14) +Filename: pool/libgif7_5.2.2-1ubuntu3.2_amd64.deb +Size: 34680 +MD5sum: 7447cb640a0c147cd09ebe897ec5556b +SHA1: 72e27abaa3d7bde43da3d47afc81ceb03a70edf3 +SHA256: fce81875eaab4e01ca97ed7de1cc41e3ab589a09beb95b09c8ddd2caf2581284 +SHA512: 6ddbbc0771e49ab0744610051a2f7a498f54b0e8cad1f99b3258942a3868214a1fbbf2eef007e2a99b565950182f8ba6a145192026bb3bf27a58beb35ec51012 +Homepage: https://giflib.sourceforge.net/ +Description: library for GIF images (library) + GIFLIB is a package of portable tools and library routines for working with + GIF images. + . + This package contains the library. + +Package: libgirepository-1.0-1 +Architecture: amd64 +Version: 1.86.0-6build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gobject-introspection +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 235 +Provides: libgirepository-1.0-1-with-libffi8 (= 1.86.0-6build1) +Depends: libc6 (>= 2.29), libffi8 (>= 3.4), libglib2.0-0t64 (>= 2.82.0) +Breaks: libcjs0 (<< 4.8.2-1+b1), libgjs0g (<< 1.68.4-1+b1), libglib-object-introspection-perl (<< 0.051-2~), python-gi (<< 3.42.0-1+b1), python3-gi (<< 3.42.0-1+b1), ruby-gobject-introspection (<< 3.4.3-1+b2) +Filename: pool/libgirepository-1.0-1_1.86.0-6build1_amd64.deb +Size: 85974 +MD5sum: c345186b35bd1a8f607df30ef23eefdb +SHA1: 7ea5137c211a8113ea30ebbe24d12784eb89780f +SHA256: c795b1be91db3db57c31786523929815f01a461951132dd7570b4579a861d27f +SHA512: 839b7975800cba5befbf9443b4253d3b4dad45395e7f2f398fb5a5eb8403b345f2ca6a26fd21713c5a568aeb367212ba3eccd9734261abea30713876ee5adf3c +Homepage: https://wiki.gnome.org/GObjectIntrospection +Description: Library for handling GObject introspection data (runtime library) + GObject Introspection is a project for providing machine readable + introspection data of the API of C libraries. This introspection + data can be used in several different use cases, for example + automatic code generation for bindings, API verification and documentation + generation. + . + GObject Introspection contains tools to generate and handle the + introspection data. + . + This package contains a C library for handling the introspection data. + +Package: libgirepository-2.0-0 +Architecture: amd64 +Version: 2.88.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 258 +Provides: libgirepository-2.0-0-with-libffi8 (= 2.88.0-1) +Depends: libc6 (>= 2.38), libffi8 (>= 3.4), libglib2.0-0t64 (= 2.88.0-1) +Filename: pool/libgirepository-2.0-0_2.88.0-1_amd64.deb +Size: 76106 +MD5sum: aab814cc99e86e1ad92cd364acb6a788 +SHA1: 8fe7c6c19fd8de6baffde15c86507a2cee8e526a +SHA256: 994595dcff5f8cc736d70a4798314006dce41da34d95511786039239440669f4 +SHA512: 8a6ef804b0d6b5ac85c51334ef886176696cc6909e481c798b9869f096d2d99ea451901206df0e090d50eabce48e5ed893145ea49a9d68ad486f4989bd73fc15 +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: GLib runtime library for handling GObject introspection data + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared library used by language bindings such + as PyGObject and gjs to call GObject methods. + +Package: libgjs0 +Architecture: amd64 +Version: 1.88.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gjs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1755 +Depends: gir1.2-gio-2.0, gir1.2-girepository-3.0 (>= 2.86.0-7~), gir1.2-glib-2.0, gir1.2-gobject-2.0, libc6 (>= 2.38), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.14.0), libffi8 (>= 3.4), libgirepository-2.0-0 (>= 2.86.0-7~), libgirepository-2.0-0-with-libffi8 (>= 2.86.0-7~), libglib2.0-0t64 (>= 2.86.0-7~), libmozjs-140-0 (>= 140.8.0), libreadline8t64 (>= 6.0), libstdc++6 (>= 12), libx11-6 +Conflicts: libgjs0g +Replaces: libgjs0g +Filename: pool/libgjs0_1.88.0-1_amd64.deb +Size: 498268 +MD5sum: b881fee9bbf640d94197211255685e03 +SHA1: c9bda1362e75fc891dc5e7b293dae4219946757d +SHA256: e037f9d935e3762e39eddcc6ec39b7482804c9d2f2a97749e97a409d9e2397e8 +SHA512: 8b889931ee49716b9b948f71093454fd9da42c7587accb0112b6235e877b300a95882e9ed7287cb94a9393481762249fb4f0751344895e6b76296d51ba94bd4c +Homepage: https://gitlab.gnome.org/GNOME/gjs/-/blob/master/doc/README.md +Description: Mozilla-based javascript bindings for the GNOME platform + Makes it possible for applications to use all of GNOME's platform + libraries using the JavaScript language. It's mainly based on the + Mozilla JavaScript engine and the GObject introspection framework. + . + This is the shared library applications link to. + +Package: libgl1 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 648 +Depends: libc6 (>= 2.34), libglvnd0 (= 1.7.0-3), libglx0 (= 1.7.0-3) +Filename: pool/libgl1_1.7.0-3_amd64.deb +Size: 98292 +MD5sum: b1171b3c298c834b03c2cb40899858d9 +SHA1: 6862e834d6f8afc91365f4152ba6c2e5000f4071 +SHA256: 83ec3a454b28e947a6886e9ae8167e129e25d7a2fd741aaffcdca76eddff5955 +SHA512: 4f48bc51f23c0107bd96f81853cc919560e6b97907d3af66a71df4b0674930a9eed8d933863102027e14c4d604f16a0a019a215c9aa3cd5f58162211eb91fd83 +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library -- legacy GL support + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains support for old libGL for compatibility reasons. + +Package: libgl1-mesa-dri +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 287 +Depends: libgbm1 (= 26.0.8-1ubuntu0.3), libvulkan1, libc6 (>= 2.34) +Filename: pool/libgl1-mesa-dri_26.0.8-1ubuntu0.3_amd64.deb +Size: 38166 +MD5sum: 91408d4962007f58a4f0e8acdc06bca5 +SHA1: 3c1489fcec89dd650f0ebc418f16ce956e81e7b6 +SHA256: 585dfac64d7ca95a9813faad9f14c361d788069b7578859fb426c657dd528f08 +SHA512: 7e85c9dedc0dc6738edcce502498f6e87cad82f0084f25e7832a8f3a8c2868ed20b56201419b09622085b2d079e5f51f7e95e70274729f6502aa4083cceb8d72 +Homepage: https://mesa3d.org/ +Description: free implementation of the OpenGL API -- DRI modules + This version of Mesa provides GLX and DRI capabilities: it is capable of + both direct and indirect rendering. For direct rendering, it can use DRI + modules from the libgl1-mesa-dri package to accelerate drawing. + . + This package does not include the OpenGL library itself, only the DRI + modules for accelerating direct rendering. + . + For a complete description of Mesa, please look at the + libglx-mesa0 package. + +Package: libgles2 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 105 +Depends: libc6 (>= 2.34), libglvnd0 (= 1.7.0-3) +Filename: pool/libgles2_1.7.0-3_amd64.deb +Size: 17458 +MD5sum: 2d9724fdfaaa535941b8e9dbb5791e13 +SHA1: 31c6cbcdb5e2a3c08770af25a3032bca6a004744 +SHA256: 60113d7ec92c7ccdbd09e90b379bb9041581af3b85e28b3f250374025bb6440e +SHA512: 21ee1c4440d660abedc5f56c972378d4b55e108b79e565452bddfcea08c2596443134255e3aef7fbd6c464a2aac5d5cad6369f177331f17468a0352f8400d34b +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library -- GLESv2 support + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains support for GLESv2. + +Package: libglib-object-introspection-perl +Architecture: amd64 +Version: 0.052-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 235 +Depends: perl (>= 5.40.1-6), perlapi-5.40.1, libc6 (>= 2.34), libffi8 (>= 3.4), libgirepository-1.0-1 (>= 1.71.0), libgirepository-1.0-1-with-libffi8 (>= 1.62.0-4~), libglib2.0-0t64 (>= 2.24.0), libglib-perl +Suggests: libxml-libxml-perl +Filename: pool/libglib-object-introspection-perl_0.052-1_amd64.deb +Size: 69386 +MD5sum: a59624222490c6326759d0e82dd9edb9 +SHA1: a4544d8911de29d2c7cdcd8c98781ad794e919c8 +SHA256: 3d1ed6d17d7b8a6d2c9634c9a60c5f613f4534a801043180023508636bbc22e4 +SHA512: 1f0c076241ac25543dd366bd74b2a872ec71d6594d5906e3b0080c1f7a7122cdb21bbd390ffc88834ca769039eeed869acefe6da84cb99f02103bd6f4b730a0b +Homepage: https://metacpan.org/release/Glib-Object-Introspection +Description: Perl bindings for gobject-introspection libraries + GObject is an abstraction layer that allows programming with an object + paradigm that is compatible with many languages. It is a part of Glib, + the core library used to build GTK+ and GNOME. + . + This package contains Glib::Object::Introspection, the Perl binding + generator for libraries that support gobject-introspection, such as + GTK+, WebKit, libsoup and many more. + . + To use perli11ndoc, the Perl introspection documentation tool, the -dev + version of the introspected library must be installed. For example, + perli11ndoc can only show documentation for libgtk3-perl if + libgtk-3-dev is installed. + +Package: libglib-perl +Architecture: amd64 +Version: 3:1.329.4-1 +Multi-Arch: same +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 888 +Depends: perl (>= 5.40.1-6build1), perlapi-5.40.1, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.42.0), libextutils-depends-perl +Filename: pool/libglib-perl_3%3a1.329.4-1_amd64.deb +Size: 319464 +MD5sum: faf7b537f61d8d42e50cad1c3c32794e +SHA1: 664193b30a4adfe35fb6e711556450c6ae807920 +SHA256: 36c7d9e801c20f8a5cae0cfe41c59f9d8ec057dc492208271eb082812a0fce22 +SHA512: 866dc435efc89a2a9a1ccc5fed0c6beec383aaeeb102a3ead0757c8225060befc0296c015dd3508bd1b5013ced36f1ec10a52b40ebe5a533ff570c66b3c6aa83 +Homepage: https://gtk2-perl.sourceforge.net/ +Description: interface to the GLib and GObject libraries + Glib provides a Perl interface to the GLib and GObject libraries, as part + of gtk2-perl. It attempts to provide a perlish interface while remaining as + true as possible to the underlying C API, so perusing the reference manual is + recommended (see ). + +Package: libglib2.0-0t64 +Architecture: amd64 +Version: 2.88.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4330 +Provides: libgio-2.0-0 (= 2.88.0-1), libglib-2.0-0 (= 2.88.0-1), libglib2.0-0 (= 2.88.0-1), libgmodule-2.0-0 (= 2.88.0-1), libgobject-2.0-0 (= 2.88.0-1), libgthread-2.0-0 (= 2.88.0-1) +Depends: libatomic1 (>= 4.8), libc6 (>= 2.43), libffi8 (>= 3.4), libmount1 (>= 2.40~rc2), libpcre2-8-0 (>= 10.22), libselinux1 (>= 3.1~), zlib1g (>= 1:1.2.2) +Recommends: libglib2.0-data, shared-mime-info, xdg-user-dirs +Suggests: low-memory-monitor +Breaks: gnome-shell (<< 44.9-2~), libglib2.0-0 (<< 2.80.0-7~) +Replaces: libglib2.0-0 (<< 2.80.0-7~) +Filename: pool/libglib2.0-0t64_2.88.0-1_amd64.deb +Size: 1596744 +MD5sum: 982b20090160679891e8ee4db20f5119 +SHA1: 696e49ebc4d78994086b825e0c94da9d1d5e62f2 +SHA256: 8883a2bd236e54af0af33d7115835929c959bc50fd02ba63496ab6908b0c204a +SHA512: 7e37852d5877e6482529f97883814a727e979611b1c16e862dbe046f255caa554dff062f7a17d7ce7b0e42af1b2c9c367a9f3c9c051279ba1cee7f11007e158d +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: GLib library of C routines + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared libraries. + +Package: libglib2.0-bin +Architecture: amd64 +Version: 2.88.0-1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 364 +Depends: libglib2.0-data, libc6 (>= 2.38), libelf1t64 (>= 0.142), libglib2.0-0t64 (= 2.88.0-1) +Filename: pool/libglib2.0-bin_2.88.0-1_amd64.deb +Size: 99418 +MD5sum: 853c3bc9fe7d2d0ed81c7b92aff286b8 +SHA1: 2b28528f60c246641e5cfc5d9cc88c435b10eb93 +SHA256: f0832941a48e3b4d487c94fba1708a70dcdadff9e9eb6604ec7645d71872fd35 +SHA512: 243da5d2abda5ba695d3b14fbc5930b3be8ab9acae0526d74e10fad4c440560203fb86dcc19ea6a11e30afab27319aec4056e9c7db43e70374e1ba4f660169ce +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: Programs for the GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains command-line utilities associated with GLib, + including: + . + * gapplication, a client for starting applications via D-Bus activation + * gdbus, a tool for working with D-Bus objects and monitoring the bus + * gio, a file management utility that can work with GIO virtual filesystems + * gresource, which can extract resources from libraries and executables + * gsettings, a tool for inspecting and editing application configuration + * gio-query-modules, which updates caches used internally by GLib + * glib-compile-schemas, which updates caches used internally by GLib + +Package: libglib2.0-data +Architecture: all +Version: 2.88.0-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: glib2.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 108 +Filename: pool/libglib2.0-data_2.88.0-1_all.deb +Size: 37776 +MD5sum: a1f77300b19c06bdea9d3c43b3c96df0 +SHA1: e9013ec11def63cd9f5634f68e9c5bbd4dd1cfce +SHA256: 86bcb6fb96b1f2f429741af853c7817982edaeae114a5162e8aa681cf3d2b596 +SHA512: f5427c9055013092f1aa4567c7a98a7eb9503add0f570f5000d2b9ae7b45a4c4f809a9ae02933969936c573007391b2af98477ca48367e8b77f217b33a152412 +Homepage: https://gitlab.gnome.org/GNOME/glib +Description: Common files for GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package is needed for the runtime libraries to display messages in + languages other than English. + +Package: libglu1-mesa +Architecture: amd64 +Version: 9.0.2-1.1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglu +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 382 +Provides: libglu1 +Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.3.1), libopengl0, libstdc++6 (>= 5) +Conflicts: libglu1, mesag3 (<< 5.0.0-1), xlibmesa3 +Replaces: libglu1 +Filename: pool/libglu1-mesa_9.0.2-1.1build2_amd64.deb +Size: 158904 +MD5sum: eb5e0c61b32af28937d5640b0292e29d +SHA1: da99f4cc8cc81177e612625db6699ae41056d6b5 +SHA256: 0559dbb28c2e34e01243fdaf19797165fbf577e613c420d207e31246152f24f0 +SHA512: 636768e5cc08cfd9f17ee9748aab1b8da74389f8f3543e9cd7d41b18381f6f43b48a0137550a2db4883c50f3766b9db0fa7e91f6df28c244b4070e68156991c6 +Description: Mesa OpenGL utility library (GLU) + GLU offers simple interfaces for building mipmaps; checking for the + presence of extensions in the OpenGL (or other libraries which follow + the same conventions for advertising extensions); drawing + piecewise-linear curves, NURBS, quadrics and other primitives + (including, but not limited to, teapots); tesselating surfaces; setting + up projection matrices and unprojecting screen coordinates to world + coordinates. + . + On Linux, this library is also known as libGLU or libGLU.so.1. + . + This package provides the SGI implementation of GLU provided by the + Mesa project (ergo the "-mesa" suffix). + +Package: libglvnd0 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 728 +Depends: libc6 (>= 2.38) +Breaks: libgldispatch0-nvidia +Replaces: libgldispatch0-nvidia +Filename: pool/libglvnd0_1.7.0-3_amd64.deb +Size: 64072 +MD5sum: 72c17c9135e5e53a9c4e5d9eefdd1b22 +SHA1: b41bf9a36224aaebf7c7fb39414bbee65ffc9b16 +SHA256: db2cd8cff67e3e210f5223dfe41f000efd4d3d887ab05bda2e88c4a622f12b36 +SHA512: ecc036bef7a7af38d95f67d5ef669118e9d51879f39b2af6723942269cc406db9c36a58d6ae0f2acbc8515626ec9ab6bbb3e994f4f8f83c0c8d8dc814cf8e649 +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains the GL dispatch library. + +Package: libglx-mesa0 +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 423 +Provides: libglx-vendor +Depends: libgl1-mesa-dri, mesa-libgallium (= 26.0.8-1ubuntu0.3), libc6 (>= 2.38), libdrm2 (>= 2.4.125-1), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.4), libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb-dri3-0, libxcb-glx0 (>= 1.8), libxcb-present0, libxcb-shm0, libxcb-xfixes0, libxcb1, libxext6, libxxf86vm1 (>= 1:1.1.4) +Breaks: glx-diversions (<< 0.8.4~), libopengl-perl (<< 0.6704+dfsg-2) +Filename: pool/libglx-mesa0_26.0.8-1ubuntu0.3_amd64.deb +Size: 125602 +MD5sum: 1359d7d121d8d165faf55fdf94824aa4 +SHA1: 1b9016b0c1d7980beb61b90137b477c52c32ef2f +SHA256: 17ff6239daaf75337d3697c1e5f1ef3e190c4c2dd73a9f0edfc36868ef41905c +SHA512: 48f3f0c57f3514bb238f2be7b6b08ee9b5be72b66951dcfd067c860741f6414f9c5f033e72ee3b6a8ad36a88c45e2c4be9ae0f9d9cc42ea7ab0d39dd3ac1886c +Homepage: https://mesa3d.org/ +Description: free implementation of the OpenGL API -- GLX vendor library + Mesa is a 3-D graphics library with an API which is very similar to + that of OpenGL. To the extent that Mesa utilizes the OpenGL command + syntax or state machine, it is being used with authorization from + Silicon Graphics, Inc. However, the authors make no claim that Mesa + is in any way a compatible replacement for OpenGL or associated with + Silicon Graphics, Inc. + . + This version of Mesa provides GLX and DRI capabilities: it is capable of + both direct and indirect rendering. For direct rendering, it can use DRI + modules from the libgl1-mesa-dri package to accelerate drawing. + . + This package does not include the modules themselves: these can be found + in the libgl1-mesa-dri package. + +Package: libglx0 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 162 +Depends: libc6 (>= 2.38), libglvnd0 (= 1.7.0-3), libx11-6 (>= 2:1.4.99.1), libglx-mesa0 +Filename: pool/libglx0_1.7.0-3_amd64.deb +Size: 38932 +MD5sum: cc1cf595cc0e3ee56c2124ab6c7755c1 +SHA1: d6f93e6791e63dc0ba7cb40308dfa2e09c3c08a7 +SHA256: e0b75c32f773201ebca2184d94dfc34f6e09470c7cf6e425d48b270e516fd909 +SHA512: 0e671fff8326651e5f6f24fb5f977db767cf8fba58125eba54bf3043b0392cb04cd4a7a43ca2ddc88f3f96f517ec00f664e397bb4b0ba266260d6810fb862dd9 +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library -- GLX support + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains support for GLX. + +Package: libglycin-2-0 +Architecture: amd64 +Version: 2.1.1+ds-0ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: glycin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4088 +Depends: glycin-loaders (>= 2~), libc6 (>= 2.39), libfontconfig1 (>= 2.12.6), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.68.0), liblcms2-2 (>= 2.2+git20110628), libseccomp2 (>= 2.1.0) +Filename: pool/libglycin-2-0_2.1.1+ds-0ubuntu1_amd64.deb +Size: 1484272 +MD5sum: ceaf94469030632c122a6555dd9bdf9c +SHA1: 2019c10e16b3558aa1175681d884017ce15ac1a8 +SHA256: 99b6836d1068436e7f92cc3a7b2c2c0efddeea12dc50c16a727f45bc044d4393 +SHA512: 2e0bc7fa4e8733ed908d142031f7aa76c17c2a2ce2eb941bf6b2d5adff28e4196413b7157cab849296cd154b585daeb8ef4aedd1c24a56d5d7e880a2d6bffef1 +Homepage: https://gitlab.gnome.org/GNOME/glycin +Description: sandboxed image loaders for GNOME + Glycin provides sandboxed modular image loaders for decoding + images as GDK textures, editing images, and extracting image + metadata. Glycin is a newer generation of image loading + compared to gdk-pixbuf. + . + This package contains a shared library interface for glycin. + +Package: libglycin-gtk4-2-0 +Architecture: amd64 +Version: 2.1.1+ds-0ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: glycin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 329 +Depends: libc6 (>= 2.33), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.12.0), libglycin-2-0 (>= 2.0~beta), libgtk-4-1 (>= 4.15.4) +Filename: pool/libglycin-gtk4-2-0_2.1.1+ds-0ubuntu1_amd64.deb +Size: 140410 +MD5sum: 14d15d0054bac269ea98eafb25cfc916 +SHA1: ad830b0055be37e2b739e630afd1b4864439774f +SHA256: 896c2d56850ce8936e350d626a99542edc3e6b59ecad41a921a07ced1726a40b +SHA512: e1b7ab5f7619436ebbaa9f7c856b18b67d6edfd41c287110162d8a16b7e44800c3e83274c99e73686e93d4f2eec71b39614ace4c68f93cf844c67e327674bf05 +Homepage: https://gitlab.gnome.org/GNOME/glycin +Description: sandboxed image loaders for GNOME + Glycin provides sandboxed modular image loaders for decoding + images as GDK textures, editing images, and extracting image + metadata. Glycin is a newer generation of image loading + compared to gdk-pixbuf. + . + This package contains a shared library interface for glycin + which provides integration with GDK / GTK4. + +Package: libgnome-autoar-0-0 +Architecture: amd64 +Version: 0.4.5-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-autoar +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 119 +Depends: libarchive13t64 (>= 3.4.0), libc6 (>= 2.33), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libgnome-autoar-0-0_0.4.5-5_amd64.deb +Size: 31004 +MD5sum: eb48c078b5812a09b83a3e9f107736f0 +SHA1: d8c4a481e736108dc6b5604da3cd4c1d50b2e88b +SHA256: 37a54e236039ae2343e39a6e394357d37a8b4baf7581167ef7a397a62b85881f +SHA512: 75ffba7e31d6ca7a78ee08419b916dd50a7471a2bbd4dd37e9ce0dcc7b780a422a137203bf999b4eb6e070e26f5387c612594862e4723e30eb7bd6b763e77afb +Description: Archives integration support for GNOME + GNOME Autoar is a library which makes creating and extracting archives easy, + safe, and automatic. + +Package: libgnome-bg-4-2t64 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 122 +Provides: libgnome-bg-4-2 (= 44.5-1ubuntu1) +Depends: gsettings-desktop-schemas, libc6 (>= 2.38), libcairo2 (>= 1.14.0), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgnome-desktop-4-2t64 (>= 3.17.92), libgtk-4-1 (>= 4.12.0) +Recommends: locales | locales-all +Breaks: libgnome-bg-4-2 (<< 44.5-1ubuntu1) +Replaces: libgnome-bg-4-2 +Filename: pool/libgnome-bg-4-2t64_44.5-1ubuntu1_amd64.deb +Size: 24580 +MD5sum: c64eab3d78fc8832514965f7f2110bc6 +SHA1: 6b3e077135e1354a44a54578178b88b775c6c013 +SHA256: 9b033899793669df114600e8807e8555300b4c82e6cfefb0946527b066f95516 +SHA512: c8cc0430d7d1e3dece313d6c70017bf3cae4e0de73ca77b08422512e9970801e7e655d458a58ecbbfbbde1c9bf1e040ca90687f306b399e1497482fff50de555 +Description: Utility library for background images - runtime files + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This library provides utilities for managing background images (wallpaper). + +Package: libgnome-bluetooth-3.0-13 +Architecture: amd64 +Version: 47.1-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-bluetooth +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 153 +Depends: gnome-bluetooth-3-common (>= 47.1-5), libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libudev1 (>= 196), libupower-glib3 (>= 0.99.14) +Filename: pool/libgnome-bluetooth-3.0-13_47.1-5_amd64.deb +Size: 51180 +MD5sum: 96c3737fa2bcde0dad97aa36fee26620 +SHA1: bfe9185af728b91f382df304db2f425a646475f2 +SHA256: 6d4755d98382364f39e40b328715da3782e05348b9f8319b0ae85b79484f7854 +SHA512: 41794b29bd9ae81a793afa8891363773a01f8ca0eb31e2e6691ab86f412744c2505321e3dbc21fcce0906b3fd6cff24cdbf1fb45b5707599fa615a1226582092 +Homepage: https://wiki.gnome.org/Projects/GnomeBluetooth +Description: GNOME Bluetooth 3 support library + This package contains tools for managing and manipulating Bluetooth + devices using the GNOME desktop. + . + The libraries included provide support to gnome-bluetooth. + +Package: libgnome-bluetooth-ui-3.0-13 +Architecture: amd64 +Version: 47.1-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-bluetooth +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 197 +Depends: libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgsound0t64 (>= 1.0.1), libgtk-4-1 (>= 4.15.2), libnotify4 (>= 0.7.0), libudev1 (>= 196), libupower-glib3 (>= 0.99.14) +Filename: pool/libgnome-bluetooth-ui-3.0-13_47.1-5_amd64.deb +Size: 60650 +MD5sum: 5598c781ae5797570dd2fd7542e56a56 +SHA1: efb328857bde5c81e96d70de03d3bb1a35e3b70a +SHA256: 141902b52821922a3210729a91c2bb7921eb69b5c840eb70caac4f6fbb580e9f +SHA512: 897adbda7e17f10d9d03f53ac761b29f2f408db517982648213d71fc003acc124692fe37817b6aac9ec496507b71666d8a9a478031603cabc05c09d0a36e68d8 +Homepage: https://wiki.gnome.org/Projects/GnomeBluetooth +Description: GNOME Bluetooth 3 UI support library + This package contains tools for managing and manipulating Bluetooth + devices using the GNOME desktop. + . + The libraries included provide support to gnome-bluetooth. + +Package: libgnome-desktop-3-20t64 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 271 +Provides: libgnome-desktop-3-20 (= 44.5-1ubuntu1) +Depends: bubblewrap, gnome-desktop3-data (>= 44.5-1ubuntu1), gnome-desktop3-data (<< 45~), gsettings-desktop-schemas, iso-codes, libc6 (>= 2.38), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.9.10), libseccomp2 (>= 1.0.1), libsystemd0, libudev1 (>= 196), libxkbregistry0 (>= 1.0.0) +Recommends: locales | locales-all +Breaks: libgnome-desktop-3-20 (<< 44.5-1ubuntu1) +Replaces: libgnome-desktop-3-20 +Filename: pool/libgnome-desktop-3-20t64_44.5-1ubuntu1_amd64.deb +Size: 95552 +MD5sum: 44c620aa6988b785eb0b36e03e3c3fa2 +SHA1: e9bbdd5b3bbcf2589f03bb5c7c646d8500294c29 +SHA256: 81b47c68529265a355a51be0110089ff113f2d56ba08d987f6d596f1f4ebb75a +SHA512: 401ac6ef05a76c0853a9e36ea4240bf6761d19dda9c2767e8b0caf43071703ca10feeca2533eaa696394ad710ad9aa1571fffaf289b1e1e7d760fd064c82ac32 +Description: Utility library for the GNOME desktop - GTK 3 version + This library provides various utility functions that are used in multiple + components of the GNOME desktop, but do not have a sufficiently stable API + to be included in core libraries such as GLib and GTK. + . + This package provides a legacy GTK-3-based library with functionality + similar to a combination of libgnome-bg-4-2t64, libgnome-desktop-4-2t64 + and libgnome-rr-4-2t64, for compatibility with older GNOME components. + +Package: libgnome-desktop-4-2t64 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 188 +Provides: libgnome-desktop-4-2 (= 44.5-1ubuntu1) +Depends: bubblewrap, gnome-desktop3-data (>= 44.5-1ubuntu1), gnome-desktop3-data (<< 45~), gsettings-desktop-schemas, iso-codes, libc6 (>= 2.38), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libseccomp2 (>= 1.0.1), libsystemd0, libudev1 (>= 196), libxkbregistry0 (>= 1.0.0) +Recommends: locales | locales-all +Breaks: libgnome-desktop-4-2 (<< 44.5-1ubuntu1) +Replaces: libgnome-desktop-4-2 +Filename: pool/libgnome-desktop-4-2t64_44.5-1ubuntu1_amd64.deb +Size: 87566 +MD5sum: c35da3fc79418f05d1e9bf8ee200aea1 +SHA1: 0d0ebace18fc18ddb5f838b10c6243430a053908 +SHA256: dc622a8f7985e60f0e21b73bb192bcdfa60d6de8ee42ef9d01dec3e737eb63f3 +SHA512: cf2dc232386113f91be01b28441785592ecec3cefbd6e175ccd57328db1fbb610e4854e3274d8196822af5659e178646f5f37b72031ad674ca36e06460bb5c97 +Description: Utility library for the GNOME desktop - runtime files + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This library provides miscellaneous non-GUI utilities, including + sandboxed image thumbnailing, localization-related utilities, idle time + monitoring, a simplified interface to the udev hardware database, + putting processes into systemd scopes, user-facing time representation + and keyboard layout information. + +Package: libgnome-menu-3-0 +Architecture: amd64 +Version: 3.38.1-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-menus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 141 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.86.0) +Filename: pool/libgnome-menu-3-0_3.38.1-1ubuntu1_amd64.deb +Size: 48884 +MD5sum: e0b01417989a6cce27be08a4418c240a +SHA1: 651ee82163f7cdf43a48b579e5e744dffb4f3689 +SHA256: 542ebd199ed85f417c627eccbdb7e3301d74efdb1f8d1e070580cf3dddae556b +SHA512: 3a2b7a1188422cf2373203ef8f39cf59f7135c8106a71bf3e59be47dc8c50a17d5e3710a34e5553915e953d1ad298920e8adb2d55287f620cd0e2c315d73d300 +Description: GNOME implementation of the freedesktop menu specification + The package contains an implementation of the draft + "Desktop Menu Specification" from freedesktop.org: + . + http://www.freedesktop.org/Standards/menu-spec + . + Also contained here are the GNOME menu layout configuration files, .directory + files and assorted menu related utility programs. + . + This package contains the shared library. + +Package: libgnome-qr-4-0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 101 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libgnome-qr-4-0_44.5-1ubuntu1_amd64.deb +Size: 59514 +MD5sum: deb5c0288585219daef50fecd2f4a09c +SHA1: f86fe9dd0d69176ac20b988db2de250f17a43982 +SHA256: 0113f9d4958d6cc9202840989caf4e676247bbb21bed4bad4ed7116b61c18d0f +SHA512: 947cf0ae707a868461131239ce7808c68b38eb0a8186c369aaa9d8c2dc8d031cf77b880b2c9d2239d5671e432008dfe506d816213e33eaaf35f77d3aa33bad71 +Description: Utility library for QR Codes - runtime files + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This library provides utilities for creating QR Codes textures. + +Package: libgnome-qr-gtk-4-0 +Architecture: amd64 +Version: 44.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-desktop +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 85 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libgnome-qr-4-0 (>= 44.5-1ubuntu1), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.12.0) +Recommends: locales | locales-all +Filename: pool/libgnome-qr-gtk-4-0_44.5-1ubuntu1_amd64.deb +Size: 8944 +MD5sum: 7dcfc5ace41ae5feaa6955744d426b55 +SHA1: 7c385ddc850b76af208dc33c7fc9cba9e542549b +SHA256: 8b253370a7d1724a70e3b0f4fa74f73919a1a493dc20c5f73fd3cfe6ef72ad0b +SHA512: 78355e2201bad4ee9a35dfae253ad672a382d53f236224875ec81b516baf4dabd8ed165323ad79dd80021d53737eb85aa44cd165547f6c9b76463e36c4a4be15 +Description: Utility library for GTK4 QR codes - runtime files + The gnome-desktop set of libraries provides various utility functions + that are used in multiple components of the GNOME desktop, but do not + have a sufficiently stable API to be included in core libraries such + as GLib and GTK. + . + This library provides utilities for creating QR Codes GTK Widgets. + +Package: libgoa-1.0-0b +Architecture: amd64 +Version: 3.58.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-online-accounts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 343 +Depends: libgoa-1.0-common (>= 3.58.0-1), libc6 (>= 2.4), libglib2.0-0t64 (>= 2.84.0) +Filename: pool/libgoa-1.0-0b_3.58.0-1_amd64.deb +Size: 68700 +MD5sum: 98c16582bf312992010a42fd13826f0c +SHA1: 58c112af41485c124d994fca48586d8dfd1094c7 +SHA256: 567304bba58dac0fcfc7c566d0030c32bac7e03341f3e46386fa5b59f2d629cd +SHA512: 9e8f9c23232a971dc07adbb78af9b3bffa63adbb053a1f63879537dfba86d399c44e34a47514043c4ca74278292f5ee3dd28472d6e302327a039d27e2aa55692 +Homepage: https://wiki.gnome.org/Projects/GnomeOnlineAccounts +Description: library for GNOME Online Accounts + This package contains the GNOME Online Accounts service, which provides a + centralized place for managing online accounts (Google, etc) for the + GNOME desktop. + . + This package contains the libraries used by GOA applications. + +Package: libgoa-1.0-common +Architecture: all +Version: 3.58.0-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gnome-online-accounts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Breaks: libgoa-1.0-0 (<< 3.8.2) +Replaces: libgoa-1.0-0 (<< 3.8.2) +Filename: pool/libgoa-1.0-common_3.58.0-1_all.deb +Size: 4704 +MD5sum: d83d2d3756a37d17c9a0c70bd18fa475 +SHA1: ea67815729cc59278e5c7bddb0282e3f98278d1f +SHA256: d0f6e61ceb702bb05eb0d5c182b69ea70e8f757221fc4df195b30ea07188e9dc +SHA512: daf4c6de28a2b378ea2ebe080a660d73f7d4deb322639ba97f7ac80199a86d84debd13de8b0fed53b26ca0df3c54420c3933403917f844dfbe75c832eca77c4d +Homepage: https://wiki.gnome.org/Projects/GnomeOnlineAccounts +Description: library for GNOME Online Accounts - common files + This package contains the GNOME Online Accounts service, which provides a + centralized place for managing online accounts (Google, etc) for the + GNOME desktop. + . + This package contains the translation files for the GOA library and daemon. + +Package: libgoa-backend-1.0-2 +Architecture: amd64 +Version: 3.58.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gnome-online-accounts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 379 +Depends: libgoa-1.0-common (>= 3.58.0-1), libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.4), libgcr-4-4 (>= 3.8.0), libglib2.0-0t64 (>= 2.84.0), libgoa-1.0-0b (>= 3.17.92), libgtk-4-1 (>= 4.15.2), libjson-glib-1.0-0 (>= 1.5.2), librest-1.0-0 (>= 0.9.1), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.0.3), libxml2-16 (>= 2.14.1) +Filename: pool/libgoa-backend-1.0-2_3.58.0-1_amd64.deb +Size: 117746 +MD5sum: 1a6548ee398e146f76cdd29a9ebbce30 +SHA1: 98a36583102ae4a227c9ff4523bdab78a20de8d1 +SHA256: 7451be62fc37381dd75f4cb0ae7cbc12326a2b0f77015f11c92cada4f734d8a6 +SHA512: 0d9ab532ccec69c06b9f12acb6057135b87fc98466b9a1d92288ee17fdeeffd29a974a2a4d7e53cb658fc9a20016eb45480ffe8b4941bd6a5b7ada734415c773 +Homepage: https://wiki.gnome.org/Projects/GnomeOnlineAccounts +Description: backend library for GNOME Online Accounts + This package contains the GNOME Online Accounts service, which provides a + centralized place for managing online accounts (Google, etc) for the + GNOME desktop. + . + This package contains the backend libraries used by GOA applications. + +Package: libgomp1 +Architecture: amd64 +Version: 16-20260322-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gcc-16 +Maintainer: Ubuntu Core developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 406 +Depends: gcc-16-base (= 16-20260322-1ubuntu1), libc6 (>= 2.38) +Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2) +Filename: pool/libgomp1_16-20260322-1ubuntu1_amd64.deb +Size: 162278 +MD5sum: 7d416d782e2f3b41840171fc3c555ce5 +SHA1: 0a15c4558e1d94b590219c1e6d29d387488fb253 +SHA256: add19738c63794d2aa9ac529d3b8aebe2e88980faecb6c1c59f07aefd6c3c314 +SHA512: ed15704496a5e30e10350679fe13aa26f4d165ca05586cc0c9709aba11affb4051e35afad614dac094da13f29058ec13e5b604cd4295bc51b77befc17f424f38 +Homepage: http://gcc.gnu.org/ +Description: GCC OpenMP (GOMP) support library + GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers + in the GNU Compiler Collection. + +Package: libgpgme45 +Architecture: amd64 +Version: 2.0.1-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gpgme1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuPG Maintainers +Installed-Size: 365 +Depends: gnupg (>= 2.1.21-4) | gpg, libassuan9 (>= 2.4.2), libc6 (>= 2.38), libgpg-error0 (>= 1.50) +Recommends: dirmngr, gpg-agent, gpg-wks-client, gpgsm +Filename: pool/libgpgme45_2.0.1-2build1_amd64.deb +Size: 139814 +MD5sum: 6414aa9a8ee6b7833f76cf905e45715a +SHA1: 2ff040c34a7697a7debf55160f2cc4f807c3661b +SHA256: b95f81d26bd4922510eb58a08f9c0bf143781cb23a907ce9ede7a3b1c6024be6 +SHA512: 7594ed930867f556f8242d9a88bcd99b3bef68fce47118bf16604f67cab2c2fd9e06679eb3cedbac2dced2c5317a4bbb835c18d0c3d112192f5634b4a5459e87 +Homepage: https://gnupg.org/software/gpgme/ +Description: GPGME - GnuPG Made Easy (library) + GPGME is a wrapper library which provides a C API to access some of the + GnuPG functions, such as encrypt, decrypt, sign, verify, ... + . + This package contains the library. + +Package: libgpgmepp7 +Architecture: amd64 +Version: 2.0.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: gpgmepp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuPG Maintainers +Installed-Size: 425 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libgpgme45 (>= 2.0.0), libstdc++6 (>= 13.1) +Filename: pool/libgpgmepp7_2.0.0-2_amd64.deb +Size: 131100 +MD5sum: caedaf8bb6ed281702a101398442b3e4 +SHA1: 12186561b37f0add3f90785d3002ac2bbf2958a7 +SHA256: 3dd75723159c2c171382f836e491d83d71f5fdf7a58c9f6754d85ff0c725b761 +SHA512: 996a19fa8eb2839d0bb39778d0363136499669254ba5303861045768e9006a485da40397e6e4cbe0968972922bd13e0cc5ce269ea50278b2212af9b641277067 +Homepage: https://gnupg.org/software/gpgme/ +Description: C++ wrapper library for GPGME + GpgME++ (aka GpgMEpp) is a C++ wrapper (or C++ bindings) for the + GnuPG project's GPGME (GnuPG Made Easy) library. + . + This is the official upstream C++ binding for GPGME. + +Package: libgphoto2-6t64 +Architecture: amd64 +Version: 2.5.33-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgphoto2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 2707 +Provides: libgphoto2-6 (= 2.5.33-1ubuntu1.1) +Depends: libc6 (>= 2.38), libcurl4t64 (>= 7.16.2), libexif12 (>= 0.6.21-1~), libgd3 (>= 2.1.0~alpha~), libgphoto2-port12t64 (>= 2.5.31), libjpeg8 (>= 8c), libltdl7 (>= 2.5.4), libxml2-16 (>= 2.14.1) +Recommends: libgphoto2-l10n (= 2.5.33-1ubuntu1.1) +Suggests: gphoto2 +Breaks: libgphoto2-6 (<< 2.5.33-1ubuntu1.1) +Replaces: libgphoto2-6 +Filename: pool/libgphoto2-6t64_2.5.33-1ubuntu1.1_amd64.deb +Size: 760670 +MD5sum: 15094284c482b7794fc43e5e694f6787 +SHA1: 5ac3ffb419bcffb5c7f19f0a67e725dc7dbfb26f +SHA256: b2ad6865249a228b531beae7d987e95bdde043ff96609da4391d68f34195afee +SHA512: f48b8dcd65b0a5432e6cf5d051d4c9e53c2f37aa7a598eabf3530f9d8183192094a4f6a48e077b85cf445b331947ed6fe61b2da0c81723913eee3484b3830b29 +Homepage: https://github.com/gphoto/libgphoto2/ +Description: gphoto2 digital camera library + The gphoto2 library can be used by applications to access various + digital camera models, via standard protocols such as USB Mass Storage + and PTP, or vendor-specific protocols. + . + This package contains the library. + . + The gphoto2 command-line frontend is shipped separately, in the gphoto2 + package. + +Package: libgphoto2-l10n +Architecture: all +Version: 2.5.33-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: localization +Source: libgphoto2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 72 +Filename: pool/libgphoto2-l10n_2.5.33-1ubuntu1.1_all.deb +Size: 12894 +MD5sum: 4de0d61d774a5568a808c1068780a07c +SHA1: 71b6393c64c1caae992e2559bf9d65aae8bd7d62 +SHA256: 83769ada07dd0069ca66b61f52f675fb09134edfe9bf761996acee5ed60bf462 +SHA512: 4d030e2e47b3fc8e2c355370a8ae665dd47427a42eed7753e41681a4633621f4baee981d5ba27592e63458d27c87955799ac7b0a826d9df12089304807df5089 +Homepage: https://github.com/gphoto/libgphoto2/ +Description: gphoto2 digital camera library - localized messages + The gphoto2 library can be used by applications to access various + digital camera models, via standard protocols such as USB Mass Storage + and PTP, or vendor-specific protocols. + . + This package contains the localized messages for the library. + +Package: libgphoto2-port12t64 +Architecture: amd64 +Version: 2.5.33-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgphoto2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 304 +Provides: libgphoto2-port12 (= 2.5.33-1ubuntu1.1) +Depends: libc6 (>= 2.42), libltdl7 (>= 2.5.4), libusb-1.0-0 (>= 2:1.0.23~) +Suggests: gphoto2 +Breaks: libgphoto2-port10 (>= 2.5.7), libgphoto2-port12 (<< 2.5.33-1ubuntu1.1) +Replaces: libgphoto2-port10 (>= 2.5.7), libgphoto2-port12 +Filename: pool/libgphoto2-port12t64_2.5.33-1ubuntu1.1_amd64.deb +Size: 58208 +MD5sum: ff81d73d17fbeccfea327064fe93ec1f +SHA1: 7e9aec9218ca2b1a4068651f036b9e463eeb77d3 +SHA256: 5b42dffffeaab80afeb6d8d0dfb32a0ec0e4f780c82c672f967df7a01fadb496 +SHA512: 2ef10997b072d81175de9a816b9bd1e619e981a0f9cade51cc30ba845f8843fa1236a477d2d7eec531c967fb3401a60a2f277f8d35a326401e47efeeaa55288c +Homepage: https://github.com/gphoto/libgphoto2/ +Description: gphoto2 digital camera port library + The gphoto2 library can be used by applications to access various + digital camera models, via standard protocols such as USB Mass Storage + and PTP, or vendor-specific protocols. + . + This package contains the runtime code for port access. + +Package: libgpm2 +Architecture: amd64 +Version: 1.20.7-12build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gpm +Maintainer: Ubuntu Developers +Original-Maintainer: Axel Beckert +Installed-Size: 44 +Depends: libc6 (>= 2.38) +Suggests: gpm +Filename: pool/libgpm2_1.20.7-12build1_amd64.deb +Size: 14422 +MD5sum: 516e62ff43b5a94bf8afb4e77991cbbb +SHA1: f1a9506c0aa1543df6d3b881019132d6e122350d +SHA256: 5e65176de6c982105c33956d9c698735ffef16464b43f462620c2bcce6d48036 +SHA512: 665d1d1e8447f5c8f239a0269ab306b6e7eb549f62a08a7693780b8e20fccb0c1e270dd8b677a3fb483f543991d65a4b2ace6d12da3d0f77589fb7eb85cca310 +Homepage: https://nico.schottelius.org/software/gpm/ +Description: General Purpose Mouse - shared library + This package provides a library that handles mouse requests + and delivers them to applications. See the description for the 'gpm' + package for more information. + +Package: libgprofng0 +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 4066 +Depends: libbinutils (= 2.46-3ubuntu2), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 14), zlib1g (>= 1:1.1.4) +Filename: pool/libgprofng0_2.46-3ubuntu2_amd64.deb +Size: 897584 +MD5sum: 151bf336cf5e167b036efdf46219bb4e +SHA1: 172ae32242aa217afca8d7426f7574f2c8d841f3 +SHA256: 6b066ab912300b2c6a965a9a8045da45c237a52b76c2c11d8f2ceaf7aabfacbb +SHA512: 222486db9813f020d154b0564f809d99dc317f7b2659fcfcc8750aec656df5dfd8e1d48f09d267c71ae08024145176318fcf5048d392f9c36b2add692b3c64a6 +Homepage: https://www.gnu.org/software/binutils/ +Description: GNU Next Generation profiler (runtime library) + Gprofng is the GNU Next Generation profiler for analyzing the performance + of Linux applications. Gprofng allows you to: + . + - Profile C / C++ / Java / Scala applications without needing to recompile + - Profile multi-threaded applications + - Analyze and compare multiple experiments + - Use time-based sampling and / or hardware event counters + . + This package includes the libgprofng shared library. + +Package: libgraphene-1.0-0 +Architecture: amd64 +Version: 1.10.8-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: graphene +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 148 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.14.0) +Filename: pool/libgraphene-1.0-0_1.10.8-5build1_amd64.deb +Size: 46178 +MD5sum: de42d8a9b7d38b4bd3b27e7c5f001bb4 +SHA1: ac0f108c242fe6fbaaf4ec97eab35d6b6f667ac0 +SHA256: 0c73a0aee47f87f496c9150121b04281def45d8e52564e059b59ebd9f22f5360 +SHA512: 081dc133528b166601a3e12280ab0d347a4e3c6fce4ca35faa6fe3657a813f04efa334ffdd981b98c0191d665912a6139c7927c95b44bb75672d5dfcad2ddde0 +Homepage: https://ebassi.github.io/graphene/ +Description: library of graphic data types + Graphene provides a small set of mathematical types needed to implement + graphic libraries that deal with 2D and 3D transformations and projections. + . + This library provides types and their relative API; it does not deal with + windowing system surfaces, drawing, scene graphs, or input. + +Package: libgraphite2-3 +Architecture: amd64 +Version: 1.3.14-11ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: graphite2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Fonts Task Force +Installed-Size: 171 +Provides: libgraphite2-2.0.0 +Depends: libc6 (>= 2.4) +Breaks: libgraphite2-2.0.0 (<< 1.2.0) +Replaces: libgraphite2-2.0.0 +Filename: pool/libgraphite2-3_1.3.14-11ubuntu1.1_amd64.deb +Size: 72928 +MD5sum: 3f8b0ed0f1a6d1cbe2cfa9ca5ff95ee5 +SHA1: 0b55c4260bb7b7ba3f8b0adced686d7cb07d30fa +SHA256: b4a4fbeb00c8553a20c31874c153cbcd856cfc1dda1c9b8252fa1d9bfbec24fc +SHA512: 2c1a9b582e65da5d48eb9f64641435fe033e794451b5d0ecb08ee5af377988bae0a322284c1c57735414932457854ffcf535743031dc9aedaae98da9759b855b +Homepage: https://graphite.sil.org/ +Description: Font rendering engine for Complex Scripts -- library + Graphite is a system that can be used to create and use "smart fonts" capable + of displaying writing systems with various complex behaviors, such as: + contextual shaping, ligatures, reordering, split glyphs, bidirectionality, + stacking diacritics and complex positioning. + . + This library was designed and developed by the NRSI (Non-Roman Script + Initiative) within SIL International (www.sil.org) to act as a complement to + other smart font rendering technologies with limited practical local + extensibility. Its purpose is to help meet the needs of a very large number + of "minority language" communities for local extensibility of complex script + behaviors. + . + The behavior of the rendering engine for a given writing system is specified + through extra tables added to a TrueType font. These tables are generated by + compiling a GDL (Graphite Description Language) source file into a font using + grcompiler. + . + This package contains the shared library. + +Package: libgs-common +Architecture: all +Version: 10.06.0~dfsg-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: ghostscript +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 320 +Filename: pool/libgs-common_10.06.0~dfsg-3ubuntu1_all.deb +Size: 176406 +MD5sum: 56bb7a9d8326131e00617c381b92c889 +SHA1: 9137109e4a305e7fda332a38b584af493582ffea +SHA256: be7c90d171aff0597b35ebdb2eefd5a4a8e50a444bcb81ad43c2d120387d3cfb +SHA512: af8dd3bb8ad182d120cc883e116079dc9a8d8d2d4b8204313ae82943f8e00da91ee0eb831697dcfdedb46363a356a6383e91749897ac1ca9e4061390170f3331 +Homepage: https://www.ghostscript.com/ +Description: interpreter for the PostScript language and for PDF - ICC profiles + GPL Ghostscript is used for PostScript/PDF preview and printing. + Usually as a back-end to a program such as ghostview, + it can display PostScript and PDF documents in an X11 environment. + . + This package provides common ICC profiles. + +Package: libgs10 +Architecture: amd64 +Version: 10.06.0~dfsg-3ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ghostscript +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 26367 +Depends: libgs10-common (= 10.06.0~dfsg-3ubuntu1), poppler-data, libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.10.1), libgcc-s1 (>= 3.3.1), libidn12 (>= 1.13), libijs-0.35 (>= 0.35), libjbig2dec0 (>= 0.16+20190905), libjpeg8 (>= 8c), libopenjp2-7 (>= 2.0.0), libpaper2 (>= 2.2.5), libpng16-16t64 (>= 1.6.46), libstdc++6 (>= 13.1), libtiff6 (>= 4.0.3), libx11-6, libxt6t64, zlib1g (>= 1:1.2.0) +Filename: pool/libgs10_10.06.0~dfsg-3ubuntu1_amd64.deb +Size: 4404850 +MD5sum: bde9e292a0547f9a7a6f5d9bbe6ac59c +SHA1: d158d880757065ea9074fe7c76c0774da18cf43e +SHA256: 0e8652c2f0ff6ed0ca711bd085e97c492c3d0ae6605dfa8fc543d415720ddfed +SHA512: 0ab276eb747e5f9ef00a1547177f03a007f3f0e907607b9e6c08072167f8c47c046d40f9726f4fafb8ea6a363d03857b978b4841fc08fc68a79f066a015e9b74 +Homepage: https://www.ghostscript.com/ +Description: interpreter for the PostScript language and for PDF - Library + GPL Ghostscript is used for PostScript/PDF preview and printing. + Usually as a back-end to a program such as ghostview, + it can display PostScript and PDF documents in an X11 environment. + . + This package provides the Ghostscript library + which makes the facilities of GPL Ghostscript available + to applications. + +Package: libgs10-common +Architecture: all +Version: 10.06.0~dfsg-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: ghostscript +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 2267 +Depends: fonts-urw-base35 (>= 20200910), libgs-common +Recommends: fonts-droid-fallback +Filename: pool/libgs10-common_10.06.0~dfsg-3ubuntu1_all.deb +Size: 492106 +MD5sum: eb8a933875c0d5910021b5d2ec1cfeb6 +SHA1: d53ea5780b030e6f83160facbb5ab13105332970 +SHA256: ff18e8ae397fb6c49037ce632e299d0faccc8851cb19fb536fd3c1f26d911541 +SHA512: a780a164b2db4312d929239e2578a2819ede835bb35060d1d2527fc767d32a4d964f00ebd560fa8228de11d4fd29ccd767fbf02edf644daff650673aa2313ac9 +Homepage: https://www.ghostscript.com/ +Description: interpreter for the PostScript language and for PDF - common files + GPL Ghostscript is used for PostScript/PDF preview and printing. + Usually as a back-end to a program such as ghostview, + it can display PostScript and PDF documents in an X11 environment. + . + This package provides common architecture-independent files + needed by the GPL Ghostscript library. + . + By default, GPL Ghostscript uses a font from the fonts-droid package + to approximate glyphs in PDFs + for which the requested CJK TrueType font is missing. + If the fonts-droid package is not installed, + these glyphs will be rendered as bullets. + +Package: libgsf-1-114 +Architecture: amd64 +Version: 1.14.53-1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgsf +Maintainer: Ubuntu Developers +Original-Maintainer: Dmitry Smirnov +Installed-Size: 316 +Depends: libgsf-1-common (>= 1.14.53-1.1), libbz2-1.0, libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libxml2-16 (>= 2.14.3), zlib1g (>= 1:1.1.4) +Filename: pool/libgsf-1-114_1.14.53-1.1_amd64.deb +Size: 105712 +MD5sum: b556223e1ffde5e44985bbe99dcad2e0 +SHA1: 8a671c04ebd0d0b0d9afbad11ad6388eead64dbf +SHA256: f89d967ec790cdb28f3f22159b58ff068a42ac172a8961d66e7f7717e031068e +SHA512: 1b5159758ebfdaa0d35f00e3245c4cad01d4be043c8a9706e3f3fefe4a95a3b1814cdc349f8f3468982f37999256babb8971eda787ede5aa2dcdde69817f63a1 +Homepage: http://projects.gnome.org/libgsf/ +Description: Structured File Library - runtime version + The GNOME Structured File Library aims to provide an efficient + extensible I/O abstraction for dealing with different structured file + formats. + +Package: libgsf-1-common +Architecture: all +Version: 1.14.53-1.1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libgsf +Maintainer: Ubuntu Developers +Original-Maintainer: Dmitry Smirnov +Installed-Size: 52 +Replaces: libgsf-1 (<= 1.12.3-4) +Filename: pool/libgsf-1-common_1.14.53-1.1_all.deb +Size: 13708 +MD5sum: 38ce32db70e72f541616b6775f790047 +SHA1: 64ccc816cb6e8db01b3c505ca0cd3504ce6744dd +SHA256: 8839055ef6179339edf647ef5f0ade59c2c9e2487beb0cff28469e07a40a661e +SHA512: 77d147345fcbcd76a5126ca3b0f7539e265c0f5205f1cf5e65b98041349544dd4620fadceb435d1e960a2df9a56cb03da6286fd0d6e0cbbafc1fb8855116f4e0 +Homepage: http://projects.gnome.org/libgsf/ +Description: Structured File Library - common files + The GNOME Structured File Library aims to provide an efficient + extensible I/O abstraction for dealing with different structured file + formats. + . + These are the architecture independent files that are part of libgsf, + like translations of messages. + +Package: libgsound0t64 +Architecture: amd64 +Version: 1.0.3-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: gsound +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 39 +Provides: libgsound0 (= 1.0.3-4) +Depends: libc6 (>= 2.4), libcanberra0 (>= 0.2), libglib2.0-0t64 (>= 2.80.0) +Breaks: libgsound0 (<< 1.0.3-4) +Replaces: libgsound0 +Filename: pool/libgsound0t64_1.0.3-4_amd64.deb +Size: 9134 +MD5sum: 1bde2190441727749aaa553bf4a85253 +SHA1: 72112b0e7cd443a82a648e8871c26cb07853b7dc +SHA256: d5d786afa3f997ae744f4eb2ab8fa7c4cf4fa5240a71d1fa534ea1ee9cb59b5e +SHA512: e1c48c923a971cf9c26aaa7933292acbf2ff6e04f32d7482b066edd3fbf4a04efea5e24f87f7366631c0a17830a9d44b2a60be5d5dfedc67732c33948d760410 +Homepage: https://wiki.gnome.org/Projects/GSound +Description: small library for playing system sounds + GSound is a small library for playing system sounds. It's designed to + be used via GObject Introspection, and is a thin wrapper around the + libcanberra C library. + . + This package contains the shared library. + +Package: libgssdp-1.6-0 +Architecture: amd64 +Version: 1.6.4-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: gssdp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 115 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libsoup-3.0-0 (>= 3.0.3) +Filename: pool/libgssdp-1.6-0_1.6.4-5_amd64.deb +Size: 41316 +MD5sum: 3338e8d3db37154891de2ef7db4ee837 +SHA1: c74ccb24f7fa86e1245c26035845a2416bd2253f +SHA256: d1e2cae7a249ff1ccd68487e4e620fff95120e798a60e7a24d0723c07c53d0a3 +SHA512: 1a09af6c2308c5e7ecda93eda08a48f17824714ce3dcc2c2a78c39e05371e58bec88df8a39c4340948248d3983a62b4043f0278a0af7402905b5e4666d9e3bc0 +Homepage: https://wiki.gnome.org/Projects/GUPnP +Description: GObject-based library for SSDP + A GObject-based API for doing SSDP (Simple Service Discovery Protocol) + transparently. + +Package: libgstreamer-gl1.0-0 +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 712 +Depends: libc6 (>= 2.38), libdrm2 (>= 2.4.55), libegl1, libgbm1 (>= 8.1~0), libgl1, libglib2.0-0t64 (>= 2.80.0), libgstreamer-plugins-base1.0-0 (>= 1.27.50), libgstreamer1.0-0 (>= 1.28.0), libgudev-1.0-0 (>= 165), libwayland-client0 (>= 1.20.0), libwayland-cursor0 (>= 1.11), libwayland-egl1 (>= 1.15.0), libx11-6, libx11-xcb1, libxcb1 +Recommends: gstreamer1.0-gl +Breaks: libgstreamer-plugins-bad1.0-0 (<< 1.13.1) +Replaces: libgstreamer-plugins-bad1.0-0 (<< 1.13.1) +Filename: pool/libgstreamer-gl1.0-0_1.28.2-1_amd64.deb +Size: 229988 +MD5sum: 56b9b72c4dad3db2abe6eb579bc982f4 +SHA1: 79d1db18422207638f3945baf1f72d086836c937 +SHA256: 6425c5677ba4ff8c02358fa822f792f7cdfe80aca4165765eb1189d2c9521363 +SHA512: 0fec8c616c203483d3078a3dc54bf2345a8f86958560438a49f32fe170e130615b8ab5d9ba9c055e643d68f7019631390b98dd29e85553827689a536490d314f +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer GL libraries + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GL library. + +Package: libgstreamer-plugins-base1.0-0 +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-base1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 2980 +Depends: libc6 (>= 2.38), libdrm2 (>= 2.4.74), libglib2.0-0t64 (>= 2.81.1), libgstreamer1.0-0 (>= 1.28.0), liborc-0.4-0t64 (>= 1:0.4.34), zlib1g (>= 1:1.1.4), iso-codes +Recommends: gstreamer1.0-plugins-base +Suggests: libvisual-0.4-plugins +Conflicts: libgstreamer-plugins-bad1.0-0 (<< 1.15.1) +Breaks: gstreamer1.0-plugins-bad (<< 1.15.1), libgstreamer-plugins-bad1.0-0 (<< 1.15.1), totem-gstreamer (<= 2.17.92-0ubuntu1) +Filename: pool/libgstreamer-plugins-base1.0-0_1.28.2-1_amd64.deb +Size: 920576 +MD5sum: d9197aeded349b82fe3fc7d8d815630d +SHA1: bdbfc69f1991184f66f44fe8d9349f0c3c729750 +SHA256: 6a118599d9336390547d76993382f24fb358a0637ce312ee1b01917e0bddd36d +SHA512: 771a7dca6be4fdbcf6b5382330ba7629cdd83e98ecf80f408c335ada994e87ea46ca9cb0031871738d17e1cc9116d6e933daad0ead601d41b3a2338015cc5db9 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer libraries from the "base" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains libraries from the "base" set, an essential + exemplary set of elements. + +Package: libgstreamer-plugins-extra1.0-0 +Architecture: amd64 +Version: 1.28.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gst-plugins-bad1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 1501 +Depends: libc6 (>= 2.38), libdrm2 (>= 2.4.98), libglib2.0-0t64 (>= 2.81.1), libgstreamer-plugins-base1.0-0 (>= 1.28.0), libgstreamer1.0-0 (>= 1.28.0), libva-drm2 (>= 1.8), libva2 (>= 2.21.0) +Breaks: libgstreamer-plugins-bad1.0-0 (<< 1.28.0-1ubuntu2), libgstreamer-plugins-good1.0-0 (<< 1.28.0-1ubuntu3) +Replaces: libgstreamer-plugins-bad1.0-0 (<< 1.28.0-1ubuntu2), libgstreamer-plugins-good1.0-0 (<< 1.28.0-1ubuntu3) +Filename: pool/libgstreamer-plugins-extra1.0-0_1.28.2-1ubuntu1.1_amd64.deb +Size: 510250 +MD5sum: 46d8f49a70e3c34a45f3391dde32d633 +SHA1: 6582d4307547546575cfafa045539b355e1be733 +SHA256: 1eebb4613a15100b9b5efb15614da49489e6c6e6121297c51dff5dc91487b374 +SHA512: 7be48111f2f12b940dbcf1446aef4dc22f18ade644a687856269d64df5c057ee6a2b42e823169f3642c86ba7f598bafaa437cfe75d6629addf6feeec06545809 +Homepage: https://gstreamer.freedesktop.org +Description: GStreamer libraries from the "extra" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + GStreamer Extra Plug-ins is a set of plug-ins that upstream still + keeps in the Bad set, but are considered rather stable and depended + on by applications in the main repositories. + . + This package contains shared GStreamer libraries from the Extra + set. The API is not guaranteed to be stable. + +Package: libgstreamer1.0-0 +Architecture: amd64 +Version: 1.28.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gstreamer1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 3624 +Depends: libc6 (>= 2.38), libcap2 (>= 1:2.10), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.81.1), libcap2-bin +Suggests: gstreamer1.0-tools +Filename: pool/libgstreamer1.0-0_1.28.2-1_amd64.deb +Size: 1217804 +MD5sum: cb7266741712b828b411e2a1a9d7cf3a +SHA1: c0cc2835cfa9c3c1c1a8f24a494b9d00225a79f4 +SHA256: b960e6d5f23c895e6aabe8bd31bca14f14d24d47b0e6122ac3c6130c4a2fe9f5 +SHA512: 8afd9ab17cc8134dbf0f22bc43d33632be997fdd143ffa57c5e1dbbb9913a3078ac6be901e3b98a9993e7e87d89ac83d60ec16b61c931c312404dca228262888 +Homepage: https://gstreamer.freedesktop.org +Description: Core GStreamer libraries and elements + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the core library and elements. + +Package: libgtk-3-0t64 +Architecture: amd64 +Version: 3.24.52-0ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gtk+3.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 9123 +Provides: gtk3-binver-3.0.0, libgtk-3-0 (= 3.24.52-0ubuntu1) +Depends: adwaita-icon-theme, hicolor-icon-theme, shared-mime-info, libatk-bridge2.0-0t64 (>= 2.15.1), libatk1.0-0t64 (>= 2.35.1), libc6 (>= 2.38), libcairo-gobject2 (>= 1.14.0), libcairo2 (>= 1.14.0), libcolord2 (>= 0.1.10), libcups2t64 (>= 2.3~b6), libepoxy0 (>= 1.4.3), libfontconfig1 (>= 2.12.6), libfribidi0 (>= 0.19.7), libgdk-pixbuf-2.0-0 (>= 2.40.0), libglib2.0-0t64 (>= 2.78.0), libharfbuzz0b (>= 2.2.0), libpango-1.0-0 (>= 1.45.5), libpangocairo-1.0-0 (>= 1.44.0), libpangoft2-1.0-0 (>= 1.44.0), libwayland-client0 (>= 1.23), libwayland-cursor0 (>= 1.23), libwayland-egl1 (>= 1.23), libx11-6 (>= 2:1.4.99.1), libxcomposite1 (>= 1:0.4.6), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>= 2:1.2.99.4), libxinerama1 (>= 2:1.1.4), libxkbcommon0 (>= 0.5.0), libxrandr2 (>= 2:1.5.0), libgtk-3-common (>= 3.24.52-0ubuntu1) +Recommends: ibus-gtk3, libgtk-3-bin, librsvg2-common +Suggests: gvfs +Breaks: libgtk-layer-shell0 (<< 0.9.0) +Filename: pool/libgtk-3-0t64_3.24.52-0ubuntu1_amd64.deb +Size: 3072368 +MD5sum: fd1890972d1a228d42258560136a95ee +SHA1: cc025f55deeea7d34315b5fe63c6c8f46603de42 +SHA256: d03b766dd7ba2becf66cf21424bb441af4dbf62841b314af2720df74d95bda1a +SHA512: 2975704b0960908a81dd6d96d453a8e3d60a99a2bf901e01254f50a37b8aeccc54b414d3da37f71a059c9e19cc21d72f7e7b532f06ebbd2b5026d69e004578b0 +Homepage: https://www.gtk.org/ +Description: GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the shared libraries. + +Package: libgtk-3-bin +Architecture: amd64 +Version: 3.24.52-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gtk+3.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 304 +Depends: gtk-update-icon-cache, libc6 (>= 2.38), libcairo2 (>= 1.14.0), libgdk-pixbuf-2.0-0 (>= 2.40.0), libglib2.0-0t64 (>= 2.57.2), libgtk-3-0t64 (>= 3.24.52-0ubuntu1), libgtk-3-common (>= 3.24.52-0ubuntu1) +Filename: pool/libgtk-3-bin_3.24.52-0ubuntu1_amd64.deb +Size: 73916 +MD5sum: 9385d5ceb091c62276a6c9cde5e2b025 +SHA1: 4b617e28d42039c00084b87235a8d3e4671877d9 +SHA256: 40687ab50213d458256cf11485ba188c8ae51d6674144c49e568be3b1410f784 +SHA512: 56bde3d086e8843a788e24262b1279d698b63edf7e472f4ba996cdac0dae0276769e5cec06d971ecaf9baa4f176f2d67c5d8e2c9fbde90bfce9fe0c27615535a +Homepage: https://www.gtk.org/ +Description: programs for the GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the utilities which are used by the libraries + and other packages. + +Package: libgtk-3-common +Architecture: all +Version: 3.24.52-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gtk+3.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4348 +Depends: dconf-gsettings-backend | gsettings-backend +Recommends: libgtk-3-0t64 +Filename: pool/libgtk-3-common_3.24.52-0ubuntu1_all.deb +Size: 1423872 +MD5sum: 52b7870aad6a676a721ae514a546fbc4 +SHA1: feca9ae4146e2c3ead9dbb94ac0ef5c3abb3834c +SHA256: bd402f87b106a975272fb12cdeb49d26ff6521e4c909b37b4b091797bf2a732d +SHA512: 6ae01e72c04465f0eaef80b58036f33dab76ad28fd7e3e3bc7e44f21339f9c2c73a79f19dae81ee7c6469fba67d2a39f2395d94418ca5ea849c72e00124c14eb +Homepage: https://www.gtk.org/ +Description: common files for the GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the common files which the libraries need. + +Package: libgtk-4-1 +Architecture: amd64 +Version: 4.22.4+ds-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: gtk4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 12092 +Provides: gtk4-binver-4.0.0, libgtk-4-media-gstreamer (= 4.22.4+ds-0ubuntu0.1) +Depends: adwaita-icon-theme, hicolor-icon-theme, shared-mime-info, libc6 (>= 2.43), libcairo-gobject2 (>= 1.18.2), libcairo-script-interpreter2 (>= 1.18.2), libcairo2 (>= 1.18.2), libcolord2 (>= 0.1.10), libcups2t64 (>= 1.7.0), libepoxy0 (>= 1.5.2), libfontconfig1 (>= 2.12.6), libfribidi0 (>= 0.19.2), libgdk-pixbuf-2.0-0 (>= 2.31.1), libglib2.0-0t64 (>= 2.87.3), libgraphene-1.0-0 (>= 1.10.0), libgstreamer-gl1.0-0 (>= 1.14.0), libgstreamer-plugins-base1.0-0 (>= 1.23.1), libgstreamer-plugins-extra1.0-0 (>= 1.27.90-1ubuntu3), libgstreamer1.0-0 (>= 1.14.0), libharfbuzz-subset0 (>= 8.4.0), libharfbuzz0b (>= 8.4.0), libjpeg8 (>= 8c), libpango-1.0-0 (>= 1.56.0), libpangocairo-1.0-0 (>= 1.56.0), libpangoft2-1.0-0 (>= 1.56.0), libpng16-16t64 (>= 1.6.46-2~), libtiff6 (>= 4.0.3), libvulkan1 (>= 1.2.131.2), libwayland-client0 (>= 1.24.0), libwayland-egl1 (>= 1.24.0), libx11-6 (>= 2:1.4.99.1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>= 2:1.2.99.4), libxinerama1 (>= 2:1.1.4), libxkbcommon0 (>= 0.7.0), libxrandr2 (>= 2:1.5.0), libgles2, libgtk-4-common (>= 4.22.4+ds-0ubuntu0.1) +Recommends: libgtk-4-bin, ibus-gtk4, iso-codes, librsvg2-common (>= 2.48) +Suggests: gvfs +Breaks: gnome-control-center (<< 1:50~), libgtk-4-media-gstreamer (<< 4.19.2), xdg-desktop-portal-gnome (<< 50~) +Replaces: libgtk-4-media-gstreamer (<< 4.19.2) +Filename: pool/libgtk-4-1_4.22.4+ds-0ubuntu0.1_amd64.deb +Size: 3551986 +MD5sum: 2a203b241c4520f0d035df9d5700b20f +SHA1: 3efc2e8835544fcf1e968db6410897235f1cf089 +SHA256: 5ae394b2cdd4c09cb725e8a6686af27e33b476c6aca6caf016dce068b0702b2b +SHA512: 772e128ed7f302cba32d8f6fe8750c56dfa123af6df2834a6f54483e0d8952c67ad7e6005fdec888df1e79730b862d2003e6288abf9574ffcbd850b88e81cfc4 +Homepage: https://www.gtk.org/ +Description: GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the shared libraries. + +Package: libgtk-4-bin +Architecture: amd64 +Version: 4.22.4+ds-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gtk4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 12411 +Depends: gtk-update-icon-cache (>= 4.22.4+ds-0ubuntu0.1), libc6 (>= 2.43), libcairo-gobject2 (>= 1.18.2), libcairo-script-interpreter2 (>= 1.18.2), libcairo2 (>= 1.18.2), libcolord2 (>= 0.1.10), libcups2t64 (>= 1.7.0), libepoxy0 (>= 1.5.2), libfontconfig1 (>= 2.12.6), libfribidi0 (>= 0.19.2), libgdk-pixbuf-2.0-0 (>= 2.31.1), libglib2.0-0t64 (>= 2.87.3), libgraphene-1.0-0 (>= 1.10.0), libgstreamer-gl1.0-0 (>= 1.14.0), libgstreamer-plugins-base1.0-0 (>= 1.23.1), libgstreamer-plugins-extra1.0-0 (>= 1.27.90-1ubuntu3), libgstreamer1.0-0 (>= 1.14.0), libgtk-4-1 (>= 4.22.4+ds-0ubuntu0.1), libharfbuzz-subset0 (>= 8.4.0), libharfbuzz0b (>= 8.4.0), libjpeg8 (>= 8c), libpango-1.0-0 (>= 1.56.0), libpangocairo-1.0-0 (>= 1.56.0), libpangoft2-1.0-0 (>= 1.56.0), libpng16-16t64 (>= 1.6.46-2~), libtiff6 (>= 4.0.3), libvulkan1 (>= 1.2.131.2), libwayland-client0 (>= 1.24.0), libwayland-egl1 (>= 1.24.0), libx11-6 (>= 2:1.4.99.1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>= 2:1.2.99.4), libxinerama1 (>= 2:1.1.4), libxkbcommon0 (>= 0.7.0), libxrandr2 (>= 2:1.5.0), libgtk-4-common (>= 4.22.4+ds-0ubuntu0.1) +Filename: pool/libgtk-4-bin_4.22.4+ds-0ubuntu0.1_amd64.deb +Size: 3674882 +MD5sum: c604e47fc84816af59a6a4c7f318aa24 +SHA1: 8a29b0aed505316d4543f63192bc0589e68fbe43 +SHA256: fc49dca37c93c9434131eb1f7d96c9fb8290815b2ef3a4de01c4445c00b38a16 +SHA512: fa1649fa9f6a2731e86b40f2a5a37e0e3fe65df79b44c8dfb0cc3169aad6ce62ff21b613b495e206be271c8fbd2c58fbc6476a1669e2eb86304a2f31ed3afac4 +Homepage: https://www.gtk.org/ +Description: programs for the GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the utilities which are used by the libraries + and other packages. + +Package: libgtk-4-common +Architecture: all +Version: 4.22.4+ds-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: gtk4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 6668 +Depends: dconf-gsettings-backend | gsettings-backend +Recommends: libgtk-4-1 +Filename: pool/libgtk-4-common_4.22.4+ds-0ubuntu0.1_all.deb +Size: 1546346 +MD5sum: 132501d18ddbb80f98e8219da4df47f8 +SHA1: 78956ecede0c8372bbbfe42d443955dbd3fc2123 +SHA256: 701267c163e22c901b81733d8a6369cb7edf783618b30a35a663bb8111e67554 +SHA512: fcd305aaa40d78dc886e824308b5eab65217364c538388ef355be19efb8229e7de0d45f6d1f223bc527efea62b2425c9f6b2a30c9042329a156a35b3aa6cfff1 +Homepage: https://www.gtk.org/ +Description: common files for the GTK graphical user interface library + GTK is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the common files which the libraries need. + +Package: libgtk3-perl +Architecture: all +Version: 0.038-3 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 105 +Depends: perl:any, gir1.2-gdkpixbuf-2.0, gir1.2-gtk-3.0, gir1.2-pango-1.0, libcairo-gobject-perl, libglib-object-introspection-perl, libglib-perl +Filename: pool/libgtk3-perl_0.038-3_all.deb +Size: 29234 +MD5sum: 017adae62a77546de342c1b9f80d6827 +SHA1: b1ee691b631cc1e0d34fe1ee671a185560d73f9d +SHA256: 1d1c8f2229c32fcf536c55862cc5db43b64a6cf1b3f6feca6d21cbf54e6271f4 +SHA512: a6b4358eb5464b899bcc22b1d4c3d82e1491af15e93b0445d27127d0a1c5a364da79e190660f3bdffeb9259571068ee63b938145e6ba3d585dadf36953ade284 +Homepage: https://metacpan.org/release/Gtk3 +Description: Perl bindings for the GTK+ graphical user interface library + GTK+ is a multi-platform toolkit for creating graphical user + interfaces. Offering a complete set of widgets, GTK+ is suitable + for projects ranging from small one-off tools to complete application + suites. + . + This package contains the Perl bindings to GTK+, built using + Glib::Object::Introspection. Generated bindings live under the Gtk3 namespace. + +Package: libgtksourceview-5-0 +Architecture: amd64 +Version: 5.18.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: gtksourceview5 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3110 +Depends: libgtksourceview-5-common (>= 5.18.0-3), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.12.6), libfribidi0 (>= 0.19.2), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.17.1), libpango-1.0-0 (>= 1.44.3), libpangocairo-1.0-0 (>= 1.18.0), libpangoft2-1.0-0 (>= 1.37.2), libpcre2-8-0 (>= 10.22), libxml2-16 (>= 2.14.1) +Filename: pool/libgtksourceview-5-0_5.18.0-3_amd64.deb +Size: 609318 +MD5sum: cbb8ff06348a1f2eff2c95794b1910a1 +SHA1: 6c675b8b7b6d4ebc4206e0df1417f2bc8df2ce6a +SHA256: 851c90f202cadf480e1fe24eba14ee9b8e584bb8b7537681db8cd9ec1c2f0265 +SHA512: 55724ccb172b0747d687cd8232247c53d18906c91286543652133550eff38da60974c883de433d6a902c8ffe42dbbf9f64b283138f875eea0d0fc6a9d77b42fd +Homepage: https://gitlab.gnome.org/GNOME/gtksourceview +Description: shared libraries for the GTK 4 syntax highlighting widget + GtkSourceView is a text widget that extends the standard GTK 4 text widget + GtkTextView. It improves GtkTextView by implementing syntax highlighting and + other features typical of a source editor. + . + This package contains the shared libraries required by applications to use + this widget. + +Package: libgtksourceview-5-common +Architecture: all +Version: 5.18.0-3 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: gtksourceview5 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 192 +Filename: pool/libgtksourceview-5-common_5.18.0-3_all.deb +Size: 14954 +MD5sum: a4295e9d6705866552ca22ebfd8d45df +SHA1: 82a031db6ce95bf7b401a5a65ac61767311f2c4a +SHA256: 2c81bbbd23e32e1bfe96394318f14d92cefe97da7885f9c0d7f51879f430cfcb +SHA512: 603cc8a2f06edacaf8fb65eeddb71cc35e951d07fca0ce1f81dd1c6136e3cf087fb2edd5ca54a396051802d43ea8535e94b18703d53061eedbcd927817316445 +Homepage: https://gitlab.gnome.org/GNOME/gtksourceview +Description: common files for the GTK 4 syntax highlighting widget + GtkSourceView is a text widget that extends the standard GTK 4 text widget + GtkTextView. It improves GtkTextView by implementing syntax highlighting and + other features typical of a source editor. + . + This package contains the language specifications files for Ada, C, C++, C#, + CSS, ".desktop", ".diff" (patch), Fortran 95, GtkRC, Haskell, HTML, IDL, + ".ini", Java, JavaScript, LaTeX, Lua, MSIL, Nemerle, Pascal, Perl, PHP, ".po" + (gettext), Python, R, Ruby, sh, SQL, Tcl, Texinfo, VB.NET, Verilog, VHDL and + XML. + +Package: libgtop-2.0-11 +Architecture: amd64 +Version: 2.41.3-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgtop2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 112 +Depends: libgtop2-common (>= 2.41.3-2ubuntu1), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libxau6 (>= 1:1.0.11) +Filename: pool/libgtop-2.0-11_2.41.3-2ubuntu1_amd64.deb +Size: 40612 +MD5sum: ef44fde1681da346f7a60a8f76ef6d9b +SHA1: bea637f5afaf50ad7743c54b5b3dd1262ef65eea +SHA256: db542f3ad50bbb9db0723ba6a970739f7c3e4c4b747250f39170dc5bd413abf5 +SHA512: 08786a4318880f90a2d2efa1211688eb2630a3e13f876f854bdbf3d0d9cfdcdd81b2ea8e3db0ac93e32eb040ac9857401a4b06415ae55374926d7a14fe4f32ed +Description: gtop system monitoring library (shared) + The gtop library reads information about processes and the state of the + system. It is used by the GNOME desktop environment. + . + This package contains the shared library. + +Package: libgtop2-common +Architecture: all +Version: 2.41.3-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libgtop2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Filename: pool/libgtop2-common_2.41.3-2ubuntu1_all.deb +Size: 4332 +MD5sum: c45110aff6e70db6983ab843c0c0cdb5 +SHA1: e2fde4ddafca7fd09f64490af9cc916e7a9b6e30 +SHA256: 027920b974a7477358de1d6d08ca1127bc1f315c4d17dd838d933cea26781b0d +SHA512: 9b5c3f5b56ad34ae32a9f7c763f67dfa1edce40aea5db4a7eae8d81c49e7d1e2b054f7063be9adcfbccece3dd2d3867d9ad3e9b4759e7a843a4d11f067fafe64 +Description: gtop system monitoring library (common) + The gtop library reads information about processes and the state of the + system. It is used by the GNOME desktop environment. + . + This package contains the translations. + +Package: libgudev-1.0-0 +Architecture: amd64 +Version: 1:238-7build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgudev (238-7build1) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 69 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libudev1 (>= 251) +Filename: pool/libgudev-1.0-0_1%3a238-7build1_amd64.deb +Size: 15936 +MD5sum: b73768655d97cfde2f25889d2e33585b +SHA1: 641f3d6568c51271c956df80b48d0a26645a18af +SHA256: fdf0708cb0fbc95c553e3379cf77f6b1c9bb485cf3244c6246c31c7312467c81 +SHA512: a449154ca217cb9b7082ffa24f58c544021434cde2e4d954d9cd081e181648d87b35b35c62e50d963f69f3217fd91fcd5f874b8824fab3769ad7ee531f627a65 +Homepage: https://wiki.gnome.org/Projects/libgudev +Description: GObject-based wrapper library for libudev + This library makes it much simpler to use libudev from programs already using + GObject. It also makes it possible to easily use libudev from other + programming languages, such as Javascript, because of GObject introspection + support. + +Package: libgupnp-1.6-0 +Architecture: amd64 +Version: 1.6.9-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: gupnp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 277 +Depends: shared-mime-info, libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgssdp-1.6-0 (>= 1.6.2), libsoup-3.0-0 (>= 3.1.3), libxml2-16 (>= 2.14.1) +Filename: pool/libgupnp-1.6-0_1.6.9-4_amd64.deb +Size: 93634 +MD5sum: 04007405eb31797e1c12263795a64529 +SHA1: 6e64397b2e9990d0d788e2d656682bca6131c421 +SHA256: 18b90a37277442074ce0c5e1954031b9d4466919516bf36ee1d684394d6e7bfc +SHA512: 92ac411e6cb2823478fa5f93f6c75c8b8346211ff2b5ba508038e00a85d4ca5f5f7c998e0933b0a9413b4b017c37228226fd7c91293e1bfda693ae796ed705f3 +Homepage: https://gnome.pages.gitlab.gnome.org/gupnp/docs/ +Description: GObject-based library for UPnP + A GObject-based API for doing UPnP transparently. + +Package: libgupnp-av-1.0-3 +Architecture: amd64 +Version: 0.14.4-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: gupnp-av +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 303 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.58.0), libxml2-16 (>= 2.14.1) +Filename: pool/libgupnp-av-1.0-3_0.14.4-3_amd64.deb +Size: 75984 +MD5sum: a5f25d6ea02297e659ac77a640c2f340 +SHA1: bd8348f92d6c5daa00af50c225afee2c119c1ed8 +SHA256: 139b54971810fed2bd88adaf9082fd1152284ed057d0bd4ef784a3f57b1d959a +SHA512: 49fcab6ee31194f3dd3f8ba77889c2d527bb7673b069a49dabbb46072738e1460d4892337a9063bf0f122f4960de6ee26c9b2342fafea6f4289de809277d94ac +Homepage: http://www.gupnp.org +Description: Audio/Visual utility library for GUPnP + An audio/visual utility library for GUPnP, providing DIDL parser/writer and + search criteria parser objects. + +Package: libgupnp-dlna-2.0-4 +Architecture: amd64 +Version: 0.12.0-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: gupnp-dlna +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 345 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgstreamer-plugins-base1.0-0 (>= 1.0.0), libgstreamer1.0-0 (>= 1.4.0), libxml2-16 (>= 2.14.1) +Filename: pool/libgupnp-dlna-2.0-4_0.12.0-8_amd64.deb +Size: 58702 +MD5sum: e8946d8418ad2c31006f12bd5c70c6f8 +SHA1: 6be3850c5ffadb825392a086d0449e12787be8a1 +SHA256: 3c443d3b6830f10db19ee85eaf0b82b8f3ed2c3ca077c228f4c041c99d7ec835 +SHA512: b4249a8b778e9aadda25524fa805f28ff5d27616006a7dd72e0ce2d18e342189ec151b7ad6290e8f654a62a2035d880402db12408cc8e78fbba0fb72a580f4aa +Homepage: https://wiki.gnome.org/Projects/GUPnP +Description: DLNA utility library for GUPnP + A small utility library that aims to ease the DLNA-related tasks + such as media profile guessing, transcoding to a given profile, etc. + +Package: libgusb2a +Architecture: amd64 +Version: 0.4.9-7 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgusb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian UEFI Maintainers +Installed-Size: 129 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libusb-1.0-0 (>= 2:1.0.22) +Recommends: usb.ids +Breaks: libgusb2 (<< 0.4.9-6~) +Replaces: libgusb2 (<< 0.4.9-6~) +Filename: pool/libgusb2a_0.4.9-7_amd64.deb +Size: 39342 +MD5sum: e10eedf4cbaa5625ffdfbce1f7ad02b8 +SHA1: be6496a0e08647dd2f7c1d5bf2d03d667c9def73 +SHA256: 638367d04ee955fdfdcb1524f40f7db482cc624892c4db9a7a97ef41244c0836 +SHA512: 4acd3970157a7671ad4471186608253e35f3520d02891300d546a44452f149b07961365965a160d13edd3e36b9c26a5a3936a7e13ac131f79aee18b25a92a9f1 +Homepage: https://github.com/hughsie/libgusb +Description: GLib wrapper around libusb1 + GUsb is a GObject wrapper for libusb1 that makes it easy to do + asynchronous control, bulk and interrupt transfers with proper + cancellation and integration into a mainloop. + . + This package contains the GUsb shared library. + +Package: libgweather-4-0t64 +Architecture: amd64 +Version: 4.4.4-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgweather4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 862 +Provides: libgweather-4-0 (= 4.4.4-4) +Depends: libc6 (>= 2.38), libgeocode-glib-2-0 (>= 3.26.3), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.0.3), libxml2-16 (>= 2.14.1), libgweather-4-common (>= 3.5.0) +Breaks: libgweather-4-0 (<< 4.4.4-4) +Replaces: libgweather-4-0 +Filename: pool/libgweather-4-0t64_4.4.4-4_amd64.deb +Size: 361978 +MD5sum: 1250bfa60942edd319699d17cdf0923a +SHA1: 8c427a81bb1029ac60c267df2efdced1796c4249 +SHA256: aada232d86cdc5dc6c179ca4f4050fb6e11b96fa9309d7f5583c82f104853061 +SHA512: 5ced75f2858bf44f4c71f4e2d2e2fccd5c89baaec68bac21fac5b0073656e418d9cdb02e024c1a7c1b5d6313eb24986101d7528dc2a55ffa884095b05365b726 +Homepage: https://wiki.gnome.org/Projects/LibGWeather +Description: GWeather shared library + libgweather is a library to access weather information from online + services for numerous locations. + . + This package contains shared libraries. + +Package: libgweather-4-common +Architecture: all +Version: 4.4.4-4 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libgweather4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1728 +Depends: dconf-gsettings-backend | gsettings-backend +Filename: pool/libgweather-4-common_4.4.4-4_all.deb +Size: 192528 +MD5sum: 36ed650b91a91de677d071d921c3ecf8 +SHA1: 002ee515d6b6db81d04f022711cf045fd671d87e +SHA256: 8e3c53a03cd4d06fc59f56a63ef7c3ad4a1a050c37bddaa31186d653510de417 +SHA512: 5d3255101bd4119e3b7ac01b7c9c6660f80cbcc32cbfcc469400c06f4a4954838080343aa0638f04b3f78e0143eab72f1475b66e91349089b8c1bb0a8f3a2490 +Homepage: https://wiki.gnome.org/Projects/LibGWeather +Description: GWeather common files + libgweather is a library to access weather information from online + services for numerous locations. + . + This package contains the weather locations. + +Package: libgxps2t64 +Architecture: amd64 +Version: 0.3.2-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: libgxps +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 172 +Provides: libgxps2 (= 0.3.2-6) +Depends: libarchive13t64 (>= 3.0.4), libc6 (>= 2.35), libcairo2 (>= 1.10.0), libfreetype6 (>= 2.2.1), libglib2.0-0t64 (>= 2.80.0), libjpeg8 (>= 8c), liblcms2-2 (>= 2.2+git20110628), libpng16-16t64 (>= 1.6.46), libtiff6 (>= 4.0.3) +Breaks: libgxps2 (<< 0.3.2-6) +Replaces: libgxps2 +Filename: pool/libgxps2t64_0.3.2-6_amd64.deb +Size: 58358 +MD5sum: 3858c67a3afccf631ee9af0a41140753 +SHA1: cd8d36bd07000c2b325885bb2796207322ea13ea +SHA256: c6a1df57576448223369be6fa33cc0b921b9c51ef4e6d58d9e7137fe1651c04e +SHA512: ed2b0e38f34de78d4d4c8fb9f41c1401df9ae28868e1b531047f7f432479d363723c3b44eb93340dc9fdf533b63a736b889a507d3500eeca7b680a3e81b98eda +Homepage: https://wiki.gnome.org/libgxps +Description: handling and rendering XPS documents (library) + OpenXPS or XPS stands for XML Paper Specification. It is based on XML and it's + a new electronic paper format originally developed by Microsoft and it serves + as a PDF alternative. XPS files are usually created using "Microsoft XPS + Document Writer" in Windows environments. It is now standardized as an open + standard document format. + . + Quoting Wikipedia: + An XPS file is in fact a Unicoded ZIP archive using the Open Packaging + Conventions, containing the files which make up the document. These include an + XML markup file for each page, text, embedded fonts, raster images, 2D vector + graphics, as well as the digital rights management information. The contents + of an XPS file can be examined simply by opening it in an application which + supports ZIP files. + . + The OpenXPS document format specification supports features such as color + gradients, transparencies, CMYK color spaces, printer calibration, + multiple-ink systems and print schemas. + . + This package contains the library. It is being used by evince to read XPS + documents. + +Package: libhandy-1-0 +Architecture: amd64 +Version: 1.8.3-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libhandy-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 736 +Depends: libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.29), libcairo2 (>= 1.14.0), libfribidi0 (>= 0.19.2), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.23.1), libpango-1.0-0 (>= 1.14.0) +Filename: pool/libhandy-1-0_1.8.3-3build1_amd64.deb +Size: 233854 +MD5sum: 40fb89a59d97b9eac453170ded0fadd8 +SHA1: 29784a526ac3127abc724b7c465e5a254519df68 +SHA256: 9acc9624f8d50399e6a3a5183ada5ed04edffdf1e5ba176fa404cb8322c4237c +SHA512: 950ce769a57cee438559ca79b5fbe129c42b1e941bc840c4c212c1eabee2f43c4222f627acdd350d93334e8ad202b91c3a906eba0a05b429f16e9b2dc9c3ea2e +Homepage: https://gnome.pages.gitlab.gnome.org/libhandy/ +Description: Library with GTK widgets for mobile phones + libhandy provides GTK widgets and GObjects to ease developing + applications for mobile phones. + . + This package contains the shared library. + +Package: libharfbuzz-gobject0 +Architecture: amd64 +Version: 12.3.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: harfbuzz +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 163 +Depends: libglib2.0-0t64 (>= 2.14.0), libharfbuzz0b (>= 11.0.0) +Filename: pool/libharfbuzz-gobject0_12.3.2-2_amd64.deb +Size: 33252 +MD5sum: 1fa2ab538e2f16cca76b2e851385056a +SHA1: 2f57f7d7768517bd497762dd8b2017f3db1f6b29 +SHA256: 1312f58a50fac42b088766dbf4dd3c73137c3fbfb875eda130a68ada382f875c +SHA512: 7266404f48e9be5c975fbf74e1a7850185d59de48bf24f2a446709de03df4aace28645d39d2a3fb15180fc4a6d0f426b5327da78dbbbd5c6e7be3ec2677a9294 +Homepage: https://harfbuzz.github.io/ +Description: OpenType text shaping engine ICU backend (GObject library) + HarfBuzz is an implementation of the OpenType Layout engine (aka layout + engine) and the script-specific logic (aka shaping engine). + . + This package contains the GObject library, providing wrapper GObject type + bindings for all HarfBuzz objects and enums. + +Package: libharfbuzz-icu0 +Architecture: amd64 +Version: 12.3.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: harfbuzz +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 54 +Depends: libc6 (>= 2.4), libharfbuzz0b (>= 0.9.4), libicu78 (>= 78.1-1~) +Filename: pool/libharfbuzz-icu0_12.3.2-2_amd64.deb +Size: 11788 +MD5sum: 5f8d8077713a3ed4b9e2184d97617fdd +SHA1: fa769ba0adf60b57b8b94579dacbcb96825b3c7a +SHA256: eee0f49c4c19e29df01aacbf3cbd06dfa29ed850c5ae186ff2ada49b2cc4807c +SHA512: 1458f9ab3d56422a848542de52caa18f17f553da503e0df685bcda2d7d2beff1531b8f5aa8e0385c06e4299f790540c5cbf44557381228a37059c375d31b3c78 +Homepage: https://harfbuzz.github.io/ +Description: OpenType text shaping engine ICU backend + HarfBuzz is an implementation of the OpenType Layout engine (aka layout + engine) and the script-specific logic (aka shaping engine). + . + This package contains the ICU backend. + +Package: libharfbuzz-subset0 +Architecture: amd64 +Version: 12.3.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: harfbuzz +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 1147 +Depends: libc6 (>= 2.38), libharfbuzz0b (>= 11.0.0) +Filename: pool/libharfbuzz-subset0_12.3.2-2_amd64.deb +Size: 491630 +MD5sum: ea3335e9b39d21fef9ff7ef832d8537a +SHA1: f504f2fd0c6cd67ead9f7020c15d7442f2309ec3 +SHA256: 5135ba4f61cc3f71f73d3992b68b2fb08eedac7269a7070ce16d44671f143c04 +SHA512: cbdf0879fd862ea44dab23e53af0670a86695fd49cdb849a36b6a95b16287b348bbf477fc397964b52b6da45d02811dddd1901586bf609596e63988f1e333d39 +Homepage: https://harfbuzz.github.io/ +Description: OpenType text shaping engine (subset library) + HarfBuzz is an implementation of the OpenType Layout engine (aka layout + engine) and the script-specific logic (aka shaping engine). + . + This package contains the library for subsetting fonts. Subsetting reduces + codepoint coverage of font files and removes unnecessary data. + +Package: libharfbuzz0b +Architecture: amd64 +Version: 12.3.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: harfbuzz +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 1252 +Depends: libc6 (>= 2.38), libfreetype6 (>= 2.11.1), libglib2.0-0t64 (>= 2.32.0), libgraphite2-3 (>= 1.2.2) +Conflicts: libharfbuzz0, libharfbuzz0a +Replaces: libharfbuzz0, libharfbuzz0a +Filename: pool/libharfbuzz0b_12.3.2-2_amd64.deb +Size: 519090 +MD5sum: fde4c1b807d1feca5c395077dd835804 +SHA1: ce153e2978e708184f2acb1aa01c9ad7dc0b717a +SHA256: ec93ea39ddeb5a98179b60eab4af234b6c676f1958106645d1f4b19280d4cd09 +SHA512: aafaad9d71f39ad0048c6ace0ad497231e9a853a08b250eee06da7488768b3b192953d0c88e72d21eb23a6ae730b2120848cb185656150c770dd541e0c2ea2db +Homepage: https://harfbuzz.github.io/ +Description: OpenType text shaping engine (shared library) + HarfBuzz is an implementation of the OpenType Layout engine (aka layout + engine) and the script-specific logic (aka shaping engine). + . + This package contains the shared libraries. + +Package: libheif-plugin-aomdec +Architecture: amd64 +Version: 1.21.2-3ubuntu0.4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libheif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 48 +Depends: libheif1 (= 1.21.2-3ubuntu0.4), libaom3 (>= 3.2.0), libc6 (>= 2.14), libgcc-s1 (>= 3.0), libstdc++6 (>= 13) +Filename: pool/libheif-plugin-aomdec_1.21.2-3ubuntu0.4_amd64.deb +Size: 14742 +MD5sum: e011eebf2975b24cc81aac57b384c4b6 +SHA1: f32cde081cda2375b92feb32b79c7ec4063dfdf5 +SHA256: 15d31cc704ff59c1c5c908560588eb2c8ccfe517a753544574cedb4ca95900b7 +SHA512: 9e1918d822e52dd00983e820200875c72c1a9fd7110a0e482ab7a43f4c937518bdfeb1e21a9bd7f69c2eab9dfa725466ea3710f640b8e1c6daa15d22573673a9 +Homepage: http://www.libheif.org +Description: HEIF and AVIF file format decoder and encoder - aomdec plugin + libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file + format decoder and encoder. There is partial support for ISO/IEC 23008-12:2022 + (2nd Edition) capabilities. + . + HEIF and AVIF are new image file formats employing HEVC (H.265) or AV1 image + coding, respectively, for the best compression ratios currently possible. + . + libheif supports various codecs provided by plugins for image decoding and + encoding. + . + This package contains the aomdec plugin that uses libaom to decode AV1 images. + . + libaom: https://aomedia.org/ + +Package: libheif-plugin-aomenc +Architecture: amd64 +Version: 1.21.2-3ubuntu0.4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libheif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 72 +Depends: libheif1 (= 1.21.2-3ubuntu0.4), libaom3 (>= 3.2.0), libc6 (>= 2.14), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13) +Filename: pool/libheif-plugin-aomenc_1.21.2-3ubuntu0.4_amd64.deb +Size: 20952 +MD5sum: aabdd13cb8c8e2483c4d47190587fb2b +SHA1: 0eced067e6c00da3cf144ebfa1bb2b9759f98258 +SHA256: 69dcee112eae13f5ae654980403d2181f9b500b6b869f9c7b655147db24b8b41 +SHA512: d2ce3d3696afcbed0ca616cb5a69702db0da1731df937acbf1856ca48868fbdc6c97dc77b442c1112c8b6f0c7545e5514dfc77673b41a90d980ed29c139ba30f +Homepage: http://www.libheif.org +Description: HEIF and AVIF file format decoder and encoder - aomenc plugin + libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file + format decoder and encoder. There is partial support for ISO/IEC 23008-12:2022 + (2nd Edition) capabilities. + . + HEIF and AVIF are new image file formats employing HEVC (H.265) or AV1 image + coding, respectively, for the best compression ratios currently possible. + . + libheif supports various codecs provided by plugins for image decoding and + encoding. + . + This package contains the aomenc plugin that uses libaom to encode AV1 images. + . + libaom: https://aomedia.org/ + +Package: libheif1 +Architecture: amd64 +Version: 1.21.2-3ubuntu0.4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libheif +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 1654 +Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libsharpyuv0 (>= 1.5.0), libstdc++6 (>= 13.1), zlib1g (>= 1:1.1.4), libheif-plugin-aomdec (= 1.21.2-3ubuntu0.4) | libheif-plugin-dav1d (= 1.21.2-3ubuntu0.4) +Recommends: libheif-plugin-aomenc (= 1.21.2-3ubuntu0.4) +Suggests: libheif-plugin-libde265 (= 1.21.2-3ubuntu0.4), libheif-plugin-x265 (= 1.21.2-3ubuntu0.4), libheif-plugin-ffmpegdec (= 1.21.2-3ubuntu0.4), libheif-plugin-jpegdec (= 1.21.2-3ubuntu0.4), libheif-plugin-jpegenc (= 1.21.2-3ubuntu0.4), libheif-plugin-j2kdec (= 1.21.2-3ubuntu0.4), libheif-plugin-j2kenc (= 1.21.2-3ubuntu0.4), libheif-plugin-kvazaar (= 1.21.2-3ubuntu0.4), libheif-plugin-rav1e (= 1.21.2-3ubuntu0.4), libheif-plugin-svtenc (= 1.21.2-3ubuntu0.4) +Filename: pool/libheif1_1.21.2-3ubuntu0.4_amd64.deb +Size: 545844 +MD5sum: c5d630cd395cabec80098ecdf1fea4fd +SHA1: 4324b6d3b98f19f29b90696c4024d6f7e6ad204b +SHA256: cc8aead298c9b2b1ec01ea5cf4d617aa107f2ff028ddcc39028c31ccb025d5ab +SHA512: fc5d14657905541aace4b62fb9373d7ef476e2cf7fe2c2cd85cab71c45b082e951125b7c0dd045fd6455b608e1dca1edf05d1faf064d524e3a92fe4fc2d0d700 +Homepage: http://www.libheif.org +Description: HEIF and AVIF file format decoder and encoder - shared library + libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file + format decoder and encoder. There is partial support for ISO/IEC 23008-12:2022 + (2nd Edition) capabilities. + . + HEIF and AVIF are new image file formats employing HEVC (H.265) or AV1 image + coding, respectively, for the best compression ratios currently possible. + . + libheif supports various codecs provided by plugins for image decoding and + encoding. + . + This package contains the shared library. + +Package: libhpmud0 +Architecture: amd64 +Version: 3.24.4+dfsg0-0ubuntu8.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: hplip +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 364 +Depends: libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libcups2t64 (>= 1.6.0), libdbus-1-3 (>= 1.10), libsnmp40t64 (>= 5.9.4+dfsg), libusb-1.0-0 (>= 2:1.0.8) +Filename: pool/libhpmud0_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +Size: 123284 +MD5sum: 7a47d6c49212463a291fece93b1a1a3c +SHA1: 13c53cc50950415e7649c8c890f54bc2df1c491f +SHA256: 0c03898f4e3be947ee45ccf6f1e1d99d39ff20eb7ec2f41ba55675f1bf554a5e +SHA512: db262bcc2f8ac77ecfa32bd6218f57b3dcb5608412753b8cca2ad11d4d67f15516a258f287f008755d7798de98409f867eeba0dccaf897dec158f1912c730198 +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP Multi-Point Transport Driver (hpmud) run-time libraries + The HP Linux Printing and Imaging System provides full support for + printing on most HP SFP (single function peripheral) inkjets and many + LaserJets, and for scanning, sending faxes and for photo-card access on + most HP MFP (multi-function peripheral) printers. + . + Shared library that provides direct I/O for each process. Prior to + hpmud, all I/O was serialized through hpiod, a monolithic I/O processor. + The new hpmud direct I/O is faster. Hpmud supports parallel, USB and + JetDirect connectivity. + . + With hpmud, HPLIP no longer has Linux specific libusb extensions. This + means any UNIX/Linux derivative that supports libusb may work with + HPLIP. A public HPLIP "C" API is exposed through hpmud. See hpmud.h + for documentation. A Python wrapper for hpmud, called hpmudext, is also + available. + +Package: libhtml-form-perl +Architecture: all +Version: 6.13-1build1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 92 +Depends: perl:any, libhtml-parser-perl, libhttp-message-perl (>= 7.01), liburi-perl +Filename: pool/libhtml-form-perl_6.13-1build1_all.deb +Size: 31290 +MD5sum: e44814ae5948353cbe6e9624b15d970b +SHA1: dc59959ac782cf96cc00732989236e2e2ee2a8be +SHA256: 80dcc81dbc5f1e3bf6d5cc3bd958df3ea4e07ec3f8f8d9eda1d556923eab7ea3 +SHA512: 58eca6f7e3d0f662a037260a1ba13da6cc29cb601de9721da7c98782a83452843139d466d017b503d4c8417d943ece1086c6ece12b8b0906bcc09a97f1cac782 +Homepage: https://metacpan.org/release/HTML-Form +Description: module that represents an HTML form element + Objects of the HTML::Form class represents a single HTML
    ...
    + instance. A form consists of a sequence of inputs that usually have names, + and which can take on various values. The state of a form can be tweaked and + it can then be asked to provide HTTP::Request objects that can be passed to + the request() method of LWP::UserAgent. + +Package: libhtml-format-perl +Architecture: all +Version: 2.16-2 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 119 +Provides: libhtml-formatter-perl (= 2.16-2) +Depends: perl:any, libfont-afm-perl, libhtml-tree-perl +Filename: pool/libhtml-format-perl_2.16-2_all.deb +Size: 36880 +MD5sum: 446dfda0b5587e26073c7fa09417e3e7 +SHA1: dc11429979d443fc8633cfe666b18dbca1a8e85d +SHA256: b16a43f7ef44d31adcff0775b2c11d45c95121ce55a3331f572058d3bd42f067 +SHA512: 291564be73252212c1a529d7f17b5bf12b9bc632eb3a354f84a503d6c62570c25352a4ab5647c24e06f68638c2d15f9c561be9b5d4af00940b319305d916ba7d +Homepage: https://metacpan.org/release/HTML-Formatter +Description: module for transforming HTML into various formats + HTML::Formatter is a base class for various formatters, which are modules + that traverse an HTML syntax tree and produce various output file formats. + There are currently three formatter classes included: + . + * HTML::FormatText for converting to plain human-readable text + * HTML::FormatPS for converting to PostScript + * HTML::FormatRTF for converting to Microsoft's Rich Text Format (RTF) + +Package: libhtml-parser-perl +Architecture: amd64 +Version: 3.83-1ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 214 +Depends: perl (>= 5.40.1-7ubuntu0.1), perlapi-5.40.1, libc6 (>= 2.14), libhtml-tagset-perl, liburi-perl +Recommends: libhttp-message-perl +Suggests: libdata-dump-perl +Enhances: libwww-perl +Filename: pool/libhtml-parser-perl_3.83-1ubuntu0.1_amd64.deb +Size: 85658 +MD5sum: df2d5f7408c00764ab7368b802ff9b39 +SHA1: 4c6087cce6d29f8da6d6be0b8f8b7049b083b096 +SHA256: f0375ca3a7166d8f305dec34aba40f40cef32f99e0d7e508c5c8dbb67f108f71 +SHA512: fa69d4b0f860e0685ddf145d3f84386d8a6520bb6b27bcf022360df8ed67a9aad01e238d744cadfd3a87f5981d7e2f2daa435f6f11346db9a15267e91d03cb9c +Homepage: https://metacpan.org/release/HTML-Parser +Description: collection of modules that parse HTML text documents + HTML::Parser is a collection of modules useful for handling HTML documents. + These modules used to be part of the libwww-perl distribution, but are now + unbundled in order to facilitate a separate development track. + . + Objects of the HTML::Parser class will recognize markup and separate it from + content data. As different kinds of markup are recognized, the corresponding + event handler is invoked. The document to be parsed may also be supplied in + arbitrary chunks, making on-the-fly parsing of network documents possible. + +Package: libhtml-tagset-perl +Architecture: all +Version: 3.24-1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 39 +Depends: perl:any +Filename: pool/libhtml-tagset-perl_3.24-1_all.deb +Size: 14142 +MD5sum: 75e2db42136c430837be33a517ace39b +SHA1: 180ba662874acf53bdfdc5127d302794cf5b486d +SHA256: 01f8ed65eecedce4efbe97f1f4c6d536c070f7044dc5ac8b91b268a47f5750ff +SHA512: d5446132129d381f68577bdd728249e4f49e1f2d8b119c7c5348fc0a12d5f73a3a872f64c5719e7d3465bf2a32332ec826ede08463f49aea173c6e59cf5a789a +Homepage: https://metacpan.org/release/HTML-Tagset +Description: data tables pertaining to HTML + HTML::Tagset contains data tables useful in dealing with HTML. For instance, + it provides %HTML::Tagset::emptyElement, which lists all of the HTML elements + which cannot have content. It provides no functions or methods. + +Package: libhtml-tree-perl +Architecture: all +Version: 5.07-3 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 478 +Depends: perl:any, libhtml-parser-perl, libhtml-tagset-perl +Recommends: libhtml-format-perl, libwww-perl +Filename: pool/libhtml-tree-perl_5.07-3_all.deb +Size: 199830 +MD5sum: 7367dec9e6de168c02b602edb6839312 +SHA1: 95bbf3cd9a5c01f2664cd885a68306cf0e225cb6 +SHA256: e2759b8b8ab5a879923718c9335e256f508ea17e4c8c810c52d11a19fcd088b2 +SHA512: 88b129813e293becd77819064fb8161a7b58f37c2d2bc681ec377bcc5cbea2d73c748f33f570d196ba60106f3c4d4889670d08bdb703d8c5068a7485cc0ea4f4 +Homepage: https://metacpan.org/release/HTML-Tree +Description: Perl module to represent and create HTML syntax trees + HTML::Tree is a collection of modules that represent, create and extract + information from HTML syntax trees. These modules used to be part of + the libwww-perl distribution, but are now unbundled in order to + facilitate a separate development track. + +Package: libhttp-cookies-perl +Architecture: all +Version: 6.11-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 49 +Depends: perl:any, libhttp-date-perl, libhttp-message-perl +Filename: pool/libhttp-cookies-perl_6.11-1_all.deb +Size: 18208 +MD5sum: 82e273ba56996a5842663a81b10a1147 +SHA1: 0733458edc45ff7ff1a766baea0e4f1bb5e770d9 +SHA256: 1dcb51ac2201ecf596741c5234bb6aa8d4f65c8ac1f71e56f17a484a2424e60f +SHA512: 919f4963b30357750af55cafc28bc4bdd2727b43682f64a11621b79a158128127ec81730404eef950fec56c4cc346033e9288247554d1b4cdf906bdb99a6f145 +Homepage: https://metacpan.org/release/HTTP-Cookies +Description: HTTP cookie jars + This class is for objects that represent a "cookie jar" -- that is, a + database of all the HTTP cookies that a given LWP::UserAgent object knows + about. + . + Cookies are a general mechanism which server side connections can use to both + store and retrieve information on the client side of the connection. For more + information about cookies refer to + and + . HTTP::Cookies also implements the new + style cookies described in RFC 2965. The two variants of cookies are supposed + to be able to coexist happily. + . + Instances of the class HTTP::Cookies are able to store a collection of + Set-Cookie2: and Set-Cookie: headers and are able to use this information to + initialize Cookie-headers in HTTP::Request objects. The state of a + HTTP::Cookies object can be saved in and restored from files. + +Package: libhttp-daemon-perl +Architecture: all +Version: 6.16-1ubuntu0.26.04.1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 56 +Depends: perl:any, libhttp-date-perl, libhttp-message-perl, libio-socket-ip-perl, liblwp-mediatypes-perl, libsocket-perl +Filename: pool/libhttp-daemon-perl_6.16-1ubuntu0.26.04.1_all.deb +Size: 22100 +MD5sum: 13ce3c3581aa83481ec02e48656404f2 +SHA1: c7ed80154a82e84e9b90dcaaadab5682b560917d +SHA256: 11c841178a65e43be30f25bec283fe753921b36d5a3c9f02061af032914bd47b +SHA512: 6c6da9c3f97209b816332515b9557576e4cff880a0060a5e6ac82913d456061b62b5e3ef7895967015d85943f2011969717d48299ea05a90c842b4dbf7a4fff1 +Homepage: https://metacpan.org/release/HTTP-Daemon +Description: simple http server class + Instances of the HTTP::Daemon class are HTTP/1.1 servers that listen on a + socket for incoming requests. The HTTP::Daemon is a subclass of + IO::Socket::IP, so you can perform socket operations directly on it too. + . + The accept() method will return when a connection from a client is available. + The returned value will be an HTTP::Daemon::ClientConn object which is + another IO::Socket::IP subclass. Calling the get_request() method on this + object will read data from the client and return an HTTP::Request object. The + ClientConn object also provide methods to send back various responses. + . + This HTTP daemon does not fork(2) for you. Your application, i.e. the user of + the HTTP::Daemon is responsible for forking if that is desirable. Also note + that the user is responsible for generating responses that conform to the + HTTP/1.1 protocol. + +Package: libhttp-date-perl +Architecture: all +Version: 6.06-1ubuntu0.26.04.1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 30 +Depends: perl:any, libtime-local-perl (>= 1.28), libtimedate-perl +Filename: pool/libhttp-date-perl_6.06-1ubuntu0.26.04.1_all.deb +Size: 10572 +MD5sum: cbbc7bc78aae1ab3cb1a8857292cbb3d +SHA1: 237c634b9989524f37e00e2c4d1b6fdbf6a5f715 +SHA256: 0c8aaf66cbdc31fb508d79cadfb5dc75c88bacdcbd76f71f083385f7940d17ce +SHA512: 370f238ce4c327631f3143947012ba784e62baef2e3a31b732ca0431f5e1adb2e6510d991b3cc6db502445f49f6cc41b617aa6a37080ea0829b3c83f50c331e9 +Homepage: https://metacpan.org/release/HTTP-Date +Description: module of date conversion routines + HTTP::Date provides functions that deal the date formats used by the HTTP + protocol (and then some more). Only the first two functions, time2str() and + str2time(), are exported by default. + +Package: libhttp-message-perl +Architecture: all +Version: 7.01-1ubuntu1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 195 +Depends: perl:any, libclone-perl, libcompress-raw-bzip2-perl, libcompress-raw-zlib-perl, libencode-locale-perl, libencode-perl, libhttp-date-perl, libio-html-perl, liblwp-mediatypes-perl, liburi-perl +Suggests: libio-compress-brotli-perl +Breaks: libhtml-form-perl (<< 6.11-2~) +Filename: pool/libhttp-message-perl_7.01-1ubuntu1_all.deb +Size: 76070 +MD5sum: bc85f975383fea04efeab21733554e42 +SHA1: f7429c0a6cbcf6d71a28e40cb0fb4436853ecc85 +SHA256: 3262822fd110cf66c398095bc0cfd69c21dda513f15f3ff9fbe9e5dc344f7ff4 +SHA512: 48b7cd0404130b6c8c6c2d5e9ae2294f192954270a414be296d5e00408e1c2e243ab0aacccf7dc20e52e79ba13170591bda6eac14d864b81686ce4c4c6d81cd0 +Homepage: https://metacpan.org/release/HTTP-Message +Description: perl interface to HTTP style messages + The HTTP::Message distribution contains classes useful for representing the + messages passed in HTTP style communication. These are classes representing + requests, responses and the headers contained within them. + . + The HTTP::Headers class encapsulates HTTP-style message headers. The headers + consist of attribute-value pairs also called fields, which may be repeated, + and which are printed in a particular order. The field names are cases + insensitive. + . + Instances of this class are usually created as member variables of the + HTTP::Request and HTTP::Response classes, internal to the library. + +Package: libhttp-negotiate-perl +Architecture: all +Version: 6.01-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 34 +Depends: perl:any, libhttp-message-perl +Filename: pool/libhttp-negotiate-perl_6.01-2_all.deb +Size: 12368 +MD5sum: fdd0e746c6a289996f3164c57934f619 +SHA1: 9965927758215f51bedf587352c2d5763445b668 +SHA256: c39b2d426a434c2a7f1ddd5c19b2f72a0c07f767932d15f97d31a4dad408c25a +SHA512: 7de2ab48e11aca2ce0b5b47e94f4536f0b9d7321b9958f4bd4d22f961bff4e41133eae79767e649d5d101f00d4c65cc56de7f25f96df62dc63938b3c8bb6e288 +Homepage: https://metacpan.org/release/HTTP-Negotiate +Description: implementation of content negotiation + HTTP::Negotiate provides a complete implementation of the HTTP content + negotiation algorithm. Content negotiation allows for the selection of a + preferred content representation based upon attributes of the negotiable + variants and the value of the various Accept* header fields in the request. + +Package: libhunspell-1.7-0 +Architecture: amd64 +Version: 1.7.2+really1.7.2-11 +Multi-Arch: same +Priority: optional +Section: libs +Source: hunspell +Maintainer: Ubuntu Developers +Original-Maintainer: Debian LibreOffice Maintainers +Installed-Size: 786 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5.2) +Recommends: hunspell-en-us | hunspell-dictionary | myspell-dictionary +Conflicts: openoffice.org-core (= 2.2.0~rc2-1) +Breaks: hunspell (<< 1.7.2+really1.7.2), r-cran-hunspell (<= 3.0.2+dfsg-1) +Filename: pool/libhunspell-1.7-0_1.7.2+really1.7.2-11_amd64.deb +Size: 315810 +MD5sum: 82d41152b87ec9b60c371d156dec3cd0 +SHA1: d8afc324077d9ae1c08fb4bec347426680b2e4cb +SHA256: 2787cc87d5e7b1381b05f7cfb568e5044b8b0f15b62b14fd2ffe255f7c7a4329 +SHA512: ccd29ae1bbe48e58df36ff21c26bf090016e587e4a7e29ac76bfcc7da19ed257356f3c89aca89b07a984fc7c362a1170adcd59c6363ff85f9de505528f036024 +Homepage: https://hunspell.github.io/ +Description: spell checker and morphological analyzer (shared library) + Hunspell is a spell checker and morphological analyzer library and program + designed for languages with rich morphology and complex word compounding or + character encoding. It is based on MySpell and features an Ispell-like + terminal interface using Curses library, an Ispell pipe interface and an + OpenOffice.org UNO module. + . + Main features: + - Unicode support (first 65535 Unicode characters) + - morphological analysis (in custom item and arrangement style) + - Max. 65535 affix classes and twofold affix stripping (for agglutinative + languages, like Azeri, Basque, Estonian, Finnish, Hungarian, Turkish, etc.) + - Support complex compoundings (for example, Hungarian and German) + - Support language specific algorithms (for example, handling Azeri + and Turkish dotted i, or German sharp s) + - Handling conditional affixes, circumfixes, fogemorphemes, + forbidden words, pseudoroots and homonyms. + . + This package contains the shared library. + +Package: libhwy1t64 +Architecture: amd64 +Version: 1.3.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: highway +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 5779 +Provides: libhwy1 (= 1.3.0-2) +Depends: libc6 (>= 2.38), libgcc-s1 (>= 13), libstdc++6 (>= 5.2) +Breaks: libhwy1 (<< 1.3.0-2) +Replaces: libhwy1 +Filename: pool/libhwy1t64_1.3.0-2_amd64.deb +Size: 767902 +MD5sum: c09d6424f09c22af156a30c32fd9a951 +SHA1: dba81e62d226958af3a990288edc7e6076f066b5 +SHA256: 8b4e74f6fc7c9a08956f1430fe5d80f4d8970a08fe24df9e187d57753f652c7a +SHA512: 242d2ed445e1d168bac0709afab6fea6c5771a9a75a9dd75b738daa568c7391d0e8a6538bb73a21780ef2ab58447676136e53d6a935be70c1e84706ce9d3f0d1 +Homepage: https://github.com/google/highway +Description: Efficient and performance-portable SIMD wrapper (runtime files) + This library provides type-safe and source-code portable wrappers over + existing platform-specific intrinsics. Its design aims for simplicity, + reliable efficiency across platforms, and immediate usability with current + compilers. + . + This package installs the highway runtime files. + +Package: libhyphen0 +Architecture: amd64 +Version: 2.8.8-7build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: hyphen +Maintainer: Ubuntu Developers +Original-Maintainer: Debian LibreOffice Maintainers +Installed-Size: 76 +Depends: libc6 (>= 2.38) +Filename: pool/libhyphen0_2.8.8-7build4_amd64.deb +Size: 26730 +MD5sum: 055a8d9cb504faab3c7523a0e61c9822 +SHA1: 7766aca72325cd89ba3ece83adc46a8854fcfc1b +SHA256: eda68421ab4d85d79cc3bdc0ee5cac6bf80b8741187446f019a98d9e40bc1101 +SHA512: ba348bf8ca52f980532c6c8b7b1e691c057e5f22291541d2024a384fa44054918b9aba4540086511f5ff23fe59cec8989f40b0acff3c88f20bd6810bee5501e6 +Homepage: https://github.com/hunspell/hyphen +Description: ALTLinux hyphenation library - shared library + ALTLinuxhyph is a modified version of libhnj which is a high quality + hyphenation and justification library based on the TeX + hyphenation algorithm. The TeX hyphenation patterns could be used after + a preprocessing step. + . + It is used in OpenOffice.org + . + This package contains the shared library. + +Package: libibus-1.0-5 +Architecture: amd64 +Version: 1.5.34~rc2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 588 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0) +Breaks: libqt5gui5t64 (<< 5.15.1) +Filename: pool/libibus-1.0-5_1.5.34~rc2-1_amd64.deb +Size: 180936 +MD5sum: bbb7a4262bd2762b5c686077aabae596 +SHA1: f02d149c5f36cff503628d54561e1ed8c517afc2 +SHA256: 74a80664f054cec242dc8e4147a6455969a52fd1e7ff68add97b0f4cc0c0dd6b +SHA512: 086154f4524773aa6952d582988156e4ab84be83098ec564078834eab2c35bf68f1cbe7226a817feae5b66245b974a9bd2155dd041d0c548bc2d885ea41d04fd +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - shared library + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains the shared library. + +Package: libibverbs1 +Architecture: amd64 +Version: 61.0-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: rdma-core +Maintainer: Benjamin Drung +Installed-Size: 206 +Depends: adduser, libc6 (>= 2.38), libnl-3-200 (>= 3.11.0), libnl-route-3-200 (>= 3.11.0) +Recommends: ibverbs-providers +Breaks: ibverbs-providers (<< 59~) +Filename: pool/libibverbs1_61.0-2ubuntu3_amd64.deb +Size: 70568 +MD5sum: cf3e43ea5804483515a4d2e6dc760d1c +SHA1: 8729f2f90034980d877d81e6c4b23b21f7e5eaf6 +SHA256: 1d9e2e86e6500dabb6143c04adea8d122c7caa72aae3832de88d7ada4fa97201 +SHA512: 5b0943f658a74a1922a43ca3ae669c515d1ea8a0ebdc4d80f33ef943ca037bbd493432a2289453fd1ef5692f179dc4262737bbed1a165c703b45782db00e0246 +Homepage: https://github.com/linux-rdma/rdma-core +Description: Library for direct userspace use of RDMA (InfiniBand/iWARP) + libibverbs is a library that allows userspace processes to use RDMA + "verbs" as described in the InfiniBand Architecture Specification and + the RDMA Protocol Verbs Specification. iWARP ethernet NICs support + RDMA over hardware-offloaded TCP/IP, while InfiniBand is a + high-throughput, low-latency networking technology. InfiniBand host + channel adapters (HCAs) and iWARP NICs commonly support direct + hardware access from userspace (kernel bypass), and libibverbs + supports this when available. + . + For this library to be useful, a device-specific plug-in module + should also be installed. + . + This package contains the shared library. + +Package: libical3t64 +Architecture: amd64 +Version: 3.0.20-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libical3 +Maintainer: Ubuntu Developers +Original-Maintainer: Nicolas Mora +Installed-Size: 1449 +Provides: libical3 (= 3.0.20-2build1) +Depends: tzdata, libc6 (>= 2.38), libdb5.3t64, libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.80.0), libicu78 (>= 78.1-1~), libstdc++6 (>= 5.2) +Breaks: libical3 (<< 3.0.20-2build1) +Replaces: libical3 +Filename: pool/libical3t64_3.0.20-2build1_amd64.deb +Size: 307558 +MD5sum: d213d490f1d0949d7638142daffd7b06 +SHA1: 8599ebd25d0996051eab233f3d821e024b1a6bc3 +SHA256: 99be1a4b6133a9b785ab618454fd86924e039bc78612eb2c72c33e7392f5f1c2 +SHA512: 642b2389a11de21ff8077deeb80600fa0fcfe783ee4b283fe01e2aebfd5035bb64d5b2fd954933ffc66349082e7ec566fcf09349ccf4ac3633ca86059b063a35 +Homepage: https://github.com/libical/libical +Description: iCalendar library implementation in C (runtime) + libical is an open source implementation of the IETF's iCalendar calendaring + and scheduling protocols (RFC 2445, 2446, and 2447). It parses iCal components + and provides a C API for manipulating the component properties, parameters, + and subcomponents. + . + This package contains the files necessary for running applications that use + the libical library. + +Package: libice6 +Architecture: amd64 +Version: 2:1.1.1-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libice +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 114 +Depends: libc6 (>= 2.38), x11-common +Filename: pool/libice6_2%3a1.1.1-1build1_amd64.deb +Size: 44016 +MD5sum: 03948f883ea85af54de58067e9be0959 +SHA1: ef960443204ac398a3fac6317e30e983c03bf5b7 +SHA256: d755a3f99a4895165703aad60ff15cf931e04da41b35facb15393d7d4b2c0242 +SHA512: c1d3b68f364111b175dd96a74ec79f34ddab2ccf8a9c4e3f1b36229241f24ec80135e010ce7c4b35538f7199a631d0943028617e7e499b84ab2ca70b916ef28a +Description: X11 Inter-Client Exchange library + This package provides the main interface to the X11 Inter-Client Exchange + library, which allows for communication of data between X clients. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libICE + +Package: libicu78 +Architecture: amd64 +Version: 78.2-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: icu +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 38705 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 14) +Filename: pool/libicu78_78.2-2ubuntu1_amd64.deb +Size: 11456466 +MD5sum: 24dc7df66c0aad03236f9060d3a80c93 +SHA1: 1cacec099ede136af78e374cf149be166c62e70f +SHA256: c8b97930f9e365d6d00978144b468ac8397ef07d2fb2c453869f05fc3a98c4ca +SHA512: 4b2143a5922cc928409961acd1a2547ee1be65d2fbc5142450ee7993b6ba81db9a18a68e2a3048fbe78793714283b1e27ed165eecda4f6c08af20218ca4b2099 +Homepage: https://icu.unicode.org/ +Description: International Components for Unicode + ICU is a C++ and C library that provides robust and full-featured + Unicode and locale support. This package contains the runtime + libraries for ICU. + +Package: libidn12 +Architecture: amd64 +Version: 1.43-2ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libidn +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Libidn Team +Installed-Size: 232 +Depends: libc6 (>= 2.14) +Filename: pool/libidn12_1.43-2ubuntu0.26.04.1_amd64.deb +Size: 57800 +MD5sum: 792eedf97bff5db2c142725c3300111e +SHA1: 280719850bb2cef15106edf4b1fea22589cfd4c6 +SHA256: 93f52978f16f850f0a27891d373304f41a0aa986f82921b3267224b26fdcc2f5 +SHA512: 5c2a7beca8aa2b933f329a3811f251f0a609253e538498b776792cd94db2f2d962934388c19675e2e8afe640ff28f49461e0628af2d2713e5470ce88721269aa +Homepage: https://www.gnu.org/software/libidn/ +Description: GNU Libidn library, implementation of IETF IDN specifications + GNU Libidn is a fully documented implementation of the Stringprep, + Punycode and IDNA specifications. Libidn's purpose is to encode and + decode internationalized domain names. The Nameprep, XMPP, SASLprep, + and iSCSI profiles are supported. + . + This package contains the shared library. + +Package: libiec61883-0 +Architecture: amd64 +Version: 1.2.0-8 +Multi-Arch: same +Priority: optional +Section: libs +Source: libiec61883 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 84 +Depends: libc6 (>= 2.4), libraw1394-11 (>= 2.1.2) +Filename: pool/libiec61883-0_1.2.0-8_amd64.deb +Size: 25708 +MD5sum: c79c068295c9320512bc36e2ff909e44 +SHA1: ee3989a45f1af50675f7fd16d37cbe986fba914b +SHA256: 6fd159a125d70973915a4d4a3a9ea0a3713b35b6c8b36eed4120ef4a235c152b +SHA512: 2d27768a77d3796b70c291a879899eea73b6d2516f6d79af010a63d0e8cccaf94dfa9e8051dcdc13abb6f101cc13f81c4181dec41eced8196739c77064565fda +Homepage: https://ieee1394.docs.kernel.org/en/latest/libiec61883.html +Description: partial implementation of IEC 61883 (shared lib) + Implementation of IEC 61883, part 1 (CIP, plug registers, and CMP), part 2 + (DV-SD), part 4 (MPEG2-TS), and part 6 (AMDTP). Outside of IIDC, nearly all + FireWire multimedia devices use IEC 61883 protocols. + . + The libiec61883 library provides a higher level API for streaming DV, + MPEG-2 and audio over Linux IEEE 1394. This includes both reception and + transmission. It uses the new "rawiso" API of libraw1394, which + transparently provides mmap-ed DMA for efficient data transfer. It also + represents the third generation of I/O technology for Linux 1394 for + these media types thereby removing the complexities of additional kernel + modules, /dev nodes, and procfs. It also consolidates features for plug + control registers and connection management that previously existed in + experimental form in an unreleased version of libavc1394. + +Package: libieee1284-3t64 +Architecture: amd64 +Version: 0.2.11-14.1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libieee1284 +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 68 +Provides: libieee1284-3 (= 0.2.11-14.1build2) +Depends: libc6 (>= 2.38) +Breaks: libieee1284-3 (<< 0.2.11-14.1build2) +Replaces: libieee1284-3 +Filename: pool/libieee1284-3t64_0.2.11-14.1build2_amd64.deb +Size: 22018 +MD5sum: f3f3545f31adca8086463f9a1f2f6505 +SHA1: 4e6206ad81fa326fcb50398135970e6e8f4666d3 +SHA256: e2d8497cb45f5a99a018c4b83a88ecba44805442fdc3b82d5b541ed99f257c08 +SHA512: 54b1b0f1cc76874bad258b4e0119e81460fe8cd88d11896a3e217af9c7ad770fe4a3903af02e66037ee85ca81b5394e32b1c36376949b129d9811863c21c41a1 +Homepage: http://cyberelk.net/tim/software/libieee1284/ +Description: cross-platform library for parallel port access + This library was designed to ease the use of the parallel port. It will + automatically figure out which access method is available, depending on the + running kernel and the permissions of the process. + . + It handles particular queries to the devices, like fetching the Device ID of + a device. + +Package: libijs-0.35 +Architecture: amd64 +Version: 0.35-16 +Multi-Arch: same +Priority: optional +Section: libs +Source: ijs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 48 +Depends: libc6 (>= 2.14) +Filename: pool/libijs-0.35_0.35-16_amd64.deb +Size: 15582 +MD5sum: 09879bd18c46df3e4c033993211a9933 +SHA1: 0022fd466b891011919e9368abba0fbd898afd2d +SHA256: 9f65ccd8b1afde140286b2890064bb1119afabc5aead01ed0aa741134ee8cc94 +SHA512: c75d9a7f732c5a52ddfafbb8692392778fd4071d57aee42d8e159e8b77d39c5be66cdc38af7546521f79057fc6484ef45813b836c4833a021d22e33b225bab5d +Homepage: https://www.linuxprinting.org/ijs/ +Description: IJS raster image transport protocol: shared library + IJS is, first and foremost, a protocol for transmission of raster page + images. This snapshot provides a reference implementation of the protocol, + the design of which is still in flux. When the protocol specification is + published, it will be authoritative. Applications should feel free to link + against the library provided in this package, adapt that code for their own + needs, or roll a completely new implementation. + . + IJS is a client-server protocol, used to write ghostscript drivers. The + drivers are separate programs. The client and server communicate via pipes, + though shared memory may be used additionally in the future. Currently IJS + is used by the hpijs and ijsgimpprint drivers. + . + Code for both the client- and server-side is included in the library. This + package provides the shared library. + +Package: libimagequant0 +Architecture: amd64 +Version: 4.4.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libimagequant +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 630 +Depends: libc6 (>= 2.34), libgcc-s1 (>= 4.2) +Filename: pool/libimagequant0_4.4.1-1_amd64.deb +Size: 264352 +MD5sum: a076de86252ef1e19e8c054aaa5590d8 +SHA1: 786149160e74c937d8dcdef6bfc799729c0aa5c7 +SHA256: da65f428985ce4cf9ee3cd4f845749812f006909ba6c130bd6c9fa7d1d491988 +SHA512: cb622a9287a4bcc318904fea17238017128f31d588e69325cc0ab16600c5edb472090c28b0a715b4dfc1dd3b60b97a4cf0904ec2ea2c9afc32ef70caec7858ad +Homepage: https://github.com/ImageOptim/libimagequant +Description: palette quantization library + Small, portable C library for high-quality conversion of RGBA + images to 8-bit indexed-color (palette) images. + . + This library powers pngquant and other PNG optimizers. + +Package: libimobiledevice-1.0-6 +Architecture: amd64 +Version: 1.4.0-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libimobiledevice +Maintainer: Ubuntu Developers +Original-Maintainer: gtkpod Maintainers +Installed-Size: 320 +Depends: libc6 (>= 2.38), libimobiledevice-glue-1.0-0 (>= 1.3.0), libplist-2.0-4 (>= 2.5.0), libssl3t64 (>= 3.0.0), libusbmuxd-2.0-7 (>= 2.1.0) +Recommends: usbmuxd +Suggests: libusbmuxd-tools +Breaks: libimobiledevice6 (<< 1.3.0-9) +Replaces: libimobiledevice6 (<< 1.3.0-9) +Filename: pool/libimobiledevice-1.0-6_1.4.0-1build1_amd64.deb +Size: 138190 +MD5sum: 9f1e8ce76100d124bc51a3ddb2ae6ee0 +SHA1: 7d10169ecaa14de3d0e6e0e109512f87370261b7 +SHA256: b5277ade48034e54db3f0b714ab0935b4657632fbdd8ec3d795e2c044272a622 +SHA512: 032d9fc2a786ea3fe66dc14b21b5e5c1ba3915efc041fd0269a68e9bd0dd8a49eadb92a053e1fb0e14951477b9542b97aadfe2f72690aeda76f708ef9ac84026 +Homepage: https://www.libimobiledevice.org/ +Description: Library for communicating with iPhone and other Apple devices + libimobiledevice is a library that talks the native Apple USB protocols that + the iPhone, iPad and iPod Touch use. Unlike other projects, libimobiledevice + does not depend on using any existing libraries from Apple. + +Package: libimobiledevice-glue-1.0-0 +Architecture: amd64 +Version: 1.3.2-2build1 +Priority: optional +Section: libs +Source: libimobiledevice-glue +Maintainer: Ubuntu Developers +Original-Maintainer: gtkpod Maintainers +Installed-Size: 102 +Depends: libc6 (>= 2.38), libplist-2.0-4 (>= 2.7.0) +Filename: pool/libimobiledevice-glue-1.0-0_1.3.2-2build1_amd64.deb +Size: 33830 +MD5sum: 60dbb540782c0b65f20bad795f479e5e +SHA1: e9fcdc05ec2288f65477d35f3b5404620f378189 +SHA256: c2e1b9b47592a645be9ece937f3c4f18a99a8de0d9f79134dca9d4582bcdfcdb +SHA512: 05a8cecde10031313d8c605e487dea0227b1b1478c12d57a330e2f985f2a9f0ae28ebc06cf83ccc98ac3aed622888883907ecb832cb7de18d8c49be93fc04dd7 +Homepage: https://github.com/libimobiledevice/libimobiledevice-glue +Description: Common library used by the libimobiledevice project + This library contains common code used by the libraries and tools around + the libimobiledevice project. + . + This package provides the shared library files. + +Package: libini-config5t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 127 +Provides: libini-config5 (= 0.6.2-3build1) +Depends: libbasicobjects0t64 (>= 0.4.0), libc6 (>= 2.38), libcollection4t64 (>= 0.5.0), libpath-utils1t64 (>= 0.4.0), libref-array1t64 (>= 0.4.0) +Breaks: libini-config5 (<< 0.6.2-3build1) +Replaces: libini-config5 +Filename: pool/libini-config5t64_0.6.2-3build1_amd64.deb +Size: 43914 +MD5sum: 04e322949010f4043d4e4933e10599a9 +SHA1: 287892e54442cc21839efd95fc5511445767e656 +SHA256: 6512a039125162e5b8bb01940ce1c5be14abcc91810afd3ca60ebb45346d1d82 +SHA512: e9a9430f14350f021e65a3429019a8307192e0003c4bbe8a340fb0877563bb4b5ac4de5c16d803f7bfa52783c7ee095db063d6111042bdbb1b87a697093d1317 +Homepage: https://github.com/SSSD/ding-libs +Description: INI file parser for C + Library to process config files in INI format into a libcollection data + structure. + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: libinih1 +Architecture: amd64 +Version: 61-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libinih +Maintainer: Ubuntu Developers +Original-Maintainer: Yangfl +Installed-Size: 31 +Depends: libc6 (>= 2.4) +Filename: pool/libinih1_61-1ubuntu1_amd64.deb +Size: 7726 +MD5sum: 342760af3997d8ab6db5b578c3233593 +SHA1: dc77b827716d0cbf79a6807ff8e9da8c903a2a6f +SHA256: 6ee8d9867cc98d192a7b6bc589c61aad12b2e8479c6a0217932afa6c2db99df6 +SHA512: 7030bfc0d6a80778e17c0f7e61a5a0efc3e2cd47135b4d76756c57b7177c23d79ad10347b8d058824d039cf5846281b7fdf537abe7e19026bbda9c1294737f96 +Homepage: https://github.com/benhoyt/inih +Description: simple .INI file parser + inih (INI Not Invented Here) is a simple .INI file parser written in C. + It's only a couple of pages of code, and it was designed to be small and + simple, so it's good for embedded systems. It's also more or less + compatible with Python's ConfigParser style of .INI files, including + RFC 822-style multi-line syntax and name: value entries. + +Package: libinireader0 +Architecture: amd64 +Version: 61-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libinih +Maintainer: Ubuntu Developers +Original-Maintainer: Yangfl +Installed-Size: 52 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libinih1 (>= 61), libstdc++6 (>= 4.9) +Filename: pool/libinireader0_61-1ubuntu1_amd64.deb +Size: 13134 +MD5sum: bd9d8a860107cd529f94143589e9879c +SHA1: 5afbdd4d5eb243d1b56b501f67926fda5140012e +SHA256: e3758dc01da47a9c793995bc7560bf1d503616080c81f023949a881103edc10d +SHA512: fe3df697822331609295fd67d819dcc9c9b1898e2f266ca230105f681f5a341ab57baa2bb14e28a6c9d188cd3ff68ccabee43c9c749f079f9bbfcb849723455b +Homepage: https://github.com/benhoyt/inih +Description: simple .INI file parser for C++ + INIReader is a simple .INI file parser written for C++ derived from inih. + It's only a couple of pages of code, and it was designed to be small and + simple, so it's good for embedded systems. It's also more or less + compatible with Python's ConfigParser style of .INI files, including + RFC 822-style multi-line syntax and name: value entries. + +Package: libinput-bin +Architecture: amd64 +Version: 1.31.1-1ubuntu1.2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libinput +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 160 +Depends: libc6 (>= 2.38), libevdev2 (>= 1.10.0), libudev1 (>= 183), libwacom9 (>= 2.0.0) +Filename: pool/libinput-bin_1.31.1-1ubuntu1.2_amd64.deb +Size: 24484 +MD5sum: 7cac0fc7d2165b70d921f0ae90ad0a58 +SHA1: 71e7db02d6c52d6fa527d5608db24935f185e4b7 +SHA256: 2b9635549e990d505c2f0e62eeb9abe9055ea58a810b06725f78eef49264851f +SHA512: 4259b85646ec05c2ca25330b5f5c88eb5480f846a9179bb176c62e45a1cf193db95beacefeca4e3c9f5ac6fdee367a5f024a6bf9453939a6fd4a386ca376d71f +Homepage: https://www.freedesktop.org/wiki/Software/libinput/ +Description: input device management and event handling library - udev quirks + libinput is a library that handles input devices for display servers and + other applications that need to directly deal with input devices. + . + It provides device detection, device handling, input device event + processing and abstraction to minimize the amount of custom input + code the user of libinput needs to provide the common set of + functionality that users expect. + . + This package includes the udev quirks database and helpers. + +Package: libinput10 +Architecture: amd64 +Version: 1.31.1-1ubuntu1.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libinput +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 441 +Depends: libc6 (>= 2.38), libevdev2 (>= 1.10.0), libmtdev1t64 (>= 1.1.0), libudev1 (>= 183), libwacom9 (>= 2.18.0), libinput-bin (>= 1.31.1-1ubuntu1.2) +Filename: pool/libinput10_1.31.1-1ubuntu1.2_amd64.deb +Size: 160660 +MD5sum: 85584b30679e486debd0a230510f7ea0 +SHA1: afb3210b6174335a235a5dc574fc9d1fe294f99b +SHA256: da31dc35e4644394705d111c55562f676000ac30b9f854201a7ca5b7a25eb215 +SHA512: cda88ddf93e0e4db889cfc063e5595ad4f5016621ce9b934c1cfec47afd93a102f9951998101f8d14bb1088e3dffa9e7fe1ca56a9679f3ded4b9798dc80b9ea1 +Homepage: https://www.freedesktop.org/wiki/Software/libinput/ +Description: input device management and event handling library - shared library + libinput is a library that handles input devices for display servers and + other applications that need to directly deal with input devices. + . + It provides device detection, device handling, input device event + processing and abstraction to minimize the amount of custom input + code the user of libinput needs to provide the common set of + functionality that users expect. + . + This package includes the shared library. + +Package: libinsights0 +Architecture: amd64 +Version: 0.9.3ubuntu +Built-Using: golang-1.25 (= 1.25.0-0ubuntu2) +Multi-Arch: same +Priority: optional +Section: libs +Source: ubuntu-insights +Maintainer: Ubuntu Developers +Installed-Size: 7617 +Depends: libc6 (>= 2.34), libwayland-client0 (>= 1.20.0) +Filename: pool/libinsights0_0.9.3ubuntu_amd64.deb +Size: 2624148 +MD5sum: b557049288c6ff683c6b98ac13e12662 +SHA1: 3f9be0a1686b578df70e82bb72e95db8a8169b4f +SHA256: 4eac325ea009508e6d51c0a005c254bb910972c8da265313e42e142378542e45 +SHA512: a75fd8f0d5c2a2a88bfc4ca2d7409cff6983d7044fb1f773b367d7c82dd1b87da83e2e3fdd717fe3136fcc2d58b380e1f696a1ababbd45e319fa9ea542f9ec32 +Homepage: https://github.com/ubuntu/ubuntu-insights +Description: Ubuntu metrics reporting service - shared lib + Ubuntu Insights, a user transparent, open, + platform-agnostic and cross application solution for reporting + hardware information and other collected metrics. + . + Ubuntu Insights is designed to show you exactly what is being sent, and + allow you to acknowledge and control your own data. The information + can't be used to identify a single machine, and is cached for local viewing + before being sent to the server. + . + This package contains shared libraries for applications using + the insights collection, consent management, and upload functionality. + +Package: libio-html-perl +Architecture: all +Version: 1.004-3 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 40 +Depends: perl:any +Filename: pool/libio-html-perl_1.004-3_all.deb +Size: 15870 +MD5sum: deddb2debe01fc4ce15f001004f55268 +SHA1: 46d14e6885eb9ab481c3501fcabbd884c65ebc23 +SHA256: 999f8b54d84ac26dda0340ac4ab3263d190688dd92f312e62f3d499807687ed9 +SHA512: 8deecb67b3b34dfb1ce046f4aa628cd7189f3a2530dd640ada67456c18d3207edb9e8f493a9afebc0b960d2f5cda379f2d21c5f4a38dca8d694be7f10b845a23 +Homepage: https://metacpan.org/release/IO-HTML +Description: open an HTML file with automatic charset detection + IO::HTML provides an easy way to open a file containing HTML while + automatically determining its encoding. It uses the HTML5 encoding + sniffing algorithm specified in section 8.2.2.1 of the draft standard. + +Package: libio-pty-perl +Architecture: amd64 +Version: 1:1.20-1build3 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 104 +Provides: libio-tty-perl +Depends: perl (>= 5.40.0-6), perlapi-5.40.0, libc6 (>= 2.38) +Filename: pool/libio-pty-perl_1%3a1.20-1build3_amd64.deb +Size: 31368 +MD5sum: 6533d5257448f528d822ebd23692e3aa +SHA1: 1c3d6a2467ef1afbc6f777d2680115d5e4afd8c6 +SHA256: 6f88732539ef0ac6019f9cfb5bdd374416e25a4894b296733a2451063ad5e496 +SHA512: d082b70fe6671218941ebb32af3a097a6f676a380c90d14efce986f86417a27a6d2ae71c8f1a784500810122197af1319a0f085ea3cfcd72979c740470c1b314 +Homepage: https://metacpan.org/release/IO-Tty +Description: Perl module for pseudo tty IO + IO::Pty provides an interface to allow the creation of a pseudo tty. + . + IO::Pty inherits from IO::Handle and so provide all the methods + defined by the IO::Handle package. + . + Please note that pty creation is very system-dependent. If you have + problems, see IO::Tty for help. + +Package: libio-socket-ssl-perl +Architecture: all +Version: 2.098-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 668 +Depends: perl:any, libnet-ssleay-perl, netbase +Recommends: libio-socket-ip-perl | libio-socket-inet6-perl, libsocket-perl | libsocket6-perl, liburi-perl | libnet-libidn-perl | libnet-idn-encode-perl +Suggests: ca-certificates +Filename: pool/libio-socket-ssl-perl_2.098-1_all.deb +Size: 204670 +MD5sum: cc544767e88ff1febeaedbbee0f8bf5d +SHA1: 44d0213569deb22490ae6596f46edd4127e19703 +SHA256: 1a4dcfe2ab054c03d68ec45f51c715c4b1c6f00b516bfb0e9d10c2a2c81a4db3 +SHA512: 80a4093b40fc89c8328a6331a5ea1489fd3920237632757148c442b51f5be4ad237f12efab305a997bb2df2dc59e9e7e5e77941b511e184b2cc4d6a6abba0593 +Homepage: https://metacpan.org/release/IO-Socket-SSL +Description: Perl module implementing object oriented interface to SSL sockets + This module is a true drop-in replacement for IO::Socket::INET that + uses SSL to encrypt data before it is transferred to a remote server + or client. IO::Socket::SSL supports all the extra features that one + needs to write a full-featured SSL client or server application: + multiple SSL contexts, cipher selection, certificate verification, and + SSL version selection. As an extra bonus, it works perfectly with + mod_perl. + . + IO::Socket::SSL uses IPv6 if libio-socket-ip-perl (>= 0.20) or + libio-socket-inet6-perl is installed. + +Package: libio-stringy-perl +Architecture: all +Version: 2.113-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 120 +Depends: perl:any +Filename: pool/libio-stringy-perl_2.113-2_all.deb +Size: 45298 +MD5sum: 17379b694dd78267754a4704dcba932f +SHA1: 39104fc21e0e7d7534111af91ae2182995f27ce7 +SHA256: 8b0afc8b50d5db3d7606e6ce89deb5b1a68676707709f1771e19bbc7405b0d14 +SHA512: 08f09128d2e0939ce8d7ba538ea3761b5d7922d429a662af01e5424d6726b1752b88175db396d5fbf006ef0bd92233789651832209de234a581522778166af4a +Homepage: https://metacpan.org/release/IO-Stringy +Description: modules for I/O on in-core objects (strings/arrays) + IO::Stringy primarily provides modules for performing both traditional and + object-oriented I/O on things *other* than normal filehandles; in particular, + IO::Scalar, IO::ScalarArray, and IO::Lines. + . + The libio-stringy-perl package provides the following modules: + . + * IO::AtomicFile - write a file which is updated atomically + * IO::InnerFile - define a file inside another file + * IO::Lines - IO:: interface for reading/writing an array of lines + * IO::Scalar - IO:: interface for reading/writing a scalar + * IO::ScalarArray - IO:: interface for reading/writing an array of scalars + * IO::Stringy - I/O on in-core objects like strings and arrays + * IO::Wrap - wrap raw filehandles in IO::Handle interface + * IO::WrapTie - wrap tieable objects in IO::Handle interface + +Package: libip4tc2 +Architecture: amd64 +Version: 1.8.11-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: iptables +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 68 +Depends: libc6 (>= 2.4) +Filename: pool/libip4tc2_1.8.11-2ubuntu3_amd64.deb +Size: 24182 +MD5sum: dfbe10db10a2751cfef208c84b5a6d62 +SHA1: 53d1a9390cadbe6a2ad2e45c4eb799fcc4f08266 +SHA256: be25148d60125f6866dfa7940f3f1371fff4b0e8a1a9500780ad50cb8aaa0895 +SHA512: daf405e7747852d42416eb8f194b1593b7f852511b60b86e1eb80030730d0e9ce172900ad6c20fd606ffee911238207b8563de1c04b4b499e54304dfe60eb921 +Homepage: https://www.netfilter.org/ +Description: netfilter libip4tc library + The iptables/xtables framework has been replaced by nftables. You should + consider migrating now. + . + This package contains the user-space iptables (IPv4) C library from the + Netfilter xtables framework. + . + iptables IPv4 ruleset ADT and kernel interface. + . + This library has been considered private for years (and still is), in the + sense of changing symbols and backward compatibility not guaranteed. + +Package: libip6tc2 +Architecture: amd64 +Version: 1.8.11-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: iptables +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 68 +Depends: libc6 (>= 2.4) +Filename: pool/libip6tc2_1.8.11-2ubuntu3_amd64.deb +Size: 24446 +MD5sum: 6a3ce7abc5bae86f4797f3cd75627dbf +SHA1: abfd01e1ec23558d7b6c0d96a560b04c2f49189b +SHA256: 3d9fdb3171f1167ab3f5182de11db63bcd27aae71838618f3d46806b3134428e +SHA512: 9a8b22707cbf23ec2a39914e8e5b92830ef7ba644822e11d401e7ede6fe4ba570b92413990cb45f1601d9488f6ee73ceed5a81c36c212d0722640a1e21833d7a +Homepage: https://www.netfilter.org/ +Description: netfilter libip6tc library + The iptables/xtables framework has been replaced by nftables. You should + consider migrating now. + . + This package contains the user-space iptables (IPv6) C library from the + Netfilter xtables framework. + . + iptables IPv6 ruleset ADT and kernel interface. + . + This library has been considered private for years (and still is), in the + sense of changing symbols and backward compatibility not guaranteed. + +Package: libipa-hbac0t64 +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: libs +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 48 +Provides: libipa-hbac0 (= 2.12.0-1ubuntu5.4) +Depends: libc6 (>= 2.4), libunistring5 (>= 1.1) +Breaks: libipa-hbac0 (<< 2.12.0-1ubuntu5.4) +Replaces: libipa-hbac0 +Filename: pool/libipa-hbac0t64_2.12.0-1ubuntu5.4_amd64.deb +Size: 15724 +MD5sum: 85b879f366f12c23ddbfc2a783e54276 +SHA1: 1210b8a28e653e9c10059039ca859b09b85e0e85 +SHA256: bf0a1f18069ac0601c2569d7e061cef5e93b3c33a1917830b72a33b948a17b2f +SHA512: 8073595a7ef27edc98a44917bed84cfe51b04ade15c02c3b37bbda9fab4841f021c10842258c70c5af2caeeeae589ccc27d623c8f9771cc3641b5bf484a5fe83 +Homepage: https://github.com/SSSD/sssd +Description: FreeIPA HBAC Evaluator library + Utility library to validate FreeIPA HBAC rules for authorization requests. + +Package: libipc-run-perl +Architecture: all +Version: 20250809.0-1build1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 262 +Depends: perl:any, libio-pty-perl +Filename: pool/libipc-run-perl_20250809.0-1build1_all.deb +Size: 94512 +MD5sum: 71fcc681851ad971f8c7fab740333335 +SHA1: 3326a760f0ef99024aa3ad6626e6591353e6aa9b +SHA256: fca30465aeb724e2627bdc1da21616e6eeafbab7e80952202796882bb8b8a58c +SHA512: b44da788449c4625f3b0db7ee995ef2880a91996cce3a69c0737b0a174757059fb4efdcfcba72b7ae6760333de3950081ba284c5164f43fcb20b5bb1f7f65ee4 +Homepage: https://metacpan.org/release/IPC-Run +Description: Perl module for running processes + IPC::Run allows you to run and interact with child processes using + files, pipes, and pseudo-ttys. Both system()-style and scripted + usages are supported and may be mixed. Likewise, functional and OO + API styles are both supported and may be mixed. + . + Various redirection operators reminiscent of those seen on common + Unix and DOS command lines are provided. + +Package: libipc-system-simple-perl +Architecture: all +Version: 1.30-2 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 59 +Depends: perl:any +Filename: pool/libipc-system-simple-perl_1.30-2_all.deb +Size: 22310 +MD5sum: d8bef5e2f61d5e77c36d589d491fdaac +SHA1: bf33e28de8b366120a3e2f7b9aaf96966107d3df +SHA256: acb7603a5d3231bbe55054b7754c38b25e6acca1a0ac03f65a09e11ba4335fa2 +SHA512: 5d1e864268c75e3da72cf856aa4786f58cd9ac526ceb6fe9ecad148c34a45b2186dc13ac6fa58f9c4f45a7abea1d2e6430ecee15b40aaeec10500ae0825c0d95 +Homepage: https://metacpan.org/release/IPC-System-Simple +Description: Perl module to run commands simply, with detailed diagnostics + IPC::System::Simple takes the hard work out of calling external commands; it + provides replacements for system() and the backtick operator that will either + succeed, or die with rich diagnostic messages on errors. + . + The module also includes the ability to specify acceptable exit values, trap + errors, or process diagnostics. + +Package: libipt2 +Architecture: amd64 +Version: 2.1.2-3 +Priority: optional +Section: libs +Source: intel-processor-trace +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GDB Team +Installed-Size: 139 +Depends: libc6 (>= 2.34) +Filename: pool/libipt2_2.1.2-3_amd64.deb +Size: 49182 +MD5sum: cf3e99c491e8c861656be930274861db +SHA1: bbdf3bc64dc5d2b6b3272a11e3adc04cf947ae8d +SHA256: 0113f73b628f0fdeb00bb0099268088e5bbbbd231d03d65d2dac60edb3cb57ea +SHA512: 4687e3f61bceec5345f9ff0efbc5a93253cd725a2c4f06cd0f32bee0341380dcc9f4cbf43c76ec603258f1dc2a40ab859c3069c9149e16ffe1d1bd6be195a125 +Homepage: https://github.com/intel/libipt +Description: Intel Processor Trace Decoder Library + Intel's reference implementation for decoding Intel PT. + . + Go to https://software.intel.com/en-us/intel-platform-analysis-library + for sample code that uses the library. + +Package: libisl23 +Architecture: amd64 +Version: 0.27-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: isl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 2060 +Depends: libc6 (>= 2.38), libgmp10 (>= 2:6.3.0+dfsg) +Breaks: libisl-dbg (<< 0.19) +Replaces: libisl-dbg (<< 0.19) +Filename: pool/libisl23_0.27-1build1_amd64.deb +Size: 690670 +MD5sum: f33ec2b98171f71dff787a647cb84bd0 +SHA1: a375286ae0a45e9329febea0d1f04b5c19bb7b21 +SHA256: 02ea5de2ab6ddba978606ad58647bf6371ea68c0ed63aa5d6d0d3b8c1fe77ea3 +SHA512: e56401ff382dc6cdccb46f4f94f5dfb3d0529925b870b5a42ba4c25475b45cc1e1662bb917c624ead5ba6292d14f1511f5f081ab5526c5405ddec6696be300cc +Homepage: https://openhub.net/p/isl +Description: manipulating sets and relations of integer points bounded by linear constraints + isl is a library for manipulating sets and relations of integer points + bounded by linear constraints. Supported operations on sets include + intersection, union, set difference, emptiness check, convex hull, + (integer) affine hull, integer projection, and computing the lexicographic + minimum using parametric integer programming. It also includes an ILP solver + based on generalized basis reduction. + . + This package contains the runtime library. + +Package: libjansson4 +Architecture: amd64 +Version: 2.14-2build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: jansson +Maintainer: Ubuntu Developers +Original-Maintainer: Alessandro Ghedini +Installed-Size: 95 +Depends: libc6 (>= 2.38) +Filename: pool/libjansson4_2.14-2build4_amd64.deb +Size: 33250 +MD5sum: 3b3f1d2472158313253e91a0b22e723b +SHA1: 27f1414524c58d84fdbedd0678f02610df2cbfc4 +SHA256: 1dc986ac3cf112384919d1a339a952e8a86bede9890a4489c016fdc266a036ca +SHA512: eb9811b71ef8025f78cb7932813651bb06f91c3a263ba6bc634ea11a29fe05314360943310071b12731993763c6f51b9fdc06d45c29e6b03ca8be04c13a28110 +Homepage: http://www.digip.org/jansson/ +Description: C library for encoding, decoding and manipulating JSON data + Jansson is a C library for encoding, decoding and manipulating JSON data. + . + It features: + * Simple and intuitive API and data model + * Comprehensive documentation + * No dependencies on other libraries + * Full Unicode support (UTF-8) + * Extensive test suite + +Package: libjavascriptcoregtk-4.1-0 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 31634 +Depends: libatomic1 (>= 4.8), libc6 (>= 2.43), libgcc-s1 (>= 3.0), libglib2.0-0t64 (>= 2.66.0), libicu78 (>= 78.1-1~), libstdc++6 (>= 12), libsystemd0, zlib1g (>= 1:1.1.4) +Filename: pool/libjavascriptcoregtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 8088236 +MD5sum: ad717049dd2579fe209c45a9019f7f3f +SHA1: 601324b8dec816091972a387954ade072231f2d0 +SHA256: d77a6bad6f53b76a78bcb6ecbd9d56c1855f63af3a23c412f6590ffc1d807836 +SHA512: 9bcc54fb19b84f5440197085001e6aa53eb8c7cd53000ce6b0e7d98198e4d0bd1b134a25dc89f28b88b0a403641e29282878e4fb9fea4b664b3b261e6ccd58ec +Homepage: https://webkitgtk.org/ +Description: JavaScript engine library from WebKitGTK + JavaScriptCore is the JavaScript engine used in WebKit. It consists + of the following building blocks: lexer, parser, start-up interpreter + (LLInt), baseline JIT, a low-latency optimizing JIT (DFG), and a + high-throughput optimizing JIT (FTL). + . + This build comes from the GTK port of WebKit (API version 4.1). + . + This package contains the shared libraries. + +Package: libjavascriptcoregtk-6.0-1 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 31634 +Depends: libatomic1 (>= 4.8), libc6 (>= 2.43), libgcc-s1 (>= 3.0), libglib2.0-0t64 (>= 2.66.0), libicu78 (>= 78.1-1~), libstdc++6 (>= 12), libsystemd0, zlib1g (>= 1:1.1.4) +Filename: pool/libjavascriptcoregtk-6.0-1_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 8088994 +MD5sum: dffed3a44b258a8370c7d522f8fb1db2 +SHA1: 632681e16d8116654d7b90d7cee8096daec8e226 +SHA256: a278b88a4b0633ad4c40e0de09a5990815798db7aae80defdba095e9eb3dc032 +SHA512: 745ca4618453e4505ce08495227e2a62800f384e082f56745fc27571594e9c16183b8d160d9d5b6f5f43d48232bff61c441fa648c8f58c2156501e9205e7bb6c +Homepage: https://webkitgtk.org/ +Description: JavaScript engine library from WebKitGTK + JavaScriptCore is the JavaScript engine used in WebKit. It consists + of the following building blocks: lexer, parser, start-up interpreter + (LLInt), baseline JIT, a low-latency optimizing JIT (DFG), and a + high-throughput optimizing JIT (FTL). + . + This build comes from the GTK port of WebKit (API version 6.0). + . + This package contains the shared libraries. + +Package: libjbig0 +Architecture: amd64 +Version: 2.1-6.1ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: jbigkit +Maintainer: Ubuntu Developers +Original-Maintainer: Michael van der Kolff +Installed-Size: 85 +Depends: libc6 (>= 2.4) +Filename: pool/libjbig0_2.1-6.1ubuntu3_amd64.deb +Size: 30028 +MD5sum: 6996f630c9734dbfff7decfc6a494e29 +SHA1: 04871ece173426a001aacffc3d238f27501bf644 +SHA256: bb2ffa4e359ee7a29dab9902b45e5c85de06f019272700cb2538e4762f141ee8 +SHA512: 31c7a7696bb1ce9bb328c2613a0bc6495b27f66876858801e2ee7db11a2694ddce01e07402d31ed43c2a57554291647e945717d10dd752d26bb0a01048bdf9b4 +Homepage: http://www.cl.cam.ac.uk/~mgk25/jbigkit/ +Description: JBIGkit libraries + JBIG-KIT provides a portable library of compression and decompression functions + with a documented interface that you can include very easily into your image or + document processing software. + . + This package contains the dynamically linked library. + +Package: libjbig2dec0 +Architecture: amd64 +Version: 0.20-1ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: jbig2dec +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 172 +Depends: libc6 (>= 2.38) +Filename: pool/libjbig2dec0_0.20-1ubuntu0.26.04.1_amd64.deb +Size: 63576 +MD5sum: d9e855cc6fb1892fc13cedd8647ebf8a +SHA1: 434741dc83dad6aebda6fe37c530d3e4805f6895 +SHA256: 5c95617786982adc08f0991900400802b4e7037dda3e2f3a6bc9d0a6c6f04841 +SHA512: b29bed63296d4bfee53a3d2cdcf064a74fe7dc494ce9a93c38d9f47470cc019dc9ed8557e9d513180df575bc0c5dfec7422fc7ba78fca38f22af5a66d074eb12 +Homepage: https://jbig2dec.com/ +Description: JBIG2 decoder library - shared libraries + jbig2dec is a decoder library and example utility implementing the JBIG2 + bi-level image compression spec. Also known as ITU T.88 and ISO IEC + 14492, and included by reference in Adobe's PDF version 1.4 and later. + . + This package contains the shared library libjbig2dec. + +Package: libjcat1 +Architecture: amd64 +Version: 0.2.5-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libjcat +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI team +Installed-Size: 119 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libgnutls30t64 (>= 3.8.4), libgpg-error0 (>= 1.14), libgpgme45 (>= 1.2.0), libjson-glib-1.0-0 (>= 1.5.2) +Filename: pool/libjcat1_0.2.5-1build1_amd64.deb +Size: 35416 +MD5sum: ebc870ddedf4e6d279a7096ba3271469 +SHA1: acacd972242f7337fdfca00933d93694195c5e2e +SHA256: b244182d1ac9ed41b2fcbbc664489b4a4f7b60dbef99e3cfa25694b38380641f +SHA512: 8b86fa7c70c1e6ae5e56216e3cefce39e5ddc04512c2e867d7a250a80f0e55dce723438608a8c4952641144de9651c37039f6703ad85e569db79466bf8825c7b +Homepage: https://github.com/hughsie/libjcat +Description: JSON catalog library + The libjcat library assembles checksum and metadata into a JSON based catalog. + . + This is used by other software to validate metadata. + +Package: libjemalloc2 +Architecture: amd64 +Version: 5.3.0-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: jemalloc +Maintainer: Ubuntu Developers +Original-Maintainer: Faidon Liambotis +Installed-Size: 859 +Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.3), libstdc++6 (>= 4.4) +Filename: pool/libjemalloc2_5.3.0-4_amd64.deb +Size: 263476 +MD5sum: 922555bb84ef3c003a6da6ef1984ce79 +SHA1: 256c4c606464effea5fa9eaaa7ae470d23e3ba8b +SHA256: df00a1d37c735bfb1830418efb721c2c0b79cd0a735c3d35e4015eb6a4d2683d +SHA512: 478b994e9d1205c94bef9662718abd01b5db38a24d1da297a3733fcb7953d212ba3b7789a25f1408407e7c72c8eeb4f37e9b9362c3ab9d9d92c611d10f5ca18e +Homepage: https://jemalloc.net/ +Description: general-purpose scalable concurrent malloc(3) implementation + A library providing a malloc(3) implementation for multi-threaded processes on + multi-processor systems. + . + Notable features are reduced lock contention, predictable low fragmentation, + and introspection with heap profiling. + +Package: libjpeg-turbo8 +Architecture: amd64 +Version: 2.1.5-4ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libjpeg-turbo +Maintainer: Ubuntu Developers +Original-Maintainer: Ondřej Surý +Installed-Size: 664 +Depends: libc6 (>= 2.38) +Filename: pool/libjpeg-turbo8_2.1.5-4ubuntu4_amd64.deb +Size: 152810 +MD5sum: d66ce9362f0504e0080b2eb1dd754344 +SHA1: 31f93ecb8f5269a0f9b6ca2f49c8f4bfc2982a84 +SHA256: 07672ce1f4d187e005ea0cc35d03e515ba056f3d3e7a9a25d3ef386e184da8c5 +SHA512: 5b64bda6c1f6f7e06aaeb5d6c9f95185fe6847cd142e94434f9c5a1db523d55f4b2277025d4d28c0df071c39c249a74804cb83098aa57a1b071db4b3aea19aa5 +Homepage: https://www.libjpeg-turbo.org/ +Description: libjpeg-turbo JPEG runtime library + The libjpeg-turbo JPEG library is a library for handling JPEG files. + . + libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, + SSE2, NEON) to accelerate baseline JPEG compression and decompression + on x86, x86-64, and ARM systems. The libjpeg-turbo JPEG library is + an API/ABI compatible with the IJG JPEG library. + . + This package contains the shared runtime library. + +Package: libjpeg8 +Architecture: amd64 +Version: 8c-2ubuntu12 +Multi-Arch: same +Priority: optional +Section: libs +Source: libjpeg8-empty +Maintainer: Ubuntu Developers +Installed-Size: 9 +Depends: libjpeg-turbo8 (>= 1.1.90+svn722-1ubuntu6) +Filename: pool/libjpeg8_8c-2ubuntu12_amd64.deb +Size: 2142 +MD5sum: 258add1b2dd69f99dc952382a73aa059 +SHA1: ac3bc1750db39d63c90d4770322b4b039d411bdf +SHA256: 1403d44d2c2d3eba6a7a8aea97fab0bac2e89e144a3bf600adfdd3ecdc3d9394 +SHA512: 6bd7ae4230cc25be089d335a5584366fd4e9eb9243b0c4ab8a3e614ca5f2db829271676b21cc36a6dec3b686487e1d124a7a5bfd6b15efebcdb369f933454bb7 +Description: Independent JPEG Group's JPEG runtime library (dependency package) + libjpeg8 dependency package, depending on libjpeg-turbo8. + +Package: libjq1 +Architecture: amd64 +Version: 1.8.1-4ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: jq +Maintainer: Ubuntu Developers +Original-Maintainer: ChangZhuo Chen (陳昌倬) +Installed-Size: 377 +Depends: libc6 (>= 2.43), libonig5 (>= 6.8.1) +Filename: pool/libjq1_1.8.1-4ubuntu2_amd64.deb +Size: 146208 +MD5sum: 9919b400c67731b622d996f942006075 +SHA1: 0df22bb56a1d0cea65930c5d602b18e0fd903c17 +SHA256: 3ced45ef4154cce59ce9fc74cc606b7361fa1b2f088b31a903d54fbcee75cb43 +SHA512: 3032c127ebbee1fd0efb288033c28a10041132176bcb97fa76bfea664be0482f1f96c29ae3924d381f483810e2c3b6145ecc58cc66950146deb2b87557c8ea9d +Homepage: https://jqlang.github.io/jq +Description: lightweight and flexible command-line JSON processor - shared library + jq is like sed for JSON data – you can use it to slice + and filter and map and transform structured data with + the same ease that sed, awk, grep and friends let you + play with text. + . + It is written in portable C, and it has minimal runtime + dependencies. + . + jq can mangle the data format that you have into the + one that you want with very little effort, and the + program to do so is often shorter and simpler than + you’d expect. + . + This package contains the shared library. + +Package: libjs-sphinxdoc +Architecture: all +Version: 8.2.3-12 +Multi-Arch: foreign +Priority: optional +Section: javascript +Source: sphinx +Maintainer: Debian Python Team +Installed-Size: 83 +Filename: pool/libjs-sphinxdoc_8.2.3-12_all.deb +Size: 28370 +MD5sum: 0aefa226db5f2e2bd05fdf9148297558 +SHA1: 21e086a822b18b264ce02b3ffc7020232f8d95da +SHA256: 13a0c814f4b0000ac420f7d10b4ded7574bf2fe1becb781b4471e742a6c04d1c +SHA512: 0e04369426960856d06e014b782cd9b675d00a4a3f2724280930e11552b3620f9f3c2b49300a6b7d662953790523543be652c10144a9362008e2932134f1c50f +Homepage: https://www.sphinx-doc.org/ +Description: JavaScript support for Sphinx documentation + Sphinx is a tool for producing documentation for Python projects, using + reStructuredText as markup language. + . + This package provides JavaScript code for documentation generated by Sphinx. + +Package: libjson-c5 +Architecture: amd64 +Version: 0.18+ds-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: json-c +Maintainer: Ubuntu Developers +Original-Maintainer: Nicolas Mora +Installed-Size: 103 +Depends: libc6 (>= 2.38) +Filename: pool/libjson-c5_0.18+ds-3_amd64.deb +Size: 35930 +MD5sum: 6b83d8b34ae2eea1ff336beb76b33dcd +SHA1: ded23697235dbf7ea301cf49eb25e69130124f7a +SHA256: a19fa7f6504920f13e5fd291cf3c626d7201a48a0d80fde7cdac34f95306d352 +SHA512: 622b87e84575222fe56a9ce069e031c6d96f4ba272d5222000d935721a6baeb1b1d5ca57329e67c43ed9686e1f49576212646dc2c774b5eebcb7f71bef5f5f52 +Homepage: https://github.com/json-c/json-c/wiki +Description: JSON manipulation library - shared library + This library allows you to easily construct JSON objects in C, + output them as JSON formatted strings and parse JSON formatted + strings back into the C representation of JSON objects. + +Package: libjson-glib-1.0-0 +Architecture: amd64 +Version: 1.10.8+ds-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: json-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 211 +Depends: libjson-glib-1.0-common (>= 1.10.8+ds-2), libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libjson-glib-1.0-0_1.10.8+ds-2_amd64.deb +Size: 69816 +MD5sum: 79fb3fa68faeadf3ab88f961c6800235 +SHA1: 326796a2b37cbe9d31cfdfa12e2ebe0d282d154b +SHA256: 7b2a877a55554709e550ab2112eb3f8429c653d2340ef718d5ddeaf8b191ecd5 +SHA512: 3a55e855c78c65be12573d4ac18ef0449115fcd10f18123742d3ff7395dcf0dd9228876b59608b7b16d825c866301bd46e512d1e1b1c6d92514b54a3950393c5 +Homepage: https://wiki.gnome.org/Projects/JsonGlib +Description: GLib JSON manipulation library + JSON-GLib is a library for parsing, generating and manipulating JavaScript + Object Notation (JSON) data streams using the GLib type system. It allows + manipulating JSON data types with a Document Object Model API. It also + allows serializing and deserializing simple or complex GObjects to and + from JSON data types. + +Package: libjson-glib-1.0-common +Architecture: all +Version: 1.10.8+ds-2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: json-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Filename: pool/libjson-glib-1.0-common_1.10.8+ds-2_all.deb +Size: 6142 +MD5sum: 23b5d30798cfcd40a57b8ecdc778b24a +SHA1: fb603a53d7437f83f31819a5ec87b897e2b380b6 +SHA256: 4f04c6e07d49abf34a0192dec6c9ca9e1ce664eaf6517cb725a8f9ca33ab4d62 +SHA512: 41fb16c82994b9dca961c432fed83b95d5b49a9020b4404949065dea22a639e93d1a6b9a1661d5319bbec75298136acf8d1c5f236572b4b6925a45e13cbc0237 +Homepage: https://wiki.gnome.org/Projects/JsonGlib +Description: GLib JSON manipulation library (common files) + JSON-GLib is a library for parsing, generating and manipulating JavaScript + Object Notation (JSON) data streams using the GLib type system. It allows + manipulating JSON data types with a Document Object Model API. It also + allows serializing and deserializing simple or complex GObjects to and + from JSON data types. + . + This package contains the translations files. + +Package: libjxl-gdk-pixbuf +Architecture: amd64 +Version: 0.11.1-6ubuntu4.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: jpeg-xl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 43 +Depends: libc6 (>= 2.38), libgdk-pixbuf-2.0-0 (>= 2.31.1), libglib2.0-0t64 (>= 2.80.0), libjxl0.11 (>= 0.9.2) +Filename: pool/libjxl-gdk-pixbuf_0.11.1-6ubuntu4.2_amd64.deb +Size: 10054 +MD5sum: 82a099969bb3fe96983a7a1a87da649c +SHA1: 2fa730cf93d4b27cd14931db72bceeedc00974dc +SHA256: 82f12d81d9cade1f6379340b319d64d05318eba5d7fdce8e8975a8f13c25e062 +SHA512: 9cf82a1ce57c0a3509b1246d268373a90798e1eebc8059131c89e8e7e728129d0ffabca06278a8c2c8fc0146cdf1237a73acb9857194d1666b3a64108a86eac9 +Homepage: https://github.com/libjxl/libjxl +Description: JPEG XL Plugin for gdk-pixbuf + This package installs the required files for reading JPEG XL files in + GTK applications. + +Package: libjxl0.11 +Architecture: amd64 +Version: 0.11.1-6ubuntu4.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: jpeg-xl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 4094 +Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.43), libgcc-s1 (>= 3.4), libhwy1t64 (>= 1.0.3), liblcms2-2 (>= 2.13), libstdc++6 (>= 12) +Filename: pool/libjxl0.11_0.11.1-6ubuntu4.2_amd64.deb +Size: 1269230 +MD5sum: 1d66785c570648ce38c715c03e0cd02a +SHA1: 56319d50ac39f77da6d4cc435d6e575e1d8cb6bd +SHA256: ad047c32784c7e3d1119f32c164876ae8f60c545c25354c9d673a958eef183df +SHA512: db00da5d5800935bd14a92970dd642bf1002f71b21cf1158a974e725bcc809cecfa1ed9633365e8ce8393f8d73c14470ff484cb9a2d95af952017c1620a41e32 +Homepage: https://github.com/libjxl/libjxl +Description: JPEG XL Image Coding System - "JXL" (shared libraries) + The JPEG XL Image Coding System (ISO/IEC 18181) is a lossy and + lossless image compression format. It has a rich feature set and is + particularly optimized for responsive web environments, so that + content renders well on a wide range of devices. Moreover, it includes + several features that help transition from the legacy JPEG format. + . + This package installs shared libraries. + +Package: libklibc +Architecture: amd64 +Version: 2.0.14-1ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: klibc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kernel Team +Installed-Size: 103 +Filename: pool/libklibc_2.0.14-1ubuntu2_amd64.deb +Size: 47498 +MD5sum: abf772d7cd4f41ae509baf3babf976ab +SHA1: b85c0ce5a6053d9526fd03069238a87c9eb3d86c +SHA256: a09471ffaac8fbd48194007a4400325a9e0ec69eabbdcc23916011b4060c777e +SHA512: 7cd7ee03665c85ac86610761cecc876177028b7e14e39a33187a6e5397446872fd04ede92ffaacda38bdbd22d012f0f2bde135ae9cd1723c52b075f92dd29f44 +Homepage: https://git.kernel.org/cgit/libs/klibc/klibc.git +Description: minimal libc subset for use with initramfs + klibc is intended to be a minimalistic libc subset for use with + initramfs. It is deliberately written for small size, minimal + entanglement, and portability, not speed. It is definitely a work in + progress, and a lot of things are still missing. + +Package: libkmod2 +Architecture: amd64 +Version: 34.2-2ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: kmod +Maintainer: Ubuntu Developers +Original-Maintainer: Marco d'Itri +Installed-Size: 146 +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.0.0) +Filename: pool/libkmod2_34.2-2ubuntu2_amd64.deb +Size: 50890 +MD5sum: 1c494d05a16423e1a4e09823b28e51ef +SHA1: da8bed5d8a8ea93b2cd894ce3d1d20afcbe938e8 +SHA256: bb55dd5908866cf5b76b642ddfcb494ab35adb43ccba07431116398b373d4845 +SHA512: 6b86c8a5864e8544af8edfd3f2a9f16218966a03de610ed95061b504ac0e8aeaeaf3cce96bc8b9a28cc24ddc83649367b5e0a8c4fd3f2a4014f9612c6d0fa68a +Description: libkmod shared library + This library provides an API for insertion, removal, configuration and + listing of kernel modules. + +Package: liblc3-1 +Architecture: amd64 +Version: 1.1.3+dfsg-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: liblc3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 177 +Depends: libc6 (>= 2.14) +Filename: pool/liblc3-1_1.1.3+dfsg-1build1_amd64.deb +Size: 95326 +MD5sum: 8a45078d41b9418504374db8312272f3 +SHA1: 0a6ff0579465adfa3aff3cd61993319037eea831 +SHA256: 61d9af5cabb5288695dad37d7a887b5d2793b966c738cb43d98d36017ca41054 +SHA512: cfe364818566834588a547b6019b111b0bd4cc0b0f1c5ab11dd9d8804394b81dc2425a2a770ae1d3685fd6511c7550c181922df6744a2f874adac4522c226c26 +Homepage: https://github.com/google/liblc3 +Description: Low Complexity Communication Codec (shared library) + LC3 is an efficient low latency audio codec. + . + This package provides the shared library. + +Package: liblcms2-2 +Architecture: amd64 +Version: 2.17-1ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: lcms2 +Maintainer: Ubuntu Developers +Original-Maintainer: Thomas Weber +Installed-Size: 445 +Depends: libc6 (>= 2.43) +Suggests: liblcms2-utils +Filename: pool/liblcms2-2_2.17-1ubuntu0.2_amd64.deb +Size: 169156 +MD5sum: 7f7a64a6b682f6a40522715a613d38c3 +SHA1: 258126feba7f1a1c4b03e7091c4335955345278c +SHA256: 0fcc048872daa6a242d548b78b76749044800d3be5a883123ca45eb4c8c65e05 +SHA512: 579534e62431f392b80896b135dc13549b5a20e5974498ceeefbc1bd2bd12f61a3b2cc438c9da07d67ee247eb62148fe00270c5cf0105c1673ce5f940bc95f87 +Homepage: http://www.littlecms.com/ +Description: Little CMS 2 color management library + LittleCMS 2 intends to be a small-footprint color management engine, with + special focus on accuracy and performance. It uses the International Color + Consortium standard (ICC) of color management. LittleCMS 2 is a full + implementation of ICC specification 4.2 plus all addendums. It fully supports + all V2 and V4 profiles, including abstract, devicelink and named color + profiles. + . + This package contains the shared library of liblcms2. + +Package: liblcms2-utils +Architecture: amd64 +Version: 2.17-1ubuntu0.2 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: lcms2 +Maintainer: Ubuntu Developers +Original-Maintainer: Thomas Weber +Installed-Size: 180 +Depends: libc6 (>= 2.38), libjpeg8 (>= 8c), liblcms2-2 (>= 2.16), libtiff6 (>= 4.0.3) +Filename: pool/liblcms2-utils_2.17-1ubuntu0.2_amd64.deb +Size: 45544 +MD5sum: 853cd793a4301ce204c0b7d9e53593df +SHA1: af6f14ff3372def188826ce641dedf46ebb6065d +SHA256: a58b8edc53a5f06fa6a57788a0ce57c60fd63f355fd296ba02d4912df3b8236e +SHA512: 2644493a1503afe2c4026c7b21c5bc272d26894870a26875e900ac6ff702a8e91e56a59c3823d39ba9462dfe045a9413823496a99d745ef04a7fb596f6a124ac +Homepage: http://www.littlecms.com/ +Description: Little CMS 2 color management library (utilities) + LittleCMS 2 intends to be a small-footprint color management engine, with + special focus on accuracy and performance. It uses the International Color + Consortium standard (ICC) of color management. LittleCMS 2 is a full + implementation of ICC specification 4.2 plus all addendums. It fully supports + all V2 and V4 profiles, including abstract, devicelink and named color + profiles. + . + This package contains additional utilities (jpegicc, linkicc, psicc, tificc + and transicc). + +Package: libldacbt-abr2 +Architecture: amd64 +Version: 2.0.2.3+git20200429+ed310a0-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libldac +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 30 +Depends: libc6 (>= 2.3.4), libldacbt-enc2 (>= 2.0.2) +Filename: pool/libldacbt-abr2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb +Size: 4876 +MD5sum: e94999c675e4f1e74149ccbbf21cdec6 +SHA1: bc1db929cd44602b31281700c7c1d6cced48dd16 +SHA256: fd8d353f5090cc72729ecbbfcb5d3d5eafa08d894518158106a0df3f1181a828 +SHA512: a416cfa8235104cfc986c4df0916e7bbd333761437cc1388d662b33cd431e4ebc459bb48092e217b5523c3bb22fb06bf0a5b38a688e157f058aabf8452780c2c +Homepage: https://android.googlesource.com/platform/external/libldac +Description: LDAC Bluetooth ABR library (shared library) + LDAC is a lossy audio coding technology enabling the transmission + of high-resolution audio content over a Bluetooth connection. + . + LDAC employs a hybrid coding scheme based on the modified discrete + cosine transform to provide more efficient data compression. + . + LDAC is used by Bluetooth audio devices such as headphones, smart + phones, portable media players, active speakers and home theaters. + . + This package ships the shared LDAC Bluetooth ABR library. + +Package: libldacbt-enc2 +Architecture: amd64 +Version: 2.0.2.3+git20200429+ed310a0-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libldac +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 71 +Depends: libc6 (>= 2.14) +Filename: pool/libldacbt-enc2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb +Size: 28628 +MD5sum: 6aba55f8d74ef540bcce089f13b84c87 +SHA1: 4f102f49a85f60926555014b49b58f80b284b10f +SHA256: 000b286931549a4e2c1bb28a9b06b83fd8aa79c99e7b04503afbe2078aad638b +SHA512: 5c9b4d2361a48b0611b79c096e2deaee0492ed3a61d5f77cfef934bce9fdc69c65df440c2be5260e416632450a0cef19d53a3f0956a9a58ee802da0f535fb273 +Homepage: https://android.googlesource.com/platform/external/libldac +Description: LDAC Bluetooth encoder library (shared library) + LDAC is a lossy audio coding technology enabling the transmission + of high-resolution audio content over a Bluetooth connection. + . + LDAC employs a hybrid coding scheme based on the modified discrete + cosine transform to provide more efficient data compression. + . + LDAC is used by Bluetooth audio devices such as headphones, smart + phones, portable media players, active speakers and home theaters. + . + This package ships the shared LDAC Bluetooth encoder library. + +Package: libldb2 +Architecture: amd64 +Version: 2:2.11.0+samba4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba (2:4.23.6+dfsg-1ubuntu2.2) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 609 +Depends: libc6 (>= 2.38), libldap2 (>= 2.6.2), liblmdb0 (>= 0.9.9), libtalloc2 (>= 2.4.0), libtdb1 (>= 1.3.14), libtevent0t64 (>= 0.15.0) +Breaks: samba-libs (<< 2:4.19.0~) +Filename: pool/libldb2_2%3a2.11.0+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 150184 +MD5sum: 7717024a80da673f97e769343a7be546 +SHA1: b2eee515f45f9d3210971c3149ad999c69318ad7 +SHA256: d9c599cde03ad8f07e75a0318cbb7c381b968ad77ca7f47ccfb397218f218270 +SHA512: 7472f2a6c311805b5372a2364e861ce6232cd0a5c94fa0d06fe5c0ef7c7b94cf1141259b7a38e30e7d6ef36dba2781345042500a6147b88a1ae681a2c3b74d2c +Homepage: https://www.samba.org +Description: LDAP-like embedded database - shared library + ldb is a LDAP-like embedded database built on top of TDB. + . + It provides a fast database with an LDAP-like API designed + to be used within an application. In some ways it can be seen as a + intermediate solution between key-value pair databases and a real LDAP + database. + . + This package contains the shared library file. + +Package: liblerc4 +Architecture: amd64 +Version: 4.0.0+ds-5ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: lerc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GIS Project +Installed-Size: 628 +Depends: libc6 (>= 2.29), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5.2) +Filename: pool/liblerc4_4.0.0+ds-5ubuntu2_amd64.deb +Size: 206718 +MD5sum: 37a9f98a18139a6cf6224e2a926a034a +SHA1: f225ab2252ab4e52cbea49c8ef75079d43a6b918 +SHA256: 29051d37d010a7a0e3b5648f73f30d35eb1e313061137c88f3a2c2078925a36d +SHA512: f68ac8c82b818ca5f62a47319dcb39c7b5d333a0100d37406c6cf283d3509a438d7d46c1320757fe4d3fd06e0e5f37f53e429dbb7b1d11205078c754d9683d99 +Homepage: https://github.com/Esri/lerc +Description: Limited Error Raster Compression library + LERC is an open-source image or raster format which + supports rapid encoding and decoding for any pixel + type (not just RGB or Byte). Users set the maximum + compression error per pixel while encoding, so the + precision of the original input image is preserved + (within user defined error bounds). + +Package: libllvm21 +Architecture: amd64 +Version: 1:21.1.8-6ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: llvm-toolchain-21 +Maintainer: Ubuntu Developers +Original-Maintainer: LLVM Packaging Team +Installed-Size: 135358 +Depends: libc6 (>= 2.38), libedit2 (>= 2.11-20080614-0), libffi8 (>= 3.4), libgcc-s1 (>= 4.3), libstdc++6 (>= 12), libxml2-16 (>= 2.14.1), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.0) +Filename: pool/libllvm21_1%3a21.1.8-6ubuntu1_amd64.deb +Size: 30710558 +MD5sum: 9c64b66bf3ac61d17c88a6fd20c17470 +SHA1: ce3498b8e4c70b38ded07785e128080ec8df3e1e +SHA256: 9e758998dcb4aa27abbe64f2dee7bc490d9eb0721afa334a82a2b1bf6c7648f9 +SHA512: 40586a16a0e965fb4d7533caaf384b06fa2dcb8b9c0f7092fe6f3809c9c70a33d1ceb9dbeb2c569be824f89032d6c7f787d43add23b94e9185e74e5861cfb916 +Homepage: https://www.llvm.org/ +Description: Modular compiler and toolchain technologies, runtime library + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + This package contains the LLVM runtime library. + +Package: liblmdb0 +Architecture: amd64 +Version: 0.9.31-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: lmdb +Maintainer: Ubuntu Developers +Original-Maintainer: LMDB +Installed-Size: 112 +Depends: libc6 (>= 2.38) +Filename: pool/liblmdb0_0.9.31-1build2_amd64.deb +Size: 49516 +MD5sum: 6851cee61a78e3dc96a1ac6d88bda72e +SHA1: 69d0152c5bc81c11706f5207b8301d8a89402673 +SHA256: b702706b751b51516988230cefbe74643a373dcf28878dd77f735048117f88b5 +SHA512: 6cdc369ca67b5962d69d769d384f28fcc2d1ee957c30aab278c7321041b356f9145a7331b1b419dec1ac220a29b030e524115eee5061c72ab95fe2cc068ac066 +Homepage: https://symas.com/mdb/ +Description: Lightning Memory-Mapped Database shared library + This package contains the LMDB shared library. + . + Lighting Memory-Mapped Database (LMDB) is an ultra-fast, ultra-compact + key-value embedded data store developed for the OpenLDAP Project. It uses + memory-mapped files, so it has the read performance of a pure in-memory + database while still offering the persistence of standard disk-based + databases, and is only limited to the size of the virtual address space, (it + is not limited to the size of physical RAM). + +Package: liblocale-gettext-perl +Architecture: amd64 +Version: 1.07-8 +Priority: required +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 53 +Pre-Depends: perl-base (>= 5.40.1-6build1), perlapi-5.40.1 +Depends: libc6 (>= 2.3) +Filename: pool/liblocale-gettext-perl_1.07-8_amd64.deb +Size: 15846 +MD5sum: baad253c94e89bebc543d4dedb03f474 +SHA1: 4749f95fc011d53589ed99c0019436c9802557c0 +SHA256: 67dba813307624944c9c2443a8e6f3efdd330bcad006de6413fa8c4cac5d40ca +SHA512: b32a600274b07f9d494df3de5dfd88113a73f08b1a225fafd7957062d3b98b921863bf387417ef553983b4e39b4cedcc74c55bd18fc288ddd21802f6621f03a0 +Homepage: https://metacpan.org/release/Locale-gettext +Description: module using libc functions for internationalization in Perl + The Locale::gettext module permits access from perl to the gettext() family of + functions for retrieving message strings from databases constructed + to internationalize software. + . + It provides gettext(), dgettext(), dcgettext(), textdomain(), + bindtextdomain(), bind_textdomain_codeset(), ngettext(), dcngettext() + and dngettext(). + +Package: liblouis-data +Architecture: all +Version: 3.36.0-1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: liblouis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 13359 +Filename: pool/liblouis-data_3.36.0-1_all.deb +Size: 2426288 +MD5sum: b4596524715708d3264722b266b12f92 +SHA1: 2e60e88cd4b9b42ad9ca5428410426b8a5235d25 +SHA256: f3bb432706c8e32a11028da4a797d2bbacb1166027effd01d9c8d7ed4978b5d5 +SHA512: d2b7cae83a528be89a489acfb7ecc2808cb2ad64d1db2ee9a1d0538ba66b9156997f27836df351602574935f3fb07ad3168e993dfac3b31ff46362a279f6e2f2 +Homepage: http://liblouis.org/ +Description: Braille translation library - data + Liblouis is a braille translator and back-translator. It features support for + computer and literary braille, supports contracted and uncontracted translation + for many languages and has support for hyphenation. Liblouis also supports + math braille (Nemeth and Marburg). New languages can easily be added through + tables that support a rule- or dictionary based approach. Included are also + tools for testing and debugging tables. + . + This package contains runtime data. + +Package: liblouis20 +Architecture: amd64 +Version: 3.36.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: liblouis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 210 +Depends: libc6 (>= 2.33), liblouis-data (>= 3.36.0~) +Filename: pool/liblouis20_3.36.0-1_amd64.deb +Size: 95952 +MD5sum: eec37dd1a42058bce96b4585c2e6f25f +SHA1: b49edd95f0e2d377f59528968de163cb581ad170 +SHA256: 0a354158b63d132d77af58e051a17451229b261002b9e0c5aa0343ad9ce040f6 +SHA512: 418aa6e5e19fedcd0270d4582c435f414855645907a191c0b9804eb75fd1727af3e243cee93a810b658f392ee9e13d290c9036fa1a7cb7758b858c533ff797d3 +Homepage: http://liblouis.org/ +Description: Braille translation library - shared libs + Liblouis is a braille translator and back-translator. It features support for + computer and literary braille, supports contracted and uncontracted translation + for many languages and has support for hyphenation. Liblouis also supports + math braille (Nemeth and Marburg). + . + This package contains shared libraries. + +Package: liblouisutdml-bin +Architecture: amd64 +Version: 2.12.0-8build1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: liblouisutdml +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 44 +Depends: libc6 (>= 2.34), liblouis20 (>= 3.36.0), liblouisutdml9t64 (>= 2.12.0) +Suggests: antiword, ooo2dbk, poppler-utils, rtf2xml +Filename: pool/liblouisutdml-bin_2.12.0-8build1_amd64.deb +Size: 9668 +MD5sum: c206d8e07603891d076810f724117872 +SHA1: f48ee0a6ad6b2e6c17a9d84a49653e26799cad9e +SHA256: 3a88b6334ae9e5d80392b7984953c93a007215e667f6228e91d96822a8f70189 +SHA512: 8aef4f38a6e43719dc9716bd1b4119dd35fea29f4f1f0479c3288497636f0f9adb9875ff2f56675adb84666d66b6bd246b760cb5ae5ca99febf2ffe484fd1f8a +Homepage: http://liblouis.org/ +Description: Braille UTDML translation utilities + liblouisutdml is an extension of liblouisxml, the translator from xml + format into transcribed braille, that includes support for Unified + Tactile Document Markup Language (UTDML). + . + This consists essentially of subtrees containing all the braille + translations and formatting, plus some tags. + . + This package contains utdml2brl which translates an utdml or text file into an + embosser-ready braille file. + +Package: liblouisutdml-data +Architecture: all +Version: 2.12.0-8build1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: liblouisutdml +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 249 +Filename: pool/liblouisutdml-data_2.12.0-8build1_all.deb +Size: 50088 +MD5sum: 5d5971225516562074d79ef7315eef0b +SHA1: e0797f335344d3ea8e5e755f3a8002373e94414e +SHA256: a0705c62c2e6f1283ad05654f4f71894a04bf749206cfaea498bdbdb1ca56ecd +SHA512: fbecf529f84656a0c0d4a59cd2e6c13df78d9cfcfefbb3315c4b7226b1137c3e86e6c2ccde4dfdca0ad347adbbfd0458c4762e250e3660f9901f41d2ead71c61 +Homepage: http://liblouis.org/ +Description: Braille UTDML translation library - data + liblouisutdml is an extension of liblouisxml, the translator from xml + format into transcribed braille, that includes support for Unified + Tactile Document Markup Language (UTDML). + . + This consists essentially of subtrees containing all the braille + translations and formatting, plus some tags. + . + This package contains runtime data. + +Package: liblouisutdml9t64 +Architecture: amd64 +Version: 2.12.0-8build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: liblouisutdml +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 221 +Provides: liblouisutdml9 (= 2.12.0-8build1) +Depends: liblouisutdml-data, libc6 (>= 2.38), liblouis20 (>= 3.36.0), libxml2-16 (>= 2.14.1) +Breaks: liblouisutdml9 (<< 2.12.0-8build1) +Replaces: liblouisutdml9 +Filename: pool/liblouisutdml9t64_2.12.0-8build1_amd64.deb +Size: 92286 +MD5sum: 8c74be0e627a51601c3d023925aa4821 +SHA1: d03a336abe850f8de63428e218e07db050c8c4e8 +SHA256: a9138993317e8b3529102544b45f469d2b76b87043861e44f820317ec99f4a20 +SHA512: 4f8469e430c42c080e287774e1bb541dce2ad4d1e6d18d1e7871a6e5d92605c987f8578c0b61731c4c5ad1d01b4491b9bbac8a6116678434428b8fa39e142c68 +Homepage: http://liblouis.org/ +Description: Braille UTDML translation library - shared libs + liblouisutdml is an extension of liblouisxml, the translator from xml + format into transcribed braille, that includes support for Unified + Tactile Document Markup Language (UTDML). + . + This consists essentially of subtrees containing all the braille + translations and formatting, plus some tags. + . + This package contains shared libraries. + +Package: liblsof0 +Architecture: amd64 +Version: 4.99.4+dfsg-2build2 +Priority: optional +Section: libs +Source: lsof +Maintainer: Ubuntu Developers +Original-Maintainer: Andres Salomon +Installed-Size: 209 +Depends: libc6 (>= 2.38), libselinux1 (>= 3.1~) +Filename: pool/liblsof0_4.99.4+dfsg-2build2_amd64.deb +Size: 56480 +MD5sum: 84bf2fff8790b0f5479d4529ef838575 +SHA1: 764c48fd0d31f7b0fcdd067bc66ac3a1f96b8fce +SHA256: 86ba7fb7ceee83651a60616891b5a216c5c62631d4b3d482f63a0fc9cc0f7be7 +SHA512: bdf43122f36372f6636055ae4f368a74b1c3e5e4ee42f14fcc774fb9586b4e367d83703cb95edd3bf6e49205e9788e3aa55082a6e8939c8c430bbdbb1ca110a7 +Homepage: https://github.com/lsof-org/lsof +Description: utility to list open files (shared library) + Lsof is a Unix-specific diagnostic tool. Its name stands + for LiSt Open Files, and it does just that. It lists + information about any files that are open, by processes + currently running on the system. + . + This package contains the shared libraries used by the tool. + +Package: libltdl7 +Architecture: amd64 +Version: 2.5.4-9 +Multi-Arch: same +Priority: optional +Section: libs +Source: libtool +Maintainer: Ubuntu Developers +Original-Maintainer: Alastair McKinstry +Installed-Size: 83 +Depends: libc6 (>= 2.38) +Filename: pool/libltdl7_2.5.4-9_amd64.deb +Size: 43668 +MD5sum: 98ad580b0498684f42c47b96fa0d5fb5 +SHA1: 429ac74a663ba03863d42f87cfa9fc18805885f3 +SHA256: c0279172b218093c674151044326457f6cb3e2ce0b1241380e3897e65677283e +SHA512: 368922faf6f5e32581833abf59a597ce221f1915b2a3683f504625fccb985549102debd0b42a1e77812210ebe6631cb72d1ec4c613834553dbae11427291d282 +Homepage: https://www.gnu.org/software/libtool/ +Description: System independent dlopen wrapper for GNU libtool + This package contains the run-time libltdl library. + . + A small library that aims at hiding the various difficulties of + dlopening libraries from programmers. It is a system independent + dlopen wrapper for GNU libtool. + . + It supports the following dlopen interfaces: + * dlopen (Solaris, Linux and various BSD flavors) + * shl_load (HP-UX) + * LoadLibrary (Win16 and Win32) + * load_add_on (BeOS) + * GNU DLD (emulates dynamic linking for static libraries) + * libtool's dlpreopen + +Package: liblua5.4-0 +Architecture: amd64 +Version: 5.4.8-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: lua5.4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Lua Team +Installed-Size: 570 +Depends: libc6 (>= 2.38), libstdc++6 (>= 4.1.1) +Filename: pool/liblua5.4-0_5.4.8-1build1_amd64.deb +Size: 162684 +MD5sum: ce2a1e4a03a20d417fa9e27f4268d7ba +SHA1: 3f830efd9550487bcf45b7565865d9e291c99f03 +SHA256: ff589ea3f181b89dd76b0240f79c59ac2f13f24e2053f624f774f596c7ef7897 +SHA512: 2023b841f5c64a6bea7f074070e8a4cc75569cdb45e28e8fb9cec7244288809d75a18994e8cf0928f965941b773e776683f89c1b8e3a7ca136e61a7ed1dcd68b +Homepage: http://www.lua.org +Description: Shared library for the Lua interpreter version 5.4 + Lua is a powerful, light-weight programming language designed for extending + applications. The language engine is accessible as a library, having a C + API which allows the application to exchange data with Lua programs and also + to extend Lua with C functions. Lua is also used as a general-purpose, + stand-alone language through the simple command line interpreter provided. + . + This package contains runtime libraries. You shouldn't need to install it + explicitly. + +Package: liblwp-mediatypes-perl +Architecture: all +Version: 6.04-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 72 +Depends: perl:any +Filename: pool/liblwp-mediatypes-perl_6.04-2_all.deb +Size: 20102 +MD5sum: bdc7f2d6f73cb8f14a4e600bd2495ef8 +SHA1: fe3b198c311aa6259967f4d90c861d65f5d6168c +SHA256: a8e1de745f650233753c5e7e9d914d357eaedf2a32d333aa98728c5f6601dfcc +SHA512: b2d22dad7d0895880c51ea16a2edf9564756f413d05fee6f4c126e3189fb5f431773df45cffbb255c8aa71de7e2cbffee514773151cc65cfb9b4c6b3b2c30f3e +Homepage: https://metacpan.org/release/LWP-MediaTypes +Description: module to guess media type for a file or a URL + LWP::MediaTypes provides functions for handling media (also known as MIME) + types and encodings. The mapping from file extensions to media types is + defined by the media.types file. If the ~/.media.types file exists it is used + instead. For backwards compatibility it will also look for ~/.mime.types. + +Package: liblwp-protocol-https-perl +Architecture: all +Version: 6.14-1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 24 +Depends: perl:any, ca-certificates, libio-socket-ssl-perl, libnet-http-perl, libwww-perl +Suggests: libcrypt-ssleay-perl +Filename: pool/liblwp-protocol-https-perl_6.14-1_all.deb +Size: 9040 +MD5sum: 477a799af35ba4877c501bb07c81a60b +SHA1: 45c4e17452e396aecfd34421a78672981a342989 +SHA256: d4e9ae3ad7f0b2603151da0bffd9e2821668d39b1c8f2d31db646d42bbf5b69b +SHA512: 65c47cf422f74679f0e503eb5090ea27482b425f4ae9d354ead77d0a7dda26be2c0d10d2af17bab60553d856091e90981550ad763579db95377e94dc950af871 +Homepage: https://metacpan.org/release/LWP-Protocol-https +Description: HTTPS driver for LWP::UserAgent + The LWP::Protocol::https module provides support for using HTTPS schemed URLs + with LWP. LWP::Protocol::https is a plug-in to the LWP protocol handling, so + you don't use it directly. Once the module is installed LWP is able to access + sites using HTTP over SSL/TLS. + . + If hostname verification is requested by LWP::UserAgent's ssl_opts, and + neither SSL_ca_file nor SSL_ca_path is set, then SSL_ca_file is implied to be + the one provided by ca-certificates. + . + This module used to be bundled with libwww-perl, but it was unbundled in + v6.02 in order to be able to declare its dependencies properly for the CPAN + tool-chain. Applications that need HTTPS support can just declare their + dependency on LWP::Protocol::https and will no longer need to know what + underlying modules to install. + +Package: liblzo2-2 +Architecture: amd64 +Version: 2.10-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: lzo2 +Maintainer: Ubuntu Developers +Original-Maintainer: Stephen Kitt +Installed-Size: 177 +Depends: libc6 (>= 2.14) +Filename: pool/liblzo2-2_2.10-3build2_amd64.deb +Size: 55968 +MD5sum: c71416fcf60a5bb2075535f2097bbab9 +SHA1: de753e1171660f5daf8ef59a74f7da589f666b72 +SHA256: ffc9f1fea544f200b7b47a77e0ec89f70d493b5393ea2f7a43f6b9685b3341b8 +SHA512: c1319bcd58561712e50283c7b8ed834d2e412dc5007bbc574a271740b364fcfaafcb28e4fae709e0918ee3e239b008d30c23103f33663e678eee96ce7552b277 +Homepage: https://www.oberhumer.com/opensource/lzo/ +Description: data compression library + LZO is a portable, lossless data compression library. + It offers pretty fast compression and very fast decompression. + Decompression requires no memory. In addition there are slower + compression levels achieving a quite competitive compression ratio + while still decompressing at this very high speed. + +Package: libmagic-mgc +Architecture: amd64 +Version: 1:5.46-5build2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: file +Maintainer: Ubuntu Developers +Original-Maintainer: Christoph Biedl +Installed-Size: 10135 +Filename: pool/libmagic-mgc_1%3a5.46-5build2_amd64.deb +Size: 336574 +MD5sum: 52f79a50581383d2a8f66d9ab5810994 +SHA1: 65aeddb912f715447f69bb5881f72add9a80cb96 +SHA256: 3264ec3ed617abec65c55f2e165cf78f8c9dd006859faf0d863a8bc6095a67fd +SHA512: 6cef021935fef58f701040d3418dfc20a0a8ffcf96d1b537903d11efe16334851ba599611fd703750997b1fe855f69f859574356ef2f59a39e570190ea275089 +Homepage: https://www.darwinsys.com/file/ +Description: File type determination library using "magic" numbers (compiled magic file) + This package provides the compiled magic file "magic.mgc". It has + been separated from libmagic1t64 in order to meet the multiarch + requirements without breaking applications that expect this file + at its absolute path. + +Package: libmagic1t64 +Architecture: amd64 +Version: 1:5.46-5build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: file +Maintainer: Ubuntu Developers +Original-Maintainer: Christoph Biedl +Installed-Size: 225 +Provides: libmagic1 (= 1:5.46-5build2) +Depends: libbz2-1.0, libc6 (>= 2.38), liblzma5 (>= 5.1.1alpha+20120614), zlib1g (>= 1:1.1.4), libmagic-mgc (= 1:5.46-5build2) +Suggests: file +Breaks: libmagic1 (<< 1:5.46-5build2) +Replaces: libmagic1 +Filename: pool/libmagic1t64_1%3a5.46-5build2_amd64.deb +Size: 90760 +MD5sum: 6c311e38054e5c82374760824a33b249 +SHA1: 78e1507f75a08a5d125eedbbcc3d669c9f506280 +SHA256: 855e4f4a543789a427ad9aef77a31fbf99aebdd33576caa467e67a4301cd2d20 +SHA512: fdb48bbded4ed342d938c66248df810bf21b81a227f4d3435c0291308ab8c97f30f14257bcf46d9b4e8b50d9cc7f566db4ce097c45c9d6d3a1eaa7a1f5facae0 +Homepage: https://www.darwinsys.com/file/ +Description: Recognize the type of data in a file using "magic" numbers - library + This library can be used to classify files according to magic number + tests. It implements the core functionality of the file command. + +Package: libmailtools-perl +Architecture: all +Version: 2.22-1 +Priority: optional +Section: mail +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 217 +Depends: perl:any, libnet-perl, libnet-smtp-ssl-perl, libtest-simple-perl, libtimedate-perl +Filename: pool/libmailtools-perl_2.22-1_all.deb +Size: 77076 +MD5sum: 61afe39bc2fbe691e5a3990f89105171 +SHA1: bd682fe61a9da50327803678330568581b453df5 +SHA256: 33c29b0c7536731fe056649669ad2d2cdaf406411a04e090d5a0fe3fa4055a19 +SHA512: 97371586b13345020f42616f636f90ef770098d8c68f4ccfb4a2553ed61076dd457568e10f6ea569c4957209982cccc0da8cf899f379b0a8ba79fe4ecc59bd3b +Homepage: https://metacpan.org/release/MailTools +Description: modules to manipulate email in perl programs + MailTools is a set of perl modules which provide an easy interface to + manipulating email in an object-oriented fashion. + . + Mail::Address - Parse mail addresses + Mail::Cap - Parse mailcap files + Mail::Field - Base class for manipulation of mail header fields + Mail::Field::AddrList - object representation of e-mail address lists + Mail::Field::Date - a date header field + Mail::Field::Generic - implementation for inspecific fields + Mail::Filter - Filter mail through multiple subroutines + Mail::Header - manipulate MIME headers + Mail::Internet - manipulate email messages + Mail::Mailer - Simple interface to electronic mailing mechanisms + Mail::Send - Simple electronic mail interface + Mail::Util - mail utility functions + +Package: libmalcontent-0-0 +Architecture: amd64 +Version: 0.14.0-0ubuntu1.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: malcontent +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 136 +Depends: libmalcontent-common (>= 0.14.0-0ubuntu1.2), libaccountsservice0 (>= 0.6.30), libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libmalcontent-0-0_0.14.0-0ubuntu1.2_amd64.deb +Size: 40234 +MD5sum: f16a216d32c8b8b09697613c5fd674b6 +SHA1: 2934bd31de6b6bbeb484533522d6bbe415c5d593 +SHA256: 4157ed7ac889c37ee459cd5de52df27854d1db19c8f150019282eeb7b035398f +SHA512: e9810350b5394cce4afbd705b1b95f1df844a5c11a154c5c98195210f2c06b7506860144c150c79d3a7d7429c13dae9d1613640f714741b78b0ed57308758358 +Homepage: https://gitlab.freedesktop.org/pwithnall/malcontent/ +Description: library for parental control of applications + malcontent implements support for restricting the type of content accessible + to non-administrator accounts on a Linux system. Typically, when this is used, + a non-administrator account will be for a child using the system; and the + administrator accounts will be for the parents; and the content being filtered + will be apps which are not suitable for the child to use, due to (for example) + being too violent. + . + This is not a security boundary, and a sufficiently technically advanced user + may always work around these parental controls. malcontent is not a mandatory + access control (MAC) system like AppArmor or SELinux. However, its correct use + by applications should provide enough of an obstacle to prevent users easily or + accidentally having access to content which they shouldn’t. + . + This package contains the libmalcontent library. + +Package: libmalcontent-common +Architecture: all +Version: 0.14.0-0ubuntu1.2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: malcontent +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 62 +Breaks: malcontent (<< 0.14~alpha-0ubuntu1~) +Replaces: malcontent (<< 0.14~alpha-0ubuntu1~) +Filename: pool/libmalcontent-common_0.14.0-0ubuntu1.2_all.deb +Size: 11216 +MD5sum: f9fb3e5a9196f338e2eb79ac63d9f7c5 +SHA1: 6e963512c6b3246010006495d130512bdc4cde13 +SHA256: b38b2edc753d7203ae8648cc41ce364a7b509f48f7c3553924198f5a183c0f76 +SHA512: 121b45ba5b949d5b148e3f29a6a4e821224d7cb828d281057ddeedea558fc5f5785285938f54e1d17dad00473f7b670c12f4eb8969196d869fa1f526d992cb1d +Homepage: https://gitlab.freedesktop.org/pwithnall/malcontent/ +Description: library for parental control of applications + malcontent implements support for restricting the type of content accessible + to non-administrator accounts on a Linux system. Typically, when this is used, + a non-administrator account will be for a child using the system; and the + administrator accounts will be for the parents; and the content being filtered + will be apps which are not suitable for the child to use, due to (for example) + being too violent. + . + This is not a security boundary, and a sufficiently technically advanced user + may always work around these parental controls. malcontent is not a mandatory + access control (MAC) system like AppArmor or SELinux. However, its correct use + by applications should provide enough of an obstacle to prevent users easily or + accidentally having access to content which they shouldn’t. + . + This package contains common files for the libmalcontent library. + +Package: libmaxminddb0 +Architecture: amd64 +Version: 1.12.2-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libmaxminddb +Maintainer: Ubuntu Developers +Original-Maintainer: Faidon Liambotis +Installed-Size: 58 +Depends: libc6 (>= 2.38) +Suggests: mmdb-bin +Filename: pool/libmaxminddb0_1.12.2-1build2_amd64.deb +Size: 18864 +MD5sum: ae15b437f09eb2d6aa01fd251d9e6e31 +SHA1: 60853f10321d1a9d18cead5bf0bf6075a7a0bece +SHA256: 3ea71228684a480b2183b72de1c99126965ef98c1b8def81f65e346298024fed +SHA512: bf33986713184c9d9b6ebaedee50cb78266bd66ad75775a4822ce3e41915af41c9287ba4ad9d58f8d788c6bb0ad35b28435b3318c2a23789f66ee3e3a1404845 +Homepage: https://maxmind.github.io/libmaxminddb/ +Description: IP geolocation database library + The libmaxminddb library provides a C library for reading MaxMind DB files, + including the GeoIP2 databases from MaxMind. This is a custom binary format + designed to facilitate fast lookups of IP addresses while allowing for great + flexibility in the type of data associated with an address. + . + The MaxMind DB format is an open format. The spec is available at + https://maxmind.github.io/MaxMind-DB/. This spec is licensed under the Creative + Commons Attribution-ShareAlike 3.0 Unported License. + +Package: libmbim-glib4 +Architecture: amd64 +Version: 1.32.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libmbim +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 903 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.56) +Filename: pool/libmbim-glib4_1.32.0-2ubuntu1_amd64.deb +Size: 236006 +MD5sum: 4ad5d17fca7e838d0352b80f325ed871 +SHA1: 16f6e18bbba311f4058888d4b6450433dae090e4 +SHA256: 58e905818f0f2080f85aafdf104ca167c7a6b8ae0e0591372f5a9ba500792fdc +SHA512: 398ef5d7e0096cb7a385950407d2727243bc5b5837c63427e53cb5bbe21b0ddcdeb306aca40a96731dafa405ab927800c2ded8235110b87be5e1d3c3492a78b1 +Homepage: https://www.freedesktop.org/wiki/Software/libmbim/ +Description: Support library to use the MBIM protocol + libmbim is a glib-based library for talking to WWAN modems and devices + which speak the Mobile Interface Broadband Model (MBIM) protocol. + +Package: libmbim-proxy +Architecture: amd64 +Version: 1.32.0-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: net +Source: libmbim +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 33 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.56), libmbim-glib4 (= 1.32.0-2ubuntu1) +Filename: pool/libmbim-proxy_1.32.0-2ubuntu1_amd64.deb +Size: 6264 +MD5sum: ecd9e5d3e686feab1b1e51bc533baaeb +SHA1: fc2361365ea4be0afc97697f0fb55a2600c0ef07 +SHA256: 4da8e1f09c476836ce2efcd3bf2e64a910e1e214683eb7283536c1bf9c0d761c +SHA512: 52c9bccc048a3961b1d324874c164e075a602c14e966dac78588338dd990f774fda221d5cae06654eba5fd04e6baac2ded62e4d905f6bea9bdfe66cb94c6d7fc +Homepage: https://www.freedesktop.org/wiki/Software/libmbim/ +Description: Proxy to communicate with MBIM ports + libmbim is a glib-based library for talking to WWAN modems and devices + which speak the Mobile Interface Broadband Model (MBIM) protocol. + . + This package contains the binary mbim-proxy used by libmbim to allow multiple + clients to use the same MBIM port simultaneously. + +Package: libmbim-utils +Architecture: amd64 +Version: 1.32.0-2ubuntu1 +Priority: optional +Section: net +Source: libmbim +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 265 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.56), libmbim-glib4 (>= 1.32.0-1ubuntu1~), libmbim-proxy +Filename: pool/libmbim-utils_1.32.0-2ubuntu1_amd64.deb +Size: 75308 +MD5sum: 9896ae8f952ab597af5985043d93efdc +SHA1: ffac832a96c4cd4527ea6d86321ad01ce7e66233 +SHA256: a6b275dab16122d2db40a12828b05bc2c0d5536a0bf681fd39b568dc3a35f1ec +SHA512: 2cf8d41cb0a26d4e5c491f3f3bedea9f9abf94e96274a5aef16b264eca2d81bff706f339fe1475a744b16394d34c984bfc5d3a9269a99eea9e222ff27451b51e +Homepage: https://www.freedesktop.org/wiki/Software/libmbim/ +Description: Utilities to use the MBIM protocol from the command line + libmbim is a glib-based library for talking to WWAN modems and devices + which speak the Mobile Interface Broadband Model (MBIM) protocol. + . + This package contains the utilities that make it easier to use MBIM + functionality from the command line. + +Package: libmediaart-2.0-0 +Architecture: amd64 +Version: 1.9.7-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libmediaart +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 62 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libglycin-2-0 (>= 2.0~beta) +Filename: pool/libmediaart-2.0-0_1.9.7-3_amd64.deb +Size: 18482 +MD5sum: a497ffe6666abf69ee0ad6ef8597c4a4 +SHA1: f19e15975ab069e704cf8139e28bb4b3f69617b9 +SHA256: face445bcee3dd11b0fbfb12710422d527b6c20394a8384db3b14e117fdb30dc +SHA512: d85488ed972a4b3846efff38e842c11e82145cfb65346529652e48f8a07f7c093bc26e4f26bcc3c55632b016bb5655fa9f3b573f578b30cdf91092bc318ee1d9 +Homepage: https://wiki.gnome.org/MediaArtStorageSpec +Description: media art extraction and cache management library + Libmediaart is a library tasked with managing, extracting and handling + media art caches. + . + This package contains the shared library. + +Package: libmm-glib0 +Architecture: amd64 +Version: 1.25.95-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: modemmanager +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 1323 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.62.0) +Recommends: modemmanager (>= 1.25.95-1ubuntu1) +Filename: pool/libmm-glib0_1.25.95-1ubuntu1_amd64.deb +Size: 260106 +MD5sum: a6b1e36f4e0c854c8b99b8eb984383f5 +SHA1: b4c1aba8f4649ba8abc8bae5599eef540e46d4c1 +SHA256: 8f77d6a2bbc4900ba736de74f62b2d78bb5d73e84383ac46e95936131ec92c89 +SHA512: d320b15b9c76b12512cc9e357188d08b04e8a81ddefdf01ae479d4af18031b3b18a8c4f413cdc47de096b9205b40ab5c20338d7a71fe9d89b052ef0fd56168f3 +Homepage: https://www.freedesktop.org/wiki/Software/ModemManager/ +Description: D-Bus service for managing modems - shared libraries + ModemManager is a DBus-activated daemon which controls mobile broadband + (2G/3G/4G/5G) devices and connections. Whether built-in devices, USB dongles, + Bluetooth-paired telephones or professional RS232/USB devices with external + power supplies, ModemManager is able to prepare and configure the modems and + setup connections with them. + . + This package contains shared libraries for applications interfacing with + ModemManager. + +Package: libmnl0 +Architecture: amd64 +Version: 1.0.5-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libmnl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 47 +Depends: libc6 (>= 2.14) +Filename: pool/libmnl0_1.0.5-3build1_amd64.deb +Size: 12560 +MD5sum: ecf9654ce1b8f577193b89a50e1ba96f +SHA1: 67a167ba45715a0408cbb6219e0f4b6161d87f30 +SHA256: ab5e2781b0e2a2155cf154c658a2e6cf419d95a28c3121aefb159df6453102e5 +SHA512: e17aeb8c7a07e9500ef82dc0eb874637884622f23e86413dc33c4fb736b17a6b5de0e3cf945c280f6fa8804ea73abb1eed066fcdf88630279e4f4e03f22158a3 +Homepage: https://netfilter.org/projects/libmnl/ +Description: minimalistic Netlink communication library + libmnl is a minimalistic user-space library oriented to Netlink developers. + There are a lot of common tasks in parsing, validating, constructing of + both the Netlink header and TLVs that are repetitive and easy to get wrong. + This library aims to provide simple helpers that allows you to re-use code + and to avoid re-inventing the wheel. + . + The main features of this library are: + . + Small: the shared library requires around 30KB for an x86-based computer. + . + Simple: this library avoids complexity and elaborated abstractions that + tend to hide Netlink details. + . + Easy to use: the library simplifies the work for Netlink-wise developers. + It provides functions to make socket handling, message building, + validating, parsing and sequence tracking, easier. + . + Easy to re-use: you can use the library to build your own abstraction + layer on top of this library. + . + Decoupling: the interdependency of the main bricks that compose the + library is reduced, i.e. the library provides many helpers, but the + programmer is not forced to use them. + . + This package contains the shared libraries needed to run programs that use + the minimalistic Netlink communication library. + +Package: libmozjs-140-0 +Architecture: amd64 +Version: 140.8.0-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: mozjs140 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 35839 +Depends: tzdata, libc6 (>= 2.38), libgcc-s1 (>= 4.2), libstdc++6 (>= 12), zlib1g (>= 1:1.1.4) +Filename: pool/libmozjs-140-0_140.8.0-4_amd64.deb +Size: 11757962 +MD5sum: 8a71d3c6359744bf3292cd8218337141 +SHA1: 46fee70c033b080f7ebec4a15d1c0dec3675a795 +SHA256: c67719532b781b6501b784b8ecd76e42748de2f3d81a653098697fc3d426c61f +SHA512: 86552d880a0f81a81e7b5574fd1e82b768024a16f64a41b53580fb34b52b1549452cb5f3a487329b60da932350c92348f9fbc76cc2b12aaab90867b0a00f941a +Homepage: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +Description: SpiderMonkey JavaScript library + SpiderMonkey is the code-name for Mozilla Firefox's C++ implementation of + JavaScript. It is intended to be embedded in other applications + that provide host environments for JavaScript. + . + This library is intended for use in contexts where only trusted + JavaScript code will be run, such as GNOME's gjs, Cinnamon's cjs, and + polkit's rules parsing. It should not be used to run untrusted JavaScript + from web pages: use a security-supported implementation such as Firefox, + Chrome or WebKitGTK's JavaScriptCore instead. + +Package: libmp3lame0 +Architecture: amd64 +Version: 3.101~svn6525+dfsg-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: lame +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 271 +Depends: libc6 (>= 2.38), libmpg123-0t64 (>= 1.28.0) +Filename: pool/libmp3lame0_3.101~svn6525+dfsg-2_amd64.deb +Size: 121446 +MD5sum: 3f296ceafd2b0104dd94792458e2ca72 +SHA1: 90078b45aad3d77025d754f7d2c5d940ca088a1b +SHA256: 20ab98afff633ed2c8e2cfb1b69a2c0a0cb86c8328b663c5825e6592dab600b4 +SHA512: dc764be72ac64bd35b14bb6d4e3d76ea15e36aaf1b7d5627bba62c1abe420a8eaf8719ae03deb90dba1e92c94ec8360328502b1aa65e15be1aa80b5645178218 +Homepage: https://lame.sourceforge.io/ +Description: MP3 encoding library + LAME (recursive acronym for "LAME Ain't an MP3 Encoder") is a research + project for learning about and improving MP3 encoding technology. + LAME includes an MP3 encoding library, a simple frontend application, + and other tools for sound analysis, as well as convenience tools. + . + This package contains the shared library. + +Package: libmpc3 +Architecture: amd64 +Version: 1.3.1-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mpclib3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 149 +Depends: libc6 (>= 2.4), libgmp10 (>= 2:6.3.0+dfsg), libmpfr6 (>= 4.0.0) +Filename: pool/libmpc3_1.3.1-3_amd64.deb +Size: 54628 +MD5sum: 08718a9edf1c5bfafd0bc51fc5f85db1 +SHA1: 2c899012624676525acfa586d0945801b65d05b1 +SHA256: a95c75b486f26fe8b140a632fd9e2883b7e2efc21f7586e155d27d2d2ff0ddc0 +SHA512: 694090ca905c43fefd8d5d39663b90d707293ed4cedddc007c1375c7a30105e25b3826d0ee3e026b52066774b849ac18d59bc79c99cf0be55adf3634be46c445 +Homepage: http://www.multiprecision.org/mpc/ +Description: multiple precision complex floating-point library + MPC is a portable library written in C for arbitrary precision + arithmetic on complex numbers providing correct rounding. For the time + being, it contains all arithmetic operations over complex numbers, the + exponential and the logarithm functions, the trigonometric and + hyperbolic functions. + . + Ultimately, it should implement a multiprecision equivalent of the ISO + C99 standard. + . + It builds upon the GNU MP and the MPFR libraries. + +Package: libmpfr6 +Architecture: amd64 +Version: 4.2.2-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mpfr4 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GCC Maintainers +Installed-Size: 1215 +Depends: libc6 (>= 2.38), libgmp10 (>= 2:6.3.0+dfsg) +Breaks: libgmp3 (<< 4.1.4-3), libmpc3 (<< 1.1.0-1~) +Filename: pool/libmpfr6_4.2.2-3_amd64.deb +Size: 361268 +MD5sum: 061d5c3b5e405bea4796de62df65221c +SHA1: c5ca86d07fa7064904a1932cc12c0cd82d45e539 +SHA256: 74defa71b7f81d66b103afccfce750ad356976696b40c96c846ddc956fcfe937 +SHA512: 13d04a12c95f002a621208ccd4400cb232e4020144a1b797ac74d23e52994d57041c6668ac75168e6682268257bc4937065eec69517820d08a3062b6809f73ba +Homepage: https://www.mpfr.org/ +Description: multiple precision floating-point computation + MPFR provides a library for multiple-precision floating-point computation + with correct rounding. The computation is both efficient and has a + well-defined semantics. It copies the good ideas from the + ANSI/IEEE-754 standard for double-precision floating-point arithmetic + (53-bit mantissa). + +Package: libmpg123-0t64 +Architecture: amd64 +Version: 1.33.3-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: mpg123 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 404 +Provides: libmpg123-0 (= 1.33.3-2) +Depends: libc6 (>= 2.38) +Breaks: libmpg123-0 (<< 1.33.3-2) +Replaces: libmpg123-0 +Filename: pool/libmpg123-0t64_1.33.3-2_amd64.deb +Size: 176430 +MD5sum: 3451e8aaaf61f210e3e1394dfc2474de +SHA1: e4a76faf38407d1557ab2c601eaedad97ba5d9f1 +SHA256: 5bb06d8890eecd357da520a21e592a93267bb4b48a4f8946d6d67c366f511bbd +SHA512: 809591093676660dc4e5bf015ecb71583436cef47967ccda5819e13ca3ef6b713d29713450f30406556d5bc699d267a1dc31b51bd2fabd609c462130e05926a8 +Homepage: http://mpg123.org/ +Description: MPEG layer 1/2/3 audio decoder (shared library) + mpg123 is a real time MPEG 1.0/2.0/2.5 audio player/decoder for layers + 1, 2 and 3 (MPEG 1.0 layer 3 also known as MP3). + . + This package contains the C libraries needed to run executables that use + the mpg123 library. + +Package: libmsgraph-1-1 +Architecture: amd64 +Version: 0.3.3-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: msgraph +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 125 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.80.0), libgoa-1.0-0b (>= 3.1.1), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.0.3) +Filename: pool/libmsgraph-1-1_0.3.3-3build1_amd64.deb +Size: 35392 +MD5sum: 6545bef8e655517f853f5220b100620e +SHA1: 70466123e2b7d0cc1b1510b318977accbd6159f0 +SHA256: 8bcffcf8a08329f8fdaaff42cfe6cc36fa8f9272fd3015c0b270df6879ef19f6 +SHA512: a7837cdf73ca83736ea46c7297f46f60f25e42ced3b2af8433d6521803b3198c86e6be8ebd09a0411952d338db770516aa1bb54994ca325ad034bd68a0498a50 +Homepage: https://gnome.pages.gitlab.gnome.org/msgraph/ +Description: library for accessing the Microsoft Graph API + libmsgraph is a GLib-based library for accessing online service APIs + using the Microsoft Graph protocol. + +Package: libmtdev1t64 +Architecture: amd64 +Version: 1.1.7-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: mtdev +Maintainer: Ubuntu Developers +Original-Maintainer: Nobuhiro Iwamatsu +Installed-Size: 48 +Provides: libmtdev1 (= 1.1.7-1build1) +Depends: libc6 (>= 2.4) +Breaks: libmtdev1 (<< 1.1.7-1build1) +Replaces: libmtdev1 +Filename: pool/libmtdev1t64_1.1.7-1build1_amd64.deb +Size: 15162 +MD5sum: 72e3dc7c1a8e39e4469b4376bde87ab0 +SHA1: 720dbf3247f5cd6f40d24bd6bfaae3db8c99b4a8 +SHA256: d5e3b70bec533015ac924b69b13e21c7ad0eef8e84183d1eaff9529e603f4c39 +SHA512: 95ffb60830cd6117c8854a0b19a862219ea734d4b490a0e622f02134cf7efbf02e7e92a08e9c8e32f995d5f48712201d064e810f1ae20c778932ba3e9ee63da8 +Homepage: https://bitmath.se/org/code/mtdev/ +Description: Multitouch Protocol Translation Library - shared library + libmtdev is a library for translating evdev multitouch events using the legacy + protocol to the new multitouch slots protocol. This is necessary for kernel + drivers that have not been updated to use the newer protocol. + +Package: libmtp-common +Architecture: all +Version: 1.1.22-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libmtp +Maintainer: Ubuntu Developers +Original-Maintainer: Alessio Treglia +Installed-Size: 138 +Filename: pool/libmtp-common_1.1.22-1ubuntu1_all.deb +Size: 20346 +MD5sum: d00bf3cb72128064748eb1fef0e2472b +SHA1: 3678244fc4a53cbd08e7e4c5525b4e70ced40ce7 +SHA256: 2e168f0da2dc8a46cbd6eaa81bf299e3d76b5e1ee69a0a1412c475dcc7a58b4d +SHA512: 563e791241b1025a2e76462fa1f0eaabece252ac19de3c1828da73a7faaf7a24e32759a448f60221965651c3e940fec373fe94efff8aa3f81abf8e65f79fabbf +Homepage: https://libmtp.sourceforge.net/ +Description: Media Transfer Protocol (MTP) common files + libmtp is a library for communicating with MTP aware devices in POSIX + compliant operating systems. It implements MTP Basic, the subset + proposed for standardization. + . + The Media Transfer Protocol (commonly referred to as MTP) is a devised + set of custom extensions to support the transfer of music files on + USB digital audio players and movie files on USB portable media players. + . + This package provides the udev rules file. + +Package: libmtp-runtime +Architecture: amd64 +Version: 1.1.22-1ubuntu1 +Priority: optional +Section: libs +Source: libmtp +Maintainer: Ubuntu Developers +Original-Maintainer: Alessio Treglia +Installed-Size: 29 +Depends: libmtp-common, libmtp9t64 (= 1.1.22-1ubuntu1), libc6 (>= 2.38) +Enhances: libmtp9t64 +Filename: pool/libmtp-runtime_1.1.22-1ubuntu1_amd64.deb +Size: 6190 +MD5sum: 725b1811d1c5c3dba3cae5ab873de4b5 +SHA1: 69c5e82c6282555bc54e57bf436f40de45b5658e +SHA256: 2935dbd79326f0533a27122ee5ba9c1379fc9c0dbda84f14d55c27c849170e55 +SHA512: 5c971789ce18e08e9355de70357ef1c5d17f24770213b732fdf091a0caad9ef049aaa714854cdb6ce7a4b2d665a59768c6940570826820a04dab94dde93f17a9 +Homepage: https://libmtp.sourceforge.net/ +Description: Media Transfer Protocol (MTP) runtime tools + libmtp is a library for communicating with MTP aware devices in POSIX + compliant operating systems. It implements MTP Basic, the subset + proposed for standardization. + . + The Media Transfer Protocol (commonly referred to as MTP) is a devised + set of custom extensions to support the transfer of music files on + USB digital audio players and movie files on USB portable media players. + . + This package provides mtp-probe, a program to probe newly connected + device interfaces from userspace to determine if they are MTP devices, + used for udev rules. + +Package: libmtp9t64 +Architecture: amd64 +Version: 1.1.22-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libmtp +Maintainer: Ubuntu Developers +Original-Maintainer: Alessio Treglia +Installed-Size: 500 +Provides: libmtp9 (= 1.1.22-1ubuntu1) +Depends: libmtp-common, libc6 (>= 2.38), libgcrypt20 (>= 1.11.0), libusb-1.0-0 (>= 2:1.0.22) +Recommends: libmtp-runtime, udev +Breaks: libmtp9 (<< 1.1.22-1ubuntu1) +Replaces: libmtp9 +Filename: pool/libmtp9t64_1.1.22-1ubuntu1_amd64.deb +Size: 162936 +MD5sum: ca8f7434d361a44f16c239469b323c02 +SHA1: e9af40f6309d03dad1d3f801789340a638625097 +SHA256: ba2279c6d50532e9a2a484b30253ebaa360af37bd11d8dd3214338574c597e7f +SHA512: 74923fd5876cf57f3970bfc361e5942ddd7ded1c1d37754bfcad9c197e58cadfcef1693a9e1bd52a986c11a52eb02f2d19226bd62655b28ad170839edfa61b79 +Homepage: https://libmtp.sourceforge.net/ +Description: Media Transfer Protocol (MTP) library + libmtp is a library for communicating with MTP aware devices in POSIX + compliant operating systems. It implements MTP Basic, the subset + proposed for standardization. + . + The Media Transfer Protocol (commonly referred to as MTP) is a devised + set of custom extensions to support the transfer of music files on + USB digital audio players and movie files on USB portable media players. + +Package: libmutter-18-0 +Architecture: amd64 +Version: 50.1-0ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: mutter +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 4546 +Depends: adwaita-icon-theme, gsettings-desktop-schemas (>= 40~alpha), mutter-common (>= 50~beta), mutter-common-bin (>= 49.0), libatk1.0-0t64 (>= 2.2.0), libc6 (>= 2.43), libcairo2 (>= 1.6.0), libcanberra0 (>= 0.2), libcolord2 (>= 1.4.5), libdisplay-info3 (>= 0.3.0), libdrm2 (>= 2.4.119), libegl1, libeis1 (>= 1.5.0), libfribidi0 (>= 0.19.2), libgbm1 (>= 21.3.0~rc1), libgl1, libglib2.0-0t64 (>= 2.83.0), libglycin-2-0 (>= 2.0~beta.2), libgnome-desktop-4-2t64 (>= 3.17.92), libgraphene-1.0-0 (>= 1.10.0), libgudev-1.0-0 (>= 238), libharfbuzz0b (>= 0.6.0), libinput10 (>= 1.30.0), libjson-glib-1.0-0 (>= 1.5.2), liblcms2-2 (>= 2.6), libpango-1.0-0 (>= 1.45.5), libpangocairo-1.0-0 (>= 1.18.0), libpipewire-0.3-0t64 (>= 1.6.1), libpixman-1-0 (>= 0.11.2), libsoup-3.0-0 (>= 3.0.3), libstartup-notification0 (>= 0.11), libsystemd0 (>= 226), libudev1 (>= 183), libwacom9 (>= 2.0.0), libwayland-server0 (>= 1.24.0), libx11-6 (>= 2:1.7.0), libx11-xcb1, libxau6 (>= 1:1.0.11), libxcb-res0 (>= 1.10), libxcb1, libxcomposite1 (>= 1:0.4.6), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3 (>= 1:6.0.0), libxi6 (>= 2:1.2.99.4), libxinerama1 (>= 2:1.1.4), libxkbcommon0 (>= 1.0.0), libxkbregistry0 (>= 1.0.0), libxrandr2 (>= 2:1.2.99.3) +Breaks: gnome-kiosk (<< 50~rc~), gnome-shell (<< 50~rc~), xwayland (<< 2:23.1.0) +Filename: pool/libmutter-18-0_50.1-0ubuntu2.2_amd64.deb +Size: 1498144 +MD5sum: ad0bc83e9ad2e8de3d2e5b73b5dd9382 +SHA1: 073863c638d697b43836c9c52f8c852e97269685 +SHA256: c9cbb657eaf673602d8eb95292a5a8b1d2302dc7f03fa707daa860b8a612b858 +SHA512: 7833c201e26512d4f713a1ee98b413318c3239416cf10e41a38e8049bb2150bdd71bfbf9656789df9a984edd98263708cfc6aa9489419772245dfff77852491c +Homepage: https://mutter.gnome.org/ +Description: window manager library from the Mutter window manager + Mutter is a Wayland display server and X11 window manager and + compositor library. It contains functionality related to, among other + things, window management, window compositing, focus tracking, workspace + management, keybindings and monitor configuration. + . + Internally it uses a fork of Cogl, a hardware acceleration abstraction + library used to simplify usage of OpenGL pipelines, as well as a fork + of Clutter, a scene graph and user interface toolkit. + . + This package contains the window manager shared library, used by mutter + itself, and gnome-shell. + +Package: libnautilus-extension4 +Architecture: amd64 +Version: 1:50.2.2-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: nautilus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 68 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.84.0) +Filename: pool/libnautilus-extension4_1%3a50.2.2-0ubuntu0.1_amd64.deb +Size: 22674 +MD5sum: dff8c4ace14fa810e6085d679685ef11 +SHA1: f18f76417ef1d5ab57abd25c6fc0fff5be570a07 +SHA256: f55976cc2792848d8c69518a44593a1b9c1304936b37777cd8b22e2051caed0b +SHA512: c7e174fa648355212f57c356fca806f742c1bf62e55949e8b774b87d3016314d7386180c150764c8733a96f376ec34b5648656b7c56021dd789045a942c9da7e +Homepage: https://wiki.gnome.org/action/show/Apps/Nautilus +Description: libraries for nautilus components - runtime version + Nautilus is the official file manager and graphical shell for the + GNOME desktop. + . + This package contains a few runtime libraries needed by nautilus' extensions. + +Package: libncurses6 +Architecture: amd64 +Version: 6.6+20251231-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ncurses +Maintainer: Ubuntu Developers +Original-Maintainer: Ncurses Maintainers +Installed-Size: 337 +Depends: libtinfo6 (= 6.6+20251231-1), libc6 (>= 2.38) +Recommends: libgpm2 +Breaks: cowdancer (<< 0.89~) +Filename: pool/libncurses6_6.6+20251231-1_amd64.deb +Size: 114146 +MD5sum: fa9b7a7e6ddb3a077d5d192f044917fd +SHA1: fc3e6d9d54c9b90448db24fe3fbdb2a999fcb1f3 +SHA256: ef354764c18dd6034325c255b636f108dc6d4f5e64d4cafb22975e76421f3d28 +SHA512: bde691758ed597f54da91a2e801d33d94f3d92e602fc41aec9aa1911c09a9d354d2ab7a7f07152a6e30d1159586a11c96ba20d0aa32fb6024c2bb36f8b14353c +Homepage: https://invisible-island.net/ncurses/ +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package contains the shared libraries necessary to run programs + compiled with ncurses. + +Package: libndp0 +Architecture: amd64 +Version: 1.9-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libndp +Maintainer: Ubuntu Developers +Original-Maintainer: Florian Ernst +Installed-Size: 49 +Depends: libc6 (>= 2.38) +Filename: pool/libndp0_1.9-1build1_amd64.deb +Size: 13114 +MD5sum: ea7a6af1792a509e9bf4fdded491e84e +SHA1: ee131b58809a7b630018e3135e42431bdf6ffd0c +SHA256: 5ff885eeabf5e293232cda13484454b80aa291098d6b1385c53ee905612bce9e +SHA512: f6f58d989e8f69c385b2218739850e04ce262a7203f47d2f55eaaf87e24da42211dc768321e5d1043fb11de70f067440ff4ce6e0ec192a7d6a77cb39f6edd395 +Homepage: http://libndp.org +Description: Library for Neighbor Discovery Protocol + libndp is a library for the IPv6 Neighbor Discovery Protocol (NDP). It + contains functions for building and parsing NDP messages, and provides + a high-level interface for sending and receiving NDP messages on a + network interface. + +Package: libnet-dbus-perl +Architecture: amd64 +Version: 1.2.0-2build4 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 596 +Depends: perl (>= 5.40.0-6), perlapi-5.40.0, libc6 (>= 2.4), libdbus-1-3 (>= 1.9.14), libxml-twig-perl +Filename: pool/libnet-dbus-perl_1.2.0-2build4_amd64.deb +Size: 164956 +MD5sum: 416662b5837327fa120590f14f003cc3 +SHA1: 5c66310768353fc18da7c485b356e2f3dc1d6611 +SHA256: 32fe77bab16f4600244b64cad4daabc3bda96c8b504a4f144cd8af53dcd9c28e +SHA512: 911ba84fb17bd2c47a92d976bdd08b2559f2a5cb51076a9b6f5a3dd4128a0e87643b9138a097aadf15f24460f5afac733df98b76809a3d058c7a7c1848464c67 +Homepage: https://metacpan.org/release/Net-DBus +Description: Perl extension for the DBus bindings + Net::DBus provides a Perl API for the DBus message system. The DBus Perl + interface is currently operating against the 0.32 development version of + DBus, but should work with later versions too, providing the API changes have + not been too drastic. + . + Users of this package are either typically, service providers in which case + the Net::DBus::Service and Net::DBus::Object modules are of most relevance, + or are client consumers, in which case Net::DBus::RemoteService and + Net::DBus::RemoteObject are of most relevance. + +Package: libnet-http-perl +Architecture: all +Version: 6.24-1build1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 59 +Depends: perl:any, libio-socket-ip-perl, liburi-perl +Recommends: libio-socket-ssl-perl +Filename: pool/libnet-http-perl_6.24-1build1_all.deb +Size: 21656 +MD5sum: 218ded6ba72d502a774cd3426ffd8c26 +SHA1: 2d3007d7a8f9b9acde040ae28803bb2bf77d9f6a +SHA256: 6d16156e6b3803eea6e69cacd93252d463fe2e3e3612cc97f2f101462c5398f8 +SHA512: 36bb5843b54641225e3729552602db8ce6c0c55e28c5526ea09f0ee682aad1d60375654ee1c89fb9dd43660365b12b6f6cca62746124c282a17f1cbe18b39954 +Homepage: https://metacpan.org/release/Net-HTTP +Description: module providing low-level HTTP connection client + The Net::HTTP class is a low-level HTTP client. An instance of the + Net::HTTP class represents a connection to an HTTP server. The + HTTP protocol is described in RFC 2616. The Net::HTTP class + supports HTTP/1.0 and HTTP/1.1. Net::HTTP is a sub-class of IO::Socket::INET. + You can mix its methods with reading and writing from the socket directly. + This is not necessarily a good idea, unless you know what you are doing. + +Package: libnet-smtp-ssl-perl +Architecture: all +Version: 1.04-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 19 +Depends: libio-socket-ssl-perl, perl:any +Recommends: libauthen-sasl-perl +Filename: pool/libnet-smtp-ssl-perl_1.04-2_all.deb +Size: 6218 +MD5sum: ea56a48b736cdf2840ecd4b415a67749 +SHA1: 81b42a7d55f0fd6da67021b0b6a6bca8201aa2b2 +SHA256: 5e2209f46511c3aedd528b363c6c5243dc8bec0a7681b46cf49e6afb04eaf28f +SHA512: 7c13c68b84a9fc414090428b799f6170eac134a06c9d2d7420bb5b1f12c27eede660f94519aa2f1f81fdc74dc531480b2763e88bf2ec4cac0e05163100a6ae2a +Homepage: https://metacpan.org/release/Net-SMTP-SSL +Description: Perl module providing SSL support to Net::SMTP + Net::SMTP::SSL implements the same API as Net::SMTP, but uses IO::Socket::SSL + for its network operations. Due to the nature of Net::SMTP's new method, it is + not overridden to make use of a default port for the SMTPS service. Perhaps + future versions will be smart like that. Port 465 is usually what you want, + and it's not a pain to specify that. + . + This package is deprecated. Net::SMTP (in perl core) has support for SMTP + over SSL, and also for STARTTLS, since version 1.28 (included in Perl 5.22). + +Package: libnet-ssleay-perl +Architecture: amd64 +Version: 1.94-3 +Multi-Arch: same +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 1332 +Depends: perl (>= 5.40.1-2), perl-openssl-abi-3, perlapi-5.40.1, libc6 (>= 2.14), libssl3t64 (>= 3.2.0) +Filename: pool/libnet-ssleay-perl_1.94-3_amd64.deb +Size: 318024 +MD5sum: 6fca9b6317e638156bb24eb78c752d00 +SHA1: d9499d227dbf3296be575ec33e0586b7074c07d3 +SHA256: 69372215b26f1939c1ae21517bb57692fc64d7afe7534257ead0100138689629 +SHA512: 4b9c665ef7d1cf1e4c398b286143513fdaa7e5a47b1ddee6bde58726777a27ff663dd1dc7e299001fa83cb8ccc95464cf242df1955636efc547af9deb768ab05 +Homepage: https://metacpan.org/release/Net-SSLeay +Description: Perl module for Secure Sockets Layer (SSL) + Net::SSLeay is a perl module that allows you to call Secure Sockets Layer + (SSL) functions of the SSLeay library directly from your perl scripts. It + is useful if you want to program robots that access secure web servers or + if you want to build your own applications over SSL encrypted tunnels. If + you just want to view web pages on https servers, you do not need this - + your web browser already knows to do that. + +Package: libnetfilter-conntrack3 +Architecture: amd64 +Version: 1.1.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnetfilter-conntrack +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 148 +Depends: libc6 (>= 2.38), libmnl0 (>= 1.0.3-4~), libnfnetlink0 (>= 1.0.2) +Filename: pool/libnetfilter-conntrack3_1.1.1-1_amd64.deb +Size: 47520 +MD5sum: 1b4513a692520b19e600db284de59065 +SHA1: a89b9478768dcf152e0d4e5957303a705ce123f9 +SHA256: facfd45a7cf6bab8ef30adbe693d6486f22e5253263f9d53b4e70b53f768970e +SHA512: d3aef99e8a7541b0679edf1557434ac5800085318030ab0d9f7258260cb90fd0605378325614f03fb40fc5a3b0d882eaf97e8ba86a4dc65833a9eb3580637f31 +Homepage: https://www.netfilter.org/projects/libnetfilter_conntrack/ +Description: Netfilter netlink-conntrack library + libnetfilter_conntrack is a userspace library providing a programming + interface (API) to the in-kernel connection tracking state table. + +Package: libnetplan1 +Architecture: amd64 +Version: 1.2-1ubuntu5.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: netplan.io +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Networking Team +Installed-Size: 383 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.76.0), libuuid1 (>= 2.16), libyaml-0-2 +Filename: pool/libnetplan1_1.2-1ubuntu5.1_amd64.deb +Size: 132066 +MD5sum: 36314128293bb7e88eb11bec0d16f268 +SHA1: df09a34a9efae453a6624ca5dfdce9f9aab4665f +SHA256: 7ea06d69095c1b912ced77d9ba1aeed67eb18e60e9a67ba03d45f164382c3071 +SHA512: 652cb3f68580532ff4f2692b262b17b92f99fa1e45591ec5583300a903769240de67e6ff493ad232411429f152d997c2bb608f7cb2a8b1d889fa180f29eac597 +Homepage: https://netplan.io/ +Description: Declarative network configuration runtime library + Netplan reads YAML network configuration files which are written + by administrators, installers, cloud image instantiations, or other OS + deployments. During early boot it then generates backend specific + configuration files in /run to hand off control of devices to a particular + networking daemon. + . + Currently supported backends are networkd and NetworkManager. + . + This package contains the necessary runtime library files. + +Package: libnewt0.52 +Architecture: amd64 +Version: 0.52.25-1ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: newt +Maintainer: Ubuntu Developers +Original-Maintainer: Alastair McKinstry +Installed-Size: 180 +Depends: libc6 (>= 2.38), libslang2 (>= 2.2.4) +Recommends: libfribidi0 +Filename: pool/libnewt0.52_0.52.25-1ubuntu3_amd64.deb +Size: 47588 +MD5sum: baaa22fea2c387e03f59ff82304c67a8 +SHA1: b9c16da3b312908022949ba2c7fd1145a23db72d +SHA256: 4aba21a5364aeb3778946e75b2f7b420b44a77cc5c1cd32935279eae4d8c0e99 +SHA512: 3a7284fc53c6f63e9de60fc2d87cebab02267c5e661876092496f81c07abf814f483872e976ac8f1d89cee07047a6ae418301735dcf3d7b2e412fe5f19acfeec +Homepage: https://pagure.io/newt +Description: Not Erik's Windowing Toolkit - text mode windowing with slang + Newt is a windowing toolkit for text mode built from the slang library. + It allows color text mode applications to easily use stackable windows, + push buttons, check boxes, radio buttons, lists, entry fields, labels, + and displayable text. Scrollbars are supported, and forms may be nested + to provide extra functionality. This package contains the shared library + for programs that have been built with newt. + +Package: libnfnetlink0 +Architecture: amd64 +Version: 1.0.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnfnetlink +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 51 +Depends: libc6 (>= 2.14) +Filename: pool/libnfnetlink0_1.0.2-3build1_amd64.deb +Size: 15078 +MD5sum: d31dec0eecd14fd216a1be159471feab +SHA1: 0bee5305f7ff4309e993bdb4839fe17ca0eab6f8 +SHA256: e76b638fef2c1ebf78260972a52c4716df5752b29a952aeddc0c091a74f179c2 +SHA512: d9c03840b3c4e79dc1442019bf891ba18b9f499125c818c2db3f05381ba1e13423ee71f03e87a2599171ae07d5e45f1b92280d815727739d65988c918e2cc25f +Homepage: https://git.netfilter.org/libnfnetlink +Description: Netfilter netlink library + libnfnetlink is the low-level library for netfilter related + kernel/userspace communication. It provides a generic messaging + infrastructure for in-kernel netfilter subsystems (such as + nfnetlink_log, nfnetlink_queue, nfnetlink_conntrack) and their + respective users and/or management tools in userspace. + +Package: libnfs14 +Architecture: amd64 +Version: 5.0.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnfs +Maintainer: Ubuntu Developers +Original-Maintainer: Ritesh Raj Sarraf , +Installed-Size: 386 +Depends: libc6 (>= 2.38) +Breaks: libnfs1 (>= 1.9.3-1), libnfs4 +Replaces: libnfs1 (>= 1.9.3-1), libnfs4 +Filename: pool/libnfs14_5.0.2-1ubuntu1.1_amd64.deb +Size: 110198 +MD5sum: ab9cab1a558bc23fb1b9e7be4f6a28dc +SHA1: 5416c047d85edf0b9eb5bf1ebf6771475a1e0d65 +SHA256: cfed9f8dedae4c1aa0f079837adae4f3f551bdff3af5cb30bbf9ed74187e49e4 +SHA512: 33588d50ff91e79c1f1d07c58f9349876dd62480f762ddaaefec382409c48ae2c5e2807412f212d7c07724633173a21e76961e4c7d8266a82f1669b0527e38d1 +Homepage: https://github.com/sahlberg/libnfs +Description: NFS client library (shared library) + LIBNFS is a client library for accessing NFS shares over a network. + . + LIBNFS offers three different APIs, for different use : + 1, RAW : A fully async low level rpc library for nfs protocols + 2, NFS ASYNC : A fully asynchronous library for high level vfs functions + 3, NFS SYNC : A synchronous library for high level vfs functions + . + This package provides the shared library. + +Package: libnfsidmap1 +Architecture: amd64 +Version: 1:2.8.5-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: nfs-utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian kernel team +Installed-Size: 185 +Depends: libc6 (>= 2.38), libldap2 (>= 2.6.2) +Conflicts: libnfsidmap2 +Breaks: libnfsidmap2 (<< 0.25-7~) +Replaces: libnfsidmap2 (<< 0.25-7~) +Filename: pool/libnfsidmap1_1%3a2.8.5-1ubuntu1_amd64.deb +Size: 51412 +MD5sum: c1d4524a039e3953da33dc607c1addc7 +SHA1: 907ecb7758a261b4d64f9198d8e5f29cefddb627 +SHA256: 66f6a767957ef82e42b549d9f6444d968fc0517f79b7147a80049e6e75df2738 +SHA512: ae3c2ecb185588ada9669cdb03040d3b28c52fe494813f19c83344a34604d78769c00e5dfc5a7370b3c7cb5ce6ba68993012ee481a4cb9d8336ea1d92e249cee +Homepage: https://linux-nfs.org/ +Description: NFS idmapping library + libnfsidmap provides functions to map between NFSv4 names (which are + of the form user@domain) and local uid's and gid's. + +Package: libnftables1 +Architecture: amd64 +Version: 1.1.6-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: nftables +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 1087 +Depends: libc6 (>= 2.38), libgmp10 (>= 2:6.3.0+dfsg), libjansson4 (>= 2.14), libmnl0 (>= 1.0.3-4~), libnftnl11 (>= 1.3.1), libxtables12 (>= 1.6.0+snapshot20161117) +Filename: pool/libnftables1_1.1.6-1_amd64.deb +Size: 390468 +MD5sum: b3948751e5d0de6d54653a1925b48240 +SHA1: 07445d384a22f529e4ba1deb32d930b099e86213 +SHA256: 0e5abb5719052d9f12aadf91a3f3d5192a2e85d035ee81d07c3055a0f79d8b8f +SHA512: e171a173b59d20ef66cecfe94a2405e6dfa07d9dcb949baf3b9be1f467df7697f4955fbd2774173d6601fd74a2a32492f49c675946b547a40e8ac229b08e5850 +Homepage: https://www.netfilter.org/ +Description: Netfilter nftables high level userspace API library + This library provides high level semantics to interact with the nftables + framework by Netfilter project. + . + nftables replaces the old popular iptables, ip6tables, arptables and ebtables. + . + Netfilter software and nftables in particular are used in applications such + as Internet connection sharing, firewalls, IP accounting, transparent + proxying, advanced routing and traffic control. + . + A Linux kernel >= 3.13 is required. However, >= 4.14 is recommended. + . + This package contains the libnftables library. + +Package: libnftnl11 +Architecture: amd64 +Version: 1.3.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnftnl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 248 +Depends: libc6 (>= 2.34), libmnl0 (>= 1.0.3-4~) +Filename: pool/libnftnl11_1.3.1-1_amd64.deb +Size: 72288 +MD5sum: cf45b08c02d44ddc73658b607431a36f +SHA1: 61a97889f0132c33b4ed6a73355f3c5f0ea84fe1 +SHA256: a2f4d4a4ce3fac7e473c8de60a3d8948a58e9850cd8e2ced17263aa73dda7199 +SHA512: 7f65e39078ad2c6bea3cfc214ca13746367bdc633c234016a0d6e74bae9787deea233a0c9b15ca17ff07e544ebe886345845153ad1decb1709f02bc088b64341 +Homepage: https://git.netfilter.org/libnftnl +Description: Netfilter nftables userspace API library + libnftnl is the low-level library for Netfilter 4th generation + framework nftables. + . + Is the user-space library for low-level interaction with + nftables Netlink's API over libmnl. + +Package: libnl-3-200 +Architecture: amd64 +Version: 3.12.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnl3 +Maintainer: Ubuntu Developers +Original-Maintainer: Heiko Stuebner +Installed-Size: 171 +Depends: libc6 (>= 2.38) +Filename: pool/libnl-3-200_3.12.0-2_amd64.deb +Size: 58810 +MD5sum: 236826baf6265af1b904456ac6c23bf1 +SHA1: 076d6224ba1e901ababf9240f48b29c5e2585259 +SHA256: 52fda1b991baa2d0fbe82f5dfb15584dcb1f25a7e3d311e2e319cc33858b4f2c +SHA512: de4df6e1b7ab1a4a0fa74fadbf2c77a847f323ed44e3264861b4bce7a748aa8677841e90facb5a1ef0d2f5212eeaadd04e71a65c53416b9436f832e42513d6b2 +Homepage: https://github.com/thom311/libnl +Description: library for dealing with netlink sockets + This is a library for applications dealing with netlink sockets. + The library provides an interface for raw netlink messaging and various + netlink family specific interfaces. + +Package: libnl-genl-3-200 +Architecture: amd64 +Version: 3.12.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnl3 +Maintainer: Ubuntu Developers +Original-Maintainer: Heiko Stuebner +Installed-Size: 52 +Depends: libnl-3-200 (= 3.12.0-2), libc6 (>= 2.4) +Filename: pool/libnl-genl-3-200_3.12.0-2_amd64.deb +Size: 12386 +MD5sum: 354d6009183a310febb4965aec2e680e +SHA1: 804a251086aa8385811991d54eca01e0428b074a +SHA256: 8f25551ea6e925070c36ad1653e1201aa5fd62f3d0d8552071104b5b33813f3c +SHA512: 27a9b5afa2c6b0f23bea88cc7f2959acfc1aa3b5d94639746c4ea0c4ced831ce355a8a60995f6c4044fb6ea77b0ef71043ce124f3f91cac47157994b26c35c53 +Homepage: https://github.com/thom311/libnl +Description: library for dealing with netlink sockets - generic netlink + This is a library for applications dealing with netlink sockets. + The library provides an interface for raw netlink messaging and various + netlink family specific interfaces. + . + API to the generic netlink protocol, an extended version of the netlink + protocol. + +Package: libnl-route-3-200 +Architecture: amd64 +Version: 3.12.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnl3 +Maintainer: Ubuntu Developers +Original-Maintainer: Heiko Stuebner +Installed-Size: 684 +Depends: libnl-3-200 (= 3.12.0-2), libc6 (>= 2.38) +Filename: pool/libnl-route-3-200_3.12.0-2_amd64.deb +Size: 204148 +MD5sum: 0aa41a832c97781573d2a1e47723663d +SHA1: 391ad92ea2e6cb7da4f43002ca15758d4aeb29d7 +SHA256: 58c5fa3c2f5226ffb1846db6cf7318196dbf5294a4354edd00fdae2db30a45dc +SHA512: 7da89573a4f2c633921098abbce5f94f53accfdd235c6f07b7ca009a5f1ad39791a6faf6a78ac588b23a898b2faf19bf1246aa0f856333884102a0d503d4a071 +Homepage: https://github.com/thom311/libnl +Description: library for dealing with netlink sockets - route interface + This is a library for applications dealing with netlink sockets. + The library provides an interface for raw netlink messaging and various + netlink family specific interfaces. + . + API to the configuration interfaces of the NETLINK_ROUTE family. + +Package: libnm0 +Architecture: amd64 +Version: 1.54.3-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: network-manager +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1574 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.44.0), libgnutls30t64 (>= 3.7.2), libudev1 (>= 183) +Filename: pool/libnm0_1.54.3-2ubuntu3_amd64.deb +Size: 495248 +MD5sum: d3398cfd6f7273d074cfe89a33594aab +SHA1: 27ee22f0aeb93bdadafe4f6b9e62020b4becbf2d +SHA256: 43658f6f4ba4baf8bba1951560e4d02e9cf99214442136bc6dcd0fb0115247cd +SHA512: f70ec50396697c7af498e986d957d01e365082bc0d761aa0c135810c3b8db71e26808f8e7c4d8ddcfbf250b3c3006a00ab4b9bc6f9a712a1f6c1d6fcb0da57ab +Homepage: https://networkmanager.dev/ +Description: GObject-based client library for NetworkManager + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package contains a convenience library to ease the access to + NetworkManager. + +Package: libnma-common +Architecture: all +Version: 1.10.6-7 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libnma +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 52 +Depends: dconf-gsettings-backend | gsettings-backend +Breaks: network-manager-gnome (<< 1.30.0) +Filename: pool/libnma-common_1.10.6-7_all.deb +Size: 3820 +MD5sum: 2fda8ba9e11e123fecf7de28a39e8d9f +SHA1: c5f1a566b1fb9bb524c0b5bbffbcb0ec88494e37 +SHA256: 1185d15ff0ec06e97483869e1e736b4c825fbacf127aedbfe8fda3f3f6c0422d +SHA512: 8ef378d57c14823190d5149481d6026c5a9274d8f95fe5d3a58476e991ec8f9b3824f941629c173f250c3d8ce67f42387703cf5afdc4865c9017d0182c0f81fc +Homepage: https://networkmanager.dev +Description: NetworkManager GUI library - translations + The libnma library provides Gtk+ dialogs and UI utilities for NetworkManager. + . + This package contains translations and GSettings schema files. + +Package: libnma-gtk4-0 +Architecture: amd64 +Version: 1.10.6-7 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnma +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 356 +Depends: libc6 (>= 2.38), libcairo2 (>= 1.2.4), libgck-2-2 (>= 4.0.0), libgcr-4-4 (>= 3.8.0), libglib2.0-0t64 (>= 2.38.0), libgtk-4-1 (>= 4.0.0), libnm0 (>= 1.8.0), libnma-common (= 1.10.6-7) +Filename: pool/libnma-gtk4-0_1.10.6-7_amd64.deb +Size: 93978 +MD5sum: 6fc45a2e9368682e3e1f50d8f30c8d3c +SHA1: 2db272a77d3f3e2ce1a4aec4b9b08f403f9d0039 +SHA256: fbc9062fd946b7cf2ec50ca5c9a9f707ee9e02de68fe8b0f7d96d53480a4d787 +SHA512: 100d3c1dd1514005b9124d611bf065d396790a30d7814931b020db97a37e77ca241c381c48276a83c8c14593715d95e9951a4d132a7ee63d2d8c3f0c51e62c26 +Homepage: https://networkmanager.dev +Description: NetworkManager GUI GTK4 library + This library provides GTK 4 dialogs and UI utilities for NetworkManager. + +Package: libnma0 +Architecture: amd64 +Version: 1.10.6-7 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnma +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 384 +Depends: libc6 (>= 2.38), libcairo2 (>= 1.2.4), libgck-2-2 (>= 4.0.0), libgcr-4-4 (>= 3.8.0), libglib2.0-0t64 (>= 2.38.0), libgtk-3-0t64 (>= 3.21.5), libnm0 (>= 1.8.0), libnma-common (= 1.10.6-7) +Filename: pool/libnma0_1.10.6-7_amd64.deb +Size: 94644 +MD5sum: f4b644b2454b2ffab7b2845867a5680a +SHA1: 22ed77cfdcb270860232d9aedcb570c9d778d7c1 +SHA256: 9fbd195fd86dccc86ef344ddd8f50da3945da4eadc01a83289f219c46d59882a +SHA512: 0e11f042148e8421d5642a6bfb748a82473c965867037ca8dd6b65556073e0c4eade60c6b197decb1a34a97f05dd9443ddc57de0cccea4f5a7f095a73a5bc256 +Homepage: https://networkmanager.dev +Description: NetworkManager GUI library + This library provides GTK 3 dialogs and UI utilities for NetworkManager. + +Package: libnotify-bin +Architecture: amd64 +Version: 0.8.8-1 +Priority: optional +Section: utils +Source: libnotify +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 43 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.62.0), libnotify4 (>= 0.8.7) +Filename: pool/libnotify-bin_0.8.8-1_amd64.deb +Size: 10802 +MD5sum: df015c955a1f19fa8b7dcccf41a4a372 +SHA1: db374e67638ccf4eacf4d217717be3ba5336e23a +SHA256: bfc31bf33d581aaac2bbfbbd85b2a90ca93ec67bd602e34bfdff83319a131f8f +SHA512: 2ab7348da9f47d238cf3493f08cce77f96b28edf473e3bc2a1ac977827182043de465a2f5f63df7342680d2853ae02145a1f60578d557dd336ccf8547cba3943 +Description: sends desktop notifications to a notification daemon (Utilities) + A library that sends desktop notifications to a notification daemon, as + defined in the Desktop Notifications spec. These notifications can be + used to inform the user about an event or display some form of + information without getting in the user's way. + . + This package contains the binary which sends the notification. + +Package: libnotify4 +Architecture: amd64 +Version: 0.8.8-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnotify +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 80 +Depends: libc6 (>= 2.38), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0) +Suggests: notification-daemon +Filename: pool/libnotify4_0.8.8-1_amd64.deb +Size: 28632 +MD5sum: 24310cd9ef608d417e3c5583bf939808 +SHA1: 3dbbae5d1c81b0c9851ff19ac651972ca6273c6a +SHA256: 9bfebcb17db3153100d8a0f748d9da1409ba2157e095f640ef618c0fa89b89bc +SHA512: a2b07e320cf891634f92d11f22625e536b007b9a47ae9d9af475c28ffd303e64cac8a182145d0356fb84cc09f78cef63aeb91fe1b37a9c3b7bbd558c10a77c33 +Description: sends desktop notifications to a notification daemon + A library that sends desktop notifications to a notification daemon, as + defined in the Desktop Notifications spec. These notifications can be + used to inform the user about an event or display some form of + information without getting in the user's way. + . + This package contains the shared library. To actually display the + notifications, you need to install the package notification-daemon or + any other desktop environment implementing the FreeDesktop notification + daemon specification. + +Package: libnspr4 +Architecture: amd64 +Version: 2:4.38.2-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: nspr +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of Mozilla-related packages +Installed-Size: 314 +Depends: libc6 (>= 2.38) +Filename: pool/libnspr4_2%3a4.38.2-1ubuntu1_amd64.deb +Size: 118396 +MD5sum: 36c2182e21170305448db9a69c008672 +SHA1: 6d063520d3a9cb99c98bb96d2e1b55ddb5871ab3 +SHA256: 2f28284b35765aaccad1785ab017425e1ca378c395256331f9c662d04335d43f +SHA512: 8382150f1b3559945e6d0b48303f1e4581ec27b2b3cff8e7f25bc65d8c8c99d4ff399bf00ad2784541045cfb5d4ac1f6ca1832770f91bc725f480a3db27dcd62 +Homepage: http://www.mozilla.org/projects/nspr/ +Description: NetScape Portable Runtime Library + This library provides platform independent non-GUI operating system + facilities including: + * threads, + * thread synchronisation, + * normal file I/O and network I/O, + * interval timing and calendar time, + * basic memory management (malloc and free), + * shared library linking. + +Package: libnss-mdns +Architecture: amd64 +Version: 0.15.1-5 +Multi-Arch: same +Priority: optional +Section: admin +Source: nss-mdns +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 141 +Depends: libc6 (>= 2.38) +Recommends: avahi-daemon +Suggests: avahi-autoipd | zeroconf +Filename: pool/libnss-mdns_0.15.1-5_amd64.deb +Size: 24758 +MD5sum: 6562fd791c333a029584808b671383fa +SHA1: 346db2b95b40ccfa82329f1684af990d70272280 +SHA256: 96debaf57a6806101e3902c168da38d7f6f927b77bf97c83de137e4ee62c287b +SHA512: bc27c907e8a311b8aa08fc9234cbc6935c9182ff43f7e6c4f06318f2e44e7dc2b581cef301823dad865069de950c42241fc9af267ac850ccb1da8bd957aeaced +Homepage: https://github.com/lathiat/nss-mdns +Description: NSS module for Multicast DNS name resolution + nss-mdns is a plugin for the GNU Name Service Switch (NSS) functionality + of the GNU C Library (glibc) providing host name resolution via Multicast + DNS (using Zeroconf, aka Apple Bonjour / Apple Rendezvous ), effectively + allowing name resolution by common Unix/Linux programs in the ad-hoc mDNS + domain .local. + +Package: libnss-sss +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Multi-Arch: same +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 89 +Depends: libc6 (>= 2.34) +Recommends: sssd +Filename: pool/libnss-sss_2.12.0-1ubuntu5.4_amd64.deb +Size: 29978 +MD5sum: 102b16cf230d37b9c96de11bf38d0a06 +SHA1: 311f716600778d850ee3b04827a4804e4719920a +SHA256: c7fd332ba671fab74b184fbf57652125c7de1b9cdf4ad9c62d6f90dcf39d958c +SHA512: 56488d74aa6a0ef53b501bf4960a96ca21815e3b4310a6c82323ae4520b19f6a0a56d5e7d467445435e56eff2d9f669caa8db21e60de768e36f0fdf1bdb2172d +Homepage: https://github.com/SSSD/sssd +Description: Nss library for the System Security Services Daemon + Provides a set of daemons to manage access to remote directories and + authentication mechanisms. It provides an NSS and PAM interface toward + the system and a pluggable backend system to connect to multiple different + account sources. It is also the basis to provide client auditing and policy + services for projects like FreeIPA. + . + This package provide the nss library to connect to the sssd daemon. + +Package: libnss-systemd +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: same +Priority: standard +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 516 +Depends: libc6 (>= 2.39) +Recommends: libblkid1, libmount1, libselinux1 +Suggests: libcryptsetup12, libidn2-0, libp11-kit0, libtss2-esys-3.0.2-0t64, libtss2-mu-4.0.1-0t64, libtss2-rc0t64, systemd-userdbd +Filename: pool/libnss-systemd_259.5-0ubuntu3.4_amd64.deb +Size: 226508 +MD5sum: bee7643dfd6a670bf8751d1cbbca62ce +SHA1: d43ce62f2c42adb7ab4f63a53a81c5190fded947 +SHA256: 9dc03fc62f6010bb1ca252a8403e1f9848dd629756e8cd657afa6b15f35222d1 +SHA512: 0db7887dc62914a647d8697acc5e21c5f00b7696937d4ffe5dbd5302a93b5302183c0c7d83df4251cd554adf60198cae6d2c74545a8c890ff95e7e303a683415 +Homepage: https://systemd.io +Description: nss module providing dynamic user and group name resolution + nss-systemd is a plug-in module for the GNU Name Service Switch (NSS) + functionality of the GNU C Library (glibc), providing UNIX user and group name + resolution for dynamic users and groups allocated through the DynamicUser= + option in systemd unit files. See systemd.exec(5) for details on this + option. + . + Installing this package automatically adds the module to /etc/nsswitch.conf. + +Package: libnss3 +Architecture: amd64 +Version: 2:3.120-1ubuntu2.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: nss +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of Mozilla-related packages +Installed-Size: 4281 +Depends: libc6 (>= 2.34), libnspr4 (>= 2:4.34), libsqlite3-0 (>= 3.5.9) +Filename: pool/libnss3_2%3a3.120-1ubuntu2.1_amd64.deb +Size: 1515036 +MD5sum: 393e945f66ed636fa63f65de40f58d2e +SHA1: f2e91334db37225f38d7268dc3bb3422b2dd0043 +SHA256: 27ae6a8dbc2b8b750731c9098abb8750c5d584c79c5a024316d0b3c9bb50971c +SHA512: 9cae97ea1a4475cfaa53f0a7e2414fddc8a220c67d5c39833f90567f6e800ef1defd4e3cb7fed2b0545345f21c892cd7f69041a1d0001bc785cd6afcfe506155 +Homepage: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS +Description: Network Security Service libraries + This is a set of libraries designed to support cross-platform development + of security-enabled client and server applications. It can support SSLv2 + and v4, TLS, PKCS #5, #7, #11, #12, S/MIME, X.509 v3 certificates and + other security standards. + +Package: libntfs-3g89t64 +Architecture: amd64 +Version: 1:2022.10.3-5ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ntfs-3g +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 363 +Provides: libntfs-3g89 (= 1:2022.10.3-5ubuntu1.1) +Depends: libc6 (>= 2.38) +Conflicts: libntfs-3g89 (<< 1:2022.10.3-5ubuntu1.1) +Replaces: libntfs-3g89 +Filename: pool/libntfs-3g89t64_1%3a2022.10.3-5ubuntu1.1_amd64.deb +Size: 161914 +MD5sum: f63f9e39b845a2fa9222f35627c824a0 +SHA1: 928c8bd4e4aeeb0506c6643d22528917703da5ec +SHA256: 502462e2f9b33ebf6ad31788b7488b4a5f36ce1ee2670fa01f2113bf74d51382 +SHA512: d18e4c7153d71a1df715ce139f50dc5eb6e090707b12e6b5ace12bdb95acad1e1e64ba0b5eb37905c3ef6d8cb82788dddfc0cef07516bde5aa311684ce48aaae +Homepage: https://github.com/tuxera/ntfs-3g/wiki +Description: read/write NTFS driver for FUSE (runtime library) + NTFS-3G uses FUSE (Filesystem in Userspace) to provide support for the NTFS + filesystem used by Microsoft Windows. + . + This package contains the actual library. + +Package: libnvme1t64 +Architecture: amd64 +Version: 1.16.1-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libnvme +Maintainer: Ubuntu Developers +Original-Maintainer: Daniel Baumann +Installed-Size: 278 +Provides: libnvme1 (= 1.16.1-4) +Depends: libc6 (>= 2.38), libjson-c5 (>= 0.15), libkeyutils1 (>= 1.5.9), libssl3t64 (>= 3.0.0) +Suggests: nvme-cli +Breaks: libnvme1 (<< 1.16.1-4) +Replaces: libnvme1 +Filename: pool/libnvme1t64_1.16.1-4_amd64.deb +Size: 91150 +MD5sum: 1d272ab70fb51d540065ca1c5f2f71be +SHA1: b6b4213fa9a7949e8a09c8c2d075276d1e23b635 +SHA256: fd7692b19e904b1eae10a4457b1b5c5cc16ddb99334f7ce608acce138dd30ac3 +SHA512: 10c35b7043df7fc8e599a44e26c5fca6c8173d561ed1ec19a691dbb00b0f013b2ce221316f449f18d74ebe8741daba8620f9e91bfbfebe6833cf61d71547534a +Homepage: https://github.com/linux-nvme/libnvme +Description: NVMe management library (library) + NVM Express (NVMe) is a interface specification for accessing non-volatile + storage media, typically modern solid state drives (SSDs) through PCI Express + (PCIe). libnvme provides library functions for accessing and managing NVMe + devices. + . + This package contains the shared library. + +Package: liboeffis1 +Architecture: amd64 +Version: 1.5.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libei +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 48 +Depends: libc6 (>= 2.28), libsystemd0 (>= 237) +Filename: pool/liboeffis1_1.5.0-3_amd64.deb +Size: 12760 +MD5sum: 052fa98576570451f43c2357a05f367e +SHA1: 6f3f360eaed84cc41c36b05e35fc9e39920e097e +SHA256: 8c64c961da0fb331554f02c416865d7ae6d1c9499959dc4b799b693183780e34 +SHA512: fbc88eec1dd4dc5fdaf86e9a4c2d0abf02502103428b730ea916578c863be724342d23fa36625bff0fc0e384c369c4bc4d4fbc3b21ba075f7e489211185d0a2e +Homepage: https://gitlab.freedesktop.org/libinput/libei +Description: RemoteDesktop portal DBus helper library + libei is a library for Emulated Input, primarily aimed at the Wayland + stack. It provides three parts: + - EI (Emulated Input) for the client side (libei) + - EIS (Emulated Input Server) for the server side (libeis) + - oeffis for D-Bus communication with the XDG RemoteDesktop portal + . + This package provides the D-Bus XDG RemoteDesktop portal helper library. + +Package: libogg0 +Architecture: amd64 +Version: 1.3.6-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libogg +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 60 +Depends: libc6 (>= 2.14) +Filename: pool/libogg0_1.3.6-2_amd64.deb +Size: 23394 +MD5sum: 15de00fba0109cc7f6b156430dbbf70c +SHA1: 089caf241adec39508951a4d0617b1288653f246 +SHA256: 9d62d5e64a55ecfc17a7aeb00a5ca5fdf095bd68c1c397146c81867bec35c31f +SHA512: f58851034d0189ca56a7eadbf000f990190ff05fc980a604e213fba1429a1c8d08ff4db96915e0133c3b6db68039009df0bc06ee908ce5403f649fd7b5b10c5f +Homepage: https://xiph.org/ogg/ +Description: Ogg bitstream library + Libogg is a library for manipulating ogg bitstreams. It handles + both making ogg bitstreams and getting packets from ogg bitstreams. + +Package: libonig5 +Architecture: amd64 +Version: 6.9.10-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libonig +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 652 +Depends: libc6 (>= 2.14) +Filename: pool/libonig5_6.9.10-1build1_amd64.deb +Size: 174350 +MD5sum: 91e688cf8d90380e5610d4d486d13a31 +SHA1: 8b488fb76ee24e672adf14a3150ab10c44cedc47 +SHA256: 050ad79c8c02956d896407ff66fddcb24e114b307cde196a0226697cf643ef88 +SHA512: 7e6a37f2060cff7052412a34f6fe5f85c4169a389c3867c5c104e1ee7c98db501f5369ca66a000f621f9fbae6b79044a11b3170c3bd5bd8688f0c4f2c1d80e43 +Homepage: https://github.com/kkos/oniguruma +Description: regular expressions library + Oniguruma is a library for working with regular expressions. + . + Different character encoding for every regular expression object can + be specified. + +Package: libopengl0 +Architecture: amd64 +Version: 1.7.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libglvnd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 219 +Depends: libc6 (>= 2.34), libglvnd0 (= 1.7.0-3) +Filename: pool/libopengl0_1.7.0-3_amd64.deb +Size: 32780 +MD5sum: 64e9271db46c154aecd3ae72e809a1c5 +SHA1: 0d01f732a4887bcf67079ee71761a10790735141 +SHA256: ccdcf477a19c1f51c20aa7569e953dbb5bc9456b57e2d3e325f8fda2650106ca +SHA512: 9c2b53591b025c78d246cf7ce63d6da4816a1fb815dcada4f37d8d4b6a991d42eedea30ef9289346b03c6211e33b5ab0e2cc6b4b32871dc150f4a3cf13f38c77 +Homepage: https://gitlab.freedesktop.org/glvnd/libglvnd +Description: Vendor neutral GL dispatch library -- OpenGL support + This is an implementation of the vendor-neutral dispatch layer for + arbitrating OpenGL API calls between multiple vendors on a per-screen basis. + . + This package contains support for OpenGL. + +Package: libopenipmi0t64 +Architecture: amd64 +Version: 2.0.37-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: openipmi +Maintainer: Ubuntu Developers +Original-Maintainer: Noël Köthe +Installed-Size: 1741 +Provides: libopenipmi0 (= 2.0.37-1build1) +Depends: libc6 (>= 2.38), libncurses6 (>= 6), libssl3t64 (>= 3.0.0), libtinfo6 (>= 6) +Breaks: libopenipmi0 (<< 2.0.37-1build1) +Replaces: libopenipmi0 +Filename: pool/libopenipmi0t64_2.0.37-1build1_amd64.deb +Size: 509422 +MD5sum: 797116edfa2191ed3fd4343e254bed99 +SHA1: 8c522b11494b542b681ee38eacd99caa690d9a9e +SHA256: 8a4faa81c8f62cfab210048f915aa6fd765102740337efbce142493b0c01d1b5 +SHA512: 4d713523987ed12d735a540d2414f3460e14d3ad25fd09a5a920a297367600a9980d39cfb01822e7e2ca1ad626cad38a291fae8af26a660263f658e19240b6bf +Homepage: https://openipmi.sourceforge.io/ +Description: Intelligent Platform Management Interface - runtime + IPMI allows remote monitoring and remote management of devices. + . + This package contains the runtime library. + +Package: libopenjp2-7 +Architecture: amd64 +Version: 2.5.4-1ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: openjpeg2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian PhotoTools Maintainers +Installed-Size: 497 +Depends: libc6 (>= 2.38) +Filename: pool/libopenjp2-7_2.5.4-1ubuntu0.1_amd64.deb +Size: 186936 +MD5sum: 1841cf61a6fe7e180de34b3e85930f51 +SHA1: d88d8995a1e3c5bdf3c7620be971d921ac0f3a4e +SHA256: e004284779778e47573997b8994109120b5d5101e6b6c7dfa9b30b346c819845 +SHA512: 90c22e6394ec1174123ac80348f24add5b905bb31ecd5393be569ebd24d7b438d8dd3231379e51eb89c752402c393a2f1e56173a35571031df014f444da37fa5 +Homepage: https://www.openjpeg.org +Description: JPEG 2000 image compression/decompression library + OpenJPEG is a library for handling the JPEG 2000 image compression format. + JPEG 2000 is a wavelet-based image compression standard and permits progressive + transmission by pixel and resolution accuracy for progressive downloads of an + encoded image. It supports lossless and lossy compression, supports higher + compression than JPEG 1991, and has resilience to errors in the image. + . + This package contains the runtime files for openjpeg 2.x + +Package: libopus0 +Architecture: amd64 +Version: 1.6.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: opus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 4212 +Depends: libc6 (>= 2.29) +Suggests: opus-tools +Filename: pool/libopus0_1.6.1-1_amd64.deb +Size: 3563890 +MD5sum: 7fb57f8e6265a098c9d98769cc548861 +SHA1: eb85446e2defc94aef504b5f953da14e7d6111f2 +SHA256: 395f9e1bf29b804e42471e225976d69355c220bbfe469cb4ed387d36184b9bcc +SHA512: 40ae8bfdb9fe0dc2f61cae8785d92912cdef1bb3c4da3e04b3ac127231ab994b4230c4b0c08facedbd3b1d19ddf3b07d35848410665aa697f19979c2719c5330 +Homepage: http://www.opus-codec.org +Description: Opus codec runtime library + The Opus codec is designed for interactive speech and audio transmission over + the Internet. It is designed by the IETF Codec Working Group and incorporates + technology from Skype's SILK codec and Xiph.Org's CELT codec. + . + It is intended to suit a wide range of interactive audio applications, + including Voice over IP, videoconferencing, in-game chat, and even remote live + music performances. It can scale from low bit-rate narrowband speech to very + high quality stereo music. The current features are: + . + Bit-rates from 6 kb/s 510 kb/s + Sampling rates from 8 to 48 kHz + Frame sizes from 2.5 ms to 60 ms + Support for both constant bit-rate (CBR) and variable bit-rate (VBR) + Audio bandwidth from narrowband to full-band + Support for speech and music + Support for mono and stereo + Support for up to 255 channels (multistream frames) + Dynamically adjustable bitrate, audio bandwidth, and frame size + Good loss robustness and packet loss concealment (PLC) + Floating point and fixed-point implementation + . + This package provides the Opus runtime library. + +Package: liborc-0.4-0t64 +Architecture: amd64 +Version: 1:0.4.42-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: orc +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of GStreamer packages +Installed-Size: 1125 +Provides: liborc-0.4-0 (= 1:0.4.42-2) +Depends: libc6 (>= 2.38) +Breaks: liborc-0.4-0 (<< 1:0.4.42-2) +Replaces: liborc-0.4-0 +Filename: pool/liborc-0.4-0t64_1%3a0.4.42-2_amd64.deb +Size: 283098 +MD5sum: 043b26fceea0e0c5a43701844207ce78 +SHA1: 8b7efb2817770d599a8f7a6388d3bfbf1d7f1586 +SHA256: 247e3b2100d94e897398e45548beba164b90917130333d6c540a0e3403e82906 +SHA512: ae7118eccad01dbc0b250ae36beb65569c9a8c5d97d09f8b6c27a186472e01679820721a828939cbec11eb0860dfaf0e7153503a144a8f33105cc3979d4b0711 +Homepage: https://cgit.freedesktop.org/gstreamer/orc +Description: Library of Optimized Inner Loops Runtime Compiler + Orc is a library and set of tools for compiling and executing + very simple programs that operate on arrays of data. The "language" + is a generic assembly language that represents many of the features + available in SIMD architectures, including saturated addition and + subtraction, and many arithmetic operations. + . + This package contains the orc shared libraries. It is typically + installed automatically when an application or library requires it. + +Package: libpackagekit-glib2-18 +Architecture: amd64 +Version: 1.3.4-3ubuntu1.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: packagekit +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 438 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libpackagekit-glib2-18_1.3.4-3ubuntu1.2_amd64.deb +Size: 120678 +MD5sum: 3d731f5d0790be6d63169bb75a8a0aa7 +SHA1: 9d85ea82a14ed28bf5cc36429d687b1bdcff3906 +SHA256: 94ca729f07c6e4e931989756419ea47cd20949f81e6fee4038a27396bc6f65f3 +SHA512: b580553447f3ff1f3dc7c931042d373e6ad1edf49d66a5bb1a22efa6a02b43aeec12e0c7a73975ff999ba3c04df581351aafb4857ce3a1cd566dbe8df85a69cc +Homepage: https://www.freedesktop.org/software/PackageKit/ +Description: Library for accessing PackageKit using GLib + PackageKit allows performing simple software management tasks over a DBus + interface e.g. refreshing the cache, updating, installing and removing + software packages or searching for multimedia codecs and file handlers. + . + This package provides an advanced library to access PackageKit using GLib. + It makes use of only async D-Bus calls and provides high level tasks which + peform the "transaction dance". + +Package: libpam-cap +Architecture: amd64 +Version: 1:2.75-10ubuntu2 +Multi-Arch: same +Priority: optional +Section: admin +Source: libcap2 +Maintainer: Ubuntu Developers +Original-Maintainer: Christian Kastner +Installed-Size: 56 +Depends: libpam-runtime (>= 1.1.3-2~), libc6 (>= 2.33), libcap2 (>= 1:2.63), libpam0g (>= 0.99.7.1) +Breaks: libcap2-bin (<< 1:2.66-1) +Replaces: libcap2-bin (<< 1:2.66-1) +Filename: pool/libpam-cap_1%3a2.75-10ubuntu2_amd64.deb +Size: 12714 +MD5sum: 45075b2bf4535933456bae48c4c02f06 +SHA1: 570070fd688df338cd88adff6fe1ce96524b3f82 +SHA256: 2d87164ef02681074dcb868ce2c8e51b9fa440e8a3f8e3b430033c566c54cad6 +SHA512: 18568ea9280eb17b2b896e33fd569b6acbe083ceea5285de88e635d231bf4914894ec802dd02117a2b3f2fbce01ac0f722ca3f3c67031df08b629a531167564c +Homepage: https://sites.google.com/site/fullycapable/ +Description: POSIX 1003.1e capabilities (PAM module) + Libcap implements the user-space interfaces to the POSIX 1003.1e capabilities + available in Linux kernels. These capabilities are a partitioning of the all + powerful root privilege into a set of distinct privileges. + . + This package contains the PAM module for enforcing capabilities on users and + groups at PAM session start time. + +Package: libpam-fprintd +Architecture: amd64 +Version: 1.94.5-4 +Multi-Arch: same +Priority: optional +Section: admin +Source: fprintd +Maintainer: Ubuntu Developers +Original-Maintainer: FingerForce Team +Installed-Size: 58 +Depends: fprintd (= 1.94.5-4), libpam-runtime (>= 1.1.3-2~), libc6 (>= 2.38), libpam0g (>= 0.99.7.1), libsystemd0 (>= 237) +Filename: pool/libpam-fprintd_1.94.5-4_amd64.deb +Size: 13356 +MD5sum: 0ce560395398190fe25f9e8cff54f4c3 +SHA1: d1c6ce88216b4a04863212543e1c07349dc12ec8 +SHA256: eaa6a621b73815eb2b696c1860822507fc844ac01f5a53f140cbc6c9afa33403 +SHA512: 532c4785fffdc648fae9265a068ce7e3c1c220657a4415ef4dc477499f0424524f8928bd3aa7c318c26cc51d6b886af30b2a8ea154342d6d506fcae03d042f49 +Homepage: https://www.freedesktop.org/wiki/Software/fprint/fprintd +Description: PAM module for fingerprint authentication through fprintd + fprintd is a D-Bus daemon that offers libfprint functionality over the + D-Bus interprocess communication bus. By adding this daemon layer above + libfprint, various problems related to multiple applications simultaneously + competing for fingerprint readers get solved. + . + This package provides a PAM module for fingerprint-based authentication + via fprintd. + +Package: libpam-gnome-keyring +Architecture: amd64 +Version: 50.0-1 +Multi-Arch: same +Priority: optional +Section: admin +Source: gnome-keyring +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 54 +Depends: libpam-runtime (>= 1.0.1-6), libc6 (>= 2.33), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~) +Recommends: gnome-keyring +Filename: pool/libpam-gnome-keyring_50.0-1_amd64.deb +Size: 15446 +MD5sum: 8c5e3ec876b40f8486417778407bc9d5 +SHA1: 3629001e3944b5220d3cb1efb70b5339b2d875db +SHA256: 84928e07f6696e1c77bf998a826178fcd26aaaa9687b43d9d0d30efd70403ff4 +SHA512: 35307bc3883c51b159ef25f26e3d6ccb4743fa3ea7acba5879373a615a54647499ae34e404ff653860ab9cc2fbdeef17618cf8ba4a9a396823c9c19855a3b9de +Homepage: https://wiki.gnome.org/GnomeKeyring +Description: PAM module to unlock the GNOME keyring upon login + gnome-keyring is a daemon in the session, similar to ssh-agent, + and other applications can use it to store passwords and other + sensitive information. + . + This package contains a PAM module that will automatically unlock the + keyrings using your login password, making gnome-keyring usage + transparent without losing its security benefits. + . + When installed, this module will automatically be used by GDM and + gnome-screensaver to unlock your keyrings when logging in and when + unlocking the screen saver. + +Package: libpam-pwquality +Architecture: amd64 +Version: 1.4.5-5build1 +Multi-Arch: same +Priority: optional +Section: admin +Source: libpwquality +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Depends: libpam-runtime, libc6 (>= 2.4), libpam0g (>= 1.1.1), libpwquality1 (>= 1.1.0) +Filename: pool/libpam-pwquality_1.4.5-5build1_amd64.deb +Size: 11820 +MD5sum: 843a96f3effa8754a93dc2d74fee3440 +SHA1: 47f13287ae6f4e1010d78d1cc8bba045cb398dc5 +SHA256: abde1ead4ad22168ff44e26160408913960cec7219a7b5fefe9b9da2af6a22ee +SHA512: 291bb843e50a8ad77b9b67cd99bfb5b96c78e8bd9736a5818ec420ef545444dc5b24077023aaa3a1ab93217ea2526a87203951111d7a9918283b9bc7581c9a67 +Homepage: https://github.com/libpwquality/libpwquality +Description: PAM module to check password strength + libpwquality's purpose is to provide common functions for password + quality checking and also scoring them based on their apparent randomness. The + library also provides a function for generating random passwords with good + pronounceability. + . + This module can be plugged into the password stack of a given service to + provide some plug-in strength-checking for passwords. The code was originaly + based on pam_cracklib module and the module is backwards compatible with its + options. + +Package: libpam-sss +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Multi-Arch: same +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 141 +Depends: libpam-pwquality (>= 1.2.2-1), libpam-runtime (>= 1.0.1-6), libc6 (>= 2.38), libgssapi-krb5-2 (>= 1.17), libpam0g (>= 0.99.7.1) +Recommends: sssd +Filename: pool/libpam-sss_2.12.0-1ubuntu5.4_amd64.deb +Size: 49856 +MD5sum: e809a9c60a327a93825cb524199a3865 +SHA1: 2976257d6a8c87b694354f7c36aa4dc8984d9e1b +SHA256: 8069c859aa907cf46df4d12bbea11cae1a49402b9bb79cdcd1b5737e0c253fe5 +SHA512: 662e3a714b0497332bdb88bab7ee28bb955fbcccc6ff326c55cb03f0b247ff9439011782ed7ba4a40f73eb215df9795195085da99d15e8833cce6d689da19030 +Homepage: https://github.com/SSSD/sssd +Description: Pam module for the System Security Services Daemon + Provides a set of daemons to manage access to remote directories and + authentication mechanisms. It provides an NSS and PAM interface toward + the system and a pluggable backend system to connect to multiple different + account sources. It is also the basis to provide client auditing and policy + services for projects like FreeIPA. + . + This package provide the pam module to connect to the sssd daemon. + +Package: libpam-systemd +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: same +Priority: standard +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 730 +Provides: default-logind (= 259.5-0ubuntu3.4), logind (= 259.5-0ubuntu3.4) +Depends: libc6 (>= 2.39), libpam0g (>= 0.99.7.1), systemd (= 259.5-0ubuntu3.4), libpam-runtime, default-dbus-system-bus | dbus-system-bus, systemd-sysv +Recommends: dbus-user-session, libblkid1, libmount1, libselinux1 +Suggests: libcryptsetup12, libidn2-0, libp11-kit0, libtss2-esys-3.0.2-0t64, libtss2-mu-4.0.1-0t64, libtss2-rc0t64 +Conflicts: libpam-elogind-compat +Filename: pool/libpam-systemd_259.5-0ubuntu3.4_amd64.deb +Size: 273636 +MD5sum: 5c276450c2ec1a5f0a5883f02efef3c7 +SHA1: f15210eccca6f506b996fc3ca9631368e2c755fc +SHA256: f27ddf40b22f231732899e3d3fcd3a622b88666c02cd5e32690a92794ba92d38 +SHA512: ce7a4e693495e4846c3cf00af54a8a5ded9e1863d8d08132f490f6bb422e0d5d4bcbc4fc9e41df5afa08f4f52ebb745c9b9add2d850c57cd04cb5be741bc9d21 +Homepage: https://systemd.io +Description: system and service manager - PAM module + This package contains the PAM module which registers user sessions in + the systemd control group hierarchy for logind. + . + If in doubt, do install this package. + . + Packages that depend on logind functionality need to depend on libpam-systemd. + +Package: libpanel-1-1 +Architecture: amd64 +Version: 1.10.3-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpanel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 397 +Depends: libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.4), libcairo2 (>= 1.2.4), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.15), libpanel-common (>= 1.10.3-1) +Breaks: gnome-builder (<< 43~rc) +Filename: pool/libpanel-1-1_1.10.3-1_amd64.deb +Size: 124136 +MD5sum: ca6b7c4f7841a9e10d3f3b7c38fd1ebe +SHA1: 2dd7fec71d9324b4fdedf5a208205b4ce5e1219a +SHA256: c6bc7140d574db96e1ae2bb06749eca200c54ad624b33e855a1f85836b95e4f1 +SHA512: 81f85f6fe85db97ec9a08686fe59d3b98e6922415d7c5ad0ed2c86f493f2f9172be0d3538a78b15b251292d71596828bdd991d0733b3c8647909aa1dd379b714 +Homepage: https://gitlab.gnome.org/GNOME/libpanel +Description: IDE paneling library for GTK + libpanel is a collection of GTK widgets for IDE-like applications targeting + GNOME using GTK 4 and libadwaita. + +Package: libpanel-common +Architecture: all +Version: 1.10.3-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libpanel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 84 +Filename: pool/libpanel-common_1.10.3-1_all.deb +Size: 4928 +MD5sum: 371048cde09b132ed4bfd3399bdb3640 +SHA1: 726d7e2cc4a24d55d6aa2e973ae80166270d03e7 +SHA256: b69928e5c424656a0431dd51d26062f86aa6d5389ebe8a9a004e6b27f75f130e +SHA512: 14d4a08bf68a3d74f1e15f332edc9ded94a2c27b174559844ea05cf204250265c56f37ad1b1bff511e2c078339d0e5313e09c38cca5a149332fdcb76d20189e5 +Homepage: https://gitlab.gnome.org/GNOME/libpanel +Description: IDE paneling library for GTK - common files + libpanel is a collection of GTK widgets for IDE-like applications targeting + GNOME using GTK 4 and libadwaita. + . + This package contains common data files and translations. + +Package: libpango-1.0-0 +Architecture: amd64 +Version: 1.57.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pango1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 556 +Depends: fontconfig (>= 2.17.0), libc6 (>= 2.38), libfribidi0 (>= 1.0.0), libglib2.0-0t64 (>= 2.82), libharfbuzz0b (>= 11.4.5), libthai0 (>= 0.1.25) +Filename: pool/libpango-1.0-0_1.57.0-1_amd64.deb +Size: 240576 +MD5sum: 0eb202b6e4fee3c5f722fcd68ff9fe07 +SHA1: 6621d1af1332cdbbb630f0ad7c147f9c8953d908 +SHA256: 309f30a8ea77e0264a3c8b66811188f5b788fe87b33be3cafd97c8f221235591 +SHA512: c8e97821a2ce3c9956505c36ff72d83fff095f721a8815448c1773eda6117244b994ddfb8793bd664df92ab3ce88f7bfd5df45f638938dfb8acddbc7bd0a64cf +Homepage: https://www.pango.org/ +Description: Layout and rendering of internationalized text + Pango is a library for layout and rendering of text, with an emphasis + on internationalization. Pango can be used anywhere that text layout is + needed. however, most of the work on Pango-1.0 was done using the GTK+ + widget toolkit as a test platform. Pango forms the core of text and + font handling for GTK+-2.0. + . + Pango is designed to be modular; the core Pango layout can be used with + four different font backends: + - Core X windowing system fonts + - Client-side fonts on X using the Xft library + - Direct rendering of scalable fonts using the FreeType library + - Native fonts on Microsoft backends + . + This package contains the shared libraries. + +Package: libpangocairo-1.0-0 +Architecture: amd64 +Version: 1.57.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pango1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 109 +Depends: libc6 (>= 2.4), libcairo2 (>= 1.18.0), libfontconfig1 (>= 2.17.1), libglib2.0-0t64 (>= 2.82), libharfbuzz0b (>= 11.4.5), libpango-1.0-0 (= 1.57.0-1), libpangoft2-1.0-0 (= 1.57.0-1) +Filename: pool/libpangocairo-1.0-0_1.57.0-1_amd64.deb +Size: 29026 +MD5sum: 4879508bc61ea96c0ceac3b4863775bb +SHA1: 43b13c5c59d07a3413951ab91d9f596b5acf420a +SHA256: a989e666bb0d64636a10a1253c949f92a282782d79d1725e0e1acc17282909a5 +SHA512: 094a07c7bd4c32bc6aff3ce869176066f3c80b7763e19a00acd68da07d79ea935e113fb7b79543816caf6598598d515a316c8c4d9f4ca20964b9cdbf43568ce2 +Homepage: https://www.pango.org/ +Description: Layout and rendering of internationalized text + Pango is a library for layout and rendering of text, with an emphasis + on internationalization. Pango can be used anywhere that text layout is + needed. however, most of the work on Pango-1.0 was done using the GTK+ + widget toolkit as a test platform. Pango forms the core of text and + font handling for GTK+-2.0. + . + Pango is designed to be modular; the core Pango layout can be used with + four different font backends: + - Core X windowing system fonts + - Client-side fonts on X using the Xft library + - Direct rendering of scalable fonts using the FreeType library + - Native fonts on Microsoft backends + . + This package contains the shared libraries. + +Package: libpangoft2-1.0-0 +Architecture: amd64 +Version: 1.57.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pango1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 172 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.17.1), libfreetype6 (>= 2.2.1), libglib2.0-0t64 (>= 2.82), libharfbuzz0b (>= 11.4.5), libpango-1.0-0 (= 1.57.0-1) +Filename: pool/libpangoft2-1.0-0_1.57.0-1_amd64.deb +Size: 53260 +MD5sum: 79a185fcfd43657a670923f873c12a1a +SHA1: a275faeebbc783f8d93bd55dc76ecef63bcc19a5 +SHA256: c1e08ebf03feded26a42a0f07f94789e5995b402d704d2faafdc86fffda0b28b +SHA512: 6570ac2d7b2e7fb26d4d032a590ac098c7c3b09d40fa92dd64678963b1352ab8ae3e9256c9bf19828a51db6532155682f67f8ca88dcfc846c8cd958b6cd849d0 +Homepage: https://www.pango.org/ +Description: Layout and rendering of internationalized text + Pango is a library for layout and rendering of text, with an emphasis + on internationalization. Pango can be used anywhere that text layout is + needed. however, most of the work on Pango-1.0 was done using the GTK+ + widget toolkit as a test platform. Pango forms the core of text and + font handling for GTK+-2.0. + . + Pango is designed to be modular; the core Pango layout can be used with + four different font backends: + - Core X windowing system fonts + - Client-side fonts on X using the Xft library + - Direct rendering of scalable fonts using the FreeType library + - Native fonts on Microsoft backends + . + This package contains the shared libraries. + +Package: libpangoxft-1.0-0 +Architecture: amd64 +Version: 1.57.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pango1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 80 +Depends: libc6 (>= 2.4), libfontconfig1 (>= 2.17.0), libglib2.0-0t64 (>= 2.82), libpango-1.0-0 (= 1.57.0-1), libpangoft2-1.0-0 (= 1.57.0-1), libx11-6, libxft2 (>> 2.1.1), libxrender1 (>= 1:0.9.12) +Filename: pool/libpangoxft-1.0-0_1.57.0-1_amd64.deb +Size: 20562 +MD5sum: a60f6427f6868f497fcd9f8a5eaa7ed2 +SHA1: 3b0dcf3b8cd696c77e86e18be0ce4b9caf416273 +SHA256: 8d2b4be34ebc5aeeae0b92506a8a13941a47fe39e5ef4ea767981b50ac638a61 +SHA512: 9c2b291dc968bbaa5f487261646e0584590ecbfea710f44be4659aa4317d1c86396c65f20af718dfdedf5b46c53b49a4511b8c0eb2c1fd81ca5e50ebb5d6f11d +Homepage: https://www.pango.org/ +Description: Layout and rendering of internationalized text + Pango is a library for layout and rendering of text, with an emphasis + on internationalization. Pango can be used anywhere that text layout is + needed. however, most of the work on Pango-1.0 was done using the GTK+ + widget toolkit as a test platform. Pango forms the core of text and + font handling for GTK+-2.0. + . + Pango is designed to be modular; the core Pango layout can be used with + four different font backends: + - Core X windowing system fonts + - Client-side fonts on X using the Xft library + - Direct rendering of scalable fonts using the FreeType library + - Native fonts on Microsoft backends + . + This package contains the shared libraries. + +Package: libpaper-utils +Architecture: amd64 +Version: 2.2.5-0.3maysync1 +Built-Using: gnulib (= 20260109-1~exp1), libiberty (= 20260327-1) +Multi-Arch: foreign +Priority: optional +Section: utils +Source: libpaper +Maintainer: Ubuntu Developers +Original-Maintainer: Giuseppe Sacco +Installed-Size: 66 +Depends: libc6 (>= 2.38), libpaper2 (>= 2.2.5), sensible-utils +Filename: pool/libpaper-utils_2.2.5-0.3maysync1_amd64.deb +Size: 15574 +MD5sum: dd8c6055603e5b128e059353ad4b5f2e +SHA1: b2a902f48dbd35924f2cb835537cb62a0d3a2692 +SHA256: 9e6da1c4574a50a3143d2cb698d7e672f645f67715fb8fedc537fed64e8af837 +SHA512: 68555679b3f97860ccbeee0d161517c609018cb796888e17c7428b462250cb5b7ba976c71cea08ad034ef13995f1aa361909cfb056bbfa8127e2fd9d9df18c12 +Homepage: https://github.com/rrthomas/libpaper +Description: Paper sizes catalogue (utilities) + Libpaper supports paper size configuration and automates recognition of + many different paper sizes for programs that need to deal with paper. + . + This package contains the command-line utilities, which can also be used as + a convenient interface for programs written in languages that cannot + conveniently use the shared library. + +Package: libpaper2 +Architecture: amd64 +Version: 2.2.5-0.3maysync1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpaper +Maintainer: Ubuntu Developers +Original-Maintainer: Giuseppe Sacco +Installed-Size: 68 +Provides: libpaperg +Depends: libc6 (>= 2.4), debconf (>= 0.5) | debconf-2.0 +Recommends: libpaper-utils +Filename: pool/libpaper2_2.2.5-0.3maysync1_amd64.deb +Size: 17218 +MD5sum: 3c14e37ac7581e8b3a3280d759ec3b79 +SHA1: c602937dae219ea5c5605b2afdf98e375cee2c68 +SHA256: e667f3a89b8237f15f43bc837f1f6606fdf5164a7670338573a4dc16a04c0fb4 +SHA512: a2ab1311d5084ad04ff2fa119826fc7e0947030215890b82a61ecdd1123ebc4695327c0aa412e028203dafef7562d53de91c22b34604ed805009e63e2991f2dc +Homepage: https://github.com/rrthomas/libpaper +Description: Paper sizes catalogue + Libpaper supports paper size configuration and automates recognition of + many different paper sizes for programs that need to deal with paper. + . + This package contains the shared libraries. + +Package: libparted2t64 +Architecture: amd64 +Version: 3.6-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: parted +Maintainer: Ubuntu Developers +Original-Maintainer: Parted Maintainer Team +Installed-Size: 380 +Provides: libparted, libparted2 (= 3.6-6) +Depends: dmidecode, libblkid1 (>= 2.17.2), libc6 (>= 2.38), libdevmapper1.02.1 (>= 2:1.02.197), libuuid1 (>= 2.16) +Suggests: libparted-dev, libparted-i18n (= 3.6-6), parted +Conflicts: libparted2 (<< 3.6-6) +Replaces: libparted2 +Filename: pool/libparted2t64_3.6-6_amd64.deb +Size: 151996 +MD5sum: 3416deb47998237c73824624445aa468 +SHA1: c7552d781ccd59f65c6c3247d078e7b2432e8349 +SHA256: 3414de187cab783d61d5026ba53006be299429235cb32480c8099d1004e71e85 +SHA512: 7ae02b4f79a7422abf4282d7d02cbcd744a72f49039a35967b0fa49135df2979435a722e4b7b44c877c0f2ae4da24569b889eca1984888587f5730df0e8eee25 +Homepage: https://www.gnu.org/software/parted +Description: disk partition manipulator - shared library + GNU Parted is a program that allows you to create, destroy, resize, + move, and copy disk partitions. This is useful for creating space + for new operating systems, reorganizing disk usage, and copying data + to new hard disks. + . + This package contains the shared library. + +Package: libpath-utils1t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 36 +Provides: libpath-utils1 (= 0.6.2-3build1) +Depends: libc6 (>= 2.33) +Breaks: libpath-utils1 (<< 0.6.2-3build1) +Replaces: libpath-utils1 +Filename: pool/libpath-utils1t64_0.6.2-3build1_amd64.deb +Size: 8934 +MD5sum: 0fd6286f4ed010bf4e3fcc9059810f9e +SHA1: 57b5579fb5966caecba499cce4b399cbc811d03e +SHA256: 513d941185c25e2e29fed5b5b2628d160e184995c031d46d7ddd242109a55bd4 +SHA512: 79f1c20bccfca8c3d28dcbf07372408299578fafc23bf51bb3dfaff1b09bcaba180423989f12156ccf1f8f967b05d3395c00417e8ea3aa217666b39e974e8efb +Homepage: https://github.com/SSSD/ding-libs +Description: Filesystem Path Utilities + Utility functions to manipulate filesystem pathnames. + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: libpcap0.8t64 +Architecture: amd64 +Version: 1.10.6-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpcap +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Security Tools +Installed-Size: 407 +Provides: libpcap0.8 (= 1.10.6-1ubuntu1) +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libibverbs1 (>= 1.1.6) +Breaks: libpcap0.8 (<< 1.10.6-1ubuntu1) +Replaces: libpcap0.8, libpcap0.8-dev (<< 1.10.4-3) +Filename: pool/libpcap0.8t64_1.10.6-1ubuntu1_amd64.deb +Size: 160818 +MD5sum: 1a25ccfa7094b50e6cc30b987c69ef3f +SHA1: b7e4c5b16874383b54ad3362e44aa5b320326892 +SHA256: 69a466a55042ba8fe1bf738c29b01dd54edaf260c44426edbf0a08677ec29b1d +SHA512: 68b45f3a827389d71742ceee4167d54d56c6720b08d16423ed3094c0dd9866901d6d406455795c536fd5ae6d3c1ac7c3947ef5676c73fd67417fd2065568d3f0 +Homepage: https://www.tcpdump.org/ +Description: system interface for user-level packet capture + libpcap (Packet CAPture) provides a portable framework for low-level + network monitoring. Applications include network statistics collection, + security monitoring, network debugging, etc. + . + Since almost every system vendor provides a different interface for + packet capture, and since there are several tools that require this + functionality, the libpcap authors created this system-independent API + to ease in porting and to alleviate the need for several + system-dependent packet capture modules in each application. + +Package: libpcaudio0 +Architecture: amd64 +Version: 1.3-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pcaudiolib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 38 +Depends: libasound2t64 (>= 1.0.16), libc6 (>= 2.4), libpulse0 (>= 0.99.1) +Filename: pool/libpcaudio0_1.3-1build1_amd64.deb +Size: 9154 +MD5sum: d222453a816ee9e5cd9db55f95a34428 +SHA1: cd0fcc888cb2718baa31d1c0024fc71e041b2a3c +SHA256: 8b34341737d4c3ff830620413f11d9e2add1d049a47e475d4f97169a1bb2a705 +SHA512: 49d19489134a9658716a5e38f90ce256564c0cd10bbdefc0c88949fa4826d52b3624bb9612c93ec42c782ecfad53324932ffeb63abc545cc3b871b4675c37384 +Homepage: https://github.com/espeak-ng/pcaudiolib +Description: C API to different audio devices - shared library + The Portable C Audio Library (pcaudiolib) provides a C API to different audio + devices. It supports Alsa, OSS, and PulseAudio. + . + This package contains the shared library. + +Package: libpci3 +Architecture: amd64 +Version: 1:3.14.0-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: pciutils +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 117 +Depends: libc6 (>= 2.38), libudev1 (>= 196), zlib1g (>= 1:1.1.4), pci.ids (>= 0.0~2019.11.10-2) +Filename: pool/libpci3_1%3a3.14.0-1build2_amd64.deb +Size: 38064 +MD5sum: f3f5738e6bbe30550916efc861e85d83 +SHA1: f723d9a41a2fcdfb689720ccaa038f603948caeb +SHA256: a3aea5aeec6bc5d22c9d73c3c42f7c7dba5eae30e7b86f5a842e89f2ea93352c +SHA512: 8a8d64fb027b12a3caad1eb124d784f101e77676689972c547e361cfbd77ec5695a105831cc2947b42fb010fb05dcca958cc14e4c83c35e3bbcafb2f36cac5f4 +Homepage: https://mj.ucw.cz/sw/pciutils/ +Description: PCI utilities (shared library) + This package contains the libpci shared library files. + . + The libpci library provides portable access to configuration + registers of devices connected to the PCI bus. + +Package: libpciaccess0 +Architecture: amd64 +Version: 0.18.1-1ubuntu4.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpciaccess +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 60 +Depends: libc6 (>= 2.38), zlib1g (>= 1:1.2.3.4) +Suggests: pciutils +Filename: pool/libpciaccess0_0.18.1-1ubuntu4.1_amd64.deb +Size: 18980 +MD5sum: 453730e859f3cd10b5388bec036bbed1 +SHA1: 344874116666d59e068cdf122b628e4d82a72b69 +SHA256: 8733699ae9d7102a84cd10a1f0f0769b684c6ca8842035db389bb6b8310f72dd +SHA512: 2959ad6526100d3502202e7c9c68a5e3594b2e5f378ec9988f5d02b6ecb86abdb05836f3453237af2cd91d66ff7fac6f8eb656a1c861292b9a9eafe0e8e2ca0a +Description: Generic PCI access library for X + Provides functionality for X to access the PCI bus and devices + in a platform-independent way. + +Package: libpcre2-32-0 +Architecture: amd64 +Version: 10.46-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pcre2 +Maintainer: Ubuntu Developers +Original-Maintainer: Matthew Vernon +Installed-Size: 627 +Depends: libc6 (>= 2.34) +Filename: pool/libpcre2-32-0_10.46-1build1_amd64.deb +Size: 227024 +MD5sum: b50650b0aff528b3cba78ca9d77e939f +SHA1: c2b803d01f3df0828a8bfda3e17a591a60b841a9 +SHA256: a385713732a7411d39ba5c057f8e5727d0cdf3bf8afa36cbe1104c66ae2acd5b +SHA512: 3512091b873fbe1376be46c2f0c457d5e3bcc645d80022b24f38b992e9805be01798a6fd0e093445429882ef7aca0af20435113144d1f5dbf4a439b4457756e1 +Homepage: https://github.com/PCRE2Project/pcre2 +Description: New Perl Compatible Regular Expression Library - 32 bit runtime files + This is PCRE2, the new implementation of PCRE, a library of functions + to support regular expressions whose syntax and semantics are as + close as possible to those of the Perl 5 language. New projects + should use this library in preference to the older library, + confusingly called pcre3 in Debian. + . + This package contains the 32 bit runtime library, which operates on + UTF-32 input. + +Package: libpcsclite1 +Architecture: amd64 +Version: 2.4.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pcsc-lite +Maintainer: Ubuntu Developers +Original-Maintainer: Ludovic Rousseau +Installed-Size: 77 +Depends: libc6 (>= 2.38) +Suggests: pcscd (= 2.4.1-1) +Breaks: libpcsclite-dev (<< 2.4.1-1), pcscd (<< 2.4.1-1) +Filename: pool/libpcsclite1_2.4.1-1_amd64.deb +Size: 24558 +MD5sum: b39f876d39b68180f308bcfa52e84ee1 +SHA1: 3aa28e4c98bc7555cdcac6ed98d231a990fa9308 +SHA256: 9287a7219e33c52f2a647bdfbaf4b6156de843b191d69aa60d101baeb5160032 +SHA512: 3970543527c281ab8d65ac102a61596e150da52c692f6348e0672edaa87e2e56764352b01428735e0bb7340da0385438ecb7126abc8bd8777f717aa0aff6bbb4 +Homepage: https://pcsclite.apdu.fr/ +Description: Middleware to access a smart card using PC/SC (library) + The purpose of PC/SC Lite is to provide a Windows(R) SCard interface + in a very small form factor for communicating to smartcards and + readers. + . + The PC/SC Lite library is used to connect to the PC/SC daemon from + a client application and provide access to the desired reader. + +Package: libperl5.40 +Architecture: amd64 +Version: 5.40.1-7ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Niko Tyni +Installed-Size: 29327 +Depends: libbz2-1.0, libc6 (>= 2.43), libcrypt1 (>= 1:4.1.0), libdb5.3t64, libgdbm-compat4t64 (>= 1.18-3), libgdbm6t64 (>= 1.21), zlib1g (>= 1:1.2.3.4), perl-modules-5.40 (>= 5.40.1-7ubuntu0.3) +Suggests: sensible-utils +Breaks: libcompress-raw-bzip2-perl (<< 2.212), libcompress-raw-zlib-perl (<< 2.212), libcompress-zlib-perl (<< 2.212), libdigest-md5-perl (<< 2.58.01), libdigest-sha-perl (<< 6.04), libencode-perl (<< 3.21), libfilter-perl (<< 1.64), libio-compress-base-perl (<< 2.212), libio-compress-bzip2-perl (<< 2.212), libio-compress-perl (<< 2.212), libio-compress-zlib-perl (<< 2.212), libmime-base64-perl (<< 3.16.01), libstorable-perl (<< 3.32), libsys-syslog-perl (<< 0.36), libthreads-perl (<< 2.40), libthreads-shared-perl (<< 1.69), libtime-hires-perl (<< 1.9777), libtime-piece-perl (<< 1.3401.01) +Replaces: libarchive-tar-perl (<= 1.38-2), libcompress-raw-bzip2-perl (<< 2.212), libcompress-raw-zlib-perl (<< 2.212), libcompress-zlib-perl (<< 2.212), libdigest-md5-perl (<< 2.58.01), libdigest-sha-perl (<< 6.04), libencode-perl (<< 3.21), libio-compress-base-perl (<< 2.212), libio-compress-bzip2-perl (<< 2.212), libio-compress-perl (<< 2.212), libio-compress-zlib-perl (<< 2.212), libmime-base64-perl (<< 3.16.01), libmodule-corelist-perl (<< 2.14-2), libstorable-perl (<< 3.32), libsys-syslog-perl (<< 0.36), libthreads-perl (<< 2.40), libthreads-shared-perl (<< 1.69), libtime-hires-perl (<< 1.9777), libtime-piece-perl (<< 1.3401.01), perl (<< 5.22.0~), perl-base (<< 5.22.0~) +Filename: pool/libperl5.40_5.40.1-7ubuntu0.3_amd64.deb +Size: 4888904 +MD5sum: 1cbc2accf2c54b8cb2f6e6cb72fc94f9 +SHA1: 02cc026cfa0d39b7553c89b7bdaed4fa8f6c5642 +SHA256: cf480ce25c4dc859e48619df013f820f7259f02f93397cf9975de548fd356bce +SHA512: 4e05bb3042cfde19f3583a7e34f148cf2bb5ab139589f091f4f25aa4349d499ba929ab5e0d5e13737af42ed041f21db538a553cc71cb65bb647fd0d345674f79 +Homepage: https://dev.perl.org/perl5/ +Description: shared Perl library + This package contains the shared Perl library, used by applications + which embed a Perl interpreter. + . + It also contains the architecture-dependent parts of the standard + library (and depends on perl-modules-5.40 which contains the + architecture-independent parts). + +Package: libphonenumber8 +Architecture: amd64 +Version: 8.13.51+ds-5 +Multi-Arch: same +Priority: optional +Section: libs +Source: libphonenumber +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Java Maintainers +Installed-Size: 1194 +Provides: libphonenumber8-protobuf32, libphonenumber8t64-protobuf32 +Depends: libabsl20260107 (>= 20260107.0-0~), libc6 (>= 2.34), libgcc-s1 (>= 3.0), libicu78 (>= 78.1-1~), libprotobuf32t64 (>= 3.21.12), libstdc++6 (>= 13.1) +Filename: pool/libphonenumber8_8.13.51+ds-5_amd64.deb +Size: 270364 +MD5sum: ce30fdd54057a5be0b094433867639ed +SHA1: dcdba52d89dd4d2ad5ccae93adfe3931171fb7b0 +SHA256: 38fca71dff6d653431d78444489b29f47471a989fac8c509417aca65da94a398 +SHA512: e7476e0e4fa353d23d14c9092540196756f8dd80eaa3a5c086bcde2adccbb184c63d07d4b342afd7bac8919a5b14d499ff6f5f2d4ea4e30c7a3757251578b15e +Homepage: https://github.com/googlei18n/libphonenumber/ +Description: parsing/formatting/validating phone numbers + Google's common C++ and Java library for parsing, formatting, storing and + validating international phone numbers. + . + This package contains the runtime libraries for C++ users. + +Package: libpipeline1 +Architecture: amd64 +Version: 1.5.8-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpipeline +Maintainer: Colin Watson +Installed-Size: 88 +Depends: libc6 (>= 2.32) +Filename: pool/libpipeline1_1.5.8-2_amd64.deb +Size: 31428 +MD5sum: 5efdab085b4987fedb24d3cdb8b36b73 +SHA1: bac6a99bccb3a7cf76006740c6f863fdec501369 +SHA256: e1502fe2af97a4e832fe076bef1e60851ec48da841e3e580674293552630df35 +SHA512: 9d0e5f63946d482090f8ffb0881ddcd1ecaa5c6806540011660153a31b627c09173ab24785d352f7dea8f45a9c5b15f9d3fa35419f0a8f8b9d18a9377389c7e8 +Homepage: https://libpipeline.gitlab.io/libpipeline/ +Description: Unix process pipeline manipulation library + This is a C library for setting up and running pipelines of processes, + without needing to involve shell command-line parsing which is often + error-prone and insecure. + +Package: libpipewire-0.3-0t64 +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 951 +Provides: libpipewire-0.3-0 (= 1.6.2-1ubuntu1.1) +Depends: libspa-0.2-modules (= 1.6.2-1ubuntu1.1), libc6 (>= 2.38) +Recommends: libpipewire-0.3-common +Suggests: pipewire (= 1.6.2-1ubuntu1.1) +Breaks: libpipewire-0.3-0 (<< 1.6.2-1ubuntu1.1) +Replaces: libpipewire-0.3-0 +Filename: pool/libpipewire-0.3-0t64_1.6.2-1ubuntu1.1_amd64.deb +Size: 300886 +MD5sum: 8dea6a09b63c5e6582c9abf3a4e2e28f +SHA1: fe051fa11870b6b362b7f2fd83a07c892ddd9ee6 +SHA256: dd242fed45d140f6b619b3b4a3b9938db7fda94acbe54e4bd93294832c2b10a6 +SHA512: b490b2a622fc83cf468a55f17668de9cb901955d3b6e72703cfa127173625fe9abb141edc5a42dc7ee6240932bc9573fb5a4c0e4258b74e6f5f68013da992fdf +Homepage: https://pipewire.org/ +Description: libraries for the PipeWire multimedia server + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + +Package: libpipewire-0.3-common +Architecture: all +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 52 +Filename: pool/libpipewire-0.3-common_1.6.2-1ubuntu1.1_all.deb +Size: 12074 +MD5sum: e76670b9cc38fb4e0f318f4189b9ed3a +SHA1: a42e03d365be074fc85277bd9075a7b5433073ec +SHA256: 886d0def069dcfef7885205faa46f431b68937480092ebd51d991948731121b0 +SHA512: 2a32a9b4fdf0d425053ed4257be1492fc5896303246010489e8a0c04125ac3a085fb5510c242f061caa8cf73664e55fa09e816ae02ede3cb406b55118d3bc34a +Homepage: https://pipewire.org/ +Description: libraries for the PipeWire multimedia server - common files + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package is needed for the runtime libraries to display messages in + languages other than English. + +Package: libpipewire-0.3-modules +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 4222 +Depends: libapparmor1 (>= 2.7.0~beta1+bzr1772), libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.76.0), libopus0 (>= 1.3.1-2~), libpipewire-0.3-0t64 (= 1.6.2-1ubuntu1.1), libpulse0 (>= 0.99.1), libroc0.4 (>= 0.4.0), libselinux1 (>= 3.1~), libsnapd-glib-2-1 (>= 1.59), libssl3t64 (>= 3.0.0) +Suggests: libpipewire-0.3-modules-extra (>= 1.4.5-1ubuntu2) +Breaks: pipewire (<< 0.3.5) +Replaces: pipewire (<< 0.3.5) +Filename: pool/libpipewire-0.3-modules_1.6.2-1ubuntu1.1_amd64.deb +Size: 881816 +MD5sum: 8bb7649b920bf5b1e9a27671d083190b +SHA1: 21da504f2ecb4e45a925b8fd3a2dd4aba3a25f20 +SHA256: bd560a213d2613eb924eab1b5bf0bf878ef40e96b19c551269d0f7c96e539cef +SHA512: 041767761318d9bfe9dd40826912a9cc8a61cc8d77d0bf94b0e9086dc2d5e48fbf3795f3b59b5d80c2186273c2d1857797536bbdc26e423c2e953f58beb59d7e +Homepage: https://pipewire.org/ +Description: libraries for the PipeWire multimedia server - modules + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains modules used by the PipeWire server and by clients, + and should not normally be depended on directly. PipeWire clients should + depend on the pipewire package instead. + +Package: libpixman-1-0 +Architecture: amd64 +Version: 0.46.4-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pixman +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 757 +Depends: libc6 (>= 2.29) +Filename: pool/libpixman-1-0_0.46.4-1_amd64.deb +Size: 287322 +MD5sum: 1401cc15bfe49cc785a85f22cb3b22d6 +SHA1: 9ef4ce784867d2e350897d00f1ed69f35c1b2c1c +SHA256: 55a274db32d4824a1f1a48c42e959fe4293a4e4b545d400d89949cfabe160cc3 +SHA512: 8d7e415170528dd9c2dd1157e805e60bcbad429190ea8cc707108079bfa8776c2250297cf29a113ef1673242f7ce0f8867413c2dad3d9720d8c9be43f57d41d5 +Homepage: http://pixman.org/ +Description: pixel-manipulation library for X and cairo + A library for manipulating pixel regions -- a set of Y-X banded + rectangles, image compositing using the Porter/Duff model + and implicit mask generation for geometric primitives including + trapezoids, triangles, and rectangles. + +Package: libpkcs11-helper1t64 +Architecture: amd64 +Version: 1.31.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pkcs11-helper +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenSC Maintainers +Installed-Size: 159 +Provides: libpkcs11-helper1 (= 1.31.0-1) +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.0.0) +Breaks: libpkcs11-helper1 (<< 1.31.0-1) +Replaces: libpkcs11-helper1 +Filename: pool/libpkcs11-helper1t64_1.31.0-1_amd64.deb +Size: 51176 +MD5sum: 555b9f7590e967457a1e74292216aa16 +SHA1: be215d7e5599b5de16b4cc5178c6c827a71ffcdc +SHA256: 93b7050b8103ee665465929bab0e19c7d9cb845a376ef5880e6e355bf025dd6b +SHA512: 62cfd1fea0bf768b03af6801b767a35df6d771d2ae94f60ab0ae9d30e6ccd884b60541a489e87b7781b159e133797db993fcd4c61efe28206103e227d9baf072 +Homepage: https://github.com/OpenSC/pkcs11-helper +Description: library that simplifies the interaction with PKCS#11 + libpkcs11-helper is a library that simplifies the interaction with PKCS#11 + providers for end-user applications. + . + libpkcs11-helper allows using multiple PKCS#11 providers at the same time, + enumerating available token certificates, or selecting a certificate + directly by serialized id, handling card removal and card insert + events, handling card re-insert to a different slot, supporting session + expiration and much more all using a simple API. + . + libpkcs11-helper is not designed to manage card content, since object + attributes are usually vendor specific, and 99% of application need to + access existing objects in order to perform signature and decryption. + +Package: libplist-2.0-4 +Architecture: amd64 +Version: 2.7.0+git20250820-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libplist +Maintainer: Ubuntu Developers +Original-Maintainer: gtkpod Maintainers +Installed-Size: 128 +Depends: libc6 (>= 2.38) +Filename: pool/libplist-2.0-4_2.7.0+git20250820-1build1_amd64.deb +Size: 51138 +MD5sum: 4732cb41d46c0f32b00747354aaa51e9 +SHA1: 87cf6110d90a4d2f3b1791ed08a9ef05e87a1ea9 +SHA256: 04eb26d40bbb9cee682e6f51a25a1b311351b4c30722b8174acd67d4144bce47 +SHA512: 31575cc6e605891dbc2994731698a5959685083f17edaece6857ea80372884cc5293153a70fe2ebb285e22c40c61ff1b3d3671feafe16b1ad49f7d9ea34ace29 +Homepage: https://www.libimobiledevice.org/ +Description: Library for handling Apple binary and XML property lists + libplist is a library for reading and writing the Apple binary and XML + property lists format. It's part of the libimobiledevice stack, providing + access to iDevices (iPod, iPhone, iPad ...). + +Package: libplymouth5 +Architecture: amd64 +Version: 24.004.60+git20250831.4a3c171d-0ubuntu8 +Multi-Arch: same +Priority: optional +Section: libs +Source: plymouth +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 482 +Depends: libc6 (>= 2.38), libevdev2 (>= 0.9.1), libpng16-16t64 (>= 1.6.46), libudev1 (>= 183), libxkbcommon0 (>= 0.5.0) +Breaks: plymouth (<< 0.9.2-1~) +Replaces: plymouth (<< 0.9.2-1~) +Filename: pool/libplymouth5_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +Size: 137016 +MD5sum: e70779e2888548a8b35aa4090871bde1 +SHA1: 9d8e8c3101d8a04af6da5f442fe506512c010c17 +SHA256: 11d0fd3a398f5bbc024503dee70fe160a1fc2bdcd4d8732e99dbbed847406fe2 +SHA512: ed23171a9324db2a0aac76079c7bf11c41834029d1e052a8303d04c372866d6af9b5bb7181ec31e6487f1ec889fc688d91a63f715eeb9093b4462a6378919347 +Homepage: https://www.freedesktop.org/wiki/Software/Plymouth +Description: graphical boot animation and logger - shared libraries + Plymouth is an application that runs very early in the boot process + (even before the root filesystem is mounted!) that provides a graphical + boot animation while the boot process happens in the background. + . + This package contains the shared libraries. + +Package: libpng16-16t64 +Architecture: amd64 +Version: 1.6.57-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpng1.6 +Maintainer: Ubuntu Developers +Original-Maintainer: Maintainers of libpng1.6 packages +Installed-Size: 346 +Provides: libpng16-16 (= 1.6.57-1) +Depends: libc6 (>= 2.29), zlib1g (>= 1:1.2.3.4) +Breaks: libpng16-16 (<< 1.6.57-1) +Replaces: libpng16-16 +Filename: pool/libpng16-16t64_1.6.57-1_amd64.deb +Size: 194194 +MD5sum: ebd065a8fa0ac417920636353276e8f4 +SHA1: bac0ca01d37beffc4b9b41e6f9619972eadd41ff +SHA256: e3af297b2131aea35eab7e2751b4158ec7ae4ffb6d746043199f766fc727744f +SHA512: 786393102af35b53181af6403b81106255cb37bdf751c8985f8fcee09f892981df2ef4dacbf4d14b88e92cf35bbca9ca357a287da6ffbba7e316160fda94e67d +Homepage: http://libpng.org/pub/png/libpng.html +Description: PNG library - runtime (version 1.6) + libpng is a library implementing an interface for reading and writing + PNG (Portable Network Graphics) format files. + . + This package contains the runtime library files needed to run software + using libpng. + +Package: libpolkit-agent-1-0 +Architecture: amd64 +Version: 127-2ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: policykit-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 70 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.38.0), libpolkit-gobject-1-0 (= 127-2ubuntu1.1) +Filename: pool/libpolkit-agent-1-0_127-2ubuntu1.1_amd64.deb +Size: 18064 +MD5sum: 1d53e6d366d7c2246cbc001619c84966 +SHA1: 13fa962abcddb830262379170761133ea7890e78 +SHA256: d8f87b9a1f0dc475d94bff1aa743df1ee172b161657e461e7d1c3382fe50d3ff +SHA512: 6fbee76fac4a4147728bbb0bd6808cd288bd0ce9e4312a798485befb8f3fb8152b7b2987ae5cd45cfd181c4cd64a84721e457f4e9b0d416bd3d2fede0cd583f6 +Homepage: https://github.com/polkit-org/polkit/ +Description: polkit Authentication Agent API + polkit is a toolkit for defining and handling the policy that + allows unprivileged processes to speak to privileged processes. + It was previously named PolicyKit. + . + This package contains a library for accessing the authentication agent. + +Package: libpolkit-gobject-1-0 +Architecture: amd64 +Version: 127-2ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: policykit-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 161 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.38.0), libsystemd0 (>= 213) +Filename: pool/libpolkit-gobject-1-0_127-2ubuntu1.1_amd64.deb +Size: 45786 +MD5sum: d5c7c5ebb22f609f3b891b123630ef69 +SHA1: e8b6e8b62fb75f7e1ad92dece7e262eb29b3e503 +SHA256: 4bf5528ff1273d4ce6b1f523a3aa0ce05af485a37d78daccb75cc29f1a2cfd0d +SHA512: 100aebe19cf748ec50a3241ddb02a06431f4c9843a147d698ffb11415d8d7efedff44000d98ccd93dca3b43f716611b6824ef72a4cf765ff56c39752ea0843be +Homepage: https://github.com/polkit-org/polkit/ +Description: polkit Authorization API + polkit is a toolkit for defining and handling the policy that + allows unprivileged processes to speak to privileged processes. + It was previously named PolicyKit. + . + This package contains a library for accessing polkit. + +Package: libpoppler-cpp3 +Architecture: amd64 +Version: 26.01.0-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: poppler +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 135 +Depends: libpoppler156 (= 26.01.0-2ubuntu0.1), libc6 (>= 2.14), libstdc++6 (>= 13.1) +Filename: pool/libpoppler-cpp3_26.01.0-2ubuntu0.1_amd64.deb +Size: 42194 +MD5sum: f31f1ea31e444fb307acf3eaaccfc14e +SHA1: db685702ba5261bb9a3df54bb8472512362715ae +SHA256: 94b4727e767f4434f394bc8c48bec48eed44ff6e8c6e52aaef085d637b135ace +SHA512: e44cc95abed8d4e00c3b69e9faf19f52aa0d96d5ceb57183d49a4b3879dba918641888f195045c756c2899a083abc5121c09ed84d68b51e14d3b04e4a841226c +Homepage: https://poppler.freedesktop.org/ +Description: PDF rendering library (CPP shared library) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package provides the CPP shared library for applications + using a simple C++ interface (using STL, and no other dependency) to Poppler. + +Package: libpoppler-glib8t64 +Architecture: amd64 +Version: 26.01.0-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: poppler +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 583 +Provides: libpoppler-glib8 (= 26.01.0-2ubuntu0.1) +Depends: libpoppler156 (= 26.01.0-2ubuntu0.1), libc6 (>= 2.34), libcairo2 (>= 1.17.8), libfreetype6 (>= 2.2.1), libglib2.0-0t64 (>= 2.80.0), libstdc++6 (>= 13) +Breaks: libpoppler-glib8 (<< 24.02.0-3~) +Replaces: libpoppler-glib8 (<< 24.02.0-3~) +Filename: pool/libpoppler-glib8t64_26.01.0-2ubuntu0.1_amd64.deb +Size: 167834 +MD5sum: 7cbe50beb1ba0e5313ca0f2ed5972d47 +SHA1: 1abe30e40add0d6a17fe26a47d9e542ba0178401 +SHA256: 07d4b1cea48c34e5480b029151d200a64ec1a21d41275eb54aa19b64372d8afa +SHA512: ca214c24ceb2eb0ddc707bdeddc4aa21b6473504df6af0e757f62cf7474deea18a81817078921ac4f5a57959f51df883c6aab4bbc64c772a87ebd1523e0829d7 +Homepage: https://poppler.freedesktop.org/ +Description: PDF rendering library (GLib-based shared library) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package provides the GLib-based shared library for applications + using the GLib interface to Poppler. + +Package: libpoppler156 +Architecture: amd64 +Version: 26.01.0-2ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: poppler +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 3980 +Depends: libc6 (>= 2.38), libcurl3t64-gnutls (>= 7.16.2), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), libgpgmepp7 (>= 2.0.0), libjpeg8 (>= 8c), liblcms2-2 (>= 2.2+git20110628), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.16), libopenjp2-7 (>= 2.0.0), libpng16-16t64 (>= 1.6.46), libstdc++6 (>= 13.1), libtiff6 (>= 4.0.3), zlib1g (>= 1:1.1.4) +Recommends: poppler-data +Suggests: gpgsm (>= 2.2.42) +Filename: pool/libpoppler156_26.01.0-2ubuntu0.1_amd64.deb +Size: 1238410 +MD5sum: bfebd6086bc6a9925e832e089da995fa +SHA1: 56f153d18d4a293b458e50b2f42701bbd75030c1 +SHA256: 8f9b381982deed672786b89d97473ad33e0a8d4f3dc44c6c8f6653b69030ca94 +SHA512: 89d6b67a67d0f183ae45a12b50f65d9f0c0597f5035089230eef7e74da5fbe470d3d495403851cc3f64307e5adb4f004c91023d22b09861d6207bcf5f9472ea5 +Homepage: https://poppler.freedesktop.org/ +Description: PDF rendering library + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the shared core library. + +Package: libpopt0 +Architecture: amd64 +Version: 1.19+dfsg-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: popt +Maintainer: Ubuntu Developers +Original-Maintainer: Håvard F. Aasen +Installed-Size: 124 +Depends: libc6 (>= 2.38) +Filename: pool/libpopt0_1.19+dfsg-2build1_amd64.deb +Size: 29376 +MD5sum: c0f2ba6f17a59f5c112af1b7cccac906 +SHA1: 38240891f13ac412f86e72d91b885e5b09e1191b +SHA256: ae57295d9a5d1551b866824c766a279f675172a05dd8d759fcdd52da3c3ac28f +SHA512: adda93ee4a8912751d1ed89a00c7ddfb9ba614afaad349d3f89bf52cc4b58ba235a0d3a563a02a04af2ebf21f580f21b6f4ef3db6ccb584752c325592678f7cd +Homepage: https://github.com/rpm-software-management/popt +Description: lib for parsing cmdline parameters + Popt was heavily influenced by the getopt() and getopt_long() functions, + but it allows more powerful argument expansion. It can parse arbitrary + argv[] style arrays and automatically set variables based on command + line arguments. It also allows command line arguments to be aliased via + configuration files and includes utility functions for parsing arbitrary + strings into argv[] arrays using shell-like rules. + . + This package contains the runtime library and locale data. + +Package: libportal-gtk4-1 +Architecture: amd64 +Version: 0.9.1-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libportal +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 57 +Depends: libglib2.0-0t64 (>= 2.72), libgtk-4-1 (>= 4.12.0) +Filename: pool/libportal-gtk4-1_0.9.1-2build1_amd64.deb +Size: 12614 +MD5sum: 6f7cb3a171d9bb23600b2dbeaf131403 +SHA1: c02382c2bd03b843632307abb390ba93523809cd +SHA256: c2ab5f601d83093d996485b0c2adceb71fb6d04ea2a142b514bc5d27ba8ab70e +SHA512: 9a3ac1ce21196da785b7d148b376af50f64150b804d512ef89a8c0805b7d4e69071aa307cd78ee2121a1384ba9da909c7302ff661edc815216a81b1361a5d27c +Homepage: https://github.com/flatpak/libportal +Description: Flatpak portal library for GTK 4 GUIs + libportal provides GIO-style C APIs for most Flatpak portals' D-Bus + interfaces. It is primarily intended for installation in Flatpak runtimes, + where applications can use it to interact with portals; it can also be + used to test the portal services. + . + See the xdg-desktop-portal package's description for more information + about portals. + . + This package contains the shared library for integration with GTK 4. + +Package: libportal1 +Architecture: amd64 +Version: 0.9.1-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libportal +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 200 +Depends: libc6 (>= 2.27), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/libportal1_0.9.1-2build1_amd64.deb +Size: 58488 +MD5sum: 8c595cea1fad81d59da6f7e35571878a +SHA1: cf50287e519f01d5d66738022911b761380a097f +SHA256: 5fa20cfdb5bad67edd498b237c9f8a40f73387611768e5a56a1c99b152b743df +SHA512: b07521f3fd601e55447b9dec3ce488b62c298edc36e5f5443126fbc54f31e88060ee07b8ea2f47635136124d5ae54f2847f62ca50aad6469fa7b77d80c3225e4 +Homepage: https://github.com/flatpak/libportal +Description: Flatpak portal library - non-GUI part + libportal provides GIO-style C APIs for most Flatpak portals' D-Bus + interfaces. It is primarily intended for installation in Flatpak runtimes, + where applications can use it to interact with portals; it can also be + used to test the portal services. + . + See the xdg-desktop-portal package's description for more information + about portals. + . + This package contains the shared library for non-GUI-specific use of + portals. + +Package: libppd2 +Architecture: amd64 +Version: 2:2.1.1-0ubuntu2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libppd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 654 +Depends: libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libcupsfilters2t64 (>= 2.0~b4-0ubuntu1), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5), zlib1g (>= 1:1.1.4), libppd2-common (>= 2:2.1.1-0ubuntu2) +Filename: pool/libppd2_2%3a2.1.1-0ubuntu2_amd64.deb +Size: 253560 +MD5sum: ba941ed777f08402bdba1506a5779525 +SHA1: 8c7bbdb97291fa36bb7c06ea629d1bba64d17194 +SHA256: 0d8a70f3366515f2d7812440c7e5b1b3af232604cd2a3e981ebea51df0537aed +SHA512: 11870320f6a7558d309857e232d671238563f41bc42630e34ca242cdcf03fbd338b08d5d87aa371df0683f4a47ebf2987789f0b658efcbd8a30cddfe7bb3fdab +Homepage: http://www.openprinting.org/ +Description: OpenPrinting libppd - Shared library + This library contains everything needed to support PPD (PostScript + Printer Description) files, reading and parsing, handling collections + of PPD files, building PPD files from printer IPP attributes and from + *.drv files. + . + It contains the full PPD file and PostScript output functionality of + CUPS 2.x (libcups, ppdc) and cups-filters 1.x, so that the functionality + stays available for retro-fitting classic CUPS drivers after switching + to CUPS 3.x which has all PPD file support removed. + . + This package contains the library itself. + +Package: libppd2-common +Architecture: all +Version: 2:2.1.1-0ubuntu2 +Priority: optional +Section: libs +Source: libppd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 34 +Recommends: libppd2 (>= 2:2.1.1-0ubuntu2) +Breaks: ppdc (<< 2:2.0~b4~) +Replaces: ppdc (<< 2:2.0~b4~) +Filename: pool/libppd2-common_2%3a2.1.1-0ubuntu2_all.deb +Size: 9346 +MD5sum: 2bf9c5760056a490dcb6d4c78df12244 +SHA1: 64e865f35e2b00f3878474de0a6ce9dbe9ca170a +SHA256: f9b615c53f02d0ff78373a6456fc40db0679d0db6572e254b1d96cdddbaa8330 +SHA512: 0182d6fad2731bfd729445e409a23af67dc130c0eb3447fa5647b4067fa4ae24a2d8032a1afe87769b43f03b35b397880d52161e99bc84ec7c099c3e06b4df22 +Homepage: http://www.openprinting.org/ +Description: OpenPrinting libppd - Auxiliary files + This library contains everything needed to support PPD (PostScript + Printer Description) files, reading and parsing, handling collections + of PPD files, building PPD files from printer IPP attributes and from + *.drv files. + . + It contains the full PPD file and PostScript output functionality of + CUPS 2.x (libcups, ppdc) and cups-filters 1.x, so that the functionality + stays available for retro-fitting classic CUPS drivers after switching + to CUPS 3.x which has all PPD file support removed. + . + This package contains system-architecture-independent auxiliary files for + the library, needed for generating PPD files from *.drv files. + +Package: libppsdocument-4.0-6 +Architecture: amd64 +Version: 50.2-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: papers +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 607 +Depends: libarchive13t64 (>= 3.6.0), libc6 (>= 2.38), libcairo2 (>= 1.14.0), libdjvulibre21 (>= 3.5.29), libexempi8 (>= 2.5.0), libgdk-pixbuf-2.0-0 (>= 2.40), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.17.1), libpango-1.0-0 (>= 1.50.3), libpoppler-glib8t64 (>= 26.01.0), libtiff6 (>= 4.0.3) +Filename: pool/libppsdocument-4.0-6_50.2-0ubuntu0.1_amd64.deb +Size: 161264 +MD5sum: cbc427d8ade02609103053586f55cbc1 +SHA1: a7aa6bf35ee0b01fb235fe909afed09fb0600e16 +SHA256: fda85bb65a3b944a8769c9357e9d2300982b03873fc44bd6e6c18d5c60b09acb +SHA512: 6d926fa2b0b7035775df47d2a4694566cbb00be5ea6f577dd3119f664df221d851cd1abd765a27f43058687aae46c675eec94d954a0484adcfc7a44d18dfc113 +Homepage: https://apps.gnome.org/Papers/ +Description: Document (Comic Books, DjVu, PDF) rendering library + This package contains libppsdocument, which performs the rendering of the + documents. + . + It ships with a pdf, tiff, djvu, and comics backend. + +Package: libppsview-4.0-5 +Architecture: amd64 +Version: 50.2-0ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: papers +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 541 +Depends: libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.38), libcairo2 (>= 1.14.0), libgdk-pixbuf-2.0-0 (>= 2.40), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.17.1), libgtksourceview-5-0 (>= 2.91.4), libpango-1.0-0 (>= 1.14.0), libppsdocument-4.0-6 (>= 50~beta), libspelling-1-2 (>= 0.2.0) +Filename: pool/libppsview-4.0-5_50.2-0ubuntu0.1_amd64.deb +Size: 179320 +MD5sum: 38436f4a1e4bf2d4eb28f7dc54527cd7 +SHA1: cfb79acc36491c36ca8092f2a224b15559604d73 +SHA256: e3899ca62698b84560ec26a4df5f85058063abf9c9c8442043bc7ceeb57be2c1 +SHA512: d84f5611a60753a832b03a925a051ad303361e68e2f7ec3f8a19f71290f3bacce20f43d87706803cdc05e2708e165c5995ba493d9f388245fa5f074bc0282de3 +Homepage: https://apps.gnome.org/Papers/ +Description: Document (Comic Books, DjVu, PDF) rendering library - GTK widgets + This package contains libppsview, which provides GTK widgets for displaying + documents. + +Package: libprotobuf32t64 +Architecture: amd64 +Version: 3.21.12-15ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: protobuf +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 3107 +Provides: libprotobuf32 (= 3.21.12-15ubuntu1) +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 14), zlib1g (>= 1:1.1.4) +Breaks: cura-engine (<< 1:3.3.0-2.1+b1), libarcus3 (<< 3.3.0-2), libprotobuf32 (<< 3.21.12-15ubuntu1) +Replaces: libprotobuf32 +Filename: pool/libprotobuf32t64_3.21.12-15ubuntu1_amd64.deb +Size: 955360 +MD5sum: b4780560925a772c44d837a1e51cbeb6 +SHA1: 9f070bb657305637381f50716094186441e000d2 +SHA256: adab0eb28161aea2101e33d8b4c8a336ad62c34c70e01bd3d7c1026279ca5757 +SHA512: 487bfc1d8615c27aae92f6214e231f6933d5b749155937c56f003d1bf8f7c584245d57afbf322f5fa4ce58c453cbf4163f750fb7a487f714cbf360fddfc66717 +Homepage: https://github.com/google/protobuf/ +Description: protocol buffers C++ library + Protocol buffers are a flexible, efficient, automated mechanism for + serializing structured data - similar to XML, but smaller, faster, and + simpler. You define how you want your data to be structured once, then you can + use special generated source code to easily write and read your structured + data to and from a variety of data streams and using a variety of languages. + You can even update your data structure without breaking deployed programs + that are compiled against the "old" format. + . + Google uses Protocol Buffers for almost all of its internal RPC protocols and + file formats. + . + This package contains the runtime library needed for C++ applications. + +Package: libproxy1v5 +Architecture: amd64 +Version: 0.5.12-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libproxy +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 101 +Depends: libc6 (>= 2.4), libcurl3t64-gnutls (>= 7.16.2), libduktape207 (>= 2.0.3), libglib2.0-0t64 (>= 2.80.0) +Conflicts: libproxy1 +Replaces: libproxy1 +Filename: pool/libproxy1v5_0.5.12-1_amd64.deb +Size: 28344 +MD5sum: 9bef9d8d77206644500f753761b620f4 +SHA1: 28964fb9f7c17a2084fc72c0e2ff2b5e6fb6abe4 +SHA256: 2ad0a703309adfdf14477543fae4f5b7dc7e32f8f7cd17d87c40be9161997239 +SHA512: ff29cad9a71a025ae436bc9f084e5d6f93f0b4d0c25a027ab79280d21c7631e3f567cd9e3d126f9e5b534fe7ed60d6917f4cd4e12761cc1481794fc39fe0166a +Homepage: https://libproxy.github.io/libproxy/ +Description: automatic proxy configuration management library (shared) + libproxy is a lightweight library which makes it easy to develop + applications proxy-aware with a simple and stable API. + . + This package contains the shared library. + +Package: libpulse-mainloop-glib0 +Architecture: amd64 +Version: 1:17.0+dfsg1-2ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: pulseaudio +Maintainer: Ubuntu Developers +Original-Maintainer: Pulseaudio maintenance team +Installed-Size: 75 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.28.0), libpulse0 (= 1:17.0+dfsg1-2ubuntu4) +Filename: pool/libpulse-mainloop-glib0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb +Size: 12560 +MD5sum: 1da8d2f09520c200315106c1c7b4a014 +SHA1: c5208a58a08115e2d16213c189b077641baacf71 +SHA256: 0c67401bf812a8584fef22ee87a1906f219c3a05d18d48300e39e528eaad9075 +SHA512: 65bb6af557431f6a6990255e5a99ac4a5975134516dc1745852d3306a664d56e2ae38a35f0a87c006e1a17dd99175fb8c82fc6c2bca2642bde576560962b0383 +Homepage: http://pulseaudio.org +Description: PulseAudio client libraries (glib support) + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + Client libraries used by applications that access a PulseAudio sound server + via PulseAudio's native interface. + . + This package adds support for glib2 client applications. + +Package: libpulse0 +Architecture: amd64 +Version: 1:17.0+dfsg1-2ubuntu4 +Multi-Arch: same +Priority: optional +Section: libs +Source: pulseaudio +Maintainer: Ubuntu Developers +Original-Maintainer: Pulseaudio maintenance team +Installed-Size: 921 +Depends: libapparmor1 (>= 2.7.0~beta1+bzr1772), libasyncns0 (>= 0.3), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libsndfile1 (>= 1.0.20), libsystemd0, libx11-6, libx11-xcb1, libxcb1 +Suggests: pulseaudio +Filename: pool/libpulse0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb +Size: 293408 +MD5sum: f6a75c49f21de1787ee6e766f384ef82 +SHA1: 1723a52df4937d44416619a84a3119245ed0c9d6 +SHA256: d2998fcca587cb21447302a551bfaa6caa7052e7f00a1b041adf4237dd65e4a3 +SHA512: 5051c601c7ba58286a840c999958e2d7de23eea9931af88779ce5a06aaf448632bc499fa60f792fe331077240f00f9be48c5c9e830ceed907d2d2806b2129ba8 +Homepage: http://pulseaudio.org +Description: PulseAudio client libraries + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + Client libraries used by applications that access a PulseAudio sound server + via PulseAudio's native interface. + +Package: libpwquality-common +Architecture: all +Version: 1.4.5-5build1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libpwquality +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 68 +Breaks: libpwquality-tools (<< 1.4.1-2~) +Replaces: libpwquality-tools (<< 1.4.1-2~) +Filename: pool/libpwquality-common_1.4.5-5build1_all.deb +Size: 7846 +MD5sum: 10c900e85b2810a5afd38b14f6b5b2a8 +SHA1: 70f225b319dc60b1c695e20cf61513b898b0f5b1 +SHA256: 6b52c3f3ea6d6a77b305bf34eb242a28cb5fa50f7d452438967bd308fd04c884 +SHA512: 74f31fd9314f66c01d0c351209b0969401ebad491b43a716828a7ff3d21833abda37b0ff27fe82384d67820347d535f3388c0215acb383e9a117e0173719b175 +Homepage: https://github.com/libpwquality/libpwquality +Description: library for password quality checking and generation (data files) + libpwquality's purpose is to provide common functions for password + quality checking and also scoring them based on their apparent randomness. The + library also provides a function for generating random passwords with good + pronounceability. + . + This package contains the configuration file and man page for libpwquality. + +Package: libpwquality1 +Architecture: amd64 +Version: 1.4.5-5build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libpwquality +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 48 +Depends: libpwquality-common, libc6 (>= 2.38), libcrack2 (>= 2.8.14) +Filename: pool/libpwquality1_1.4.5-5build1_amd64.deb +Size: 14010 +MD5sum: 65d8ea3f9ff7fc3529f70d2e89f366cf +SHA1: c0493a0934af34493a131b51e40b046af561c84d +SHA256: d62dda61e4d0e134a85d2af2d15b5f863b2a1c8a8ab43069f16da1c5a7aeb388 +SHA512: 196f85068e8c749b5f2054b81468a01ed0ce761a16c23644ab2a67894631e249529239c59463b6603fd15446e376191d79dfeb1f2175aa0f808e84637faa367d +Homepage: https://github.com/libpwquality/libpwquality +Description: library for password quality checking and generation + libpwquality's purpose is to provide common functions for password + quality checking and also scoring them based on their apparent randomness. The + library also provides a function for generating random passwords with good + pronounceability. + . + This package contains the shared library. + +Package: libpython3-stdlib +Architecture: amd64 +Version: 3.14.3-0ubuntu2 +Multi-Arch: same +Priority: optional +Section: python +Source: python3-defaults +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 26 +Depends: libpython3.14-stdlib (>= 3.14.3) +Filename: pool/libpython3-stdlib_3.14.3-0ubuntu2_amd64.deb +Size: 8476 +MD5sum: b976c516481f0c9148cdffe4d615e8dc +SHA1: a43f11d3ab496d32d94affbe69fda5aeb3311c08 +SHA256: 75d0c4c28732f8e08d5da25a47676dbe923e4b15a8f7a77110ab370325889df5 +SHA512: ceb5151107e9ce4ebcb08020cd018fc514bc3080d4511a6ea4cf22f3a350df022399e4f233a15744bec479cdf3a2c88db03345e617fb5bcd52c3ab8f78044a09 +Homepage: https://www.python.org/ +Description: interactive high-level object-oriented language (default python3 version) + This package contains the majority of the standard library for the Python + language (default python3 version). + . + This package is a dependency package, which depends on Debian's default + Python 3 version's standard library (currently v3.14). + +Package: libpython3.14 +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: python3.14 +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 8131 +Depends: libpython3.14-stdlib (= 3.14.4-1ubuntu0.2), libc6 (>= 2.38), libexpat1 (>= 2.7.2), zlib1g (>= 1:1.2.0) +Replaces: libpython3.14 +Filename: pool/libpython3.14_3.14.4-1ubuntu0.2_amd64.deb +Size: 2579290 +MD5sum: b291bdb875bc21834f5af6a44eb7443a +SHA1: 823f1e4fda0cbb5a10c6280046b919f8564ba619 +SHA256: 76c12c7936d7a2e898f972b8b40ec74f3b58f1a534e67e256e1aa9d28c6c43d8 +SHA512: 1a4314ffee48bf2d893275d516ba9eb6722f0b921ae6ea8846034beddc97a9375efbe869bc7008e29272b7746fa7b857bdacabe8d67b40997b8aaf9b6c6feb15 +Description: Shared Python runtime library (version 3.14) + Python is a high-level, interactive, object-oriented language. Its 3.14 version + includes an extensive class library with lots of goodies for + network programming, system administration, sounds and graphics. + . + This package contains the shared runtime library, normally not needed + for programs using the statically linked interpreter. + +Package: libpython3.14-minimal +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: python +Source: python3.14 +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 5643 +Depends: libc6 (>= 2.14), libssl3t64 (>= 3.4.0) +Recommends: libpython3.14-stdlib +Conflicts: binfmt-support (<< 1.1.2) +Breaks: libpython3.14-stdlib (<< 3.13.1-3~) +Replaces: libpython3.14-stdlib (<< 3.13.1-3~) +Filename: pool/libpython3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb +Size: 916446 +MD5sum: 82d829e7678fe4e2cabdc918d59629b8 +SHA1: a7a3cd8456956d53a59c3ea2f13eeec03c0710c1 +SHA256: fac6f0728cf9490a7a698e6b343e4140283e92355b060193c04f5770a666df8a +SHA512: 1dda2f49d4402b79860b905ffe2e1ac270f03d67978efa648d98f9a78c6f2d033e51519f49d3f00d61ca86fb471ae5f28896a67605bef6ff662fe4b6af0a6338 +Description: Minimal subset of the Python language (version 3.14) + This package contains some essential modules. It is normally not + used on it's own, but as a dependency of python3.14-minimal. + +Package: libpython3.14-stdlib +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: python +Source: python3.14 +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 10120 +Depends: libpython3.14-minimal (= 3.14.4-1ubuntu0.2), media-types | mime-support, netbase, tzdata, libbz2-1.0, libc6 (>= 2.42), libdb5.3t64, libffi8 (>= 3.4), liblzma5 (>= 5.1.1alpha+20120614), libncursesw6 (>= 6.1), libreadline8t64 (>= 7.0~beta), libsqlite3-0 (>= 3.36.0), libtinfo6 (>= 6), libuuid1 (>= 2.20.1), libzstd1 (>= 1.5.5) +Filename: pool/libpython3.14-stdlib_3.14.4-1ubuntu0.2_amd64.deb +Size: 2415042 +MD5sum: 2efbcdabab8c395c3d0441d7124b1dc9 +SHA1: 9c08252c04826c2af84ee43a32e415b98a20ef5a +SHA256: 3c267ef0f902f763c3615cbf28dd6fe91d2e4f603075d7f03db99f8d4eb66f46 +SHA512: f55d47c9aee3278919e9bc940bc44c9b8d00f40a358fbb4779c6c08935b72ada57f21a74c7960c1da44ec67888b7b6ce43352c3ea051ccbbb7d64f862721fb5d +Description: Interactive high-level object-oriented language (standard library, version 3.14) + Python is a high-level, interactive, object-oriented language. Its 3.14 version + includes an extensive class library with lots of goodies for + network programming, system administration, sounds and graphics. + . + This package contains Python 3.14's standard library. It is normally not + used on its own, but as a dependency of python3.14. + +Package: libqmi-glib5 +Architecture: amd64 +Version: 1.38.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libqmi +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 4815 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.54.0), libmbim-glib4 (>= 1.14.0), libmbim-proxy, libqrtr-glib0 (>= 1.0.0) +Filename: pool/libqmi-glib5_1.38.0-1_amd64.deb +Size: 980024 +MD5sum: 29fc5455d77e8c2d279dc90afa6e53c2 +SHA1: 47f346e4e1fb1de336162104eba1bebbe3e347b5 +SHA256: ae6396d1c1b16b093b34df537fa1892079e9ce4f7c0b7fa6af7825dcd07e9873 +SHA512: f67c6713c262391b26fb3a39ad86918d267cffcac904ebe8f15c95112fc49f347519eb10c558aaeb2a5b46ba5d0312758c1a72d485e14868a4361135a30a9231 +Homepage: https://www.freedesktop.org/wiki/Software/libqmi +Description: Support library to use the Qualcomm MSM Interface (QMI) protocol + Libraries for adding QMI support to applications that use glib. + +Package: libqmi-proxy +Architecture: amd64 +Version: 1.38.0-1 +Multi-Arch: foreign +Priority: optional +Section: net +Source: libqmi +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 34 +Depends: libqmi-glib5 (= 1.38.0-1), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.30.0) +Filename: pool/libqmi-proxy_1.38.0-1_amd64.deb +Size: 6140 +MD5sum: b2908d663d6d308ed59d5ce5bf62d0a8 +SHA1: 49f7b98de03cc881fb7cc549ddd3906807d92be0 +SHA256: 04aec1083022f2745030e67ecb995593b9550848fcf3701228b369705e4aaf3b +SHA512: 52dac21de8526a716883a8518d5400c5dcbddf57bad86416f43cc081bb1e7dc6d7b232f78c1b62eb8d027692d3b42eab00a17f1e74ab227b90c907b6e7751548 +Homepage: https://www.freedesktop.org/wiki/Software/libqmi +Description: Proxy to communicate with QMI ports + This package contains the binary qmi-proxy used by libqmi to allow multiple + clients to use the same QMI port simultaneously. + +Package: libqmi-utils +Architecture: amd64 +Version: 1.38.0-1 +Priority: optional +Section: net +Source: libqmi +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 866 +Depends: libc6 (>= 2.42), libglib2.0-0t64 (>= 2.62.0), libgudev-1.0-0 (>= 146), libmbim-glib4 (>= 1.28.0), libmbim-proxy, libqmi-glib5 (>= 1.38.0), libqmi-proxy, libqrtr-glib0 (>= 1.0.0) +Filename: pool/libqmi-utils_1.38.0-1_amd64.deb +Size: 211508 +MD5sum: 5afa366e7bb2f7c54fa44e5154147800 +SHA1: 72240b60295c0396bfc6e0c16b3baa53e885b2f1 +SHA256: 266e8d1a46acd6e1ec32d8c496e0eb2330450d73050c294179f4434bb21bef64 +SHA512: ea3fc366203821a77255bb2a0521816d515f08478f0e95bd4d401ebe46ce390c90de3218eb3091c07a3386f022249f6fddc6cb2733a871b1dad8ef9359263583 +Homepage: https://www.freedesktop.org/wiki/Software/libqmi +Description: Utilities to use the QMI protocol from the command line + This package contains the utilities that make it easier to use QMI + functionality from the command line. + +Package: libqpdf30 +Architecture: amd64 +Version: 12.3.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: qpdf +Maintainer: Ubuntu Developers +Original-Maintainer: Jay Berkenbilt +Installed-Size: 2665 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libgnutls30t64 (>= 3.8.2), libjpeg8 (>= 8c), libstdc++6 (>= 14), zlib1g (>= 1:1.1.4) +Filename: pool/libqpdf30_12.3.2-1_amd64.deb +Size: 889280 +MD5sum: edd5f995de7878852fb775b80d9b2284 +SHA1: 949473013bb36bba6b32a4033f3724500aff7afe +SHA256: 354aba90fac426ae0a46e7386b933068c7ae55853227fdbc79d4374c2bd881f2 +SHA512: 7e893c68c34eca7e7df84c8ae46755c2840ac72fcc31db7cddb0805f623accdaeb19f2a0a2552fd4a06b835054f18e08056805edce92143aa5dc7154d9b9017c +Homepage: https://qpdf.sourceforge.io +Description: runtime library for PDF transformation/inspection software + QPDF is a program that can be used to linearize (web-optimize), + encrypt (password-protect), decrypt, and inspect PDF files from the + command-line. It does these and other structural, content-preserving + transformations on PDF files, reading a PDF file as input and + creating a new one as output. It also provides many useful + capabilities to developers of PDF-producing software or for people + who just want to look at the innards of a PDF file to learn more + about how they work. + . + QPDF understands PDF files that use compressed object streams + (supported by newer PDF applications) and can convert such files into + those that can be read with older viewers. It can also be used for + checking PDF files for structural errors, inspecting stream contents, + or extracting objects from PDF files. QPDF is not PDF content + creation or viewing software -- it does not have the capability to + create PDF files from scratch or to display PDF files. + . + This package contains the qpdf runtime libraries required to run + programs that link with the qpdf library. + +Package: libqrtr-glib0 +Architecture: amd64 +Version: 1.2.2-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libqrtr-glib +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 61 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.56) +Filename: pool/libqrtr-glib0_1.2.2-2ubuntu1_amd64.deb +Size: 18300 +MD5sum: 7d31bccda02715f6effc0af23d7a7fb7 +SHA1: 659e3dc09dbcf2d12a3c906cedcedefd178ca3ff +SHA256: 8ce9e67b2e9018c521faa0a872cf6b83e2254f3459246473804fb5e3567c60ad +SHA512: a1cd43ade2d8370119ddf70e061526191c82a63be8e59199c9137a6a6d6bb68e647775ee406c3337350ceed6519d7ea943cb7d05e5bc280318499e995a089cd4 +Homepage: https://gitlab.freedesktop.org/mobile-broadband/libqrtr-glib/ +Description: Support library to use the QRTR protocol + glib-based library to use and manage the QRTR (Qualcomm IPC Router) bus. + . + This package contains the shared library. + +Package: libraqm0 +Architecture: amd64 +Version: 0.10.4-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: raqm +Maintainer: Ubuntu Developers +Original-Maintainer: أحمد المحمودي (Ahmed El-Mahmoudy) +Installed-Size: 47 +Depends: libc6 (>= 2.14), libfreetype6 (>= 2.11.0), libfribidi0 (>= 1.0.0), libharfbuzz0b (>= 10.4.0) +Filename: pool/libraqm0_0.10.4-1_amd64.deb +Size: 15458 +MD5sum: 8e7620229ef4342dfdd227f62b927a89 +SHA1: a9b56580f1ee9bf4a6febe6db51112d28975372e +SHA256: 85aefc091871221e4aa08d86615dd0e5140380928452418bd1e4e5226fee4628 +SHA512: 70f864da94717f0a68cd83b086a410f5a1faf89cd028146424a0f3ee6b0cb665666bb345fec2ec146f8f0c9936411e8d2e78c89700e04a2e4a9c304e2f0b68df +Homepage: https://github.com/HOST-Oman/libraqm +Description: Library for complex text layout + Raqm is a small library to provide convenience functions for complex text + layout. It currently provides bidirectional text support (using FriBiDi), + shaping (using HarfBuzz), with proper script itemization. + . + This package contains the shared libraries. + +Package: libraw1394-11 +Architecture: amd64 +Version: 2.1.2-2build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libraw1394 +Maintainer: Ubuntu Developers +Original-Maintainer: Guus Sliepen +Installed-Size: 83 +Depends: libc6 (>= 2.14) +Suggests: libraw1394-doc +Filename: pool/libraw1394-11_2.1.2-2build4_amd64.deb +Size: 26092 +MD5sum: 81fd1dfc98e1b43600be9f12ad8e544a +SHA1: c156e6021c06c2bd44105d7c11c870be62b92e26 +SHA256: 86628e0427e4df2f4b31dd6d6afe61a550cc6eb0d078f372b322e55e79fb7221 +SHA512: def0f54b26ae8928b6201fe2df613cf770e520afa875ac2e6a9056d5989ea6dcbdfcb662c585486572d3f36aedc91188ead8b0c9fe5b78165c7f0cf45ddc9661 +Homepage: https://ieee1394.wiki.kernel.org/ +Description: library for direct access to IEEE 1394 bus (aka FireWire) + libraw1394 is the only supported interface to the kernel side raw1394 + of the Linux IEEE-1394 subsystem, which provides direct access to the + connected 1394 buses to user space. Through libraw1394/raw1394, + applications can directly send to and receive from other nodes without + requiring a kernel driver for the protocol in question. + +Package: libreadline8t64 +Architecture: amd64 +Version: 8.3-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: readline +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 494 +Provides: libreadline8 (= 8.3-4) +Depends: readline-common, libc6 (>= 2.38), libtinfo6 (>= 6) +Breaks: libreadline8 (<< 8.3-4) +Replaces: libreadline8 +Filename: pool/libreadline8t64_8.3-4_amd64.deb +Size: 164290 +MD5sum: 12e2bb50fc39a689b1e6515bc0a2b976 +SHA1: cb41ba254f35393beb13c866f57e7517161451c2 +SHA256: 260b3333e9f714252593b83fb31d2571097b64d337d0d7100aae7349029821fc +SHA512: 8e463880dd1f887f22bc314ae54c9e5e52a40646619154f37fcc028bdcd48e803ecdf2d275d3843cbe92ca4c1392dbc74e40ed53325e9d234df23a00404e25af +Homepage: https://tiswww.case.edu/php/chet/readline/rltop.html +Description: GNU readline and history libraries, run-time libraries + The GNU readline library aids in the consistency of user interface + across discrete programs that need to provide a command line + interface. + . + The GNU history library provides a consistent user interface for + recalling lines of previously typed input. + +Package: libref-array1t64 +Architecture: amd64 +Version: 0.6.2-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: ding-libs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 32 +Provides: libref-array1 (= 0.6.2-3build1) +Depends: libc6 (>= 2.14) +Breaks: libref-array1 (<< 0.6.2-3build1) +Replaces: libref-array1 +Filename: pool/libref-array1t64_0.6.2-3build1_amd64.deb +Size: 7588 +MD5sum: 1580b92265d599bfec293ccf0ee12821 +SHA1: ef7e148ec849b799e80f761ece1845f3515906b7 +SHA256: bcd9df6590849ac65fe32d2eec97aa216c7cd938fa2555623a0c37a0d074867a +SHA512: 3f0f835f8b9456b0ce365821d35b91460fc0a4ae0f9408c7b4693f99df59a9897decb1be2b9e5a902af49cd1941c5ef0544f3c67504fcb1caf6fad08716d22e6 +Homepage: https://github.com/SSSD/ding-libs +Description: refcounted array for C + A dynamically-growing, reference-counted array + . + This package is part of the ding-libs, libraries that are required for the + proper functioning of SSSD, the System Security Services Daemon. + +Package: librest-1.0-0 +Architecture: amd64 +Version: 0.10.2-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: librest +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 128 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.0.3), libxml2-16 (>= 2.14.1) +Filename: pool/librest-1.0-0_0.10.2-1_amd64.deb +Size: 36904 +MD5sum: 132beda22831748f11d25f4d3e3aae6c +SHA1: 56c56b203b2567f7a588e02ab651c029528bdad8 +SHA256: c803774236c7392fa73e9ed1349acd7d658d40234f39f44fa7f6c254404bea0a +SHA512: 0b5165042bdee80f92a328adcbee632fec1c5d26de5d5e92e63e9e4c86c6bd072872e8a513f0817ae37a6452ef9373fc08a3a076a96fc650cda0a6393dce698f +Homepage: https://wiki.gnome.org/Projects/Librest +Description: REST service access library + This library was designed to make it easier to access web services that + claim to be "RESTful". It includes convenience wrappers for libsoup and + libxml to ease remote use of the RESTful API. + +Package: libroc0.4 +Architecture: amd64 +Version: 0.4.0+dfsg-5ubuntu3.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: roc-toolkit +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 1328 +Depends: libc6 (>= 2.38), libspeexdsp1 (>= 1.2.1), libstdc++6 (>= 4.1.1), libuv1t64 (>= 1.4.2) +Filename: pool/libroc0.4_0.4.0+dfsg-5ubuntu3.1_amd64.deb +Size: 284986 +MD5sum: dbdbbbd80ff5f2ad4605ae1f300a102f +SHA1: dcd8e4dd15fdc58bea4cd474cecd60e881c140ef +SHA256: eef5591226e19f82e709aedcdb89180ce94989f26f73810b64421a599a7162dd +SHA512: c6462f373ba38762cf4e070df74a6d208ac41cd36c04212b429844ea4ff8b41964a538683a6fd151383713814b87b89d881f0288876ca36394c26db107953ade +Homepage: https://roc-streaming.org/ +Description: real-time audio streaming over the network (shared library) + Roc is a network transport, highly specialized for the real-time streaming use + case. The user writes the stream to the one end and reads it from another end, + and Roc deals with all the complexity of the task of delivering data in time + and with no loss. Encoding, decoding, adjusting rates, restoring losses - all + these are performed transparently under the hood. + . + This package provides the shared library. + +Package: librsvg2-2 +Architecture: amd64 +Version: 2.61.3+dfsg-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: librsvg +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 5734 +Depends: libc6 (>= 2.34), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.15.8), libgcc-s1 (>= 4.2), libgdk-pixbuf-2.0-0 (>= 2.25.2), libglib2.0-0t64 (>= 2.54.0), libpango-1.0-0 (>= 1.48.11), libpangocairo-1.0-0 (>= 1.48.11), libxml2-16 (>= 2.14.1) +Recommends: librsvg2-common +Suggests: librsvg2-bin +Filename: pool/librsvg2-2_2.61.3+dfsg-3_amd64.deb +Size: 1864840 +MD5sum: 258d4d8afc8fef8cd4f11c23bda9ac24 +SHA1: 1955526d97628e271b1a610b966497a7204f1921 +SHA256: af1d01163b01f45a027054c3e0bcdadf01d5d318b8b9ffdcaa13c01ec4e2f2e7 +SHA512: f163f33490cd11a58087480794396180d1377006d43c8cc9aa11a4f7ada5fc5d9fa7780b29f077583b282f09d6d70b426a3b358f19abc780605417611c43fd97 +Homepage: https://gnome.pages.gitlab.gnome.org/librsvg/ +Description: SAX-based renderer library for SVG files (runtime) + The rsvg library is an efficient renderer for Scalable Vector Graphics + (SVG) pictures. + . + This package contains the runtime library, necessary to run + applications using librsvg. + +Package: librsvg2-common +Architecture: amd64 +Version: 2.61.3+dfsg-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: librsvg +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 386 +Depends: librsvg2-2 (= 2.61.3+dfsg-3), libc6 (>= 2.34), libgcc-s1 (>= 4.2), libgdk-pixbuf-2.0-0 (>= 2.23.5-2), libglib2.0-0t64 (>= 2.50.0) +Filename: pool/librsvg2-common_2.61.3+dfsg-3_amd64.deb +Size: 153060 +MD5sum: f3ebff052b76dc888291ea2e37ffc9ab +SHA1: 94a3c5ddd410830d4761711661dbb6e0f11a164d +SHA256: 0742e9d6a8f39f925a4f760512f1227bae3d7396208205b576a9bac9ca1c4b6e +SHA512: ffd3f4e105f451f8e9ec8253bdd869442e7a5c1797cedb5c5aece9ae4ac71ccf16a2f2a2a0a747e971d18a1028a452d514c34f483314d0b744daf19096efe3ea +Homepage: https://gnome.pages.gitlab.gnome.org/librsvg/ +Description: SAX-based renderer library for SVG files (extra runtime) + The rsvg library is an efficient renderer for Scalable Vector Graphics + (SVG) pictures. + . + This package includes the gdk-pixbuf loader allowing + to load SVG images transparently inside GTK+ applications. + +Package: librygel-core-2.8-0 +Architecture: amd64 +Version: 45.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: rygel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 370 +Depends: libc6 (>= 2.38), libgee-0.8-2 (>= 0.10.1), libglib2.0-0t64 (>= 2.80.0), libgssdp-1.6-0 (>= 1.1.3), libgupnp-1.6-0 (>= 1.6.0), libxml2-16 (>= 2.14.1) +Filename: pool/librygel-core-2.8-0_45.0-1ubuntu1_amd64.deb +Size: 112324 +MD5sum: 2751db1dee8145933261d1a2e8071c00 +SHA1: d131e25db764c076fa211cf102d6777fd6f76deb +SHA256: 8c4890469434dcfb7e0c435a038fcbbb574e8b8613521e6a13a4bb0ad61ab231 +SHA512: a56a1fd37e9e98cb0eea09a550a98fa7f69033843925c25d1e298f98fe8ece3b06a883de6317b8ed3b2dcb6b8fcf97bb53654935860aa5099cd33f5851c501c2 +Homepage: https://wiki.gnome.org/Projects/Rygel +Description: GNOME UPnP/DLNA services - core library + Rygel is a home media solution that allows you to easily share audio, video + and pictures, and control of media player on your home network. In technical + terms it is both a UPnP AV MediaServer and MediaRenderer implemented through + a plug-in mechanism. Interoperability with other devices in the market is + achieved by conformance to very strict requirements of DLNA and on the fly + conversion of media to format that client devices are capable of handling. + . + This package contains the core of Rygel, used by other rygel modules. + +Package: librygel-db-2.8-0 +Architecture: amd64 +Version: 45.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: rygel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 90 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.56.0), librygel-core-2.8-0 (>= 45.0), libsqlite3-0 (>= 3.5.9), libunistring5 (>= 1.1) +Filename: pool/librygel-db-2.8-0_45.0-1ubuntu1_amd64.deb +Size: 23682 +MD5sum: ec9737af21fd889d1197ac50d248c054 +SHA1: 30d4f7c48b95e71dd334d63fdf4314d2de6f5bdc +SHA256: e238a271444ae97f0088f96cb0a5ce15b6609e08be0f589feede53b96a887c1b +SHA512: fde1ac66d68a8798062459671ede056eccb193dd7d4d68b30e9e5e390d4ec334ea5feae685ea9c80fa857e2b2ac0b40f370217921f150212a22865e5e1b24853 +Homepage: https://wiki.gnome.org/Projects/Rygel +Description: GNOME UPnP/DLNA services - db library + Rygel is a home media solution that allows you to easily share audio, video + and pictures, and control of media player on your home network. In technical + terms it is both a UPnP AV MediaServer and MediaRenderer implemented through + a plug-in mechanism. Interoperability with other devices in the market is + achieved by conformance to very strict requirements of DLNA and on the fly + conversion of media to format that client devices are capable of handling. + . + This package contains a library implementing a generic database + abstraction used by rygel and rygel plugins. + +Package: librygel-renderer-2.8-0 +Architecture: amd64 +Version: 45.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: rygel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 178 +Depends: libc6 (>= 2.38), libgee-0.8-2 (>= 0.8.3), libglib2.0-0t64 (>= 2.56.0), libgupnp-1.6-0 (>= 1.6.0), libgupnp-av-1.0-3 (>= 0.12.8), librygel-core-2.8-0 (>= 45.0), libsoup-3.0-0 (>= 3.0.3) +Filename: pool/librygel-renderer-2.8-0_45.0-1ubuntu1_amd64.deb +Size: 51486 +MD5sum: 5b9101fcdca91a5a4dded1c715bd62bc +SHA1: 5867daca950b208187e552f95cce540a9a04e04e +SHA256: 9991ea25f1ef529fa28f93ffa5996b6aa7f8cc868e8acc5d58aae1676b4775a7 +SHA512: 5ba07412b939daaf8ebb6eea1e1e02e385a03b3731852ef9fbc6a52e439c7d79d361688d1c2501f490e0de7b62f9f9ff2ad3c7097f1e108e4a8e10cf53730bec +Homepage: https://wiki.gnome.org/Projects/Rygel +Description: GNOME UPnP/DLNA services - renderer library + Rygel is a home media solution that allows you to easily share audio, video + and pictures, and control of media player on your home network. In technical + terms it is both a UPnP AV MediaServer and MediaRenderer implemented through + a plug-in mechanism. Interoperability with other devices in the market is + achieved by conformance to very strict requirements of DLNA and on the fly + conversion of media to format that client devices are capable of handling. + . + This package contains a library used by applications implementing + UPnP renderer functionality by using rygel renderer plug-ins. + +Package: librygel-server-2.8-0 +Architecture: amd64 +Version: 45.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: rygel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 698 +Depends: libc6 (>= 2.38), libgee-0.8-2 (>= 0.8.3), libglib2.0-0t64 (>= 2.80.0), libgssdp-1.6-0 (>= 1.6.0), libgupnp-1.6-0 (>= 1.6.0), libgupnp-av-1.0-3 (>= 0.14.1), libmediaart-2.0-0 (>= 1.9.0), librygel-core-2.8-0 (>= 45.0), libsoup-3.0-0 (>= 3.1.3), libxml2-16 (>= 2.14.1) +Filename: pool/librygel-server-2.8-0_45.0-1ubuntu1_amd64.deb +Size: 210506 +MD5sum: 18a80c3ad4228f0096593809579cf608 +SHA1: 5d392680fc9b9443372581bb65e73d6e5ee130a2 +SHA256: 67a370401dff770aaeceeed3208a22019754d0a17e17c6172a9dc102c712c0ab +SHA512: 7b3b7325a2c6058065d792fb73e7c0fbe89d4afcd7a32e69fc120c9b82184e5f4e709133a526ef329d0856e18d0ed98cfcfda5e249e061cccc3344167b4f6f8d +Homepage: https://wiki.gnome.org/Projects/Rygel +Description: GNOME UPnP/DLNA services - server library + Rygel is a home media solution that allows you to easily share audio, video + and pictures, and control of media player on your home network. In technical + terms it is both a UPnP AV MediaServer and MediaRenderer implemented through + a plug-in mechanism. Interoperability with other devices in the market is + achieved by conformance to very strict requirements of DLNA and on the fly + conversion of media to format that client devices are capable of handling. + . + This package contains a library used by application implementing + UPnP server functionality by using rygel server plug-ins. + +Package: libsamplerate0 +Architecture: amd64 +Version: 0.2.2-4build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libsamplerate +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 1487 +Depends: libc6 (>= 2.14) +Filename: pool/libsamplerate0_0.2.2-4build2_amd64.deb +Size: 1342514 +MD5sum: 60dfe4788c7a70875b6a909e8ab6ca27 +SHA1: 859ed3b85ac73993ccd57ac48e93ad8e05275935 +SHA256: c554aed04aa0c47928039dc158e26c2b6da44b4570d400574110dcdaedd03360 +SHA512: eed93c2e729c499662bb89e340b681edc71d121accbf1f57e9740ea429ce807cc1a6b5b55072b92c95093704177af2fc43c53b79c1e7acc3f59bb945359eb298 +Homepage: https://libsndfile.github.io/libsamplerate/ +Description: Audio sample rate conversion library + libsamplerate (aka Secret Rabbit Code) is a library for audio rate conversion. + . + libsamplerate currently provides three different sample rate conversion + algorithms; zero order hold, linear interpolation and FIR filter interpolation + (using filters derived from the mathematical SINC function). The first two + algorithms (zero order hold and linear) are included for completeness and are + not recommended for any application where high quality sample rate conversion + is required. For the FIR/Sinc algorithm, three converters are provided; + SRC_SINC_FASTEST, SRC_SINC_MEDIUM_QUALITY and SRC_SINC_BEST_QUALITY to allow a + trade off between conversion speed and conversion quality. + . + libsamplerate is capable of downsampling to 1/256 of the original sample rate + and upsampling to 256 times the original sample rate. It is also capable of + time varying conversions for vary speed effects and synchronising of two + unlocked sample rates. + +Package: libsane-common +Architecture: all +Version: 1.4.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: sane-backends +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 4888 +Pre-Depends: dpkg (>= 1.15.7.2) +Breaks: sane-utils (<< 1.1.1-3~) +Replaces: sane-utils (<< 1.1.1-3~) +Filename: pool/libsane-common_1.4.0-1ubuntu1_all.deb +Size: 918898 +MD5sum: 9558650e2decf87866ebf5068eb77d0b +SHA1: 282dca947782db09348423deedde810033917e48 +SHA256: bab39d46a52af80fa9a4b711de0f9b031d50124929ecdba7a34f623f5e1e513d +SHA512: f88edea043d5ac81a0e1f33264e995d3118fa8117cc123ef76ba679919f6e0556eef54e4d1cc19a846190037be3960a7da69d5d3d6d81c106dfc3611b18ad9a0 +Homepage: http://www.sane-project.org +Description: API library for scanners -- documentation and support files + SANE stands for "Scanner Access Now Easy" and is an application + programming interface (API) that provides standardized access to any + raster image scanner hardware (flatbed scanner, hand-held scanner, + video- and still-cameras, frame-grabbers, etc.). The SANE standard is + free and its discussion and development are open to everybody. The + current source code is written to support several operating systems, + including GNU/Linux, OS/2, Win32 and various Unices and is available + under the GNU General Public License (commercial applications and + backends are welcome, too, however). + . + This package includes documentation for libsane, such as the man pages + and list of supported scanners, and support files (i18n data). + +Package: libsane-hpaio +Architecture: amd64 +Version: 3.24.4+dfsg0-0ubuntu8.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: hplip +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 1645 +Depends: libc6 (>= 2.38), libcups2t64 (>= 1.6.0), libdbus-1-3 (>= 1.10), libhpmud0 (>= 3.24.4+dfsg0) +Recommends: hplip (= 3.24.4+dfsg0-0ubuntu8.1), sane-utils +Breaks: hplip (<< 3.17.10+repack0-5~) +Replaces: hplip (<< 3.17.10+repack0-5~) +Filename: pool/libsane-hpaio_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +Size: 135394 +MD5sum: 26832fa04a694394ac401c0fb8ef445a +SHA1: 69d7dfc54f5750a262778ba97b6430d809f94dfe +SHA256: 84e81795305c8457af92f8e3d4e4bb74d9c357d78d780e91388e9a3ef1c43247 +SHA512: e6cf4ab0a19a059588a7a024b768c5c7ab29d7e7d170e6a1e6e32119374d6adddd141dc4b08e44fbefd829572effe15f9da3f8361e6ee594d33acdccb714cbd3 +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP SANE backend for multi-function peripherals + The HP Linux Printing and Imaging System provides full support for + printing on most HP SFP (single function peripheral) inkjets and many + LaserJets, and for scanning, sending faxes and for photo-card access on + most HP MFP (multi-function peripheral) printers. + . + This package contains the SANE backend libraries for use with HP + Multi-function peripherals. + . + Users of hplip are advised to install the hplip{-gui} packages for + command line and GUI tools associated with HPLIP. + . + This package is useful for a minimal footprint headless scanning solution. + +Package: libsane1 +Architecture: amd64 +Version: 1.4.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: sane-backends +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 12870 +Depends: acl, adduser, libsane-common (= 1.4.0-1ubuntu1), udev, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.43), libcairo2 (>= 1.2.4), libcurl3t64-gnutls (>= 7.16.2), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.34.0), libgphoto2-6t64 (>= 2.5.10), libgphoto2-port12t64 (>= 2.5.10), libieee1284-3t64 (>= 0.2.11), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libpoppler-glib8t64 (>= 0.85.0), libsnmp40t64 (>= 5.9.4+dfsg), libstdc++6 (>= 14), libtiff6 (>= 4.0.3), libusb-1.0-0 (>= 2:1.0.22), libv4l-0t64 (>= 0.5.0), libxml2-16 (>= 2.14.1) +Recommends: sane-airscan, sane-utils (>= 1.4.0-1ubuntu1), ipp-usb +Suggests: avahi-daemon, hplip +Filename: pool/libsane1_1.4.0-1ubuntu1_amd64.deb +Size: 2904028 +MD5sum: be6d0f6d4986cf41174a6a36a5fa46d4 +SHA1: 9be3552fb3f25286f7c9acbbebed5e8a5c2eb45d +SHA256: ce047e7455510f5b7e31df0e7dc3950799aa6e1a1d112806424795780691314f +SHA512: 61be0bc50876f78af6bc20f7c97191073f2b6e6a26442e572e7d6c190f18ba8a0082054623e216a628a94f2ff4729fe4ef61aa1a0cdb5df9afe7841078b71609 +Homepage: http://www.sane-project.org +Description: API library for scanners + SANE stands for "Scanner Access Now Easy" and is an application + programming interface (API) that provides standardized access to any + raster image scanner hardware (flatbed scanner, hand-held scanner, + video- and still-cameras, frame-grabbers, etc.). The SANE standard is + free and its discussion and development are open to everybody. The + current source code is written to support several operating systems, + including GNU/Linux, OS/2, Win32 and various Unices and is available + under the GNU General Public License (commercial applications and + backends are welcome, too, however). + . + Graphical frontends for sane are available in the packages sane and + xsane. Command line frontend scanimage, saned and sane-find-scanner are + available in the sane-utils package. + +Package: libsasl2-modules +Architecture: amd64 +Version: 2.1.28+dfsg1-9ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cyrus-sasl2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Cyrus Team +Installed-Size: 294 +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.0.0) +Suggests: libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal, libsasl2-modules-ldap, libsasl2-modules-otp, libsasl2-modules-sql +Breaks: libsasl2-modules-gssapi-mit (<< 2.1.28+dfsg-4) +Replaces: libsasl2-modules-gssapi-mit (<< 2.1.28+dfsg-4) +Filename: pool/libsasl2-modules_2.1.28+dfsg1-9ubuntu3_amd64.deb +Size: 71286 +MD5sum: 0894fe75dbd53f789a8161eb4906ef46 +SHA1: cd9acb3b76224bee008be6da9720808c64047ba3 +SHA256: 01adc1798ccd25f9e87cf7cfb218103a75d53d21847b6a301cef1e9513ac8ce1 +SHA512: ce54eb2b452165efa4cb78e8fcda76096f0dda8e44801bc0fc207a349999779ed46df71a8fda3f1bf46889e343929f6861f2830161a2a5ad0735cf16b157ceb7 +Homepage: https://www.cyrusimap.org/sasl/ +Description: Cyrus SASL - pluggable authentication modules + This is the Cyrus SASL API implementation, version 2.1. See package + libsasl2-2 and RFC 2222 for more information. + . + This package provides the following SASL modules: LOGIN, PLAIN, ANONYMOUS, + NTLM, SCRAM, CRAM-MD5, and DIGEST-MD5 (with DES support, deprecated). + +Package: libsasl2-modules-gssapi-mit +Architecture: amd64 +Version: 2.1.28+dfsg1-9ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: cyrus-sasl2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Cyrus Team +Installed-Size: 124 +Depends: libsasl2-modules (= 2.1.28+dfsg1-9ubuntu3), libc6 (>= 2.14), libgssapi-krb5-2 (>= 1.17) +Conflicts: libsasl2-modules-gssapi-heimdal +Filename: pool/libsasl2-modules-gssapi-mit_2.1.28+dfsg1-9ubuntu3_amd64.deb +Size: 30662 +MD5sum: b8c737772010523e9e8bc97676a0454e +SHA1: aba84ed93fb67e645d4cfd8880d301a33e0846aa +SHA256: 47df65c89d1aebbc2faadfdb1bd0ce0183a1390d5bdb087ec95164757b73b827 +SHA512: 79c7e8db94da422dbe3f0b2b9bea771301c6a13b6e22f0ef69544a318bc6d84bdb02da56052ab303782fe4a3b4bb1c052161cecd745a9ae4a89dab186597511c +Homepage: https://www.cyrusimap.org/sasl/ +Description: Cyrus SASL - pluggable authentication modules (GSSAPI) + This is the Cyrus SASL API implementation, version 2.1. See package + libsasl2-2 and RFC 2222 for more information. + . + This package provides the GSSAPI plugin, compiled with the MIT + Kerberos 5 library. + +Package: libsbc1 +Architecture: amd64 +Version: 2.1-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: sbc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Bluetooth Maintainers +Installed-Size: 92 +Depends: libc6 (>= 2.4) +Filename: pool/libsbc1_2.1-1build1_amd64.deb +Size: 36328 +MD5sum: 16c31721a6cfa4da57cb6627adcdf77e +SHA1: a2758fa0571884409226b243e3b5d21226e13156 +SHA256: 7d3bc03489593a24345025509c4e2aed73a12d229df6e5d0f9667214aeca37ea +SHA512: 656e4eb3ac5a31163cfeaaf1338c652ba9f45576a645fa68427a08c3e04796b6a66ddbb76420e044feb4ae145aa38271273413562660b42108fc313c56a74952 +Homepage: https://www.bluez.org/ +Description: Sub Band CODEC library - runtime + This provides the library and tool which operate SBC + (sub band codec) in A2DP (the Advanced Audio Distribution Profile). + . + This package contains the sbc runtime library. + +Package: libsecret-1-0 +Architecture: amd64 +Version: 0.21.7-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libsecret +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 410 +Depends: libsecret-common, libc6 (>= 2.14), libgcrypt20 (>= 1.11.1), libglib2.0-0t64 (>= 2.83.0) +Filename: pool/libsecret-1-0_0.21.7-2build1_amd64.deb +Size: 118550 +MD5sum: f1d86ce2ff9be7cddba746c0068f1adc +SHA1: 040c1b82137cc73824bc0c8e41b7d9d658d6bb22 +SHA256: 5cf26cf395af46280fda3fca0b36abe5122588afb36b839a69cbca21b89ed362 +SHA512: bfbad8231e04dc193528ee23c64b0458c2ac7fb5221e58ddf5e8f5d81e46b72a59d74a1152c494bea226225f735288a5c1b1c20a451f92a9a7e8a48c6f1132c8 +Homepage: https://wiki.gnome.org/Projects/Libsecret +Description: Secret store + Library for storing and retrieving passwords and other secrets. + It communicates with the "Secret Service" using DBus. + +Package: libsecret-common +Architecture: all +Version: 0.21.7-2build1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libsecret +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Filename: pool/libsecret-common_0.21.7-2build1_all.deb +Size: 5608 +MD5sum: 1178acc1922a53ae3bc2c762057da9f1 +SHA1: 5ed437cf17fc4a1e5d49d353e45b4c0e9794a367 +SHA256: ac8c3a7214a6f85147c6fb1c516baf64abf26cf1fc90623671a848ed377d4932 +SHA512: 63dc561f074ace47ffacab86421708ebe3810ce48b69159fb230ac7fa8fca9de0d5873012acc42a11f61d0874fb34f62817152d6a728712ba9c23017dd76aa9f +Homepage: https://wiki.gnome.org/Projects/Libsecret +Description: Secret store (common files) + Library for storing and retrieving passwords and other secrets. + It communicates with the "Secret Service" using DBus. + . + This package contains data files used by the libsecret library. + +Package: libsensors-config +Architecture: all +Version: 1:3.6.2-2build1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: lm-sensors +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 28 +Suggests: lm-sensors +Filename: pool/libsensors-config_1%3a3.6.2-2build1_all.deb +Size: 6862 +MD5sum: 780e8f30858ce43556d4eab4f2894afe +SHA1: a2a42bc72c2157815435ab2fb47301cc3e08c811 +SHA256: 57193f731de79bbad343a1369e6e95b13096c08ba166c7e193bfc24d78f960fb +SHA512: 7a1ab3ce487fe314d203d9f38609412c269508d2e7b8c4ded865156b1922b33fa7a760987463f37c86096b760d6577907eef6bef941f2c6972fd07620a050e48 +Homepage: https://github.com/hramrach/lm-sensors +Description: lm-sensors configuration files + Lm-sensors is a hardware health monitoring package for Linux. It allows you + to access information from temperature, voltage, and fan speed sensors. It + works with most newer systems. + . + This library is only functional with a Linux kernel, it is provided on + non-Linux systems for portability reasons only. + . + This package contains the configuration files. + +Package: libsensors5 +Architecture: amd64 +Version: 1:3.6.2-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: lm-sensors +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 88 +Depends: libsensors-config, libc6 (>= 2.38) +Suggests: lm-sensors +Filename: pool/libsensors5_1%3a3.6.2-2build1_amd64.deb +Size: 28936 +MD5sum: 449388d50803eb7f2672a58cd1850ffc +SHA1: 6e2667b7fb304696d27baf9bc0daa53d8f652e34 +SHA256: 9249cd2be68acd7b589030df72a457b89fadea6c426002b00648ad2d153d9748 +SHA512: b0e640659516466228a6efea8c02f4b7d07dd80714434a021ac2fdf4f46a953116ffd00adaa37725bac37d69e985100e8eef8719c12ced233b920335ff5d15ba +Homepage: https://github.com/hramrach/lm-sensors +Description: library to read temperature/voltage/fan sensors + Lm-sensors is a hardware health monitoring package for Linux. It allows you + to access information from temperature, voltage, and fan speed sensors. It + works with most newer systems. + . + This library is only functional with a Linux kernel, it is provided on + non-Linux systems for portability reasons only. + . + This package contains a shared library for querying lm-sensors. + +Package: libsframe3 +Architecture: amd64 +Version: 2.46-3ubuntu2 +Multi-Arch: same +Priority: optional +Section: devel +Source: binutils +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 140 +Depends: libc6 (>= 2.14) +Filename: pool/libsframe3_2.46-3ubuntu2_amd64.deb +Size: 20576 +MD5sum: df63d3a643530d20c2e0a21383c94d20 +SHA1: 520f22d1dfd08f22cade5fd34a943770f6960043 +SHA256: 05541ea1edb19e54bea297a21a9c33d0b99ca2cfe2e86d4a67335e6640667cfc +SHA512: 8ec4377811c0722fd76f838ada7f64ca45f62e6abe1782c75e8338afb8bb3358134cabc03d7cd7039a97fcecae2aa0004c846e27b874f8254cf6e4ceaedbac60 +Homepage: https://www.gnu.org/software/binutils/ +Description: Library to handle the SFrame format (runtime library) + SFrame stands for Simple Frame format. SFrame format keeps track + of the minimal necessary information needed for generating stack traces. + . + This package includes the libsframe shared library. + +Package: libsharpyuv0 +Architecture: amd64 +Version: 1.5.0-0.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwebp +Maintainer: Ubuntu Developers +Original-Maintainer: Jeff Breidenbach +Installed-Size: 48 +Depends: libc6 (>= 2.29) +Filename: pool/libsharpyuv0_1.5.0-0.1build1_amd64.deb +Size: 17650 +MD5sum: 18244f647b208a344638a6b7cfcf646e +SHA1: 6a077e3d14f7651b375a88ec9aed21eebeacefc7 +SHA256: 4e2c0a8aa97dafd923f00d77ca017d14f16ab79d3b1120892c8215a0b5fb7892 +SHA512: 83d638b3cc601af6d3a53582b663083dfdb1082a6ef6c809c9cd5ecb0294d46c3045afb9eedd3a7881f9779c0bb384eb88629a6d37cd6e1840496099936542ed +Homepage: https://developers.google.com/speed/webp/ +Description: Library for sharp RGB to YUV conversion + This library provides the function to convert RGB to YUV420 using + a downsampling algorithm that minimizes artefacts caused by chroma + subsampling. + . + This package provides the shared library files. + +Package: libshout3 +Architecture: amd64 +Version: 2.4.6-1build3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libshout +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 147 +Depends: libc6 (>= 2.38), libogg0 (>= 1.0rc3), libspeex1 (>= 1.2~), libssl3t64 (>= 3.0.0), libtheora1 (>= 1.2), libvorbis0a (>= 1.1.2) +Filename: pool/libshout3_2.4.6-1build3_amd64.deb +Size: 50936 +MD5sum: 930a757d45256adec31609a373f76a02 +SHA1: 8c4932726e2be6c6910aeceefe33e5ec17744b31 +SHA256: fe638ec034df5294f3f47d60a308d0d9454e91a9fb0d9f7b718908604da489be +SHA512: 9a81641c145fccdf00d7e2b31a8e000e5f88506e0bd6112f0624b97462ecf277d3d57c5b8812d781f207baba702aaf0c963de3d3fc681f5107188dcd57574578 +Homepage: https://www.icecast.org/ +Description: MP3/Ogg Vorbis broadcast streaming library + A library for communicating with and sending data to Icecast and Icecast 2 + streaming audio servers. It handles the socket connection, the timing of + the data transmission, and prevents bad data from getting to the server. + +Package: libsimdutf31 +Architecture: amd64 +Version: 8.0.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: simdutf +Maintainer: Ubuntu Developers +Original-Maintainer: Mo Zhou +Installed-Size: 529 +Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.0), libstdc++6 (>= 13.1) +Filename: pool/libsimdutf31_8.0.0-1_amd64.deb +Size: 146898 +MD5sum: 9a55e64c3709687289cbe04287969f73 +SHA1: 7949eb34142b18efe971c0f88e6bcd9dd9c0424e +SHA256: fd01a52b2feaaf93839f1ba07bf11131fd377d2aaaef95c3a439a5bd333b459f +SHA512: 523539ed48550fe812ce6523aecd07c2aa9f441c992646c469037700217d2657abe0eaa57f9aeff42743137b4c809a09d9a473aeeb94d3707c41790f8ad1919b +Homepage: https://simdutf.github.io/simdutf/ +Description: Fast Unicode validation and transcoding + Most modern software relies on the Unicode standard. In memory, Unicode + strings are represented using either UTF-8 or UTF-16. The UTF-8 format is the + de facto standard on the web (JSON, HTML, etc.) and it has been adopted as the + default in many popular programming languages (Go, Zig, Rust, Swift, etc.). + The UTF-16 format is standard in Java, C# and in many Windows technologies. + . + Not all sequences of bytes are valid Unicode strings. It is unsafe to use + Unicode strings in UTF-8 and UTF-16LE without first validating them. + Furthermore, we often need to convert strings from one encoding to another, by + a process called transcoding. For security purposes, such transcoding should + be validating: it should refuse to transcode incorrect strings. + . + This library provide fast Unicode functions such as + . + * ASCII, UTF-8, UTF-16LE/BE and UTF-32 validation, with and without error + identification, + * Latin1 to UTF-8 transcoding, + * Latin1 to UTF-16LE/BE transcoding + * Latin1 to UTF-32 transcoding + * UTF-8 to Latin1 transcoding, with or without validation, with and without + error identification, + * UTF-8 to UTF-16LE/BE transcoding, with or without validation, with and + without error identification, + * UTF-8 to UTF-32 transcoding, with or without validation, with and without + error identification, + * UTF-16LE/BE to Latin1 transcoding, with or without validation, with and + without error identification, + * UTF-16LE/BE to UTF-8 transcoding, with or without validation, with and + without error identification, + * UTF-32 to Latin1 transcoding, with or without validation, with and without + error identification, + * UTF-32 to UTF-8 transcoding, with or without validation, with and without + error identification, + * UTF-32 to UTF-16LE/BE transcoding, with or without validation, with and + without error identification, + * UTF-16LE/BE to UTF-32 transcoding, with or without validation, with and + without error identification, + * From an UTF-8 string, compute the size of the Latin1 equivalent string, + * From an UTF-8 string, compute the size of the UTF-16 equivalent string, + * From an UTF-8 string, compute the size of the UTF-32 equivalent string + (equivalent to UTF-8 character counting), + * From an UTF-16LE/BE string, compute the size of the Latin1 equivalent + string, + * From an UTF-16LE/BE string, compute the size of the UTF-8 equivalent + string, + * From an UTF-32 string, compute the size of the UTF-8 or UTF-16LE equivalent + string, + * From an UTF-16LE/BE string, compute the size of the UTF-32 equivalent + string (equivalent to UTF-16 character counting), + * UTF-8 and UTF-16LE/BE character counting, + * UTF-16 endianness change (UTF16-LE/BE to UTF-16-BE/LE), + * WHATWG forgiving-base64 (with or without URL encoding) to binary, + * Binary to base64 (with or without URL encoding). + . + The functions are accelerated using SIMD instructions (e.g., ARM NEON, SSE, + AVX, AVX-512, RISC-V Vector Extension, LoongSon, POWER, etc.). When your + strings contain hundreds of characters, we can often transcode them at speeds + exceeding a billion characters per second. You should expect high speeds not + only with English strings (ASCII) but also Chinese, Japanese, Arabic, and so + forth. We handle the full character range (including, for example, emojis). + . + The library compiles down to a small library of a few hundred kilobytes. Our + functions are exception-free and non allocating. We have extensive tests and + extensive benchmarks. + . + This package ships the shared object. + +Package: libslang2 +Architecture: amd64 +Version: 2.3.3-5build1 +Built-Using: unicode-data (= 16.0.0-1) +Multi-Arch: same +Priority: optional +Section: libs +Source: slang2 +Maintainer: Ubuntu Developers +Original-Maintainer: Alastair McKinstry +Installed-Size: 2392 +Depends: libc6 (>= 2.42) +Filename: pool/libslang2_2.3.3-5build1_amd64.deb +Size: 503528 +MD5sum: 17458f726c6f9be30431164d763f2086 +SHA1: 614e538f79218fccd2e30188cfe659873265693f +SHA256: edfe8c7fd65e36959efcb4a116141d3c1287f9717eea1eee429d3a3d460d1d93 +SHA512: 62bb3a8f0213acd62b7034b1f6953c2a709238eaf632d40fe0fb1dbaab2d382607320a54a189059c9e97ec06c1d91326a56c920e0d5fabeb370b00ecbcabc3e8 +Homepage: http://www.jedsoft.org/slang/ +Description: S-Lang programming library - runtime version + S-Lang is a C programmer's library that includes routines for the rapid + development of sophisticated, user friendly, multi-platform applications. + . + This package contains only the shared library libslang.so.* and copyright + information. It is only necessary for programs that use this library (such + as jed and slrn). If you plan on doing development with S-Lang, you will + need the companion -dev package as well. + +Package: libsm6 +Architecture: amd64 +Version: 2:1.2.6-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libsm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 57 +Depends: libc6 (>= 2.14), libice6 (>= 1:1.0.0), libuuid1 (>= 2.16) +Filename: pool/libsm6_2%3a1.2.6-1build1_amd64.deb +Size: 16866 +MD5sum: e91b80c8dc408be1620eb43654bbd111 +SHA1: 7891aebee54021dc724335aa811c52f11f149eff +SHA256: 8f0d18029ed6918c8a422c8108d5efe6bc3a0e264dc65844b47132aad426536c +SHA512: d19829fe28e59528b4188100451aa1bfe12d5ca5bec3b13426371e9b5c89cc6e67672fdf936bd6630dd83845563d2ec5eb23c4b38b01cdb677d0b2eb6f33521b +Homepage: https://www.x.org +Description: X11 Session Management library + This package provides the main interface to the X11 Session Management + library, which allows for applications to both manage sessions, and make use + of session managers to save and restore their state for later use. + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libSM + +Package: libsmbclient0 +Architecture: amd64 +Version: 2:4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 239 +Provides: libsmbclient (= 2:4.23.6+dfsg-1ubuntu2.2) +Depends: samba-libs (= 2:4.23.6+dfsg-1ubuntu2.2), libbsd0 (>= 0.0), libc6 (>= 2.38), libndr6 (>= 2:4.17.2), libtalloc2 (>= 2.0.4~git20101213), libtevent0t64 (>= 0.15.0) +Breaks: libsmbclient (<< 2:4.23.6+dfsg-1ubuntu2.2) +Replaces: libsmbclient +Filename: pool/libsmbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 63740 +MD5sum: eb7019f9d543b5528bc86c4e3acc364e +SHA1: 563d0d15722daeaa277506f916ba1e40dbfe58ad +SHA256: d607a125cf912b23f5a432ee28a8e358bda17f6eb4b1561b72930b1262aeff80 +SHA512: fa25e51c147a3b88f18a36031f560685de20cc450390431520f54f7cac388a8f24b27c90dd544d4472a4d6961fe64468fe7fc17150ad8ffd91db263502b4b3c1 +Homepage: https://www.samba.org +Description: shared library for communication with SMB/CIFS servers + This package provides a shared library that enables client applications + to talk to Microsoft Windows and Samba servers using the SMB/CIFS + protocol. + +Package: libsnapd-glib-2-1 +Architecture: amd64 +Version: 1.72-0ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: snapd-glib +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 437 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.0.3) +Suggests: snapd +Filename: pool/libsnapd-glib-2-1_1.72-0ubuntu3_amd64.deb +Size: 119720 +MD5sum: e0fdbf322604ea0909986cb890e562b6 +SHA1: ad248f8d7c54472f807661eed388a62064ae4873 +SHA256: 6d61a082f9ee7c1c547c60b833b9015aa96eda6291578e854ef83362d4621488 +SHA512: 480378e808d83b0d98021fc77c3dee0ba35b4b41567d83d0862e932a4a3eca8cd8ce24b1f5b9c801cd952688bc90285fec1139570bdb1ea11e042791f9b4e7bf +Homepage: https://github.com/snapcore/snapd-glib +Description: GLib snapd library + snapd-glib is a library to allow GLib based applications access to snapd, + the daemon that controls Snaps. + . + Snaps are 'universal' packages that work across many different Linux + systems, enabling secure distribution of the latest apps and utilities + for cloud, servers, desktops and the internet of things. + +Package: libsnappy1v5 +Architecture: amd64 +Version: 1.2.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: snappy +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 93 +Depends: libc6 (>= 2.14), libstdc++6 (>= 5.2) +Conflicts: libsnappy1 +Filename: pool/libsnappy1v5_1.2.2-2_amd64.deb +Size: 30830 +MD5sum: ca279ecca73ff4aa34e44ab1871e30dc +SHA1: 1ab021fdf8ea5feeb5c2b8a704c71b367747755f +SHA256: 1679c696614780a0137e2b484ade47fc226177556e261bace9a779ae98b29346 +SHA512: 84e204b14c5690e4554063ccf8096f86dc357b9fbcab123fe90c6f7160180e0b7c6ca3b22363b55b3706c63a8f0e240f67ca3620e1f0696499b799d497a2c211 +Homepage: https://google.github.io/snappy/ +Description: fast compression/decompression library + Snappy is a compression/decompression library. It does not aim for + maximum compression, or compatibility with any other compression + library; instead, it aims for very high speeds and reasonable + compression. + . + For instance, compared to the fastest mode of zlib, Snappy + is an order of magnitude faster for most inputs, but the resulting + compressed files are anywhere from 20% to 100% bigger. On a single core + of a Core i7 processor in 64-bit mode, Snappy compresses at about 250 + MB/sec or more and decompresses at about 500 MB/sec or more. + +Package: libsndfile1 +Architecture: amd64 +Version: 1.2.2-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libsndfile +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 602 +Depends: libc6 (>= 2.38), libflac14 (>= 1.5.0), libmp3lame0 (>= 3.100), libmpg123-0t64 (>= 1.28.0), libogg0 (>= 1.3.0), libopus0 (>= 1.1), libvorbis0a (>= 1.2.3), libvorbisenc2 (>= 1.1.2) +Filename: pool/libsndfile1_1.2.2-4_amd64.deb +Size: 218520 +MD5sum: 3c588b8f0b458281f938bccc311a519c +SHA1: af4be42a1a71cc29a99ee7a03906d4fe40b35c6d +SHA256: 678c7e95dea924d1ebe6c59879009dc3e7b61491bc32bd63bea200487d60a454 +SHA512: 17951bcb3b335a0efaabdbc3fc729a38f87bb7d6504ddc9f1256d900d1f8c89420864dfa037ae22b925bfbfe5d973e26cc4a5608290abff07e052d6e13c885a8 +Homepage: https://libsndfile.github.io/libsndfile/ +Description: Library for reading/writing audio files + libsndfile is a library of C routines for reading and writing files containing + sampled audio data. + . + Various versions of WAV (integer, floating point, GSM, and compressed formats); + Microsoft PCM, A-law and u-law formats; AIFF, AIFC and RIFX; various AU/SND + formats (Sun/NeXT, Dec AU, G721 and G723 ADPCM); RAW header-less PCM files; + Amiga IFF/8SVX/16SV PCM files; Ensoniq PARIS (.PAF); Apple's Core Audio Format + (CAF) and others. + +Package: libsnmp-base +Architecture: all +Version: 5.9.4+dfsg-2ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: net-snmp +Maintainer: Ubuntu Developers +Original-Maintainer: Craig Small +Installed-Size: 655 +Suggests: snmp-mibs-downloader +Filename: pool/libsnmp-base_5.9.4+dfsg-2ubuntu3_all.deb +Size: 206668 +MD5sum: fc1570fba4cda3c68355e0a52b964b60 +SHA1: 475c30ebc6b41d2ce0d16c329c5d745b3d7c4c12 +SHA256: 4e07606d47746eec43c2afbe17b33fba33a93b8dd04866848cc3f0336e4e39ce +SHA512: bde7e37b59843d8eedfe84c5a0a25360aa2b696e6cfc00641d91f7ef34d679ca7e1911227aa9a65917882ea3caecb525eba0e5109321cd9ea559ec85e228d4e6 +Homepage: https://net-snmp.sourceforge.net/ +Description: SNMP configuration script, MIBs and documentation + The Simple Network Management Protocol (SNMP) provides a framework + for the exchange of management information between agents (servers) + and clients. + . + This package includes documentation and MIBs (Management Information Bases) + for the SNMP libraries, agents and applications. MIBs contain a formal + description of the data that can be managed using SNMP and applications. + . + NOTE: If you want the OIDs (Object Identifiers) to resolve to their text + description, you need to activate the non-free repository and install the + "snmp-mibs-downloader" package. + +Package: libsnmp40t64 +Architecture: amd64 +Version: 5.9.4+dfsg-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: net-snmp +Maintainer: Ubuntu Developers +Original-Maintainer: Craig Small +Installed-Size: 3734 +Provides: libsnmp40 (= 5.9.4+dfsg-2ubuntu3) +Depends: libc6 (>= 2.38), libpci3 (>= 1:3.5.1), libperl5.40 (>= 5.40.0), libsensors5 (>= 1:3.5.0), libssl3t64 (>= 3.0.0), libwrap0 (>= 7.6-4~), libsnmp-base +Breaks: libsnmp40 (<< 5.9.4+dfsg-2ubuntu3) +Replaces: libsnmp40 +Filename: pool/libsnmp40t64_5.9.4+dfsg-2ubuntu3_amd64.deb +Size: 1083894 +MD5sum: 124745b1712ef9b3ff4f50058157608d +SHA1: a1264cbc8152150eed1bfd55fc3574fa68d173d3 +SHA256: d00833347422359b85315aba3cfbb356db99310624f40bfb422d980182d9d2cc +SHA512: bc84c0ca1f1420aca7992f3c93abdf092a124e00291fbb8929bb58f1ead9c59aca6ad70198ed4d8a55c33e5e915946229270636bc082b3d16d19556a6f2b9ed2 +Homepage: https://net-snmp.sourceforge.net/ +Description: SNMP (Simple Network Management Protocol) library + The Simple Network Management Protocol (SNMP) provides a framework + for the exchange of management information between agents (servers) + and clients. + . + The Net-SNMP library contains common functions for the construction, + sending, receiving, decoding, and manipulation of the SNMP requests + and responses. + +Package: libsonic0 +Architecture: amd64 +Version: 0.2.0-13build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: sonic +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 37 +Depends: libc6 (>= 2.14) +Filename: pool/libsonic0_0.2.0-13build2_amd64.deb +Size: 11516 +MD5sum: 78075da7dbe675e662f010f3a98e15c1 +SHA1: e387fc60985004e3cdea985bdc4609b610a1ad81 +SHA256: 29b13ed4a03146b042e9b36d2db981f8522e40363e1bbd692a4c0a351eb3d33f +SHA512: 476e3ac482b480a53c746a52185cb429bdd6a7155912db6058813b055cb36d223247e5dcdb7eef8a958e8105929340951e1ebaeec84944534a2008178bfcd85e +Homepage: https://github.com/waywardgeek/sonic +Description: Simple library to speed up or slow down speech + This package contains just the actual library. + libsonic is a very simple library for speeding up or slowing + down speech. It has only basic dependencies, and is meant to + work on both Linux desktop machines and embedded systems. + The key new feature in Sonic versus other libraries is very + high quality at speed up factors well over 2X. + +Package: libsoup-3.0-0 +Architecture: amd64 +Version: 3.6.6-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libsoup3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 722 +Depends: glib-networking, libsoup-3.0-common, libbrotli1 (>= 0.6.0), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgssapi-krb5-2 (>= 1.17), libnghttp2-14 (>= 1.50.0), libpsl5t64 (>= 0.16.0), libsqlite3-0 (>= 3.5.9), zlib1g (>= 1:1.2.0) +Filename: pool/libsoup-3.0-0_3.6.6-1_amd64.deb +Size: 297092 +MD5sum: dcaa7c394f4c82768ccbdebb886ed40e +SHA1: 4878b2b584d1b80127546dc9556286ed13cd9e9c +SHA256: 1e64ec18ac23c235174cd8a5a67b7b087af4172c40e8466216122982feff25a2 +SHA512: af969298bd8ea5e4694d8410ffe3f335e907ecf7f644d36d560e40e731ddd46efbae06938145ceb80ea052054442cd13a305f7cfe52acc2f814f22cf27d5a180 +Homepage: https://libsoup.gnome.org/libsoup-3.0/index.html +Description: HTTP library implementation in C -- Shared library + It was originally part of a SOAP (Simple Object Access Protocol) + implementation called Soup, but the SOAP and non-SOAP parts have now been + split into separate packages. + . + libsoup uses the Glib main loop and is designed to work well with GTK+ + applications. This enables GNOME applications to access HTTP servers + on the network in a completely asynchronous fashion, very similar to + the GTK+ programming model (a synchronous operation mode is also + supported for those who want it). + . + Features: + * Both asynchronous (GMainLoop and callback-based) and synchronous APIs + * Automatically caches connections + * SSL Support using GnuTLS + * Proxy support, including authentication and SSL tunneling + * Client support for Digest, NTLM, and Basic authentication + * Server support for Digest and Basic authentication + * Basic client-side SOAP support + . + This package contains the shared library. + +Package: libsoup-3.0-common +Architecture: all +Version: 3.6.6-1 +Multi-Arch: foreign +Priority: optional +Section: devel +Source: libsoup3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 48 +Filename: pool/libsoup-3.0-common_3.6.6-1_all.deb +Size: 13578 +MD5sum: 1e3b5b029593559d550e430568ba5ae5 +SHA1: b74b910752b11638e4cbb798070972e83a401708 +SHA256: ed47b65b4691273b9330b8371defd9dd5ea6980556f2923ef83e8f78ad8dc02b +SHA512: 221f7bc482cbd1d992621c4de6f032ea2e0b4ee58d6ea80755cfae6634c20addf0e2fbe0e8f2f132f8128475dd8ac96037108bb2d4090dc5db4fc80e639bb0f4 +Homepage: https://libsoup.gnome.org/libsoup-3.0/index.html +Description: HTTP library implementation in C -- Common files + It was originally part of a SOAP (Simple Object Access Protocol) + implementation called Soup, but the SOAP and non-SOAP parts have now been + split into separate packages. + . + This package contains architecture-independent files such as translations. + +Package: libsource-highlight-common +Architecture: all +Version: 3.1.9-4.3build2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: source-highlight +Maintainer: Ubuntu Developers +Original-Maintainer: Kartik Kulkarni +Installed-Size: 305 +Replaces: source-highlight (<< 3.1.4-1) +Filename: pool/libsource-highlight-common_3.1.9-4.3build2_all.deb +Size: 64234 +MD5sum: 7f57fd9abb850e19507580724e025425 +SHA1: c1b5173ae9a503514e048ba73873502a63ee34c4 +SHA256: 9208a5cb2e873ae7bcc458f13d51aaec29a04c563df926cad9145af8a4234bf4 +SHA512: 59f0b50961fe5bc3bb4fe91f2a5e5be1dc4106547be2a6e7e10c0dcc4dd115e25e940bbf072f802e9b0ac32d429fd00a7c6fddef1e988a7c592d545248529272 +Homepage: http://www.gnu.org/software/src-highlite/ +Description: architecture-independent files for source highlighting library + This package contains the data files used by the libsource-highlight + library, which is the library that underlies the source-highlight + program suite. The library converts source code to a document with + syntax highlighting and supports many file formats. The library can + be used by other C++ programs to get source code highlighting + capabilities. + +Package: libsource-highlight4t64 +Architecture: amd64 +Version: 3.1.9-4.3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: source-highlight +Maintainer: Ubuntu Developers +Original-Maintainer: Kartik Kulkarni +Installed-Size: 793 +Provides: libsource-highlight4v5 (= 3.1.9-4.3build2) +Depends: libsource-highlight-common, libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13.1) +Conflicts: libsource-highlight4 +Breaks: libsource-highlight4v5 (<< 3.1.9-4.3build2) +Replaces: libsource-highlight4, libsource-highlight4v5 +Filename: pool/libsource-highlight4t64_3.1.9-4.3build2_amd64.deb +Size: 273064 +MD5sum: 936518fc9dc186536ad7a6807a296a44 +SHA1: c90419e6b32a79c4244d86b095381198da53818a +SHA256: ac2cae4028ef60f003bd62f719a0c9d2451c3ff3f72da6e9fef8808de7636b8a +SHA512: bf6e5aeaada387f5a32c7a683243f170285e714e3c1dbd7977e36466ecb3d7bd9b59c9b095a864d1eb6f510febd43cb506bc92734c22f6268f46e9b58f713e7d +Homepage: http://www.gnu.org/software/src-highlite/ +Description: source highlighting library + This is the library that underlies the source-highlight program + suite. It converts source code to a document with syntax + highlighting and supports many file formats. The library can be used + by other C++ programs to get source code highlighting capabilities. + +Package: libspa-0.2-bluetooth +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1583 +Depends: libspa-0.2-modules (= 1.6.2-1ubuntu1.1), libbluetooth3 (>= 4.91), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libfreeaptx0 (>= 0.1.1), libglib2.0-0t64 (>= 2.83.0), liblc3-1 (>= 1.0.1), libldacbt-abr2 (>= 2.0.2), libldacbt-enc2 (>= 2.0.2), libopus0 (>= 1.1), libsbc1 (>= 2.1), libusb-1.0-0 (>= 2:1.0.16) +Filename: pool/libspa-0.2-bluetooth_1.6.2-1ubuntu1.1_amd64.deb +Size: 471888 +MD5sum: 5e56ac875b954f395b08c1fa465a412b +SHA1: c212f6c8c46bae60dd68bbcff65c655d93e329bf +SHA256: 44e437438cad1e41fceed61036687d43c653765149a87db34e67aa2c5304aefc +SHA512: aa2d36e22d6dc9961520e195f3a7ed382b440ad9ad8d8db8160a54207477c59d223e370100ef5aeb1a16133cb69c896899745a14c5dcd86d300b10e9b5a7bb5d +Homepage: https://pipewire.org/ +Description: libraries for the PipeWire multimedia server - bluetooth plugins + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains a plugin to make Bluetooth audio devices such as + speakers and headsets available to the PipeWire server. + +Package: libspa-0.2-modules +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 3971 +Depends: libasound2t64 (>= 1.2.10), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libfftw3-single3 (>= 3.3.10), libgcc-s1 (>= 3.3.1), libsndfile1 (>= 1.0.20), libstdc++6 (>= 12), libsystemd0, libudev1 (>= 183), libwebrtc-audio-processing-1-3 (>= 1.3) +Breaks: pipewire (<< 0.3.5) +Replaces: pipewire (<< 0.3.5) +Filename: pool/libspa-0.2-modules_1.6.2-1ubuntu1.1_amd64.deb +Size: 1152092 +MD5sum: 4e36ae95d041b281c39f273b0e022f09 +SHA1: 32fbe5735af39313d6fb0b688b778506ffe1827e +SHA256: bd423aecf6f1ea8c3873bfc3c5141b97f275f80eb60ba7270a97c4e613f87b82 +SHA512: e9fff9e7ba5ff32862f6679df7ebdc1ac4057198a46ec64778294e4b43caf5cc7d37f707eadadde6c1ef5a60453e045c6bdcc567c323478d4525abf3637cc416 +Homepage: https://pipewire.org/ +Description: libraries for the PipeWire multimedia server Simple Plugin API - modules + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains core support modules used in the Simple Plugin API, + together with test and utility modules that do not introduce additional + dependencies. It should not normally be depended on directly: PipeWire + clients should depend on the pipewire package instead. + +Package: libspeechd-module0 +Architecture: amd64 +Version: 0.12.1-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: speech-dispatcher +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 46 +Depends: libc6 (>= 2.15) +Filename: pool/libspeechd-module0_0.12.1-2ubuntu1_amd64.deb +Size: 15936 +MD5sum: b359d86c475e839e55dac632e7dcc5c3 +SHA1: afcd0b6cc19e4160000402e25065004b6761bf16 +SHA256: 91b4a260c7dc00cae4619bfd1fc60acc03467a6c220d686680629ed5b0999254 +SHA512: 33c5eface8b360f8d69638712be7202fe8af6a250d292dcac7f746d4da766abf8c856030f77398d17a9a060cfa6bd3e0157a20db75f5131dc78c1744682ef620 +Homepage: http://devel.freebsoft.org/speechd +Description: Speech Dispatcher: Shared libraries for modules + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains a shared library that speech-dispatcher modules can use + for the ground support. + +Package: libspeechd2 +Architecture: amd64 +Version: 0.12.1-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: speech-dispatcher +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 69 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.76.0) +Filename: pool/libspeechd2_0.12.1-2ubuntu1_amd64.deb +Size: 24104 +MD5sum: 0cdf2f29338c7f275d6ac32f4be32f74 +SHA1: 279f0ab810ce16908eace23bb4fe7e4e46ae8084 +SHA256: bcc710c6e635615d7a1b9ad910109b3c2400c9e5faebfd72f73c76aa048f7f7c +SHA512: f02a521d21e390d8657ee9645c6dcc9bf1c1237caff7c7f68cb566282c8eaeb21856708b728f396030fc39b2d995a994db59224d35f1e4b542ea7a1eadf27acc +Homepage: http://devel.freebsoft.org/speechd +Description: Speech Dispatcher: Shared libraries + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains a shared library needed for C programs linked with it. + +Package: libspeex1 +Architecture: amd64 +Version: 1.2.1-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: speex +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 145 +Depends: libc6 (>= 2.29) +Suggests: speex +Filename: pool/libspeex1_1.2.1-3build1_amd64.deb +Size: 63298 +MD5sum: 9a4a6c45b8a406f4030c73b8c0a0979b +SHA1: e2ddbe23c5c6197426543e67671513459cc1cace +SHA256: a680f573914fde02780f169e03d754cfc905b04fa4ef24663eb8d27f10033804 +SHA512: 8565bc3fa08ce85cc39323c1b406a637ffdf1b91c67abb76064f295ccb773fef3dea0e9a7f6d465eb13cc316773d1fbbd527b4e3078fae7b1bbab961ef315608 +Homepage: https://www.speex.org/ +Description: Speex codec library (runtime library) + Speex is an audio codec especially designed for compressing voice at low + bit-rates for applications such as voice over IP (VoIP). In some senses, + it is meant to be complementary to the Vorbis codec which places a greater + emphasis on high-quality music reproduction. + . + This package provides the speex runtime library. + +Package: libspeexdsp1 +Architecture: amd64 +Version: 1.2.1-3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: speexdsp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 102 +Depends: libc6 (>= 2.29) +Filename: pool/libspeexdsp1_1.2.1-3build1_amd64.deb +Size: 45478 +MD5sum: 96456d61c686f7be57332ba50a4a51bc +SHA1: cb9c5d0377e87746c6f810d78e7e60069e0dfffe +SHA256: f7f312d0b692658e5aaa9c6c4860baa9edbf8855fbc37d20e9b7f2ad17358943 +SHA512: e601c3e182eaec56406095672fb3280a04622bc33719f4a001b2fa55a8956cfaeaa303c5b7578af1ee0f89bb946e37387771da3160046d54d8df668129ec08f7 +Homepage: https://www.speex.org/ +Description: DSP library derived from speex + Speex is an audio codec especially designed for compressing voice at low + bit-rates for applications such as voice over IP (VoIP). In some senses, + it is meant to be complementary to the Vorbis codec which places a greater + emphasis on high-quality music reproduction. + . + This package provides the runtime library of additional DSP functions that + are part of the Speex distribution. + +Package: libspelling-1-2 +Architecture: amd64 +Version: 0.4.9-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libspelling +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 177 +Depends: libc6 (>= 2.38), libenchant-2-2 (>= 2.2.3), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.15.5), libgtksourceview-5-0 (>= 5.10.0), libicu78 (>= 78.1-1~), libpango-1.0-0 (>= 1.18.0), libspelling-common +Filename: pool/libspelling-1-2_0.4.9-1build1_amd64.deb +Size: 58142 +MD5sum: 52d3c0c9f287256ad4792afe06efd782 +SHA1: 8d35f1ccc02e2d9e98f9d74f81d2bac9f9ce1e51 +SHA256: 1389974b075075c0c4abb5f3eb4d70e49a633516c512c8f1d437e6c4f5ffb3b5 +SHA512: dce124282ee05df6a05d4dc899408933ff4e5abf1a45a0626f66252c8a2be24daedb2fd9a132868eea0ebf98daf33449f24ec6d17214f5acb82e4886fe70d66a +Homepage: https://gitlab.gnome.org/chergert/libspelling +Description: Spellcheck library for GTK 4 + A spellcheck library for GTK 4 heavily based upon GNOME Text Editor and + GNOME Builder's spellcheck implementation. + +Package: libspelling-common +Architecture: all +Version: 0.4.9-1build1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libspelling +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Filename: pool/libspelling-common_0.4.9-1build1_all.deb +Size: 2800 +MD5sum: 3f152f41029c3b3a4301ac1197cda820 +SHA1: 5c0c807103184b9beb95f9ff3a3de318d5b2bc4c +SHA256: a904fc5d2a4b6219a721441e02f710ad078f8671ee50d560ec6d16cdda8b078d +SHA512: d760320624c43b048e43f945ab4c87a1a70aa864e35dbc78b9baa55bc933c9be41edf010ad2ffa8e0169ed73eb8fe7f865f80a37883d1c9e2e6568017e972041 +Homepage: https://gitlab.gnome.org/chergert/libspelling +Description: Spellcheck library for GTK 4 (common files) + A spellcheck library for GTK 4 heavily based upon GNOME Text Editor and + GNOME Builder's spellcheck implementation. + . + This package contains architecture-independent files such as translations. + +Package: libsqlite3-0 +Architecture: amd64 +Version: 3.46.1-9ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: sqlite3 +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 1783 +Depends: libc6 (>= 2.38) +Breaks: crowdsec (<< 1.4), python-migrate (<< 0.11.0-4~), python3-migrate (<< 0.11.0-4~) +Filename: pool/libsqlite3-0_3.46.1-9ubuntu0.2_amd64.deb +Size: 719420 +MD5sum: 54dd8bc42422c167108fbe6633f6b12b +SHA1: 4bdc29e22fc1455be864c3c27c77c5148f39074c +SHA256: 8671ee6299becd379a13ffb7a50cf4ee48f2a02ef1ea0d6dd1de829a704aa11b +SHA512: d273a1610550bc15fd0f28e85c6e7a57c832df2cf1e042cea13587d0d5fecbe339bab6bff6555a2aec3971dd8ac0e7bf2e7292486398b74ae03f6d5cca229bde +Homepage: https://www.sqlite.org/ +Description: SQLite 3 shared library + SQLite is a C library that implements an SQL database engine. + Programs that link with the SQLite library can have SQL database + access without running a separate RDBMS process. + +Package: libsss-certmap0 +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: libs +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 120 +Depends: libc6 (>= 2.14), libssl3t64 (>= 3.0.0), libtalloc2 (>= 2.0.4~git20101213) +Filename: pool/libsss-certmap0_2.12.0-1ubuntu5.4_amd64.deb +Size: 45686 +MD5sum: d8b910d88f6b5ea4a441b48e8d830613 +SHA1: 1bc4f4d7bbb7afecb169adfba181f55fc799ef81 +SHA256: 15338a9d22388df8f3c6fa81f0c134500cb647995a78ececa26e53c5c496998c +SHA512: e58984173b9d8af80f14f7b72bc7a833e3490a6ccf4a9ac50180334224c541a140052a310836a65ea0ebc7d7de85d5f9183f4f685cb38c007d1e2359e55ca3c7 +Homepage: https://github.com/SSSD/sssd +Description: Certificate mapping library for SSSD + Library to map certificates to users based on rules. + +Package: libsss-idmap0 +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: libs +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 61 +Depends: libc6 (>= 2.14), libunistring5 (>= 1.1) +Filename: pool/libsss-idmap0_2.12.0-1ubuntu5.4_amd64.deb +Size: 21416 +MD5sum: efe1d8586f01e0c1a74a9655d3b9a59c +SHA1: a1f68a1f3fa3eeaff03c8af02d3d6130c0d151cf +SHA256: b9361e8fb9dee71a0a12fb991a4217ae1d5fc470134a076023829eae8e924311 +SHA512: 1bc3267576b28bbbb666a7e0fb6b1a3c0717141a40bff31f7af0625deea3362111ecddc58c81bafec86736371de8e30cdbbc50c64046ee7e0210f67396b269e9 +Homepage: https://github.com/SSSD/sssd +Description: ID mapping library for SSSD + Utility library to convert SIDs to Unix uids and gids. + +Package: libsss-nss-idmap0 +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: libs +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 78 +Depends: libc6 (>= 2.34) +Filename: pool/libsss-nss-idmap0_2.12.0-1ubuntu5.4_amd64.deb +Size: 28988 +MD5sum: df653c52c76e002c4b64061b74f16208 +SHA1: 1b7a031b1cdec2992d1c30d88cb57b46977514a6 +SHA256: a3ddcac8865688571223c74f78c4a35ea3bcc8380d83e5f1191e33cb5cda3d07 +SHA512: 5687bc5deb0fa6c9279f88c66514bfeb20e58695d0bf05ca9259b1b62ceae2e3180f92f7507021e00a0d6462c3c0b954e7e7d48a3f55d78b467e79158d24bbe7 +Homepage: https://github.com/SSSD/sssd +Description: SID based lookups library for SSSD + Utility library for SID based lookups. + +Package: libstartup-notification0 +Architecture: amd64 +Version: 0.12-8build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: startup-notification +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 62 +Depends: libc6 (>= 2.38), libx11-xcb1, libxcb-util1 (>= 0.4.0), libxcb1 +Filename: pool/libstartup-notification0_0.12-8build1_amd64.deb +Size: 19144 +MD5sum: 6bc9472c766d6adbe3364fbfa6e02cca +SHA1: 2bfdc0eaff8716889a1d10cc11989ec695b42f05 +SHA256: f2bce732be30ef78e242fa05677e0034da70cb854709635f17f0a509719c8ff4 +SHA512: 08400552e6dc914aec21f582ba4ce889710b5245da0786f0cf33bc451a9071a90f41dfc3389469a1e5ba61cbbc721610267f61b54c8b415f002f0f8dda0a7283 +Homepage: https://www.freedesktop.org/wiki/Software/startup-notification/ +Description: library for program launch feedback (shared library) + startup-notification is a library which allows programs to give the user + visual feedback that they are being launched; this is typically implemented + using a busy cursor. This library is currently used by GNOME programs, but + is part of the freedesktop.org suite of cross-desktop libraries. + . + This package contains the shared library. + +Package: libstemmer0d +Architecture: amd64 +Version: 3.0.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: snowball +Maintainer: Ubuntu Developers +Original-Maintainer: Stefano Rivera +Installed-Size: 914 +Depends: libc6 (>= 2.4) +Filename: pool/libstemmer0d_3.0.1-1_amd64.deb +Size: 171642 +MD5sum: 946b84c49853901bb8d4b0dc87c158a5 +SHA1: 8be913d9f7105f53f71b883cbda4ba0e4fc2ee93 +SHA256: ff03ff070cebf6e5949dc48df012e707b43cc381e4c6da5ece52282af6476eb6 +SHA512: 43aa03794247cd65e0fbc0f6ff8b1d3131a62bcce4f9ee9721c18987944c17341c3baa44766e010e2d8e2d79b286e98bf78846280209cac76ee7aaf96e7fa5cd +Homepage: https://snowballstem.org/ +Description: Snowball stemming algorithms for use in Information Retrieval + Snowball provides access to efficient algorithms for calculating a + "stemmed" form of a word. This is a form with most of the common + morphological endings removed; hopefully representing a common + linguistic base form. This is most useful in building search engines + and information retrieval software; for example, a search with stemming + enabled should be able to find a document containing "cycling" given the + query "cycles". + . + Snowball provides algorithms for several (mainly European) languages. + It also provides access to the classic Porter stemming algorithm for + English: although this has been superseded by an improved algorithm, the + original algorithm may be of interest to information retrieval + researchers wishing to reproduce results of earlier experiments. + +Package: libsysprof-6-6 +Architecture: amd64 +Version: 50.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: sysprof +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 566 +Depends: libsysprof-6-modules (>= 50.0-1), libc6 (>= 2.38), libdebuginfod1t64 (>= 0.180), libdex-1-1 (>= 0.9), libgcc-s1 (>= 3.4), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libpolkit-gobject-1-0 (>= 0.99), libstdc++6 (>= 4.1.1), libsystemd0 +Filename: pool/libsysprof-6-6_50.0-1_amd64.deb +Size: 190520 +MD5sum: bc26231881e2d53427c6fbd117d41c9e +SHA1: b13e78d584d4dddcc22ad066109b95a13fba0ee5 +SHA256: 2121d9d2a027bd70203ee0584ff046eb7bf17c537a77c91eecf0517d1e3f63f6 +SHA512: c24f9aa2d9bcfbeef917cba28da7e4cd0df0d87f0c8889f113367729f92ddd0cc8e32d51335cbd383f89851bdccf1adee956a449bef6364d00b2f4c0fd4af0e5 +Homepage: https://apps.gnome.org/Sysprof/ +Description: library for system-wide Linux profiler + Sysprof is a sampling CPU profiler that uses a ptrace in Linux kernel to + profile the entire system, not just a single application. Sysprof handles + shared libraries and applications do not need to be recompiled. In fact they + don't even have to be restarted. + . + This package provides the shared library for console applications + embedding sysprof. + +Package: libsysprof-6-modules +Architecture: amd64 +Version: 50.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: sysprof +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 92 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libunwind8 +Filename: pool/libsysprof-6-modules_50.0-1_amd64.deb +Size: 22028 +MD5sum: 6e9097eb2caafa2a2af8b1077d914ef1 +SHA1: 9c0e5750f6d65cafd6cbdfa64621d2f7394eda1d +SHA256: b1f0e4fa0ec2c561008a254ec8447cc563d9d2cf9aa26818b6c6ff195172d4d8 +SHA512: 64d6ac830e61837f98882fbbdd3929b594b5d9db68f421e094225ad7f8e6f6e3f449332b3b6d8038f4720005add4477eee337f0a7b8148e3b1a13904ff3e5029 +Homepage: https://apps.gnome.org/Sysprof/ +Description: LD_PRELOAD modules for system-wide Linux profiler + Sysprof is a sampling CPU profiler that uses a ptrace in Linux kernel to + profile the entire system, not just a single application. Sysprof handles + shared libraries and applications do not need to be recompiled. In fact they + don't even have to be restarted. + . + This package provides LD_PRELOAD modules that can be injected into the + program being profiled. + +Package: libsystemd-shared +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: same +Priority: optional +Section: libs +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 7383 +Depends: libc6 (>= 2.39), libcrypt1 (>= 1:4.4.0), libssl3t64 (>= 3.4.0) +Recommends: libacl1, libapparmor1, libaudit1, libblkid1, libkmod2, libmount1, libpam0g, libseccomp2, libselinux1, libzstd1 +Suggests: libarchive13t64, libbpf1, libcryptsetup12, libdw1t64, libelf1t64, libfido2-1, libgcrypt20, libidn2-0, liblz4-1, liblzma5, libp11-kit0, libpcre2-8-0, libpwquality1, libqrencode4, libtss2-esys-3.0.2-0t64, libtss2-mu-4.0.1-0t64, libtss2-rc0t64 +Filename: pool/libsystemd-shared_259.5-0ubuntu3.4_amd64.deb +Size: 2462336 +MD5sum: 006fe4b7818da4bf6a2307fbb2bd1b75 +SHA1: 3489624e8a124e8b4c4ca8748d0f07a3b128c115 +SHA256: 9b30b1e96cc8b48f94a2df5c1cbee7690e16f727d71b40c458a64aabe15db35f +SHA512: f56354d4677d934fa66c172c9bfd68b13fc0a182ec8a5e321eb5c7648b9eaca9633f7b20f06a454cd39046d0770d0ee5fc5634abb70d0f0a1670cda57cf7657b +Homepage: https://systemd.io +Description: systemd shared private library + This internal shared library provides common code used by various systemd + components. It is supposed to decrease memory and disk footprint. + The shared library is not meant for public use and is not API or ABI stable. + +Package: libtag2 +Architecture: amd64 +Version: 2.2.1-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: taglib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 1484 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13.1), zlib1g (>= 1:1.1.4) +Filename: pool/libtag2_2.2.1-3_amd64.deb +Size: 422258 +MD5sum: 0a8e1105dcd490331895e01a2e53ecb7 +SHA1: d20b690486be3d49b483dada7b6299cdc790ab41 +SHA256: 9b74ea1de651e630956a6f2004de1e52855b1b76730e4ae2a125cfbb81bb9506 +SHA512: 1020850b83869644d819163a7bd3b002988ccb3467930ccb61b7a5715713ac9f4b8f90c10dfd95ed7be73f7d8502ba6881e66f0f0abc4327af3eec17e45e736f +Homepage: https://taglib.org/ +Description: audio meta-data library + TagLib is a library for reading and editing audio meta data, commonly know as + tags. + . + - A clean, high level, C++ API to handling audio meta data. + - Format specific APIs for advanced API users. + - ID3v1, ID3v2, APE, FLAC, Xiph, iTunes-style MP4 and WMA tag formats. + - MP3, MPC, FLAC, MP4, ASF, AIFF, WAV, TrueAudio, WavPack, Ogg FLAC, Ogg + Vorbis, Speex and Opus file formats. + - Basic audio file properties such as length, sample rate, etc. + - Long term binary and source compatibility. + - Extensible design, notably the ability to add other formats or extend + - current formats as a library user. + - Full support for unicode and internationalized tags. + - Dual MPL and LGPL licenses. + - No external toolkit dependencies. + . + This is the runtime package for programs that use the TagLib Audio Meta-Data + Library. + +Package: libtalloc2 +Architecture: amd64 +Version: 2:2.4.3+samba4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba (2:4.23.6+dfsg-1ubuntu2.2) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 112 +Depends: libc6 (>= 2.38) +Filename: pool/libtalloc2_2%3a2.4.3+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 50956 +MD5sum: a9e03a4488b2fc1fcceadc1fd5990a9c +SHA1: 7f29a5b92f59945d75b184e1524101476963d3d9 +SHA256: f2d5bb6a77cbe17efbd9e077caf41757dc5b602b5c15fc243077beb87c20e184 +SHA512: f55b0fec2b99c35017622a05a07e426456212ae48c8981cc13f480a6b89fc86d4fdb38a5bd0f336a208102cb5c91b717d64e1083dcfa96a57814e03a9c7ae481 +Homepage: https://www.samba.org +Description: hierarchical pool based memory allocator + A hierarchical pool based memory allocator with destructors. It uses + reference counting to determine when memory should be freed. + +Package: libtcl8.6 +Architecture: amd64 +Version: 8.6.17+dfsg-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: tcl8.6 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Tcl/Tk Packagers +Installed-Size: 4125 +Provides: libtcl +Depends: tzdata, libc6 (>= 2.42), zlib1g (>= 1:1.2.2) +Suggests: tcl8.6 +Conflicts: tcl74 (<= 7.4p3-2), tcl8.6 (<< 8.6.0-2) +Breaks: nsf (<< 2.2.0) +Replaces: tcl8.6 (<< 8.6.0-2) +Filename: pool/libtcl8.6_8.6.17+dfsg-1build1_amd64.deb +Size: 1003440 +MD5sum: 5d4bb871253afd431ebfd0230803f648 +SHA1: bc8ed275ea692c22edf409743c30e2562b95114c +SHA256: 7e062e6b4c8e4c4c5122679c193c4567c1bf4dab3555a64ea2449a256cfd8043 +SHA512: daf6233e4a6f81dd5fd9e83f750b945bffeea47e8d6d176095bee426b078c65283b0dffc251acfc52dd280e7a55e2d0e22d5bb80f213c2026bc37751f31e2138 +Homepage: http://www.tcl.tk/ +Description: Tcl (the Tool Command Language) v8.6 - run-time library files + Tcl is a powerful, easy to use, embeddable, cross-platform interpreted + scripting language. This package contains the Tcl library and auxiliary + code which allows one to run Tcl-enabled applications. This version + includes thread support. + +Package: libtdb1 +Architecture: amd64 +Version: 2:1.4.14+samba4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba (2:4.23.6+dfsg-1ubuntu2.2) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 156 +Depends: libc6 (>= 2.34) +Filename: pool/libtdb1_2%3a1.4.14+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 70458 +MD5sum: ab37704d0ba04d6691f7feec8cceef7d +SHA1: 00cba2369c91a02bdab180d6fca272bd8bdfcdb0 +SHA256: 12a81cae04403ab6abf1239876c1ccf6142067ecb923e8af5854829898965101 +SHA512: c344df9b945a1452971f1ab4746ea4555ae44acc6a535366c33f137c9fd4b1ecabf4fd96de020d7d21a1ae8f0e416bf923912768e6777c1dca7351b455d1a278 +Homepage: https://www.samba.org +Description: Trivial Database - shared library + This is a simple database API. It is modelled after the structure + of GDBM. TDB features, unlike GDBM, multiple writers support with + appropriate locking and transactions. + . + This package contains the shared library file. + +Package: libteamdctl0 +Architecture: amd64 +Version: 1.31-1build4 +Multi-Arch: same +Priority: optional +Section: net +Source: libteam +Maintainer: Ubuntu Developers +Original-Maintainer: Dmitry Smirnov +Installed-Size: 44 +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10) +Filename: pool/libteamdctl0_1.31-1build4_amd64.deb +Size: 12458 +MD5sum: 45582a4c7c39d1a2089016070d59060a +SHA1: ab3540885c7d46ee9ac3195ad0ba71d126666033 +SHA256: 0e4cdcba8844bc2cc9787f86ed8bc8df27e5fddcd0400688097f98f3780c8da1 +SHA512: e73b464bc81db03f5e2b51f193ac5ccfb117e292dc21d50f9da21ca43790ed880f92c00338bf2e1d02763506a949138ea69ce74b14655b6f8f973b315abdf954 +Homepage: http://libteam.org +Description: library for communication with `teamd` process + libteamdctl is a library for communication with teamd process + (via D-Bus, Unix socket or zeromq). It is used by the `teamdctl` utility. + . + Libteam provides a mechanism to team multiple NICs (ports) at OSI Layer 2 + (Data link) into a single virtual NIC. The process is called "channel + bonding", "Ethernet bonding", "channel teaming", "link aggregation", etc. + This is already implemented in the Linux kernel by the bonding driver but + unlike the bonding driver, libteam (user space) has the following + additional features: + * load-balancing for LACP support + * NS/NA (IPV6) link monitoring + * port priorities and stickiness ("primary" option enhancement) + * separate per-port link monitoring setup + . + Libteam requires Linux kernel 3.3 or higher. + +Package: libtevent0t64 +Architecture: amd64 +Version: 2:0.17.1+samba4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba (2:4.23.6+dfsg-1ubuntu2.2) +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 153 +Provides: libtevent0 (= 2:0.17.1+samba4.23.6+dfsg-1ubuntu2.2) +Depends: libc6 (>= 2.34), libtalloc2 (>= 2.1.0) +Breaks: libtevent0 (<< 2:0.17.1+samba4.23.6+dfsg-1ubuntu2.2~) +Replaces: libtevent0 +Filename: pool/libtevent0t64_2%3a0.17.1+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 41968 +MD5sum: dcc5765508f6535739fbd875fd7db8c2 +SHA1: c68bbc8fe00dfaa9cabead08babf819ec31dce2a +SHA256: c44b855af26408fec0aa149bc7d00acd7595621215ba278885173f7eee033f44 +SHA512: 540f6328bbe61630e38f60df02677c73064b4df460f75746634a04f0d5fc91843a8a602adbec14470f279688fbbd90b3ededd8165717a16c93635d6cb806ae1d +Homepage: https://www.samba.org +Description: talloc-based event loop library - shared library + tevent is a simple library that can handle the main event loop for an + application. It supports three kinds of events: timed events, file + descriptors becoming readable or writable and signals. + . + Talloc is used for memory management, both internally and for private + data provided by users of the library. + . + This package provides the shared library file. + +Package: libtext-charwidth-perl +Architecture: amd64 +Version: 0.04-11build4 +Multi-Arch: same +Priority: required +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 42 +Depends: libc6 (>= 2.4), perl-base (>= 5.40.0-6), perlapi-5.40.0 +Filename: pool/libtext-charwidth-perl_0.04-11build4_amd64.deb +Size: 9530 +MD5sum: 8457ab8e5fb55f91e0f4316d094d0f24 +SHA1: d8bc6be731d0b3db4f19ff2cb76b5a79c70737b7 +SHA256: 55089bcbe8f6213d500900769f5161e35fb9e4147cf472b469a37e1d1e96a022 +SHA512: 25dca7a820361ccfdf25f78c191fc4695372cbc5f5b58bb0ddf1b3ae7d2092748a2f20bedb01c6a34977764138cca3a52b0109cbf1411779b959d4ba92e49cbb +Homepage: https://metacpan.org/release/Text-CharWidth +Description: get display widths of characters on the terminal + Text::CharWidth permits one to get the display widths of characters + and strings on the terminal, using wcwidth() and wcswidth() from libc. + . + It provides mbwidth(), mbswidth(), and mblen(). + +Package: libtext-iconv-perl +Architecture: amd64 +Version: 1.7-8.1 +Multi-Arch: same +Priority: required +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 48 +Depends: libc6 (>= 2.4), perl-base (>= 5.40.1-6build1), perlapi-5.40.1 +Filename: pool/libtext-iconv-perl_1.7-8.1_amd64.deb +Size: 13644 +MD5sum: 7145a8e97ab250458b2b68119db86f97 +SHA1: 1b378e838aaa0c7310131260234b85d96e063a88 +SHA256: 9543434d570888be8d079a7277f935e963336d84a672cff6a3899957f7c59cf3 +SHA512: 3db559c14e5ced1b31a409cbf03a59e22df108100fe81bd25fbfd93fc393e66114f88891a33b96c348abeb5bda62205d982d78d2648ad03061b658292685f11b +Homepage: https://metacpan.org/release/Text-Iconv +Description: module to convert between character sets in Perl + The iconv() family of functions from XPG4 defines an API for converting + between character sets (e.g. UTF-8 to Latin1, EBCDIC to ASCII). They + are provided by libc6. + . + This package allows access to them from Perl via the Text::Iconv + package. + +Package: libtext-wrapi18n-perl +Architecture: all +Version: 0.06-10 +Priority: required +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 24 +Depends: libtext-charwidth-perl +Filename: pool/libtext-wrapi18n-perl_0.06-10_all.deb +Size: 7694 +MD5sum: 3e118182edab8a7ec04b9fbc0a6b4a7e +SHA1: 9e3859f71694e32f349c4cd837983a36d1ab8ad5 +SHA256: 936619071dd5d81ff672b685af9ad20e1f524be2241cbd80556aedc376844a36 +SHA512: d600f3adbc740e20589eb96d421697af13bf31e6b516ef6ece3cd33b365c8ceaf103fb84b29df940acf1cdb25bf33f5ec95d4ad1831bfaccb533d77e893996a9 +Homepage: https://metacpan.org/release/Text-WrapI18N +Description: internationalized substitute of Text::Wrap + The Text::WrapI18N module is a substitution for Text::Wrap, supporting + multibyte characters such as UTF-8, EUC-JP, and GB2312, fullwidth characters + such as east Asian characters, combining characters such as diacritical marks + and Thai, and languages which don't use whitespaces between words such as + Chinese and Japanese. + . + It provides wrap(). + +Package: libthai-data +Architecture: all +Version: 0.1.30-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libthai +Maintainer: Ubuntu Developers +Original-Maintainer: Theppitak Karoonboonyanan +Installed-Size: 594 +Breaks: libthai0 (<< 0.1.10) +Filename: pool/libthai-data_0.1.30-1_all.deb +Size: 154800 +MD5sum: 0be543a3e84c89df4326236f00bbb078 +SHA1: 2d202580510661389789d643fda6a8669598f2e4 +SHA256: 345fa75fcec8b562e2c6a4a5cd61187e7b825c8379fadb7f3f60d64d73ab1b72 +SHA512: 2d84f58bbac0a83ec98a9916adee8a219da9f0bfdf0aadca79a195b33e15254c5a6113b75aa86b1527e933f265852d8e126957bcfbf3fe9c279902d2ce653705 +Homepage: https://linux.thai.net/projects/libthai +Description: Data files for Thai language support library + LibThai is a set of Thai language support routines aimed to ease + developers' tasks to incorporate Thai language support in their applications. + It includes important Thai-specific functions e.g. word breaking, input and + output methods as well as basic character and string supports. + . + This package contains data files needed by the LibThai library. + +Package: libthai0 +Architecture: amd64 +Version: 0.1.30-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libthai +Maintainer: Ubuntu Developers +Original-Maintainer: Theppitak Karoonboonyanan +Installed-Size: 97 +Depends: libthai-data (>= 0.1.10), libc6 (>= 2.14), libdatrie1 (>= 0.2.0) +Enhances: libqtcore4, libqtgui4 +Filename: pool/libthai0_0.1.30-1_amd64.deb +Size: 19174 +MD5sum: 7eac61e35ea0f71729994323d45f5cf6 +SHA1: d94c484966d89b1bd25902ec5841492fa7317761 +SHA256: c06f206be1ef7aa8208110b38945205ebc742dd777cbb39142baa555fe61390a +SHA512: 9521e4be1fd7f9936ebf2823242102365db1d0d565aca6cb80dfe24f4fca6fdfe73357a500be0d4898d6f731b663a549427bc9599610dfab3644709923255805 +Homepage: https://linux.thai.net/projects/libthai +Description: Thai language support library + LibThai is a set of Thai language support routines aimed to ease + developers' tasks to incorporate Thai language support in their applications. + It includes important Thai-specific functions e.g. word breaking, input and + output methods as well as basic character and string supports. + . + This package contains the shared libraries needed to run programs that use + the LibThai library. + +Package: libtheora1 +Architecture: amd64 +Version: 1.2.0+dfsg-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: libtheora +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 289 +Depends: libc6 (>= 2.14), libcairo2 (>= 1.2.4), libogg0 (>= 1.1.0) +Filename: pool/libtheora1_1.2.0+dfsg-6_amd64.deb +Size: 139776 +MD5sum: fdeed34433172ef7fc3f0206226ba913 +SHA1: 820811213793942e8eedd65606d98e5aa38298ff +SHA256: d4c3f4f488e53bf85fa5798ef07fda19519c5f54702c17c6528c4893ae5cbd99 +SHA512: b22777172e4ad87c45cfaa11c754964dee4fca124fbe8d4069f1d1bb52dd98e5cfaa21c32e6bb31e10d87e3ef87a72421edbd272857ff9a99232381e762cd38a +Homepage: https://www.theora.org/ +Description: Theora Video Compression Codec (shared library - libtheora) + Theora is an open video codec being developed by the Xiph.org Foundation as + part of their Ogg project. Theora is originally derived from On2's VP3 codec, + and has improved on it significantly with the merging of code from the + Thusnelda branch. + . + This package contains the shared library libtheora. + +Package: libtheoradec2 +Architecture: amd64 +Version: 1.2.0+dfsg-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: libtheora +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 125 +Depends: libc6 (>= 2.14), libcairo2 (>= 1.2.4) +Filename: pool/libtheoradec2_1.2.0+dfsg-6_amd64.deb +Size: 55638 +MD5sum: e46da518ab79cab2aa12e9842257792c +SHA1: 124598e17812284281398835f52becd2a4e35593 +SHA256: ba95870a379eb408156f76922ddebceef0a9293ce92abb9112a86ada0751eb84 +SHA512: c54d2fcd94a9d9946388f608b469256e5cbf2fb5eb6a526f3992c2857718ec6209b27416ba92bb555fa48cd4b76967a04b2d45fc4492b1331e58be9655dd154b +Homepage: https://www.theora.org/ +Description: Theora Video Compression Codec (shared library - libtheoradec) + Theora is an open video codec being developed by the Xiph.org Foundation as + part of their Ogg project. Theora is originally derived from On2's VP3 codec, + and has improved on it significantly with the merging of code from the + Thusnelda branch. + . + This package contains the shared library libtheoradec. + +Package: libtheoraenc2 +Architecture: amd64 +Version: 1.2.0+dfsg-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: libtheora +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 228 +Depends: libc6 (>= 2.14), libogg0 (>= 1.1.0) +Filename: pool/libtheoraenc2_1.2.0+dfsg-6_amd64.deb +Size: 106272 +MD5sum: cbd7939a72e288b9537130c724665b2f +SHA1: 9b21022d59c6e26ed466b1643afe80de4a9b6751 +SHA256: fee798e4313614856255942dafa86975f0f68538974e0edc600a844e1f151166 +SHA512: e351f7f5b69ccc73d227541ee7d7d24a2af9ce353cb2ce71dc3ba0b89b88eb7d0ea8476cf4606582e941fa8541122ac14f1c9c09cfa43686d52f207ab590231d +Homepage: https://www.theora.org/ +Description: Theora Video Compression Codec (shared library - libtheoraenc) + Theora is an open video codec being developed by the Xiph.org Foundation as + part of their Ogg project. Theora is originally derived from On2's VP3 codec, + and has improved on it significantly with the merging of code from the + Thusnelda branch. + . + This package contains the shared library libtheoraenc. + +Package: libtie-ixhash-perl +Architecture: all +Version: 1.23-4 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 33 +Depends: perl:any +Filename: pool/libtie-ixhash-perl_1.23-4_all.deb +Size: 11300 +MD5sum: 065dfb2fa872a8d0067aa87ea75fdebb +SHA1: 1574456051c021ed186a5fe589e2569f261e061b +SHA256: 8ca609994bc5000622e212f23e7e7d39f1b0e2f23cd770ea25f4039d0c7524f8 +SHA512: ca424aecf1456b766d444421521552084cef3d8dc1612e9b7f73700e15b4502ac3d8cfc6dc264cead3afbf0659c2e450fdfcc13f50a718425ae9a18c313ce35d +Homepage: https://metacpan.org/release/Tie-IxHash +Description: Perl module to order associative arrays + Tie::IxHash implements Perl hashes that preserve the order in which the + hash elements were added. The order is not affected when values + corresponding to existing keys in the IxHash are changed. The elements can + also be set to any arbitrary supplied order. The familiar perl array + operations can also be performed on the IxHash. + +Package: libtiff6 +Architecture: amd64 +Version: 4.7.0-3ubuntu5 +Multi-Arch: same +Priority: optional +Section: libs +Source: tiff +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 614 +Depends: libc6 (>= 2.38), libdeflate0 (>= 1.0), libjbig0 (>= 2.0), libjpeg8 (>= 8c), liblerc4 (>= 3.0), liblzma5 (>= 5.1.1alpha+20120614), libwebp7 (>= 1.5.0), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Breaks: libimager-perl (<< 1.022+dfsg) +Filename: pool/libtiff6_4.7.0-3ubuntu5_amd64.deb +Size: 205792 +MD5sum: 8b1d9ab1af900393826d627112635433 +SHA1: 97be71fd323f7be1a4d9ccd73c8904abcb39f680 +SHA256: f48cb837a644826b9411ecd9692cbd57fbcb57b5b8fba026652d9204b3acb169 +SHA512: b3bc6eed6053198ced83a9c1578ad5050f8d2f6d3fcfd14af6a668d7b96ff2c88704b32af8d801acf1d1c8014f5cd28de925f5871fd1db13796b75bdca77bfa8 +Homepage: https://libtiff.gitlab.io/libtiff/ +Description: Tag Image File Format (TIFF) library + libtiff is a library providing support for the Tag Image File Format + (TIFF), a widely used format for storing image data. This package + includes the shared library. + +Package: libtime-duration-perl +Architecture: all +Version: 1.21-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 34 +Depends: perl:any +Filename: pool/libtime-duration-perl_1.21-2_all.deb +Size: 12322 +MD5sum: 6d88f4ce40b082cb2ffc4c4e3b584d8e +SHA1: 63945cc1755abc91eef75eee6d4ce40a5489355b +SHA256: 0a26c970c323e7a95465674e4393bfaa18883777274672df61444dd7c5cdf7a5 +SHA512: e21d4d149b91027088652ce81d805992fe4b423f7b979c958a1293dfd6db6765aa0f137177daea0d81b2721ddf529f2fdb141f7e32529baa8d35af0119291dcd +Homepage: https://metacpan.org/release/Time-Duration +Description: module for rounded or exact English expression of durations + Time::Duration provides functions for expressing time spans in rounded + or exact terms. So while + . + say duration_exact(86399); + . + will correctly give "23 hours, 59 minutes, and 59 seconds", + . + say ago(86399); + . + will output the rounded time span as "1 day ago". + . + The provided functions are duration(), ago(), from_now(), later() and + earlier(), along with their *_exact counterparts. The precision used + for rounding can be specified, and version 1.10 added a millisecond + mode. + +Package: libtimedate-perl +Architecture: all +Version: 2.3300-2 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 123 +Depends: perl:any +Filename: pool/libtimedate-perl_2.3300-2_all.deb +Size: 33972 +MD5sum: a6d1c070244ed4e1d0ce99baffc2465f +SHA1: abac1996abd782ec132b6dfc103cbc926afc7ca2 +SHA256: 71c8cf8da8e3f273070268f093cf7b418371be2c8a70566875d0fe6b5d119f89 +SHA512: 3006ad90acc8df932fc1b129f5118564a4f8c3982140e9aa9e025c00a9ad142299616ffa4cb35fba99ea9a4d3ead54382a0b88048d7b74300f56085237cb65be +Homepage: https://metacpan.org/release/TimeDate +Description: collection of modules to manipulate date/time information + TimeDate is a collection of Perl modules useful for manipulating date and + time information. Date::Parse can parse absolute date specifications in a + wide variety of input formats and many languages (via Date::Language). + . + This package also includes Date::Format, which can format dates into strings, + as well as Time::Zone, which contains miscellaneous time zone functions. + +Package: libtinysparql-3.0-0 +Architecture: amd64 +Version: 3.11.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: tinysparql +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 986 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libicu78 (>= 78.1-1~), libjson-glib-1.0-0 (>= 1.5.2), libsoup-3.0-0 (>= 3.1.3), libsqlite3-0 (>= 3.20.0), libstemmer0d (>= 0+svn527), libxml2-16 (>= 2.14.1) +Breaks: libtracker-sparql-3.0-0 (<< 3.8.2-5~) +Replaces: libtracker-sparql-3.0-0 (<< 3.8.2-5~) +Filename: pool/libtinysparql-3.0-0_3.11.0-1_amd64.deb +Size: 323170 +MD5sum: e327711534ca477063f9fade70f1ad68 +SHA1: 299114ed799727b68258aecc70025b09592131d8 +SHA256: 0ce9b37325ceed91344c775dcf3b70db0e7140ab18b6567cb44e411b67f05a6f +SHA512: bdd50bee79a5bb295f6b7d125776e0a014cde5c418ca1118a41f08ab1173a362a3a13cccdfd8e012e3535695aeee52e0284356bb9e3ee7bf0da1285a52c5073f +Homepage: https://tracker.gnome.org/ +Description: metadata database, indexer and search tool - library + This package contains a library to perform SPARQL queries and updates in the + TinySPARQL store. + . + TinySPARQL is an advanced framework for first class objects with associated + metadata and tags. It provides a one stop solution for all metadata, tags, + shared object databases, search tools and indexing. + +Package: libtirpc-common +Architecture: all +Version: 1.3.7-0.1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libtirpc +Maintainer: Ubuntu Developers +Original-Maintainer: Josue Ortega +Installed-Size: 27 +Breaks: libtirpc1, libtirpc3t64 (<< 1.1.4-0.1~) +Replaces: libtirpc1, libtirpc3t64 (<< 1.1.4-0.1~) +Filename: pool/libtirpc-common_1.3.7-0.1_all.deb +Size: 7114 +MD5sum: 41362421b6fc378b0709ca66fcf4c130 +SHA1: 6661930e819675e56f8aee65d68973944a6871be +SHA256: debc1757cd9b13ec7837e6e76bd9aaf8ae0f622de0e45043e4f5c6e255375814 +SHA512: 0f04ba80bef0fde3bfe3a7f484cd874085cde2326c4edcad1dad552e7d8e67a56dcdd3cb6be42af21dac28e998b2649763962dec4065f9aff69a3b80d510ce19 +Homepage: http://sourceforge.net/projects/libtirpc +Description: transport-independent RPC library - common files + This package contains a port of Sun's transport-independent RPC library to + Linux. The library is intended as a replacement for the RPC code in the GNU C + library, providing among others support for RPC (and in turn, NFS) over IPv6. + . + This package contains the netconfig configuration file as well as the + associated manpage. + +Package: libtirpc3t64 +Architecture: amd64 +Version: 1.3.7-0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libtirpc +Maintainer: Ubuntu Developers +Original-Maintainer: Josue Ortega +Installed-Size: 219 +Provides: libtirpc3 (= 1.3.7-0.1) +Depends: libc6 (>= 2.38), libgssapi-krb5-2 (>= 1.17), libtirpc-common (>= 1.3.7-0.1) +Breaks: libtirpc3 (<< 1.3.7-0.1), nfs-common (<< 1:1.2.8-7), nfs-kernel-server (<< 1:1.2.8-7) +Replaces: libtirpc3 +Filename: pool/libtirpc3t64_1.3.7-0.1_amd64.deb +Size: 80910 +MD5sum: 7d61f3cf2727b09c834a6bee1e7f7835 +SHA1: 2e4fa83574d7644aaab554f1a840018159a94f22 +SHA256: a6c68bbbcbaf2941aee004e581289958c690d17b867be510940a82df2a5572c1 +SHA512: e2a992b7a758b704513f8215d053590047d7f794caef0106d790ed56328984697a9fe4f035e5ae66b9998757cc83db41c8d0d87b6b29ce9fa2445ecdba9122dd +Homepage: http://sourceforge.net/projects/libtirpc +Description: transport-independent RPC library + This package contains a port of Sun's transport-independent RPC library to + Linux. The library is intended as a replacement for the RPC code in the GNU C + library, providing among others support for RPC (and in turn, NFS) over IPv6. + +Package: libtk8.6 +Architecture: amd64 +Version: 8.6.17-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: tk8.6 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Tcl/Tk Packagers +Installed-Size: 2401 +Provides: libtk +Depends: libtcl8.6 (>= 8.6.0-2), libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libx11-6, libxft2 (>> 2.1.1), libxss1 +Suggests: tk8.6 +Conflicts: libtk-img (<< 1.2.5), tk40 (<= 4.0p3-2), tk8.6 (<< 8.6.0-2) +Replaces: tk8.6 (<< 8.6.0-2) +Filename: pool/libtk8.6_8.6.17-1build1_amd64.deb +Size: 793390 +MD5sum: eb6d494b736715a123cacf6dd00c7a98 +SHA1: 009698314d0d57838a465a02bbc679abf5b6baa7 +SHA256: 9956a0f9252ce0bc3be1a97fa06b53e2697d25c24f7dcff25fc17e7b52c3db6f +SHA512: 019926d8ecf35409023acc3d7cc8ed959837335a702ced028a883eb37f0dee671af9ebf28cb5fac2cc5c117516a574fcddce27541f92cc08e69d66e624a5bf87 +Homepage: http://www.tcl.tk/ +Description: Tk toolkit for Tcl and X11 v8.6 - run-time files + Tk is a cross-platform graphical toolkit which provides the Motif + look-and-feel and is implemented using the Tcl scripting language. + This package contains the Tk library and supplementary packages you + need to run Tk-enabled apps. + +Package: libtotem-plparser-common +Architecture: all +Version: 3.26.6-3 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: totem-pl-parser +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 40 +Breaks: libtotem-plparser17 +Replaces: libtotem-plparser17 +Filename: pool/libtotem-plparser-common_3.26.6-3_all.deb +Size: 3844 +MD5sum: 2ab18024b2745aa09ad30f20b8332249 +SHA1: 4947c44a12bcc3c8b5206db650257d9a946d96ce +SHA256: 13fa95414ef977fdffe5d75accfb5999e383cb018a1d8aa3edf4258068c57d25 +SHA512: 7c5f7ccb9def2e040a7d587532fa5955ede0361711b9d610df42faf505f36e9ffb12448576098fd45cee826d2a41a86211b4c9f9c597a16820fee52139c44ae2 +Description: Totem Playlist Parser library - common files + totem-pl-parser is a simple GObject-based library to parse a host of + playlist formats, as well as save those. + . + This package contains the translation files. + +Package: libtotem-plparser18 +Architecture: amd64 +Version: 3.26.6-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: totem-pl-parser +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 183 +Depends: libtotem-plparser-common, libarchive13t64 (>= 3.0.4), libc6 (>= 2.38), libgcrypt20 (>= 1.11.0), libglib2.0-0t64 (>= 2.80.0), libxml2-16 (>= 2.14.1) +Filename: pool/libtotem-plparser18_3.26.6-3_amd64.deb +Size: 61860 +MD5sum: 3b28e7364c47fdf534bb81bf30ce1e28 +SHA1: 6b5916783e7d6a4507b3d7debd0558e091281824 +SHA256: 332a5a8a9d4b744d2a6af78acace096685aaa586ed8001d368bda514b9579476 +SHA512: 64cd6a83ad3b198abebe588e20de1673fa7493231a37d535bdda969fb820dc1aa888e629d6146e7677e01a570bb1fa99ce92e404876560695807008508063727 +Description: Totem Playlist Parser library - runtime files + totem-pl-parser is a simple GObject-based library to parse a host of + playlist formats, as well as save those. + . + This package contains the shared library. + +Package: libtry-tiny-perl +Architecture: all +Version: 0.32-1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 44 +Depends: perl:any +Suggests: libsub-name-perl +Filename: pool/libtry-tiny-perl_0.32-1_all.deb +Size: 21238 +MD5sum: 1cf67ab4ce6299f2f369fdbf172193ce +SHA1: abc399916dea584cc006f69ce9c78432cd149fe7 +SHA256: 2f506f17ea63a5f1f2eb8aa26bfac15e6ba37862287a045ac4b27ff8b0e9a9e3 +SHA512: 6ebbaefdd5523b05cc2c0ad4e02f12d1e4872d96005606cdd82365cc2418afbf49f5e5be29a81cde8dba021e601d5da02ff1688da231cc50a8fa5032e752143f +Homepage: https://metacpan.org/release/Try-Tiny +Description: module providing minimalistic try/catch + Try::Tiny is a Perl module that provides bare bones try/catch statements. It + is designed to eliminate common mistakes with eval blocks, and NOTHING else. + . + The main focus of this module is to provide simple and reliable error + handling for those having a hard time installing TryCatch, but who still want + to write correct eval blocks without 5 lines of boilerplate each time. + +Package: libtss2-esys-3.0.2-0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 588 +Provides: libtss2-esys-3.0.2-0 (= 4.1.3-6) +Depends: libtss2-tcti-cmd0t64, libtss2-tcti-device0t64, libtss2-tcti-mssim0t64, libtss2-tcti-swtpm0t64, tpm-udev (>= 4.1.3-6), libc6 (>= 2.34), libssl3t64 (>= 3.0.0), libtss2-mu-4.0.1-0t64 (>= 3.0.1), libtss2-sys1t64 (>= 4.0.1) +Breaks: libtss2-esys-3.0.2-0 (<< 4.1.3-6), libtss2-esys0 (<< 3.0.2-1) +Replaces: libtss2-esys-3.0.2-0, libtss2-esys0 (<< 3.0.2-1) +Filename: pool/libtss2-esys-3.0.2-0t64_4.1.3-6_amd64.deb +Size: 150304 +MD5sum: 3d52b4f9b2f11e3b762fd07054a7e903 +SHA1: 61deda6152e242040c9939056850c463768bb454 +SHA256: 945ce965bc35dd229fec38c8c35638326d61b74995a22459f59d50bcc4b6bbb3 +SHA512: 9e0b07c08b607f76d7d1e4cd958574858debb3cda64813be916033823f8462344cb0372f801c1b4bfe1b1fe87ef22502cef7d69aaecd75cadcf1e9bb1921905a +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TSS esys libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-mu-4.0.1-0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 296 +Provides: libtss2-mu-4.0.1-0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.14) +Conflicts: libtss2-mu0 +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-mu-4.0.1-0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-mu-4.0.1-0, libtss2-mu0 (<< 4.0.1-4) +Filename: pool/libtss2-mu-4.0.1-0t64_4.1.3-6_amd64.deb +Size: 59190 +MD5sum: efc7533cf21a425623b45caad5b3ec84 +SHA1: 85612365633afb3ebeb9f656b4f284804fb3da2e +SHA256: 598bb51f250ee8a9c05a1c6610a938671d292d5cbe7f8265fde79d9d285a711d +SHA512: 1d28ea1f45b41fa68beaabba56b7659b90d10afde7f397d4ba748e0d13b342471fb79431e67ee4973612a931388562a2bfb13d3dad1d38cb1e311a3b2fb24874 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TSS mu libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-rc0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 57 +Provides: libtss2-rc0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.4) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-rc0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-rc0 +Filename: pool/libtss2-rc0t64_4.1.3-6_amd64.deb +Size: 12370 +MD5sum: 9d596ff809a1bc5307f49e6222bc4700 +SHA1: bcf993207fd460be991e6416275251c0bb163c20 +SHA256: 8bfb7d88fa9c83f37fe77a06d9745fc0176c28df079486ccacd2b8b6a927a652 +SHA512: 4c6eed97eeda85e4ff4ec94da80f012f7869fe5f415b40df3958888355a2f7adbd891f3f707d68e2b9c37ce61319987dd446668e431aee740822f1bfa20d7290 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TSS rc libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-sys1t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 162 +Provides: libtss2-sys1 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.14), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-sys1 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-sys1 +Filename: pool/libtss2-sys1t64_4.1.3-6_amd64.deb +Size: 34538 +MD5sum: c3c061292390e9b3285156c0b2c7d213 +SHA1: fd8c4c88df85679fbe8a64662dc7954aa57fc62f +SHA256: 7e519ca206bee638184c94251bffb150354216a234a6ee67855da39325bc0256 +SHA512: 1d1475df5444ab11ddf2f98026fdfdc39c1222d07c223621941870c89eccc2ce11366bac7ca127ed5d89009d3c8cdcbb97e3237e23a40b07bb5c1df4a2425ef1 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TSS sys libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-cmd0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 52 +Provides: libtss2-tcti-cmd0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.4), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-cmd0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-cmd0 +Filename: pool/libtss2-tcti-cmd0t64_4.1.3-6_amd64.deb +Size: 12726 +MD5sum: 56e131a990ba091e3d3e1e8accacdb9b +SHA1: 4987e868adf11d0bbcaacf4d452c718bacb5c8b0 +SHA256: aa01ff47dc2bcf694f07081b4813c14e3e5deba4558c3dc51b3917931d989726 +SHA512: 1555727ebd94bc6c5ab53aa4a4e8839b13f90bd22a50af84cdaddb523cd7be878f9f8dea3fae688b5c890964b64cd595cd2957e46d60a316594104b7e9592a5d +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI cmd libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-device0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 52 +Provides: libtss2-tcti-device0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.4), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-device0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-device0 +Filename: pool/libtss2-tcti-device0t64_4.1.3-6_amd64.deb +Size: 13954 +MD5sum: 8f0744e271a9b9769d8fad54d9804fa8 +SHA1: 1d1643aaf51be643cd661f7ec7f99e03ab00e20f +SHA256: 4e3f119e57f1e794edd70bf4e1aa840a6263ab936a209b150c2b352ee48b7db8 +SHA512: eaeb3faef2f731ccd71a8d1580887898d11d3cefa5cc828996c118dd8c34364f7a2aa8840581dcffa3b7a5bd0fa2aff9df401c0c4804efab04efcfc64edac3e5 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI device libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-libtpms0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 52 +Provides: libtss2-tcti-libtpms0 (= 4.1.3-6) +Depends: libc6 (>= 2.34), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-tcti-libtpms0 (<< 4.1.3-6) +Replaces: libtss2-tcti-libtpms0 +Filename: pool/libtss2-tcti-libtpms0t64_4.1.3-6_amd64.deb +Size: 13040 +MD5sum: 662054346d1f674b73bbc4e8cc5e378e +SHA1: 6e0dfaa33acb9bf9b669b449e95a48b63a8dca67 +SHA256: b597ee0e8f387f82eeb7e09f62eb3353d689a5674f00f4580e2f73227dc4cb4a +SHA512: de1e229e4bc76cbbbb377512819cff2059d8e9e8f2e2028f939c4f57435c6c122bc556738bc20f1ff97e72ce0cddb0baa6d82746d4229e72bc3a0d634adc4ad1 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI libtpms libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-mssim0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 56 +Provides: libtss2-tcti-mssim0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.38), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-mssim0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-mssim0 +Filename: pool/libtss2-tcti-mssim0t64_4.1.3-6_amd64.deb +Size: 14006 +MD5sum: 80bb9df5d0b4d848e6370b3659d04379 +SHA1: 488130526c0df750a540ded52a3d8c21213c77b4 +SHA256: a98ab8f06b6484304b57549bb7898c73c0f7996250f55d3abc4b707ab87bd4d8 +SHA512: fb924349c0c736d217cbc2794fd8d9bb82c9dd31d04abdfce551a392e46f7b64e3c82ef9bd14a30e2dab93f6494c68c896c9568ffa095fe8a0d69f9fe060d01c +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI mssim libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-spi-helper0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 52 +Provides: libtss2-tcti-spi-helper0 (= 4.1.3-6) +Depends: libc6 (>= 2.4), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-tcti-spi-helper0 (<< 4.1.3-6) +Replaces: libtss2-tcti-spi-helper0 +Filename: pool/libtss2-tcti-spi-helper0t64_4.1.3-6_amd64.deb +Size: 13026 +MD5sum: 4598ce50eb9219a773b633b4a13df703 +SHA1: 440d40cadf0a4c534b57869cd4b816e75c86628f +SHA256: 8c04fd74d8890ef23cae424222497e6d75e46a25a119eea44c3a2dd6f71a72bc +SHA512: 59cfa1f8fee6b883cce9caae73778d9ef58fe4127db81188fd762a88cced52fbc535e713001ac61e70d1fc4b627dbf2827f7e949de18ef1813fbbf45d82728e8 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI spi helper libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tcti-swtpm0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 56 +Provides: libtss2-tcti-swtpm0 (= 4.1.3-6) +Depends: tpm-udev (>= 4.1.3-6), libc6 (>= 2.38), libtss2-mu-4.0.1-0t64 (>= 3.0.1) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-swtpm0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-tcti-swtpm0 +Filename: pool/libtss2-tcti-swtpm0t64_4.1.3-6_amd64.deb +Size: 14108 +MD5sum: 9c79fc985c08d5e58ca19c9b8b3dfe7d +SHA1: 720d1406212cb62b35c1e66271014a8afc1a669d +SHA256: d914df0c4b3f5259b27f579338aab9420230eefce8c340a5ffb44edcf9566eab +SHA512: 8db89211f72d111c8b9ad622be302e449695a36dc4b21929f74913298b2e61f9b10ad553fb231b805c41522665d2de12d06c1757db0fed0159c70de8939a801b +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI swtpm libraries that client applications + will link against when they require accessing the TPM. + +Package: libtss2-tctildr0t64 +Architecture: amd64 +Version: 4.1.3-6 +Multi-Arch: same +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 52 +Provides: libtss2-tctildr0 (= 4.1.3-6) +Depends: libtss2-tcti-cmd0t64, libtss2-tcti-device0t64, libtss2-tcti-libtpms0t64, libtss2-tcti-mssim0t64, libtss2-tcti-spi-helper0t64, libtss2-tcti-swtpm0t64, tpm-udev (>= 4.1.3-6), libc6 (>= 2.34) +Breaks: libtss2-esys0 (<< 3.0.1-2), libtss2-tctildr0 (<< 4.1.3-6) +Replaces: libtss2-esys0 (<< 3.0.1-2), libtss2-tctildr0 +Filename: pool/libtss2-tctildr0t64_4.1.3-6_amd64.deb +Size: 13420 +MD5sum: 1122c3cf64f3abb567376fa82b4338ce +SHA1: e23439c0e8e88bb0d7b7489e5b9a8f007c78c707 +SHA256: 292c9bfcda2f6563a11f47d9e6530c467e8eea256dfd59a5d6626b2823d4d73a +SHA512: 94fbe909108533171d46d628b3db05e34524637a0056a91192265ccb1cdd02f0a5ed9cccd6d3bbcb6e89a6f8929c4965b2dddfe684aebd33892956d140966014 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - TSS and TCTI libraries + TPM2.0 TSS (Software Stack) consists of API layers provided to support + TPM 2.0 chips. It is made out of three layers: + . + - Enhanced System API (ESAPI) + - System API (SAPI), which implements the system layer API; + - Marshaling/Unmarshaling (MU) + - TPM Command Transmission Interface (TCTI), which is used by SAPI to + allow communication with the TAB/RM layer; + . + This package contains the TCTI ldr libraries that client applications + will link against when they require accessing the TPM. + +Package: libtwolame0 +Architecture: amd64 +Version: 0.4.0-2build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: twolame +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 151 +Depends: libc6 (>= 2.29) +Filename: pool/libtwolame0_0.4.0-2build4_amd64.deb +Size: 52614 +MD5sum: c062f851cf0bfc7f7c01dd605eb6893e +SHA1: 702fefbed799940e40e3b6ea46cba6b4e7c46ecb +SHA256: f83717d357ca0d038ff333615d9aba6d19a888b93630e8142815f81e16cb0f22 +SHA512: 2730b284db38634f6eb0e9d9ecd8ee7423382c194595d0c7d8020ef59277d43a1a0fb641a3c7b0cc1c38c0785ede42de18587f43143b2209361db128c97c0368 +Homepage: http://www.twolame.org +Description: MPEG Audio Layer 2 encoding library + TwoLAME is an optimized MPEG Audio Layer 2 encoder. It is based on tooLAME by + Mike Cheng, which in turn is based upon the ISO dist10 code and portions of + LAME. + . + TwoLAME does NOT support MPEG Audio Layer 3 (MP3) encoding due to patent + issues surrounding MP3. + . + However, as most MPEG Audio players are able to play layer 2 (MP2) files, + TwoLAME makes a very good drop-in replacement for LAME and other layer 3 + encoders. + . + This package contains the shared library. + +Package: libuchardet0 +Architecture: amd64 +Version: 0.0.8-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: uchardet +Maintainer: Ubuntu Developers +Original-Maintainer: James Cowgill +Installed-Size: 207 +Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 4.1.1) +Filename: pool/libuchardet0_0.0.8-2_amd64.deb +Size: 75794 +MD5sum: a16eba5208892107d922ee6c015771dd +SHA1: d9ae91d769a9409886ec4b3e69bd649e36a45f33 +SHA256: 7ba592f208d28eecffb33494b636fb75fbe7917dc193f4190ad2a6d1c56450a4 +SHA512: 9074568062c0425f06c0b82442cd553a8f719bd94897e1f8a32fb02775c35deb12bf83856eccef75c3d95298125b6f59ab5c9975c0db3475db67b4c12f324a73 +Homepage: https://www.freedesktop.org/wiki/Software/uchardet/ +Description: universal charset detection library - shared library + uchardet is a C language binding of the original C++ implementation + of the universal charset detection library by Mozilla. + . + uchardet is a encoding detector library, which takes a sequence of + bytes in an unknown character encoding without any additional + information, and attempts to determine the encoding of the text. + . + This package contains the shared library. + +Package: libudisks2-0 +Architecture: amd64 +Version: 2.10.91-1ubuntu2.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: udisks2 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 909 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.83.0) +Filename: pool/libudisks2-0_2.10.91-1ubuntu2.1_amd64.deb +Size: 175772 +MD5sum: 24afbc0a4e86b67a3e908a4188782655 +SHA1: 5a828089ea20fead08347a4040ffb31a5169e342 +SHA256: 52d797d03908af230f9bf19d91a173c747fee6c49835d59d1be5cf3805edbe02 +SHA512: 34465defe1aacf6c0df9f338de7a3645f94d285fd0338b3d58d74ee0dcdf5b6d86c816ce61eef06b763d62729c1d96b185e46db2f8e854f32e91fccca7e8721f +Homepage: https://www.freedesktop.org/wiki/Software/udisks +Description: GObject based library to access udisks2 + The udisks daemon serves as an interface to system block devices, + implemented via D-Bus. It handles operations such as querying, mounting, + unmounting, formatting, or detaching storage devices such as hard disks + or USB thumb drives. + . + This provides a convenience library for communicating with udisks2 from + GObject based programs. + +Package: libunity-protocol-private0 +Architecture: amd64 +Version: 7.1.4+19.04.20190319-6.1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libunity +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 321 +Depends: libc6 (>= 2.4), libdee-1.0-4 (>= 1.2.5~), libglib2.0-0t64 (>= 2.80.0) +Breaks: libunity9 (<< 7.1.1) +Filename: pool/libunity-protocol-private0_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb +Size: 88290 +MD5sum: 45cac2d926d39cfa51bb961d54f776ed +SHA1: a3944b0d280e8feb2c537c2200aa1c40b9563138 +SHA256: a1855fbce17fff96e1fed915385102091925e7b92827afd766fb3f7b8ec850b1 +SHA512: ba86befb6fd11e3d1bf4e802395a2fdcd4ba9b91a7f8ec9bd7eb7fd8a5b3d07f7b94288d72c3fdb746c7d5a2ce750f83b64cd7356b00886c04506e51afba2c37 +Homepage: https://launchpad.net/libunity +Description: binding to get places into the launcher - private library + libunity is a shared library to be able to interact with the launcher + and add places in Unity environment. + . + This package contains a library containing the private protocol to be + used between libunity and unity itself. + +Package: libunity-scopes-json-def-desktop +Architecture: all +Version: 7.1.4+19.04.20190319-6.1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: libunity +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 13 +Provides: libunity-common, unity-scopes-json-def +Conflicts: libunity-common (<< 7.0.7), unity-scopes-json-def +Replaces: libunity-common (<< 7.0.7) +Filename: pool/libunity-scopes-json-def-desktop_7.1.4+19.04.20190319-6.1ubuntu1_all.deb +Size: 3586 +MD5sum: 9682c8c1eff25bd1011c29a9d5440735 +SHA1: ba48c7e18f315cf4d2d0cb13c2086813518d90a6 +SHA256: 898868492d7a5dca58e114ccce2f30ae78235a4f3798cbd83a2264f3672b15e5 +SHA512: dcc46dbc20820e004e484b40046a09e0fb344e6d586aced08b54550a51a2d40d7a2ba8de6b6c2689be62eeae1ff8873488e882b5bd0c30753421114938456157 +Homepage: https://launchpad.net/libunity +Description: binding to get places into the launcher - desktop def file + libunity is a shared library to be able to interact with the launcher + and add places in Unity environment. + . + This package contains default scopes definition for the destkop. + +Package: libunity9 +Architecture: amd64 +Version: 7.1.4+19.04.20190319-6.1ubuntu1 +Priority: optional +Section: libs +Source: libunity +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 789 +Depends: libc6 (>= 2.34), libdbusmenu-glib4 (>= 0.4.90), libdee-1.0-4 (>= 1.2.7+15.04.20150304), libglib2.0-0t64 (>= 2.80.0), libunity-protocol-private0 (= 7.1.4+19.04.20190319-6.1ubuntu1), dconf-gsettings-backend | gsettings-backend, libunity-scopes-json-def-desktop (>= 7.1.4+19.04.20190319-6.1ubuntu1) | unity-scopes-json-def +Suggests: unity-common (>= 7.1.2) +Breaks: unity-common (<< 7.1.2) +Filename: pool/libunity9_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb +Size: 217732 +MD5sum: 0266922b26ea100173d6c2680bd504bb +SHA1: ad373a51c91c5bedc6c21431d8ae0648ef3720de +SHA256: 2fea821dfdf3e620bda6fcee6641480336afa9af98276aa202df18894c36831e +SHA512: edef45b8f6bbf1b18e31baa9b0661c933274e62ac940eaaa4c147dc6188127fe37b41c36d37cd9e0f4985286c5ded2530f85bb567225e9b6636b70fe833f526a +Homepage: https://launchpad.net/libunity +Description: binding to get places into the launcher - shared library + libunity is a shared library to be able to interact with the launcher + and add places in Unity environment. + . + This package contains shared libraries to be used by applications. + +Package: libunwind8 +Architecture: amd64 +Version: 1.8.3-0ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libunwind +Maintainer: Ubuntu Developers +Original-Maintainer: Adrian Bunk +Installed-Size: 199 +Depends: libc6 (>= 2.34), liblzma5 (>= 5.1.1alpha+20110809) +Conflicts: libunwind1-dev +Replaces: libgcc1 (<< 1:4.0.0-2) +Filename: pool/libunwind8_1.8.3-0ubuntu1_amd64.deb +Size: 59630 +MD5sum: f147c5244f20c0dbe5517ec3e1a1a453 +SHA1: f4132fc67e8c2a4b69925a3f87b9a9f738e6d4cf +SHA256: 7a9978fadf0940f45500ced0fba219cb5954f322a31068b7b32ad04f3ddc5c3f +SHA512: aecd806691fc70570b34841593a8e7c9176fc90df85873f599ad03861a89b7d92b4c24cc87fc7a6d20c5b317fb0116a2ecf154b5a480e301624ce12659d05606 +Homepage: https://github.com/libunwind/libunwind +Description: library to determine the call-chain of a program - runtime + The primary goal of this project is to define a portable and efficient C + programming interface (API) to determine the call-chain of a program. + The API additionally provides the means to manipulate the preserved + (callee-saved) state of each call-frame and to resume execution at any + point in the call-chain (non-local goto). The API supports both local + (same-process) and remote (across-process) operation. As such, the API + is useful in a number of applications. + . + This package includes the shared libraries + +Package: libupower-glib3 +Architecture: amd64 +Version: 1.91.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: upower +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 174 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.76.0) +Recommends: upower +Breaks: gir1.2-upowerglib-1.0 (<< 0.99.18), upower (<< 0.99.18) +Filename: pool/libupower-glib3_1.91.1-1_amd64.deb +Size: 43872 +MD5sum: be19d6c39d1d69c4623b91c2357700ee +SHA1: 36be647758d9c38c477ffe76620cc6b2fa9f4f1b +SHA256: 6f2d824e70aab09105a9bd8bde3d77cdfe9d391779fadeaca3043d339ed00b80 +SHA512: b6b44a9d0037cb19257ebd1066a19090df8b1b7827f78f004ae486ae209f50e6c7b50006e7f5d066179dfe8029001a045d5943beb0decd5f7debcd55841ac5ae +Homepage: https://upower.freedesktop.org/ +Description: abstraction for power management - shared library + upower provides an interface to enumerate power sources on the system + and control system-wide power management. Any application can access the + org.freedesktop.UPower service on the system message bus. Some + operations (such as suspending the system) are restricted using PolicyKit. + . + This package contains the shared library to be used by applications. + +Package: liburcu8t64 +Architecture: amd64 +Version: 0.15.6-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: liburcu +Maintainer: Ubuntu Developers +Original-Maintainer: Jon Bernard +Installed-Size: 340 +Provides: liburcu8 (= 0.15.6-1) +Depends: libc6 (>= 2.38) +Breaks: liburcu8 (<< 0.15.6-1) +Replaces: liburcu8 +Filename: pool/liburcu8t64_0.15.6-1_amd64.deb +Size: 64652 +MD5sum: 63efc3a08de972cf0abfaaf8ed4b6234 +SHA1: d7ac98913769c2f15a2937687cc5c77eb0e3934b +SHA256: de2e04225d0f1324ab5ee880e61427a5fa23de0a3563610386f5fc3eca653a02 +SHA512: c59ac13d468e3ca53df9bc9ce209df56978d7fdb6e26703ffb6590dd63db690ac015f532c4dc2761ce61d65fe323eb95cf9471db9de3a585c35a12e77a0a2652 +Homepage: https://liburcu.org/ +Description: userspace RCU (read-copy-update) library + This data synchronization library provides read-side access which scales + linearly with the number of cores. It does so by allowing multiples copies of + a given data structure to live at the same time, and by monitoring the data + structure accesses to detect grace periods after which memory reclamation is + possible. + +Package: liburi-perl +Architecture: all +Version: 5.34-2build1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 288 +Provides: liburi-ws-perl (= 5.34-2build1) +Depends: perl:any, libencode-perl, libscalar-list-utils-perl +Suggests: libbusiness-isbn-perl, libmime-base32-perl, libregexp-ipv6-perl, libwww-perl +Breaks: liburi-ws-perl (<< 5.34), sqitch (<< 1.3.1-2~) +Replaces: liburi-ws-perl (<< 5.34) +Filename: pool/liburi-perl_5.34-2build1_all.deb +Size: 100454 +MD5sum: 32e0deb20ce26ba2288ab6d9b33dfdf8 +SHA1: bfd63faaeef61cff720c1d787dca33884dbd94cc +SHA256: 0e8f2fbd6ab3444d23e1fff6a348d8872b8328548ad95c113d8011728c6809e6 +SHA512: 1f4daf1a1c584541c43594f70b2fc50768e5b29a5ada3d1d62edb2b4186775b89213b29f9587fbf89f944c85cf94350f48bf7e8fb94148b4924103bfb94fb3d7 +Homepage: https://metacpan.org/release/URI +Description: module to manipulate and access URI strings + URI is a collection of Perl modules that represent and manipulate Uniform + Resource Identifier (URI) references as specified in RFC 2396. + . + URI objects can be used to access and manipulate the various components + that make up these strings. There are also methods to combine URIs in + various ways. + . + The URI class replaces the URI::URL class that used to be distributed with + libwww-perl. This package also includes an emulation of the old URI::URL + interface, which implements both the old and the new interface. + +Package: liburing2 +Architecture: amd64 +Version: 2.14-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: liburing +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 116 +Depends: libc6 (>= 2.4) +Filename: pool/liburing2_2.14-1_amd64.deb +Size: 25404 +MD5sum: 2258e4c9ab63d897ae71a69e54a9f361 +SHA1: db131915ce067c95c5aad765826b0fd8b2eb2dc5 +SHA256: c0f1ed55d2eaa6e5d1224513b787c71348c6ab983e9c4178a417a7ffac3a8a00 +SHA512: d6be992a6af8a845b2e6395e91f10d235c8bde41238de3f251ef8a49fb74e9f347b6805227ae48b87435d828ec59dc4e16979a246ab045bf78298dfbad3dcc7e +Homepage: https://github.com/axboe/liburing +Description: Linux kernel io_uring access library - shared library + This library provides helpers to setup and teardown io_uring instances, + and also a simplified interface for applications that do not need (or + want) to deal with the full kernel side implementation. + . + This package contains the shared library. + +Package: libusb-1.0-0 +Architecture: amd64 +Version: 2:1.0.29-2build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libusb-1.0 +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 151 +Depends: libc6 (>= 2.38), libudev1 (>= 183) +Filename: pool/libusb-1.0-0_2%3a1.0.29-2build1_amd64.deb +Size: 56906 +MD5sum: 65a743fd7c4df61755611763736ad680 +SHA1: 1df08e1684490ca63005c450e0eaa35a0194885c +SHA256: 0f3f167c22d00994276b6425a306d1c0b6047e2ea2eb850afbdaf00968330484 +SHA512: 47f265491f97567b91830fe0c2e7f6efd191c48dc7d08ebc26ba6815ba2edec01e02ed7f4d9dd81721835651dc8918bcd57b146859793026cfdb3325944418a3 +Homepage: http://www.libusb.info +Description: userspace USB programming library + Library for programming USB applications without the knowledge + of Linux kernel internals. + . + This package contains what you need to run programs that use this + library. + +Package: libusbmuxd-2.0-7 +Architecture: amd64 +Version: 2.1.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libusbmuxd +Maintainer: Ubuntu Developers +Original-Maintainer: gtkpod Maintainers +Installed-Size: 57 +Depends: libc6 (>= 2.38), libimobiledevice-glue-1.0-0 (>= 1.3.0), libplist-2.0-4 (>= 2.3.0) +Filename: pool/libusbmuxd-2.0-7_2.1.1-1_amd64.deb +Size: 17898 +MD5sum: f2ed0452a1f7b88e705223fc5059bf20 +SHA1: 3e8ac668d87c8bad9d52f9aa0ce678f8cb0ca50a +SHA256: f4cd323620e90c825069f0866d038347deded8d8d0c469ab42c75ba34e231f67 +SHA512: 549f045bbc8f654cf67f12c16532d9fa9d4e45e88b4bf7575e29be722e2bd52bc7981efe86601617fcb1e13ec0184bde01dafa3cf6018944bdc998b4cc4b5547 +Homepage: https://libimobiledevice.org +Description: Client library to handle usbmux connections with iOS devices (library) + usbmuxd, the USB multiplexor daemon, is in charge of coordinating + access to iPhone and iPod Touch services over USB. Synchronization and + management applications for the iPhone and iPod Touch need this daemon + to communicate with such devices concurrently. + . + This package contains the shared library. + +Package: libuv1t64 +Architecture: amd64 +Version: 1.51.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libuv1 +Maintainer: Ubuntu Developers +Original-Maintainer: Dominique Dumont +Installed-Size: 275 +Provides: libuv1 (= 1.51.0-2ubuntu1) +Depends: libc6 (>= 2.38) +Breaks: libuv1 (<< 1.48.0-1.1) +Replaces: libuv1 +Filename: pool/libuv1t64_1.51.0-2ubuntu1_amd64.deb +Size: 103390 +MD5sum: 3d76cff3be52a76611fc8b9db28c6fbf +SHA1: ed98a618222de4e045459d0cf88636162d176934 +SHA256: 5c9b857d7d6a0c22b30dae45d518b375452cf7c663fc9381e3f0760ba3fb8cce +SHA512: 5fc2b6fd33bfe4ae918114347b2d532a57b579bb57bd45eb333fe2f5961ee20161d4a78d4ba1d8a4336f22ba4a4a1dba30dd43676589994a3cb779f062f62a53 +Homepage: https://github.com/libuv/libuv +Description: asynchronous event notification library - runtime library + Libuv is the asynchronous library behind Node.js. Very similar to libevent or + libev, it provides the main elements for event driven systems: watching and + waiting for availability in a set of sockets, and some other events like timers + or asynchronous messages. However, libuv also comes with some other extras + like: + * files watchers and asynchronous operations + * a portable TCP and UDP API, as well as asynchronous DNS resolution + * processes and threads management, and a portable inter-process + communications mechanism, with pipes and work queues + * a plugins mechanism for loading libraries dynamically + * interface with external libraries that also need to access the I/O. + . + This package includes the dynamic library against which you can link + your program. + +Package: libv4l-0t64 +Architecture: amd64 +Version: 1.32.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: v4l-utils +Maintainer: Ubuntu Developers +Original-Maintainer: Gregor Jasny +Installed-Size: 661 +Provides: libv4l-0 (= 1.32.0-2ubuntu1) +Depends: libv4lconvert0t64 (= 1.32.0-2ubuntu1), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libjson-c5 (>= 0.15), libstdc++6 (>= 13.1) +Breaks: libv4l-0 (<< 1.32.0-2ubuntu1) +Replaces: libv4l-0 +Filename: pool/libv4l-0t64_1.32.0-2ubuntu1_amd64.deb +Size: 158926 +MD5sum: ba3e3788d9d9122f1007326b1a4ca17b +SHA1: 1b7c689fde411099394d10f198c8048725fe0635 +SHA256: 23b41e9e45ca64525f64f23e50d325123382225b68db18dd3a6b74be50a43cd4 +SHA512: 72b37ca6a072693d106160fc3e8c8fc2977044c8300b6e307c53845023ed0a7b6a6159ae7f44cb7602745ef08cb703f51abfb800b926dc83c1537f8556bb8334 +Homepage: https://linuxtv.org/wiki/index.php/V4l-utils +Description: Collection of video4linux support libraries + libv4l is a collection of libraries which adds a thin abstraction layer on + top of video4linux2 devices. The purpose of this (thin) layer is to make it + easy for application writers to support a wide variety of devices without + having to write separate code for different devices in the same class. libv4l + consists of 3 different libraries: libv4lconvert, libv4l1 and libv4l2. + . + libv4l1 offers the (deprecated) v4l1 API on top of v4l2 devices, independent + of the drivers for those devices supporting v4l1 compatibility (which many + v4l2 drivers do not). + . + libv4l2 offers the v4l2 API on top of v4l2 devices, while adding for the + application transparent libv4lconvert conversion where necessary. + . + This package contains the shared libraries. + +Package: libv4lconvert0t64 +Architecture: amd64 +Version: 1.32.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: v4l-utils +Maintainer: Ubuntu Developers +Original-Maintainer: Gregor Jasny +Installed-Size: 327 +Provides: libv4lconvert0 (= 1.32.0-2ubuntu1) +Depends: libc6 (>= 2.38), libjpeg8 (>= 8c) +Breaks: libv4lconvert0 (<< 1.32.0-2ubuntu1) +Replaces: libv4lconvert0 +Filename: pool/libv4lconvert0t64_1.32.0-2ubuntu1_amd64.deb +Size: 90078 +MD5sum: 31ffca14f6d5a0d1f80d0377d7e33ec3 +SHA1: 111ee72b67d3a0a1cac85531f4b67e5fd238a7e5 +SHA256: aa9fbbedeb94f9def39a05f9d953d0c9a72b0dc8b59c944b53844ec25f23f2f5 +SHA512: 85ed1436aeea6ca2d9cc1e3f0c4a422d572d707b7e6f00b5e41935e77b316f07af42df4b3954b2229443a4e45e211c5ba9d9e9ceacac6524fd34fa8019fe90d4 +Homepage: https://linuxtv.org/wiki/index.php/V4l-utils +Description: Video4linux frame format conversion library + libv4lconvert offers functions to convert from any (known) pixelformat + to BGR24, RGB24, YUV420 and YVU420. + . + This package contains the shared library. + +Package: libva-drm2 +Architecture: amd64 +Version: 2.23.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libva +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 45 +Depends: libc6 (>= 2.34), libdrm2 (>= 2.4.60), libva2 (>= 2.23.0), libva2 (<< 2.23.0.1) +Filename: pool/libva-drm2_2.23.0-1ubuntu1_amd64.deb +Size: 7112 +MD5sum: abba43082f902fdd93d43f92e642230c +SHA1: 9a6eaa1acf249d2c860fbfcf44e128ba45b44ad7 +SHA256: f56b0cb850dcd8af45929b2da7cc1fbdf64245fbcec99033298499a8db2765a3 +SHA512: 4324364ef044b84717b2528d26a1c96e11bcb63bbb1e8cd7fca63543095567cae1fd8ab30ecb0c5191f2c895dd7eb1ba2ffa8980c7740c230d2e4ea997d058a5 +Homepage: https://github.com/intel/libva +Description: Video Acceleration (VA) API for Linux -- DRM runtime + Video Acceleration API (VA API) is a library ("libVA") and API specification + which enables and provides access to graphics hardware (GPU) acceleration for + video processing on Linux and UNIX based operating systems. Accelerated + processing includes video decoding, video encoding, subpicture blending and + rendering. The specification was originally designed by Intel for its GMA + (Graphics Media Accelerator) series of GPU hardware, the API is however not + limited to GPUs or Intel specific hardware, as other hardware and manufacturers + can also freely use this API for hardware accelerated video decoding. + . + This package provides the libva-drm library. + +Package: libva-x11-2 +Architecture: amd64 +Version: 2.23.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libva +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 57 +Depends: libc6 (>= 2.33), libdrm2 (>= 2.4.60), libva2 (>= 2.23.0), libva2 (<< 2.23.0.1), libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb-dri3-0, libxcb1, libxext6, libxfixes3 +Filename: pool/libva-x11-2_2.23.0-1ubuntu1_amd64.deb +Size: 12176 +MD5sum: c6bb22ce50a54405894380fc6c3fa245 +SHA1: a61bfe8686d46144f30a63060395ab6a2152b92e +SHA256: 247f651d07a0e3e237c6d48f2b7f3f9de9609b69a4c047c471f50147dd13286f +SHA512: cbbb1428d2c81118d45b5e1953b32d664cc3acde6cd636d848cd1759a33eb8f5d4ebe05b3700312f675c2e07c9d19deb5e000b522828ca82e8b444b7a7a98be5 +Homepage: https://github.com/intel/libva +Description: Video Acceleration (VA) API for Linux -- X11 runtime + Video Acceleration API (VA API) is a library ("libVA") and API specification + which enables and provides access to graphics hardware (GPU) acceleration for + video processing on Linux and UNIX based operating systems. Accelerated + processing includes video decoding, video encoding, subpicture blending and + rendering. The specification was originally designed by Intel for its GMA + (Graphics Media Accelerator) series of GPU hardware, the API is however not + limited to GPUs or Intel specific hardware, as other hardware and manufacturers + can also freely use this API for hardware accelerated video decoding. + . + This package provides the libva-x11 library. + +Package: libva2 +Architecture: amd64 +Version: 2.23.0-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libva +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 255 +Provides: libva-driver-abi-1.0, libva-driver-abi-1.22, libva-driver-abi-1.23 +Depends: libc6 (>= 2.38) +Suggests: va-driver-all | va-driver +Filename: pool/libva2_2.23.0-1ubuntu1_amd64.deb +Size: 76506 +MD5sum: bee7dcf70941d598cf60c3ca35b0fc24 +SHA1: 3cc2d8e5ca541bea1207e337a07b631ce67b472a +SHA256: 83053abb11b8b0169bfb2abbd209a44ddeb4e56223980cdcfc0218b09e845f00 +SHA512: b70a85809e5198c9459fee02607ea641eedc6a67296c93b3bd890302c90d6a20d1c483e0e8b96d51d7f6de7d625156fa86a8b3230698e6df53f2fe2cd2983e93 +Homepage: https://github.com/intel/libva +Description: Video Acceleration (VA) API for Linux -- runtime + Video Acceleration API (VA API) is a library ("libVA") and API specification + which enables and provides access to graphics hardware (GPU) acceleration for + video processing on Linux and UNIX based operating systems. Accelerated + processing includes video decoding, video encoding, subpicture blending and + rendering. The specification was originally designed by Intel for its GMA + (Graphics Media Accelerator) series of GPU hardware, the API is however not + limited to GPUs or Intel specific hardware, as other hardware and manufacturers + can also freely use this API for hardware accelerated video decoding. + . + This package provides the main libva library. + +Package: libvisual-0.4-0 +Architecture: amd64 +Version: 0.4.2-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libvisual +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 412 +Depends: libc6 (>= 2.34) +Suggests: libvisual-0.4-plugins +Breaks: libvisual-0.4-plugins (<< 0.4.0.dfsg.1-5) +Filename: pool/libvisual-0.4-0_0.4.2-4_amd64.deb +Size: 116984 +MD5sum: a3903add356f0190b9c8f3ff9b0b63e3 +SHA1: 956a3189cd09d905448b70a13d76f35ff0fd0d5d +SHA256: d2afc14cba71cd7ca7571b835146171c5fbd92b36acc863da9ebf96419ef8e7f +SHA512: c0a65504a591d6e2925b578a5738ad08b1b52dc67c6581e10e2a9e019847cf128952ee576f613bc0ef9de5ff5c4df7af2e92ae5419b7cdf5b35c982c88d08480 +Homepage: http://libvisual.org +Description: audio visualization framework + Libvisual is a generic visualization framework that allows applications + to easily access and manage visualization plugins. + . + Audio visualization is the process of making pretty moving images that + are correlated in some way to the audio currently being played by a media + player. Most audio visualization is tied to a specific application or media + player, making it difficult to share code. Libvisual allows applications + to use existing visualization plugins written for the libvisual framework. + . + This package provides the runtime libraries for libvisual. Libvisual is not + very useful without visualization plugins, so it is highly recommended to + install the libvisual-0.4-plugins package. + +Package: libvolume-key1 +Architecture: amd64 +Version: 0.3.12-10build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: volume-key +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 172 +Depends: libblkid1 (>= 2.16), libc6 (>= 2.38), libcryptsetup12 (>= 2:2.0), libglib2.0-0t64 (>= 2.18.0), libgpgme45 (>= 1.23.2), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.13.4-2~) +Filename: pool/libvolume-key1_0.3.12-10build2_amd64.deb +Size: 40610 +MD5sum: 83e35660c00447d5509c13e881072184 +SHA1: 66556cb8506a39e03f2f2e68cf53e003e8278443 +SHA256: cfd320ae710e0b4ee98d296feaafc4963aed789186a92e529204793bfd9c473e +SHA512: ce8b50f9e86e6a429cf54cd2d1747ae5f1575c1d7931da21a32d181c780ee639dc5f21992e5360bcfdc92cd793d828f008b2a835a3898af491806df8aed7fcd4 +Homepage: https://pagure.io/volume_key +Description: Library for manipulating storage encryption keys and passphrases + This package provides libvolume_key, a library for manipulating storage volume + encryption keys and storing them separately from volumes. + . + The main goal of the software is to allow restoring access to an encrypted + hard drive if the primary user forgets the passphrase. The encryption key + back up can also be useful for extracting data after a hardware or software + failure that corrupts the header of the encrypted volume, or to access the + company data after an employee leaves abruptly. + +Package: libvorbis0a +Architecture: amd64 +Version: 1.3.7-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libvorbis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 208 +Depends: libc6 (>= 2.35), libogg0 (>= 1.1.0) +Filename: pool/libvorbis0a_1.3.7-3build2_amd64.deb +Size: 100972 +MD5sum: 17eb4d39c1729e4f5a7aef34925b58d4 +SHA1: 13839b85bc09530df73af1bd91a947daf8b0a0b2 +SHA256: e8577fd985c3a2bc61212be338207cc2a95e7d6892acaeccb3d455da13e4a480 +SHA512: ced76e88577e8185a2f4b72fd080952c1f31857b1a6407890f0f485617b2cdfc0f049143652e401a23174e09af9540f587c05632b2fab394c577486e08ba2b01 +Homepage: https://www.xiph.org/vorbis/ +Description: decoder library for Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbis library is the primary Ogg Vorbis library. + +Package: libvorbisenc2 +Architecture: amd64 +Version: 1.3.7-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libvorbis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 698 +Depends: libc6 (>= 2.4), libvorbis0a (= 1.3.7-3build2) +Filename: pool/libvorbisenc2_1.3.7-3build2_amd64.deb +Size: 79598 +MD5sum: dfde0abc61147cd623feedce43de262b +SHA1: 67f4e048b84b8adf9d85882a879f982998324e9d +SHA256: b4230d0064eee971727b204e3d0644a4deb4a3d882eaac2304d379e7a5439f2a +SHA512: 3cb99b4d66c3c9f74204b4846e87a4bd705c57167b120880b64f57efbb6751f3f0f052a9a4358553d44d50414d5df62181be971e9e8cbf76aac85c273e54604e +Homepage: https://www.xiph.org/vorbis/ +Description: encoder library for Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbisenc library provides a convenient API for setting up an encoding + environment using libvorbis. + +Package: libvorbisfile3 +Architecture: amd64 +Version: 1.3.7-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libvorbis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 58 +Depends: libc6 (>= 2.14), libogg0 (>= 1.1.0), libvorbis0a (= 1.3.7-3build2) +Filename: pool/libvorbisfile3_1.3.7-3build2_amd64.deb +Size: 17248 +MD5sum: bc4c2a439fadd1adbf3fd13a1b63cf44 +SHA1: e225e70d45d40658636bcbebf1907e254121fc4f +SHA256: 8cd42cc285e34f915e0e769bcffab29c4267fb6453295ed309d50f8f376eef37 +SHA512: 5976e0b453198e40dceccce0fe6d1753407892fa922d64bab272f4087c6f1348f765a26de6252e724a2f0aa88ad7dd885ed49e76b0f99d2866b73647bd0cfa19 +Homepage: https://www.xiph.org/vorbis/ +Description: high-level API for Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbisfile library provides a convenient high-level API for decoding + and basic manipulation of all Vorbis-I audio streams. + +Package: libvpx12 +Architecture: amd64 +Version: 1.16.0-3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libvpx +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 3830 +Depends: libc6 (>= 2.34) +Filename: pool/libvpx12_1.16.0-3_amd64.deb +Size: 1243784 +MD5sum: 65d7529ae9fb10bf52c2100c70abfd65 +SHA1: 8b83d413de7866bc9e38ea6eebe443f8e21a62c6 +SHA256: e1b852dfaa099fbcc60ab08d4e340553a7701c501544089609838c9417ba5fa0 +SHA512: 78f67fd5008e88fe7d8697338f8e80e787809847be74edb12564d146043b897b5bae35705104a939167e601baabd49f589ab019b87eb10be8c8220d3750dbce7 +Homepage: https://www.webmproject.org +Description: VP8 and VP9 video codec (shared library) + VP8 and VP9 are open video codecs, originally developed by On2 and released + as open source by Google Inc. They are the successor of the VP3 codec, + on which the Theora codec was based. + . + This package contains the shared libraries. + +Package: libvte-2.91-0 +Architecture: amd64 +Version: 0.84.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: vte2.91 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 976 +Depends: libvte-2.91-common (= 0.84.0-2), libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.38), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.10.0), libfribidi0 (>= 1.0.0), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.78.0), libgnutls30t64 (>= 3.7.2), libgtk-3-0t64 (>= 3.21.5), libicu78 (>= 78.1-1~), liblz4-1 (>= 0.0~r130), libpango-1.0-0 (>= 1.44.3), libpangocairo-1.0-0 (>= 1.18.0), libpcre2-8-0 (>= 10.32), libsimdutf31 (>= 8.0.0), libstdc++6 (>= 14), libsystemd0 (>= 220) +Filename: pool/libvte-2.91-0_0.84.0-2_amd64.deb +Size: 381146 +MD5sum: bf472cd4e11b6b45f8b283860a021909 +SHA1: b19c92fd1701fefe675e5227bc042233151a0698 +SHA256: 612230c9fcec7a14996d4eb70ebbe2293845315b46c7b14165694a990223b910 +SHA512: 62ac9a1a884ceaae3a18e2b3c98cf035254a82802dfdd9e8904b2dc803124dc394054df2152d5e2fafa90863c1e14f4d4b0c427e0dc34660f88759c02ff0d87b +Homepage: https://wiki.gnome.org/Apps/Terminal/VTE +Description: Terminal emulator widget for GTK 3 - runtime files + The VTE library provides a terminal emulator widget VteTerminal for + applications using the GTK toolkit. It also provides the VtePTY object + containing functions for starting a new process on a new + pseudo-terminal and for manipulating pseudo-terminals. + . + This package contains the runtime library, needed by programs using the + VTE widget with GTK 3. + +Package: libvte-2.91-common +Architecture: amd64 +Version: 0.84.0-2 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: vte2.91 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 160 +Depends: libc6 (>= 2.34) +Filename: pool/libvte-2.91-common_0.84.0-2_amd64.deb +Size: 16934 +MD5sum: 957f8e6dfd61f79ea70e1dc81a3f0fe9 +SHA1: 738ef77e0cacd5badab10d1ea123d8e7af109e8f +SHA256: 7f4b1ca229e01c6cd29d7ca1ccd0fb01b9d2e86bebd3e495db464f07a326e651 +SHA512: babb67b4e3053f16542657e010f4d5fd2c6a8d5f4d534b143b93e3df19358ad097f52e47037a62630b91c1622042601f106634a29ef2bbd9be73769a9a4a7905 +Homepage: https://wiki.gnome.org/Apps/Terminal/VTE +Description: Terminal emulator widget for GTK 3 - common files + The VTE library provides a terminal emulator widget VteTerminal for + applications using the GTK toolkit. It also provides the VtePTY object + containing functions for starting a new process on a new + pseudo-terminal and for manipulating pseudo-terminals. + . + This package contains internationalization files for the VTE library + and common files for the GTK 3 version. + +Package: libvte-2.91-gtk4-0 +Architecture: amd64 +Version: 0.84.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: vte2.91 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 986 +Depends: libvte-2.91-common (= 0.84.0-2), libc6 (>= 2.38), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.14.0), libfribidi0 (>= 1.0.0), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.78.0), libgnutls30t64 (>= 3.7.2), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.14.1), libicu78 (>= 78.1-1~), liblz4-1 (>= 0.0~r130), libpango-1.0-0 (>= 1.44.3), libpangocairo-1.0-0 (>= 1.18.0), libpcre2-8-0 (>= 10.32), libsimdutf31 (>= 8.0.0), libstdc++6 (>= 14), libsystemd0 (>= 220) +Filename: pool/libvte-2.91-gtk4-0_0.84.0-2_amd64.deb +Size: 383226 +MD5sum: 32b1d8580f39736dade8fe3e49907678 +SHA1: e121b7be0f1a38fb228af8346be0b917ff1f5c7d +SHA256: 9b038781acf8a27c7489bf62eaaa851e02607b5694c1806132404bb98731b393 +SHA512: 5521fcb9a4738791b0cb19e60dfa11c9e3f45163538ad92ae3b9d22561d9ac5d16225d7aba2984c2f636acc5ddcba5b183b0f788a46aedadfa60289c12dfe4c3 +Homepage: https://wiki.gnome.org/Apps/Terminal/VTE +Description: Terminal emulator widget for GTK 4 - runtime files + The VTE library provides a terminal emulator widget VteTerminal for + applications using the GTK toolkit. It also provides the VtePTY object + containing functions for starting a new process on a new + pseudo-terminal and for manipulating pseudo-terminals. + . + This package contains the runtime library, needed by programs using the + VTE widget with GTK 4. + +Package: libvulkan1 +Architecture: amd64 +Version: 1.4.341.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: vulkan-loader +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 607 +Depends: libc6 (>= 2.38) +Recommends: mesa-vulkan-drivers | vulkan-icd +Breaks: libvulkan-dev (<< 1.1.70+dfsg1-2), vulkan-loader +Replaces: libvulkan-dev (<< 1.1.70+dfsg1-2), vulkan-loader +Filename: pool/libvulkan1_1.4.341.0-1_amd64.deb +Size: 157194 +MD5sum: a3a3c894e00f7e92c444a0e364fd4856 +SHA1: 17984fc10d6a96feda7b328983cc266736be10dc +SHA256: b4aca7a519d6318347f15a0e485c636603005e2553dae1a986272ac8c96176b0 +SHA512: 69459c4ae78cbff6e3497d537580ec3be7ef6b0f2c74efa2734ea55026cfe085b892ad1d7c742418da670f4e97469663aedeaf1537382eb8603aa88096159ec3 +Homepage: https://github.com/KhronosGroup/Vulkan-Loader +Description: Vulkan loader library + The Loader implements the main VK library. It handles layer management and + driver management. The loader fully supports multi-gpu operation. As part of + this, it dispatches API calls to the correct driver, and to the correct + layers, based on the GPU object selected by the application. + . + This package includes the loader library. + +Package: libwacom-common +Architecture: all +Version: 2.18.0-1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libwacom +Maintainer: Ubuntu Developers +Original-Maintainer: Timo Aaltonen +Installed-Size: 1914 +Filename: pool/libwacom-common_2.18.0-1_all.deb +Size: 117250 +MD5sum: c193f5566681f5c4006b1274c0363f6e +SHA1: 7afca2b87c31ea19fe7e73a0124437a06dd43cc7 +SHA256: 40498c518af6224bd21a931c8d393a93c318d52c2ee475432d6fa529c70c30ad +SHA512: 4bd2babad40b48d81e9f2456222d8a415e3e7af3a983dcde6616e8dab9d5791bc0c952dc616945575736b20aba6fc17c28112aaa936b84a27bb1a25ae32887c1 +Description: Wacom model feature query library (common files) + libwacom is a library to identify wacom tablets and their model-specific + features. It provides easy access to information such as "is this a built-in + on-screen tablet", "what is the size of this model", etc. + . + This package contains common data files for libwacom. + +Package: libwacom9 +Architecture: amd64 +Version: 2.18.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwacom +Maintainer: Ubuntu Developers +Original-Maintainer: Timo Aaltonen +Installed-Size: 83 +Depends: libc6 (>= 2.38), libevdev2 (>= 1.6.901), libglib2.0-0t64 (>= 2.68.0), libgudev-1.0-0 (>= 146), libwacom-common +Suggests: libwacom-bin (= 2.18.0-1) +Filename: pool/libwacom9_2.18.0-1_amd64.deb +Size: 28352 +MD5sum: 8a1d56d0a750c15f0d76d3eb29dd72ad +SHA1: e4d7da6cd8954a766e2134782b2b43de483d4c5a +SHA256: a2555343e9c9a533e2ca5185895a043d8068912c5d95095d7e3a9f8a078dd919 +SHA512: 9ead460fbd89a1a260e30f91ebc1fad841ce3bfd133f52fe5b52431dab0d6d05f0c08bac21efd28e672477f73108126f81d81d1871db6918c92e645e45d99d83 +Description: Wacom model feature query library + libwacom is a library to identify wacom tablets and their model-specific + features. It provides easy access to information such as "is this a built-in + on-screen tablet", "what is the size of this model", etc. + +Package: libwavpack1 +Architecture: amd64 +Version: 5.9.0-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: wavpack +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 220 +Depends: libc6 (>= 2.34) +Filename: pool/libwavpack1_5.9.0-1_amd64.deb +Size: 92332 +MD5sum: 42e52db2b73ed397521ab434e7af6793 +SHA1: db85343efe1353d2dc81b087296c2c9e978dfe46 +SHA256: 67ae8eb2aba5cd2a2c32cc47bdaabec7b809458e11c55cfd6a64fe28d0b17ca2 +SHA512: dbcd8b04ac2085f028982a89adc929b3c152023584e6e75ff3a3fa5aa789e1e4387f64d46e761cbee218c6218312fcc9c67d2872dd9ab9d9ec39491f37f6e64c +Homepage: http://www.wavpack.com +Description: audio codec (lossy and lossless) - library + WavPack is a completely open audio compression format providing lossless, + high-quality lossy, and a unique hybrid compression mode. Although the + technology is loosely based on previous versions of WavPack, the new version + 4 format has been designed from the ground up to offer unparalleled + performance and functionality. + . + This package contains the shared libraries necessary to run programs + using libwavpack. + +Package: libwayland-client0 +Architecture: amd64 +Version: 1.24.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: wayland +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 90 +Depends: libc6 (>= 2.38), libffi8 (>= 3.4) +Filename: pool/libwayland-client0_1.24.0-2_amd64.deb +Size: 28530 +MD5sum: 1f975789e6bd8353e05c1c00e55df104 +SHA1: 29f3d4d6969837bdc338a5bee4cb0bcd1b5fabc5 +SHA256: 094db0e190b53872e4d5310cd5fa09ca28ee3936386cd09e5f7d13e645aa12ab +SHA512: b694b41427cf488a00ea72ac665362210f2ddcd066c3508db1d0388abb0d31b76e94f299ab4748d13650b003c630f6065abe57e17ad27f131828a06fc4e405b3 +Homepage: https://wayland.freedesktop.org/ +Description: wayland compositor infrastructure - client library + Wayland is a protocol for a compositor to talk to its clients as well + as a C library implementation of that protocol. The compositor can be + a standalone display server running on Linux kernel modesetting and + evdev input devices, an X application, or a wayland client + itself. The clients can be traditional applications, X servers + (rootless or fullscreen) or other display servers. + . + This package ships the library that implements the client side of + the Wayland protocol. + +Package: libwayland-cursor0 +Architecture: amd64 +Version: 1.24.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: wayland +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 52 +Depends: libc6 (>= 2.28), libwayland-client0 (>= 1.20.0) +Filename: pool/libwayland-cursor0_1.24.0-2_amd64.deb +Size: 10770 +MD5sum: 6b6060f404ae537ebcf35fc5226a2876 +SHA1: 4c65b2b9e2cb831a60af7831f19ba31358ce197c +SHA256: 941affa9ef61b0cca5cfac1fab13e8e78168af306709df4adf546c76be82a1de +SHA512: 772415bd9056687993f105886b68fc974d5c065902230f63235a3108a9ac951c1517e07fcd92cf57485454f063129a89acb5db32f4d1da36f46c905ba52bc887 +Homepage: https://wayland.freedesktop.org/ +Description: wayland compositor infrastructure - cursor library + Wayland is a protocol for a compositor to talk to its clients as well + as a C library implementation of that protocol. The compositor can be + a standalone display server running on Linux kernel modesetting and + evdev input devices, an X application, or a wayland client + itself. The clients can be traditional applications, X servers + (rootless or fullscreen) or other display servers. + . + This package ships a helper library to manage cursors. + +Package: libwayland-egl1 +Architecture: amd64 +Version: 1.24.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: wayland +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.2.5) +Filename: pool/libwayland-egl1_1.24.0-2_amd64.deb +Size: 6248 +MD5sum: e6b10525fad4d48c679fcc547b0ebf9a +SHA1: 6d4e38dafb2feefc09a6c1c146990f590cd6340e +SHA256: 692358c252186b132f6807548cffffe6f358d5b2139e8d57d0763b1f3ba28c61 +SHA512: 71c5a04aacbefcbdb2acf96c8a7e14b2f08cd59b069bc3d8c45afa829bc7856527732d3852f352ff4641764892a19c59a2a867e99c4f2d0dc579899f1d7c3494 +Homepage: https://wayland.freedesktop.org/ +Description: wayland compositor infrastructure - EGL library + Wayland is a protocol for a compositor to talk to its clients as well + as a C library implementation of that protocol. The compositor can be + a standalone display server running on Linux kernel modesetting and + evdev input devices, an X application, or a wayland client + itself. The clients can be traditional applications, X servers + (rootless or fullscreen) or other display servers. + . + This package ships the library that implements the Wayland EGL platform + of the Wayland protocol. + +Package: libwayland-server0 +Architecture: amd64 +Version: 1.24.0-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: wayland +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 109 +Depends: libc6 (>= 2.38), libffi8 (>= 3.4) +Filename: pool/libwayland-server0_1.24.0-2_amd64.deb +Size: 35942 +MD5sum: 69961bff4ddc378ba8d4e94f6b4813fd +SHA1: fee87eb0ec5ccffba74dcea92b608255642fe6d0 +SHA256: 9f0278d02d401c9fd0f2b4b06d37ea0b1e7cecbb6a8d2539427f810d80c409dc +SHA512: a96b4e879a9d28028c656f18b186016cb4eb493ab800856474f965f721f77af78c27a1945acf871ddb0c450b507ce39486230505078cbf0fb0bb20ae24db79da +Homepage: https://wayland.freedesktop.org/ +Description: wayland compositor infrastructure - server library + Wayland is a protocol for a compositor to talk to its clients as well + as a C library implementation of that protocol. The compositor can be + a standalone display server running on Linux kernel modesetting and + evdev input devices, an X application, or a wayland client + itself. The clients can be traditional applications, X servers + (rootless or fullscreen) or other display servers. + . + This package ships the library that implements the server side of + the Wayland protocol. + +Package: libwbclient0 +Architecture: amd64 +Version: 2:4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 134 +Depends: libc6 (>= 2.38) +Filename: pool/libwbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 57916 +MD5sum: 3a76897083306fc433f186c883b5527d +SHA1: df5846f497c51ac124a54abbc4138db96ac634b1 +SHA256: 94f2f8e193ccd6b8901c36846391ac198d9ac77224fe66717f6e206f4720b02e +SHA512: ba5a2c6f6081934a7c9317707995d40e8bba3d37186a4f7e167807f855675e4a6fd46557eb6ab849fa9b5345ac27d15bd19204cc6acad6bc874b46f514c7fc35 +Homepage: https://www.samba.org +Description: Samba winbind client library + Samba is an implementation of the SMB/CIFS protocol for Unix systems, + providing support for cross-platform file and printer sharing with + Microsoft Windows, OS X, and other Unix systems. + . + This package provides a library for client applications that interact + via the winbind pipe protocol with a Samba winbind server. + +Package: libwebkit2gtk-4.1-0 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 94896 +Depends: libjavascriptcoregtk-4.1-0 (= 2.52.6-0ubuntu0.26.04.1), gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, libgles2, bubblewrap (>= 0.3.1), xdg-dbus-proxy, libatk1.0-0t64 (>= 1.32.0), libatomic1 (>= 4.8), libc6 (>= 2.43), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.14.0), libdrm2 (>= 2.4.107), libenchant-2-2 (>= 2.2.3), libepoxy0 (>= 1.3), libexpat1 (>= 2.1~beta3), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.11.1), libgbm1 (>= 21.3.0~rc1), libgcc-s1 (>= 4.0), libgcrypt20 (>= 1.12.0), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgpg-error0 (>= 1.14), libgstreamer-gl1.0-0 (>= 1.14.0), libgstreamer-plugins-base1.0-0 (>= 1.23.1), libgstreamer1.0-0 (>= 1.27.50), libgtk-3-0t64 (>= 3.23.0), libharfbuzz-icu0 (>= 0.9.9), libharfbuzz0b (>= 1.8.6), libhyphen0 (>= 2.7.1), libicu78 (>= 78.1-1~), libjpeg8 (>= 8c), libjxl0.11 (>= 0.6.1), liblcms2-2 (>= 2.2+git20110628), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libpng16-16t64 (>= 1.6.46), libseccomp2 (>= 0.0.0~20120605), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.0.3), libsqlite3-0 (>= 3.8.7), libstdc++6 (>= 12), libsystemd0, libtasn1-6 (>= 4.14), libwayland-client0 (>= 1.20.0), libwayland-egl1 (>= 1.15.0), libwayland-server0 (>= 1.0.2), libwebp7 (>= 1.5.0), libwebpdemux2 (>= 1.5.0), libwebpmux3 (>= 1.5.0), libx11-6, libxml2-16 (>= 2.14.1), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.2) +Recommends: gstreamer1.0-gl, libgl1-mesa-dri, xdg-desktop-portal-gtk +Suggests: gstreamer1.0-libav, gstreamer1.0-plugins-bad, gstreamer1.0-alsa +Filename: pool/libwebkit2gtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 25718128 +MD5sum: ebbb6365c69340307c3d947caebe355f +SHA1: 2e1f7bca778e4a6914ec194900cae1da94209552 +SHA256: 0d30994ddaa395026ed6e91e99608841597ebb492555de8a1c8fd83259c10da1 +SHA512: 3c6129a5956272f5c28e29868cef5447b201f9703fa6e401782ad77055c458c4f7132bf68ebcdd05bcee53c7d13275a6ac35825b1a342221bdc080be47f90c64 +Homepage: https://webkitgtk.org/ +Description: Web content engine library for GTK + WebKit is a web content engine, derived from KHTML and KJS from KDE, and + used primarily in Apple's Safari browser. It is made to be embedded in + other applications, such as mail readers, or web browsers. + . + It is able to display content such as HTML, SVG, XML, and others. It also + supports DOM, XMLHttpRequest, XSLT, CSS, JavaScript/ECMAScript and more. + . + WebKitGTK is a WebKit port designed to be used in GTK applications. + This build provides version 4.1 of the API and uses the GTK 3 widget + toolkit. + . + This package contains the shared libraries. + +Package: libwebkitgtk-6.0-4 +Architecture: amd64 +Version: 2.52.6-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: webkit2gtk +Maintainer: Ubuntu Developers +Original-Maintainer: Debian WebKit Maintainers +Installed-Size: 93829 +Depends: libjavascriptcoregtk-6.0-1 (= 2.52.6-0ubuntu0.26.04.1), gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, libgles2, bubblewrap (>= 0.3.1), xdg-dbus-proxy, libatomic1 (>= 4.8), libc6 (>= 2.43), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.14.0), libdrm2 (>= 2.4.107), libenchant-2-2 (>= 2.2.3), libepoxy0 (>= 1.3), libexpat1 (>= 2.1~beta3), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.11.1), libgbm1 (>= 21.3.0~rc1), libgcc-s1 (>= 4.0), libgcrypt20 (>= 1.12.0), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.80.0), libgpg-error0 (>= 1.14), libgraphene-1.0-0 (>= 1.5.4), libgstreamer-gl1.0-0 (>= 1.14.0), libgstreamer-plugins-base1.0-0 (>= 1.23.1), libgstreamer1.0-0 (>= 1.27.50), libgtk-4-1 (>= 4.13.8), libharfbuzz-icu0 (>= 0.9.9), libharfbuzz0b (>= 1.8.6), libhyphen0 (>= 2.7.1), libicu78 (>= 78.1-1~), libjpeg8 (>= 8c), libjxl0.11 (>= 0.6.1), liblcms2-2 (>= 2.2+git20110628), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libpng16-16t64 (>= 1.6.46), libseccomp2 (>= 0.0.0~20120605), libsecret-1-0 (>= 0.7), libsoup-3.0-0 (>= 3.0.3), libsqlite3-0 (>= 3.8.7), libstdc++6 (>= 12), libsystemd0, libtasn1-6 (>= 4.14), libvulkan1 (>= 1.2.131.2), libwayland-client0 (>= 1.20.0), libwayland-egl1 (>= 1.15.0), libwayland-server0 (>= 1.0.2), libwebp7 (>= 1.5.0), libwebpdemux2 (>= 1.5.0), libwebpmux3 (>= 1.5.0), libx11-6, libxml2-16 (>= 2.14.1), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.2) +Recommends: gstreamer1.0-gl, libgl1-mesa-dri, xdg-desktop-portal-gtk +Suggests: gstreamer1.0-libav, gstreamer1.0-plugins-bad, gstreamer1.0-alsa +Filename: pool/libwebkitgtk-6.0-4_2.52.6-0ubuntu0.26.04.1_amd64.deb +Size: 25458198 +MD5sum: 423dca11343e35a67286c96e72bdfee0 +SHA1: 11552cbe013bafdf7b7f4b3d72e2a4849c043cf1 +SHA256: b3c40096f4dabf5b0fc4453e8cb8df340619ed45a34a601b53538693d60afd8c +SHA512: e5f2e48cb8c9d80b78866eb55f3fa0d870e056319fc37e76c5d63d0a3b8c9c1686b8dff4fc3f5cb4a93554641ba573c4fcf8300c1aec6ac9bd1c04bd0285e0da +Homepage: https://webkitgtk.org/ +Description: Web content engine library for GTK + WebKit is a web content engine, derived from KHTML and KJS from KDE, and + used primarily in Apple's Safari browser. It is made to be embedded in + other applications, such as mail readers, or web browsers. + . + It is able to display content such as HTML, SVG, XML, and others. It also + supports DOM, XMLHttpRequest, XSLT, CSS, JavaScript/ECMAScript and more. + . + WebKitGTK is a WebKit port designed to be used in GTK applications. + This build provides version 6.0 of the API and uses the GTK 4 widget + toolkit. + . + This package contains the shared libraries. + +Package: libwebp7 +Architecture: amd64 +Version: 1.5.0-0.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwebp +Maintainer: Ubuntu Developers +Original-Maintainer: Jeff Breidenbach +Installed-Size: 600 +Depends: libc6 (>= 2.34), libsharpyuv0 (>= 1.5.0) +Filename: pool/libwebp7_1.5.0-0.1build1_amd64.deb +Size: 263542 +MD5sum: 24bf5fbfceae930ab7391ea556d076af +SHA1: b40e921ddbe97f4cc0ba246234ebf1f6a755d1ba +SHA256: 0a846cf63522d9c1f28d31bdd53e35e223d590a0971bb6927b3ee5092934ce9d +SHA512: ec34c7da60613010fd77e6fd13caf883c0c4b7b756f72d156a82f0ad604c07e77c52be104cf12178d900d823c3932d538101bc75b8cc50e02f08c39e50052dd9 +Homepage: https://developers.google.com/speed/webp/ +Description: Lossy compression of digital photographic images (shared library) + Image Compression format, based on the VP8 codec. + WebP uses the modern VP8 compression format to deliver efficient + compression of images for the web. More than 30% extra gain over + optimized JPEG, for same quality, is not unusual. + +Package: libwebpdemux2 +Architecture: amd64 +Version: 1.5.0-0.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwebp +Maintainer: Ubuntu Developers +Original-Maintainer: Jeff Breidenbach +Installed-Size: 44 +Depends: libc6 (>= 2.14), libwebp7 (>= 1.5.0) +Filename: pool/libwebpdemux2_1.5.0-0.1build1_amd64.deb +Size: 12804 +MD5sum: ce1fc9fd5550d86543893b3855fc7c62 +SHA1: 0ff0ba08253a5e6e5344ab057cd9c2ab7a0468ca +SHA256: 05213cc9919e32e261479ec3a5fdf561da77f06d137046dd0d8b622ea3f0ea79 +SHA512: e8f588a472a201bfc29548344aae03b7722315321adc1f0d4793b58c28d17d14a39f81ca90a73e6e41c8a70ed71ae64b4422941a9f3fef56db33d6cc4ba05bdd +Homepage: https://developers.google.com/speed/webp/ +Description: Lossy compression of digital photographic images (libwebpdemux library) + Image Compression format, based on the VP8 codec. + WebP uses the modern VP8 compression format to deliver efficient + compression of images for the web. More than 30% extra gain over + optimized JPEG, for same quality, is not unusual. + +Package: libwebpmux3 +Architecture: amd64 +Version: 1.5.0-0.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwebp +Maintainer: Ubuntu Developers +Original-Maintainer: Jeff Breidenbach +Installed-Size: 76 +Depends: libc6 (>= 2.29), libwebp7 (>= 1.5.0) +Filename: pool/libwebpmux3_1.5.0-0.1build1_amd64.deb +Size: 26446 +MD5sum: e822295af20ab20f360c317b108c8149 +SHA1: af7c183a2afa2f672697a9629e046ca0091f73f1 +SHA256: e4da6abdb642623afd2e4a60ef354539f8b74ba0f2daaaeb0e058a392d4ae571 +SHA512: 033beeabd28e50c3c22c963033479c8096f1912bb289f5303124e9603e71e54cadb2d933c8386c2c9724237198b9a6340995c3a5d066cbb77a0a57a910422e48 +Homepage: https://developers.google.com/speed/webp/ +Description: Lossy compression of digital photographic images (libwebpmux library) + Image Compression format, based on the VP8 codec. + WebP uses the modern VP8 compression format to deliver efficient + compression of images for the web. More than 30% extra gain over + optimized JPEG, for same quality, is not unusual. + +Package: libwebrtc-audio-processing-1-3 +Architecture: amd64 +Version: 1.3-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: webrtc-audio-processing +Maintainer: Ubuntu Developers +Original-Maintainer: Pulseaudio maintenance team +Installed-Size: 1031 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 12) +Filename: pool/libwebrtc-audio-processing-1-3_1.3-3build2_amd64.deb +Size: 410554 +MD5sum: 2de4e4317f1fdf43ccd004e5e912f787 +SHA1: 75507d3676e3e28e320b0739df290a4cab251ec8 +SHA256: 9aed48f9a96df74a82c65b996ad2bef712dc77cd57569aca0a604f51e26a8291 +SHA512: 7fa69fe92299d848ebbb70fd8138d9cc1b54d2960e84ca0b2221155e2192e49dfea17f926682ce391d3e836a78530c7e57842524756fedc3cbf3ef02edbafe6b +Homepage: http://freedesktop.org/software/pulseaudio/webrtc-audio-processing/ +Description: WebRTC Audio Processing library + Audio processing library (echo-cancellation, gain control etc) around the + AudioProcessing module from the WebRTC project + +Package: libwhoopsie-preferences0 +Architecture: amd64 +Version: 23build4 +Priority: optional +Section: libs +Source: whoopsie-preferences +Maintainer: Ubuntu Developers +Original-Maintainer: Evan Dandrea +Installed-Size: 59 +Depends: libc6 (>= 2.4), libglib2.0-0t64 (>= 2.83.0) +Breaks: whoopsie (<< 0.2.47) +Filename: pool/libwhoopsie-preferences0_23build4_amd64.deb +Size: 14734 +MD5sum: a008f0114a97ca497e10956bab51c1ea +SHA1: bd1b4ef9696c5d1f1583f7f2725e4931934b0905 +SHA256: 620795acdfb8a496044260c8fd901209616e18da494eff38b5a57d9c531b73af +SHA512: e5eab6a5381d4c22caf2e76f2b748870977e730fd76793db2c8f6a73f682817cc8a1321a59aa8c44a794f640c6ff03335ae975b0f412aa856f78c7fe9af9face +Homepage: http://launchpad.net/whoopsie-preferences +Description: Ubuntu error tracker submission settings - shared library + This library provides convenience DBus methods for interfacing with the error + tracker submission settings daemon. + +Package: libwhoopsie0 +Architecture: amd64 +Version: 0.2.82ubuntu +Multi-Arch: same +Priority: optional +Section: libs +Source: whoopsie +Maintainer: Florent 'Skia' Jacquet +Installed-Size: 38 +Depends: libc6 (>= 2.27), libgcrypt20 (>= 1.12.0), libglib2.0-0t64 (>= 2.32) +Filename: pool/libwhoopsie0_0.2.82ubuntu_amd64.deb +Size: 9872 +MD5sum: cd58ed4d78352e990dba4d879f49f0fd +SHA1: f4ea23e52e50583dcb7f18df945cdd5e6c528670 +SHA256: 7b689ad54e2d3f9ba025c44b0c1e9d7afcb23df32267dd5cd3b0ae3ea3675a27 +SHA512: d6b4862973a44d1059ee8ac6b1aa4c4465416148151dabfe6e54f0fcf0a28790fdd92ff0bc1367284fcfd64a33fe85a38c8e2b339e21f8a8dc6fbaf0511585a7 +Homepage: http://wiki.ubuntu.com/ErrorTracker +Description: Ubuntu error tracker submission - shared library + This library provides methods to generate an identifier for use with the + Ubuntu error tracker + +Package: libwinpr3-3 +Architecture: amd64 +Version: 3.31.0+dfsg-0ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: freerdp3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Remote Maintainers +Installed-Size: 1447 +Depends: libc6 (>= 2.42), libgcc-s1 (>= 3.3), libicu78 (>= 78.1-1~), libjson-c5 (>= 0.15), libk5crypto3 (>= 1.8+dfsg), libkrb5-3 (>= 1.15~beta1), libssl3t64 (>= 3.0.0) +Suggests: freerdp-x11 +Replaces: libwinpr2-2, libwinpr2-2t64 +Filename: pool/libwinpr3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +Size: 399088 +MD5sum: 456b223444123cadd01d172b3270eb74 +SHA1: 8e548ae23053f3c149ef71f921b2295ec820fd05 +SHA256: 9590bd12c632dd6ab2413d84dcb2417adc9aaf47aa67656861f3f19a9968a0f1 +SHA512: 7b89e0cbc8568f6940bae437f50f788af8db95a2024a98f8c96d798bf66cc33c4bbfedfed8bd202cf19a58b26c9a78035c33a3030a1dcfa56ab8dda53633b74f +Homepage: https://www.freerdp.com/ +Description: Windows Portable Runtime library + WinPR is a spin-off project of FreeRDP which aims at providing a portable + implementation of important portions of the Windows API. Just like FreeRDP, + WinPR is released under the Apache license. Unlike Wine, WinPR does not provide + binary compatibility, and does not require applications to be built for + Windows. Instead, WinPR provides API compatibility for applications targeting + non-Windows environments. When on Windows, the original native API is being + used instead of the equivalent WinPR implementation, without having to modify + the code using it. + . + This package contains the WinPR shared library. + +Package: libwireplumber-0.5-0 +Architecture: amd64 +Version: 0.5.13-1ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: wireplumber +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1278 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.68), liblua5.4-0 (>= 5.4.6), libpipewire-0.3-0t64 (>= 1.1.81), libsnapd-glib-2-1 (>= 1.72), libsystemd0 +Filename: pool/libwireplumber-0.5-0_0.5.13-1ubuntu1_amd64.deb +Size: 321566 +MD5sum: d9e74ecee1237ba3c8bb99cca3e7cef6 +SHA1: 2d2aa935c4720184faa61eacfb8cbef82f5ccbfa +SHA256: 5e5364a1e625e2e51cc2c92f7de813f2ee57b73c15eba63a68657dbd4d47861f +SHA512: f437250b30a3b6ab5cdb7fb5f3b8c2358b667d94861fa85e42fb7519ba26a694cbb1d570b054528f716bc1a73dfdc208495ef9e50a7627396d2e237beb04c617 +Homepage: https://gitlab.freedesktop.org/pipewire/wireplumber +Description: Shared libraries for WirePlumber + WirePlumber is a modular session / policy manager for PipeWire and a + GObject-based high-level library that wraps PipeWire's API, providing + convenience for writing the daemon's modules as well as external tools for + managing PipeWire. + . + This package contains the shared library and plugins. + +Package: libwmf-0.2-7 +Architecture: amd64 +Version: 0.2.14-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwmf +Maintainer: Ubuntu Developers +Original-Maintainer: Yangfl +Installed-Size: 354 +Depends: libc6 (>= 2.33), libexpat1 (>= 2.0.1), libfreetype6 (>= 2.2.1), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libwmflite-0.2-7 (>= 0.2.12), libx11-6, zlib1g (>= 1:1.1.4) +Recommends: fonts-urw-base35 +Suggests: libwmf-0.2-7-gtk +Breaks: libwmf0.2-7 (<< 0.2.12-1) +Replaces: libwmf0.2-7 (<< 0.2.12-1) +Filename: pool/libwmf-0.2-7_0.2.14-1_amd64.deb +Size: 92846 +MD5sum: 13db7fcb05359204778d779d1c3ce105 +SHA1: b3ce9075cd2f2f9aa07347d458bb9dc008ea8c8f +SHA256: ca38f81214be4605404f808062b2c780cabac1b7c830367ebb5a07578e825d58 +SHA512: 25b5ccc3fab5ef63852525903289b9f774d3b6c12f8c72609b205f0d7ca1f88e328a9167318eed756114d7df63eb8e54a9e1b0fbce19539d55588a01acddb2a1 +Homepage: https://wvware.sourceforge.net/libwmf.html +Description: Windows metafile conversion library + Windows metafile (WMF) is a picture format used by many Windows + programs, e.g. Microsoft Word. libwmf is a library for interpreting + metafile images and either displaying them using X or converting them + to standard formats such as PNG, JPEG, PS, EPS and SVG(Z)... + . + This package contains the shared library. + +Package: libwmf-0.2-7-gtk +Architecture: amd64 +Version: 0.2.14-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwmf +Maintainer: Ubuntu Developers +Original-Maintainer: Yangfl +Installed-Size: 66 +Depends: libc6 (>= 2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.12.0), libwmf-0.2-7 (= 0.2.14-1), libwmflite-0.2-7 (>= 0.2.12) +Breaks: libwmf0.2-7-gtk (<< 0.2.12-1) +Replaces: libwmf0.2-7-gtk (<< 0.2.12-1) +Filename: pool/libwmf-0.2-7-gtk_0.2.14-1_amd64.deb +Size: 17634 +MD5sum: 418a933092c6e7cf18bf57a4c8d3e09e +SHA1: d02a6a39f68b4d626c78a30cef396ea78991baf1 +SHA256: b1978f52b4dbe623c3de42e3ba76fced22afe6ea823ea7cf40e63c2ff191cf23 +SHA512: 88ed1a7ca6efb53cea4fe9f7ef5fc515cb2d5f6ee62973cd606a86e86882b8073bdeeac86c1127b4f18772814c9ee78a1d454b933d47fee73294dd3ee50b81a4 +Homepage: https://wvware.sourceforge.net/libwmf.html +Description: Windows metafile conversion GTK pixbuf plugin + Windows metafile (WMF) is a picture format used by many Windows + programs, e.g. Microsoft Word. libwmf is a library for interpreting + metafile images and either displaying them using X or converting them + to standard formats such as PNG, JPEG, PS, EPS and SVG(Z)... + . + This package contains the GTK pixbuf plugin. + +Package: libwmflite-0.2-7 +Architecture: amd64 +Version: 0.2.14-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwmf +Maintainer: Ubuntu Developers +Original-Maintainer: Yangfl +Installed-Size: 184 +Depends: libc6 (>= 2.38) +Breaks: libwmf0.2-7 (<< 0.2.12-1) +Replaces: libwmf0.2-7 (<< 0.2.12-1) +Filename: pool/libwmflite-0.2-7_0.2.14-1_amd64.deb +Size: 67604 +MD5sum: 9ec93797cec046c55a011fb1c7846068 +SHA1: 4ba38823dd8861e91b94874a4bf4393e80323b17 +SHA256: 16dfaa480ecec8c9b436d7b2957ea085f9871f3bf8accae93d593175e3d00267 +SHA512: 9d75177330e6a7bdf961be63b769c2a58d09213a9d00af4cb22401e6ca01369a7c568f00f73bfd2b03cc76831a5f76b7e41fe1ba70cdaa4f8b6cdf127104d5fb +Homepage: https://wvware.sourceforge.net/libwmf.html +Description: Windows metafile conversion lite library + Windows metafile (WMF) is a picture format used by many Windows + programs, e.g. Microsoft Word. libwmf is a library for interpreting + metafile images and either displaying them using X or converting them + to standard formats such as PNG, JPEG, PS, EPS and SVG(Z)... + . + This package contains the lite library. + +Package: libwnck-3-0 +Architecture: amd64 +Version: 43.3-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libwnck3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 311 +Depends: libatk1.0-0t64 (>= 1.12.4), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.25.2), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.22.0), libpango-1.0-0 (>= 1.18.0), libstartup-notification0 (>= 0.7), libx11-6, libxrender1 (>= 1:0.9.12), libxres1 (>= 2:1.2.1), libwnck-3-common +Filename: pool/libwnck-3-0_43.3-1build1_amd64.deb +Size: 114840 +MD5sum: 55aeb7058fac7dd332905294f476c564 +SHA1: e7e338b082baadbf523832c1cf02dd77ddd2a574 +SHA256: ed9662390c61fe7a2e2f7b6e1996a309d7c22a6f4b22342d115d037fad1e4436 +SHA512: 8626cbba88739f335e6d9d86b867998d35ee4c0fefa8df7e24c81390e2e8003bbed07c0a4adef9e78319b9ccd613b1f5026bd1630b50076d8d23d8c18cfb2a89 +Homepage: https://gitlab.gnome.org/GNOME/libwnck +Description: Window Navigator Construction Kit - runtime files + A library to use for writing pagers and task lists. + . + This package contains runtime files. + +Package: libwnck-3-common +Architecture: all +Version: 43.3-1build1 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: libwnck3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 60 +Filename: pool/libwnck-3-common_43.3-1build1_all.deb +Size: 20200 +MD5sum: c75c1b7d3efc666cd0f4044462d12d4e +SHA1: 42bc608d472429802e65f6e9479268f5289f3f53 +SHA256: 88466e17f3f455ebe8af70089c3a883407ef0819117c40227dbc3086d05cf7ef +SHA512: abe1564cf5600ea547167cbc06c037c2b03f769e2b722262588ad5529d81fad01523013ba7ccb1ead9f87ac7a50c105968fc566e9b8c0cfae8e776df6d356911 +Homepage: https://gitlab.gnome.org/GNOME/libwnck +Description: Window Navigator Construction Kit - common files + A library to use for writing pagers and task lists. + . + This package contains internationalization files. + +Package: libwrap0 +Architecture: amd64 +Version: 7.6.q-36build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: tcp-wrappers +Maintainer: Ubuntu Developers +Original-Maintainer: Marco d'Itri +Installed-Size: 107 +Depends: libc6 (>= 2.38) +Filename: pool/libwrap0_7.6.q-36build2_amd64.deb +Size: 48490 +MD5sum: 31798d95ff777ce047541c73f643d971 +SHA1: 71902755af66f5c52f343b20bf546834c9c390fe +SHA256: a3784ca083c626c3ae41cdd32d4c5898554650dc77d2b54dbb1197a38198adf8 +SHA512: f27e94d2b6cafa86e201d64f0b444875e90160dc9d2d8ea275fcaf9a49cbafae6fb4b733e3cb35e8b3f9b7c58373f6a1a076a77e422609f7bb6ecfdff5d3e352 +Description: Wietse Venema's TCP wrappers library + Wietse Venema's network logger, also known as TCPD or LOG_TCP. + . + These programs log the client host name of incoming telnet, + ftp, rsh, rlogin, finger etc. requests. + . + Security options are: + - access control per host, domain and/or service; + - detection of host name spoofing or host address spoofing; + - booby traps to implement an early-warning system. + +Package: libwww-perl +Architecture: all +Version: 6.81-1ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 376 +Depends: perl:any, ca-certificates, libencode-locale-perl, libfile-listing-perl, libhtml-parser-perl, libhtml-tagset-perl, libhtml-tree-perl, libhttp-cookies-perl, libhttp-date-perl, libhttp-message-perl (>= 7.01), libhttp-negotiate-perl, liblwp-mediatypes-perl, liblwp-protocol-https-perl, libnet-http-perl, libtry-tiny-perl, liburi-perl, libwww-robotrules-perl, netbase +Recommends: libdata-dump-perl, libhtml-form-perl, libhtml-format-perl, libhttp-daemon-perl, libmailtools-perl +Suggests: libauthen-ntlm-perl +Filename: pool/libwww-perl_6.81-1ubuntu0.1_all.deb +Size: 140310 +MD5sum: 2ecf938867b8d408d2dd033053c3306f +SHA1: e3d6b96bf02f54f7dd18b2f40f97daac3bff9d6b +SHA256: 0cfd279321a889cfc1ba48e2679623f8110947ea05e595c32c002f9086f3c09e +SHA512: a0c5c55987fa734c5591cb366251d3f3408b957e8e8c64e78790ca19703fea99731b041585ee4d691b9702414fba4f7d42b45c4177b34d0a81fc94a99b056119 +Homepage: https://metacpan.org/release/libwww-perl +Description: simple and consistent interface to the world-wide web + libwww-perl (also known as LWP) is a collection of Perl modules that provide + a simple and consistent programming interface (API) to the World-Wide Web. + The main focus of the library is to provide classes and functions that allow + you to write WWW clients. It also contains general purpose modules, as well + as a simple HTTP/1.1-compatible server implementation. + +Package: libwww-robotrules-perl +Architecture: all +Version: 6.02-1build1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 34 +Depends: perl:any, liburi-perl +Breaks: libwww-perl (<< 6.00) +Replaces: libwww-perl (<< 6.00) +Filename: pool/libwww-robotrules-perl_6.02-1build1_all.deb +Size: 12386 +MD5sum: 0c1de6e5d2668c86c5e656806692179e +SHA1: 10b8f3bbc41fea4ebc495853c69d74bfb2e63d8a +SHA256: 61862314f03e9c603f0b747999981a0ea6904b4d736bc46da7c6624ac2ac5f0f +SHA512: 11cfeb2a4cba2747593617548eabf6094f2c2dc779bfa86cb494808623a2684c9f866f130acd70e77bbbd4324f633eaeefe89d6e2e735249c0bafa99f4b822a7 +Homepage: https://metacpan.org/release/WWW-RobotRules +Description: database of robots.txt-derived permissions + WWW::RobotRules parses /robots.txt files as specified in "A Standard for + Robot Exclusion", at . Webmasters + can use the /robots.txt file to forbid conforming robots from accessing parts + of their web site. + . + The parsed files are kept in a WWW::RobotRules object, and this object + provides methods to check if access to a given URL is prohibited. The same + WWW::RobotRules object can be used for one or more parsed /robots.txt files + on any number of hosts. + +Package: libx11-6 +Architecture: amd64 +Version: 2:1.8.13-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libx11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 1381 +Depends: libc6 (>= 2.38), libxcb1 (>= 1.11.1), libx11-data +Breaks: libx11-xcb1 (<< 2:1.7.0-2) +Filename: pool/libx11-6_2%3a1.8.13-1_amd64.deb +Size: 657070 +MD5sum: f43249895150448f9581a3800f78edba +SHA1: 61f520fb2deadc4469a0dc3f6f34741a91db1bed +SHA256: 7e643e76063b94df9159c8b8fd4b8bf53d2fbf119c9889a5cc6842b6be272e4f +SHA512: fda40074ae9e25c8011f58a57a449ed3ebdcd7b17e20a26ad02ee7f1d2dafc8fb58cb818fffa11732b85a79e94324be205a41040c040eb6265771cbc93fb60b1 +Description: X11 client-side library + This package provides a client interface to the X Window System, otherwise + known as 'Xlib'. It provides a complete API for the basic functions of the + window system. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libX11 + +Package: libx11-data +Architecture: all +Version: 2:1.8.13-1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Source: libx11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 1343 +Filename: pool/libx11-data_2%3a1.8.13-1_all.deb +Size: 114288 +MD5sum: c8de0b14a850d997e2eff90e90d9c63e +SHA1: 374646e44c4d13e98b8abf553864685955718317 +SHA256: 8188c233d59dc419205c314ef8f230fc83ca7a3e7e9b9671f18b469fd3e428ae +SHA512: b9a2135e51f263dd5db58c5843009a570ee8999083d90962747ac98ffe6327096a25561cf5e1bfcb1e18b30bf6f4c6fa1eeb2072e08bdf5d6109152abe16baf6 +Description: X11 client-side library + This package provides the locale data files for libx11. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libX11 + +Package: libx11-protocol-perl +Architecture: all +Version: 0.56-9 +Multi-Arch: foreign +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 457 +Depends: perl:any +Recommends: perl | libio-socket-ip-perl +Filename: pool/libx11-protocol-perl_0.56-9_all.deb +Size: 121944 +MD5sum: e36d20d1fc8f25bab1e6ec55635ae56f +SHA1: 5baf79322813253a890fa0f4af731367f9e59a53 +SHA256: 3e1225b15f7921617a19e6e122353a3336bf32ca84654546b5b6b75b48d259eb +SHA512: 4238ce5ade0c2d759deba5d8c3e816ec52ec2604255527b278e2021b0eec5d38d5e6ad70dd7e0ae9d29a7b766a102b30858506fe01877b3cd94f0263dc0e742f +Homepage: https://metacpan.org/release/X11-Protocol +Description: Perl module for the X Window System Protocol, version 11 + X11::Protocol is a client-side interface to the X11 Protocol (see X(1) for + information about X11), allowing perl programs to display windows and + graphics on X11 servers. + +Package: libx11-xcb1 +Architecture: amd64 +Version: 2:1.8.13-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libx11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 73 +Depends: libx11-6 (= 2:1.8.13-1) +Filename: pool/libx11-xcb1_2%3a1.8.13-1_amd64.deb +Size: 7960 +MD5sum: 81bf348d1a908865e850d20f8ed01052 +SHA1: a6d194ea9c0a21e18166b5eec87e90f2cac1780b +SHA256: e20ab288f2f756800ae25e7a827ae70aee64272f692dd3cb8f706764b6767de9 +SHA512: 5ddbb25763844c4509cb7fcf478d909d206786140c8b2c35c5be7d4a9b81a995a6b6e1e7ccfcac491f540746cb7a5dfaba1d5cca7582f9e6c6ae860d469692fa +Description: Xlib/XCB interface library + libX11-xcb provides functions needed by clients which take advantage of + Xlib/XCB to mix calls to both Xlib and XCB over the same X connection. + . + More information about X.Org can be found at: + + . + More information about XCB can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libX11 + +Package: libxau6 +Architecture: amd64 +Version: 1:1.0.11-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxau +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 33 +Depends: libc6 (>= 2.33) +Filename: pool/libxau6_1%3a1.0.11-1build2_amd64.deb +Size: 7502 +MD5sum: c685c9fe7bf6d6d5e331d7545be00d3b +SHA1: 7c3e2fdf4d109e6f17397b5442ee2ab076ae906e +SHA256: 6c0b2dd4654db30449754e6e1adf84a34d8a8d7dddeb75f8c9c463ad86645274 +SHA512: 481f620db13f22656fa36c01dd17a8b36b24835952428ef949f67285c8b9ed6bd349a87c0464ab104ae85c93bc8528d4709a5956294c02f6ab679d58063491ac +Description: X11 authorisation library + This package provides the main interface to the X11 authorisation handling, + which controls authorisation for X connections, both client-side and + server-side. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libxau + +Package: libxaw7 +Architecture: amd64 +Version: 2:1.0.16-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxaw +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 499 +Depends: libc6 (>= 2.38), libx11-6, libxext6, libxmu6 (>= 2:1.1.3), libxpm4, libxt6t64 +Filename: pool/libxaw7_2%3a1.0.16-1build1_amd64.deb +Size: 190216 +MD5sum: c2dbb747abc7b27a6fa0e617fee58634 +SHA1: 04456a5e5d7585ae6a9d3cfe50f47bff0a307484 +SHA256: 8771b09a2ed641887411b9c5e10621440972340710fa4a8e015f062e5a7f5930 +SHA512: af59da01bdd016531513339a8e8b659306f46012f9ef8a0130d8a451aed7a4bb5d84cca8a8a8e2f30f40fd96ee9f656529e3f0b62da8c81a4f3640f78c088e18 +Description: X11 Athena Widget library + libXaw7 provides the second version of Xaw, the Athena Widgets toolkit, + which is largely used by legacy X applications. This version is the + most common version, as version 6 is considered deprecated, and version + 8, which adds Xprint support, is unsupported and not widely used. + In general, use of a more modern toolkit such as GTK+ is recommended. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXaw + +Package: libxcb-damage0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-damage0_1.17.0-2ubuntu1_amd64.deb +Size: 5034 +MD5sum: 8e73fc4c4ed4f0abb04ba8769029f166 +SHA1: b8a7679f8fd53b67169774f02e0a5b56e5d9f326 +SHA256: 24933e0f99b64847e8e915bc3acb42fc55f12db6aa219d3bec3e02b8004c39cb +SHA512: 172a1440edb1b1e98c55191d5a4add64df04ff4b76b536f29a4ff0b04d48a616866759fd900e2da74a4e800bd17910218dd2363e5ad8842efa568a6ba961296b +Homepage: https://xcb.freedesktop.org +Description: X C Binding, damage extension + This package contains the library files needed to run software using + libxcb-damage, the damage extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-dri2-0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 41 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-dri2-0_1.17.0-2ubuntu1_amd64.deb +Size: 7334 +MD5sum: ce7d8f81b12cac94a61c90e714a6b7c9 +SHA1: a17c35f463e2a4c7b4b8a4bb5ff4eb3f43938ebc +SHA256: bbc1f3f83d2ffe8f4596b7e745febf82aa90ca0e1916579cad2cce27041335ca +SHA512: d63947d23f23de4a548f3f08ae60a9b12079dc2a31e941af3bf88ab6f61efffccc587e6627c84005c78f85f946160f9bcec328dd98e4589eecb115b0facf53ca +Homepage: https://xcb.freedesktop.org +Description: X C Binding, dri2 extension + This package contains the library files needed to run software using + libxcb-dri2, the dri2 extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-dri3-0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 41 +Depends: libc6 (>= 2.4), libxcb1 (>= 1.12) +Filename: pool/libxcb-dri3-0_1.17.0-2ubuntu1_amd64.deb +Size: 7540 +MD5sum: e2598840157e7c33d90e5d42daa03015 +SHA1: 4b7a526bea91e574ca79437ecb7aa68c5ab32268 +SHA256: 2e0e3916c647a74e081621f385aa296dab3052b2582b0781d9fbea2f15696ef4 +SHA512: 88e9bf9be52c38332c0ad1c8a9dec92f1f70c068e3982726f9afea1a50cddfa0425202160762ba2ac7d4854ef8069fc1765ee7a1e7c775276f0826258b61786d +Homepage: https://xcb.freedesktop.org +Description: X C Binding, dri3 extension + This package contains the library files needed to run software using + libxcb-dri3, the dri3 extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-glx0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 149 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-glx0_1.17.0-2ubuntu1_amd64.deb +Size: 24654 +MD5sum: 657bb19dd511968c8b264d34b8ab920b +SHA1: 8ea7b2d8ca41131369b760a2ab77bf895805566c +SHA256: 857c34618ae56b2577d8d439cf86f80375582626193efaa3229c6767106a1a20 +SHA512: 0589736a94f34d84625e48699543cc2ebd9740da376efa411c9fe55df2cdde6fad023e020fc3b5e5b4116c65cf17ae4d9427d4c4b9d7fa415543fa9a65e43b54 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, glx extension + This package contains the library files needed to run software using + libxcb-glx, the glx extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-present0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 32 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-present0_1.17.0-2ubuntu1_amd64.deb +Size: 6112 +MD5sum: 3b3273d2e8a392a05dc144009c38e525 +SHA1: 3ee7fc265ec7e0d6070265cfda0e192a02fe6a8d +SHA256: 64f23e7166461758d158220305e93a98fe75c570b68f96303a1c2395a58d5d7d +SHA512: 240e76cc13b0dcdae6d66ab9b1f9ef9ba679ed3752c5c4684f8d2fd1ec4ee8ff6e164e146ef323b593e921bd17bc8e4205fa14b6c050ae84368003893d7bb8ed +Homepage: https://xcb.freedesktop.org +Description: X C Binding, present extension + This package contains the library files needed to run software using + libxcb-present, the present extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-randr0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 97 +Depends: libc6 (>= 2.4), libxcb1 (>= 1.9.2) +Filename: pool/libxcb-randr0_1.17.0-2ubuntu1_amd64.deb +Size: 17930 +MD5sum: 84aba088a9234126f974d5d0c4253b93 +SHA1: 4543d4236a01241df3d072034ff0979b09dd50cb +SHA256: 78977a067ec1d59bb4ded1b35835d0ba70e6538aac1ea7edefe413795aaa0d4f +SHA512: bba6db3a6ca8e5ab832bb7254764542ec67ee3c4696e67a1b12145c7e7d5097651ea509d711091f74eacff12d6b589cb74798b33a8dcbbdae92b691fc534cd62 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, randr extension + This package contains the library files needed to run software using + libxcb-randr, the randr extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-render0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 81 +Depends: libc6 (>= 2.14), libxcb1 (>= 1.8) +Filename: pool/libxcb-render0_1.17.0-2ubuntu1_amd64.deb +Size: 16208 +MD5sum: 54b2b9f5e7e85681546ba41406710cf9 +SHA1: 6b0f1aea9416b2a91656e8044b6d7d755c18b96b +SHA256: 2bdd10dd88c99523a62bfcc2b71b59fdf93ee396e8baf617c76fc3ec38f39bde +SHA512: ad053966e6512b96289268b6707dda36d805691c0052d215579c3d39be32264c9954d89efcd971bbaa153b66b9adc5932226c6faa075ac85a7acbced3db5cf38 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, render extension + This package contains the library files needed to run software using + libxcb-render, the render extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-res0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 37 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-res0_1.17.0-2ubuntu1_amd64.deb +Size: 6780 +MD5sum: 6e54b097af54cf7ca9029e41e202ac4b +SHA1: 8de1a64c0b92195e8f7a8060f90fbbe1b3edc945 +SHA256: 7c1d617a2b260fba96570eb9d0223ee25cb788bf82cb6731b6a709540473f2ad +SHA512: cd8ce94526ef12b35162b4ebc3dca5afa6cb2c3e53d52c9d7cc34bb943d0ab088673a6592a82bcd45d3a3013d104353f036fe01bf2131e9f70c51803fc6c0116 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, res extension + This package contains the library files needed to run software using + libxcb-res, the res extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-shape0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 32 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-shape0_1.17.0-2ubuntu1_amd64.deb +Size: 6172 +MD5sum: 8369a79b41a615b22ae622f87eaf6a6e +SHA1: 8a8edb46e6d6c7a004e6fb74909a957ca34a2dfc +SHA256: 64f09e1434f232c4297b634e857772ab6c11cb3fae116ad6d557d563c8f3b385 +SHA512: 89b4a41d5de8524a03b493cf907b593df7f46b14cac8202a449ba45cbc3ab9b05ebd72e96f856b1930528f34dd77381e416a6df81b61909442cee3e7e038ecb3 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, shape extension + This package contains the library files needed to run software using + libxcb-shape, the shape extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-shm0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.4), libxcb1 (>= 1.12) +Filename: pool/libxcb-shm0_1.17.0-2ubuntu1_amd64.deb +Size: 5808 +MD5sum: fb9d70143153673a246fb47d415fe826 +SHA1: 8b9177de0e43995ebaed718a254d44c04d06958a +SHA256: e70d52936aabd7a90e9cd8af0f54ca050cde244f8382ffc5524ba65117c199c4 +SHA512: 360c6c9b92f074822deaf7a934f361287fdc7fc10776fc626153a840bec03b0e188b49f7d586f83f32afbce8f75d93685a3d6e99a9e3647ecfdb4af2ced74a88 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, shm extension + This package contains the library files needed to run software using + libxcb-shm, the shm extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-sync1 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 54 +Depends: libc6 (>= 2.14), libxcb1 +Filename: pool/libxcb-sync1_1.17.0-2ubuntu1_amd64.deb +Size: 9348 +MD5sum: e64930623b14cf4106973c698aab4894 +SHA1: b4aa2e6a2c362e35ee418878a2a34a474c1a8f29 +SHA256: 8883f5e6badab24cb7487390bf1a888bb714e406f6c799345c33e4b69a8f3112 +SHA512: 2aafce63160f5e5646cf43f87519b079d1d962915b90a42e2d0f457cdba8364b84decd70f31e41b65dffc1a8c8bf4e63b5eff895ef56e8daec365f34b9676733 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, sync extension + This package contains the library files needed to run software using + libxcb-sync, the sync extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb-util1 +Architecture: amd64 +Version: 0.4.1-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: xcb-util +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 47 +Depends: libc6 (>= 2.8), libxcb1 +Filename: pool/libxcb-util1_0.4.1-1build1_amd64.deb +Size: 11070 +MD5sum: 49f7c4139621333d604877c86598bf7b +SHA1: b0623ca06427df00650d91ae90ba8150a88ee022 +SHA256: cf20c1093b223f82dc970cf38c3907ba0f4b70607820ff1c13d64ef51c0d1656 +SHA512: e62d82599e70adca095087422c8cd4a62e3a27a763f4450f2c97e80d8698634169f138e9a3554054663114e9c4f33f5d3f5ad8060002aff0f8f1cd9a01bc65d5 +Homepage: http://xcb.freedesktop.org +Description: utility libraries for X C Binding -- atom, aux and event + This package contains the library files needed to run software using + libxcb-util. + . + The xcb-util module provides a number of libraries which sit on top of + libxcb, the core X protocol library, and some of the extension + libraries. These experimental libraries provide convenience functions + and interfaces which make the raw X protocol more usable. Some of the + libraries also provide client-side code which is not strictly part of + the X protocol but which have traditionally been provided by Xlib. + +Package: libxcb-xfixes0 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 56 +Depends: libc6 (>= 2.4), libxcb1 +Filename: pool/libxcb-xfixes0_1.17.0-2ubuntu1_amd64.deb +Size: 10192 +MD5sum: a83bad9cda97a234337b4e8798d71092 +SHA1: ff23904ea2197e24ea23e800fa6efac56679ec71 +SHA256: 00c1381b61e2e5b8a78e89b15818a214a8f44f1fae6a9ddd95e7c61de8ea33d2 +SHA512: f1b2517543bc9ba26c3c24fdb238dc2f4b6957ff636515c1a1871d0879f3ed4fcda6627673cb1fb28dbd140f318d144b2485fa7f7e0c03d557f7877a05fbadf2 +Homepage: https://xcb.freedesktop.org +Description: X C Binding, xfixes extension + This package contains the library files needed to run software using + libxcb-xfixes, the xfixes extension for the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcb1 +Architecture: amd64 +Version: 1.17.0-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 205 +Depends: libc6 (>= 2.38), libxau6 (>= 1:1.0.11), libxdmcp6 (>= 1:1.1.5) +Filename: pool/libxcb1_1.17.0-2ubuntu1_amd64.deb +Size: 49022 +MD5sum: 4957b0b33f2d94d3a5336a5b5039eb08 +SHA1: a5fe4ef633ba65d28bc4d0aece8f0115b50881e6 +SHA256: 069e64705e4a5721a223b4d22643bbaeaa63a6efbb56ebd3d7c4a31c4a26fa1c +SHA512: 70740ed275e5d23327d0f79abe40f429c827c4e75f813d673f56697f7a42e311b0c9508b701bb6e9784bdf83f1b02fae54aadc82c661a21dd614d5e9b639fa09 +Homepage: https://xcb.freedesktop.org +Description: X C Binding + This package contains the library files needed to run software using libxcb, + the X C Binding. + . + The XCB library provides an interface to the X Window System protocol, + designed to replace the Xlib interface. XCB provides several advantages over + Xlib: + . + * Size: small library and lower memory footprint + * Latency hiding: batch several requests and wait for the replies later + * Direct protocol access: one-to-one mapping between interface and protocol + * Thread support: access XCB from multiple threads, with no explicit locking + * Easy creation of new extensions: automatically generates interface from + machine-parsable protocol descriptions + +Package: libxcomposite1 +Architecture: amd64 +Version: 1:0.4.6-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcomposite +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 30 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.4.99.1) +Filename: pool/libxcomposite1_1%3a0.4.6-1build1_amd64.deb +Size: 6664 +MD5sum: c2f6b4996ed42395af649f73e1d7158c +SHA1: a0161db798a9c2d4f5db52e7242a34793ae9f9b9 +SHA256: b8557d5aba1e575acfb169f47e798c449c8a5ca05846861f1480724d4cfc5ce3 +SHA512: 2a8ca83e6f64734cb0cb119fe5df4eb5698455450debf81658452c1280831a3cae14f7899aa7a1482ef17551156bed53eacd0166551707214f9017aa5427dd3a +Description: X11 Composite extension library + libXcomposite provides an X Window System client interface to the Composite + extension to the X protocol. + . + The Composite extension allows clients called compositing managers to control + the final drawing of the screen. Rendering is done into an off-screen buffer. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXcomposite + +Package: libxcursor1 +Architecture: amd64 +Version: 1:1.2.3-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcursor +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 62 +Depends: libc6 (>= 2.38), libx11-6 (>= 2:1.4.99.1), libxfixes3, libxrender1 (>= 1:0.9.12) +Filename: pool/libxcursor1_1%3a1.2.3-1build1_amd64.deb +Size: 22108 +MD5sum: 3ffd29ab67a3f181cf599502ec160cbe +SHA1: 5d9a8d7984e41fa257492876ba4a077adef2c0b7 +SHA256: 0f3d9816a3a557590ca1b31f2548b1988ad7ec9de976bad07cc24cc7d69b4ee7 +SHA512: 54c44b7598207495d33732bc1e75f95d5efc7dd562f29c4c39461c030a4b1972fed7eb4f02a8acbe3e2f58619ea349015bcde0ae78014c8549e5c18b66958014 +Homepage: https://www.x.org +Description: X cursor management library + Xcursor is a simple library designed to help locate and load cursors for the + X Window System. Cursors can be loaded from files or memory and can exist in + several sizes; the library automatically picks the best size. When using + images loaded from files, Xcursor prefers to use the Render extension's + CreateCursor request for rendering cursors. Where the Render extension is + not supported, Xcursor maps the cursor image to a standard X cursor and uses + the core X protocol CreateCursor request. + . + Preferred themes for cursors can be installed if desired, via + xcursor-themes or other cursor-theme or icon-theme packages, + configured with update-alternatives --config x-cursor-theme. + +Package: libxcvt0 +Architecture: amd64 +Version: 0.1.3-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxcvt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.2.5) +Filename: pool/libxcvt0_0.1.3-1build1_amd64.deb +Size: 5852 +MD5sum: 8afcb848686ce528a2a8b339178eafc4 +SHA1: fadc5f4e458bbb84c5fdf1364824e89f7c74f3aa +SHA256: 3660c17f9a96c3fe1edd81b2795a17d273b3da39444f2d39f715ebd85cabe6ff +SHA512: b2e91e77f883a058e27116675f88b7927ce2a6356fe17dd5a960d6b6efc2afc393ee099e80339a540774c7ec7f536aa0b5f43d1958d737478517f6bf5618206b +Description: VESA CVT standard timing modelines generator -- shared library + libxcvt is a library providing a standalone version of the X server + implementation of the VESA CVT standard timing modelines generator. + . + This package includes the shared library. + +Package: libxdamage1 +Architecture: amd64 +Version: 1:1.1.7-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxdamage +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 29 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.4.99.1) +Filename: pool/libxdamage1_1%3a1.1.7-1_amd64.deb +Size: 6582 +MD5sum: b8d4c45333498d8bf8909dcf92a9afb0 +SHA1: 73315dcb60f537f099de45090050aa6924bccbd1 +SHA256: dd751597c6216105774a93769972d1cb6dad5fd1ba91f090197d7acc85c406cb +SHA512: 0e6e3621a30fd3c772c8733a292361a581865ad24e5d6c8e4d9f05ce7052bb52bea83ea878c9cfa34148b8eef60ca94dae72d6e12961585ba089f5e9b3317310 +Homepage: https://www.x.org +Description: X11 damaged region extension library + libXdamage provides an X Window System client interface to the DAMAGE + extension to the X protocol. + . + The Damage extension provides for notification of when on-screen regions have + been 'damaged' (altered). + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXdamage + +Package: libxdmcp6 +Architecture: amd64 +Version: 1:1.1.5-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxdmcp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 41 +Depends: libc6 (>= 2.36) +Filename: pool/libxdmcp6_1%3a1.1.5-2_amd64.deb +Size: 10800 +MD5sum: 33e0c6c8eb828fae10210d980643e615 +SHA1: 48935ce7bbf83f0f0179ff9467d23f6d9a093f5e +SHA256: d5d51e67063ff11e81698d8ee90bab5af763dc0a793929f33712bb74e7633768 +SHA512: 9f5390cf3639a525fd4945e928710e4bc12950d0987d06d7a5a73448ff78a7e398d582e5963a5eaf2883a19dfba4b17d895546721a38945a1909709a06652c12 +Description: X11 Display Manager Control Protocol library + This package provides the main interface to the X11 display manager control + protocol library, which allows for remote logins to display managers. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libXdmcp + +Package: libxdo3 +Architecture: amd64 +Version: 1:3.20160805.1-5.1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: xdotool +Maintainer: Ubuntu Developers +Original-Maintainer: Daniel Kahn Gillmor +Installed-Size: 82 +Depends: libc6 (>= 2.4), libx11-6, libxinerama1 (>= 2:1.1.4), libxkbcommon0 (>= 0.5.0), libxtst6 (>= 2:1.2.5) +Filename: pool/libxdo3_1%3a3.20160805.1-5.1build1_amd64.deb +Size: 22542 +MD5sum: 0f4bf03e63c03cfa63b8db4e8b602b9d +SHA1: 77a49731c329e66ce2a3ec14f527c03df6923b94 +SHA256: b4edfb3fcb5a3b6bd2b407dbb6f7071c975db611e86774d8a3026a28133e96e5 +SHA512: 531b0f58a4cfe3b81a179aaa2dbfbe4239174fcf907a002dd4f926966f50352ef46b498cc8b0a485b30d11026f2a12119d5336f869c7252d8797a0c3d59f8830 +Homepage: https://github.com/jordansissel/xdotool/ +Description: library for simulating (generating) X11 keyboard/mouse input events + libxdo lets you programmatically (or manually) simulate keyboard + input and mouse activity, move and resize windows, etc. It does this + using X11's XTEST extension and other Xlib functions. + +Package: libxext6 +Architecture: amd64 +Version: 2:1.3.4-1build3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxext +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 103 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0) +Filename: pool/libxext6_2%3a1.3.4-1build3_amd64.deb +Size: 30840 +MD5sum: 7c26b4edb0ddd4a722eb5c851af10cb2 +SHA1: 39b1a70598dbf35e7b02f0c61c64f308ca9cb4d5 +SHA256: b867ba9daa9437ba3f18cba9646d9e3db55e5197bd4feb53184b1414c05210ca +SHA512: bb72755b6e62073776f9a6f7fdc0cba6b75bd83a3bf52989bfe9a2c96b240707841d19cb43ba74567f98e55c7af1879c5d2fe247d7061c2da6137ced9bad6c74 +Description: X11 miscellaneous extension library + libXext provides an X Window System client interface to several extensions to + the X protocol. + . + The supported protocol extensions are: + - DOUBLE-BUFFER (DBE), the Double Buffer extension; + - DPMS, the VESA Display Power Management System extension; + - Extended-Visual-Information (EVI), an extension for gathering extra + information about the X server's visuals; + - LBX, the Low Bandwidth X extension; + - MIT-SHM, the MIT X client/server shared memory extension; + - MIT-SUNDRY-NONSTANDARD, a miscellaneous extension by MIT; + - Multi-Buffering, the multi-buffering and stereo display extension; + - SECURITY, the X security extension; + - SHAPE, the non-rectangular shaped window extension; + - SYNC, the X synchronization extension; + - TOG-CUP, the Open Group's Colormap Utilization extension; + - XC-APPGROUP, the X Consortium's Application Group extension; + - XC-MISC, the X Consortium's resource ID querying extension; + - XTEST, the X test extension (this is one of two client-side + implementations; the other is in the libXtst library, provided by the + libxtst6 package); + . + libXext also provides a small set of utility functions to aid authors of + client APIs for X protocol extensions. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXext + +Package: libxfixes3 +Architecture: amd64 +Version: 1:6.0.0-2build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxfixes +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 44 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0) +Filename: pool/libxfixes3_1%3a6.0.0-2build2_amd64.deb +Size: 11102 +MD5sum: 931d398d065ba957233d8765d6e20823 +SHA1: 7e8c26c65ca543cdc541545cbfb560f658e5151d +SHA256: f3a71f6aa12000480c419e44f3aa5bdca7eb862b720d0307661b4e886db1c5f8 +SHA512: 6aa87b30c4286f63802a83c2f4396267447ec4d63693af72afe44e263133e4b86111ce64fc36393b0c9db24b87c3cc4d4e9f2c17454c9df79596581008742643 +Description: X11 miscellaneous 'fixes' extension library + libXfixes provides an X Window System client interface to the 'XFIXES' + extension to the X protocol. + . + It provides support for Region types, and some cursor functions. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXfixes + +Package: libxfont2 +Architecture: amd64 +Version: 1:2.0.6-2ubuntu0.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxfont +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 213 +Depends: libbz2-1.0, libc6 (>= 2.38), libfontenc1 (>= 1:1.1.8), libfreetype6 (>= 2.2.1), zlib1g (>= 1:1.1.4) +Breaks: xfs (<< 1:1.1.4) +Filename: pool/libxfont2_1%3a2.0.6-2ubuntu0.2_amd64.deb +Size: 96496 +MD5sum: 510f9b275ac903c712fc7555cadb25f6 +SHA1: a7450b48d920a4c7d2d95a71c975a03920bd2310 +SHA256: eeca46a661876466a8f96469054427f0b18a10a758c4c69d2c5f20b290f6f056 +SHA512: f0e922f26ae8edfe85b1c409a6e9912ceb6d15129e9b89575d1265840cb9d7a246612842cb8b4a6f7e9d413793e7c1dfe6e0f3c8c2344c77172279a2e997a473 +Description: X11 font rasterisation library + libXfont provides various services for X servers, most notably font + selection and rasterisation (through external libraries). + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXfont + +Package: libxft2 +Architecture: amd64 +Version: 2.3.6-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: xft +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 118 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.3.5), libx11-6, libxrender1 (>= 1:0.9.12) +Filename: pool/libxft2_2.3.6-1build2_amd64.deb +Size: 45110 +MD5sum: 8d8916d45cea4dca69ba7604677b02a9 +SHA1: 9e0238f772bceef32049e9090f6d98845569ae84 +SHA256: a6ad7fd2294e8e04d553919b5beed0269ebc6f73d41261ed1059c7fde83227f0 +SHA512: 65623a3186be36745058e3466496590a6855f7ef2a6bc4157a8769b68655e4a8c8f6f40e621802bdb5bacde9f713c11733ece15abb98a31a788c8329424c942f +Description: FreeType-based font drawing library for X + Xft provides a client-side font API for X applications, making the FreeType + font rasterizer available to X clients. Fontconfig is used for font + specification resolution. Where available, the RENDER extension handles + glyph drawing; otherwise, the core X protocol is used. + +Package: libxi6 +Architecture: amd64 +Version: 2:1.8.2-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 99 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxi6_2%3a1.8.2-2_amd64.deb +Size: 33120 +MD5sum: 3014c452279057ff8e45647deff39d3e +SHA1: a3b3106f65a1655a888263c25b62f553cb038145 +SHA256: b975dd89cac8c32a3cf622e1b7f5434db59f37eda87dfee399d0806d9953db0a +SHA512: ec8caacbbe4e609e858a73c3613e8daea34afc5b8d60d8c54a865bf929f67482f447280c6789a25b057265cd6a9d0f2c4abf3b74c45c892e2623ec4f89c9d302 +Homepage: https://www.x.org/ +Description: X11 Input extension library + libXi provides an X Window System client interface to the XINPUT + extension to the X protocol. + . + The Input extension allows setup and configuration of multiple input devices, + and hotplugging of input devices (to be added and removed on the fly). + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXi + +Package: libxinerama1 +Architecture: amd64 +Version: 2:1.1.4-3build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxinerama +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxinerama1_2%3a1.1.4-3build2_amd64.deb +Size: 6472 +MD5sum: 092f58cfcbcea8e5ae29c41ef9a989de +SHA1: 24234fbc682d81959f56c8b32e0e3c248078fd5d +SHA256: 02d3dce422acc3ac9b5491f47acdd07bc7c3f78ce193865f2920d38b10fbadf5 +SHA512: c560ebf89f04fd3c58b2c4dbe899ddbadeda678b6b164ac54c47276543000c9422f329c0ff246f8c1b309c21ec3f57e6f490230a6a42b87a813fe6a4108c6357 +Description: X11 Xinerama extension library + libXinerama provides an X Window System client interface to the XINERAMA + extension to the X protocol. + . + The Xinerama (also known as panoramiX) extension allows for multiple screens + attached to a single display to be treated as belonging together, and to give + desktop applications a better idea of the monitor layout. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXinerama + +Package: libxkbcommon0 +Architecture: amd64 +Version: 1.13.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxkbcommon +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 397 +Depends: xkb-data, libc6 (>= 2.38) +Filename: pool/libxkbcommon0_1.13.1-1_amd64.deb +Size: 159038 +MD5sum: c003b298f3924b43564173cd7368197a +SHA1: 83f6b575c0ef042f3e5bcfb86f488af1626978d8 +SHA256: 7988d2375d10277ab4a54641aa6181accfaf3f5d25e48b050bf42a9583d4f926 +SHA512: 02a46b494ff65cdd91c0bb9c5277bd4ebc29fe61443f94bd9599b008f44fbf78300c3b5f1cf98d655496e09e6236afb139f1868c123962aa14d4db4a8edb2a47 +Homepage: https://www.xkbcommon.org/ +Description: library interface to the XKB compiler - shared library + This package provides a library to handle keyboard descriptions, including + loading them from disk, parsing them and handling their state. It's mainly + meant for client toolkits, window systems, and other system applications; + currently that includes Wayland, kmscon, GTK+, Clutter, and more. + . + More information about X.Org can be found at: + + . + This module can be found at + https://github.com/xkbcommon/libxkbcommon.git + +Package: libxkbfile1 +Architecture: amd64 +Version: 1:1.1.0-1build5 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxkbfile +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 172 +Depends: libc6 (>= 2.38), libx11-6 +Filename: pool/libxkbfile1_1%3a1.1.0-1build5_amd64.deb +Size: 70116 +MD5sum: a0f2fb56f4d74d1a186f16758c709299 +SHA1: b0a017ca08839fa13de546af761dccf80b1eb98e +SHA256: 40bf42bc549b5d1f848e2ce8c1bafc9777e0fd4b943bbff922dd340f7ab3f5d7 +SHA512: 5bdd9f0e2410aad84f21def8d2a259106e83e77fe84914a3b7afa5c2ea99678e46b2dbdb57bc143e5c17ee64aa8e2a16ce2e654afca21cd6897bb26d151a5afd +Description: X11 keyboard file manipulation library + libxkbfile provides an interface to read and manipulate description files for + XKB, the X11 keyboard configuration extension. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libxkbfile + +Package: libxkbregistry0 +Architecture: amd64 +Version: 1.13.1-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxkbcommon +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 55 +Depends: libxkbcommon0 (= 1.13.1-1), libc6 (>= 2.38), libxml2-16 (>= 2.14.1) +Filename: pool/libxkbregistry0_1.13.1-1_amd64.deb +Size: 16622 +MD5sum: fb7fb9bf6e88a420f782294b383de583 +SHA1: 735d6fae3f78330139b26e704f0919a95344c2e5 +SHA256: 21dc9f060ecfa872f9761016dd5e759f5a26cad8cd0689dad4bb3a0575107642 +SHA512: 50ba0e8840a8de26d8be5db40475235a6d21618d91a669b0987540251fd93c25c3ead6d78599e3c7f567a4e09970514eb6d06b8eb2d207c5719e26d493b088ab +Homepage: https://www.xkbcommon.org/ +Description: library to query available RMLVO + This package provides an add-on library called xkbregistry, which is used + to query available RMLVO instead of parsing evdev.xml directly. + . + More information about X.Org can be found at: + + . + This module can be found at + https://github.com/xkbcommon/libxkbcommon.git + +Package: libxml-parser-perl +Architecture: amd64 +Version: 2.47-1ubuntu1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 673 +Depends: perl (>= 5.40.1-7build1), perlapi-5.40.1, libc6 (>= 2.14), libexpat1 (>= 2.0.1), liburi-perl, libwww-perl +Filename: pool/libxml-parser-perl_2.47-1ubuntu1_amd64.deb +Size: 201324 +MD5sum: 110c8e38d2ad68fb6a3dfa0060b2de60 +SHA1: 7bbffb2f556f812fc065cb265b661c1a9441891d +SHA256: d3f6ebe9aa48553d1b797fe1c32ef484d211406e0d83c55131ed7ed21597171d +SHA512: bb6f302e303f43be145f62d53adff99ca64ca18986eea1885863995da0e207e3c7e6523fd46678e6b1e5f830b1a54a92b983d730c2dfc2b6a0281daac24befc9 +Homepage: https://metacpan.org/release/XML-Parser +Description: Perl module for parsing XML files + The XML::Parser module provides ways to parse XML documents. It is built on + top of XML::Parser::Expat, which is a lower level interface to James Clark's + expat library. Each call to one of the parsing methods creates a new instance + of XML::Parser::Expat which is then used to parse the document. Expat options + may be provided when the XML::Parser object is created. These options are + then passed on to the Expat object on each parse call. They can also be given + as extra arguments to the parse methods, in which case they override options + given at XML::Parser creation time. + . + The behavior of the parser is controlled either by Style and/or Handlers + options, or by setHandlers method. These all provide mechanisms for + XML::Parser to set the handlers needed by XML::Parser::Expat. If neither + Style nor Handlers are specified, then parsing just checks the document for + being well-formed. + . + When underlying handlers get called, they receive as their first parameter + the Expat object, not the Parser object. + +Package: libxml-twig-perl +Architecture: all +Version: 1:3.54-1build1 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 548 +Depends: perl:any, libxml-parser-perl +Recommends: libhtml-parser-perl, libtext-iconv-perl, libtie-ixhash-perl, libwww-perl, libxml-xpathengine-perl | libxml-xpath-perl +Suggests: libunicode-map8-perl, libunicode-string-perl, xml-twig-tools +Filename: pool/libxml-twig-perl_1%3a3.54-1build1_all.deb +Size: 157162 +MD5sum: 009717985e6b7d130dc02b23ec63d183 +SHA1: 62be54cfd66638585b0d80f42f8709612bffa23e +SHA256: 0686775e315eadeaf03f9f846c18d51c01a088e8de07c0d018474d00932c1f17 +SHA512: f4daa5887623e0df6da1b3f281622f8656084c8870559b0cc23e8fadfdd68422176294d5d352abeaba6abdcdf1d7ecf8676923238eccd6753e3b0ac013a2b4d6 +Homepage: https://metacpan.org/release/XML-Twig +Description: Perl module for processing huge XML documents in tree mode + The XML::Twig module provides a way to process XML documents. It is built on + top of XML::Parser. + . + The module offers a tree interface to the document, while allowing to + output the parts of it that have been completely processed. + . + It allows minimal resource (CPU and memory) usage by building the + tree only for the parts of the documents that need actual processing, + through the use of the twig_roots and twig_print_outside_roots + options. The finish and finish_print methods also help to increase + performance. + . + XML::Twig tries to make simple things easy so it tries its best to + takes care of a lot of the (usually) annoying (but sometimes + necessary) features that come with XML and XML::Parser. + +Package: libxml-xpathengine-perl +Architecture: all +Version: 0.14-2 +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 127 +Depends: perl:any +Filename: pool/libxml-xpathengine-perl_0.14-2_all.deb +Size: 32570 +MD5sum: ffb1f08ab67dbfbe17ab88610d0faf98 +SHA1: 932a2fb699c9778ebcd413f416ac0c0528bf29bf +SHA256: 938c131969b95b7eb369f42956e8be4462bc179883e09d2806f3560e81f6de81 +SHA512: 3a3baca3a0e98be405ba004854cc75fe3316b35be37a163d41dfa2a80dec559da27b554c71e1a1259ee910cd41dafa62a4d941491f129a702faca868c3cdd26f +Homepage: https://metacpan.org/release/XML-XPathEngine +Description: re-usable XPath engine for DOM-like trees + XML::XPathEngine provides an XPath engine, that can be re-used by other + module/classes that implement trees. + . + In order to use the XPath engine, nodes in the user module need to mimic + DOM nodes. The degree of similarity between the user tree and a DOM dictates + how much of the XPath features can be used. A module implementing all of the + DOM should be able to use this module very easily (you might need to add + the cmp method on nodes in order to get ordered result sets). + . + This module is derived from Matt Sergeant's XML::XPath. + +Package: libxml2-16 +Architecture: amd64 +Version: 2.15.2+dfsg-0.1ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxml2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian XML/SGML Group +Installed-Size: 1565 +Depends: libc6 (>= 2.38), zlib1g (>= 1:1.2.2.3) +Conflicts: w3c-dtd-xhtml +Breaks: libxml-libxml-perl (<< 2.0207+dfsg+really+2.0134-3~) +Filename: pool/libxml2-16_2.15.2+dfsg-0.1ubuntu0.1_amd64.deb +Size: 606124 +MD5sum: b7f3beec5033e6c1bff8f88e9008ee5e +SHA1: 22d6a5f2a61b3b8b0cd0d6c5f19c1d09a8ca8e92 +SHA256: 14211c45bb75f9543e6053207533370047873ade7e4c70f7285400f1df6c898f +SHA512: f08cb28d5cba11131a3ec7c4f29053ed3f956757763c8e446dd2d8e200d5ef3081b26b5a95928cd1e5c28e461134048c4f663e91d27ace6bacc36a23800ff17f +Homepage: http://xmlsoft.org +Description: GNOME XML library + XML is a metalanguage to let you design your own markup language. + A regular markup language defines a way to describe information in + a certain class of documents (eg HTML). XML lets you define your + own customized markup languages for many classes of document. It + can do this because it's written in SGML, the international standard + metalanguage for markup languages. + . + This package provides a library providing an extensive API to handle + such XML data files. + +Package: libxmlb2 +Architecture: amd64 +Version: 0.3.24-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxmlb +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI team +Installed-Size: 192 +Depends: libc6 (>= 2.14), libglib2.0-0t64 (>= 2.54.0), liblzma5 (>= 5.1.1alpha+20120614), libzstd1 (>= 1.5.5) +Filename: pool/libxmlb2_0.3.24-2_amd64.deb +Size: 68230 +MD5sum: 420d82aa2adcbf373f434b0c84ec298f +SHA1: 4d44490ae6db5eb0d515a226dececfc8185f0859 +SHA256: 12aa2999751f0e0944b8369f6c1c17ee50182644545c9a2c5f22dc5188c91c11 +SHA512: 43974ae0a7f2eba95238da0237db512496604ea2752879450c408f581cbe658e444b2d0ac68e6cf1eba36ff901f0756d620d76c9c89b0c0af11c64e98587e4a4 +Homepage: https://github.com/hughsie/libxmlb +Description: Binary XML library + The libxmlb library takes XML source, and + converts it to a structured binary representation with a deduplicated string + table -- where the strings have the NULs included. + . + This allows an application to mmap the binary XML file, do an XPath query and + return some strings without actually parsing the entire document. This is all + done using (almost) zero allocations and no actual copying of the binary data. + +Package: libxmu6 +Architecture: amd64 +Version: 2:1.1.3-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxmu +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 125 +Depends: libc6 (>= 2.38), libx11-6, libxext6, libxt6t64 +Filename: pool/libxmu6_2%3a1.1.3-4_amd64.deb +Size: 48862 +MD5sum: afe13720db9bbe386ed236c48747d6f5 +SHA1: 6116156875deba0af78386e0d5a41619347b9fc3 +SHA256: 15e9c3a2bd4132a2873b339b4af578dd19462f1eee705b025f656ea548aba19f +SHA512: 3203a718c7b0cef4a4bc6785f7cda019416cd063b1b087f398b88cb943a5f7c9274106a5c19df3d7f2f8b57e55add221e9fa072f7ff323e950baba97d0272e06 +Description: X11 miscellaneous utility library + libXmu provides a set of miscellaneous utility convenience functions for X + libraries to use. libXmuu is a lighter-weight version that does not depend + on libXt or libXext; for more information, see libxmuu1. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXmu + +Package: libxmuu1 +Architecture: amd64 +Version: 2:1.1.3-4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxmu +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 39 +Depends: libc6 (>= 2.4), libx11-6 +Filename: pool/libxmuu1_2%3a1.1.3-4_amd64.deb +Size: 9450 +MD5sum: dc1f914ed6f23b8ae1f56b3edc6205b1 +SHA1: e3e669d65aa6cb6feb20818cdf861363db55f771 +SHA256: 30dfe0950ff901ed359eb96d6f81f082bb4b5c15aae6c03b92ddf309300871fb +SHA512: eb9f831002752f96f2e14e4eb408995136a2b9c696d39e9175ff6054d2af45565c27d92fe91780b05ab47c1c86c7e71a76086bb1d60818d06041f51b78d10885 +Description: X11 miscellaneous micro-utility library + libXmuu provides a set of miscellaneous utility convenience functions for X + libraries to use. It is a lighter version of libXmu that does not depend + on libXt or libXext; for more information on libXmu, see libxmu6. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXmu + +Package: libxpm4 +Architecture: amd64 +Version: 1:3.5.17-1ubuntu0.26.04.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxpm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 95 +Depends: libc6 (>= 2.38), libx11-6 +Filename: pool/libxpm4_1%3a3.5.17-1ubuntu0.26.04.1_amd64.deb +Size: 37216 +MD5sum: d2c550239a09c486923774d30ca16225 +SHA1: d516486c97184a4bbdd7c5a7d7c6809d4a5792ab +SHA256: ef412a3ef4323e49c837fb442e53e575f8cffba077b38db16e89e28db238b42b +SHA512: 5a53d32d6c444825ed62ebd06684638f7ecb1f0fe4c27618ff99d4487b0c94b0217da12facf97040bb0d6e7a40fc3ec702de9e95c5977afd1dd9e37de072a40c +Homepage: https://www.x.org +Description: X11 pixmap library + The X PixMap image format is an extension of the monochrome X BitMap + format specified in the X protocol, and is commonly used in traditional + X applications. + . + This package provides runtime support for XPM format. + +Package: libxrandr2 +Architecture: amd64 +Version: 2:1.5.4-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxrandr +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 66 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0), libxext6, libxrender1 (>= 1:0.9.12) +Filename: pool/libxrandr2_2%3a1.5.4-1build1_amd64.deb +Size: 19622 +MD5sum: c4bdb9d77cde3659980f45b967eebcbd +SHA1: c847895f2f6fa833ddac3335be6c68f144b0b8ef +SHA256: d0052315ac1417234777c0872568a86fce4d3a3316c041e5a2200da70f43a855 +SHA512: 1eb20cb621ab4b3b75d345c56529705c1792a428e5ba963a7d2b0c778a044ea876accea35a1f402028abdd92da3a565a96291d492652b71d0b93b8345cc0a423 +Description: X11 RandR extension library + libXrandr provides an X Window System client interface to the RandR + extension to the X protocol. + . + The RandR extension allows for run-time configuration of display attributes + such as resolution, rotation, and reflection. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libXrandr + +Package: libxrender1 +Architecture: amd64 +Version: 1:0.9.12-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxrender +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 58 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0) +Filename: pool/libxrender1_1%3a0.9.12-1build1_amd64.deb +Size: 19204 +MD5sum: fafef09a4b70a8bc109599abb391b206 +SHA1: ec8b3d2943db759a8ee6f6c53aa98f3f0af97790 +SHA256: 60b2f01e8124318e2a11049b82c764fd4c05c21adba11312e93ab116d6594f1e +SHA512: c7f6a17a4dd2fb078b17381b4028cb85e04f3c4a977204e6350c499dc4e51043b56fdfbbb73feccae2ff944ab3e758542559c37f70548359b59a9a7b98b77c07 +Description: X Rendering Extension client library + The X Rendering Extension (Render) introduces digital image composition as + the foundation of a new rendering model within the X Window System. + Rendering geometric figures is accomplished by client-side tessellation into + either triangles or trapezoids. Text is drawn by loading glyphs into the + server and rendering sets of them. The Xrender library exposes this + extension to X clients. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXrender + +Package: libxres1 +Architecture: amd64 +Version: 2:1.2.1-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxres +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 33 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxres1_2%3a1.2.1-1build2_amd64.deb +Size: 7036 +MD5sum: 98ea31021af382d9a3ed3be613311001 +SHA1: 6ee95fe5eee5f4fb30d4111d9adbeeb5bf605bf5 +SHA256: c7794a754880ef7bde4a73c0257dd48d8e3f387ee1618ba97f8e5cf5cdd7c80f +SHA512: 193fb6ff2c3f764d70de5386d69cdfd6aa74c728455d886f04af92c762beaebb91b9e42ae7d032e52fd04b6a19e6e3096d4c6808c646f9de6007014abd7185fa +Homepage: https://www.x.org +Description: X11 Resource extension library + libXRes provides an X Window System client interface to the Resource + extension to the X protocol. + . + The Resource extension allows for X clients to see and monitor the X resource + usage of various clients (pixmaps, et al). + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXRes + +Package: libxshmfence1 +Architecture: amd64 +Version: 1.3.3-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxshmfence +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 30 +Depends: libc6 (>= 2.38) +Filename: pool/libxshmfence1_1.3.3-1build1_amd64.deb +Size: 5284 +MD5sum: 367a8c596b3dfc9f855d4e0eae15f788 +SHA1: 39e63caacbb2e80399b3ad75854ce186e3487e58 +SHA256: 85d6b6883a35e1a3b78af3dda6bb6b843c06cbead030a00d9de7d31a8077d562 +SHA512: cc5a12c15e9493f70fa61f70e00e10db46fa479ec0b59bea306b95eb8fe1ce397c2e856d4479c810f1078f8a2785d8e21bd46c829e088c4f17e7700f527ddf50 +Homepage: https://gitlab.freedesktop.org/xorg/lib/libxshmfence +Description: X shared memory fences - shared library + This library provides an interface to shared-memory fences for + synchronization between the X server and direct-rendering clients. + . + This package contains the xshmfence shared library. + +Package: libxslt1.1 +Architecture: amd64 +Version: 1.1.45-0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxslt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian XML/SGML Group +Installed-Size: 406 +Depends: libc6 (>= 2.38), libgcrypt20 (>= 1.12.0), libxml2-16 (>= 2.14.1) +Filename: pool/libxslt1.1_1.1.45-0.1_amd64.deb +Size: 165368 +MD5sum: 2512bc25ccf9517e85e5243137d0c2d7 +SHA1: 62ec6caf98aa76681c43898a99f4b2539df620f1 +SHA256: d2ad5edf215939cc0fe74ca6cb9910060915233032a7c7074d4f206702c802a1 +SHA512: f276e364457033fd181262e6eb3386e58a6e85a10d6b5be994e8c6e38916e5809914d156e804839851bd08792479330970c5eaea5570a75c045202ebc7a8a9c5 +Homepage: https://gitlab.gnome.org/GNOME/libxslt/-/wikis/home +Description: XSLT 1.0 processing library - runtime library + XSLT is an XML language for defining transformations of XML files from + XML to some other arbitrary format, such as XML, HTML, plain text, etc. + using standard XSLT stylesheets. libxslt is a C library which + implements XSLT version 1.0. + . + This package contains the libxslt library used by applications for XSLT + transformations. + +Package: libxss1 +Architecture: amd64 +Version: 1:1.2.3-1build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxss +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 31 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.4.99.1), libxext6, x11-common +Filename: pool/libxss1_1%3a1.2.3-1build4_amd64.deb +Size: 7084 +MD5sum: 67212e05bf98cf57efbbf0bd0a2793cc +SHA1: ab30192bd3fa63ab6be77bc168d5738033b10a3d +SHA256: 04339441bb49c8b9c6d3297bb569b3b774de61e422f5e7334c34225b08709035 +SHA512: 28d6238e9ea3bf72e49d76b0545d1f0316088e4b548adf878cfa52e132aaddda6d6fb364010368be90f6f304f5f581ed560b79586cdcfdaca53d191af5667901 +Description: X11 Screen Saver extension library + libXss provides an X Window System client interface to the MIT-SCREEN-SAVER + extension to the X protocol. + . + The Screen Saver extension allows clients behaving as screen savers to + register themselves with the X server, to better integrate themselves with + the running session. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libXScrnSaver + +Package: libxt6t64 +Architecture: amd64 +Version: 1:1.2.1-1.3build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 459 +Provides: libxt6 (= 1:1.2.1-1.3build1) +Depends: libc6 (>= 2.38), libice6 (>= 1:1.0.0), libsm6 (>= 2:1.2.6), libx11-6 +Breaks: libxt6 (<< 1:1.2.1-1.3build1) +Replaces: libxt6 +Filename: pool/libxt6t64_1%3a1.2.1-1.3build1_amd64.deb +Size: 172702 +MD5sum: 46733f097f62f404d2a4506c16711a2a +SHA1: f999c7894b38125a6b01413e220666ea9779d63a +SHA256: b4255d5aea7986fa06ae3a3599f9e5c38a58ded1c3b79cfaf3c2959ad160eeff +SHA512: 8a2895f863b4bd1d5d28db57544ddf073f71b9d3003ca44204c02704f52d474a1856c7df41416ee19de0719e8ade13e837bae353d59135a5490f0bfad50dab78 +Description: X11 toolkit intrinsics library + libXt provides the X Toolkit Intrinsics, an abstract widget library upon + which other toolkits are based. Xt is the basis for many toolkits, including + the Athena widgets (Xaw), and LessTif (a Motif implementation). + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXt + +Package: libxtables12 +Architecture: amd64 +Version: 1.8.11-2ubuntu3 +Multi-Arch: same +Priority: optional +Section: libs +Source: iptables +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 104 +Depends: libc6 (>= 2.38) +Filename: pool/libxtables12_1.8.11-2ubuntu3_amd64.deb +Size: 36650 +MD5sum: 7ca1a15308c1e341d460d0345e33160a +SHA1: 975500113bcc59cda325758f7bdd1a10c3ae26cd +SHA256: e21126e0544e3b795633fb5b06bb7f2b9a493ebc5ab07b007db0f7f68c0a0aed +SHA512: 659d7f622da66b3ed9be237ea047d8316c84084c0b56342269e34dd5ad5efb214693787c7976b20eeb38dd58e16b91ff4d32bbb66fb8ba3c12361559b5137b3f +Homepage: https://www.netfilter.org/ +Description: netfilter xtables library + The iptables/xtables framework has been replaced by nftables. You should + consider migrating now. + . + However, even if a given system may be fully running on native nftables, + there are other reasons why libxtables might be installed. For one, nftables + itself uses it to be able to display old rulesets that were created using + xtables extensions (to help folks migrate). Other third-party software might + also be linked to this library. + . + This library being installed in the system should be harmless in any case. + . + This package contains the user-space interface to the Netfilter xtables + kernel framework. + +Package: libxtst6 +Architecture: amd64 +Version: 2:1.2.5-1build1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxtst +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 46 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.6.0), libxext6, x11-common +Filename: pool/libxtst6_2%3a1.2.5-1build1_amd64.deb +Size: 13130 +MD5sum: 39f972acd780bf6b6d7e703813652df6 +SHA1: ea6f09495bb349056bf4d44b8b866c19bb1ffaa1 +SHA256: c150c1bacec599cf70609ce1236fd06accacd96e280205090bdd57fd73ee0e4b +SHA512: ff52ae02e9a8461754658c0d25e469fd161f895d502436c43a21d96a51e5b56f81a3f9a23923945d29ba0ebe0018bc56d434530b67092cddfe41d00a0b3b9ba7 +Description: X11 Testing -- Record extension library + libXtst provides an X Window System client interface to the Record + extension to the X protocol. + . + The Record extension allows X clients to synthesise input events, which + is useful for automated testing. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXtst + +Package: libxv1 +Architecture: amd64 +Version: 2:1.0.13-1 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxv +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 42 +Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxv1_2%3a1.0.13-1_amd64.deb +Size: 10826 +MD5sum: d44a120bbc35f33a8ef2beaa5ede67e2 +SHA1: 43dd2fbf71aee83741c1b65d5f2db7d8faf3f011 +SHA256: 235a7eb12cb1dc5ac4151d8ed7527bbcce41f1ab367fd6282ded29560e6eb5c1 +SHA512: f2537dd162030e4a7736cd6e7f0a4668c821271ef1e510fdbb8153cdf9f809386d138e8adca845e9b9cace390d5a5cece414836f677a0ad3a2d926b2f04285a3 +Homepage: https://xorg.freedesktop.org/ +Description: X11 Video extension library + libXv provides an X Window System client interface to the XVideo + extension to the X protocol. + . + The XVideo extension allows for accelerated drawing of videos. Hardware + adaptors are exposed to clients, which may draw in a number of colourspaces, + including YUV. + +Package: libxvmc1 +Architecture: amd64 +Version: 2:1.0.12-2build4 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxvmc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 61 +Depends: libc6 (>= 2.34), libx11-6 (>= 2:1.6.0), libxext6, x11-common +Filename: pool/libxvmc1_2%3a1.0.12-2build4_amd64.deb +Size: 13352 +MD5sum: e4800f0515c898712d67e0fb45aa3100 +SHA1: a06c86aaf64dc84020f0508a1a51be4182e9732c +SHA256: f55191a36c43f1e3d5881ddfaea1001e117c6366583865a48edb5755f67338d3 +SHA512: 244b9d0e631a106ff7e6817ed40d0a9b641b1ff39bbf0c4d0f7b73974bca3896f59612be56a59354fa6648e367c540ee9f23dcbafb7afa198e259aba5132e06b +Description: X11 Video extension library + libXvMC provides an X Window System client interface to the + XVideo-MotionCompensation extension to the X protocol. + . + The XVideo-MotionCompensation extension allows for further accelerated drawing + of videos. Video data may be sent at earlier stages of the decoding pipeline + than raw YUV data. At the moment, driver support for XvMC is poor to + non-existent. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXvMC + +Package: libxxf86dga1 +Architecture: amd64 +Version: 2:1.1.5-1build2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxxf86dga +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 45 +Depends: libc6 (>= 2.34), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxxf86dga1_2%3a1.1.5-1build2_amd64.deb +Size: 11864 +MD5sum: 2ac3c8f3079bfd2be4bba19341fd23a2 +SHA1: 679e65af7539f5ef2c8ab26ac311ccead11c2c24 +SHA256: 479687bd0cae59b5e062a6c642cdee30f2d0ad6eb7c713e0f10dd785beb404a0 +SHA512: 1d6eae0acd051901736905ab21d02c616fd5d80c7d135ccea6bad525ec1b12c0b47fc1636d462858166c4652a59c99450c0acfea16c7333784cae97da3d4c239 +Description: X11 Direct Graphics Access extension library + libXxf86dga provides the XFree86-DGA extension, which allows direct + graphics access to a framebuffer-like region, and also allows relative + mouse reporting, et al. It is mainly used by games and emulators for + games. + . + More information about X.Org can be found at: + + . + This module can be found at + https://gitlab.freedesktop.org/xorg/lib/libXxf86dga + +Package: libxxf86vm1 +Architecture: amd64 +Version: 1:1.1.4-2 +Multi-Arch: same +Priority: optional +Section: libs +Source: libxxf86vm +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 38 +Depends: libc6 (>= 2.4), libx11-6 (>= 2:1.6.0), libxext6 +Filename: pool/libxxf86vm1_1%3a1.1.4-2_amd64.deb +Size: 10610 +MD5sum: 5a7586e33ad8c9f449f8f5393b885092 +SHA1: 1a62a99ae73ff0f6c22e34e3e7e44885525a26df +SHA256: ff01ae50526c23c6c747e1efd98ee3785a1d28458e865277fc367c565bb94703 +SHA512: 7395f4af87a6ae76a090c7deec205ec1cd12f258b4d4cc051a9d4947d81b736d14330fb34778abe4fd6e1a3c32d5d72cdb70bd4b3326c4fec47f84b550a47820 +Homepage: https://xorg.freedesktop.org/ +Description: X11 XFree86 video mode extension library + libXxf86vm provides an interface to the XFree86-VidModeExtension + extension, which allows client applications to get and set video mode + timings in extensive detail. It is used by the xvidtune program in + particular. + . + More information about X.Org can be found at: + + . + This module can be found at + git://anongit.freedesktop.org/git/xorg/lib/libXxf86vm + +Package: libyaml-0-2 +Architecture: amd64 +Version: 0.2.5-2build3 +Multi-Arch: same +Priority: optional +Section: libs +Source: libyaml +Maintainer: Ubuntu Developers +Original-Maintainer: Florian Ernst +Installed-Size: 148 +Depends: libc6 (>= 2.14) +Filename: pool/libyaml-0-2_0.2.5-2build3_amd64.deb +Size: 52650 +MD5sum: be031c0e7fd74f397b8283824b86d7fc +SHA1: a18e816be90bf6942150c57d879f7871fa356801 +SHA256: bdeecb9b4309731eef49eea87cf126e343d12d3823e32f0286e3e5f18f437994 +SHA512: 30ebe0b9c204b1351c2044323ff34114b3fd76e399d62b5b8f2807b6d25984d7a9e0e10b596323f957e670358cb8f385186249382cd8b9c757ff5eb3b7d6f22d +Homepage: https://github.com/yaml/libyaml +Description: Fast YAML 1.1 parser and emitter library + LibYAML is a C library for parsing and emitting data in YAML 1.1, a + human-readable data serialization format. + +Package: libyelp-1-0 +Architecture: amd64 +Version: 49.0-5ubuntu0.1 +Multi-Arch: same +Priority: optional +Section: libs +Source: yelp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 315 +Depends: libadwaita-1-0 (>= 1.6.0), libbz2-1.0, libc6 (>= 2.14), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.16.0), libjavascriptcoregtk-6.0-1, liblzma5 (>= 5.1.1alpha+20120614), libsqlite3-0 (>= 3.5.9), libwebkitgtk-6.0-4 (>= 2.39.91), libxml2-16 (>= 2.14.1), libxslt1.1 (>= 1.1.25) +Filename: pool/libyelp-1-0_49.0-5ubuntu0.1_amd64.deb +Size: 98088 +MD5sum: b05d6013bfb5842398d7c57f9ed2eeb9 +SHA1: 30019685388cc6ad2c6c0eef0b012e4c448a601f +SHA256: 5530c69219bddc1935c21ac253e1289d249e1f595c8e44bd0e2c9cec48c3f0da +SHA512: f23bf7b571ebdcaaa9e65c68d1c0bd07d7254f3869031d1b425ba04c83efeb43e7f66c6778a83d69fe2d6cb28e6e509e73ca14a6d2103c93c71e05baae4eb942 +Homepage: https://apps.gnome.org/Yelp/ +Description: Library for the GNOME help browser + Yelp is the help browser for the GNOME desktop. Yelp provides a simple + graphical interface for viewing DocBook, Mallard, HTML, man, and info + formatted documentation. + . + This library contains widgets and utilities for use by Yelp. + +Package: linux-base +Architecture: all +Version: 4.15ubuntu5 +Multi-Arch: foreign +Priority: optional +Section: kernel +Maintainer: Ubuntu Kernel Team +Original-Maintainer: Debian Kernel Team +Installed-Size: 154 +Depends: debconf (>= 0.5) | debconf-2.0 +Breaks: apport (<< 2.30.0-0ubuntu5~), kernel-common (<= 13.018+nmu1), linux-perf (<< 5.16.2-1~exp1) +Replaces: apport (<< 2.30.0-0ubuntu5~), kernel-common (<= 13.018+nmu1) +Filename: pool/linux-base_4.15ubuntu5_all.deb +Size: 30536 +MD5sum: f5eac723ec42d611f86f1aca86dbaaa9 +SHA1: e524dfb9635d44a94685f5d406142f746f5880ba +SHA256: df05419ee01f989ea1495d1ee6ef11fa22f1ea742182def9159740037251fa86 +SHA512: 8e28de8a9883323336b487f60f9256fbb3b8263c72c28f849eccf4ee21ce11a253c3ae3a03fb4bf61e961088f541d30350c07efc7576a5b38580f031ce35a374 +Description: Linux image base package + This package contains files and support scripts for all Linux + images. + +Package: linux-sound-base +Architecture: all +Version: 1.0.25+dfsg-0ubuntu9 +Priority: optional +Section: sound +Source: alsa-driver +Maintainer: Ubuntu Core Developers +Original-Maintainer: Debian ALSA Maintainers +Installed-Size: 47 +Depends: debconf (>= 0.5) | debconf-2.0, kmod (>= 17-1) +Suggests: alsa-base (>= 1.0.18-1) +Filename: pool/linux-sound-base_1.0.25+dfsg-0ubuntu9_all.deb +Size: 12712 +MD5sum: 5e413d76d38700e8358dd2dbffb64061 +SHA1: 4ecba76e4645af55219a3bf5f9786d8582f757ac +SHA256: bc90f0ae88150ae8e3185626a836caf3f81dfe4f9a77d290f7260d64e164a32b +SHA512: e245af55b5a6af0bb19a63d969f2c631d2321b82930b17c2a19599324b3c82b80dcef0cb677a323f0cefeb9d2e2cd9c29e010296c2ac8e4a22bce304a3b339d8 +Homepage: http://www.alsa-project.org/ +Description: base package for ALSA and OSS sound systems + This package allows the administrator to choose between + the OSS and ALSA sound systems. + . + ALSA is the Advanced Linux Sound Architecture. + OSS is the free version of the Open Sound System. + +Package: linux-sysctl-defaults +Architecture: all +Version: 4.15ubuntu5 +Multi-Arch: foreign +Priority: important +Section: kernel +Source: linux-base +Maintainer: Ubuntu Kernel Team +Original-Maintainer: Debian Kernel Team +Installed-Size: 19 +Filename: pool/linux-sysctl-defaults_4.15ubuntu5_all.deb +Size: 6208 +MD5sum: 3c87cdb4ab8ecea452db9f4104ab906c +SHA1: 70db9af08ce73b0296cfc7771c0248ff29a44760 +SHA256: 6c414e68e23b82fd62df9ce4d75b427071219bf4e80ce85fcbab57eade4eed7d +SHA512: 80df3d0f5a5232210ed33aae2d2dc645a0aba874b9b3986468c7b43dc881b3afb13c13b264eab29c6dfb79c5f70b830088a854da70b53fa2a90b02cc143fc67b +Description: default sysctl configuration for Linux + This package contains a sysctl configuration file setting some + sensible defaults for Linux. + +Package: locales +Architecture: all +Version: 2.43-2ubuntu2.4 +Priority: standard +Section: localization +Source: glibc +Maintainer: Ubuntu Developers +Original-Maintainer: GNU Libc Maintainers +Installed-Size: 15802 +Depends: libc-bin (>> 2.43), debconf (>= 0.5) | debconf-2.0 +Filename: pool/locales_2.43-2ubuntu2.4_all.deb +Size: 4225234 +MD5sum: cea4ef97f0dfb7d3f8650a9e4f94287c +SHA1: 57f4dbc4700fe0a730cedac6028e811dbada72d5 +SHA256: a1abf41b517f767018d5eab519d55b9269fe0a04ae49ea35f7c3ad1b8870ab32 +SHA512: 85e92c5e47e57bdc34fbfab1fad675b88927e674f398b60ea41db4a24c2f61125c24d65122a1c652b570cb7e9d688ae871652e8dfc50472f417a16ac366d3be9 +Homepage: https://www.gnu.org/software/libc/libc.html +Description: GNU C Library: National Language (locale) data [support] + Machine-readable data files, shared objects and programs used by the + C library for localization (l10n) and internationalization (i18n) support. + . + This package contains tools to generate locale definitions from source + files (included in this package). It allows you to customize which + definitions actually get generated. This is a space-saver over how this + package used to be, with all locales generated by default. This created + a package that unpacked to an excess of 30 megs. +Original-Vcs-Browser: https://salsa.debian.org/glibc-team/glibc +Original-Vcs-Git: https://salsa.debian.org/glibc-team/glibc.git + +Package: localsearch +Architecture: amd64 +Version: 3.11.0-1ubuntu1.1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1896 +Depends: procps, tinysparql (>= 3.8), dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.38), libcue2, libexempi8 (>= 2.5.0), libgexiv2-2 (>= 0.13.0), libgif7 (>= 5.1), libglib2.0-0t64 (>= 2.83.0), libgsf-1-114 (>= 1.14.24), libgstreamer-plugins-base1.0-0 (>= 1.20.0), libgstreamer1.0-0 (>= 1.20.0), libgxps2t64 (>= 0.2.1), libicu78 (>= 78.1-1~), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libpoppler-glib8t64 (>= 0.22.1), libseccomp2 (>= 2.1.0), libtiff6 (>= 4.5.0~rc1), libtinysparql-3.0-0 (>= 3.11~), libtotem-plparser18 (>= 3.26.0), libupower-glib3 (>= 0.99.0), libwebpdemux2 (>= 1.5.0), libxml2-16 (>= 2.14.1) +Suggests: localsearch-extractor-ffmpeg, localsearch-extractor-iso, localsearch-extractor-office +Breaks: tracker-extract (<< 3.11~), tracker-miner-fs (<< 3.11~) +Replaces: tracker-extract (<< 3.11~), tracker-miner-fs (<< 3.11~) +Filename: pool/localsearch_3.11.0-1ubuntu1.1_amd64.deb +Size: 415752 +MD5sum: 46c4071201e03d1daa9b8b3f45e58eb3 +SHA1: bfe5a793ef5ac957151561266005a9f2aedac5f9 +SHA256: 0d1e647e655f9fa749515fa0aad656b2f700e3914c9e70eee6adb44be7b93da2 +SHA512: 5e7f475dcfa0fd502005bcce018ea612f902f4b01c9abbc259087feef7d3e99801bc2b1f01150b138f417c278f6048002b07633ca4da64c786c2c13aafbf44e5 +Homepage: https://tracker.gnome.org/ +Description: metadata database, indexer and search tool - metadata extractors + This package contains the metadata extractors. + . + Tracker is an advanced framework for first class objects with associated + metadata and tags. It provides a one stop solution for all metadata, tags, + shared object databases, search tools and indexing. + +Package: loupe +Architecture: amd64 +Version: 50.0-0ubuntu2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 6764 +Depends: libadwaita-1-0 (>= 1.8.0), libc6 (>= 2.39), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.12.6), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.74.0), libgraphene-1.0-0 (>= 1.9.4), libgtk-4-1 (>= 4.16), libgweather-4-0t64 (>= 4.0.0), liblcms2-2 (>= 2.12.0), libseccomp2 (>= 2.5.0), dconf-gsettings-backend | gsettings-backend, glycin-loaders (>= 2.0~rc+ds-~~) +Filename: pool/loupe_50.0-0ubuntu2_amd64.deb +Size: 2098584 +MD5sum: cc05b283531062ec285708ce6d91fe33 +SHA1: ad810164b8de9a91ff68cc2182b76be012ad1c91 +SHA256: 6af0e93b1a0ccf5b5bd09ce5acec03cf4e9c0577bf874195113ce17aa0b91052 +SHA512: e60001e51eeb82537ede3b2acf99e711edb2d5ee2c454ea73892acb9d88b1c45e99eb317eb74c5a0fcd7493eb8453749314d288bf3fc4928488c48b82b42c1f2 +Homepage: https://apps.gnome.org/Loupe/ +Description: Image viewer for GNOME + Loupe is a simple image viewer for the GNOME desktop. + It uses glycin-loaders for image loading and decoding. + A wide range of image formats is supported. + Basic image editing like cropping and rotation is supported. + Starting with GNOME 45 this is the default image viewer. + +Package: lsb-release +Architecture: all +Version: 12.1-2build1 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: lsb-release-minimal +Maintainer: Ubuntu Developers +Original-Maintainer: Gioele Barabucci +Installed-Size: 18 +Filename: pool/lsb-release_12.1-2build1_all.deb +Size: 6174 +MD5sum: 5fe013de5f829b74a2abeba832ad6a9f +SHA1: caec0c5274be63e1b06f45205c04133941c79ea3 +SHA256: 992cd1c4d62332bc2000d87438a479578af71e719df6430079734791060583aa +SHA512: fa9107349e2b6eb0cb4dee54617b6116f5f22a03247f06f9eec7babb372651dc25308e2b0b03f98a0363d713d1c3d1831f1a011492724282961386e03a9f5c5e +Homepage: https://gioele.io/lsb-release-minimal +Description: Linux Standard Base version reporting utility (minimal implementation) + The Linux Standard Base (http://www.linuxbase.org/) is a standard + core system that third-party applications written for Linux can + depend upon. + . + The lsb_release command is a simple tool to help identify the Linux + distribution being used and its compliance with the Linux Standard Base. + . + This package contains a bare-bones implementation that uses the + information in /etc/os-release instead of relying on LSB packages. + +Package: lsof +Architecture: amd64 +Version: 4.99.4+dfsg-2build2 +Priority: standard +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Andres Salomon +Installed-Size: 480 +Depends: liblsof0 (= 4.99.4+dfsg-2build2), libc6 (>= 2.38), libselinux1 (>= 3.1~), libtirpc3t64 (>= 1.0.2) +Filename: pool/lsof_4.99.4+dfsg-2build2_amd64.deb +Size: 238920 +MD5sum: 1cdc20e33f2e074cf181db134866f190 +SHA1: 73db43baa05bb1e8f85fbefbdc08ccc05ede7d30 +SHA256: 4f61cd2ad30fc73f53d66d769395d343c268a526f7901e14ae69f530b468435b +SHA512: 28416bd7e819b7a6c7192b6de1d69b79bc6d948a7f170dec8cf5343e2b050346b670706e23f27a7dc293606e639808396f9171e818178d99780af2d5bbe3abb7 +Homepage: https://github.com/lsof-org/lsof +Description: utility to list open files + Lsof is a Unix-specific diagnostic tool. Its name stands + for LiSt Open Files, and it does just that. It lists + information about any files that are open, by processes + currently running on the system. + . + This package contains the classic lsof command line tool. + +Package: luit +Architecture: amd64 +Version: 2.0.20250912-1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Thomas E. Dickey +Installed-Size: 135 +Provides: luit +Depends: libc6 (>= 2.38) +Breaks: x11-utils (<< 7.7+6) +Replaces: x11-utils (<< 7.7+6) +Filename: pool/luit_2.0.20250912-1_amd64.deb +Size: 41556 +MD5sum: e29fe02ceabcc7f8e1c8f54b3e562863 +SHA1: ff6c632ee4f2cf98642f4a4efd0ff697c145f2b1 +SHA256: 787954ae8ebb8ad1069278e52ec2a80d8a5701b55f4c89d397745b72debe435e +SHA512: 5eed110126847c8469c3a88631a17c9c47408fe314f02ed89aae0e7cef3687c3c0bd466a9a3c481906b65a8cfa3ae292145a626d2f7ce1d14d7f6a336cd955b1 +Homepage: https://invisible-island.net/luit/ +Description: locale and ISO 2022 support for Unicode terminals + Luit is a filter that can be run between an arbitrary application and a + UTF-8 terminal emulator. It will convert application output from the + locale's encoding into UTF-8, and convert terminal input from UTF-8 + into the locale's encoding. + . + This is version 2.0 of luit, which can use encoding information from + either the font-encoding data-files in the "xfonts-encodings" package, + or the standard locale support in the C runtime library. + +Package: makedumpfile +Architecture: amd64 +Version: 1:1.7.7-1 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Kdump +Installed-Size: 466 +Depends: perl:any, libc6 (>= 2.38), libdw1t64 (>= 0.143), libelf1t64 (>= 0.142), liblzo2-2 (>= 2.02), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.2.0) +Recommends: crash, kexec-tools +Replaces: kdump-tools (<< 1.3.4-1~) +Filename: pool/makedumpfile_1%3a1.7.7-1_amd64.deb +Size: 188546 +MD5sum: 54ab95f30aa99764ef4539516c3411b0 +SHA1: e49d9584f4d6be996cdf1c16725273f831f7b71c +SHA256: b3e66bc9414ce9b1cf4498704c453a70cd5a16679ec86ffc972a523c1e6a31a0 +SHA512: 3237876d472c4243fc628fd12f471a6b4cdc31447597c3befbd22c009e053a385c0498512501dc07b5ddcee30fdc82aee61f365d674bc0078c1c598c00139882 +Homepage: https://github.com/makedumpfile/makedumpfile +Description: VMcore extraction tool + This program is used to extract a subset of the memory available either + via /dev/mem or /proc/vmcore (for crashdumps). It is used to get memory + images without extra unneeded information (zero pages, userspace programs, + etc). + +Package: man-db +Architecture: amd64 +Version: 2.13.1-1build1 +Multi-Arch: foreign +Priority: important +Section: doc +Maintainer: Colin Watson +Installed-Size: 3045 +Provides: man, man-browser +Depends: bsdextrautils | bsdmainutils (<< 12.1.1~), groff-base, debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.38), libgdbm6t64 (>= 1.16), libpipeline1 (>= 1.5.0), libseccomp2 (>= 2.1.0), zlib1g (>= 1:1.1.4) +Suggests: apparmor, groff, less, www-browser +Conflicts: man +Replaces: man +Filename: pool/man-db_2.13.1-1build1_amd64.deb +Size: 1392108 +MD5sum: a81b65b37445ea2d7d751545d2fe492f +SHA1: 0f2903881cb0fdd5c15b6bf174c45dc1b003cbc8 +SHA256: 8f5f22abe63c90c76363f9ce182671bc2ced4a7259170f2c634cd96b4ad3acfe +SHA512: ed8ed863ab252216953a19d5e7d5d20788b8754493f9db4f9fb778c17b37a0ed26da146686f1eab32d87708e5838d3792af12cd9655536617b443181c4f1c2e6 +Homepage: https://man-db.gitlab.io/man-db/ +Description: tools for reading manual pages + This package provides the man command, the primary way of examining the + system help files (manual pages). Other utilities provided include the + whatis and apropos commands for searching the manual page database, the + manpath utility for determining the manual page search path, and the + maintenance utilities mandb, catman and zsoelim. man-db uses the groff + suite of programs to format and display the manual pages. + +Package: media-types +Architecture: all +Version: 14.0.0build1 +Multi-Arch: foreign +Priority: standard +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Mime-Support Packagers +Installed-Size: 99 +Breaks: mime-support (<< 3.65) +Replaces: mime-support (<< 3.65) +Filename: pool/media-types_14.0.0build1_all.deb +Size: 31434 +MD5sum: ed47afe7bddf14157410d4f54bc0ddf3 +SHA1: 9e2f2ba6834205a95872bc65da79003cb242baaa +SHA256: f3412d08032210541d25c4e00fa492ce527af245ac9bec2e543d81a59b4426aa +SHA512: 28736b00802c74eff41bb0e12fb2998525ac87f58b76c01c6cbfe38b6d652412a454253751bb319365c6984e9e5a6c91c24d4d213c3bbb1e2e440142fb902921 +Description: List of standard media types and their usual file extension + This package installs the configuration file /etc/mime.types, that lists + standard media types (originally known as "MIME" types) and their usual file + extension. This provides a simple way for programs to have a first guess at a + file's content. On standard Debian desktop systems, one will also find more + sophisticated tools, for instance provided by the "file" and "xdg-utils" + packages. + . + The /etc/mime.types file is compiled by hand using mostly information provided + by the Internet Assigned Numbers Authority (IANA). + +Package: memtest86+ +Architecture: amd64 +Version: 8.00-3 +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Fabio Fantoni +Installed-Size: 12473 +Depends: grub-common +Suggests: grub-efi | grub-pc, memtester, mtools +Filename: pool/memtest86+_8.00-3_amd64.deb +Size: 148812 +MD5sum: 680983d159d32bd51079ef50fab40558 +SHA1: 7bb173ca94915dfbf3e410a2a5351cb8dedbdc61 +SHA256: 8aaf23ceab202090967030280362c32f55b6e6af30cedfbb3c6ede41a4e81cbd +SHA512: 1a4b7fe2c6df43f54025d0a5fa9baf5705076f7e7942501ac967ef28c77da5a31e2ebf1502e7ec413b1a88c56b4447b0d4f6c10117639b3ddaaf6c0dfd96c30d +Homepage: https://www.memtest.org/ +Description: stand-alone memory tester for x86 and x86-64 + Memtest86+ provides a more thorough memory check than + that provided by BIOS memory tests. Can be loaded and run either + directly by a PC BIOS (legacy or UEFI) or via an intermediate + bootloader. + . + This tester runs independently of any OS - it is run at computer + boot-up, so that it can test *all* of your memory. You may want to + look at `memtester', which allows one to test your memory within Linux, + but this one won't be able to test your whole RAM. + . + It can output a list of bad RAM regions usable by the BadRAM kernel + patch, so that you can still use your old RAM with one or two bad bits. + +Package: mesa-libgallium +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 44601 +Provides: libglapi-mesa, mesa-va-drivers, mesa-vdpau-drivers, va-driver +Depends: libc6 (>= 2.43), libdrm-amdgpu1 (>= 2.4.125-1), libdrm-intel1 (>= 2.4.125-1), libdrm2 (>= 2.4.125-1), libelf1t64 (>= 0.142), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.4), libllvm21 (>= 1:21.1.0), libsensors5 (>= 1:3.5.0), libstdc++6 (>= 11), libx11-xcb1, libxcb-dri3-0 (>= 1.13), libxcb-present0, libxcb-randr0, libxcb-sync1, libxcb-xfixes0, libxcb1 (>= 1.9.2), libxshmfence1, libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Breaks: mesa-va-drivers (<< 25.2.8-3), mesa-vdpau-drivers (<< 25.2.8-3) +Replaces: mesa-va-drivers (<< 25.2.8-3), mesa-vdpau-drivers (<< 25.2.8-3) +Enhances: libva2 +Filename: pool/mesa-libgallium_26.0.8-1ubuntu0.3_amd64.deb +Size: 11241306 +MD5sum: 643a059889de5c9b82029f9d1bdd91a3 +SHA1: 9e833812d7a5cecc3d04406b35029e058ad71207 +SHA256: 7f123a545774034793ba3516c5fad0be88de68ad91319a4b220d98b32a289451 +SHA512: afe6fb9f67affed59f72f732eb2b48dcaab4086c178517284f44034a2f29ef6d297a1940acd591f6ecd46374e9734b337ce932cc3b8d2161d33d9063bed5bd55 +Homepage: https://mesa3d.org/ +Description: shared infrastructure for Mesa drivers + This package contains libgallium, a private library shared between + multiple Mesa drivers. This library is an implementation detail of Mesa + and should not be used directly by user code. + +Package: mesa-vulkan-drivers +Architecture: amd64 +Version: 26.0.8-1ubuntu0.3 +Multi-Arch: same +Priority: optional +Section: libs +Source: mesa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 110216 +Provides: vulkan-icd +Depends: libvulkan1, libc6 (>= 2.43), libdisplay-info3 (>= 0.3.0), libdrm-amdgpu1 (>= 2.4.125-1), libdrm2 (>= 2.4.125-1), libelf1t64 (>= 0.142), libexpat1 (>= 2.0.1), libgcc-s1 (>= 4.2), libllvm21 (>= 1:21.1.0), libpng16-16t64 (>= 1.6.46), libstdc++6 (>= 13.1), libwayland-client0 (>= 1.24.0), libx11-xcb1, libxcb-dri3-0 (>= 1.17.0), libxcb-present0 (>= 1.17.0), libxcb-randr0 (>= 1.13), libxcb-shm0, libxcb-sync1, libxcb-xfixes0, libxcb1 (>= 1.9.2), libxshmfence1, libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Filename: pool/mesa-vulkan-drivers_26.0.8-1ubuntu0.3_amd64.deb +Size: 19109714 +MD5sum: 03dab08cb6e77d3b07d34f25fe27b585 +SHA1: b9c5d0484aed388009d1b6d121063347d18ce487 +SHA256: 27db5fa34d50d208b58cc94317b573065329740bb98d0e12b7947b06a9d02a4e +SHA512: 4ed537414089d79545b1be0555e3e2d0d43a3b2181ba9c89b243bc865511bc4c4863867a4d56a00ca9471cdb16ab65355cdbb57ae4462cf3d8c12de45f696ce8 +Homepage: https://mesa3d.org/ +Description: Mesa Vulkan graphics drivers + Vulkan is a low-overhead 3D graphics and compute API. This package + includes Vulkan drivers provided by the Mesa project. + +Package: mobile-broadband-provider-info +Architecture: all +Version: 20251101-1build1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Graham Inggs +Installed-Size: 527 +Filename: pool/mobile-broadband-provider-info_20251101-1build1_all.deb +Size: 65918 +MD5sum: 0ec623308487d94b1c056fd317787f82 +SHA1: ad66a92dcb6d331c704808178b486a9caced52c0 +SHA256: 5a4821ebe3f996104f2b00c94a7eb6511e88469ce1a2082af2fa6a1a34192310 +SHA512: 1f6def5e5a6879d37b98145b67480d523fa210b0ce93887c83a902b46a9f4648a95f6cda55b5faf712ba765cbd6b5e0d4b142bd05c622eb7a05074541d27a652 +Homepage: https://wiki.gnome.org/Projects/NetworkManager/MobileBroadband/ServiceProviders +Description: database of mobile broadband service providers + This package contains a database of provider-specific settings of mobile + broadband providers in different countries. Its functioning through Network + Manager makes it easy for users to choose their mobile broadband service + provider. + . + The database contains information relevant to mobile networks access point + usage, such as APN (access point name), username, password, etc. + +Package: modemmanager +Architecture: amd64 +Version: 1.25.95-1ubuntu1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: DebianOnMobile Maintainers +Installed-Size: 5128 +Depends: libc6 (>= 2.42), libglib2.0-0t64 (>= 2.56.0), libgudev-1.0-0 (>= 212), libmbim-glib4 (>= 1.32~), libmbim-proxy, libmm-glib0 (>= 1.25.1), libpolkit-gobject-1-0 (>= 0.99), libqmi-glib5 (>= 1.37.95), libqmi-proxy, libqrtr-glib0 (>= 1.0.0), libsystemd0 (>= 209), polkitd +Recommends: libmbim-utils, libqmi-utils, usb-modeswitch +Filename: pool/modemmanager_1.25.95-1ubuntu1_amd64.deb +Size: 1177868 +MD5sum: 7b5ae5e4640c0e2c198c9e7477ec17c6 +SHA1: 6446c379853f48fff7c12f1bb85e50c1bf543397 +SHA256: 230439882a79b3f1fd11ed715b658f86213e6355a4b5ed38ee91cbd1f71aface +SHA512: 9d029d16ab91f3632a7b6221ebee860ca21c25aac3f32b953a6c945dfc8eefbe6b958d03567c4d2c2add2114cd017e2a207e0416fe8487ad9b77d29ef44dcbe1 +Homepage: https://www.freedesktop.org/wiki/Software/ModemManager/ +Description: D-Bus service for managing modems + ModemManager is a DBus-activated daemon which controls mobile broadband + (2G/3G/4G/5G) devices and connections. Whether built-in devices, USB dongles, + Bluetooth-paired telephones or professional RS232/USB devices with external + power supplies, ModemManager is able to prepare and configure the modems and + setup connections with them. + +Package: mokutil +Architecture: amd64 +Version: 0.7.2-2 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian UEFI Maintainers +Installed-Size: 82 +Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libefivar1t64 (>= 39), libkeyutils1 (>= 1.5.9), libssl3t64 (>= 3.0.0) +Filename: pool/mokutil_0.7.2-2_amd64.deb +Size: 28136 +MD5sum: e7033cefc0057bc1fddbaab22aae29fd +SHA1: 855ce49b12b9b426107b96f4c2f5475e6c4fcdee +SHA256: 7d0a173bfc17241f983b8c25fd34dd3b41e1c314803bbdea2f4cace417da3480 +SHA512: 89709241611fb04288e5776afcee0c5c765d87ddea77e066bd8009c8a21da6035713f9dbf6d98597c2b90829ee635b3bd561cf3158bf9e826413c0f8d1edbe06 +Description: tools for manipulating machine owner keys + This program provides the means to enroll and erase the machine owner + keys (MOK) stored in the database of shim. + +Package: moreutils +Architecture: amd64 +Version: 0.69-1build1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Nicolas Schier +Installed-Size: 232 +Depends: libc6 (>= 2.38), perl:any, libipc-run-perl, libtime-duration-perl, libtimedate-perl +Conflicts: lckdo +Replaces: lckdo +Filename: pool/moreutils_0.69-1build1_amd64.deb +Size: 56976 +MD5sum: 1861572cff800e5c693094ac412b4845 +SHA1: f8caa41527aee2131d18e8a84e6c5cabaf2e2931 +SHA256: 932639e63e49a9912cd27457688f2a971faddcde985a0a38970fa713c30fcc3f +SHA512: 2712953b3b5fff198b30e49549df2e377e504db6a368f4015a44b7c9622f6a31ae7d1a69d753db5f80c9a9dd7f810117a469b5f5381c9d0f90c0b63e60804993 +Homepage: https://joeyh.name/code/moreutils/ +Description: additional Unix utilities + This is a growing collection of the Unix tools that nobody thought + to write long ago, when Unix was young. + . + So far, it includes the following utilities: + - chronic: runs a command quietly unless it fails + - combine: combine the lines in two files using boolean operations + - errno: look up errno names and descriptions + - ifdata: get network interface info without parsing ifconfig output + - ifne: run a program if the standard input is not empty + - isutf8: check if a file or standard input is utf-8 + - lckdo: execute a program with a lock held + - mispipe: pipe two commands, returning the exit status of the first + - parallel: run multiple jobs at once + - pee: tee standard input to pipes + - sponge: soak up standard input and write to a file + - ts: timestamp standard input + - vidir: edit a directory in your text editor + - vipe: insert a text editor into a pipe + - zrun: automatically uncompress arguments to command + +Package: mscompress +Architecture: amd64 +Version: 0.4-10build2 +Priority: optional +Section: otherosfs +Maintainer: Ubuntu Developers +Original-Maintainer: Patrick Matthäi +Installed-Size: 44 +Depends: libc6 (>= 2.34) +Filename: pool/mscompress_0.4-10build2_amd64.deb +Size: 9556 +MD5sum: 89c9717b2233122e16faa75244fb5ddb +SHA1: 0de1d909e51c6bf1af5e8cbe24ca463642cb3a9a +SHA256: 2c2207a2c67d93f161f6cc8bb1877687e7af35e67b8afa01173636f4872d84d6 +SHA512: 7646089ce75fce7b58a3024112bc6314b3bd33da24c8a8655c5584c6967da4f1efd19b29a6f8a4bc9c8aa537a615a833766378710170663e93bacf60fb7a1cc9 +Homepage: https://github.com/stapelberg/mscompress +Description: Microsoft "compress.exe/expand.exe" compatible (de)compressor + This package contains two programs: + . + * msexpand which decompresses files compressed by the Microsoft + compress.exe utility (e.g. Win 3.x installation files); + * mscompress which compresses files using the LZ77 compression + algorithm. + . + Files can be decompressed using Microsoft expand.exe or msexpand(1). + +Package: mutter-common +Architecture: all +Version: 50.1-0ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: mutter +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 196 +Depends: dconf-gsettings-backend | gsettings-backend, python3 +Breaks: libmutter-10-0 (<< 49~), libmutter-11-0 (<< 49~), libmutter-12-0 (<< 49~), libmutter-13-0 (<< 49~), libmutter-14-0 (<< 49~), libmutter-15-0 (<< 49~), libmutter-16-0 (<< 49~), libmutter-17-0 (<< 50~), magpie-common (<< 0.9.3-0ubuntu8~) +Replaces: magpie-common (<< 0.9.3-0ubuntu8~) +Filename: pool/mutter-common_50.1-0ubuntu2.2_all.deb +Size: 38700 +MD5sum: 8d1330b3482c6ba8ff131845e0e4fbf6 +SHA1: 6b15600d89cbbeba59eae8aba02a72a49a75ddce +SHA256: cf0f3cff9e965bb590852318a01290f4fdff90eefcf1d695254335faa8421dd4 +SHA512: 2cea7b345ed7a6c5a93b2bc62b98fde10e2327133d58203cc8efb907da9d28ab8c6c8f53bec37402f212cc8344f8aa49088d4ae19ca1c74a420f2e484ba26946 +Homepage: https://mutter.gnome.org/ +Description: shared files for the Mutter window manager + Mutter is a Wayland display server and X11 window manager and + compositor library. It contains functionality related to, among other + things, window management, window compositing, focus tracking, workspace + management, keybindings and monitor configuration. + . + Internally it uses a fork of Cogl, a hardware acceleration abstraction + library used to simplify usage of OpenGL pipelines, as well as a fork + of Clutter, a scene graph and user interface toolkit. + . + This package contains the shared files. + +Package: mutter-common-bin +Architecture: amd64 +Version: 50.1-0ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: misc +Source: mutter +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 163 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.22.0), libx11-6, libxfixes3 (>= 1:6.0.0), libxi6 (>= 2:1.2.99.4), gir1.2-glib-2.0, python3, python3-gi +Suggests: python3-argcomplete +Breaks: libmutter-17-0 (<< 50~), mutter (<< 48.1~) +Replaces: mutter (<< 48.1~) +Filename: pool/mutter-common-bin_50.1-0ubuntu2.2_amd64.deb +Size: 54462 +MD5sum: a5a6776fd5e9d576ad68c58bcbdb4a59 +SHA1: 23a97c6cf354246f5e16ae200eac8c3f3b0d6f2a +SHA256: 6414537f37eaa13988488496542ed79b9f24d168e5b708b79cc1606ad1f904e8 +SHA512: 10954bccaebe1b6b114c839cb9d2fb2e7140427d364c6130b35075049a3c114b0530bf2d52853ba7792b0f1d24bdc4c1022b94c822e678012487245d0baaf9ec +Homepage: https://mutter.gnome.org/ +Description: shared programs for the Mutter window manager + Mutter is a Wayland display server and X11 window manager and + compositor library. It contains functionality related to, among other + things, window management, window compositing, focus tracking, workspace + management, keybindings and monitor configuration. + . + Internally it uses a fork of Cogl, a hardware acceleration abstraction + library used to simplify usage of OpenGL pipelines, as well as a fork + of Clutter, a scene graph and user interface toolkit. + . + This package contains the program files which are used for the libraries + and others. + +Package: nautilus +Architecture: amd64 +Version: 1:50.2.2-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1662 +Depends: desktop-file-utils (>= 0.7), eject, gsettings-desktop-schemas (>= 3.8.0), gvfs (>= 1.3.2), gvfs-backends, libglib2.0-data, libnautilus-extension4 (= 1:50.2.2-0ubuntu0.1), nautilus-data (= 1:50.2.2-0ubuntu0.1), shared-mime-info (>= 0.50), localsearch, xdg-user-dirs-gtk, libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libdbusmenu-glib4 (>= 0.4.2), libgdk-pixbuf-2.0-0 (>= 2.25.2), libgexiv2-2 (>= 0.14.2), libglib2.0-0t64 (>= 2.84.0), libglycin-2-0 (>= 2.0~beta), libglycin-gtk4-2-0 (>= 2.0~beta), libgnome-autoar-0-0 (>= 0.4.4), libgnome-desktop-4-2t64 (>= 43~), libgraphene-1.0-0 (>= 1.5.4), libgstreamer-plugins-base1.0-0 (>= 1.0.0), libgstreamer1.0-0 (>= 1.0.0), libgtk-4-1 (>= 4.20.0), libicu78 (>= 78.1-1~), libpango-1.0-0 (>= 1.42), libportal-gtk4-1 (>= 0.7), libportal1 (>= 0.7), libselinux1 (>= 3.1~), libtinysparql-3.0-0 (>= 3.8.1), libunity9 (>= 3.4.6), libwayland-client0 (>= 1.20.0), libx11-6 +Recommends: libgdk-pixbuf2.0-bin, librsvg2-common, xdg-desktop-portal-gnome +Suggests: gnome-sushi +Breaks: eiciel (<< 0.9.13.1-1.1~), folder-color (<< 0.0.86-0ubuntu5~), nautilus-dropbox (<< 2019.02.14-1ubuntu2~), nautilus-extension-brasero (<< 3.12.3-2), nautilus-extension-burner (<< 3.0.10-1.2), nautilus-extension-gnome-console (<< 43), nautilus-extension-gnome-terminal (<< 3.56.0-1ubuntu2), nautilus-filename-repairer (<< 0.2.0-3.1~), nautilus-font-manager (<< 0.8.8-2), nautilus-gtkhash (<< 1.4+git20220617-2.1~), nautilus-ideviceinfo (<< 0.1.0-0ubuntu15~), nautilus-image-converter (<< 0.3.1~git20110416-2.1~), nautilus-share (<< 0.7.3-2ubuntu7~), nautilus-wipe (<< 0.3.1-2.1~), seahorse-nautilus (<< 3.11.92-4.1~), unity (<< 7.5.1+21.10.20210601.1-0ubuntu1) +Replaces: nautilus-extension-gnome-terminal (<< 3.56.0-1ubuntu2) +Filename: pool/nautilus_1%3a50.2.2-0ubuntu0.1_amd64.deb +Size: 570250 +MD5sum: b7bb6697992570d4f1e0677a30ca34fb +SHA1: 4df6b42ec6832e3a9906b888a3448b29510b7db1 +SHA256: 97961c5419e6cd105a053f16e2f4205653c4d951ac7ac7b4da68a767546af56d +SHA512: 2055e56f6d1175a322d388d1ccab1914da217ea0d5dce617a24265dc09f011b2910dbd0e4a5d092dfd17e6faafedeee91e0bcc5969afa195f0824e000addceee +Homepage: https://wiki.gnome.org/action/show/Apps/Nautilus +Description: file manager and graphical shell for GNOME + Nautilus is the official file manager for the GNOME desktop. It allows + one to browse directories, preview files and launch applications + associated with them. It is also responsible for handling the icons on + the GNOME desktop. It works on local and remote filesystems. + . + Several icon themes and components for viewing different kinds of files + are available in separate packages. + +Package: nautilus-data +Architecture: all +Version: 1:50.2.2-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: nautilus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 132 +Depends: dconf-gsettings-backend | gsettings-backend +Filename: pool/nautilus-data_1%3a50.2.2-0ubuntu0.1_all.deb +Size: 17002 +MD5sum: 2710337238fa502df903256aba2949a7 +SHA1: 58f5068cb96b60104647bf014686aed6bcaa0b64 +SHA256: 4084720b6a6e4b6881c17fe514ebc305b9484e0f17d44bb050a15f88a0490dd9 +SHA512: 1088436281d885d350f715792250bfa225b1f8aeaf1181a7f362650030f72cd8a3cb2c8df8d36e4b8cafefdaa44948d00bbd2321f1a23705b5d41c732118e978 +Homepage: https://wiki.gnome.org/action/show/Apps/Nautilus +Description: data files for nautilus + Nautilus is the official file manager and graphical shell for the + GNOME desktop. + . + This package contains pictures, localization files and other data + needed by nautilus. + +Package: nautilus-sendto +Architecture: amd64 +Version: 3.8.6-8ubuntu1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 128 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0) +Enhances: evince +Filename: pool/nautilus-sendto_3.8.6-8ubuntu1_amd64.deb +Size: 23738 +MD5sum: 157bdbfa64004c9486d5667488e15c0f +SHA1: 8a9d4434e2b0712d1e73525c5512602804777920 +SHA256: e959905e710d7c161a31f0091d998bc370ae903ee551424d15cb71c8dd4d8b1a +SHA512: d852dc81710a3021bb5d01f3a0d17e05c7db20df9499a49f77bf2c629a90a7bb656d5100b35664f268a1ae743e5ab2f368d6abc49adf6c9ebed83446111151ea +Description: easily send files via email from within Nautilus + The Nautilus Send To plugin provides a context + menu component for quickly sending files via email. + . + Supported email clients are Evolution, Thunderbird/Icedove, balsa and + Sylpheed/Claws. + . + Nautilus Send To also provides the option of compressing the files (tar.bz2, + tar.gz, or zip) before sending. + +Package: ncurses-term +Architecture: all +Version: 6.6+20251231-1 +Multi-Arch: foreign +Priority: standard +Section: misc +Source: ncurses +Maintainer: Ubuntu Developers +Original-Maintainer: Ncurses Maintainers +Installed-Size: 4421 +Provides: foot-terminfo (= 6.6+20251231-1) +Depends: ncurses-base (= 6.6+20251231-1) +Breaks: foot-terminfo (<< 1.15.1-2), vim-common (<< 2:9.0.1000-2) +Replaces: alacritty (<< 0.3.4~), foot-terminfo (<< 1.15.1-2), jfbterm (<< 0.4.7-10), kon2 (<< 0.3.9b-21), libiterm1 (<< 0.5-9), ncurses-base (<< 6.4+20230625), tn5250 (<< 0.17.4-3) +Filename: pool/ncurses-term_6.6+20251231-1_all.deb +Size: 279792 +MD5sum: 407418d11028f96e4cee12f04d4a9f35 +SHA1: e162029c3b04326d41079f57819776a875187303 +SHA256: 23b67d85b6c8857fd40aded8554f59751460c8d35f0a0573562021480acbca62 +SHA512: ea46cdaa1cb23ca9c7a9ab28b802d9a5c759d29e2f2b0f5f228dfb4d3b6ad1e620c55201c643e5c901b08f55fcbcbdea86f8e4d6951f91b983c0a038343f2c5e +Homepage: https://invisible-island.net/ncurses/ +Description: additional terminal type definitions + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package contains all of the numerous terminal definitions not found in + the ncurses-base package. + +Package: netbase +Architecture: all +Version: 6.5build1 +Multi-Arch: foreign +Priority: important +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Marco d'Itri +Installed-Size: 35 +Breaks: ebtables (<< 2.0.11-2) +Replaces: ebtables (<< 2.0.11-2) +Filename: pool/netbase_6.5build1_all.deb +Size: 13036 +MD5sum: 759703b0be18a65e79ab436b9c507a19 +SHA1: dc2f6d64938eb75b489b6cb94e53da757351e3fd +SHA256: f008e39aada379d64166153d5e37ccc4f18b3e334babb9e32c4da9b4396ee733 +SHA512: 160682453d660479acd6ca4775d87fd5430ed5b87d440461c73a708f3cf2bd31194e2d585d12c80f7ca6f89bbe3dea2283adf95f7740bf479e006dabc9733250 +Description: Basic TCP/IP networking system + This package provides the necessary infrastructure for basic TCP/IP based + networking. + . + In particular, it supplies common name-to-number mappings in /etc/services, + /etc/rpc, /etc/protocols and /etc/ethertypes. + +Package: netcat-openbsd +Architecture: amd64 +Version: 1.234-1 +Priority: important +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Guilhem Moulin +Installed-Size: 105 +Provides: netcat +Depends: libbsd0 (>= 0.2.0), libc6 (>= 2.38) +Filename: pool/netcat-openbsd_1.234-1_amd64.deb +Size: 44048 +MD5sum: e32ea394f2a127a13c3fcd85e1baff63 +SHA1: b6c75e515006eff30d4da37b854a5315e4f15948 +SHA256: a17549cec3db5cbe8c1f05117aa599499edbdc95e980db0a38086faf2a330e56 +SHA512: 07815dc90927d1c8ace73a1f3506eb9ec9f1283e45043794b6c3c0354a8ee234c5c35912d4e546f5e8b84a46b8e32a093bf55fd8bd16a2de72bfe83ae1cedb55 +Description: TCP/IP swiss army knife + A simple Unix utility which reads and writes data across network connections + using TCP or UDP protocol. It is designed to be a reliable "back-end" tool + that can be used directly or easily driven by other programs and scripts. At + the same time it is a feature-rich network debugging and exploration tool, + since it can create almost any kind of connection you would need and has + several interesting built-in capabilities. + . + This package contains the OpenBSD rewrite of netcat, including support for + IPv6, proxies, and Unix sockets. + +Package: netplan-generator +Architecture: amd64 +Version: 1.2-1ubuntu5.1 +Multi-Arch: foreign +Priority: optional +Section: net +Source: netplan.io +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Networking Team +Installed-Size: 317 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.16.0), libnetplan1 (= 1.2-1ubuntu5.1), systemd (>= 258~) +Suggests: network-manager | wpasupplicant, openvswitch-switch, iw +Breaks: netplan.io (<< 0.106.1-8~) +Replaces: netplan.io (<< 0.106.1-8~) +Filename: pool/netplan-generator_1.2-1ubuntu5.1_amd64.deb +Size: 65070 +MD5sum: 2f0c6a5a5551424762781ff8b2449051 +SHA1: 02d1118b48d69e978ffc237ae11985c68b428ade +SHA256: c9ca94ed0ff4bbd7d83ae1d16e2b9118270431c38696ae80f7c7c5126688c161 +SHA512: 38c0c33a0b4aebb891d3d5b8d91ffbe27790a56cb071c093cb264e6d4532af67619827317d97fc75a9e69e0fcef0062df849b6bc630d1c680d95027e18a14864 +Homepage: https://netplan.io/ +Description: Declarative network configuration for various backends at boot + Netplan reads YAML network configuration files which are written + by administrators, installers, cloud image instantiations, or other OS + deployments. During early boot it then generates backend specific + configuration files in /run to hand off control of devices to a particular + networking daemon. + . + Currently supported backends are networkd and NetworkManager. + . + This package provides a systemd-generator to configure various networking + daemons at boot time. + +Package: netplan.io +Architecture: amd64 +Version: 1.2-1ubuntu5.1 +Multi-Arch: foreign +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Networking Team +Installed-Size: 340 +Depends: python3:any, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0), libnetplan1 (= 1.2-1ubuntu5.1), libsystemd0 (>= 243), ethtool, iproute2, netplan-generator, python3-netplan, python3-yaml, systemd (>= 258~), udev +Recommends: python3-rich +Suggests: systemd-resolved +Filename: pool/netplan.io_1.2-1ubuntu5.1_amd64.deb +Size: 69552 +MD5sum: bbcefaa9fa5d59fb4bc427e26157b126 +SHA1: af94fb92048634fc5489e58bba44b877a6bebea5 +SHA256: 3c6efa64031a2d79b504dd513e42883fb65ec117deaf3b810d19b5b291c2d454 +SHA512: 20d58f66d0bad321cffe43c05835c609962e7967b3ed11bf9445baac9e5df8826acc15a011fd48671905dbbcdca6ebc716ef44f847ba6444b45f032ed18141df +Homepage: https://netplan.io/ +Description: Declarative network configuration for various backends at runtime + Netplan reads YAML network configuration files which are written + by administrators, installers, cloud image instantiations, or other OS + deployments. During early boot it then generates backend specific + configuration files in /run to hand off control of devices to a particular + networking daemon. + . + Currently supported backends are networkd and NetworkManager. + . + This package provides a runtime CLI to control the Netplan backends, + e.g. to re-generate configuration or apply changes. + +Package: network-manager +Architecture: amd64 +Version: 1.54.3-2ubuntu3 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 7613 +Depends: libaudit1 (>= 1:2.2.1), libbluetooth3 (>= 5), libc6 (>= 2.42), libcurl3t64-gnutls (>= 7.24.0), libglib2.0-0t64 (>= 2.58.0), libgnutls30t64 (>= 3.7.2), libjansson4 (>= 2.14), libmm-glib0 (>= 1.10.0), libndp0 (>= 1.2), libnetplan1 (>= 1.2~), libnewt0.52 (>= 0.52.25), libnm0 (= 1.54.3-2ubuntu3), libpsl5t64 (>= 0.13.0), libreadline8t64 (>= 6.0), libselinux1 (>= 3.1~), libsystemd0 (>= 209), libteamdctl0 (>= 1.9), libudev1 (>= 183), netplan.io (>= 1.2~), default-dbus-system-bus | dbus-system-bus, adduser +Recommends: ppp, dnsmasq-base, modemmanager, network-manager-pptp, wireless-regdb, wpasupplicant, libpam-systemd, polkitd, udev, network-manager-l10n +Suggests: avahi-autoipd, libteam-utils, iptables | nftables +Breaks: ppp (>= 2.5.2-2~), ppp (<< 2.5.2-1+~) +Filename: pool/network-manager_1.54.3-2ubuntu3_amd64.deb +Size: 2456994 +MD5sum: 7322c51c893477b531b280d87dd1951b +SHA1: e746f46c98d5d5c508f74671051e271f37950676 +SHA256: 3c085ad0c5ccca5558bfca5197b322f4e2c8f278edaf5f7d8962d4e20488c2fb +SHA512: b0f11a45fb574e05b33eb3935546ed648ecf716ce234d9fe8fa7e6b76c149a43c04a11e88cb4d70725c94fb83bb6655047f9b8e54390d2b99ed2af87da915bb6 +Homepage: https://networkmanager.dev/ +Description: network management framework (daemon and userspace tools) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package provides the userspace daemons and a command line interface to + interact with NetworkManager. + . + Optional dependencies: + * avahi-autoipd: Used for IPv4LL, a protocol for automatic Link-Local IP + address configuration. + * ppp: Required for establishing dial-up connections (e.g. via GSM). + * dnsmasq-base/nftables or iptables: Required for creating Ad-hoc connections + and connection sharing. + * libteam-utils: Network Team driver allows multiple network interfaces to be + teamed together and act like a single one. This process is called "ethernet + bonding", "channel teaming" or "link aggregation". + +Package: network-manager-config-connectivity-ubuntu +Architecture: all +Version: 1.54.3-2ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: net +Source: network-manager +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 25 +Depends: network-manager (>= 1.54.3-2ubuntu3) +Filename: pool/network-manager-config-connectivity-ubuntu_1.54.3-2ubuntu3_all.deb +Size: 2260 +MD5sum: 696065d0716af1e30139b98549e6a797 +SHA1: 6796b0fc68d585298f02f07eaba715a8b16d46e0 +SHA256: 42a7d35d594fd6b6b12e00e2b8e59c34bece4d1ee8c3972d473d9659702dbc32 +SHA512: 7eb62e12369b1b7392cdeb661dd7e9055b34273663ea201ef2779f8fa86ece286faf1331ce7937aa142fbd8370d5c2a3874f6b6cdce341bc55321b7c8d81bc97 +Homepage: https://networkmanager.dev/ +Description: NetworkManager configuration to enable connectivity checking + This package contains a configuration file which enables NetworkManager's + connectivity checking functionality. + . + NetworkManager will try to connect to an Ubuntu server to determine the + connection status. + . + This is particularly useful for captive portal detection. + . + No user data is transmitted in the connectivity checks, but merely contacting + the Ubuntu connectivity check servers reveals that the user is running an + Ubuntu(-based) operating system with NetworkManager. + +Package: network-manager-l10n +Architecture: all +Version: 1.54.3-2ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: localization +Source: network-manager +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 52 +Breaks: network-manager (<< 1.52.0-3~) +Replaces: network-manager (<< 1.52.0-3~) +Filename: pool/network-manager-l10n_1.54.3-2ubuntu3_all.deb +Size: 12182 +MD5sum: 0338eb29cef9619d52ed3966d60caf4a +SHA1: e67de5b9d55a58d7560d178ef327ec17ed7ec230 +SHA256: 9f53f04f77d3591e9b8009d6d15cc735421217b6e79280f496db7a961ba4ef26 +SHA512: df42dc877bb6c8acd251c14ca0d8c6c409aaec0610c9aeb30a19c2f7345fc8d5b47da9c27d14a961ee5bfe64620be23337279710efc5f0fc604ea9e885e2a3fd +Homepage: https://networkmanager.dev/ +Description: network management framework (translation files) + This package provides translations for messages of the programs found in the + network-manager package. + +Package: network-manager-openvpn +Architecture: amd64 +Version: 1.12.5-1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 304 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.36.0), libnm0 (>= 1.54.3), systemd | systemd-standalone-sysusers | systemd-sysusers, network-manager (>= 1.54.3), openvpn +Filename: pool/network-manager-openvpn_1.12.5-1_amd64.deb +Size: 61694 +MD5sum: 085ab3a7b9a63c35bf3eb1801f107764 +SHA1: 37c1ec5f6cbca15b19f5c5b4e66fc5c8c9a2a116 +SHA256: 59454667f5217c5d30290efb31fe915d997a323bf5be1a30ce13b763cf922938 +SHA512: e6a32706768896da79560b9e1cdc47f149122e7e0955a55728cc9be783926310f0e22dbd201844408d15a59cc359e272def3e0ec280cd0c2431d115afa854eab +Homepage: https://networkmanager.dev +Description: network management framework (OpenVPN plugin core) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package provides a VPN plugin for OpenVPN. + +Package: network-manager-openvpn-gnome +Architecture: amd64 +Version: 1.12.5-1 +Priority: optional +Section: net +Source: network-manager-openvpn +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 480 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.34.0), libgtk-3-0t64 (>= 3.4), libgtk-4-1 (>= 4.0.0), libnm0 (>= 1.54.3), libnma-gtk4-0 (>= 1.8.34), libnma0 (>= 1.8.0), libsecret-1-0 (>= 0.18), network-manager-openvpn (= 1.12.5-1) +Filename: pool/network-manager-openvpn-gnome_1.12.5-1_amd64.deb +Size: 59070 +MD5sum: 3ef3cd43364f0c9c55eea873c5aa6c09 +SHA1: d339d257f808792ee3a67c8063da1e86badc85ba +SHA256: a9ab333b41b8a9c1384f28eb5d4de6cafc8b9ede8ea267b39d3dddf9e24ae32e +SHA512: f9799502e29ff7a487b3b939d55705cf11ccd9fa283cd7c649cca1b2936b334069db5cefcf62a0fa2b8e793cb8073cdaf24ad1422330eca539e2256491df142d +Homepage: https://networkmanager.dev +Description: network management framework (OpenVPN plugin GNOME GUI) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package provides the GNOME bits of NetworkManager's OpenVPN plugin. + +Package: network-manager-pptp +Architecture: amd64 +Version: 1.2.12-6 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 216 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.34), libnm0 (>= 1.2.0), ppp (<< 2.5.2-2~), ppp (>= 2.5.2-1+~), network-manager, pptp-linux +Filename: pool/network-manager-pptp_1.2.12-6_amd64.deb +Size: 34684 +MD5sum: a54ca1565685218bce677b6f4cc0abfa +SHA1: 3549f0b710742ff84570ae84301426fa9dddb08b +SHA256: 815edfffeff434bbbcb76efab772233fd291b6b35e0ee625e9cab5e9f4533bb1 +SHA512: 842549f4e2fbeb7ff80269cb8b0bf16998f27b538e06191c1353ba46531ced610d9768347916ee4ff6449e0a1d3c1bb35cafe439c4f0f49f150bda9594525767 +Homepage: https://networkmanager.dev +Description: network management framework (PPTP plugin core) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package provides a VPN plugin for PPTP, commonly used for connecting + to Microsoft VPN servers. + +Package: network-manager-pptp-gnome +Architecture: amd64 +Version: 1.2.12-6 +Priority: optional +Section: net +Source: network-manager-pptp +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 178 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.34), libgtk-3-0t64 (>= 3.4), libgtk-4-1 (>= 4.0.0), libnm0 (>= 1.2.0), libnma-gtk4-0 (>= 1.8.34), libnma0 (>= 1.2.0), libsecret-1-0 (>= 0.18), network-manager-pptp (= 1.2.12-6) +Filename: pool/network-manager-pptp-gnome_1.2.12-6_amd64.deb +Size: 28036 +MD5sum: 146bbccce87b7b729861731324cfafde +SHA1: 42e6784a14783d6889300669907901d6af0e2379 +SHA256: 942f49bc7face385928da24f2d2651841ce2c6733d3cff70f1db0a7c3a21331f +SHA512: e7fcd8e930400b9be9d150fc15e2d42bd08ec178bd3732b34e6f5b72869356aeaf7b4d551b887ceb7f308ce7a3ed82c0740f1945ad0e8d356046e22fcf5b2999 +Homepage: https://networkmanager.dev +Description: network management framework (PPTP plugin GNOME GUI) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package provides the GNOME bits of NetworkManager's PPTP plugin. + +Package: nftables +Architecture: amd64 +Version: 1.1.6-1 +Priority: important +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Netfilter Packaging Team +Installed-Size: 190 +Depends: libnftables1 (= 1.1.6-1), libc6 (>= 2.34), libedit2 (>= 3.1-20130611-0) +Recommends: netbase +Suggests: firewalld +Filename: pool/nftables_1.1.6-1_amd64.deb +Size: 76202 +MD5sum: 66644618ddf169f18403b734fd5c4392 +SHA1: 3843bcb6baa9916cee5796ecae132966e75d3936 +SHA256: fcdeae9ed9761550619d062f8ae87a2399c84ab87f4535bcb9ab0d3649aba59a +SHA512: 540dd677d65fdf3c5e826e47dc2c0debd7fb116b74be890aae4c8d7ebf8e3d4c2651da37141ba782367183cf3fc28a1ced0e10e3a311bbc3ddd8ea9e940aca19 +Homepage: https://www.netfilter.org/ +Description: Program to control packet filtering rules by Netfilter project + This software provides an in-kernel packet classification framework that is + based on a network-specific Virtual Machine (VM) and the nft userspace + command line tool. The nftables framework reuses the existing Netfilter + subsystems such as the existing hook infrastructure, the connection tracking + system, NAT, userspace queueing and logging subsystem. + . + nftables replaces the old popular iptables, ip6tables, arptables and ebtables. + . + Netfilter software and nftables in particular are used in applications such + as Internet connection sharing, firewalls, IP accounting, transparent + proxying, advanced routing and traffic control. + . + A Linux kernel >= 3.13 is required. However, >= 4.14 is recommended. + +Package: nm-connection-editor +Architecture: amd64 +Version: 1.36.0-4ubuntu1 +Priority: optional +Section: gnome +Source: network-manager-applet +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1764 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.44.0), libgtk-3-0t64 (>= 3.21.6), libjansson4 (>= 2.14), libnm0 (>= 1.40.0), libnma0 (>= 1.8.36), libselinux1 (>= 3.1~), network-manager, gnome-shell | policykit-1-gnome | polkit-1-auth-agent, default-dbus-session-bus | dbus-session-bus +Recommends: mobile-broadband-provider-info +Breaks: network-manager-gnome (<< 1.36.0-3~) +Replaces: network-manager-gnome (<< 1.36.0-3~) +Filename: pool/nm-connection-editor_1.36.0-4ubuntu1_amd64.deb +Size: 224462 +MD5sum: 476b67a96bcbb98c50b40e9717fe95e7 +SHA1: 7810b2e283adbf6b5505666d36e477109c478f4d +SHA256: 0d26a7108d940497878d7f990271a3c93c32e826cf3c057c5573a3125d93c446 +SHA512: 23e7635b9e18fef695f9430621565245348c10f66c7caaf2fdc9703fcf9ba0a3c124583a9952d54cb0e292d1bf3029172200bc7c4504140ae08f56877c98247f +Homepage: https://networkmanager.dev +Description: network management framework (connection configuration editor) + NetworkManager is a system network service that manages your network devices + and connections, attempting to keep active network connectivity when + available. It manages ethernet, Wi-Fi, mobile broadband (WWAN), and PPPoE + devices, and provides VPN integration with a variety of different VPN + services. + . + This package contains nm-connection-editor which allows users to edit + NetworkManager connection settings. + +Package: ntfs-3g +Architecture: amd64 +Version: 1:2022.10.3-5ubuntu1.1 +Priority: optional +Section: otherosfs +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 1308 +Depends: libc6 (>= 2.38), libgcrypt20 (>= 1.12.0), libgnutls30t64 (>= 3.7.2), libntfs-3g89t64 (= 1:2022.10.3-5ubuntu1.1), fuse3 +Suggests: fdisk +Filename: pool/ntfs-3g_1%3a2022.10.3-5ubuntu1.1_amd64.deb +Size: 411194 +MD5sum: 87a483c7ca36db63f3c7915c10d4f693 +SHA1: be68492ed0253150b18b79524992a46d4c0c075c +SHA256: 7a02c9f13b08953f98cc326eef70c7b9b517a1d1a4d3bfc74f5752c80880a153 +SHA512: 1c78feeccf7bdb1566df8fac990e7ddae348c1574068e630db76eb3273f2068fe16f5c11669b4a623dca0d263438a14423517f3b1926fd5f52bb82861c3ccdb8 +Homepage: https://github.com/tuxera/ntfs-3g/wiki +Description: read/write NTFS driver for FUSE + NTFS-3G uses FUSE (Filesystem in Userspace) to provide support for the NTFS + filesystem used by Microsoft Windows. + +Package: nvme-cli +Architecture: amd64 +Version: 2.16-1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Daniel Baumann +Installed-Size: 2254 +Depends: uuid-runtime, libc6 (>= 2.38), libjson-c5 (>= 0.15), libnvme1t64 (>= 1.16) +Recommends: pci.ids +Filename: pool/nvme-cli_2.16-1_amd64.deb +Size: 901478 +MD5sum: e8e2b45c857d1aa835b4e7ee29ca6f57 +SHA1: ebc26b861032da4c537eb2b0fca5b3a599822206 +SHA256: 2dee6fe3ef62fbd30065759efbc7593a289e8dc0e7b82ecb57d67f518e2dc57e +SHA512: 419ec5a4e89aa676618bc987835c761d64f80540eea44f62ff859288ab0ba57eb8908f9b1b7e0e8042401e91b352be999c8c99e0910a38d69024ed0c224ae1d7 +Homepage: https://github.com/linux-nvme/nvme-cli +Description: NVMe management tool + NVM Express (NVMe) is a interface specification for accessing non-volatile + storage media, typically modern solid state drives (SSDs) through PCI Express + (PCIe). + . + The nvme-cli tool provides management functions for these devices. + +Package: openipmi +Architecture: amd64 +Version: 2.0.37-1build1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Noël Köthe +Installed-Size: 527 +Depends: libc6 (>= 2.42), libopenipmi0t64 (>= 2.0.37), libpopt0 (>= 1.14), libreadline8t64 (>= 6.0), libsnmp40t64 (>= 5.9.4+dfsg) +Recommends: kmod +Filename: pool/openipmi_2.0.37-1build1_amd64.deb +Size: 177814 +MD5sum: 409000fb6a6db59049f182fc6b74e486 +SHA1: b921074b5c2ca6cd9c9e9206fb2aaa1ec71a68bb +SHA256: dac3322406c0453f43e85f14c74fa0f841f3ca0722bd4d3cc7f9a2d1bc11e5d9 +SHA512: 41603e7147e520b6f47db358e53e88ffdf8c5c43037d266295ef41940143e9a8c640c4ae6826f20472d4025317033c5647898a7cd85e7c055fd6f723d705050a +Homepage: https://openipmi.sourceforge.io/ +Description: Intelligent Platform Management Interface (for servers) + IPMI allows remote monitoring and remote management of devices. + . + This package contains some command-line and graphical-user-interfaces + to interact with IPMI-enabled devices. + +Package: openprinting-ppds +Architecture: all +Version: 20250819-1build1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: foomatic-db +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Group +Installed-Size: 8189 +Depends: python3:any, xz-utils +Recommends: cups, cups-client, cups-filters | foomatic-filters +Suggests: hpijs-ppds +Filename: pool/openprinting-ppds_20250819-1build1_all.deb +Size: 6281884 +MD5sum: 190c7cfbee4ee40a392dbd2e319b1b1d +SHA1: dc7489728135322c168433159464eb44c32354d2 +SHA256: 8e99a7573a66559557fde2d2970c7c9ba15d25f9b0c64d4aa8c1ffbbb07ce949 +SHA512: 9005fcf8f8da5f57ca4955be0444c9661e8c355f9bdf6e785865598c0eb306a0a6430d8352e036bf85853f0f2269ea45e0931aefd60c68dffa9b509ab31ac385 +Homepage: https://www.openprinting.org/ +Description: OpenPrinting printer support - PostScript PPD files + This package includes a collection of free PostScript Printer Description + files for PostScript (and clone) printers from various manufacturers, as + distributed by OpenPrinting. + . + If you have non-PostScript printers, the foomatic-db-compressed-ppds (or + foomatic-db and foomatic-db-engine), hplip and the + printer-driver-* packages are the ones you need; this package + won't be of much help to you. + . + Some manufacturers distribute PPD files for their printers under + non-free licenses; those are not included in this package, but may be + available from the manufacturer's website, included on a CD or + other media with the printer, or downloadable from the OpenPrinting + web site (even automatically if the printer setup tool supports it). + +Package: openssh-client +Architecture: amd64 +Version: 1:10.2p1-2ubuntu3.6 +Multi-Arch: foreign +Priority: standard +Section: net +Source: openssh +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenSSH Maintainers +Installed-Size: 3673 +Provides: ssh-client +Depends: adduser, init-system-helpers (>= 1.66~), passwd, libc6 (>= 2.42), libedit2 (>= 2.11-20080614-0), libfido2-1 (>= 1.8.0), libgssapi-krb5-2 (>= 1.17), libselinux1 (>= 3.1~), libssl3t64 (>= 3.0.0), zlib1g (>= 1:1.1.4) +Recommends: xauth +Suggests: keychain, libpam-ssh, monkeysphere, ssh-askpass +Breaks: openssh-sk-helper +Replaces: openssh-sk-helper, ssh, ssh-krb5 +Filename: pool/openssh-client_1%3a10.2p1-2ubuntu3.6_amd64.deb +Size: 935454 +MD5sum: 94e77cf2ad61c304f62990a3928ef9d4 +SHA1: 3ad4fb5dce9fb75d772f4459dac5e56f274dfacf +SHA256: d47ae7d97b3751264f921cc3df09a70915e85ad980c94b99e651e21c36e3d987 +SHA512: bb50631fe8590e53069e3bc9a8821fcd41801845e343da8a61fd312315c57c476a0f14ae62c61e5705e0d4be96068fededf7cfcf9f6181a9145126b616f2bc09 +Homepage: https://www.openssh.com/ +Description: secure shell (SSH) client, for secure access to remote machines + This is the portable version of OpenSSH, a free implementation of + the Secure Shell protocol as specified by the IETF secsh working + group. + . + Ssh (Secure Shell) is a program for logging into a remote machine + and for executing commands on a remote machine. + It provides secure encrypted communications between two untrusted + hosts over an insecure network. X11 connections and arbitrary TCP/IP + ports can also be forwarded over the secure channel. + It can be used to provide applications with a secure communication + channel. + . + This package provides the ssh, scp and sftp clients, the ssh-agent + and ssh-add programs to make public key authentication more convenient, + and the ssh-keygen, ssh-keyscan, ssh-copy-id and ssh-argv0 utilities. + . + In some countries it may be illegal to use any encryption at all + without a special permit. + . + ssh replaces the insecure rsh, rcp and rlogin programs, which are + obsolete for most purposes. + +Package: openssh-server +Architecture: amd64 +Version: 1:10.2p1-2ubuntu3.6 +Multi-Arch: foreign +Priority: optional +Section: net +Source: openssh +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenSSH Maintainers +Installed-Size: 2835 +Provides: ssh-server +Depends: libpam-modules, libpam-runtime, lsb-base, openssh-client (= 1:10.2p1-2ubuntu3.6), openssh-sftp-server, procps, ucf, debconf (>= 0.5) | debconf-2.0, systemd | systemd-standalone-sysusers | systemd-sysusers, libaudit1 (>= 1:2.2.1), libc6 (>= 2.42), libcom-err2 (>= 1.43.9), libcrypt1 (>= 1:4.1.0), libgssapi-krb5-2 (>= 1.17), libkrb5-3 (>= 1.13~alpha1+dfsg), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), libssl3t64 (>= 3.0.0), libwrap0 (>= 7.6-4~), zlib1g (>= 1:1.1.4) +Recommends: default-logind | logind | libpam-systemd, ncurses-term, xauth, ssh-import-id +Suggests: molly-guard, monkeysphere, ssh-askpass, ufw +Replaces: openssh-client (<< 1:7.9p1-8), ssh, ssh-krb5 +Filename: pool/openssh-server_1%3a10.2p1-2ubuntu3.6_amd64.deb +Size: 621574 +MD5sum: a76c498345aa97cd8c22ba2fdc08bc2b +SHA1: 4dede1f3084934df2060105a98a7de16a7843e82 +SHA256: 108256262b0fb7bb8eddd92e87230f775c90eb321413e8789754b3509f7b55c6 +SHA512: 51adc47511e591898a4e6a684412ef0cdfebf2e498de0fcd99cfbd42fb01396301a9325cf15fbe2524b0619bfd125adcab0346b914f75367b48f8f7e2c3b03bb +Homepage: https://www.openssh.com/ +Description: secure shell (SSH) server, for secure access from remote machines + This is the portable version of OpenSSH, a free implementation of + the Secure Shell protocol as specified by the IETF secsh working + group. + . + Ssh (Secure Shell) is a program for logging into a remote machine + and for executing commands on a remote machine. + It provides secure encrypted communications between two untrusted + hosts over an insecure network. X11 connections and arbitrary TCP/IP + ports can also be forwarded over the secure channel. + It can be used to provide applications with a secure communication + channel. + . + This package provides the sshd server. + . + In some countries it may be illegal to use any encryption at all + without a special permit. + . + sshd replaces the insecure rshd program, which is obsolete for most + purposes. + +Package: openssh-sftp-server +Architecture: amd64 +Version: 1:10.2p1-2ubuntu3.6 +Multi-Arch: foreign +Priority: optional +Section: net +Source: openssh +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenSSH Maintainers +Installed-Size: 101 +Depends: openssh-client (= 1:10.2p1-2ubuntu3.6), libc6 (>= 2.38) +Recommends: openssh-server | ssh-server +Breaks: openssh-server (<< 1:6.5p1-5) +Replaces: openssh-server (<< 1:6.5p1-5) +Enhances: openssh-server, ssh-server +Filename: pool/openssh-sftp-server_1%3a10.2p1-2ubuntu3.6_amd64.deb +Size: 37440 +MD5sum: 04a75d40a919ee5be7aefe2d5e3be123 +SHA1: b9f2bcb0b29d840d08cb8dfa3494fa4d20061665 +SHA256: 16bfb714d404ccbee3623d08f280a3671512ecbe9590565fac621c85bcee7766 +SHA512: f2ce3e3a384878591abf5e0c4365e41958a6c94f692d432ebd3f69336c812f56f4305f9a202c8ea3040c6fd683646f306c4007a7df44f7b503c8b4ee1128f551 +Homepage: https://www.openssh.com/ +Description: secure shell (SSH) sftp server module, for SFTP access from remote machines + This is the portable version of OpenSSH, a free implementation of + the Secure Shell protocol as specified by the IETF secsh working + group. + . + Ssh (Secure Shell) is a program for logging into a remote machine + and for executing commands on a remote machine. + It provides secure encrypted communications between two untrusted + hosts over an insecure network. X11 connections and arbitrary TCP/IP + ports can also be forwarded over the secure channel. + It can be used to provide applications with a secure communication + channel. + . + This package provides the SFTP server module for the SSH server. It + is needed if you want to access your SSH server with SFTP. The SFTP + server module also works with other SSH daemons like dropbear. + . + OpenSSH's sftp and sftp-server implement revision 3 of the SSH filexfer + protocol described in: + . + http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt + . + Newer versions of the draft will not be supported, though some features + are individually implemented as extensions. + +Package: openssl +Architecture: amd64 +Version: 3.5.5-1ubuntu3.5 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenSSL Team +Installed-Size: 2523 +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.5.0) +Suggests: ca-certificates +Filename: pool/openssl_3.5.5-1ubuntu3.5_amd64.deb +Size: 1242916 +MD5sum: 731d287f0a5a9437b4adb4a920297a93 +SHA1: f338dcf6df8fcfb104059cc6228040c8f9560d00 +SHA256: 0cea6b98673ff88218b7e5f18c1bd42f06bdfcae6c1ebc9964adf3bc41420c19 +SHA512: 913e266cc9fbbb7166ba47a752dda0f26071ac0f6019211e087d9784c72288a8b3f3e029c51fe37902aa84f91cc642a919d464489f883272bd1e54b6359c128c +Homepage: https://openssl-library.org +Description: Secure Sockets Layer toolkit - cryptographic utility + This package is part of the OpenSSL project's implementation of the SSL + and TLS cryptographic protocols for secure communication over the + Internet. + . + It contains the general-purpose command line binary /usr/bin/openssl, + useful for cryptographic operations such as: + * creating RSA, DH, and DSA key parameters; + * creating X.509 certificates, CSRs, and CRLs; + * calculating message digests; + * encrypting and decrypting with ciphers; + * testing SSL/TLS clients and servers; + * handling S/MIME signed or encrypted mail. + +Package: openvpn +Architecture: amd64 +Version: 2.7.0-1ubuntu1.2 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: OpenVPN Maintainers +Installed-Size: 1834 +Depends: debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.38), libcap-ng0 (>= 0.7.9), liblz4-1 (>= 0.0~r113), liblzo2-2 (>= 2.02), libnl-3-200 (>= 3.11.0), libnl-genl-3-200 (>= 3.11.0), libpam0g (>= 0.99.7.1), libpkcs11-helper1t64 (>= 1.28), libssl3t64 (>= 3.2.0), libsystemd0 +Suggests: openssl, openvpn-systemd-resolved, resolvconf, easy-rsa +Filename: pool/openvpn_2.7.0-1ubuntu1.2_amd64.deb +Size: 706598 +MD5sum: e5c1c00c456ce80019e23c7f31dc650c +SHA1: 19758ba138d0b1dcdac8f035b4f743944ecffe63 +SHA256: ae6c69da5eb4077f39f8d12827d7603d7294ffb0ea733ca32b643ddeffecd032 +SHA512: 4f379103171a6e040ac5df52e88b18ed82206830880362646aef5e0e93ffe79854fb05410b38d333738186e2b46eb25a7c33f50bae1ea4072c75ae0848c3ab68 +Homepage: https://openvpn.net/community/ +Description: virtual private network daemon + OpenVPN is an application to securely tunnel IP networks over a + single UDP or TCP port. It can be used to access remote sites, make + secure point-to-point connections, enhance wireless security, etc. + . + OpenVPN uses all of the encryption, authentication, and certification + features provided by the OpenSSL library (any cipher, key size, or + HMAC digest). + . + OpenVPN may use static, pre-shared keys or TLS-based dynamic key exchange. It + also supports VPNs with dynamic endpoints (DHCP or dial-up clients), tunnels + over NAT or connection-oriented stateful firewalls (such as Linux's iptables). + +Package: orca +Architecture: all +Version: 50.2-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 6196 +Depends: dconf-gsettings-backend | gsettings-backend, python3:any, gir1.2-glib-2.0, gir1.2-gtk-3.0, gir1.2-pango-1.0, gir1.2-wnck-3.0, gir1.2-gstreamer-1.0, gstreamer1.0-plugins-good, gir1.2-atspi-2.0 (>= 2.56.0~), python3-brlapi, python3-cairo, python3-gi, python3-louis, at-spi2-core (>= 2.56.0~), python3-speechd, python3-dasbus, python3-dbus, python3-setproctitle, python3-psutil, speech-dispatcher, gsettings-desktop-schemas +Recommends: xbrlapi +Suggests: brltty +Breaks: ubuntu-mate-default-settings (<< 26.04) +Replaces: ubuntu-mate-default-settings (<< 26.04) +Filename: pool/orca_50.2-0ubuntu0.1_all.deb +Size: 611866 +MD5sum: c8eb22dfd24453cc1b10d89ec28fa436 +SHA1: f5da53729e19fa684ae8bf8dc570bff83c3fd562 +SHA256: abba2a0f5231c4cd4237e6cc2989166e242682e69bf0a1ad3245701b1f6ccbeb +SHA512: d09df774f91c7c4a449fe32af16473b675d8b27340d6afd7bad82171a8b41bd461b04166cb18f09fe56e0c5645ce520ab9757b48b15bc8cecb8a5d37f5dedb7a +Homepage: https://wiki.gnome.org/Projects/Orca +Description: Scriptable screen reader + A flexible, extensible, and powerful assistive technology that + provides end-user access to applications and toolkits that support the + AT-SPI (e.g., the GNOME desktop). + . + Orca defines a set of default behaviors (reactions to application events) and + key bindings (reaction to user key presses). These default behaviors and key + bindings can be overwritten on a per-application basis. Orca creates a script + object for each running application, which merges both the default behaviors + and key bindings, and the application specific ones. Orca provides the + infrastructure to activate and deactivate scripts, as well as a host of + services accessible from within the scripts. + +Package: os-prober +Architecture: amd64 +Version: 1.84ubuntu1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Install System Team +Installed-Size: 85 +Depends: grub-common, mount +Recommends: util-linux (>> 2.37.2) +Filename: pool/os-prober_1.84ubuntu1_amd64.deb +Size: 18684 +MD5sum: a373965352bcaa1b35686f86d693266c +SHA1: 5c08f3983b0191b0cd25531eb3d79415512a801e +SHA256: 16fe1703355df54a48d16942647448f9313895bd9750b33a92d3f1e64087af63 +SHA512: 73c176d76ad7299f283e1adec3e18d260f340aad72e4278e1e8feabbe1a0ac45d873a4ccec74861e62f6917ffae64e577112a2dfbe4bf29d5e8b447fc077b310 +Description: utility to detect other OSes on a set of drives + This package detects other OSes available on a system and outputs the + results in a generic machine-readable format. + +Package: p11-kit +Architecture: amd64 +Version: 0.26.2-2 +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuTLS Maintainers +Installed-Size: 744 +Depends: p11-kit-modules (>= 0.26.2-2), libc6 (>= 2.38), libp11-kit0 (>= 0.25.1), libtasn1-6 (>= 4.14) +Filename: pool/p11-kit_0.26.2-2_amd64.deb +Size: 152784 +MD5sum: 98dd0acadfcdc374e3485c2245a9a676 +SHA1: 38d817be3cb54151e6719633dfd217a99eacc46b +SHA256: 3a61dfa5b4d04d204b38c5f555e8e916427f175f04e29dec4f6cf7b787d54a5d +SHA512: f5854f2ffa07c99d2250286b5eb01cc59d6fe2ec283a0df22deeda4d5d6dbcc589bfa4bdbb69417131a90d17f7000902a3eb9c949f76ee503dda157817b7888c +Homepage: https://p11-glue.github.io/p11-glue/p11-kit.html +Description: p11-glue utilities + The p11-kit library provides a way to load and enumerate Public-Key + Cryptography Standard #11 modules, along with a standard configuration + setup for installing PKCS#11 modules so that they're discoverable. It + also solves problems with coordinating the use of PKCS#11 by different + components or libraries living in the same process. + . + This package contains the p11-kit tool for listing PKCS#11 modules. + +Package: p11-kit-modules +Architecture: amd64 +Version: 0.26.2-2 +Multi-Arch: same +Priority: optional +Section: misc +Source: p11-kit +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuTLS Maintainers +Installed-Size: 2130 +Depends: libp11-kit0 (= 0.26.2-2), libc6 (>= 2.38), libffi8 (>= 3.4), libtasn1-6 (>= 4.14) +Filename: pool/p11-kit-modules_0.26.2-2_amd64.deb +Size: 355018 +MD5sum: 06f6801ae9e51b80a3353ff8287baee3 +SHA1: 47577f75d202ba84318d333284de239d8499d2b9 +SHA256: 633ac53737f9a284acc3df4d1d717857902fe04a222f19331c7b18092fe2448b +SHA512: 2fc3ca3771bb971c31648f40313400f4bca50d18ca7880588f4b60efde5d3dff77fbf4fcea83279b415a37c3c4718ddf04a27d3487cf515cc5b8830f2fb89bd3 +Homepage: https://p11-glue.github.io/p11-glue/p11-kit.html +Description: p11-glue proxy and trust modules + The p11-kit library provides a way to load and enumerate Public-Key + Cryptography Standard #11 modules, along with a standard configuration + setup for installing PKCS#11 modules so that they're discoverable. It + also solves problems with coordinating the use of PKCS#11 by different + components or libraries living in the same process. + . + This package contains the p11-kit proxy module and the system trust + policy module. + +Package: packagekit +Architecture: amd64 +Version: 1.3.4-3ubuntu1.2 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klumpp +Installed-Size: 1776 +Depends: libglib2.0-bin, polkitd, libappstream5 (>= 1.0.0), libapt-pkg7.0 (>= 1.9.2), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.80.0), libgstreamer1.0-0 (>= 1.0.0), libjansson4 (>= 2.14), libpackagekit-glib2-18 (>= 1.3.3), libpolkit-gobject-1-0 (>= 0.99), libsqlite3-0 (>= 3.5.9), libstdc++6 (>= 13.1), libsystemd0 (>= 214) +Recommends: appstream +Breaks: plymouth (<< 0.9.5) +Filename: pool/packagekit_1.3.4-3ubuntu1.2_amd64.deb +Size: 505628 +MD5sum: ed206b5789b26b03e933440ba22f544d +SHA1: c764e57405e5108dee1146cb2ddecb8b3f131e5c +SHA256: 45df03f3b6755f67fcecf5de1624e1ae8ec4808cf6804da47693e17bc5bd51b7 +SHA512: 31e4e15d349292cbf524007b42b5e2b3a6ae303a9c9724c79e583f1f26f8411355043646e1a3823b9786904fcc41ded2740db170c5186085750c4f67eb5b2221 +Homepage: https://www.freedesktop.org/software/PackageKit/ +Description: Provides a package management service + PackageKit allows performing simple software management tasks over a DBus + interface e.g. refreshing the cache, updating, installing and removing + software packages or searching for multimedia codecs and file handlers. + . + The work is done by backends which make use of the package manager shipped by + the corresponding distribution. PackageKit is not meant to replace + advanced tools like Synaptic. + . + Its main benefits are: + - Unified developer and user interface on many distributions + - Fine-grained permission control via PolicyKit + - On-demand installation of missing system components + +Package: papers +Architecture: amd64 +Version: 50.2-0ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 7907 +Provides: djvu-viewer, pdf-viewer +Depends: gsettings-desktop-schemas, libppsdocument-4.0-6 (= 50.2-0ubuntu0.1), libppsview-4.0-5 (= 50.2-0ubuntu0.1), papers-common (>= 50.2-0ubuntu0.1), shared-mime-info, dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.39), libgcc-s1 (>= 4.2), libgdk-pixbuf-2.0-0 (>= 2.40), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.17.1), libnautilus-extension4 (>= 43), libpango-1.0-0 (>= 1.50.3) +Suggests: gvfs, nautilus-sendto, poppler-data, unrar +Enhances: nautilus +Filename: pool/papers_50.2-0ubuntu0.1_amd64.deb +Size: 2057380 +MD5sum: 2f624dcaf9f1cf7d21a8fcace58a3351 +SHA1: 4c87ec7f1f1117c3bba2918af9e0c8840fc8367f +SHA256: 6f1553f6594ae26bac5d3e6778cce8070ce3778656bb05325787946bfbad1e0a +SHA512: 539d76acbe257c643248c67e09b5d1262f7d4d7f1ad29c2d0342081453f725567b1033c0526527ff16b732ba9437d4c0e4af59d8def3a2c0c4a63c6a6e878bce +Homepage: https://apps.gnome.org/Papers/ +Description: PDF document viewer for GNOME + Papers is a simple multi-page document viewer. It can display and print + Comic Books archives (CBR, CBT, CBZ, CB7), DjVu, Portable Document + Format (PDF) and TIFF files. When supported by the document, it also + allows searching for text, copying text to the clipboard, hypertext + navigation, and table-of-contents bookmarks. + +Package: papers-common +Architecture: all +Version: 50.2-0ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: papers +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1408 +Filename: pool/papers-common_50.2-0ubuntu0.1_all.deb +Size: 114984 +MD5sum: 5cf29fab36542e15d25a6c9013988eba +SHA1: f181aa9a5509340d8ccd4502e88aad99b7f6f0d2 +SHA256: c38b589c28febc104e84048afe834a43288a34cd0ca367b7eabb3d86e6741420 +SHA512: 036d4a1861cb427fdad02b924be20399bd53c395d2a31eb79e0f131057bce946bee0d836a1269eb994b10ddb94a23a7e8d855c27270c0e941a9a0ab7f3b513d9 +Homepage: https://apps.gnome.org/Papers/ +Description: PDF document viewer for GNOME - common files + Papers is a simple multi-page document viewer. It can display and print + Comic Books archives (CBR, CBT, CBZ, CB7), DjVu, Portable Document + Format (PDF) and TIFF files. When supported by the document, it also + allows searching for text, copying text to the clipboard, hypertext + navigation, and table-of-contents bookmarks. + . + This package contains architecture-independent files for papers. + +Package: parted +Architecture: amd64 +Version: 3.6-6 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Parted Maintainer Team +Installed-Size: 130 +Depends: libparted2t64 (= 3.6-6), libc6 (>= 2.38), libreadline8t64 (>= 6.0), libtinfo6 (>= 6), libuuid1 (>= 2.16) +Suggests: parted-doc +Conflicts: parted-doc (<< 3.5-2~) +Filename: pool/parted_3.6-6_amd64.deb +Size: 43842 +MD5sum: f060e6ff54d74c78359b3cd4e6c4cf5d +SHA1: 83de3b5ac99a1680a2600559f83b3333992996cb +SHA256: 91dd4af8802c8f9b7faa53031dad52b8a344ef3ee659514f7c641576e3b3debf +SHA512: 9d8abf17c7c9bc88ee5b392beb3a0d0c4e8c7e489096fa65dfe347491ea2d92cf56bdf5fcb765405d8af818afafdd25904587a62c2426f3e4189836d4fd24836 +Homepage: https://www.gnu.org/software/parted +Description: disk partition manipulator + GNU Parted is a program that allows you to create, destroy, resize, + move, and copy disk partitions. This is useful for creating space + for new operating systems, reorganizing disk usage, and copying data + to new hard disks. + . + This package contains the binary and manual page. Further + documentation is available in parted-doc. + . + Parted currently supports DOS, Mac, Sun, BSD, GPT, MIPS, and PC98 + partitioning formats, as well as a "loop" (raw disk) type which + allows use on RAID/LVM. It can detect and remove ASFS/AFFS/APFS, + Btrfs, ext2/3/4, FAT16/32, HFS, JFS, linux-swap, UFS, XFS, and ZFS + file systems. Parted also has the ability to create and modify file + systems of some of these types, but using it to perform file system + operations is now deprecated. + . + The nature of this software means that any bugs could cause massive + data loss. While there are no such bugs known at the moment, they + could exist, so please back up all important files before running + it, and do so at your own risk. + +Package: patch +Architecture: amd64 +Version: 2.8-2build1 +Multi-Arch: foreign +Priority: optional +Section: vcs +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 198 +Depends: libc6 (>= 2.34) +Suggests: ed, diffutils-doc +Filename: pool/patch_2.8-2build1_amd64.deb +Size: 95680 +MD5sum: decd52c1757fea166febb92dfda1ab1b +SHA1: 392b3aa541aefd81dfe880d970fd18e5836f13fe +SHA256: 0e5a899095d92d6db9585183a5225504f5dc5ecaffdfe2a25d745a9502de3b30 +SHA512: 0beb38611e345cd0fc972e73805c51a92f897b9bed372b0fd0310df06cd2bbc4c2c373ce668479147e5a165f160857ee7386146b5a12ed7b9bb387f32838d768 +Homepage: https://savannah.gnu.org/projects/patch/ +Description: Apply a diff file to an original + Patch will take a patch file containing any of the four forms + of difference listing produced by the diff program and apply + those differences to an original file, producing a patched + version. + +Package: pci.ids +Architecture: all +Version: 0.0~2026.02.12-1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 1561 +Filename: pool/pci.ids_0.0~2026.02.12-1_all.deb +Size: 298774 +MD5sum: ca63d3b6d1d0d2f3cf6b56ec8b939d3f +SHA1: 9595b0c2e4b6a388f3d481efab2d91b97ed8d8a4 +SHA256: 0ff0f097128bad2652dae41b8afa2266dfeec939935f43b0a87a50bc17e2f77d +SHA512: 10e8cb7400c69bd7b8c3acf2a9308de2029ae431e4327b818d8de6f601ffae0e780f488e827b066bc3ac229f087466167f0a9db1857ab5c9f5cb4184ac6685c3 +Homepage: https://pci-ids.ucw.cz/ +Description: PCI ID Repository + This package contains the pci.ids file, a public repository of all known + ID's used in PCI devices: ID's of vendors, devices, subsystems and device + classes. It is used in various programs to display full human-readable + names instead of cryptic numeric codes. + +Package: pciutils +Architecture: amd64 +Version: 1:3.14.0-1build2 +Multi-Arch: foreign +Priority: standard +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 256 +Depends: libc6 (>= 2.38), libkmod2 (>= 5~), libpci3 (= 1:3.14.0-1build2) +Suggests: bzip2, wget | curl | lynx +Filename: pool/pciutils_1%3a3.14.0-1build2_amd64.deb +Size: 95452 +MD5sum: 699ee0729280f581941f6a214b753aae +SHA1: bf1fcfb01e9de691ad4a37eb3f0f1ef13011748b +SHA256: 9365cca3e3e97f58cd8f6f31c82492ae03e0f33c85c46c177ff19b045978541a +SHA512: 9cfef5c49cb45ca7a5ff272359109b8a214304f6223fe02fb50c8b6dab0290bb6925fe4a798b3c7aefc8007ca4c975f7124f7054188d405bf668f0935cc69d52 +Homepage: https://mj.ucw.cz/sw/pciutils/ +Description: PCI utilities + This package contains various utilities for inspecting and setting of + devices connected to the PCI bus. + +Package: pcmciautils +Architecture: amd64 +Version: 018-19 +Priority: optional +Section: admin +Maintainer: Colin Watson +Installed-Size: 92 +Depends: libc6 (>= 2.38) +Recommends: udev +Suggests: wireless-tools +Filename: pool/pcmciautils_018-19_amd64.deb +Size: 26296 +MD5sum: 066bf737b1b590b265a384264d4aef54 +SHA1: 26be93dabbcd2da2431e8a51f4c7a49d7421b11d +SHA256: a4419de089412644665f8ded9868449f61dedff7e132020c80c5c3bceeaba1cf +SHA512: b6b5e20684ea236b460f7474e64eb152db6d2743c89a4cd160e410a172467923b27fa323b444885b1aabb78fcac1fe75b51d2c371a11e8cc283f886368085900 +Homepage: https://www.kernel.org/pub/linux/utils/kernel/pcmcia/ +Description: PCMCIA utilities for Linux 2.6 + This package provides PCMCIA initialisation tools for Linux 2.6.13-rc1 or + later, replacing the old pcmcia-cs tools used with earlier kernel versions. + PCMCIA cards are commonly used in laptops to provide expanded capabilities + such as network connections, modems, increased memory, etc. + . + To use PCMCIA you need to have kernel modules available to support + it. These are included in the stock Debian 2.6 kernel packages. You + will most likely also need udev, although it isn't always required. + . + The wireless-tools package is required by many wireless network adapters. + +Package: perl +Architecture: amd64 +Version: 5.40.1-7ubuntu0.3 +Multi-Arch: allowed +Priority: standard +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Niko Tyni +Installed-Size: 836 +Provides: libansicolor-perl (= 5.01), libarchive-tar-perl (= 3.02.001), libattribute-handlers-perl (= 1.03), libautodie-perl (= 2.37), libcompress-raw-bzip2-perl (= 2.212), libcompress-raw-zlib-perl (= 2.212), libcompress-zlib-perl (= 2.212), libcpan-meta-perl (= 2.150010), libcpan-meta-requirements-perl (= 2.143), libcpan-meta-yaml-perl (= 0.018), libdigest-md5-perl (= 2.58.01), libdigest-perl (= 1.20), libdigest-sha-perl (= 6.04), libencode-perl (= 3.21), libexperimental-perl (= 0.032), libextutils-cbuilder-perl (= 0.280240), libextutils-command-perl (= 7.70), libextutils-install-perl (= 2.22), libextutils-parsexs-perl (= 3.510000), libfile-spec-perl (= 3.9100), libhttp-tiny-perl (= 0.088), libi18n-langtags-perl (= 0.45), libio-compress-base-perl (= 2.212), libio-compress-bzip2-perl (= 2.212), libio-compress-perl (= 2.212), libio-compress-zlib-perl (= 2.212), libio-zlib-perl (= 1.15), libjson-pp-perl (= 4.16000), liblocale-maketext-perl (= 1.33), liblocale-maketext-simple-perl (= 0.21.01), libmath-bigint-perl (= 2.003002), libmath-complex-perl (= 1.6200), libmime-base64-perl (= 3.16.01), libmodule-corelist-perl (= 5.20250118.40), libmodule-load-conditional-perl (= 0.74), libmodule-load-perl (= 0.36), libmodule-metadata-perl (= 1.000038), libnet-perl (= 1:3.15), libnet-ping-perl (= 2.76), libparams-check-perl (= 0.38), libparent-perl (= 0.241), libparse-cpan-meta-perl (= 2.150010), libperl-ostype-perl (= 1.010), libpod-escapes-perl (= 1.07), libpod-simple-perl (= 3.45), libstorable-perl (= 3.32), libsys-syslog-perl (= 0.36), libterm-table-perl (= 0.018), libtest-harness-perl (= 3.48), libtest-simple-perl (= 1.302199), libtest-tester-perl (= 1.302199), libtest-use-ok-perl (= 1.302199), libtext-balanced-perl (= 2.06), libthread-queue-perl (= 3.14), libthreads-perl (= 2.40), libthreads-shared-perl (= 1.69), libtime-hires-perl (= 1.9777), libtime-local-perl (= 1.3500), libtime-piece-perl (= 1.3401.01), libunicode-collate-perl (= 1.31), libversion-perl (= 1:0.9930), libversion-requirements-perl, podlators-perl (= 5.01.02) +Depends: perl-base (= 5.40.1-7ubuntu0.3), perl-modules-5.40 (>= 5.40.1-7ubuntu0.3), libperl5.40 (= 5.40.1-7ubuntu0.3) +Recommends: netbase +Suggests: perl-doc, libterm-readline-gnu-perl | libterm-readline-perl-perl, make, libtap-harness-archive-perl +Conflicts: libjson-pp-perl (<< 2.27200-2) +Breaks: apt-show-versions (<< 0.22.10), libdist-inkt-perl (<< 0.024-5), libmarc-charset-perl (<< 1.35-3), libperl-dev (<< 5.24.0~), perl-doc (<< 5.40.1-1), perl-modules-5.22, perl-modules-5.24, perl-modules-5.26 (<< 5.26.2-5) +Replaces: perl-base (<< 5.36.0-2), perl-modules (<< 5.22.0~) +Filename: pool/perl_5.40.1-7ubuntu0.3_amd64.deb +Size: 262084 +MD5sum: 8012252a4d54672758642f362bedcd4f +SHA1: 0774b5967f4115fb50889531eb1c2b2ae033de22 +SHA256: e06e80879beca89fc363a5ecbc0e15ceae68aed20bc8e4ea952a10d45f69a47d +SHA512: 88bca9c9fd72eea06dd18937ac39f4fbbf6029e15e2716ff73299278253e048474332bbea2596df8dfadd52aeeee615f6749e15f2bf5329ef88ad46a8e48083e +Homepage: https://dev.perl.org/perl5/ +Description: Larry Wall's Practical Extraction and Report Language + Perl is a highly capable, feature-rich programming language with over + 20 years of development. Perl 5 runs on over 100 platforms from + portables to mainframes. Perl is suitable for both rapid prototyping + and large scale development projects. + . + Perl 5 supports many programming styles, including procedural, + functional, and object-oriented. In addition to this, it is supported + by an ever-growing collection of reusable modules which accelerate + development. Some of these modules include Web frameworks, database + integration, networking protocols, and encryption. Perl provides + interfaces to C and C++ for custom extension development. + +Package: perl-modules-5.40 +Architecture: all +Version: 5.40.1-7ubuntu0.3 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Niko Tyni +Installed-Size: 19985 +Provides: perl-modules +Depends: perl-base (>= 5.40.1-1) +Recommends: perl (>= 5.40.1-1) +Conflicts: perl-modules (<< 5.22.0~) +Breaks: libansicolor-perl (<< 5.01), libarchive-tar-perl (<< 3.02.001), libattribute-handlers-perl (<< 1.03), libautodie-perl (<< 2.37), libcpan-meta-perl (<< 2.150010), libcpan-meta-requirements-perl (<< 2.143), libcpan-meta-yaml-perl (<< 0.018), libdigest-perl (<< 1.20), libexperimental-perl (<< 0.032), libextutils-cbuilder-perl (<< 0.280240), libextutils-command-perl (<< 7.70), libextutils-install-perl (<< 2.22), libextutils-parsexs-perl (<< 3.510000), libfile-spec-perl (<< 3.9100), libhttp-tiny-perl (<< 0.088), libi18n-langtags-perl (<< 0.45), libio-zlib-perl (<< 1.15), libjson-pp-perl (<< 4.16000), liblocale-maketext-perl (<< 1.33), liblocale-maketext-simple-perl (<< 0.21.01), libmath-bigint-perl (<< 2.003002), libmath-complex-perl (<< 1.6200), libmodule-corelist-perl (<< 5.20250118.40), libmodule-load-conditional-perl (<< 0.74), libmodule-load-perl (<< 0.36), libmodule-metadata-perl (<< 1.000038), libnet-perl (<< 1:3.15), libnet-ping-perl (<< 2.76), libparams-check-perl (<< 0.38), libparent-perl (<< 0.241), libparse-cpan-meta-perl (<< 2.150010), libperl-ostype-perl (<< 1.010), libpod-escapes-perl (<< 1.07), libpod-simple-perl (<< 3.45), libterm-table-perl (<< 0.018), libtest-harness-perl (<< 3.48), libtest-simple-perl (<< 1.302199), libtest-tester-perl (<< 1.302199), libtest-use-ok-perl (<< 1.302199), libtest2-suite-perl (<< 0.000162), libtext-balanced-perl (<< 2.06), libthread-queue-perl (<< 3.14), libtime-local-perl (<< 1.3500), libunicode-collate-perl (<< 1.31), libversion-perl (<< 1:0.9930), maildirsync (<< 1.2-2.1), perl (<< 5.40.1~), podlators-perl (<< 5.01.02) +Replaces: libansicolor-perl (<< 5.01), libarchive-tar-perl (<< 3.02.001), libattribute-handlers-perl (<< 1.03), libautodie-perl (<< 2.37), libcpan-meta-perl (<< 2.150010), libcpan-meta-requirements-perl (<< 2.143), libcpan-meta-yaml-perl (<< 0.018), libdigest-perl (<< 1.20), libexperimental-perl (<< 0.032), libextutils-cbuilder-perl (<< 0.280240), libextutils-command-perl (<< 7.70), libextutils-install-perl (<< 2.22), libextutils-parsexs-perl (<< 3.510000), libfile-spec-perl (<< 3.9100), libhttp-tiny-perl (<< 0.088), libi18n-langtags-perl (<< 0.45), libio-zlib-perl (<< 1.15), libjson-pp-perl (<< 4.16000), liblocale-maketext-perl (<< 1.33), liblocale-maketext-simple-perl (<< 0.21.01), libmath-bigint-perl (<< 2.003002), libmath-complex-perl (<< 1.6200), libmodule-corelist-perl (<< 5.20250118.40), libmodule-load-conditional-perl (<< 0.74), libmodule-load-perl (<< 0.36), libmodule-metadata-perl (<< 1.000038), libnet-perl (<< 1:3.15), libnet-ping-perl (<< 2.76), libparams-check-perl (<< 0.38), libparent-perl (<< 0.241), libparse-cpan-meta-perl (<< 2.150010), libperl-ostype-perl (<< 1.010), libpod-escapes-perl (<< 1.07), libpod-simple-perl (<< 3.45), libterm-table-perl (<< 0.018), libtest-harness-perl (<< 3.48), libtest-simple-perl (<< 1.302199), libtest-tester-perl (<< 1.302199), libtest-use-ok-perl (<< 1.302199), libtest2-suite-perl (<< 0.000162), libtext-balanced-perl (<< 2.06), libthread-queue-perl (<< 3.14), libtime-local-perl (<< 1.3500), libunicode-collate-perl (<< 1.31), libversion-perl (<< 1:0.9930), perl-base (<< 5.22.0~), perl-modules, podlators-perl (<< 5.01.02) +Filename: pool/perl-modules-5.40_5.40.1-7ubuntu0.3_all.deb +Size: 3212300 +MD5sum: 68a9d81b2291bc2c4306bb2f53ab0e29 +SHA1: 95eb576a89e3b1966f4c7edbbdfd0f66f7f47f78 +SHA256: 19c81efa2c37662080df7d44289b9b5c516205ee8cf9c54410b0031ff2208e41 +SHA512: d6dcaf04538e2469c3ca640cb873a1a169e0fef43f2ff1d84c62cf4058e40f953744180c5b557729b091803466e78749da191d18c864a43f056fee9175665e05 +Homepage: https://dev.perl.org/perl5/ +Description: Core Perl modules + Architecture independent Perl modules. These modules are part of Perl and + required if the `perl' package is installed. + . + Note that this package only exists to save archive space and should be + considered an internal implementation detail of the `perl' package. + Other packages should not depend on `perl-modules-5.40' directly, they + should use `perl' (which depends on `perl-modules-5.40') instead. + +Package: perl-openssl-defaults +Architecture: amd64 +Version: 7build4 +Multi-Arch: same +Priority: optional +Section: perl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Perl Group +Installed-Size: 27 +Provides: dh-sequence-perl-openssl, perl-openssl-abi-3 +Depends: libc6 (>= 2.34), libssl3t64 (>= 3.0.0) +Suggests: debhelper +Filename: pool/perl-openssl-defaults_7build4_amd64.deb +Size: 6710 +MD5sum: b4cde5313cb8104c9cbf92ae448a5a00 +SHA1: 5a289447df8dd5477ce75b28f45dad99336de73e +SHA256: fbd40b547a3bd8bf626da4405b9c0dd4d623b368daf74eb81292fe896917c91b +SHA512: 8b3bdff142b8b3e7013f828835f41e44c10ce46cb76acc5b7365c5f8d8e94e5dbf727bb5708d3ac89f8bf5c9e48c286c4f78a3c17afc9fd91244f1a5b7e4e102 +Description: version compatibility baseline for Perl OpenSSL packages + A subset of Perl XS module packages expose the OpenSSL binary interface + to Perl code. This can lead to incompatibilities if these packages are + linked against different versions of OpenSSL. + . + This package provides a virtual package "perl-openssl-abi-x" that + corresponds to the libssl-dev package SONAME it was built against. + The packages that need to stay compatible with each other can depend + on this. + . + Tools are also provided for generating this dependency with minimum + hassle. See the instructions in README.Debian. + +Package: pigz +Architecture: amd64 +Version: 2.8-1build1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Eduard Bloch +Installed-Size: 161 +Pre-Depends: dpkg (>= 1.15.6) +Depends: libc6 (>= 2.34), zlib1g (>= 1:1.2.6) +Filename: pool/pigz_2.8-1build1_amd64.deb +Size: 66850 +MD5sum: 70943032693f0429e9c8c76f300859ff +SHA1: a4f88234c3d23790bf90be4bfb246e005e31b443 +SHA256: 9571cde9f1132b2aafe63a0c06aa93342fcd6ee1bad83e681647fe7592acc0db +SHA512: d565a9a364de61a41c946eb1f8aec689812a92505ddc0e9d915e1238edca81f823b8fc3ca9e67935d3153421e8e38b8af24bd4ad0ed236377b5f74dedd4d90e5 +Homepage: http://zlib.net/pigz/ +Description: Parallel Implementation of GZip + pigz, which stands for Parallel Implementation of GZip, is a fully functional + replacement for gzip that takes advantage of multiple processors and multiple + cores when compressing data. + +Package: pinentry-gnome3 +Architecture: amd64 +Version: 1.3.2-3ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: pinentry +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GnuPG Maintainers +Installed-Size: 113 +Provides: pinentry, pinentry-x11 +Depends: gcr, libassuan9 (>= 2.0.1), libc6 (>= 2.38), libgcr-base-3-1 (>= 3.8.0), libglib2.0-0t64 (>= 2.26.0), libgpg-error0 (>= 1.14), libncursesw6 (>= 6), libsecret-1-0 (>= 0.7), libtinfo6 (>= 6) +Recommends: dbus-user-session +Suggests: pinentry-doc +Enhances: gnupg-agent +Filename: pool/pinentry-gnome3_1.3.2-3ubuntu1_amd64.deb +Size: 44340 +MD5sum: ea37d431384650b8e1f4251d5a78788a +SHA1: 84e4855f8a5c759f66c7cdbde90f44b24dd58dee +SHA256: aa23bc62b2cb5a659b3ade1846b3dd317af4bc96da9c607dde234f71253d91d0 +SHA512: 8e4114b1004cce5c948935737b8b45418a3cf6fef84b79448c09c5c05351d27d0eda706927801d39913961bb38424cd77da5753aed9f6f07b8e1376920a120de +Homepage: https://www.gnupg.org/related_software/pinentry/ +Description: GNOME 3 PIN or pass-phrase entry dialog for GnuPG + This package contains a program that allows for secure entry of PINs or + pass phrases. That means it tries to take care that the entered + information is not swapped to disk or temporarily stored anywhere. + This functionality is particularly useful for entering pass phrases + when using encryption software such as GnuPG or e-mail clients using + the same. It uses an open protocol and is therefore not tied to + particular software. + . + The program contained in this package implements a PIN entry dialog + designed for use with GNOME 3. It tries to follow the GNOME Human + Interface Guidelines as much as possible. If the X Window System is + not active then an alternative text-mode dialog will be used. There + are sibling packages that implement PIN entry dialogs using other + tool kits. + +Package: pipewire +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: video +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 141 +Depends: libpipewire-0.3-modules (= 1.6.2-1ubuntu1.1), pipewire-bin (= 1.6.2-1ubuntu1.1), systemd | systemd-standalone-sysusers | systemd-sysusers +Filename: pool/pipewire_1.6.2-1ubuntu1.1_amd64.deb +Size: 108552 +MD5sum: eaa9f54fa52066d3ddfa7d4147bf9cff +SHA1: 1d34174e1f2e80423c4ea4dcb54d89ea829d5f00 +SHA256: b45ea88bc80ee127a6ea8d16c19b965af50613f68d0b5679b80d4bd6eb80394f +SHA512: 4582a9596c5baa15cef1fd86498cc0b2ea3cfade53d7e27fb5c576240e1a5aa12e6ff149a5e2861d076ef7f98d8d2fb7ba7aa11fedcf2abab66909a4ad877349 +Homepage: https://pipewire.org/ +Description: audio and video processing engine multimedia server + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This metapackage makes PipeWire available for programs of the same + architecture, and provides the systemd user service necessary to run + pipewire on-demand. + +Package: pipewire-alsa +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: same +Priority: optional +Section: sound +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 196 +Depends: pipewire (= 1.6.2-1ubuntu1.1), libasound2t64 (>= 1.2.15), libc6 (>= 2.38), libpipewire-0.3-0t64 (= 1.6.2-1ubuntu1.1) +Conflicts: pulseaudio +Breaks: pipewire-audio-client-libraries (<< 0.3.54-1~) +Replaces: pipewire-audio-client-libraries (<< 0.3.54-1~) +Filename: pool/pipewire-alsa_1.6.2-1ubuntu1.1_amd64.deb +Size: 52542 +MD5sum: abed13c57bf9d09d87aeeb2ff4181340 +SHA1: 9b44e1169f9f742624b8babfe728329856329dac +SHA256: eafe997957960a6b3b35f23c4c79159f7b19b58c1b186cfcecf694384aac8bc1 +SHA512: cd85615d4a522559b1fbfba05bf6caef941a64a455972182079dd9ac040e8f2033c5734f93ef82415b572e299ee1e6ddd83586f4a5985ecab2f67f299851bc30 +Homepage: https://pipewire.org/ +Description: PipeWire ALSA plugin, for ALSA applications to output via PipeWire + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains a plugin for ALSA applications to output via PipeWire. + +Package: pipewire-audio +Architecture: all +Version: 1.6.2-1ubuntu1.1 +Priority: optional +Section: sound +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 23 +Depends: libspa-0.2-bluetooth, pipewire-alsa, pipewire-pulse, wireplumber (>= 0.5.0) +Conflicts: pulseaudio, pulseaudio-module-bluetooth +Replaces: pulseaudio, pulseaudio-module-bluetooth +Filename: pool/pipewire-audio_1.6.2-1ubuntu1.1_all.deb +Size: 4098 +MD5sum: edc53eef0276eeb4cd7a6d63dbc40d84 +SHA1: 458bbf2a0fdaeea2c92d08a04e57e57e84456508 +SHA256: 6bdaea8c46846f361f30b82290be8549f99ba17d3ae872d973856dac47f0a875 +SHA512: 6b8bb3f090e0ba6bbd408868500c5d454c4a6e38324c40b2de4277f4ca4a28e98dae024408182f25318b70846c726aa297b8c5bac365288fb2100825dc4ab95f +Homepage: https://pipewire.org/ +Description: recommended set of PipeWire packages for a standard audio desktop use + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This metapackage depends on a recommended set of pipewire packages + for a standard audio desktop use. + +Package: pipewire-bin +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: video +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 2174 +Depends: libpipewire-0.3-modules (= 1.6.2-1ubuntu1.1), libasound2t64 (>= 1.2.6), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libncursesw6 (>= 6), libpipewire-0.3-0t64 (= 1.6.2-1ubuntu1.1), libreadline8t64 (>= 6.0), libsndfile1 (>= 1.0.20), libtinfo6 (>= 6) +Recommends: dbus-user-session, rtkit, wireplumber +Breaks: pipewire (<< 0.3.5) +Replaces: pipewire (<< 0.3.5) +Filename: pool/pipewire-bin_1.6.2-1ubuntu1.1_amd64.deb +Size: 654080 +MD5sum: fcdfef29210568e47cf38c262e355b59 +SHA1: dc81a2fa2da6dbd75d35371518f37254fa09a76c +SHA256: 292e2227c5c1368929a47e2709f92665e1274f6fcd86c876e18c4ae4b3747a71 +SHA512: 17a5c34fbf476571ebe288f313546aeacbebd0191f81d568a93fe12bcc26473914f55ac7abf3799c947196f2da30a597017dd04598364d375765a4b2a6acc86a +Homepage: https://pipewire.org/ +Description: PipeWire multimedia server - programs + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains the server and command-line utilities, and should + not normally be depended on directly. PipeWire clients should depend on + the pipewire package instead. + +Package: pipewire-pulse +Architecture: amd64 +Version: 1.6.2-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: sound +Source: pipewire +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 55 +Depends: pipewire (= 1.6.2-1ubuntu1.1), dconf-gsettings-backend | gsettings-backend +Recommends: wireplumber +Suggests: libspa-0.2-bluetooth, pulseaudio-utils +Conflicts: pulseaudio-module-gsettings +Breaks: pipewire-bin (<< 0.3.27-2) +Replaces: pipewire-bin (<< 0.3.27-2) +Filename: pool/pipewire-pulse_1.6.2-1ubuntu1.1_amd64.deb +Size: 9540 +MD5sum: 7acb431dfbb8c3ed7380266e521a3037 +SHA1: 5dfe6620ee29de52369339770cfa5d284702eb19 +SHA256: 2d618e4e07c61d48c10b2acf89f283191ff3e414530e3e07e0af26a2c187326e +SHA512: 4093d1c69a23e6dd54185e480ec0e57ce0f56e5759ff29325b58690796695cd479683e52d6af3a72720826d2a97282cb0d5bf4eaf2d0921829abe144bb3d7236 +Homepage: https://pipewire.org/ +Description: PipeWire PulseAudio daemon + PipeWire is a server and user space API to deal with multimedia + pipelines. This includes: + . + - Making available sources of audio and video (such as from a capture devices + or application provided streams) and multiplexing this with clients. + - Accessing sources of audio and video for consumption. + - Generating graphs for audio and video processing. + . + This package contains the PulseAudio replacement daemon. + +Package: pkexec +Architecture: amd64 +Version: 127-2ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: policykit-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 55 +Depends: polkitd (= 127-2ubuntu1.1), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libpam0g (>= 0.99.7.1), libpolkit-agent-1-0 (= 127-2ubuntu1.1), libpolkit-gobject-1-0 (= 127-2ubuntu1.1) +Breaks: policykit-1 (<< 0.120-4~) +Replaces: policykit-1 (<< 0.120-4~) +Filename: pool/pkexec_127-2ubuntu1.1_amd64.deb +Size: 15602 +MD5sum: 402c57472baf1a559b80832e5b3e7bcb +SHA1: 1743bf989a77e381439bde576bed858b1da91bfd +SHA256: 13cee770b506148abff92aafbbb364e203807a61b7548fa9aca3e1d72827b002 +SHA512: e1e7c6751f3cf4ea6dcd7e4be80cbd76bcfb553f249b78cb97723225af70ff1a938a276cd5295865a29aa01db38f4bd46a9da6c13bf700c11f87f4f95c564f9a +Homepage: https://github.com/polkit-org/polkit/ +Description: run commands as another user with polkit authorization + polkit is an application-level toolkit for defining and handling the policy + that allows unprivileged processes to speak to privileged processes. + It was previously named PolicyKit. + . + pkexec is a setuid program to allow certain users to run commands as + root or as a different user, similar to sudo. Unlike sudo, it carries + out authentication and authorization by sending a request to polkit, + so it uses desktop environments' familiar prompting mechanisms for + authentication and uses polkit policies for authorization decisions. + . + By default, members of the 'sudo' Unix group can use pkexec to run any + command after authenticating. The authorization rules can be changed by + the local system administrator. + . + If this functionality is not required, removing the pkexec package will + reduce security risk by removing a setuid program. + +Package: plymouth +Architecture: amd64 +Version: 24.004.60+git20250831.4a3c171d-0ubuntu8 +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 904 +Depends: init-system-helpers (>= 1.18), sysvinit-utils (>= 3.05-4), systemd (>= 232-8~) | elogind, udev (>= 232-8~), libc6 (>= 2.38), libdrm2 (>= 2.4.47), libplymouth5 (>= 24.004.60+git20250831.4a3c171d-0ubuntu8) +Recommends: plymouth-theme-ubuntu-text | plymouth-theme +Suggests: desktop-base, plymouth-themes +Conflicts: console-common +Breaks: plymouth-drm (<< 0.9.0-6~), plymouth-themes (<< 0.9.0-8~) +Replaces: plymouth-drm (<< 0.9.0-6~), plymouth-themes (<< 0.9.0-8~) +Filename: pool/plymouth_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +Size: 134832 +MD5sum: 6e0f6a32f8a4d4032979133e6320012d +SHA1: 6adc2eb7aaac82906d77f768551f7205d499c55b +SHA256: 70abc40f1d4a8caeae443310e397cd8b17f2a5e9769c797d79ce479de13870b0 +SHA512: 54a00424f003b5082427ba85e59e6f725e08390528c715e1ce3ca3eb4c11592a51a518117f920ba918f4a552013451d93b0004c9cb3cc13cd3887a6b80e7ddfa +Homepage: https://www.freedesktop.org/wiki/Software/Plymouth +Description: boot animation, logger and I/O multiplexer + Plymouth provides a boot-time I/O multiplexing framework - the most obvious + use for which is to provide an attractive graphical animation in place of + the text messages that normally get shown during boot. (The messages are + instead redirected to a logfile for later viewing.) However, in event-driven + boot systems Plymouth can also usefully handle user interaction such as + password prompts for encrypted file systems. + . + This package provides the basic framework, enabling a text-mode animation. + +Package: plymouth-label +Architecture: amd64 +Version: 24.004.60+git20250831.4a3c171d-0ubuntu8 +Priority: optional +Section: misc +Source: plymouth +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 40 +Depends: plymouth (= 24.004.60+git20250831.4a3c171d-0ubuntu8), libc6 (>= 2.17), libcairo2 (>= 1.14.0), libglib2.0-0t64 (>= 2.12.0), libpango-1.0-0 (>= 1.44.3), libpangocairo-1.0-0 (>= 1.14.0), libplymouth5 (>= 23.360.11), fonts-ubuntu, fontconfig-config +Breaks: plymouth-themes (<< 0.9.2-5~) +Replaces: plymouth-themes (<< 0.9.2-5~) +Filename: pool/plymouth-label_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +Size: 9602 +MD5sum: bb27bf8a92cd921345af3a10c7ab7c21 +SHA1: 3f8a31ed36041a273f74ffd444280d30fb5106a9 +SHA256: ad8f341e0f2500c983a33a3b42f850f8844a13b15e6ea6dccfcce29c81d0ca88 +SHA512: a3ed2b1a989189ecfba513e9524681e9b00211f9f4014b50111902c1f39d5be4f1188bdd74daba64cd136d46f18f28c5d2581a3f481e3d777ee31e4714953a33 +Homepage: https://www.freedesktop.org/wiki/Software/Plymouth +Description: boot animation, logger and I/O multiplexer - label control + Plymouth provides a boot-time I/O multiplexing framework - the most obvious + use for which is to provide an attractive graphical animation in place of + the text messages that normally get shown during boot. (The messages are + instead redirected to a logfile for later viewing.) However, in event-driven + boot systems Plymouth can also usefully handle user interaction such as + password prompts for encrypted file systems. + . + This package contains the label control, used by various graphical themes + to render text. + +Package: plymouth-theme-spinner +Architecture: amd64 +Version: 24.004.60+git20250831.4a3c171d-0ubuntu8 +Priority: optional +Section: misc +Source: plymouth +Maintainer: Ubuntu Developers +Original-Maintainer: Laurent Bigonville +Installed-Size: 794 +Provides: plymouth-theme +Depends: libc6 (>= 2.38), libplymouth5 (>= 24.004.60+git20250714), plymouth (= 24.004.60+git20250831.4a3c171d-0ubuntu8), plymouth-label (= 24.004.60+git20250831.4a3c171d-0ubuntu8), lsb-release +Breaks: plymouth (<< 24.004.60+git20250831.4a3c171d-0ubuntu5), plymouth-themes (<< 0.9.4git20190712-0ubuntu1~) +Replaces: plymouth (<< 24.004.60+git20250831.4a3c171d-0ubuntu5), plymouth-themes (<< 0.9.4git20190712-0ubuntu1~) +Filename: pool/plymouth-theme-spinner_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +Size: 172762 +MD5sum: fbb3f6eb91815c964105aba9d3507081 +SHA1: f794f0294e816828059baa6099fffc8ebfe41cf3 +SHA256: 19ff2c73b357ce5ee30cdd0cc420691b19b830ad323e286508c6117e9b85e363 +SHA512: 0cbe914c46e8ff30aac4c3b31dfb4dd94dec9a6c430aeecb3a91ae798808fa833125d39643cba7d676627e95f6e14130e9adad3a3b3786d3e06924790b107ddb +Homepage: https://www.freedesktop.org/wiki/Software/Plymouth +Description: boot animation, logger and I/O multiplexer - spinner theme + Plymouth provides a boot-time I/O multiplexing framework - the most obvious + use for which is to provide an attractive graphical animation in place of + the text messages that normally get shown during boot. (The messages are + instead redirected to a logfile for later viewing.) However, in event-driven + boot systems Plymouth can also usefully handle user interaction such as + password prompts for encrypted file systems. + . + This package contains the spinner theme. + +Package: policykit-desktop-privileges +Architecture: all +Version: 0.22build1 +Priority: optional +Section: admin +Maintainer: Ubuntu Core Developers +Installed-Size: 21 +Recommends: polkitd +Filename: pool/policykit-desktop-privileges_0.22build1_all.deb +Size: 3588 +MD5sum: 85fb81487a1d1d6da03dd932fbe662f7 +SHA1: 1c761bbdc157aa9142e76868647c63e8eae6eb6c +SHA256: d357ef30efb90b21f2e63833b3d49efecb09fc59785c18adef2c2a634a2c4a36 +SHA512: 1e86f14c6c67c1d6d2c8da843b3898b6ad9fa799968d746527b1cb73ede8bcd125e15d324162de0a830e1a4df2568c683c4414732fc76323d56780fc39072185 +Description: run common desktop actions without password + This package provides a set of PolicyKit privileges which allow Administrators + to run common actions without being asked for their password: + . + * mounting and checking internal disk drives (through udisks) + * setting the CPU speed and policy (through the GNOME CPU frequency applet) + * setting the time and timezone (through the GNOME clock applet or through + KDE) + * Update already installed software + * Configure printers + . + It does not change privileges for non-Administrators (users who are not in the + "sudo" group). So this satisfies the typical desktop/laptop use + case where the user has full control over the hardware anyway. + . + This is implemented by shipping a polkitd set of rules. + +Package: polkitd +Architecture: amd64 +Version: 127-2ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: policykit-1 +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 540 +Depends: systemd | systemd-standalone-sysusers | systemd-sysusers, default-dbus-system-bus | dbus-system-bus, default-logind | logind, xml-core (>= 0.14), libc6 (>= 2.38), libduktape207 (>= 2.0.3), libexpat1 (>= 2.0.1), libglib2.0-0t64 (>= 2.38.0), libpam0g (>= 0.99.7.1), libpolkit-agent-1-0 (= 127-2ubuntu1.1), libpolkit-gobject-1-0 (= 127-2ubuntu1.1), libsystemd0 (>= 253) +Breaks: policykit-1 (<< 0.120-4~), polkitd-javascript (<< 121+compat0.1-3~) +Replaces: policykit-1 (<< 0.120-4~), polkitd-javascript (<< 121+compat0.1-3~) +Filename: pool/polkitd_127-2ubuntu1.1_amd64.deb +Size: 102300 +MD5sum: 47db9184f0950ae921fa6cd03b5f255c +SHA1: 5c28c8e6b8ad7330a8c2b56e49453ab486ccc090 +SHA256: c1935129f2d9d76db7c9d3f29cad2c85de0e5c1a568b7a8a6140131c2804a0d8 +SHA512: 6557264529f2757e80b02ef148492b9ba3e1e985b7f15b3001e4e1980d99260ac8a88f504e5ff6a88e8c37b8ff75170eeeb42bbc0ab402a9e5f59a7fc3e2136d +Homepage: https://github.com/polkit-org/polkit/ +Description: framework for managing administrative policies and privileges + polkit is an application-level toolkit for defining and handling the policy + that allows unprivileged processes to speak to privileged processes. + It was previously named PolicyKit. + . + It is a framework for centralizing the decision making process with respect to + granting access to privileged operations for unprivileged (desktop) + applications. + . + In a typical use of polkit, an unprivileged application such as gnome-disks + sends requests via D-Bus or other inter-process communication mechanisms + to a privileged system service such as udisks, which asks polkitd for + permission to process those requests. This allows the application to carry + out privileged tasks without making use of setuid, which avoids several + common sources of security vulnerabilities. + . + This package provides the polkitd D-Bus service and supporting programs. + The pkexec program is not included, and can be found in the pkexec package. + +Package: poppler-data +Architecture: all +Version: 0.4.12-1build1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Hideki Yamane +Installed-Size: 13085 +Pre-Depends: dpkg (>= 1.15.6~) +Suggests: poppler-utils, ghostscript, fonts-japanese-mincho | fonts-ipafont-mincho, fonts-japanese-gothic | fonts-ipafont-gothic, fonts-arphic-ukai, fonts-arphic-uming, fonts-nanum (>= 20131007~) +Enhances: ghostscript +Filename: pool/poppler-data_0.4.12-1build1_all.deb +Size: 2000170 +MD5sum: c88c513f450c9eed1209501871f24fd9 +SHA1: 80abfdbb6094f80defa7ffecd020718ad0466ea5 +SHA256: 6d2d873d2a77a76ea2a156c15a5ae798fe3711d8736cd2ff3872f53d57567e0e +SHA512: 36bb1fd00f18403bf5e0e5621389c9f6f6bc5be6bcd0c533591c6a79e0cc2c978dd10cb387656de393d7f8991e49c8a7025d99d1a43fe0cfc8653e499a4f9f58 +Homepage: https://poppler.freedesktop.org/ +Description: encoding data for the poppler PDF rendering library + This package provides the CMap tables required to display PDF documents + containing CJK characters with libpoppler. They were previously provided + by the packages cmap-adobe-{cns1,gb1,japan1,japan2,korea1} and + gs-cjk-resource. + . + Users who want to view or create PDF files in Chinese, Japanese, or + Korean without embedded fonts will need this package. + +Package: poppler-utils +Architecture: amd64 +Version: 26.01.0-2ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: poppler +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 856 +Provides: pdftohtml, xpdf-utils +Depends: libpoppler156 (= 26.01.0-2ubuntu0.1), libc6 (>= 2.38), libcairo2 (>= 1.17.8), libfreetype6 (>= 2.2.1), liblcms2-2 (>= 2.2+git20110628), libstdc++6 (>= 13.1) +Conflicts: pdftohtml +Breaks: xpdf-utils (<< 3.02-2~) +Replaces: pdftohtml, xpdf-reader, xpdf-utils (<< 3.02-2~) +Filename: pool/poppler-utils_26.01.0-2ubuntu0.1_amd64.deb +Size: 231310 +MD5sum: 9dbd685c855ceab04aa82f80d247e93e +SHA1: 317acaf1e28c78f2c8beca4e3dd96ab8ff92a7d2 +SHA256: 16399d6fe46fbef3259297601ffeeaf024d725b02cdd6d8ddbbc2f4b0aa1ed7d +SHA512: ed8458e0d8b970c3b9541feb1f9216b7747b0c6b2a117272a45583488e5a2d5de13cd9e431d39c163e1c4b25cec217ceba86122283b37f97e6988787e08c90bc +Homepage: https://poppler.freedesktop.org/ +Description: PDF utilities (based on Poppler) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains command line utilities (based on Poppler) for getting + information of PDF documents, convert them to other formats, or manipulate + them: + * pdfdetach -- lists or extracts embedded files (attachments) + * pdffonts -- font analyzer + * pdfimages -- image extractor + * pdfinfo -- document information + * pdfseparate -- page extraction tool + * pdfsig -- verifies digital signatures + * pdftocairo -- PDF to PNG/JPEG/PDF/PS/EPS/SVG converter using Cairo + * pdftohtml -- PDF to HTML converter + * pdftoppm -- PDF to PPM/PNG/JPEG image converter + * pdftops -- PDF to PostScript (PS) converter + * pdftotext -- text extraction + * pdfunite -- document merging tool + +Package: power-profiles-daemon +Architecture: amd64 +Version: 0.30-2 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 186 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libgudev-1.0-0 (>= 234), libpolkit-gobject-1-0 (>= 0.99), python3:any (>= 3.11~), python3-gi +Conflicts: laptop-mode-tools, tlp, tuned-ppd +Replaces: tuned-ppd +Filename: pool/power-profiles-daemon_0.30-2_amd64.deb +Size: 56906 +MD5sum: 77fd4bd64f27b273b55d42581cca47bb +SHA1: 080d7a9cd8784dd3f259c3c286604f025c06a484 +SHA256: 476b74a46ec1ae19d1c43bfa00957d53dd9a51ea8229da06d8aee87e4ea7653e +SHA512: a9cf39edf25b954be153ca5412eb8cbbdd4eb8c460ac80acc8b82e865270b91fa635f2db2b360d99282163e70a90e98b054fd15f8abbe47e9d7a4c73e45325d1 +Homepage: https://gitlab.freedesktop.org/upower/power-profiles-daemon +Description: D-Bus service for power profile handling + power-profiles-daemon offers to modify system behaviour based upon + user-selected power profiles. There are 3 different power profiles, a + "balanced" default mode, a "power-saver" mode, as well as a "performance" + mode. The first 2 of those are available on every system. The "performance" + mode is only available on select systems and is implemented by different + "drivers" based on the system or systems it targets. + . + In addition to those 2 or 3 modes (depending on the system), + "actions" can be hooked up to change the behaviour of a particular device. + For example, this can be used to disable the fast-charging for some USB + devices when in power-saver mode. + +Package: ppp +Architecture: amd64 +Version: 2.5.2-1+1.2 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Boot +Installed-Size: 1042 +Depends: libpam-modules, libpam-runtime, procps, libc6 (>= 2.38), libcrypt1 (>= 1:4.1.0), libpam0g (>= 0.99.7.1), libpcap0.8t64 (>= 0.9.8), libssl3t64 (>= 3.0.0), libsystemd0 +Filename: pool/ppp_2.5.2-1+1.2_amd64.deb +Size: 356484 +MD5sum: 87adf0a099b56e8ec06e16c3e5d89706 +SHA1: 961c51157cec542e9743f8e0cbfd74e17e555752 +SHA256: b80c9d944cc929eb4b1556aeb2fd06eff37a5163ef18838ae533c0f0fb6efbae +SHA512: 0097548196b175a28c14580607da090eb4ac29c219c1d7c3ac90d2cca598556ea1d8c92878f3ba33856aaf3a1d972aa61fbd6274a62dd3df408269a0ce657447 +Homepage: https://ppp.samba.org/ +Description: Point-to-Point Protocol (PPP) - daemon + The Point-to-Point Protocol provides a standard way to transmit + datagrams over a serial link, as well as a standard way for the machines + at either end of the link to negotiate various optional characteristics + of the link. + . + This package is most commonly used to manage a modem for dial-up or + certain kinds of broadband connections. + +Package: pptp-linux +Architecture: amd64 +Version: 1.10.0-2build1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Christoph Biedl +Installed-Size: 106 +Depends: libc6 (>= 2.38), ppp +Filename: pool/pptp-linux_1.10.0-2build1_amd64.deb +Size: 39922 +MD5sum: 990234b97c7ba09691033b35b1a1261c +SHA1: 902427e437a772d32812c718838b8147ad960d3c +SHA256: f12d5e0c8139656a69cc74be3357391965fb5c2e4ba46d67de2796dabb85a392 +SHA512: 5a35c133a94b385d4b9a96a508ffab36a7d45c48d6e2d773be5b2acf0f71d374f60bf78961a73bbefac56e70368a62ab95f65dcf3369d149afe1b125a26d26ed +Homepage: http://pptpclient.sourceforge.net/ +Description: Point-to-Point Tunneling Protocol (PPTP) Client + Client for the proprietary Microsoft Point-to-Point Tunneling + Protocol, PPTP. Allows connection to a PPTP based VPN as used + by employers and some cable and ADSL service providers. + +Package: printer-driver-brlaser +Architecture: amd64 +Version: 6.2.8-1 +Priority: optional +Section: text +Source: brlaser +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 91 +Depends: libc6 (>= 2.34), libcups2t64 (>= 2.3~b6), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13.1) +Filename: pool/printer-driver-brlaser_6.2.8-1_amd64.deb +Size: 24218 +MD5sum: 34cd05671fe3f9c53b64b057e600b7e4 +SHA1: 350d64b0f3ff33362313946ce756d2977e1c388b +SHA256: ceea4b95ffa50d7e6c8bd99f1d365d3f0722aa0c8e6a4b8fefcbdace90a8c1b2 +SHA512: db7acea96e5babbcee344d112bf59dc42a58a5817fe5d20d271b7ec1cd914645f8183a3ae68ad46bb8420c2b5e80807206e3e3705f1e55ca2109007b231014d2 +Homepage: https://github.com/Owl-Maintain/brlaser +Description: printer driver for (some) Brother laser printers + CUPS filter driver supporting (some) Brother laser printer. + . + This driver has been reported to work with these printers: + . + * Brother DCP-1510 + * Brother DCP-1602 + * Brother DCP-7030 + * Brother DCP-7040 + * Brother DCP-7055 + * Brother DCP-7055W + * Brother DCP-7060D + * Brother DCP-7065DN + * Brother DCP-7080 + * Brother DCP-L2500D + * Brother DCP-L2540DW + * Brother HL-1110 series + * Brother HL-1200 series + * Brother HL-L2300D series + * Brother HL-L2320D series + * Brother HL-L2340D series + * Brother HL-L2360D series + * Brother MFC-1910W + * Brother MFC-7240 + * Brother MFC-7360N + * Brother MFC-7365DN + * Brother MFC-7840W + * Brother MFC-L2710DW + * Lenovo M7605D + This package contains the CUPS filter driver for the supported laser printers. + +Package: printer-driver-c2esp +Architecture: amd64 +Version: 27-11ubuntu8 +Priority: optional +Section: text +Source: c2esp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 126 +Depends: libc6 (>= 2.34), libcups2t64 (>= 2.3~b6), libcupsfilters2t64 (>= 2.0~b4-0ubuntu1), libjbig0 (>= 2.0), libppd2 (>= 2:2.0~b4-0ubuntu1), zlib1g (>= 1:1.1.4) +Recommends: cups-ppdc +Suggests: psutils +Filename: pool/printer-driver-c2esp_27-11ubuntu8_amd64.deb +Size: 32680 +MD5sum: 7953cc826cdc5e1baddb6ef6d533803b +SHA1: 0c5b0e12e7efb2d3ca5a9675324d97bc37a15872 +SHA256: 8ec58b3cb4d0fe253063a0e6352514dce43f4d4a25ccad122943800680ee5804 +SHA512: e97bccfb85239ff8a44b348a7a6ffd802cd2f57705a7a174c15d5fb9dca9424ea60884dbf055d1a77fee9a8b7a7406856252eaa3f653a2cb7d123c5e65f05776 +Homepage: https://sourceforge.net/projects/cupsdriverkodak/ +Description: printer driver for Kodak ESP AiO color inkjet Series + The c2esp driver is an open source driver for the Kodak ESP AiO and HERO + AiO color inkjet printers series. It is likely to work on the + 5100 AiO, + 5300 AiO, + 5500 AiO, + ESP 1.2 AiO, + ESP 2.2 AiO, + ESP 3200 Series AiO, + ESP 3.2 AiO, + ESP 3 AiO, + ESP 4.2 AiO, + ESP 5200 Series AiO, + ESP 5 AiO, + ESP 7200 Series AiO, + ESP 7 AiO, + ESP 9200 Series AiO, + ESP 9 AiO, + ESP C100 Series AiO, + ESP C110 Series AiO, + ESP C310 Series AiO, + ESP Office 4100 Series AiO, + ESP Office 6100 Series AiO, + HERO 3.1 AiO, + HERO 5.1 AiO, + HERO 6.1 AiO, + HERO 7.1 AiO and + HERO 9.1 AiO. + +Package: printer-driver-foo2zjs +Architecture: amd64 +Version: 20200505dfsg0-3ubuntu1 +Priority: optional +Section: text +Source: foo2zjs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 738 +Depends: cups-filters | foomatic-filters, dc, liblcms2-utils, printer-driver-foo2zjs-common (>= 20200505dfsg0-3ubuntu1), libc6 (>= 2.38), libcups2t64 (>= 1.4.0), libjbig0 (>= 2.0), mscompress +Recommends: cups, cups-client, unzip, wget +Suggests: hannah-foo2zjs, psutils +Breaks: foo2zjs (<< 20111023dfsg0-1~) +Replaces: foo2zjs (<< 20111023dfsg0-1~) +Filename: pool/printer-driver-foo2zjs_20200505dfsg0-3ubuntu1_amd64.deb +Size: 146788 +MD5sum: 87828833d818384b11187687485161cd +SHA1: 2276c4d4442d5f64edc4299ceda970cb3ba2c45f +SHA256: 979f8bc0e3fdc1a7602ee35034818c7ea207321e5c0c469a7a92c1ac12714aef +SHA512: fb5b84a62ae54ca13a15760dbc461ddf3f1f530f13eb5fd79ea88d8e8bd4f40624a7d638f54c32c7cb5b63ed18df3a9e3e8caee9aad2a8fc0106df6178d07aaa +Homepage: http://foo2zjs.rkkda.com/ +Description: printer driver for ZjStream-based printers + foo2zjs is an open source printer driver for printers that use the + Zenographics ZjStream wire protocol for their print data, such as the + Minolta magicolor 2200/2300/2430 DL, Minolta Color PageWorks/Pro L and + HP LaserJet 1000/1005/1018/1020/1022. These printers are often + erroneously referred to as "winprinters" or "GDI printers". + . + This package provides the following drivers: foo2hblp2, foo2hiperc, + foo2hp, foo2lava, foo2oak, foo2qpdl, foo2slx, foo2xqx, foo2zjs. + . + The psutils package is needed to enable n-up printing support. + +Package: printer-driver-foo2zjs-common +Architecture: all +Version: 20200505dfsg0-3ubuntu1 +Priority: optional +Section: text +Source: foo2zjs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 2506 +Depends: python3:any, xz-utils +Recommends: printer-driver-foo2zjs (>= 20200505dfsg0-3ubuntu1) +Suggests: tix, tk +Breaks: foo2zjs (<< 20111023dfsg0-1~) +Replaces: foo2zjs (<< 20111023dfsg0-1~) +Enhances: printer-driver-foo2zjs (>= 20200505dfsg0-3ubuntu1) +Filename: pool/printer-driver-foo2zjs-common_20200505dfsg0-3ubuntu1_all.deb +Size: 595278 +MD5sum: 1216858b6023782b9ab99f71cbd8df42 +SHA1: 5da116743b8dfe4ddc95f2e0519b7ff8f1f5b7a4 +SHA256: 3aa8af4816a8d84ed0c7eba78bdadd52567a826f26d18116efbab96d2f43bfb7 +SHA512: a4f85dfcf13a5e3e18184cd3b5852061da2abfa8a05ed8d953f6692c49f5b63aa955c7f5f0c34177151d4d5e114703fc79f78df9f2a072881ecfdf4a3719fb6c +Homepage: http://foo2zjs.rkkda.com/ +Description: printer driver for ZjStream-based printers - common files + foo2zjs is an open source printer driver for printers that use the + Zenographics ZjStream wire protocol for their print data, such as the + Minolta magicolor 2200/2300/2430 DL, Minolta Color PageWorks/Pro L and + HP LaserJet 1000/1005/1018/1020/1022. These printers are often + erroneously referred to as "winprinters" or "GDI printers". + . + This package contains the architecture-independent files for + printer-driver-foo2zjs. + +Package: printer-driver-hpcups +Architecture: amd64 +Version: 3.24.4+dfsg0-0ubuntu8.1 +Priority: optional +Section: text +Source: hplip +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 2099 +Depends: cups, cups-filters | ghostscript-cups, libc6 (>= 2.38), libcups2t64 (>= 2.3~b6), libdbus-1-3 (>= 1.10), libgcc-s1 (>= 3.3.1), libhpmud0 (>= 3.24.4+dfsg0), libjpeg8 (>= 8c), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4) +Suggests: hplip (= 3.24.4+dfsg0-0ubuntu8.1), hplip-doc +Filename: pool/printer-driver-hpcups_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +Size: 250186 +MD5sum: 2c3116cd143db38dacc3fc52b0ed73c9 +SHA1: 5bb3e2bc4158ac9c363c8599de4b7ec5d6deac19 +SHA256: 5e128db58f0f7b47a0f52bf1d00959617d6debada5ba8a68e25d97b6e0ad02bf +SHA512: 06cd8e9b6eae2f521e90e44ab12fd8e81de52bf1f8d4c6b9b360a8c9f299f600711a6f9b7a58f04e7978cca446ea84c46f23907d52436fa6a2fb0ae3b435759a +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP Linux Printing and Imaging - CUPS Raster driver (hpcups) + This package contains a CUPS-Raster-based printer driver which adds support + for most inkjet printers and some LaserJet printers manufactured by HP. It + does not provide PPDs for the fax functionality of HP's multi-function + devices. + . + Users of the CUPS printing system are advised to also install the + hplip package, and use the hp CUPS backend to send data to the printer. + HPLIP supports USB and networked devices, and enables + extended hpcups functionality such as border-less printing. + Selecting any hpcups ppd in CUPS will use hpcups automatically. + . + No physical PPDs are shipped with this driver. PPDs are dynamically + generated via a CUPS DDK .drv file. + . + This package can be installed to provide a minimal headless printer + solution using CUPS. + +Package: printer-driver-m2300w +Architecture: amd64 +Version: 0.51-15build3 +Priority: optional +Section: text +Source: m2300w +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 1466 +Depends: cups-filters | foomatic-filters, python3:any, xz-utils, libc6 (>= 2.38) +Recommends: cups-ppdc +Suggests: psutils +Breaks: m2300w (<< 0.51-5~), m2300w-ppds +Replaces: m2300w (<< 0.51-5~), m2300w-ppds +Filename: pool/printer-driver-m2300w_0.51-15build3_amd64.deb +Size: 302776 +MD5sum: e557f39fdbd02d98aa34a0719c9fbbd8 +SHA1: 47e86df04a595bea50ed9524455ab169a58ae658 +SHA256: 114daf5e6f0e6d26712bbd6aed099bb48cb9c341d0ef45f91be656ec1db29bfb +SHA512: a571c1cf2683a6ebba7bf3df57402bf30bada40131b82fd92d19a6a2fe6b049d50aad0de2667a16a3e91f9e397ac3beeb0e2c41a4e28aba48e969108b2a87ff3 +Homepage: http://m2300w.sf.net/ +Description: printer driver for Minolta magicolor 2300W/2400W color laser printers + The m2300w driver is a driver for the Konica Minolta magicolor 2300W and + 2400W color laser printers. + . + The driver is basically intended for being used in conjunction with + "foomatic" (see http://www.openprinting.org/foomatic.html), which + is a database-driven system for integrating free software printer + drivers with common spoolers under Unix, like CUPS, LPRng, LPD, + GNUlpr, PPR, PDQ, CPS, and direct printing. + +Package: printer-driver-min12xxw +Architecture: amd64 +Version: 0.0.9-11build4 +Priority: optional +Section: text +Source: min12xxw +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 104 +Depends: libc6 (>= 2.38) +Recommends: cups, ghostscript, foomatic-db-compressed-ppds | foomatic-db +Breaks: min12xxw (<< 0.0.9-6~) +Replaces: min12xxw (<< 0.0.9-6~) +Filename: pool/printer-driver-min12xxw_0.0.9-11build4_amd64.deb +Size: 46286 +MD5sum: 5ce649dce86ee461ade4abec4c45107a +SHA1: 1dd4066f68167db0fc3fd211f98874c6fe071893 +SHA256: 0158b5c2a3dbec5b8eed2ca328f3f27b1402eb870c38b4694faf1c06a17d6a10 +SHA512: 81da314fb735c1aede8160628ec8dd1ac926bac9fc9260513df0c0bd12efdd02d8c04b753bad17068e496523c01ad4e166ce98b8be868aa82fa562993c1ad475 +Homepage: http://www.hinterbergen.de/mala/min12xxw/ +Description: printer driver for KonicaMinolta PagePro 1[234]xxW + A cups/foomatic printer driver for the KonicaMinolta PagePro 1200W, 1250W, + 1300W, 1350W and 1400W. + +Package: printer-driver-pnm2ppa +Architecture: amd64 +Version: 1.13+nondbs-0ubuntu11 +Priority: optional +Section: text +Source: pnm2ppa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 1931 +Depends: ghostscript, debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.38) +Suggests: magicfilter | apsfilter +Conflicts: pbm2ppa +Breaks: pnm2ppa (<< 1.13-3~) +Replaces: pnm2ppa (<< 1.13-3~) +Filename: pool/printer-driver-pnm2ppa_1.13+nondbs-0ubuntu11_amd64.deb +Size: 249020 +MD5sum: e6ae4fa0316eb420dac260b1baaa217a +SHA1: 95640efd683c9d392041dccbd28d8d304d41dd19 +SHA256: 374f0c7ddb9bf06006459df8da0e45e18704c4f61e88abef2013bdad9bed6f2f +SHA512: 5f81e39afb61e7b20462faae4819e124f4f61e2f7fa948793b63c3f33b6d4a8936127b6dfa827fc652622bf0daace8ca7614cb638a74434b6355d4578355cfdf +Homepage: http://pnm2ppa.sf.net/ +Description: printer driver for HP-GDI printers + Using pnm2ppa it's possible to run HP-GDI printers on Linux. These printers + are normally "Windows-only" and use the PPA protocol which is proprietary. + pnm2ppa supports color. + . + pnm2ppa supports the following printers: HP Deskjet 7XX Series, HP Deskjet + 820 Series and HP Deskjet 1000 Series. + +Package: printer-driver-postscript-hp +Architecture: amd64 +Version: 3.24.4+dfsg0-0ubuntu8.1 +Priority: optional +Section: utils +Source: hplip +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 1835 +Depends: python3:any, xz-utils, libc6 (>= 2.38), libcups2t64 (>= 1.4.0) +Suggests: hplip (>= 3.24.4+dfsg0-0ubuntu8.1) +Breaks: hplip (<< 3.18.3+dfsg0-1~) +Replaces: hplip (<< 3.18.3+dfsg0-1~) +Filename: pool/printer-driver-postscript-hp_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +Size: 1381382 +MD5sum: 12a7700e0df18b3295ddf0ffeadea9db +SHA1: f59ae8115f5d2a890594e1c588910c5a28acc4c3 +SHA256: 624c45738ca1410990eabe1a54666d6d01cbb1fa2dd1fb33e220c16dcc42ac78 +SHA512: a265c2814eaa075235f2a002d6e428a97f44725e76327709c998ac977c8f90960dbfebb51ad7ba3512806a329e9a80384498ecc37a0aefc9298e9b25cdf8e21b +Homepage: https://developers.hp.com/hp-linux-imaging-and-printing +Description: HP Printers PostScript Descriptions + The HP Linux Printing and Imaging System provides full support for + printing on most HP SFP (single function peripheral) inkjets and many + LaserJets, and for scanning, sending faxes and for photo-card access on + most HP MFP (multi-function peripheral) printers. + . + This package contains the compressed PPDs for the PostScript HP + Printers and the hpps filter. + +Package: printer-driver-ptouch +Architecture: amd64 +Version: 1.7.1-1build1 +Priority: optional +Section: text +Source: ptouch-driver +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 63 +Depends: ghostscript, python3:any, xz-utils, libc6 (>= 2.38), libcups2t64 (>= 2.3~b6) +Filename: pool/printer-driver-ptouch_1.7.1-1build1_amd64.deb +Size: 25456 +MD5sum: c3443ac830a022ea8703f2af0897e1fd +SHA1: 2d21356416590705e86f6b17af0fca5f8b1eba3f +SHA256: f59ec76fbcea603467b0dc26fce1d988a0e5669eff347d575592a95b1b7fb8b1 +SHA512: 573005b95a51d409b0d74ffc466584d927be910f691c82aacb798d298f9a9fdf5861134809add8ef48480b20f8f011d5a03853a751c1674f25b7d29e246a32b5 +Homepage: https://github.com/philpem/printer-driver-ptouch +Description: printer driver Brother P-touch label printers + The ptouch driver is an open source driver for the Brother P-touch label + printers, from the QL-* and PT-* series. + +Package: printer-driver-pxljr +Architecture: amd64 +Version: 1.4+repack0-6build3 +Priority: optional +Section: text +Source: pxljr +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 83 +Depends: cups-filters | foomatic-filters, python3:any, xz-utils, libc6 (>= 2.38), libijs-0.35 (>= 0.35), libjpeg8 (>= 8c) +Breaks: pxljr (<< 1.3+repack0-2~) +Replaces: pxljr (<< 1.3+repack0-2~) +Filename: pool/printer-driver-pxljr_1.4+repack0-6build3_amd64.deb +Size: 27142 +MD5sum: dc87b381ddb881e869f4390c9df9ff59 +SHA1: 677871b02a4834d6dffac1b99210b1329f78aa2b +SHA256: 601017b8567bc37e65c1b792accd3bb0f6f8dee2e16876aafdcc1d0ae47ea1c7 +SHA512: eff2ce68a55427448e78bc4958e7b1ed81f1eff7eccc83a51f378ba7048e091c36db802bc32b0244e922109c91809dad234e99d7ec44fac47558cecbee1c7a7a +Homepage: http://sourceforge.net/projects/hp-pxl-jetready/ +Description: printer driver for HP Color LaserJet 35xx/36xx + HP's Color LaserJets 35xx and 36xx are supported by HP's HPIJS driver + (part of HPLIP), but HPIJS supports only the lowest quality level of + the three which are available under Windows. This driver which is not + developed at HP but by an independent developer, supports all modes and + so provides the highest printout quality for these printers. + +Package: printer-driver-sag-gdi +Architecture: all +Version: 0.1-8build1 +Multi-Arch: foreign +Priority: optional +Section: text +Source: rastertosag-gdi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 38 +Depends: ghostscript, python3:any +Recommends: cups | foomatic-filters +Breaks: rastertosag-gdi (<< 0.1-3) +Replaces: rastertosag-gdi (<< 0.1-3) +Filename: pool/printer-driver-sag-gdi_0.1-8build1_all.deb +Size: 8554 +MD5sum: 3f3ef814c34b9799db51178ee7e748f0 +SHA1: 85a723ea5ed5edd6eb52fe0d8535b65c2c1c380a +SHA256: ffdb3fe9d7156f34e3f2e4ad883a498db5b58b5d9ee53fcc6740a2a964a15466 +SHA512: 3a25f8d689d79de92e54fce535d51c28f9d5fb8d5f7c93f84e5fdf5d4feee732c01712eb0b9368e235f23f3c6e9b1d9d5be7c1a169ee037037dae108cca09add +Homepage: https://www.openprinting.org/driver/rastertosag-gdi/ +Description: printer driver for Ricoh Aficio SP 1000s/SP 1100s + The rastertosag-gdi driver is an open source Linux driver for the Ricoh Aficio + SP 1000s/SP 1100s printers. These are some of the few Ricoh printers which do + not understand PostScript or PCL, but only a proprietary raster format. + +Package: printer-driver-splix +Architecture: amd64 +Version: 2.0.1-2 +Priority: optional +Section: text +Source: splix +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 181 +Depends: libc6 (>= 2.38), libcups2t64 (>= 1.4.0), libcupsimage2t64 (>= 1.4.0), libgcc-s1 (>= 3.3.1), libjbig0 (>= 2.0), libstdc++6 (>= 5), cups, cups-client, cups-filters +Breaks: splix (<< 2.0.0+svn299-1) +Replaces: splix (<< 2.0.0+svn299-1) +Filename: pool/printer-driver-splix_2.0.1-2_amd64.deb +Size: 39728 +MD5sum: 9bd5fecfe12e4059153e4c3830dcfa54 +SHA1: bbb36941be8f16f44b657415a7c212934b90afd6 +SHA256: a33d32720e620109989587538ef87d27d407adf54a5e9697aeb9f5e38bdfbfab +SHA512: c50d36699803ab2bdb72da4c3b211d3818d4b6c3b24f2e8c17c58eb76b51d0811400a9730a6750f8f6de402b855f42338d5ce8d7a75c3db673160efca895344d +Homepage: https://openprinting.github.io/splix/ +Description: Driver for Samsung and Xerox SPL2 and SPLc laser printers + Support for printing to SPL2- and SPLc-based printers. These are most + of the cheaper Samsung laser printers which do not understand standard + languages like PostScript or PCL. Both monochrome (ML-15xx, ML-16xx, + ML-17xx, ML-2xxx) and color (CLP-5xx, CLP-6xx) models are supported. + Also some rebranded Samsungs like the Xerox Phaser 6100 work with this + driver. + . + Note that older SPL1-based models (ML-12xx, ML-14xx) do not work. Use + these printers with the older "gdi" driver which is built into + GhostScript. + +Package: prometheus-node-exporter +Architecture: amd64 +Version: 1.10.2-1 +Static-Built-Using: golang-1.25 (= 1.25.0-0ubuntu2), golang-dbus (= 5.1.0-1), golang-github-alecthomas-units (= 0.0~git20240927.0f3dac3-1), golang-github-beevik-ntp (= 0.3.0-4build1), golang-github-beorn7-perks (= 1.0.1-3), golang-github-cespare-xxhash (= 2.3.0-1), golang-github-coreos-go-systemd (= 22.6.0-1), golang-github-dennwc-btrfs (= 0.0~git20240418.0167142-1), golang-github-dennwc-ioctl (= 1.0.0+git20181021.0178042-2), golang-github-ema-qdisc (= 0.0~git20200603.62d0308-2), golang-github-go-kit-log (= 0.2.1-1), golang-github-go-logfmt-logfmt (= 0.5.0-2), golang-github-golang-jwt-jwt-v5 (= 5.3.0-1), golang-github-google-uuid (= 1.6.0-1), golang-github-hashicorp-go-envparse (= 0.1.0-1), golang-github-hodgesds-perf-utils (= 0.5.1-2), golang-github-jpillora-backoff (= 1.0.0-1.1), golang-github-jsimonetti-rtnetlink (= 2.1.0-2), golang-github-mattn-go-xmlrpc (= 0.0.3-2), golang-github-mdlayher-ethtool (= 0.4.1-1), golang-github-mdlayher-genetlink (= 1.3.1-1), golang-github-mdlayher-netlink (= 1.8.0-2), golang-github-mdlayher-socket (= 0.5.1-1), golang-github-mdlayher-vsock (= 1.2.1-2), golang-github-mdlayher-wifi (= 0.6.0-1), golang-github-munnerz-goautoneg (= 0.0~git20191010.a7dc8b6-2), golang-github-mwitkow-go-conntrack (= 0.0~git20190716.2f06839-4), golang-github-opencontainers-selinux (= 1.11.1-1), golang-github-prometheus-client-golang (= 1.23.2-1ubuntu1), golang-github-prometheus-client-model (= 0.6.2-1), golang-github-prometheus-common (= 0.67.4-1), golang-github-prometheus-community-go-runit (= 0.1.0-3), golang-github-prometheus-exporter-toolkit (= 0.15.0-1), golang-github-prometheus-procfs (= 0.19.2-1), golang-github-safchain-ethtool (= 0.7.0-1), golang-go.crypto (= 1:0.47.0-1), golang-go.uber-atomic (= 1.11.0-1), golang-go.uber-multierr (= 1.6.0-1), golang-golang-x-exp (= 0.0~git20250911.df92998-1), golang-golang-x-net (= 1:0.27.0-2), golang-golang-x-oauth2 (= 0.27.0-1), golang-golang-x-sync (= 0.19.0-1), golang-golang-x-sys (= 0.38.0-1), golang-golang-x-text (= 0.31.0-1), golang-golang-x-time (= 0.14.0-1), golang-google-protobuf (= 1.36.7-1), golang-gopkg-alecthomas-kingpin.v2 (= 2.2.6-4), golang-yaml.v2 (= 2.4.3-1) +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Go Packaging Team +Installed-Size: 15750 +Pre-Depends: init-system-helpers (>= 1.54~) +Depends: adduser, libc6 (>= 2.34) +Recommends: dbus, prometheus-node-exporter-collectors +Filename: pool/prometheus-node-exporter_1.10.2-1_amd64.deb +Size: 5112574 +MD5sum: c9cbe2abc68fc7afaaebc1ee7f40ff75 +SHA1: f7301575d195b9f49577d02c24390aa0f12213c1 +SHA256: 64dc6b1fd378013829cb75a46e2f93603da361aeeb616f2ebaac9a7162ce266b +SHA512: a963c38a2cd7a392cc6333ead13463a3c391ea6a107122e4d3a51745623dc8ed54a8ee87eef9bff8bb7193abe6cdc760ed1c9d7c465419784f2123d9bc223439 +Homepage: https://github.com/prometheus/node_exporter +Description: Prometheus exporter for machine metrics + Prometheus exporter for machine metrics, written in Go with pluggable metric + collectors. + +Package: prometheus-node-exporter-collectors +Architecture: all +Version: 0.0~git20241119.a2b43e1-1build1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Go Packaging Team +Installed-Size: 164 +Depends: dash (>= 0.5.12-7~), moreutils, python3-apt, python3-prometheus-client +Recommends: ipmitool, jq, nvme-cli, python3, smartmontools +Breaks: prometheus-node-exporter (<< 0.18.1+ds-2~) +Replaces: prometheus-node-exporter (<< 0.18.1+ds-2~) +Enhances: prometheus-node-exporter +Filename: pool/prometheus-node-exporter-collectors_0.0~git20241119.a2b43e1-1build1_all.deb +Size: 33606 +MD5sum: 42f082f8b6ea5b25ed4c90e6a6901fd7 +SHA1: 86b36e541f74049c61a1783e0b74daf606301cdd +SHA256: 8325167690db390e8f338b17d376270dda318b328e04bdaad37b7d709ff66cd1 +SHA512: 42929021e53258421bb89a07e9f60f6aed839e91de03936ab264c23f7fcfa84e0c73a4298dba9d3316ea6c0a1d1adc75c6a0fe01244022747bee46ee9b7df95c +Homepage: https://github.com/prometheus-community/node-exporter-textfile-collector-scripts +Description: Supplemental textfile collector scripts for Prometheus node_exporter + Optional textfile collector scripts which extend the functionality of + Prometheus node_exporter, or process output from external binaries into + the Prometheus metrics format, to be exposed by node_exporter. + +Package: psmisc +Architecture: amd64 +Version: 23.7-2ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Craig Small +Installed-Size: 604 +Depends: libc6 (>= 2.38), libtinfo6 (>= 6) +Breaks: manpages-de (<< 4.9.1-1) +Replaces: manpages-de (<< 4.9.1-1) +Filename: pool/psmisc_23.7-2ubuntu2_amd64.deb +Size: 179200 +MD5sum: ba4837553d792150be886d2a0243eb79 +SHA1: a56ad4793ad951ff109a77bfb9eda0fd6764ae41 +SHA256: a4a44a91506938bd8a3c0a75a92bd005423a9fdad5372107b53388b34fb58683 +SHA512: cb29fd38da7a8ec37709322946748549031bb5f8c3ed44c0a79c7533d9739ab227c70075db5330ff9f3cedd967ba28f6286acc108432d7d954d2851811b0b9c6 +Homepage: http://psmisc.sf.net/ +Description: utilities that use the proc file system + This package contains miscellaneous utilities that use the proc FS: + . + - fuser: identifies processes that are using files or sockets. + - killall: kills processes by name (e.g. "killall -HUP named"). + - peekfd: shows the data traveling over a file descriptor. + - pstree: shows currently running processes as a tree. + - prtstat: print the contents of /proc//stat + +Package: ptyxis +Architecture: amd64 +Version: 50.1-1ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1056 +Provides: x-terminal-emulator +Depends: xdg-terminal-exec, dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.8~alpha), libc6 (>= 2.34), libcairo2 (>= 1.2.4), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.13.8), libjson-glib-1.0-0 (>= 1.5.2), libpango-1.0-0 (>= 1.45.5), libportal-gtk4-1 (>= 0.5), libportal1 (>= 0.5), libvte-2.91-gtk4-0 (>= 0.79) +Filename: pool/ptyxis_50.1-1ubuntu2_amd64.deb +Size: 247482 +MD5sum: c4372ee334fe6bd13e6dd9164258bb75 +SHA1: bdfb17d68bcb0ea00b9c10f1d38ccba52b447008 +SHA256: 27d1b9970c45c1e10be0ef41b51073bdc6b54ba16f7a49a3b716e72a2d21eaa9 +SHA512: eb8dd3a0064c7ee62a6874a0f7adbecf46bc63a578729a8744cc400b39ea0ddb3acfdde0eb8c8057090ce19c4ee1eff7970d41165f4ee55889ee017a1bdf7f17 +Homepage: https://devsuite.app/ptyxis/ +Description: Modern terminal emulator for GNOME + Ptyxis is a terminal for GNOME with first-class support for containers. + This app provides significantly more preferences than gnome-console + while arranging them in a simpler layout than gnome-terminal. Ptyxis + is also crafted to be both fast and efficient. + +Package: python-apt-common +Architecture: all +Version: 3.1.0ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-apt +Maintainer: Ubuntu Developers +Original-Maintainer: APT Development Team +Installed-Size: 140 +Breaks: python-apt (<< 0.7.98+nmu1) +Replaces: python-apt (<< 0.7.98+nmu1) +Enhances: python-apt, python3-apt +Filename: pool/python-apt-common_3.1.0ubuntu1.1_all.deb +Size: 16976 +MD5sum: 6a3d1456dd9155b224a648e7b97880ca +SHA1: e6c1f63727329df0e6c5cacc7d1e6dd7cbe18ead +SHA256: e3637c6c0eeb83dc1de181d44f0bc27d8a5c3813bc9bff6c1ed181f1996a59bf +SHA512: ee2bd0cd9c95cf9a0e633d2df6d523f31e0b84bc57beb6a751ee59a5a8cc0864649c325f4de323a1b5f41c1ea73467178512b731dd01a4fd015d7b5e0ec9479b +Description: Python interface to libapt-pkg (locales) + The apt_pkg Python interface will provide full access to the internal + libapt-pkg structures allowing Python programs to easily perform a + variety of functions. + . + This package contains locales. + +Package: python-babel-localedata +Architecture: all +Version: 2.17.0-2 +Built-Using: unicode-cldr-core (= 46-0.1) +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-babel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 30117 +Filename: pool/python-babel-localedata_2.17.0-2_all.deb +Size: 6670976 +MD5sum: 0ad3997852629fabf8e6a265f54600ee +SHA1: baf03407d02099d4f1a4380666764af2e81d37d1 +SHA256: 746f068262e81264d22cf78b06a86cabafc00fae650e379f8598bb395fcf61d0 +SHA512: ffe4dffba2f76d9b018ed36bf514b11eff64d025eb8c55fa83d4d1023aeae973cfd4cfe859c2de3b890a27bad9dde0ff80b6afbf8f74c2cd40f5daff0f469f46 +Homepage: https://babel.pocoo.org/ +Description: tools for internationalizing Python applications - locale data files + Babel is composed of two major parts. First tools to build and work with + gettext message catalogs. Second a Python interface to the CLDR (Common + Locale Data Repository), providing access to various locale display + names, localized number and date formatting, etc. + . + This package contains the locale data files used by both python-babel and + python3-babel. + +Package: python3 +Architecture: amd64 +Version: 3.14.3-0ubuntu2 +Multi-Arch: allowed +Priority: optional +Section: python +Source: python3-defaults +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 80 +Provides: python3-profiler, python3-supported-max (= 3.14), python3-supported-min (= 3.14) +Pre-Depends: python3-minimal (= 3.14.3-0ubuntu2) +Depends: python3.14 (>= 3.14.3), libpython3-stdlib (= 3.14.3-0ubuntu2) +Suggests: python3-doc (>= 3.14.3-0ubuntu2), python3-tk (>= 3.14.3), python3-venv (>= 3.14.3-0ubuntu2) +Conflicts: python3-distutils +Replaces: python3-minimal (<< 3.1.2-2) +Filename: pool/python3_3.14.3-0ubuntu2_amd64.deb +Size: 22938 +MD5sum: cdf2225ec867a553cc3bf599e6d9945d +SHA1: ce5a3cd73815b94036d6fe37c8e7624427cd8f09 +SHA256: 1ff88ad587f9e52e9f333ab00ae0babea93ac5222fc6909039c4190affe1d574 +SHA512: 616bc16aa40a486075b987804a735a7c9e1873ad151564d057452761e31377b93451f00d2f82fcbccd6b2edd32dbaaeba14e6862a6a5192229a37e66fe61f6aa +Homepage: https://www.python.org/ +Description: interactive high-level object-oriented language (default python3 version) + Python, the high-level, interactive object oriented language, + includes an extensive class library with lots of goodies for + network programming, system administration, sounds and graphics. + . + This package is a dependency package, which depends on Debian's default + Python 3 version (currently v3.14). + +Package: python3-apport +Architecture: all +Version: 2.34.1-0ubuntu0.1 +Priority: optional +Section: python +Source: apport +Maintainer: Ubuntu Developers +Installed-Size: 493 +Depends: python3-apt (>= 0.7.9), python3-httplib2, python3-launchpadlib, python3-problem-report (>= 2.28), python3-yaml, python3:any +Recommends: apport +Breaks: apport (<< 2.23.1), apport-gtk (<< 2.23.1), apport-kde (<< 2.23.1) +Filename: pool/python3-apport_2.34.1-0ubuntu0.1_all.deb +Size: 96384 +MD5sum: fa5cc2a1e9306a3fd4c1585b3d8df57c +SHA1: b4b186933370e836e2c144aaf57ea2af09992b12 +SHA256: 3f4febbe890796cb56256a00060187090f2a8a3bdf5359fedd0ea66e20e87da2 +SHA512: 8c4340af6c100d60aaab6fafe8440b00d6f3759b3d1694173496604b904390c664f09b4f8c6273133d910bacea306dab2877eac6675e68f7726d16129a715358 +Homepage: https://wiki.ubuntu.com/Apport +Description: Python 3 library for Apport crash report handling + This Python package provides high-level functions for creating and + handling apport crash reports: + . + * Query available and new reports. + * Add OS, packaging, and process runtime information to a report. + * Various frontend utility functions. + * Python hook to generate crash reports when Python scripts fail. + +Package: python3-apt +Architecture: amd64 +Version: 3.1.0ubuntu1.1 +Multi-Arch: allowed +Priority: optional +Section: python +Source: python-apt +Maintainer: Ubuntu Developers +Original-Maintainer: APT Development Team +Installed-Size: 686 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libapt-pkg7.0 (>= 2.9.27+exp1), libc6 (>= 2.33), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 13.1), python-apt-common, distro-info-data +Recommends: lsb-release, iso-codes +Suggests: python-apt-doc, apt +Breaks: apt-xapian-index (<< 0.51~), kthresher (<= 1.4.0-1), python-apt (<< 0.7.98+nmu1) +Replaces: python-apt (<< 0.7.98+nmu1) +Filename: pool/python3-apt_3.1.0ubuntu1.1_amd64.deb +Size: 165306 +MD5sum: 29d42167d4c9db36df6bed4bdd17532a +SHA1: 8b805d48b69d4f1683c3c6415ef69e6db55ab102 +SHA256: e199afdd199b4bcee7eb37ceca32cc873cb847e8e36ba83df2d778ec6b9a0bf2 +SHA512: c18c4de139ffb435c07147384691d33cf6cc3b4df6d6f8b8ec725a98b3835ce4f08f73b08c9649b61f2ee49c0bcc671792f921ecf3791bab50f55bea3373562b +Description: Python 3 interface to libapt-pkg + The apt_pkg Python 3 interface will provide full access to the internal + libapt-pkg structures allowing Python 3 programs to easily perform a + variety of functions, such as: + . + - Access to the APT configuration system + - Access to the APT package information database + - Parsing of Debian package control files, and other files with a + similar structure + . + The included 'aptsources' Python interface provides an abstraction of + the sources.list configuration on the repository and the distro level. + +Package: python3-aptdaemon +Architecture: all +Version: 2.0.2build1 +Priority: optional +Section: python +Source: aptdaemon +Maintainer: Ubuntu Developers +Original-Maintainer: Julian Andres Klode +Installed-Size: 399 +Depends: aptdaemon, gir1.2-glib-2.0, gir1.2-packagekitglib-1.0 (>= 1.1.1), iso-codes, python3-apt (>= 0.8.5~ubuntu1), python3-dbus, python3-defer (>= 1.0.6), python3-gi, python3-pkg-resources, python3:any +Filename: pool/python3-aptdaemon_2.0.2build1_all.deb +Size: 66368 +MD5sum: 7101cca3a6e4b496e8ab5dede1f14a1b +SHA1: 8dccfb531f98912952c07ddc180c2774a9bb9f85 +SHA256: 40945b00aedd570f06bc3ee9a630703c68828d051aef494bd28b72f0935f2b1c +SHA512: 4ec11653116e0a0ad22c3bd6afb921cd50ea48dba7865e2be6ed5a538d53e8c7e9692f88b11ba7c1cb07120836bfb13dbd41939952227e6959eb6d3b00ddd80b +Homepage: https://launchpad.net/aptdaemon +Description: Python 3 module for the server and client of aptdaemon + Aptdaemon is a transaction based package management service. It allows + normal users to perform package management tasks, e.g. refreshing the + cache, upgrading the system, installing or removing software packages. + . + This package provides the Python 3 modules required to run aptdaemon + and to implement a client. The API is not stable yet. + +Package: python3-aptdaemon.gtk3widgets +Architecture: all +Version: 2.0.2build1 +Priority: optional +Section: python +Source: aptdaemon +Maintainer: Ubuntu Developers +Original-Maintainer: Julian Andres Klode +Installed-Size: 73 +Depends: aptdaemon-data, gir1.2-gtk-3.0, gir1.2-vte-2.91, python3-aptdaemon (= 2.0.2build1), python3-gi, python3:any +Conflicts: python-aptdaemon-gtk (<< 0.41+bzr582-0ubuntu1) +Replaces: python-aptdaemon-gtk (<< 0.41+bzr582-0ubuntu1) +Filename: pool/python3-aptdaemon.gtk3widgets_2.0.2build1_all.deb +Size: 13042 +MD5sum: 1e816e1e768964d6b50eccd675fcaa3b +SHA1: 664fba81e7e63f6faea970f72b4e9b678b76fdcc +SHA256: 73cd309b596ea5242dae16e53504ec4a15e960d6f06cf109ccf7f4692d34d487 +SHA512: 5812282de56efc23bdfe0c335956016dfc048723146ffae6bfd18f1c7d4b1c6b062fe4e0bc3d957125ce2cab9a52e445f8367463e878daafe786023241420dc0 +Homepage: https://launchpad.net/aptdaemon +Description: Python 3 GTK+ 3 widgets to run an aptdaemon client + Aptdaemon is a transaction based package management daemon. It allows + normal users to perform package management tasks, e.g. refreshing the + cache, upgrading the system, installing or removing software packages. + . + This package provides the Python 3 GTK+ 3 widgets to implement a fully + working graphical client. The widgets can be used to initiate, to + monitor and to control a transaction. The API is not stable yet. + +Package: python3-attr +Architecture: all +Version: 25.4.0-1build1 +Priority: optional +Section: python +Source: python-attrs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 263 +Depends: python3:any +Suggests: python-attr-doc +Filename: pool/python3-attr_25.4.0-1build1_all.deb +Size: 53742 +MD5sum: 81223b38c1af4af783dab2c60f7cc2d8 +SHA1: 22a646bf861b5d2fe741c3ca3739e327762454db +SHA256: 1307217d4b0c7bc7e7edeb3f3102a42d0ceb281f9108132a393235b124c6de40 +SHA512: 22f219cc6f25c39ed2657291bd69610736852eec90944afaacef723285358af0121981de6edd1b2289f4a9fbc99e3296a4236ea3357965d75847a579a7b25043 +Homepage: https://attrs.readthedocs.org/ +Description: Attributes without boilerplate (Python 3) + attrs is an MIT-licensed Python package with class decorators that ease the + chores of implementing the most common attribute-related object protocols. + . + You just specify the attributes to work with and attrs gives you: + - a nice human-readable __repr__, + - a complete set of comparison methods, + - an initializer, + - and much more + without writing dull boilerplate code again and again. + . + This package contains attrs packaged for Python 3. + +Package: python3-autocommand +Architecture: all +Version: 2.2.2-4 +Priority: optional +Section: python +Source: python-autocommand +Maintainer: Ubuntu Developers +Original-Maintainer: Jeroen Ploemen +Installed-Size: 61 +Depends: python3:any +Filename: pool/python3-autocommand_2.2.2-4_all.deb +Size: 13878 +MD5sum: a04b5c70bffb519047edd8db09dc3c03 +SHA1: a4cae90e434f6ddf7e7c9f4f6004f30bddc27802 +SHA256: c8cfcc4d3e59e71b1ecfc36828e6e83dc824f3b641a15783afa368c3f98d1c49 +SHA512: 9efd619c295894f05cd4c6c6e3586d5e425501b1a104feab2f3c010307c6caa9b177a86adf89e504c659e6e2a123104b492ab5ea71bda425b5ba9dac070137a8 +Homepage: https://github.com/Lucretiel/autocommand +Description: library to generate argparse parsers from function signatures + Autocommand is a library to automatically generate and run simple argparse + parsers from function signatures. + . + It turns a function into a command-line program, converting the function's + parameter signature into command-line arguments, and automatically running + the function with these arguments if the module was called as __main__. + Usage messages, invoked with -h or --help, are also created automatically. + +Package: python3-babel +Architecture: all +Version: 2.17.0-2 +Built-Using: unicode-cldr-core (= 46-0.1) +Priority: optional +Section: python +Source: python-babel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 504 +Depends: python-babel-localedata (= 2.17.0-2), python3:any +Filename: pool/python3-babel_2.17.0-2_all.deb +Size: 100730 +MD5sum: 9fa8d2fd97279a641bfdb12eeddf13d1 +SHA1: ec5d64ec3ea9a3c81cab986ddeb12304d566064a +SHA256: ee9520dcbb3574627166ab9ecde1cff2ee66e70af42bd1a00580dd7457ce6239 +SHA512: 4565d67cd8614fe8edfa44147282b7fedf0c0d3568d57fa7c58885a91ada074d9791fecfce5f80eb18d08dc9506bdf0019b470d5bf4f79c8b58d193ab3b74c17 +Homepage: https://babel.pocoo.org/ +Description: tools for internationalizing Python applications - Python 3.x + Babel is composed of two major parts. First tools to build and work with + gettext message catalogs. Second a Python interface to the CLDR (Common + Locale Data Repository), providing access to various locale display + names, localized number and date formatting, etc. + . + This package provides the Python 3.x module. + +Package: python3-bcrypt +Architecture: amd64 +Version: 5.0.0-3build1 +Static-Built-Using: rust-base64 (= 0.22.1-1), rust-bcrypt (= 0.15.1-3), rust-bcrypt-pbkdf (= 0.10.0-1), rust-getrandom (= 0.2.15-4), rust-subtle (= 2.6.1-1) +Priority: optional +Section: python +Source: python-bcrypt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 541 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.34), libgcc-s1 (>= 4.2) +Breaks: python3-passlib (<< 1.9.3-1~) +Filename: pool/python3-bcrypt_5.0.0-3build1_amd64.deb +Size: 220548 +MD5sum: 243d5f955686e2cb184038a7af25423c +SHA1: ad955d814b474d632f81490ee3bddcce7f494e2e +SHA256: 27db1482adbaac3c8f56396096011761c121a34f6a3c54b700fd0c41f6f5ddf3 +SHA512: 8b8901b63f909433cebeb7c5f8cc122a2278d19e1e3ab8e291ba8716de05146cf6bf37cf105374eb4e1319cbd01c7e22961959d22db9017aae7e99c3613f19cf +Homepage: https://github.com/pyca/bcrypt +Description: password hashing library for Python 3 + bcrypt is a Python module which provides a password hashing method based on + the Blowfish password hashing algorithm, as described in + "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres: + http://static.usenix.org/events/usenix99/provos.html. + . + This package provides the bcrypt Python module for Python 3.x. + +Package: python3-blinker +Architecture: all +Version: 1.9.0-2build1 +Priority: optional +Section: python +Source: blinker +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 43 +Depends: python3:any +Suggests: python-blinker-doc +Filename: pool/python3-blinker_1.9.0-2build1_all.deb +Size: 10898 +MD5sum: 65812b00cf19ec052f29d8c9a0c5e12d +SHA1: 26a84b3538bb6cd5c4a130cf05c8e0b62f1cce1e +SHA256: 1272e5991259cd08aa65fc35585d1748b251146b514bfc97a633fdf143dcf63a +SHA512: f99973997263aac1a55a6f2bf8ed104ca0f96ed5d829c1e4244d420b68eae49503fc6028b5c87a37e2592636461d0b45a90f16d18197ec0e9bdd2c68360db580 +Homepage: https://github.com/pallets-eco/blinker +Description: Fast, simple object-to-object and broadcast signaling (Python3) + Blinker provides fast & simple object-to-object and broadcast signaling + for Python objects. Interested signal receivers can subscribe to specific + senders or receive signals sent by any sender. + . + The core of Blinker is quite small but provides powerful features: + * a global registry of named signals + * anonymous signals + * custom name registries + * permanently or temporarily connected receivers + * automatically disconnected receivers via weak referencing + * sending arbitrary data payloads + * collecting return values from signal receivers + * thread safety + . + This package contains the Python 3 version. + +Package: python3-brlapi +Architecture: amd64 +Version: 6.7-1ubuntu6 +Multi-Arch: same +Priority: optional +Section: python +Source: brltty +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 377 +Depends: libbrlapi0.8 (>= 6.7), libc6 (>= 2.34), python3 (<< 3.15), python3 (>= 3.14~) +Filename: pool/python3-brlapi_6.7-1ubuntu6_amd64.deb +Size: 94028 +MD5sum: 6a1371f798e79f7395557b0025a6ab09 +SHA1: 8ab792c2a6a334f057cbb9fb989d4b558e803719 +SHA256: 27e17d7d2e400b9d7ca47c20638b960fb956aa41fe79e086e0a43e8d04ab5e74 +SHA512: 0f1b6f3c764247430037a533e17586681908091a08e8941007a28c382fd3a588dcdfd45b2ea35f85e1ba8dcf555e91bc92e9edad1290c8000864dcfbcf560e62 +Homepage: https://brltty.com +Description: Braille display access via BRLTTY - Python3 bindings + BRLTTY is a daemon which provides access to the console (text mode) + for a blind person using a braille display. It drives the braille + display and provides complete screen review functionality. + . + BrlAPI is a library which gives an application access to a braille display and + lets it write braille. + . + This package provides Python 3 bindings. + +Package: python3-cairo +Architecture: amd64 +Version: 1.27.0-2build2 +Priority: optional +Section: python +Source: pycairo +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 505 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.14), libcairo2 (>= 1.18.4) +Filename: pool/python3-cairo_1.27.0-2build2_amd64.deb +Size: 118842 +MD5sum: be18e82a87a78810cf938591de626ae8 +SHA1: d146b2f4f93990bd12e7d687ccdaf5bd6707f280 +SHA256: 5b6d64aa6e760f53f5fa20e6ce4b5ffbe7a93cb86d0749b1a7a591b1dc961818 +SHA512: 5b609521e4ef5ab4bc804739186e17340ef3791c1991056cbc35b0de757b2d0541c6d4ee575450aa101d62a7e387e7ccaa96c5cffc35686acedcb1b082d65ea8 +Homepage: https://cairographics.org/pycairo/ +Description: Python3 bindings for the Cairo vector graphics library + This package contains modules that allow you to use the Cairo vector + graphics library in Python3 programs. + +Package: python3-certifi +Architecture: all +Version: 2026.1.4+ds-1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-certifi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 42 +Depends: ca-certificates, python3:any +Filename: pool/python3-certifi_2026.1.4+ds-1_all.deb +Size: 10284 +MD5sum: 201244cf9f1d79f00e8ef49a6d7ab63e +SHA1: 3bd6667f67909fae8dae2fbf11b18504b140f5ad +SHA256: 4e84efd4e4b0f3f72b9ec4c8c2c21927e4e4bbf2af8b91aaa39235eaf2e3d3a8 +SHA512: 97d5f9487ae45704982a9c67f56d226f1c51aefbe9768e426965785e6aa87bf3905ee969fa055ba85d30fc597c991da53eb59abb986670d1f949070962412e61 +Homepage: https://github.com/certifi/python-certifi +Description: root certificates for validating SSL certs and verifying TLS hosts (python3) + Certifi is a carefully curated collection of Root Certificates for + validating the trustworthiness of SSL certificates while verifying + the identity of TLS hosts. It has been extracted from the Requests + project. + . + The version of certifi in this Debian package is patched to return + the location of Debian-provided CA certificates, instead of those + packaged by upstream. + . + This is the python3 package. + +Package: python3-cffi-backend +Architecture: amd64 +Version: 2.0.0-3build1 +Multi-Arch: same +Priority: optional +Section: python +Source: python-cffi +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 242 +Provides: python3-cffi-backend-api-9729, python3-cffi-backend-api-max (= 10495), python3-cffi-backend-api-min (= 9729) +Depends: python3 (<< 3.15), python3 (>= 3.14~), libc6 (>= 2.38), libffi8 (>= 3.4) +Filename: pool/python3-cffi-backend_2.0.0-3build1_amd64.deb +Size: 85520 +MD5sum: 2f8f1be41ae6d0828a0d905ec6fe97fb +SHA1: 99e596e5677ddb64a8188348ae4da70dc02af16b +SHA256: 2c826b9005866afc4ffc3e9cbb690ed8de56f01981d9b61f39dc21634170d5db +SHA512: 4c322956e948cb7cd22389de2f9afc374e31597070cf92cb44c12f3a68dead356fb1a379121e085c74bab9d974c6b974ffadcc5bae9267168379e72979a23b13 +Homepage: https://cffi.readthedocs.org/ +Description: Foreign Function Interface for Python 3 calling C code - runtime + Convenient and reliable way of calling C code from Python 3. + . + The aim of this project is to provide a convenient and reliable way of calling + C code from Python. It keeps Python logic in Python, and minimises the C + required. It is able to work at either the C API or ABI level, unlike most + other approaches, that only support the ABI level. + . + This package contains the runtime support for pre-built cffi modules. + +Package: python3-chardet +Architecture: all +Version: 5.2.0+dfsg-2build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: chardet +Maintainer: Ubuntu Developers +Original-Maintainer: Piotr Ożarowski +Installed-Size: 1141 +Depends: python3:any +Breaks: python-chardet (<< 3.0.4-6) +Replaces: python-chardet (<< 3.0.4-6) +Filename: pool/python3-chardet_5.2.0+dfsg-2build1_all.deb +Size: 115430 +MD5sum: 941421de3fdbb0fb3bd56bbe9c371eba +SHA1: 0e69c40ac6bedbc37b812240f67cee919e9c1af9 +SHA256: ca6541b1e2b184f42be7cac8a3967537bb359c28a81bc73ff964a85f78177983 +SHA512: 426e6d644ba7aa16254e3e12e2eb5e572848166b6110582d7e83f134a4a57a1e8be81e594ee43fa381b8d931b4e4c3f5d60f56e8430be1b75fd12ee664e11b46 +Homepage: https://github.com/chardet/chardet +Description: Universal Character Encoding Detector (Python3) + Chardet is a continuation of Mark Pilgrim's excellent original chardet port + from C, and Ian Cordasco's charade Python 3-compatible fork. + Chardet takes a sequence of bytes in an unknown character encoding, and + attempts to determine the encoding. + . + Supported encodings: + * Big5, GB2312/GB18030, EUC-TW, HZ-GB-2312, and ISO-2022-CN (Traditional + and Simplified Chinese) + * EUC-JP, SHIFT_JIS, and ISO-2022-JP (Japanese) + * EUC-KR and ISO-2022-KR (Korean) + * KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, and windows-1251 (Russian) + * ISO-8859-2 and windows-1250 (Hungarian) + * ISO-8859-5 and windows-1251 (Bulgarian) + * ISO-8859-1 and windows-1252 (Western European languages) + * ISO-8859-7 and windows-1253 (Greek) + * ISO-8859-8 and windows-1255 (Visual and Logical Hebrew) + * TIS-620 (Thai) + * UTF-32 BE, LE, 3412-ordered, or 2143-ordered (with a BOM) + * UTF-16 BE or LE (with a BOM) + * UTF-8 (with or without a BOM) + * ASCII + . + This library is a port of the auto-detection code in Mozilla. + . + This package contains the Python 3 version of the library. + +Package: python3-click +Architecture: all +Version: 8.2.0+0.really.8.1.8-1build1 +Priority: optional +Section: python +Source: python-click +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 374 +Depends: python3:any +Breaks: python3-click-threading (<< 0.5.0) +Filename: pool/python3-click_8.2.0+0.really.8.1.8-1build1_all.deb +Size: 80162 +MD5sum: a199bf218a56d53bca30b00644f3ee1f +SHA1: 3d1be41eef0ff232c299d4c5c808984e03d4b9f3 +SHA256: 8ee0b7d16f7fcbc05e6e6ad28ee8d0251d76248eac64b0e9f775f61690fcac05 +SHA512: c3f92334486edab06a92f6f6434734b3bc27b5a1b84199af3a6bd877756dd43c7e93ec0a056cd9a209461a9298fe9448dfce5e9e443674fb41cb573a6e350f0f +Homepage: https://github.com/pallets/click +Description: Command-Line Interface Creation Kit - Python 3.x + Click is a Python package for creating beautiful command line interfaces + in a composable way with as little code as necessary. It's the "Command + Line Interface Creation Kit". It's highly configurable but comes with + sensible defaults out of the box. + . + It aims to make the process of writing command line tools quick and fun + while also preventing any frustration caused by the inability to implement + an intended CLI API. + . + This is the Python 3 compatible package. + +Package: python3-configobj +Architecture: all +Version: 5.0.9-1build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: configobj +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 161 +Depends: python3:any +Suggests: python-configobj-doc +Filename: pool/python3-configobj_5.0.9-1build1_all.deb +Size: 34084 +MD5sum: db01c19e42664c6c36cba3ccdb940402 +SHA1: c98fe6710cb7896d760e36d02e8a761779ad66fb +SHA256: ec9cc28c7991c8309c99b9ba3efaef968bfb6e39f35937e00fe1e5ea65298c67 +SHA512: 116cadf3c3eabe1bcfaabfc045e72c61e3971504fbbe20b427874c29fd6003b0e8bd59a9fb25124be6bd769226b292f5e660951cbba8328a4ca4165becc0cac4 +Homepage: http://www.voidspace.org.uk/python/configobj.html +Description: simple but powerful config file reader and writer for Python 3 + ConfigObj is a simple but powerful config file reader and writer: an + ini file round tripper. Its main feature is that it is very easy to + use, with a straightforward programmer's interface and a simple + syntax for config files. It has lots of other features, though: + . + * Nested sections (subsections), to any level + * List values + * Multiple line values + * String interpolation (substitution) + * Integrated with a powerful validation system + + including automatic type checking/conversion + + and allowing default values + + repeated sections + * All comments in the file are preserved + * The order of keys/sections is preserved + * Full Unicode support + * Powerful unrepr mode for storing/retrieving Python data-types + . + This is the Python 3 version of the package. + +Package: python3-cryptography +Architecture: amd64 +Version: 46.0.5-1ubuntu2 +Priority: optional +Section: python +Source: python-cryptography +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 4334 +Depends: python3-bcrypt, python3, python3-cffi-backend-api-min (<= 9729), python3-cffi-backend-api-max (>= 9729), python3-supported-min (>= 3.11.0) | python3-typing-extensions, python3:any, libc6 (>= 2.34), libgcc-s1 (>= 4.2), libssl3t64 (>= 3.3.0) +Suggests: python-cryptography-doc, python3-cryptography-vectors +Filename: pool/python3-cryptography_46.0.5-1ubuntu2_amd64.deb +Size: 1152640 +MD5sum: d309bdea342e0e1206b403e5d5990f54 +SHA1: 29f0ce2142dfa679c7a20dc3525857e449c90d9a +SHA256: 86f3c885ee9a8b3ba09357752e472a949cc31b3e443efa78a494b83bb3e11f77 +SHA512: ec30a4dfbe651deef94b43688970d9faadf400e63baa8eea9fa87d91b350e8ac599eb8102fb37cba5cc447dac948356c3e2c60835bd5972e6cfc6953f7ee1477 +Homepage: https://cryptography.io/ +Description: Python library exposing cryptographic recipes and primitives + The cryptography library is designed to be a "one-stop-shop" for + all your cryptographic needs in Python. + . + As an alternative to the libraries that came before it, cryptography + tries to address some of the issues with those libraries: + - Lack of PyPy and Python 3 support. + - Lack of maintenance. + - Use of poor implementations of algorithms (i.e. ones with known + side-channel attacks). + - Lack of high level, "Cryptography for humans", APIs. + - Absence of algorithms such as AES-GCM. + - Poor introspectability, and thus poor testability. + - Extremely error prone APIs, and bad defaults. + +Package: python3-cups +Architecture: amd64 +Version: 2.0.4-3build1 +Priority: optional +Section: python +Source: python-cups +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 251 +Depends: python3 (<< 3.15), python3 (>= 3.14~), libc6 (>= 2.38), libcups2t64 (>= 1.7.0) +Filename: pool/python3-cups_2.0.4-3build1_amd64.deb +Size: 61018 +MD5sum: 25c460ba767cf3fc4e1e64d1fb3a28e1 +SHA1: 8a2320cecdcd69cc15c16a26c5f67ce47832b80a +SHA256: caa02488f8c6f8cb8965eb282fc8217cffbfe9794aa88a209e7e2c69b56a0048 +SHA512: 7f7bccc6c1603a24c807cf539b9f57f5d4d53d6488b4ec0c9b1f1d7c3dffcd89a7240c2d4e8f20cb7cd0e698fb882f5de7b3baa5c03b0e8c53315908e7698561 +Homepage: https://github.com/OpenPrinting/pycups +Description: Python3 bindings for CUPS + A module of python3 bindings for using the CUPS 2+ API in + python3 programs. + . + CUPS needs to be installed and running for python3-cups to work + correctly. + +Package: python3-cupshelpers +Architecture: all +Version: 1.5.18-4ubuntu2 +Priority: optional +Section: python +Source: system-config-printer +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 161 +Depends: python3-cups (>= 1.9.42), python3-dbus, python3:any +Filename: pool/python3-cupshelpers_1.5.18-4ubuntu2_all.deb +Size: 33688 +MD5sum: 8eb5f50645eeba8042e833bd2712da9f +SHA1: d71d2bccb7a3a5b3c069f2347ba43086d4d86a31 +SHA256: d933777dfe9e3884ba4027059ce4ca62f8604dba9ff75ba52d9a7a17add0ec9f +SHA512: 21d534428971e8204d70855db3922b1c2ee6d1f7736fa2d5c4a9e6b34f444e2ecc26c84a17ca308c0c4acf2320bb28da6260e850323db26e760f8d07d2ea3109 +Homepage: https://github.com/OpenPrinting/system-config-printer +Description: Python utility modules around the CUPS printing system + These Python modules, that come from the system-config-printer + distribution, help building applications and utilities around the CUPS + Python bindings. + +Package: python3-dasbus +Architecture: all +Version: 1.7-2build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: dasbus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 281 +Depends: python3-gi, python3:any +Filename: pool/python3-dasbus_1.7-2build1_all.deb +Size: 51664 +MD5sum: 22610b9a20562450d74ba921913071e2 +SHA1: 5c9e5d392a7f556163b23d622e06ccfda405a3d7 +SHA256: f23fe76bccef656219f5fa634cec2c14191420c32a6f8befd95b5703cae607c7 +SHA512: 415c392845dede50c2154b4d1f672585af0fb850d9eb25568e13e001143bd05156977895a74eb1b9608fa280ff0d4047308f668dcc9bc885802d67a96522d748 +Homepage: https://github.com/rhinstaller/dasbus +Description: Pythonic D-Bus library + dasbus provides a pythonic interface to the D-Bus message + bus system. dasbus can be used to access remote objects + and also for object publication. + . + This DBus library is written in Python 3, based on GLib and inspired by pydbus. + . + This package installs the library for Python 3. + +Package: python3-dbus +Architecture: amd64 +Version: 1.4.0-1build2 +Priority: optional +Section: python +Source: dbus-python +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 413 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.4), libdbus-1-3 (>= 1.10), libglib2.0-0t64 (>= 2.16.0) +Recommends: python3-gi +Suggests: python-dbus-doc +Filename: pool/python3-dbus_1.4.0-1build2_amd64.deb +Size: 100516 +MD5sum: 82e9fcfafd0ff9a7113d511fd778ae7f +SHA1: d502f22404f48f23de7ce49b3520eead90a6ef34 +SHA256: ce67cc0a2f375bf539b8eb5edaa6a64ed221806f5ea4d0255311be611424b27c +SHA512: b4b28fb1617d43a417ecd807a46c246d5c6966820777f828a43c5d9076af353a154addbdae30cdeef4b0e2305047ed8a3eecd3fee4b6c5ad0d39e385749b4f86 +Homepage: https://www.freedesktop.org/wiki/Software/DBusBindings#Python +Description: simple interprocess messaging system (Python 3 interface) + D-Bus is a message bus, used for sending messages between applications. + Conceptually, it fits somewhere in between raw sockets and CORBA in + terms of complexity. + . + This package provides a Python 3 interface to D-Bus. + . + See the dbus description for more information about D-Bus in general. + +Package: python3-debconf +Architecture: all +Version: 1.5.92 +Priority: optional +Section: python +Source: debconf +Maintainer: Ubuntu Developers +Original-Maintainer: Debconf Developers +Installed-Size: 19 +Depends: debconf (= 1.5.92), python3:any +Filename: pool/python3-debconf_1.5.92_all.deb +Size: 4162 +MD5sum: 83c5c87d4f263435b3879beb0e97a07d +SHA1: e52f1c26b2667cda6e716865ba7bba7453fb568f +SHA256: 7f6b7e83ebfcc512295c151f8144b5df739e043601fe8abbb060261891a43cda +SHA512: 6080f003292845623387b8c103f43e4ecf6691f08cb44f46aa32bb014e9da348f07614d6a79a1dd56467dd4501b3ba08e40a6b22d275f5a3011044bb60f387e6 +Description: interact with debconf from Python 3 + Debconf is a configuration management system for debian packages. Packages + use Debconf to ask questions when they are installed. + . + This package provides a debconf module to allow Python 3 programs to + interact with a debconf frontend. + +Package: python3-debian +Architecture: all +Version: 1.0.1ubuntu2 +Priority: optional +Section: python +Source: python-debian +Maintainer: Ubuntu Developers +Original-Maintainer: Debian python-debian Maintainers +Installed-Size: 608 +Depends: python3:any +Suggests: gpgv, python3-apt, python3-charset-normalizer, zstd +Filename: pool/python3-debian_1.0.1ubuntu2_all.deb +Size: 121490 +MD5sum: 77893e243e5451c1173ef275172f096c +SHA1: d7f4ae468ed327b01f8579de06b546c175822bfa +SHA256: f15459b4c7165015b598b29fe9fa2c25a5a78007ecd7a6af5a7673062eeb3550 +SHA512: 91714c9a47cf1ab3a588d2d4afb539b9c51a22d8ce5cefc12a017cb01e9496896e8b955e78b9046b9856af587ca22797a973277b552331e17e81c81c73512bdf +Homepage: https://salsa.debian.org/python-debian-team/python-debian +Description: Python 3 modules to work with Debian-related data formats + This package provides Python 3 modules that abstract many formats of Debian + related files. Currently handled are: + * Debtags information (debian.debtags module) + * debian/changelog (debian.changelog module) + * Packages files, pdiffs (debian.debian_support module) + * Control files of single or multiple RFC822-style paragraphs, e.g. + debian/control, .changes, .dsc, Packages, Sources, Release, etc. + (debian.deb822 module) + * Raw .deb and .ar files, with (read-only) access to contained + files and meta-information + +Package: python3-decorator +Architecture: all +Version: 5.2.1-2 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-decorator +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 57 +Depends: python3:any +Filename: pool/python3-decorator_5.2.1-2_all.deb +Size: 28060 +MD5sum: 67842d00a8ad86d516e52221f106fa02 +SHA1: 5c2948407e5ead2434f67cbc02e69ae90499978c +SHA256: 45cb8bbd3cf5f012caf2ae4fcd5c68bd3a32480bf1911d0bfaa26f075d3b61c0 +SHA512: b4acc3a313503695ccef477d5552ddae29c65134e7d6f5335c9bae7f044795c9734624920ebc1df74a228768a8cbda8e91988646d76bff4b7ab5c805f70e391f +Homepage: https://github.com/micheles/decorator +Description: simplify usage of Python decorators by programmers + Python 2.4 decorators have significantly changed the way Python programs are + structured. + * decorators help reduce boilerplate code; + * decorators help the separation of concerns; + * decorators enhance readability and maintainability; + * decorators are very explicit. + Still, as of now, writing custom decorators correctly requires some + experience and is not as easy as it could be. For instance, typical + implementations of decorators involve nested functions and we all know that + flat is better than nested. + The aim of the decorator module it to simplify the usage of decorators for + the average programmer and to popularize decorators usage giving examples of + useful decorators, such as memoize, tracing, redirecting_stdout, locked, etc. + +Package: python3-defer +Architecture: all +Version: 1.0.6-2.1ubuntu2 +Priority: extra +Section: python +Source: python-defer +Maintainer: Ubuntu Developers +Original-Maintainer: Sebastian Heinlein (devel) +Installed-Size: 51 +Depends: python3:any (>= 3.2~) +Filename: pool/python3-defer_1.0.6-2.1ubuntu2_all.deb +Size: 10890 +MD5sum: d9fac7a5612230a56d0c1775769dbdbc +SHA1: 3ffb6bffabedc89adb8baaac506f7c10c20d9b95 +SHA256: f0b2c37b1317a1c2c88dafb1570009f31cdbc2fb439e2ae97653446e9d4ee404 +SHA512: 31634a432be5f5e9233439e7a081aa7808e1f8e007f4807045c505b352abd220e593168a08e52fb3fa66135a6fe1cbe3b2c06a3132c9d029d2d1e0c30f336147 +Homepage: https://launchpad.net/python-defer +Description: Small framework for asynchronous programming (Python 3) + The defer module provides an easy way to write asynchrouns Python 3 programs. + It is greatly inspired by Twisted's defer, but hasn't got any external + dependencies. + . + Furthermore it features decorators to write asynchronous D-Bus servers and + clients. + . + At first defer was part of aptdaemon, but moved to a separate project in + August of 2010. + +Package: python3-distro +Architecture: all +Version: 1.9.0-1build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-distro +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 79 +Depends: lsb-release, python3:any +Filename: pool/python3-distro_1.9.0-1build1_all.deb +Size: 16964 +MD5sum: 445a18f2488a34180ea01d4df8c0e595 +SHA1: 7be83317489faed89a9f887b5c21e73007eab3e7 +SHA256: afb074d1d8118a6f414d2d667c6025838ea16529c2ccf9c675e79bdadcea48bf +SHA512: 161ab067cbf5f5bfa38f390d87eb3e5739c49efcfa9f999aa85251fdab581012ca91897d513d22b7210b8ebd90255f1a3bfb01559264d8f751118786820bcc49 +Homepage: https://github.com/python-distro/distro +Description: Linux OS platform information API + distro (for: Linux Distribution) provides information about the Linux + distribution it runs on, such as a reliable machine-readable ID, or version + information. + . + It is a renewed alternative implementation for Python's original + platform.linux_distribution function, but it also provides much more + functionality which isn't necessarily Python bound like a command-line + interface. + . + This is the Python 3 version of the library. + +Package: python3-distro-info +Architecture: all +Version: 1.15 +Priority: optional +Section: python +Source: distro-info +Maintainer: Ubuntu Developers +Original-Maintainer: Benjamin Drung +Installed-Size: 42 +Depends: distro-info-data (>= 0.46), python3:any +Filename: pool/python3-distro-info_1.15_all.deb +Size: 8006 +MD5sum: 958931b83f43e07c5519887dc9c5d866 +SHA1: 723cc1e39f740ecf52b7be2119a4d3da9a7a2f80 +SHA256: 62bb827d8602b9c7aacd25766098b3f75fbca2ef8bdfd7cbacec4db8957a80f5 +SHA512: 7c8a0bc2fd5e8ce10ba7eb3664cd1febbf05d23c29215dad7f50146f54866b5f10f40166262ce09301ad909d37a9a079f5ad3575c6558585bd596bc512435869 +Description: information about distributions' releases (Python 3 module) + Information about all releases of Debian and Ubuntu. + . + This package contains a Python 3 module for parsing the data in + distro-info-data. There is also a command line interface in the distro-info + package. + +Package: python3-distupgrade +Architecture: all +Version: 1:26.04.23 +Priority: optional +Section: python +Source: ubuntu-release-upgrader +Maintainer: Ubuntu Developers +Installed-Size: 489 +Depends: gpgv, lsb-release, procps, python3-apt (>= 0.8.5~), python3-dbus, python3-distro-info, python3-update-manager (>= 1:19.04.2~), sensible-utils, python3:any +Breaks: python3-update-manager (<< 1:0.165) +Replaces: python3-update-manager (<< 1:0.165) +Filename: pool/python3-distupgrade_1%3a26.04.23_all.deb +Size: 101828 +MD5sum: 224c849e7ca5bb2ce082ecc8dad9d947 +SHA1: c93f796c7571503db58e383e6a178a41b3ecf9c6 +SHA256: 2a74be7d4a914eb8c0833c0db92504291e976a58effc97c31d0a27caea6fbf1b +SHA512: fee1cf13676baa8a1a1edb49fbf0a87849a6d93ff81c3358408a7540d17380d0abc7169d7b6fb80e8e5ed43dd719ccfd15a22473001fb152be21d5413d257738 +Description: manage release upgrades + This is the DistUpgrade Python 3 module + +Package: python3-gi +Architecture: amd64 +Version: 3.56.2-1 +Multi-Arch: allowed +Priority: optional +Section: python +Source: pygobject +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 757 +Depends: gir1.2-glib-2.0 (>= 2.86.0-7~), gir1.2-girepository-3.0 (>= 2.86.0-7~), python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.14), libffi8 (>= 3.4), libgirepository-2.0-0 (>= 2.86.0-7~), libgirepository-2.0-0-with-libffi8 (>= 2.86.0-7~), libglib2.0-0t64 (>= 2.86.0-7~) +Breaks: autoradio (<< 3.6.4-1.1~), blueprint-compiler (<< 0.16.0), budgie-desktop (<< 10.9.3-1.1~), entangle (<< 3.0-5.1~), eog (<< 47.0-4~), eom (<< 1.28.0-1.1~), exaile (<< 4.1.4), gedit (<< 48.1-8~), gir1.2-peas-1.0 (<< 1.36.0-6~), gnome-music (<< 48.0), liferea (<< 1.16.1+ds-2.1~), pluma (<< 1.28.0-1.1~), rednotebook (<< 2.39), rhythmbox (<< 3.4.9-2~), streamtuner2 (<< 2.2.2+dfsg-2.3~), totem (<< 43.2-7~) +Filename: pool/python3-gi_3.56.2-1_amd64.deb +Size: 237662 +MD5sum: ec9ec07d10fa1eafa473470248dc03bf +SHA1: 4297274f3776c138173c8ead6289a8c999918b12 +SHA256: dae2c57b518e9d77c00e41f83ee0f3f8de07732c1cc755f4ff1b6fb7bff59a10 +SHA512: 27a8b3868f9b7d97a729f8162b632df82d8c0ed98dcbf6909b98079678c7ea55eb42fa75ac60d0d9148d46141aaf0d99c2eb89ba4b063cfc08cae6509da55dbf +Homepage: https://pygobject.readthedocs.io/ +Description: Python 3 bindings for gobject-introspection libraries + GObject is an abstraction layer that allows programming with an object + paradigm that is compatible with many languages. It is a part of Glib, + the core library used to build GTK+ and GNOME. + . + This package contains the Python 3 binding generator for libraries that + support gobject-introspection, i. e. which ship a gir1.2-- + package. With these packages, the libraries can be used from Python 3. + +Package: python3-httplib2 +Architecture: all +Version: 0.22.0-1ubuntu0.1 +Priority: optional +Section: python +Source: python-httplib2 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 134 +Depends: ca-certificates, python3-pyparsing, python3:any +Breaks: python3-wsgi-intercept (<< 1.9.0) +Filename: pool/python3-httplib2_0.22.0-1ubuntu0.1_all.deb +Size: 32092 +MD5sum: 8e5241767812b0a4f6639d804f0fde1e +SHA1: 3152cee38e73d1b31c848561804f949b6bac1c3a +SHA256: 03af683aa5cf693e72c0dfc2be9ea323b1f16371d113349bcdffe12ee4799321 +SHA512: 90212e42a796078d3d8c5efb514aafcd51887c9e746ad72b75692ffac4881f801dae51c400ec6cdc63bfe0d87c27051901c9a25547900421daf6a2a83b6edea2 +Homepage: https://github.com/httplib2/httplib2 +Description: comprehensive HTTP client library written for Python3 + httplib2.py supports many features left out of other HTTP libraries. + * HTTP and HTTPS + * Keep-Alive + * Authentication + * Caching + * All Methods + * Redirects + * Compression + * Lost update support + * Unit Tested + . + This package provides module for python3 series. + +Package: python3-ibus-1.0 +Architecture: all +Version: 1.5.34~rc2-1 +Priority: optional +Section: python +Source: ibus +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Input Method Team +Installed-Size: 46 +Depends: python3:any, gir1.2-ibus-1.0, python3-gi +Filename: pool/python3-ibus-1.0_1.5.34~rc2-1_all.deb +Size: 7400 +MD5sum: 45da59f93860f46c8301bf7587c250ca +SHA1: 21b4d2b33b78c3ef0d1907184cddc9212001669d +SHA256: 79dfc171d5754ea496b48068a9425212d57bd8842398e49846f24f4bad364314 +SHA512: 74ac115e105b5f58f14b9ed0991a4002602954f5456810e449698292e0e85e13744c6da35aeecbf3192e56a19220ed989ce8860339bbce38c88851b73ba10d6d +Homepage: https://github.com/ibus/ibus +Description: Intelligent Input Bus - introspection overrides for Python (Python 3) + IBus is an Intelligent Input Bus. It is a new input framework for the Linux + OS. It provides full featured and user friendly input method user interface. + It also may help developers to develop input method easily. + . + This package contains GObject Introspection overrides for Python that + can be used by Python applications using IBus. + +Package: python3-idna +Architecture: all +Version: 3.11-1ubuntu0.1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-idna +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 373 +Depends: python3:any +Filename: pool/python3-idna_3.11-1ubuntu0.1_all.deb +Size: 47090 +MD5sum: c970bffea2a3673ad23a88b293f08fb9 +SHA1: 4bc50900fcb90abb234e4254a3492f5339d0ccc4 +SHA256: 3c212bce4961c5b8b3730fa6ebf98800848fe4fb5af1b56e477992ea1e03bcd1 +SHA512: 1b281769f6bc614c79464ea470dd9ca623e534f2d70c3915f5a8907702c7644fd99b494c8e7849a2b3f99314800af906863c131f78653bce423850f9a54b2bdc +Homepage: https://github.com/kjd/idna +Description: Python IDNA2008 (RFC 5891) handling (Python 3) + A library to support the Internationalised Domain Names in Applications (IDNA) + protocol as specified in RFC 5891. This version of the protocol is often + referred to as “IDNA2008” and can produce different results from the earlier + standard from 2003. + . + The library is also intended to act as a suitable drop-in replacement for the + “encodings.idna” module that comes with the Python standard library but + currently only supports the older 2003 specification. + . + This package contains the module for Python 3. + +Package: python3-inflect +Architecture: all +Version: 7.5.0-1build1 +Priority: optional +Section: python +Source: python-inflect +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 148 +Depends: python3-more-itertools, python3-typeguard, python3:any +Filename: pool/python3-inflect_7.5.0-1build1_all.deb +Size: 33984 +MD5sum: 1bc6bd464863c79cc4576605367cc42e +SHA1: fa820bb08216bb870eed6840255b1f1ecc6c5e10 +SHA256: aa434e7c8255eb990cddd176118780337b484b585c26d3f83eeade715c2c6afc +SHA512: 28b311debf3afc20ee0c791fe7b4364d0eb4719500544cd919c4c1e190f95dd3a158e1df81675b56fd5aad0c1f9052bfe018cad44a9b5f174486df4fa0a1bb5c +Homepage: https://github.com/jaraco/inflect +Description: Generate plurals, singular nouns, ordinals, indefinite articles (Python 3) + The inflect Python module correctly generates plurals, singular nouns, + ordinals and indefinite articles. It can also convert numbers to words. + . + This package contains the Python 3 version of this module. + +Package: python3-jaraco.context +Architecture: all +Version: 6.0.1-2 +Priority: optional +Section: python +Source: jaraco.context +Maintainer: Ubuntu Developers +Original-Maintainer: Jeroen Ploemen +Installed-Size: 34 +Depends: python3:any +Filename: pool/python3-jaraco.context_6.0.1-2_all.deb +Size: 8198 +MD5sum: ce2745c257b60ce420f5596b1e0e755d +SHA1: 318d2c40602e84f8f6f91083a01259917f087325 +SHA256: 77a7a93f3ca98d7eb904dce96d3333c3b92afd0b17066c1c1a823f9fd1d41bad +SHA512: 45e9fa6b11f40a5cde4e6d0ab580fbe8dde07a674d5c5216bdb3a440c378a52caa330915217ffc8b8c4d7eb86f496e4052b4f3c69650ec6e09e78f2ab93e12ec +Homepage: https://github.com/jaraco/jaraco.context +Description: jaraco contextlib extensions + Various context managers extending functionality of Python's + contextlib, mostly needed as a dependency of other projects + involving the same upstream developer. + +Package: python3-jaraco.functools +Architecture: all +Version: 4.1.0-1build1 +Priority: optional +Section: python +Source: python-jaraco.functools +Maintainer: Ubuntu Developers +Original-Maintainer: Jeroen Ploemen +Installed-Size: 47 +Depends: python3-more-itertools, python3:any +Filename: pool/python3-jaraco.functools_4.1.0-1build1_all.deb +Size: 11816 +MD5sum: 596f5dac41b2df624f1b68c6716161e6 +SHA1: f5889330fe451a73057e9a32b544e45e47491188 +SHA256: f5ecd527fe2f3bee3313e458b8f3f46c6ed0fe1315192b6b6d9bf02eb47e31f3 +SHA512: c41bd7a13aab2a76b413a1141d6bb732a30e19716c3b0e62b48daa2cb7acc23ccd6432ae02749234f36cdd90135986448c4cb130e05355bd2a5f3909a647bd75 +Homepage: https://github.com/jaraco/jaraco.functools +Description: additional functools in the spirit of stdlib's functools + Jaraco.functools provides additional functools in the spirit of stdlib's + functools, mostly needed as a dependency of other projects by the same + upstream developer such as the 'tempora' module. + +Package: python3-jaraco.text +Architecture: all +Version: 4.0.0-1build1 +Priority: optional +Section: python +Source: jaraco.text +Maintainer: Ubuntu Developers +Original-Maintainer: Jeroen Ploemen +Installed-Size: 47 +Depends: python3-autocommand, python3-jaraco.context, python3-jaraco.functools, python3-more-itertools, python3:any, python3-inflect +Filename: pool/python3-jaraco.text_4.0.0-1build1_all.deb +Size: 11634 +MD5sum: 747b2e3c248e907c53fb2c61ad5e2c63 +SHA1: ac884488686cb49e6fa9bd27adf0555d38707893 +SHA256: 87073055d11204e08b2382e517cb8cb8f28e1eb34e3409ca8c9786dd2f33b9ba +SHA512: 699556a64cf8070b747c83347c7be139c539ef75b567e41a4c25087f054ba68d1574b7b679aa40d515da8054e6fb011a1dc7b08cacc628e06bf0a3d9c6c423bd +Homepage: https://github.com/jaraco/jaraco.text +Description: jaraco text manipulation functions + Text manipulation functions and classes, mostly needed as a dependency + of other projects involving the same upstream developer, including + cherrypy. + +Package: python3-jinja2 +Architecture: all +Version: 3.1.6-1build1 +Priority: optional +Section: python +Source: jinja2 +Maintainer: Ubuntu Developers +Original-Maintainer: Piotr Ożarowski +Installed-Size: 531 +Depends: python3-markupsafe (>= 2.0), python3:any +Recommends: python3-babel +Suggests: python-jinja2-doc +Breaks: python-jinja2 (<< 2.11.1-1) +Replaces: python-jinja2 (<< 2.11.1-1) +Filename: pool/python3-jinja2_3.1.6-1build1_all.deb +Size: 109304 +MD5sum: 20e536f2bf1e1ecd499e17ebb7d49e12 +SHA1: 9ce30ea5ee2ff29cc3a4b3d440358297e33d0c8f +SHA256: 083e378d3d76dfc17b43b26b3663b3081f4ad468ff51f509213cf0fd5fe74048 +SHA512: 421c12d621925b624967ff6bfa2726e30d69080dd86f7bb8ea8cde608d81ae6d4018c3af617568aeec436dd41695bdfbcf71025ffd17e76b4e16c911ef197ea9 +Homepage: http://jinja.pocoo.org/ +Description: small but fast and easy to use stand-alone template engine + Jinja2 is a template engine written in pure Python. It provides a Django + inspired non-XML syntax but supports inline expressions and an optional + sandboxed environment. + . + The key-features are: + * Configurable syntax. If you are generating LaTeX or other formats with + Jinja2 you can change the delimiters to something that integrates better + into the LaTeX markup. + * Fast. While performance is not the primarily target of Jinja2 it’s + surprisingly fast. The overhead compared to regular Python code was reduced + to the very minimum. + * Easy to debug. Jinja2 integrates directly into the Python traceback system + which allows you to debug Jinja2 templates with regular Python debugging + helpers. + * Secure. It’s possible to evaluate untrusted template code if the optional + sandbox is enabled. This allows Jinja2 to be used as templating language + for applications where users may modify the template design. + +Package: python3-json-pointer +Architecture: all +Version: 2.4-4 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-json-pointer +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenStack +Installed-Size: 45 +Depends: python3:any +Filename: pool/python3-json-pointer_2.4-4_all.deb +Size: 8540 +MD5sum: 523fde2d71536ce22baf3ba70490c8aa +SHA1: 68ad71e7f38e3ef962560be86b4ff57c850defc2 +SHA256: 8923fca5667f642b62eb3a6787ec92a4848ed224d8a27bc2781d73df428a99dd +SHA512: 358d33b985b88fa69951ab3de8c49005b9e007083e99d4a5863dface6654932b531c10facf1c68805a22b1483955bfb81542830b9ca3e58c048e207f47ac3e17 +Homepage: https://github.com/stefankoegl/python-json-pointer +Description: resolve JSON pointers - Python 3.x + Python-json-pointer is a small library to resolve JSON pointers according to + the IETF draft specification. JSON Pointer defines a string syntax for + identifying a specific value within a JavaScript Object Notation (JSON) + document. + . + This package provides the module for Python 3.x. + +Package: python3-jsonpatch +Architecture: all +Version: 1.32-6 +Priority: optional +Section: python +Source: python-json-patch +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenStack +Installed-Size: 59 +Depends: python3-json-pointer, python3:any +Filename: pool/python3-jsonpatch_1.32-6_all.deb +Size: 12366 +MD5sum: 09a84aa958a0b11b0fe3a4f3b17b3bab +SHA1: 1aec66f06d7e26e9f20d155c3a07a7bd888e514c +SHA256: 8bd4b12c72de7f2503fbff705ebc259512a26c478118dd66180572e40d054340 +SHA512: 728aa0a14940587dfed6bd4371bfd69d353c889f7102652c09245d15e8d2bb72468930a4ec9135860b5810b4fa3ca1bed8de6c4efa7b04ec6a93e7030ae36ab4 +Homepage: https://github.com/stefankoegl/python-json-patch +Description: library to apply JSON patches - Python 3.x + Python-json-patch is a Python module (a library) to apply JSON Patches + according to the IETF draft specification. + . + From the IETF site: + . + JavaScript Object Notation (JSON) [RFC4627] is a common format for the + exchange and storage of structured data. HTTP PATCH [RFC5789] extends the + Hypertext Transfer Protocol (HTTP) [RFC2616] with a method to perform partial + modifications to resources. + . + JSON Patch is a format (identified by the media type "application/ + json-patch") for expressing a sequence of operations to apply to a target JSON + document, suitable for use with the HTTP PATCH method. + . + This format is also potentially useful in other cases when it's necessary to + make partial updates to a JSON document. + . + This package provides the Python 3.x module. + +Package: python3-jsonschema +Architecture: all +Version: 4.19.2-6ubuntu2 +Priority: optional +Section: python +Source: python-jsonschema +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenStack +Installed-Size: 478 +Depends: python3-attr, python3-jsonschema-specifications, python3-referencing, python3-rpds-py, python3:any +Recommends: python3-idna, python3-json-pointer +Suggests: python-jsonschema-doc, python3-fqdn, python3-isoduration, python3-rfc3339-validator, python3-rfc3986-validator, python3-rfc3987, python3-uritemplate, python3-webcolors +Filename: pool/python3-jsonschema_4.19.2-6ubuntu2_all.deb +Size: 65546 +MD5sum: 145ca6e1b438b978b8803d4355681ab1 +SHA1: 3c46e59d9ceda5889f1710cba319641842d505da +SHA256: b628c6c7ab5020ab78e563d9d7da51abdfdf0e3cca2cbcf2130b6785a7b9f7fe +SHA512: f099e7c2e08798eb50f75ef9d47ef014ab0b013bf32958cb8161ff621229ae09101a6f456c67850614a7f9699658052847b1e9b28feb62cadfedd84a43bd0f1c +Homepage: https://github.com/Julian/jsonschema +Description: An(other) implementation of JSON Schema + JSON Schema is a specification for a JSON-based format for defining the + structure of JSON data. JSON Schema provides a contract for what JSON data is + required for a given application and how it can be modified, much like what + XML Schema provides for XML. JSON Schema is intended to provide validation, + documentation, and interaction control of JSON data. + . + This package has full support for Draft 2020-12, Draft 2019-09, Draft 7, + Draft 6, Draft 4 and Draft 3. + +Package: python3-jsonschema-specifications +Architecture: all +Version: 2023.12.1-4 +Priority: optional +Section: python +Source: python-jsonschema-specifications +Maintainer: Ubuntu Developers +Original-Maintainer: Debian OpenStack +Installed-Size: 81 +Depends: python3-referencing, python3-rpds-py, python3:any +Filename: pool/python3-jsonschema-specifications_2023.12.1-4_all.deb +Size: 9238 +MD5sum: 97d334924214d446fbb777a18ead33eb +SHA1: 70ce9849946f2290c211f0a8c40867aee41d6579 +SHA256: bae21c1970c207a6435f5a2ddee4ee3cec3e7275c9eda3ca32f58eb81ae1524a +SHA512: 61b66b4ca99af15a3d26acaf85bd2505c4704c1901490fb6830295b1aa307dadf0852752c5941b831e0905d500da7f816b87c35b466f31d5ea415b8d287d1b78 +Homepage: https://github.com/python-jsonschema/jsonschema-specifications +Description: JSON Schema meta-schemas and vocabularies, exposed as a Registry + This package contains JSON support files from the JSON Schema Specifications + (metaschemas, vocabularies, etc.), packaged for runtime access from Python as + a referencing-based Schema Registry. + . + This package contains the Python 3.x module. + +Package: python3-jwt +Architecture: all +Version: 2.10.1-4ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: pyjwt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 105 +Depends: python3:any +Recommends: python3-cryptography +Suggests: python-jwt-doc, python3-crypto +Filename: pool/python3-jwt_2.10.1-4ubuntu1_all.deb +Size: 20564 +MD5sum: 34905c6a7011fe662d1fbb861d4d6031 +SHA1: e901edadb56f3fe98af2a8ba34d386d22cf8d27f +SHA256: cbcb368eda304fd96eff92b2f86060ace798546ac9853c7dd5989b2eda9aff17 +SHA512: 0a38f93ad5614e4f5f15c5676cc9d015f4158f0a3662ca84ae3207e05d5f7a43935f8f6597d7bc34f3ec5276a3dc8725c9ae42610fc2fdda009ddc09d1958983 +Homepage: https://github.com/jpadilla/pyjwt +Description: Python 3 implementation of JSON Web Token + PyJWT implements the JSON Web Token draft 01, a way of representing + signed content using JSON data structures. + . + Supported algorithms for cryptographic signing: + . + * HS256 - HMAC using SHA-256 hash algorithm (default) + * HS384 - HMAC using SHA-384 hash algorithm + * HS512 - HMAC using SHA-512 hash algorithm + * ES256 - ECDSA signature algorithm using SHA-256 hash algorithm + * ES256K - ECDSA signature algorithm with secp256k1 curve using SHA-256 + hash algorithm + * ES384 - ECDSA signature algorithm using SHA-384 hash algorithm + * ES512 - ECDSA signature algorithm using SHA-512 hash algorithm + * RS256 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-256 hash + algorithm + * RS384 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-384 hash + algorithm + * RS512 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-512 hash + algorithm + * PS256 - RSASSA-PSS signature using SHA-256 and MGF1 padding with SHA-256 + * PS384 - RSASSA-PSS signature using SHA-384 and MGF1 padding with SHA-384 + * PS512 - RSASSA-PSS signature using SHA-512 and MGF1 padding with SHA-512 + * EdDSA - Both Ed25519 signature using SHA-512 and Ed448 signature using + SHA-3 are supported. Ed25519 and Ed448 provide 128-bit and + 224-bit security respectively + . + Supported reserved claim names: + - "exp" (Expiration Time) Claim + . + This package contains the Python 3 version of the library. + +Package: python3-launchpadlib +Architecture: all +Version: 2.1.0-1build1 +Priority: optional +Section: python +Source: python-launchpadlib +Maintainer: Ubuntu Developers +Original-Maintainer: Stefano Rivera +Installed-Size: 1769 +Depends: python3-httplib2, python3-lazr.restfulclient, python3-lazr.uri, init-system-helpers (>= 1.52), python3:any +Suggests: python3-keyring, python3-pkg-resources, python3-testresources +Filename: pool/python3-launchpadlib_2.1.0-1build1_all.deb +Size: 126482 +MD5sum: 5811f732f37a504e91dd56cd1c7fc123 +SHA1: eb4222a9f0b315e6e0c756441b114ee978f930fb +SHA256: 06e2e6e3b6c4197ce6b2dfcf8eea429aa93ff66c6d88af2fb96f0b9cd3e080af +SHA512: 3589a0700bbbedfc2f11408c2f249de3e152ad86fac03fc03cc87ac0ec6281ed1b1686c36d12597395e1a5e5682ade28ed644bf7cca2bf37e354c2a137ab4c60 +Homepage: https://launchpad.net/launchpadlib +Description: Launchpad web services client library (Python 3) + A free Python library for scripting Launchpad through its web services + interface. + . + It currently provides access to the following parts of Launchpad: + * People and Teams + * Team memberships + * Bugs and bugtasks + . + The Launchpad API is currently in beta, and may well change in ways + incompatible with this library. + . + This package is for Python 3. + +Package: python3-lazr.restfulclient +Architecture: all +Version: 0.14.6-3build1 +Priority: optional +Section: python +Source: lazr.restfulclient +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 178 +Depends: python3-httplib2 (>= 0.7.7), python3-lazr.uri, python3-wadllib (>= 1.1.4), python3-distro, python3-oauthlib, python3-setuptools, python3:any +Filename: pool/python3-lazr.restfulclient_0.14.6-3build1_all.deb +Size: 51126 +MD5sum: 7792ee278ec41426074c036a44b07180 +SHA1: bb04d361c25ae27a026d9f34b08e7591c5270723 +SHA256: dcb6ebf8fb40e44e14eadc0381e777acdbcca268167e1735c16a90d7f79243cb +SHA512: 2d907ec65cacb5d1aab1881c7e3cd0a70a911bd9c7cc9da0455b49a86f0f5c45216a0665031d131691c638e7db562c059b1453fafdd7f0f81f8d2ea0efa94da6 +Homepage: https://launchpad.net/lazr.restfulclient +Description: client for lazr.restful-based web services (Python 3) + A programmable client library that takes advantage of the commonalities + among lazr.rest web services to provide added functionality on top + of wadllib. + +Package: python3-lazr.uri +Architecture: all +Version: 1.0.6-7build1 +Priority: optional +Section: python +Source: lazr.uri +Maintainer: Ubuntu Developers +Original-Maintainer: Stefano Rivera +Installed-Size: 74 +Depends: python3:any +Filename: pool/python3-lazr.uri_1.0.6-7build1_all.deb +Size: 13922 +MD5sum: dc0eb13d26ea03e2edc1948c8e3be821 +SHA1: 2d2de69244d3566bcae8d5e520292dbb6fa74c70 +SHA256: 15bc56d33343538edaba3d695386096521c2d83c47ce68d4021cb29927830806 +SHA512: adfb89c159a028b1cfdb067cdb317d9f1a27b052d08a537245f8852212423a4a3a4473e12262548206523058e38818bf9c6b6fab93ac0e5db9239f2544793a8b +Homepage: https://launchpad.net/lazr.uri +Description: library for parsing, manipulating, and generating URIs + A self-contained, easily reusable, Python library for parsing, + manipulating and generating URIs. With it you can extract parts + of a URL, compare URIs to see if one contains another, search for + URIs in text, and many other things. + . + This package contains the library for Python 3.x. + +Package: python3-linkify-it +Architecture: all +Version: 2.0.3-1ubuntu3 +Priority: optional +Section: python +Source: linkify-it-py +Maintainer: Ubuntu Developers +Original-Maintainer: Georges Khaznadar +Installed-Size: 78 +Depends: python3-uc-micro, python3:any, python3 +Filename: pool/python3-linkify-it_2.0.3-1ubuntu3_all.deb +Size: 19384 +MD5sum: 0bd4a47df6fe184515381f5b55d4752b +SHA1: e0e3cefb36ecf5efca3af0951116089f0fa517e8 +SHA256: 7f1d1593dad089a66f684da1a08cb1a85ba5bb8a272192d4d9573492da9b86e0 +SHA512: 95d2440950b26e93ea4039ebe41e9c5e839b9bf9b709faf0845f22ea32b0acaa85c0f42c266651c02d002346155c0881712d5e5241852c21bb3f6f3463173ae4 +Homepage: https://github.com/tsutsu3/linkify-it-py +Description: links recognition library with FULL unicode support + linkify-it-py is focused on high quality link patterns detection in plain text. + . + Why it's awesome: + . + - Full unicode support, with astral characters! + - International domains support. + - Allows rules extension & custom normalizers. + +Package: python3-louis +Architecture: all +Version: 3.36.0-1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: liblouis +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 53 +Depends: python3:any, liblouis20 (>= 3.36.0-1) +Filename: pool/python3-louis_3.36.0-1_all.deb +Size: 9678 +MD5sum: 423f9840f6100132ac1858d103f7f25a +SHA1: f7d15f35be7ba849807ed0167f3802cec8dbb8dd +SHA256: bd27383bd95e85ea30d7c5d7e5d1c25dba8752eebd3549d94f2f2fc627edc269 +SHA512: 2d7125150842394c81b1428e6e1db7c309e35077312c84d59ad2b59281dcb491f01b09f0e8e1289f22c84855b8218e0c23e69f3bb59772e7a73a79d564d03c1b +Homepage: http://liblouis.org/ +Description: Python bindings for liblouis + Liblouis is a braille translator and back-translator. It features support for + computer and literary braille, supports contracted and uncontracted translation + for many languages and has support for hyphenation. Liblouis also supports + math braille (Nemeth and Marburg). + . + This package contains Python bindings. + +Package: python3-markdown-it +Architecture: all +Version: 3.0.0-3build1 +Priority: optional +Section: python +Source: markdown-it-py +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 280 +Depends: python3-mdurl, python3:any, python3-linkify-it +Breaks: python3-mdit-py-plugins (<< 0.4.0-1) +Filename: pool/python3-markdown-it_3.0.0-3build1_all.deb +Size: 54402 +MD5sum: b85988e0e3366503951c7d29ad98c050 +SHA1: efced274d0d950916b8e2a2432c25bacac8e78cd +SHA256: 4c1bcfe37221a20c98324f543aee6eb110f928232c32e16568c1ec5ee8ee66ef +SHA512: 72b80953e2abd200044e09641ce572ec3f964ce1c0e7874a152598b51c19d39dfa06b62a6371f0f485465fdc3715942122a79f9fef58d1f061cb707a852e17df +Homepage: https://github.com/executablebooks/markdown-it-py +Description: Python port of markdown-it and some its associated plugins + High speed Python markdown parser based in markdown-it. markdown-it-py + follows the CommonMark spec for baseline parsing. Also, new syntax + rules can be added and even replace existing ones. New syntax extensions + can be added to extend the parser. + +Package: python3-markupsafe +Architecture: amd64 +Version: 3.0.3-1build1 +Priority: optional +Section: python +Source: markupsafe +Maintainer: Ubuntu Developers +Original-Maintainer: Piotr Ożarowski +Installed-Size: 52 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.14) +Filename: pool/python3-markupsafe_3.0.3-1build1_amd64.deb +Size: 11812 +MD5sum: 262bd76f0753631dab87f84d221ebef3 +SHA1: d6717aeb8743a2a16c4fe2798f07cc499ea866ee +SHA256: 3580a536b61dd32b468468f371e3dba1fe39d8cc27ba0eec66e3cafd069ba1ca +SHA512: 68d781c475d85e11b0b237da9635fa415b7d3f953ff58195a7e64a5f2dc00030a3a473643bcd55469bf7264216be9dfc6e456ff6d45d8bacf56fcde7f45e4ebd +Homepage: https://palletsprojects.com/p/markupsafe/ +Description: HTML/XHTML/XML string library + MarkupSafe is a Python library implementing a unicode subclass that is + aware of HTML escaping rules. It can be used to implement automatic + string escaping. + +Package: python3-mdurl +Architecture: all +Version: 0.1.2-1build1 +Priority: optional +Section: python +Source: mdurl +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 42 +Depends: python3:any +Filename: pool/python3-mdurl_0.1.2-1build1_all.deb +Size: 9328 +MD5sum: b24902088265edd807d6e17210822814 +SHA1: aeddedc77b5e12d164c26b3c96707ffe5f9d5828 +SHA256: 3d22adc869c549e73aac71decc9aa196540fa3706c97b652ce940ebc876de7ac +SHA512: 0c0b90e30bec6abd59d4201b9447d11316346ca1044db08e0c2bdf8a2bacd0813146eba7fcad739dba526b87f391a989602a5b85735c007905c22e8fc262728c +Homepage: https://github.com/executablebooks/mdurl +Description: Python port of the JavaScript mdurl package + mdurl is a set of URL utilities for the markdown-it-py package. It + provides a pure-Python implementation of several functions from the + original JavaScript package, such as .decode(), .parse(), .encode(). + +Package: python3-minimal +Architecture: amd64 +Version: 3.14.3-0ubuntu2 +Multi-Arch: allowed +Priority: optional +Section: python +Source: python3-defaults +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 110 +Pre-Depends: python3.14-minimal (>= 3.14.3) +Filename: pool/python3-minimal_3.14.3-0ubuntu2_amd64.deb +Size: 25808 +MD5sum: 672367a1d35198eb8dcdd6b3072a74d6 +SHA1: 33acf72810c101556efde03ca901e910afc8cb4e +SHA256: d5f37616b30209d8c10c4a705d7bf9558ca21e058fc2b2bd2ffcf37a74a42861 +SHA512: e45a8b4d3ee89c9c30f3c2a31af1dfc5600dd4a541f4fcf42abb4946870076ad2dfa3a629699aa204d77db9d17ae58529eee5202cd6e89f8af14a5a9ec9b96a5 +Homepage: https://www.python.org/ +Description: minimal subset of the Python language (default python3 version) + This package contains the interpreter and some essential modules. It's used + in the boot process for some basic tasks. + See /usr/share/doc/python3.14-minimal/README.Debian for a list of the modules + contained in this package. +Cnf-Visible-Pkgname: python3 + +Package: python3-more-itertools +Architecture: all +Version: 10.8.0-1build1 +Priority: optional +Section: python +Source: more-itertools +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 308 +Depends: python3:any +Filename: pool/python3-more-itertools_10.8.0-1build1_all.deb +Size: 63658 +MD5sum: c2735944f0ce61bf581d501338731343 +SHA1: ccce07a09f110fddcbd68e55d267f001c1519b88 +SHA256: b73e8627d39af347eb3e5cab4cf3fc4e2bf0780f52b6f3e14b6eaf07174b0719 +SHA512: dd2f2ffc4db823aece29cf80a521510c5bb58c8b5404d930407c9ab3d6c43f8c10adfde4fa0850e5701193ec64fa29d54679902462a75eba0e61de2b3b828f1e +Homepage: https://github.com/more-itertools/more-itertools/ +Description: library with routines for operating on iterables, beyond itertools (Python 3) + Python's itertools library is a gem - you can compose elegant solutions + for a variety of problems with the functions it provides. + More-itertools collects additional building blocks, recipes, + and routines for working with Python iterables. + . + This package contains the module for Python 3. + +Package: python3-netplan +Architecture: amd64 +Version: 1.2-1ubuntu5.1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: netplan.io +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Networking Team +Installed-Size: 150 +Depends: python3, python3:any, libc6 (>= 2.4), libnetplan1 (= 1.2-1ubuntu5.1), python3-cffi-backend +Breaks: netplan.io (<< 0.107-3~) +Replaces: netplan.io (<< 0.107-3~) +Filename: pool/python3-netplan_1.2-1ubuntu5.1_amd64.deb +Size: 24810 +MD5sum: d0db07e36019ec8c3af33f969073ef42 +SHA1: d4af55dea15a37287604c6de2ea64584ef09ad53 +SHA256: 724ce127da1578e45e54b0c9772e6059cb0320c5225e13cedd49f3dabdc5331f +SHA512: f4755bc2817a5c4c7370cb07c492a6494b88a76d6d624ab810b1920eed57ea1390e2e8661e91392fe21c628dd4d940bd71389234cb7ff0cef7f176818139936d +Homepage: https://netplan.io/ +Description: Declarative network configuration Python bindings + Netplan reads YAML network configuration files which are written + by administrators, installers, cloud image instantiations, or other OS + deployments. During early boot it then generates backend specific + configuration files in /run to hand off control of devices to a particular + networking daemon. + . + Currently supported backends are networkd and NetworkManager. + . + This package provides a CFFI based Python bindings to libnetplan. + +Package: python3-oauthlib +Architecture: all +Version: 3.3.1-1build1 +Priority: optional +Section: python +Source: python-oauthlib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 581 +Depends: python3:any, python3-blinker, python3-cryptography, python3-jwt +Filename: pool/python3-oauthlib_3.3.1-1build1_all.deb +Size: 93656 +MD5sum: 5fe5e32e9425956a58d7a580213992e6 +SHA1: 8479fdd1b4017ebd71f13e7898e76987978ac4cc +SHA256: 55ecdecf703c95993ae9e31579bd8fe03ba3dee7648afdec31e88f457f506ab9 +SHA512: 5a64e8fc22e412df8a801e9f8cd19897d696d66cc462b2f6a43f69221843905dfff39566b4299612fe3d81d2832992f615f7e816fd7888dc0634f229968db526 +Homepage: https://github.com/idan/oauthlib +Description: generic, spec-compliant implementation of OAuth for Python3 + OAuthLib is a generic utility which implements the logic of OAuth without + assuming a specific HTTP request object. It can be used to graft OAuth support + onto HTTP libraries. + . + OAuth 1 is fully supported per the RFC for both clients and providers. + . + OAuth 2 client and provider support for: + . + - Authorization Code Grant + - Implicit Grant + - Client Credentials Grant + - Resource Owner Password Credentials Grant + - Refresh Tokens + - Bearer Tokens + - Draft MAC tokens + - Token Revocation + - OpenID Connect Authentication + . + This package contains the Python 3 version of the library. + +Package: python3-olefile +Architecture: all +Version: 0.47-1build1 +Priority: optional +Section: python +Source: olefile +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 160 +Depends: python3:any +Filename: pool/python3-olefile_0.47-1build1_all.deb +Size: 37248 +MD5sum: 386fd83f69a32e93ac57c48ab6ba9df2 +SHA1: 3a969faf1a40b6ebd5b1acb85173b0c24d46b943 +SHA256: 0253e3bc965d6c622795f3cd241fd214170bc1a59a2077eb64b4fa63f77e510c +SHA512: 2f755612eb06890c33e19cf94b76ce1d9ce31e32d691f44f2b9403fe46d7f000ff1564dae3bc3f2cceb181919173bbea5fca2313dde08e4e1d32344402049c22 +Homepage: http://www.decalage.info/olefile +Description: Python module to read/write MS OLE2 files + Python package to parse, read and write Microsoft OLE2 files (also called + Structured Storage, Compound File Binary Format or Compound Document File + Format), such as Microsoft Office 97-2003 documents, vbaProject.bin in + MS Office 2007+ files, Image Composer and FlashPix files, Outlook MSG files, + StickyNotes, several Microscopy file formats, McAfee antivirus quarantine + files, etc. + +Package: python3-passlib +Architecture: all +Version: 1.9.3-1ubuntu1 +Built-Using: sphinx (= 8.2.3-11) +Priority: optional +Section: python +Source: python-passlib +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 4519 +Depends: python3:any, libjs-sphinxdoc (>= 8.2) +Suggests: python3-legacycrypt +Filename: pool/python3-passlib_1.9.3-1ubuntu1_all.deb +Size: 536520 +MD5sum: 3b3634b4c4e6b19fbea81cfe572e4b3b +SHA1: 004e585c0b497a4c7bbe6329494b0e8926a2fb5d +SHA256: aa9de2e4f8240e51d4c2ed301338caa6844363b1ac0ea15616db1d1e4fd70a76 +SHA512: c24280ec1278ea3bc5f63accb7bd995dce37956b6712763d9d3baa705e164bb8424613e542cc2df91fdf3cdf79929474cc18b9740dcb2a6e2e8edc83fe6f1201 +Homepage: https://github.com/notypecheck/passlib +Description: comprehensive password hashing framework + Password hashing library for Python 3, which provides cross-platform + implementations of over 20 password hashing algorithms, as well as a + framework for managing existing password hashes. It's designed to be useful + for a wide range of tasks; from verifying a hash found in /etc/shadow, to + providing full-strength password hashing for multi-user applications. + +Package: python3-pexpect +Architecture: all +Version: 4.9-4 +Priority: optional +Section: python +Source: pexpect +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 212 +Depends: python3-ptyprocess, python3:any +Suggests: python-pexpect-doc +Filename: pool/python3-pexpect_4.9-4_all.deb +Size: 48350 +MD5sum: d659fe60a182fe7e5f11c949a36c81b5 +SHA1: eeaa99c226f4943a17d4a657014f1be6e07093b7 +SHA256: 882349bec3cdc45b8db110baadb4ab71152577cfa2714f45670f0c8026006588 +SHA512: 7966f9ae5eea5e6a79a2b52bcc9269dddd5fb2654cbe59bd8896e14be5c6d01dc747015fdef433898b32f0cff2ae9333d5df45910f93138fe09d5817f91eeed7 +Homepage: https://github.com/pexpect/pexpect +Description: Python 3 module for automating interactive applications + Pexpect is a pure Python 3 module for spawning child applications; + controlling them; and responding to expected patterns in their + output. Pexpect works like Don Libes' Expect. Pexpect allows your + script to spawn a child application and control it as if a human were + typing commands. + +Package: python3-pil +Architecture: amd64 +Version: 12.1.1-2ubuntu1.3 +Multi-Arch: same +Priority: optional +Section: python +Source: pillow +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 1968 +Provides: python3-pillow +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, media-types | python3-pil.imagetk, libc6 (>= 2.14), libfreetype6 (>= 2.10.1), libimagequant0 (>= 2.11.10), libjpeg8 (>= 8c), liblcms2-2 (>= 2.7), libopenjp2-7 (>= 2.4.0), libraqm0 (>= 0.7.0), libtiff6 (>= 4.0.3), libwebp7 (>= 1.5.0), libwebpdemux2 (>= 1.5.0), libwebpmux3 (>= 1.5.0), libxcb1, zlib1g (>= 1:1.1.4) +Recommends: python3-olefile +Suggests: python-pil-doc +Conflicts: python3-imaging (<< 1.1.7+2.0.0-1.1) +Breaks: python3-imaging (<< 1.1.7+2.0.0-1.1) +Replaces: python3-imaging (<< 1.1.7+2.0.0-1.1) +Filename: pool/python3-pil_12.1.1-2ubuntu1.3_amd64.deb +Size: 488496 +MD5sum: 2c1967df5b830be68e314738f03e421d +SHA1: 4ed19f6a02b5ca83733fb1674302cff25965a5e0 +SHA256: 0e33c688dbe2842ed401b7bc7ef901fb1bc41c117825d50a06f5d88fcc4534f0 +SHA512: 58f0b75d4c7438be08afb129f0594185ce8655016a6f712572babb1d7566da9694bb12f5927d36895448dd211d44716fc7e32a72b338a592f33dc170ca732395 +Homepage: http://python-pillow.github.io/ +Description: Python Imaging Library (Python3) + The Python Imaging Library (PIL) adds an image object to your Python + interpreter. You can load images from a variety of file formats, and + apply a rich set of image operations to them. + . + Image Objects: + o Bilevel, greyscale, palette, true colour (RGB), true colour with + transparency (RGBA). + o colour separation (CMYK). + o Copy, cut, paste operations. + o Flip, transpose, resize, rotate, and arbitrary affine transforms. + o Transparency operations. + o Channel and point operations. + o Colour transforms, including matrix operations. + o Image enhancement, including convolution filters. + . + File Formats: + o Full (Open/Load/Save): BMP, EPS (with ghostscript), GIF, IM, JPEG, + MSP, PDF, PNG, PPM, TIFF, XBM. + o Read only (Open/Load): ARG, CUR, DCX, FLI, FPX, GBR, GD, ICO, IMT, IPTC, + MCIDAS, MPEG, PhotoCD, PCX, PIXAR, PSD, TGA, SGI, SUN, TGA, WMF, XPM. + o Save only: PDF, EPS (without ghostscript). + +Package: python3-pkg-resources +Architecture: all +Version: 78.1.1-0.1build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: setuptools +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 696 +Depends: python3-autocommand, python3-inflect, python3-jaraco.context, python3-jaraco.functools, python3-more-itertools, python3:any +Suggests: python3-setuptools +Breaks: python3-setuptools (<< 75.2) +Replaces: python3-setuptools (<< 75.2) +Filename: pool/python3-pkg-resources_78.1.1-0.1build1_all.deb +Size: 144256 +MD5sum: 897fa2142b376f04e675c4e2cb34dfba +SHA1: 99d9cd2a2b1a3fb2683a9025265d4f91795ec03b +SHA256: 766b8dbdb1c8eab99a03f8a3717038c874344e801d5aae99fb1f546f11a6d0a1 +SHA512: 1afcf3fc172a227f52106fa87c7b9e20b8160eab23b61ad8e902d40b1c4d750adee0a237bba62cd74310ebe556c095fb1cb753d14ed51e62b82fc861ddf75813 +Homepage: https://pypi.python.org/pypi/setuptools +Description: Package Discovery and Resource Access using pkg_resources + The pkg_resources module provides an API for Python libraries to + access their resource files, and for extensible applications and + frameworks to automatically discover plugins. It also provides + runtime support for using C extensions that are inside zipfile-format + eggs, support for merging packages that have separately-distributed + modules or subpackages, and APIs for managing Python's current + "working set" of active packages. + +Package: python3-problem-report +Architecture: all +Version: 2.34.1-0ubuntu0.1 +Priority: optional +Section: python +Source: apport +Maintainer: Ubuntu Developers +Installed-Size: 55 +Depends: python3:any +Suggests: python3-zstandard +Filename: pool/python3-problem-report_2.34.1-0ubuntu0.1_all.deb +Size: 17404 +MD5sum: c321fcd3d28fa6aed9b584d55e98d351 +SHA1: 062e16fe73960841a2bf8c174078c552845b5e17 +SHA256: 54ac0d4bb7bbab4a460c1113437922d90fa3e47927d9fb675fd0f43ca2fbb814 +SHA512: e7fb23a8dc1afd20cd8ff67375220f6633d083c9d678ec107c8bd13f40f8c9a390dcaedc65069491a3433eceed78292431d5a1e872727f7809e18f43de28aa0c +Homepage: https://wiki.ubuntu.com/Apport +Description: Python 3 library to handle problem reports + This Python library provides an interface for creating, modifying, + and accessing standardized problem reports for program and kernel + crashes and packaging bugs. + . + These problem reports use standard Debian control format syntax + (RFC822). + +Package: python3-prometheus-client +Architecture: all +Version: 0.21.1+ds1-1build1 +Priority: optional +Section: python +Source: python-prometheus-client +Maintainer: Ubuntu Developers +Original-Maintainer: Christopher Baines +Installed-Size: 248 +Depends: python3-decorator, python3:any (>= 3.8~) +Filename: pool/python3-prometheus-client_0.21.1+ds1-1build1_all.deb +Size: 46012 +MD5sum: 4901f52b2b7decf4ef0f4a632aefe70d +SHA1: 7c8418072d5606ff9fea4a703d0109fc4543869c +SHA256: 4719a6da616cd27b23a06dff86a3a6d2923e09a2c6bfa4b7af30c68e5810fe59 +SHA512: 8a938afa579431ab7c77425d30ec057b7e55748e59106568fa4faa17e02d764c92bcb83eac48c545e74bd266d95b750c518058f17cb74a0cf9d67c8c159e9d81 +Homepage: https://github.com/prometheus/client_python +Description: Python 3 client for the Prometheus monitoring system + This library provides an API for exporting metrics from a Python 3 application + It provides classes for the metric types, and an HTTP server to expose the + metrics to Prometheus. + . + When using Linux, the process CPU, RAM, file descriptor usage and start time + will also be exported. + . + Along with the HTTP server to expose metrics, you can also write the metrics + to a text file to be exported by the prometheus-node-exporter, or push them to + the prometheus-pushgateway. + . + This library also includes support for re-exporting Graphite metrics to + Prometheus, custom collectors to proxy metrics for other systems and a parser + for the Prometheus text format. + +Package: python3-psutil +Architecture: amd64 +Version: 7.1.0-1ubuntu1 +Priority: optional +Section: python +Source: python-psutil +Maintainer: Ubuntu Developers +Original-Maintainer: Sandro Tosi +Installed-Size: 1109 +Depends: python3 (>= 3~), python3:any, libc6 (>= 2.34) +Filename: pool/python3-psutil_7.1.0-1ubuntu1_amd64.deb +Size: 190812 +MD5sum: 2511c3bab8756ee9de4ab99d553ca982 +SHA1: 530e1bf0cc352b1990227fc75a8cf42ada9221ea +SHA256: e32074ff3ab5dd5ba76fad23867ff73fbe11953a28614a11adea96e9721e1d16 +SHA512: 487fb366a5f4ac0e404b5d94c04a19b4d56cca376f60ea3b4a33a461d3abfe65583142fcb2d8b9e5c7f30db087f53eb1c3d036139f0a297cd20c4d9db944c1c0 +Homepage: https://github.com/giampaolo/psutil +Description: module providing convenience functions for managing processes (Python3) + psutil is a module providing an interface for retrieving information on + running processes and system utilization (CPU, memory) in a portable way + by using Python, implementing many functionalities offered by tools like + ps, top and Windows task manager. + . + It currently supports Linux, OS X, FreeBSD and Windows. + . + This package contains the Python 3 version of psutil. + +Package: python3-ptyprocess +Architecture: all +Version: 0.7.0-6build1 +Priority: optional +Section: python +Source: ptyprocess +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 59 +Depends: python3:any +Filename: pool/python3-ptyprocess_0.7.0-6build1_all.deb +Size: 14964 +MD5sum: c4a9c066b8cccf5e5b6188372a2d2d96 +SHA1: cb3c5cdd9ff3b7ce7245382152336fe05e07ed64 +SHA256: cb9e6bf2015a53e6512670d5a5b0b1597e7243d7a80cf4e795cccded51b48b2a +SHA512: 997f3bdf3ab40711a3d575726309accd8d2da3a68a431a1807ea7fc3ea92a502261f66e62d08fa85e3b39d0890d0353cd92f1fc928cf901de36308a86313700f +Homepage: https://github.com/pexpect/ptyprocess +Description: Run a subprocess in a pseudo terminal from Python 3 + Launch a subprocess in a pseudo terminal (pty), and interact with both + the process and its pty. + . + Sometimes, piping stdin and stdout is not enough. There might be a password + prompt that doesn't read from stdin, output that changes when it's going to + a pipe rather than a terminal, or curses-style interfaces that rely on a + terminal. If you need to automate these things, running the process in a + pseudo terminal (pty) is the answer. + . + This package installs the library for Python 3. + +Package: python3-pygments +Architecture: all +Version: 2.19.2+dfsg-1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: pygments +Maintainer: Ubuntu Developers +Original-Maintainer: Piotr Ożarowski +Installed-Size: 4582 +Depends: python3:any +Suggests: python-pygments-doc, ttf-bitstream-vera +Breaks: python-pygments (<< 2.3.1+dfsg-4~) +Replaces: python-pygments (<< 2.3.1+dfsg-4~) +Filename: pool/python3-pygments_2.19.2+dfsg-1_all.deb +Size: 843366 +MD5sum: 6e86ebfaab6694dbfdf48a4600ebe922 +SHA1: 816651debd834582d5b16d1c146d1aad3c931287 +SHA256: 04752577e04f168907da62beb805286c5781febe089359030676d729bea7dd2e +SHA512: 7b207fe656343d5cd407f857769c3039777dacaef4acaaa2835133966e72d98398c276a57e1185b7724612cac8591a617fb49347f0a04ec6b3646e444cecbb04 +Homepage: https://pygments.org/ +Description: syntax highlighting package written in Python 3 + Pygments aims to be a generic syntax highlighter for general use in all kinds + of software such as forum systems, wikis or other applications that need to + prettify source code. + . + Highlights are: + * a wide range of common languages and markup formats is supported + * special attention is paid to details, increasing quality by a fair amount + * support for new languages and formats are added easily + * a number of output formats, presently HTML, LaTeX and ANSI sequences + * it is usable as a command-line tool and as a library + +Package: python3-pyparsing +Architecture: all +Version: 3.3.2-2 +Multi-Arch: foreign +Priority: optional +Section: python +Source: pyparsing +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 485 +Depends: python3:any +Suggests: python-pyparsing-doc +Filename: pool/python3-pyparsing_3.3.2-2_all.deb +Size: 98588 +MD5sum: 426be7359448d8cd3f908a807e661b1c +SHA1: 18b98ed1142f0226968f8f1801284582b9877401 +SHA256: 17a8fadfaf4fd4608e4559863de48aa7be64dfb6a7c48c7386337b92d2412e84 +SHA512: e7cfb80357fad7146d0b0f8cd05c9c2134bc92cf861e7c5d5101dde3ddd2d34d7ac2924956fa3f5859622dd36ba235359c735eca14c9387b4e88d498722a89a3 +Homepage: https://github.com/pyparsing/pyparsing/ +Description: alternative to creating and executing simple grammars - Python 3.x + The parsing module is an alternative approach to creating and + executing simple grammars, vs. the traditional lex/yacc approach, or + the use of regular expressions. The parsing module provides a + library of classes that client code uses to construct the grammar + directly in Python code. + . + Here's an example: + . + from pyparsing import Word, alphas + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print(hello, "->", greet.parseString(hello)) + +Package: python3-referencing +Architecture: all +Version: 0.36.2-1ubuntu2 +Priority: optional +Section: python +Source: referencing +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 136 +Depends: python3-attr, python3-rpds-py, python3-supported-min (>= 3.13) | python3-typing-extensions, python3:any +Filename: pool/python3-referencing_0.36.2-1ubuntu2_all.deb +Size: 22244 +MD5sum: 366fa6f0018be87e64857ff52424564c +SHA1: 4fe9b2a69908f8aa78e2b32458cf66cecc166467 +SHA256: c3388fd31aa4c9c8c84baf62ada45b01ec33548e56c69707c98d95c7853582be +SHA512: 01f723926a43a22860ec6cc26b04be2e725aaf35d87a4d507e4ae55765e515e43d11226ea3f9fbb5c1ae032fa62f6d92441fdd621bfcf1910a57c149d22a0539 +Homepage: https://github.com/python-jsonschema/referencing +Description: Implementation-agnostic implementation of JSON reference resolution + A way for e.g. JSON Schema tooling to resolve the $ref keywords + across all drafts without needing to implement support themselves. + . + This library is meant for use both by implementers of JSON + referencing-related tooling – like JSON Schema implementations + supporting the $ref keyword – as well as by end-users using said + implementations who wish to then configure sets of resources (like + schemas) for use at runtime. + . + This package installs the library for Python 3. + +Package: python3-requests +Architecture: all +Version: 2.32.5+dfsg-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: requests +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 242 +Depends: python3-certifi, python3-chardet (>= 3.0.2), python3-idna, python3-urllib3 (>= 1.21.1), python3:any, ca-certificates +Suggests: python3-cryptography, python3-idna (>= 2.5), python3-openssl, python3-socks, python-requests-doc +Breaks: awscli (<< 1.11.139) +Filename: pool/python3-requests_2.32.5+dfsg-1ubuntu1_all.deb +Size: 53138 +MD5sum: a4b64d1ab1330156cfaf1a0bd426d9ba +SHA1: aebb610eb6fe00aaefce9bdc56973fee4419ed40 +SHA256: 9c7aa89bdfa0a57289a59ad4a7f16465dca265d7c5601f680e33f5264db9c3d0 +SHA512: a432ca54f65db0f6da3371aacc02512134ba69b0c6e8d15a6e60e8901fabe2efcf43faa9d994857e60529f4d0c0ed8aa54882ee5d799d0cff478bbbd0a0b4633 +Homepage: https://requests.readthedocs.io/ +Description: elegant and simple HTTP library for Python3, built for human beings + Requests allow you to send HTTP/1.1 requests. You can add headers, form data, + multipart files, and parameters with simple Python dictionaries, and access + the response data in the same way. It's powered by httplib and urllib3, but + it does all the hard work and crazy hacks for you. + . + Features + . + - International Domains and URLs + - Keep-Alive & Connection Pooling + - Sessions with Cookie Persistence + - Browser-style SSL Verification + - Basic/Digest Authentication + - Elegant Key/Value Cookies + - Automatic Decompression + - Unicode Response Bodies + - Multipart File Uploads + - Connection Timeouts + . + This package contains the Python 3 version of the library. + +Package: python3-rich +Architecture: all +Version: 13.9.4-1.2 +Priority: optional +Section: python +Source: rich +Maintainer: Ubuntu Developers +Original-Maintainer: Sandro Tosi +Installed-Size: 1053 +Depends: python3-markdown-it, python3-pygments (>= 2.19.0), python3:any +Breaks: python3-textual (<< 2.1.2-1.1~) +Filename: pool/python3-rich_13.9.4-1.2_all.deb +Size: 190412 +MD5sum: 5a9fa0e95a9b0483fcc918ef3e3d0a94 +SHA1: 1a4ad6c961885d00ecf251fd09d39f615bacc07d +SHA256: 5bf416727be0d0f9120f3241502525e22f600a92fd7c5d6ccf1192a3afdf3d87 +SHA512: 032d942342211eed09629f24b9cea990abf1facb6f232e552960965482d9574afb43e7661ebbc2f1c40f45b00e5c5745fa9aa00fcf65b640632cd54f142228e5 +Homepage: https://github.com/Textualize/rich +Description: render rich text, tables, progress bars, syntax highlighting, markdown and more + Rich is a Python library for rich text and beautiful formatting in the + terminal. + . + The Rich API makes it easy to add color and style to terminal output. Rich can + also render pretty tables, progress bars, markdown, syntax highlighted source + code, tracebacks, and more — out of the box. + . + Here's a list of the core functionalities of rich: + . + * to effortlessly add rich output to your application, you can import the rich + print method, which has the same signature as the builtin Python function + * Rich can be installed in the Python REPL, so that any data structures will + be pretty printed and highlighted + * for more control over rich terminal content, import and construct a Console + object. The Console object has a print method which has an intentionally + similar interface to the builtin print function + * to insert an emoji in to console output place the name between two colons + * Rich can render flexible tables with unicode box characters. There is a + large variety of formatting options for borders, styles, cell alignment etc + * Rich can render multiple flicker-free progress bars to track long-running + tasks. + * Rich can render content in neat columns with equal or optimal width. + * Rich can render markdown and does a reasonable job of translating the + formatting to the terminal + * Rich can render beautiful tracebacks which are easier to read and show more + code than standard Python tracebacks. You can set Rich as the default + traceback handler so all uncaught exceptions will be rendered by Rich. + +Package: python3-rpds-py +Architecture: amd64 +Version: 0.27.1-2ubuntu3 +Priority: optional +Section: python +Source: rpds-py +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 789 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.34), libgcc-s1 (>= 4.2) +Filename: pool/python3-rpds-py_0.27.1-2ubuntu3_amd64.deb +Size: 281344 +MD5sum: a1d7c237568fa6726a3aa5bfbd9ace5f +SHA1: 0a9da607e2097eac938cfc71cfc595ca3d363c3f +SHA256: 5ee2a2330885fb73754eaa3325873937877bf1a67a3b2e56d627a4ade3905be9 +SHA512: 07f989a65cac450360a0be6a705d214a12aaed2cdf4eb2c318391ca0820a5a1269c5511f10c500ad742d7ef68f2e97bbc01dfd8d4e3bd57fccd0ee8910014173 +Homepage: https://github.com/crate-py/rpds +Description: Python bindings to Rust's persistent data structures (rpds) + Python bindings to the Rust rpds crate for persistent data structures. + . + What's here is quite minimal (in transparency, it was written + initially to support replacing pyrsistent in the referencing + library). If you see something missing (which is very likely), a PR + is definitely welcome to add it. + +Package: python3-serial +Architecture: all +Version: 3.5-2build1 +Priority: optional +Section: python +Source: pyserial +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 458 +Depends: python3:any +Suggests: python3-wxgtk3.0 | python3-wxgtk +Filename: pool/python3-serial_3.5-2build1_all.deb +Size: 78850 +MD5sum: 096a8a84c2317e91d8a495cec9bb1b99 +SHA1: be1b38f73f922a02bd67fb84fe25fd88d3338330 +SHA256: 81def9a464776c50d88a270c709adb7b136195a62fcca4b962d3355c92c5097f +SHA512: 92db6ed0fd0cf59d06e389f4b88627b92c5acd4b0385822c1a4e6891cd20bf41d315904b40a86e84a9c1ef46c0a432b94979c9e1eb916cad5655988a0866eab5 +Homepage: https://github.com/pyserial/pyserial +Description: pyserial - module encapsulating access for the serial port + This module encapsulates the access for the serial port. It provides + back-ends for standard Python running on Windows, Linux, BSD (possibly + any POSIX compliant system). The module named "serial" automatically + selects the appropriate back-end. + +Package: python3-setproctitle +Architecture: amd64 +Version: 1.3.7-2build1 +Multi-Arch: same +Priority: optional +Section: python +Source: python-setproctitle +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 59 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.4) +Filename: pool/python3-setproctitle_1.3.7-2build1_amd64.deb +Size: 18890 +MD5sum: 0bdbc4b41f05d113d9d4175c99d8093d +SHA1: 0386a280d48dfb4ecee18916f483c4730b829681 +SHA256: 43f3a83f9b804ba4b5508bccbbe30b7f9cbe6bf9ada8140ca8e37ad272d2f573 +SHA512: 7e46317256af65558cc0be03b8f8eba27312e8483d66d8d3a03d36804ceb9f734435524f5bd294fcfc5986181474a6558613d3d10bba9663dd5f919bace73919 +Homepage: https://github.com/dvarrazzo/py-setproctitle +Description: Setproctitle implementation for Python 3 + The library allows a process to change its title (as displayed by system tools + such as ps and top). + . + Changing the title is mostly useful in multi-process systems, for example when + a master process is forked: changing the children's title allows one to + identify the task each process is busy with. The technique is used by + PostgreSQL and the OpenSSH Server for example. + . + This is the Python 3 package. + +Package: python3-setuptools +Architecture: all +Version: 78.1.1-0.1build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: setuptools +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 3897 +Depends: python3-pkg-resources (= 78.1.1-0.1build1), python3-jaraco.text, python3-more-itertools, python3-typeguard, python3-typing-extensions, python3-zipp, python3:any +Suggests: python-setuptools-doc +Breaks: python3-wheel (<< 0.46.0) +Filename: pool/python3-setuptools_78.1.1-0.1build1_all.deb +Size: 661184 +MD5sum: 1581129a22f980fa4d5961ab9a946c9d +SHA1: bf70c876966177abb0069b4dbe3ff18d00cc8229 +SHA256: 7dbe7963bacc589b5f3d48dbad14fb3815cf097b1173cde207c0d91268bc83cc +SHA512: 855a93c4b48adce3f845a5a94ce7e6c8b57798e3d880936e76e7482f60bdacc2c1aadb21d51b8325c8bdec1a07016bd7c5eab6655a985f5751cf8e49665312f4 +Homepage: https://pypi.python.org/pypi/setuptools +Description: Python3 Distutils Enhancements + Extensions to the python-distutils for large or complex distributions. + +Package: python3-software-properties +Architecture: all +Version: 0.120.1 +Priority: optional +Section: python +Source: software-properties +Maintainer: Ubuntu Developers +Original-Maintainer: Michael Vogt +Installed-Size: 130 +Depends: gpg | sq, iso-codes, lsb-release, python3, python3-apt (>= 2.7.1~), python3-gi, python3-launchpadlib, python3:any +Recommends: unattended-upgrades +Filename: pool/python3-software-properties_0.120.1_all.deb +Size: 28740 +MD5sum: 131231775c2499ace4de2c10b4a692b7 +SHA1: aa70bd0318fedfc62170c16c854cf5b1f5852297 +SHA256: 6660ceeaaeb22df70dc2895f3ce1708d03eb28af013e812b15f4b83f2de0b3e8 +SHA512: 9671b8403612a3885f82850035c87b672d07771ed5ed66ffcee013e38649bb8cf3a97ba20e6416bc16a8b250a5232ccab0915b752189d1db85f77b9c1525e83b +Description: manage the repositories that you install software from + This software provides an abstraction of the used apt repositories. + It allows you to easily manage your distribution and independent software + vendor software sources. + +Package: python3-speechd +Architecture: all +Version: 0.12.1-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: speech-dispatcher +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 142 +Depends: python3-xdg, python3:any +Breaks: python-speechd +Replaces: python-speechd +Filename: pool/python3-speechd_0.12.1-2ubuntu1_all.deb +Size: 46232 +MD5sum: 3c3151a469001a81318c7c47dc84197f +SHA1: 1a74eea606aac23d3de31b0da050ae082c7c1413 +SHA256: c811605eeaafa03f8f5577cffa4f15a6bc26d01d95a6f44ca851a22f0eba8524 +SHA512: 033c20103a325aa68152c120e671a8081c873b45844beae5dfc75db15054fed20d28250aa7b154bbb9679820e89e9da39a46784dcfa7006de1c076e5db0cf8a9 +Homepage: http://devel.freebsoft.org/speechd +Description: Python interface to Speech Dispatcher + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains a Python library for communication with Speech + Dispatcher. + +Package: python3-sss +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: python +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 193 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.33), libldb2 (>= 0.9.21), libpopt0 (>= 1.14), libtalloc2 (>= 2.0.4~git20101213) +Recommends: sssd +Filename: pool/python3-sss_2.12.0-1ubuntu5.4_amd64.deb +Size: 44032 +MD5sum: 837610d9d1d30d68469c58ec391b6335 +SHA1: b8b241153508dead07a1ec2535875458681235e1 +SHA256: 8020a5a8f769bd1516daa373cdd6c6786fe6abd8b935ae1d7c8914b9edca901d +SHA512: 0e3b201f3277e67f70bd946a3165aaece2d95fb1ee1cd6eef44a91bc9d07bdb9310e59c748b93253b22944808e992de36ac2a566ec8db3bd0a87bdf2384e49df +Homepage: https://github.com/SSSD/sssd +Description: Python3 module for the System Security Services Daemon + Provides a set of daemons to manage access to remote directories and + authentication mechanisms. It provides an NSS and PAM interface toward + the system and a pluggable backend system to connect to multiple different + account sources. It is also the basis to provide client auditing and policy + services for projects like FreeIPA. + . + This package provide a module to access the configuration of the sssd daemon. + . + This package installs the library for Python 3. + +Package: python3-systemd +Architecture: amd64 +Version: 235-1build9 +Priority: optional +Section: python +Source: python-systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 223 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.38), libsystemd0 (>= 246) +Filename: pool/python3-systemd_235-1build9_amd64.deb +Size: 43622 +MD5sum: e6bf55f700feb34e8ad852856fcebeac +SHA1: 5fe9bce58e3465d072ec6ac337f57caca579cfd5 +SHA256: e42f6958ed288ccf13e8a91a3c4303d1c1a4a14a92a77473678e88adb58f85d7 +SHA512: 999cb96d4ee10b690f6fa4f4d8588feb4dd4aed524ba6071aa5cf0c40e95407770e7db65e4ddd58a7171bfc56a40027c2924c1cb21e1741c3cc104c6cefa294f +Homepage: https://www.freedesktop.org/wiki/Software/systemd +Description: Python 3 bindings for systemd + This package contains Python 3 bindings for native access to the + systemd facilities. + . + Functionality is separated into a number of modules: + * systemd.journal supports sending of structured messages to the + journal and reading journal files + * systemd.daemon wraps parts of libsystemd useful for writing daemons + and socket activation + * systemd.id128 provides functions for querying machine and boot + identifiers and a list of message identifiers provided by systemd + * systemd.login wraps parts of libsystemd used to query logged in + users and available seats and machines + +Package: python3-tk +Architecture: amd64 +Version: 3.14.3-0ubuntu2 +Multi-Arch: allowed +Priority: optional +Section: python +Source: python3-defaults +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 27 +Provides: python3-tk-dbg +Depends: python3.14 (>= 3.14.3), python3.14-tk +Suggests: blt, tix +Filename: pool/python3-tk_3.14.3-0ubuntu2_amd64.deb +Size: 8764 +MD5sum: b3b99b2092474c3bba2f37253d971b94 +SHA1: ece2e8655836a9bd7ca2bff2f6abc515bd85c9c9 +SHA256: 8178789dc8142a23b3d91117b72d46faf26aec85585225034ceb86c7d9064905 +SHA512: 84af42293904b08bce1ededbcdd5e01b4e41282532e9f76420409dd6250f8e15bb4556230779c9707d7dce3f5e3f4a7f25627125b075e7b9a1154414b95657e1 +Homepage: https://www.python.org/ +Description: Tkinter - Writing Tk applications with Python 3.x + A module for writing portable GUI applications with Python 3.x using Tk. + Also known as Tkinter. Debian breaks out the Tkinter module from the Python + standard library to reduce the dependency footprint. + . + The package currently depends on python3.14-tk. In the + future, dependencies on jython (Python for a JVM) and ironpython (Python for + Mono) may be added. + . + Note that this package will not force the installation of all supported Python + interpreters, it only makes sure that the modules are available. + +Package: python3-typeguard +Architecture: all +Version: 4.4.4-2 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-typeguard +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 165 +Depends: python3-typing-extensions (>= 4.14.0), python3:any +Filename: pool/python3-typeguard_4.4.4-2_all.deb +Size: 28914 +MD5sum: 3e4781802406ae6239d15a862f55aa82 +SHA1: 325d4acf3dc83b169bd8268efcb58cba84198789 +SHA256: e542a6394e75b2195df733a26dfd7e34621d696aab076649d60b7256b7574af3 +SHA512: 4512dc056162264c63d0720ddeebf4a88280ec533220d7c3b7d3adcd6ffb00d01a86fe988389df3b79944656f6e12a77cc4f9d3578b152432b0a7b9b842ac7d8 +Homepage: https://github.com/agronholm/typeguard +Description: Run-time type checker for Python + This library provides run-time type checking for functions defined with + argument type annotations. This can be done in one of three ways: + * calling check_argument_types() from within the function body + * decorating the function with @typechecked + * using `with TypeChecker('packagename')` + . + This package installs the library for Python 3. + +Package: python3-typing-extensions +Architecture: all +Version: 4.15.0-2 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-typing-extensions +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 511 +Depends: python3:any +Filename: pool/python3-typing-extensions_4.15.0-2_all.deb +Size: 84160 +MD5sum: acab0d8a0a8edbf7b7410737b2223a98 +SHA1: 4d11fc5ca2efe89aaa9e59dfecace00a5ce971a1 +SHA256: a1698f372c57b8ff7960368db30ffd56828e172f64bf515799d75e4eb7691018 +SHA512: bb54c059d9fe07c4bd2ba761700b75786e1a9990e18dbf0d729aca741e9a8adad75e4692495d62b791f35b5a232affb04e3113b91f5ed22f06aaecebe58f4b1e +Homepage: https://typing-extensions.readthedocs.io/en/latest/ +Description: Backported and Experimental Type Hints for Python + The "typing_extensions" module serves two related purposes: + . + 1. Enable use of new type system features on older Python versions. + 2. Enable experimentation with new type system PEPs before they are accepted + and added to the "typing" module. + . + "typing_extensions" is treated specially by static type checkers such as mypy + and pyright. Objects defined in "typing_extensions" are treated the same + way as equivalent forms in "typing". + +Package: python3-uc-micro +Architecture: all +Version: 1.0.3-1build1 +Priority: optional +Section: python +Source: uc-micro-py +Maintainer: Ubuntu Developers +Original-Maintainer: Georges Khaznadar +Installed-Size: 42 +Depends: python3:any +Filename: pool/python3-uc-micro_1.0.3-1build1_all.deb +Size: 5702 +MD5sum: d6f3bdef9a9f6d5de417fdf481a39182 +SHA1: ccec634a98f3914cb5eaaff5bdd1300f39bb983c +SHA256: 85f08cfc3417fe29a2334aa6bc85d39eb5a97aa6d076ddd6434aa51f16b24980 +SHA512: 1f8e55e35b22c61527ec4e73c4190496c33b9c2dfb340cd71f03602cc94ac0bcc0a20a4b1bcd3e631cf89dd9dd963c5229f4bbcd1e3b12b31cb6553ea8575f8d +Homepage: https://github.com/tsutsu3/uc.micro-py +Description: python port of uc.micro + Micro subset of unicode data files for linkify-it-py projects + . + This package was developped for the package python3-linkify-it + +Package: python3-update-manager +Architecture: all +Version: 1:26.04.5 +Priority: optional +Section: python +Source: update-manager +Maintainer: Ubuntu Developers +Installed-Size: 187 +Depends: python3-apt (>= 0.8.5~), python3-distro-info, python3-distupgrade, python3:any +Suggests: python3-launchpadlib +Breaks: python3-distupgrade (<< 1:16.10.10), update-manager-core (<< 1:0.163) +Replaces: update-manager-core (<< 1:0.163) +Filename: pool/python3-update-manager_1%3a26.04.5_all.deb +Size: 40758 +MD5sum: c211e9ea420dbc80d13a7f83b0df5918 +SHA1: ed3380d4e0d7e744893864b6ec01ab8bde330719 +SHA256: c976d09006041316d01d44987005be753308852a0696220d39c88c90aac48db9 +SHA512: affc91407690d34f0fda360413a879466f74d91ebc8135229e95c9a3ba9541e75730f2c481450bca0cb9103426f0735e35040d185a2a782ef2dbf9df5e60c7db +Description: Python 3.x module for update-manager + Python module for update-manager (UpdateManager). + . + This package contains the Python 3.x version of this module. + +Package: python3-urllib3 +Architecture: all +Version: 2.6.3-1ubuntu1.1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-urllib3 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 485 +Depends: python3:any +Recommends: ca-certificates +Suggests: python3-brotli (>= 1.2.0), python3-supported-min (>= 3.14), python3-cryptography, python3-idna, python3-openssl, python3-socks +Filename: pool/python3-urllib3_2.6.3-1ubuntu1.1_all.deb +Size: 96704 +MD5sum: 08763aedc4c8686b2d0ae4343dba797a +SHA1: 7a0679b8438e703d71fc3eb32258caf2e0cbe5d6 +SHA256: fb51c1a32334c96dc72df6768ffe8848ba7a3f22be271e822d384077b78817e5 +SHA512: 6e19c173e96102cdc7bf31d14200cb07bddd7888d2480ad71785c4cab5611e81fa9c86feb97c0c5fb7418a0d625eda174e433844526cd0685c18fa7e5d9f4148 +Homepage: https://urllib3.readthedocs.org +Description: HTTP library with thread-safe connection pooling for Python3 + urllib3 supports features left out of urllib and urllib2 libraries. + . + - Re-use the same socket connection for multiple requests (HTTPConnectionPool + and HTTPSConnectionPool) (with optional client-side certificate + verification). + - File posting (encode_multipart_formdata). + - Built-in redirection and retries (optional). + - Supports gzip and deflate decoding. + - Thread-safe and sanity-safe. + - Small and easy to understand codebase perfect for extending and + building upon. + +Package: python3-wadllib +Architecture: all +Version: 2.0.0-3 +Priority: optional +Section: python +Source: python-wadllib +Maintainer: Ubuntu Developers +Original-Maintainer: Stefano Rivera +Installed-Size: 330 +Depends: python3-lazr.uri, python3:any +Filename: pool/python3-wadllib_2.0.0-3_all.deb +Size: 36320 +MD5sum: 16353fc23e33fe4d45d305de793de02e +SHA1: a3f384ef3495fc8810ed62d9119f3b9a231df2b0 +SHA256: 3ce47762fa78c9cfd36ab348bcf4ad6d63eaac821828d3ebc3fb214b41ba534d +SHA512: 23a9379fbc2ebc80300a951d709136f3e00e04b7fa04e5908f47210550724f611ada628eaff6ac285be6c6b8087813cbf101d02b576dba7da2b0daa553bd687d +Homepage: https://launchpad.net/wadllib +Description: Python 3 library for navigating WADL files + The Web Application Description Language (WADL) is an XML vocabulary for + describing the capabilities of HTTP resources. wadllib can be used in + conjunction with an HTTP library to navigate and manipulate those resources. + . + This package provides wadllib for Python 3.x. + +Package: python3-xdg +Architecture: all +Version: 0.28-3 +Priority: optional +Section: python +Source: pyxdg +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 184 +Provides: python3-pyxdg +Depends: python3:any +Suggests: python-pyxdg-doc +Filename: pool/python3-xdg_0.28-3_all.deb +Size: 37348 +MD5sum: 90543c7e2e0bccedd24405d341e39283 +SHA1: 9da08f5db5f67788d7accc3cd5a1759b0df6f0aa +SHA256: 3398d0bb193d7ebedf907f43a008346722e0c6d2c3c138cb3dc17080be878e70 +SHA512: c018112b778d953946e5373c02288bf27f867761cfbe1fbfca533b426da77a895aee357b3edc785794790811309c20df7a03fe82bde11f5f87c94add18e13bbb +Homepage: https://gitlab.freedesktop.org/xdg/pyxdg +Description: Python 3 library to access freedesktop.org standards + PyXDG contains implementations of freedesktop.org standards in Python: + . + * Base Directory Specification Version 0.6 + * Menu Specification Version 1.0 + * Desktop Entry Specification Version 1.0 + * Icon Theme Specification Version 0.8 + * Recent File Spec 0.2 + * Shared-MIME-Database Specification 0.13 + . + This package contains the Python 3 version of the library. + +Package: python3-xkit +Architecture: all +Version: 0.5.0ubuntu8 +Priority: optional +Section: python +Source: x-kit +Maintainer: Ubuntu Developers +Original-Maintainer: Alberto Milone (tseliot) +Installed-Size: 112 +Depends: python3:any (>= 3.2~) +Filename: pool/python3-xkit_0.5.0ubuntu8_all.deb +Size: 17842 +MD5sum: ac55e67c7778924aa7370bfd607d0403 +SHA1: b6814c56428e783abd391e54afa8ea5e69d3cbb9 +SHA256: 0ddef9ad0812d3b30dc502c08688960f064b50ea1470c5107a11a76c6a22ee88 +SHA512: be326afb720a4cef2731d115635a5a089784c944557760685eb23685136fa513a3e908d710ba805cae03a37cddab9b0029403627de0a82d6575a4682c0acff1e +Description: library for the manipulation of xorg.conf files (Python 3) + X-Kit is library for the manipulation of xorg.conf files. + . + This is the Python 3 version of the package. + +Package: python3-yaml +Architecture: amd64 +Version: 6.0.3-1build1 +Multi-Arch: allowed +Priority: optional +Section: python +Source: pyyaml +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 561 +Depends: python3 (<< 3.15), python3 (>= 3.14~), python3:any, libc6 (>= 2.14), libyaml-0-2 +Filename: pool/python3-yaml_6.0.3-1build1_amd64.deb +Size: 136956 +MD5sum: 11feca7f058415e8f5dd18c087a5392d +SHA1: a5b50f19653fa9fd2c5ebff4fa908b9358fa267a +SHA256: 77271ce1fc2470f8b6b436f40fe55dd014d307f582d552209cac756f7f1b1a25 +SHA512: f8095fefcb76091f37ea33dfb224f7d8095bb7aab498564a58a0e8ecf55d32a2451e3a3c3c32aa4271cdff4ba33bfab47eb55b6f48e53d26b8c2c530503f43d0 +Homepage: https://github.com/yaml/pyyaml +Description: YAML parser and emitter for Python3 + Python3-yaml is a complete YAML 1.1 parser and emitter for Python3. It can + parse all examples from the specification. The parsing algorithm is simple + enough to be a reference for YAML parser implementors. A simple extension API + is also provided. The package is built using libyaml for improved speed. + +Package: python3-zipp +Architecture: all +Version: 3.23.0-1build1 +Multi-Arch: foreign +Priority: optional +Section: python +Source: python-zipp +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Python Team +Installed-Size: 45 +Depends: python3:any +Filename: pool/python3-zipp_3.23.0-1build1_all.deb +Size: 10370 +MD5sum: 904d709567f51ab26bc22da0f79544d5 +SHA1: a7b9061c6c5d962facd819c635f0fcc5da7302fd +SHA256: 2a99b7c109d679a0347f620a52323fc0a2c32c281ed12cba2116370653ed802a +SHA512: 09cb9a3f153876dbbc74f3812c742db0ab7a38c87a73158e06a236cf7b7eb577daa8126794d749b845ed6a0cd8d07d69020987c4e21718226699fc47160b1648 +Homepage: https://github.com/jaraco/zipp +Description: pathlib-compatible Zipfile object wrapper - Python 3.x + A backport of the Path object to older versions of Python. + It's pathlib-compatible interface for zip files using zipfile object inside. + . + This package contains Python 3.x module. + +Package: python3.14 +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Multi-Arch: allowed +Priority: optional +Section: python +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 913 +Depends: python3.14-minimal (= 3.14.4-1ubuntu0.2), libpython3.14-stdlib (= 3.14.4-1ubuntu0.2), media-types | mime-support, tzdata +Recommends: ca-certificates +Suggests: python3.14-venv, python3.14-doc, binutils +Breaks: python3-all (<< 3.6.5~rc1-1), python3-dev (<< 3.6.5~rc1-1), python3-venv (<< 3.6.5-2) +Filename: pool/python3.14_3.14.4-1ubuntu0.2_amd64.deb +Size: 830272 +MD5sum: 03db25fb7eaa1d9df686f078b94f8441 +SHA1: aa8437b76fc5124393890cdc45104d00be36c14d +SHA256: 780c308c47d8afcbb7d339f0023350e7cf60c1a37e9572a1f88774cc18f60526 +SHA512: 214c9dc489e4a8935f49f60f7ac4c0d3d8d1789a705e28f803867316d2fd5ae5f10d576dc103c304bc46e5d34128242b2723455c3412dd25b76d9f474ba23bf4 +Description: Interactive high-level object-oriented language (version 3.14) + Python is a high-level, interactive, object-oriented language. Its 3.14 version + includes an extensive class library with lots of goodies for + network programming, system administration, sounds and graphics. + +Package: python3.14-minimal +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Multi-Arch: allowed +Priority: optional +Section: python +Source: python3.14 +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 7395 +Pre-Depends: libc6 (>= 2.38) +Depends: libpython3.14-minimal (= 3.14.4-1ubuntu0.2), libexpat1 (>= 2.7.2), zlib1g (>= 1:1.2.0) +Recommends: python3.14 +Suggests: binfmt-support +Conflicts: binfmt-support (<< 1.1.2) +Filename: pool/python3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb +Size: 2579044 +MD5sum: 3dd8597fc5aa8cb9e79860187d47a68b +SHA1: e007230edf21f82c68460acfaaa0a2cb9bc8f8b2 +SHA256: 0a7ea8a52834f9b3de0f11758924f80f7a6ebcbb4b02a55ba4f457503569f55f +SHA512: e17388aa5e2364aa1399560b80018e86c16ee63f000948494cbdcbf78c6985b648049fed74c64c5c3faebeda8db819f111c32c57f935262da7ad0382bf2a4d70 +Description: Minimal subset of the Python language (version 3.14) + This package contains the interpreter and some essential modules. It can + be used in the boot process for some basic tasks. + See /usr/share/doc/python3.14-minimal/README.Debian for a list of the modules + contained in this package. +Cnf-Visible-Pkgname: python3.14 + +Package: python3.14-tk +Architecture: amd64 +Version: 3.14.4-1ubuntu0.2 +Priority: optional +Section: python +Source: python3.14 +Maintainer: Ubuntu Core Developers +Original-Maintainer: Matthias Klose +Installed-Size: 439 +Depends: libc6 (>= 2.2.5), libtcl8.6 (>= 8.6.0), libtk8.6 (>= 8.6.0) +Suggests: tix +Breaks: python3-tk (<< 3.12.5-2~) +Replaces: python3-tk (<< 3.12.5-2~) +Enhances: python3.14 +Filename: pool/python3.14-tk_3.14.4-1ubuntu0.2_amd64.deb +Size: 104576 +MD5sum: fbc7631ffd091f5833fe302bbd70e1c2 +SHA1: 8875e94752e37fc8c93f70ca9d34d0e205213e22 +SHA256: 7dbd69bdfebb4eb433ad7ea3429349f6ac86f5dab8fde65770e3aea4ec822a2e +SHA512: 3f127db84b5abc6ae36c4ec1474db07d2c8c4d98f909205fddc035d33b15a8a9766380c73788e833246931b07e5e0dd1c4189a3527bdca3e0e927e29e6139624 +Description: Tkinter - Writing Tk applications with Python (v3.14) + A module for writing portable GUI applications with Python (v3.14) using Tk. + Also known as Tkinter. +Python-Version: 3.14 + +Package: readline-common +Architecture: all +Version: 8.3-4 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: readline +Maintainer: Ubuntu Developers +Original-Maintainer: Matthias Klose +Installed-Size: 81 +Suggests: readline-doc +Conflicts: libreadline-common, libreadline5 (<< 5.0-11) +Replaces: libreadline-common, libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11) +Filename: pool/readline-common_8.3-4_all.deb +Size: 61514 +MD5sum: e98c256e258d243fb9c21982c5deffc7 +SHA1: d27029fea2406621b46725a323d4a87e0f84f8e5 +SHA256: 53cdc5a963bbdda938f8996496a5e78bcf484e6e41a2ef2c0f8cf566808f71f5 +SHA512: 1225b55324a625ed5338a18056422b899d31cae0dadb88e05660aca2c5c9dce9689ccd7eca9d6a66d659a20c8e69a089c65dfaffc5caeb21d8d4099b96bafd17 +Homepage: https://tiswww.case.edu/php/chet/readline/rltop.html +Description: GNU readline and history libraries, common files + The GNU readline library aids in the consistency of user interface + across discrete programs that need to provide a command line + interface. + . + The GNU history library provides a consistent user interface for + recalling lines of previously typed input. + +Package: resources +Architecture: amd64 +Version: 1.10.2-0ubuntu3.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Installed-Size: 8296 +Depends: libadwaita-1-0 (>= 1.8), libc6 (>= 2.39), libcairo2 (>= 1.4.10), libgcc-s1 (>= 4.2), libglib2.0-0t64 (>= 2.66), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.12.0), libsoup-3.0-0 (>= 3.0.3), dconf-gsettings-backend | gsettings-backend +Filename: pool/resources_1.10.2-0ubuntu3.1_amd64.deb +Size: 1937762 +MD5sum: fd31c8ac87bd5883bb9b829aaa8df034 +SHA1: 296f6db49228f35395b4a2d0d2faf1e05db31908 +SHA256: f240bdfa5e81f521751951e093c85228618475e875383f38f81db0b4505d12d9 +SHA512: 6722c44b6d6530b93231754adc4f356570c6d34d2de6e6a621dc1e512b124ab98aa636bb53cd7cf650f634bbb551c175d1d0062e12af24ba3635335fc8a3372e +Homepage: https://apps.gnome.org/Resources/ +Description: Keep an eye on system resources + Resources allows you to check the utilization of your system resources and + control your running processes and apps. It's designed to be user-friendly + and feel right at home on a modern desktop by using GNOME's libadwaita. + . + Resources supports monitoring the following components: + - CPU + - Memory + - GPU + - Network Interfaces + - Storage Devices + - Batteries + +Package: rfkill +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 88 +Depends: libc6 (>= 2.38), libsmartcols1 (= 2.41.3-3ubuntu2.2) +Filename: pool/rfkill_2.41.3-3ubuntu2.2_amd64.deb +Size: 34218 +MD5sum: 0a9adc97954fe3072207395a3f7689e8 +SHA1: e0ef813970f77b492a074e84af863f529f7ff071 +SHA256: 90ae767c528c3d98c2598ab6d7dfc34217bbf83555bad3642c5e070397517679 +SHA512: 36189818c07a44d37d7615d4e8a84de206e4901c66c7679c54b12592816a25161c6568290a86ecd669f58d959cc3e07add84561be25d16e8849265d0e2e5494b +Homepage: https://github.com/util-linux/util-linux +Description: tool for enabling and disabling wireless devices + rfkill is a simple tool for accessing the Linux rfkill device interface, + which is used to enable and disable wireless networking devices, typically + WLAN, Bluetooth and mobile broadband. + +Package: rtkit +Architecture: amd64 +Version: 0.14-1 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Multimedia Maintainers +Installed-Size: 148 +Depends: default-dbus-system-bus | dbus-system-bus, polkitd | pkexec, systemd | systemd-standalone-sysusers | systemd-sysusers, libc6 (>= 2.38), libcap2 (>= 1:2.10), libdbus-1-3 (>= 1.10), libsystemd0 +Filename: pool/rtkit_0.14-1_amd64.deb +Size: 37690 +MD5sum: c1d9d0d112fa05650b00bda9d0702a7d +SHA1: 09a8dc8107b4185acef1d8d2a6a726d22a7af1f8 +SHA256: 87025d92fff2cda675b6b97a3003f7a1405a1226c0ef066a5edb7579660238d0 +SHA512: 09c6022d85a3db311d11fb093c5156d07fcad9188e828f4acb6d00ec2e37b33c77a34aa524c60bbd4875665c68c7daa42d411bfa4aee84e0f141c861e85c5c49 +Homepage: https://gitlab.freedesktop.org/pipewire/rtkit +Description: Realtime Policy and Watchdog Daemon + RealtimeKit is a D-Bus system service that changes the + scheduling policy of user processes/threads to SCHED_RR + (i.e. realtime scheduling mode) on request. It is intended to + be used as a secure mechanism to allow real-time scheduling to + be used by normal user processes. + +Package: rustdesk +Architecture: amd64 +Version: 1.4.9 +Priority: optional +Section: net +Maintainer: rustdesk +Depends: libgtk-3-0t64 | libgtk-3-0, libxcb-randr0, libxdo3 | libxdo4, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2t64 | libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, libpam0g, gstreamer1.0-pipewire +Recommends: libayatana-appindicator3-1 +Filename: pool/rustdesk-1.4.9-x86_64.deb +Size: 23375776 +MD5sum: 62cd79b3c25f082422639306c3cfd10a +SHA1: 7d2cc20e9c73feaff880806f29dcd84d48833b0e +SHA256: 7244ba47c40e804172044bfbe659467c54ce46554c98e78c8c0406f1d612fda3 +SHA512: 250e1cb87dc55fca6240e15e1c49d7ca29ac2182a74604c0d56eb7c6be6db63d7f5627159592f4f6c2ce948a6ab6d80d04cdd8586ef625b762ef66f4633cc889 +Homepage: https://rustdesk.com +Description: A remote control software. + +Package: rygel +Architecture: amd64 +Version: 45.0-1ubuntu1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1428 +Depends: init-system-helpers (>= 1.52), libc6 (>= 2.38), libgdk-pixbuf-2.0-0 (>= 2.31.1), libgee-0.8-2 (>= 0.8.3), libglib2.0-0t64 (>= 2.80.0), libgssdp-1.6-0 (>= 1.1.3), libgstreamer-plugins-base1.0-0 (>= 1.20.0), libgstreamer1.0-0 (>= 1.12), libgupnp-1.6-0 (>= 1.6.0), libgupnp-av-1.0-3 (>= 0.14.1), libgupnp-dlna-2.0-4 (>= 0.9.4-2), libmediaart-2.0-0 (>= 1.9.0), librygel-core-2.8-0 (>= 45.0), librygel-db-2.8-0 (>= 45.0), librygel-renderer-2.8-0 (>= 45.0), librygel-server-2.8-0 (>= 45.0), libsoup-3.0-0 (>= 2.4.0), libsqlite3-0 (>= 3.5.9), libx11-6, libxml2-16 (>= 2.14.1) +Recommends: dbus-user-session, gstreamer1.0-plugins-base, gstreamer1.0-plugins-good +Suggests: rygel-localsearch, rygel-playbin, rygel-preferences, rygel-ruih, tumbler, gstreamer1.0-libav, gstreamer1.0-plugins-ugly +Filename: pool/rygel_45.0-1ubuntu1_amd64.deb +Size: 329708 +MD5sum: a5b608d0139f24f9f30a46c4c7913a3a +SHA1: a7bbbac0cc17fdbd9e3679bfc2d0fd40ce71a741 +SHA256: c83e62815a97aac8b8818d56cb676d53ff6c21de975ffc07de02143e6aa2f06a +SHA512: 02cbc2473b875eba8690ba126104fc8f9e03f2d91d01432461ceb91d7349f7d7f8fa388bf7ce70a38ca560f8fdfd4cc70dfa13065d52271739e59272872bb087 +Homepage: https://wiki.gnome.org/Projects/Rygel +Description: GNOME UPnP/DLNA services + Rygel is a home media solution that allows you to easily share audio, video + and pictures, and control of media player on your home network. In technical + terms it is both a UPnP AV MediaServer and MediaRenderer implemented through + a plug-in mechanism. Interoperability with other devices in the market is + achieved by conformance to very strict requirements of DLNA and on the fly + conversion of media to format that client devices are capable of handling. + . + This package contains the core of Rygel and following plugins: + * media-export: Recursively exports folders and files specified in the + user configuration. This plugin supports all types of URIs that + gio/gvfs and GStreamer can handle. + * external: A MediaServer plugin that exports media hierarchies + provided by external applications. + * mpris: Export of media players that implement MPRIS2 D-Bus interface, + as MediaRenderer devices. + +Package: samba-libs +Architecture: amd64 +Version: 2:4.23.6+dfsg-1ubuntu2.2 +Multi-Arch: same +Priority: optional +Section: libs +Source: samba +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Samba Maintainers +Installed-Size: 25888 +Provides: libndr5 (= 2:4.23.6+dfsg-1ubuntu2.2), libndr6 (= 2:4.23.6+dfsg-1ubuntu2.2), libsmbldap2 (= 2:4.23.6+dfsg-1ubuntu2.2) +Depends: libacl1 (>= 2.2.23), libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libbsd0 (>= 0.7.0), libc6 (>= 2.43), libcap2 (>= 1:2.10), libcrypt1 (>= 1:4.1.0), libgnutls30t64 (>= 3.8.2), libicu78 (>= 78.1-1~), libjansson4 (>= 2.14), libldap2 (>= 2.6.2), libldb2 (= 2:2.11.0+samba4.23.6+dfsg-1ubuntu2.2), libpam0g (>= 0.99.7.1), libpopt0 (>= 1.14), libsystemd0, libtalloc2 (>= 2.4.0), libtdb1 (>= 1.3.17), libtevent0t64 (>= 2:0.17.1), libtirpc3t64 (>= 1.0.2), libwbclient0 (>= 2:4.5.0+dfsg), zlib1g (>= 1:1.1.4) +Breaks: sssd-ad (<< 2.9.4-1+b1), sssd-ad-common (<< 2.9.4-1+b1), sssd-ipa (<< 2.9.4-1+b1) +Filename: pool/samba-libs_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +Size: 6648704 +MD5sum: 88eec4773407d65e531f7024c0bc1b36 +SHA1: 26f7a5dd1acaeaed5de685ce966bd4052bda123a +SHA256: b76c628d7198bcdbb06cdd562f0264bf9482b35f95593296e02b570a188f99e9 +SHA512: 4531370102e19ff6dfa9fc78410435508bf0d1d4e91afb6ea279220b67357ba25ae9a11318cb4c317d352aa0c59b5def2d85cc1b42ad8e5e607604c3fb02977b +Homepage: https://www.samba.org +Description: Samba core libraries + Samba is an implementation of the SMB/CIFS protocol for Unix systems, + providing support for cross-platform file sharing with Microsoft Windows, OS X, + and other Unix systems. Samba can also function as a domain controller + or member server in Active Directory or NT4-style domains. + . + This package contains the shared libraries. + +Package: sane-airscan +Architecture: amd64 +Version: 0.99.36-2ubuntu1 +Priority: optional +Section: graphics +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Printing Team +Installed-Size: 452 +Depends: libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libgnutls30t64 (>= 3.8.1), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libtiff6 (>= 4.0.3), libxml2-16 (>= 2.14.1) +Recommends: ipp-usb, sane-utils +Filename: pool/sane-airscan_0.99.36-2ubuntu1_amd64.deb +Size: 148166 +MD5sum: 88b8ab879a7ad7dfa83c23d45671bf5f +SHA1: 3f4a88214bc8dd8447cec02958e1a2f9d705eea3 +SHA256: 9468b214636c1289d9f462abe6ca270e49dc18af28b42e776cf12970b29b699d +SHA512: acba78c3a0d97f7084dffb47569a8f082672df4c0b257d8335f0c95341f78c301257b40921e6ef52af8aee9605e83ed6a908a6803752f8942223acc0c973accf +Homepage: https://github.com/alexpevzner/sane-airscan +Description: SANE backend for AirScan (eSCL) and WSD document scanner + Similar to how most modern network printers support "driverless" + printing, using the universal vendor-neutral printing protocol, many + modern network scanners and MFPs support "driverless" scanning. + . + Driverless scanning comes in two flavors: + . + * Apple AirScan or AirPrint scanning (official protocol name is eSCL) + * Microsoft WSD, or WS-Scan (term WSD means "Web Services for Devices) + . + This backend implements both protocols, choosing automatically between + them. It was successfully tested with many devices from Brother, Canon, + Kyocera, Lexmark, Epson, HP, Ricoh, Samsung and Xerox both in WSD and + eSCL modes. + +Package: sane-utils +Architecture: amd64 +Version: 1.4.0-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: graphics +Source: sane-backends +Maintainer: Ubuntu Developers +Original-Maintainer: Jörg Frings-Fürst +Installed-Size: 621 +Depends: adduser, update-inetd, debconf (>= 0.5) | debconf-2.0, libavahi-client3 (>= 0.6.16), libavahi-common3 (>= 0.6.16), libc6 (>= 2.38), libieee1284-3t64 (>= 0.2.11), libjpeg8 (>= 8c), libpng16-16t64 (>= 1.6.46), libsane1 (>= 1.0.27), libsystemd0, libusb-1.0-0 (>= 2:1.0.22), libxml2-16 (>= 2.14.1) +Suggests: avahi-daemon, unpaper +Breaks: libsane-common (<< 1.1.1-3~) +Filename: pool/sane-utils_1.4.0-1ubuntu1_amd64.deb +Size: 204344 +MD5sum: 1d52b69c501a8e1b1410b7ffbbed990b +SHA1: b95bcba4ab9e93d9c33efae644fe8ecbc31b3c1c +SHA256: 463d4c1cf4b3d40711b42b7c0151da612bf1d1629eb04f4fefad0d824f9e65a8 +SHA512: 44ee9107e9377570da5e90055de1b3246fd10633e2d014ae570dd0f1778ea6771c0e819f2f6e77a046fbe34d50aafcf0cb762d5c0c0f2c44182d86f7b3406b93 +Homepage: http://www.sane-project.org +Description: API library for scanners -- utilities + SANE stands for "Scanner Access Now Easy" and is an application + programming interface (API) that provides standardized access to any + raster image scanner hardware (flatbed scanner, hand-held scanner, + video- and still-cameras, frame-grabbers, etc.). The SANE standard is + free and its discussion and development are open to everybody. The + current source code is written to support several operating systems, + including GNU/Linux, OS/2, Win32 and various Unices and is available + under the GNU General Public License (commercial applications and + backends are welcome, too, however). + . + This package includes the command line frontend scanimage, the saned + server and the sane-find-scanner utility, along with their documentation. + +Package: sbsigntool +Architecture: amd64 +Version: 0.9.4-3.1ubuntu9 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian EFI Team +Installed-Size: 223 +Depends: libc6 (>= 2.38), libssl3t64 (>= 3.0.0), libuuid1 (>= 2.16) +Filename: pool/sbsigntool_0.9.4-3.1ubuntu9_amd64.deb +Size: 52296 +MD5sum: 5d4036f3553eac2e838b22e7694dee4f +SHA1: 14148af249efa5320370fe40cbc9fd4e3b7f5b86 +SHA256: e8709091cc42e0053ef3736d03e7c4afcd1798424bbb04e41199e95ce2c3766e +SHA512: 3e2f1ff61bb9f58850a14174b9561b66efa181b383a23fd3ba22b34de8835ee0306bda3d12bee387c75304655d1b29fbb2aea3a59e40ac787d8499078de56301 +Description: Tools to manipulate signatures on UEFI binaries and drivers + This package installs tools which can cryptographically sign EFI binaries and + drivers. + +Package: screen +Architecture: amd64 +Version: 4.9.1-3ubuntu2 +Priority: standard +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Axel Beckert +Installed-Size: 1004 +Depends: libc6 (>= 2.42), libcrypt1 (>= 1:4.1.0), libpam0g (>= 0.99.7.1), libtinfo6 (>= 6), debianutils (>= 5.3-1~) +Suggests: byobu | screenie | iselect (>= 1.4.0-1), ncurses-term +Filename: pool/screen_4.9.1-3ubuntu2_amd64.deb +Size: 648710 +MD5sum: 6d09d078e19fd45179eccef9255f5085 +SHA1: 5fa029c03f12fa8d503b10e77ef623e4e6aca7e1 +SHA256: 768d0adef7c8b9f5a1e690333a7a07e9e58b67b4d85dca0ef4119d989a03b91e +SHA512: 93c953bb185ebf44c26b372a0a2a6a424220b8aa75012c8246a9fdb9a3dedeb5ca611592f94b8716a53172a5bfabf1a9a75abc9333e77e4c7f0f0c4e6fb3d5e6 +Homepage: https://savannah.gnu.org/projects/screen +Description: terminal multiplexer with VT100/ANSI terminal emulation + GNU Screen is a terminal multiplexer that runs several separate "screens" on + a single physical character-based terminal. Each virtual terminal emulates a + DEC VT100 plus several ANSI X3.64 and ISO 2022 functions. Screen sessions + can be detached and resumed later on a different terminal. + . + Screen also supports a whole slew of other features, including configurable + input and output translation, serial port support, configurable logging, + and multi-user support. + +Package: seahorse +Architecture: amd64 +Version: 47.0.1-3build1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 2348 +Depends: dconf-gsettings-backend | gsettings-backend, libc6 (>= 2.38), libgck-1-0 (>= 3.12.0), libgcr-base-3-1 (>= 3.38), libgcr-ui-3-1 (>= 3.38), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.83.0), libgpgme45 (>= 1.23.2), libgtk-3-0t64 (>= 3.24), libhandy-1-0 (>= 1.6.0), libldap2 (>= 2.6.2), libpwquality1 (>= 1.1.0), libsecret-1-0 (>= 0.18), libsoup-3.0-0 (>= 3.0.3), gcr (>= 3.4), gnome-keyring (>= 3.4) +Recommends: openssh-client +Filename: pool/seahorse_47.0.1-3build1_amd64.deb +Size: 413634 +MD5sum: 5c81c9b2fe0bc602e37e86de85c507ca +SHA1: 95de9d3bbcae5e789c57c671173482c3e04583c7 +SHA256: 5c50947a81a292c000d9aa2f711378b3a9278ac14e5e70a0c53237fda6dfc4a2 +SHA512: 36cf9dd2d720c06df0548eac6df98bb42ac9933abe107e5d176f766f63b53013721543fdb249a42d2218907ba0425d39f629ffa87a548698caaafb4e9244e536 +Homepage: https://wiki.gnome.org/Apps/Seahorse +Description: GNOME front end for GnuPG + Seahorse is a front end for GnuPG - the GNU Privacy Guard program - + that integrates to the GNOME desktop. It is a tool for secure + communications and data storage. Data encryption and digital signature + creation can easily be performed through a GUI and Key Management + operations can easily be carried out through an intuitive interface. + +Package: secureboot-db +Architecture: amd64 +Version: 1.9build2 +Priority: optional +Section: utils +Maintainer: Steve Langasek +Installed-Size: 42 +Depends: sbsigntool +Filename: pool/secureboot-db_1.9build2_amd64.deb +Size: 19062 +MD5sum: 9b31ebffb7902f86af1f3a7b09eac854 +SHA1: 009dfc89ca1080a1a475c1c258165355ecd79027 +SHA256: e358f9d86ca91d71d44cc97ff63033547746657948e68721ce90c5c347d24390 +SHA512: ac1bdb8473223045a1a9e76281fe1604c0738076b172eb4725c8d8ade962828c12ae39142547c74bfb0a4e65059b34e7b12c52947c6563981b1455e1034e7d60 +Description: Secure Boot updates for DB and DBX + Systems with Secure Boot enabled have portions of the system signed by entries + in the Secure Boot DB. This package provides a mechanism for delivering + updates to DB and the corresponding blacklist database, DBX. + +Package: sgml-base +Architecture: all +Version: 1.31+nmu1build1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 65 +Suggests: sgml-base-doc +Filename: pool/sgml-base_1.31+nmu1build1_all.deb +Size: 11158 +MD5sum: 25f01cdb06606ea891ad6618396c8ab4 +SHA1: f1f381a12fa03a434a49bde80b71a71bc2de4285 +SHA256: 9ef16e373319feb10fa112eec5d906b302cd2c7b870af231f347d96d8db549e8 +SHA512: 276bccc640df3dc94737c64366bd28cd72e692ad39c3ff5da5410a6ca439ca75837c9b34e67e9f4debd69d9f4ec5f6e528e04c38f39b8dce809bdd8fbd97ee53 +Description: SGML infrastructure and SGML catalog file support + This package creates the SGML infrastructure directories and provides + SGML catalog file support in compliance with the current Debian SGML + Policy draft: + . + * infrastructure directories: + - /etc/sgml + - /usr/share/sgml/{declaration,dtd,entities,misc,stylesheet} + - /usr/share/local/sgml/{declaration,dtd,entities,misc,stylesheet} + . + * update-catalog(8): tool for maintaining the root SGML catalog + file and the package SGML catalog files in the '/etc/sgml' directory. + +Package: sgml-data +Architecture: all +Version: 2.0.11+nmu1build1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian XML SGML Team +Installed-Size: 1345 +Depends: perl:any, sgml-base (>= 1.28), xml-core (>= 0.14) +Suggests: perlsgml, w3-recs, opensp, libxml2-utils +Breaks: sp (<= 1.1.1-2) +Replaces: docbook-xml (<= 3.1.3.6-1), sp (<< 1.3.4-1.2.1-14) +Filename: pool/sgml-data_2.0.11+nmu1build1_all.deb +Size: 176660 +MD5sum: b310c117a9ac5235a223c5389a6cfd6f +SHA1: f3acbd8935d6f86dc1202f7132a01ade0a1ddebb +SHA256: 27ed22901a5d7c0e9bc486eed538745b7e672f7d6efa20d75bc0280089200894 +SHA512: d61a0625d4ab65a8de620de966b50685bc3a8ee482abdd1af42e6d32073fbec6bae0a92dbf681b5d10f387c6d6eed6069d5938dc0efa4f64e07d1e625539ab8f +Description: common SGML and XML data + This package contains basic XML and SGML data shared and used by + multiple packages. The package provides the technical format + (Document Type Definition, or DTD) of all major versions of HTML. It + also includes standard character entity definitions which describe + spacial characters or international characters, as well as other + standard miscellany used by other SGML and XML packages. + . + This package implements the Debian XML and SGML standards for entity + placement and registration. This benefits the user by making the + included materials instantly available to people writing, editing or + building documentation without any further effort. + +Package: shared-mime-info +Architecture: amd64 +Version: 2.4-5build3 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 2876 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libglib2.0-0t64 (>= 2.76.0), libstdc++6 (>= 12), libxml2-16 (>= 2.14.1) +Filename: pool/shared-mime-info_2.4-5build3_amd64.deb +Size: 476082 +MD5sum: b10fecb5e67820c58f49a7d38709f94c +SHA1: d321f6cdedd206dba8150110e214dcbdbf99186a +SHA256: da2eb52074c56dc60f6e446166ad799baa9a53e619971debd033e99ed37f158f +SHA512: 7688b40d4b64f0fb92c3e4c855f2b1671bfa960e23dc30bcf1e24ae74562ea1bc5debd0564571798fc3a9136dd9ab618207aaffdd3a9e65ab13a85376d111037 +Homepage: https://freedesktop.org/wiki/Software/shared-mime-info +Description: FreeDesktop.org shared MIME database and spec + This is the shared MIME-info database from the X Desktop Group. It is required + by any program complying to the Shared MIME-Info Database spec, which is also + included in this package. + . + At this time at least ROX, GNOME, KDE and Xfce use this database. + +Package: smartmontools +Architecture: amd64 +Version: 7.5-2 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Dmitry Smirnov +Installed-Size: 2250 +Depends: debianutils (>= 2.2), sysvinit-utils (>= 3.05-4~), libc6 (>= 2.38), libcap-ng0 (>= 0.7.9), libgcc-s1 (>= 3.3.1), libselinux1 (>= 3.1~), libstdc++6 (>= 5.2), libsystemd0 +Suggests: gsmartcontrol, smart-notifier, mailx | mailutils, curl | wget | lynx, gpg +Conflicts: smartsuite, ucsc-smartsuite +Breaks: smart-notifier (<= 0.28-8) +Filename: pool/smartmontools_7.5-2_amd64.deb +Size: 664482 +MD5sum: 1aaa2a3bf91a4b72031612a6f54008be +SHA1: c1a7f9dd38d404f4a110c8bd45c4d0447489589d +SHA256: ab211f171a9595f6b9686caaec44ca07a623c4605923caae756e2446e055e0ff +SHA512: 06c6f858c60db9c5563991148d420cd3373ac601d94690b5587e7ba9143d211d11958efed3dd717bb1be4c73bb794913e26129bf9a1aa8d5393e0dad44e7907e +Homepage: https://www.smartmontools.org/ +Description: control and monitor storage systems using S.M.A.R.T. + The smartmontools package contains two utility programs (smartctl and smartd) + to control and monitor storage systems using the Self-Monitoring, Analysis and + Reporting Technology System (S.M.A.R.T.) built into most modern ATA and SCSI + hard disks. It is derived from the smartsuite package, and includes support + for ATA/ATAPI-5 disks. It should run on any modern Linux system. + +Package: snapd +Architecture: amd64 +Version: 2.76.3+ubuntu26.04 +Built-Using: apparmor (= 5.0.0~beta1-0ubuntu7), libcap2 (= 1:2.75-10ubuntu2), libseccomp (= 2.6.0-2ubuntu5) +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Installed-Size: 143568 +Depends: adduser, apparmor, ca-certificates, fuse3, libcap2-bin, openssh-client, squashfs-tools, systemd, udev, default-dbus-session-bus | dbus-session-bus, libblkid1 (>= 2.17.2), libc6 (>= 2.38), libfuse3-4 (>= 3.17.2), liblzma5 (>= 5.1.1alpha+20120614), liblzo2-2 (>= 2.02), libudev1 (>= 183), zlib1g (>= 1:1.1.4) +Recommends: gnupg +Suggests: zenity | kdialog +Filename: pool/snapd_2.76.3+ubuntu26.04_amd64.deb +Size: 42585780 +MD5sum: 03536a7a28eb4f3a2aa5005038fb7f15 +SHA1: 734fb79f5ea825d40c98f2d42892f47917fe6c2b +SHA256: 1e3a926f32da79884ab05ee65363e8968cfcfe9df5839fd40da80f9f49756c97 +SHA512: 9cfea338758e81f5417b87904e5cc88560de17846d4193d9727cbbdec123cd872e27f4bfb8b327b57736f2ea07e4c20a82f9bb919600b1d27873f650599e8c97 +Homepage: https://github.com/canonical/snapd +Description: Daemon and tooling that enable snap packages + Install, configure, refresh and remove snap packages. Snaps are + 'universal' packages that work across many different Linux systems, + enabling secure distribution of the latest apps and utilities for + cloud, servers, desktops and the internet of things. + . + Start with 'snap list' to see installed snaps. + +Package: software-properties-common +Architecture: all +Version: 0.120.1 +Priority: optional +Section: admin +Source: software-properties +Maintainer: Ubuntu Developers +Original-Maintainer: Michael Vogt +Installed-Size: 192 +Depends: ca-certificates, gir1.2-glib-2.0, gir1.2-packagekitglib-1.0 (>= 1.1.0-2), packagekit, python-apt-common (>= 0.9), python3, python3-dbus, python3-gi, python3-software-properties (= 0.120.1), python3:any +Breaks: python-software-properties (<< 0.85), python3-software-properties (<< 0.85) +Replaces: python-software-properties (<< 0.85), python3-software-properties (<< 0.85) +Filename: pool/software-properties-common_0.120.1_all.deb +Size: 16556 +MD5sum: 5b5277bfe7912b33768077d2ef5e0247 +SHA1: 84f3b309171476cbef01a556fcc3eb2e56137907 +SHA256: 4eeb906a718dc3e708aa50821e35be1ec7d9584c33e88fc1fadb53bed9c1d7f2 +SHA512: 5cbf52b6a50fcfaa0611038a943e9ae4038fd9b589832450dd4b395252ce38e54d358924a19b3e63f8f3fde3578d876bee97960573265204ea4655f2bc44c5c2 +Description: manage the repositories that you install software from (common) + This software provides an abstraction of the used apt repositories. + It allows you to easily manage your distribution and independent software + vendor software sources. + . + This package contains the common files for software-properties like the + D-Bus backend. + +Package: sound-icons +Architecture: all +Version: 0.1-8build1 +Multi-Arch: foreign +Priority: optional +Section: sound +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 722 +Filename: pool/sound-icons_0.1-8build1_all.deb +Size: 517138 +MD5sum: dce3c9b929b6d1ef5fe6a1d62e0917d0 +SHA1: e11f4d48aa6e370523a9675f544e3efbb00482cd +SHA256: 8b9d5d8955b7ab82a4edc81fbecd6c0a7ade43ce1b6244e18ad1e4b2ecac62be +SHA512: 3350a8c4d891f7bb031cdb417f49c01f41b5ee302920a9d6412a821e2874253568eaa8146e2a7b93eef1c2c49e0b73e5323a212ddc2ae14c9b5ec5ce10470329 +Homepage: https://devel.freebsoft.org/pub/projects/sound-icons +Description: Sounds for speech enabled applications + This package contains sound icons to be used for event signalization in + speech enabled applications. They are especially useful when running + Speech Dispatcher. + +Package: sound-theme-freedesktop +Architecture: all +Version: 0.8-7build1 +Multi-Arch: foreign +Priority: optional +Section: sound +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 534 +Filename: pool/sound-theme-freedesktop_0.8-7build1_all.deb +Size: 384340 +MD5sum: 128b50d656ec5ab78ae7342ca6309d42 +SHA1: 31b6069053127949d2386840e49870844671525a +SHA256: 17eab7b1c0dad976da5873d98792af0df10b1e2c702404fc11ceb151053f3163 +SHA512: 4b75bd98d6e9a78ad404947ab70ee1e82eb7b42c9990533790fd4d41ce55aae6fb961a7e744328f74aa83ae72e69cbe6ea424229f158e36e219294a4a3a7ef64 +Homepage: https://www.freedesktop.org/wiki/Specifications/sound-theme-spec/ +Description: freedesktop.org sound theme + The default freedesktop.org sound theme following the XDG theming + specification. It contains a full set of sounds for different + desktop events. + . + These sounds come from various sources: KDE, Ekiga, Pidgin/Purple, ALSA. + +Package: speech-dispatcher +Architecture: amd64 +Version: 0.12.1-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: sound +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 29624 +Depends: adduser, speech-dispatcher-audio-plugins (= 0.12.1-2ubuntu1), init-system-helpers (>= 1.52), libc6 (>= 2.38), libdotconf0 (>= 1.0.13), libglib2.0-0t64 (>= 2.76.0), libltdl7 (>= 2.5.4), libsndfile1 (>= 1.0.20), libspeechd-module0 (>= 0.12.1), libspeechd2 (>= 0.12.0~), libsystemd0 +Recommends: speech-dispatcher-espeak-ng, sound-icons +Suggests: libttspico-utils, espeak, mbrola, speech-dispatcher-doc-cs, speech-dispatcher-festival, speech-dispatcher-cicero, speech-dispatcher-flite, speech-dispatcher-espeak +Breaks: cl-speech-dispatcher (<< 0.9~), libspeechd2 (<< 0.9~), python-speechd (<< 0.9~), python3-speechd (<< 0.9~), speech-dispatcher-baratinoo (<< 0.10.2-1~), speech-dispatcher-ibmtts (<< 0.10.2-1~), speech-dispatcher-kali (<< 0.10.2-1~) +Filename: pool/speech-dispatcher_0.12.1-2ubuntu1_amd64.deb +Size: 4232308 +MD5sum: 9a68381f54df5745392b6c63a679aba9 +SHA1: 8a58d5db6ff4d49c458e388e9807c61d4ec67cf6 +SHA256: f8300fd793a251968e7e7d98b5adc7e8365ca320cb8bd39a465142ffa6b78785 +SHA512: b494ede8fb0249cc592c7a7bb696cbf0acd494a187b0b9031b3b125497f150e0fb07b736e72c7e13fbeef1e81b76485b27bc26d9d3754fa70c87223b9922cfae +Homepage: http://devel.freebsoft.org/speechd +Description: Common interface to speech synthesizers + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains Speech Dispatcher itself. + +Package: speech-dispatcher-audio-plugins +Architecture: amd64 +Version: 0.12.1-2ubuntu1 +Multi-Arch: same +Priority: optional +Section: sound +Source: speech-dispatcher +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 148 +Depends: libao4 (>= 1.1.0), libasound2t64 (>= 1.0.18), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.36), libpipewire-0.3-0t64 (>= 0.3.6), libpulse0 (>= 0.99.1) +Filename: pool/speech-dispatcher-audio-plugins_0.12.1-2ubuntu1_amd64.deb +Size: 38290 +MD5sum: a0f075519e549c2e8a4f6d2fde1064c7 +SHA1: 540003a20222c40fed425ad9e3425c7c3480c6c0 +SHA256: f4a6125d8c9936e2619c8bbf0456b5623e09ea996cd2b940fda2473ee7eba520 +SHA512: 05e13100940ad7bffb1f4c30f4d181a7fdf9d0b5a4bed5cdde86e45b5b7f139d30d69d6cdbd6614e169373f932a0f6e3dffe12381cceede7c685e5b17d239790 +Homepage: http://devel.freebsoft.org/speechd +Description: Speech Dispatcher: Audio output plugins + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains all the speech-dispatcher audio output plugins. + +Package: speech-dispatcher-espeak-ng +Architecture: amd64 +Version: 0.12.1-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: sound +Source: speech-dispatcher +Maintainer: Ubuntu Developers +Original-Maintainer: Debian TTS Team +Installed-Size: 80 +Depends: libc6 (>= 2.38), libdotconf0 (>= 1.0.13), libespeak-ng1 (>= 1.52.0+dfsg), libglib2.0-0t64 (>= 2.36), libltdl7 (>= 2.5.4), libspeechd-module0 (>= 0.12.1), speech-dispatcher (= 0.12.1-2ubuntu1) +Filename: pool/speech-dispatcher-espeak-ng_0.12.1-2ubuntu1_amd64.deb +Size: 24202 +MD5sum: f14204949306819b4c33b593e13a2d62 +SHA1: 3176dc31a7ab0740e3c098efe15c5c0c2acd2287 +SHA256: 51e4e03ba24dad5becd5bbd93cb61d5895df30d43f27ea5482c9ad311125b46a +SHA512: 8b11406214eed23b3ea93b113d54f0b8ce126933b85bbef4ef82b44bbc1e7f76c9c36f152c5fd85b5649502ede2cebdd0e3ec8741b26227b718f8ae1988bc53a +Homepage: http://devel.freebsoft.org/speechd +Description: Speech Dispatcher: Espeak-ng output module + Speech Dispatcher provides a device independent layer for speech synthesis. + It supports various software and hardware speech synthesizers as + backends and provides a generic layer for synthesizing speech and + playing back PCM data via those different backends to applications. + . + Various high level concepts like enqueueing vs. interrupting speech and + application specific user configurations are implemented in a device + independent way, therefore freeing the application programmer from + having to yet again reinvent the wheel. + . + This package contains the output module for the espeak-ng speech synthesizer. + +Package: spice-vdagent +Architecture: amd64 +Version: 0.23.0-1ubuntu0.1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Abhijith PA +Installed-Size: 221 +Depends: libasound2t64 (>= 1.0.22), libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libdrm2 (>= 2.4.3), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.0.0), libpciaccess0, libsystemd0, libx11-6, libxfixes3, libxinerama1 (>= 2:1.1.4), libxrandr2 (>= 2:1.2.99.2) +Filename: pool/spice-vdagent_0.23.0-1ubuntu0.1_amd64.deb +Size: 65992 +MD5sum: 56a9c27647c9abee7fd56bc006ad4f17 +SHA1: a387d91fb045f18fcf6b522a7be0d74e031c4056 +SHA256: aef0367f5c63482814a912f7bdfc544cd877900a7353b22fc32dc90fe6e63af0 +SHA512: dde4a14b133506731e983ee50b5c1d9ab58ba200f4d85e8864d04715be8b1ef0d4da48fa98b1c7afe767c9e4709afe0ae7a65ee111a2202dbbdd1ce5e188ffb6 +Homepage: https://www.spice-space.org/ +Description: Spice agent for Linux + spice-vdagent is the spice agent for Linux, it is used in conjunction with + spice-compatible hypervisor, its feature includes: + - Client mouse mode (no need to grab mouse by client, no mouse lag) + this is handled by the daemon by feeding mouse events into the kernel + via uinput. This will only work if the active X-session is running a + spice-vdagent process so that its resolution can be determined. + - Automatic adjustment of the X-session resolution to the client resolution + - Support of copy and paste (text and images) between the active X-session + and the client + +Package: squashfs-tools +Architecture: amd64 +Version: 1:4.7.5-1 +Priority: optional +Section: kernel +Maintainer: Ubuntu Developers +Original-Maintainer: Laszlo Boszormenyi (GCS) +Installed-Size: 599 +Depends: libc6 (>= 2.38), liblz4-1 (>= 0.0~r130), liblzma5 (>= 5.1.1alpha+20120614), liblzo2-2 (>= 2.02), libzstd1 (>= 1.5.5), zlib1g (>= 1:1.1.4) +Filename: pool/squashfs-tools_1%3a4.7.5-1_amd64.deb +Size: 228228 +MD5sum: c4a2ff6a50f5ea132377830938ddc46b +SHA1: a1670bb385254fc11db522940b4686b695ed6d75 +SHA256: 3d4bf31f24105c4cc44da6b69ec130ed1784236059185f6d85bdd592c37a7bca +SHA512: 9591b74bf8083783952a0d0c51d4080a9ddae4651258ed6253282bfac3510b98a7c49a3dcfa58785315dc8f78c9dd787055587078b5a75f5c09833f807615380 +Homepage: https://github.com/plougher/squashfs-tools +Description: Tool to create and append to squashfs filesystems + Squashfs is a highly compressed read-only filesystem for Linux. It uses zlib + compression to compress both files, inodes and directories. Inodes in the + system are very small and all blocks are packed to minimise data overhead. + Block sizes greater than 4K are supported up to a maximum of 64K. + . + Squashfs is intended for general read-only filesystem use, for archival use + (i.e. in cases where a .tar.gz file may be used), and in constrained block + device/memory systems (e.g. embedded systems) where low overhead is needed. + +Package: ssh-import-id +Architecture: all +Version: 5.11-0ubuntu4 +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Andrew Starr-Bochicchio +Installed-Size: 50 +Depends: ca-certificates, openssh-client, python3-distro, python3-launchpadlib, wget, python3:any +Recommends: openssh-server +Filename: pool/ssh-import-id_5.11-0ubuntu4_all.deb +Size: 10244 +MD5sum: 01fa051453d8afda4a3d0c5fe0877094 +SHA1: b69daa4ee5a310d989359597ce65e293289e0f44 +SHA256: 901e1f40654bf083c1eabb7b09baec0fcc3fe23bcc6cdc07f7af99015d254029 +SHA512: 646ec70fc521bb98babe1c6fd11422e82d3ac14ec6c82513f55b9d087db9e7010d1fe6b217f49a28631dec7ed0d21f06573a60ba681fa8b1b1d5df178ea77ba4 +Homepage: http://launchpad.net/ssh-import-id +Description: securely retrieve an SSH public key and install it locally + This utility will securely contact a public keyserver (Launchpad.net by + default, but Github.com is also supported), retrieve one or more user's + public keys, and append these to the current user's ~/.ssh/authorized_keys + file. + +Package: ssl-cert +Architecture: all +Version: 1.1.3ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Apache Maintainers +Installed-Size: 67 +Depends: debconf (>= 0.5) | debconf-2.0, openssl (>= 0.9.8g-9), adduser +Filename: pool/ssl-cert_1.1.3ubuntu2_all.deb +Size: 18760 +MD5sum: bc370b57fc8d8db22aed7b6592ee651b +SHA1: affd75c48f894e9da0ecbb67ef8de5e177c8a7bd +SHA256: 4c59f4b329dcf63b73af41a9e686c944c4b03a6da36a4f4d8a864a935495e61c +SHA512: 5f3e1e803bdf273703bca03f80cc5dd9653616d0c457cd20ae10db7ef0f6ad1e647b59a0d266f505856d492355d399e5a1ef32196ac22e4e8740a4539f132dd1 +Description: simple debconf wrapper for OpenSSL + This package enables unattended installs of packages that + need to create SSL certificates. + . + It is a simple wrapper for OpenSSL's certificate request utility that + feeds it with the correct user variables. + +Package: sssd +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Multi-Arch: foreign +Priority: optional +Section: metapackages +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 21 +Depends: python3-sss (= 2.12.0-1ubuntu5.4), sssd-ad (= 2.12.0-1ubuntu5.4), sssd-common (= 2.12.0-1ubuntu5.4), sssd-ipa (= 2.12.0-1ubuntu5.4), sssd-krb5 (= 2.12.0-1ubuntu5.4), sssd-ldap (= 2.12.0-1ubuntu5.4), sssd-proxy (= 2.12.0-1ubuntu5.4) +Filename: pool/sssd_2.12.0-1ubuntu5.4_amd64.deb +Size: 4062 +MD5sum: 57fc73eefb06aede14607366cefbc394 +SHA1: cec715780d114920dabc7e35618b13da1f8f5599 +SHA256: d7ab2be5dd0978128e4d9f468bfa32ef46340ab89a26b102c52dbd9201365a5c +SHA512: 8f1aa5f52c5bfcf331b4040c54bbc3becef71d132c7238022771ac1987d7746aa38e0f4a075df2edd4ba84004565c0f9f38cd69d7b517c33de9e62d8b6300e31 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- metapackage + Provides a set of daemons to manage access to remote directories and + authentication mechanisms. It provides an NSS and PAM interface toward + the system and a pluggable backend system to connect to multiple different + account sources. It is also the basis to provide client auditing and policy + services for projects like FreeIPA. + . + This package is a metapackage which installs the daemon and existing + authentication back ends. + +Package: sssd-ad +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 393 +Depends: libcap2-bin, libsss-idmap0 (= 2.12.0-1ubuntu5.4), sssd-ad-common (= 2.12.0-1ubuntu5.4), sssd-common (= 2.12.0-1ubuntu5.4), sssd-krb5-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.34), libdhash1t64 (>= 0.4.0), libini-config5t64 (>= 0.4.0), libldap2 (>= 2.6.2), libldb2 (>= 0.9.21), libndr6 (>= 2:4.20.0~rc1), libpopt0 (>= 1.14), libsasl2-2 (>= 2.1.28+dfsg1), libsmbclient0 (>= 2:4.0.3+dfsg1), libtalloc2 (>= 2.0.4~git20101213), libtevent0t64 (>= 0.15.0), samba-libs (>> 2:4.23.6+dfsg-1ubuntu2.2~) +Suggests: adcli +Filename: pool/sssd-ad_2.12.0-1ubuntu5.4_amd64.deb +Size: 133168 +MD5sum: f32ab4aa203516f7e78cac630f7de5c6 +SHA1: 7d0167ef9bc5f5f5112149d7145b82e2169902be +SHA256: b2e0c77a820221659e4168c9230460266ad42932e76044fa8f970a7627ececfd +SHA512: 2fc2f88c7593a940babf3d96de44fad1224c1cfcdf83d1388b933ce217bf096b4af728a9c8f97429adabdabad58e04b39c50439b406959afbe613c4c3965c145 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- Active Directory back end + Provides the Active Directory back end that the SSSD can utilize to fetch + identity data from and authenticate against an Active Directory server. + +Package: sssd-ad-common +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 248 +Depends: sssd-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.38), libldb2 (>= 0.9.21), libndr6 (>= 2:4.20.0~rc1), libpopt0 (>= 1.14), libselinux1 (>= 3.1~), libsss-idmap0 (>= 2.12.0), libsystemd0, libtalloc2 (>= 2.0.4~git20101213), libtdb1 (>= 1.2.7+git20101215), libtevent0t64 (>= 0.15.0), samba-libs (>> 2:4.23.6+dfsg-1ubuntu2.2~) +Filename: pool/sssd-ad-common_2.12.0-1ubuntu5.4_amd64.deb +Size: 73146 +MD5sum: 2bd7ce800e551943a87d7015c6c9e712 +SHA1: 7676cf72021cb56aefd0b1924181da9a7cdf53cc +SHA256: 498bfac27403518a91aea7a1cb629d35559c82116eebb5709d0f9771154a6f18 +SHA512: 7ea1100af20a46de7016fcc3e712096e64a86e04a9a40844214006301204c42a4a68b0dd2e9bda7e9bcab77101c71e69319456f3ad6487d0558955b50a6a151c +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- PAC responder + Provides the PAC responder that the AD and IPA backends can use for + fetching additional attributes from the kerberos ticket. + +Package: sssd-common +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 5012 +Depends: libcap2-bin, libnss-sss (= 2.12.0-1ubuntu5.4), libpam-sss (= 2.12.0-1ubuntu5.4), python3, python3-sss, libc6 (>= 2.38), libcap2 (>= 1:2.10), libcares2 (>= 1.7.0), libdbus-1-3 (>= 1.10), libdhash1t64 (>= 0.4.0), libgssapi-krb5-2 (>= 1.17), libini-config5t64 (>= 0.6.0), libjansson4 (>= 2.14), libkeyutils1 (>= 1.4), libkrb5-3 (>= 1.11+dfsg), libldap2 (>= 2.6.2), libldb2 (>= 0.9.21), libnfsidmap1 (>= 1:2.8.5), libnl-3-200 (>= 3.11.0), libnl-route-3-200 (>= 3.11.0), libp11-kit0 (>= 0.25.0), libpam0g (>= 0.99.7.1), libpcre2-8-0 (>= 10.22), libpopt0 (>= 1.14), libref-array1t64 (>= 0.4.0), libselinux1 (>= 3.1~), libssl3t64 (>= 3.0.0), libsss-certmap0 (>= 2.12.0), libsss-idmap0 (>= 2.12.0), libsss-nss-idmap0 (>= 2.12.0), libsystemd0, libtalloc2 (>= 2.0.4~git20101213), libtdb1 (>= 1.2.7+git20101215), libtevent0t64 (>= 0.15.0), libunistring5 (>= 1.1), adduser +Recommends: bind9-dnsutils, bind9-host +Suggests: apparmor, libsss-sudo, sssd-tools +Filename: pool/sssd-common_2.12.0-1ubuntu5.4_amd64.deb +Size: 1137678 +MD5sum: 86fa123456618a30cd55e0a8d47ed910 +SHA1: d51130801000aad413bd2362004bdf90a6a0a383 +SHA256: 3b2a046b8fb2fde70f68cfb484544b78e260ec74a1f12e721b287dec59bf2096 +SHA512: 95ffe974361d20c22ae7f0fe46e8299a510b251ba3fbd7a00c3cae8d565cc727142b3a056f7b42a49f78b0f59c6af04f5fc49523f90056d6670274613887d3e3 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- common files + Provides a set of daemons to manage access to remote directories and + authentication mechanisms. It provides an NSS and PAM interface toward + the system and a pluggable backend system to connect to multiple different + account sources. It is also the basis to provide client auditing and policy + services for projects like FreeIPA. + . + This package provides the daemon and other common files needed by the + authentication back ends. + +Package: sssd-ipa +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 708 +Depends: libcap2-bin, libipa-hbac0t64 (= 2.12.0-1ubuntu5.4), libsss-idmap0 (= 2.12.0-1ubuntu5.4), sssd-ad-common (= 2.12.0-1ubuntu5.4), sssd-common (= 2.12.0-1ubuntu5.4), sssd-krb5-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.34), libcap2 (>= 1:2.10), libdhash1t64 (>= 0.4.0), libldap2 (>= 2.6.2), libldb2 (>= 0.9.21), libndr6 (>= 2:4.20.0~rc1), libpopt0 (>= 1.14), libselinux1 (>= 3.1~), libsemanage2 (>= 2.0.3), libtalloc2 (>= 2.0.4~git20101213), libtevent0t64 (>= 0.15.0), samba-libs (>> 2:4.23.6+dfsg-1ubuntu2.2~) +Filename: pool/sssd-ipa_2.12.0-1ubuntu5.4_amd64.deb +Size: 223288 +MD5sum: 779645044ed7dbedd5f14ea622627a23 +SHA1: dc5470a9e390d2561d723bfd91979ff8086c2ab2 +SHA256: 116181ce0f43e363b77f6ac4a8c6432cdb3415139449b10a79a614c54ec71d0d +SHA512: 027d60d61e1cd8a6a95641b55c2c912c15301ecc90716a2ab492dd6f10e1bdca181fda91c612cef42176bc4a7eed9fd2368bacb3a5c069a6a7b64c8280280be0 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- IPA back end + Provides the IPA back end that the SSSD can utilize to fetch identity data + from and authenticate against an IPA server. + +Package: sssd-krb5 +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 55 +Depends: sssd-common (= 2.12.0-1ubuntu5.4), sssd-krb5-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.4), libtalloc2 (>= 2.0.4~git20101213) +Breaks: sssd-common (<< 2.7.0-1) +Replaces: sssd-common (<< 2.7.0-1) +Filename: pool/sssd-krb5_2.12.0-1ubuntu5.4_amd64.deb +Size: 14518 +MD5sum: cf1a5defac57f6d92b228c46e7470ae9 +SHA1: 8a737ebf9da42e066cb7cbc5489db4cc0f30c03e +SHA256: 000596df2b1c64496d2f69facad09bc791236f653f6cb306e786b859f17ca1f8 +SHA512: 5577319a8e10bdb27e0aa1ee9fde601d79ee52125f306ff8c41bd38277c307c587aed48b39032e546a552e8f6cebff56d579a834196aa5c51dfbf3bb6427e8cd +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- Kerberos back end + Provides the Kerberos back end that the SSSD can utilize authenticate + against a Kerberos server. + +Package: sssd-krb5-common +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 321 +Depends: sssd-common (= 2.12.0-1ubuntu5.4), libcap2-bin, libc6 (>= 2.34), libcap2 (>= 1:2.10), libdhash1t64 (>= 0.4.0), libjansson4 (>= 2.14), libkrb5-3 (>= 1.12~alpha1+dfsg), libpopt0 (>= 1.14), libsystemd0, libtalloc2 (>= 2.0.4~git20101213) +Recommends: libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal +Filename: pool/sssd-krb5-common_2.12.0-1ubuntu5.4_amd64.deb +Size: 92940 +MD5sum: 1a270edfa9e57f37870897192bb2f035 +SHA1: b577a665204b6c3de44535b5f512270001e53457 +SHA256: bf510ceabec0f137fc12324b681b864d102732fd14ac65a73ef10f01c5f2c125 +SHA512: c38fedeff31bd719c126dd8125016437b0d99890dbb0d856b4abfa34aa8e6ca435f2f26dd203e17be8784a94d0ce4886b141ea8c7796638c7c881fb8c5480f64 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- Kerberos helpers + Provides helper processes that the LDAP and Kerberos back ends can use for + Kerberos user or host authentication. + +Package: sssd-ldap +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 75 +Depends: libsss-idmap0 (= 2.12.0-1ubuntu5.4), sssd-common (= 2.12.0-1ubuntu5.4), sssd-krb5-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.4), libtalloc2 (>= 2.0.4~git20101213), libtevent0t64 (>= 0.15.0) +Recommends: ldap-utils +Suggests: libsasl2-modules-ldap +Filename: pool/sssd-ldap_2.12.0-1ubuntu5.4_amd64.deb +Size: 32010 +MD5sum: bf12cf0c8d7304fa9872ed641e25a592 +SHA1: cc98726fca01c23c4900813d5565ac5e90ea3411 +SHA256: dc859f033537ff462b983bfea5ca27d0eea9f191d4fdb5db81b1dcadf5c398cc +SHA512: 2add7ab8a9fd2e43987f64cdce84d90258a2f9f9ed240edf2d37e95fe62d113f0fa5cc0c20b1b8142c13914a76fe0ccf5394e473f45e61c93466e78f6677fc51 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- LDAP back end + Provides the LDAP back end that the SSSD can utilize to fetch identity data + from and authenticate against an LDAP server. + +Package: sssd-proxy +Architecture: amd64 +Version: 2.12.0-1ubuntu5.4 +Priority: optional +Section: utils +Source: sssd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian SSSD Team +Installed-Size: 158 +Depends: sssd-common (= 2.12.0-1ubuntu5.4), libc6 (>= 2.34), libdhash1t64 (>= 0.4.0), libldb2 (>= 0.9.21), libpam0g (>= 0.99.7.1), libpopt0 (>= 1.14), libsss-certmap0 (>= 2.12.0), libtalloc2 (>= 2.0.4~git20101213), libtevent0t64 (>= 0.15.0) +Filename: pool/sssd-proxy_2.12.0-1ubuntu5.4_amd64.deb +Size: 44858 +MD5sum: 1152752813800cd8158f192a3d2baf1e +SHA1: 18e18146c38e791aded6c3eef2136b9b3eb0cbfb +SHA256: 2e9bd733a21cdc21383afaa529824600f4f5ff04f47c5675ca8fa2beef7348ed +SHA512: 281765a86c6efcc092ab13b9e1a3f56ace7b5cd87d0d2c313d7e9064822651252fd1d39c77823aa528c3a0d868a1c5fa343ce10d3131fcb38a1a71fec7e43333 +Homepage: https://github.com/SSSD/sssd +Description: System Security Services Daemon -- proxy back end + Provides the proxy back end which can be used to wrap an existing NSS and/or + PAM modules to leverage SSSD caching. + +Package: switcheroo-control +Architecture: amd64 +Version: 3.0-2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 137 +Depends: gir1.2-glib-2.0, python3-gi, python3:any, libc6 (>= 2.34), libdrm-amdgpu1 (>= 2.4.63), libdrm2 (>= 2.3.1), libglib2.0-0t64 (>= 2.44.0), libgudev-1.0-0 (>= 165) +Filename: pool/switcheroo-control_3.0-2_amd64.deb +Size: 20756 +MD5sum: 5e52e15e981a6fe2a61304659cd0f024 +SHA1: a6ede3ae3f452703517039e7d7daa8c2f47cbc2c +SHA256: 7ec5e18c8b933a32db8a8f74749f42b9afec36bbbfaa8f00512dc15c09284647 +SHA512: 30fa5ed3cb7e1fb0d89c6a8561c44f7ee96c193556aa151cdf39df67c75b1275b2b377f7c5082560a26499174e4ac40d2ec1557af06111fdb059d8bee1e5ee67 +Homepage: https://gitlab.freedesktop.org/hadess/switcheroo-control +Description: D-Bus service to check the availability of dual-GPU + For systems that have both an integrated GPU and a dedicated GPU, this + package by default will force the integrated GPU to be used to save power. + . + You can launch individual apps using the dedicated GPU by running them + with the environment variable DRI_PRIME=1. Or you can right-click on the + app (while it's not running) in GNOME Shell's Activities Overview + and choose the "Launch using Dedicated Graphics Card" option. + . + If this default behavior is not appropriate, uninstall this package or + set xdg.force_integrated=0 as a kernel command-line option in your + bootloader. + +Package: sysprof +Architecture: amd64 +Version: 50.0-1 +Priority: optional +Section: devel +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 3068 +Depends: libsysprof-6-6 (= 50.0-1), libsysprof-6-modules (= 50.0-1), libadwaita-1-0 (>= 1.6~beta), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libdebuginfod1t64 (>= 0.180), libdex-1-1 (>= 0.9), libdw1t64 (>= 0.188), libelf1t64 (>= 0.131), libgcc-s1 (>= 3.4), libglib2.0-0t64 (>= 2.80.0), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.19.4), libjson-glib-1.0-0 (>= 1.5.2), libpanel-1-1 (>= 1.7.0), libpango-1.0-0 (>= 1.14.0), libpolkit-agent-1-0 (>= 0.99), libpolkit-gobject-1-0 (>= 0.101), libstdc++6 (>= 4.1.1), libsystemd0 +Suggests: mesa-utils +Filename: pool/sysprof_50.0-1_amd64.deb +Size: 548626 +MD5sum: 2c5719ecc4ffa43e2979c1823af1774f +SHA1: 29fe0285e467037a992a824103e5bffc7c3166dc +SHA256: cf540d381dd24719c1107640dfce53c10cb9292607634028734a2d924f69ac56 +SHA512: f8b334b690a2e1f6726c7d24b5d4b41ea90e897a2bf89520d61f4edca1a5626c9fecc5ac08de3e0d8ce0683ae6e3656d7c9b8b3b0023df86b4c3e78aa10a8590 +Homepage: https://apps.gnome.org/Sysprof/ +Description: system-wide Linux profiler + Sysprof is a sampling CPU profiler that uses a ptrace in Linux kernel to + profile the entire system, not just a single application. Sysprof handles + shared libraries and applications do not need to be recompiled. In fact they + don't even have to be restarted. + . + It has the following features: + - profiles all running processes, not just a single application + - has a simple graphical interface + - shows the time spent in each branch of the call tree + - profiles can be loaded and saved + +Package: system-config-printer-common +Architecture: all +Version: 1.5.18-4ubuntu2 +Priority: optional +Section: gnome +Source: system-config-printer +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 872 +Depends: gir1.2-gdkpixbuf-2.0, gir1.2-glib-2.0, gir1.2-gtk-3.0, gir1.2-notify-0.7, gir1.2-pango-1.0, python3-cairo, python3-cups (>= 1.9.60), python3-cupshelpers (= 1.5.18-4ubuntu2), python3-dbus, python3-gi, python3:any +Recommends: cups-pk-helper, gir1.2-secret-1, system-config-printer-udev +Suggests: gnome-software (>= 3.16.5-2), python3-smbc +Filename: pool/system-config-printer-common_1.5.18-4ubuntu2_all.deb +Size: 108846 +MD5sum: dfe54c501b9336aee788948a3803879c +SHA1: 3a12a40955ce851f401f9df7634de30dd5643482 +SHA256: 2214c686d038a0e444e869f08f112571673f78c115d07c5133e530886b220e24 +SHA512: 4966b365e19ed285eb4f5526a1d98794874e963446c729567607913d735d96e5b52c5e5ee01b8579e212b036314f0604410318342d88af1e47d0bec5a5cdd616 +Homepage: https://github.com/OpenPrinting/system-config-printer +Description: backend and the translation files for system-config-printer + System-config-printer is a GUI written in Python using GTK+ to + configure a CUPS server. Its primary use is to configure the printing + system on the local host, but can also be used to setup a remote + printer. + . + In terms of features, it aims to be as complete as the CUPS web + administration tool, while being integrated to the desktop. + . + This package contains the backend and the translation files for + system-config-printer + +Package: system-config-printer-udev +Architecture: amd64 +Version: 1.5.18-4ubuntu2 +Priority: optional +Section: gnome +Source: system-config-printer +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 70 +Depends: python3-cups (>= 1.9.42), python3-cupshelpers (>= 1.5.18-4ubuntu2), python3-dbus, python3:any (>= 3.3.2-2~), libc6 (>= 2.38), libcups2t64 (>= 1.6.0), libglib2.0-0t64 (>= 2.12.0), libudev1 (>= 183), libusb-1.0-0 (>= 2:1.0.8) +Filename: pool/system-config-printer-udev_1.5.18-4ubuntu2_amd64.deb +Size: 21560 +MD5sum: b3e46f05b1df8bce38e6d3e922c804a5 +SHA1: fe7d8af8d98a736a731ddad76619ae76d99fd2f2 +SHA256: 6214416b12a740564317736bb2e011cc10555a019b11821afcf1d5b1dffefd17 +SHA512: 0e3c8608db331f744bfd379080389ab14231ba9be429223eaf9495b3ff538ad578addbbd37514938ede42752525f94483d2b1f3ebcde6ca98b16f79db864ab5b +Homepage: https://github.com/OpenPrinting/system-config-printer +Description: Utilities to detect and configure printers automatically + These utilities allow one to detect automatically printers using UDEV when + they are plugged on the system. They are then configured automatically in + the CUPS printing daemon and made available to users. + +Package: systemd +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: foreign +Priority: important +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 10988 +Provides: systemd-sysusers (= 259.5-0ubuntu3.4), systemd-tmpfiles (= 259.5-0ubuntu3.4) +Pre-Depends: libc6 (>= 2.38), libsystemd-shared (= 259.5-0ubuntu3.4) +Depends: libc6 (>= 2.41), libssl3t64 (>= 3.4.0), libsystemd0 (= 259.5-0ubuntu3.4), mount +Recommends: default-dbus-system-bus | dbus-system-bus, linux-sysctl-defaults, login, systemd-timesyncd | time-daemon, systemd-resolved, systemd-cryptsetup +Suggests: systemd-container, systemd-homed, systemd-userdbd, systemd-boot, systemd-repart, libtss2-tcti-device0, polkitd +Conflicts: consolekit, elogind, libpam-ck-connector, opensysusers (<< 0.7.3-4.1~), systemctl, systemd-shim +Breaks: dracut-core (<< 102-2~), less (<< 563), sicherboot (<< 0.1.6) +Filename: pool/systemd_259.5-0ubuntu3.4_amd64.deb +Size: 3128676 +MD5sum: ae2e2bc1484f0f1e28814d48f368e2dd +SHA1: 0452e8eadacd8e0aa9e4242728ac1fef0158a2ee +SHA256: 1b2eca56c5cfdbc1aca78591a68f94b7e1c996abd52095587069776b816b9dca +SHA512: ec71e0bf325cde92f823c6a72a6596f2fb2a5af4ae576540d0bbaab0eb2f687f837c36f12c308c73455c8ef3144fe6fb4001b3f63c62b58fffa93234c95f4d5e +Homepage: https://systemd.io +Description: system and service manager + systemd is a system and service manager for Linux. It provides aggressive + parallelization capabilities, uses socket and D-Bus activation for starting + services, offers on-demand starting of daemons, keeps track of processes using + Linux control groups, maintains mount and automount points and implements an + elaborate transactional dependency-based service control logic. + . + Installing the systemd package will not switch your init system unless you + boot with init=/lib/systemd/systemd or install systemd-sysv in addition. + +Package: systemd-cryptsetup +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Priority: important +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 504 +Depends: libc6 (>= 2.38), libcryptsetup12 (>= 2:2.7), libssl3t64 (>= 3.0.0), libsystemd-shared (= 259.5-0ubuntu3.4) +Conflicts: systemd (<< 256-2~) +Filename: pool/systemd-cryptsetup_259.5-0ubuntu3.4_amd64.deb +Size: 124294 +MD5sum: 5900a51a2042454289dbe99cf1d1f463 +SHA1: a52ee73f8536456b6ed93350f2b06cd049792341 +SHA256: 1e276f5437760fa5720b878b6af373e0692412671537dd8ba31e30208aff3ab8 +SHA512: e90582ea735a72c990de0a9752432cebe51feee16aa2d2a5a78fd1115c5ae0152e00566856f9fbb738257021ec872c7b1245bfaf8aa46cdfa43c63fc03c906b0 +Homepage: https://systemd.io +Description: Provides cryptsetup, integritysetup and veritysetup utilities + Utilities and units that integrated cryptsetup/integritysetup/veritysetup + support in systemd. + +Package: systemd-hwe-hwdb +Architecture: all +Version: 259.5.3ubuntu +Priority: optional +Section: admin +Source: systemd-hwe +Maintainer: Ubuntu Developers +Installed-Size: 17 +Depends: udev +Filename: pool/systemd-hwe-hwdb_259.5.3ubuntu_all.deb +Size: 3384 +MD5sum: 46b3ffd833e369b7fcffa9f21e5ec2ed +SHA1: 636e82929e20169df814eb8e75a84bb88ab13af3 +SHA256: d51cf1f5ac54db201f097770dbb7f1523c210b292a8c1d6432ce9f4b9c2a1950 +SHA512: ef5220c72ebdcbb7c4f1ccdea62e877e19f335d51a72e639d28c0d8f928cfffbc60ced923d459ebc399fd44b0a3e0528c94a0d1d86ac64caf33cf1970d286216 +Description: udev rules for hardware enablement (HWE) + systemd-hwe-hwdb contains hwdb rules for HWE on Ubuntu, + which are not yet present in systemd. + +Package: systemd-oomd +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Priority: optional +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 195 +Depends: libc6 (>= 2.34), libsystemd-shared (= 259.5-0ubuntu3.4), systemd | systemd-standalone-sysusers | systemd-sysusers +Breaks: systemd (<< 250.2-2~) +Replaces: systemd (<< 250.2-2~) +Filename: pool/systemd-oomd_259.5-0ubuntu3.4_amd64.deb +Size: 40516 +MD5sum: 8dfe8ed9ff868c5feb1ade516e6a385c +SHA1: 4cb9d0f988d8dd06bb28834085cf3e4173cc2ef5 +SHA256: 40553c30101bd43ce53c8e6b66d2880b18a1e1a8acecca4846238ed7150f0ca8 +SHA512: 9b8bd874858e5a7fc93181013570e4f18c954a29fd9416506ef0e4141bb85b6bfa9392a81839d382e8946c6ac96008d5c2fbce0dfe18dfaa504f0c1d139dfde6 +Homepage: https://systemd.io +Description: userspace out-of-memory (OOM) killer + systemd-oomd is a system service that uses cgroups-v2 and + pressure stall information (PSI) to monitor and take action on + processes before an OOM occurs in kernel space. + +Package: systemd-resolved +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: foreign +Priority: important +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 868 +Provides: resolvconf +Depends: libc6 (>= 2.34), libssl3t64 (>= 3.0.0), libsystemd-shared (= 259.5-0ubuntu3.4), systemd (= 259.5-0ubuntu3.4), default-dbus-system-bus | dbus-system-bus +Recommends: libidn2-0 +Suggests: polkitd +Conflicts: openresolv, resolvconf, systemd (<< 257.4-4~) +Replaces: resolvconf +Filename: pool/systemd-resolved_259.5-0ubuntu3.4_amd64.deb +Size: 298578 +MD5sum: 189471d3131a47b19b938da544665579 +SHA1: 902beea5cfe7462541d8125c2b00173cff9faf7f +SHA256: 99f133977b1d262c8344cd88acb10eaaa091e95370693aee162560476760cb9e +SHA512: 1912f2de555141137dee99799cb7e7ee822a00fca32ddc9e94ecf2a63005ebf6e1527181e6f62df3445d8dc0d852ad2cfcba44c484b168c805ff4de607cec716 +Homepage: https://systemd.io +Description: systemd DNS resolver + This package provides systemd's DNS resolver and the command line tool to + manage it. + . + Installing this package automatically overwrites /etc/resolv.conf and switches + it to be managed by systemd-resolved. + +Package: systemd-sysv +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: foreign +Priority: important +Protected: yes +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 81 +Pre-Depends: systemd +Depends: systemd (= 259.5-0ubuntu3.4) +Recommends: libpam-systemd, libnss-systemd +Conflicts: bfh-container (<< 20211009-22~), file-rc, finit-sysv, initscripts, insserv, molly-guard (<< 0.8.2~), orphan-sysvinit-scripts, runit-init, startpar, systemd-shim, sysv-rc, sysvinit-core +Replaces: sysvinit-core +Filename: pool/systemd-sysv_259.5-0ubuntu3.4_amd64.deb +Size: 9250 +MD5sum: 303a3a69eb532239ba97a573b832a4a3 +SHA1: b5e7171d5301d2d6d195a7168df80bee0057cc42 +SHA256: 2c76e690808c26fbc3bdbfe47d760ba50e7dcb0a821eded3d00412117ae0516e +SHA512: 0950cd12be05d50a2546d1e0de14fe80719736bdf29c71560029cfd9d5d3eda7089d0f02d212712f1eab6ee6afd2d147ced90ad63033664bbb1762533772e392 +Homepage: https://systemd.io +Description: system and service manager - SysV compatibility symlinks + This package provides manual pages and compatibility symlinks needed for + systemd to replace sysvinit. + . + Installing systemd-sysv will overwrite /sbin/init with a symlink to systemd. + +Package: systemd-timesyncd +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: foreign +Priority: standard +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 183 +Provides: time-daemon +Depends: libc6 (>= 2.34), libsystemd-shared (= 259.5-0ubuntu3.4), systemd +Conflicts: systemd (<< 256.2-2~), time-daemon +Replaces: time-daemon +Filename: pool/systemd-timesyncd_259.5-0ubuntu3.4_amd64.deb +Size: 41200 +MD5sum: e17d77d331e89f6568c34d55022fd59a +SHA1: 259f9ce3350edc4c85ed4d389ac6ab7c6c955bf6 +SHA256: ba2ba9b29cfa5d854e822dd793d1258c58f3f5a384c8ba2c4ccf9556fdb0cee4 +SHA512: ae2009462d9cf79696734b82db9dd192f85630de20d6b075cb1aea26648675a5999e49ef92733f7572319411e87c93d9679ce9b0f9b81074d677757624aabc82 +Homepage: https://systemd.io +Description: minimalistic service to synchronize local time with NTP servers + The package contains the systemd-timesyncd system service that may be used to + synchronize the local system clock with a remote Network Time Protocol server. + +Package: tcl +Architecture: amd64 +Version: 8.6.16build1 +Multi-Arch: foreign +Priority: optional +Section: interpreters +Source: tcltk-defaults +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Tcl/Tk Packagers +Installed-Size: 20 +Provides: tclsh +Depends: tcl8.6 (>= 8.6.16+dfsg-1~) +Breaks: tcl8.3 (<< 8.3.5-15), tcl8.4 (<< 8.4.20-2), tcl8.5 (<< 8.5.14-3), tcl8.6 (<< 8.6.0-2) +Filename: pool/tcl_8.6.16build1_amd64.deb +Size: 4200 +MD5sum: 6cdc44a27c3f59107675ebc0907deda2 +SHA1: 424cdb956542ca8fc6dd7f42f275dd8b98503060 +SHA256: c5079db96e5422efe2430f65c18cb71decc5cdd83d541bacd4961f00ad8ba3d9 +SHA512: 0262ad6defff049f276deef6fe355543c69caaaf971a6aafec572f24a53b569b9f41328a6471eb78ff95ce3a23df33f6705644c2c94ee6646f54b3dd16012771 +Description: Tool Command Language (default version) - shell + Tcl is a powerful, easy to use, embeddable, cross-platform interpreted + scripting language. + . + This package is a dependency package, which depends on Debian's default + Tcl version (currently 8.6). + +Package: tcl8.6 +Architecture: amd64 +Version: 8.6.17+dfsg-1build1 +Multi-Arch: foreign +Priority: optional +Section: interpreters +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Tcl/Tk Packagers +Installed-Size: 43 +Depends: libc6 (>= 2.34), libtcl8.6 (>= 8.6.0) +Suggests: tcl-tclreadline +Conflicts: tcl74 (<= 7.4p3-2) +Filename: pool/tcl8.6_8.6.17+dfsg-1build1_amd64.deb +Size: 14872 +MD5sum: 5636607ff5f51ab8becf85bb36e7ef97 +SHA1: 4a0766939bd81ceb3d824c9e21cf6f38dc21d7c9 +SHA256: d934d87e4aa94d72c9034785bdb77a8d0c65de8bfcaea3082246ac854c59359a +SHA512: 52078dc6d981cf3f1672ada33bd58dd4e3800f45e5aeeff718ebcf2ea16ea6da8cb1a5e7f9b5c4edaad161b2a7e312edd7d3d866c5df1e1d9f09e1e14e23ac66 +Homepage: http://www.tcl.tk/ +Description: Tcl (the Tool Command Language) v8.6 - shell + Tcl is a powerful, easy to use, embeddable, cross-platform interpreted + scripting language. This package contains the Tcl shell which you need + to run Tcl scripts. This version includes thread support. + +Package: tecla +Architecture: amd64 +Version: 49.0-2 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 196 +Depends: libadwaita-1-0 (>= 1.4~beta), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.13.8), libpango-1.0-0 (>= 1.14.0), libwayland-client0 (>= 1.20.0), libxkbcommon0 (>= 0.6.1) +Filename: pool/tecla_49.0-2_amd64.deb +Size: 28180 +MD5sum: 3479fb48f0b1cd1d74fd293c983e09c0 +SHA1: 7a90d791aaef9d803bd265728ec1565dad8f487f +SHA256: 74da21fe0e704c1c3f3f126adf2f51c03612afff56bcd5f64bc5f678a8325a02 +SHA512: d26b29c04d64fa590e02e6b01605595c85ca1a2a1b7b99d3187b62694efd7808c13aec465c6a92198790200767ba77bef789e551def2f3eee555fcecb989bc31 +Homepage: https://gitlab.gnome.org/GNOME/tecla +Description: keyboard layout viewer for the GNOME desktop + This app is a basic keyboard layout viewer for integration + with the GNOME desktop. + +Package: tinysparql +Architecture: amd64 +Version: 3.11.0-1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1196 +Depends: default-dbus-session-bus | dbus-session-bus, libglib2.0-bin, shared-mime-info, libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libjson-glib-1.0-0 (>= 1.5.2), libsqlite3-0 (>= 3.20.0), libtinysparql-3.0-0 (>= 3.8.1), libxml2-16 (>= 2.14.1) +Recommends: localsearch +Breaks: tracker (<< 3.8) +Replaces: tracker (<< 3.8) +Filename: pool/tinysparql_3.11.0-1_amd64.deb +Size: 431222 +MD5sum: 17f7888c3a1c4b97c0a17a4b3caf3ccc +SHA1: 5e1004d7c1611881d161e7bd4dee7babcdffa41a +SHA256: 19b2cf9435ce158226fad6f9a8ec9f7fcb27f2a720f6dfc59e9381755a02fea7 +SHA512: c14075d2ac3cc531e13b6c40ba44c328e54ce8e7d6344957bb34e7c2ea7332266bd51608891483acdd7bae3088f3f798f7758cdbcdd86e593e34b282f9464a7d +Homepage: https://tracker.gnome.org/ +Description: metadata database, indexer and search tool + TinySPARQL is an advanced framework for first class objects with associated + metadata and tags. It provides a one stop solution for all metadata, tags, + shared object databases, search tools and indexing. + +Package: tpm-udev +Architecture: all +Version: 4.1.3-6 +Multi-Arch: foreign +Priority: optional +Section: libs +Source: tpm2-tss +Maintainer: Mathieu Trudel-Lapierre +Installed-Size: 47 +Depends: systemd | systemd-standalone-sysusers | systemd-sysusers +Breaks: libtss2-fapi1t64 (<< 4.1.3-6) +Replaces: libtss2-fapi1t64 (<< 4.1.3-6) +Enhances: udev +Filename: pool/tpm-udev_4.1.3-6_all.deb +Size: 7908 +MD5sum: 34ccf5253e64e0c76ba9a52462a0225c +SHA1: b8e5413da48c1fceb6bce9f8589aa0d786f3a298 +SHA256: 39ff45ec97f71566f8a258aea43121bfa64819a976816e3377e4579c632cdd16 +SHA512: 8bcc359d798d7ee185d64d0db842c3972e3df15b7b27c0cc9a41832e362dd6317500a67e0a2e5bc3ca03602dc7fdfe0650f626766568a7c988e36f88e0a143b2 +Homepage: https://github.com/tpm2-software/tpm2-tss +Description: TPM2 Software stack library - udev rules for TPM modules + This package provides udev rules for the TPM modules. Both TPM1 or TPM2 need + this package to be installed to provide proper permissions of the TPM. + +Package: tzdata +Architecture: all +Version: 2026c-0ubuntu0.26.04.1 +Multi-Arch: foreign +Priority: required +Section: localization +Maintainer: Ubuntu Developers +Original-Maintainer: GNU Libc Maintainers +Installed-Size: 1356 +Provides: tzdata-forky +Depends: debconf (>= 0.5) | debconf-2.0 +Breaks: rust-coreutils (<< 0.5.0), tzdata-legacy (= 2023c-8), tzdata-legacy (= 2023c-9) +Replaces: tzdata-legacy (= 2023c-8), tzdata-legacy (= 2023c-9) +Filename: pool/tzdata_2026c-0ubuntu0.26.04.1_all.deb +Size: 193008 +MD5sum: 0a6d8168d362d2863a7488a09abb60a4 +SHA1: e2893d32d7fcb0e26a1ccdda4dda04166f8135d3 +SHA256: d1b10c964c53344b2b99d093bd437391460eec9a872961c2beb256d64a8c5bbf +SHA512: 7c934e05c639ea5baac0cc1a580526ece9bfaea5fc2e14963b26e6850c6181b9478d2a254432925279845d708171aa07dc241195d7a423cd87d0f414b40d22f6 +Homepage: https://www.iana.org/time-zones +Description: time zone and daylight-saving time data + This package contains data required for the implementation of + standard local time for many representative locations around the + globe. It is updated periodically to reflect changes made by + political bodies to time zone boundaries, UTC offsets, and + daylight-saving rules. + +Package: ubuntu-advantage-desktop-daemon +Architecture: amd64 +Version: 1.13build1 +Priority: optional +Section: misc +Maintainer: Robert Ancell +Installed-Size: 93 +Provides: ubuntu-advantage-daemon +Depends: ubuntu-pro-client, libc6 (>= 2.34), libglib2.0-0t64 (>= 2.74.0), libjson-glib-1.0-0 (>= 1.5.2), libpolkit-gobject-1-0 (>= 0.99) +Conflicts: ubuntu-advantage-daemon +Replaces: ubuntu-advantage-daemon +Filename: pool/ubuntu-advantage-desktop-daemon_1.13build1_amd64.deb +Size: 22232 +MD5sum: 98b338594776dc74710065b82224d4f8 +SHA1: 3951b1854c8b4a8e054fe39341b4e9e110f01f0e +SHA256: e1296d91ea57d987c178c85d348bbb8cc5b417016a9a2c0c2f909e487af77659 +SHA512: 653ed5ae5cd9a1697036b7667f1d4b370364cedc7f93aee1136a634eb0486b402cde8aa22019be4acc27793c1cf98b6d500572e1180fb5a6fbce146997a93968 +Homepage: https://github.com/canonical/ubuntu-advantage-desktop-daemon +Description: Daemon to allow access to ubuntu-advantage via D-Bus + ubuntu-advantage-desktop-daemon is a D-Bus daemon that allows graphical tools + easy access to the Ubuntu Advantage services. + +Package: ubuntu-desktop-minimal +Architecture: amd64 +Version: 1.570.3 +Priority: optional +Section: metapackages +Source: ubuntu-meta +Maintainer: Ubuntu Developers +Installed-Size: 14 +Provides: packagekit-installer +Depends: alsa-base, alsa-utils, anacron, at-spi2-core, bc, ca-certificates, dmz-cursor-theme, fontconfig, fonts-dejavu-core, foomatic-db-compressed-ppds, gdm3, ghostscript, gnome-control-center, gnome-menus, gnome-session-canberra, gnome-settings-daemon, gnome-shell, gnome-shell-ubuntu-extensions, gstreamer1.0-alsa, gstreamer1.0-packagekit, gstreamer1.0-plugins-base-apps, inputattach, iw, language-selector-common, language-selector-gnome, libatk-adaptor, libnotify-bin, libsasl2-modules, nautilus, openprinting-ppds, pipewire-pulse, printer-driver-pnm2ppa, rfkill, software-properties-common, spice-vdagent, ubuntu-drivers-common, ubuntu-release-upgrader-gtk, ubuntu-session, ubuntu-settings, unzip, update-manager, update-notifier, wireplumber, wpasupplicant, xdg-terminal-exec, xdg-user-dirs, xdg-user-dirs-gtk, xkb-data, yelp, zenity, zip +Recommends: apport-gtk, appstream, apt-config-icons-hidpi, avahi-daemon, baobab, bluez, bluez-cups, brltty, cloud-init, cups, cups-bsd, cups-client, cups-filters, dirmngr, dracut, firefox, fonts-liberation, fonts-noto-cjk, fonts-noto-color-emoji, fonts-noto-core, fonts-ubuntu, fwupd, fwupd-signed, gamemode, gir1.2-gmenu-3.0, gnome-bluetooth-sendto, gnome-calculator, gnome-characters, gnome-clocks, gnome-disk-utility, gnome-font-viewer, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-remote-desktop, gnome-text-editor, gpg-agent, gsettings-ubuntu-schemas, gst-audio-thumbnailer, gst-video-thumbnailer, gvfs-fuse, hplip, hwctl, ibus, ibus-gtk, ibus-gtk3, ibus-table, im-config, kdump-tools, laptop-detect, libglib2.0-bin, libnss-mdns, libpam-fprintd, libpam-gnome-keyring, libpam-sss, libspa-0.2-bluetooth, libwmf-0.2-7-gtk, loupe, memtest86+, nautilus-sendto, network-manager, network-manager-config-connectivity-ubuntu, network-manager-openvpn-gnome, network-manager-pptp-gnome, orca, packagekit, papers, pcmciautils, plymouth-theme-spinner, policykit-desktop-privileges, printer-driver-brlaser, printer-driver-c2esp, printer-driver-foo2zjs, printer-driver-m2300w, printer-driver-min12xxw, printer-driver-ptouch, printer-driver-pxljr, printer-driver-sag-gdi, printer-driver-splix, ptyxis, resources, seahorse, snapd, speech-dispatcher, sysprof, systemd-oomd, ubuntu-docs, ubuntu-insights, ubuntu-report, ubuntu-wallpapers, whoopsie, wsdd, xcursor-themes, xdg-desktop-portal-gnome, xdg-utils, yaru-theme-gnome-shell, yaru-theme-gtk, yaru-theme-icon, yaru-theme-sound +Filename: pool/ubuntu-desktop-minimal_1.570.3_amd64.deb +Size: 9402 +MD5sum: 06c43c7911008690fe58dfc72594ab8b +SHA1: 74c53a6f8d52a4b160e2cdcf50e9e14b9da8f313 +SHA256: fba2c0b58d1a82f7137368166c61c8b77ffdf14c6d4a94184f76c84860bece46 +SHA512: 7f1b9bc2ef166df5bf00200c765df5437e6915e694f76ddf5954d465b9f9f9fd3f0c88fb40d61bc5327a8d3789545d60564b894fc82125a035a5ca7c194e9092 +Description: Ubuntu desktop minimal system + This package depends on all of the packages in the Ubuntu desktop minimal + system. + It is also used to help ensure proper upgrades, so it is recommended that + it not be removed. + +Package: ubuntu-docs +Architecture: all +Version: 26.04.1 +Priority: optional +Section: doc +Maintainer: Ubuntu Documentation Team +Installed-Size: 1962 +Depends: yelp +Recommends: gnome-user-docs +Filename: pool/ubuntu-docs_26.04.1_all.deb +Size: 220192 +MD5sum: 539e9300133d7556821a5683372ca411 +SHA1: f1145cccd929c2301bb8de92fc6dbdb4395dd73a +SHA256: 763f4cc37ca81a034d73ce4ba1649ea6f0f70ef4c36ac9cecd1a50dea2d15454 +SHA512: d816562ddbd76ba264df358908aa3da29dc096ddb9914b73dc13f75d8826415da24aafebc471e89ec1ea5f2fbe9e64f962fc0fd17cb4c1ae738bf0513af7fb2e +Homepage: https://launchpad.net/ubuntu-docs +Description: Ubuntu Desktop Guide + This package holds the official Ubuntu-specific documentation, maintained + by the Ubuntu Documentation Team. The documentation can be viewed using + Yelp, the GNOME help browser. + . + This package recommends gnome-user-docs, which provides the bulk of the + Ubuntu Desktop Guide, and ubuntu-docs does not make much sense without it. + +Package: ubuntu-drivers-common +Architecture: amd64 +Version: 1:0.10.9 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Installed-Size: 280 +Depends: python3:any, debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.38), libdrm2 (>= 2.3.1), libkmod2 (>= 5~), libpci3 (>= 1:3.13.0), mokutil, python3-apt, python3-xkit, python3-click, udev, pciutils, usbutils, kmod | module-init-tools +Suggests: python3-aptdaemon.pkcompat +Filename: pool/ubuntu-drivers-common_1%3a0.10.9_amd64.deb +Size: 65114 +MD5sum: ee44a12f4614188e9b9b6948be61febf +SHA1: 353748c617039f584512d8b2ec8e78dcba54f004 +SHA256: f9ebd255473f18f1172cf5fe04ed91a899cef0be8ba4a09e9b7d8d36dbc3c9e6 +SHA512: d19a8da862b584a1c7bc701b858a44f7e6ec4388d5a73a52433df5e4a470429866a832ba9bfaec74fbc15f8a43a5f9f7a07a193a5e621e5943db23eab6313c6c +Description: Detect and install additional Ubuntu driver packages + This package aggregates and abstracts Ubuntu specific logic and knowledge + about third-party driver packages. It provides: + . + - a Python API for detecting driver packages for a particular piece of + hardware or the whole system. + . + - an "ubuntu-drivers" command line tool to list or install driver packages + (mostly for integration in installers). + . + - some NVidia specific support code to find the most appropriate driver + version, as well as setting up the alternatives symlinks that the + proprietary NVidia and FGLRX packages use. + +Package: ubuntu-insights +Architecture: amd64 +Version: 0.9.3ubuntu +Built-Using: golang-1.25 (= 1.25.0-0ubuntu2) +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Installed-Size: 9055 +Depends: init-system-helpers (>= 1.52), libc6 (>= 2.34), libwayland-client0 (>= 1.20.0) +Filename: pool/ubuntu-insights_0.9.3ubuntu_amd64.deb +Size: 3030088 +MD5sum: 2717effa489bb31c9ec064afe1e304df +SHA1: 08a188fe4d0986f22526ed996a22e11f689b10ca +SHA256: 9930fd641b97dfac1acae039788c34dbd7cb09b2cfc3b2e29f93f69cbfbf1b57 +SHA512: 01056fde7dd0acc638f440b4851954ae3b9b46ed7204f24865d013659678bfc613cbc2a81bcd36ad4a5972a68d2127461617d3d0b6fe8385b08203425cdc41e2 +Homepage: https://github.com/ubuntu/ubuntu-insights +Description: Ubuntu metrics reporting service + Ubuntu Insights, a user transparent, open, + platform-agnostic and cross application solution for reporting + hardware information and other collected metrics. + . + Ubuntu Insights is designed to show you exactly what is being sent, and + allow you to acknowledge and control your own data. The information + can't be used to identify a single machine, and is cached for local viewing + before being sent to the server. + . + This is designed to be a full replacement for Ubuntu Report. + . + This package contains the command line tool and systemd service triggers. + +Package: ubuntu-pro-client +Architecture: amd64 +Version: 37.2ubuntu0.1 +Priority: important +Section: misc +Source: ubuntu-advantage-tools +Maintainer: Ubuntu Developers +Installed-Size: 1356 +Depends: python3-yaml, python3:any, libapt-pkg7.0 (>= 1.9~), libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), libjson-c5 (>= 0.15), libstdc++6 (>= 13.1), python3-apt, distro-info (>= 0.18ubuntu0.18.04.1) +Recommends: ubuntu-pro-client-l10n +Breaks: ubuntu-advantage-tools (<< 31~) +Replaces: ubuntu-advantage-tools (<< 31~) +Filename: pool/ubuntu-pro-client_37.2ubuntu0.1_amd64.deb +Size: 242864 +MD5sum: f9b258300c29c3cc11d7ef7366a97c3e +SHA1: babd45b922ad18e30ddd78e0d39c640e57228250 +SHA256: e494e7aa2973c94baf44f066a78dbe382f4efe56af8ae61e7c7b4dcbf0f9c603 +SHA512: 1641882ffbc2043013b5229fb367dfcbfd74562f26bc4928550abaab9a10188e2293f6bee8dd4ea01ee7a7a14f0cd2d7c20f2f13bd49df97e7928c4e3276ad34 +Homepage: https://canonical-ubuntu-pro-client.readthedocs-hosted.com/ +Description: Management tools for Ubuntu Pro + Ubuntu Pro is a suite of additional services provided by Canonical on + top of Ubuntu. Whether you're an enterprise customer deploying systems + at scale or want security patching for your personal Ubuntu LTS + at home, the Ubuntu Pro Client (pro) is the command-line tool that + will help you manage the services you need. + +Package: ubuntu-pro-client-l10n +Architecture: amd64 +Version: 37.2ubuntu0.1 +Priority: important +Section: misc +Source: ubuntu-advantage-tools +Maintainer: Ubuntu Developers +Installed-Size: 81 +Depends: ubuntu-pro-client (= 37.2ubuntu0.1) +Filename: pool/ubuntu-pro-client-l10n_37.2ubuntu0.1_amd64.deb +Size: 19768 +MD5sum: 122d611c3e73ee5c6c30a6a51e3b3cb5 +SHA1: addaab6d1c107ecda34b5a62395ed788aa973bf1 +SHA256: c3e8c92c3be76d4d0935f89fa02819b56c30f986be6e2a09b477b96e2bcec8a1 +SHA512: 5d645f0c8c7c54660404769b501a89ffa8b82e6d58111c865e3270e36accfc446237028b4876d581db7fcd879b6bd66ffaa37f583cb6103a2f96e434641ce6c8 +Homepage: https://ubuntu.com/advantage +Description: Translations for Ubuntu Pro Client + This package delivers translations of Ubuntu Pro Client for various + languages. + +Package: ubuntu-release-upgrader-core +Architecture: all +Version: 1:26.04.23 +Priority: optional +Section: admin +Source: ubuntu-release-upgrader +Maintainer: Ubuntu Developers +Installed-Size: 256 +Depends: ca-certificates, python3-distupgrade (= 1:26.04.23), python3:any, screen +Recommends: libpam-modules (>= 1.0.1-9ubuntu3) +Breaks: software-properties (<< 0.9.27), update-manager (<< 1:0.165), update-manager-core (<< 1:0.165) +Replaces: update-manager (<< 1:0.165), update-manager-core (<< 1:0.165) +Filename: pool/ubuntu-release-upgrader-core_1%3a26.04.23_all.deb +Size: 24890 +MD5sum: 79e83b9d202e403b30327d8079f94604 +SHA1: 0a25e2e882aa4905adc75183fe3ca022c5e5e2ea +SHA256: b99d3e734ce409d6bfca619fc72c48f1b3959fd1699aa54f5e4ce074a32e652a +SHA512: bc0ca01e2b67c2b615e99d6f218f94336dcd53b3228776152ecfcd21d1faf2694e9047dea86c30283690f23c2a1763f6d2b62eb1811da08d5bea11b1fbdb97f2 +Description: manage release upgrades + This is the core of the Ubuntu Release Upgrader + +Package: ubuntu-release-upgrader-gtk +Architecture: all +Version: 1:26.04.23 +Priority: optional +Section: admin +Source: ubuntu-release-upgrader +Maintainer: Ubuntu Developers +Installed-Size: 132 +Depends: gir1.2-gtk-3.0, gir1.2-vte-2.91, gir1.2-webkit2-4.1, python3-dbus, python3-distupgrade (= 1:26.04.23), python3-gi (>= 3.8), ubuntu-release-upgrader-core (= 1:26.04.23), update-manager, python3:any +Filename: pool/ubuntu-release-upgrader-gtk_1%3a26.04.23_all.deb +Size: 9050 +MD5sum: ea653e64a298e40aef400d343d008f71 +SHA1: 1f5c04685fe1507b27d90cefa0497ae536f69624 +SHA256: 08c232cdff46f5733e8b9a403b7b8f12f9df44830ed6b220d7e376cce0655f1a +SHA512: 3e1b9a8d19aebbdca35829c5db2d13c931676eb13ee9463eebded076c428c536fc4c03128d3705f3e6d291d0674132b3a24895b8412b89f836abeeeb351ce7c4 +Description: manage release upgrades + This is the GTK+ frontend of the Ubuntu Release Upgrader + +Package: ubuntu-report +Architecture: amd64 +Version: 1.7.3ubuntu4 +Built-Using: golang-1.25 (= 1.25.0-0ubuntu1) +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Installed-Size: 8189 +Depends: libc6 (>= 2.34) +Filename: pool/ubuntu-report_1.7.3ubuntu4_amd64.deb +Size: 2879722 +MD5sum: d283fbbd9360193a9fb8290e2f6315f6 +SHA1: a01d359d803651fe9f72f468d62d8e55d7d93aca +SHA256: c1f2ab8fb24f4fb4279895f971cb45a2843b3fe719a8f53fa139433a7f70340f +SHA512: c7945ee46c45b60292d8436003836e11c83d6dc0029c8230e29222ed6dde60ea1a20fa84f005321d922f829714df73c038c674088a595faa3d3ec3adc48b8023 +Homepage: https://github.com/ubuntu/ubuntu-report +Description: Report hardware and other collected metrics + The tool will show you what is going to be reported and ask for your + acknowledgement before uploading it. This information can't be used to + identify a single machine and is presented before being sent to the server. + . + This package contains the command line tool. + +Package: ubuntu-session +Architecture: all +Version: 50.1-0ubuntu0.1 +Priority: optional +Section: gnome +Source: gnome-session +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 34 +Depends: gnome-session-bin (<< 51~), gnome-session-bin (>= 50.1-0ubuntu0.1), gnome-session-common (= 50.1-0ubuntu0.1), gnome-settings-daemon (>= 3.37.0), gnome-shell (>= 50~), gnome-shell-ubuntu-extensions, xdg-desktop-portal-gnome, xwayland, yaru-theme-gnome-shell (>= 20.04.3~), user-session-migration +Recommends: python3 +Filename: pool/ubuntu-session_50.1-0ubuntu0.1_all.deb +Size: 3758 +MD5sum: 1c8313c5e750c9e39a51adae768a7927 +SHA1: 0ac8ce01fea3a7d43d45d48c217d88c2768c843d +SHA256: 3ff88b755bb2dd2d9944c6a5613adc840444db166057a0880b803a0d76203c96 +SHA512: 29815b98e6d95ade96918e59c829cd3ea7c1c17416afe8ce3e99184f9a1647e6b8e3265f62d1727798da086f8a75eb39ac75602db6d83b6df5a64899c6cd4703 +Homepage: https://gitlab.gnome.org/GNOME/gnome-session +Description: Ubuntu session with GNOME Shell + This package contains the required components for a GNOME session + with default Ubuntu configuration, based on the GNOME Shell. + +Package: ubuntu-settings +Architecture: all +Version: 26.04.6 +Priority: optional +Section: x11 +Maintainer: Ubuntu Desktop Team +Installed-Size: 167 +Depends: dconf-gsettings-backend | gsettings-backend, gnome-control-center-data, gsettings-desktop-schemas (>= 40), libglib2.0-bin (>= 2.53.4-3ubuntu1~) +Filename: pool/ubuntu-settings_26.04.6_all.deb +Size: 92228 +MD5sum: 9d53e6b96590bc4b4d6e190e17f1d7d3 +SHA1: eb1ee682ac7e6928fe9e0f28469885a3ff07e62e +SHA256: c7f84378b9b7ec3bbb4ba6e1b1d6b3829bc6861ac64d35fb2b715dc8e8397adb +SHA512: 5b0f8014eaf0bca994e73d4de173b3288fa130296d863692c3524d38d7e2e9c93fc631db8a862d556fbfb14bfd4b44cede11967d76d534558645715cbe09cef6 +Description: default settings for the Ubuntu desktop + This package contains the default settings used by Ubuntu. + +Package: ubuntu-wallpapers +Architecture: all +Version: 26.04.2 +Priority: optional +Section: metapackages +Maintainer: Ubuntu Artwork Team +Installed-Size: 12684 +Depends: ubuntu-wallpapers-resolute +Suggests: ubuntu-wallpapers-karmic, ubuntu-wallpapers-lucid, ubuntu-wallpapers-maverick, ubuntu-wallpapers-natty, ubuntu-wallpapers-oneiric, ubuntu-wallpapers-precise, ubuntu-wallpapers-quantal, ubuntu-wallpapers-raring, ubuntu-wallpapers-saucy, ubuntu-wallpapers-trusty, ubuntu-wallpapers-utopic, ubuntu-wallpapers-vivid, ubuntu-wallpapers-wily, ubuntu-wallpapers-xenial, ubuntu-wallpapers-yakkety, ubuntu-wallpapers-zesty, ubuntu-wallpapers-artful, ubuntu-wallpapers-bionic, ubuntu-wallpapers-cosmic, ubuntu-wallpapers-disco, ubuntu-wallpapers-eoan, ubuntu-wallpapers-focal, ubuntu-wallpapers-groovy, ubuntu-wallpapers-hirsute, ubuntu-wallpapers-impish, ubuntu-wallpapers-jammy, ubuntu-wallpapers-kinetic, ubuntu-wallpapers-lunar, ubuntu-wallpapers-mantic, ubuntu-wallpapers-noble, ubuntu-wallpapers-oracular, ubuntu-wallpapers-plucky +Filename: pool/ubuntu-wallpapers_26.04.2_all.deb +Size: 8858352 +MD5sum: b7415c4ef2efff3a7ad89941f94f6e20 +SHA1: 54585d64cfb6d83a7ff247a80de06bbcc0a2396d +SHA256: d7f7acea3bb3dcd547a4be8aa5515b63c9e2a66e110d7a52ea98323f9c14b68e +SHA512: d24aa8b4e57a310e333f22a8f767dc54c774099baef9a99cdb1ee961c6a32547392a7a20e3b37916d918131e1d8b0796fa28394ac855e1ba980e49c6fd64f169 +Homepage: https://launchpad.net/ubuntu-wallpapers +Description: Ubuntu Wallpapers + The default Ubuntu wallpaper. This is also a meta-package depending on the + other default wallpapers for the current Ubuntu release. + +Package: ubuntu-wallpapers-resolute +Architecture: all +Version: 26.04.2 +Priority: optional +Section: x11 +Source: ubuntu-wallpapers +Maintainer: Ubuntu Artwork Team +Installed-Size: 63240 +Filename: pool/ubuntu-wallpapers-resolute_26.04.2_all.deb +Size: 56333376 +MD5sum: 709fb3a17776401a0efc481e963edd46 +SHA1: 37f716efee2497905d222d2581463d79eb0233d1 +SHA256: f0af7ff4a3fd5bc3b63885bfa14ed9c3ba320dc9a4fa948f9c506b715a59df88 +SHA512: 30ad1831f1b770263ad3357222f6ffe7a712d6e70861004d3993ca1b80b09cea605169b11aeb28b08991b175ca3a4242a291e4ee8f33f146e40eaab91456eb95 +Homepage: https://launchpad.net/ubuntu-wallpapers +Description: Ubuntu 26.04 Wallpapers + Alternative wallpapers for Ubuntu 26.04 and Canonical-created dimmed and + light wallpapers. + +Package: ucf +Architecture: all +Version: 3.0052ubuntu1 +Multi-Arch: foreign +Priority: standard +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Mark Hindley +Installed-Size: 148 +Depends: debconf (>= 0.5) | debconf-2.0, libtext-wrapi18n-perl, procps, sensible-utils +Filename: pool/ucf_3.0052ubuntu1_all.deb +Size: 44280 +MD5sum: 330376ee54ebfdb3b6cebcd645a0095b +SHA1: 2855f806e1f129c6f5ec1efcb689d73f567d4d17 +SHA256: 42354d322fda598511b62288123e8b4b6daf6b7bbb268d68e8e7f88efa498305 +SHA512: bd49490a38bc35270617e2ff439032657c34b16db916bd57eb5578f01366e34ac0b64807fb32ff09f342e96f7774c591e15b069187fd1f42da800f97a8ed74a8 +Description: Update Configuration File(s): preserve user changes to config files + Debian policy mandates that user changes to configuration files must be + preserved during package upgrades. The easy way to achieve this behavior + is to make the configuration file a 'conffile', in which case dpkg + handles the file specially during upgrades, prompting the user as + needed. + . + This is appropriate only if it is possible to distribute a default + version that will work for most installations, although some system + administrators may choose to modify it. This implies that the + default version will be part of the package distribution, and must + not be modified by the maintainer scripts during installation (or at + any other time). + . + This script attempts to provide conffile-like handling for files that + may not be labelled conffiles, and are not shipped in a Debian package, + but handled by the postinst instead. This script allows one to + maintain files in /etc, preserving user changes and in general + offering the same facilities while upgrading that dpkg normally + provides for 'conffiles'. + . + Additionally, this script provides facilities for transitioning a + file that had not been provided with conffile-like protection to come + under this schema, and attempts to minimize questions asked at + installation time. Indeed, the transitioning facility is better than the + one offered by dpkg while transitioning a file from a non-conffile to + conffile status. + +Package: udev +Architecture: amd64 +Version: 259.5-0ubuntu3.4 +Multi-Arch: foreign +Priority: important +Section: admin +Source: systemd +Maintainer: Ubuntu Developers +Original-Maintainer: Debian systemd Maintainers +Installed-Size: 10382 +Depends: libc6 (>= 2.38), libsystemd-shared (= 259.5-0ubuntu3.4), systemd | systemd-standalone-sysusers | systemd-sysusers, libkmod2, libudev1 (= 259.5-0ubuntu3.4) +Recommends: systemd-hwe-hwdb +Conflicts: systemd (<< 255~rc1-4~) +Breaks: systemd (<< 259.5-0ubuntu3.4) +Replaces: systemd (<< 255~rc1-4~) +Filename: pool/udev_259.5-0ubuntu3.4_amd64.deb +Size: 1500726 +MD5sum: 2f0ccd4bc1041c8ba285c7f0c3419c80 +SHA1: 6dbfa7942d8a3899b3a1da2f728ee2a1a0fd3929 +SHA256: b4de0a05d8cd58e5de0ebb7a5c73784dda6a61df2fe5129affa7e4a5aef282ad +SHA512: 2a4016406898dbaa6625858099fca0a1e1efed735a1a1909d4baf254a52989d9ca3b3d4d10fa94051d7cb8e1484680945d214739361da0e5b628cc0394f9e884 +Homepage: https://systemd.io +Description: /dev/ and hotplug management daemon + udev is a daemon which dynamically creates and removes device nodes from + /dev/, handles hotplug events and loads drivers at boot time. + +Package: udisks2 +Architecture: amd64 +Version: 2.10.91-1ubuntu2.1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1320 +Depends: libudisks2-0 (= 2.10.91-1ubuntu2.1), libblockdev-crypto3, libblockdev-fs3, libblockdev-loop3, libblockdev-mdraid3, libblockdev-nvme3, libblockdev-part3, libblockdev-swap3, libblockdev-smart3, default-dbus-system-bus | dbus-system-bus, parted, udev, libacl1 (>= 2.2.23), libblkid1 (>= 2.16), libblockdev-utils3 (>= 3.0), libblockdev3 (>= 3.2.0), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgudev-1.0-0 (>= 212), libmount1 (>= 2.30), libpolkit-agent-1-0 (>= 0.102), libpolkit-gobject-1-0 (>= 0.102), libsystemd0 (>= 209), libuuid1 (>= 2.16) +Recommends: dosfstools, e2fsprogs, eject, ntfs-3g, polkitd, libpam-systemd, exfatprogs +Suggests: btrfs-progs, f2fs-tools, mdadm, nilfs-tools, reiserfsprogs, udftools, udisks2-btrfs, udisks2-lvm2, xfsprogs +Filename: pool/udisks2_2.10.91-1ubuntu2.1_amd64.deb +Size: 308322 +MD5sum: edbc36bef7acf6377bb695737065795a +SHA1: c8294c66e51a7ea99efc089013bd330fe5db78f2 +SHA256: c78dcfa3503993bccf0dbf401e90483e57c42f72d29ca1e4743b006626169ac4 +SHA512: 5c5caaf1984aa151f01ec0529a957cbefbd74fde4d6484e9c8f83ddef0fd632ed7cf386382d2d440c3bb0ae06280de94e8160d5b089edc3e996bdc5b5ccf9fda +Homepage: https://www.freedesktop.org/wiki/Software/udisks +Description: D-Bus service to access and manipulate storage devices + The udisks daemon serves as an interface to system block devices, + implemented via D-Bus. It handles operations such as querying, mounting, + unmounting, formatting, or detaching storage devices such as hard disks + or USB thumb drives. + . + This package also provides the udisksctl utility, which can be used to + trigger these operations from the command line (if permitted by + PolicyKit). + . + Creating or modifying file systems such as XFS, RAID, or LUKS encryption + requires that the corresponding mkfs.* and admin tools are installed, such as + dosfstools for VFAT, xfsprogs for XFS, or cryptsetup for LUKS. + +Package: ufw +Architecture: all +Version: 0.36.2-9build1 +Priority: optional +Section: admin +Maintainer: Jamie Strandboge +Installed-Size: 850 +Depends: iptables, procps, ucf, python3:any, debconf (>= 0.5) | debconf-2.0 +Suggests: rsyslog +Breaks: iptables-persistent, netfilter-persistent +Filename: pool/ufw_0.36.2-9build1_all.deb +Size: 169538 +MD5sum: 5e838a040835995131245728ef450201 +SHA1: 38adb18a4dcec3d6c31a9d9faf70081b7a13b255 +SHA256: 3ece5b2e7a678f5be9678643dc5f8f8457becceec32e863ad1ada1a33e2160b4 +SHA512: 5cceb0fe7f57aaddb3b8f14716175817950b4b3b04f37974b9c676b5f68f9aa74002d6a61d4e108bacf5997c65db0cd6aed690ea616add37f15a7bd469f43225 +Homepage: https://launchpad.net/ufw +Description: program for managing a Netfilter firewall + The Uncomplicated FireWall is a front-end for iptables, to make managing a + Netfilter firewall easier. It provides a command line interface with syntax + similar to OpenBSD's Packet Filter. It is particularly well-suited as a + host-based firewall. + +Package: unattended-upgrades +Architecture: all +Version: 2.12ubuntu9 +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Michael Vogt +Installed-Size: 448 +Depends: debconf (>= 0.5) | debconf-2.0, debconf, python3, python3-apt (>= 1.9.6~), python3-dbus, python3-distro-info, ucf, lsb-release, lsb-base, xz-utils +Recommends: systemd-sysv | cron | cron-daemon | anacron +Suggests: bsd-mailx, default-mta | mail-transport-agent, needrestart, powermgmt-base, python3-gi +Filename: pool/unattended-upgrades_2.12ubuntu9_all.deb +Size: 53334 +MD5sum: 07bd0f3ba3e1579ce7d3df10813d1d56 +SHA1: 202ad1c4382b9373e33873521ea74a78c4851ade +SHA256: 129682f0176cbeabba735f550cb64bdfbcd9c99f4d2377c247f8235ccfe0b4af +SHA512: 7b413764e23286a1e27a9d3a0e8d69378d8db8c23ae99c36006b2c1d25e8e8ac42b16d040ae8655ef259f5328b43f7f8951b8cdf39043e314b61bc3c1a4ba540 +Description: automatic installation of security upgrades + This package can download and install security upgrades automatically + and unattended, taking care to only install packages from the + configured APT source, and checking for dpkg prompts about + configuration file changes. + . + This script is the backend for the APT::Periodic::Unattended-Upgrade + option. + +Package: unzip +Architecture: amd64 +Version: 6.0-29ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Santiago Vila +Installed-Size: 416 +Depends: libbz2-1.0, libc6 (>= 2.34) +Suggests: zip +Filename: pool/unzip_6.0-29ubuntu1_amd64.deb +Size: 179964 +MD5sum: 70dd732657e614ba5f603982e1741a3e +SHA1: 00c1e5f831bac2ddce91e8a923f8e31e9b86b550 +SHA256: 1f6f2bdcde84641e89c9367a7a99d90e990efa3e487a8d625241c2f9c55db5f4 +SHA512: 047f2c6eb292040d43785400b82677df1ad29b8f0cd199a09e9def82bec302090a8bbc88c8ba342a853c4e96ea90160954806517308123e3ac94009eed2eebc3 +Homepage: https://infozip.sourceforge.net/UnZip.html +Description: De-archiver for .zip files + InfoZIP's unzip program. With the exception of multi-volume archives + (ie, .ZIP files that are split across several disks using PKZIP's /& option), + this can handle any file produced either by PKZIP, or the corresponding + InfoZIP zip program. + . + This version supports encryption. + +Package: update-inetd +Architecture: all +Version: 4.54build1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Guillem Jover +Installed-Size: 81 +Depends: debconf (>= 0.5) | debconf-2.0, perl:any +Filename: pool/update-inetd_4.54build1_all.deb +Size: 23016 +MD5sum: d62d722f4966e5ca68c25f9fdc448345 +SHA1: de35ecf63f597e2bd86687b241b1938906af06ab +SHA256: 1185e6269f6976177e9e1f42a3adc6d8b34ddeaed5b512e06bade8336f8b3c77 +SHA512: 05d02ca09dc9e4f4cf309a1ea95b223c2bb80627b75e80e428b3912766a3100ccc66dbff6adc3a757e068cec36cd9550cc2ccc6a161b407b22294ea52ce083f7 +Description: inetd configuration file updater + This package provides a program used by other packages to + automatically update /etc/inetd.conf, the configuration file shared + by all implementations of the Internet super-server. + . + Note that xinetd is not supported by this package. + +Package: update-manager +Architecture: all +Version: 1:26.04.5 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Installed-Size: 974 +Depends: gir1.2-gtk-3.0, gir1.2-handy-1 (>= 1.5.90), gir1.2-snapd-2, gnome-shell | policykit-1-gnome | polkit-kde-agent-1 | lxpolkit | lxqt-policykit | mate-polkit | polkit-1-auth-agent, libgtk3-perl, pkexec, polkitd, python3-aptdaemon.gtk3widgets (>= 1.1.1+bzr982-0ubuntu13) | synaptic, python3-dbus, python3-gi (>= 3.8), python3-yaml, ubuntu-release-upgrader-gtk, update-manager-core (= 1:26.04.5), update-notifier, ubuntu-drivers-common, dconf-gsettings-backend | gsettings-backend, python3:any +Recommends: python3-launchpadlib +Suggests: gir1.2-dbusmenu-glib-0.4, gir1.2-unity-5.0 +Breaks: update-notifier (<< 3.177) +Filename: pool/update-manager_1%3a26.04.5_all.deb +Size: 554138 +MD5sum: 0fbbf04a83ea552d90c7a1f45e6b4970 +SHA1: 264ed53bf317ba66a991f50ceede70c56eb44a2a +SHA256: abab86378fd38e086791c47fd0de4eee5fb27aa08fb5d5b195561306d276a199 +SHA512: 5e9df34d7f3fccde59f2c6a801205807e2ddd108a96413e719c3b6e1d2a0891c4718975c2a7fb90651611abbed037ed652964d2e134edf7f37a23a2007574852 +Description: GNOME application that manages apt updates + This is the GNOME apt update manager. It checks for updates and lets the user + choose which to install. + +Package: update-manager-core +Architecture: all +Version: 1:26.04.5 +Priority: optional +Section: admin +Source: update-manager +Maintainer: Ubuntu Developers +Installed-Size: 120 +Depends: distro-info-data, python3-distro-info, python3-update-manager (= 1:26.04.5), ubuntu-pro-client, ubuntu-release-upgrader-core (>= 1:18.04.9), python3:any +Recommends: libpam-modules (>= 1.0.1-9ubuntu3) +Breaks: computer-janitor (<= 1.11-0ubuntu1), update-manager (<< 1:0.146.2) +Replaces: update-manager (<< 1:0.146.2) +Filename: pool/update-manager-core_1%3a26.04.5_all.deb +Size: 11592 +MD5sum: 9b53ddea6c93172e64d633e472bb26a7 +SHA1: dde1f8ebfb0c5f8bf0ea96286a9c36855ff72d22 +SHA256: 8113cd178a707fdd6a10b41c624f868760806c74a55b6d2058a1962e7f6b21ad +SHA512: f1bcd563106b41765ad40a5becdae6c2a8a0a052920d07c1c64dd87f5bc80dbe9851b89da75aac6d44eaa75a076cb598f09155d278d2f169140bf2411d13b920 +Description: manage release upgrades + This is the core of update-manager and the release upgrader + +Package: update-notifier +Architecture: amd64 +Version: 3.207.2 +Priority: optional +Section: gnome +Maintainer: Michael Vogt +Installed-Size: 270 +Depends: gnome-shell | notification-daemon, pkexec, polkitd, python3-dbus, ubuntu-advantage-desktop-daemon, ubuntu-release-upgrader-gtk, update-manager (>> 1:25.10~), update-notifier-common (= 3.207.2), dconf-gsettings-backend | gsettings-backend, libayatana-appindicator3-1 (>= 0.2.96), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgtk-3-0t64 (>= 3.0.0), libgudev-1.0-0 (>= 146), libjson-glib-1.0-0 (>= 1.5.2), libnotify4 (>= 0.8.4), libpango-1.0-0 (>= 1.18.0) +Recommends: apport-gtk (>= 2.8-0ubuntu3), python3-aptdaemon, python3-aptdaemon.gtk3widgets | synaptic (>= 0.75.12), whoopsie (>= 0.2.77) +Filename: pool/update-notifier_3.207.2_amd64.deb +Size: 60796 +MD5sum: 95af59173ecea92f48ee85ed20d467c1 +SHA1: 14181bf314687606722a889cc2295b3ed81c20f8 +SHA256: 8d40ec225bdb8eceee40b73e796cb2d5f599e3e1710391b2ea4df6894b14dbec +SHA512: 331a44a195bffc915d031a905fa00f5968b22d0a2b662ab54961acbeba81d67129c93bf5c27b6dd2f88c4b83efca5190b63a2f0c2f86ad18d91091af92f1a705 +Description: Daemon which notifies about package updates + Puts an icon in the user's notification area when package updates are + available. + +Package: update-notifier-common +Architecture: all +Version: 3.207.2 +Priority: optional +Section: gnome +Source: update-notifier +Maintainer: Michael Vogt +Installed-Size: 1581 +Pre-Depends: apt (>= 1.1~), dpkg (>= 1.15.7.2) +Depends: lsb-release, patch, python3-apt, python3-dbus, python3-debconf | debconf (<< 1.5.64~), python3-debian, python3-distro-info, python3:any, update-manager-core (>= 1:17.04.2) +Recommends: libpam-modules (>= 1.0.1-9ubuntu3) +Replaces: update-notifier (<< 0.75.1) +Filename: pool/update-notifier-common_3.207.2_all.deb +Size: 211926 +MD5sum: f68b13daa1829b3539fe58935f7010ba +SHA1: a7f72e7e85b4e3201f4eca1006c04f6e8a8d46ec +SHA256: 26628c4c2ad0da034ebf029e9684940e4dbee00f74ed2a0518183a0d2a54c0c9 +SHA512: c47fa9ccb3b85201ab59d2700dccba9fddb7882a8721f271d6b329222ed32d84812589fed7bf1c1544390e4ed664423f8e76dfc74097fafec98cb51f6953085b +Description: Files shared between update-notifier and other packages + Apt setup files and reboot notification scripts shared between + update-notifier and other packages, notably for server use cases. + +Package: upower +Architecture: amd64 +Version: 1.91.1-1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 500 +Depends: default-dbus-system-bus | dbus-system-bus, udev, libupower-glib3 (= 1.91.1-1), libc6 (>= 2.42), libglib2.0-0t64 (>= 2.76.0), libgudev-1.0-0 (>= 238), libimobiledevice-1.0-6 (>= 1.3.0), libplist-2.0-4 (>= 2.3.0), libpolkit-gobject-1-0 (>= 0.99) +Recommends: polkitd +Filename: pool/upower_1.91.1-1_amd64.deb +Size: 101024 +MD5sum: de4f45d75e71cfa48127314770a41e29 +SHA1: f4cf541ba027b21e153889075bd562b0ffe5d725 +SHA256: 53e1a42d63b592355ebaf1566de37d1c7358e1065aaef8030015cb28ebbe9b81 +SHA512: d47399ed850974c805391ae8640aa7dbe4360de4c6f09f891dc7066b1ff76f2e24ab6642fa6ca4a4ce2a30b6deee9d6cb31833f3d3e8373c0897d4be538ddb02 +Homepage: https://upower.freedesktop.org/ +Description: abstraction for power management + upower provides an interface to enumerate power sources on the system + and control system-wide power management. Any application can access the + org.freedesktop.UPower service on the system message bus. Some + operations (such as suspending the system) are restricted using PolicyKit. + +Package: usb-modeswitch +Architecture: amd64 +Version: 2.6.2-1ubuntu1 +Priority: optional +Section: comm +Maintainer: Ubuntu Developers +Original-Maintainer: Thorsten Alteholz +Installed-Size: 130 +Depends: tcl, usb-modeswitch-data, libc6 (>= 2.38), libusb-1.0-0 (>= 2:1.0.9) +Suggests: comgt, wvdial +Filename: pool/usb-modeswitch_2.6.2-1ubuntu1_amd64.deb +Size: 44222 +MD5sum: 6e12e915d3493ecd42119dc5def2630d +SHA1: 88f2aebb7d26e74d121e9c6deb90ab2637d92fff +SHA256: a6a8aead77c0524f1921220bc6b31a435ab80d554978209423383a770f315a3c +SHA512: 0a41a4de1fa4009879ad1bad97f6caab103b7175d3a068872f26ae339042d91b57e2910316b9def47b965c499797d7ca7a4c7886434f3b690623d44d57ac0ab9 +Homepage: https://www.draisberghof.de/usb_modeswitch/ +Description: mode switching tool for controlling "flip flop" USB devices + Several new USB devices have their proprietary Windows drivers onboard, + especially WAN dongles. When plugged in for the first time, they act + like a flash storage and start installing the driver from there. If + the driver is already installed, the storage device vanishes and + a new device, such as an USB modem, shows up. This is called the + "ZeroCD" feature. + . + On Debian, this is not needed, since the driver is included as a + Linux kernel module, such as "usbserial". However, the device still + shows up as "usb-storage" by default. usb-modeswitch solves that + issue by sending the command which actually performs the switching + of the device from "usb-storage" to "usbserial". + . + This package contains the binaries and the brother scripts. + +Package: usb-modeswitch-data +Architecture: all +Version: 20191128-7build1 +Priority: optional +Section: comm +Maintainer: Ubuntu Developers +Original-Maintainer: Thorsten Alteholz +Installed-Size: 84 +Provides: usb-modeswitch-data-packed +Recommends: udev, usb-modeswitch (>= 2.4.0) +Conflicts: usb-modeswitch-data-packed +Breaks: usb-modeswitch (<< 2.4.0) +Replaces: usb-modeswitch-data-packed +Filename: pool/usb-modeswitch-data_20191128-7build1_all.deb +Size: 30420 +MD5sum: ab5c0cd8cb08131a38e98ec872092f73 +SHA1: d18de1f826c733acaa3fd9291f99427f3a219a9a +SHA256: e7e454c369ca3d26de6f2911fa6f49e932ff47bf5563b45c50aadc72f45872ce +SHA512: 4deee665b0e7aa94b0dcd3c875a5acd6914eb90112bea2678ae7586be61171de1e9d61b5efab4e07da241a35fc9f3c0ca9dd2ede798be0bae56f59e70d71fb26 +Homepage: https://www.draisberghof.de/usb_modeswitch/ +Description: mode switching data for usb-modeswitch + Several new USB devices have their proprietary Windows drivers onboard, + especially WAN dongles. When plugged in for the first time, they act + like a flash storage and start installing the driver from there. If + the driver is already installed, the storage device vanishes and + a new device, such as an USB modem, shows up. This is called the + "ZeroCD" feature. + . + On Debian, this is not needed, since the driver is included as a + Linux kernel module, such as "usbserial". However, the device still + shows up as "usb-storage" by default. usb-modeswitch solves that + issue by sending the command which actually performs the switching + of the device from "usb-storage" to "usbserial". + . + This package contains the commands data needed for usb-modeswitch. + +Package: usb.ids +Architecture: all +Version: 2025.12.13-1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 726 +Filename: pool/usb.ids_2025.12.13-1_all.deb +Size: 223744 +MD5sum: d2e3d46891eb1c83190e4233046eded0 +SHA1: 304522bd6608837ecabff5015f7568d95827cf08 +SHA256: 3a5151b50b822e93a6636301b300b6d41ff57489f2c499f8f80ca30515bf010f +SHA512: 7c490bb5e051de796d48b5ba9ae399c5de063b696091dd86ea99efa877f64cb098dfd382bf932b862b588851c7c193af586bffb6332bfe42d295e7c40904ae24 +Homepage: http://www.linux-usb.org/usb-ids.html +Description: USB ID Repository + This package contains the usb.ids file, a public repository of all known + ID's used in USB devices: ID's of vendors, devices, subsystems and device + classes. It is used in various programs to display full human-readable + names instead of cryptic numeric codes. + +Package: usbmuxd +Architecture: amd64 +Version: 1.1.1-7 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: gtkpod Maintainers +Installed-Size: 124 +Depends: libc6 (>= 2.38), libimobiledevice-1.0-6 (>= 1.3.0+git20240701), libplist-2.0-4 (>= 2.6), libusb-1.0-0 (>= 2:1.0.22), adduser +Filename: pool/usbmuxd_1.1.1-7_amd64.deb +Size: 42060 +MD5sum: f9916e1a6dbc20a78e41780569289f25 +SHA1: 17b404988afc282c0785749fe4bce75b0658d1ca +SHA256: d0806534674c53d33f28a7cf01e1ef3e0b81d777c0e8cfe494942cd3b8b47b60 +SHA512: 5192a0039f6d38a4b3d7e7e04eb115ce634326ede3ee53d9e40a7f40ec7246d51186f16b4aa14f906350e544f7c001ad373c5e74eabf36254503908d87d6ebe3 +Homepage: https://github.com/libimobiledevice/usbmuxd +Description: USB multiplexor daemon for iPhone and iPod Touch devices + usbmuxd, the USB multiplexor daemon, is in charge of coordinating + access to iPhone and iPod Touch services over USB. Synchronization and + management applications for the iPhone and iPod Touch need this daemon + to communicate with such devices concurrently. + . + This package includes udev rules to start the daemon when a supported + device is plugged in, and stop it when all devices are removed. + +Package: usbutils +Architecture: amd64 +Version: 1:019-1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Aurelien Jarno +Installed-Size: 306 +Depends: libc6 (>= 2.34), libudev1 (>= 196), libusb-1.0-0 (>= 2:1.0.22) +Suggests: usbutils-py +Filename: pool/usbutils_1%3a019-1_amd64.deb +Size: 83944 +MD5sum: 5814d2312809031a0dd99c77d5a7d590 +SHA1: 878bfd0ac679269f246477c81623b5cc4d1d780e +SHA256: 2c5e1d731be948d1dba9e63ba04ba7b95394e43dad3ecd58738ec0cb8192b284 +SHA512: 7dac10af4f12c4322bef0e3f8e462ae5ae3f90c5fac8bb747991f56600efee0af8b6a3457270f9af090ce3ee9f1f91b641ed1be6b4b01492d8aef7241b8f7fbb +Homepage: https://github.com/gregkh/usbutils +Description: Linux USB utilities + This package contains the lsusb utility for inspecting the devices + connected to the USB bus. It shows a graphical representation of the + devices that are currently plugged in, showing the topology of the + USB bus. It also displays information on each individual device on + the bus. + . + lsusb, usb-devices, usbhid-dump, usbreset + +Package: user-session-migration +Architecture: amd64 +Version: 0.5.1 +Multi-Arch: foreign +Priority: optional +Section: misc +Maintainer: Ubuntu Developers +Original-Maintainer: Ayatana Packagers +Installed-Size: 45 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.76.0), init-system-helpers (>= 1.52) +Filename: pool/user-session-migration_0.5.1_amd64.deb +Size: 10718 +MD5sum: e3ead683cba3a29766eff6eb62e7ee1b +SHA1: 91a9ad219641d23252c9c00dfe57f11ccd507276 +SHA256: 29e293be756b80aba747d775473b342aeb2686191b90465ebff8187f9d665ff4 +SHA512: ed7b6650a697a6cb241dd07cefb50c27c0c0fbdf0573b029d3f779328ef6ffcffbbbdc10283611c594185ef3bf077872857dfcb8737b1d03d0386760d127609f +Homepage: https://launchpad.net/session-migration +Description: Tool to migrate in-session user data + This tool is used to migrate in-session user data when a program is evolving + its configuration, or needing to have files moved and so on. + . + This program is generally autostarted at the very beginning of the session + and integrates caching capability. + +Package: uuid-runtime +Architecture: amd64 +Version: 2.41.3-3ubuntu2.2 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: util-linux +Maintainer: Ubuntu Developers +Original-Maintainer: Chris Hofstaedtler +Installed-Size: 163 +Pre-Depends: libuuid1 +Depends: adduser, systemd | systemd-standalone-sysusers | systemd-sysusers, libc6 (>= 2.38), libsmartcols1 (= 2.41.3-3ubuntu2.2), libsystemd0, libuuid1 (= 2.41.3-3ubuntu2.2) +Filename: pool/uuid-runtime_2.41.3-3ubuntu2.2_amd64.deb +Size: 48512 +MD5sum: cd3bfa47a949c53198becc140c71b4cb +SHA1: db0531b8e65d5bc4097adad973b673da71b6612d +SHA256: 4badc1132e60f937c7c08024f8f70022a30a72b64c8fe7e8d35c3e85391a69ff +SHA512: d82195e555148080704ac6a87ad6f4d594cb3756acd9a7072424e9a7cb24bf8e1fe7926e663c573708fcb09a23eb4c209440d1c1af81664eff65a75afc34c3bd +Homepage: https://github.com/util-linux/util-linux +Description: runtime components for the Universally Unique ID library + The libuuid library generates and parses 128-bit Universally Unique + IDs (UUIDs). A UUID is an identifier that is unique within the space + of all such identifiers across both space and time. It can be used for + multiple purposes, from tagging objects with an extremely short lifetime + to reliably identifying very persistent objects across a network. + . + See RFC 4122 for more information. + . + This package contains the uuidgen program and the uuidd daemon. + . + The uuidd daemon is used to generate UUIDs, especially time-based + UUIDs, in a secure and guaranteed-unique fashion, even in the face of + large numbers of threads trying to grab UUIDs running on different CPUs. + It is used by libuuid as well as the uuidgen program. + +Package: wamerican +Architecture: all +Version: 2020.12.07-4build1 +Multi-Arch: foreign +Priority: standard +Section: text +Source: scowl +Maintainer: Ubuntu Developers +Original-Maintainer: Don Armstrong +Installed-Size: 998 +Provides: wordlist +Depends: debconf (>= 0.5) | debconf-2.0 +Filename: pool/wamerican_2020.12.07-4build1_all.deb +Size: 242090 +MD5sum: 2ef95e73fa5d55e0de0e1481ec6129e0 +SHA1: 38a761fb37b26d7a9b999f3debd248c35b205164 +SHA256: 69cb601ca0aa3a0750026a81d97b591431047a3823d785a5cc972235ecee69cc +SHA512: a91723c84efe368a21065079ad1624cd2b7faf8c54f1e1e9cdb06f2394b2c54d529dfea14ae10ba02801a09bdacd260b2ca6bb41f07c22e004fdf586b91c2414 +Homepage: http://wordlist.sourceforge.net/ +Description: American English dictionary words for /usr/share/dict + This package provides the file /usr/share/dict/american-english + containing a list of English words with American spellings. + This list can be used by spelling checkers, and by programs such + as look(1). + . + There are also -small, -large, and -huge versions of this word list, + and there are wbritish* and wcanadian* packages as well. + +Package: webp-pixbuf-loader +Architecture: amd64 +Version: 0.2.7-3 +Multi-Arch: same +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: David Heidelberg +Installed-Size: 48 +Depends: libc6 (>= 2.14), libgdk-pixbuf-2.0-0 (>= 2.38.1), libglib2.0-0t64 (>= 2.80.0), libwebp7 (>= 1.5.0), libwebpdemux2 (>= 1.5.0), libwebpmux3 (>= 1.5.0) +Filename: pool/webp-pixbuf-loader_0.2.7-3_amd64.deb +Size: 11532 +MD5sum: 2eb7a3ebe54511578d2e98dbafbe999b +SHA1: 6f26a4021f325d95c52e56cc3697c1c1e24455aa +SHA256: 4d4c3d5d023aa157767c271172332f4e305cbc6dc8ba1506490784aa96f134b8 +SHA512: 810710725ae6222a9c6a9dca2d1df3a35d50088d8f67d428f1efbc1a81919d90b5093451b7851c8b46723306feabb8a8a5ce821e1fbbc3237c7348749051aad5 +Homepage: https://github.com/aruiz/webp-pixbuf-loader/ +Description: WebP Image format GdkPixbuf loader + webp-pixbuf-loader integrates libwebp library into GDK image processing + framework, so GDK based application can use WEBP format natively. + . + This allows GTK applications preview and load pictures in WEBP format. + +Package: wget +Architecture: amd64 +Version: 1.25.0-2ubuntu4.4 +Multi-Arch: foreign +Priority: standard +Section: web +Maintainer: Ubuntu Developers +Original-Maintainer: Noël Köthe +Installed-Size: 732 +Depends: libc6 (>= 2.38), libgnutls30t64 (>= 3.8.1), libidn2-0 (>= 0.6), libnettle8t64, libpcre2-8-0 (>= 10.22), libpsl5t64 (>= 0.16.0), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4) +Recommends: ca-certificates +Conflicts: wget-ssl +Filename: pool/wget_1.25.0-2ubuntu4.4_amd64.deb +Size: 352416 +MD5sum: dd3f3f29b46bcc3940dd7b10c27ae18e +SHA1: 9ca784a9da6dfad6857e6e78d2fda5eefeb391ae +SHA256: 47f9cd72f1cf79865a128d101fbfb0fbf0db8606db318735078afab9af66be3b +SHA512: b80da51888441d48547da86a8d58dd9cadabeaa0c2445b69cae5f186dd5bcd7ee76e13971468ed769bfd04bf9b04e1fae0b02e760fdedfc0383a19ead7fa4ff4 +Homepage: https://www.gnu.org/software/wget/ +Description: retrieves files from the web + Wget is a network utility to retrieve files from the web + using HTTP(S) and FTP, the two most widely used internet + protocols. It works non-interactively, so it will work in + the background, after having logged off. The program supports + recursive retrieval of web-authoring pages as well as FTP + sites -- you can use Wget to make mirrors of archives and + home pages or to travel the web like a WWW robot. + . + Wget works particularly well with slow or unstable connections + by continuing to retrieve a document until the document is fully + downloaded. Re-getting files from where it left off works on + servers (both HTTP and FTP) that support it. Both HTTP and FTP + retrievals can be time stamped, so Wget can see if the remote + file has changed since the last retrieval and automatically + retrieve the new version if it has. + . + Wget supports proxy servers; this can lighten the network load, + speed up retrieval, and provide access behind firewalls. + +Package: whoopsie +Architecture: amd64 +Version: 0.2.82ubuntu +Priority: optional +Section: utils +Maintainer: Florent 'Skia' Jacquet +Installed-Size: 87 +Pre-Depends: sysvinit-utils (>= 2.88dsf-50) +Depends: libc6 (>= 2.38), libcurl3t64-gnutls (>= 7.16.2), libglib2.0-0t64 (>= 2.76.0), libwhoopsie0 (= 0.2.82ubuntu), adduser +Filename: pool/whoopsie_0.2.82ubuntu_amd64.deb +Size: 20270 +MD5sum: 57a747329d0df31d429e8c0eb812a78f +SHA1: c8ebf23d5951f82871f21cffa9f8e1a01b9614e6 +SHA256: 76399e507fde65ef34791939f5d154be72948dbc374d0e424c7850d92330cdc8 +SHA512: 1bbbf6708437497efebe63a1d26f045dbed8eee917e1e665a510b490e11c82769db1341b34a63ed5498c76e407231d5cb2c9c1b68c1a1b32e260f3df45b74131 +Homepage: http://wiki.ubuntu.com/ErrorTracker +Description: Ubuntu error tracker submission + This program submits crash reports back to an Ubuntu server. + +Package: whoopsie-preferences +Architecture: amd64 +Version: 23build4 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Evan Dandrea +Installed-Size: 43 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.30.0), libpolkit-gobject-1-0 (>= 0.99), libwhoopsie-preferences0 (= 23build4), libwhoopsie0 (>= 0.2.48) +Recommends: whoopsie (>= 0.2.77) +Breaks: activity-log-manager (<< 0.9.7-0ubuntu4), activity-log-manager-control-center (<< 0.9.6), whoopsie (<< 0.2.47) +Replaces: activity-log-manager (<< 0.9.7-0ubuntu4), activity-log-manager-control-center (<< 0.9.6) +Filename: pool/whoopsie-preferences_23build4_amd64.deb +Size: 8980 +MD5sum: cb742e20d8ed55ef887d6782986f61a2 +SHA1: d4aab74874d93733793db4564001169b11e92783 +SHA256: dfe4b806b28ea42d90b99bf2b12f02d33e26078f0c2b86d6a72a1263af8c265b +SHA512: 88ee10388e174260c5fa8a2677525db58c0c0380c3a53937795118316c18cd1b944d03ec10a94f5ea981fe0c57cb1627421435617db3f1523ab9363f0c3e0339 +Homepage: http://launchpad.net/whoopsie-preferences +Description: System preferences for error reporting + This package provides an interface for system preferences dialogs to control + error reporting. + +Package: wireguard-tools +Architecture: amd64 +Version: 1.0.20250521-1ubuntu1 +Priority: optional +Section: net +Source: wireguard +Maintainer: Ubuntu Developers +Original-Maintainer: Daniel Kahn Gillmor +Installed-Size: 319 +Depends: libc6 (>= 2.38) +Recommends: nftables | iptables +Suggests: openresolv | resolvconf +Filename: pool/wireguard-tools_1.0.20250521-1ubuntu1_amd64.deb +Size: 89628 +MD5sum: 74776f3ef9a6c43bf8c240a0051b583c +SHA1: 5979b8800808099e863d134bf7464a0d385c0e48 +SHA256: e948f176ea0324252b7f07327becd1d5df14290ef4fafa392a9d41e96b0459c8 +SHA512: 00da9ff7a0865a1f7ae6e247f3ef8e68828d4b6cf4d6beae847343d7f6a9b59b6367873d077b89d612651f4814f078e328999688aede3c541316ee18f70f346a +Homepage: https://www.wireguard.com +Description: fast, modern, secure kernel VPN tunnel (userland utilities) + WireGuard is a novel VPN that runs inside the Linux Kernel and uses + state-of-the-art cryptography (the "Noise" protocol). It aims to be + faster, simpler, leaner, and more useful than IPSec, while avoiding + the massive headache. It intends to be considerably more performant + than OpenVPN. WireGuard is designed as a general purpose VPN for + running on embedded interfaces and super computers alike, fit for + many different circumstances. It runs over UDP. + . + This package contains command-line tools to interact with the + WireGuard kernel module. Currently, it provides only a single tool: + . + wg: set and retrieve configuration of WireGuard interfaces + +Package: wireless-regdb +Architecture: all +Version: 2026.05.30-0ubuntu1~26.04.1 +Multi-Arch: foreign +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Seth Forshee +Installed-Size: 24 +Conflicts: boot-managed-by-snapd (<< 5~) +Filename: pool/wireless-regdb_2026.05.30-0ubuntu1~26.04.1_all.deb +Size: 7146 +MD5sum: b8c1402d7cfcf537020875363bc2ab1a +SHA1: fefdec15e7e90deb87bbe5e171d69a18d3593112 +SHA256: 09eb267396235ac61a902eca2631b4c16ee1436b853ecd271c5d0673dfe640be +SHA512: 0f784dcb66cde3545cf2f436b4b2d6930fa65a44e09af388fd9efb679015a69b47449e6c46c5aaa7b336003bc4dc5dcb6020b44eadd0a2b357162a758402a75f +Homepage: https://wireless.wiki.kernel.org/en/developers/regulatory/wireless-regdb +Description: wireless regulatory database + This package contains the wireless regulatory database used by the Central + Regulatory Database Agent (CRDA) to configure wireless devices to operate + within the radio spectrum allowed in the local jurisdiction. + . + This regulatory information is provided with no warranty either expressed or + implied. Only Linux drivers which use cfg80211 framework can make use of the + regulatory database and CRDA. + +Package: wireplumber +Architecture: amd64 +Version: 0.5.13-1ubuntu1 +Priority: optional +Section: video +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 768 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.68), libpipewire-0.3-0t64 (>= 1.0.2), libwireplumber-0.5-0 (= 0.5.13-1ubuntu1), default-dbus-session-bus | dbus-session-bus, pipewire (>= 1.0.2) +Recommends: pipewire-pulse +Suggests: libspa-0.2-bluetooth, libspa-0.2-libcamera, wireplumber-doc +Conflicts: pipewire-media-session +Breaks: asahi-audio (<< 2.0) +Replaces: pipewire-media-session +Filename: pool/wireplumber_0.5.13-1ubuntu1_amd64.deb +Size: 106574 +MD5sum: d07e1bdb3301d03d0335d261d9a340d9 +SHA1: fb72edfe9c6973c7ee383a259245a104a577768c +SHA256: 8f7109279a58c132abc3656f8bd597de5c23bb622b4d9bb4f6fe6aec1a4e34dd +SHA512: 712bcd9528c712749406e738ed8333fee23248b5a5fa7544ac7346f53b1926363ebfff5b1027408140c20f4f41a60d0c355e875f193b8f13b6b437beada085e4 +Homepage: https://gitlab.freedesktop.org/pipewire/wireplumber +Description: modular session / policy manager for PipeWire + WirePlumber is a modular session / policy manager for PipeWire and a + GObject-based high-level library that wraps PipeWire's API, providing + convenience for writing the daemon's modules as well as external tools for + managing PipeWire. + . + This package contains the WirePlumber daemon and command-line utilities. + +Package: wpasupplicant +Architecture: amd64 +Version: 2:2.11-0ubuntu5 +Multi-Arch: foreign +Priority: optional +Section: net +Source: wpa +Maintainer: Ubuntu Developers +Original-Maintainer: Debian wpasupplicant Maintainers +Installed-Size: 4012 +Depends: libc6 (>= 2.38), libdbus-1-3 (>= 1.10), libnl-3-200 (>= 3.11.0), libnl-genl-3-200 (>= 3.11.0), libnl-route-3-200 (>= 3.11.0), libpcsclite1 (>= 1.0.0), libreadline8t64 (>= 6.0), libssl3t64 (>= 3.0.0), adduser +Suggests: wpagui, libengine-pkcs11-openssl +Breaks: network-manager (<< 1.36.4-2~) +Filename: pool/wpasupplicant_2%3a2.11-0ubuntu5_amd64.deb +Size: 1573582 +MD5sum: 3581ea3d15605e4ca2b409fd7f823bd1 +SHA1: 1f8ef079f5092c08d73aa160f27d88b6c0c00c22 +SHA256: c64c5f1c9cb333cd766abdc4e8732404c65787f34228e841b6447376a3887a90 +SHA512: 600717846e479813da2eb1aa5298f571550bb91c14e483f8fe746f94f94acb4294dda1800e43db584685c5549eccf2608deb4c703d69367da54ba1dc6b42c24c +Homepage: https://w1.fi/wpa_supplicant/ +Description: client support for WPA and WPA2 (IEEE 802.11i) + wpa-supplicant is a userspace daemon handling connection and authentication + in wireless and wired networks, primarily secured with the WPA/WPA2/WPA3 + protocols. This software provides key negotiation with the access point + (WPA Authenticator), and controls association with IEEE 802.11i networks. + +Package: wsdd +Architecture: all +Version: 2:0.8-5ubuntu1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Matthew Grant +Installed-Size: 123 +Depends: python3 (>= 3.11) +Suggests: apparmor +Filename: pool/wsdd_2%3a0.8-5ubuntu1_all.deb +Size: 36112 +MD5sum: b83c9fac350f4db5f8898fddd0a4a58b +SHA1: 2affa7972cf8e7cc74e89409e1835b541f6e2a7f +SHA256: 9ef0c538ddcf878bfcb6f69a2c91c5984ed9370245bbf1f4432399667fcf833f +SHA512: f3b2c91fd24fa12862b75d1d4541478fb98715ca5288273e4cad148f19217f96e8463317b1cc9e51739b0b39f5b957f2e7e580a66f8687e4d134d615b0dda85d +Homepage: https://github.com/christgau/wsdd +Description: Python Web Services Discovery Daemon, Windows Net Browsing + This daemon is used to announce Linux Hosts to Windows 7+ computers for + use in their File Manager network browsing, by using the Windows + Services Discovery Protocol. + . + This protocol is a local network segment procotol, which is multicasted + on udp/3072, and incoming on tcp/5357 on the 239.255.255.250/ff02::c + multicast addresses. It DOES have security issues, but it is designed + for use in a trusted environment inside a firewall. + . + Install only this if running Gnome desktop, or GVFS and not announcing + well known File shares. See wsdd-server for working with Samba servers. + +Package: x11-apps +Architecture: amd64 +Version: 7.7+11build4 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 2511 +Depends: libc6 (>= 2.38), libpng16-16t64 (>= 1.6.46), libsm6 (>= 2:1.2.6), libx11-6, libx11-xcb1, libxaw7 (>= 2:1.0.16), libxcb-damage0, libxcb-present0, libxcb-xfixes0, libxcb1, libxcursor1 (>> 1.1.2), libxext6, libxft2 (>> 2.1.1), libxi6 (>= 2:1.2.99.4), libxkbfile1 (>= 1:1.1.0), libxmu6 (>= 2:1.1.3), libxmuu1 (>= 2:1.1.3), libxrender1 (>= 1:0.9.12), libxt6t64 (>= 1:1.1.0), man-db +Recommends: xbitmaps +Suggests: mesa-utils +Conflicts: bitmap, oclock, transset, x11perf, xbiff, xcalc, xclipboard, xclock, xconsole, xcursorgen, xditview, xeyes, xgc, xload, xlogo, xmag, xman, xmore, xwd, xwud +Replaces: bitmap, oclock, transset, x11perf, xbiff, xcalc, xclipboard, xclock, xconsole, xcursorgen, xditview, xeyes, xgc, xload, xlogo, xmag, xman, xmore, xwd, xwud +Filename: pool/x11-apps_7.7+11build4_amd64.deb +Size: 718988 +MD5sum: f0a3827fc9fb3b98746b97bd25afb714 +SHA1: 7d4c460f055413cbcb27ab591ea09cdf98425b33 +SHA256: f22231c5b84e61bf571bce721d91845ca2b3b92212d72aba0ba5aeac09d57422 +SHA512: 5ed93d729d6c1e73e31d5937dec0d6ed5b2fe945331da5aedb811c4faf9a6877675d4aa2910b2f863dcb81439fbc1021fc16ff3409ef3c813569afccb16c6a5b +Description: X applications + This package provides a miscellaneous assortment of X applications + that ship with the X Window System, including: + - atobm, bitmap, and bmtoa, tools for manipulating bitmap images; + - ico, a demo program animating polyhedrons; + - oclock and xclock, graphical clocks; + - rendercheck, a program to test render extension implementations; + - transset, a tool to set opacity property on a window; + - xbiff, a tool which tells you when you have new email; + - xcalc, a scientific calculator desktop accessory; + - xclipboard, a tool to manage cut-and-pasted text selections; + - xconsole, which monitors system console messages; + - xcursorgen, a tool for creating X cursor files from PNGs; + - xditview, a viewer for ditroff output; + - xedit, a simple text editor for X; + - xeyes, a demo program in which a pair of eyes track the pointer; + - xgc, a graphics demo; + - xload, a monitor for the system load average; + - xlogo, a demo program that displays the X logo; + - xmag, which magnifies parts of the X screen; + - xman, a manual page browser; + - xmore, a text pager; + - xwd, a utility for taking window dumps ("screenshots") of the X session; + - xwud, a viewer for window dumps created by xwd; + - Xmark, x11perf, and x11perfcomp, tools for benchmarking graphical + operations under the X Window System; + . + The xbiff, xcalc, xconsole, xedit and xman programs use bitmap images + provided by the xbitmaps package. + +Package: x11-common +Architecture: all +Version: 1:7.7+26ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Source: xorg +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 278 +Depends: lsb-base +Filename: pool/x11-common_1%3a7.7+26ubuntu1_all.deb +Size: 22520 +MD5sum: 628065f3c7b48d78fe64c6ecb57152e4 +SHA1: 9a147d6931d4b3f4d7fc419687c0899ae06e6b18 +SHA256: 60b7a5982b477e10b9f11e2278289135f79e9dc75a312575778b21a0a631bea5 +SHA512: 9d7e258ead810b8806c0007cf4bcc5936b1fa53d222463e6b9ee49d42ace1402173dacf2ba5e88c573e117549ccabf2f756c93d8d19b51040780b7ba22d9906b +Homepage: https://www.x.org/ +Description: X Window System (X.Org) infrastructure + x11-common contains the filesystem infrastructure required for further + installation of the X Window System in any configuration; it does not + provide a full installation of clients, servers, libraries, and utilities + required to run the X Window System. + . + A number of terms are used to refer to the X Window System, including "X", + "X Version 11", "X11", "X11R6", and "X11R7". The version of X used in + Debian is derived from the version released by the X.Org Foundation, and + is thus often also referred to as "X.Org". All of the preceding quoted + terms are functionally interchangeable in an Debian system. + +Package: x11-session-utils +Architecture: amd64 +Version: 7.7+6build3 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 232 +Depends: libc6 (>= 2.38), libice6 (>= 1:1.0.0), libsm6 (>= 2:1.2.6), libx11-6, libxaw7 (>= 2:1.0.16), libxmuu1 (>= 2:1.1.3), libxt6t64 (>= 1:1.1.0) +Filename: pool/x11-session-utils_7.7+6build3_amd64.deb +Size: 70014 +MD5sum: 4fdc1507c8bea0b998fc22d329123bc0 +SHA1: ab5dfb6cb7288be5ed9ce9f1bc2e4575a9b97f7d +SHA256: d7a87ca7049e25a984ceaef1bba526ce33e6df1930224423ec7479d9e25c054e +SHA512: e935f7d1881e431d664c22c20baca988212de7ba10b4b5ee8a97b9e516c61bd85308f79554166b3041edce4a9b3a150e25fd853810ba958ebeaa88c7df5c0233 +Description: X session utilities + This package provides the X session manager and related tools: + - rstart; + - smproxy, a session manager proxy for X clients that do not use the X + session manager protocol; + - xsm, a session manager for X sessions; + Installation of an rsh or ssh daemon (server) is necessary if rstartd is + to be used, and installation of an rsh or ssh client is necessary if + rstart is to be used. + +Package: x11-utils +Architecture: amd64 +Version: 7.7+7build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 663 +Depends: libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libgl1, libx11-6, libx11-xcb1, libxaw7 (>= 2:1.0.16), libxcb-shape0, libxcb1 (>= 1.6), libxcomposite1 (>= 1:0.4.6), libxext6, libxft2 (>> 2.1.1), libxi6, libxinerama1 (>= 2:1.1.4), libxkbfile1 (>= 1:1.1.0), libxmu6 (>= 2:1.1.3), libxmuu1 (>= 2:1.1.3), libxrandr2 (>= 2:1.2.0), libxrender1 (>= 1:0.9.12), libxt6t64 (>= 1:1.1.0), libxtst6 (>= 2:1.2.5), libxv1 (>= 2:1.0.13), libxxf86dga1 (>= 2:1.1.5), libxxf86vm1 (>= 1:1.1.4) +Recommends: luit +Suggests: mesa-utils +Filename: pool/x11-utils_7.7+7build1_amd64.deb +Size: 191112 +MD5sum: 9c8a4f4ed517ee83490f0ee31df57480 +SHA1: 5d70180de75fec0d30b63db2db8854b4f4918926 +SHA256: 3a0c0837b22aaa643a2e1d6eb509c0e3e2732b16c5eecd1b18d0885aaa17f973 +SHA512: 5d784884024f37344945e3c0606cc979429da6806a00d0105187893115483f1d9cace6ec1dad048aeac8c59cabe95ab1f3f00947e45e488a71cdc4a8950e1acc +Description: X11 utilities + An X client is a program that interfaces with an X server (almost always via + the X libraries), and thus with some input and output hardware like a + graphics card, monitor, keyboard, and pointing device (such as a mouse). + . + This package provides a miscellaneous assortment of X utilities + that ship with the X Window System, including: + - appres, editres, listres and viewres, which query the X resource database; + - xdpyinfo, a display information utility for X; + - xdriinfo, query configuration information of DRI drivers; + - xev, an X event displayer; + - xfd, a tool that displays all the glyphs in a given X font; + - xfontsel, a tool for browsing and selecting X fonts; + - xkill, a tool for terminating misbehaving X clients; + - xlsatoms, which lists interned atoms defined on an X server; + - xlsclients, which lists client applications running on an X display; + - xlsfonts, a server font list displayer; + - xmessage, a tool to display message or dialog boxes; + - xprop, a property displayer for X; + - xvinfo, an Xv extension information utility for X; + - xwininfo, a window information utility for X; + . + The editres and viewres programs use bitmap images provided by the + xbitmaps package. + +Package: x11-xkb-utils +Architecture: amd64 +Version: 7.7+9build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 488 +Depends: libc6 (>= 2.38), libx11-6, libxaw7 (>= 2:1.0.16), libxkbfile1 (>= 1:1.1.0), libxrandr2 (>= 2:1.2.99.2), libxt6t64 +Filename: pool/x11-xkb-utils_7.7+9build1_amd64.deb +Size: 170262 +MD5sum: 9f838e7855f20a17356431c1bd7d2815 +SHA1: 4088547ef80b12994c6a53659a2e4126c859d224 +SHA256: f17d61317a9f0db99db7a2c7b81d462a35008c85089fb573d2175ed504f6157b +SHA512: 0959526a46b469843c0fa8ad27d7944a6bef2a7ac0c7fce05805d58396a84d35a18484c69fe99e50e6e3d73335e82a08778c4eec54493f3efcc8099eb5e7a112 +Description: X11 XKB utilities + xkbutils contains a number of client-side utilities for XKB, the X11 + keyboard extension. + . + setxkbmap is a tool to query and change the current XKB map. + . + xkbbell generates a bell event through the keyboard. + . + xkbcomp is a tool to compile XKB definitions into map files the server + can use. + . + xkbevd is an experimental tool to listen for certain XKB events and execute + defined triggers when actions occur. + . + xkbprint is a tool to generate an image with the physical representation + of the keyboard as XKB sees it. + . + xkbvleds shows the changing status of keyboard LEDs. + . + xkbwatch shows the changing status of modifiers and LEDs. + +Package: x11-xserver-utils +Architecture: amd64 +Version: 7.7+11build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 567 +Depends: libc6 (>= 2.38), libice6 (>= 1:1.0.0), libx11-6, libxaw7 (>= 2:1.0.16), libxcursor1 (>> 1.1.2), libxext6, libxi6, libxmu6 (>= 2:1.1.3), libxmuu1 (>= 2:1.1.3), libxrandr2 (>= 2:1.5.0), libxt6t64, libxxf86vm1 (>= 1:1.1.4), cpp +Suggests: nickle, cairo-5c, xorg-docs-core +Filename: pool/x11-xserver-utils_7.7+11build1_amd64.deb +Size: 170654 +MD5sum: f9f6ba109d7e2e74bdd79c8e6e487402 +SHA1: 1dabf6a382fcbc3457b83ea0b1b3c5f6868ae770 +SHA256: 5963dd34415a4b6e590c2cf4ce71c85dced09bce9fa58b8e4de88eb63fa7b2d1 +SHA512: 8a1da94baf74791702ea411228c3348d745bfdfa404b2085d227b6677122cf0977cbf8f4567f1deecf0218cd33a78ae022fd49d74e2b33bc314a6a5c68b16d21 +Description: X server utilities + An X client is a program that interfaces with an X server (almost always via + the X libraries), and thus with some input and output hardware like a + graphics card, monitor, keyboard, and pointing device (such as a mouse). + . + This package provides a miscellaneous assortment of X Server utilities + that ship with the X Window System, including: + - iceauth, a tool for manipulating ICE protocol authorization records; + - rgb; + - sessreg, a simple program for managing utmp/wtmp entries; + - xcmsdb, a device color characteristic utility for the X Color Management + System; + - xgamma, a tool for querying and setting a monitor's gamma correction; + - xhost, a very dangerous program that you should never use; + - xmodmap, a utility for modifying keymaps and pointer button mappings in X; + - xrandr, a command-line interface to the RandR extension; + - xrdb, a tool to manage the X server resource database; + - xrefresh, a tool that forces a redraw of the X screen; + - xset, a tool for setting miscellaneous X server parameters; + - xsetmode and xsetpointer, tools for handling X Input devices; + - xsetroot, a tool for tailoring the appearance of the root window; + - xstdcmap, a utility to selectively define standard colormap properties; + - xvidtune, a tool for customizing X server modelines for your monitor. + +Package: xauth +Architecture: amd64 +Version: 1:1.1.2-1.1build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 73 +Depends: libc6 (>= 2.38), libx11-6, libxau6 (>= 1:1.0.11), libxext6, libxmuu1 (>= 2:1.1.3) +Filename: pool/xauth_1%3a1.1.2-1.1build1_amd64.deb +Size: 25718 +MD5sum: b4726d21a613aeb06d3839c9850c6df9 +SHA1: d2a87e7607dc2c739d43d57273fdb33ead0009a9 +SHA256: 14c923bfbd465033fa755f3ec812c3482971982a7a5f466a042be1276dde50aa +SHA512: 6c37b66cda265ef505c0ebf8c7db7d5f0c2742b7900bad56c0e331323b4233968791685d8197473486a0a0e58dd3453b3b756e54a58c2d1b2a76b82e94169a6b +Description: X authentication utility + xauth is a small utility to read and manipulate Xauthority files, which + are used by servers and clients alike to control authentication and access + to X sessions. + +Package: xbitmaps +Architecture: all +Version: 1.1.1-2.2build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 241 +Filename: pool/xbitmaps_1.1.1-2.2build1_all.deb +Size: 22258 +MD5sum: bc0b105a074c65f0f348e64003908c1c +SHA1: 1d6e981e0b63a80c9f6077fbf57d69663ae2d6af +SHA256: 672d1aa56dcb8aedb9baa2e5d35b68a0eaf70763d4bd890020d0dd0c6497be42 +SHA512: b885b3f92861cfff7c7d647f2b41bd6199234804932b8e1ca0f58947ccb7667bea9207c4f6a522a148d0ae6c24b8a75994919f26e3e707d8a74e9eae55d36d5b +Description: Base X bitmaps + This package contains the base X bitmaps, which are used in many legacy X + clients. + +Package: xbrlapi +Architecture: amd64 +Version: 6.7-1ubuntu6 +Multi-Arch: foreign +Priority: optional +Section: admin +Source: brltty +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Accessibility Team +Installed-Size: 307 +Depends: libbrlapi0.8 (>= 6.7), libc6 (>= 2.38), libicu78 (>= 78.1-1~), libx11-6, libxfixes3, libxtst6 (>= 2:1.2.5) +Filename: pool/xbrlapi_6.7-1ubuntu6_amd64.deb +Size: 87904 +MD5sum: 103862f295d704f9ec8dce2da0600419 +SHA1: 4535632cd0905e9bba2eeed1cafd6c312c243858 +SHA256: 36f0641e59e630ece728fab537efae5d50f6c8f55b79ddacbe957fcf961426db +SHA512: 490adc68c80db831812c25a0272b14ef68a1d18cb73a5af53048752c7f23e1bd7a07185c167ae1a7aed4163eca1d0474960a2b9b7c3c2418e859ffa451a5693c +Homepage: https://brltty.com +Description: Access software for a blind person using a braille display - xbrlapi + BRLTTY is a daemon which provides access to the Linux console (text mode) + for a blind person using a braille display. It drives the braille + display and provides complete screen review functionality. + . + This package provides xbrlapi, a brltty X11 helper which handles proper + keyboard simulation and window selection. + +Package: xcursor-themes +Architecture: all +Version: 1.0.6-0ubuntu2 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 3694 +Filename: pool/xcursor-themes_1.0.6-0ubuntu2_all.deb +Size: 371884 +MD5sum: e71b3dc94d769029644fada28025c51a +SHA1: 6b1924b435b468b412fb97cf33b2a7bc69d50cb5 +SHA256: 2a68cc61f0f24922c3cf727d03f76d30db7723f68c6d3616732043306016bf2d +SHA512: ea2fd2b1913c14948097bdbb69887ddd6c1496f78995a6b8f30ef3dd0e2d2a37e2141942e1d081066166d6fe1bd22928540532274026839948a844a46ea12921 +Description: Base X cursor themes + This package contains the additional base X cursor themes -- + handhelds, redglass, and whiteglass. These themes are not essential + for the X server to run. + +Package: xcvt +Architecture: amd64 +Version: 0.1.3-1build1 +Priority: optional +Section: x11 +Source: libxcvt +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 29 +Depends: libc6 (>= 2.38), libxcvt0 (>= 0.1.0) +Breaks: xserver-xorg-core (<< 2:21.0.99.1~) +Replaces: xserver-xorg-core (<< 2:21.0.99.1~) +Filename: pool/xcvt_0.1.3-1build1_amd64.deb +Size: 7082 +MD5sum: 27cf578387071354b348bb90cff52490 +SHA1: 8bddde3fdcd96a7698f63c26db1e07baee611749 +SHA256: a3114a86fdaf7fda89e941163e278f029187511175be19229175f95f8ee8ddf1 +SHA512: 791a37b17d03c0e601404ef01e4a5847f056bc266e17beb27918e8808fbb019bc31703ebfe7ba450c418e301ea5be344bd47755e944c2b15ef31f4357640ee74 +Description: VESA CVT standard timing modelines generator + libxcvt is a library providing a standalone version of the X server + implementation of the VESA CVT standard timing modelines generator. + . + This package includes the commandline tool 'cvt'. + +Package: xdg-dbus-proxy +Architecture: amd64 +Version: 0.1.7-1 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 74 +Depends: libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0) +Filename: pool/xdg-dbus-proxy_0.1.7-1_amd64.deb +Size: 25966 +MD5sum: 33bc779f127101e65ced32786540ae21 +SHA1: 3f10d13e3d39f0539772982c53b65793d830d6dd +SHA256: d8643ee790c1b36fa3f98c239edad013b59755539358138a64fc77ac5669ca39 +SHA512: fba82eee32c3587539a10f41d8c966ae842b37ecf414ac56b0039d6b8e16a48a13468cf16c813667bec47f236b3764b6c3ba52ef77290b807951db725c6276bd +Homepage: https://github.com/flatpak/xdg-dbus-proxy +Description: filtering D-Bus proxy + xdg-dbus-proxy is a filtering proxy for D-Bus connections. It was + originally part of the Flatpak project, but it has been broken out as + a standalone module to facilitate using it in other contexts, for + example in WebKit-GTK's optional bubblewrap-based sandbox. + . + For this proxy to be useful, restricted D-Bus clients must be denied + access to the normal D-Bus socket (for example by using containers or + AppArmor rules), and instead given access to the listening Unix socket + created by the proxy (typically by bind-mounting it into a Linux + container). + +Package: xdg-desktop-portal +Architecture: amd64 +Version: 1.21.1+ds-1ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: admin +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 1532 +Depends: bubblewrap, default-dbus-session-bus | dbus-session-bus, fuse3, gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, libc6 (>= 2.38), libfuse3-4 (>= 3.17.2), libgdk-pixbuf-2.0-0 (>= 2.30.1), libglib2.0-0t64 (>= 2.83.0), libgstreamer-plugins-base1.0-0 (>= 1.4.0), libgstreamer1.0-0 (>= 1.0.0), libgudev-1.0-0 (>= 146), libjson-glib-1.0-0 (>= 1.5.2), libpipewire-0.3-0t64 (>= 0.3.1), libsystemd0 +Recommends: librsvg2-common +Filename: pool/xdg-desktop-portal_1.21.1+ds-1ubuntu3_amd64.deb +Size: 365602 +MD5sum: 4d571fd362a9268f5e9c76293e5c31d4 +SHA1: 30c264c89f9f66e032135d8c2a98ed12ef80336f +SHA256: f43095459e2c9c8dad23686b8699c452510217f79b2c76c914028c89521d7b53 +SHA512: be75e803bbb3d0aa87a37e23abf0c2445c0a8cb1b1baf68ebeceb27da22b7428120c7f65b780c2c4b044137a29dc721d460b3c7930aa33f2095c8b46dbd16d26 +Homepage: https://flatpak.github.io/xdg-desktop-portal/ +Description: desktop integration portal for Flatpak and Snap + xdg-desktop-portal provides a portal frontend service for Flatpak, Snap, + and possibly other desktop containment/sandboxing frameworks. This service + is made available to the sandboxed application, and provides mediated + D-Bus interfaces for file access, URI opening, printing and similar + desktop integration features. + . + The implementation of these interfaces is expected to require + user confirmation before responding to the sandboxed application's + requests. For example, when the sandboxed application ask to open a file, + the portal implementation will open an "Open" dialog outside the sandbox, + and will only make the selected file available to the sandboxed app if + that dialog is confirmed. + . + xdg-desktop-portal is designed to be desktop-agnostic, and uses a + desktop-environment-specific GUI backend such as xdg-desktop-portal-gtk + to provide its functionality. + +Package: xdg-desktop-portal-gnome +Architecture: amd64 +Version: 50.0-0ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 756 +Provides: xdg-desktop-portal-backend (= 1.7.1) +Depends: dbus-user-session | dbus-x11, gsettings-desktop-schemas (>= 50~), nautilus (>= 47~beta), xdg-desktop-portal (>= 1.17.1), xdg-desktop-portal-gtk, dconf-gsettings-backend | gsettings-backend, libadwaita-1-0 (>= 1.7~alpha), libc6 (>= 2.38), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.12.6), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.83.0), libgnome-bg-4-2t64 (>= 3.17.92), libgnome-desktop-4-2t64 (>= 3.17.92), libgraphene-1.0-0 (>= 1.5.4), libgtk-4-1 (>= 4.21), libwayland-client0 (>= 1.20.0), libx11-6 +Recommends: gnome-shell (>= 48~) | budgie-desktop (>= 10.7.2-0.1~), gnome-settings-daemon, papers +Suggests: accountsservice +Breaks: budgie-desktop (<< 10.7.2-0.1~), gnome-shell (<< 48~) +Filename: pool/xdg-desktop-portal-gnome_50.0-0ubuntu1_amd64.deb +Size: 159610 +MD5sum: 096bb4eb24c8755a7ac6e78152b60e6e +SHA1: 49fdeb258a6100a0f96d9aaa861f6738aab5c9f4 +SHA256: f6aa16fe441072706f91470e8d3362a75b44acf387ebedb4660478316e6ed9aa +SHA512: 05ee24a5d55e78093a9bef7f7665c485d436aa1ed142d6d79ecdc57f4b41e33e101f5fef7436ba9e6f4410acfeb2ceea2f007dbf2c0b5d5081420b9213eb71a6 +Homepage: https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome +Description: GNOME portal backend for xdg-desktop-portal + xdg-desktop-portal-gnome provides a GNOME implementation for the + desktop-agnostic xdg-desktop-portal service. This allows sandboxed + applications to request services from outside the sandbox using + GNOME services (session manager, screenshot provider, Shell) or + GNOME-style user interfaces. + . + Non-GNOME GTK-based desktop environments should normally use + xdg-desktop-portal-gtk or their own portal implementation instead of + this one. + +Package: xdg-desktop-portal-gtk +Architecture: amd64 +Version: 1.15.3-2ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Utopia Maintenance Team +Installed-Size: 408 +Provides: xdg-desktop-portal-backend (= 1.14.0) +Depends: dbus-user-session | dbus-x11, gsettings-desktop-schemas, xdg-desktop-portal (>= 1.14.0), libc6 (>= 2.38), libfontconfig1 (>= 2.12.6), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0t64 (>= 2.83.0), libgtk-3-0t64 (>= 3.21.5) +Suggests: accountsservice, xdg-desktop-portal-gnome +Filename: pool/xdg-desktop-portal-gtk_1.15.3-2ubuntu1_amd64.deb +Size: 81616 +MD5sum: ea73e2b90ece8bb8e6eb7dbeeefeae18 +SHA1: 80ffcb4125336b0a16f9299f3ad3869ec43ac091 +SHA256: 9b923cd46711ba3369ad07d99e71e1668e7a9ceef60475b0ac40c89bc083c6a4 +SHA512: c39251a262a67673afb7ba20e9c406ad3810da0db5e2a2af5d081e490e53e199367ed172fdb8aa13376898466bca5838ea121892efe85e0f5bdcc75ad8968a71 +Homepage: https://flatpak.org/ +Description: GTK+/GNOME portal backend for xdg-desktop-portal + xdg-desktop-portal-gtk provides a GTK+/GNOME implementation for the + desktop-agnostic xdg-desktop-portal service. This allows sandboxed + applications to request services from outside the sandbox using + GTK+ GUIs (app chooser, file chooser, print dialog) or using GNOME + services (session manager, screenshot provider). + +Package: xdg-terminal-exec +Architecture: all +Version: 0.14.0-1ubuntu0.1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 75 +Depends: user-session-migration +Suggests: x-terminal-emulator +Breaks: reform-tools (<< 1.82-3~) +Replaces: reform-tools (<< 1.82-3~) +Filename: pool/xdg-terminal-exec_0.14.0-1ubuntu0.1_all.deb +Size: 23876 +MD5sum: c03c24ad62557da20231cfa199075e98 +SHA1: e5375a64db3bb6baa8139060165ac266c811ab01 +SHA256: 4973e24dedb9508a1eecd025b764f9b04cb1753105dcc6703930b85906289866 +SHA512: 02acffa78f2d2db924879664624fee6504ee52316da0e058d8457c0dd147689ed7712a70737355d931c19ed4a39bc117dd9a952884bf2833a73039cd23a22abf +Homepage: https://github.com/Vladimir-csp/xdg-terminal-exec +Description: user default terminal execution utility + xdg-terminal-exec is an implementation of a proposed freedesktop.org + specification for launching a user's default terminal app. + +Package: xdg-user-dirs +Architecture: amd64 +Version: 0.19-1 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 168 +Depends: libc6 (>= 2.34), init-system-helpers (>= 1.52) +Filename: pool/xdg-user-dirs_0.19-1_amd64.deb +Size: 19302 +MD5sum: 23e6a62d5c62d57cdb311417a522fc1c +SHA1: 1bb646eb9f1430a1a27a03e760d9736479e42fb6 +SHA256: 6a582b915086aeb27a8ba6c4585fd9a350e1098b218c22447ccd5cc9a222b09b +SHA512: 0409b6146f9a2d60396eee93f242829502051cc494aec98d118792c91026962256278ed90fc72123192f7021aea784c1e6523eaf02bcad89e8d9ed0a53345039 +Homepage: https://www.freedesktop.org/wiki/Software/xdg-user-dirs +Description: tool to manage well known user directories + xdg-user-dirs is a tool to help manage "well known" user directories + like the desktop folder and the music folder. It also handles + localization (i.e. translation) of the filenames. + . + The way it works is that xdg-user-dirs-update is run very early in the + login phase. This program reads a configuration file, and a set of + default directories. It then creates localized versions of these + directories in the users home directory and sets up a config file in + $(XDG_CONFIG_HOME)/user-dirs.dirs (XDG_CONFIG_HOME defaults to + ~/.config) that applications can read to find these directories. + +Package: xdg-user-dirs-gtk +Architecture: amd64 +Version: 0.16-1 +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 120 +Depends: libc6 (>= 2.34), libglib2.0-0t64 (>= 2.36.0), libgtk-3-0t64 (>= 3.16.2), xdg-user-dirs +Filename: pool/xdg-user-dirs-gtk_0.16-1_amd64.deb +Size: 10850 +MD5sum: 6d874075b2c0812fdaecc438c326728c +SHA1: a9731056bf1629c110781634bb1951972b991bdc +SHA256: 756647a58231a45b2d4112c00272ec079d66f58ce775990113c71df05f74d079 +SHA512: 88745601cae7fc5399339373da749baf473839559b2dc34573c4b051d8e0cda89ef061115b91939b0ae14dfc2f4d11b65855daedbde9e89af3da5df461203936 +Homepage: https://www.freedesktop.org/wiki/Software/xdg-user-dirs +Description: tool to manage well known user directories (Gtk extension) + xdg-user-dirs is a tool to help manage "well known" user directories + like the desktop folder and the music folder. It also handles + localization (i.e. translation) of the filenames. + . + This extension sets the Gtk bookmark file and tracks changes of the locale + to notify the user on login about changed directory names. + +Package: xdg-utils +Architecture: all +Version: 1.2.1-2ubuntu2 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Debian freedesktop.org maintainers +Installed-Size: 340 +Recommends: libfile-mimeinfo-perl, libnet-dbus-perl, libx11-protocol-perl, x11-utils, x11-xserver-utils +Filename: pool/xdg-utils_1.2.1-2ubuntu2_all.deb +Size: 66076 +MD5sum: 7f8162c7dbe9502b782841e77c685bf1 +SHA1: f6cb0d05fb0a8a90af0953f71ccd18601b66a717 +SHA256: ab0236062d2552e8c67763d9514e751900b0d64cf86c5df6e20f67cb2bd4789e +SHA512: f51b584629424ff6b2919d4ed7583efcf06ff3b059906aea8e7867369639fc2c96657cc680deea6c794cfc4117c3af9b7839b81aeacfa7a4d74af7aa44903fb9 +Homepage: https://www.freedesktop.org/wiki/Software/xdg-utils/ +Description: desktop integration utilities from freedesktop.org + xdg-utils contains utilities for integrating applications with the + desktop environment, regardless of which desktop environment is used. + . + The following utilities are included: + . + * xdg-desktop-menu - Install desktop menu items + * xdg-desktop-icon - Install icons on the user's desktop + * xdg-email - Compose a new email in the user's preferred email client, + potentially with subject and other info filled in + * xdg-icon-resource - Install icon resources + * xdg-mime - Query and install MIME types and associations + * xdg-open - Open a URI in the user's preferred application that + handles the respective URI or file type + * xdg-screensaver - Enable, disable, or suspend the screensaver + * xdg-settings - Get or set the default web browser and URI handlers + +Package: xfonts-base +Architecture: all +Version: 1:1.0.5+nmu1build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 7164 +Depends: xfonts-utils +Suggests: xfs | xserver +Replaces: xfonts-misc +Filename: pool/xfonts-base_1%3a1.0.5+nmu1build1_all.deb +Size: 5939824 +MD5sum: d41ed208a6b6e672aa26b068924bbe7c +SHA1: f7748da762efdcf55bb80bd46284dc8e538702c8 +SHA256: eec889b51e1c8f8485015e3d0b18892656436cc41906d8bdb6f89a88e2c41375 +SHA512: 78a2e3dd8aa62e014e1f3a3aa0b9e9d7ceade5fdd44833af3f79feb392817a89df25e8f6b65d2273cc6afdbadc9f79315ed0599033b259df0bca4c0a5c6c2aa8 +Description: standard fonts for X + xfonts-base provides a standard set of low-resolution bitmapped fonts. In + most cases it is desirable to have the X font server (xfs) and/or an X server + installed to make the fonts available to X clients. + +Package: xfonts-encodings +Architecture: all +Version: 1:1.0.5-0ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 662 +Depends: x11-common +Replaces: xfonts-base (<< 1:1.0.0) +Filename: pool/xfonts-encodings_1%3a1.0.5-0ubuntu3_all.deb +Size: 575772 +MD5sum: b520cfdc066592b4203292d9e31b4645 +SHA1: 05c46007083098d725e021f8e964899084a9de30 +SHA256: 1d0610635e1fe757c8df0ec2c2cef511203c7e7bf81bbff332031c8bf87b1847 +SHA512: 3ea91c48ccd6a0903ee565d6f80e727bafc8f481c2dfcf416d1c4240e1d500902a1842cdbe71b0ce12709f434b1cbf8b3670e153f83ed7d137e6fc0ba6807f4e +Description: Encodings for X.Org fonts + This package contains the encodings that map to specific characters. + +Package: xfonts-scalable +Architecture: all +Version: 1:1.0.3-1.3build1 +Multi-Arch: foreign +Priority: optional +Section: fonts +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 466 +Depends: xfonts-utils +Suggests: xfs | xserver +Conflicts: xfntscl +Filename: pool/xfonts-scalable_1%3a1.0.3-1.3build1_all.deb +Size: 303768 +MD5sum: 7096e7a100db849c09f57aa2aad01eac +SHA1: 4254a9ec0a7daf803c70c467f2a027298d2cdbe6 +SHA256: da5b0c9b9044f35517855bb655dbe3ad45a20ad4daff08f478c524ab81587844 +SHA512: 16a5f0c7d6334782fc75d7e94d5e081d4ccb31687c05c2cc2f83bc733708f69fbc979017c6d6144736db086e236d93c70f364f68d532975707da2750f6e9d96a +Description: scalable fonts for X + xfonts-scalable provides fonts that can be drawn at any size by the X server + or font server without loss of quality. In most cases it is desirable to + have the X font server (xfs) and/or an X server installed to make the fonts + available to X clients. + . + This package is missing three fonts from the X.Org source archives + because the license terms on the fonts do not meet the Debian Free + Software Guidelines; they are the Type1 fonts Adobe Utopia, IBM Courier, + and Bigelow & Holmes (B&H) Luxi. + . + This package requires the xutils package to prepare the font directories + for use by an X server or X font server. + +Package: xfonts-utils +Architecture: amd64 +Version: 1:7.7+7build1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 428 +Depends: libc6 (>= 2.38), libfontenc1 (>= 1:1.1.8), libfreetype6 (>= 2.6), zlib1g (>= 1:1.1.4), x11-common, xfonts-encodings +Filename: pool/xfonts-utils_1%3a7.7+7build1_amd64.deb +Size: 97066 +MD5sum: cdbf0f6ea7336268ae44de64f80d021f +SHA1: 9652fe6aa86c5058ab593b34fd8ae3d181a8b488 +SHA256: 97e8c7ce05e09ea5b766c99f4d77e20cb70db61396c2e83bb43715c6e2f0ac1e +SHA512: de0829651cb3ad04f595344ddf5337d270d942facfecc3003a449a0081fc251ba2df1e8bd394f50291e0add252a55d981de4bd4fc035e212ef4a9bf2d54e7ba8 +Description: X Window System font utility programs + xfonts-utils provides a set of utility programs shipped with the X Window + System that are needed for font management. + . + The programs in this package include: + - bdftopcf, which converts BDF fonts to PCF fonts; + - bdftruncate and ucs2any, tools to generate fonts with various encodings + from ISO 10646-encoded fonts + - mkfontdir, a program to generate fonts.dir files; + - mkfontscale, a program to generate fonts.scale files; + - fonttosfnt, a program to wrap bitmap fonts in a sfnt (TrueType) wrapper. + +Package: xinit +Architecture: amd64 +Version: 1.4.2-1build1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 55 +Depends: libc6 (>= 2.34), libx11-6, x11-common, xauth +Recommends: xserver-xorg | xserver, xterm | x-session-manager | x-window-manager | x-terminal-emulator +Filename: pool/xinit_1.4.2-1build1_amd64.deb +Size: 17508 +MD5sum: 132c33d9cfa58079c8f7476f152f7c36 +SHA1: 93a787c0d87d1dae29e21471e948892be610fa55 +SHA256: 197b713ce497a06388dd52f01906a0f51baed770df0e36314f76bed11e343f9b +SHA512: 3561b08c51dfbe8e62fa5f7cb790f37263402859cf4f2572dbc2a3354dbf059c87493c54ab7086e3b00152a37bed7abf8cef595625dabf2d171617b7366837d8 +Description: X server initialisation tool + xinit and startx are programs which facilitate starting an X server, and + loading a base X session. + +Package: xinput +Architecture: amd64 +Version: 1.6.4-1build2 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 77 +Depends: libc6 (>= 2.38), libx11-6 (>= 2:1.2.99.901), libxi6 (>= 2:1.2.99.4), libxinerama1 (>= 2:1.1.4), libxrandr2 (>= 2:1.2.0) +Filename: pool/xinput_1.6.4-1build2_amd64.deb +Size: 29070 +MD5sum: 8299e5987abb901951e0cada51ed79c1 +SHA1: f8c24611c80a392b0a183df831b2998e534be49d +SHA256: ac7510aceeef862279f4147afb00bc96f38183af488254aab2e12e502711d029 +SHA512: 01d02df051d9095860c588cff7a801ecf67ad556c3938347fa2a9e1e6eac3b01e9c2bbe920f6ec0c9f506003a833c7ff5651bb68f46d2b42ce87aba69f952304 +Description: Runtime configuration and test of XInput devices + Xinput is an utility for configuring and testing XInput + devices. + +Package: xkb-data +Architecture: all +Version: 2.46-2 +Multi-Arch: foreign +Priority: optional +Section: x11 +Source: xkeyboard-config +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 4140 +Breaks: x11-xkb-utils (<< 7.7+5) +Filename: pool/xkb-data_2.46-2_all.deb +Size: 392778 +MD5sum: e9560eaec2b6df4ef9b769c1d389f482 +SHA1: dc031827d2b25e22923bb63d35b2e96fe54e2dd9 +SHA256: a24f82b33020836444593a7ffbed959458852e28cfe16de2ff95bcbdcfbdb2d3 +SHA512: 05036bf00e79503f23d39da8db44ff4f075353ced8d3d3f8ddcf53bdd2a51a9d37785dda41bae2544fb26a8f365091bc33cf800611f089f0b9669ef047362ed5 +Homepage: https://www.freedesktop.org/Software/XKeyboardConfig +Description: X Keyboard Extension (XKB) configuration data + This package contains configuration data used by the X Keyboard + Extension (XKB), which allows selection of keyboard layouts when + using a graphical interface. + . + Every X11 vendor provides its own XKB data files, so keyboard layout + designers have to send their layouts to several places. The + xkeyboard-config project has been launched at FreeDesktop in order + to provide a central repository that could be used by all vendors. + +Package: xml-core +Architecture: all +Version: 0.19build1 +Multi-Arch: foreign +Priority: optional +Section: text +Maintainer: Ubuntu Developers +Original-Maintainer: Debian QA Group +Installed-Size: 114 +Depends: sed (>= 4.1.2-8), sgml-base (>= 1.28) +Suggests: debhelper (>= 9.20120909) +Filename: pool/xml-core_0.19build1_all.deb +Size: 20254 +MD5sum: f7c5d41213a1c43c4abed92e50195251 +SHA1: 7c98510f125845aae8964f15edda8e7bc17cd76b +SHA256: 402af4ddb2810ea931609fcfedce54fe9cdfdc95e4b33c48349df8f97fe4b6cb +SHA512: 509bf44089787569f48fc239b52551717bd1a678672d49250a1d7c72475f9d57df5b699930bb0e778e81190b2573920722d4e4660a5f2df015884ebb12dbe13e +Description: XML infrastructure and XML catalog file support + This package creates the XML infrastructure directories and provides + XML catalog file support in compliance with the current Debian XML + Policy draft: + . + * infrastructure directories: + - /etc/xml + - /usr/share/xml/{declaration,entities,misc,schema} + - /usr/local/share/xml/{declaration,entities,misc,schema} + . + * XML catalog schema: OASIS XML Catalog Committee Specification 1.0 + . + * update-xmlcatalog(8): tool for maintaining the root XML catalog + file and the package XML catalog files in the '/etc/xml' directory + as well as local XML catalog files. + . + * dh_installxmlcatalogs(1): debhelper tool for installing local XML + catalog files and registering XML entities in package XML catalog + files and the root XML catalog file (requires debhelper package) + +Package: xorg +Architecture: amd64 +Version: 1:7.7+26ubuntu1 +Priority: optional +Section: x11 +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 20 +Provides: x-window-system, x-window-system-core +Depends: xserver-xorg (>= 1:7.7+26ubuntu1), libgl1, libgl1-mesa-dri, libglu1-mesa, xfonts-base, x11-apps, x11-session-utils, x11-utils, x11-xkb-utils, x11-xserver-utils, xauth, xinit, xfonts-utils, xkb-data, xorg-docs-core, xterm | x-terminal-emulator, xinput +Recommends: xfonts-scalable +Suggests: xorg-docs, xfonts-100dpi, xfonts-75dpi, x11-xfs-utils +Filename: pool/xorg_1%3a7.7+26ubuntu1_amd64.deb +Size: 2876 +MD5sum: 052935859223b140dacdd45ac97ef295 +SHA1: ca02bb74001206b186a271f3f8dcedee68053b07 +SHA256: 234a602609d352a8dd25c048a4f4dcbbf49452283328cf3f07927394dff478ec +SHA512: 1844dc7f2148eea8396c2a3b57f3f04d9a9f8cf573afd597265f1cb5cc03dd782c2daec8aae28c5806b74c375ac867153780ade7f8563475ae44a01d33b0e4c0 +Homepage: https://www.x.org/ +Description: X.Org X Window System + This metapackage provides the components for a standalone + workstation running the X Window System. It provides the X libraries, an X + server, a set of fonts, and a group of basic X clients and utilities. + . + Higher level metapackages, such as those for desktop environments, can + depend on this package and simplify their dependencies. + . + It should be noted that a package providing x-window-manager should also + be installed to ensure a comfortable X experience. + +Package: xorg-docs-core +Architecture: all +Version: 1:1.7.3-1 +Multi-Arch: foreign +Priority: optional +Section: doc +Source: xorg-docs +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 71 +Suggests: xorg-docs +Filename: pool/xorg-docs-core_1%3a1.7.3-1_all.deb +Size: 41278 +MD5sum: 6d3a4b5302f21b830edda2d3bb111b63 +SHA1: c1a890c6a9005e97fc24b7499cc3aea797fe19e3 +SHA256: def68bc547a21de8d5dee36ccfba135b567528ec1ce6ac9d470766919276ac7a +SHA512: eb7239fcd46b4f9b8e3d4b45eca73363c6da40fa175d67642d4f011776c15204953c73707afe430b81a2b6bd1733344c7008686194ec1b7daccc679ffe5b45dd +Description: Core documentation for the X.org X Window System + This package contains core documentation for the X.org X Window + System. This currently includes only a set of manpages which are + standard for the system. + +Package: xorgxrdp +Architecture: amd64 +Version: 1:0.10.2-1build1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Remote Maintainers +Installed-Size: 217 +Provides: xorg-driver-input, xorg-driver-video +Depends: libc6 (>= 2.38), libepoxy0 (>= 1.0), xorg-input-abi-24, xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Recommends: xorg +Filename: pool/xorgxrdp_1%3a0.10.2-1build1_amd64.deb +Size: 69762 +MD5sum: 3419d19c703f32f7f125209d41924ae3 +SHA1: 83ec494863ce4d420bdb5b0380c0efffc82c7e8f +SHA256: 137792c2204e44fcea1c80742d3804af098236677c6b586fff6c938894f289d4 +SHA512: 27b027b13940bf9a98c0572f8946c3a511d8a5ce49461516bbe8cd38c62b1bb11b682d19f447299782079bdeb9b3279df8ab65156dab65356a677fca283b34ca +Homepage: http://xrdp.sourceforge.net +Description: Remote Desktop Protocol (RDP) modules for X.org + xorgxrdp is a set of drivers (screen device, keyboard, and mouse) + for X.org enabling use through an RDP session with xrdp. For full + operation, most standard X11 fonts and tools need to be installed; + the Recommended xorg metapackage is a superset of what’s actually + needed but will do. + +Package: xrdp +Architecture: amd64 +Version: 0.10.1-4.1 +Priority: optional +Section: net +Maintainer: Ubuntu Developers +Original-Maintainer: Debian Remote Maintainers +Installed-Size: 4478 +Pre-Depends: init-system-helpers (>= 1.54~) +Depends: adduser, sysvinit-utils (>= 3.06-4), ssl-cert, libc6 (>= 2.38), libjpeg8 (>= 8c), libopus0 (>= 1.1), libpam0g (>= 0.99.7.1), libssl3t64 (>= 3.0.0), libx11-6, libxfixes3, libxrandr2 (>= 2:1.2.0) +Recommends: xorgxrdp +Filename: pool/xrdp_0.10.1-4.1_amd64.deb +Size: 668968 +MD5sum: 3a9e2fdcc50a45ac1b80e2bb87ecc281 +SHA1: 2e84958c65180720e03e00da5a251b054a0a87ab +SHA256: c4b3688b0d839369f0b3c8faa4940597c5aa51d1573ab1d4ce63ccb53add82be +SHA512: fb5f5c4fdc6cf6fbaacbe0ae3efd5a9cc288cdc2b520c2c2bfafb771d31c86e8ed4b1ffe257586d54cf1d4049f9669b013e952a4080e48c1bda608457811e08c +Homepage: https://www.xrdp.org/ +Description: Remote Desktop Protocol (RDP) server + xrdp offers a graphical login to a remote client using + RDP (the Remote Desktop Protocol). xrdp can connect to + a locally created X.org session with the xorgxrdp drivers, + to a VNC X11 server, and forward to another RDP server. + . + xrdp accepts connections from freerdp, rdesktop, and the + built-in terminal server / remote desktop clients of + Microsoft Windows operating systems. + In the xorgxrdp (which replaces X11RDP) and VNC modes, + it provides a fully functional Linux terminal server, + offering an X-Window desktop to the user. In the RDP + or VNC forwarding mode, any sort of desktop can be used. + +Package: xserver-common +Architecture: all +Version: 2:21.1.22-1ubuntu1 +Multi-Arch: foreign +Priority: optional +Section: x11 +Source: xorg-server +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 146 +Depends: x11-common, xkb-data, x11-xkb-utils +Recommends: xfonts-base, xauth +Replaces: xserver-xorg-core (<< 2:1.5.2) +Filename: pool/xserver-common_2%3a21.1.22-1ubuntu1_all.deb +Size: 29680 +MD5sum: 2f8ea463d1687bd998f862e89e16be19 +SHA1: 07273dc456c30280942fd77bb85137735fce7cc7 +SHA256: 9865ebf6555ba9d7fae0bd3b1e66610e3404aa66495cb00bdd1f1d162cc14483 +SHA512: 020f59ba96e1dc9cce6403de774ec9f5a0b7ec09271043879fe1b63b8cffa6697d92a93dea556d22c4f6c3f91c0f0b3681734b0c39b8434339dc92e10c253b7f +Homepage: https://www.x.org/ +Description: common files used by various X servers + This package provides files necessary for all X.Org based X servers. + +Package: xserver-xorg +Architecture: amd64 +Version: 1:7.7+26ubuntu1 +Priority: optional +Section: x11 +Source: xorg +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 331 +Provides: xserver +Depends: xserver-xorg-core, xserver-xorg-input-all | xorg-driver-input, xkb-data, x11-xkb-utils, python3-apport +Recommends: libgl1-mesa-dri, mesa-vulkan-drivers, xserver-xorg-legacy, xserver-xorg-video-all +Filename: pool/xserver-xorg_1%3a7.7+26ubuntu1_amd64.deb +Size: 64454 +MD5sum: 4a47a82bca6fdf25966dd45cb52e1491 +SHA1: d5d50e3179f31e09375b27d25a4a3337baeb8dac +SHA256: 7f7b902f1560e4e71e24de1d80c39ed7f97558a5f805cd8b7c456f53470d2d9c +SHA512: 54901a7396b4acc0d315bd9fddcad31e32d32d4984a6f13ba2038808b212aad333fcc06682cd0b43a14233af3c04d0f8520860dc533d80bd374bbebacfe62c68 +Homepage: https://www.x.org/ +Description: X.Org X server + This package depends on the full suite of the server and drivers for the + X.Org X server. It does not provide the actual server itself. + +Package: xserver-xorg-core +Architecture: amd64 +Version: 2:21.1.22-1ubuntu1 +Priority: optional +Section: x11 +Source: xorg-server +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 3978 +Provides: xorg-input-abi-24, xorg-video-abi-25, xserver-xorg-video-modesetting +Depends: xserver-common (>= 2:21.1.22-1ubuntu1), keyboard-configuration, udev (>= 149), libegl1, libaudit1 (>= 1:2.2.1), libc6 (>= 2.42), libdbus-1-3 (>= 1.10), libdrm2 (>= 2.4.107-5~), libepoxy0 (>= 1.5.4), libgbm1 (>= 17.1.0~rc2), libgl1, libnettle8t64, libpciaccess0 (>= 0.12.902), libpixman-1-0 (>= 0.30.0), libselinux1 (>= 3.1~), libsystemd0, libudev1 (>= 183), libunwind8, libxau6 (>= 1:1.0.11), libxcvt0 (>= 0.1.0), libxdmcp6 (>= 1:1.1.5), libxfont2 (>= 1:2.0.1), libxshmfence1 +Recommends: libgl1-mesa-dri (>= 7.10.2-4), default-logind | logind, xcvt +Suggests: xfonts-100dpi | xfonts-75dpi, xfonts-scalable +Conflicts: xserver-xorg-input-evtouch, xserver-xorg-video-modesetting +Breaks: libgl1-mesa-dri (<< 18.0.5), systemd (<< 226-4~), xserver-xorg (<< 1:7.7+10~) +Replaces: xserver-xorg (<< 1:7.7+10~), xserver-xorg-video-modesetting +Filename: pool/xserver-xorg-core_2%3a21.1.22-1ubuntu1_amd64.deb +Size: 1524806 +MD5sum: e89d140aac8c9686a89a7c072c368291 +SHA1: 5b66d6c11f0eddef4194385fc8eec00c139f7ca6 +SHA256: d57a180707a4ef7ced547e2fd7c254c05212d389a5a31566fb67f2dd576f2a5c +SHA512: 75abf53abd933e2ee604dfbf5f71e8ef8d5612c4fac8161da32593ac4d1ecc61f64add91f16dcd6efbe5f2514ae09df7c210e588de549d62037472559f02d6d9 +Homepage: https://www.x.org/ +Description: Xorg X server - core server + The Xorg X server is an X server for several architectures and operating + systems, which is derived from the XFree86 4.x series of X servers. + . + The Xorg server supports most modern graphics hardware from most vendors, + and supersedes all XFree86 X servers. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xserver module. + +Package: xserver-xorg-legacy +Architecture: amd64 +Version: 2:21.1.22-1ubuntu1 +Priority: optional +Section: x11 +Source: xorg-server +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 177 +Depends: xserver-common (>= 2:21.1.22-1ubuntu1), libc6 (>= 2.34), debconf (>= 0.5) | debconf-2.0 +Breaks: x11-common (<< 1:7.7+10~), xserver-xorg-core (<< 2:1.17.2-3~) +Replaces: x11-common (<< 1:7.7+10~), xserver-xorg-core (<< 2:1.17.2-3~) +Filename: pool/xserver-xorg-legacy_2%3a21.1.22-1ubuntu1_amd64.deb +Size: 36998 +MD5sum: b72bfa65db7aef673c80dec0e8abaa5b +SHA1: 6b430b30feec8be006d2002b7e68fcd7925288a6 +SHA256: 9d2e314e8e4dfb847f4939db10fed5bc160e18a3352fe0fc4f4491a6b9aca0de +SHA512: 8b7e259a5c48a90d1046283449cc58104adef1167b5847e65f1dd0b1b94feda0a1ec690e15cafe996d41ec17d13bca485d69b4102351fda0c8e83f045785edba +Homepage: https://www.x.org/ +Description: setuid root Xorg server wrapper + This package provides a wrapper for the Xorg X server, which is + necessary for legacy drivers and non-Linux kernels. + +Package: xserver-xorg-video-all +Architecture: amd64 +Version: 1:7.7+26ubuntu1 +Priority: optional +Section: x11 +Source: xorg +Maintainer: Ubuntu X-SWAT +Original-Maintainer: Debian X Strike Force +Installed-Size: 14 +Depends: xserver-xorg-video-amdgpu, xserver-xorg-video-ati, xserver-xorg-video-fbdev, xserver-xorg-video-nouveau, xserver-xorg-video-vesa +Recommends: xserver-xorg-video-intel, xserver-xorg-video-qxl +Conflicts: xserver-xorg-driver-all +Replaces: xserver-xorg-driver-all +Filename: pool/xserver-xorg-video-all_1%3a7.7+26ubuntu1_amd64.deb +Size: 4764 +MD5sum: c260bd7919d6c84b6def18ceaff70d1e +SHA1: 41fa8200a4090ad9fc920bad3cc2116bae1a8f8e +SHA256: 157ee5784159b544379f2e4b4b7caed7baf520dc990777c7d975e69606f6be77 +SHA512: e878440d895365504c45be210606cfc1373abc5daa7cf8a6af0c64f4cba046c5b10cc498cd6003760047aad12079555937fc62ae44ba11dfbb09d76956ff573d +Homepage: https://www.x.org/ +Description: X.Org X server -- output driver metapackage + This package depends on the full suite of output drivers for the X.Org X server + (Xorg). It does not provide any drivers itself, and may be removed if you wish + to only have certain drivers installed. + +Package: xserver-xorg-video-amdgpu +Architecture: amd64 +Version: 25.0.0-1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 188 +Provides: xorg-driver-video +Depends: libc6 (>= 2.38), libdrm-amdgpu1 (>= 2.4.89), libdrm2 (>= 2.4.89), libgbm1 (>= 8.1~0), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Suggests: firmware-amd-graphics +Filename: pool/xserver-xorg-video-amdgpu_25.0.0-1_amd64.deb +Size: 70432 +MD5sum: 38893c79a0afda6b3db00a8ac0a796b9 +SHA1: 565cfaff748f1e05b9bcb6537f508c54a12d9a26 +SHA256: 2ad02b29948e6611e6a0a68952a0d94fdc9687ca7f5fe125e17fc3cc11b7bc6a +SHA512: 8b291cfa95504bbd12c9afa0e71557874b0028a3139cbbb95f1dfac66329d2c92c4718bda48c51679d98fca1d2685d8f0550f1336052e60b7759c3b7aee52e0b +Description: X.Org X server -- AMDGPU display driver + This package provides the 'amdgpu' driver for the AMD Radeon cards. The + following chip families should be supported: Bonaire, Hawaii, Kaveri, Kabini + Mullins, Iceland, Tonga, Carrizo, Fiji, Stoney. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-amdgpu driver module. + +Package: xserver-xorg-video-ati +Architecture: amd64 +Version: 1:22.0.0-1build2 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 38 +Provides: xorg-driver-video +Depends: libc6 (>= 2.4), libpciaccess0, xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1), xserver-xorg-video-radeon +Suggests: xserver-xorg-video-r128, xserver-xorg-video-mach64 +Filename: pool/xserver-xorg-video-ati_1%3a22.0.0-1build2_amd64.deb +Size: 6714 +MD5sum: 91cc9790fd90989b66f3d3c0e97dec7f +SHA1: 98e854be8213d50e7463eee0ac508197267bd9f8 +SHA256: 7123a3774e26ec2d312eeccc49502b32cf8d9081265537e47deea857db754074 +SHA512: 059471ff9520bef9899f1bccfdf27327b6dbbd51de408c78bad06910df1a9b1fe9dd2e19ff19ec570dc46bd75182e94ac94467dc6b1d9c449ded43c83d71c78d +Homepage: https://wiki.freedesktop.org/xorg/RadeonFeature/ +Description: X.Org X server -- AMD/ATI display driver wrapper + This package provides the 'ati' driver for the AMD/ATI Mach64, Rage128, + Radeon, FireGL, FireMV, FirePro and FireStream series. This driver is + actually a wrapper that loads one of the 'mach64', 'r128' or 'radeon' + sub-drivers depending on the hardware. + These sub-drivers are brought through package dependencies. + . + Users of Rage, Mach, or Radeon boards may remove this package only if + they use Driver "r128", "mach64", or "radeon" in /etc/X11/xorg.conf + instead of relying on autodetection. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-ati driver module. + +Package: xserver-xorg-video-fbdev +Architecture: amd64 +Version: 1:0.5.0-2build3 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 52 +Provides: xorg-driver-video +Depends: libc6 (>= 2.4), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Filename: pool/xserver-xorg-video-fbdev_1%3a0.5.0-2build3_amd64.deb +Size: 12668 +MD5sum: b27160108fb19023666c0ba30ae73771 +SHA1: 471d377dfb0cb64ae9c64b225c60000a4ae9aa07 +SHA256: cec820e983f2b710779c8d7369fd97dff3454b535b0b7187d15f414a767098aa +SHA512: 1b071832d1c4b517526696de11aeb98f665772a3613929a878c5b95065a433de0bc49b6396e38d29d1bd6108913a91b4b0eb3d800ba6301548d3581922fddfbe +Description: X.Org X server -- fbdev display driver + This package provides the driver for the Linux framebuffer device (aka + 'fbdev'). + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-fbdev driver module. + +Package: xserver-xorg-video-intel +Architecture: amd64 +Version: 2:2.99.917+git20210115-1build2 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 3241 +Provides: xorg-driver-video +Depends: libc6 (>= 2.38), libdrm-intel1 (>= 2.4.38), libdrm2 (>= 2.4.62), libpciaccess0 (>= 0.8.0+git20071002), libpixman-1-0 (>= 0.30.0), libudev1 (>= 183), libx11-6, libx11-xcb1, libxcb-dri2-0, libxcb-util1 (>= 0.4.0), libxcb1, libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxinerama1 (>= 2:1.1.4), libxrandr2 (>= 2:1.2.99.2), libxrender1 (>= 1:0.9.12), libxss1, libxtst6 (>= 2:1.2.5), libxvmc1 (>= 2:1.0.12), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Filename: pool/xserver-xorg-video-intel_2%3a2.99.917+git20210115-1build2_amd64.deb +Size: 791290 +MD5sum: 91395c80f88017336896a0fcd5337da7 +SHA1: 06215f7e2977fcf7ad5c07c18864fd369552682b +SHA256: b71fbe896f54be1ea4bc9e0a1ba7e87d62d5cd71e1605de96997281b0404f430 +SHA512: 4fb9d2dcf4d9d24d53164385f2c4562a35905dbfe1ff8ea3dc3c8d64a565e9c1dd9e19d9fe35b670d53dfb1bb9a50099233fbf93cc7b7df8610e6c6f6cc966d7 +Homepage: https://www.x.org/ +Description: X.Org X server -- Intel i8xx, i9xx display driver + This package provides the driver for the Intel i8xx and i9xx family + of chipsets, including i810, i815, i830, i845, i855, i865, i915, i945 + and i965 series chips. + . + This package also provides XvMC (XVideo Motion Compensation) drivers + for i810/i815 and i9xx and newer chipsets. + . + This package is built from the X.org xf86-video-intel driver module. + . + The use of this driver is discouraged if your GPU is new enough (ca. + 2007 and newer). You can try uninstalling this driver and let the + server use its built-in modesetting driver instead. + +Package: xserver-xorg-video-nouveau +Architecture: amd64 +Version: 1:1.0.18-1build1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 238 +Provides: xorg-driver-video +Depends: libc6 (>= 2.38), libdrm-nouveau2 (>= 2.4.38), libdrm2 (>= 2.4.61), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Recommends: libgl1-mesa-dri +Suggests: firmware-misc-nonfree +Filename: pool/xserver-xorg-video-nouveau_1%3a1.0.18-1build1_amd64.deb +Size: 92520 +MD5sum: 8af73fb92c708f10f25474d45eedc6ae +SHA1: 9d7583322bfcbd1870ace3c565673d8bfa11d80b +SHA256: e16df74aa85092ba17fbcfc307bbe0fab1c20f134b8a116bb3b2108801c6c31b +SHA512: 8f6a406d1722e370de97fd04c829ad11407f0d630b2490630a0e6acac683725edfdc2f58cc2de9e57436dffe8a656ef0f8997e352d19506368d040f3d5443928 +Homepage: https://nouveau.freedesktop.org/ +Description: X.Org X server -- Nouveau display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + provides support for NVIDIA Riva, TNT, GeForce, and Quadro cards. + . + This package provides 2D support including EXA acceleration, Xv and + RandR. 3D functionality is provided by the libgl1-mesa-dri package. + . + This package is built from the FreeDesktop.org xf86-video-nouveau driver. + +Package: xserver-xorg-video-qxl +Architecture: amd64 +Version: 0.1.6-1.1build1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 196 +Provides: xorg-driver-video +Depends: libc6 (>= 2.38), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Filename: pool/xserver-xorg-video-qxl_0.1.6-1.1build1_amd64.deb +Size: 82848 +MD5sum: 0c8d092a8bc4ae27d7b0bc201539b14b +SHA1: 9ede94f25abd4024690fb67ba8c294dcdf29622e +SHA256: af1a270dbac53f44598d43fa2303c82f55daa71b1c7a8078ecf2b13311ab8137 +SHA512: 108d5801434ed1e4c586ae562f43efa4828bf4ec05526a0b051960b09da87928d41f91063b91de0a867c05b80c9a61a27429fa9d5007a8ae5ebaa2ef7f2f0add +Homepage: https://www.spice-space.org/ +Description: X.Org X server -- QXL display driver + This package provides the driver for QXL video device, i.e. if Linux is + running inside a RedHat Enterprise Virtualization (RHEV) environment, or + other SPICE-compatible KVM/Qemu emulator. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-qxl driver module. + +Package: xserver-xorg-video-radeon +Architecture: amd64 +Version: 1:22.0.0-1build2 +Priority: optional +Section: x11 +Source: xserver-xorg-video-ati +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 517 +Provides: xorg-driver-video +Depends: libc6 (>= 2.38), libdrm-radeon1 (>= 2.4.89), libgbm1 (>= 8.1~0), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Suggests: firmware-amd-graphics +Filename: pool/xserver-xorg-video-radeon_1%3a22.0.0-1build2_amd64.deb +Size: 160694 +MD5sum: 42d55482322ebacfcb832b2bb952dab3 +SHA1: faa152593927b99ff8034ee2cc19389941e9376a +SHA256: 93969e5b643555c5b19fe64a1f0611adbcb178353013bef75cdb47b945045005 +SHA512: 2bf95127dad0457b54df0238766a632428f7ecd66c5b6b90b97b03eabd108e067ca0b02579c4552e5632b3f7b61431de491f19b61d89754cc270bf2830cc151c +Homepage: https://wiki.freedesktop.org/xorg/RadeonFeature/ +Description: X.Org X server -- AMD/ATI Radeon display driver + This package provides the 'radeon' driver for the AMD/ATI cards. The + following chips should be supported: R100, RV100, RS100, RV200, RS200, + RS250, R200, RV250, RV280, RS300, RS350, RS400/RS480, R300, R350, R360, + RV350, RV360, RV370, RV380, RV410, R420, R423/R430, R480/R481, + RV505/RV515/RV516/RV550, R520, RV530/RV560, RV570/R580, + RS600/RS690/RS740, R600, RV610/RV630, RV620/RV635, RV670, RS780/RS880, + RV710/RV730, RV740/RV770/RV790, CEDAR, REDWOOD, JUNIPER, CYPRESS, + HEMLOCK, PALM, SUMO/SUMO2, BARTS, TURKS, CAICOS, CAYMAN, ARUBA, TAHITI, + PITCAIRN, VERDE, OLAND, HAINAN, BONAIRE, KABINI, MULLINS, KAVERI, HAWAII. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-ati driver module. + +Package: xserver-xorg-video-vesa +Architecture: amd64 +Version: 1:2.6.0-2build1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 51 +Provides: xorg-driver-video +Depends: libc6 (>= 2.14), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) +Filename: pool/xserver-xorg-video-vesa_1%3a2.6.0-2build1_amd64.deb +Size: 15898 +MD5sum: 1480dafa2ea9554e5b67b029b2e63dd0 +SHA1: 60effbc6f4bf5f2749140b3e12a3f945134a80ea +SHA256: fe02831a5f755ebb54237d2a1f9d6b54465541ac987a35a44fa167e4b489e1ae +SHA512: c6ae12d561fbe98336268c80c0fe8a68cc04c81dde54ab8d206478b0c0c96fb9df85d248647f392e0733a676be22491af5ad10344748ca8bc65e0663460c3b3b +Description: X.Org X server -- VESA display driver + This driver for the X.Org X server (see xserver-xorg for a further description) + uses the standard VESA interface provided on all video cards, but runs + unaccelerated. This driver is not recommended for use unless you have a + problem with the normal driver for your card, because it will perform very + badly. + . + More information about X.Org can be found at: + + . + This package is built from the X.org xf86-video-vesa driver module. + +Package: xwayland +Architecture: amd64 +Version: 2:24.1.10-1 +Priority: optional +Section: x11 +Maintainer: Ubuntu Developers +Original-Maintainer: Debian X Strike Force +Installed-Size: 2467 +Depends: xserver-common, libc6 (>= 2.43), libdecor-0-0 (>= 0.1.0), libdrm2 (>= 2.4.116), libei1 (>= 1.0.0), libepoxy0 (>= 1.5.2), libgbm1 (>= 21.3.0~rc1), libgcrypt20 (>= 1.12.0), libgl1, liboeffis1 (>= 1.0.0), libpixman-1-0 (>= 0.30.0), libtirpc3t64 (>= 1.0.2), libwayland-client0 (>= 1.20.0), libxau6 (>= 1:1.0.11), libxcvt0 (>= 0.1.0), libxdmcp6 (>= 1:1.1.5), libxfont2 (>= 1:2.0.1), libxshmfence1 +Filename: pool/xwayland_2%3a24.1.10-1_amd64.deb +Size: 1006600 +MD5sum: 2b4412c2b1dcb0199c56bca82820ff64 +SHA1: af234bcb3b4ac9fa7a14ad44c9a771f72d57d293 +SHA256: f620802e59cb10a4d66e0ed2abf16ad425be1ab2b7a3deef1c2b367647c2c7a5 +SHA512: 05fa09e1bcd50e03ad1eb715ccc876ce8bb75ee57e8922e351fd4e8785642a95756e56e7dc86c14cca6fabb796becd3a9fe439beac29b5c084a4b3a57a6e93c8 +Homepage: https://www.x.org/ +Description: X server for running X clients under Wayland + This package provides an X server running on top of wayland, using wayland + input devices for input and forwarding either the root window or individual + top-level windows as wayland surfaces. + +Package: xz-utils +Architecture: amd64 +Version: 5.8.3-1 +Multi-Arch: foreign +Priority: standard +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Sebastian Andrzej Siewior +Installed-Size: 976 +Provides: lzma +Depends: libc6 (>= 2.34), liblzma5 (>= 5.6.2) +Conflicts: lzma (<< 9.22-1), xz-lzma +Breaks: lzip (<< 1.8~rc2), manpages-de (<< 4.17.0-2~bpo11+1), manpages-fr (<< 4.17.0-2~bpo11+1), pristine-tar (<< 1.50+nmu1) +Replaces: lzip (<< 1.8~rc2), manpages-de (<< 4.17.0-2~bpo11+1), manpages-fr (<< 4.17.0-2~bpo11+1), xz-lzma +Filename: pool/xz-utils_5.8.3-1_amd64.deb +Size: 405624 +MD5sum: 4a58933ea1bc7973aebda47343c39534 +SHA1: 5f5878537e5ca15a3e4d9cdf7066f211109616b9 +SHA256: 5a8cddf80d9f5aeee1f39315158cfcc0f3e2c7573f9d6236fc6b85537400a937 +SHA512: e79d985ef40f3e34c291e7ea717af8d8830a3891e5315eeb2f9095585862cd144e5593631312a86fd45429b1bb6772deb9c09793c7a023221aafdf17b77ef618 +Homepage: https://tukaani.org/xz/ +Description: XZ-format compression utilities + XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm + compression format, which provides memory-hungry but powerful + compression (often better than bzip2) and fast, easy decompression. + . + This package provides the command line tools for working with XZ + compression, including xz, unxz, xzcat, xzgrep, and so on. They can + also handle the older LZMA format, and if invoked via appropriate + symlinks will emulate the behavior of the commands in the lzma + package. + . + The XZ format is similar to the older LZMA format but includes some + improvements for general use: + . + * 'file' magic for detecting XZ files; + * crc64 data integrity check; + * limited random-access reading support; + * improved support for multithreading (not used in xz-utils); + * support for flushing the encoder. + +Package: yaru-theme-gnome-shell +Architecture: all +Version: 26.04.5.1ubuntu +Priority: optional +Section: misc +Source: yaru-theme +Maintainer: Ubuntu Desktop Team +Installed-Size: 2422 +Breaks: gnome-shell (<< 49~) +Filename: pool/yaru-theme-gnome-shell_26.04.5.1ubuntu_all.deb +Size: 73162 +MD5sum: 9036d83bcfa51adf41cbd582a946fbdd +SHA1: 8314c70a31ee57064fbb59576eb046575846a52d +SHA256: 55131b0a1fd8408cbd6bf24fc27bce8e33071cc4894c215b87e5c3f16c06f4b8 +SHA512: d6653a71b6101ff556bd937177939a03a5b0863cc996f8b9854a4c603abe7a9e7d1050a0fc4d7e30f5be13446677e8c3e63130500012d70809836c3ba0d95d70 +Homepage: https://community.ubuntu.com/c/desktop/theme-refresh +Description: Yaru GNOME Shell desktop theme from the Ubuntu Community + This is the theme, better than a burrito, that is shaped by the community + on the Ubuntu discourse. + . + This package contains the GNOME Shell theme part + . + If you want to follow development, more information here: + https://community.ubuntu.com/c/desktop/theme-refresh. + +Package: yaru-theme-gtk +Architecture: all +Version: 26.04.5.1ubuntu +Priority: optional +Section: misc +Source: yaru-theme +Maintainer: Ubuntu Desktop Team +Installed-Size: 30627 +Depends: user-session-migration, gnome-themes-extra, gtk2-engines-pixbuf, gtk2-engines-murrine, libglib2.0-bin +Filename: pool/yaru-theme-gtk_26.04.5.1ubuntu_all.deb +Size: 1841544 +MD5sum: ed11f3c5f66f76d388929b49067040f6 +SHA1: 6baad149e166788ddd00b2b2b4af6fbca21cf0e7 +SHA256: e66576554ab66d6c6bcd3a86ce1ab9347c861907f81fd89df927bd1c326a7225 +SHA512: a8ab4aa665beb58589d18798fbefb5692cf55fd055beba8beb8592f5abc3fd4cf38ebae51c9fd5271143edc0c1aaf105343f998d183627ae32d3e1556da2da4e +Homepage: https://community.ubuntu.com/c/desktop/theme-refresh +Description: Yaru GTK theme from the Ubuntu Community + This is the theme, better than a burrito, that is shaped by the community + on the Ubuntu discourse. + . + This package contains the GTK+ 2, 3 and GTK 4 theme parts + . + If you want to follow development, more information here: + https://community.ubuntu.com/c/desktop/theme-refresh. + +Package: yaru-theme-icon +Architecture: all +Version: 26.04.5.1ubuntu +Priority: optional +Section: misc +Source: yaru-theme +Maintainer: Ubuntu Desktop Team +Installed-Size: 80287 +Suggests: humanity-icon-theme +Breaks: gnome-shell-extension-ubuntu-dock (<< 90~) +Filename: pool/yaru-theme-icon_26.04.5.1ubuntu_all.deb +Size: 34011480 +MD5sum: 45f1e2464aadedce2e0ea65d8a2ad3d1 +SHA1: 619ff78d4ae63aa1c5e7c821948758099ce9e696 +SHA256: d0269daa895d85a72948995497a0848ab3bd6138df59b52c21a814ccf4c7b0a6 +SHA512: aa4a1a82ae8fdf8c2abfa1dd45eced38efc97095a07060fe957a0a48540536165eb7eb1051d5ff9e946da92ff1776480cbf0d33c3ed6c948c28e6a1546ae767e +Homepage: https://community.ubuntu.com/c/desktop/theme-refresh +Description: Yaru icon theme from the Ubuntu Community + This is the theme, better than a burrito, that is shaped by the community + on the Ubuntu discourse. + . + This package contains the icon theme + . + If you want to follow development, more information here: + https://community.ubuntu.com/c/desktop/theme-refresh. + +Package: yaru-theme-sound +Architecture: all +Version: 26.04.5.1ubuntu +Priority: optional +Section: misc +Source: yaru-theme +Maintainer: Ubuntu Desktop Team +Installed-Size: 1347 +Filename: pool/yaru-theme-sound_26.04.5.1ubuntu_all.deb +Size: 1059412 +MD5sum: 9cc7a34ea8a0eb9c2273caa34c0483e3 +SHA1: ccd730382c87139e0b1858bb7f1e4fc0e4a1604f +SHA256: c322b7f3694822900080ab363731b698002a674dc24d8175da1b19c9b478b47c +SHA512: 62308840fad18ad40dd481fb985335ae48a79fc663db2c8c5c1650eda6edcbdd642160f9f703b4ad9403795048645b7e363bbd5a95ac4965ac7709b44a0ffe81 +Homepage: https://community.ubuntu.com/c/desktop/theme-refresh +Description: Yaru sound theme from the Ubuntu Community + This is the theme, better than a burrito, that is shaped by the community + on the Ubuntu discourse. + . + This package contains the sound theme + . + If you want to follow development, more information here: + https://community.ubuntu.com/c/desktop/theme-refresh. + +Package: yelp +Architecture: amd64 +Version: 49.0-5ubuntu0.1 +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 2140 +Depends: libyelp-1-0 (= 49.0-5ubuntu0.1), man-db (>= 2.5.1-1), python3:any, python3-distro, yelp-xsl (>= 42.3~), dconf-gsettings-backend | gsettings-backend, user-session-migration, libadwaita-1-0 (>= 1.6.0), libc6 (>= 2.34), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.16.0), libwebkitgtk-6.0-4 (>= 2.5.3) +Recommends: docbook-xml +Filename: pool/yelp_49.0-5ubuntu0.1_amd64.deb +Size: 558690 +MD5sum: de8541f868072d7ebbd8ff299d7a0005 +SHA1: 12cd759dfdae0b9aee1e959699bce4585e85b985 +SHA256: f22123289c4b604027300c161f246058f27cdfcd5dc3565201d8e5c683499749 +SHA512: 3f0e30a3fe8626a9968da29de87fe9c505e38bcf9274d72c2a01890597a547b339d690f41abab003223c9430fb6e454095a3cb888bfb55f5db8d6402d8ab38b8 +Homepage: https://apps.gnome.org/Yelp/ +Description: Help browser for GNOME + Yelp is the help browser for the GNOME desktop. Yelp provides a simple + graphical interface for viewing DocBook, Mallard, HTML, man, and info + formatted documentation. + +Package: yelp-xsl +Architecture: all +Version: 49.0-2 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1486 +Filename: pool/yelp-xsl_49.0-2_all.deb +Size: 212538 +MD5sum: e9f42f8971c13ef4fd0c076376f39e28 +SHA1: e70a446cb423b235de178572272d56d7ce834825 +SHA256: 8d0f46b49a0b2a8e947a02f62bd1691efac33796690b7afef2f2559d29941275 +SHA512: fdcad07653cc3f5880a2fd991d6310a8c5db3cfde32da294bfdc43a499a1f7fff85b12424680fc302e2134eac449e4d2cc0786a1b099e4b26312c65c5c090e79 +Homepage: https://gitlab.gnome.org/GNOME/yelp-xsl +Description: XSL stylesheets for the yelp help browser + Yelp-xsl contains XSL stylesheets that are used by the yelp help browser + to format DocBook and Mallard documents. + +Package: zenity +Architecture: amd64 +Version: 4.2.1-1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 198 +Depends: zenity-common (>= 4.2.1-1), libadwaita-1-0 (>= 1.2~alpha), libc6 (>= 2.38), libglib2.0-0t64 (>= 2.80.0), libgtk-4-1 (>= 4.0.0), libpango-1.0-0 (>= 1.14.0) +Filename: pool/zenity_4.2.1-1_amd64.deb +Size: 77564 +MD5sum: 076c493bdf2abc86f748a4a771c5d205 +SHA1: 6c9892ccf7f942379dfc9fa33c9f00f4da122f0f +SHA256: e292234fe2a5075364d93dad9cdaf12c9499f5b088d08b09cf62f8da8cf908c5 +SHA512: b0405fe178644805b5090ac7518d9cbaf57073cae6728a88b300923c5c7a0a22fd864645d13da24ff571d8ded0029232cf543d88f0d871ba8a60e65dd9b5f9f9 +Homepage: https://wiki.gnome.org/Projects/Zenity +Description: Display graphical dialog boxes from shell scripts + Zenity allows you to display GTK+ dialogs from shell scripts; it is a + rewrite of the `gdialog' command from GNOME 1. + . + Zenity includes a gdialog wrapper script so that it can be used with + legacy scripts. + +Package: zenity-common +Architecture: all +Version: 4.2.1-1 +Multi-Arch: foreign +Priority: optional +Section: gnome +Source: zenity +Maintainer: Ubuntu Developers +Original-Maintainer: Debian GNOME Maintainers +Installed-Size: 1480 +Filename: pool/zenity-common_4.2.1-1_all.deb +Size: 261490 +MD5sum: ee20c7e7cfa0a444d551e37e23cc43cd +SHA1: 896c998910bedac2074ad7d3057b44a0738e137c +SHA256: 92701ab2028632c635c1757b3980ea9cf6d6110d7d84bd527e5e6a29b5e6009d +SHA512: e9c67092b6e17a92ab4ae9523f4173978f0b25de64b16ab45f0d3464047637d16af052cad425a88805d80d5fd71d71339a7935135fecd96f047b61966a4c6750 +Homepage: https://wiki.gnome.org/Projects/Zenity +Description: Display graphical dialog boxes from shell scripts (common files) + Zenity allows you to display GTK+ dialogs from shell scripts; it is a + rewrite of the `gdialog' command from GNOME 1. + . + Zenity includes a gdialog wrapper script so that it can be used with + legacy scripts. + . + This package contains architecture independent files. + +Package: zip +Architecture: amd64 +Version: 3.0-15ubuntu3 +Multi-Arch: foreign +Priority: optional +Section: utils +Maintainer: Ubuntu Developers +Original-Maintainer: Santiago Vila +Installed-Size: 549 +Depends: libbz2-1.0, libc6 (>= 2.38) +Recommends: unzip +Filename: pool/zip_3.0-15ubuntu3_amd64.deb +Size: 174984 +MD5sum: c60a7fc7c9142590af7ac85228612a7c +SHA1: dee50a4e90089af73e645a11910c8184e77f2fa7 +SHA256: ef8e6376ecdaa82f4f7fbd1f6fb8cbf7818a1305c8e7b015c1aa9f4bdc77d12a +SHA512: e532213ecddad4377532f37e7d3ac669ed3b148e367e549d9280aceb3e31dd6df7076a2ecd314e573da8c3bdda880289fcdf2cd54e016d8faf84ac185d4268d9 +Homepage: https://infozip.sourceforge.net/Zip.html +Description: Archiver for .zip files + This is InfoZIP's zip program. It produces files that are fully + compatible with the popular PKZIP program; however, the command line + options are not identical. In other words, the end result is the same, + but the methods differ. :-) + . + This version supports encryption. + +Package: zstd +Architecture: amd64 +Version: 1.5.7+dfsg-3 +Multi-Arch: foreign +Priority: optional +Section: utils +Source: libzstd +Maintainer: Ubuntu Developers +Original-Maintainer: RPM packaging team +Installed-Size: 1924 +Depends: libc6 (>= 2.38), libgcc-s1 (>= 3.3.1), liblz4-1 (>= 1.8.0), liblzma5 (>= 5.1.1alpha+20120614), libstdc++6 (>= 14), zlib1g (>= 1:1.1.4) +Filename: pool/zstd_1.5.7+dfsg-3_amd64.deb +Size: 672078 +MD5sum: 625daf94a926dddbe2a87fcb914156ed +SHA1: 9a3174ba4cca322f15ea6dffbbde85a978d06d2d +SHA256: 032bf3699c23d653caeadf1d97521af9cc09401035164637e64ad79997947d6a +SHA512: 2ce8b763a565555f15721774a10b79fc41438e1b43ea2c294bf147990341e211cf75797fbbdd44d0f802df0d660c9c625a12729b85f3bc3d3e034435c9a8796e +Homepage: https://github.com/facebook/zstd +Description: fast lossless compression algorithm -- CLI tool + Zstd, short for Zstandard, is a fast lossless compression algorithm, targeting + real-time compression scenarios at zlib-level compression ratio. + . + This package contains the CLI program implementing zstd. +Commands: zstd +
    + + +package version architecture sha256 source +3cpio 0.14.0-1ubuntu1 amd64 f5c5134cfde8015c24a511b1f3087af7387280ddf009e0d83e92676bf8b9c4ac 3cpio_0.14.0-1ubuntu1_amd64.deb +accountsservice 23.13.9-8ubuntu5.2 amd64 f4aa92d98b523787aab1582487b7099448cd01ad56cabdbb596f3ea20f09d072 accountsservice_23.13.9-8ubuntu5.2_amd64.deb +acl 2.3.2-2 amd64 74bb8008be63c1deb1cd9e9ebde8189a762962a6cc4e0a36d4943380ed46a15f acl_2.3.2-2_amd64.deb +adwaita-icon-theme 50.0-1 all db9f11a94f993de589e7d8879664cb371eb8aefc8a2bce100d923951e4ef30c8 adwaita-icon-theme_50.0-1_all.deb +alsa-base 1.0.25+dfsg-0ubuntu9 all e8eabd601da99025d1c1e3cbff5dea11d9ec3792dd18485ef957e486d21eb679 alsa-base_1.0.25+dfsg-0ubuntu9_all.deb +alsa-topology-conf 1.2.5.1-3build1 all bbc3fc573a85d8dfbc30f83c5ee709f76963bb72a96d10943dc149ce1fdf8074 alsa-topology-conf_1.2.5.1-3build1_all.deb +alsa-ucm-conf 1.2.15.3-1ubuntu1.5 all a086022cda58b905cab9a0b8d9be50bab1e2f854724b874f44862cdf00f15f5d alsa-ucm-conf_1.2.15.3-1ubuntu1.5_all.deb +alsa-utils 1.2.15.2-1ubuntu1 amd64 d24c8b4b7155fe184873a808482f317c23fa8858e36cf9712235c9accdd43884 alsa-utils_1.2.15.2-1ubuntu1_amd64.deb +anacron 2.3-45ubuntu1 amd64 243d09f952b9d9d83f0717e1ad2b41436e99b4352e79eb94d791483740e05189 anacron_2.3-45ubuntu1_amd64.deb +apparmor 5.0.2-0ubuntu1~26.04.1 amd64 8621170a44534ef32ab4f7e26a5cacabb2077a5a95bcb5236c0652f118032820 apparmor_5.0.2-0ubuntu1~26.04.1_amd64.deb +apport 2.34.1-0ubuntu0.1 all f9daec86d175e75040b9723fad22ce54d1ccec9d0a00829ab3e8a7f4add603a9 apport_2.34.1-0ubuntu0.1_all.deb +apport-core-dump-handler 2.34.1-0ubuntu0.1 all 7a52cb6a63084a6bc4b3cbdcb966323027209dbe62ff868c4235713aae96104c apport-core-dump-handler_2.34.1-0ubuntu0.1_all.deb +apport-gtk 2.34.1-0ubuntu0.1 all 38cd5d6f4a1fe3f77b517ee32f06a0fd10c140fb1f8ca65e664aca023179d9d2 apport-gtk_2.34.1-0ubuntu0.1_all.deb +apport-symptoms 0.25build1 all 4d84a8ade9b48c128e53cfd871a254104b4d0c443837642a6bf5817f5b8f77ba apport-symptoms_0.25build1_all.deb +appstream 1.1.2-1 amd64 a4b97af1709a6809619afeb18b73a15100e70b0683544027ca1ba8f0655b8643 appstream_1.1.2-1_amd64.deb +apt-config-icons 1.1.2-1 all 4c8fdfa01d54c5b58d4d0aee2ba4cf54b261b88b9b834ae6d369b41cc06cb7a0 apt-config-icons_1.1.2-1_all.deb +apt-config-icons-hidpi 1.1.2-1 all 90d3b2b81892c79e3b3d7ee5fbf6cfccdb38cf9559354ed6b2d438bf537350a9 apt-config-icons-hidpi_1.1.2-1_all.deb +apt-transport-https 3.2.0 all 1b87f0d3826ddecffd7c584332abc779696855a5c7da114a1778e988e4e664ea apt-transport-https_3.2.0_all.deb +aptdaemon 2.0.2build1 all f61792620f6b4a59f7ae66cbde2e60aa2e1e43f80acb2d603e1764de851959d7 aptdaemon_2.0.2build1_all.deb +aptdaemon-data 2.0.2build1 all 470cc371c84a8d305387c4fe9ea02ce41cffb2a483b947c056a47198d87040b3 aptdaemon-data_2.0.2build1_all.deb +aspell 0.60.8.2-3 amd64 fc682bc1080e5ceb6ca1e620e817d009bf37d5acae9077cbb834af2d594a6a45 aspell_0.60.8.2-3_amd64.deb +aspell-en 2020.12.07-0-1.1build1 all 02e624fc2537d0268330b214039941ff4a41116c89c99b11f7f43110f7bf33ff aspell-en_2020.12.07-0-1.1build1_all.deb +at-spi2-common 2.60.4-0ubuntu0.1 all 2ed4e9bf31e9d76c65ec60c79dcdde5be27979b67d7c5e1a8b7d32cc97c82c41 at-spi2-common_2.60.4-0ubuntu0.1_all.deb +at-spi2-core 2.60.4-0ubuntu0.1 amd64 8de8d211ef7f517bb2182cf50bd25d36bfce546030f30519ebdfd230612cb209 at-spi2-core_2.60.4-0ubuntu0.1_amd64.deb +avahi-daemon 0.8-18ubuntu1.1 amd64 2ee0d3765a2bc7eba82fdb4fe9a1e3d37d4b795276cd9001bdb33d59458d4b40 avahi-daemon_0.8-18ubuntu1.1_amd64.deb +baobab 49.1-2 amd64 6330bfc7d5b90188e5194f61bb2dd2a1bfef95828347701892b889821f5778e7 baobab_49.1-2_amd64.deb +bc 1.07.1-4build1 amd64 cbc2e84d1f5dfe8debebebf24869988b8cf12151de5a66cce298d3f370dfe919 bc_1.07.1-4build1_amd64.deb +bind9-dnsutils 1:9.20.24-1ubuntu0.3 amd64 e149f6d40e29b4915b237aed92ba972c6c5ff565a056066e7fd5d20204cca832 bind9-dnsutils_1%3a9.20.24-1ubuntu0.3_amd64.deb +bind9-host 1:9.20.24-1ubuntu0.3 amd64 0506d3148a63e5fd2ca3df54a6024fb275d4cdc179f431afd89afbcc3d201910 bind9-host_1%3a9.20.24-1ubuntu0.3_amd64.deb +bind9-libs 1:9.20.24-1ubuntu0.3 amd64 7b0826714aea9c412452d0e7c310218e0dd6114e763fc6f1b9e90d1091dd3547 bind9-libs_1%3a9.20.24-1ubuntu0.3_amd64.deb +binutils 2.46-3ubuntu2 amd64 d14fc7bf644b495083f77c99ff168f1a2215c8b3b7ad5202e0345dc1092002b0 binutils_2.46-3ubuntu2_amd64.deb +binutils-common 2.46-3ubuntu2 amd64 3c846f001d87b16e5038a3919ca975276808a2db17459308a9d0f965c1cddac5 binutils-common_2.46-3ubuntu2_amd64.deb +binutils-x86-64-linux-gnu 2.46-3ubuntu2 amd64 91fa094c31783f7ccf0f0df8ed06447655c40476ba61fc95dbd245a313f8171e binutils-x86-64-linux-gnu_2.46-3ubuntu2_amd64.deb +bluez 5.85-4ubuntu0.2 amd64 3d10739644e47a795ca5605b8693f9821b0812c28daf95b11aa2d1f12d567d08 bluez_5.85-4ubuntu0.2_amd64.deb +bluez-cups 5.85-4ubuntu0.2 amd64 9204262033d802191aecee9f47c3d970c7147ea846bbd22f609c0793ce51ab7a bluez-cups_5.85-4ubuntu0.2_amd64.deb +bluez-obexd 5.85-4ubuntu0.2 amd64 287ddfddf6074fb4dd4586e474bec54d7cccebc77dd2933b193dfcd125cbf1d3 bluez-obexd_5.85-4ubuntu0.2_amd64.deb +bolt 0.9.10-1 amd64 2a91d14abab644e9bb7f0250459e6f5b5c75b109b9244cd12282c753a5d42c1f bolt_0.9.10-1_amd64.deb +brltty 6.7-1ubuntu6 amd64 81b7adffacea9ecf86cab24b66fd0b2bc0f7272106afa285c4b6e3f8891c45d8 brltty_6.7-1ubuntu6_amd64.deb +bsdextrautils 2.41.3-3ubuntu2.2 amd64 a711db104cbae55b4b4bdbc646111b819164446c6762826d8a39983635729603 bsdextrautils_2.41.3-3ubuntu2.2_amd64.deb +bubblewrap 0.11.1-1ubuntu0.1 amd64 b353088d1003adb3f760deeccfb84c47928a36c8dc102bf680efc94eb19f4408 bubblewrap_0.11.1-1ubuntu0.1_amd64.deb +busybox-initramfs 1:1.37.0-7ubuntu1 amd64 ce2e5af197a7e16931a32470beec9750e6f6c3cb1b1572c936aec0638a6503a2 busybox-initramfs_1%3a1.37.0-7ubuntu1_amd64.deb +busybox-static 1:1.37.0-7ubuntu1 amd64 fd605342f62268753076aa7d9321ff098b36ba53e47434145a9aedc28fd141a4 busybox-static_1%3a1.37.0-7ubuntu1_amd64.deb +ca-certificates 20260601~26.04.1 all 6077d27c6b6f8b23590cb01ff877ed8c804a67a5442cc32b5a33da10d2bd0e90 ca-certificates_20260601~26.04.1_all.deb +cloud-guest-utils 0.33-1build1 all 23041599f546279bb1fda510cb1154e2f8892444d38be39da9a03289b2bb43b8 cloud-guest-utils_0.33-1build1_all.deb +cloud-init 26.1-0ubuntu3~26.04.1 all a9a6115ee0ff0c4e04997f7dccc23a4aec4545cd25c39fcfac527224cf040bba cloud-init_26.1-0ubuntu3~26.04.1_all.deb +cloud-init-base 26.1-0ubuntu3~26.04.1 all 1ea9b30278090bff9eab18641397ef6d097a286c3ae9e9348759f256b3d91629 cloud-init-base_26.1-0ubuntu3~26.04.1_all.deb +colord 1.4.8-3 amd64 0bd99a498f6030db7fb85a1cd7e0bf100615dcab2ba6c0c1c4f231279fc68756 colord_1.4.8-3_amd64.deb +colord-data 1.4.8-3 all ad714cd24a4a30a1e3dd262b002648a1b9deca08008cd3574b7a42e34a51589f colord-data_1.4.8-3_all.deb +console-setup 1.237ubuntu3.1 all 220b7317f878d2099c7911657fa98507a89ca47bad3c76ae34239b9fda149cf4 console-setup_1.237ubuntu3.1_all.deb +console-setup-linux 1.237ubuntu3.1 all 18f100eb0e3baf792e2c091e00276a3c65e507c15306aebd8d71b09ba1d3804e console-setup-linux_1.237ubuntu3.1_all.deb +containerd.io 2.3.5-1~ubuntu.26.04~resolute amd64 a5988582d779e62dd968a1f2312ff8cd25670c185ebf94e4e5331ad1dcc1c287 containerd.io_2.3.5-1~ubuntu.26.04~resolute_amd64.deb +cpp 4:15.2.0-5ubuntu1 amd64 05a64873a18fb10d52ba2c8ee1fd0a605a974d75264d824ef2771c799f49ea63 cpp_4%3a15.2.0-5ubuntu1_amd64.deb +cpp-15 15.2.0-16ubuntu1 amd64 baacc9086e17c8cadc3603365e660f907bca483de4446e56e6f1bc25da4c02be cpp-15_15.2.0-16ubuntu1_amd64.deb +cpp-15-x86-64-linux-gnu 15.2.0-16ubuntu1 amd64 1649aa71c45b047feda5b9ca303c94799bdba5befa5c9de9735cbfc59c3ef93f cpp-15-x86-64-linux-gnu_15.2.0-16ubuntu1_amd64.deb +cpp-x86-64-linux-gnu 4:15.2.0-5ubuntu1 amd64 18b35148f64d0bb17b5c34efa6bdeefa4df9ca122ba12130f7245bccd65a950a cpp-x86-64-linux-gnu_4%3a15.2.0-5ubuntu1_amd64.deb +cracklib-runtime 2.9.6-5.2build3 amd64 b4796647beb74387211fcf9265ef6aa1e3539585de91f8b81a3fa3645ad8c612 cracklib-runtime_2.9.6-5.2build3_amd64.deb +crash 9.0.1+~16.3-1ubuntu1 amd64 f233ef2a645cd77830b389e2168b75deec5ccc55cde0f342a7e20851ddbda0b0 crash_9.0.1+~16.3-1ubuntu1_amd64.deb +cron 3.0pl1-200ubuntu1 amd64 6b2b3b88313f35b30f50af59940c0b6ba82d992021585430763ffa3f71fb6b03 cron_3.0pl1-200ubuntu1_amd64.deb +cron-daemon-common 3.0pl1-200ubuntu1 all 1630217f880e7a6c1a689365fce3b75ce34a2f09f1688ca56d5e4063f9bd5d9c cron-daemon-common_3.0pl1-200ubuntu1_all.deb +cups 2.4.16-1ubuntu1.3 amd64 c164caf8c9c5d41f056895f6737423ae57943cf23440889a4ca16042327f5add cups_2.4.16-1ubuntu1.3_amd64.deb +cups-browsed 2.1.1-0ubuntu3 amd64 fca5e52a4504fe6672197635b800323273f2d8221b416a38604fa89f944950b3 cups-browsed_2.1.1-0ubuntu3_amd64.deb +cups-bsd 2.4.16-1ubuntu1.3 amd64 26975659cba7ea97371a44c2ac34ce1813f4a691b715881f38b3a28f6f9f7757 cups-bsd_2.4.16-1ubuntu1.3_amd64.deb +cups-client 2.4.16-1ubuntu1.3 amd64 cddb97968598f332299ca17a32137b0936b1b2d11c450fd48548732f805d0818 cups-client_2.4.16-1ubuntu1.3_amd64.deb +cups-common 2.4.16-1ubuntu1.3 all 2059cf512e584786357d21d89701c67cf7e4e128f6f12e7bbc04a3cb2c408603 cups-common_2.4.16-1ubuntu1.3_all.deb +cups-core-drivers 2.4.16-1ubuntu1.3 amd64 7473dec4a2e4eef38861fec60188559cc5e9ebb06fa10290a3f044d1d66a7a63 cups-core-drivers_2.4.16-1ubuntu1.3_amd64.deb +cups-daemon 2.4.16-1ubuntu1.3 amd64 570d4b6c925a999bf127fbb45c732331a2a57864b6889bc54f22ef3a2db10559 cups-daemon_2.4.16-1ubuntu1.3_amd64.deb +cups-filters 2.0.1-0ubuntu4.1 amd64 36141549cc52bd2cf2a02eaebcf8646dc4c99bc57b57c06f5c4f749b28e78535 cups-filters_2.0.1-0ubuntu4.1_amd64.deb +cups-filters-core-drivers 2.0.1-0ubuntu4.1 amd64 c6e09dd33f33620f3cf9f1f71d50c5ce32b0ead0f8c516f3eff38f65f223df6b cups-filters-core-drivers_2.0.1-0ubuntu4.1_amd64.deb +cups-ipp-utils 2.4.16-1ubuntu1.3 amd64 d0b65f5076bdc542e714f69659559c3bc5f6104fb061d7b162a9cd90355da7ce cups-ipp-utils_2.4.16-1ubuntu1.3_amd64.deb +cups-pk-helper 0.2.6-2.1build1 amd64 034acb4da654cc54a3dbe1c6c9ffeda3218303b259f833a0fc442056d6b0af24 cups-pk-helper_0.2.6-2.1build1_amd64.deb +cups-ppdc 2.4.16-1ubuntu1.3 amd64 d64b410c16204a4c51dcf26ad326467356d10fb07d5f35e8067747e520eed3e9 cups-ppdc_2.4.16-1ubuntu1.3_amd64.deb +cups-server-common 2.4.16-1ubuntu1.3 all 197fa1ab57a888c5013a5e7b8e9a6617a88bc11291a83ac13931415e07130d11 cups-server-common_2.4.16-1ubuntu1.3_all.deb +curl 8.18.0-1ubuntu2.5 amd64 646c41ecab7fa98ea99fb1957f73ce891d0d420e0aa138f8cc6f4b247ef5bde3 curl_8.18.0-1ubuntu2.5_amd64.deb +dbus 1.16.2-2ubuntu4 amd64 3e19a3e85d696b164a1a0e0419b919ceb19cd9d89b6fdbb0d1c4caa0f6e5e526 dbus_1.16.2-2ubuntu4_amd64.deb +dbus-bin 1.16.2-2ubuntu4 amd64 9c191045a54eae56c583e4c29993ed75c521fbc18f312820387e0e8a514ab76a dbus-bin_1.16.2-2ubuntu4_amd64.deb +dbus-daemon 1.16.2-2ubuntu4 amd64 5e8b9f5527234cfb15f95f8449595e4118aa6a378f71b9472ba718c4e253508b dbus-daemon_1.16.2-2ubuntu4_amd64.deb +dbus-session-bus-common 1.16.2-2ubuntu4 all c4debf213b12e178096ca1eb8c6afd6de74b425da998a7788c42252c1f99ef3d dbus-session-bus-common_1.16.2-2ubuntu4_all.deb +dbus-system-bus-common 1.16.2-2ubuntu4 all 96a330e99f4d130d3aa1842881488f507d11ec46d897f410fe7afad14ed8c3a4 dbus-system-bus-common_1.16.2-2ubuntu4_all.deb +dbus-user-session 1.16.2-2ubuntu4 amd64 cf0b0c4d223f3465df0e057f1a0810d69643a4d3e64734d72ce5e5b488a9618c dbus-user-session_1.16.2-2ubuntu4_amd64.deb +dc 1.07.1-4build1 amd64 e5e22aa8607bcafb64f03f9fa8c6494f32e33b76f6de3d3f6db40231ce6c92b8 dc_1.07.1-4build1_amd64.deb +dconf-cli 0.49.0-4 amd64 a79fb20ecbb95391aa5df2d2e8442200c150425a0800e89a0d806e196366e51f dconf-cli_0.49.0-4_amd64.deb +dconf-gsettings-backend 0.49.0-4 amd64 4da7b8309d49079ebac028c1f3284df02463da451cbd5f90ea61e535534531ac dconf-gsettings-backend_0.49.0-4_amd64.deb +dconf-service 0.49.0-4 amd64 7f247f6032e72f86b1877f0020de77a0f8a11de256cf8f1726c072cf09585d31 dconf-service_0.49.0-4_amd64.deb +desktop-file-utils 0.28-1build1 amd64 4bc2c38ed9722d6ccdc7b27e77852f35363d06b8a8d786856aed4ffea98840b7 desktop-file-utils_0.28-1build1_amd64.deb +dhcpcd-base 1:10.3.0-7 amd64 8b58af259355e50864c650dca5f07fc81cd1e3ad87fc5b813048a4653daaefd2 dhcpcd-base_1%3a10.3.0-7_amd64.deb +dictionaries-common 1.31.4 all 465aa924e33faecfacf7925f6fb7ab92ecb97505e6bf204db34b93ee5a3fa749 dictionaries-common_1.31.4_all.deb +distro-info 1.15 amd64 9d65499fef4fa9b558ea25a5cfa232d1b96c2c1b52a62919c403e8f7e78700e5 distro-info_1.15_amd64.deb +distro-info-data 0.72-0ubuntu0.26.04.1 all 7dc20e15aa612cbc8cde8b9f07612e462232b57dd81bfdc134d2062f8d7bd90f distro-info-data_0.72-0ubuntu0.26.04.1_all.deb +dmidecode 3.6-2ubuntu1 amd64 36ac8fce0b6a4f16faaa824faa67501487f0c91e7b8d24993b3c3e7b4d46073d dmidecode_3.6-2ubuntu1_amd64.deb +dmsetup 2:1.02.205-2ubuntu3 amd64 a90c4e24ec00bf166071860671f195b5240b56b9a583813af551a0b68f629a36 dmsetup_2%3a1.02.205-2ubuntu3_amd64.deb +dmz-cursor-theme 0.4.5.3build1 all 85a8b3b0ce547fdbe3dce6e8721ebd1e7a124343e670375a5aa8c50e41bb0f6d dmz-cursor-theme_0.4.5.3build1_all.deb +dns-root-data 2025080400build1 all f246a598331f362860f1360792cf497372a07d84dd0d3dabc2a9344d7d6d5f83 dns-root-data_2025080400build1_all.deb +dnsmasq-base 2.92-1ubuntu0.4 amd64 fef2ce81dc80dd9099ab0539d169c7f0c2178946c9bb1cc2b9a263c1b00de5ea dnsmasq-base_2.92-1ubuntu0.4_amd64.deb +docbook-xml 4.5-13build1 all 7e8e0c6b5204aa8816683d29d7f7ca9280cbc866838a4f62adb497e9886a6ae5 docbook-xml_4.5-13build1_all.deb +docker-buildx-plugin 0.37.1-1~ubuntu.26.04~resolute amd64 7d74d16440db560d3dc45d5f7ac83fb2cefb964f4edfabf82dd17a804ac42331 docker-buildx-plugin_0.37.1-1~ubuntu.26.04~resolute_amd64.deb +docker-ce 5:29.8.1-1~ubuntu.26.04~resolute amd64 9a07ee2e75ebe60f7be95ea27a0d5b5358f8ed01ea93ef91c17ee1eed2eba9b8 docker-ce_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +docker-ce-cli 5:29.8.1-1~ubuntu.26.04~resolute amd64 3569f6f998c101c499884fc3d1f0d2696a37ae1db381cc1f5cfe4ca4cda143fa docker-ce-cli_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +docker-ce-rootless-extras 5:29.8.1-1~ubuntu.26.04~resolute amd64 f97a8dcdb4b5e489e53be3283d58fcd136e918b5b6027ca7f9a5d436d24966ba docker-ce-rootless-extras_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb +docker-compose-plugin 5.5.1-1~ubuntu.26.04~resolute amd64 49b640226e70a6193ddea8115bec3e1b99493c50a15ac3b7d46d2ec6abeb5464 docker-compose-plugin_5.5.1-1~ubuntu.26.04~resolute_amd64.deb +dosfstools 4.2-1.2build1 amd64 6b1b2bba6458ca4444cae467db7faff6fd2f350373a95be23333d76dd019c58f dosfstools_4.2-1.2build1_amd64.deb +dracut 110-11ubuntu0.1 all 5c889098b7cf533851be933feea66587dd637c2f5de8b1b9009f824d1fc732da dracut_110-11ubuntu0.1_all.deb +dracut-core 110-11ubuntu0.1 amd64 a8b9af489e0968620246dbbbbb6e211e49e2f4df0d28de98af22fb860ab7c0b0 dracut-core_110-11ubuntu0.1_amd64.deb +dracut-install 110-11ubuntu0.1 amd64 c4f00013b155a28c726eff14d1d00f70658ba00d5ab874246179d0bd4a72b7dd dracut-install_110-11ubuntu0.1_amd64.deb +eatmydata 131-2build1 all f21c9721593142db551fb2671e44c3bc4694a50a9880cd3687eb8700c7eb1186 eatmydata_131-2build1_all.deb +eject 2.41.3-3ubuntu2.2 amd64 b249154e608cf714cd166cf63be820c26f8124a7657a0258bb139c8ba9741dcc eject_2.41.3-3ubuntu2.2_amd64.deb +emacsen-common 3.0.8build1 all e630031549f68eaa2db722d3573b5b86f469df27d967645250050cdbcbcd752e emacsen-common_3.0.8build1_all.deb +enchant-2 2.8.2+dfsg1-3build1 amd64 f1142906a045a2124c483f47b411865609866b6f7db46da679deaee5869cca99 enchant-2_2.8.2+dfsg1-3build1_amd64.deb +espeak-ng-data 1.52.0+dfsg-5build1 amd64 8304ebf2260a5cf16394625a9b6bfc7cea6c29cc30e55d4cfa0e85da0d3cf56a espeak-ng-data_1.52.0+dfsg-5build1_amd64.deb +ethtool 1:6.19-1 amd64 ccb2f06f17d13410a76f52c69454451751275f036e6faff08acf1de1527fe35a ethtool_1%3a6.19-1_amd64.deb +evolution-data-server 3.56.2-8 amd64 7d72ccd1741f4098197505012168bd0d2ef825f294e1f68532b71360f1628b07 evolution-data-server_3.56.2-8_amd64.deb +evolution-data-server-common 3.56.2-8 all e7b82a9c4e3489c86dd1ab1a68a87a79c36213e155d391ff00f43ec41edadbcb evolution-data-server-common_3.56.2-8_all.deb +exfatprogs 1.3.2-1 amd64 3ccd90a7a4cd55f088cf5a1abffb0b3348c607ff1c3cfb984630bc7b2f48d3c6 exfatprogs_1.3.2-1_amd64.deb +fdisk 2.41.3-3ubuntu2.2 amd64 1789910902f6c260e5345440fd86b00ac0f34c69795a6f2be67cd4ab3e38fa2b fdisk_2.41.3-3ubuntu2.2_amd64.deb +file 1:5.46-5build2 amd64 968b0e503f877a81c67bf82b634973e73901f6c4f4c741b5ec09824120791cd3 file_1%3a5.46-5build2_amd64.deb +firefox 1:1snap1-0ubuntu9.1 amd64 abd8b2c56a05c9c15f3f050713ab795e58c2ff1a868869a2bf40e9b26ee4d2ea firefox_1%3a1snap1-0ubuntu9.1_amd64.deb +fontconfig 2.17.1-3ubuntu1 amd64 5f87d9f0ff7189e5dbf7bedd1ef6c09ea81747bc68dd5263ea811b471f23ee65 fontconfig_2.17.1-3ubuntu1_amd64.deb +fontconfig-config 2.17.1-3ubuntu1 amd64 304cc61f61b94399453db02e1032d9f74a0bd737307acb4ed847f8da9406b8c1 fontconfig-config_2.17.1-3ubuntu1_amd64.deb +fonts-adwaita 49.0+dfsg-2 all f8f0deb9b00788cbe6d52fedb029b411db27bee4f6b43943edad79829e8321eb fonts-adwaita_49.0+dfsg-2_all.deb +fonts-adwaita-sans 49.0+dfsg-2 all 69439ea5a600a1b6dd8f17e1a45951e7c100b5acb2df7af849a04558c45acb93 fonts-adwaita-sans_49.0+dfsg-2_all.deb +fonts-dejavu-core 2.37-8build1 all f4606b12eb41ddf7932d3a1ebc2019f9bbf90d0824943a2dc0c77a00f43019f2 fonts-dejavu-core_2.37-8build1_all.deb +fonts-dejavu-mono 2.37-8build1 all bf5ad873961972ea8f1299ef99c1854715e68d9aa798830fb78c5b222ddeb4b9 fonts-dejavu-mono_2.37-8build1_all.deb +fonts-droid-fallback 1:8.1.0r7-1~1.gbp36536bbuild1 all ce3303e44d61409ee93d32d2a50e26af7a8c49b6f71fbf4b1ca7077488234651 fonts-droid-fallback_1%3a8.1.0r7-1~1.gbp36536bbuild1_all.deb +fonts-liberation 1:2.1.5-3build1 all 47f156bc945cfc69cf2f2a0c19b8c82b67a685738d3846673462de6a73266e1b fonts-liberation_1%3a2.1.5-3build1_all.deb +fonts-liberation-sans-narrow 1:1.07.6-4build1 all b860cd58dc89b4d91ff7b775e759aba62561a5d7226508cf5fbdaff01bade9cd fonts-liberation-sans-narrow_1%3a1.07.6-4build1_all.deb +fonts-noto-cjk 1:20240730+repack1-1build1 all be378a571b8f49b4b9146f7d13b31990950d35ee3e0bf1999f554c3ed5670dc0 fonts-noto-cjk_1%3a20240730+repack1-1build1_all.deb +fonts-noto-color-emoji 2.051-1build1 all 040b1e0a0700c849b9ce59d97878019e16720d18063f7d0585d906ea609d7235 fonts-noto-color-emoji_2.051-1build1_all.deb +fonts-noto-core 20201225-2build1 all 25999af6e6665266b1f055d351fc5008534e65c9f7bdda1e7fb5a7574c42372f fonts-noto-core_20201225-2build1_all.deb +fonts-noto-mono 20201225-2build1 all b9b3e49f6a6926e3be9817c39587a4eeff48d147cb21fdd799f89a045fe097c5 fonts-noto-mono_20201225-2build1_all.deb +fonts-ubuntu 0.869+git20240321-0ubuntu2 all f406a58d53ba6f1b7d0c8b9641ee599181cfaaf433c4fd1276a7fe2f10ae9e38 fonts-ubuntu_0.869+git20240321-0ubuntu2_all.deb +fonts-urw-base35 20200910-8build1 all be59254289c670d5c6580ce381995292aa05c9dd4bc5fa65b9dbaa527b55adda fonts-urw-base35_20200910-8build1_all.deb +foomatic-db-compressed-ppds 20250819-1build1 all ae9c1af11ce07fc2cb56cb0a87f8c4a7d21a774ca5e10b260fddb1977947c884 foomatic-db-compressed-ppds_20250819-1build1_all.deb +fprintd 1.94.5-4 amd64 52728aed9fa0d1620b24044545482113e75fee59c22acf7fad2fce4f6b631661 fprintd_1.94.5-4_amd64.deb +freeipmi-common 1.6.16-1ubuntu0.1 all 340a22f204486c0f178a1c1dad70360538b33679af4420b4f72b3dd6bcd82a47 freeipmi-common_1.6.16-1ubuntu0.1_all.deb +fuse3 3.18.2-1 amd64 a867fe3be1cbca271df70748b003232592c052233be5976d2a590f02327158db fuse3_3.18.2-1_amd64.deb +fwupd 2.1.1-1ubuntu3.1 amd64 19dd482b85dcf1344cfe3e90f52088485426a074cfb019ec7d4ced65734793d9 fwupd_2.1.1-1ubuntu3.1_amd64.deb +fwupd-signed 1.55+1.7-1 amd64 0ac47da21856267d0cccd81ed0ded0165bfee15375821bf389ed75ae91fa8232 fwupd-signed_1.55+1.7-1_amd64.deb +gamemode 1.8.2-2build1 amd64 25e566cd0e29c5ea98b3f07d56395e270767c97cd9f37046cfe50f54b150b690 gamemode_1.8.2-2build1_amd64.deb +gamemode-daemon 1.8.2-2build1 amd64 a2238ef709a071223ce579cbcac9c20507731ebf17eff65ee8361fdbdd5369f6 gamemode-daemon_1.8.2-2build1_amd64.deb +gcc-15-base 15.2.0-16ubuntu1 amd64 5a302d705d562fb7e150415b00651c00fed58b633faadff0b332eac1b73fadb3 gcc-15-base_15.2.0-16ubuntu1_amd64.deb +gcr 3.41.2-6 amd64 81fc97e9cac4d5beab2b61cb100705eea14b9d812c9181ea798205bb92844afe gcr_3.41.2-6_amd64.deb +gcr4 4.4.0.1-8 amd64 89caf5746a48018ac325095ed1371abc4916ef515f9d1c39e87c73757b81cb9d gcr4_4.4.0.1-8_amd64.deb +gdb 17.1-2ubuntu1 amd64 e1034f3c120b99d9a34964b274d81d7525c4f22bf76f9f31308014a6bec20b3e gdb_17.1-2ubuntu1_amd64.deb +gdisk 1.0.10-2build1 amd64 8bff3d86ac03a3f13312d73c52e594c4572308cf0373439b0567837c774a19e7 gdisk_1.0.10-2build1_amd64.deb +gdm3 50.1-0ubuntu0.1 amd64 6d979c79ce3492236e9a2467c5a11e4f5355f087f08ca0dfc0e0e3320b5d2aae gdm3_50.1-0ubuntu0.1_amd64.deb +geoclue-2.0 2.7.2-2ubuntu3 amd64 32e3c75cd3ad2acae2c4ef282a816516822306484f7e6605a59126dad2597aba geoclue-2.0_2.7.2-2ubuntu3_amd64.deb +geocode-glib-common 3.26.4-3 all f1261a0a2e3829cf1603b3a4b3dd2f9eec857cdac7d22ad238dc034a3cc7ac3e geocode-glib-common_3.26.4-3_all.deb +gettext-base 0.23.2-1 amd64 5a1a4cd407a868e766626f551646b00880fc1534db5e6d47208310a17252f306 gettext-base_0.23.2-1_amd64.deb +ghostscript 10.06.0~dfsg-3ubuntu1 amd64 30a71a4e787afa88617b8f9239fd4ddbccfddb54dc63fef0b1687cecc60e510c ghostscript_10.06.0~dfsg-3ubuntu1_amd64.deb +gir1.2-accountsservice-1.0 23.13.9-8ubuntu5.2 amd64 ebd57ea07ae33b06cf9849d98392dcdc994ea67fb6d875f34eae8dd4c99e3af7 gir1.2-accountsservice-1.0_23.13.9-8ubuntu5.2_amd64.deb +gir1.2-adw-1 1.9.1-0ubuntu0.1 amd64 634bc3d42b0fa94559fa5d9841adf42a645c121a6a848f8270ab36e0efd1bdaf gir1.2-adw-1_1.9.1-0ubuntu0.1_amd64.deb +gir1.2-atk-1.0 2.60.4-0ubuntu0.1 amd64 51c76d8da01f7393cc29229e050addf92a84f1e1fa4d62fb41f2495e14f09e99 gir1.2-atk-1.0_2.60.4-0ubuntu0.1_amd64.deb +gir1.2-atspi-2.0 2.60.4-0ubuntu0.1 amd64 c1094d9dda13dfa5d0f9dab2270e9eba36968197bb6262d98a4d99186ac59f45 gir1.2-atspi-2.0_2.60.4-0ubuntu0.1_amd64.deb +gir1.2-dbusmenu-glib-0.4 18.10.20180917~bzr492+repack1-4build1 amd64 22daa702e579d72bac3887b0fbd4a54340424a19730aefd2079ef3f1451449f9 gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +gir1.2-freedesktop 1.86.0-6build1 amd64 b03241fd8fcee4ee829ebfecadf28799ec7da36c2e0ab49f2626def937a1f4b6 gir1.2-freedesktop_1.86.0-6build1_amd64.deb +gir1.2-gck-2 4.4.0.1-8 amd64 8108abbbcca7b3fcac82d69cd2562a0cc32f6e1e2963eb0610c0534be8fb7533 gir1.2-gck-2_4.4.0.1-8_amd64.deb +gir1.2-gcr-4 4.4.0.1-8 amd64 7ae3ce47e33fbfa3b30f30f43fc52625fa72095829748c5d169f47d3e6d61e3e gir1.2-gcr-4_4.4.0.1-8_amd64.deb +gir1.2-gdesktopenums-3.0 50.0-1ubuntu2 amd64 a9eae556dc799df2b9681714c26a3feaeb200c4206594fcf2cf95f9a376a405d gir1.2-gdesktopenums-3.0_50.0-1ubuntu2_amd64.deb +gir1.2-gdkpixbuf-2.0 2.44.5+dfsg-4ubuntu1 amd64 58a8f3f358a96d0039671c697a8241781fc95f70593aafef78b7d09625305d13 gir1.2-gdkpixbuf-2.0_2.44.5+dfsg-4ubuntu1_amd64.deb +gir1.2-gdm-1.0 50.1-0ubuntu0.1 amd64 a82639e1bb188eeb7cf985f3739427d6e701cbeb69526c020eb39a780570b8ee gir1.2-gdm-1.0_50.1-0ubuntu0.1_amd64.deb +gir1.2-geoclue-2.0 2.7.2-2ubuntu3 amd64 32534963075b451aa2c723ae2096ddb13d3d4365945392e8ae7ba94dcefb0643 gir1.2-geoclue-2.0_2.7.2-2ubuntu3_amd64.deb +gir1.2-girepository-3.0 2.88.0-1 amd64 0c88684f606a84ba792aa09909e2ef1cc65eba7262789bbb387c4d00f339f9fb gir1.2-girepository-3.0_2.88.0-1_amd64.deb +gir1.2-glib-2.0 2.88.0-1 amd64 b4b0b4822f5cae347a6ed288adb60a8ebb2f9ea9ee66469e4a810f48b89a87aa gir1.2-glib-2.0_2.88.0-1_amd64.deb +gir1.2-gmenu-3.0 3.38.1-1ubuntu1 amd64 fafc76d4e7d4ea45ff6bfe9992f1f0d5a547aeae5e7db2c46c35c1731c1bb0de gir1.2-gmenu-3.0_3.38.1-1ubuntu1_amd64.deb +gir1.2-gnomeautoar-0.1 0.4.5-5 amd64 9acd8fb0f912992e1660d81ced96d004e4f4069808a9b84ee0239b74d03993b5 gir1.2-gnomeautoar-0.1_0.4.5-5_amd64.deb +gir1.2-gnomebg-4.0 44.5-1ubuntu1 amd64 3f42af66fec0c50d09b8d31501527b5dd285e689da15f0abce7202f63bb3574b gir1.2-gnomebg-4.0_44.5-1ubuntu1_amd64.deb +gir1.2-gnomebluetooth-3.0 47.1-5 amd64 d357d32976242090c317647eb19b8e9208ac811e89d1119578c44b00bb800255 gir1.2-gnomebluetooth-3.0_47.1-5_amd64.deb +gir1.2-gnomedesktop-3.0 44.5-1ubuntu1 amd64 e793934c521a2d1f9e6a956d9191d198fd62909116c1e810c4dcfab77505bdd9 gir1.2-gnomedesktop-3.0_44.5-1ubuntu1_amd64.deb +gir1.2-gnomedesktop-4.0 44.5-1ubuntu1 amd64 8218a177aa366bb3f124bb9364743ebefb1024672d3427d7ab74d94ef812f1db gir1.2-gnomedesktop-4.0_44.5-1ubuntu1_amd64.deb +gir1.2-gnomeqr-4.0 44.5-1ubuntu1 amd64 5850a0847902085e922af6008aa5ada8bf3c77e82fb27149425b1a4b25e7e8a0 gir1.2-gnomeqr-4.0_44.5-1ubuntu1_amd64.deb +gir1.2-graphene-1.0 1.10.8-5build1 amd64 83473d0c46e2f0f05e9a74274e8116a919007e01a375c8f9bd281a1c7fc03999 gir1.2-graphene-1.0_1.10.8-5build1_amd64.deb +gir1.2-gstreamer-1.0 1.28.2-1 amd64 211ce8acd5cff28532472a1679d27ac254a8edfa2a901a65e6a1471c66118a5d gir1.2-gstreamer-1.0_1.28.2-1_amd64.deb +gir1.2-gtk-3.0 3.24.52-0ubuntu1 amd64 d6d33238376565ea10358c946a1eb1dd1d638a0ffd7b4399c3871244d53811f5 gir1.2-gtk-3.0_3.24.52-0ubuntu1_amd64.deb +gir1.2-gtk-4.0 4.22.4+ds-0ubuntu0.1 amd64 4ce9a8d81aa672e3c41afdde78678abdee33ff0bfdeb2d22e5812f1cbfbab2f9 gir1.2-gtk-4.0_4.22.4+ds-0ubuntu0.1_amd64.deb +gir1.2-gweather-4.0 4.4.4-4 amd64 485f336cba9dad6cc0cf33d4257db52f731c76140b82551ad49d57f3b79d600d gir1.2-gweather-4.0_4.4.4-4_amd64.deb +gir1.2-handy-1 1.8.3-3build1 amd64 dc729c1d015c1ae81138af22ed3533f8521296fc8fc85cf0650bec99e1d6bcd4 gir1.2-handy-1_1.8.3-3build1_amd64.deb +gir1.2-harfbuzz-0.0 12.3.2-2 amd64 e91702d05c014768a85814efde45133b0e1a75faf1c8ff51a31563644229ffc6 gir1.2-harfbuzz-0.0_12.3.2-2_amd64.deb +gir1.2-ibus-1.0 1.5.34~rc2-1 amd64 ef94b3853acdf6c1d1d2ee247ba2aa42e49744eafee58cdf9616020502b39f3f gir1.2-ibus-1.0_1.5.34~rc2-1_amd64.deb +gir1.2-javascriptcoregtk-4.1 2.52.6-0ubuntu0.26.04.1 amd64 d3e152e1b2fb6a9549fc1f733582d90d6049dd88881b536b7c465c71365f0094 gir1.2-javascriptcoregtk-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb +gir1.2-mutter-18 50.1-0ubuntu2.2 amd64 acece18b86d3cb5c6194df5e3401818e81edeb33d4b97ea3ad6a2ed0cecfa7c2 gir1.2-mutter-18_50.1-0ubuntu2.2_amd64.deb +gir1.2-nm-1.0 1.54.3-2ubuntu3 amd64 e4ae7fc1a7017518b5e268c444feca597c5996239f282571e1ff382ad3f7de60 gir1.2-nm-1.0_1.54.3-2ubuntu3_amd64.deb +gir1.2-nma4-1.0 1.10.6-7 amd64 63e0a77707eea2315fe9912d67777cd3b49cd8d9f4b93e65de0385d660bac6ad gir1.2-nma4-1.0_1.10.6-7_amd64.deb +gir1.2-notify-0.7 0.8.8-1 amd64 66325b907ce2d3261b1a06b89ac8a32532aa2ed5819bfcc2fc93356c04c6125b gir1.2-notify-0.7_0.8.8-1_amd64.deb +gir1.2-packagekitglib-1.0 1.3.4-3ubuntu1.2 amd64 bece2590fc1e6befc4ad99d6146694581cc928db238eaa08b85f3e77577f8e72 gir1.2-packagekitglib-1.0_1.3.4-3ubuntu1.2_amd64.deb +gir1.2-pango-1.0 1.57.0-1 amd64 799885145fe5982478fc53ce0206072a7dd402d6e42f5f7a951a78e9e49bcb84 gir1.2-pango-1.0_1.57.0-1_amd64.deb +gir1.2-polkit-1.0 127-2ubuntu1.1 amd64 2e73cbeef4422da0d390523716bbb2d8f63ed74dae73e546412090d1ad75586d gir1.2-polkit-1.0_127-2ubuntu1.1_amd64.deb +gir1.2-rsvg-2.0 2.61.3+dfsg-3 amd64 35468e313e59a20d9388b554a6d02634c65a17596d928723c228a17f1ce486e0 gir1.2-rsvg-2.0_2.61.3+dfsg-3_amd64.deb +gir1.2-secret-1 0.21.7-2build1 amd64 9c057deb9c39ae68c803c922aab875cf52bb33bd5b0b3b53ceb638b5dbc843e2 gir1.2-secret-1_0.21.7-2build1_amd64.deb +gir1.2-snapd-2 1.72-0ubuntu3 amd64 2f1ce5a6cfdfd15d0bde1b3bc774d5d35a85f2f5fda28e5b32495c8412c46b08 gir1.2-snapd-2_1.72-0ubuntu3_amd64.deb +gir1.2-soup-3.0 3.6.6-1 amd64 046d809c27d3b31ef3942a72386408a759c328be2a71c81ccc5c201b10eb394d gir1.2-soup-3.0_3.6.6-1_amd64.deb +gir1.2-upowerglib-1.0 1.91.1-1 amd64 3308387bdb13c3da8cf2a5f924f60e180aae9623ff78825579c88ba2636c2578 gir1.2-upowerglib-1.0_1.91.1-1_amd64.deb +gir1.2-vte-2.91 0.84.0-2 amd64 41e72d980945aa13aeac331f62d784fb089edb510a256ba65b6d7142564c59e1 gir1.2-vte-2.91_0.84.0-2_amd64.deb +gir1.2-webkit2-4.1 2.52.6-0ubuntu0.26.04.1 amd64 708bc6befabd6edae038d15b6fbcefa609368aaaf59ec9dc6c77278e152fe482 gir1.2-webkit2-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb +gir1.2-wnck-3.0 43.3-1build1 amd64 bdef0db4470d6667e6340ad6ef455e8aa81094e662e3875a4d19da6be7081e93 gir1.2-wnck-3.0_43.3-1build1_amd64.deb +git 1:2.53.0-1ubuntu1 amd64 c3b36d7357dea773eefe6c4f97ebff416e5afee22489dc1f729e31d6f47872e9 git_1%3a2.53.0-1ubuntu1_amd64.deb +git-man 1:2.53.0-1ubuntu1 all cc2870c52d3d6845bd792e861930dd6afc5fe165edb0c8c3700332c3bfbd666e git-man_1%3a2.53.0-1ubuntu1_all.deb +gjs 1.88.0-1 amd64 8fe90b1cbdb4ecd6d0f70dbcd60f6b834b858e06ad599f16deaaa73100649767 gjs_1.88.0-1_amd64.deb +glib-networking 2.80.1-1build2 amd64 19781460ab64af9244f089d1cb79f57f44dda08a7db5f5ac8b88b3d79215125c glib-networking_2.80.1-1build2_amd64.deb +glib-networking-common 2.80.1-1build2 all a1189141109b442a85d9dbbd695d10ce0a817fa530bab2b9dd0fc45cbebba09f glib-networking-common_2.80.1-1build2_all.deb +glib-networking-services 2.80.1-1build2 amd64 aff71f4fcc8e493a45ba8e3cd36207747a76633b35769415c74b48e049b2c3b9 glib-networking-services_2.80.1-1build2_amd64.deb +glycin-loaders 2.1.1+ds-0ubuntu1 amd64 2b94910793dddd6cc6cc689bea65c526e3c3e3dfd2125f4464c239fc6e5856d4 glycin-loaders_2.1.1+ds-0ubuntu1_amd64.deb +glycin-thumbnailers 2.1.1+ds-0ubuntu1 amd64 545e2b60f3a2ceefe6f1b99c98b229806aafde57fdcae6b67030b7a09b808cc2 glycin-thumbnailers_2.1.1+ds-0ubuntu1_amd64.deb +gnome-accessibility-themes 3.28-5 all 0a93934df79efa3114968521f607c0cddd35c1db3be5ac6cd46d58f66276e236 gnome-accessibility-themes_3.28-5_all.deb +gnome-bluetooth-3-common 47.1-5 all baf5ee3e5e5ba2080d565c57b1a049fc5226c4eaf70c779cad58b8ba30cd25e8 gnome-bluetooth-3-common_47.1-5_all.deb +gnome-bluetooth-sendto 47.1-5 amd64 0fef6d29b9dbbb88e50a30eeb485fcb5acfe76d7dcab444261d38f97a7fc83d8 gnome-bluetooth-sendto_47.1-5_amd64.deb +gnome-calculator 1:50.0-1ubuntu1 amd64 959598983285cc7f3c09d0c47524505b9fa5fcc56fc8f1b3aeb581dfe27318db gnome-calculator_1%3a50.0-1ubuntu1_amd64.deb +gnome-characters 50.0-1 amd64 5af17d8d07ce0ed1ba082cb863b3c4907d8234d0ec78ec9289dfff662a9a5b11 gnome-characters_50.0-1_amd64.deb +gnome-clocks 50.0-1 amd64 dd72b4998e721ad6f3c73dd03981b54d1d579c4a4050dd8c4e32c6eff1a33c61 gnome-clocks_50.0-1_amd64.deb +gnome-control-center 1:50.3-0ubuntu0.2 amd64 0c940c78379e37509da54f14b9c2eaa7695280dfda6e16a00090ad77b99c7a77 gnome-control-center_1%3a50.3-0ubuntu0.2_amd64.deb +gnome-control-center-data 1:50.3-0ubuntu0.2 all 78ea685c595cd7b0d1d2d3d42359200892eca0e0c96f0b71855c43ccd1a42293 gnome-control-center-data_1%3a50.3-0ubuntu0.2_all.deb +gnome-control-center-faces 1:50.3-0ubuntu0.2 all f1ee11647b14d1f9f3eabc070d5480928c52415f94654575c3ac8472cad1a680 gnome-control-center-faces_1%3a50.3-0ubuntu0.2_all.deb +gnome-desktop3-data 44.5-1ubuntu1 all 50bdc946d47908d38f3e96d979eb0e2e53a31873fce124b7c8ee93725b6dad47 gnome-desktop3-data_44.5-1ubuntu1_all.deb +gnome-disk-utility 46.1-2ubuntu2 amd64 ae54e76c2732546561f9444e85e5c04bad89cac5e01a701cd9c098e2bb207cbc gnome-disk-utility_46.1-2ubuntu2_amd64.deb +gnome-font-viewer 49.0-1 amd64 7510d6480cc138a552ec6e36419f198fa3d61507bba098a47388f0c653ea873b gnome-font-viewer_49.0-1_amd64.deb +gnome-initial-setup 50.0-0ubuntu7.1 amd64 268d971491abe2fef77925b304f7c3ad22a7a12cf5d6ffae6778c0d0a63a6e0b gnome-initial-setup_50.0-0ubuntu7.1_amd64.deb +gnome-keyring 50.0-1 amd64 8b5acd08a0857f8622087271bcfd5c72e8585fa0e02d1a56706b0d1c6bf66a34 gnome-keyring_50.0-1_amd64.deb +gnome-keyring-pkcs11 50.0-1 amd64 821956354c95ec78ba601e0c814057a8f99c3f7cc99277fb12cbe79c7a69914c gnome-keyring-pkcs11_50.0-1_amd64.deb +gnome-logs 49.0-1 amd64 bcf68f3dd689353b632262f259330795379c8dcf889cc2bdd21ebb46247c0486 gnome-logs_49.0-1_amd64.deb +gnome-menus 3.38.1-1ubuntu1 amd64 bbc653161f70183310f3ca880bec9e2d90e7b80ad90f31a4e0762ab93055dca4 gnome-menus_3.38.1-1ubuntu1_amd64.deb +gnome-online-accounts 3.58.0-1 amd64 306913fb919e3dcf01cda6e3029dacb18644cadd1bcc58fb06e2014e5269d824 gnome-online-accounts_3.58.0-1_amd64.deb +gnome-remote-desktop 50.2-0ubuntu0.1 amd64 67f947c0d088ab984bde86657bed7956b9c7abb1a90bf7a705ad258548238e61 gnome-remote-desktop_50.2-0ubuntu0.1_amd64.deb +gnome-session 50.1-0ubuntu0.1 all 3425c8e260ca89df3a136b3b55ff372effe306fa5d0ac6981371d0932944ca44 gnome-session_50.1-0ubuntu0.1_all.deb +gnome-session-bin 50.1-0ubuntu0.1 amd64 a5e64a55e660b82a732a4a24bbae4529d4040e794232201345efacdb43c07700 gnome-session-bin_50.1-0ubuntu0.1_amd64.deb +gnome-session-canberra 0.30-18ubuntu3 amd64 93ffcda57d1cf11abea97c5a484a8424dbad9ed105bd9b106999cbce204a9992 gnome-session-canberra_0.30-18ubuntu3_amd64.deb +gnome-session-common 50.1-0ubuntu0.1 all 42428debf5153dce76602b23229c987faac286edf910ac26ade3841350e54f2c gnome-session-common_50.1-0ubuntu0.1_all.deb +gnome-settings-daemon 50.0-1ubuntu1 amd64 68cc2bb46f5771a54e292306654bc867cfe18e9ba6ab3a8ae85e5e8ec9058d49 gnome-settings-daemon_50.0-1ubuntu1_amd64.deb +gnome-settings-daemon-common 50.0-1ubuntu1 all 1fbbe762169f60a022c37d98059868fad5b4d5bb2ff52522c68edb8ab5ee4380 gnome-settings-daemon-common_50.0-1ubuntu1_all.deb +gnome-shell 50.1-0ubuntu1.2 amd64 c1966176f38017d05eae9ed5e14f54b7d5d798dca7cfcad50b2ab7de2ec32f88 gnome-shell_50.1-0ubuntu1.2_amd64.deb +gnome-shell-common 50.1-0ubuntu1.2 all 86da4316ab54d045a96e65b96eb28ec283b63cbb389f55a2e3ae05336eb53dbf gnome-shell-common_50.1-0ubuntu1.2_all.deb +gnome-shell-ubuntu-extensions 50.26.04.7ubuntu all ac1bd47a587cb8b803dcf3197782e5f79e3a8d3c795f784024ea9c3f44584458 gnome-shell-ubuntu-extensions_50.26.04.7ubuntu_all.deb +gnome-terminal 3.58.0-1ubuntu1 amd64 c0af28a928f92cbcbd6a4262dedbf02240a7ede9c534b8e5c24f00e741d68690 gnome-terminal_3.58.0-1ubuntu1_amd64.deb +gnome-terminal-data 3.58.0-1ubuntu1 all 3edefea99bca8b45f95c03f8e77212ce2c217318742d50084ca4f386975dc7e5 gnome-terminal-data_3.58.0-1ubuntu1_all.deb +gnome-text-editor 50.1-0ubuntu0.1 amd64 375aa2fe53a81a570105584ff837a2c6038117b0cc9171349c055e0cc6388c03 gnome-text-editor_50.1-0ubuntu0.1_amd64.deb +gnome-themes-extra 3.28-5 amd64 0adbe694cc05b4739a41c7e3cafc0f86d60317f489b91c90771f6b7ff399ba2e gnome-themes-extra_3.28-5_amd64.deb +gnome-themes-extra-data 3.28-5 all 854250372b1e17260666f2f92258aff060c3299b82a220ff348cf5aa2534dbf9 gnome-themes-extra-data_3.28-5_all.deb +gnome-user-docs 50.0-0ubuntu1 all a02b2d43d6761b44d84ec9f4e106869ec23a4cf955c0cb12081f9bbfc8efc637 gnome-user-docs_50.0-0ubuntu1_all.deb +gnupg 2.4.8-4ubuntu3.1 all f8e4e754a843b1334e90092aac4c24433836d0756c996f37822d33905f2596e5 gnupg_2.4.8-4ubuntu3.1_all.deb +gpg-wks-client 2.4.8-4ubuntu3.1 amd64 5cec1674a1c09cfb5d5eeb0f8fcb37a2ae5396b6271946d133c6755320fc1e0a gpg-wks-client_2.4.8-4ubuntu3.1_amd64.deb +groff-base 1.23.0-10 amd64 ffd67d3d60092b772b8276fb087f5a328a7ee7dafba197f16fc874cba5320279 groff-base_1.23.0-10_amd64.deb +grub-common 2.14-2ubuntu2.1 amd64 7be8b3a7e40ea3f4d125521291cecda828f2051419472d167896d78b011d90f6 grub-common_2.14-2ubuntu2.1_amd64.deb +grub2-common 2.14-2ubuntu2.1 amd64 588adef32c4e4cb41f3cb82a0d0d24e5200e69071f4febeda91a84889217b2d1 grub2-common_2.14-2ubuntu2.1_amd64.deb +gsettings-desktop-schemas 50.0-1ubuntu2 all 491a48fd8f64611584e08be7069ffc0aa2b1a97c8fef38c1c9239a5b590369fd gsettings-desktop-schemas_50.0-1ubuntu2_all.deb +gsettings-ubuntu-schemas 0.0.7+21.10.20210712-0ubuntu4 all fc2a103eaa71218206013f6f07aa234bf4d8c0f2fd6f412d3addf09d91eef295 gsettings-ubuntu-schemas_0.0.7+21.10.20210712-0ubuntu4_all.deb +gst-audio-thumbnailer 1.0.0-0ubuntu1 amd64 10c58092417e275eb7eced7dcf3f544f42f892149537ffa6efb3f014d0b6f20d gst-audio-thumbnailer_1.0.0-0ubuntu1_amd64.deb +gst-video-thumbnailer 1.0.0-0ubuntu1 amd64 92a9e31d167a2e07ce2aec86c334decbba0799ae8b39de09f183932e97b068da gst-video-thumbnailer_1.0.0-0ubuntu1_amd64.deb +gstreamer1.0-alsa 1.28.2-1 amd64 0032c217aa171f4be9f002ee701dfa36e7fa27ffc2e75087a430f4e96fb6e5e3 gstreamer1.0-alsa_1.28.2-1_amd64.deb +gstreamer1.0-gl 1.28.2-1 amd64 aa92038413d2ed5f07c22fb396840b284bae8399f1ae7786d94bb48fea0d40a5 gstreamer1.0-gl_1.28.2-1_amd64.deb +gstreamer1.0-packagekit 1.3.4-3ubuntu1.2 amd64 4d0a0f3f19a298878ee888cd303305395889416db0995e66276d7beca586cf08 gstreamer1.0-packagekit_1.3.4-3ubuntu1.2_amd64.deb +gstreamer1.0-pipewire 1.6.2-1ubuntu1.1 amd64 19295cf1ca0e20eb755f4c0c284e5379d036f96bfb28ff5a4ed7f4eccfe23e3f gstreamer1.0-pipewire_1.6.2-1ubuntu1.1_amd64.deb +gstreamer1.0-plugins-base 1.28.2-1 amd64 6389c16d6133e72c6619d295bc3675a89141dbe81868ecf26b55e81baaa26e7a gstreamer1.0-plugins-base_1.28.2-1_amd64.deb +gstreamer1.0-plugins-base-apps 1.28.2-1 amd64 da22a622e6149053492c065c95220cbba91b7d952d2b9a7719c2b091c4a4b7a2 gstreamer1.0-plugins-base-apps_1.28.2-1_amd64.deb +gstreamer1.0-plugins-good 1.28.2-2ubuntu0.1 amd64 6d66475d950ef45b4f33908c496f3044deacd0db25f2738b1460b322e87d9916 gstreamer1.0-plugins-good_1.28.2-2ubuntu0.1_amd64.deb +gstreamer1.0-tools 1.28.2-1 amd64 f78ede6b2d0c94007d462f009b8dff08471f9dec72b1ca0d758f87cb41dc7a2c gstreamer1.0-tools_1.28.2-1_amd64.deb +gstreamer1.0-x 1.28.2-1 amd64 4d37e49a702394a3a95dd40ccde5b3c3fbee4139f86eb06e580f3704dd831f56 gstreamer1.0-x_1.28.2-1_amd64.deb +gtk-update-icon-cache 4.22.4+ds-0ubuntu0.1 amd64 d9cc7406c53f609ab81cb5b95b965ab926f711d7d7ea0711151cf36d5c1f2826 gtk-update-icon-cache_4.22.4+ds-0ubuntu0.1_amd64.deb +gtk2-engines-murrine 0.98.2-4ubuntu1 amd64 c31cc39a0c578f3e0bc5f8a75b35ffc66efe12855ac6ea97124d610073f4a0c9 gtk2-engines-murrine_0.98.2-4ubuntu1_amd64.deb +gtk2-engines-pixbuf 2.24.33-10 amd64 7f3c1edcea66228effc506b3b1a02aff7489d8626b7900419c8afbd4b0b5a141 gtk2-engines-pixbuf_2.24.33-10_amd64.deb +gvfs 1.60.0-1 amd64 1d058f1415c579b0c9bb6f6588c85a25240c4fa6c5c334043ef642e5eb1bd9d6 gvfs_1.60.0-1_amd64.deb +gvfs-backends 1.60.0-1 amd64 47539a412eddf1cee2177c70bd01da7f2fe21f5a35868edbfe1e777f58f0c178 gvfs-backends_1.60.0-1_amd64.deb +gvfs-common 1.60.0-1 all a280c7264c469e06a3df31e5fe8581adddf7a071d7722797738af2bd92488248 gvfs-common_1.60.0-1_all.deb +gvfs-daemons 1.60.0-1 amd64 dd047e0a614dacc96762a1030314eb2fab2e065e66d1a30f6ecc7cbb5aac426f gvfs-daemons_1.60.0-1_amd64.deb +gvfs-fuse 1.60.0-1 amd64 b6bce8501e70ee42738e89d5166d18ebff03322782a08e81b5c066249fa97403 gvfs-fuse_1.60.0-1_amd64.deb +gvfs-libs 1.60.0-1 amd64 201416c07aeccf80838f6e2ea7991c2f69039b2259a98b91bfbc1527dc1df433 gvfs-libs_1.60.0-1_amd64.deb +heif-gdk-pixbuf 1.21.2-3ubuntu0.4 amd64 6df182c82992359537e1e1440901cf69a9eb64b554d3e295ea3f28266afcdd0c heif-gdk-pixbuf_1.21.2-3ubuntu0.4_amd64.deb +heif-thumbnailer 1.21.2-3ubuntu0.4 amd64 95523beeec9ae5c34af9abc41f328864e627c7626dd4c89f77fe116edc7397a6 heif-thumbnailer_1.21.2-3ubuntu0.4_amd64.deb +hicolor-icon-theme 0.18-2build1 all d05726c4a4dc15079ed2bd6ef633e7d6dca4c4be20296148b1c558dbd5a6c570 hicolor-icon-theme_0.18-2build1_all.deb +hplip 3.24.4+dfsg0-0ubuntu8.1 amd64 83840ce5ea10fe5b07129515ac6ab935869f83bbb7dfe47d6303b76ecea1b6d4 hplip_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +hplip-data 3.24.4+dfsg0-0ubuntu8.1 all b950f206c33b641217df8102a5e362f7600c58cc27709835904becf5ced3eeec hplip-data_3.24.4+dfsg0-0ubuntu8.1_all.deb +hunspell-en-us 1:2020.12.07-4build1 all 81820320c9bd2cbceef26783ef8d9f78e7deba57b1c47944ef82662a7632ad3e hunspell-en-us_1%3a2020.12.07-4build1_all.deb +hwctl 0.11.0-0ubuntu1 amd64 c4c6393598d467b56a85ae8c1146820ab76a94b83ffe47ea2d50adf5c5e6a7a4 hwctl_0.11.0-0ubuntu1_amd64.deb +ibus 1.5.34~rc2-1 amd64 4e08784f24ec54cbd28ffeb05518a684e5afb4d634dcf2e3c3d5a016ff430bc0 ibus_1.5.34~rc2-1_amd64.deb +ibus-data 1.5.34~rc2-1 all 0a767edbc7cfb46625b582638105e9ccfee8306cb5197c462ce55ec06dd1429b ibus-data_1.5.34~rc2-1_all.deb +ibus-gtk 1.5.34~rc2-1 amd64 554addd5de37663a727d1a10533e33cc69d9aed744c37d0a0b6db895e5d3c956 ibus-gtk_1.5.34~rc2-1_amd64.deb +ibus-gtk3 1.5.34~rc2-1 amd64 70ef1c0f5670fd0c1406085426e3ef0ad677aac644b290c0598222648af714b8 ibus-gtk3_1.5.34~rc2-1_amd64.deb +ibus-gtk4 1.5.34~rc2-1 amd64 88208f87c4b68592f652732c55309501c7a51b7962c0641c2a138e8e4f5b6daf ibus-gtk4_1.5.34~rc2-1_amd64.deb +ibus-table 1.17.16-1build1 all 76be4846deaa16ad325ea238628dbe628d7c257c0cbdb3f6a6abaca82c541f57 ibus-table_1.17.16-1build1_all.deb +ibverbs-providers 61.0-2ubuntu3 amd64 2bc9b503295271f8dd82cf40644a4a9b3af86e1bfb93c3396aa96c1c56ad34b4 ibverbs-providers_61.0-2ubuntu3_amd64.deb +iio-sensor-proxy 3.8-1 amd64 73b84bd1bb96ab4874d86e2818c3e0a992e8071a959c86650255c2160ea7e074 iio-sensor-proxy_3.8-1_amd64.deb +im-config 0.62 all 20a83ff67deb010b3481cb58dfd7a7b099c21342d537d9b9f82714f59dd00e17 im-config_0.62_all.deb +initramfs-tools-bin 0.151ubuntu1 amd64 83301b7dd2a75b441df2bbfb33effac401c52d5eb61475e206eeaf09151e9db4 initramfs-tools-bin_0.151ubuntu1_amd64.deb +initramfs-tools-core 0.151ubuntu1 all 09a2413b6d4e5719c795ed9fd3b6b6e3396274513d6d8b232ca79dc6d9ebc46c initramfs-tools-core_0.151ubuntu1_all.deb +inputattach 1:1.8.1-2build2 amd64 ff86079a30e84f6f2ee1540b4dcdf1ca08e692b9490b4934be5450ecc6e7e51c inputattach_1%3a1.8.1-2build2_amd64.deb +ipmitool 1.8.19-10ubuntu1 amd64 11730b6274a3c1365c43e5a649e96628469394a584eeae12f980ecd84ac9e795 ipmitool_1.8.19-10ubuntu1_amd64.deb +ipp-usb 0.9.31-1 amd64 e2619fada03a5061350c82db7a45be95ee5837029f8a1b7272adf4fa5398850a ipp-usb_0.9.31-1_amd64.deb +iproute2 6.19.0-1ubuntu1.1 amd64 05e53ae079adf844a11d1a531acd96b2b2021be130ac2f0bd49166bce3bd0f98 iproute2_6.19.0-1ubuntu1.1_amd64.deb +iptables 1.8.11-2ubuntu3 amd64 187b16f9375f53ce6a1618a29de52bb177b620589ada29e4a3e25de5d594e66f iptables_1.8.11-2ubuntu3_amd64.deb +iso-codes 4.20.1-1 all 7df9871f8f18c779cca92b04c87f6e727f4e11caa3bf0f233ff7d10a9ad2bb0d iso-codes_4.20.1-1_all.deb +iw 6.17-1 amd64 5addb9bf7cddd0b0582d1bfe62f003598368cf15b0604584821a24b81326296a iw_6.17-1_amd64.deb +jq 1.8.1-4ubuntu2 amd64 bb7f69de12414f6e52eea1da952ed7226b8e3fd9db74f93bb8ea3f2f39f4836f jq_1.8.1-4ubuntu2_amd64.deb +kbd 2.7.1-2ubuntu2 amd64 1399e779f027563729c1895ba3ac314e2ea966e37e5c984840d689298352934e kbd_2.7.1-2ubuntu2_amd64.deb +kdump-tools 1:1.10.7ubuntu3 amd64 d886c44f8171c8cb033ac8e26e494d195c145520911bf1c84cf66364753a6e57 kdump-tools_1%3a1.10.7ubuntu3_amd64.deb +kexec-tools 1:2.0.32-3ubuntu1 amd64 13605d639a06aac649ab3181ea02f33a2b9b501e47c6b8ba5dc03bf94b9b5c74 kexec-tools_1%3a2.0.32-3ubuntu1_amd64.deb +keyboard-configuration 1.237ubuntu3.1 all 65b766338253578922435d755873baae2c4c008623181eb85ff7ddbfbfe7cf32 keyboard-configuration_1.237ubuntu3.1_all.deb +klibc-utils 2.0.14-1ubuntu2 amd64 642657e87e56184a3d696f35019531ece1f7fd1b220c3df79776e7dba756cc16 klibc-utils_2.0.14-1ubuntu2_amd64.deb +kmod 34.2-2ubuntu2 amd64 5595fb6bb2fba1dc53e005e17d24a389450296bdc5defb19dbcc0aa0ae33ae91 kmod_34.2-2ubuntu2_amd64.deb +language-selector-common 0.228build1 all 4d5dba0f03c9862803a29499bc0010907a4d93898a455cfce65f6a485d3a4bed language-selector-common_0.228build1_all.deb +language-selector-gnome 0.228build1 all be0ce5cd9cc184a88dc7c3ce02a2dce23d258b4b2b828c916f9ca08325681f81 language-selector-gnome_0.228build1_all.deb +laptop-detect 0.16+nmu1build1 all dec803016e6f7c30d6dfe104ba5874f8342985608d7db96c95cb647a0f91fdf6 laptop-detect_0.16+nmu1build1_all.deb +ldap-utils 2.6.10+dfsg-1ubuntu5 amd64 ff4e8b04702304536f412378bcc1271ec196b0e99461245290d4a6cae4fa0fc8 ldap-utils_2.6.10+dfsg-1ubuntu5_amd64.deb +less 668-1build1 amd64 45720ff981ef4c34b44e62cf1b5fd73dcb3d16031120387307e899f480d78092 less_668-1build1_amd64.deb +libaa1 1.4p5-51.1build1 amd64 29d70bf6215e766de874e13b242de0fd168c6e769ae20d93089830d99478aefe libaa1_1.4p5-51.1build1_amd64.deb +libabsl20260107 20260107.0-4 amd64 84c1afe45fdeada1772ab88be29e21b9e0970174bac3dc348e8f797d8f6f073f libabsl20260107_20260107.0-4_amd64.deb +libaccountsservice0 23.13.9-8ubuntu5.2 amd64 4c3bca934a145513f39fbc9ff1baa98e422b4b293a3b4a07534ad995850e01c9 libaccountsservice0_23.13.9-8ubuntu5.2_amd64.deb +libadwaita-1-0 1.9.1-0ubuntu0.1 amd64 b8634157cc1efd09fee058e19df34faf004e536b0410b13367e814fb3f2b190b libadwaita-1-0_1.9.1-0ubuntu0.1_amd64.deb +libao-common 1.2.2+20180113-1.2ubuntu2 all bf04acc24a9fca9b23b70138668931c73740fc7762e79f5673aa7d36799eaef1 libao-common_1.2.2+20180113-1.2ubuntu2_all.deb +libao4 1.2.2+20180113-1.2ubuntu2 amd64 e29b0d0da895ed0d6f295f685fdfd15f78902c82cee72d1724f9961f735680f3 libao4_1.2.2+20180113-1.2ubuntu2_amd64.deb +libaom3 3.13.1-2ubuntu0.1 amd64 74d46764b6b336d15682fb7d6203e6e1052be4ffb1ec371237989bab59fa829d libaom3_3.13.1-2ubuntu0.1_amd64.deb +libapparmor1 5.0.2-0ubuntu1~26.04.1 amd64 50570ebe581bbfeead4403571b75ee275955c6bcbd1b4bf342228772549162b9 libapparmor1_5.0.2-0ubuntu1~26.04.1_amd64.deb +libappstream5 1.1.2-1 amd64 7269ad98c70e9696ba3b8d78ca2c876224acfd0b2a3bb960e7f23a2c8d2207cb libappstream5_1.1.2-1_amd64.deb +libarchive13t64 3.8.5-1ubuntu2.2 amd64 3e069924c6d18381485c9cfa148f290dc3e8c8f31720aee8f1943c704116a361 libarchive13t64_3.8.5-1ubuntu2.2_amd64.deb +libasound2-data 1.2.15.3-1ubuntu1.1 all aad0eb27b9fab12c9fa9ed0b223c7ce871003fd3a564ad8eca4ecdea978ac347 libasound2-data_1.2.15.3-1ubuntu1.1_all.deb +libasound2t64 1.2.15.3-1ubuntu1.1 amd64 96e20cf5c9095ef54ba46fccffea5c01cf2de17a1012c5683a67e43504a6d726 libasound2t64_1.2.15.3-1ubuntu1.1_amd64.deb +libaspell15 0.60.8.2-3 amd64 dca532c0b95cfd23580dfc613f3525efd878c0451c2e85a54bea26324eeb1d56 libaspell15_0.60.8.2-3_amd64.deb +libasyncns0 0.8-7 amd64 952ea8a8d01a4fe98ff8379553a7a3764492897464c2684105f76ebb6b19939a libasyncns0_0.8-7_amd64.deb +libatasmart4 0.19-6 amd64 335bc0c05e62ce81e5cc05424bf75baa0a56f288e1e9a3c59618f85b99d44607 libatasmart4_0.19-6_amd64.deb +libatk-adaptor 2.60.4-0ubuntu0.1 amd64 79c0fe32b0dd6e5c8eaa6879bc9d5280951247573d5d3dc01a3e81027d2c8e69 libatk-adaptor_2.60.4-0ubuntu0.1_amd64.deb +libatk-bridge2.0-0t64 2.60.4-0ubuntu0.1 amd64 c634e1fd25dff5d0ff5384bf3ac9d784725e776448591283cee67deaced29c27 libatk-bridge2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +libatk1.0-0t64 2.60.4-0ubuntu0.1 amd64 6308ae8c10599780f0e672a39930c07639523bf3f7406f90ee7dada6acd505a0 libatk1.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +libatomic1 16-20260322-1ubuntu1 amd64 82fa61135e7154d7958feaa91ec1808a688eb1e0e06822ab35e99e2480feb148 libatomic1_16-20260322-1ubuntu1_amd64.deb +libatopology2t64 1.2.15.3-1ubuntu1.1 amd64 44018a675fd0fa79176c9f3fa5440f16dfc62ccd5870d0336d7b13dbdab19ad7 libatopology2t64_1.2.15.3-1ubuntu1.1_amd64.deb +libatspi2.0-0t64 2.60.4-0ubuntu0.1 amd64 6db6e1d7d40f15d38ab5ec302463ac502a057560294d9c73ede22998f733fbd8 libatspi2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb +libauthen-sasl-perl 2.2000-1 all 859bdfa2180edb7d88081bb5cbfbc6a31e6560ca4632233d1d0c76d22e77fe27 libauthen-sasl-perl_2.2000-1_all.deb +libavahi-client3 0.8-18ubuntu1.1 amd64 a0677750521663c898d25ddd0566127712ff4803108ec67182330a27fce85774 libavahi-client3_0.8-18ubuntu1.1_amd64.deb +libavahi-common-data 0.8-18ubuntu1.1 amd64 db013cab614418c47073faac4e16f652cb4532458cd8b919f70c717f235d1091 libavahi-common-data_0.8-18ubuntu1.1_amd64.deb +libavahi-common3 0.8-18ubuntu1.1 amd64 2213977fd25dab90f3566d3163576955eb74dc89954c48ba6e2bd960fdcd45e2 libavahi-common3_0.8-18ubuntu1.1_amd64.deb +libavahi-core7 0.8-18ubuntu1.1 amd64 5c2b3ffd155675dcfc49f7da3f69648a021feaaeec38c9ff9185f5521015eb63 libavahi-core7_0.8-18ubuntu1.1_amd64.deb +libavahi-glib1 0.8-18ubuntu1.1 amd64 4e80e023d5b9d15cb65c15b100a8834d3d59f773d087e54a499e21a2a8e55358 libavahi-glib1_0.8-18ubuntu1.1_amd64.deb +libavc1394-0 0.5.4-5build4 amd64 00d5ebc6da7c640cdd03e4fd398d11e66afd3087f4cd2b73ee0d0efb372a5995 libavc1394-0_0.5.4-5build4_amd64.deb +libayatana-appindicator3-1 0.5.94-1build1 amd64 bd33f95efc37c2dfe11d8fd365524d124e96e48e4157c35bf0351fae3c494b9d libayatana-appindicator3-1_0.5.94-1build1_amd64.deb +libayatana-ido3-0.4-0 0.10.4-1build1 amd64 4370ae093a09ec3b5193b080937ba73a23197c0d8aefb9b0ef964fbe156bb53a libayatana-ido3-0.4-0_0.10.4-1build1_amd64.deb +libayatana-indicator3-7 0.9.4-2 amd64 e86190cb4138ded3e408527d41e7e2bd56a7c651b17e1a53e6b0eb46a2533309 libayatana-indicator3-7_0.9.4-2_amd64.deb +libbabeltrace1 1.5.11-5build1 amd64 ef5b7809f1d7fe9c62056bc970d15a43c621b11674a7a57d0ef2ccd61871014b libbabeltrace1_1.5.11-5build1_amd64.deb +libbasicobjects0t64 0.6.2-3build1 amd64 f310575ede5513d7f582da23ce4e9e38a10d2cefe08271829c884450e3080c96 libbasicobjects0t64_0.6.2-3build1_amd64.deb +libbinutils 2.46-3ubuntu2 amd64 1376a5e49c8dc2ba938fadc15fce40dd01c7fbf1adf2d506a2a7cf7148e347c8 libbinutils_2.46-3ubuntu2_amd64.deb +libblockdev-crypto3 3.4.0-1 amd64 a1eecb757023cbc88ff0f13c9f65d843ca74419417a29e3fea2cff612518b2a0 libblockdev-crypto3_3.4.0-1_amd64.deb +libblockdev-fs3 3.4.0-1 amd64 d18a23d5fdce332738e4784bd44450e57c6046d1b43fc180e69ab9daa4b5875e libblockdev-fs3_3.4.0-1_amd64.deb +libblockdev-loop3 3.4.0-1 amd64 7c0ce083bd60bfc65fee6d55c4050b39326d55c82afcfdd890d78c61142f7646 libblockdev-loop3_3.4.0-1_amd64.deb +libblockdev-mdraid3 3.4.0-1 amd64 f7ef2ac65630d37adae67180d424ea29f90d2850b73d0c2d904aa62dfad9d0f2 libblockdev-mdraid3_3.4.0-1_amd64.deb +libblockdev-nvme3 3.4.0-1 amd64 fa0ac345e58510dcef6102a8102bb09817deef65ab218a0f8216920a1e7e0bd5 libblockdev-nvme3_3.4.0-1_amd64.deb +libblockdev-part3 3.4.0-1 amd64 b9df3dee433e55262dbe0c29c49c70457874c5ac79e97880b78972abf36f9b6f libblockdev-part3_3.4.0-1_amd64.deb +libblockdev-smart3 3.4.0-1 amd64 1c1257fb1cd58cf21cc68e3dd6dcff4dccb65d10ade391047006f329247bd665 libblockdev-smart3_3.4.0-1_amd64.deb +libblockdev-swap3 3.4.0-1 amd64 c138e325d4aa11172ae076d84953b64dda2edacc30c3262fb5d848037c6b3e76 libblockdev-swap3_3.4.0-1_amd64.deb +libblockdev-utils3 3.4.0-1 amd64 f70cbf557395fed9df4589d961b281a65450329c9bccd179f4190bb1244c4eb1 libblockdev-utils3_3.4.0-1_amd64.deb +libblockdev3 3.4.0-1 amd64 c633448d605b5aa028184c60a1240b942fa2896b46ee1c832ac524c26347cffa libblockdev3_3.4.0-1_amd64.deb +libbluetooth3 5.85-4ubuntu0.2 amd64 b78dddd9ea8caf8ae075be519b79ca69689f6b8ce98727f0942cb81fcb0c69f9 libbluetooth3_5.85-4ubuntu0.2_amd64.deb +libbpf1 1:1.6.3-1ubuntu1 amd64 ec7e4acb71b824e218da4d78496b44827d2a33100e7230732002d3459872e993 libbpf1_1%3a1.6.3-1ubuntu1_amd64.deb +libbrlapi0.8 6.7-1ubuntu6 amd64 b3218fd4461a1b5f59cc28b5213e521cf251f0d55fd068c02c15d2777ff4c305 libbrlapi0.8_6.7-1ubuntu6_amd64.deb +libbrotli1 1.2.0-3build1 amd64 858242571fc2585c1f8eb83ae01d020f0f4a92679d0de8fe31146f6687bdd84a libbrotli1_1.2.0-3build1_amd64.deb +libbytesize-common 2.12-1 all cb6b60c0a0f6f0876b3d5cc2ff6d7a8ac678090df3ffb780ed62c45cc74a3448 libbytesize-common_2.12-1_all.deb +libbytesize1 2.12-1 amd64 8360d35d1d98e7ce7a2e0d1084bac7ff2d63abf9c0dcbfa57799b23efe3c3d13 libbytesize1_2.12-1_amd64.deb +libc6-dbg 2.43-2ubuntu2.4 amd64 523851368691971a1553c7dacc7cf9e0cd54a78ca70bbdd735d932f16e089ae3 libc6-dbg_2.43-2ubuntu2.4_amd64.deb +libcaca0 0.99.beta20-6ubuntu2.1 amd64 b96575004d6529c128492bf21a937f97c7728e4c88a19a50b4d9eee950780170 libcaca0_0.99.beta20-6ubuntu2.1_amd64.deb +libcairo-gobject-perl 1.005-4build4 amd64 3156aef0a54b1c864105e951fc61e6fd02c733716a8424895229e5fcbfb0d691 libcairo-gobject-perl_1.005-4build4_amd64.deb +libcairo-gobject2 1.18.4-3 amd64 1d48661d59bb164fc27e88bb8e6a8dab0cdfdbf35ea5d2bbf3ebffe849a38822 libcairo-gobject2_1.18.4-3_amd64.deb +libcairo-perl 1.109-5build1 amd64 e8abeb2e59db3df6384bbc62b1ca1286c011b6ed977a38e6323718421e60a588 libcairo-perl_1.109-5build1_amd64.deb +libcairo-script-interpreter2 1.18.4-3 amd64 516ad272f711e3c4550307ff6d6e1cbc828e3f4744471ffa0389430739197c81 libcairo-script-interpreter2_1.18.4-3_amd64.deb +libcairo2 1.18.4-3 amd64 525ab7b5ad6529ea35aa09308ddd1fd2325c85ad70e7483ba66b526d8ee9f7a7 libcairo2_1.18.4-3_amd64.deb +libcamel-1.2-64t64 3.56.2-8 amd64 2f69745dd71354ee00e4243159168fe73678cc52a8ae4f89afbda91514282971 libcamel-1.2-64t64_3.56.2-8_amd64.deb +libcanberra-gtk3-0 0.30-18ubuntu3 amd64 454c4152ede8df500babd20649ca94e7865c3fa3a6ba82e5cbfdaf6c28baac32 libcanberra-gtk3-0_0.30-18ubuntu3_amd64.deb +libcanberra-gtk3-module 0.30-18ubuntu3 amd64 6f65c709a9a368b2501c23e007352e402bcc0e8e390609519d557d1d88be4498 libcanberra-gtk3-module_0.30-18ubuntu3_amd64.deb +libcanberra-pulse 0.30-18ubuntu3 amd64 0cd567060da8080ead8656d97370e74918680b612f5fd832ea39afdb154246a4 libcanberra-pulse_0.30-18ubuntu3_amd64.deb +libcanberra0 0.30-18ubuntu3 amd64 c31767686f429f84db8723d7b864bf829e24269f235228415262fb52752cc667 libcanberra0_0.30-18ubuntu3_amd64.deb +libcap2 1:2.75-10ubuntu2 amd64 150603a0792b1d22aa0bde0a26c27b413018c799284003e4b43cba587a5b3a18 libcap2_1%3a2.75-10ubuntu2_amd64.deb +libcap2-bin 1:2.75-10ubuntu2 amd64 d92a8f9affbd2277d191e65978ba2a194d00d00a04f52ee9d1bca2a2ba26697d libcap2-bin_1%3a2.75-10ubuntu2_amd64.deb +libcares2 1.34.6-1 amd64 163c4c1b52abbd150dd3d1e112cbf2db528d75c09146b36f69f535218319ce23 libcares2_1.34.6-1_amd64.deb +libcbor0.10 0.10.2-2ubuntu3 amd64 97153fe6f78a737d08227e7df8b185ddb064e69febdea8993ebde37a97b2527f libcbor0.10_0.10.2-2ubuntu3_amd64.deb +libcdio-cdda2t64 10.2+2.0.2-2 amd64 d9863ed4c0e5591bbb3cbfe163005bcd529cc5fca3d439c1b3ae864e8c3c7440 libcdio-cdda2t64_10.2+2.0.2-2_amd64.deb +libcdio-paranoia2t64 10.2+2.0.2-2 amd64 eec8f3e7074d73520122a503ade4620c91151611383451ff9ceffbf98b76aa6c libcdio-paranoia2t64_10.2+2.0.2-2_amd64.deb +libcdio19t64 2.2.0-4build1 amd64 6643707a81accf28c9a3b6c205e945a460343f9a26867a831ed4e62ef421fadd libcdio19t64_2.2.0-4build1_amd64.deb +libcdparanoia0 3.10.2+debian-14ubuntu2 amd64 f40173218707554907b32bb3f3d695817f7fb1bf3b0e7acb9746a5ac69a56ebb libcdparanoia0_3.10.2+debian-14ubuntu2_amd64.deb +libclone-perl 0.47-1 amd64 93718230fcba6109ee3f7c3076496e85dcfb440692d1a68cd1b011ef749105a0 libclone-perl_0.47-1_amd64.deb +libcollection4t64 0.6.2-3build1 amd64 92cf4d36ead1d45befaf898944301c9198b2862b6657b24fbab08f4aa119eafc libcollection4t64_0.6.2-3build1_amd64.deb +libcolord-gtk4-1t64 0.3.1-2 amd64 a9c38484d7baa9c4a07e5dcde89382d707a6f50d22a9de4a7b15b026154a4e86 libcolord-gtk4-1t64_0.3.1-2_amd64.deb +libcolord2 1.4.8-3 amd64 063718186165d691f1b14d77d6ae7abefaf567c7331a463cbe97fa4a1e0b0fac libcolord2_1.4.8-3_amd64.deb +libcolorhug2 1.4.8-3 amd64 9788d12ff3b66451918b1689aca52d39ef09775b423fb46846bd2948cef7596d libcolorhug2_1.4.8-3_amd64.deb +libcrack2 2.9.6-5.2build3 amd64 7236fa656d64c8d99fddf1bf108ecc9bb408e821d1bd4f684b1f0ac70467628c libcrack2_2.9.6-5.2build3_amd64.deb +libcrypt-urandom-perl 0.55-1 amd64 a243fe9d0c0a2cba1425031aca048fcc7dfc8a05ec13e59e4da498f9b56d593e libcrypt-urandom-perl_0.55-1_amd64.deb +libcryptsetup12 2:2.8.4-1ubuntu4 amd64 b391ec9f41abc8d303c0ac90105a69737f901d427f1c29a267346c0ad73fa56c libcryptsetup12_2%3a2.8.4-1ubuntu4_amd64.deb +libctf-nobfd0 2.46-3ubuntu2 amd64 5ca038ae110ddf65e190b9fe88822592abd45cecba5001f3e4ce7692ca1f31be libctf-nobfd0_2.46-3ubuntu2_amd64.deb +libctf0 2.46-3ubuntu2 amd64 34b1757ce619720541c7e1e8d8f3aa506cb327731374e284ffb6ec872a2c566f libctf0_2.46-3ubuntu2_amd64.deb +libcue2 2.2.1-4.2 amd64 6495164789f5e923a7cbb2dc8343a7e773fdce7210e0fcdb2df72c2629860365 libcue2_2.2.1-4.2_amd64.deb +libcups2t64 2.4.16-1ubuntu1.3 amd64 2617a78cbd830310e31813420ea34159347f1121709d2f00c93a87fa666bfcda libcups2t64_2.4.16-1ubuntu1.3_amd64.deb +libcupsfilters2-common 2.1.1-0ubuntu5 all 36e59e4278b8308c32a6d3a20ddbd6f64a4b20196b5dfbdfcf3eff80de9a845e libcupsfilters2-common_2.1.1-0ubuntu5_all.deb +libcupsfilters2t64 2.1.1-0ubuntu5 amd64 5987ad8579515ddda3b19d5cb8316dd93fd2bf0d2f138bb3f46b59d6f4cb3575 libcupsfilters2t64_2.1.1-0ubuntu5_amd64.deb +libcupsimage2t64 2.4.16-1ubuntu1.3 amd64 e84b07b6514be97845303ae010bd759280873bd9b5ce6ac1bec23ee445cc3850 libcupsimage2t64_2.4.16-1ubuntu1.3_amd64.deb +libcurl3t64-gnutls 8.18.0-1ubuntu2.5 amd64 2b0b6cbb1f025ba565baff58f28a24da6ecaccf8848ec068ca16498362aa1a33 libcurl3t64-gnutls_8.18.0-1ubuntu2.5_amd64.deb +libdaemon0 0.14-7.1ubuntu5 amd64 14e59626de6a35cffc5dcac463ca4fbb1c809ff3b81bca267c1edb8161fef7f7 libdaemon0_0.14-7.1ubuntu5_amd64.deb +libdata-dump-perl 1.25-1 all 91514d4b78329ea1bdf6f964613149d5b53ceaf90627998d65f13e306712f452 libdata-dump-perl_1.25-1_all.deb +libdatrie1 0.2.14-1 amd64 1ba5a9190119370912ec5955c8129cdf2780a098ed6c80e9ecca05cc515bd039 libdatrie1_0.2.14-1_amd64.deb +libdbus-1-3 1.16.2-2ubuntu4 amd64 af7be2be588d15a16c696ab43ba3e92bd5f9a6850e8780234059b02a67716e58 libdbus-1-3_1.16.2-2ubuntu4_amd64.deb +libdbusmenu-glib4 18.10.20180917~bzr492+repack1-4build1 amd64 92e0340601b2cae7bc3780f309bc7d1bef2812413a03a0430e92da638df8be15 libdbusmenu-glib4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +libdbusmenu-gtk3-4 18.10.20180917~bzr492+repack1-4build1 amd64 0e36b3dfba6349cd8d35bf59a64049ed43efc88e9f12e4bebd9d3093889ecba5 libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-4build1_amd64.deb +libdconf1 0.49.0-4 amd64 d7a12b52a4803bf3e4c270c9367db4ac20f03412a9dc948e0272348889a151bd libdconf1_0.49.0-4_amd64.deb +libdebuginfod-common 0.194-4 all 151b5cfce8702069ef2caaa09bba3af4e28415fcb87bc948465747a370402b0b libdebuginfod-common_0.194-4_all.deb +libdebuginfod1t64 0.194-4 amd64 2d1eacbaf69feb2ba6a775e53606b2bf85cd975f7a3832d4d46d414443241b6e libdebuginfod1t64_0.194-4_amd64.deb +libdecor-0-0 0.2.5-1 amd64 23ea4cd788fe5bf9883fd125dd1ac973db807b9a888dae70abde5bb9d2584de1 libdecor-0-0_0.2.5-1_amd64.deb +libdecor-0-plugin-1-gtk 0.2.5-1 amd64 b4cfcd3a52fe6863fd8fba353fbac279772512333877ac5d7043932da7a85a9f libdecor-0-plugin-1-gtk_0.2.5-1_amd64.deb +libdee-1.0-4 1.2.7+17.10.20170616-8build1 amd64 8d42f4debd53f4cfc1ccd53231fce9988ab214dd5df842f4672308afee29ab98 libdee-1.0-4_1.2.7+17.10.20170616-8build1_amd64.deb +libdeflate0 1.23-2ubuntu1 amd64 40ee517cffd3730405be6ae30826533bec0ddf8773bb7ac2cccd22a57acafc25 libdeflate0_1.23-2ubuntu1_amd64.deb +libdevmapper1.02.1 2:1.02.205-2ubuntu3 amd64 679251083dfdab47493131744496aac22a027104cce5617df890416891352b7d libdevmapper1.02.1_2%3a1.02.205-2ubuntu3_amd64.deb +libdex-1-1 1.1.0-1 amd64 17a112de72b8e45083d0a1cb05704d6ba42930ef5ca1cb1bd486b17a7e2de10b libdex-1-1_1.1.0-1_amd64.deb +libdhash1t64 0.6.2-3build1 amd64 80b86c174c04d4267f143cc66ddec5ba93fb06224636ada6ea2055e39d9ed6a1 libdhash1t64_0.6.2-3build1_amd64.deb +libdisplay-info3 0.3.0-1 amd64 91ab4717cc8cf4c6c591970e1ad165aace9c91f6283c8b5a2652ceebf571ccea libdisplay-info3_0.3.0-1_amd64.deb +libdjvulibre-text 3.5.29-1 all 54300431ee2e613382946baddc01ecd6135bb9d086ec914d0a727b8c14ce497b libdjvulibre-text_3.5.29-1_all.deb +libdjvulibre21 3.5.29-1 amd64 c0a3ffd95125ef0f12b4c38993f0485738f3a97a4ecfc663aae6b274b4384b0b libdjvulibre21_3.5.29-1_amd64.deb +libdotconf0 1.4.1-1build1 amd64 30a3316c7a9323238d019a01f37420c96ef8c8d73d3df0ecbe5e8652882821a0 libdotconf0_1.4.1-1build1_amd64.deb +libdrm-amdgpu1 2.4.131-1 amd64 f992d3b87be69d160d433626e2144f6446946143cb83bdc71adef71766783de0 libdrm-amdgpu1_2.4.131-1_amd64.deb +libdrm-common 2.4.131-1 all a32b8d623c04310d049cde28cdbbd339575cdc26c8dc741d7de708a954eff528 libdrm-common_2.4.131-1_all.deb +libdrm-intel1 2.4.131-1 amd64 77411c3b93c8756862a18ccaa4413a65777f40819abdd1468954ba859c8aa740 libdrm-intel1_2.4.131-1_amd64.deb +libdrm-nouveau2 2.4.131-1 amd64 18d713650e23febe76e127b7419e49eded0ecb83bad4ec8050cd6a11a4adcb71 libdrm-nouveau2_2.4.131-1_amd64.deb +libdrm-radeon1 2.4.131-1 amd64 5497783eae2652128ea00f1f0aeac940ab5b079137191bf6d58d789d4908e841 libdrm-radeon1_2.4.131-1_amd64.deb +libdrm2 2.4.131-1 amd64 b87e6f715d0795a88b53fbe268004a1acbd0d728da0cc0ab9108aff5ab4e1929 libdrm2_2.4.131-1_amd64.deb +libduktape207 2.7.0+tests-0ubuntu4 amd64 cf32ab1bc85d6426743ac9f4769d4489519e3ee9967d85d5662f0d52d024712f libduktape207_2.7.0+tests-0ubuntu4_amd64.deb +libdv4t64 1.0.0-17.1build2 amd64 1574d30cd72fdb2b26c8c06fd20c69d7f65bb39e4d1ca5db885069202cddb1ee libdv4t64_1.0.0-17.1build2_amd64.deb +libdw1t64 0.194-4 amd64 5b3812ee2a663fef35e71fc1b9d6e29379bf9c38ac67ec954390e117513234b7 libdw1t64_0.194-4_amd64.deb +libeatmydata1 131-2build1 amd64 eb5e950cb18e85d26e749a2b9e92a56177038e93c7eef35c388bdccb9a51abb3 libeatmydata1_131-2build1_amd64.deb +libebackend-1.2-11t64 3.56.2-8 amd64 45b91540d36f72e6502a1521a7072180ddfda9d3b63f816b2c124d6f29613a3e libebackend-1.2-11t64_3.56.2-8_amd64.deb +libebook-1.2-21t64 3.56.2-8 amd64 aa0d683f7ca6c7bf76e3eb98a39b83b056cf0ce124f7609b484e5c1981cca489 libebook-1.2-21t64_3.56.2-8_amd64.deb +libebook-contacts-1.2-4t64 3.56.2-8 amd64 8f5a6766829a6b3e18bd956e2e645316b9f0f54174a3f8b2127bd8004c0def8d libebook-contacts-1.2-4t64_3.56.2-8_amd64.deb +libecal-2.0-3 3.56.2-8 amd64 ed72235014e135632af481346f3eed6f4edc5874c096a0a0d8ee206f0c1459e1 libecal-2.0-3_3.56.2-8_amd64.deb +libedata-book-1.2-27t64 3.56.2-8 amd64 f85a9a99611eb9b3d9cdb191040c4d2d7f49eacfbc945b8794990876c8ef0a7d libedata-book-1.2-27t64_3.56.2-8_amd64.deb +libedata-cal-2.0-2t64 3.56.2-8 amd64 e64fd2baaf7597dd1787eda671453962cc996ebcd0c775c2570509d161fbd6f3 libedata-cal-2.0-2t64_3.56.2-8_amd64.deb +libedataserver-1.2-27t64 3.56.2-8 amd64 a2ec776c97a2ad89b557ca07e0eecb8133878fcc3e26832c00a75ab8b9c08bfd libedataserver-1.2-27t64_3.56.2-8_amd64.deb +libedataserverui-1.2-4t64 3.56.2-8 amd64 1815c1576891c95ac7d417776488aca75e5ac5533f4a3f2459a3d805ae8e2ea3 libedataserverui-1.2-4t64_3.56.2-8_amd64.deb +libedit2 3.1-20251016-1 amd64 22338fcbcaae99f67ca7b2e20d1730bc29d3c02bcd2414e457f99be96442ee29 libedit2_3.1-20251016-1_amd64.deb +libeditorconfig0 0.12.10+~0.17.1-3ubuntu0.1 amd64 382d0dc3141e74be93ea675893168b3a198e5fcfe9c36d7dcb68d40e4b06b0f7 libeditorconfig0_0.12.10+~0.17.1-3ubuntu0.1_amd64.deb +libefiboot1t64 39-2 amd64 0449451d9aef91d5f7eaa50862908b3f7ce49619f8a7c11ee0a7aea2b5c6b744 libefiboot1t64_39-2_amd64.deb +libefivar1t64 39-2 amd64 32b7887c6a8dcf8d1a71c57702b6d794709fb55fb8013b353197c8e9dfe309ce libefivar1t64_39-2_amd64.deb +libegl-mesa0 26.0.8-1ubuntu0.3 amd64 938813d9d6bb7ccf8315af1f8bb2770ad4b9d240ad177f0da420db3e94600d6b libegl-mesa0_26.0.8-1ubuntu0.3_amd64.deb +libegl1 1.7.0-3 amd64 cf2a6549bbc4339671901bde97c0ca41c380c5783179ef68977bf86151f03766 libegl1_1.7.0-3_amd64.deb +libei1 1.5.0-3 amd64 d3b0b40cb7cf3686c0aaebf6e6b4e11c8903d295fb9b5ffc9e66d99cf8448f7b libei1_1.5.0-3_amd64.deb +libeis1 1.5.0-3 amd64 c676058cef2ae12884cb63b644c3d7188d5e04e455824307b927af008bf94668 libeis1_1.5.0-3_amd64.deb +libelf1t64 0.194-4 amd64 c2feae172b14d2a8317348023c5e0b6572314c097a9f7b8225c62b0988cc8d92 libelf1t64_0.194-4_amd64.deb +libenchant-2-2 2.8.2+dfsg1-3build1 amd64 065fbd885526f31285914daffebcd4a28a65162504fc13f879e188de9e4f7920 libenchant-2-2_2.8.2+dfsg1-3build1_amd64.deb +libencode-locale-perl 1.05-3 all 11c7ea66f45a1447cc90b3b12d30f8ae30e0aaa16f6808878ca1be04e1dca763 libencode-locale-perl_1.05-3_all.deb +libepoxy0 1.5.10-2build1 amd64 2f4525535b2c7c6d61cc5c131f1cb3f5c0d70177ccf550a05f80d12016dfcfdf libepoxy0_1.5.10-2build1_amd64.deb +liberror-perl 0.17030-1 all cb85c869fe056e9e466efcfa3403408b0a87db1da1cafa585140a9be59fe58a1 liberror-perl_0.17030-1_all.deb +libespeak-ng1 1.52.0+dfsg-5build1 amd64 73f01703f367560ca5f4acad10d00058ac103a0db46cf0a722e1eec8de2b7251 libespeak-ng1_1.52.0+dfsg-5build1_amd64.deb +libevdev2 1.13.6+dfsg-1 amd64 34bd437962ea3eaf32b75b5f0dd07447d2ace9d9065e76d2ebf69154f3b54d5a libevdev2_1.13.6+dfsg-1_amd64.deb +libexempi8 2.6.6-2build1 amd64 f08f87b4c41a4ccf6f537e59c504eac03dc1a4b1f6ce547e146bd5056d241f14 libexempi8_2.6.6-2build1_amd64.deb +libexif12 0.6.25-2ubuntu0.1 amd64 b367c14a9da0f6c4356cf8b2615ad847242ad7e647daea6f19a45fea644298c4 libexif12_0.6.25-2ubuntu0.1_amd64.deb +libexiv2-28 0.28.8+dfsg-1 amd64 d6ce2c1699dcbccf64a5c90c1774ac143c757ca9ab737d9609456e3aed06a97f libexiv2-28_0.28.8+dfsg-1_amd64.deb +libexiv2-data 0.28.8+dfsg-1 all 5a1796235e89d4eca0703d70029eab9bcf0247e09001075ca62da6e6d534328f libexiv2-data_0.28.8+dfsg-1_all.deb +libexpat1 2.7.4-1 amd64 ef78089497946219cac03209d951bbfff93480104e791b770a7bf6429452e475 libexpat1_2.7.4-1_amd64.deb +libextutils-depends-perl 0.8002-1 all dce81d59f6f8a8c55f31a645ba140c47695c86ded461ef6735fb159ad1332449 libextutils-depends-perl_0.8002-1_all.deb +libfdisk1 2.41.3-3ubuntu2.2 amd64 38c1e94e279ae2bee0e6dd2a7cb8787e2e549f792bf49bde5204dd60a8292441 libfdisk1_2.41.3-3ubuntu2.2_amd64.deb +libffi8 3.5.2-4 amd64 4a7423124bbd459c0aa38b7389ec7802fa6899654767a95fc27de70967fedd48 libffi8_3.5.2-4_amd64.deb +libfftw3-single3 3.3.10-2fakesync1build3 amd64 716e082f8b472d7447d394913ddf0067ab60b31f35ef014dbcecc610e6560e93 libfftw3-single3_3.3.10-2fakesync1build3_amd64.deb +libfido2-1 1.16.0-2build1 amd64 e74f757c08a3c9827453de9986101b43ca1069de6be9b8a7eeb438943f73f11f libfido2-1_1.16.0-2build1_amd64.deb +libfile-basedir-perl 0.09-2 all 508a573da1e7f57217a03738109cd734a7edb73c43197085004dcdec2b3ad8ea libfile-basedir-perl_0.09-2_all.deb +libfile-desktopentry-perl 0.23-1 all ee2331bef27fb35121714aba564d57a9fc038f204a8555573bbb66f0898fbc38 libfile-desktopentry-perl_0.23-1_all.deb +libfile-listing-perl 6.16-1 all d37a2a2f6998b3db159f469f04eff9d44fda75d49ebaeb824d047b235d827bbe libfile-listing-perl_6.16-1_all.deb +libfile-mimeinfo-perl 0.36-2 all 4d56f38e13b76b11b0c5a2b6216efe14026788905a1c305f2e5af2fd7417c52f libfile-mimeinfo-perl_0.36-2_all.deb +libflac14 1.5.0+ds-5 amd64 ea6cbd9399a646b073d36d8d33444f39f9f1dd63f5fa8cd18906573f51cc305b libflac14_1.5.0+ds-5_amd64.deb +libflashrom1 1.6.0-2ubuntu1.1 amd64 052e3cbcdc62affe59e8ee596abc0da63cce3e7f86ea46149b18fd06c3da05d4 libflashrom1_1.6.0-2ubuntu1.1_amd64.deb +libfont-afm-perl 1.20-4 all 8607b7a6845707e3ff97ee0790e04002710f1aaf4094e0aeca050a104bddb1a6 libfont-afm-perl_1.20-4_all.deb +libfontconfig1 2.17.1-3ubuntu1 amd64 72ba4fc43155566b46442b741a6892d5d1f1581ba58cdfd037aabf47ad9080f7 libfontconfig1_2.17.1-3ubuntu1_amd64.deb +libfontenc1 1:1.1.8-1build2 amd64 1fab0e125d793da45d91b346c334c496776d69709a7ea78c3b34d5db6db69eab libfontenc1_1%3a1.1.8-1build2_amd64.deb +libfprint-2-2 1:1.95.1+tod1-0ubuntu2 amd64 aa09cc1ac94608ac1dcaca0bfda0b172a466b6d6ad99a2fc8f5477c23222842a libfprint-2-2_1%3a1.95.1+tod1-0ubuntu2_amd64.deb +libfprint-2-tod1 1:1.95.1+tod1-0ubuntu2 amd64 aad2e14758121dede1d30aafed754374c7716f735e58074105eded2fb1c8ab9e libfprint-2-tod1_1%3a1.95.1+tod1-0ubuntu2_amd64.deb +libfreeaptx0 0.2.2-1build1 amd64 34bc0fc4708e3f901f63211715dfd93f647d97d26d02cc335d9b569c8036ce7f libfreeaptx0_0.2.2-1build1_amd64.deb +libfreeipmi17 1.6.16-1ubuntu0.1 amd64 b5cbdd3a27d0afef2b6fcc1a4f673af471cec0108c507df852dbd0e6e46c4c3a libfreeipmi17_1.6.16-1ubuntu0.1_amd64.deb +libfreerdp-server3-3 3.31.0+dfsg-0ubuntu0.26.04.1 amd64 25352bd5c4bcd537b021a2e8d5f703345522ed187a7da90f25c3bdac663bc0d1 libfreerdp-server3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +libfreerdp3-3 3.31.0+dfsg-0ubuntu0.26.04.1 amd64 ba51dbc5c2bce3de8515b04cc287a804424f651a4820ad52d91b8fe4a9461cc0 libfreerdp3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +libfreetype6 2.14.2+dfsg-1ubuntu0.1 amd64 6b4a9275b158307ecb4f6ba7088f2731b017b775a9b65c61afcb5b15be3e8cf5 libfreetype6_2.14.2+dfsg-1ubuntu0.1_amd64.deb +libfribidi0 1.0.16-5 amd64 47fb50e96401a46c06d5122cd04cc42316f65530b9f868d2d450576a379d5d34 libfribidi0_1.0.16-5_amd64.deb +libftdi1-2 1.6~rc1-1build1 amd64 180fb0080df4340c2890e94c08ef089c555521ec9f7e3ee7b85fd217d40acaf7 libftdi1-2_1.6~rc1-1build1_amd64.deb +libfuse3-4 3.18.2-1 amd64 59ae972173e389eb981aaeae874b3d6aafe7eceff284f94e5c21ee1d049548c6 libfuse3-4_3.18.2-1_amd64.deb +libfwupd3 2.1.1-1ubuntu3.1 amd64 6b2632406478ee905fcc26af5d27bdeabb5fc2a9c08bc218669a40e91a73eadb libfwupd3_2.1.1-1ubuntu3.1_amd64.deb +libfyaml0 0.9.4-1 amd64 fb93f8517a7fbabbe890fe6c35f4854f2890547d2b5b76532ee60060d4de94cd libfyaml0_0.9.4-1_amd64.deb +libgamemode0 1.8.2-2build1 amd64 b542a5ecae1c6674768b192ac98a031621d2b73252bb502f584533f28fb9bf31 libgamemode0_1.8.2-2build1_amd64.deb +libgamemodeauto0 1.8.2-2build1 amd64 9e05312a3ffd06da99a55bd324adc2eb166fb0e5a945d17de4905a10db5648ee libgamemodeauto0_1.8.2-2build1_amd64.deb +libgbm1 26.0.8-1ubuntu0.3 amd64 5d2d1eaf0f72c5a2c4aef692e5660c6fa61e46542c4d9cb5593ba8bd020b2eea libgbm1_26.0.8-1ubuntu0.3_amd64.deb +libgck-1-0 3.41.2-6 amd64 a8dd84aa3583486942728f2266a1d3b9d1fa5b2799b830bfe8e884d5da93cfa1 libgck-1-0_3.41.2-6_amd64.deb +libgck-2-2 4.4.0.1-8 amd64 d002ab48cfd02d17ea577d48871e6d6d47b9a25ea8211df51bee205cb41cf481 libgck-2-2_4.4.0.1-8_amd64.deb +libgcr-4-4 4.4.0.1-8 amd64 ddee1a92057340b19e604403443f23d43afb4d76188ce89576cdfabab0f3f4d7 libgcr-4-4_4.4.0.1-8_amd64.deb +libgcr-base-3-1 3.41.2-6 amd64 9513409787d4dc4242943c0d8a4fb2de12ff21c281612007402bd0d731aa9b64 libgcr-base-3-1_3.41.2-6_amd64.deb +libgcr-ui-3-1 3.41.2-6 amd64 6181c2e4a574ed06ef2118aeb248c4188f496ce2c06a7dd06ca3f61580c4332b libgcr-ui-3-1_3.41.2-6_amd64.deb +libgd3 2.3.3-13ubuntu2 amd64 1a50c33b68c378003223cc30c8eaea2e17e113e7a65ed7cb6baef72983b739a9 libgd3_2.3.3-13ubuntu2_amd64.deb +libgdbm-compat4t64 1.26-1build1 amd64 e9ef750cc8ba426dee52f56aba0150e7e463b2658173bed8c4ca2927eec1c447 libgdbm-compat4t64_1.26-1build1_amd64.deb +libgdbm6t64 1.26-1build1 amd64 0752eddff4c494d682f433cac2f1d25196f0a405eb8c6b0b10ec46432f6fec71 libgdbm6t64_1.26-1build1_amd64.deb +libgdk-pixbuf-2.0-0 2.44.5+dfsg-4ubuntu1 amd64 ccd902384546225842384de0c46dad4670ccdda17b697bed4518610ed2e08e89 libgdk-pixbuf-2.0-0_2.44.5+dfsg-4ubuntu1_amd64.deb +libgdk-pixbuf2.0-bin 2.44.5+dfsg-4ubuntu1 amd64 ea447cab507c8672e27004be1447c438d0abb3188fffd28aa49381980b294501 libgdk-pixbuf2.0-bin_2.44.5+dfsg-4ubuntu1_amd64.deb +libgdk-pixbuf2.0-common 2.44.5+dfsg-4ubuntu1 all 2476d552009724d9b027236fcd2e4540a46f419d9d8b881f1d92edf10d6fcc13 libgdk-pixbuf2.0-common_2.44.5+dfsg-4ubuntu1_all.deb +libgdm1 50.1-0ubuntu0.1 amd64 044e3825d2979ebf3d3a6846f9fcd54d71c65ba6459e6704aec10b53f349e5c8 libgdm1_50.1-0ubuntu0.1_amd64.deb +libgee-0.8-2 0.20.8-2 amd64 e2a87e8415a637d9e44a2ecd0386cee113b0cd3c3e0563e168e81c7ea3c4f637 libgee-0.8-2_0.20.8-2_amd64.deb +libgeoclue-2-0 2.7.2-2ubuntu3 amd64 79eab8bb756c10d73a7e9e14db486a513e72e0d92741e0496b0881d5a86a1e62 libgeoclue-2-0_2.7.2-2ubuntu3_amd64.deb +libgeocode-glib-2-0 3.26.4-3 amd64 589ea635e9fb597517d7755cad80e33add17be72c9f62ad769751694bfce3d0e libgeocode-glib-2-0_3.26.4-3_amd64.deb +libgexiv2-2 0.14.6-2 amd64 fa4a4d6c5c108396d7c1b218ea6a11b9948672fadaf0463a4a8df70d836b3c79 libgexiv2-2_0.14.6-2_amd64.deb +libgif7 5.2.2-1ubuntu3.2 amd64 fce81875eaab4e01ca97ed7de1cc41e3ab589a09beb95b09c8ddd2caf2581284 libgif7_5.2.2-1ubuntu3.2_amd64.deb +libgirepository-1.0-1 1.86.0-6build1 amd64 c795b1be91db3db57c31786523929815f01a461951132dd7570b4579a861d27f libgirepository-1.0-1_1.86.0-6build1_amd64.deb +libgirepository-2.0-0 2.88.0-1 amd64 994595dcff5f8cc736d70a4798314006dce41da34d95511786039239440669f4 libgirepository-2.0-0_2.88.0-1_amd64.deb +libgjs0 1.88.0-1 amd64 e037f9d935e3762e39eddcc6ec39b7482804c9d2f2a97749e97a409d9e2397e8 libgjs0_1.88.0-1_amd64.deb +libgl1 1.7.0-3 amd64 83ec3a454b28e947a6886e9ae8167e129e25d7a2fd741aaffcdca76eddff5955 libgl1_1.7.0-3_amd64.deb +libgl1-mesa-dri 26.0.8-1ubuntu0.3 amd64 585dfac64d7ca95a9813faad9f14c361d788069b7578859fb426c657dd528f08 libgl1-mesa-dri_26.0.8-1ubuntu0.3_amd64.deb +libgles2 1.7.0-3 amd64 60113d7ec92c7ccdbd09e90b379bb9041581af3b85e28b3f250374025bb6440e libgles2_1.7.0-3_amd64.deb +libglib-object-introspection-perl 0.052-1 amd64 3d1ed6d17d7b8a6d2c9634c9a60c5f613f4534a801043180023508636bbc22e4 libglib-object-introspection-perl_0.052-1_amd64.deb +libglib-perl 3:1.329.4-1 amd64 36c7d9e801c20f8a5cae0cfe41c59f9d8ec057dc492208271eb082812a0fce22 libglib-perl_3%3a1.329.4-1_amd64.deb +libglib2.0-0t64 2.88.0-1 amd64 8883a2bd236e54af0af33d7115835929c959bc50fd02ba63496ab6908b0c204a libglib2.0-0t64_2.88.0-1_amd64.deb +libglib2.0-bin 2.88.0-1 amd64 f0832941a48e3b4d487c94fba1708a70dcdadff9e9eb6604ec7645d71872fd35 libglib2.0-bin_2.88.0-1_amd64.deb +libglib2.0-data 2.88.0-1 all 86bcb6fb96b1f2f429741af853c7817982edaeae114a5162e8aa681cf3d2b596 libglib2.0-data_2.88.0-1_all.deb +libglu1-mesa 9.0.2-1.1build2 amd64 0559dbb28c2e34e01243fdaf19797165fbf577e613c420d207e31246152f24f0 libglu1-mesa_9.0.2-1.1build2_amd64.deb +libglvnd0 1.7.0-3 amd64 db2cd8cff67e3e210f5223dfe41f000efd4d3d887ab05bda2e88c4a622f12b36 libglvnd0_1.7.0-3_amd64.deb +libglx-mesa0 26.0.8-1ubuntu0.3 amd64 17ff6239daaf75337d3697c1e5f1ef3e190c4c2dd73a9f0edfc36868ef41905c libglx-mesa0_26.0.8-1ubuntu0.3_amd64.deb +libglx0 1.7.0-3 amd64 e0b75c32f773201ebca2184d94dfc34f6e09470c7cf6e425d48b270e516fd909 libglx0_1.7.0-3_amd64.deb +libglycin-2-0 2.1.1+ds-0ubuntu1 amd64 99b6836d1068436e7f92cc3a7b2c2c0efddeea12dc50c16a727f45bc044d4393 libglycin-2-0_2.1.1+ds-0ubuntu1_amd64.deb +libglycin-gtk4-2-0 2.1.1+ds-0ubuntu1 amd64 896c2d56850ce8936e350d626a99542edc3e6b59ecad41a921a07ced1726a40b libglycin-gtk4-2-0_2.1.1+ds-0ubuntu1_amd64.deb +libgnome-autoar-0-0 0.4.5-5 amd64 37a54e236039ae2343e39a6e394357d37a8b4baf7581167ef7a397a62b85881f libgnome-autoar-0-0_0.4.5-5_amd64.deb +libgnome-bg-4-2t64 44.5-1ubuntu1 amd64 9b033899793669df114600e8807e8555300b4c82e6cfefb0946527b066f95516 libgnome-bg-4-2t64_44.5-1ubuntu1_amd64.deb +libgnome-bluetooth-3.0-13 47.1-5 amd64 6d4755d98382364f39e40b328715da3782e05348b9f8319b0ae85b79484f7854 libgnome-bluetooth-3.0-13_47.1-5_amd64.deb +libgnome-bluetooth-ui-3.0-13 47.1-5 amd64 141902b52821922a3210729a91c2bb7921eb69b5c840eb70caac4f6fbb580e9f libgnome-bluetooth-ui-3.0-13_47.1-5_amd64.deb +libgnome-desktop-3-20t64 44.5-1ubuntu1 amd64 81b47c68529265a355a51be0110089ff113f2d56ba08d987f6d596f1f4ebb75a libgnome-desktop-3-20t64_44.5-1ubuntu1_amd64.deb +libgnome-desktop-4-2t64 44.5-1ubuntu1 amd64 dc622a8f7985e60f0e21b73bb192bcdfa60d6de8ee42ef9d01dec3e737eb63f3 libgnome-desktop-4-2t64_44.5-1ubuntu1_amd64.deb +libgnome-menu-3-0 3.38.1-1ubuntu1 amd64 542ebd199ed85f417c627eccbdb7e3301d74efdb1f8d1e070580cf3dddae556b libgnome-menu-3-0_3.38.1-1ubuntu1_amd64.deb +libgnome-qr-4-0 44.5-1ubuntu1 amd64 0113f9d4958d6cc9202840989caf4e676247bbb21bed4bad4ed7116b61c18d0f libgnome-qr-4-0_44.5-1ubuntu1_amd64.deb +libgnome-qr-gtk-4-0 44.5-1ubuntu1 amd64 8b253370a7d1724a70e3b0f4fa74f73919a1a493dc20c5f73fd3cfe6ef72ad0b libgnome-qr-gtk-4-0_44.5-1ubuntu1_amd64.deb +libgoa-1.0-0b 3.58.0-1 amd64 567304bba58dac0fcfc7c566d0030c32bac7e03341f3e46386fa5b59f2d629cd libgoa-1.0-0b_3.58.0-1_amd64.deb +libgoa-1.0-common 3.58.0-1 all d0f6e61ceb702bb05eb0d5c182b69ea70e8f757221fc4df195b30ea07188e9dc libgoa-1.0-common_3.58.0-1_all.deb +libgoa-backend-1.0-2 3.58.0-1 amd64 7451be62fc37381dd75f4cb0ae7cbc12326a2b0f77015f11c92cada4f734d8a6 libgoa-backend-1.0-2_3.58.0-1_amd64.deb +libgomp1 16-20260322-1ubuntu1 amd64 add19738c63794d2aa9ac529d3b8aebe2e88980faecb6c1c59f07aefd6c3c314 libgomp1_16-20260322-1ubuntu1_amd64.deb +libgpgme45 2.0.1-2build1 amd64 b95f81d26bd4922510eb58a08f9c0bf143781cb23a907ce9ede7a3b1c6024be6 libgpgme45_2.0.1-2build1_amd64.deb +libgpgmepp7 2.0.0-2 amd64 3dd75723159c2c171382f836e491d83d71f5fdf7a58c9f6754d85ff0c725b761 libgpgmepp7_2.0.0-2_amd64.deb +libgphoto2-6t64 2.5.33-1ubuntu1.1 amd64 b2ad6865249a228b531beae7d987e95bdde043ff96609da4391d68f34195afee libgphoto2-6t64_2.5.33-1ubuntu1.1_amd64.deb +libgphoto2-l10n 2.5.33-1ubuntu1.1 all 83769ada07dd0069ca66b61f52f675fb09134edfe9bf761996acee5ed60bf462 libgphoto2-l10n_2.5.33-1ubuntu1.1_all.deb +libgphoto2-port12t64 2.5.33-1ubuntu1.1 amd64 5b42dffffeaab80afeb6d8d0dfb32a0ec0e4f780c82c672f967df7a01fadb496 libgphoto2-port12t64_2.5.33-1ubuntu1.1_amd64.deb +libgpm2 1.20.7-12build1 amd64 5e65176de6c982105c33956d9c698735ffef16464b43f462620c2bcce6d48036 libgpm2_1.20.7-12build1_amd64.deb +libgprofng0 2.46-3ubuntu2 amd64 6b066ab912300b2c6a965a9a8045da45c237a52b76c2c11d8f2ceaf7aabfacbb libgprofng0_2.46-3ubuntu2_amd64.deb +libgraphene-1.0-0 1.10.8-5build1 amd64 0c73a0aee47f87f496c9150121b04281def45d8e52564e059b59ebd9f22f5360 libgraphene-1.0-0_1.10.8-5build1_amd64.deb +libgraphite2-3 1.3.14-11ubuntu1.1 amd64 b4a4fbeb00c8553a20c31874c153cbcd856cfc1dda1c9b8252fa1d9bfbec24fc libgraphite2-3_1.3.14-11ubuntu1.1_amd64.deb +libgs-common 10.06.0~dfsg-3ubuntu1 all be7c90d171aff0597b35ebdb2eefd5a4a8e50a444bcb81ad43c2d120387d3cfb libgs-common_10.06.0~dfsg-3ubuntu1_all.deb +libgs10 10.06.0~dfsg-3ubuntu1 amd64 0e8652c2f0ff6ed0ca711bd085e97c492c3d0ae6605dfa8fc543d415720ddfed libgs10_10.06.0~dfsg-3ubuntu1_amd64.deb +libgs10-common 10.06.0~dfsg-3ubuntu1 all ff18e8ae397fb6c49037ce632e299d0faccc8851cb19fb536fd3c1f26d911541 libgs10-common_10.06.0~dfsg-3ubuntu1_all.deb +libgsf-1-114 1.14.53-1.1 amd64 f89d967ec790cdb28f3f22159b58ff068a42ac172a8961d66e7f7717e031068e libgsf-1-114_1.14.53-1.1_amd64.deb +libgsf-1-common 1.14.53-1.1 all 8839055ef6179339edf647ef5f0ade59c2c9e2487beb0cff28469e07a40a661e libgsf-1-common_1.14.53-1.1_all.deb +libgsound0t64 1.0.3-4 amd64 d5d786afa3f997ae744f4eb2ab8fa7c4cf4fa5240a71d1fa534ea1ee9cb59b5e libgsound0t64_1.0.3-4_amd64.deb +libgssdp-1.6-0 1.6.4-5 amd64 d1e2cae7a249ff1ccd68487e4e620fff95120e798a60e7a24d0723c07c53d0a3 libgssdp-1.6-0_1.6.4-5_amd64.deb +libgstreamer-gl1.0-0 1.28.2-1 amd64 6425c5677ba4ff8c02358fa822f792f7cdfe80aca4165765eb1189d2c9521363 libgstreamer-gl1.0-0_1.28.2-1_amd64.deb +libgstreamer-plugins-base1.0-0 1.28.2-1 amd64 6a118599d9336390547d76993382f24fb358a0637ce312ee1b01917e0bddd36d libgstreamer-plugins-base1.0-0_1.28.2-1_amd64.deb +libgstreamer-plugins-extra1.0-0 1.28.2-1ubuntu1.1 amd64 1eebb4613a15100b9b5efb15614da49489e6c6e6121297c51dff5dc91487b374 libgstreamer-plugins-extra1.0-0_1.28.2-1ubuntu1.1_amd64.deb +libgstreamer1.0-0 1.28.2-1 amd64 b960e6d5f23c895e6aabe8bd31bca14f14d24d47b0e6122ac3c6130c4a2fe9f5 libgstreamer1.0-0_1.28.2-1_amd64.deb +libgtk-3-0t64 3.24.52-0ubuntu1 amd64 d03b766dd7ba2becf66cf21424bb441af4dbf62841b314af2720df74d95bda1a libgtk-3-0t64_3.24.52-0ubuntu1_amd64.deb +libgtk-3-bin 3.24.52-0ubuntu1 amd64 40687ab50213d458256cf11485ba188c8ae51d6674144c49e568be3b1410f784 libgtk-3-bin_3.24.52-0ubuntu1_amd64.deb +libgtk-3-common 3.24.52-0ubuntu1 all bd402f87b106a975272fb12cdeb49d26ff6521e4c909b37b4b091797bf2a732d libgtk-3-common_3.24.52-0ubuntu1_all.deb +libgtk-4-1 4.22.4+ds-0ubuntu0.1 amd64 5ae394b2cdd4c09cb725e8a6686af27e33b476c6aca6caf016dce068b0702b2b libgtk-4-1_4.22.4+ds-0ubuntu0.1_amd64.deb +libgtk-4-bin 4.22.4+ds-0ubuntu0.1 amd64 fc49dca37c93c9434131eb1f7d96c9fb8290815b2ef3a4de01c4445c00b38a16 libgtk-4-bin_4.22.4+ds-0ubuntu0.1_amd64.deb +libgtk-4-common 4.22.4+ds-0ubuntu0.1 all 701267c163e22c901b81733d8a6369cb7edf783618b30a35a663bb8111e67554 libgtk-4-common_4.22.4+ds-0ubuntu0.1_all.deb +libgtk3-perl 0.038-3 all 1d1c8f2229c32fcf536c55862cc5db43b64a6cf1b3f6feca6d21cbf54e6271f4 libgtk3-perl_0.038-3_all.deb +libgtksourceview-5-0 5.18.0-3 amd64 851c90f202cadf480e1fe24eba14ee9b8e584bb8b7537681db8cd9ec1c2f0265 libgtksourceview-5-0_5.18.0-3_amd64.deb +libgtksourceview-5-common 5.18.0-3 all 2c81bbbd23e32e1bfe96394318f14d92cefe97da7885f9c0d7f51879f430cfcb libgtksourceview-5-common_5.18.0-3_all.deb +libgtop-2.0-11 2.41.3-2ubuntu1 amd64 db542f3ad50bbb9db0723ba6a970739f7c3e4c4b747250f39170dc5bd413abf5 libgtop-2.0-11_2.41.3-2ubuntu1_amd64.deb +libgtop2-common 2.41.3-2ubuntu1 all 027920b974a7477358de1d6d08ca1127bc1f315c4d17dd838d933cea26781b0d libgtop2-common_2.41.3-2ubuntu1_all.deb +libgudev-1.0-0 1:238-7build1 amd64 fdf0708cb0fbc95c553e3379cf77f6b1c9bb485cf3244c6246c31c7312467c81 libgudev-1.0-0_1%3a238-7build1_amd64.deb +libgupnp-1.6-0 1.6.9-4 amd64 18b90a37277442074ce0c5e1954031b9d4466919516bf36ee1d684394d6e7bfc libgupnp-1.6-0_1.6.9-4_amd64.deb +libgupnp-av-1.0-3 0.14.4-3 amd64 139b54971810fed2bd88adaf9082fd1152284ed057d0bd4ef784a3f57b1d959a libgupnp-av-1.0-3_0.14.4-3_amd64.deb +libgupnp-dlna-2.0-4 0.12.0-8 amd64 3c443d3b6830f10db19ee85eaf0b82b8f3ed2c3ca077c228f4c041c99d7ec835 libgupnp-dlna-2.0-4_0.12.0-8_amd64.deb +libgusb2a 0.4.9-7 amd64 638367d04ee955fdfdcb1524f40f7db482cc624892c4db9a7a97ef41244c0836 libgusb2a_0.4.9-7_amd64.deb +libgweather-4-0t64 4.4.4-4 amd64 aada232d86cdc5dc6c179ca4f4050fb6e11b96fa9309d7f5583c82f104853061 libgweather-4-0t64_4.4.4-4_amd64.deb +libgweather-4-common 4.4.4-4 all 8e3c53a03cd4d06fc59f56a63ef7c3ad4a1a050c37bddaa31186d653510de417 libgweather-4-common_4.4.4-4_all.deb +libgxps2t64 0.3.2-6 amd64 c6a1df57576448223369be6fa33cc0b921b9c51ef4e6d58d9e7137fe1651c04e libgxps2t64_0.3.2-6_amd64.deb +libhandy-1-0 1.8.3-3build1 amd64 9acc9624f8d50399e6a3a5183ada5ed04edffdf1e5ba176fa404cb8322c4237c libhandy-1-0_1.8.3-3build1_amd64.deb +libharfbuzz-gobject0 12.3.2-2 amd64 1312f58a50fac42b088766dbf4dd3c73137c3fbfb875eda130a68ada382f875c libharfbuzz-gobject0_12.3.2-2_amd64.deb +libharfbuzz-icu0 12.3.2-2 amd64 eee0f49c4c19e29df01aacbf3cbd06dfa29ed850c5ae186ff2ada49b2cc4807c libharfbuzz-icu0_12.3.2-2_amd64.deb +libharfbuzz-subset0 12.3.2-2 amd64 5135ba4f61cc3f71f73d3992b68b2fb08eedac7269a7070ce16d44671f143c04 libharfbuzz-subset0_12.3.2-2_amd64.deb +libharfbuzz0b 12.3.2-2 amd64 ec93ea39ddeb5a98179b60eab4af234b6c676f1958106645d1f4b19280d4cd09 libharfbuzz0b_12.3.2-2_amd64.deb +libheif-plugin-aomdec 1.21.2-3ubuntu0.4 amd64 15d31cc704ff59c1c5c908560588eb2c8ccfe517a753544574cedb4ca95900b7 libheif-plugin-aomdec_1.21.2-3ubuntu0.4_amd64.deb +libheif-plugin-aomenc 1.21.2-3ubuntu0.4 amd64 69dcee112eae13f5ae654980403d2181f9b500b6b869f9c7b655147db24b8b41 libheif-plugin-aomenc_1.21.2-3ubuntu0.4_amd64.deb +libheif1 1.21.2-3ubuntu0.4 amd64 cc8aead298c9b2b1ec01ea5cf4d617aa107f2ff028ddcc39028c31ccb025d5ab libheif1_1.21.2-3ubuntu0.4_amd64.deb +libhpmud0 3.24.4+dfsg0-0ubuntu8.1 amd64 0c03898f4e3be947ee45ccf6f1e1d99d39ff20eb7ec2f41ba55675f1bf554a5e libhpmud0_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +libhtml-form-perl 6.13-1build1 all 80dcc81dbc5f1e3bf6d5cc3bd958df3ea4e07ec3f8f8d9eda1d556923eab7ea3 libhtml-form-perl_6.13-1build1_all.deb +libhtml-format-perl 2.16-2 all b16a43f7ef44d31adcff0775b2c11d45c95121ce55a3331f572058d3bd42f067 libhtml-format-perl_2.16-2_all.deb +libhtml-parser-perl 3.83-1ubuntu0.1 amd64 f0375ca3a7166d8f305dec34aba40f40cef32f99e0d7e508c5c8dbb67f108f71 libhtml-parser-perl_3.83-1ubuntu0.1_amd64.deb +libhtml-tagset-perl 3.24-1 all 01f8ed65eecedce4efbe97f1f4c6d536c070f7044dc5ac8b91b268a47f5750ff libhtml-tagset-perl_3.24-1_all.deb +libhtml-tree-perl 5.07-3 all e2759b8b8ab5a879923718c9335e256f508ea17e4c8c810c52d11a19fcd088b2 libhtml-tree-perl_5.07-3_all.deb +libhttp-cookies-perl 6.11-1 all 1dcb51ac2201ecf596741c5234bb6aa8d4f65c8ac1f71e56f17a484a2424e60f libhttp-cookies-perl_6.11-1_all.deb +libhttp-daemon-perl 6.16-1ubuntu0.26.04.1 all 11c841178a65e43be30f25bec283fe753921b36d5a3c9f02061af032914bd47b libhttp-daemon-perl_6.16-1ubuntu0.26.04.1_all.deb +libhttp-date-perl 6.06-1ubuntu0.26.04.1 all 0c8aaf66cbdc31fb508d79cadfb5dc75c88bacdcbd76f71f083385f7940d17ce libhttp-date-perl_6.06-1ubuntu0.26.04.1_all.deb +libhttp-message-perl 7.01-1ubuntu1 all 3262822fd110cf66c398095bc0cfd69c21dda513f15f3ff9fbe9e5dc344f7ff4 libhttp-message-perl_7.01-1ubuntu1_all.deb +libhttp-negotiate-perl 6.01-2 all c39b2d426a434c2a7f1ddd5c19b2f72a0c07f767932d15f97d31a4dad408c25a libhttp-negotiate-perl_6.01-2_all.deb +libhunspell-1.7-0 1.7.2+really1.7.2-11 amd64 2787cc87d5e7b1381b05f7cfb568e5044b8b0f15b62b14fd2ffe255f7c7a4329 libhunspell-1.7-0_1.7.2+really1.7.2-11_amd64.deb +libhwy1t64 1.3.0-2 amd64 8b4e74f6fc7c9a08956f1430fe5d80f4d8970a08fe24df9e187d57753f652c7a libhwy1t64_1.3.0-2_amd64.deb +libhyphen0 2.8.8-7build4 amd64 eda68421ab4d85d79cc3bdc0ee5cac6bf80b8741187446f019a98d9e40bc1101 libhyphen0_2.8.8-7build4_amd64.deb +libibus-1.0-5 1.5.34~rc2-1 amd64 74a80664f054cec242dc8e4147a6455969a52fd1e7ff68add97b0f4cc0c0dd6b libibus-1.0-5_1.5.34~rc2-1_amd64.deb +libibverbs1 61.0-2ubuntu3 amd64 1d9e2e86e6500dabb6143c04adea8d122c7caa72aae3832de88d7ada4fa97201 libibverbs1_61.0-2ubuntu3_amd64.deb +libical3t64 3.0.20-2build1 amd64 99be1a4b6133a9b785ab618454fd86924e039bc78612eb2c72c33e7392f5f1c2 libical3t64_3.0.20-2build1_amd64.deb +libice6 2:1.1.1-1build1 amd64 d755a3f99a4895165703aad60ff15cf931e04da41b35facb15393d7d4b2c0242 libice6_2%3a1.1.1-1build1_amd64.deb +libicu78 78.2-2ubuntu1 amd64 c8b97930f9e365d6d00978144b468ac8397ef07d2fb2c453869f05fc3a98c4ca libicu78_78.2-2ubuntu1_amd64.deb +libidn12 1.43-2ubuntu0.26.04.1 amd64 93f52978f16f850f0a27891d373304f41a0aa986f82921b3267224b26fdcc2f5 libidn12_1.43-2ubuntu0.26.04.1_amd64.deb +libiec61883-0 1.2.0-8 amd64 6fd159a125d70973915a4d4a3a9ea0a3713b35b6c8b36eed4120ef4a235c152b libiec61883-0_1.2.0-8_amd64.deb +libieee1284-3t64 0.2.11-14.1build2 amd64 e2d8497cb45f5a99a018c4b83a88ecba44805442fdc3b82d5b541ed99f257c08 libieee1284-3t64_0.2.11-14.1build2_amd64.deb +libijs-0.35 0.35-16 amd64 9f65ccd8b1afde140286b2890064bb1119afabc5aead01ed0aa741134ee8cc94 libijs-0.35_0.35-16_amd64.deb +libimagequant0 4.4.1-1 amd64 da65f428985ce4cf9ee3cd4f845749812f006909ba6c130bd6c9fa7d1d491988 libimagequant0_4.4.1-1_amd64.deb +libimobiledevice-1.0-6 1.4.0-1build1 amd64 b5277ade48034e54db3f0b714ab0935b4657632fbdd8ec3d795e2c044272a622 libimobiledevice-1.0-6_1.4.0-1build1_amd64.deb +libimobiledevice-glue-1.0-0 1.3.2-2build1 amd64 c2e1b9b47592a645be9ece937f3c4f18a99a8de0d9f79134dca9d4582bcdfcdb libimobiledevice-glue-1.0-0_1.3.2-2build1_amd64.deb +libini-config5t64 0.6.2-3build1 amd64 6512a039125162e5b8bb01940ce1c5be14abcc91810afd3ca60ebb45346d1d82 libini-config5t64_0.6.2-3build1_amd64.deb +libinih1 61-1ubuntu1 amd64 6ee8d9867cc98d192a7b6bc589c61aad12b2e8479c6a0217932afa6c2db99df6 libinih1_61-1ubuntu1_amd64.deb +libinireader0 61-1ubuntu1 amd64 e3758dc01da47a9c793995bc7560bf1d503616080c81f023949a881103edc10d libinireader0_61-1ubuntu1_amd64.deb +libinput-bin 1.31.1-1ubuntu1.2 amd64 2b9635549e990d505c2f0e62eeb9abe9055ea58a810b06725f78eef49264851f libinput-bin_1.31.1-1ubuntu1.2_amd64.deb +libinput10 1.31.1-1ubuntu1.2 amd64 da31dc35e4644394705d111c55562f676000ac30b9f854201a7ca5b7a25eb215 libinput10_1.31.1-1ubuntu1.2_amd64.deb +libinsights0 0.9.3ubuntu amd64 4eac325ea009508e6d51c0a005c254bb910972c8da265313e42e142378542e45 libinsights0_0.9.3ubuntu_amd64.deb +libio-html-perl 1.004-3 all 999f8b54d84ac26dda0340ac4ab3263d190688dd92f312e62f3d499807687ed9 libio-html-perl_1.004-3_all.deb +libio-pty-perl 1:1.20-1build3 amd64 6f88732539ef0ac6019f9cfb5bdd374416e25a4894b296733a2451063ad5e496 libio-pty-perl_1%3a1.20-1build3_amd64.deb +libio-socket-ssl-perl 2.098-1 all 1a4dcfe2ab054c03d68ec45f51c715c4b1c6f00b516bfb0e9d10c2a2c81a4db3 libio-socket-ssl-perl_2.098-1_all.deb +libio-stringy-perl 2.113-2 all 8b0afc8b50d5db3d7606e6ce89deb5b1a68676707709f1771e19bbc7405b0d14 libio-stringy-perl_2.113-2_all.deb +libip4tc2 1.8.11-2ubuntu3 amd64 be25148d60125f6866dfa7940f3f1371fff4b0e8a1a9500780ad50cb8aaa0895 libip4tc2_1.8.11-2ubuntu3_amd64.deb +libip6tc2 1.8.11-2ubuntu3 amd64 3d9fdb3171f1167ab3f5182de11db63bcd27aae71838618f3d46806b3134428e libip6tc2_1.8.11-2ubuntu3_amd64.deb +libipa-hbac0t64 2.12.0-1ubuntu5.4 amd64 bf0a1f18069ac0601c2569d7e061cef5e93b3c33a1917830b72a33b948a17b2f libipa-hbac0t64_2.12.0-1ubuntu5.4_amd64.deb +libipc-run-perl 20250809.0-1build1 all fca30465aeb724e2627bdc1da21616e6eeafbab7e80952202796882bb8b8a58c libipc-run-perl_20250809.0-1build1_all.deb +libipc-system-simple-perl 1.30-2 all acb7603a5d3231bbe55054b7754c38b25e6acca1a0ac03f65a09e11ba4335fa2 libipc-system-simple-perl_1.30-2_all.deb +libipt2 2.1.2-3 amd64 0113f73b628f0fdeb00bb0099268088e5bbbbd231d03d65d2dac60edb3cb57ea libipt2_2.1.2-3_amd64.deb +libisl23 0.27-1build1 amd64 02ea5de2ab6ddba978606ad58647bf6371ea68c0ed63aa5d6d0d3b8c1fe77ea3 libisl23_0.27-1build1_amd64.deb +libjansson4 2.14-2build4 amd64 1dc986ac3cf112384919d1a339a952e8a86bede9890a4489c016fdc266a036ca libjansson4_2.14-2build4_amd64.deb +libjavascriptcoregtk-4.1-0 2.52.6-0ubuntu0.26.04.1 amd64 d77a6bad6f53b76a78bcb6ecbd9d56c1855f63af3a23c412f6590ffc1d807836 libjavascriptcoregtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb +libjavascriptcoregtk-6.0-1 2.52.6-0ubuntu0.26.04.1 amd64 a278b88a4b0633ad4c40e0de09a5990815798db7aae80defdba095e9eb3dc032 libjavascriptcoregtk-6.0-1_2.52.6-0ubuntu0.26.04.1_amd64.deb +libjbig0 2.1-6.1ubuntu3 amd64 bb2ffa4e359ee7a29dab9902b45e5c85de06f019272700cb2538e4762f141ee8 libjbig0_2.1-6.1ubuntu3_amd64.deb +libjbig2dec0 0.20-1ubuntu0.26.04.1 amd64 5c95617786982adc08f0991900400802b4e7037dda3e2f3a6bc9d0a6c6f04841 libjbig2dec0_0.20-1ubuntu0.26.04.1_amd64.deb +libjcat1 0.2.5-1build1 amd64 b244182d1ac9ed41b2fcbbc664489b4a4f7b60dbef99e3cfa25694b38380641f libjcat1_0.2.5-1build1_amd64.deb +libjemalloc2 5.3.0-4 amd64 df00a1d37c735bfb1830418efb721c2c0b79cd0a735c3d35e4015eb6a4d2683d libjemalloc2_5.3.0-4_amd64.deb +libjpeg-turbo8 2.1.5-4ubuntu4 amd64 07672ce1f4d187e005ea0cc35d03e515ba056f3d3e7a9a25d3ef386e184da8c5 libjpeg-turbo8_2.1.5-4ubuntu4_amd64.deb +libjpeg8 8c-2ubuntu12 amd64 1403d44d2c2d3eba6a7a8aea97fab0bac2e89e144a3bf600adfdd3ecdc3d9394 libjpeg8_8c-2ubuntu12_amd64.deb +libjq1 1.8.1-4ubuntu2 amd64 3ced45ef4154cce59ce9fc74cc606b7361fa1b2f088b31a903d54fbcee75cb43 libjq1_1.8.1-4ubuntu2_amd64.deb +libjs-sphinxdoc 8.2.3-12 all 13a0c814f4b0000ac420f7d10b4ded7574bf2fe1becb781b4471e742a6c04d1c libjs-sphinxdoc_8.2.3-12_all.deb +libjson-c5 0.18+ds-3 amd64 a19fa7f6504920f13e5fd291cf3c626d7201a48a0d80fde7cdac34f95306d352 libjson-c5_0.18+ds-3_amd64.deb +libjson-glib-1.0-0 1.10.8+ds-2 amd64 7b2a877a55554709e550ab2112eb3f8429c653d2340ef718d5ddeaf8b191ecd5 libjson-glib-1.0-0_1.10.8+ds-2_amd64.deb +libjson-glib-1.0-common 1.10.8+ds-2 all 4f04c6e07d49abf34a0192dec6c9ca9e1ce664eaf6517cb725a8f9ca33ab4d62 libjson-glib-1.0-common_1.10.8+ds-2_all.deb +libjxl-gdk-pixbuf 0.11.1-6ubuntu4.2 amd64 82f12d81d9cade1f6379340b319d64d05318eba5d7fdce8e8975a8f13c25e062 libjxl-gdk-pixbuf_0.11.1-6ubuntu4.2_amd64.deb +libjxl0.11 0.11.1-6ubuntu4.2 amd64 ad047c32784c7e3d1119f32c164876ae8f60c545c25354c9d673a958eef183df libjxl0.11_0.11.1-6ubuntu4.2_amd64.deb +libklibc 2.0.14-1ubuntu2 amd64 a09471ffaac8fbd48194007a4400325a9e0ec69eabbdcc23916011b4060c777e libklibc_2.0.14-1ubuntu2_amd64.deb +libkmod2 34.2-2ubuntu2 amd64 bb55dd5908866cf5b76b642ddfcb494ab35adb43ccba07431116398b373d4845 libkmod2_34.2-2ubuntu2_amd64.deb +liblc3-1 1.1.3+dfsg-1build1 amd64 61d9af5cabb5288695dad37d7a887b5d2793b966c738cb43d98d36017ca41054 liblc3-1_1.1.3+dfsg-1build1_amd64.deb +liblcms2-2 2.17-1ubuntu0.2 amd64 0fcc048872daa6a242d548b78b76749044800d3be5a883123ca45eb4c8c65e05 liblcms2-2_2.17-1ubuntu0.2_amd64.deb +liblcms2-utils 2.17-1ubuntu0.2 amd64 a58b8edc53a5f06fa6a57788a0ce57c60fd63f355fd296ba02d4912df3b8236e liblcms2-utils_2.17-1ubuntu0.2_amd64.deb +libldacbt-abr2 2.0.2.3+git20200429+ed310a0-5build1 amd64 fd8d353f5090cc72729ecbbfcb5d3d5eafa08d894518158106a0df3f1181a828 libldacbt-abr2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb +libldacbt-enc2 2.0.2.3+git20200429+ed310a0-5build1 amd64 000b286931549a4e2c1bb28a9b06b83fd8aa79c99e7b04503afbe2078aad638b libldacbt-enc2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb +libldb2 2:2.11.0+samba4.23.6+dfsg-1ubuntu2.2 amd64 d9c599cde03ad8f07e75a0318cbb7c381b968ad77ca7f47ccfb397218f218270 libldb2_2%3a2.11.0+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +liblerc4 4.0.0+ds-5ubuntu2 amd64 29051d37d010a7a0e3b5648f73f30d35eb1e313061137c88f3a2c2078925a36d liblerc4_4.0.0+ds-5ubuntu2_amd64.deb +libllvm21 1:21.1.8-6ubuntu1 amd64 9e758998dcb4aa27abbe64f2dee7bc490d9eb0721afa334a82a2b1bf6c7648f9 libllvm21_1%3a21.1.8-6ubuntu1_amd64.deb +liblmdb0 0.9.31-1build2 amd64 b702706b751b51516988230cefbe74643a373dcf28878dd77f735048117f88b5 liblmdb0_0.9.31-1build2_amd64.deb +liblocale-gettext-perl 1.07-8 amd64 67dba813307624944c9c2443a8e6f3efdd330bcad006de6413fa8c4cac5d40ca liblocale-gettext-perl_1.07-8_amd64.deb +liblouis-data 3.36.0-1 all f3bb432706c8e32a11028da4a797d2bbacb1166027effd01d9c8d7ed4978b5d5 liblouis-data_3.36.0-1_all.deb +liblouis20 3.36.0-1 amd64 0a354158b63d132d77af58e051a17451229b261002b9e0c5aa0343ad9ce040f6 liblouis20_3.36.0-1_amd64.deb +liblouisutdml-bin 2.12.0-8build1 amd64 3a88b6334ae9e5d80392b7984953c93a007215e667f6228e91d96822a8f70189 liblouisutdml-bin_2.12.0-8build1_amd64.deb +liblouisutdml-data 2.12.0-8build1 all a0705c62c2e6f1283ad05654f4f71894a04bf749206cfaea498bdbdb1ca56ecd liblouisutdml-data_2.12.0-8build1_all.deb +liblouisutdml9t64 2.12.0-8build1 amd64 a9138993317e8b3529102544b45f469d2b76b87043861e44f820317ec99f4a20 liblouisutdml9t64_2.12.0-8build1_amd64.deb +liblsof0 4.99.4+dfsg-2build2 amd64 86ba7fb7ceee83651a60616891b5a216c5c62631d4b3d482f63a0fc9cc0f7be7 liblsof0_4.99.4+dfsg-2build2_amd64.deb +libltdl7 2.5.4-9 amd64 c0279172b218093c674151044326457f6cb3e2ce0b1241380e3897e65677283e libltdl7_2.5.4-9_amd64.deb +liblua5.4-0 5.4.8-1build1 amd64 ff589ea3f181b89dd76b0240f79c59ac2f13f24e2053f624f774f596c7ef7897 liblua5.4-0_5.4.8-1build1_amd64.deb +liblwp-mediatypes-perl 6.04-2 all a8e1de745f650233753c5e7e9d914d357eaedf2a32d333aa98728c5f6601dfcc liblwp-mediatypes-perl_6.04-2_all.deb +liblwp-protocol-https-perl 6.14-1 all d4e9ae3ad7f0b2603151da0bffd9e2821668d39b1c8f2d31db646d42bbf5b69b liblwp-protocol-https-perl_6.14-1_all.deb +liblzo2-2 2.10-3build2 amd64 ffc9f1fea544f200b7b47a77e0ec89f70d493b5393ea2f7a43f6b9685b3341b8 liblzo2-2_2.10-3build2_amd64.deb +libmagic-mgc 1:5.46-5build2 amd64 3264ec3ed617abec65c55f2e165cf78f8c9dd006859faf0d863a8bc6095a67fd libmagic-mgc_1%3a5.46-5build2_amd64.deb +libmagic1t64 1:5.46-5build2 amd64 855e4f4a543789a427ad9aef77a31fbf99aebdd33576caa467e67a4301cd2d20 libmagic1t64_1%3a5.46-5build2_amd64.deb +libmailtools-perl 2.22-1 all 33c29b0c7536731fe056649669ad2d2cdaf406411a04e090d5a0fe3fa4055a19 libmailtools-perl_2.22-1_all.deb +libmalcontent-0-0 0.14.0-0ubuntu1.2 amd64 4157ed7ac889c37ee459cd5de52df27854d1db19c8f150019282eeb7b035398f libmalcontent-0-0_0.14.0-0ubuntu1.2_amd64.deb +libmalcontent-common 0.14.0-0ubuntu1.2 all b38b2edc753d7203ae8648cc41ce364a7b509f48f7c3553924198f5a183c0f76 libmalcontent-common_0.14.0-0ubuntu1.2_all.deb +libmaxminddb0 1.12.2-1build2 amd64 3ea71228684a480b2183b72de1c99126965ef98c1b8def81f65e346298024fed libmaxminddb0_1.12.2-1build2_amd64.deb +libmbim-glib4 1.32.0-2ubuntu1 amd64 58e905818f0f2080f85aafdf104ca167c7a6b8ae0e0591372f5a9ba500792fdc libmbim-glib4_1.32.0-2ubuntu1_amd64.deb +libmbim-proxy 1.32.0-2ubuntu1 amd64 4da8e1f09c476836ce2efcd3bf2e64a910e1e214683eb7283536c1bf9c0d761c libmbim-proxy_1.32.0-2ubuntu1_amd64.deb +libmbim-utils 1.32.0-2ubuntu1 amd64 a6b275dab16122d2db40a12828b05bc2c0d5536a0bf681fd39b568dc3a35f1ec libmbim-utils_1.32.0-2ubuntu1_amd64.deb +libmediaart-2.0-0 1.9.7-3 amd64 face445bcee3dd11b0fbfb12710422d527b6c20394a8384db3b14e117fdb30dc libmediaart-2.0-0_1.9.7-3_amd64.deb +libmm-glib0 1.25.95-1ubuntu1 amd64 8f77d6a2bbc4900ba736de74f62b2d78bb5d73e84383ac46e95936131ec92c89 libmm-glib0_1.25.95-1ubuntu1_amd64.deb +libmnl0 1.0.5-3build1 amd64 ab5e2781b0e2a2155cf154c658a2e6cf419d95a28c3121aefb159df6453102e5 libmnl0_1.0.5-3build1_amd64.deb +libmozjs-140-0 140.8.0-4 amd64 c67719532b781b6501b784b8ecd76e42748de2f3d81a653098697fc3d426c61f libmozjs-140-0_140.8.0-4_amd64.deb +libmp3lame0 3.101~svn6525+dfsg-2 amd64 20ab98afff633ed2c8e2cfb1b69a2c0a0cb86c8328b663c5825e6592dab600b4 libmp3lame0_3.101~svn6525+dfsg-2_amd64.deb +libmpc3 1.3.1-3 amd64 a95c75b486f26fe8b140a632fd9e2883b7e2efc21f7586e155d27d2d2ff0ddc0 libmpc3_1.3.1-3_amd64.deb +libmpfr6 4.2.2-3 amd64 74defa71b7f81d66b103afccfce750ad356976696b40c96c846ddc956fcfe937 libmpfr6_4.2.2-3_amd64.deb +libmpg123-0t64 1.33.3-2 amd64 5bb06d8890eecd357da520a21e592a93267bb4b48a4f8946d6d67c366f511bbd libmpg123-0t64_1.33.3-2_amd64.deb +libmsgraph-1-1 0.3.3-3build1 amd64 8bcffcf8a08329f8fdaaff42cfe6cc36fa8f9272fd3015c0b270df6879ef19f6 libmsgraph-1-1_0.3.3-3build1_amd64.deb +libmtdev1t64 1.1.7-1build1 amd64 d5e3b70bec533015ac924b69b13e21c7ad0eef8e84183d1eaff9529e603f4c39 libmtdev1t64_1.1.7-1build1_amd64.deb +libmtp-common 1.1.22-1ubuntu1 all 2e168f0da2dc8a46cbd6eaa81bf299e3d76b5e1ee69a0a1412c475dcc7a58b4d libmtp-common_1.1.22-1ubuntu1_all.deb +libmtp-runtime 1.1.22-1ubuntu1 amd64 2935dbd79326f0533a27122ee5ba9c1379fc9c0dbda84f14d55c27c849170e55 libmtp-runtime_1.1.22-1ubuntu1_amd64.deb +libmtp9t64 1.1.22-1ubuntu1 amd64 ba2279c6d50532e9a2a484b30253ebaa360af37bd11d8dd3214338574c597e7f libmtp9t64_1.1.22-1ubuntu1_amd64.deb +libmutter-18-0 50.1-0ubuntu2.2 amd64 c9cbb657eaf673602d8eb95292a5a8b1d2302dc7f03fa707daa860b8a612b858 libmutter-18-0_50.1-0ubuntu2.2_amd64.deb +libnautilus-extension4 1:50.2.2-0ubuntu0.1 amd64 f55976cc2792848d8c69518a44593a1b9c1304936b37777cd8b22e2051caed0b libnautilus-extension4_1%3a50.2.2-0ubuntu0.1_amd64.deb +libncurses6 6.6+20251231-1 amd64 ef354764c18dd6034325c255b636f108dc6d4f5e64d4cafb22975e76421f3d28 libncurses6_6.6+20251231-1_amd64.deb +libndp0 1.9-1build1 amd64 5ff885eeabf5e293232cda13484454b80aa291098d6b1385c53ee905612bce9e libndp0_1.9-1build1_amd64.deb +libnet-dbus-perl 1.2.0-2build4 amd64 32fe77bab16f4600244b64cad4daabc3bda96c8b504a4f144cd8af53dcd9c28e libnet-dbus-perl_1.2.0-2build4_amd64.deb +libnet-http-perl 6.24-1build1 all 6d16156e6b3803eea6e69cacd93252d463fe2e3e3612cc97f2f101462c5398f8 libnet-http-perl_6.24-1build1_all.deb +libnet-smtp-ssl-perl 1.04-2 all 5e2209f46511c3aedd528b363c6c5243dc8bec0a7681b46cf49e6afb04eaf28f libnet-smtp-ssl-perl_1.04-2_all.deb +libnet-ssleay-perl 1.94-3 amd64 69372215b26f1939c1ae21517bb57692fc64d7afe7534257ead0100138689629 libnet-ssleay-perl_1.94-3_amd64.deb +libnetfilter-conntrack3 1.1.1-1 amd64 facfd45a7cf6bab8ef30adbe693d6486f22e5253263f9d53b4e70b53f768970e libnetfilter-conntrack3_1.1.1-1_amd64.deb +libnetplan1 1.2-1ubuntu5.1 amd64 7ea06d69095c1b912ced77d9ba1aeed67eb18e60e9a67ba03d45f164382c3071 libnetplan1_1.2-1ubuntu5.1_amd64.deb +libnewt0.52 0.52.25-1ubuntu3 amd64 4aba21a5364aeb3778946e75b2f7b420b44a77cc5c1cd32935279eae4d8c0e99 libnewt0.52_0.52.25-1ubuntu3_amd64.deb +libnfnetlink0 1.0.2-3build1 amd64 e76b638fef2c1ebf78260972a52c4716df5752b29a952aeddc0c091a74f179c2 libnfnetlink0_1.0.2-3build1_amd64.deb +libnfs14 5.0.2-1ubuntu1.1 amd64 cfed9f8dedae4c1aa0f079837adae4f3f551bdff3af5cb30bbf9ed74187e49e4 libnfs14_5.0.2-1ubuntu1.1_amd64.deb +libnfsidmap1 1:2.8.5-1ubuntu1 amd64 66f6a767957ef82e42b549d9f6444d968fc0517f79b7147a80049e6e75df2738 libnfsidmap1_1%3a2.8.5-1ubuntu1_amd64.deb +libnftables1 1.1.6-1 amd64 0e5abb5719052d9f12aadf91a3f3d5192a2e85d035ee81d07c3055a0f79d8b8f libnftables1_1.1.6-1_amd64.deb +libnftnl11 1.3.1-1 amd64 a2f4d4a4ce3fac7e473c8de60a3d8948a58e9850cd8e2ced17263aa73dda7199 libnftnl11_1.3.1-1_amd64.deb +libnl-3-200 3.12.0-2 amd64 52fda1b991baa2d0fbe82f5dfb15584dcb1f25a7e3d311e2e319cc33858b4f2c libnl-3-200_3.12.0-2_amd64.deb +libnl-genl-3-200 3.12.0-2 amd64 8f25551ea6e925070c36ad1653e1201aa5fd62f3d0d8552071104b5b33813f3c libnl-genl-3-200_3.12.0-2_amd64.deb +libnl-route-3-200 3.12.0-2 amd64 58c5fa3c2f5226ffb1846db6cf7318196dbf5294a4354edd00fdae2db30a45dc libnl-route-3-200_3.12.0-2_amd64.deb +libnm0 1.54.3-2ubuntu3 amd64 43658f6f4ba4baf8bba1951560e4d02e9cf99214442136bc6dcd0fb0115247cd libnm0_1.54.3-2ubuntu3_amd64.deb +libnma-common 1.10.6-7 all 1185d15ff0ec06e97483869e1e736b4c825fbacf127aedbfe8fda3f3f6c0422d libnma-common_1.10.6-7_all.deb +libnma-gtk4-0 1.10.6-7 amd64 fbc9062fd946b7cf2ec50ca5c9a9f707ee9e02de68fe8b0f7d96d53480a4d787 libnma-gtk4-0_1.10.6-7_amd64.deb +libnma0 1.10.6-7 amd64 9fbd195fd86dccc86ef344ddd8f50da3945da4eadc01a83289f219c46d59882a libnma0_1.10.6-7_amd64.deb +libnotify-bin 0.8.8-1 amd64 bfc31bf33d581aaac2bbfbbd85b2a90ca93ec67bd602e34bfdff83319a131f8f libnotify-bin_0.8.8-1_amd64.deb +libnotify4 0.8.8-1 amd64 9bfebcb17db3153100d8a0f748d9da1409ba2157e095f640ef618c0fa89b89bc libnotify4_0.8.8-1_amd64.deb +libnspr4 2:4.38.2-1ubuntu1 amd64 2f28284b35765aaccad1785ab017425e1ca378c395256331f9c662d04335d43f libnspr4_2%3a4.38.2-1ubuntu1_amd64.deb +libnss-mdns 0.15.1-5 amd64 96debaf57a6806101e3902c168da38d7f6f927b77bf97c83de137e4ee62c287b libnss-mdns_0.15.1-5_amd64.deb +libnss-sss 2.12.0-1ubuntu5.4 amd64 c7fd332ba671fab74b184fbf57652125c7de1b9cdf4ad9c62d6f90dcf39d958c libnss-sss_2.12.0-1ubuntu5.4_amd64.deb +libnss-systemd 259.5-0ubuntu3.4 amd64 9dc03fc62f6010bb1ca252a8403e1f9848dd629756e8cd657afa6b15f35222d1 libnss-systemd_259.5-0ubuntu3.4_amd64.deb +libnss3 2:3.120-1ubuntu2.1 amd64 27ae6a8dbc2b8b750731c9098abb8750c5d584c79c5a024316d0b3c9bb50971c libnss3_2%3a3.120-1ubuntu2.1_amd64.deb +libntfs-3g89t64 1:2022.10.3-5ubuntu1.1 amd64 502462e2f9b33ebf6ad31788b7488b4a5f36ce1ee2670fa01f2113bf74d51382 libntfs-3g89t64_1%3a2022.10.3-5ubuntu1.1_amd64.deb +libnvme1t64 1.16.1-4 amd64 fd7692b19e904b1eae10a4457b1b5c5cc16ddb99334f7ce608acce138dd30ac3 libnvme1t64_1.16.1-4_amd64.deb +liboeffis1 1.5.0-3 amd64 8c64c961da0fb331554f02c416865d7ae6d1c9499959dc4b799b693183780e34 liboeffis1_1.5.0-3_amd64.deb +libogg0 1.3.6-2 amd64 9d62d5e64a55ecfc17a7aeb00a5ca5fdf095bd68c1c397146c81867bec35c31f libogg0_1.3.6-2_amd64.deb +libonig5 6.9.10-1build1 amd64 050ad79c8c02956d896407ff66fddcb24e114b307cde196a0226697cf643ef88 libonig5_6.9.10-1build1_amd64.deb +libopengl0 1.7.0-3 amd64 ccdcf477a19c1f51c20aa7569e953dbb5bc9456b57e2d3e325f8fda2650106ca libopengl0_1.7.0-3_amd64.deb +libopenipmi0t64 2.0.37-1build1 amd64 8a4faa81c8f62cfab210048f915aa6fd765102740337efbce142493b0c01d1b5 libopenipmi0t64_2.0.37-1build1_amd64.deb +libopenjp2-7 2.5.4-1ubuntu0.1 amd64 e004284779778e47573997b8994109120b5d5101e6b6c7dfa9b30b346c819845 libopenjp2-7_2.5.4-1ubuntu0.1_amd64.deb +libopus0 1.6.1-1 amd64 395f9e1bf29b804e42471e225976d69355c220bbfe469cb4ed387d36184b9bcc libopus0_1.6.1-1_amd64.deb +liborc-0.4-0t64 1:0.4.42-2 amd64 247e3b2100d94e897398e45548beba164b90917130333d6c540a0e3403e82906 liborc-0.4-0t64_1%3a0.4.42-2_amd64.deb +libpackagekit-glib2-18 1.3.4-3ubuntu1.2 amd64 94ca729f07c6e4e931989756419ea47cd20949f81e6fee4038a27396bc6f65f3 libpackagekit-glib2-18_1.3.4-3ubuntu1.2_amd64.deb +libpam-cap 1:2.75-10ubuntu2 amd64 2d87164ef02681074dcb868ce2c8e51b9fa440e8a3f8e3b430033c566c54cad6 libpam-cap_1%3a2.75-10ubuntu2_amd64.deb +libpam-fprintd 1.94.5-4 amd64 eaa6a621b73815eb2b696c1860822507fc844ac01f5a53f140cbc6c9afa33403 libpam-fprintd_1.94.5-4_amd64.deb +libpam-gnome-keyring 50.0-1 amd64 84928e07f6696e1c77bf998a826178fcd26aaaa9687b43d9d0d30efd70403ff4 libpam-gnome-keyring_50.0-1_amd64.deb +libpam-pwquality 1.4.5-5build1 amd64 abde1ead4ad22168ff44e26160408913960cec7219a7b5fefe9b9da2af6a22ee libpam-pwquality_1.4.5-5build1_amd64.deb +libpam-sss 2.12.0-1ubuntu5.4 amd64 8069c859aa907cf46df4d12bbea11cae1a49402b9bb79cdcd1b5737e0c253fe5 libpam-sss_2.12.0-1ubuntu5.4_amd64.deb +libpam-systemd 259.5-0ubuntu3.4 amd64 f27ddf40b22f231732899e3d3fcd3a622b88666c02cd5e32690a92794ba92d38 libpam-systemd_259.5-0ubuntu3.4_amd64.deb +libpanel-1-1 1.10.3-1 amd64 c6bc7140d574db96e1ae2bb06749eca200c54ad624b33e855a1f85836b95e4f1 libpanel-1-1_1.10.3-1_amd64.deb +libpanel-common 1.10.3-1 all b69928e5c424656a0431dd51d26062f86aa6d5389ebe8a9a004e6b27f75f130e libpanel-common_1.10.3-1_all.deb +libpango-1.0-0 1.57.0-1 amd64 309f30a8ea77e0264a3c8b66811188f5b788fe87b33be3cafd97c8f221235591 libpango-1.0-0_1.57.0-1_amd64.deb +libpangocairo-1.0-0 1.57.0-1 amd64 a989e666bb0d64636a10a1253c949f92a282782d79d1725e0e1acc17282909a5 libpangocairo-1.0-0_1.57.0-1_amd64.deb +libpangoft2-1.0-0 1.57.0-1 amd64 c1e08ebf03feded26a42a0f07f94789e5995b402d704d2faafdc86fffda0b28b libpangoft2-1.0-0_1.57.0-1_amd64.deb +libpangoxft-1.0-0 1.57.0-1 amd64 8d2b4be34ebc5aeeae0b92506a8a13941a47fe39e5ef4ea767981b50ac638a61 libpangoxft-1.0-0_1.57.0-1_amd64.deb +libpaper-utils 2.2.5-0.3maysync1 amd64 9e6da1c4574a50a3143d2cb698d7e672f645f67715fb8fedc537fed64e8af837 libpaper-utils_2.2.5-0.3maysync1_amd64.deb +libpaper2 2.2.5-0.3maysync1 amd64 e667f3a89b8237f15f43bc837f1f6606fdf5164a7670338573a4dc16a04c0fb4 libpaper2_2.2.5-0.3maysync1_amd64.deb +libparted2t64 3.6-6 amd64 3414de187cab783d61d5026ba53006be299429235cb32480c8099d1004e71e85 libparted2t64_3.6-6_amd64.deb +libpath-utils1t64 0.6.2-3build1 amd64 513d941185c25e2e29fed5b5b2628d160e184995c031d46d7ddd242109a55bd4 libpath-utils1t64_0.6.2-3build1_amd64.deb +libpcap0.8t64 1.10.6-1ubuntu1 amd64 69a466a55042ba8fe1bf738c29b01dd54edaf260c44426edbf0a08677ec29b1d libpcap0.8t64_1.10.6-1ubuntu1_amd64.deb +libpcaudio0 1.3-1build1 amd64 8b34341737d4c3ff830620413f11d9e2add1d049a47e475d4f97169a1bb2a705 libpcaudio0_1.3-1build1_amd64.deb +libpci3 1:3.14.0-1build2 amd64 a3aea5aeec6bc5d22c9d73c3c42f7c7dba5eae30e7b86f5a842e89f2ea93352c libpci3_1%3a3.14.0-1build2_amd64.deb +libpciaccess0 0.18.1-1ubuntu4.1 amd64 8733699ae9d7102a84cd10a1f0f0769b684c6ca8842035db389bb6b8310f72dd libpciaccess0_0.18.1-1ubuntu4.1_amd64.deb +libpcre2-32-0 10.46-1build1 amd64 a385713732a7411d39ba5c057f8e5727d0cdf3bf8afa36cbe1104c66ae2acd5b libpcre2-32-0_10.46-1build1_amd64.deb +libpcsclite1 2.4.1-1 amd64 9287a7219e33c52f2a647bdfbaf4b6156de843b191d69aa60d101baeb5160032 libpcsclite1_2.4.1-1_amd64.deb +libperl5.40 5.40.1-7ubuntu0.3 amd64 cf480ce25c4dc859e48619df013f820f7259f02f93397cf9975de548fd356bce libperl5.40_5.40.1-7ubuntu0.3_amd64.deb +libphonenumber8 8.13.51+ds-5 amd64 38fca71dff6d653431d78444489b29f47471a989fac8c509417aca65da94a398 libphonenumber8_8.13.51+ds-5_amd64.deb +libpipeline1 1.5.8-2 amd64 e1502fe2af97a4e832fe076bef1e60851ec48da841e3e580674293552630df35 libpipeline1_1.5.8-2_amd64.deb +libpipewire-0.3-0t64 1.6.2-1ubuntu1.1 amd64 dd242fed45d140f6b619b3b4a3b9938db7fda94acbe54e4bd93294832c2b10a6 libpipewire-0.3-0t64_1.6.2-1ubuntu1.1_amd64.deb +libpipewire-0.3-common 1.6.2-1ubuntu1.1 all 886d0def069dcfef7885205faa46f431b68937480092ebd51d991948731121b0 libpipewire-0.3-common_1.6.2-1ubuntu1.1_all.deb +libpipewire-0.3-modules 1.6.2-1ubuntu1.1 amd64 bd560a213d2613eb924eab1b5bf0bf878ef40e96b19c551269d0f7c96e539cef libpipewire-0.3-modules_1.6.2-1ubuntu1.1_amd64.deb +libpixman-1-0 0.46.4-1 amd64 55a274db32d4824a1f1a48c42e959fe4293a4e4b545d400d89949cfabe160cc3 libpixman-1-0_0.46.4-1_amd64.deb +libpkcs11-helper1t64 1.31.0-1 amd64 93b7050b8103ee665465929bab0e19c7d9cb845a376ef5880e6e355bf025dd6b libpkcs11-helper1t64_1.31.0-1_amd64.deb +libplist-2.0-4 2.7.0+git20250820-1build1 amd64 04eb26d40bbb9cee682e6f51a25a1b311351b4c30722b8174acd67d4144bce47 libplist-2.0-4_2.7.0+git20250820-1build1_amd64.deb +libplymouth5 24.004.60+git20250831.4a3c171d-0ubuntu8 amd64 11d0fd3a398f5bbc024503dee70fe160a1fc2bdcd4d8732e99dbbed847406fe2 libplymouth5_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +libpng16-16t64 1.6.57-1 amd64 e3af297b2131aea35eab7e2751b4158ec7ae4ffb6d746043199f766fc727744f libpng16-16t64_1.6.57-1_amd64.deb +libpolkit-agent-1-0 127-2ubuntu1.1 amd64 d8f87b9a1f0dc475d94bff1aa743df1ee172b161657e461e7d1c3382fe50d3ff libpolkit-agent-1-0_127-2ubuntu1.1_amd64.deb +libpolkit-gobject-1-0 127-2ubuntu1.1 amd64 4bf5528ff1273d4ce6b1f523a3aa0ce05af485a37d78daccb75cc29f1a2cfd0d libpolkit-gobject-1-0_127-2ubuntu1.1_amd64.deb +libpoppler-cpp3 26.01.0-2ubuntu0.1 amd64 94b4727e767f4434f394bc8c48bec48eed44ff6e8c6e52aaef085d637b135ace libpoppler-cpp3_26.01.0-2ubuntu0.1_amd64.deb +libpoppler-glib8t64 26.01.0-2ubuntu0.1 amd64 07d4b1cea48c34e5480b029151d200a64ec1a21d41275eb54aa19b64372d8afa libpoppler-glib8t64_26.01.0-2ubuntu0.1_amd64.deb +libpoppler156 26.01.0-2ubuntu0.1 amd64 8f9b381982deed672786b89d97473ad33e0a8d4f3dc44c6c8f6653b69030ca94 libpoppler156_26.01.0-2ubuntu0.1_amd64.deb +libpopt0 1.19+dfsg-2build1 amd64 ae57295d9a5d1551b866824c766a279f675172a05dd8d759fcdd52da3c3ac28f libpopt0_1.19+dfsg-2build1_amd64.deb +libportal-gtk4-1 0.9.1-2build1 amd64 c2ab5f601d83093d996485b0c2adceb71fb6d04ea2a142b514bc5d27ba8ab70e libportal-gtk4-1_0.9.1-2build1_amd64.deb +libportal1 0.9.1-2build1 amd64 5fa20cfdb5bad67edd498b237c9f8a40f73387611768e5a56a1c99b152b743df libportal1_0.9.1-2build1_amd64.deb +libppd2 2:2.1.1-0ubuntu2 amd64 0d8a70f3366515f2d7812440c7e5b1b3af232604cd2a3e981ebea51df0537aed libppd2_2%3a2.1.1-0ubuntu2_amd64.deb +libppd2-common 2:2.1.1-0ubuntu2 all f9b615c53f02d0ff78373a6456fc40db0679d0db6572e254b1d96cdddbaa8330 libppd2-common_2%3a2.1.1-0ubuntu2_all.deb +libppsdocument-4.0-6 50.2-0ubuntu0.1 amd64 fda85bb65a3b944a8769c9357e9d2300982b03873fc44bd6e6c18d5c60b09acb libppsdocument-4.0-6_50.2-0ubuntu0.1_amd64.deb +libppsview-4.0-5 50.2-0ubuntu0.1 amd64 e3899ca62698b84560ec26a4df5f85058063abf9c9c8442043bc7ceeb57be2c1 libppsview-4.0-5_50.2-0ubuntu0.1_amd64.deb +libprotobuf32t64 3.21.12-15ubuntu1 amd64 adab0eb28161aea2101e33d8b4c8a336ad62c34c70e01bd3d7c1026279ca5757 libprotobuf32t64_3.21.12-15ubuntu1_amd64.deb +libproxy1v5 0.5.12-1 amd64 2ad0a703309adfdf14477543fae4f5b7dc7e32f8f7cd17d87c40be9161997239 libproxy1v5_0.5.12-1_amd64.deb +libpulse-mainloop-glib0 1:17.0+dfsg1-2ubuntu4 amd64 0c67401bf812a8584fef22ee87a1906f219c3a05d18d48300e39e528eaad9075 libpulse-mainloop-glib0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb +libpulse0 1:17.0+dfsg1-2ubuntu4 amd64 d2998fcca587cb21447302a551bfaa6caa7052e7f00a1b041adf4237dd65e4a3 libpulse0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb +libpwquality-common 1.4.5-5build1 all 6b52c3f3ea6d6a77b305bf34eb242a28cb5fa50f7d452438967bd308fd04c884 libpwquality-common_1.4.5-5build1_all.deb +libpwquality1 1.4.5-5build1 amd64 d62dda61e4d0e134a85d2af2d15b5f863b2a1c8a8ab43069f16da1c5a7aeb388 libpwquality1_1.4.5-5build1_amd64.deb +libpython3-stdlib 3.14.3-0ubuntu2 amd64 75d0c4c28732f8e08d5da25a47676dbe923e4b15a8f7a77110ab370325889df5 libpython3-stdlib_3.14.3-0ubuntu2_amd64.deb +libpython3.14 3.14.4-1ubuntu0.2 amd64 76c12c7936d7a2e898f972b8b40ec74f3b58f1a534e67e256e1aa9d28c6c43d8 libpython3.14_3.14.4-1ubuntu0.2_amd64.deb +libpython3.14-minimal 3.14.4-1ubuntu0.2 amd64 fac6f0728cf9490a7a698e6b343e4140283e92355b060193c04f5770a666df8a libpython3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb +libpython3.14-stdlib 3.14.4-1ubuntu0.2 amd64 3c267ef0f902f763c3615cbf28dd6fe91d2e4f603075d7f03db99f8d4eb66f46 libpython3.14-stdlib_3.14.4-1ubuntu0.2_amd64.deb +libqmi-glib5 1.38.0-1 amd64 ae6396d1c1b16b093b34df537fa1892079e9ce4f7c0b7fa6af7825dcd07e9873 libqmi-glib5_1.38.0-1_amd64.deb +libqmi-proxy 1.38.0-1 amd64 04aec1083022f2745030e67ecb995593b9550848fcf3701228b369705e4aaf3b libqmi-proxy_1.38.0-1_amd64.deb +libqmi-utils 1.38.0-1 amd64 266e8d1a46acd6e1ec32d8c496e0eb2330450d73050c294179f4434bb21bef64 libqmi-utils_1.38.0-1_amd64.deb +libqpdf30 12.3.2-1 amd64 354aba90fac426ae0a46e7386b933068c7ae55853227fdbc79d4374c2bd881f2 libqpdf30_12.3.2-1_amd64.deb +libqrtr-glib0 1.2.2-2ubuntu1 amd64 8ce9e67b2e9018c521faa0a872cf6b83e2254f3459246473804fb5e3567c60ad libqrtr-glib0_1.2.2-2ubuntu1_amd64.deb +libraqm0 0.10.4-1 amd64 85aefc091871221e4aa08d86615dd0e5140380928452418bd1e4e5226fee4628 libraqm0_0.10.4-1_amd64.deb +libraw1394-11 2.1.2-2build4 amd64 86628e0427e4df2f4b31dd6d6afe61a550cc6eb0d078f372b322e55e79fb7221 libraw1394-11_2.1.2-2build4_amd64.deb +libreadline8t64 8.3-4 amd64 260b3333e9f714252593b83fb31d2571097b64d337d0d7100aae7349029821fc libreadline8t64_8.3-4_amd64.deb +libref-array1t64 0.6.2-3build1 amd64 bcd9df6590849ac65fe32d2eec97aa216c7cd938fa2555623a0c37a0d074867a libref-array1t64_0.6.2-3build1_amd64.deb +librest-1.0-0 0.10.2-1 amd64 c803774236c7392fa73e9ed1349acd7d658d40234f39f44fa7f6c254404bea0a librest-1.0-0_0.10.2-1_amd64.deb +libroc0.4 0.4.0+dfsg-5ubuntu3.1 amd64 eef5591226e19f82e709aedcdb89180ce94989f26f73810b64421a599a7162dd libroc0.4_0.4.0+dfsg-5ubuntu3.1_amd64.deb +librsvg2-2 2.61.3+dfsg-3 amd64 af1d01163b01f45a027054c3e0bcdadf01d5d318b8b9ffdcaa13c01ec4e2f2e7 librsvg2-2_2.61.3+dfsg-3_amd64.deb +librsvg2-common 2.61.3+dfsg-3 amd64 0742e9d6a8f39f925a4f760512f1227bae3d7396208205b576a9bac9ca1c4b6e librsvg2-common_2.61.3+dfsg-3_amd64.deb +librygel-core-2.8-0 45.0-1ubuntu1 amd64 8c4890469434dcfb7e0c435a038fcbbb574e8b8613521e6a13a4bb0ad61ab231 librygel-core-2.8-0_45.0-1ubuntu1_amd64.deb +librygel-db-2.8-0 45.0-1ubuntu1 amd64 e238a271444ae97f0088f96cb0a5ce15b6609e08be0f589feede53b96a887c1b librygel-db-2.8-0_45.0-1ubuntu1_amd64.deb +librygel-renderer-2.8-0 45.0-1ubuntu1 amd64 9991ea25f1ef529fa28f93ffa5996b6aa7f8cc868e8acc5d58aae1676b4775a7 librygel-renderer-2.8-0_45.0-1ubuntu1_amd64.deb +librygel-server-2.8-0 45.0-1ubuntu1 amd64 67a370401dff770aaeceeed3208a22019754d0a17e17c6172a9dc102c712c0ab librygel-server-2.8-0_45.0-1ubuntu1_amd64.deb +libsamplerate0 0.2.2-4build2 amd64 c554aed04aa0c47928039dc158e26c2b6da44b4570d400574110dcdaedd03360 libsamplerate0_0.2.2-4build2_amd64.deb +libsane-common 1.4.0-1ubuntu1 all bab39d46a52af80fa9a4b711de0f9b031d50124929ecdba7a34f623f5e1e513d libsane-common_1.4.0-1ubuntu1_all.deb +libsane-hpaio 3.24.4+dfsg0-0ubuntu8.1 amd64 84e81795305c8457af92f8e3d4e4bb74d9c357d78d780e91388e9a3ef1c43247 libsane-hpaio_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +libsane1 1.4.0-1ubuntu1 amd64 ce047e7455510f5b7e31df0e7dc3950799aa6e1a1d112806424795780691314f libsane1_1.4.0-1ubuntu1_amd64.deb +libsasl2-modules 2.1.28+dfsg1-9ubuntu3 amd64 01adc1798ccd25f9e87cf7cfb218103a75d53d21847b6a301cef1e9513ac8ce1 libsasl2-modules_2.1.28+dfsg1-9ubuntu3_amd64.deb +libsasl2-modules-gssapi-mit 2.1.28+dfsg1-9ubuntu3 amd64 47df65c89d1aebbc2faadfdb1bd0ce0183a1390d5bdb087ec95164757b73b827 libsasl2-modules-gssapi-mit_2.1.28+dfsg1-9ubuntu3_amd64.deb +libsbc1 2.1-1build1 amd64 7d3bc03489593a24345025509c4e2aed73a12d229df6e5d0f9667214aeca37ea libsbc1_2.1-1build1_amd64.deb +libsecret-1-0 0.21.7-2build1 amd64 5cf26cf395af46280fda3fca0b36abe5122588afb36b839a69cbca21b89ed362 libsecret-1-0_0.21.7-2build1_amd64.deb +libsecret-common 0.21.7-2build1 all ac8c3a7214a6f85147c6fb1c516baf64abf26cf1fc90623671a848ed377d4932 libsecret-common_0.21.7-2build1_all.deb +libsensors-config 1:3.6.2-2build1 all 57193f731de79bbad343a1369e6e95b13096c08ba166c7e193bfc24d78f960fb libsensors-config_1%3a3.6.2-2build1_all.deb +libsensors5 1:3.6.2-2build1 amd64 9249cd2be68acd7b589030df72a457b89fadea6c426002b00648ad2d153d9748 libsensors5_1%3a3.6.2-2build1_amd64.deb +libsframe3 2.46-3ubuntu2 amd64 05541ea1edb19e54bea297a21a9c33d0b99ca2cfe2e86d4a67335e6640667cfc libsframe3_2.46-3ubuntu2_amd64.deb +libsharpyuv0 1.5.0-0.1build1 amd64 4e2c0a8aa97dafd923f00d77ca017d14f16ab79d3b1120892c8215a0b5fb7892 libsharpyuv0_1.5.0-0.1build1_amd64.deb +libshout3 2.4.6-1build3 amd64 fe638ec034df5294f3f47d60a308d0d9454e91a9fb0d9f7b718908604da489be libshout3_2.4.6-1build3_amd64.deb +libsimdutf31 8.0.0-1 amd64 fd01a52b2feaaf93839f1ba07bf11131fd377d2aaaef95c3a439a5bd333b459f libsimdutf31_8.0.0-1_amd64.deb +libslang2 2.3.3-5build1 amd64 edfe8c7fd65e36959efcb4a116141d3c1287f9717eea1eee429d3a3d460d1d93 libslang2_2.3.3-5build1_amd64.deb +libsm6 2:1.2.6-1build1 amd64 8f0d18029ed6918c8a422c8108d5efe6bc3a0e264dc65844b47132aad426536c libsm6_2%3a1.2.6-1build1_amd64.deb +libsmbclient0 2:4.23.6+dfsg-1ubuntu2.2 amd64 d607a125cf912b23f5a432ee28a8e358bda17f6eb4b1561b72930b1262aeff80 libsmbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +libsnapd-glib-2-1 1.72-0ubuntu3 amd64 6d61a082f9ee7c1c547c60b833b9015aa96eda6291578e854ef83362d4621488 libsnapd-glib-2-1_1.72-0ubuntu3_amd64.deb +libsnappy1v5 1.2.2-2 amd64 1679c696614780a0137e2b484ade47fc226177556e261bace9a779ae98b29346 libsnappy1v5_1.2.2-2_amd64.deb +libsndfile1 1.2.2-4 amd64 678c7e95dea924d1ebe6c59879009dc3e7b61491bc32bd63bea200487d60a454 libsndfile1_1.2.2-4_amd64.deb +libsnmp-base 5.9.4+dfsg-2ubuntu3 all 4e07606d47746eec43c2afbe17b33fba33a93b8dd04866848cc3f0336e4e39ce libsnmp-base_5.9.4+dfsg-2ubuntu3_all.deb +libsnmp40t64 5.9.4+dfsg-2ubuntu3 amd64 d00833347422359b85315aba3cfbb356db99310624f40bfb422d980182d9d2cc libsnmp40t64_5.9.4+dfsg-2ubuntu3_amd64.deb +libsonic0 0.2.0-13build2 amd64 29b13ed4a03146b042e9b36d2db981f8522e40363e1bbd692a4c0a351eb3d33f libsonic0_0.2.0-13build2_amd64.deb +libsoup-3.0-0 3.6.6-1 amd64 1e64ec18ac23c235174cd8a5a67b7b087af4172c40e8466216122982feff25a2 libsoup-3.0-0_3.6.6-1_amd64.deb +libsoup-3.0-common 3.6.6-1 all ed47b65b4691273b9330b8371defd9dd5ea6980556f2923ef83e8f78ad8dc02b libsoup-3.0-common_3.6.6-1_all.deb +libsource-highlight-common 3.1.9-4.3build2 all 9208a5cb2e873ae7bcc458f13d51aaec29a04c563df926cad9145af8a4234bf4 libsource-highlight-common_3.1.9-4.3build2_all.deb +libsource-highlight4t64 3.1.9-4.3build2 amd64 ac2cae4028ef60f003bd62f719a0c9d2451c3ff3f72da6e9fef8808de7636b8a libsource-highlight4t64_3.1.9-4.3build2_amd64.deb +libspa-0.2-bluetooth 1.6.2-1ubuntu1.1 amd64 44e437438cad1e41fceed61036687d43c653765149a87db34e67aa2c5304aefc libspa-0.2-bluetooth_1.6.2-1ubuntu1.1_amd64.deb +libspa-0.2-modules 1.6.2-1ubuntu1.1 amd64 bd423aecf6f1ea8c3873bfc3c5141b97f275f80eb60ba7270a97c4e613f87b82 libspa-0.2-modules_1.6.2-1ubuntu1.1_amd64.deb +libspeechd-module0 0.12.1-2ubuntu1 amd64 91b4a260c7dc00cae4619bfd1fc60acc03467a6c220d686680629ed5b0999254 libspeechd-module0_0.12.1-2ubuntu1_amd64.deb +libspeechd2 0.12.1-2ubuntu1 amd64 bcc710c6e635615d7a1b9ad910109b3c2400c9e5faebfd72f73c76aa048f7f7c libspeechd2_0.12.1-2ubuntu1_amd64.deb +libspeex1 1.2.1-3build1 amd64 a680f573914fde02780f169e03d754cfc905b04fa4ef24663eb8d27f10033804 libspeex1_1.2.1-3build1_amd64.deb +libspeexdsp1 1.2.1-3build1 amd64 f7f312d0b692658e5aaa9c6c4860baa9edbf8855fbc37d20e9b7f2ad17358943 libspeexdsp1_1.2.1-3build1_amd64.deb +libspelling-1-2 0.4.9-1build1 amd64 1389974b075075c0c4abb5f3eb4d70e49a633516c512c8f1d437e6c4f5ffb3b5 libspelling-1-2_0.4.9-1build1_amd64.deb +libspelling-common 0.4.9-1build1 all a904fc5d2a4b6219a721441e02f710ad078f8671ee50d560ec6d16cdda8b078d libspelling-common_0.4.9-1build1_all.deb +libsqlite3-0 3.46.1-9ubuntu0.2 amd64 8671ee6299becd379a13ffb7a50cf4ee48f2a02ef1ea0d6dd1de829a704aa11b libsqlite3-0_3.46.1-9ubuntu0.2_amd64.deb +libsss-certmap0 2.12.0-1ubuntu5.4 amd64 15338a9d22388df8f3c6fa81f0c134500cb647995a78ececa26e53c5c496998c libsss-certmap0_2.12.0-1ubuntu5.4_amd64.deb +libsss-idmap0 2.12.0-1ubuntu5.4 amd64 b9361e8fb9dee71a0a12fb991a4217ae1d5fc470134a076023829eae8e924311 libsss-idmap0_2.12.0-1ubuntu5.4_amd64.deb +libsss-nss-idmap0 2.12.0-1ubuntu5.4 amd64 a3ddcac8865688571223c74f78c4a35ea3bcc8380d83e5f1191e33cb5cda3d07 libsss-nss-idmap0_2.12.0-1ubuntu5.4_amd64.deb +libstartup-notification0 0.12-8build1 amd64 f2bce732be30ef78e242fa05677e0034da70cb854709635f17f0a509719c8ff4 libstartup-notification0_0.12-8build1_amd64.deb +libstemmer0d 3.0.1-1 amd64 ff03ff070cebf6e5949dc48df012e707b43cc381e4c6da5ece52282af6476eb6 libstemmer0d_3.0.1-1_amd64.deb +libsysprof-6-6 50.0-1 amd64 2121d9d2a027bd70203ee0584ff046eb7bf17c537a77c91eecf0517d1e3f63f6 libsysprof-6-6_50.0-1_amd64.deb +libsysprof-6-modules 50.0-1 amd64 b1f0e4fa0ec2c561008a254ec8447cc563d9d2cf9aa26818b6c6ff195172d4d8 libsysprof-6-modules_50.0-1_amd64.deb +libsystemd-shared 259.5-0ubuntu3.4 amd64 9b30b1e96cc8b48f94a2df5c1cbee7690e16f727d71b40c458a64aabe15db35f libsystemd-shared_259.5-0ubuntu3.4_amd64.deb +libtag2 2.2.1-3 amd64 9b74ea1de651e630956a6f2004de1e52855b1b76730e4ae2a125cfbb81bb9506 libtag2_2.2.1-3_amd64.deb +libtalloc2 2:2.4.3+samba4.23.6+dfsg-1ubuntu2.2 amd64 f2d5bb6a77cbe17efbd9e077caf41757dc5b602b5c15fc243077beb87c20e184 libtalloc2_2%3a2.4.3+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +libtcl8.6 8.6.17+dfsg-1build1 amd64 7e062e6b4c8e4c4c5122679c193c4567c1bf4dab3555a64ea2449a256cfd8043 libtcl8.6_8.6.17+dfsg-1build1_amd64.deb +libtdb1 2:1.4.14+samba4.23.6+dfsg-1ubuntu2.2 amd64 12a81cae04403ab6abf1239876c1ccf6142067ecb923e8af5854829898965101 libtdb1_2%3a1.4.14+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +libteamdctl0 1.31-1build4 amd64 0e4cdcba8844bc2cc9787f86ed8bc8df27e5fddcd0400688097f98f3780c8da1 libteamdctl0_1.31-1build4_amd64.deb +libtevent0t64 2:0.17.1+samba4.23.6+dfsg-1ubuntu2.2 amd64 c44b855af26408fec0aa149bc7d00acd7595621215ba278885173f7eee033f44 libtevent0t64_2%3a0.17.1+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb +libtext-charwidth-perl 0.04-11build4 amd64 55089bcbe8f6213d500900769f5161e35fb9e4147cf472b469a37e1d1e96a022 libtext-charwidth-perl_0.04-11build4_amd64.deb +libtext-iconv-perl 1.7-8.1 amd64 9543434d570888be8d079a7277f935e963336d84a672cff6a3899957f7c59cf3 libtext-iconv-perl_1.7-8.1_amd64.deb +libtext-wrapi18n-perl 0.06-10 all 936619071dd5d81ff672b685af9ad20e1f524be2241cbd80556aedc376844a36 libtext-wrapi18n-perl_0.06-10_all.deb +libthai-data 0.1.30-1 all 345fa75fcec8b562e2c6a4a5cd61187e7b825c8379fadb7f3f60d64d73ab1b72 libthai-data_0.1.30-1_all.deb +libthai0 0.1.30-1 amd64 c06f206be1ef7aa8208110b38945205ebc742dd777cbb39142baa555fe61390a libthai0_0.1.30-1_amd64.deb +libtheora1 1.2.0+dfsg-6 amd64 d4c3f4f488e53bf85fa5798ef07fda19519c5f54702c17c6528c4893ae5cbd99 libtheora1_1.2.0+dfsg-6_amd64.deb +libtheoradec2 1.2.0+dfsg-6 amd64 ba95870a379eb408156f76922ddebceef0a9293ce92abb9112a86ada0751eb84 libtheoradec2_1.2.0+dfsg-6_amd64.deb +libtheoraenc2 1.2.0+dfsg-6 amd64 fee798e4313614856255942dafa86975f0f68538974e0edc600a844e1f151166 libtheoraenc2_1.2.0+dfsg-6_amd64.deb +libtie-ixhash-perl 1.23-4 all 8ca609994bc5000622e212f23e7e7d39f1b0e2f23cd770ea25f4039d0c7524f8 libtie-ixhash-perl_1.23-4_all.deb +libtiff6 4.7.0-3ubuntu5 amd64 f48cb837a644826b9411ecd9692cbd57fbcb57b5b8fba026652d9204b3acb169 libtiff6_4.7.0-3ubuntu5_amd64.deb +libtime-duration-perl 1.21-2 all 0a26c970c323e7a95465674e4393bfaa18883777274672df61444dd7c5cdf7a5 libtime-duration-perl_1.21-2_all.deb +libtimedate-perl 2.3300-2 all 71c8cf8da8e3f273070268f093cf7b418371be2c8a70566875d0fe6b5d119f89 libtimedate-perl_2.3300-2_all.deb +libtinysparql-3.0-0 3.11.0-1 amd64 0ce9b37325ceed91344c775dcf3b70db0e7140ab18b6567cb44e411b67f05a6f libtinysparql-3.0-0_3.11.0-1_amd64.deb +libtirpc-common 1.3.7-0.1 all debc1757cd9b13ec7837e6e76bd9aaf8ae0f622de0e45043e4f5c6e255375814 libtirpc-common_1.3.7-0.1_all.deb +libtirpc3t64 1.3.7-0.1 amd64 a6c68bbbcbaf2941aee004e581289958c690d17b867be510940a82df2a5572c1 libtirpc3t64_1.3.7-0.1_amd64.deb +libtk8.6 8.6.17-1build1 amd64 9956a0f9252ce0bc3be1a97fa06b53e2697d25c24f7dcff25fc17e7b52c3db6f libtk8.6_8.6.17-1build1_amd64.deb +libtotem-plparser-common 3.26.6-3 all 13fa95414ef977fdffe5d75accfb5999e383cb018a1d8aa3edf4258068c57d25 libtotem-plparser-common_3.26.6-3_all.deb +libtotem-plparser18 3.26.6-3 amd64 332a5a8a9d4b744d2a6af78acace096685aaa586ed8001d368bda514b9579476 libtotem-plparser18_3.26.6-3_amd64.deb +libtry-tiny-perl 0.32-1 all 2f506f17ea63a5f1f2eb8aa26bfac15e6ba37862287a045ac4b27ff8b0e9a9e3 libtry-tiny-perl_0.32-1_all.deb +libtss2-esys-3.0.2-0t64 4.1.3-6 amd64 945ce965bc35dd229fec38c8c35638326d61b74995a22459f59d50bcc4b6bbb3 libtss2-esys-3.0.2-0t64_4.1.3-6_amd64.deb +libtss2-mu-4.0.1-0t64 4.1.3-6 amd64 598bb51f250ee8a9c05a1c6610a938671d292d5cbe7f8265fde79d9d285a711d libtss2-mu-4.0.1-0t64_4.1.3-6_amd64.deb +libtss2-rc0t64 4.1.3-6 amd64 8bfb7d88fa9c83f37fe77a06d9745fc0176c28df079486ccacd2b8b6a927a652 libtss2-rc0t64_4.1.3-6_amd64.deb +libtss2-sys1t64 4.1.3-6 amd64 7e519ca206bee638184c94251bffb150354216a234a6ee67855da39325bc0256 libtss2-sys1t64_4.1.3-6_amd64.deb +libtss2-tcti-cmd0t64 4.1.3-6 amd64 aa01ff47dc2bcf694f07081b4813c14e3e5deba4558c3dc51b3917931d989726 libtss2-tcti-cmd0t64_4.1.3-6_amd64.deb +libtss2-tcti-device0t64 4.1.3-6 amd64 4e3f119e57f1e794edd70bf4e1aa840a6263ab936a209b150c2b352ee48b7db8 libtss2-tcti-device0t64_4.1.3-6_amd64.deb +libtss2-tcti-libtpms0t64 4.1.3-6 amd64 b597ee0e8f387f82eeb7e09f62eb3353d689a5674f00f4580e2f73227dc4cb4a libtss2-tcti-libtpms0t64_4.1.3-6_amd64.deb +libtss2-tcti-mssim0t64 4.1.3-6 amd64 a98ab8f06b6484304b57549bb7898c73c0f7996250f55d3abc4b707ab87bd4d8 libtss2-tcti-mssim0t64_4.1.3-6_amd64.deb +libtss2-tcti-spi-helper0t64 4.1.3-6 amd64 8c04fd74d8890ef23cae424222497e6d75e46a25a119eea44c3a2dd6f71a72bc libtss2-tcti-spi-helper0t64_4.1.3-6_amd64.deb +libtss2-tcti-swtpm0t64 4.1.3-6 amd64 d914df0c4b3f5259b27f579338aab9420230eefce8c340a5ffb44edcf9566eab libtss2-tcti-swtpm0t64_4.1.3-6_amd64.deb +libtss2-tctildr0t64 4.1.3-6 amd64 292c9bfcda2f6563a11f47d9e6530c467e8eea256dfd59a5d6626b2823d4d73a libtss2-tctildr0t64_4.1.3-6_amd64.deb +libtwolame0 0.4.0-2build4 amd64 f83717d357ca0d038ff333615d9aba6d19a888b93630e8142815f81e16cb0f22 libtwolame0_0.4.0-2build4_amd64.deb +libuchardet0 0.0.8-2 amd64 7ba592f208d28eecffb33494b636fb75fbe7917dc193f4190ad2a6d1c56450a4 libuchardet0_0.0.8-2_amd64.deb +libudisks2-0 2.10.91-1ubuntu2.1 amd64 52d797d03908af230f9bf19d91a173c747fee6c49835d59d1be5cf3805edbe02 libudisks2-0_2.10.91-1ubuntu2.1_amd64.deb +libunity-protocol-private0 7.1.4+19.04.20190319-6.1ubuntu1 amd64 a1855fbce17fff96e1fed915385102091925e7b92827afd766fb3f7b8ec850b1 libunity-protocol-private0_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb +libunity-scopes-json-def-desktop 7.1.4+19.04.20190319-6.1ubuntu1 all 898868492d7a5dca58e114ccce2f30ae78235a4f3798cbd83a2264f3672b15e5 libunity-scopes-json-def-desktop_7.1.4+19.04.20190319-6.1ubuntu1_all.deb +libunity9 7.1.4+19.04.20190319-6.1ubuntu1 amd64 2fea821dfdf3e620bda6fcee6641480336afa9af98276aa202df18894c36831e libunity9_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb +libunwind8 1.8.3-0ubuntu1 amd64 7a9978fadf0940f45500ced0fba219cb5954f322a31068b7b32ad04f3ddc5c3f libunwind8_1.8.3-0ubuntu1_amd64.deb +libupower-glib3 1.91.1-1 amd64 6f2d824e70aab09105a9bd8bde3d77cdfe9d391779fadeaca3043d339ed00b80 libupower-glib3_1.91.1-1_amd64.deb +liburcu8t64 0.15.6-1 amd64 de2e04225d0f1324ab5ee880e61427a5fa23de0a3563610386f5fc3eca653a02 liburcu8t64_0.15.6-1_amd64.deb +liburi-perl 5.34-2build1 all 0e8f2fbd6ab3444d23e1fff6a348d8872b8328548ad95c113d8011728c6809e6 liburi-perl_5.34-2build1_all.deb +liburing2 2.14-1 amd64 c0f1ed55d2eaa6e5d1224513b787c71348c6ab983e9c4178a417a7ffac3a8a00 liburing2_2.14-1_amd64.deb +libusb-1.0-0 2:1.0.29-2build1 amd64 0f3f167c22d00994276b6425a306d1c0b6047e2ea2eb850afbdaf00968330484 libusb-1.0-0_2%3a1.0.29-2build1_amd64.deb +libusbmuxd-2.0-7 2.1.1-1 amd64 f4cd323620e90c825069f0866d038347deded8d8d0c469ab42c75ba34e231f67 libusbmuxd-2.0-7_2.1.1-1_amd64.deb +libuv1t64 1.51.0-2ubuntu1 amd64 5c9b857d7d6a0c22b30dae45d518b375452cf7c663fc9381e3f0760ba3fb8cce libuv1t64_1.51.0-2ubuntu1_amd64.deb +libv4l-0t64 1.32.0-2ubuntu1 amd64 23b41e9e45ca64525f64f23e50d325123382225b68db18dd3a6b74be50a43cd4 libv4l-0t64_1.32.0-2ubuntu1_amd64.deb +libv4lconvert0t64 1.32.0-2ubuntu1 amd64 aa9fbbedeb94f9def39a05f9d953d0c9a72b0dc8b59c944b53844ec25f23f2f5 libv4lconvert0t64_1.32.0-2ubuntu1_amd64.deb +libva-drm2 2.23.0-1ubuntu1 amd64 f56b0cb850dcd8af45929b2da7cc1fbdf64245fbcec99033298499a8db2765a3 libva-drm2_2.23.0-1ubuntu1_amd64.deb +libva-x11-2 2.23.0-1ubuntu1 amd64 247f651d07a0e3e237c6d48f2b7f3f9de9609b69a4c047c471f50147dd13286f libva-x11-2_2.23.0-1ubuntu1_amd64.deb +libva2 2.23.0-1ubuntu1 amd64 83053abb11b8b0169bfb2abbd209a44ddeb4e56223980cdcfc0218b09e845f00 libva2_2.23.0-1ubuntu1_amd64.deb +libvisual-0.4-0 0.4.2-4 amd64 d2afc14cba71cd7ca7571b835146171c5fbd92b36acc863da9ebf96419ef8e7f libvisual-0.4-0_0.4.2-4_amd64.deb +libvolume-key1 0.3.12-10build2 amd64 cfd320ae710e0b4ee98d296feaafc4963aed789186a92e529204793bfd9c473e libvolume-key1_0.3.12-10build2_amd64.deb +libvorbis0a 1.3.7-3build2 amd64 e8577fd985c3a2bc61212be338207cc2a95e7d6892acaeccb3d455da13e4a480 libvorbis0a_1.3.7-3build2_amd64.deb +libvorbisenc2 1.3.7-3build2 amd64 b4230d0064eee971727b204e3d0644a4deb4a3d882eaac2304d379e7a5439f2a libvorbisenc2_1.3.7-3build2_amd64.deb +libvorbisfile3 1.3.7-3build2 amd64 8cd42cc285e34f915e0e769bcffab29c4267fb6453295ed309d50f8f376eef37 libvorbisfile3_1.3.7-3build2_amd64.deb +libvpx12 1.16.0-3 amd64 e1b852dfaa099fbcc60ab08d4e340553a7701c501544089609838c9417ba5fa0 libvpx12_1.16.0-3_amd64.deb +libvte-2.91-0 0.84.0-2 amd64 612230c9fcec7a14996d4eb70ebbe2293845315b46c7b14165694a990223b910 libvte-2.91-0_0.84.0-2_amd64.deb +libvte-2.91-common 0.84.0-2 amd64 7f4b1ca229e01c6cd29d7ca1ccd0fb01b9d2e86bebd3e495db464f07a326e651 libvte-2.91-common_0.84.0-2_amd64.deb +libvte-2.91-gtk4-0 0.84.0-2 amd64 9b038781acf8a27c7489bf62eaaa851e02607b5694c1806132404bb98731b393 libvte-2.91-gtk4-0_0.84.0-2_amd64.deb +libvulkan1 1.4.341.0-1 amd64 b4aca7a519d6318347f15a0e485c636603005e2553dae1a986272ac8c96176b0 libvulkan1_1.4.341.0-1_amd64.deb +libwacom-common 2.18.0-1 all 40498c518af6224bd21a931c8d393a93c318d52c2ee475432d6fa529c70c30ad libwacom-common_2.18.0-1_all.deb +libwacom9 2.18.0-1 amd64 a2555343e9c9a533e2ca5185895a043d8068912c5d95095d7e3a9f8a078dd919 libwacom9_2.18.0-1_amd64.deb +libwavpack1 5.9.0-1 amd64 67ae8eb2aba5cd2a2c32cc47bdaabec7b809458e11c55cfd6a64fe28d0b17ca2 libwavpack1_5.9.0-1_amd64.deb +libwayland-client0 1.24.0-2 amd64 094db0e190b53872e4d5310cd5fa09ca28ee3936386cd09e5f7d13e645aa12ab libwayland-client0_1.24.0-2_amd64.deb +libwayland-cursor0 1.24.0-2 amd64 941affa9ef61b0cca5cfac1fab13e8e78168af306709df4adf546c76be82a1de libwayland-cursor0_1.24.0-2_amd64.deb +libwayland-egl1 1.24.0-2 amd64 692358c252186b132f6807548cffffe6f358d5b2139e8d57d0763b1f3ba28c61 libwayland-egl1_1.24.0-2_amd64.deb +libwayland-server0 1.24.0-2 amd64 9f0278d02d401c9fd0f2b4b06d37ea0b1e7cecbb6a8d2539427f810d80c409dc libwayland-server0_1.24.0-2_amd64.deb +libwbclient0 2:4.23.6+dfsg-1ubuntu2.2 amd64 94f2f8e193ccd6b8901c36846391ac198d9ac77224fe66717f6e206f4720b02e libwbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +libwebkit2gtk-4.1-0 2.52.6-0ubuntu0.26.04.1 amd64 0d30994ddaa395026ed6e91e99608841597ebb492555de8a1c8fd83259c10da1 libwebkit2gtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb +libwebkitgtk-6.0-4 2.52.6-0ubuntu0.26.04.1 amd64 b3c40096f4dabf5b0fc4453e8cb8df340619ed45a34a601b53538693d60afd8c libwebkitgtk-6.0-4_2.52.6-0ubuntu0.26.04.1_amd64.deb +libwebp7 1.5.0-0.1build1 amd64 0a846cf63522d9c1f28d31bdd53e35e223d590a0971bb6927b3ee5092934ce9d libwebp7_1.5.0-0.1build1_amd64.deb +libwebpdemux2 1.5.0-0.1build1 amd64 05213cc9919e32e261479ec3a5fdf561da77f06d137046dd0d8b622ea3f0ea79 libwebpdemux2_1.5.0-0.1build1_amd64.deb +libwebpmux3 1.5.0-0.1build1 amd64 e4da6abdb642623afd2e4a60ef354539f8b74ba0f2daaaeb0e058a392d4ae571 libwebpmux3_1.5.0-0.1build1_amd64.deb +libwebrtc-audio-processing-1-3 1.3-3build2 amd64 9aed48f9a96df74a82c65b996ad2bef712dc77cd57569aca0a604f51e26a8291 libwebrtc-audio-processing-1-3_1.3-3build2_amd64.deb +libwhoopsie-preferences0 23build4 amd64 620795acdfb8a496044260c8fd901209616e18da494eff38b5a57d9c531b73af libwhoopsie-preferences0_23build4_amd64.deb +libwhoopsie0 0.2.82ubuntu amd64 7b689ad54e2d3f9ba025c44b0c1e9d7afcb23df32267dd5cd3b0ae3ea3675a27 libwhoopsie0_0.2.82ubuntu_amd64.deb +libwinpr3-3 3.31.0+dfsg-0ubuntu0.26.04.1 amd64 9590bd12c632dd6ab2413d84dcb2417adc9aaf47aa67656861f3f19a9968a0f1 libwinpr3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb +libwireplumber-0.5-0 0.5.13-1ubuntu1 amd64 5e5364a1e625e2e51cc2c92f7de813f2ee57b73c15eba63a68657dbd4d47861f libwireplumber-0.5-0_0.5.13-1ubuntu1_amd64.deb +libwmf-0.2-7 0.2.14-1 amd64 ca38f81214be4605404f808062b2c780cabac1b7c830367ebb5a07578e825d58 libwmf-0.2-7_0.2.14-1_amd64.deb +libwmf-0.2-7-gtk 0.2.14-1 amd64 b1978f52b4dbe623c3de42e3ba76fced22afe6ea823ea7cf40e63c2ff191cf23 libwmf-0.2-7-gtk_0.2.14-1_amd64.deb +libwmflite-0.2-7 0.2.14-1 amd64 16dfaa480ecec8c9b436d7b2957ea085f9871f3bf8accae93d593175e3d00267 libwmflite-0.2-7_0.2.14-1_amd64.deb +libwnck-3-0 43.3-1build1 amd64 ed9662390c61fe7a2e2f7b6e1996a309d7c22a6f4b22342d115d037fad1e4436 libwnck-3-0_43.3-1build1_amd64.deb +libwnck-3-common 43.3-1build1 all 88466e17f3f455ebe8af70089c3a883407ef0819117c40227dbc3086d05cf7ef libwnck-3-common_43.3-1build1_all.deb +libwrap0 7.6.q-36build2 amd64 a3784ca083c626c3ae41cdd32d4c5898554650dc77d2b54dbb1197a38198adf8 libwrap0_7.6.q-36build2_amd64.deb +libwww-perl 6.81-1ubuntu0.1 all 0cfd279321a889cfc1ba48e2679623f8110947ea05e595c32c002f9086f3c09e libwww-perl_6.81-1ubuntu0.1_all.deb +libwww-robotrules-perl 6.02-1build1 all 61862314f03e9c603f0b747999981a0ea6904b4d736bc46da7c6624ac2ac5f0f libwww-robotrules-perl_6.02-1build1_all.deb +libx11-6 2:1.8.13-1 amd64 7e643e76063b94df9159c8b8fd4b8bf53d2fbf119c9889a5cc6842b6be272e4f libx11-6_2%3a1.8.13-1_amd64.deb +libx11-data 2:1.8.13-1 all 8188c233d59dc419205c314ef8f230fc83ca7a3e7e9b9671f18b469fd3e428ae libx11-data_2%3a1.8.13-1_all.deb +libx11-protocol-perl 0.56-9 all 3e1225b15f7921617a19e6e122353a3336bf32ca84654546b5b6b75b48d259eb libx11-protocol-perl_0.56-9_all.deb +libx11-xcb1 2:1.8.13-1 amd64 e20ab288f2f756800ae25e7a827ae70aee64272f692dd3cb8f706764b6767de9 libx11-xcb1_2%3a1.8.13-1_amd64.deb +libxau6 1:1.0.11-1build2 amd64 6c0b2dd4654db30449754e6e1adf84a34d8a8d7dddeb75f8c9c463ad86645274 libxau6_1%3a1.0.11-1build2_amd64.deb +libxaw7 2:1.0.16-1build1 amd64 8771b09a2ed641887411b9c5e10621440972340710fa4a8e015f062e5a7f5930 libxaw7_2%3a1.0.16-1build1_amd64.deb +libxcb-damage0 1.17.0-2ubuntu1 amd64 24933e0f99b64847e8e915bc3acb42fc55f12db6aa219d3bec3e02b8004c39cb libxcb-damage0_1.17.0-2ubuntu1_amd64.deb +libxcb-dri2-0 1.17.0-2ubuntu1 amd64 bbc1f3f83d2ffe8f4596b7e745febf82aa90ca0e1916579cad2cce27041335ca libxcb-dri2-0_1.17.0-2ubuntu1_amd64.deb +libxcb-dri3-0 1.17.0-2ubuntu1 amd64 2e0e3916c647a74e081621f385aa296dab3052b2582b0781d9fbea2f15696ef4 libxcb-dri3-0_1.17.0-2ubuntu1_amd64.deb +libxcb-glx0 1.17.0-2ubuntu1 amd64 857c34618ae56b2577d8d439cf86f80375582626193efaa3229c6767106a1a20 libxcb-glx0_1.17.0-2ubuntu1_amd64.deb +libxcb-present0 1.17.0-2ubuntu1 amd64 64f23e7166461758d158220305e93a98fe75c570b68f96303a1c2395a58d5d7d libxcb-present0_1.17.0-2ubuntu1_amd64.deb +libxcb-randr0 1.17.0-2ubuntu1 amd64 78977a067ec1d59bb4ded1b35835d0ba70e6538aac1ea7edefe413795aaa0d4f libxcb-randr0_1.17.0-2ubuntu1_amd64.deb +libxcb-render0 1.17.0-2ubuntu1 amd64 2bdd10dd88c99523a62bfcc2b71b59fdf93ee396e8baf617c76fc3ec38f39bde libxcb-render0_1.17.0-2ubuntu1_amd64.deb +libxcb-res0 1.17.0-2ubuntu1 amd64 7c1d617a2b260fba96570eb9d0223ee25cb788bf82cb6731b6a709540473f2ad libxcb-res0_1.17.0-2ubuntu1_amd64.deb +libxcb-shape0 1.17.0-2ubuntu1 amd64 64f09e1434f232c4297b634e857772ab6c11cb3fae116ad6d557d563c8f3b385 libxcb-shape0_1.17.0-2ubuntu1_amd64.deb +libxcb-shm0 1.17.0-2ubuntu1 amd64 e70d52936aabd7a90e9cd8af0f54ca050cde244f8382ffc5524ba65117c199c4 libxcb-shm0_1.17.0-2ubuntu1_amd64.deb +libxcb-sync1 1.17.0-2ubuntu1 amd64 8883f5e6badab24cb7487390bf1a888bb714e406f6c799345c33e4b69a8f3112 libxcb-sync1_1.17.0-2ubuntu1_amd64.deb +libxcb-util1 0.4.1-1build1 amd64 cf20c1093b223f82dc970cf38c3907ba0f4b70607820ff1c13d64ef51c0d1656 libxcb-util1_0.4.1-1build1_amd64.deb +libxcb-xfixes0 1.17.0-2ubuntu1 amd64 00c1381b61e2e5b8a78e89b15818a214a8f44f1fae6a9ddd95e7c61de8ea33d2 libxcb-xfixes0_1.17.0-2ubuntu1_amd64.deb +libxcb1 1.17.0-2ubuntu1 amd64 069e64705e4a5721a223b4d22643bbaeaa63a6efbb56ebd3d7c4a31c4a26fa1c libxcb1_1.17.0-2ubuntu1_amd64.deb +libxcomposite1 1:0.4.6-1build1 amd64 b8557d5aba1e575acfb169f47e798c449c8a5ca05846861f1480724d4cfc5ce3 libxcomposite1_1%3a0.4.6-1build1_amd64.deb +libxcursor1 1:1.2.3-1build1 amd64 0f3d9816a3a557590ca1b31f2548b1988ad7ec9de976bad07cc24cc7d69b4ee7 libxcursor1_1%3a1.2.3-1build1_amd64.deb +libxcvt0 0.1.3-1build1 amd64 3660c17f9a96c3fe1edd81b2795a17d273b3da39444f2d39f715ebd85cabe6ff libxcvt0_0.1.3-1build1_amd64.deb +libxdamage1 1:1.1.7-1 amd64 dd751597c6216105774a93769972d1cb6dad5fd1ba91f090197d7acc85c406cb libxdamage1_1%3a1.1.7-1_amd64.deb +libxdmcp6 1:1.1.5-2 amd64 d5d51e67063ff11e81698d8ee90bab5af763dc0a793929f33712bb74e7633768 libxdmcp6_1%3a1.1.5-2_amd64.deb +libxdo3 1:3.20160805.1-5.1build1 amd64 b4edfb3fcb5a3b6bd2b407dbb6f7071c975db611e86774d8a3026a28133e96e5 libxdo3_1%3a3.20160805.1-5.1build1_amd64.deb +libxext6 2:1.3.4-1build3 amd64 b867ba9daa9437ba3f18cba9646d9e3db55e5197bd4feb53184b1414c05210ca libxext6_2%3a1.3.4-1build3_amd64.deb +libxfixes3 1:6.0.0-2build2 amd64 f3a71f6aa12000480c419e44f3aa5bdca7eb862b720d0307661b4e886db1c5f8 libxfixes3_1%3a6.0.0-2build2_amd64.deb +libxfont2 1:2.0.6-2ubuntu0.2 amd64 eeca46a661876466a8f96469054427f0b18a10a758c4c69d2c5f20b290f6f056 libxfont2_1%3a2.0.6-2ubuntu0.2_amd64.deb +libxft2 2.3.6-1build2 amd64 a6ad7fd2294e8e04d553919b5beed0269ebc6f73d41261ed1059c7fde83227f0 libxft2_2.3.6-1build2_amd64.deb +libxi6 2:1.8.2-2 amd64 b975dd89cac8c32a3cf622e1b7f5434db59f37eda87dfee399d0806d9953db0a libxi6_2%3a1.8.2-2_amd64.deb +libxinerama1 2:1.1.4-3build2 amd64 02d3dce422acc3ac9b5491f47acdd07bc7c3f78ce193865f2920d38b10fbadf5 libxinerama1_2%3a1.1.4-3build2_amd64.deb +libxkbcommon0 1.13.1-1 amd64 7988d2375d10277ab4a54641aa6181accfaf3f5d25e48b050bf42a9583d4f926 libxkbcommon0_1.13.1-1_amd64.deb +libxkbfile1 1:1.1.0-1build5 amd64 40bf42bc549b5d1f848e2ce8c1bafc9777e0fd4b943bbff922dd340f7ab3f5d7 libxkbfile1_1%3a1.1.0-1build5_amd64.deb +libxkbregistry0 1.13.1-1 amd64 21dc9f060ecfa872f9761016dd5e759f5a26cad8cd0689dad4bb3a0575107642 libxkbregistry0_1.13.1-1_amd64.deb +libxml-parser-perl 2.47-1ubuntu1 amd64 d3f6ebe9aa48553d1b797fe1c32ef484d211406e0d83c55131ed7ed21597171d libxml-parser-perl_2.47-1ubuntu1_amd64.deb +libxml-twig-perl 1:3.54-1build1 all 0686775e315eadeaf03f9f846c18d51c01a088e8de07c0d018474d00932c1f17 libxml-twig-perl_1%3a3.54-1build1_all.deb +libxml-xpathengine-perl 0.14-2 all 938c131969b95b7eb369f42956e8be4462bc179883e09d2806f3560e81f6de81 libxml-xpathengine-perl_0.14-2_all.deb +libxml2-16 2.15.2+dfsg-0.1ubuntu0.1 amd64 14211c45bb75f9543e6053207533370047873ade7e4c70f7285400f1df6c898f libxml2-16_2.15.2+dfsg-0.1ubuntu0.1_amd64.deb +libxmlb2 0.3.24-2 amd64 12aa2999751f0e0944b8369f6c1c17ee50182644545c9a2c5f22dc5188c91c11 libxmlb2_0.3.24-2_amd64.deb +libxmu6 2:1.1.3-4 amd64 15e9c3a2bd4132a2873b339b4af578dd19462f1eee705b025f656ea548aba19f libxmu6_2%3a1.1.3-4_amd64.deb +libxmuu1 2:1.1.3-4 amd64 30dfe0950ff901ed359eb96d6f81f082bb4b5c15aae6c03b92ddf309300871fb libxmuu1_2%3a1.1.3-4_amd64.deb +libxpm4 1:3.5.17-1ubuntu0.26.04.1 amd64 ef412a3ef4323e49c837fb442e53e575f8cffba077b38db16e89e28db238b42b libxpm4_1%3a3.5.17-1ubuntu0.26.04.1_amd64.deb +libxrandr2 2:1.5.4-1build1 amd64 d0052315ac1417234777c0872568a86fce4d3a3316c041e5a2200da70f43a855 libxrandr2_2%3a1.5.4-1build1_amd64.deb +libxrender1 1:0.9.12-1build1 amd64 60b2f01e8124318e2a11049b82c764fd4c05c21adba11312e93ab116d6594f1e libxrender1_1%3a0.9.12-1build1_amd64.deb +libxres1 2:1.2.1-1build2 amd64 c7794a754880ef7bde4a73c0257dd48d8e3f387ee1618ba97f8e5cf5cdd7c80f libxres1_2%3a1.2.1-1build2_amd64.deb +libxshmfence1 1.3.3-1build1 amd64 85d6b6883a35e1a3b78af3dda6bb6b843c06cbead030a00d9de7d31a8077d562 libxshmfence1_1.3.3-1build1_amd64.deb +libxslt1.1 1.1.45-0.1 amd64 d2ad5edf215939cc0fe74ca6cb9910060915233032a7c7074d4f206702c802a1 libxslt1.1_1.1.45-0.1_amd64.deb +libxss1 1:1.2.3-1build4 amd64 04339441bb49c8b9c6d3297bb569b3b774de61e422f5e7334c34225b08709035 libxss1_1%3a1.2.3-1build4_amd64.deb +libxt6t64 1:1.2.1-1.3build1 amd64 b4255d5aea7986fa06ae3a3599f9e5c38a58ded1c3b79cfaf3c2959ad160eeff libxt6t64_1%3a1.2.1-1.3build1_amd64.deb +libxtables12 1.8.11-2ubuntu3 amd64 e21126e0544e3b795633fb5b06bb7f2b9a493ebc5ab07b007db0f7f68c0a0aed libxtables12_1.8.11-2ubuntu3_amd64.deb +libxtst6 2:1.2.5-1build1 amd64 c150c1bacec599cf70609ce1236fd06accacd96e280205090bdd57fd73ee0e4b libxtst6_2%3a1.2.5-1build1_amd64.deb +libxv1 2:1.0.13-1 amd64 235a7eb12cb1dc5ac4151d8ed7527bbcce41f1ab367fd6282ded29560e6eb5c1 libxv1_2%3a1.0.13-1_amd64.deb +libxvmc1 2:1.0.12-2build4 amd64 f55191a36c43f1e3d5881ddfaea1001e117c6366583865a48edb5755f67338d3 libxvmc1_2%3a1.0.12-2build4_amd64.deb +libxxf86dga1 2:1.1.5-1build2 amd64 479687bd0cae59b5e062a6c642cdee30f2d0ad6eb7c713e0f10dd785beb404a0 libxxf86dga1_2%3a1.1.5-1build2_amd64.deb +libxxf86vm1 1:1.1.4-2 amd64 ff01ae50526c23c6c747e1efd98ee3785a1d28458e865277fc367c565bb94703 libxxf86vm1_1%3a1.1.4-2_amd64.deb +libyaml-0-2 0.2.5-2build3 amd64 bdeecb9b4309731eef49eea87cf126e343d12d3823e32f0286e3e5f18f437994 libyaml-0-2_0.2.5-2build3_amd64.deb +libyelp-1-0 49.0-5ubuntu0.1 amd64 5530c69219bddc1935c21ac253e1289d249e1f595c8e44bd0e2c9cec48c3f0da libyelp-1-0_49.0-5ubuntu0.1_amd64.deb +linux-base 4.15ubuntu5 all df05419ee01f989ea1495d1ee6ef11fa22f1ea742182def9159740037251fa86 linux-base_4.15ubuntu5_all.deb +linux-sound-base 1.0.25+dfsg-0ubuntu9 all bc90f0ae88150ae8e3185626a836caf3f81dfe4f9a77d290f7260d64e164a32b linux-sound-base_1.0.25+dfsg-0ubuntu9_all.deb +linux-sysctl-defaults 4.15ubuntu5 all 6c414e68e23b82fd62df9ce4d75b427071219bf4e80ce85fcbab57eade4eed7d linux-sysctl-defaults_4.15ubuntu5_all.deb +locales 2.43-2ubuntu2.4 all a1abf41b517f767018d5eab519d55b9269fe0a04ae49ea35f7c3ad1b8870ab32 locales_2.43-2ubuntu2.4_all.deb +localsearch 3.11.0-1ubuntu1.1 amd64 0d1e647e655f9fa749515fa0aad656b2f700e3914c9e70eee6adb44be7b93da2 localsearch_3.11.0-1ubuntu1.1_amd64.deb +loupe 50.0-0ubuntu2 amd64 6af0e93b1a0ccf5b5bd09ce5acec03cf4e9c0577bf874195113ce17aa0b91052 loupe_50.0-0ubuntu2_amd64.deb +lsb-release 12.1-2build1 all 992cd1c4d62332bc2000d87438a479578af71e719df6430079734791060583aa lsb-release_12.1-2build1_all.deb +lsof 4.99.4+dfsg-2build2 amd64 4f61cd2ad30fc73f53d66d769395d343c268a526f7901e14ae69f530b468435b lsof_4.99.4+dfsg-2build2_amd64.deb +luit 2.0.20250912-1 amd64 787954ae8ebb8ad1069278e52ec2a80d8a5701b55f4c89d397745b72debe435e luit_2.0.20250912-1_amd64.deb +makedumpfile 1:1.7.7-1 amd64 b3e66bc9414ce9b1cf4498704c453a70cd5a16679ec86ffc972a523c1e6a31a0 makedumpfile_1%3a1.7.7-1_amd64.deb +man-db 2.13.1-1build1 amd64 8f5f22abe63c90c76363f9ce182671bc2ced4a7259170f2c634cd96b4ad3acfe man-db_2.13.1-1build1_amd64.deb +media-types 14.0.0build1 all f3412d08032210541d25c4e00fa492ce527af245ac9bec2e543d81a59b4426aa media-types_14.0.0build1_all.deb +memtest86+ 8.00-3 amd64 8aaf23ceab202090967030280362c32f55b6e6af30cedfbb3c6ede41a4e81cbd memtest86+_8.00-3_amd64.deb +mesa-libgallium 26.0.8-1ubuntu0.3 amd64 7f123a545774034793ba3516c5fad0be88de68ad91319a4b220d98b32a289451 mesa-libgallium_26.0.8-1ubuntu0.3_amd64.deb +mesa-vulkan-drivers 26.0.8-1ubuntu0.3 amd64 27db5fa34d50d208b58cc94317b573065329740bb98d0e12b7947b06a9d02a4e mesa-vulkan-drivers_26.0.8-1ubuntu0.3_amd64.deb +mobile-broadband-provider-info 20251101-1build1 all 5a4821ebe3f996104f2b00c94a7eb6511e88469ce1a2082af2fa6a1a34192310 mobile-broadband-provider-info_20251101-1build1_all.deb +modemmanager 1.25.95-1ubuntu1 amd64 230439882a79b3f1fd11ed715b658f86213e6355a4b5ed38ee91cbd1f71aface modemmanager_1.25.95-1ubuntu1_amd64.deb +mokutil 0.7.2-2 amd64 7d0a173bfc17241f983b8c25fd34dd3b41e1c314803bbdea2f4cace417da3480 mokutil_0.7.2-2_amd64.deb +moreutils 0.69-1build1 amd64 932639e63e49a9912cd27457688f2a971faddcde985a0a38970fa713c30fcc3f moreutils_0.69-1build1_amd64.deb +mscompress 0.4-10build2 amd64 2c2207a2c67d93f161f6cc8bb1877687e7af35e67b8afa01173636f4872d84d6 mscompress_0.4-10build2_amd64.deb +mutter-common 50.1-0ubuntu2.2 all cf0f3cff9e965bb590852318a01290f4fdff90eefcf1d695254335faa8421dd4 mutter-common_50.1-0ubuntu2.2_all.deb +mutter-common-bin 50.1-0ubuntu2.2 amd64 6414537f37eaa13988488496542ed79b9f24d168e5b708b79cc1606ad1f904e8 mutter-common-bin_50.1-0ubuntu2.2_amd64.deb +nautilus 1:50.2.2-0ubuntu0.1 amd64 97961c5419e6cd105a053f16e2f4205653c4d951ac7ac7b4da68a767546af56d nautilus_1%3a50.2.2-0ubuntu0.1_amd64.deb +nautilus-data 1:50.2.2-0ubuntu0.1 all 4084720b6a6e4b6881c17fe514ebc305b9484e0f17d44bb050a15f88a0490dd9 nautilus-data_1%3a50.2.2-0ubuntu0.1_all.deb +nautilus-sendto 3.8.6-8ubuntu1 amd64 e959905e710d7c161a31f0091d998bc370ae903ee551424d15cb71c8dd4d8b1a nautilus-sendto_3.8.6-8ubuntu1_amd64.deb +ncurses-term 6.6+20251231-1 all 23b67d85b6c8857fd40aded8554f59751460c8d35f0a0573562021480acbca62 ncurses-term_6.6+20251231-1_all.deb +netbase 6.5build1 all f008e39aada379d64166153d5e37ccc4f18b3e334babb9e32c4da9b4396ee733 netbase_6.5build1_all.deb +netcat-openbsd 1.234-1 amd64 a17549cec3db5cbe8c1f05117aa599499edbdc95e980db0a38086faf2a330e56 netcat-openbsd_1.234-1_amd64.deb +netplan-generator 1.2-1ubuntu5.1 amd64 c9ca94ed0ff4bbd7d83ae1d16e2b9118270431c38696ae80f7c7c5126688c161 netplan-generator_1.2-1ubuntu5.1_amd64.deb +netplan.io 1.2-1ubuntu5.1 amd64 3c6efa64031a2d79b504dd513e42883fb65ec117deaf3b810d19b5b291c2d454 netplan.io_1.2-1ubuntu5.1_amd64.deb +network-manager 1.54.3-2ubuntu3 amd64 3c085ad0c5ccca5558bfca5197b322f4e2c8f278edaf5f7d8962d4e20488c2fb network-manager_1.54.3-2ubuntu3_amd64.deb +network-manager-config-connectivity-ubuntu 1.54.3-2ubuntu3 all 42a7d35d594fd6b6b12e00e2b8e59c34bece4d1ee8c3972d473d9659702dbc32 network-manager-config-connectivity-ubuntu_1.54.3-2ubuntu3_all.deb +network-manager-l10n 1.54.3-2ubuntu3 all 9f53f04f77d3591e9b8009d6d15cc735421217b6e79280f496db7a961ba4ef26 network-manager-l10n_1.54.3-2ubuntu3_all.deb +network-manager-openvpn 1.12.5-1 amd64 59454667f5217c5d30290efb31fe915d997a323bf5be1a30ce13b763cf922938 network-manager-openvpn_1.12.5-1_amd64.deb +network-manager-openvpn-gnome 1.12.5-1 amd64 a9ab333b41b8a9c1384f28eb5d4de6cafc8b9ede8ea267b39d3dddf9e24ae32e network-manager-openvpn-gnome_1.12.5-1_amd64.deb +network-manager-pptp 1.2.12-6 amd64 815edfffeff434bbbcb76efab772233fd291b6b35e0ee625e9cab5e9f4533bb1 network-manager-pptp_1.2.12-6_amd64.deb +network-manager-pptp-gnome 1.2.12-6 amd64 942f49bc7face385928da24f2d2651841ce2c6733d3cff70f1db0a7c3a21331f network-manager-pptp-gnome_1.2.12-6_amd64.deb +nftables 1.1.6-1 amd64 fcdeae9ed9761550619d062f8ae87a2399c84ab87f4535bcb9ab0d3649aba59a nftables_1.1.6-1_amd64.deb +nm-connection-editor 1.36.0-4ubuntu1 amd64 0d26a7108d940497878d7f990271a3c93c32e826cf3c057c5573a3125d93c446 nm-connection-editor_1.36.0-4ubuntu1_amd64.deb +ntfs-3g 1:2022.10.3-5ubuntu1.1 amd64 7a02c9f13b08953f98cc326eef70c7b9b517a1d1a4d3bfc74f5752c80880a153 ntfs-3g_1%3a2022.10.3-5ubuntu1.1_amd64.deb +nvme-cli 2.16-1 amd64 2dee6fe3ef62fbd30065759efbc7593a289e8dc0e7b82ecb57d67f518e2dc57e nvme-cli_2.16-1_amd64.deb +openipmi 2.0.37-1build1 amd64 dac3322406c0453f43e85f14c74fa0f841f3ca0722bd4d3cc7f9a2d1bc11e5d9 openipmi_2.0.37-1build1_amd64.deb +openprinting-ppds 20250819-1build1 all 8e99a7573a66559557fde2d2970c7c9ba15d25f9b0c64d4aa8c1ffbbb07ce949 openprinting-ppds_20250819-1build1_all.deb +openssh-client 1:10.2p1-2ubuntu3.6 amd64 d47ae7d97b3751264f921cc3df09a70915e85ad980c94b99e651e21c36e3d987 openssh-client_1%3a10.2p1-2ubuntu3.6_amd64.deb +openssh-server 1:10.2p1-2ubuntu3.6 amd64 108256262b0fb7bb8eddd92e87230f775c90eb321413e8789754b3509f7b55c6 openssh-server_1%3a10.2p1-2ubuntu3.6_amd64.deb +openssh-sftp-server 1:10.2p1-2ubuntu3.6 amd64 16bfb714d404ccbee3623d08f280a3671512ecbe9590565fac621c85bcee7766 openssh-sftp-server_1%3a10.2p1-2ubuntu3.6_amd64.deb +openssl 3.5.5-1ubuntu3.5 amd64 0cea6b98673ff88218b7e5f18c1bd42f06bdfcae6c1ebc9964adf3bc41420c19 openssl_3.5.5-1ubuntu3.5_amd64.deb +openvpn 2.7.0-1ubuntu1.2 amd64 ae6c69da5eb4077f39f8d12827d7603d7294ffb0ea733ca32b643ddeffecd032 openvpn_2.7.0-1ubuntu1.2_amd64.deb +orca 50.2-0ubuntu0.1 all abba2a0f5231c4cd4237e6cc2989166e242682e69bf0a1ad3245701b1f6ccbeb orca_50.2-0ubuntu0.1_all.deb +os-prober 1.84ubuntu1 amd64 16fe1703355df54a48d16942647448f9313895bd9750b33a92d3f1e64087af63 os-prober_1.84ubuntu1_amd64.deb +p11-kit 0.26.2-2 amd64 3a61dfa5b4d04d204b38c5f555e8e916427f175f04e29dec4f6cf7b787d54a5d p11-kit_0.26.2-2_amd64.deb +p11-kit-modules 0.26.2-2 amd64 633ac53737f9a284acc3df4d1d717857902fe04a222f19331c7b18092fe2448b p11-kit-modules_0.26.2-2_amd64.deb +packagekit 1.3.4-3ubuntu1.2 amd64 45df03f3b6755f67fcecf5de1624e1ae8ec4808cf6804da47693e17bc5bd51b7 packagekit_1.3.4-3ubuntu1.2_amd64.deb +papers 50.2-0ubuntu0.1 amd64 6f1553f6594ae26bac5d3e6778cce8070ce3778656bb05325787946bfbad1e0a papers_50.2-0ubuntu0.1_amd64.deb +papers-common 50.2-0ubuntu0.1 all c38b589c28febc104e84048afe834a43288a34cd0ca367b7eabb3d86e6741420 papers-common_50.2-0ubuntu0.1_all.deb +parted 3.6-6 amd64 91dd4af8802c8f9b7faa53031dad52b8a344ef3ee659514f7c641576e3b3debf parted_3.6-6_amd64.deb +patch 2.8-2build1 amd64 0e5a899095d92d6db9585183a5225504f5dc5ecaffdfe2a25d745a9502de3b30 patch_2.8-2build1_amd64.deb +pci.ids 0.0~2026.02.12-1 all 0ff0f097128bad2652dae41b8afa2266dfeec939935f43b0a87a50bc17e2f77d pci.ids_0.0~2026.02.12-1_all.deb +pciutils 1:3.14.0-1build2 amd64 9365cca3e3e97f58cd8f6f31c82492ae03e0f33c85c46c177ff19b045978541a pciutils_1%3a3.14.0-1build2_amd64.deb +pcmciautils 018-19 amd64 a4419de089412644665f8ded9868449f61dedff7e132020c80c5c3bceeaba1cf pcmciautils_018-19_amd64.deb +perl 5.40.1-7ubuntu0.3 amd64 e06e80879beca89fc363a5ecbc0e15ceae68aed20bc8e4ea952a10d45f69a47d perl_5.40.1-7ubuntu0.3_amd64.deb +perl-modules-5.40 5.40.1-7ubuntu0.3 all 19c81efa2c37662080df7d44289b9b5c516205ee8cf9c54410b0031ff2208e41 perl-modules-5.40_5.40.1-7ubuntu0.3_all.deb +perl-openssl-defaults 7build4 amd64 fbd40b547a3bd8bf626da4405b9c0dd4d623b368daf74eb81292fe896917c91b perl-openssl-defaults_7build4_amd64.deb +pigz 2.8-1build1 amd64 9571cde9f1132b2aafe63a0c06aa93342fcd6ee1bad83e681647fe7592acc0db pigz_2.8-1build1_amd64.deb +pinentry-gnome3 1.3.2-3ubuntu1 amd64 aa23bc62b2cb5a659b3ade1846b3dd317af4bc96da9c607dde234f71253d91d0 pinentry-gnome3_1.3.2-3ubuntu1_amd64.deb +pipewire 1.6.2-1ubuntu1.1 amd64 b45ea88bc80ee127a6ea8d16c19b965af50613f68d0b5679b80d4bd6eb80394f pipewire_1.6.2-1ubuntu1.1_amd64.deb +pipewire-alsa 1.6.2-1ubuntu1.1 amd64 eafe997957960a6b3b35f23c4c79159f7b19b58c1b186cfcecf694384aac8bc1 pipewire-alsa_1.6.2-1ubuntu1.1_amd64.deb +pipewire-audio 1.6.2-1ubuntu1.1 all 6bdaea8c46846f361f30b82290be8549f99ba17d3ae872d973856dac47f0a875 pipewire-audio_1.6.2-1ubuntu1.1_all.deb +pipewire-bin 1.6.2-1ubuntu1.1 amd64 292e2227c5c1368929a47e2709f92665e1274f6fcd86c876e18c4ae4b3747a71 pipewire-bin_1.6.2-1ubuntu1.1_amd64.deb +pipewire-pulse 1.6.2-1ubuntu1.1 amd64 2d618e4e07c61d48c10b2acf89f283191ff3e414530e3e07e0af26a2c187326e pipewire-pulse_1.6.2-1ubuntu1.1_amd64.deb +pkexec 127-2ubuntu1.1 amd64 13cee770b506148abff92aafbbb364e203807a61b7548fa9aca3e1d72827b002 pkexec_127-2ubuntu1.1_amd64.deb +plymouth 24.004.60+git20250831.4a3c171d-0ubuntu8 amd64 70abc40f1d4a8caeae443310e397cd8b17f2a5e9769c797d79ce479de13870b0 plymouth_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +plymouth-label 24.004.60+git20250831.4a3c171d-0ubuntu8 amd64 ad8f341e0f2500c983a33a3b42f850f8844a13b15e6ea6dccfcce29c81d0ca88 plymouth-label_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +plymouth-theme-spinner 24.004.60+git20250831.4a3c171d-0ubuntu8 amd64 19ff2c73b357ce5ee30cdd0cc420691b19b830ad323e286508c6117e9b85e363 plymouth-theme-spinner_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb +policykit-desktop-privileges 0.22build1 all d357ef30efb90b21f2e63833b3d49efecb09fc59785c18adef2c2a634a2c4a36 policykit-desktop-privileges_0.22build1_all.deb +polkitd 127-2ubuntu1.1 amd64 c1935129f2d9d76db7c9d3f29cad2c85de0e5c1a568b7a8a6140131c2804a0d8 polkitd_127-2ubuntu1.1_amd64.deb +poppler-data 0.4.12-1build1 all 6d2d873d2a77a76ea2a156c15a5ae798fe3711d8736cd2ff3872f53d57567e0e poppler-data_0.4.12-1build1_all.deb +poppler-utils 26.01.0-2ubuntu0.1 amd64 16399d6fe46fbef3259297601ffeeaf024d725b02cdd6d8ddbbc2f4b0aa1ed7d poppler-utils_26.01.0-2ubuntu0.1_amd64.deb +power-profiles-daemon 0.30-2 amd64 476b74a46ec1ae19d1c43bfa00957d53dd9a51ea8229da06d8aee87e4ea7653e power-profiles-daemon_0.30-2_amd64.deb +ppp 2.5.2-1+1.2 amd64 b80c9d944cc929eb4b1556aeb2fd06eff37a5163ef18838ae533c0f0fb6efbae ppp_2.5.2-1+1.2_amd64.deb +pptp-linux 1.10.0-2build1 amd64 f12d5e0c8139656a69cc74be3357391965fb5c2e4ba46d67de2796dabb85a392 pptp-linux_1.10.0-2build1_amd64.deb +printer-driver-brlaser 6.2.8-1 amd64 ceea4b95ffa50d7e6c8bd99f1d365d3f0722aa0c8e6a4b8fefcbdace90a8c1b2 printer-driver-brlaser_6.2.8-1_amd64.deb +printer-driver-c2esp 27-11ubuntu8 amd64 8ec58b3cb4d0fe253063a0e6352514dce43f4d4a25ccad122943800680ee5804 printer-driver-c2esp_27-11ubuntu8_amd64.deb +printer-driver-foo2zjs 20200505dfsg0-3ubuntu1 amd64 979f8bc0e3fdc1a7602ee35034818c7ea207321e5c0c469a7a92c1ac12714aef printer-driver-foo2zjs_20200505dfsg0-3ubuntu1_amd64.deb +printer-driver-foo2zjs-common 20200505dfsg0-3ubuntu1 all 3aa8af4816a8d84ed0c7eba78bdadd52567a826f26d18116efbab96d2f43bfb7 printer-driver-foo2zjs-common_20200505dfsg0-3ubuntu1_all.deb +printer-driver-hpcups 3.24.4+dfsg0-0ubuntu8.1 amd64 5e128db58f0f7b47a0f52bf1d00959617d6debada5ba8a68e25d97b6e0ad02bf printer-driver-hpcups_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +printer-driver-m2300w 0.51-15build3 amd64 114daf5e6f0e6d26712bbd6aed099bb48cb9c341d0ef45f91be656ec1db29bfb printer-driver-m2300w_0.51-15build3_amd64.deb +printer-driver-min12xxw 0.0.9-11build4 amd64 0158b5c2a3dbec5b8eed2ca328f3f27b1402eb870c38b4694faf1c06a17d6a10 printer-driver-min12xxw_0.0.9-11build4_amd64.deb +printer-driver-pnm2ppa 1.13+nondbs-0ubuntu11 amd64 374f0c7ddb9bf06006459df8da0e45e18704c4f61e88abef2013bdad9bed6f2f printer-driver-pnm2ppa_1.13+nondbs-0ubuntu11_amd64.deb +printer-driver-postscript-hp 3.24.4+dfsg0-0ubuntu8.1 amd64 624c45738ca1410990eabe1a54666d6d01cbb1fa2dd1fb33e220c16dcc42ac78 printer-driver-postscript-hp_3.24.4+dfsg0-0ubuntu8.1_amd64.deb +printer-driver-ptouch 1.7.1-1build1 amd64 f59ec76fbcea603467b0dc26fce1d988a0e5669eff347d575592a95b1b7fb8b1 printer-driver-ptouch_1.7.1-1build1_amd64.deb +printer-driver-pxljr 1.4+repack0-6build3 amd64 601017b8567bc37e65c1b792accd3bb0f6f8dee2e16876aafdcc1d0ae47ea1c7 printer-driver-pxljr_1.4+repack0-6build3_amd64.deb +printer-driver-sag-gdi 0.1-8build1 all ffdb3fe9d7156f34e3f2e4ad883a498db5b58b5d9ee53fcc6740a2a964a15466 printer-driver-sag-gdi_0.1-8build1_all.deb +printer-driver-splix 2.0.1-2 amd64 a33d32720e620109989587538ef87d27d407adf54a5e9697aeb9f5e38bdfbfab printer-driver-splix_2.0.1-2_amd64.deb +prometheus-node-exporter 1.10.2-1 amd64 64dc6b1fd378013829cb75a46e2f93603da361aeeb616f2ebaac9a7162ce266b prometheus-node-exporter_1.10.2-1_amd64.deb +prometheus-node-exporter-collectors 0.0~git20241119.a2b43e1-1build1 all 8325167690db390e8f338b17d376270dda318b328e04bdaad37b7d709ff66cd1 prometheus-node-exporter-collectors_0.0~git20241119.a2b43e1-1build1_all.deb +psmisc 23.7-2ubuntu2 amd64 a4a44a91506938bd8a3c0a75a92bd005423a9fdad5372107b53388b34fb58683 psmisc_23.7-2ubuntu2_amd64.deb +ptyxis 50.1-1ubuntu2 amd64 27d1b9970c45c1e10be0ef41b51073bdc6b54ba16f7a49a3b716e72a2d21eaa9 ptyxis_50.1-1ubuntu2_amd64.deb +python-apt-common 3.1.0ubuntu1.1 all e3637c6c0eeb83dc1de181d44f0bc27d8a5c3813bc9bff6c1ed181f1996a59bf python-apt-common_3.1.0ubuntu1.1_all.deb +python-babel-localedata 2.17.0-2 all 746f068262e81264d22cf78b06a86cabafc00fae650e379f8598bb395fcf61d0 python-babel-localedata_2.17.0-2_all.deb +python3 3.14.3-0ubuntu2 amd64 1ff88ad587f9e52e9f333ab00ae0babea93ac5222fc6909039c4190affe1d574 python3_3.14.3-0ubuntu2_amd64.deb +python3-apport 2.34.1-0ubuntu0.1 all 3f4febbe890796cb56256a00060187090f2a8a3bdf5359fedd0ea66e20e87da2 python3-apport_2.34.1-0ubuntu0.1_all.deb +python3-apt 3.1.0ubuntu1.1 amd64 e199afdd199b4bcee7eb37ceca32cc873cb847e8e36ba83df2d778ec6b9a0bf2 python3-apt_3.1.0ubuntu1.1_amd64.deb +python3-aptdaemon 2.0.2build1 all 40945b00aedd570f06bc3ee9a630703c68828d051aef494bd28b72f0935f2b1c python3-aptdaemon_2.0.2build1_all.deb +python3-aptdaemon.gtk3widgets 2.0.2build1 all 73cd309b596ea5242dae16e53504ec4a15e960d6f06cf109ccf7f4692d34d487 python3-aptdaemon.gtk3widgets_2.0.2build1_all.deb +python3-attr 25.4.0-1build1 all 1307217d4b0c7bc7e7edeb3f3102a42d0ceb281f9108132a393235b124c6de40 python3-attr_25.4.0-1build1_all.deb +python3-autocommand 2.2.2-4 all c8cfcc4d3e59e71b1ecfc36828e6e83dc824f3b641a15783afa368c3f98d1c49 python3-autocommand_2.2.2-4_all.deb +python3-babel 2.17.0-2 all ee9520dcbb3574627166ab9ecde1cff2ee66e70af42bd1a00580dd7457ce6239 python3-babel_2.17.0-2_all.deb +python3-bcrypt 5.0.0-3build1 amd64 27db1482adbaac3c8f56396096011761c121a34f6a3c54b700fd0c41f6f5ddf3 python3-bcrypt_5.0.0-3build1_amd64.deb +python3-blinker 1.9.0-2build1 all 1272e5991259cd08aa65fc35585d1748b251146b514bfc97a633fdf143dcf63a python3-blinker_1.9.0-2build1_all.deb +python3-brlapi 6.7-1ubuntu6 amd64 27e17d7d2e400b9d7ca47c20638b960fb956aa41fe79e086e0a43e8d04ab5e74 python3-brlapi_6.7-1ubuntu6_amd64.deb +python3-cairo 1.27.0-2build2 amd64 5b6d64aa6e760f53f5fa20e6ce4b5ffbe7a93cb86d0749b1a7a591b1dc961818 python3-cairo_1.27.0-2build2_amd64.deb +python3-certifi 2026.1.4+ds-1 all 4e84efd4e4b0f3f72b9ec4c8c2c21927e4e4bbf2af8b91aaa39235eaf2e3d3a8 python3-certifi_2026.1.4+ds-1_all.deb +python3-cffi-backend 2.0.0-3build1 amd64 2c826b9005866afc4ffc3e9cbb690ed8de56f01981d9b61f39dc21634170d5db python3-cffi-backend_2.0.0-3build1_amd64.deb +python3-chardet 5.2.0+dfsg-2build1 all ca6541b1e2b184f42be7cac8a3967537bb359c28a81bc73ff964a85f78177983 python3-chardet_5.2.0+dfsg-2build1_all.deb +python3-click 8.2.0+0.really.8.1.8-1build1 all 8ee0b7d16f7fcbc05e6e6ad28ee8d0251d76248eac64b0e9f775f61690fcac05 python3-click_8.2.0+0.really.8.1.8-1build1_all.deb +python3-configobj 5.0.9-1build1 all ec9cc28c7991c8309c99b9ba3efaef968bfb6e39f35937e00fe1e5ea65298c67 python3-configobj_5.0.9-1build1_all.deb +python3-cryptography 46.0.5-1ubuntu2 amd64 86f3c885ee9a8b3ba09357752e472a949cc31b3e443efa78a494b83bb3e11f77 python3-cryptography_46.0.5-1ubuntu2_amd64.deb +python3-cups 2.0.4-3build1 amd64 caa02488f8c6f8cb8965eb282fc8217cffbfe9794aa88a209e7e2c69b56a0048 python3-cups_2.0.4-3build1_amd64.deb +python3-cupshelpers 1.5.18-4ubuntu2 all d933777dfe9e3884ba4027059ce4ca62f8604dba9ff75ba52d9a7a17add0ec9f python3-cupshelpers_1.5.18-4ubuntu2_all.deb +python3-dasbus 1.7-2build1 all f23fe76bccef656219f5fa634cec2c14191420c32a6f8befd95b5703cae607c7 python3-dasbus_1.7-2build1_all.deb +python3-dbus 1.4.0-1build2 amd64 ce67cc0a2f375bf539b8eb5edaa6a64ed221806f5ea4d0255311be611424b27c python3-dbus_1.4.0-1build2_amd64.deb +python3-debconf 1.5.92 all 7f6b7e83ebfcc512295c151f8144b5df739e043601fe8abbb060261891a43cda python3-debconf_1.5.92_all.deb +python3-debian 1.0.1ubuntu2 all f15459b4c7165015b598b29fe9fa2c25a5a78007ecd7a6af5a7673062eeb3550 python3-debian_1.0.1ubuntu2_all.deb +python3-decorator 5.2.1-2 all 45cb8bbd3cf5f012caf2ae4fcd5c68bd3a32480bf1911d0bfaa26f075d3b61c0 python3-decorator_5.2.1-2_all.deb +python3-defer 1.0.6-2.1ubuntu2 all f0b2c37b1317a1c2c88dafb1570009f31cdbc2fb439e2ae97653446e9d4ee404 python3-defer_1.0.6-2.1ubuntu2_all.deb +python3-distro 1.9.0-1build1 all afb074d1d8118a6f414d2d667c6025838ea16529c2ccf9c675e79bdadcea48bf python3-distro_1.9.0-1build1_all.deb +python3-distro-info 1.15 all 62bb827d8602b9c7aacd25766098b3f75fbca2ef8bdfd7cbacec4db8957a80f5 python3-distro-info_1.15_all.deb +python3-distupgrade 1:26.04.23 all 2a74be7d4a914eb8c0833c0db92504291e976a58effc97c31d0a27caea6fbf1b python3-distupgrade_1%3a26.04.23_all.deb +python3-gi 3.56.2-1 amd64 dae2c57b518e9d77c00e41f83ee0f3f8de07732c1cc755f4ff1b6fb7bff59a10 python3-gi_3.56.2-1_amd64.deb +python3-httplib2 0.22.0-1ubuntu0.1 all 03af683aa5cf693e72c0dfc2be9ea323b1f16371d113349bcdffe12ee4799321 python3-httplib2_0.22.0-1ubuntu0.1_all.deb +python3-ibus-1.0 1.5.34~rc2-1 all 79dfc171d5754ea496b48068a9425212d57bd8842398e49846f24f4bad364314 python3-ibus-1.0_1.5.34~rc2-1_all.deb +python3-idna 3.11-1ubuntu0.1 all 3c212bce4961c5b8b3730fa6ebf98800848fe4fb5af1b56e477992ea1e03bcd1 python3-idna_3.11-1ubuntu0.1_all.deb +python3-inflect 7.5.0-1build1 all aa434e7c8255eb990cddd176118780337b484b585c26d3f83eeade715c2c6afc python3-inflect_7.5.0-1build1_all.deb +python3-jaraco.context 6.0.1-2 all 77a7a93f3ca98d7eb904dce96d3333c3b92afd0b17066c1c1a823f9fd1d41bad python3-jaraco.context_6.0.1-2_all.deb +python3-jaraco.functools 4.1.0-1build1 all f5ecd527fe2f3bee3313e458b8f3f46c6ed0fe1315192b6b6d9bf02eb47e31f3 python3-jaraco.functools_4.1.0-1build1_all.deb +python3-jaraco.text 4.0.0-1build1 all 87073055d11204e08b2382e517cb8cb8f28e1eb34e3409ca8c9786dd2f33b9ba python3-jaraco.text_4.0.0-1build1_all.deb +python3-jinja2 3.1.6-1build1 all 083e378d3d76dfc17b43b26b3663b3081f4ad468ff51f509213cf0fd5fe74048 python3-jinja2_3.1.6-1build1_all.deb +python3-json-pointer 2.4-4 all 8923fca5667f642b62eb3a6787ec92a4848ed224d8a27bc2781d73df428a99dd python3-json-pointer_2.4-4_all.deb +python3-jsonpatch 1.32-6 all 8bd4b12c72de7f2503fbff705ebc259512a26c478118dd66180572e40d054340 python3-jsonpatch_1.32-6_all.deb +python3-jsonschema 4.19.2-6ubuntu2 all b628c6c7ab5020ab78e563d9d7da51abdfdf0e3cca2cbcf2130b6785a7b9f7fe python3-jsonschema_4.19.2-6ubuntu2_all.deb +python3-jsonschema-specifications 2023.12.1-4 all bae21c1970c207a6435f5a2ddee4ee3cec3e7275c9eda3ca32f58eb81ae1524a python3-jsonschema-specifications_2023.12.1-4_all.deb +python3-jwt 2.10.1-4ubuntu1 all cbcb368eda304fd96eff92b2f86060ace798546ac9853c7dd5989b2eda9aff17 python3-jwt_2.10.1-4ubuntu1_all.deb +python3-launchpadlib 2.1.0-1build1 all 06e2e6e3b6c4197ce6b2dfcf8eea429aa93ff66c6d88af2fb96f0b9cd3e080af python3-launchpadlib_2.1.0-1build1_all.deb +python3-lazr.restfulclient 0.14.6-3build1 all dcb6ebf8fb40e44e14eadc0381e777acdbcca268167e1735c16a90d7f79243cb python3-lazr.restfulclient_0.14.6-3build1_all.deb +python3-lazr.uri 1.0.6-7build1 all 15bc56d33343538edaba3d695386096521c2d83c47ce68d4021cb29927830806 python3-lazr.uri_1.0.6-7build1_all.deb +python3-linkify-it 2.0.3-1ubuntu3 all 7f1d1593dad089a66f684da1a08cb1a85ba5bb8a272192d4d9573492da9b86e0 python3-linkify-it_2.0.3-1ubuntu3_all.deb +python3-louis 3.36.0-1 all bd27383bd95e85ea30d7c5d7e5d1c25dba8752eebd3549d94f2f2fc627edc269 python3-louis_3.36.0-1_all.deb +python3-markdown-it 3.0.0-3build1 all 4c1bcfe37221a20c98324f543aee6eb110f928232c32e16568c1ec5ee8ee66ef python3-markdown-it_3.0.0-3build1_all.deb +python3-markupsafe 3.0.3-1build1 amd64 3580a536b61dd32b468468f371e3dba1fe39d8cc27ba0eec66e3cafd069ba1ca python3-markupsafe_3.0.3-1build1_amd64.deb +python3-mdurl 0.1.2-1build1 all 3d22adc869c549e73aac71decc9aa196540fa3706c97b652ce940ebc876de7ac python3-mdurl_0.1.2-1build1_all.deb +python3-minimal 3.14.3-0ubuntu2 amd64 d5f37616b30209d8c10c4a705d7bf9558ca21e058fc2b2bd2ffcf37a74a42861 python3-minimal_3.14.3-0ubuntu2_amd64.deb +python3-more-itertools 10.8.0-1build1 all b73e8627d39af347eb3e5cab4cf3fc4e2bf0780f52b6f3e14b6eaf07174b0719 python3-more-itertools_10.8.0-1build1_all.deb +python3-netplan 1.2-1ubuntu5.1 amd64 724ce127da1578e45e54b0c9772e6059cb0320c5225e13cedd49f3dabdc5331f python3-netplan_1.2-1ubuntu5.1_amd64.deb +python3-oauthlib 3.3.1-1build1 all 55ecdecf703c95993ae9e31579bd8fe03ba3dee7648afdec31e88f457f506ab9 python3-oauthlib_3.3.1-1build1_all.deb +python3-olefile 0.47-1build1 all 0253e3bc965d6c622795f3cd241fd214170bc1a59a2077eb64b4fa63f77e510c python3-olefile_0.47-1build1_all.deb +python3-passlib 1.9.3-1ubuntu1 all aa9de2e4f8240e51d4c2ed301338caa6844363b1ac0ea15616db1d1e4fd70a76 python3-passlib_1.9.3-1ubuntu1_all.deb +python3-pexpect 4.9-4 all 882349bec3cdc45b8db110baadb4ab71152577cfa2714f45670f0c8026006588 python3-pexpect_4.9-4_all.deb +python3-pil 12.1.1-2ubuntu1.3 amd64 0e33c688dbe2842ed401b7bc7ef901fb1bc41c117825d50a06f5d88fcc4534f0 python3-pil_12.1.1-2ubuntu1.3_amd64.deb +python3-pkg-resources 78.1.1-0.1build1 all 766b8dbdb1c8eab99a03f8a3717038c874344e801d5aae99fb1f546f11a6d0a1 python3-pkg-resources_78.1.1-0.1build1_all.deb +python3-problem-report 2.34.1-0ubuntu0.1 all 54ac0d4bb7bbab4a460c1113437922d90fa3e47927d9fb675fd0f43ca2fbb814 python3-problem-report_2.34.1-0ubuntu0.1_all.deb +python3-prometheus-client 0.21.1+ds1-1build1 all 4719a6da616cd27b23a06dff86a3a6d2923e09a2c6bfa4b7af30c68e5810fe59 python3-prometheus-client_0.21.1+ds1-1build1_all.deb +python3-psutil 7.1.0-1ubuntu1 amd64 e32074ff3ab5dd5ba76fad23867ff73fbe11953a28614a11adea96e9721e1d16 python3-psutil_7.1.0-1ubuntu1_amd64.deb +python3-ptyprocess 0.7.0-6build1 all cb9e6bf2015a53e6512670d5a5b0b1597e7243d7a80cf4e795cccded51b48b2a python3-ptyprocess_0.7.0-6build1_all.deb +python3-pygments 2.19.2+dfsg-1 all 04752577e04f168907da62beb805286c5781febe089359030676d729bea7dd2e python3-pygments_2.19.2+dfsg-1_all.deb +python3-pyparsing 3.3.2-2 all 17a8fadfaf4fd4608e4559863de48aa7be64dfb6a7c48c7386337b92d2412e84 python3-pyparsing_3.3.2-2_all.deb +python3-referencing 0.36.2-1ubuntu2 all c3388fd31aa4c9c8c84baf62ada45b01ec33548e56c69707c98d95c7853582be python3-referencing_0.36.2-1ubuntu2_all.deb +python3-requests 2.32.5+dfsg-1ubuntu1 all 9c7aa89bdfa0a57289a59ad4a7f16465dca265d7c5601f680e33f5264db9c3d0 python3-requests_2.32.5+dfsg-1ubuntu1_all.deb +python3-rich 13.9.4-1.2 all 5bf416727be0d0f9120f3241502525e22f600a92fd7c5d6ccf1192a3afdf3d87 python3-rich_13.9.4-1.2_all.deb +python3-rpds-py 0.27.1-2ubuntu3 amd64 5ee2a2330885fb73754eaa3325873937877bf1a67a3b2e56d627a4ade3905be9 python3-rpds-py_0.27.1-2ubuntu3_amd64.deb +python3-serial 3.5-2build1 all 81def9a464776c50d88a270c709adb7b136195a62fcca4b962d3355c92c5097f python3-serial_3.5-2build1_all.deb +python3-setproctitle 1.3.7-2build1 amd64 43f3a83f9b804ba4b5508bccbbe30b7f9cbe6bf9ada8140ca8e37ad272d2f573 python3-setproctitle_1.3.7-2build1_amd64.deb +python3-setuptools 78.1.1-0.1build1 all 7dbe7963bacc589b5f3d48dbad14fb3815cf097b1173cde207c0d91268bc83cc python3-setuptools_78.1.1-0.1build1_all.deb +python3-software-properties 0.120.1 all 6660ceeaaeb22df70dc2895f3ce1708d03eb28af013e812b15f4b83f2de0b3e8 python3-software-properties_0.120.1_all.deb +python3-speechd 0.12.1-2ubuntu1 all c811605eeaafa03f8f5577cffa4f15a6bc26d01d95a6f44ca851a22f0eba8524 python3-speechd_0.12.1-2ubuntu1_all.deb +python3-sss 2.12.0-1ubuntu5.4 amd64 8020a5a8f769bd1516daa373cdd6c6786fe6abd8b935ae1d7c8914b9edca901d python3-sss_2.12.0-1ubuntu5.4_amd64.deb +python3-systemd 235-1build9 amd64 e42f6958ed288ccf13e8a91a3c4303d1c1a4a14a92a77473678e88adb58f85d7 python3-systemd_235-1build9_amd64.deb +python3-tk 3.14.3-0ubuntu2 amd64 8178789dc8142a23b3d91117b72d46faf26aec85585225034ceb86c7d9064905 python3-tk_3.14.3-0ubuntu2_amd64.deb +python3-typeguard 4.4.4-2 all e542a6394e75b2195df733a26dfd7e34621d696aab076649d60b7256b7574af3 python3-typeguard_4.4.4-2_all.deb +python3-typing-extensions 4.15.0-2 all a1698f372c57b8ff7960368db30ffd56828e172f64bf515799d75e4eb7691018 python3-typing-extensions_4.15.0-2_all.deb +python3-uc-micro 1.0.3-1build1 all 85f08cfc3417fe29a2334aa6bc85d39eb5a97aa6d076ddd6434aa51f16b24980 python3-uc-micro_1.0.3-1build1_all.deb +python3-update-manager 1:26.04.5 all c976d09006041316d01d44987005be753308852a0696220d39c88c90aac48db9 python3-update-manager_1%3a26.04.5_all.deb +python3-urllib3 2.6.3-1ubuntu1.1 all fb51c1a32334c96dc72df6768ffe8848ba7a3f22be271e822d384077b78817e5 python3-urllib3_2.6.3-1ubuntu1.1_all.deb +python3-wadllib 2.0.0-3 all 3ce47762fa78c9cfd36ab348bcf4ad6d63eaac821828d3ebc3fb214b41ba534d python3-wadllib_2.0.0-3_all.deb +python3-xdg 0.28-3 all 3398d0bb193d7ebedf907f43a008346722e0c6d2c3c138cb3dc17080be878e70 python3-xdg_0.28-3_all.deb +python3-xkit 0.5.0ubuntu8 all 0ddef9ad0812d3b30dc502c08688960f064b50ea1470c5107a11a76c6a22ee88 python3-xkit_0.5.0ubuntu8_all.deb +python3-yaml 6.0.3-1build1 amd64 77271ce1fc2470f8b6b436f40fe55dd014d307f582d552209cac756f7f1b1a25 python3-yaml_6.0.3-1build1_amd64.deb +python3-zipp 3.23.0-1build1 all 2a99b7c109d679a0347f620a52323fc0a2c32c281ed12cba2116370653ed802a python3-zipp_3.23.0-1build1_all.deb +python3.14 3.14.4-1ubuntu0.2 amd64 780c308c47d8afcbb7d339f0023350e7cf60c1a37e9572a1f88774cc18f60526 python3.14_3.14.4-1ubuntu0.2_amd64.deb +python3.14-minimal 3.14.4-1ubuntu0.2 amd64 0a7ea8a52834f9b3de0f11758924f80f7a6ebcbb4b02a55ba4f457503569f55f python3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb +python3.14-tk 3.14.4-1ubuntu0.2 amd64 7dbd69bdfebb4eb433ad7ea3429349f6ac86f5dab8fde65770e3aea4ec822a2e python3.14-tk_3.14.4-1ubuntu0.2_amd64.deb +readline-common 8.3-4 all 53cdc5a963bbdda938f8996496a5e78bcf484e6e41a2ef2c0f8cf566808f71f5 readline-common_8.3-4_all.deb +resources 1.10.2-0ubuntu3.1 amd64 f240bdfa5e81f521751951e093c85228618475e875383f38f81db0b4505d12d9 resources_1.10.2-0ubuntu3.1_amd64.deb +rfkill 2.41.3-3ubuntu2.2 amd64 90ae767c528c3d98c2598ab6d7dfc34217bbf83555bad3642c5e070397517679 rfkill_2.41.3-3ubuntu2.2_amd64.deb +rtkit 0.14-1 amd64 87025d92fff2cda675b6b97a3003f7a1405a1226c0ef066a5edb7579660238d0 rtkit_0.14-1_amd64.deb +rustdesk 1.4.9 amd64 7244ba47c40e804172044bfbe659467c54ce46554c98e78c8c0406f1d612fda3 rustdesk-1.4.9-x86_64.deb +rygel 45.0-1ubuntu1 amd64 c83e62815a97aac8b8818d56cb676d53ff6c21de975ffc07de02143e6aa2f06a rygel_45.0-1ubuntu1_amd64.deb +samba-libs 2:4.23.6+dfsg-1ubuntu2.2 amd64 b76c628d7198bcdbb06cdd562f0264bf9482b35f95593296e02b570a188f99e9 samba-libs_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb +sane-airscan 0.99.36-2ubuntu1 amd64 9468b214636c1289d9f462abe6ca270e49dc18af28b42e776cf12970b29b699d sane-airscan_0.99.36-2ubuntu1_amd64.deb +sane-utils 1.4.0-1ubuntu1 amd64 463d4c1cf4b3d40711b42b7c0151da612bf1d1629eb04f4fefad0d824f9e65a8 sane-utils_1.4.0-1ubuntu1_amd64.deb +sbsigntool 0.9.4-3.1ubuntu9 amd64 e8709091cc42e0053ef3736d03e7c4afcd1798424bbb04e41199e95ce2c3766e sbsigntool_0.9.4-3.1ubuntu9_amd64.deb +screen 4.9.1-3ubuntu2 amd64 768d0adef7c8b9f5a1e690333a7a07e9e58b67b4d85dca0ef4119d989a03b91e screen_4.9.1-3ubuntu2_amd64.deb +seahorse 47.0.1-3build1 amd64 5c50947a81a292c000d9aa2f711378b3a9278ac14e5e70a0c53237fda6dfc4a2 seahorse_47.0.1-3build1_amd64.deb +secureboot-db 1.9build2 amd64 e358f9d86ca91d71d44cc97ff63033547746657948e68721ce90c5c347d24390 secureboot-db_1.9build2_amd64.deb +sgml-base 1.31+nmu1build1 all 9ef16e373319feb10fa112eec5d906b302cd2c7b870af231f347d96d8db549e8 sgml-base_1.31+nmu1build1_all.deb +sgml-data 2.0.11+nmu1build1 all 27ed22901a5d7c0e9bc486eed538745b7e672f7d6efa20d75bc0280089200894 sgml-data_2.0.11+nmu1build1_all.deb +shared-mime-info 2.4-5build3 amd64 da2eb52074c56dc60f6e446166ad799baa9a53e619971debd033e99ed37f158f shared-mime-info_2.4-5build3_amd64.deb +smartmontools 7.5-2 amd64 ab211f171a9595f6b9686caaec44ca07a623c4605923caae756e2446e055e0ff smartmontools_7.5-2_amd64.deb +snapd 2.76.3+ubuntu26.04 amd64 1e3a926f32da79884ab05ee65363e8968cfcfe9df5839fd40da80f9f49756c97 snapd_2.76.3+ubuntu26.04_amd64.deb +software-properties-common 0.120.1 all 4eeb906a718dc3e708aa50821e35be1ec7d9584c33e88fc1fadb53bed9c1d7f2 software-properties-common_0.120.1_all.deb +sound-icons 0.1-8build1 all 8b9d5d8955b7ab82a4edc81fbecd6c0a7ade43ce1b6244e18ad1e4b2ecac62be sound-icons_0.1-8build1_all.deb +sound-theme-freedesktop 0.8-7build1 all 17eab7b1c0dad976da5873d98792af0df10b1e2c702404fc11ceb151053f3163 sound-theme-freedesktop_0.8-7build1_all.deb +speech-dispatcher 0.12.1-2ubuntu1 amd64 f8300fd793a251968e7e7d98b5adc7e8365ca320cb8bd39a465142ffa6b78785 speech-dispatcher_0.12.1-2ubuntu1_amd64.deb +speech-dispatcher-audio-plugins 0.12.1-2ubuntu1 amd64 f4a6125d8c9936e2619c8bbf0456b5623e09ea996cd2b940fda2473ee7eba520 speech-dispatcher-audio-plugins_0.12.1-2ubuntu1_amd64.deb +speech-dispatcher-espeak-ng 0.12.1-2ubuntu1 amd64 51e4e03ba24dad5becd5bbd93cb61d5895df30d43f27ea5482c9ad311125b46a speech-dispatcher-espeak-ng_0.12.1-2ubuntu1_amd64.deb +spice-vdagent 0.23.0-1ubuntu0.1 amd64 aef0367f5c63482814a912f7bdfc544cd877900a7353b22fc32dc90fe6e63af0 spice-vdagent_0.23.0-1ubuntu0.1_amd64.deb +squashfs-tools 1:4.7.5-1 amd64 3d4bf31f24105c4cc44da6b69ec130ed1784236059185f6d85bdd592c37a7bca squashfs-tools_1%3a4.7.5-1_amd64.deb +ssh-import-id 5.11-0ubuntu4 all 901e1f40654bf083c1eabb7b09baec0fcc3fe23bcc6cdc07f7af99015d254029 ssh-import-id_5.11-0ubuntu4_all.deb +ssl-cert 1.1.3ubuntu2 all 4c59f4b329dcf63b73af41a9e686c944c4b03a6da36a4f4d8a864a935495e61c ssl-cert_1.1.3ubuntu2_all.deb +sssd 2.12.0-1ubuntu5.4 amd64 d7ab2be5dd0978128e4d9f468bfa32ef46340ab89a26b102c52dbd9201365a5c sssd_2.12.0-1ubuntu5.4_amd64.deb +sssd-ad 2.12.0-1ubuntu5.4 amd64 b2e0c77a820221659e4168c9230460266ad42932e76044fa8f970a7627ececfd sssd-ad_2.12.0-1ubuntu5.4_amd64.deb +sssd-ad-common 2.12.0-1ubuntu5.4 amd64 498bfac27403518a91aea7a1cb629d35559c82116eebb5709d0f9771154a6f18 sssd-ad-common_2.12.0-1ubuntu5.4_amd64.deb +sssd-common 2.12.0-1ubuntu5.4 amd64 3b2a046b8fb2fde70f68cfb484544b78e260ec74a1f12e721b287dec59bf2096 sssd-common_2.12.0-1ubuntu5.4_amd64.deb +sssd-ipa 2.12.0-1ubuntu5.4 amd64 116181ce0f43e363b77f6ac4a8c6432cdb3415139449b10a79a614c54ec71d0d sssd-ipa_2.12.0-1ubuntu5.4_amd64.deb +sssd-krb5 2.12.0-1ubuntu5.4 amd64 000596df2b1c64496d2f69facad09bc791236f653f6cb306e786b859f17ca1f8 sssd-krb5_2.12.0-1ubuntu5.4_amd64.deb +sssd-krb5-common 2.12.0-1ubuntu5.4 amd64 bf510ceabec0f137fc12324b681b864d102732fd14ac65a73ef10f01c5f2c125 sssd-krb5-common_2.12.0-1ubuntu5.4_amd64.deb +sssd-ldap 2.12.0-1ubuntu5.4 amd64 dc859f033537ff462b983bfea5ca27d0eea9f191d4fdb5db81b1dcadf5c398cc sssd-ldap_2.12.0-1ubuntu5.4_amd64.deb +sssd-proxy 2.12.0-1ubuntu5.4 amd64 2e9bd733a21cdc21383afaa529824600f4f5ff04f47c5675ca8fa2beef7348ed sssd-proxy_2.12.0-1ubuntu5.4_amd64.deb +switcheroo-control 3.0-2 amd64 7ec5e18c8b933a32db8a8f74749f42b9afec36bbbfaa8f00512dc15c09284647 switcheroo-control_3.0-2_amd64.deb +sysprof 50.0-1 amd64 cf540d381dd24719c1107640dfce53c10cb9292607634028734a2d924f69ac56 sysprof_50.0-1_amd64.deb +system-config-printer-common 1.5.18-4ubuntu2 all 2214c686d038a0e444e869f08f112571673f78c115d07c5133e530886b220e24 system-config-printer-common_1.5.18-4ubuntu2_all.deb +system-config-printer-udev 1.5.18-4ubuntu2 amd64 6214416b12a740564317736bb2e011cc10555a019b11821afcf1d5b1dffefd17 system-config-printer-udev_1.5.18-4ubuntu2_amd64.deb +systemd 259.5-0ubuntu3.4 amd64 1b2eca56c5cfdbc1aca78591a68f94b7e1c996abd52095587069776b816b9dca systemd_259.5-0ubuntu3.4_amd64.deb +systemd-cryptsetup 259.5-0ubuntu3.4 amd64 1e276f5437760fa5720b878b6af373e0692412671537dd8ba31e30208aff3ab8 systemd-cryptsetup_259.5-0ubuntu3.4_amd64.deb +systemd-hwe-hwdb 259.5.3ubuntu all d51cf1f5ac54db201f097770dbb7f1523c210b292a8c1d6432ce9f4b9c2a1950 systemd-hwe-hwdb_259.5.3ubuntu_all.deb +systemd-oomd 259.5-0ubuntu3.4 amd64 40553c30101bd43ce53c8e6b66d2880b18a1e1a8acecca4846238ed7150f0ca8 systemd-oomd_259.5-0ubuntu3.4_amd64.deb +systemd-resolved 259.5-0ubuntu3.4 amd64 99f133977b1d262c8344cd88acb10eaaa091e95370693aee162560476760cb9e systemd-resolved_259.5-0ubuntu3.4_amd64.deb +systemd-sysv 259.5-0ubuntu3.4 amd64 2c76e690808c26fbc3bdbfe47d760ba50e7dcb0a821eded3d00412117ae0516e systemd-sysv_259.5-0ubuntu3.4_amd64.deb +systemd-timesyncd 259.5-0ubuntu3.4 amd64 ba2ba9b29cfa5d854e822dd793d1258c58f3f5a384c8ba2c4ccf9556fdb0cee4 systemd-timesyncd_259.5-0ubuntu3.4_amd64.deb +tcl 8.6.16build1 amd64 c5079db96e5422efe2430f65c18cb71decc5cdd83d541bacd4961f00ad8ba3d9 tcl_8.6.16build1_amd64.deb +tcl8.6 8.6.17+dfsg-1build1 amd64 d934d87e4aa94d72c9034785bdb77a8d0c65de8bfcaea3082246ac854c59359a tcl8.6_8.6.17+dfsg-1build1_amd64.deb +tecla 49.0-2 amd64 74da21fe0e704c1c3f3f126adf2f51c03612afff56bcd5f64bc5f678a8325a02 tecla_49.0-2_amd64.deb +tinysparql 3.11.0-1 amd64 19b2cf9435ce158226fad6f9a8ec9f7fcb27f2a720f6dfc59e9381755a02fea7 tinysparql_3.11.0-1_amd64.deb +tpm-udev 4.1.3-6 all 39ff45ec97f71566f8a258aea43121bfa64819a976816e3377e4579c632cdd16 tpm-udev_4.1.3-6_all.deb +tzdata 2026c-0ubuntu0.26.04.1 all d1b10c964c53344b2b99d093bd437391460eec9a872961c2beb256d64a8c5bbf tzdata_2026c-0ubuntu0.26.04.1_all.deb +ubuntu-advantage-desktop-daemon 1.13build1 amd64 e1296d91ea57d987c178c85d348bbb8cc5b417016a9a2c0c2f909e487af77659 ubuntu-advantage-desktop-daemon_1.13build1_amd64.deb +ubuntu-desktop-minimal 1.570.3 amd64 fba2c0b58d1a82f7137368166c61c8b77ffdf14c6d4a94184f76c84860bece46 ubuntu-desktop-minimal_1.570.3_amd64.deb +ubuntu-docs 26.04.1 all 763f4cc37ca81a034d73ce4ba1649ea6f0f70ef4c36ac9cecd1a50dea2d15454 ubuntu-docs_26.04.1_all.deb +ubuntu-drivers-common 1:0.10.9 amd64 f9ebd255473f18f1172cf5fe04ed91a899cef0be8ba4a09e9b7d8d36dbc3c9e6 ubuntu-drivers-common_1%3a0.10.9_amd64.deb +ubuntu-insights 0.9.3ubuntu amd64 9930fd641b97dfac1acae039788c34dbd7cb09b2cfc3b2e29f93f69cbfbf1b57 ubuntu-insights_0.9.3ubuntu_amd64.deb +ubuntu-pro-client 37.2ubuntu0.1 amd64 e494e7aa2973c94baf44f066a78dbe382f4efe56af8ae61e7c7b4dcbf0f9c603 ubuntu-pro-client_37.2ubuntu0.1_amd64.deb +ubuntu-pro-client-l10n 37.2ubuntu0.1 amd64 c3e8c92c3be76d4d0935f89fa02819b56c30f986be6e2a09b477b96e2bcec8a1 ubuntu-pro-client-l10n_37.2ubuntu0.1_amd64.deb +ubuntu-release-upgrader-core 1:26.04.23 all b99d3e734ce409d6bfca619fc72c48f1b3959fd1699aa54f5e4ce074a32e652a ubuntu-release-upgrader-core_1%3a26.04.23_all.deb +ubuntu-release-upgrader-gtk 1:26.04.23 all 08c232cdff46f5733e8b9a403b7b8f12f9df44830ed6b220d7e376cce0655f1a ubuntu-release-upgrader-gtk_1%3a26.04.23_all.deb +ubuntu-report 1.7.3ubuntu4 amd64 c1f2ab8fb24f4fb4279895f971cb45a2843b3fe719a8f53fa139433a7f70340f ubuntu-report_1.7.3ubuntu4_amd64.deb +ubuntu-session 50.1-0ubuntu0.1 all 3ff88b755bb2dd2d9944c6a5613adc840444db166057a0880b803a0d76203c96 ubuntu-session_50.1-0ubuntu0.1_all.deb +ubuntu-settings 26.04.6 all c7f84378b9b7ec3bbb4ba6e1b1d6b3829bc6861ac64d35fb2b715dc8e8397adb ubuntu-settings_26.04.6_all.deb +ubuntu-wallpapers 26.04.2 all d7f7acea3bb3dcd547a4be8aa5515b63c9e2a66e110d7a52ea98323f9c14b68e ubuntu-wallpapers_26.04.2_all.deb +ubuntu-wallpapers-resolute 26.04.2 all f0af7ff4a3fd5bc3b63885bfa14ed9c3ba320dc9a4fa948f9c506b715a59df88 ubuntu-wallpapers-resolute_26.04.2_all.deb +ucf 3.0052ubuntu1 all 42354d322fda598511b62288123e8b4b6daf6b7bbb268d68e8e7f88efa498305 ucf_3.0052ubuntu1_all.deb +udev 259.5-0ubuntu3.4 amd64 b4de0a05d8cd58e5de0ebb7a5c73784dda6a61df2fe5129affa7e4a5aef282ad udev_259.5-0ubuntu3.4_amd64.deb +udisks2 2.10.91-1ubuntu2.1 amd64 c78dcfa3503993bccf0dbf401e90483e57c42f72d29ca1e4743b006626169ac4 udisks2_2.10.91-1ubuntu2.1_amd64.deb +ufw 0.36.2-9build1 all 3ece5b2e7a678f5be9678643dc5f8f8457becceec32e863ad1ada1a33e2160b4 ufw_0.36.2-9build1_all.deb +unattended-upgrades 2.12ubuntu9 all 129682f0176cbeabba735f550cb64bdfbcd9c99f4d2377c247f8235ccfe0b4af unattended-upgrades_2.12ubuntu9_all.deb +unzip 6.0-29ubuntu1 amd64 1f6f2bdcde84641e89c9367a7a99d90e990efa3e487a8d625241c2f9c55db5f4 unzip_6.0-29ubuntu1_amd64.deb +update-inetd 4.54build1 all 1185e6269f6976177e9e1f42a3adc6d8b34ddeaed5b512e06bade8336f8b3c77 update-inetd_4.54build1_all.deb +update-manager 1:26.04.5 all abab86378fd38e086791c47fd0de4eee5fb27aa08fb5d5b195561306d276a199 update-manager_1%3a26.04.5_all.deb +update-manager-core 1:26.04.5 all 8113cd178a707fdd6a10b41c624f868760806c74a55b6d2058a1962e7f6b21ad update-manager-core_1%3a26.04.5_all.deb +update-notifier 3.207.2 amd64 8d40ec225bdb8eceee40b73e796cb2d5f599e3e1710391b2ea4df6894b14dbec update-notifier_3.207.2_amd64.deb +update-notifier-common 3.207.2 all 26628c4c2ad0da034ebf029e9684940e4dbee00f74ed2a0518183a0d2a54c0c9 update-notifier-common_3.207.2_all.deb +upower 1.91.1-1 amd64 53e1a42d63b592355ebaf1566de37d1c7358e1065aaef8030015cb28ebbe9b81 upower_1.91.1-1_amd64.deb +usb-modeswitch 2.6.2-1ubuntu1 amd64 a6a8aead77c0524f1921220bc6b31a435ab80d554978209423383a770f315a3c usb-modeswitch_2.6.2-1ubuntu1_amd64.deb +usb-modeswitch-data 20191128-7build1 all e7e454c369ca3d26de6f2911fa6f49e932ff47bf5563b45c50aadc72f45872ce usb-modeswitch-data_20191128-7build1_all.deb +usb.ids 2025.12.13-1 all 3a5151b50b822e93a6636301b300b6d41ff57489f2c499f8f80ca30515bf010f usb.ids_2025.12.13-1_all.deb +usbmuxd 1.1.1-7 amd64 d0806534674c53d33f28a7cf01e1ef3e0b81d777c0e8cfe494942cd3b8b47b60 usbmuxd_1.1.1-7_amd64.deb +usbutils 1:019-1 amd64 2c5e1d731be948d1dba9e63ba04ba7b95394e43dad3ecd58738ec0cb8192b284 usbutils_1%3a019-1_amd64.deb +user-session-migration 0.5.1 amd64 29e293be756b80aba747d775473b342aeb2686191b90465ebff8187f9d665ff4 user-session-migration_0.5.1_amd64.deb +uuid-runtime 2.41.3-3ubuntu2.2 amd64 4badc1132e60f937c7c08024f8f70022a30a72b64c8fe7e8d35c3e85391a69ff uuid-runtime_2.41.3-3ubuntu2.2_amd64.deb +wamerican 2020.12.07-4build1 all 69cb601ca0aa3a0750026a81d97b591431047a3823d785a5cc972235ecee69cc wamerican_2020.12.07-4build1_all.deb +webp-pixbuf-loader 0.2.7-3 amd64 4d4c3d5d023aa157767c271172332f4e305cbc6dc8ba1506490784aa96f134b8 webp-pixbuf-loader_0.2.7-3_amd64.deb +wget 1.25.0-2ubuntu4.4 amd64 47f9cd72f1cf79865a128d101fbfb0fbf0db8606db318735078afab9af66be3b wget_1.25.0-2ubuntu4.4_amd64.deb +whoopsie 0.2.82ubuntu amd64 76399e507fde65ef34791939f5d154be72948dbc374d0e424c7850d92330cdc8 whoopsie_0.2.82ubuntu_amd64.deb +whoopsie-preferences 23build4 amd64 dfe4b806b28ea42d90b99bf2b12f02d33e26078f0c2b86d6a72a1263af8c265b whoopsie-preferences_23build4_amd64.deb +wireguard-tools 1.0.20250521-1ubuntu1 amd64 e948f176ea0324252b7f07327becd1d5df14290ef4fafa392a9d41e96b0459c8 wireguard-tools_1.0.20250521-1ubuntu1_amd64.deb +wireless-regdb 2026.05.30-0ubuntu1~26.04.1 all 09eb267396235ac61a902eca2631b4c16ee1436b853ecd271c5d0673dfe640be wireless-regdb_2026.05.30-0ubuntu1~26.04.1_all.deb +wireplumber 0.5.13-1ubuntu1 amd64 8f7109279a58c132abc3656f8bd597de5c23bb622b4d9bb4f6fe6aec1a4e34dd wireplumber_0.5.13-1ubuntu1_amd64.deb +wpasupplicant 2:2.11-0ubuntu5 amd64 c64c5f1c9cb333cd766abdc4e8732404c65787f34228e841b6447376a3887a90 wpasupplicant_2%3a2.11-0ubuntu5_amd64.deb +wsdd 2:0.8-5ubuntu1 all 9ef0c538ddcf878bfcb6f69a2c91c5984ed9370245bbf1f4432399667fcf833f wsdd_2%3a0.8-5ubuntu1_all.deb +x11-apps 7.7+11build4 amd64 f22231c5b84e61bf571bce721d91845ca2b3b92212d72aba0ba5aeac09d57422 x11-apps_7.7+11build4_amd64.deb +x11-common 1:7.7+26ubuntu1 all 60b7a5982b477e10b9f11e2278289135f79e9dc75a312575778b21a0a631bea5 x11-common_1%3a7.7+26ubuntu1_all.deb +x11-session-utils 7.7+6build3 amd64 d7a87ca7049e25a984ceaef1bba526ce33e6df1930224423ec7479d9e25c054e x11-session-utils_7.7+6build3_amd64.deb +x11-utils 7.7+7build1 amd64 3a0c0837b22aaa643a2e1d6eb509c0e3e2732b16c5eecd1b18d0885aaa17f973 x11-utils_7.7+7build1_amd64.deb +x11-xkb-utils 7.7+9build1 amd64 f17d61317a9f0db99db7a2c7b81d462a35008c85089fb573d2175ed504f6157b x11-xkb-utils_7.7+9build1_amd64.deb +x11-xserver-utils 7.7+11build1 amd64 5963dd34415a4b6e590c2cf4ce71c85dced09bce9fa58b8e4de88eb63fa7b2d1 x11-xserver-utils_7.7+11build1_amd64.deb +xauth 1:1.1.2-1.1build1 amd64 14c923bfbd465033fa755f3ec812c3482971982a7a5f466a042be1276dde50aa xauth_1%3a1.1.2-1.1build1_amd64.deb +xbitmaps 1.1.1-2.2build1 all 672d1aa56dcb8aedb9baa2e5d35b68a0eaf70763d4bd890020d0dd0c6497be42 xbitmaps_1.1.1-2.2build1_all.deb +xbrlapi 6.7-1ubuntu6 amd64 36f0641e59e630ece728fab537efae5d50f6c8f55b79ddacbe957fcf961426db xbrlapi_6.7-1ubuntu6_amd64.deb +xcursor-themes 1.0.6-0ubuntu2 all 2a68cc61f0f24922c3cf727d03f76d30db7723f68c6d3616732043306016bf2d xcursor-themes_1.0.6-0ubuntu2_all.deb +xcvt 0.1.3-1build1 amd64 a3114a86fdaf7fda89e941163e278f029187511175be19229175f95f8ee8ddf1 xcvt_0.1.3-1build1_amd64.deb +xdg-dbus-proxy 0.1.7-1 amd64 d8643ee790c1b36fa3f98c239edad013b59755539358138a64fc77ac5669ca39 xdg-dbus-proxy_0.1.7-1_amd64.deb +xdg-desktop-portal 1.21.1+ds-1ubuntu3 amd64 f43095459e2c9c8dad23686b8699c452510217f79b2c76c914028c89521d7b53 xdg-desktop-portal_1.21.1+ds-1ubuntu3_amd64.deb +xdg-desktop-portal-gnome 50.0-0ubuntu1 amd64 f6aa16fe441072706f91470e8d3362a75b44acf387ebedb4660478316e6ed9aa xdg-desktop-portal-gnome_50.0-0ubuntu1_amd64.deb +xdg-desktop-portal-gtk 1.15.3-2ubuntu1 amd64 9b923cd46711ba3369ad07d99e71e1668e7a9ceef60475b0ac40c89bc083c6a4 xdg-desktop-portal-gtk_1.15.3-2ubuntu1_amd64.deb +xdg-terminal-exec 0.14.0-1ubuntu0.1 all 4973e24dedb9508a1eecd025b764f9b04cb1753105dcc6703930b85906289866 xdg-terminal-exec_0.14.0-1ubuntu0.1_all.deb +xdg-user-dirs 0.19-1 amd64 6a582b915086aeb27a8ba6c4585fd9a350e1098b218c22447ccd5cc9a222b09b xdg-user-dirs_0.19-1_amd64.deb +xdg-user-dirs-gtk 0.16-1 amd64 756647a58231a45b2d4112c00272ec079d66f58ce775990113c71df05f74d079 xdg-user-dirs-gtk_0.16-1_amd64.deb +xdg-utils 1.2.1-2ubuntu2 all ab0236062d2552e8c67763d9514e751900b0d64cf86c5df6e20f67cb2bd4789e xdg-utils_1.2.1-2ubuntu2_all.deb +xfonts-base 1:1.0.5+nmu1build1 all eec889b51e1c8f8485015e3d0b18892656436cc41906d8bdb6f89a88e2c41375 xfonts-base_1%3a1.0.5+nmu1build1_all.deb +xfonts-encodings 1:1.0.5-0ubuntu3 all 1d0610635e1fe757c8df0ec2c2cef511203c7e7bf81bbff332031c8bf87b1847 xfonts-encodings_1%3a1.0.5-0ubuntu3_all.deb +xfonts-scalable 1:1.0.3-1.3build1 all da5b0c9b9044f35517855bb655dbe3ad45a20ad4daff08f478c524ab81587844 xfonts-scalable_1%3a1.0.3-1.3build1_all.deb +xfonts-utils 1:7.7+7build1 amd64 97e8c7ce05e09ea5b766c99f4d77e20cb70db61396c2e83bb43715c6e2f0ac1e xfonts-utils_1%3a7.7+7build1_amd64.deb +xinit 1.4.2-1build1 amd64 197b713ce497a06388dd52f01906a0f51baed770df0e36314f76bed11e343f9b xinit_1.4.2-1build1_amd64.deb +xinput 1.6.4-1build2 amd64 ac7510aceeef862279f4147afb00bc96f38183af488254aab2e12e502711d029 xinput_1.6.4-1build2_amd64.deb +xkb-data 2.46-2 all a24f82b33020836444593a7ffbed959458852e28cfe16de2ff95bcbdcfbdb2d3 xkb-data_2.46-2_all.deb +xml-core 0.19build1 all 402af4ddb2810ea931609fcfedce54fe9cdfdc95e4b33c48349df8f97fe4b6cb xml-core_0.19build1_all.deb +xorg 1:7.7+26ubuntu1 amd64 234a602609d352a8dd25c048a4f4dcbbf49452283328cf3f07927394dff478ec xorg_1%3a7.7+26ubuntu1_amd64.deb +xorg-docs-core 1:1.7.3-1 all def68bc547a21de8d5dee36ccfba135b567528ec1ce6ac9d470766919276ac7a xorg-docs-core_1%3a1.7.3-1_all.deb +xorgxrdp 1:0.10.2-1build1 amd64 137792c2204e44fcea1c80742d3804af098236677c6b586fff6c938894f289d4 xorgxrdp_1%3a0.10.2-1build1_amd64.deb +xrdp 0.10.1-4.1 amd64 c4b3688b0d839369f0b3c8faa4940597c5aa51d1573ab1d4ce63ccb53add82be xrdp_0.10.1-4.1_amd64.deb +xserver-common 2:21.1.22-1ubuntu1 all 9865ebf6555ba9d7fae0bd3b1e66610e3404aa66495cb00bdd1f1d162cc14483 xserver-common_2%3a21.1.22-1ubuntu1_all.deb +xserver-xorg 1:7.7+26ubuntu1 amd64 7f7b902f1560e4e71e24de1d80c39ed7f97558a5f805cd8b7c456f53470d2d9c xserver-xorg_1%3a7.7+26ubuntu1_amd64.deb +xserver-xorg-core 2:21.1.22-1ubuntu1 amd64 d57a180707a4ef7ced547e2fd7c254c05212d389a5a31566fb67f2dd576f2a5c xserver-xorg-core_2%3a21.1.22-1ubuntu1_amd64.deb +xserver-xorg-legacy 2:21.1.22-1ubuntu1 amd64 9d2e314e8e4dfb847f4939db10fed5bc160e18a3352fe0fc4f4491a6b9aca0de xserver-xorg-legacy_2%3a21.1.22-1ubuntu1_amd64.deb +xserver-xorg-video-all 1:7.7+26ubuntu1 amd64 157ee5784159b544379f2e4b4b7caed7baf520dc990777c7d975e69606f6be77 xserver-xorg-video-all_1%3a7.7+26ubuntu1_amd64.deb +xserver-xorg-video-amdgpu 25.0.0-1 amd64 2ad02b29948e6611e6a0a68952a0d94fdc9687ca7f5fe125e17fc3cc11b7bc6a xserver-xorg-video-amdgpu_25.0.0-1_amd64.deb +xserver-xorg-video-ati 1:22.0.0-1build2 amd64 7123a3774e26ec2d312eeccc49502b32cf8d9081265537e47deea857db754074 xserver-xorg-video-ati_1%3a22.0.0-1build2_amd64.deb +xserver-xorg-video-fbdev 1:0.5.0-2build3 amd64 cec820e983f2b710779c8d7369fd97dff3454b535b0b7187d15f414a767098aa xserver-xorg-video-fbdev_1%3a0.5.0-2build3_amd64.deb +xserver-xorg-video-intel 2:2.99.917+git20210115-1build2 amd64 b71fbe896f54be1ea4bc9e0a1ba7e87d62d5cd71e1605de96997281b0404f430 xserver-xorg-video-intel_2%3a2.99.917+git20210115-1build2_amd64.deb +xserver-xorg-video-nouveau 1:1.0.18-1build1 amd64 e16df74aa85092ba17fbcfc307bbe0fab1c20f134b8a116bb3b2108801c6c31b xserver-xorg-video-nouveau_1%3a1.0.18-1build1_amd64.deb +xserver-xorg-video-qxl 0.1.6-1.1build1 amd64 af1a270dbac53f44598d43fa2303c82f55daa71b1c7a8078ecf2b13311ab8137 xserver-xorg-video-qxl_0.1.6-1.1build1_amd64.deb +xserver-xorg-video-radeon 1:22.0.0-1build2 amd64 93969e5b643555c5b19fe64a1f0611adbcb178353013bef75cdb47b945045005 xserver-xorg-video-radeon_1%3a22.0.0-1build2_amd64.deb +xserver-xorg-video-vesa 1:2.6.0-2build1 amd64 fe02831a5f755ebb54237d2a1f9d6b54465541ac987a35a44fa167e4b489e1ae xserver-xorg-video-vesa_1%3a2.6.0-2build1_amd64.deb +xwayland 2:24.1.10-1 amd64 f620802e59cb10a4d66e0ed2abf16ad425be1ab2b7a3deef1c2b367647c2c7a5 xwayland_2%3a24.1.10-1_amd64.deb +xz-utils 5.8.3-1 amd64 5a8cddf80d9f5aeee1f39315158cfcc0f3e2c7573f9d6236fc6b85537400a937 xz-utils_5.8.3-1_amd64.deb +yaru-theme-gnome-shell 26.04.5.1ubuntu all 55131b0a1fd8408cbd6bf24fc27bce8e33071cc4894c215b87e5c3f16c06f4b8 yaru-theme-gnome-shell_26.04.5.1ubuntu_all.deb +yaru-theme-gtk 26.04.5.1ubuntu all e66576554ab66d6c6bcd3a86ce1ab9347c861907f81fd89df927bd1c326a7225 yaru-theme-gtk_26.04.5.1ubuntu_all.deb +yaru-theme-icon 26.04.5.1ubuntu all d0269daa895d85a72948995497a0848ab3bd6138df59b52c21a814ccf4c7b0a6 yaru-theme-icon_26.04.5.1ubuntu_all.deb +yaru-theme-sound 26.04.5.1ubuntu all c322b7f3694822900080ab363731b698002a674dc24d8175da1b19c9b478b47c yaru-theme-sound_26.04.5.1ubuntu_all.deb +yelp 49.0-5ubuntu0.1 amd64 f22123289c4b604027300c161f246058f27cdfcd5dc3565201d8e5c683499749 yelp_49.0-5ubuntu0.1_amd64.deb +yelp-xsl 49.0-2 all 8d0f46b49a0b2a8e947a02f62bd1691efac33796690b7afef2f2559d29941275 yelp-xsl_49.0-2_all.deb +zenity 4.2.1-1 amd64 e292234fe2a5075364d93dad9cdaf12c9499f5b088d08b09cf62f8da8cf908c5 zenity_4.2.1-1_amd64.deb +zenity-common 4.2.1-1 all 92701ab2028632c635c1757b3980ea9cf6d6110d7d84bd527e5e6a29b5e6009d zenity-common_4.2.1-1_all.deb +zip 3.0-15ubuntu3 amd64 ef8e6376ecdaa82f4f7fbd1f6fb8cbf7818a1305c8e7b015c1aa9f4bdc77d12a zip_3.0-15ubuntu3_amd64.deb +zstd 1.5.7+dfsg-3 amd64 032bf3699c23d653caeadf1d97521af9cc09401035164637e64ad79997947d6a zstd_1.5.7+dfsg-3_amd64.deb + + + +e608222b648a07f0223e0dde07b62f3e67e52620de5ee7ab786fc23093fe7cac Packages +9253dabe3c6e547176acebec84512024b392f55f5f556fb8b523f7553e8341c0 Packages.gz +d2846fefb7961ebed6a8156fa6a4c1abcc6b5d5aa4f9ba4afad01915b50a905d packages.lock.tsv + + + +# Blueforce Field OS - SBOM / package lock schema for the offline APT bundle +# +# build-offline-repo.sh writes this layout into a built bundle as: +# /packages.lock.tsv +# scripts/install/blueforce-install.sh validates that file before any package +# module runs: it must exist, be non-empty, carry the header on the FIRST line +# byte for byte, and every row must hold a package, a version, an architecture, +# a 64-character lower-case sha256, and the pool file name of the .deb. +# +# Columns (TAB-separated, exactly five, header first): +# package lower-case Debian package name ^[a-z0-9][a-z0-9+.-]*$ +# version exact Debian version, epochs allowed +# architecture binary architecture e.g. amd64, all +# sha256 sha256sum of the .deb, 64 lower-case hex characters +# source file name of the .deb inside /pool/ +# +# LAB fill procedure: +# 1. review the .deb files and place them in one local pool directory +# 2. fill every UNPINNED version in manifests/*.txt from those .deb files +# 3. ./build-offline-repo.sh --packages /secure/reviewed-debs --output /srv/blueforce-apt +# 4. the released packages.lock.tsv is the build output; never hand-edit a +# released lock, and never hand-write a sha256 - the build recomputes it +# +# This template is documentation, not a bundle artifact: the header sits below the +# comments so the file can never be mistaken for a released packages.lock.tsv. +# +# ==== EXAMPLE ROWS - format illustration only, never a released artifact ==== +# <64 hex characters> __.deb +package version architecture sha256 source + + + +schema_version: 1 +release: + name: blueforce-provisioning-skeleton + version: 0.1.0 + status: skeleton +artifacts: [] +notes: + - No final ISO is produced by this repository without explicit local input and LAB approval. + - Device identity and secrets must not be included in release artifacts. + + + +# Release metadata + +`manifest.yaml` iskelet sürüm sözleşmesidir. Gerçek ISO üretimi `iso/build-blueforce-iso.sh` tarafından ayrıca bir `release-manifest.yaml` ve `SHA256SUMS` dosyasıyla kayıt altına alınır. + +Yayın girdileri açıkça verilmelidir: doğrulanmış upstream ISO, onun SHA256 kaydı ve gözden geçirilmiş yerel içerikler. Bu repo paket veya ISO indirmez. `status: skeleton` olan bu dosya dağıtım onayı değildir. + + + +# Blueforce OS provisioning + +Bu dizin işletim sistemi provisioning kapsamının sahibidir. Mevcut `scripts/install/` uygulama bootstrap'ı olarak kalır ve burada taşınmaz. + +Güvenlik sınırları: + +- Bu iskelet cihaz kimliği, parola, private key, token veya bayiye özel veri içermez. +- Autoinstall V1 disk seçmez ve silmez; `interactive-sections: [storage]` teknisyen seçimini zorunlu tutar. +- Upstream ISO ve paketler örtük indirilmez. Her ISO işleminden önce açık SHA256 doğrulaması gerekir. +- Remaster araçları `xorriso` yoksa veya boot metadatası desteklenmiyorsa başarısız olur. +- Firstboot sadece sekiz haneli bayi numarası biçimini denetler; kurucu veya enrollment çağrısı yapmaz. + +Kontrol: + +```bash +tests/check-provisioning-static.sh +``` + +LAB doğrulaması, hedef Ubuntu sürümü, boot menüsü entegrasyonu, gerçek identity storage ve enrollment taşıma güvenliği sonraki fazların açık işleridir. + + @@ -9177,10 +58431,3199 @@ Elendikleri için değil, free-limitleri olmadığı için not düşüldü; seç
    + +# RustDesk self-hosted server (hbbs + hbbr) on the central VDS. +# OSS edition (AGPL-3.0), unlimited clients, no license cost. +# Docs: https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ +# +# Port contract (VDS firewall must allow these from field-device internet): +# 21115/TCP hbbs NAT-type test +# 21116/TCP hbbs ID registration / heartbeat +# 21116/UDP hbbs TCP hole punching +# 21117/TCP hbbr relay traffic +# Optional, keep CLOSED unless the web client is used: +# 21118/TCP hbbs web client support +# 21119/TCP hbbr web client support +# Pro-only (not used here): +# 21114/TCP Pro web console +# +# network_mode: host is REQUIRED so hbbs/hbbr see the real client source +# IPs (rendezvous + relay decisions break behind Docker NAT). + +services: + hbbs: + image: rustdesk/rustdesk-server:1.1.16 + container_name: bf-hbbs + network_mode: host + restart: unless-stopped + volumes: + - ./data:/root + command: hbbs + + hbbr: + image: rustdesk/rustdesk-server:1.1.16 + container_name: bf-hbbr + network_mode: host + restart: unless-stopped + volumes: + - ./data:/root + command: hbbr + + + +# RustDesk Self-Hosted Server (hbbs + hbbr) + +OSS rendezvous + relay server for the Blueforce fleet. Field clients reach +the VDS public address directly over the internet, independent of WireGuard: +if the tunnel drops, this channel stays up (requires field internet + VDS up). + +## Prerequisites + +- A central VDS with a public DNS name (example: `rustdesk.example.com`). + Use your real DNS name; the value below is a placeholder. +- TCP/UDP ports 21115-21117 reachable from the internet (see port table in + `docker-compose.yml`). Keep 21118/21119 closed unless the web client is used. +- Docker Engine + Docker Compose plugin on the VDS. + +## Setup + +```bash +cd rustdesk +docker compose up -d +# First start generates the keypair in ./data (id_ed25519 + id_ed25519.pub). +cat data/id_ed25519.pub # <-- public key; embed in field clients +docker logs bf-hbbs # verify hbbs listening +docker logs bf-hbbr # verify hbbr listening +``` + +## Key distribution (field clients) + +1. Read the public key: `cat data/id_ed25519.pub` (single line, no newline issues). +2. Bake into the golden image / deployment script together with the server address: + `rustdesk.example.com` (replace with the real VDS DNS name). +3. Client config keys: `host = rustdesk.example.com`, `key = `. +4. Tag each client with its device identity `BF-` so the RustDesk address + book matches the Ansible inventory and MeshCentral names. +5. Key rotation: deploy the new key alongside the old one, confirm clients + connect, then retire the old key. + +## Health monitoring + +Point Uptime Kuma (see `../monitoring`) at: + +- TCP 21116 (hbbs heartbeat) +- TCP 21117 (hbbr relay) + +## Notes + +- `network_mode: host` is intentional; do not add port mappings. +- Data directory `./data` holds the keypair; back it up (see 17-BACKUP-RECOVERY). +- Never commit the private key (`data/id_ed25519`) to Git. + + + +#!/usr/bin/env bash +# +# bf-check-enrollment - ENROLLED level gate (fail closed). +# +# Proves the middle stage of the lifecycle without trusting the persisted phase +# alone: +# * the lifecycle state file is contract-valid and carries the central +# verification record produced by the validated enrollment response, +# * phase is ENROLLED or READY and enrollment_status is ENROLLED or COMPLETE +# (a skipped PROVISIONED_OFFLINE -> READY transition never passes), +# * the assigned WireGuard peer configuration exists and is root-only, +# * wg-quick@wg0 is enabled and active with the interface up and at least one +# handshake fresher than BF_WG_HANDSHAKE_MAX_AGE. +# +# A missing WireGuard handshake FAILS at this level (and at READY). It is only +# acceptable at the PROVISIONED_OFFLINE level, which bf-check-local owns. +# Without central evidence the gate never passes. +# +# Usage: bf-check-enrollment [--check] [--help] +# Exit status: 0 all enrollment gates passed, 1 at least one gate failed. +set -euo pipefail + +STATE_FILE="${BF_STATE_FILE:-${STATE_DIR:-/var/lib/blueforce}/state.json}" +WG_DIR="${WG_DIR:-/etc/wireguard}" +MAX_AGE="${BF_WG_HANDSHAKE_MAX_AGE:-180}" +SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +fails=0 +pass() { printf 'PASS: %s\n' "$1"; } +fail() { printf 'FAIL: %s\n' "$1"; fails=$((fails + 1)); } + +usage() { + cat <<'EOF' +Usage: bf-check-enrollment [--check] + +Verify the ENROLLED gates: contract-valid state with central verification +evidence, assigned WireGuard peer configuration, live tunnel and a fresh +handshake (BF_WG_HANDSHAKE_MAX_AGE, default 180s). + +Exit status: 0 all gates pass, 1 otherwise (fail closed without central evidence). +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --check) shift ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +[[ "$MAX_AGE" =~ ^[1-9][0-9]*$ ]] || { echo 'ERROR: BF_WG_HANDSHAKE_MAX_AGE must be positive seconds' >&2; exit 2; } + +mode_bits() { stat -c '%a' "$1" 2>/dev/null || printf ''; } +wide_mode() { + local mode + mode="$(mode_bits "$1")" + [[ -n "$mode" ]] || return 1 + ((8#$mode & 8#077)) +} + +# 1. Lifecycle contract plus the central verification record. bf-enrollment-status +# refuses ENROLLED/READY states without well-formed central evidence. +if output="$("$SELF_DIR/bf-enrollment-status" 2>&1)"; then + pass 'lifecycle state contract valid (central verification record present)' +else + fail 'lifecycle state contract invalid or central verification evidence missing' + printf '%s\n' "$output" >&2 +fi +phase="$("$SELF_DIR/bf-enrollment-status" --field phase 2>/dev/null)" || phase='' +enrollment="$("$SELF_DIR/bf-enrollment-status" --field enrollment 2>/dev/null)" || enrollment='' + +if [[ "$phase" == 'ENROLLED' || "$phase" == 'READY' ]]; then + pass "lifecycle phase is $phase" +else + fail "lifecycle phase is ${phase:-missing}, expected ENROLLED or READY" +fi +if [[ "$enrollment" == 'ENROLLED' || "$enrollment" == 'COMPLETE' ]]; then + pass "enrollment_status is $enrollment" +else + fail "enrollment_status is ${enrollment:-missing}, expected ENROLLED or COMPLETE" +fi +if [[ ! -e "$STATE_FILE" ]]; then + fail "state file missing: $STATE_FILE" +elif wide_mode "$STATE_FILE"; then + fail "state file mode is $(mode_bits "$STATE_FILE"); the contract requires 0600" +else + pass 'state file permissions are root-only' +fi + +# 2. Assigned WireGuard peer configuration (written by bf-enroll, never by the +# offline installer and never carrying a server-supplied private key). +if [[ -s "$WG_DIR/wg0.conf" ]]; then + pass "assigned WireGuard configuration present: $WG_DIR/wg0.conf" + if wide_mode "$WG_DIR/wg0.conf"; then + fail "wg0.conf mode is $(mode_bits "$WG_DIR/wg0.conf"); it must be root-only (0600)" + else + pass 'wg0.conf is root-only' + fi + for field in '\[Interface\]' '^PrivateKey = ' '^Address = ' '\[Peer\]' '^PublicKey = ' '^Endpoint = ' '^AllowedIPs = '; do + if grep -Eq "$field" "$WG_DIR/wg0.conf"; then + pass "wg0.conf declares ${field//\\/}" + else + fail "wg0.conf is missing ${field//\\/}" + fi + done +else + fail "assigned WireGuard configuration missing: $WG_DIR/wg0.conf" +fi + +# 3. Runtime tunnel state. +if systemctl is-enabled --quiet wg-quick@wg0 2>/dev/null; then + pass 'wg-quick@wg0 is enabled' +else + fail 'wg-quick@wg0 is not enabled' +fi +if systemctl is-active --quiet wg-quick@wg0 2>/dev/null; then + pass 'wg-quick@wg0 is active' +else + fail 'wg-quick@wg0 is not active' +fi +if command -v ip >/dev/null 2>&1 && ip link show wg0 >/dev/null 2>&1; then + pass 'wg0 interface is present' +else + fail 'wg0 interface is missing' +fi + +# 4. Fresh handshake: proof the assigned peer actually reaches central. +if ! command -v wg >/dev/null 2>&1; then + fail 'wg tool missing: handshake cannot be proven' +elif wg show wg0 latest-handshakes 2>/dev/null | awk -v now="$(date +%s)" -v max="$MAX_AGE" '$2 > 0 && now - $2 <= max { ok = 1 } END { exit !ok }'; then + pass "WireGuard handshake is fresher than ${MAX_AGE}s" +else + fail "WireGuard handshake missing or older than ${MAX_AGE}s" +fi + +if [[ "$fails" -ne 0 ]]; then + printf 'bf-check-enrollment: FAILED (%s enrollment gate(s)); device stays ENROLLED or PROVISIONED_OFFLINE\n' "$fails" + exit 1 +fi +printf 'bf-check-enrollment: enrollment gates PASS\n' + + + +#!/usr/bin/env bash +# +# bf-check-local - PROVISIONED_OFFLINE level gate (local proof only). +# +# This gate must PASS on a device that has never reached the internet: +# * it performs no DNS, HTTP or central call at all, +# * a missing wg0.conf or a missing WireGuard handshake is reported as WARN +# because enrollment has not happened yet - it is never a failure here, +# * WireGuard handshake freshness belongs to bf-check-enrollment (ENROLLED) +# and bf-check-ready (READY) only. +# +# Usage: bf-check-local [--check] [--help] +# --check accepted for symmetry with the installer modules; checks never +# mutate anything, so --check and the default are identical. +# +# Exit status: 0 every local gate passed, 1 at least one gate failed. +# Never prints secrets. +# +set -euo pipefail + +STATE_FILE="${BF_STATE_FILE:-${STATE_DIR:-/var/lib/blueforce}/state.json}" +WG_DIR="${WG_DIR:-/etc/wireguard}" +SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +fails=0 +pass() { printf 'PASS: %s\n' "$1"; } +fail() { printf 'FAIL: %s\n' "$1"; fails=$((fails + 1)); } +warn() { printf 'WARN: %s\n' "$1"; } +info() { printf 'INFO: %s\n' "$1"; } + +usage() { + cat <<'EOF' +Usage: bf-check-local [--check] + +Verify the local, pre-enrollment (PROVISIONED_OFFLINE) gates: + * lifecycle state file present and contract-valid, + * WireGuard device keypair present, root-only and self-consistent, + * xrdp and xrdp-sesman enabled and active, + * default systemd target is multi-user.target. + +No internet, no WireGuard handshake and no central evidence is required. +Exit status: 0 all gates pass, 1 at least one gate failed. +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --check) shift ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +mode_bits() { stat -c '%a' "$1" 2>/dev/null || printf ''; } +# True when a file is readable/writable beyond its owner. +wide_mode() { + local mode + mode="$(mode_bits "$1")" + [[ -n "$mode" ]] || return 1 + ((8#$mode & 8#077)) +} + +info 'local-only gate: no internet, no WireGuard handshake and no central evidence is required' + +# 1. Lifecycle state contract. bf-enrollment-status owns the validation rules. +if "$SELF_DIR/bf-enrollment-status" >/dev/null 2>&1; then + pass 'lifecycle state file present and contract-valid' +else + fail 'lifecycle state file missing or contract-invalid (run bf-enrollment-status)' +fi +phase="$("$SELF_DIR/bf-enrollment-status" --field phase 2>/dev/null)" || phase='' +if [[ "$phase" =~ ^(PROVISIONED_OFFLINE|ENROLLED|READY)$ ]]; then + pass "lifecycle phase is $phase" +else + fail 'lifecycle phase is missing or invalid' +fi +if [[ -r "$STATE_FILE" ]]; then + pass "state file readable: $STATE_FILE" +else + fail "state file not readable: $STATE_FILE" +fi +if wide_mode "$STATE_FILE"; then + warn "state file mode is $(mode_bits "$STATE_FILE"); the contract requires 0600" +fi + +# 2. WireGuard device identity. The private key is a device-only secret: it must +# exist, be unreadable by group/other, and belong to the public key that +# enrollment publishes. +if [[ -s "$WG_DIR/privatekey" ]]; then + pass 'WireGuard private key present' +else + fail "WireGuard private key missing or empty: $WG_DIR/privatekey" +fi +if [[ -e "$WG_DIR/privatekey" ]]; then + if wide_mode "$WG_DIR/privatekey"; then + fail "WireGuard private key mode is $(mode_bits "$WG_DIR/privatekey"); it must be root-only (0600)" + else + pass 'WireGuard private key is root-only' + fi +fi +if [[ -s "$WG_DIR/publickey" ]]; then + pass 'WireGuard public key present' +else + fail "WireGuard public key missing or empty: $WG_DIR/publickey" +fi +if command -v wg >/dev/null 2>&1 && [[ -s "$WG_DIR/privatekey" && -s "$WG_DIR/publickey" ]]; then + derived="$(wg pubkey < "$WG_DIR/privatekey" 2>/dev/null | tr -d '[:space:]')" || derived='' + if [[ -n "$derived" && "$derived" == "$(tr -d '[:space:]' < "$WG_DIR/publickey")" ]]; then + pass 'WireGuard keypair is self-consistent' + else + fail 'WireGuard public key does not match the local private key' + fi +else + warn 'wg tool unavailable: keypair consistency not verified' +fi + +# 3. Local access services (the field technician path must work offline). +if systemctl is-enabled --quiet xrdp 2>/dev/null && systemctl is-active --quiet xrdp 2>/dev/null; then + pass 'xrdp enabled and active' +else + fail 'xrdp is not enabled and active' +fi +if systemctl is-enabled --quiet xrdp-sesman 2>/dev/null && systemctl is-active --quiet xrdp-sesman 2>/dev/null; then + pass 'xrdp-sesman enabled and active' +else + fail 'xrdp-sesman is not enabled and active' +fi +if [[ "$(systemctl get-default 2>/dev/null)" == 'multi-user.target' ]]; then + pass 'default target is multi-user.target' +else + fail "default target is $(systemctl get-default 2>/dev/null || echo unknown), expected multi-user.target" +fi + +# 4. Post-enrollment artifacts are explicitly out of scope here. +if [[ -e "$WG_DIR/wg0.conf" ]]; then + info 'wg0.conf present (enrollment already ran); handshake belongs to bf-check-enrollment' +else + warn 'wg0.conf absent: not enrolled yet, which is expected before enrollment' +fi + +if [[ "$fails" -ne 0 ]]; then + printf 'bf-check-local: FAILED (%s local gate(s))\n' "$fails" + exit 1 +fi +printf 'bf-check-local: local gates PASS (offline-safe, no central evidence required)\n' + + + +#!/usr/bin/env bash +# +# bf-check-ready - READY level gate. +# +# READY proof is always re-derived from current independent checks; a persisted +# READY value is never trusted and never used as evidence. All of the following +# must pass in this order: +# 1. bf-check-local - local provisioning and access services, +# 2. bf-check-enrollment - ENROLLED stage: state contract, central +# verification record, assigned WireGuard peer, +# live tunnel and a fresh handshake, +# 3. bf-remote-status --check - xRDP, RustDesk, optional Mesh and every +# central channel (monitoring, remote, management) +# marked verified. +# +# Without evidence from every central channel this gate fails closed: a device +# with WireGuard only stays ENROLLED, it never becomes READY. +# +# Usage: bf-check-ready [--check] [--help] +# Exit status: 0 READY proof complete, 1 at least one gate failed. +set -euo pipefail + +SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() { + cat <<'EOF' +Usage: bf-check-ready [--check] + +Re-derive the READY proof: local gates, ENROLLED gates and complete central +channel verification (bf-remote-status --check). Nothing is written. + +Exit status: 0 READY proof complete, 1 otherwise. +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --check) shift ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +"$SELF_DIR/bf-check-local" || { printf 'bf-check-ready: FAILED at local gates (device stays PROVISIONED_OFFLINE)\n'; exit 1; } +"$SELF_DIR/bf-check-enrollment" || { printf 'bf-check-ready: FAILED at enrollment gates (device stays ENROLLED)\n'; exit 1; } +"$SELF_DIR/bf-remote-status" --check || { printf 'bf-check-ready: FAILED at channel verification (device stays ENROLLED)\n'; exit 1; } + +printf 'bf-check-ready: READY proof complete (local health plus every central channel verified)\n' + + + +#!/usr/bin/env bash +# +# bf-diagnostics - Deep health check for a Blueforce field terminal. +# +# Detailed version of bf-status: SMART, journal errors, docker ps, +# WireGuard state, unattended-upgrades lock, sockets, inodes, textfiles. +# Never prints secrets, keys, or passwords (handshake keys are redacted). +# +# Install: install -m 0755 bf-diagnostics /usr/local/bin/bf-diagnostics +# Usage: bf-diagnostics [--help] +# +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: bf-diagnostics [--help] + +Run deep checks: SMART, journal errors, docker ps, wg show, +unattended-upgrades lock state, sockets, inodes, textfile collectors. + +Options: + --help Show this help and exit +EOF +} + +if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then + usage + exit 0 +elif [[ $# -gt 0 ]]; then + echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 +fi + +set +e # report, don't abort + +sec() { printf '\n### %s\n' "$*"; } + +sec "HOST" +hostname; uptime; systemctl get-default 2>/dev/null || echo "target: unknown" + +sec "SMART" +if command -v smartctl >/dev/null 2>&1; then + for dev in /dev/sd? /dev/nvme?n1; do + [[ -b "${dev}" ]] || continue + echo "--- ${dev} ---" + smartctl -H -A "${dev}" 2>/dev/null | grep -Ei 'health|reallocated|pending|uncorrect|wear|temperature|power_on' || echo "no SMART attributes parsed" + done +else + echo "smartctl not installed; skipping SMART." +fi + +sec "JOURNAL ERRORS (last 24h, top 20)" +if command -v journalctl >/dev/null 2>&1; then + journalctl --since "24 hours ago" -p err --no-pager -o short 2>/dev/null | tail -20 || echo "no journal access" +else + echo "journalctl not available." +fi + +sec "FAILED SYSTEMD UNITS" +if command -v systemctl >/dev/null 2>&1; then + systemctl --failed --no-pager 2>/dev/null || echo "no failed units" +else + echo "systemctl not available." +fi + +sec "DOCKER PS" +if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then + docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' 2>/dev/null || echo "docker ps failed" + echo "--- restart counts ---" + docker ps --format '{{.Names}} restarts={{.RestartCount}}' 2>/dev/null || true +else + echo "docker daemon not reachable." +fi + +sec "WIREGUARD (keys redacted)" +if command -v wg >/dev/null 2>&1; then + wg show 2>/dev/null | sed -E 's/(private-key|public-key|preshared-key): .*/\1: /' || echo "no WireGuard interfaces" + echo "--- latest handshakes ---" + wg show all latest-handshakes 2>/dev/null || echo "no handshake data" +else + echo "wg tool not installed." +fi + +sec "UNATTENDED-UPGRADES LOCK (must be DISABLED)" +grep -H . /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null || echo "20auto-upgrades file missing" +for t in apt-daily.timer apt-daily-upgrade.timer; do + printf '%s: %s\n' "$t" "$(systemctl is-enabled "$t" 2>/dev/null || echo unknown)" +done + +sec "SOCKETS (listening)" +ss -ltnp 2>/dev/null || ss -ltn 2>/dev/null || echo "ss not available" + +sec "DISK + INODES" +df -h / /var 2>/dev/null +df -i / /var 2>/dev/null | head -5 + +sec "TEXTFILE COLLECTORS" +ls -l /var/lib/node_exporter/textfile/ 2>/dev/null || echo "textfile dir missing" +for f in /var/lib/node_exporter/textfile/*.prom; do + [[ -f "$f" ]] || continue + echo "--- $f ---"; head -10 "$f" +done + +sec "SECURITY UPDATES PENDING" +if command -v apt >/dev/null 2>&1; then + apt list --upgradable 2>/dev/null | grep -ci security || echo "0 security updates (or apt list unavailable)" +else + echo "apt not available." +fi + +sec "REBOOT REQUIRED" +if [[ -f /var/run/reboot-required ]]; then echo "YES"; cat /var/run/reboot-required.pkgs 2>/dev/null || true +else echo "NO"; fi + +echo +echo "Diagnostics complete. For remote triage run: bf-support-bundle" +exit 0 + + + +#!/usr/bin/env bash +# +# bf-enroll - one-time enrollment client for a PROVISIONED_OFFLINE device. +# +# Security contract (docs/29-DEVICE-ENROLLMENT.md, provisioning/enrollment/README.md): +# * The one-time token is read from stdin (--token-stdin) or from a root-only +# single-use file staged for the boot timer (--systemd / --stage). It is +# never taken from argv, never logged, never written into the lifecycle +# state, a support bundle or removable media. +# * The WireGuard private key never leaves the device. The request carries only +# the public key plus non-secret hardware/release facts; the WireGuard +# configuration is assembled locally from the local private key and the +# validated peer fields of the response. A response that tries to inject a +# private key or an unexpected field is rejected. +# * The idempotency key is derived deterministically from +# provisioning_id + BF- + public key, so central can deduplicate retries +# of the same device/release while the token itself stays single-use. +# * Every state update is an atomic tmp+rename write with mode 0600 and a +# forward-only transition check under a lock. +# +# Lifecycle (forward-only, never skipping a stage): +# (none) -> PROVISIONED_OFFLINE -> ENROLLED -> READY +# * This script performs PROVISIONED_OFFLINE -> ENROLLED only. +# * ENROLLED may be re-applied with --reenroll (idempotent re-enrollment); +# the phase never moves backwards. +# * READY never returns to ENROLLED; re-provision from the offline media. +# +# Failure handling: a failed request or a failed WireGuard activation rolls the +# configuration back and leaves the lifecycle at its prior state (PENDING or +# PROVISIONED_OFFLINE). Nothing reboots and nothing retries in a loop; the +# bounded retry lives in blueforce-enroll.service. +# +# Usage: +# bf-enroll --token-stdin [--reenroll] [--check] immediate enrollment +# bf-enroll --token-stdin --stage [--check] stage the token, enroll later +# bf-enroll --systemd [--check] attempt used by the boot timer +# +# Environment: +# BF_ENROLLMENT_ENDPOINT HTTPS enrollment endpoint (central configuration) +# BF_ENROLLMENT_TIMEOUT connect/max seconds per attempt (default 20) +# BF_ENROLLMENT_TOKEN_FILE staged token path (default /enrollment.token) +# BF_ENROLLMENT_TOKEN_MAX_AGE staged token TTL in seconds (default 1800) +# BF_STATE_FILE / STATE_DIR / WG_DIR test and installer overrides +# +set -euo pipefail +umask 077 + +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +STATE_FILE="${BF_STATE_FILE:-$STATE_DIR/state.json}" +WG_DIR="${WG_DIR:-/etc/wireguard}" +ENDPOINT="${BF_ENROLLMENT_ENDPOINT:-}" +TIMEOUT="${BF_ENROLLMENT_TIMEOUT:-20}" +TOKEN_FILE="${BF_ENROLLMENT_TOKEN_FILE:-$STATE_DIR/enrollment.token}" +TOKEN_MAX_AGE="${BF_ENROLLMENT_TOKEN_MAX_AGE:-1800}" + +MODE='' +STAGE=0 +REENROLL=0 +CHECK_MODE=0 +TOKEN='' +HTTP_CODE='' +REQUEST_FILE='' +RESPONSE_FILE='' +STAGED_CONFIG='' +BACKUP_CONFIG='' +CV_FILE='' + +usage() { + cat <<'EOF' +Usage: bf-enroll --token-stdin [--reenroll] [--check] + bf-enroll --token-stdin --stage [--check] + bf-enroll --systemd [--check] + +Obtain the hub WireGuard peer configuration for a PROVISIONED_OFFLINE device +and record the ENROLLED lifecycle phase. + +Token sources (a token is never accepted from argv and never logged): + --token-stdin read the one-time token once from stdin and enroll now + --stage store the stdin token as a root-only single-use file + (mode 0600, TTL BF_ENROLLMENT_TOKEN_MAX_AGE) for the boot timer + --systemd attempt used by blueforce-enroll.service: PENDING while no + token is staged, transient failures exit non-zero so the + bounded Restart= can retry, definitive rejections discard the + staged token + +Options: + --reenroll allow re-applying enrollment on a device already in ENROLLED + (the phase never moves backwards; READY is refused) + --check dry run: validate configuration and state, print the planned + actions, write nothing and send nothing + --help show this help + +Exit status: 0 success (or nothing to do), 1 failure, 2 usage error. +EOF +} + +die() { printf 'bf-enroll: %s\n' "$*" >&2; exit 1; } +note() { printf 'bf-enroll: %s\n' "$*"; } + +# A lifecycle precondition that cannot be met. Interactive runs fail loudly, +# the boot attempt reports PENDING and exits 0 so it never becomes a retry loop. +gate_block() { + if [[ "$MODE" == 'systemd' ]]; then + printf 'bf-enroll: PENDING: %s\n' "$*" >&2 + exit 0 + fi + die "$*" +} + +cleanup() { + unset TOKEN HTTP_CODE REQUEST_FILE RESPONSE_FILE STAGED_CONFIG BACKUP_CONFIG CV_FILE + return 0 +} +trap cleanup EXIT + +while [[ $# -gt 0 ]]; do + case "$1" in + --token-stdin) + [[ -z "$MODE" ]] || { echo 'ERROR: only one token source can be selected' >&2; exit 2; } + MODE='stdin'; shift ;; + --systemd) + [[ -z "$MODE" ]] || { echo 'ERROR: only one token source can be selected' >&2; exit 2; } + MODE='systemd'; shift ;; + --stage) STAGE=1; shift ;; + --reenroll) REENROLL=1; shift ;; + --check) CHECK_MODE=1; shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'ERROR: unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done +[[ -n "$MODE" ]] || { usage >&2; exit 2; } +if [[ "$STAGE" -eq 1 && "$MODE" != 'stdin' ]]; then + echo 'ERROR: --stage applies to --token-stdin only' >&2 + exit 2 +fi + +[[ "$TIMEOUT" =~ ^[1-9][0-9]*$ ]] || die 'BF_ENROLLMENT_TIMEOUT must be positive seconds' +[[ "$TOKEN_MAX_AGE" =~ ^[1-9][0-9]*$ ]] || die 'BF_ENROLLMENT_TOKEN_MAX_AGE must be positive seconds' + +validate_endpoint() { + [[ "$ENDPOINT" =~ ^https://[^[:space:]/]+(/[^[:space:]]*)?$ ]] || die 'BF_ENROLLMENT_ENDPOINT must be a non-placeholder HTTPS URL' + case "$ENDPOINT" in + *example*|*invalid*|*'<'*|*'>'*) die 'BF_ENROLLMENT_ENDPOINT must be a non-placeholder HTTPS URL' ;; + esac +} + +validate_token() { + local value="$1" + [[ -n "$value" ]] || return 1 + ((${#value} >= 8 && ${#value} <= 4096)) || return 1 + [[ "$value" != *[[:space:]]* ]] || return 1 + # [:graph:] is printable without space: no control characters, no blanks. + [[ "$value" =~ ^[[:graph:]]+$ ]] || return 1 +} + +mode_bits() { stat -c '%a' "$1" 2>/dev/null || printf ''; } + +# --- lifecycle state --------------------------------------------------------- + +DEALER_ID="$(tr -d '[:space:]' < "$STATE_DIR/dealer-id" 2>/dev/null || true)" +[[ "$DEALER_ID" =~ ^[0-9]{8}$ ]] || gate_block 'dealer identity is missing or invalid' +DEVICE_ID="BF-$DEALER_ID" + +# read_state emits PHASE=/PROVISIONING_ID=/IDEMPOTENCY_KEY= for a usable state, +# or ERROR=. The idempotency key is stable across retries so central can +# deduplicate, while the one-time token remains single-use. +read_state() { + python3 - "$STATE_FILE" "$DEVICE_ID" "$WG_DIR/publickey" <<'PY' +import hashlib +import json +import sys + +path, device, public_key_path = sys.argv[1], sys.argv[2], sys.argv[3] +VALID_STATES = ('PROVISIONED_OFFLINE', 'ENROLLED', 'READY') + + +def unavailable(reason): + print('ERROR=' + reason) + raise SystemExit(0) + + +try: + with open(path, encoding='utf-8') as handle: + state = json.load(handle) +except OSError: + unavailable('state-missing') +except ValueError: + unavailable('state-invalid') +if not isinstance(state, dict): + unavailable('state-invalid') +if state.get('phase') not in VALID_STATES: + unavailable('state-invalid') +if state.get('device_id') not in (None, device): + unavailable('identity-mismatch') +provisioning_id = state.get('provisioning_id') +if not isinstance(provisioning_id, str) or not provisioning_id or len(provisioning_id) > 128 \ + or any(character.isspace() for character in provisioning_id): + unavailable('state-invalid') +try: + with open(public_key_path, encoding='utf-8') as handle: + public_key = handle.read().strip() +except OSError: + unavailable('public-key-missing') +if not public_key: + unavailable('public-key-missing') +idempotency_key = hashlib.sha256((provisioning_id + '|' + device + '|' + public_key).encode()).hexdigest() +print('PHASE=' + state['phase']) +print('PROVISIONING_ID=' + provisioning_id) +print('IDEMPOTENCY_KEY=' + idempotency_key) +PY +} + +STATE_OUT="$(read_state)" +PHASE='' +PROVISIONING_ID='' +IDEMPOTENCY='' +while IFS= read -r line; do + case "$line" in + ERROR=state-missing) gate_block 'device has no lifecycle state yet; offline provisioning must complete first' ;; + ERROR=identity-mismatch) gate_block 'lifecycle state belongs to another device (device_id mismatch)' ;; + ERROR=public-key-missing) gate_block 'WireGuard public key is missing; run local provisioning first' ;; + ERROR=*) gate_block 'lifecycle state is unreadable or violates the state contract' ;; + PHASE=*) PHASE="${line#PHASE=}" ;; + PROVISIONING_ID=*) PROVISIONING_ID="${line#PROVISIONING_ID=}" ;; + IDEMPOTENCY_KEY=*) IDEMPOTENCY="${line#IDEMPOTENCY_KEY=}" ;; + esac +done <<<"$STATE_OUT" +[[ -n "$PHASE" && -n "$PROVISIONING_ID" && -n "$IDEMPOTENCY" ]] || gate_block 'lifecycle state is incomplete' + +# Forward-only transition gate: no skipping, no backwards moves. +case "$PHASE" in + PROVISIONED_OFFLINE) ;; + ENROLLED) + [[ "$REENROLL" -eq 1 ]] || gate_block 'device is already ENROLLED: refusing to replay an enrollment. Pass --reenroll with a fresh one-time token to re-apply.' + note 're-applying enrollment on an ENROLLED device (--reenroll); the phase never moves backwards' + ;; + READY) + gate_block 'device is READY: lifecycle transitions never move backwards. Re-provision from the offline media to enroll again.' + ;; + *) gate_block "enrollment is not allowed from lifecycle phase $PHASE" ;; +esac + +[[ -s "$WG_DIR/privatekey" && -s "$WG_DIR/publickey" ]] || gate_block 'WireGuard key material is missing; run local provisioning first' +if [[ -n "$(mode_bits "$WG_DIR/privatekey")" ]] && ((8#$(mode_bits "$WG_DIR/privatekey") & 8#077)); then + gate_block "WireGuard private key mode is $(mode_bits "$WG_DIR/privatekey"); it must be root-only (0600)" +fi +WG_PUBLIC_KEY="$(tr -d '[:space:]' < "$WG_DIR/publickey")" + +# --- token sources ----------------------------------------------------------- + +# staged_token_problem reports why a staged token cannot be used. It never +# mutates anything, so --check can call it safely. +staged_token_problem() { + if [[ ! -e "$TOKEN_FILE" ]]; then + printf 'no staged one-time token (%s)\n' "$TOKEN_FILE" + return 0 + fi + [[ -f "$TOKEN_FILE" && ! -L "$TOKEN_FILE" ]] && return 1 + printf 'staged token path is not a regular file\n' + return 0 +} + +read_staged_token() { + if [[ ! -e "$TOKEN_FILE" ]]; then + printf 'bf-enroll: PENDING: no staged one-time token; the device waits for a technician (bf-enroll-now) or --stage\n' >&2 + exit 0 + fi + [[ -f "$TOKEN_FILE" && ! -L "$TOKEN_FILE" ]] || gate_block 'staged token path is not a regular file; refusing to read it' + local owner mode size now mtime + owner="$(stat -c '%u' "$TOKEN_FILE")" + [[ "$owner" == "$(id -u)" ]] || gate_block "staged token must be owned by uid $(id -u); refusing to read it" + mode="$(mode_bits "$TOKEN_FILE")" + if ((8#$mode & 8#077)); then + gate_block "staged token mode is $mode; it must be root-only (0600)" + fi + size="$(stat -c '%s' "$TOKEN_FILE")" + if ((size == 0 || size > 4100)); then + rm -f "$TOKEN_FILE" + gate_block 'staged token file size is invalid; the token was discarded' + fi + now="$(date +%s)" + mtime="$(stat -c '%Y' "$TOKEN_FILE")" + if ((now - mtime > TOKEN_MAX_AGE)); then + rm -f "$TOKEN_FILE" + printf 'bf-enroll: PENDING: staged one-time token expired after %ss and was discarded; stage a fresh token\n' "$TOKEN_MAX_AGE" >&2 + exit 0 + fi + TOKEN="$(head -n 1 "$TOKEN_FILE" | tr -d '\r\n')" + if ! validate_token "$TOKEN"; then + rm -f "$TOKEN_FILE" + gate_block 'staged token is malformed; it was discarded' + fi +} + +drop_staged_token() { + [[ "$MODE" == 'systemd' ]] || return 0 + rm -f "$TOKEN_FILE" +} + +stage_token() { + [[ -n "$TOKEN" ]] || die 'a non-empty enrollment token is required on stdin' + install -d -m 700 "$STATE_DIR" + local temp + temp="$(mktemp "$STATE_DIR/.enrollment.token.XXXXXX")" + chmod 600 "$temp" + printf '%s\n' "$TOKEN" > "$temp" + unset TOKEN + mv -f "$temp" "$TOKEN_FILE" + chmod 600 "$TOKEN_FILE" + note "one-time token staged for the boot timer (mode 0600, TTL ${TOKEN_MAX_AGE}s): $TOKEN_FILE" +} + +if [[ "$STAGE" -eq 1 ]]; then + if [[ "$CHECK_MODE" -eq 1 ]]; then + note "check: would stage a one-time token for the boot timer at $TOKEN_FILE (stdin is not consumed in --check mode)" + exit 0 + fi + IFS= read -r TOKEN || true + validate_token "$TOKEN" || die 'a printable enrollment token of 8-4096 characters without whitespace is required on stdin' + stage_token + note 'staged; the boot attempt enrolls as soon as central is reachable' + exit 0 +fi + +if [[ "$MODE" == 'stdin' ]]; then + validate_endpoint + if [[ "$CHECK_MODE" -eq 0 ]]; then + IFS= read -r TOKEN || true + validate_token "$TOKEN" || die 'a printable enrollment token of 8-4096 characters without whitespace is required on stdin' + fi +else + if [[ -z "$ENDPOINT" ]]; then + # A device without central configuration is not a failure: it stays + # PENDING and must not spin in a retry loop. + printf 'bf-enroll: PENDING: BF_ENROLLMENT_ENDPOINT is not configured; the boot attempt has nothing to do\n' >&2 + exit 0 + fi + validate_endpoint + if [[ "$CHECK_MODE" -eq 1 ]]; then + if problem="$(staged_token_problem)"; then + note "check: $problem; the boot attempt would stay PENDING and exit 0" + exit 0 + fi + else + read_staged_token + fi +fi + +if [[ "$CHECK_MODE" -eq 1 ]]; then + note "check: would enroll $DEVICE_ID ($PHASE -> ENROLLED) against $ENDPOINT; no request sent, nothing written" + note 'check: the WireGuard private key stays local; only the public key and non-secret facts are sent' + exit 0 +fi + +# --- request ----------------------------------------------------------------- + +REQUEST_FILE="$(mktemp)"; RESPONSE_FILE="$(mktemp)"; CV_FILE="$(mktemp)" +chmod 600 "$REQUEST_FILE" "$RESPONSE_FILE" "$CV_FILE" +python3 - "$REQUEST_FILE" "$DEVICE_ID" "$WG_PUBLIC_KEY" "$IDEMPOTENCY" <<'PY' +import json +import platform +import sys + + +def read_if_readable(path): + try: + with open(path, encoding='utf-8') as handle: + return handle.read().strip() + except OSError: + return '' + + +# Only the public key and non-secret device facts are sent. The WireGuard +# private key, the token and any credential are deliberately absent. +request = { + 'device_id': sys.argv[2], + 'wireguard_public_key': sys.argv[3], + 'idempotency_key': sys.argv[4], + 'hardware': { + 'machine_id': read_if_readable('/etc/machine-id'), + 'product_uuid': read_if_readable('/sys/class/dmi/id/product_uuid'), + 'sys_vendor': read_if_readable('/sys/class/dmi/id/sys_vendor'), + }, + 'release': { + 'os_release': read_if_readable('/etc/os-release'), + 'kernel': platform.release(), + }, +} +with open(sys.argv[1], 'w', encoding='utf-8') as handle: + json.dump(request, handle, separators=(',', ':')) +PY + +# The Authorization header arrives through an anonymous process-substitution fd: +# the one-time token is never on argv, on disk, in the state file or in a log. +# --proto/--max-redirs pin the transport: HTTPS only, no redirect can move the +# token to another origin. +if HTTP_CODE="$(curl --proto '=https' --tlsv1.2 --max-redirs 0 \ + --request POST --connect-timeout "$TIMEOUT" --max-time "$TIMEOUT" \ + --silent --show-error --fail --write-out '%{http_code}' \ + -H 'Content-Type: application/json' \ + -H @<(printf 'Authorization: Bearer %s' "$TOKEN") \ + --data-binary "@$REQUEST_FILE" --output "$RESPONSE_FILE" "$ENDPOINT")"; then + CURL_RC=0 +else + CURL_RC=$? +fi +unset TOKEN +if [[ "$CURL_RC" -ne 0 ]]; then + case "$HTTP_CODE" in + 4??) + drop_staged_token + die "central rejected the enrollment request (HTTP $HTTP_CODE, curl exit $CURL_RC); that one-time token is consumed, obtain a fresh token" + ;; + *) + die "enrollment request did not complete (curl exit $CURL_RC, HTTP ${HTTP_CODE:-000}); lifecycle stays at its prior state and any staged token is kept for the bounded retry" + ;; + esac +fi + +# --- response validation and local configuration ----------------------------- + +STAGED_CONFIG="$(mktemp "$WG_DIR/.wg0.conf.XXXXXX")" +chmod 600 "$STAGED_CONFIG" +python3 - "$RESPONSE_FILE" "$STAGED_CONFIG" "$CV_FILE" "$DEVICE_ID" "$WG_PUBLIC_KEY" "$IDEMPOTENCY" "$WG_DIR" <<'PY' +import json +import os +import re +import sys + +response_path, config_path, cv_path, device, public_key, idempotency, wg_dir = sys.argv[1:8] + + +def bad(message): + sys.stderr.write('Enrollment response invalid: ' + message + '\n') + raise SystemExit(1) + + +try: + with open(response_path, encoding='utf-8') as handle: + response = json.load(handle) +except ValueError: + bad('not valid JSON') +allowed = {'status', 'device_id', 'idempotency_key', 'enrollment_id', 'wireguard', 'central_verification'} +required = {'status', 'device_id', 'idempotency_key', 'wireguard', 'central_verification'} +if not isinstance(response, dict) or set(response) - allowed: + bad('unexpected top-level field (no private key or extra secret is accepted)') +if not required <= set(response): + bad('required field missing') +if response['status'] != 'accepted' or response['device_id'] != device or response['idempotency_key'] != idempotency: + bad('status or identity mismatch') +if 'enrollment_id' in response and not isinstance(response['enrollment_id'], str): + bad('enrollment_id type') +wireguard = response['wireguard'] +if not isinstance(wireguard, dict) or set(wireguard) != {'address', 'endpoint', 'server_public_key', 'allowed_ips'}: + bad('WireGuard fields') +server_public_key = wireguard['server_public_key'] +endpoint = wireguard['endpoint'] +address = wireguard['address'] +allowed_ips = wireguard['allowed_ips'] +if not all(isinstance(value, str) for value in (server_public_key, endpoint, address, allowed_ips)): + bad('WireGuard types') +if not re.fullmatch(r'[A-Za-z0-9+/]{43}=', server_public_key): + bad('server public key') +if not re.fullmatch(r'[A-Za-z0-9][A-Za-z0-9.-]*:[1-9][0-9]{0,4}', endpoint) \ + or any(marker in endpoint.lower() for marker in ('example', 'invalid', '<', '>')): + bad('endpoint') +if int(endpoint.rsplit(':', 1)[1]) > 65535: + bad('endpoint port') +if not re.fullmatch(r'(?:\d{1,3}\.){3}\d{1,3}/(?:[0-9]|[12][0-9]|3[0-2])', address): + bad('address') +if not allowed_ips or '\n' in allowed_ips or '\r' in allowed_ips: + bad('allowed_ips') +central = response['central_verification'] +if not isinstance(central, dict) or set(central) != {'status', 'verification_id', 'monitoring', 'remote', 'management'}: + bad('central verification fields') +if central['status'] not in ('pending', 'verified') or not isinstance(central['verification_id'], str) or not central['verification_id']: + bad('central verification status') +for name in ('monitoring', 'remote', 'management'): + item = central[name] + if not isinstance(item, dict) or set(item) != {'status', 'verification_id'} \ + or item['status'] not in ('pending', 'verified') \ + or not isinstance(item['verification_id'], str) or not item['verification_id']: + bad('central ' + name + ' evidence') + +# The device keeps its own private key: it is never accepted from central, never +# sent, and never stored outside /etc/wireguard. +try: + with open(os.path.join(wg_dir, 'privatekey'), encoding='utf-8') as handle: + private_key = handle.read().strip() +except OSError: + private_key = '' +if not private_key: + bad('local WireGuard private key is unreadable') + +config = ( + '[Interface]\n' + 'PrivateKey = ' + private_key + '\n' + 'Address = ' + address + '\n' + '\n' + '[Peer]\n' + 'PublicKey = ' + server_public_key + '\n' + 'Endpoint = ' + endpoint + '\n' + 'AllowedIPs = ' + allowed_ips + '\n' + 'PersistentKeepalive = 25\n' +) +descriptor = os.open(config_path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) +with os.fdopen(descriptor, 'w', encoding='utf-8') as handle: + handle.write(config) +with open(cv_path, 'w', encoding='utf-8') as handle: + json.dump({'central_verification': central}, handle, separators=(',', ':')) +PY +chmod 600 "$STAGED_CONFIG" + +# --- activation with rollback ------------------------------------------------ + +rollback_activation() { + if [[ -n "$BACKUP_CONFIG" && -e "$BACKUP_CONFIG" ]]; then + mv -f "$BACKUP_CONFIG" "$WG_DIR/wg0.conf" + BACKUP_CONFIG='' + chmod 600 "$WG_DIR/wg0.conf" 2>/dev/null || true + systemctl restart wg-quick@wg0 >/dev/null 2>&1 || true + else + rm -f "$WG_DIR/wg0.conf" + systemctl disable --now wg-quick@wg0 >/dev/null 2>&1 || true + fi +} + +if [[ -e "$WG_DIR/wg0.conf" ]]; then + BACKUP_CONFIG="$(mktemp "$WG_DIR/.wg0.conf.backup.XXXXXX")" + cp -p "$WG_DIR/wg0.conf" "$BACKUP_CONFIG" +fi +mv "$STAGED_CONFIG" "$WG_DIR/wg0.conf" +STAGED_CONFIG='' +chmod 600 "$WG_DIR/wg0.conf" +if ! systemctl enable wg-quick@wg0 || ! systemctl restart wg-quick@wg0 \ + || ! systemctl is-enabled --quiet wg-quick@wg0 || ! systemctl is-active --quiet wg-quick@wg0 \ + || ! ip link show wg0 >/dev/null 2>&1; then + rollback_activation + die 'WireGuard configuration could not be activated; lifecycle remains at its prior state (configuration rolled back)' +fi + +# --- atomic state commit ----------------------------------------------------- + +python3 - "$STATE_FILE" "$DEVICE_ID" "$IDEMPOTENCY" "$CV_FILE" "$RESPONSE_FILE" "$REENROLL" <<'PY' +import datetime +import fcntl +import json +import os +import sys +import tempfile + +state_path, device, idempotency, cv_path, response_path, reenroll = sys.argv[1:7] +directory = os.path.dirname(state_path) or '.' +with open(cv_path, encoding='utf-8') as handle: + central = json.load(handle)['central_verification'] +with open(response_path, encoding='utf-8') as handle: + enrollment_id = json.load(handle).get('enrollment_id') or 'accepted' + +# Serialize lifecycle writers (boot timer vs. technician) and re-check the +# transition under the lock so a stale decision can never be committed. +lock = os.open(os.path.join(directory, '.state.lock'), os.O_CREAT | os.O_RDWR | os.O_CLOEXEC, 0o600) +try: + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) +except OSError: + raise SystemExit('bf-enroll: another lifecycle update is in progress; nothing was committed') + +with open(state_path, encoding='utf-8') as handle: + state = json.load(handle) +current = state.get('phase') +if current == 'READY': + raise SystemExit('bf-enroll: refusing to move a READY device backwards; nothing was committed') +if current not in ('PROVISIONED_OFFLINE', 'ENROLLED'): + raise SystemExit('bf-enroll: device is not PROVISIONED_OFFLINE; nothing was committed') +if current == 'ENROLLED' and reenroll != '1': + raise SystemExit('bf-enroll: device is already ENROLLED; refusing a replay') +if state.get('device_id') not in (None, device): + raise SystemExit('bf-enroll: lifecycle state device_id mismatch; nothing was committed') + +# Forward-only transition, exactly one stage: PROVISIONED_OFFLINE -> ENROLLED. +state.update({ + 'phase': 'ENROLLED', + 'enrollment_status': 'ENROLLED', + 'fleet_status': 'PENDING', + 'device_id': device, + 'enrollment_id': enrollment_id, + 'idempotency_key': idempotency, + 'central_verification': central, + 'enrolled_at': datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ'), +}) +descriptor, temporary = tempfile.mkstemp(prefix='.state.json.', dir=directory) +try: + os.fchmod(descriptor, 0o600) + with os.fdopen(descriptor, 'w', encoding='utf-8') as handle: + json.dump(state, handle, sort_keys=True) + handle.write('\n') + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, state_path) +except BaseException: + if os.path.exists(temporary): + os.unlink(temporary) + raise +os.chmod(state_path, 0o600) +PY + +drop_staged_token +rm -f "$BACKUP_CONFIG" +BACKUP_CONFIG='' +note 'Enrollment accepted and WireGuard is active. Device is ENROLLED; READY requires fresh local checks and central verification evidence.' + + + +#!/usr/bin/env bash +# Interactive wrapper: token input is accepted only through stdin by bf-enroll. +set -euo pipefail +exec "$(dirname "$0")/bf-enroll" --token-stdin "$@" + + + +#!/usr/bin/env bash +# +# bf-enrollment-status - read-only canonical Field OS lifecycle view. +# +# Lifecycle contract (docs/29-DEVICE-ENROLLMENT.md, provisioning/enrollment/README.md): +# +# PROVISIONED_OFFLINE local (offline) provisioning is complete. No internet, +# no central record and no WireGuard handshake is needed +# or claimed at this stage. +# ENROLLED central accepted the device, a WireGuard peer was +# assigned and monitoring/inventory/remote access +# configuration is applied (or being applied). +# READY local health plus every central channel (monitoring, +# remote, management) is verified. +# +# Transitions are forward-only and never skip a stage: +# (none) -> PROVISIONED_OFFLINE -> ENROLLED -> READY +# A missing stage, a backwards move, or READY without verified central +# evidence is reported as INVALID and exits non-zero (fail closed). +# +# State file: ${BF_STATE_FILE:-/var/lib/blueforce/state.json} +# mode 0600; fields phase, enrollment_status, fleet_status, device_id, +# provisioning_id. Unknown extra fields are preserved by writers and ignored +# here. +# +# Output vocabulary (stable, consumed by bf-status/bf-check-*): +# Lifecycle : PROVISIONED_OFFLINE | ENROLLED | READY | PENDING | INVALID +# Enrollment : PENDING | ENROLLED | COMPLETE +# Fleet : PENDING | NOT_READY | READY +# +# Exit status: 0 lifecycle valid, 1 missing/invalid state, 2 usage error. +# Never writes anything and never prints secrets. +# +set -euo pipefail + +STATE_FILE="${BF_STATE_FILE:-${STATE_DIR:-/var/lib/blueforce}/state.json}" +# Canonical lifecycle phases; the order in this list is the only legal order. +VALID_STATES='PROVISIONED_OFFLINE ENROLLED READY' +FIELD='all' + +usage() { + cat <<'EOF' +Usage: bf-enrollment-status [--field phase|enrollment|fleet] [--check] + +Print the canonical Field OS lifecycle state (read-only, no secrets). + +Options: + --field NAME print one bare value instead of the three-line report + (NAME is phase, enrollment or fleet) + --check accepted for symmetry with the installer modules; this + command never mutates anything + --help show this help + +Exit status: 0 valid lifecycle, 1 missing or contract-violating state, +2 usage error. + +Lifecycle vocabulary : PROVISIONED_OFFLINE | ENROLLED | READY | PENDING | INVALID +Enrollment vocabulary: PENDING | ENROLLED | COMPLETE +Fleet vocabulary : PENDING | NOT_READY | READY + +Forward-only transitions: PROVISIONED_OFFLINE -> ENROLLED -> READY. +EOF +} + +if [[ "${1:-}" == '--help' || "${1:-}" == '-h' ]]; then + usage + exit 0 +fi +while [[ $# -gt 0 ]]; do + case "$1" in + --field) + [[ $# -ge 2 ]] || { echo 'ERROR: --field needs a value' >&2; exit 2; } + FIELD="$2" + shift 2 + ;; + --check) + shift + ;; + *) + echo "ERROR: unknown argument: $1" >&2 + usage >&2 + exit 2 + ;; + esac +done +case "$FIELD" in + all|phase|enrollment|fleet) ;; + *) echo "ERROR: --field must be phase, enrollment or fleet (got: $FIELD)" >&2; exit 2 ;; +esac + +if [[ ! -r "$STATE_FILE" ]]; then + # No lifecycle state yet: the device has not completed offline provisioning. + if [[ "$FIELD" == 'all' ]]; then + printf 'Lifecycle: PENDING\nEnrollment: PENDING\nFleet: PENDING\n' + else + printf 'PENDING\n' + fi + exit 1 +fi + +python3 - "$STATE_FILE" "$FIELD" <<'PY' +import json +import os +import re +import stat +import sys + +path, field = sys.argv[1], sys.argv[2] +VALID_STATES = ('PROVISIONED_OFFLINE', 'ENROLLED', 'READY') +VALID_ENROLLMENT = ('PENDING', 'ENROLLED', 'COMPLETE') +VALID_FLEET = ('PENDING', 'NOT_READY', 'READY') +CHANNELS = ('monitoring', 'remote', 'management') +DEVICE_ID = re.compile(r'^BF-[0-9]{8}$') + + +def invalid(reason): + sys.stderr.write('INVALID: %s\n' % reason) + print('INVALID' if field != 'all' else 'Lifecycle: INVALID') + raise SystemExit(1) + + +try: + with open(path, encoding='utf-8') as handle: + state = json.load(handle) +except OSError as error: + invalid('state file is unreadable (%s)' % error.__class__.__name__) +except ValueError as error: + invalid('state file is not valid JSON (%s)' % error.__class__.__name__) +if not isinstance(state, dict): + invalid('state file is not a JSON object') + +phase = state.get('phase') +if phase not in VALID_STATES: + invalid('phase is missing or not one of %s' % ', '.join(VALID_STATES)) +enrollment = state.get('enrollment_status') +if enrollment not in VALID_ENROLLMENT: + invalid('enrollment_status is missing or not one of %s' % ', '.join(VALID_ENROLLMENT)) +fleet = state.get('fleet_status') +if fleet not in VALID_FLEET: + invalid('fleet_status is missing or not one of %s' % ', '.join(VALID_FLEET)) +device_id = state.get('device_id') +if not isinstance(device_id, str) or not DEVICE_ID.match(device_id): + invalid('device_id is missing or does not match BF-<8 digits>') +provisioning_id = state.get('provisioning_id') +if not isinstance(provisioning_id, str) or not provisioning_id or len(provisioning_id) > 128 \ + or any(character.isspace() for character in provisioning_id): + invalid('provisioning_id is missing or malformed') + + +def evidence_problem(record): + """Return a reason string when central verification evidence is unusable.""" + if not isinstance(record, dict): + return 'central_verification is missing' + if set(record) - {'status', 'verification_id', 'monitoring', 'remote', 'management'}: + return 'central_verification carries unexpected fields' + if not {'status', 'verification_id'}.issubset(record): + return 'central_verification is incomplete' + if record['status'] not in ('pending', 'verified'): + return 'central_verification.status is invalid' + if not isinstance(record['verification_id'], str) or not record['verification_id']: + return 'central_verification.verification_id is missing' + for name in CHANNELS: + item = record.get(name) + if not isinstance(item, dict) or set(item) != {'status', 'verification_id'}: + return 'central_verification.%s is missing or malformed' % name + if item['status'] not in ('pending', 'verified'): + return 'central_verification.%s.status is invalid' % name + if not isinstance(item['verification_id'], str) or not item['verification_id']: + return 'central_verification.%s.verification_id is missing' % name + return None + + +record = state.get('central_verification') +problem = evidence_problem(record) + +if phase == 'PROVISIONED_OFFLINE': + if enrollment != 'PENDING': + invalid('PROVISIONED_OFFLINE requires enrollment_status PENDING (got %s)' % enrollment) + if fleet == 'READY': + invalid('PROVISIONED_OFFLINE cannot be fleet READY: a stage was skipped') + if record is not None: + sys.stderr.write('WARN: central_verification is present before enrollment\n') +elif phase == 'ENROLLED': + if enrollment not in ('ENROLLED', 'COMPLETE'): + invalid('ENROLLED requires enrollment_status ENROLLED or COMPLETE (got %s)' % enrollment) + if fleet == 'READY': + invalid('ENROLLED cannot be fleet READY: fleet READY is recorded with phase READY') + if problem: + invalid(problem) +elif phase == 'READY': + if enrollment not in ('ENROLLED', 'COMPLETE'): + invalid('READY requires a completed enrollment (got %s)' % enrollment) + if fleet != 'READY': + invalid('READY requires fleet_status READY (got %s)' % fleet) + if problem: + invalid(problem) + pending = [name for name in CHANNELS if record[name]['status'] != 'verified'] + if record['status'] != 'verified' or pending: + invalid('READY requires verified central evidence for every channel') + +try: + mode = stat.S_IMODE(os.stat(path).st_mode) + if mode & 0o077: + sys.stderr.write('WARN: %s is mode %04o; the lifecycle contract requires 0600\n' % (path, mode)) +except OSError: + pass + +# Enrolment is reported as COMPLETE once READY is recorded: both facts come from +# the same forward-only transition chain. +enrollment_display = 'COMPLETE' if (phase == 'READY' or enrollment == 'COMPLETE') else enrollment +fleet_display = 'READY' if fleet == 'READY' else 'NOT READY' + +if field == 'phase': + print(phase) +elif field == 'enrollment': + print(enrollment_display) +elif field == 'fleet': + print(fleet_display) +else: + print('Lifecycle: ' + phase) + print('Enrollment: ' + enrollment_display) + print('Fleet: ' + fleet_display) +PY + + + +#!/usr/bin/env bash +# +# bf-hardware-inventory.sh - Scan field-terminal hardware and emit JSON + Markdown. +# +# Covers every field in docs/02-DEVICE-NAMING-AND-INVENTORY.md §9: +# Manufacturer/Model/Serial/BIOS/CPU/RAM/Disk/SMART/NIC/MAC/GPU/USB/ +# SerialPorts/Kernel/Arch/TPM/Virt/Temps. Missing probes report +# "unknown" instead of aborting. Never prints secrets, keys, or passwords. +# +# Install: install -m 0755 bf-hardware-inventory.sh /usr/local/bin/bf-hardware-inventory.sh +# Usage: bf-hardware-inventory.sh [--dealer-id ID] [--out-dir DIR] [--json] [--markdown] [--help] +# +set -euo pipefail + +DEALER_ID="" +OUT_DIR="" +MODE="both" # json | markdown | both + +usage() { + cat <<'EOF' +Usage: bf-hardware-inventory.sh [--dealer-id ID] [--out-dir DIR] [--json] [--markdown] [--help] + +Scan hardware and emit inventory (JSON for machines, Markdown for humans). + +Options: + --dealer-id ID 8-digit dealer number (validates ^[0-9]{8}$ when given) + --out-dir DIR Write BF-.json and BF-.md into DIR + (requires --dealer-id; default filenames use hostname) + --json Print only JSON to stdout + --markdown Print only Markdown to stdout + --help Show this help and exit + +Fields (doc 02 §9): Manufacturer, Model, Serial, BIOS, CPU, RAM, +Disk, SMART, NIC, MAC, GPU, USB, SerialPorts, Kernel, Arch, TPM, +Virt, Temps. Unavailable probes report "unknown". +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --dealer-id) DEALER_ID="${2:?missing value for --dealer-id}"; shift 2 ;; + --out-dir) OUT_DIR="${2:?missing value for --out-dir}"; shift 2 ;; + --json) MODE="json"; shift ;; + --markdown) MODE="markdown"; shift ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +if [[ -n "${DEALER_ID}" ]] && ! [[ "${DEALER_ID}" =~ ^[0-9]{8}$ ]]; then + echo "ERROR: --dealer-id must match ^[0-9]{8}$ (got: ${DEALER_ID})" >&2 + exit 2 +fi +if [[ -n "${OUT_DIR}" && -z "${DEALER_ID}" ]]; then + echo "ERROR: --out-dir requires --dealer-id" >&2 + exit 2 +fi + +set +e # probes must not abort the report + +HOST="$(hostname 2>/dev/null || echo unknown)" +if [[ -n "${DEALER_ID}" ]]; then + DEVICE_ID="BF-${DEALER_ID}" + LOWER_HOST="bf-${DEALER_ID}" +else + DEVICE_ID="$(echo "${HOST}" | tr '[:lower:]' '[:upper:]')" + LOWER_HOST="$(echo "${HOST}" | tr '[:upper:]' '[:lower:]')" +fi +NOW="$(date '+%Y-%m-%dT%H:%M:%S%z' 2>/dev/null || echo unknown)" + +json_escape() { # stdin -> JSON string body + python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || sed 's/"/\\"/g' | tr -d '\n' +} +val() { # $1 raw -> "unknown" fallback, no newlines + local v="$1" + v="$(echo "${v}" | head -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" + [[ -z "${v}" ]] && echo "unknown" || echo "${v}" +} + +# --- Probes (all fields from doc 02) --- +MANUFACTURER="$(val "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null || dmidecode -s system-manufacturer 2>/dev/null)")" +MODEL="$(val "$(cat /sys/class/dmi/id/product_name 2>/dev/null || dmidecode -s system-product-name 2>/dev/null)")" +SERIAL="$(val "$(cat /sys/class/dmi/id/product_serial 2>/dev/null || dmidecode -s system-serial-number 2>/dev/null)")" +BIOS_VENDOR="$(val "$(cat /sys/class/dmi/id/bios_vendor 2>/dev/null || dmidecode -s bios-vendor 2>/dev/null)")" +BIOS_VERSION="$(val "$(cat /sys/class/dmi/id/bios_version 2>/dev/null || dmidecode -s bios-version 2>/dev/null)")" +BIOS_DATE="$(val "$(cat /sys/class/dmi/id/bios_date 2>/dev/null || dmidecode -s bios-release-date 2>/dev/null)")" +CPU_MODEL="$(val "$(awk -F': ' '/^model name/ {print $2; exit}' /proc/cpuinfo 2>/dev/null || lscpu 2>/dev/null | awk -F': *' '/Model name/ {print $2; exit}')")" +CPU_CORES="$(val "$(nproc 2>/dev/null || grep -c '^processor' /proc/cpuinfo 2>/dev/null)")" +ARCH="$(val "$(uname -m 2>/dev/null)")" +KERNEL="$(val "$(uname -sr 2>/dev/null)")" +MEM_KB="$(awk '/MemTotal/ {print $2}' /proc/meminfo 2>/dev/null)" +MEMORY_MB="$([ -n "${MEM_KB}" ] && echo $((MEM_KB / 1024)) || echo "unknown")" +MEMORY_STR="$([ "${MEMORY_MB}" != "unknown" ] && echo "${MEMORY_MB} MB" || echo "unknown")" + +DISKS="$(lsblk -d -n -o NAME,SIZE,TYPE,ROTA 2>/dev/null || echo unknown)" +GPU="$(val "$(lspci 2>/dev/null | grep -iE 'vga|3d|display' | head -3 | sed 's/^[^:]*: //')")" +NIC_LIST="$(val "$(ls /sys/class/net 2>/dev/null | grep -v '^lo$' | tr '\n' ',' | sed 's/,$//')")" +MAC_LIST="$(val "$(for n in /sys/class/net/*; do [[ "$(basename "$n")" == lo ]] && continue; cat "$n/address" 2>/dev/null; done | tr '\n' ',' | sed 's/,$//')")" +USB_LIST="$(val "$(lsusb 2>/dev/null | head -20 || echo '')")" +SERIAL_PORTS="$(val "$(ls /dev/ttyS* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | tr '\n' ',' | sed 's/,$//')")" +TPM="$(val "$( ([ -c /dev/tpm0 ] && echo -n 'present (/dev/tpm0)') ; dmesg 2>/dev/null | grep -im1 'tpm' | head -1 | sed 's/^/ /')")" +VIRT="$(val "$(systemd-detect-virt 2>/dev/null || echo none)")" +TEMPS="$(val "$( (cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | head -5 | tr '\n' ' '); sensors 2>/dev/null | grep -iE 'core|temp|package' | head -5 | tr '\n' ';')")" + +SMART_SUMMARY="unknown" +if command -v smartctl >/dev/null 2>&1; then + SMART_SUMMARY="$(for dev in /dev/sd? /dev/nvme?n1; do + [[ -b "${dev}" ]] || continue + echo -n "${dev}: " + smartctl -H "${dev}" 2>/dev/null | grep -im1 'health\|result' | sed 's/^[[:space:]]*//' | head -1 + echo -n '; ' + done)" + SMART_SUMMARY="$(val "${SMART_SUMMARY}")" +else + SMART_SUMMARY="smartctl not installed" +fi + +OS_PRETTY="$(val "$(grep -E '^PRETTY_NAME=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"')")" + +E() { printf '%s' "$1" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || printf '%s' "$1"; } + +JSON="$(cat < "${OUT_DIR}/BF-${DEALER_ID}.json" + printf '%s\n' "${MD}" > "${OUT_DIR}/BF-${DEALER_ID}.md" + echo "wrote ${OUT_DIR}/BF-${DEALER_ID}.json ${OUT_DIR}/BF-${DEALER_ID}.md" + else + printf '%s\n\n%s\n' "${JSON}" "${MD}" + fi + ;; +esac + + + +#!/usr/bin/env bash +# Read-only Field OS hardware compatibility check. It does not install, wipe, or modify state. +# +# This script is itself the read-only "--check" gate of the Windows -> Field OS +# migration: it only reads /proc, /sys, lsblk, lsusb and (optionally) smartctl. +# No package is installed, no disk is written, no service or network state is +# touched. +# +# Checks and thresholds (verdict = worst single check): +# +# check SUPPORTED WARNING BLOCKED +# ------------ ------------------------------------- ---------------------------------------- --------------------------------- +# architecture x86_64 - any other value +# ram >= 4096 MiB 2048..4095 MiB < 2048 MiB +# disk at least one disk >= 64 GiB - no disk >= 64 GiB +# disk_type SSD (or mixed/unknown) only rotational disks (HDD) - +# smart smartctl reports PASSED smartctl missing / no readable result smartctl reports FAILED +# nic >= 1 non-loopback interface - no non-loopback interface +# nic_link >= 1 interface operstate up interface present but none up - +# serial /dev/ttyS*|ttyUSB*|ttyACM* present no serial device at all - +# usb lsusb returns devices lsusb unavailable/empty - +# boot_mode UEFI boot legacy BIOS boot - +# secure_boot enabled/disabled/not applicable UEFI but state unreadable - +# tpm TPM device present - - +# virt bare metal (virt = none) running inside a hypervisor - +# cpu_virt vmx/svm present no virtualization extensions exposed - +# +# A BLOCKED result means the host must not proceed to a migration install until +# reviewed. WARNING means LAB / peripheral acceptance work is still outstanding. +set -euo pipefail + +MODE="markdown" +usage() { + cat <<'EOF' +Usage: bf-live-hw-check [--json | --markdown] [--help] + +Evaluates the live host for Field OS baseline compatibility without changing the +host. Verdicts are SUPPORTED, WARNING, or BLOCKED. A BLOCKED result means the +host must not proceed to a migration install until reviewed. + +Checks: architecture, ram, disk, disk_type, smart, nic, nic_link, serial, usb, +boot_mode, secure_boot, tpm, virt, cpu_virt. The overall verdict is the worst +single check. Thresholds: + BLOCKED non-x86_64 | RAM < 2048 MiB | no disk >= 64 GiB | SMART FAILED | no NIC + WARNING RAM 2048-4095 MiB | HDD-only | smartctl missing | no NIC link up | + no serial device | no USB inventory | legacy BIOS | UEFI Secure Boot + state unreadable | hypervisor detected | no vmx/svm + SUPPORTED everything else; this is not a replacement for the doc 13 MEG + acceptance test. +EOF +} +while [[ $# -gt 0 ]]; do + case "$1" in + --json) MODE="json"; shift ;; + --markdown) MODE="markdown"; shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +clean() { tr '\n' ' ' | tr -s ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'; } +json_escape() { python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || sed 's/\\/\\\\/g;s/"/\\"/g'; } +status_rank() { case "$1" in SUPPORTED) echo 0;; WARNING) echo 1;; BLOCKED) echo 2;; esac; } + +ARCH="$(uname -m 2>/dev/null || printf unknown)" +RAM_MB="$(awk '/MemTotal:/ {print int($2 / 1024)}' /proc/meminfo 2>/dev/null || printf 0)" +DISK_LINES="$(lsblk -bdn -o NAME,SIZE,TYPE 2>/dev/null | awk '$3 == "disk" {print $1 ":" $2}' || true)" +DISK_COUNT="$(printf '%s\n' "$DISK_LINES" | awk 'NF {count++} END {print count+0}')" +LARGEST_DISK_BYTES="$(printf '%s\n' "$DISK_LINES" | awk -F: 'NF == 2 && $2 > max {max=$2} END {print max+0}')" +NIC_LIST="$(find /sys/class/net -mindepth 1 -maxdepth 1 -printf '%f\n' 2>/dev/null | grep -vx 'lo' | paste -sd, - || true)" +SERIAL_LIST="$({ compgen -G '/dev/ttyS*' || true; compgen -G '/dev/ttyUSB*' || true; compgen -G '/dev/ttyACM*' || true; } 2>/dev/null | paste -sd, - || true)" +USB_LIST="$(lsusb 2>/dev/null | head -20 | clean || true)" + +# --- architecture ----------------------------------------------------------- +ARCH_STATUS="SUPPORTED"; ARCH_NOTE="x86_64 architecture detected" +if [[ "$ARCH" != "x86_64" ]]; then ARCH_STATUS="BLOCKED"; ARCH_NOTE="Field OS baseline requires x86_64; detected $ARCH"; fi + +# --- ram -------------------------------------------------------------------- +RAM_STATUS="SUPPORTED"; RAM_NOTE="$RAM_MB MiB detected (minimum 4096 MiB)" +if (( RAM_MB < 2048 )); then RAM_STATUS="BLOCKED"; RAM_NOTE="$RAM_MB MiB detected; below 2048 MiB hard floor" +elif (( RAM_MB < 4096 )); then RAM_STATUS="WARNING"; RAM_NOTE="$RAM_MB MiB detected; below 4096 MiB baseline"; fi + +# --- disks ------------------------------------------------------------------ +DISK_STATUS="SUPPORTED"; DISK_NOTE="$DISK_COUNT disk(s), largest $((LARGEST_DISK_BYTES / 1024 / 1024 / 1024)) GiB (minimum 64 GiB)" +if (( DISK_COUNT == 0 || LARGEST_DISK_BYTES < 68719476736 )); then DISK_STATUS="BLOCKED"; DISK_NOTE="No disk at or above 64 GiB was detected"; fi + +# --- disk type (rotational vs solid state) ---------------------------------- +# loop/zram/sr pseudo-devices are excluded: they are not migration targets. +DISK_TYPE_LIST="$(lsblk -bdn -o NAME,ROTA 2>/dev/null | awk '$1 !~ /^(loop|zram|ram|sr|fd)/ {if ($2 == "0") printf "%s:ssd ", $1; else if ($2 == "1") printf "%s:hdd ", $1}' | clean || true)" +DISK_HDD_COUNT="$(printf '%s\n' "$DISK_TYPE_LIST" | tr ' ' '\n' | grep -c ':hdd$' || true)" +DISK_SSD_COUNT="$(printf '%s\n' "$DISK_TYPE_LIST" | tr ' ' '\n' | grep -c ':ssd$' || true)" +DISK_TYPE_STATUS="SUPPORTED" +if [[ -z "$DISK_TYPE_LIST" ]]; then + DISK_TYPE_NOTE="Rotational information unavailable; validate disk type in LAB" +elif (( DISK_HDD_COUNT > 0 && DISK_SSD_COUNT == 0 )); then + DISK_TYPE_STATUS="WARNING"; DISK_TYPE_NOTE="Only rotational disk(s) detected ($DISK_TYPE_LIST); SSD baseline expected for field durability" +elif (( DISK_HDD_COUNT > 0 )); then + DISK_TYPE_NOTE="Disk media: $DISK_TYPE_LIST(mixed: $DISK_HDD_COUNT hdd / $DISK_SSD_COUNT ssd)" +else + DISK_TYPE_NOTE="Disk media: $DISK_TYPE_LIST" +fi + +# --- smart health ----------------------------------------------------------- +SMART_STATUS="SUPPORTED"; SMART_NOTE="SMART health not reported" +if command -v smartctl >/dev/null 2>&1; then + SMART_RESULT="" + for device in /dev/sd? /dev/nvme?n1; do + [[ -b "$device" ]] || continue + health="$(smartctl -H "$device" 2>/dev/null | awk '/SMART overall-health|SMART Health Status/ {print; exit}' | clean || true)" + [[ -n "$health" ]] && SMART_RESULT="${SMART_RESULT}${device}: ${health}; " + done + if [[ -z "$SMART_RESULT" ]]; then + SMART_STATUS="WARNING"; SMART_NOTE="smartctl present but no disk reported a health result (unsupported device or permissions); validate in LAB" + elif grep -qiE 'FAILED|BAD' <<<"$SMART_RESULT"; then + SMART_STATUS="BLOCKED"; SMART_NOTE="Disk health FAILED: $(clean <<<"$SMART_RESULT")" + else + SMART_NOTE="SMART: $(clean <<<"$SMART_RESULT")" + fi +else + SMART_STATUS="WARNING"; SMART_NOTE="smartctl not installed; disk health unverified (install smartmontools or validate in LAB)" +fi + +# --- nic / link state ------------------------------------------------------- +NIC_STATUS="SUPPORTED"; NIC_NOTE="Network interfaces: ${NIC_LIST:-none}" +if [[ -z "$NIC_LIST" ]]; then NIC_STATUS="BLOCKED"; NIC_NOTE="No non-loopback network interface detected"; fi + +NIC_LINK_PHYSICAL="" +NIC_LINK_PHYSICAL_UP=0 +NIC_UP_COUNT=0 +VIRTUAL_IFACE_PATTERN='^(veth|br-|docker|virbr|vmnet|tun|tap|wg|zram|dummy|bond|vnet)' +for iface_path in /sys/class/net/*; do + [[ -d "$iface_path" ]] || continue + iface_name="$(basename "$iface_path")" + [[ "$iface_name" == "lo" ]] && continue + iface_state="$(cat "$iface_path/operstate" 2>/dev/null || printf unknown)" + [[ "$iface_state" == "up" ]] && NIC_UP_COUNT=$((NIC_UP_COUNT + 1)) + if [[ ! "$iface_name" =~ $VIRTUAL_IFACE_PATTERN ]]; then + NIC_LINK_PHYSICAL="${NIC_LINK_PHYSICAL}${iface_name}=${iface_state} " + [[ "$iface_state" == "up" ]] && NIC_LINK_PHYSICAL_UP=$((NIC_LINK_PHYSICAL_UP + 1)) + fi +done +NIC_LINK_DETAIL="$(clean <<<"$NIC_LINK_PHYSICAL")" +NIC_LINK_STATUS="SUPPORTED" +NIC_LINK_NOTE="Up: $NIC_UP_COUNT interface(s), physical: ${NIC_LINK_DETAIL:-none} (virtual interfaces excluded from the physical column)" +if [[ -n "$NIC_LIST" && $NIC_UP_COUNT -eq 0 ]]; then + NIC_LINK_STATUS="WARNING"; NIC_LINK_NOTE="Interfaces exist but none is up; check cabling/switch before migration" +elif [[ -n "$NIC_LIST" && $NIC_LINK_PHYSICAL_UP -eq 0 ]]; then + NIC_LINK_STATUS="WARNING"; NIC_LINK_NOTE="No physical interface is up (only virtual interfaces): ${NIC_LINK_DETAIL:-none}; check cabling/switch before migration" +fi + +# --- serial ports ----------------------------------------------------------- +SERIAL_STATUS="SUPPORTED"; SERIAL_NOTE="Serial interfaces: ${SERIAL_LIST:-none}" +if [[ -z "$SERIAL_LIST" ]]; then SERIAL_STATUS="WARNING"; SERIAL_NOTE="No serial interface detected; validate MEG peripheral path in LAB"; fi +if [[ -n "$SERIAL_LIST" && "$SERIAL_LIST" != *"ttyUSB"* && "$SERIAL_LIST" != *"ttyACM"* ]]; then + SERIAL_NOTE="$SERIAL_NOTE; no USB-serial adapter (ttyUSB/ttyACM) detected" +fi + +# --- usb -------------------------------------------------------------------- +USB_STATUS="SUPPORTED"; USB_NOTE="USB devices detected" +if [[ -z "$USB_LIST" ]]; then USB_STATUS="WARNING"; USB_NOTE="No USB inventory available (install nothing; validate USB peripherals manually)"; fi + +# --- boot mode -------------------------------------------------------------- +BOOT_MODE="bios" +[[ -d /sys/firmware/efi ]] && BOOT_MODE="uefi" +BOOT_STATUS="SUPPORTED" +if [[ "$BOOT_MODE" == "uefi" ]]; then BOOT_NOTE="UEFI boot detected"; else BOOT_STATUS="WARNING"; BOOT_NOTE="Legacy BIOS boot detected; confirm firmware mode and boot chain in LAB"; fi + +# --- secure boot ------------------------------------------------------------ +SECURE_BOOT="unknown" +if [[ "$BOOT_MODE" != "uefi" ]]; then + SECURE_BOOT="not-applicable" +else + sb_file="$(ls /sys/firmware/efi/efivars/SecureBoot-* 2>/dev/null | head -n 1 || true)" + if [[ -n "$sb_file" ]]; then + sb_byte="$(od -An -tu1 -j4 -N1 "$sb_file" 2>/dev/null | tr -d ' \n' || true)" + case "$sb_byte" in + 1) SECURE_BOOT="enabled" ;; + 0) SECURE_BOOT="disabled" ;; + esac + fi +fi +SECURE_BOOT_STATUS="SUPPORTED" +case "$SECURE_BOOT" in + enabled) SECURE_BOOT_NOTE="Secure Boot enabled; verify signed-boot chain with the Field OS medium in LAB" ;; + disabled) SECURE_BOOT_NOTE="Secure Boot disabled; acceptable for the baseline, record the state" ;; + not-applicable) SECURE_BOOT_NOTE="Not applicable (legacy BIOS boot)" ;; + *) SECURE_BOOT_STATUS="WARNING"; SECURE_BOOT_NOTE="Secure Boot state unreadable (root required for efivars); verify in firmware setup" ;; +esac + +# --- tpm -------------------------------------------------------------------- +TPM_STATUS="SUPPORTED" +if [[ -e /dev/tpm0 || -e /dev/tpmrm0 ]]; then + TPM_NOTE="TPM device present (inventory field; not a baseline requirement)" +else + TPM_NOTE="No TPM device detected (inventory field only; the baseline does not require a TPM)" +fi + +# --- virtualisation --------------------------------------------------------- +# systemd-detect-virt exits 1 on bare metal (prints "none"), hence "|| true". +VIRT_TYPE="$(systemd-detect-virt 2>/dev/null || true)" +VIRT_TYPE="$(clean <<<"$VIRT_TYPE")" +[[ -z "$VIRT_TYPE" ]] && VIRT_TYPE="unknown" +if [[ "$VIRT_TYPE" == "none" ]]; then + VIRT_STATUS="SUPPORTED"; VIRT_NOTE="Bare metal" +else + VIRT_STATUS="WARNING"; VIRT_NOTE="Running inside a hypervisor ($VIRT_TYPE); confirm this is the intended LAB/template host" +fi + +# --- cpu virtualization extensions ----------------------------------------- +if grep -qm1 -E '(^flags|^Features).*( vmx| svm)' /proc/cpuinfo 2>/dev/null; then + CPU_VIRT_STATUS="SUPPORTED"; CPU_VIRT_NOTE="CPU virtualization extensions exposed (vmx/svm)" +else + CPU_VIRT_STATUS="WARNING"; CPU_VIRT_NOTE="No vmx/svm flag exposed; QEMU/KVM LAB profiles need nested virtualization on the host" +fi + +OVERALL="SUPPORTED" +for current in "$ARCH_STATUS" "$RAM_STATUS" "$DISK_STATUS" "$DISK_TYPE_STATUS" "$SMART_STATUS" "$NIC_STATUS" "$NIC_LINK_STATUS" "$SERIAL_STATUS" "$USB_STATUS" "$BOOT_STATUS" "$SECURE_BOOT_STATUS" "$TPM_STATUS" "$VIRT_STATUS" "$CPU_VIRT_STATUS"; do + if (( $(status_rank "$current") > $(status_rank "$OVERALL") )); then OVERALL="$current"; fi +done + +if [[ "$MODE" == "json" ]]; then + cat </dev/null 2>&1 && printf 'smartctl present' || printf 'smartctl missing')","note":"$(printf '%s' "$SMART_NOTE" | json_escape)"}, + {"name":"nic","status":"$NIC_STATUS","value":"$(printf '%s' "${NIC_LIST:-none}" | json_escape)","note":"$(printf '%s' "$NIC_NOTE" | json_escape)"}, + {"name":"nic_link","status":"$NIC_LINK_STATUS","value":"$(printf '%s' "${NIC_LINK_DETAIL:-none}" | json_escape)","note":"$(printf '%s' "$NIC_LINK_NOTE" | json_escape)"}, + {"name":"serial","status":"$SERIAL_STATUS","value":"$(printf '%s' "${SERIAL_LIST:-none}" | json_escape)","note":"$(printf '%s' "$SERIAL_NOTE" | json_escape)"}, + {"name":"usb","status":"$USB_STATUS","value":"$(printf '%s' "${USB_LIST:-unavailable}" | json_escape)","note":"$(printf '%s' "$USB_NOTE" | json_escape)"}, + {"name":"boot_mode","status":"$BOOT_STATUS","value":"$BOOT_MODE","note":"$(printf '%s' "$BOOT_NOTE" | json_escape)"}, + {"name":"secure_boot","status":"$SECURE_BOOT_STATUS","value":"$SECURE_BOOT","note":"$(printf '%s' "$SECURE_BOOT_NOTE" | json_escape)"}, + {"name":"tpm","status":"$TPM_STATUS","value":"$(if [[ -e /dev/tpm0 || -e /dev/tpmrm0 ]]; then printf 'present'; else printf 'absent'; fi)","note":"$(printf '%s' "$TPM_NOTE" | json_escape)"}, + {"name":"virt","status":"$VIRT_STATUS","value":"$(printf '%s' "$VIRT_TYPE" | json_escape)","note":"$(printf '%s' "$VIRT_NOTE" | json_escape)"}, + {"name":"cpu_virt","status":"$CPU_VIRT_STATUS","value":"$(if [[ "$CPU_VIRT_STATUS" == "SUPPORTED" ]]; then printf 'vmx/svm'; else printf 'not exposed'; fi)","note":"$(printf '%s' "$CPU_VIRT_NOTE" | json_escape)"} + ] +} +EOF +else + cat </dev/null 2>&1 && printf 'smartctl var' || printf 'smartctl yok') | $SMART_NOTE | +| NIC | $NIC_STATUS | ${NIC_LIST:-none} | $NIC_NOTE | +| NIC link | $NIC_LINK_STATUS | ${NIC_LINK_DETAIL:-none} | $NIC_LINK_NOTE | +| Seri | $SERIAL_STATUS | ${SERIAL_LIST:-none} | $SERIAL_NOTE | +| USB | $USB_STATUS | ${USB_LIST:-unavailable} | $USB_NOTE | +| Boot modu | $BOOT_STATUS | $BOOT_MODE | $BOOT_NOTE | +| Secure Boot | $SECURE_BOOT_STATUS | $SECURE_BOOT | $SECURE_BOOT_NOTE | +| TPM | $TPM_STATUS | $(if [[ -e /dev/tpm0 || -e /dev/tpmrm0 ]]; then printf 'present'; else printf 'absent'; fi) | $TPM_NOTE | +| Sanallaştırma | $VIRT_STATUS | $VIRT_TYPE | $VIRT_NOTE | +| CPU virt. | $CPU_VIRT_STATUS | $(if [[ "$CPU_VIRT_STATUS" == "SUPPORTED" ]]; then printf 'vmx/svm'; else printf 'not exposed'; fi) | $CPU_VIRT_NOTE | + +## Eşikler + +| Kontrol | BLOCKED | WARNING | SUPPORTED | +|---|---|---|---| +| Mimari | x86_64 dışı | — | x86_64 | +| RAM | < 2048 MiB | 2048–4095 MiB | ≥ 4096 MiB | +| Disk | ≥ 64 GiB disk yok | — | ≥ 64 GiB disk var | +| Disk tipi | — | yalnız döner disk (HDD) | SSD veya karışık/bilinmiyor | +| Disk sağlığı | SMART FAILED | smartctl yok / sonuç okunamadı | SMART PASSED | +| NIC | non-loopback arayüz yok | — | ≥ 1 arayüz | +| NIC link | — | hiçbir arayüz UP değil | ≥ 1 arayüz UP | +| Seri | — | hiç seri aygıt yok | ttyS/ttyUSB/ttyACM var | +| USB | — | lsusb yok/boş | aygıt listesi var | +| Boot modu | — | Legacy BIOS | UEFI | +| Secure Boot | — | UEFI'de durum okunamadı | enabled/disabled/N/A | +| TPM | — | — | present/absent (envanter alanı) | +| Sanallaştırma | — | hypervisor içinde | bare metal | +| CPU virt. | — | vmx/svm yok | vmx/svm var | + +BLOCKED: geçiş kurulumu başlatma; donanımı gözden geçir. WARNING: LAB/periferik kabulü tamamla. SUPPORTED: bu kontrolün kapsamındaki temel eşikleri geçti; 13 numaralı kabulün yerine geçmez. +EOF +fi + + + +#!/usr/bin/env bash +# Print nonsecret release identity. Skeleton manifests are explicitly not deployable releases. +set -euo pipefail +if [[ -n "${BF_RELEASE_MANIFEST:-}" ]]; then MANIFEST="$BF_RELEASE_MANIFEST" +elif [[ -r /etc/blueforce/release-manifest.yaml ]]; then MANIFEST=/etc/blueforce/release-manifest.yaml +elif [[ -r /etc/blueforce-release ]]; then MANIFEST=/etc/blueforce-release +else MANIFEST="$(cd "$(dirname "$0")/../.." && pwd)/provisioning/release/manifest.yaml"; fi +[[ -r "$MANIFEST" ]] || { printf 'Field OS: unknown\nRelease status: UNKNOWN\nRelease commit: unknown\n'; exit 1; } +python3 - "$MANIFEST" <<'PY' +import sys +try: + import yaml + raw=open(sys.argv[1],encoding='utf-8').read() + data=yaml.safe_load(raw) or {} + if not isinstance(data,dict): + # Legacy /etc/blueforce-release may be a nonsecret KEY=VALUE identity file. + data={} + for line in raw.splitlines(): + if '=' in line: + key,value=line.split('=',1) + data[key.strip().lower()]=value.strip().strip('"') +except Exception: + print('Field OS: unknown'); print('Release status: INVALID_MANIFEST'); print('Release commit: unknown'); sys.exit(1) +r=data.get('release') if isinstance(data.get('release'),dict) else data +name=r.get('name') or r.get('release_id') or 'unknown' +version=r.get('version') or 'unknown' +status=str(r.get('status') or 'unknown').lower() +commit=r.get('commit') or r.get('installer_commit') or data.get('commit') or data.get('installer_commit') or 'unknown' +print(f'Field OS: {name} {version}') +if status == 'skeleton': + print('Release status: UNAPPROVED_SKELETON') + print(f'Release commit: {commit}') + sys.exit(1) +print('Release status: '+status.upper()) +print(f'Release commit: {commit}') +PY + + + +#!/usr/bin/env bash +# Independently verify remote, network, and central evidence; never trusts READY state. +set -euo pipefail +STATE_FILE="${BF_STATE_FILE:-/var/lib/blueforce/state.json}" +RUSTDESK_SYSTEM_CONFIG="${BF_RUSTDESK_SYSTEM_CONFIG:-/etc/rustdesk/RustDesk2.toml}" +RUSTDESK_USER_CONFIG="${BF_RUSTDESK_USER_CONFIG:-/home/blueforce/.config/RustDesk/RustDesk2.toml}" +MESH_CONFIG="${BF_MESH_CONFIG:-/etc/meshagent/meshagent.json}" +MAX_AGE="${BF_WG_HANDSHAKE_MAX_AGE:-180}" +CHECK_MODE=0 +[[ "${1:-}" == --check && $# -eq 1 ]] && CHECK_MODE=1 +[[ $# -eq 0 || "$CHECK_MODE" == 1 ]] || { echo 'Usage: bf-remote-status [--check]' >&2; exit 2; } +[[ "$MAX_AGE" =~ ^[1-9][0-9]*$ ]] || { echo 'BF_WG_HANDSHAKE_MAX_AGE must be positive seconds' >&2; exit 2; } +valid_endpoint() { [[ "$1" =~ ^[A-Za-z0-9][A-Za-z0-9.-]*(:[1-9][0-9]{0,4})?$ ]] && [[ "$1" != *example* && "$1" != *invalid* && "$1" != *'<'* && "$1" != *'>'* && "$1" != localhost* ]]; } +rustdesk_configured() { + local endpoint + endpoint="$(sed -n "s/^rendezvous-server = '\([^']*\)'$/\1/p" "$RUSTDESK_SYSTEM_CONFIG" 2>/dev/null | head -1)" + valid_endpoint "$endpoint" && grep -Fqx "relay-server = '$endpoint'" "$RUSTDESK_SYSTEM_CONFIG" && grep -Fqx "rendezvous-server = '$endpoint'" "$RUSTDESK_USER_CONFIG" && grep -Fqx "relay-server = '$endpoint'" "$RUSTDESK_USER_CONFIG" +} +wg_fresh() { wg show wg0 latest-handshakes 2>/dev/null | awk -v now="$(date +%s)" -v max="$MAX_AGE" '$2 > 0 && now-$2 <= max {ok=1} END {exit !ok}'; } +central_verified() { python3 - "$STATE_FILE" <<'PY' +import json,sys +try: + c=json.load(open(sys.argv[1],encoding='utf-8'))['central_verification'] + ok=(c.get('status')=='verified' and bool(c.get('verification_id')) and all(isinstance(c.get(n),dict) and c[n].get('status')=='verified' and bool(c[n].get('verification_id')) for n in ('monitoring','remote','management'))) + raise SystemExit(0 if ok else 1) +except Exception: raise SystemExit(1) +PY +} +fail=0 +systemctl is-enabled --quiet xrdp 2>/dev/null && systemctl is-active --quiet xrdp 2>/dev/null && systemctl is-enabled --quiet xrdp-sesman 2>/dev/null && systemctl is-active --quiet xrdp-sesman 2>/dev/null && xrdp='enabled-active' || { xrdp='not-ready'; fail=1; } +dpkg-query -W -f='${Status}' rustdesk 2>/dev/null | grep -q 'install ok installed' && rustdesk_configured && rustdesk='configured' || { rustdesk='not-ready'; fail=1; } +wg_fresh && wireguard='fresh-handshake' || { wireguard='not-ready'; fail=1; } +if [[ -e "$MESH_CONFIG" ]]; then systemctl is-enabled --quiet meshagent 2>/dev/null && systemctl is-active --quiet meshagent 2>/dev/null && mesh='configured-active' || { mesh='not-ready'; fail=1; }; else mesh='not-configured'; fi +central_verified && central='verified' || { central='PENDING'; fail=1; } +printf 'xRDP: %s\nRustDesk: %s\nWireGuard: %s\nMesh: %s\nCentral verification: %s\n' "$xrdp" "$rustdesk" "$wireguard" "$mesh" "$central" +[[ "$fail" -eq 0 ]] + + + +#!/usr/bin/env bash +# +# bf-status - Quick health glance for a Blueforce field terminal. +# +# Output contract: docs/14-MONITORING-AND-HEALTH.md ("bf-status ornek ciktisi") +# for the health block, plus the Field OS lifecycle block defined by +# docs/29-DEVICE-ENROLLMENT.md and provisioning/enrollment/README.md: +# +# Provisioning : PROVISIONED_OFFLINE | COMPLETE +# Enrollment : PENDING | ENROLLED | COMPLETE +# Fleet State : NOT READY | READY +# +# The lifecycle block is derived read-only from /var/lib/blueforce/state.json +# (override with BF_STATE_FILE). A missing state file shows PENDING, and a +# contract-violating state (skipped stage, backwards move, READY without +# verified central evidence) shows INVALID and counts as a critical alert. +# Never prints secrets, keys, or passwords. +# +# Install: install -m 0755 bf-status /usr/local/bin/bf-status +# Usage: bf-status [--help] +# +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: bf-status [--help] + +Print the BLUEFORCE FIELD TERMINAL health summary: the Field OS lifecycle +block (docs/29) followed by the 16-line health block (docs/14). + +Lifecycle vocabulary: + Provisioning : PROVISIONED_OFFLINE | COMPLETE | PENDING + Enrollment : PENDING | ENROLLED | COMPLETE + Fleet State : NOT READY | READY + +Options: + --help Show this help and exit + +Exit status is always 0; individual failing probes report DOWN/UNKNOWN +inline instead of aborting the report. +EOF +} + +if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then + usage + exit 0 +elif [[ $# -gt 0 ]]; then + echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 +fi + +# Never abort the report on a failing probe. +set +e + +HOST="$(hostname 2>/dev/null || echo unknown)" +DEVICE_ID="$(echo "${HOST}" | tr '[:lower:]' '[:upper:]')" +NOW="$(date '+%Y-%m-%d %H:%M %z' 2>/dev/null || echo unknown)" +OVERALL="OK" + +uptime_str() { + uptime -p 2>/dev/null | sed 's/^up //' || echo unknown +} +load_str() { + awk '{print $1, $2, $3}' /proc/loadavg 2>/dev/null || echo "unknown" +} +cpu_pct() { + # 1-second sample from /proc/stat. + read -r _ a b c d e f g h i j < /proc/stat 2>/dev/null || { echo "?"; return; } + idle1=$((d + e)); total1=$((a+b+c+d+e+f+g+h+i+j)) + sleep 1 + read -r _ a b c d e f g h i j < /proc/stat 2>/dev/null || { echo "?"; return; } + idle2=$((d + e)); total2=$((a+b+c+d+e+f+g+h+i+j)) + dt=$((total2 - total1)); di=$((idle2 - idle1)) + if [[ "${dt}" -le 0 ]]; then echo "?"; else echo $(( (100 * (dt - di)) / dt )); fi +} +mem_str() { + local avail total + avail="$(awk '/MemAvailable/ {print $2}' /proc/meminfo 2>/dev/null)" + total="$(awk '/MemTotal/ {print $2}' /proc/meminfo 2>/dev/null)" + if [[ -n "${avail}" && -n "${total}" && "${total}" -gt 0 ]]; then + local used=$((total - avail)) + local pct=$((100 * used / total)) + printf '%s/%sG (%s%%)' \ + "$(awk -v v="${used}" 'BEGIN{printf "%.1f", v/1048576}')" \ + "$(awk -v v="${total}" 'BEGIN{printf "%.1f", v/1048576}')" \ + "${pct}" + else + echo "unknown" + fi +} +disk_str() { + df -BG / 2>/dev/null | awk 'NR==2 {gsub(/G/,"",$2); gsub(/G/,"",$3); gsub(/%/,"",$5); printf "%s/%sG (%s%%)", $3, $2, $5}' || echo "unknown" +} +svc_state() { # $1 = unit + if ! command -v systemctl >/dev/null 2>&1; then echo "UNKNOWN"; return; fi + if systemctl is-active --quiet "$1" 2>/dev/null; then echo "OK"; return; fi + if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^$1"; then echo "DOWN"; else echo "OFF"; fi +} +wg_info() { + if ! command -v wg >/dev/null 2>&1; then echo "wg0 MISSING (no wg tool)"; return; fi + if ! ip link show wg0 >/dev/null 2>&1; then echo "wg0 DOWN (no interface)"; return; fi + local hs + hs="$(wg show wg0 latest-handshakes 2>/dev/null | awk '{print $2}' | head -1)" + if [[ -z "${hs}" || "${hs}" == "0" ]]; then echo "wg0 UP, no handshake yet"; return; fi + local now ago + now="$(date +%s)"; ago=$((now - hs)) + echo "wg0 UP, handshake ${ago}s ago" +} +net_counters() { + local rx=0 tx=0 f + for f in /sys/class/net/*/statistics/rx_bytes; do rx=$((rx + $(cat "$f" 2>/dev/null || echo 0))); done + for f in /sys/class/net/*/statistics/tx_bytes; do tx=$((tx + $(cat "$f" 2>/dev/null || echo 0))); done + echo "rx $(numfmt --to=iec "$rx" 2>/dev/null || echo "$rx") tx $(numfmt --to=iec "$tx" 2>/dev/null || echo "$tx")" +} +docker_info() { + if ! command -v docker >/dev/null 2>&1; then echo "daemon MISSING"; return; fi + if docker info >/dev/null 2>&1; then echo "daemon UP"; else echo "daemon DOWN"; fi +} +meg_info() { + # MEG container name convention: meg-* ; report first match. + if ! command -v docker >/dev/null 2>&1 || ! docker info >/dev/null 2>&1; then echo "meg:unknown (docker down)"; return; fi + local line + line="$(docker ps --format '{{.Names}} {{.Status}} {{.RestartCount}}' 2>/dev/null | grep -i '^meg' | head -1)" + if [[ -z "${line}" ]]; then echo "meg NOT RUNNING"; return; fi + echo "${line}" +} +meg_last_success() { + local f="/var/lib/blueforce/meg_last_success" + if [[ -f "${f}" ]]; then + local ts now + ts="$(cat "${f}" 2>/dev/null | tr -d '[:space:]')" + now="$(date +%s)" + if [[ "${ts}" =~ ^[0-9]+$ ]]; then echo "UP, last success $((now - ts))s ago"; else echo "UP, last success unknown"; fi + else + echo "unknown (no timestamp file)" + fi +} +unattended_state() { + local masked="no" cfg="unknown" + if systemctl is-enabled apt-daily.timer 2>/dev/null | grep -q masked; then masked="yes"; fi + if grep -Eq '"0"' /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null; then cfg="0"; fi + if [[ "${masked}" == "yes" && "${cfg}" == "0" ]]; then echo "DISABLED (timer masked)"; else echo "CHECK (timer/cfg drift)"; fi +} +ufw_str() { + if ! command -v ufw >/dev/null 2>&1; then echo "ufw not installed"; return; fi + if ufw status 2>/dev/null | head -1 | grep -qi active; then echo "active, default DENY in | 22/3389 wg0-only"; else echo "INACTIVE"; fi +} +gui_str() { + local target sessions="0" + target="$(systemctl get-default 2>/dev/null || echo unknown)" + if ss -ltn 2>/dev/null | grep -q ':3389 '; then sessions="$(ss -tn state established '( dport = :3389 or sport = :3389 )' 2>/dev/null | tail -n +2 | wc -l | tr -d ' ')"; fi + if [[ "${target}" == "graphical.target" ]]; then echo "ON (graphical) | rdp sessions: ${sessions}"; else echo "OFF (multi-user) | rdp sessions: ${sessions}"; fi +} +kuma_str() { + local f="/var/lib/blueforce/kuma_last_push" + if [[ -f "${f}" ]]; then + local ts now + ts="$(cat "${f}" 2>/dev/null | tr -d '[:space:]')" + now="$(date +%s)" + if [[ "${ts}" =~ ^[0-9]+$ ]]; then echo "OK $((now - ts))s ago"; else echo "unknown"; fi + else + echo "unknown (no push record)" + fi +} +scrape_str() { + local f="/var/lib/node_exporter/textfile/last_scrape" + if [[ -f "${f}" ]]; then echo "OK ($(cat "${f}" 2>/dev/null | tr -d '[:space:]'))"; else echo "unknown"; fi +} +rustdesk_str() { + if pgrep -x rustdesk >/dev/null 2>&1 || systemctl is-active --quiet rustdesk 2>/dev/null; then echo "online"; else echo "offline"; fi +} +mesh_str() { + if pgrep -i meshcentral >/dev/null 2>&1 || systemctl is-active --quiet meshagent 2>/dev/null; then echo "online"; else echo "offline"; fi +} +boot_str() { + local b + b="$(who -b 2>/dev/null | awk '{print $3, $4}' || echo unknown)" + echo "${b} (power-loss recovery OK)" +} +alerts_str() { + # Warning heuristic: disk use > 80% counts one warning. + # A lifecycle state that violates the forward-only contract is critical. + local pct + if [[ "${LIFECYCLE_INVALID:-0}" -eq 1 ]]; then + echo '1 critical, 0 warning (lifecycle state invalid)' + return + fi + pct="$(df / 2>/dev/null | awk 'NR==2 {gsub(/%/,"",$5); print $5}')" + if [[ -n "${pct}" && "${pct}" -ge 90 ]] 2>/dev/null; then echo "1 critical, 0 warning (disk ${pct}%)"; + elif [[ -n "${pct}" && "${pct}" -ge 80 ]] 2>/dev/null; then echo "0 critical, 1 warning (disk trend)"; + else echo "0 critical, 0 warning"; fi +} + +DOCKER_SVC="$(svc_state docker)" +WG_SVC="$(svc_state "wg-quick@wg0")" +XRDP_SVC="$(svc_state xrdp)" +NODE_SVC="$(svc_state node_exporter)" + +FIELD_STATE_FILE="${BF_STATE_FILE:-/var/lib/blueforce/state.json}" +LIFECYCLE_PHASE='PENDING' +LIFECYCLE_PROVISIONING='PENDING' +LIFECYCLE_ENROLLMENT='PENDING' +LIFECYCLE_FLEET='NOT READY' +LIFECYCLE_INVALID=0 +# Lifecycle vocabulary is fixed by docs/29; values are never upgraded locally: +# only bf-enroll (ENROLLED) and the final install gate (READY) may advance them. +read_lifecycle() { + local out lifecycle enrollment fleet + out="$("$(dirname "$0")/bf-enrollment-status" 2>/dev/null)" || true + lifecycle="$(printf '%s\n' "$out" | sed -n 's/^Lifecycle: //p')" + enrollment="$(printf '%s\n' "$out" | sed -n 's/^Enrollment: //p')" + fleet="$(printf '%s\n' "$out" | sed -n 's/^Fleet: //p')" + case "$lifecycle" in + PROVISIONED_OFFLINE) LIFECYCLE_PHASE='PROVISIONED_OFFLINE'; LIFECYCLE_PROVISIONING='PROVISIONED_OFFLINE' ;; + ENROLLED) LIFECYCLE_PHASE='ENROLLED'; LIFECYCLE_PROVISIONING='COMPLETE' ;; + READY) LIFECYCLE_PHASE='READY'; LIFECYCLE_PROVISIONING='COMPLETE' ;; + INVALID) LIFECYCLE_PHASE='INVALID'; LIFECYCLE_PROVISIONING='PENDING'; LIFECYCLE_INVALID=1 ;; + *) LIFECYCLE_PHASE='PENDING'; LIFECYCLE_PROVISIONING='PENDING' ;; + esac + case "$enrollment" in + PENDING|ENROLLED|COMPLETE) LIFECYCLE_ENROLLMENT="$enrollment" ;; + *) LIFECYCLE_ENROLLMENT='PENDING' ;; + esac + case "$fleet" in + READY) LIFECYCLE_FLEET='READY' ;; + *) LIFECYCLE_FLEET='NOT READY' ;; + esac +} +release_commit() { git -C "$(cd "$(dirname "$0")/../.." && pwd)" rev-parse --short HEAD 2>/dev/null || echo unknown; } + +release_info() { "$(dirname "$0")/bf-release" 2>&1 || true; } + +read_lifecycle +[[ "$LIFECYCLE_INVALID" -eq 1 ]] && OVERALL='WARN' +printf 'Field OS lifecycle: %s | Release: %s\n' "$LIFECYCLE_PHASE" "$(release_info | paste -sd ';' -)" +printf 'Provisioning : %s\n' "$LIFECYCLE_PROVISIONING" +printf 'Enrollment : %s\n' "$LIFECYCLE_ENROLLMENT" +printf 'Fleet State : %s\n' "$LIFECYCLE_FLEET" +printf '%s %s %s\n' "${DEVICE_ID}" "${NOW}" "${OVERALL}" +printf 'uptime: %s | load: %s\n' "$(uptime_str)" "$(load_str)" +printf 'cpu: %s%% | mem: %s | disk /: %s\n' "$(cpu_pct)" "$(mem_str)" "$(disk_str)" +printf 'net: %s | %s\n' "$(wg_info)" "$(net_counters)" +printf 'docker: %s | %s\n' "$(docker_info)" "$(meg_info)" +printf 'meg: %s\n' "$(meg_last_success)" +printf 'systemd: docker %s | wg-quick@wg0 %s | xrdp %s | node_exporter %s\n' "${DOCKER_SVC}" "${WG_SVC}" "${XRDP_SVC}" "${NODE_SVC}" +printf 'unattended-upgrades: %s\n' "$(unattended_state)" +printf 'ufw: %s\n' "$(ufw_str)" +printf 'gui: %s\n' "$(gui_str)" +printf 'kuma push: %s | prometheus scrape: %s\n' "$(kuma_str)" "$(scrape_str)" +printf 'rustdesk: %s | meshcentral: %s\n' "$(rustdesk_str)" "$(mesh_str)" +printf 'boot: %s\n' "$(boot_str)" +printf 'alerts: %s\n' "$(alerts_str)" +printf 'next: support bundle: bf-support-bundle\n' + + + +#!/usr/bin/env bash +# +# bf-support-bundle - Collect a secret-free support tarball for a Blueforce field terminal. +# +# Gathers bf-status + bf-diagnostics output, journal tail, textfile collectors +# and basic system facts into a tar.gz. Files matching secret patterns +# (*.key, *secret*, password material, private keys) are NEVER included, +# and key-like values in captured command output are redacted. +# A manifest.txt inside the bundle lists every file + collection time. +# +# Output contract: docs/14-MONITORING-AND-HEALTH.md ("bf-support-bundle ... +# secret ... ASLA pakete girmez"). +# +# Install: install -m 0755 bf-support-bundle /usr/local/bin/bf-support-bundle +# Usage: bf-support-bundle [--out-dir DIR] [--help] +# +set -euo pipefail + +OUT_DIR="/var/tmp" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() { + cat <<'EOF' +Usage: bf-support-bundle [--out-dir DIR] [--help] + +Collect a secret-free support bundle (tar.gz with manifest.txt). + +Options: + --out-dir DIR Directory for the tarball (default: /var/tmp) + --help Show this help and exit + +Excluded (never packaged): + *.key, *secret*, *password*, *passwd*, *private*, + *id_rsa*, *id_ed25519*, *.pem, WireGuard private keys, + RustDesk passwords, SSH private keys. + +Manifest: + manifest.txt inside the tarball lists each file, byte size, + collection timestamp, and the exclusion patterns applied. +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --out-dir) OUT_DIR="${2:?missing value for --out-dir}"; shift 2 ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +HOST="$(hostname 2>/dev/null || echo unknown)" +STAMP="$(date '+%Y%m%d-%H%M%S' 2>/dev/null || echo unknown)" +WORK="$(mktemp -d)" +trap 'rm -rf "${WORK}"' EXIT + +BUNDLE_NAME="blueforce-support-${HOST}-${STAMP}" +STAGE="${WORK}/${BUNDLE_NAME}" +mkdir -p "${STAGE}" + +log() { echo "[bf-support-bundle] $*" >&2; } + +# Exclude patterns: filename-level, applied to every copy step and tar. +EXCLUDE_PATTERNS=( + '*.key' '*secret*' '*password*' '*passwd*' '*private*' + '*id_rsa*' '*id_ed25519*' '*.pem' '*.p12' '*.pfx' +) +is_excluded() { # $1 = basename + local base="$1" pat + for pat in "${EXCLUDE_PATTERNS[@]}"; do + # shellcheck disable=SC2053 + [[ "${base}" == ${pat} ]] && return 0 + done + return 1 +} + +redact() { # stdin -> stdout: mask key-like values + sed -E \ + -e 's/(private-key|public-key|preshared-key)([[:space:]]*[:=][[:space:]]*).*/\1\2/I' \ + -e 's/(password|passwd|secret|token)([[:space:]]*[:=][[:space:]]*)[^[:space:]]+/\1\2/I' +} + +collect_cmd() { # $1 = outfile, $@ = command + local out="$1"; shift + { "$@" 2>&1 || echo "(command failed: $*)"; } | redact > "${out}" || true +} + +log "collecting into ${STAGE}" + +collect_cmd "${STAGE}/bf-status.txt" "${SCRIPT_DIR}/bf-status" || true +if [[ -x "${SCRIPT_DIR}/bf-diagnostics" ]]; then + collect_cmd "${STAGE}/bf-diagnostics.txt" "${SCRIPT_DIR}/bf-diagnostics" || true +fi +collect_cmd "${STAGE}/system.txt" bash -c 'hostname; uptime; uname -a; systemctl get-default 2>/dev/null || echo "target: unknown"' +collect_cmd "${STAGE}/disk-df.txt" bash -c 'df -h / /var 2>/dev/null; echo ---; df -i / /var 2>/dev/null' +collect_cmd "${STAGE}/sockets.txt" bash -c 'ss -ltnp 2>/dev/null || ss -ltn 2>/dev/null || echo "ss not available"' +collect_cmd "${STAGE}/failed-units.txt" bash -c 'systemctl --failed --no-pager 2>/dev/null || echo "no failed units"' + +if command -v journalctl >/dev/null 2>&1; then + journalctl --since "24 hours ago" -p err --no-pager -o short 2>/dev/null | redact | tail -200 > "${STAGE}/journal-err-24h.txt" || echo "no journal access" > "${STAGE}/journal-err-24h.txt" +else + echo "journalctl not available." > "${STAGE}/journal-err-24h.txt" +fi + +if command -v wg >/dev/null 2>&1; then + { wg show 2>/dev/null | redact || echo "no WireGuard interfaces"; echo "--- latest handshakes ---"; wg show all latest-handshakes 2>/dev/null || echo "no handshake data"; } > "${STAGE}/wireguard.txt" || true +else + echo "wg tool not installed." > "${STAGE}/wireguard.txt" +fi + +# Textfile collectors: copy *.prom only, never anything matching excludes. +mkdir -p "${STAGE}/textfile" +if [[ -d /var/lib/node_exporter/textfile ]]; then + while IFS= read -r -d '' f; do + base="$(basename "${f}")" + if is_excluded "${base}"; then + log "skipping excluded file: ${base}" + continue + fi + cp "${f}" "${STAGE}/textfile/${base}" 2>/dev/null || true + done < <(find /var/lib/node_exporter/textfile -maxdepth 1 -name '*.prom' -type f -print0 2>/dev/null || true) + if [[ -z "$(ls -A "${STAGE}/textfile" 2>/dev/null)" ]]; then + echo "textfile dir empty." > "${STAGE}/textfile/README.txt" + fi +else + echo "textfile dir missing." > "${STAGE}/textfile/README.txt" +fi + +# Manifest: file list + sizes + timestamp + exclusion rules. +{ + echo "blueforce support bundle manifest" + echo "host: ${HOST}" + echo "collected_at: $(date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || echo unknown)" + echo "generator: bf-support-bundle" + echo "excluded_patterns: ${EXCLUDE_PATTERNS[*]}" + echo "note: secrets, private keys and passwords are never included; key-like values redacted." + echo "" + echo "files:" + ( cd "${STAGE}" && find . -type f -printf '%p %s bytes\n' 2>/dev/null | sort ) || ( cd "${STAGE}" && find . -type f -exec wc -c {} + | sort ) +} > "${STAGE}/manifest.txt" + +mkdir -p "${OUT_DIR}" +TARBALL="${OUT_DIR}/${BUNDLE_NAME}.tar.gz" +tar --sort=name --mtime='UTC 2020-01-01' \ + --exclude='*.key' --exclude='*secret*' --exclude='*password*' \ + --exclude='*passwd*' --exclude='*private*' \ + --exclude='*id_rsa*' --exclude='*id_ed25519*' --exclude='*.pem' \ + -czf "${TARBALL}" -C "${WORK}" "${BUNDLE_NAME}" + +log "wrote ${TARBALL}" +echo "${TARBALL}" + + + +#!/usr/bin/env bash +# Base APT sources, disable unattended-upgrades, set timezone. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="02-system" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +# shellcheck source=../offline-apt.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/offline-apt.sh" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [02-system] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +TIMEZONE="${TIMEZONE:-Europe/Istanbul}" +BASE_PKGS="curl wget ca-certificates gnupg lsb-release" + +check_state() { + local ok=1 + for p in $BASE_PKGS; do dpkg -s "$p" >/dev/null 2>&1 || { echo "missing package: $p"; ok=0; }; done + grep -q '^APT::Periodic::Update-Package-Lists "0"' /etc/apt/apt.conf.d/20auto-upgrades 2>/dev/null || { echo "20auto-upgrades not locked"; ok=0; } + for t in apt-daily.service apt-daily.timer apt-daily-upgrade.timer; do + systemctl is-enabled "$t" 2>/dev/null | grep -q "masked" || { echo "timer not masked: $t"; ok=0; } + done + [[ "$(cat /etc/timezone 2>/dev/null || timedatectl show -p Timezone --value 2>/dev/null)" == "$TIMEZONE" ]] || { echo "timezone not $TIMEZONE"; ok=0; } + return $((1 - ok)) +} + +if [[ "$CHECK_MODE" -eq 1 ]]; then + if check_state; then log "OK(check): system baseline matches"; else log "FAIL(check): system baseline drift"; exit 1; fi + exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive +bf_apt update +# shellcheck disable=SC2086 +bf_apt_install $BASE_PKGS + +# Lock automatic updates OFF (fleet policy: no unapproved updates). +printf 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";\n' > /tmp/20auto-upgrades.bf +mv /tmp/20auto-upgrades.bf /etc/apt/apt.conf.d/20auto-upgrades +for t in apt-daily.service apt-daily.timer apt-daily-upgrade.timer apt-daily-upgrade.service; do + systemctl mask "$t" >/dev/null 2>&1 || true +done + +if command -v timedatectl >/dev/null 2>&1; then + timedatectl set-timezone "$TIMEZONE" || echo "$TIMEZONE" > /etc/timezone +else + echo "$TIMEZONE" > /etc/timezone +fi +log "OK: base packages installed, unattended-upgrades disabled, timezone $TIMEZONE" + + + +#!/usr/bin/env bash +# Blueforce maintenance user, restricted sudoers, mandatory administrator key. +set -euo pipefail +MODULE="03-user" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +SUDOERS_FILE="/etc/sudoers.d/blueforce" +AUTHORIZED_KEYS="/home/blueforce/.ssh/authorized_keys" +BF_ADMIN_PUBLIC_KEY="${BF_ADMIN_PUBLIC_KEY:-}" +BF_ADMIN_PUBLIC_KEY_FILE="${BF_ADMIN_PUBLIC_KEY_FILE:-}" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [03-user] $1" | tee -a "$LOG_FILE"; } +valid_key_file() { [[ -s "$AUTHORIZED_KEYS" ]] && ssh-keygen -l -f "$AUTHORIZED_KEYS" >/dev/null 2>&1; } +load_admin_key() { + [[ -z "$BF_ADMIN_PUBLIC_KEY" && -n "$BF_ADMIN_PUBLIC_KEY_FILE" && -r "$BF_ADMIN_PUBLIC_KEY_FILE" ]] || { log "FAIL: a seed-provided BF_ADMIN_PUBLIC_KEY_FILE is required; inline keys are refused"; return 1; } + [[ "$(stat -c '%U:%a' "$BF_ADMIN_PUBLIC_KEY_FILE")" =~ ^root:6[04]0$ ]] || { log "FAIL: administrator key file must be root-owned and not group/world writable"; return 1; } + grep -qE '^(ssh-(ed25519|rsa|ecdsa)|sk-ssh-ed25519)' "$BF_ADMIN_PUBLIC_KEY_FILE" && ! grep -q 'PRIVATE KEY' "$BF_ADMIN_PUBLIC_KEY_FILE" || { log "FAIL: administrator key file must contain a public SSH key only"; return 1; } + cat "$BF_ADMIN_PUBLIC_KEY_FILE" +} +if [[ "$CHECK_MODE" -eq 1 ]]; then + id blueforce >/dev/null 2>&1 || { log "FAIL(check): user blueforce missing"; exit 1; } + [[ -f "$SUDOERS_FILE" ]] && visudo -cf "$SUDOERS_FILE" >/dev/null 2>&1 || { log "FAIL(check): sudoers invalid"; exit 1; } + valid_key_file || { log "FAIL(check): authorized_keys is empty or invalid"; exit 1; } + log "OK(check): user, sudoers, and a valid administrator key are present"; exit 0 +fi +key_data="$(load_admin_key)" || exit 1 +[[ -n "${key_data//[[:space:]]/}" ]] || { log "FAIL: administrator key is empty"; exit 1; } +tmp_key="$(mktemp)"; trap 'rm -f "$tmp_key"' EXIT +printf '%s\n' "$key_data" > "$tmp_key" +ssh-keygen -l -f "$tmp_key" >/dev/null 2>&1 || { log "FAIL: supplied administrator public key is invalid"; exit 1; } +if ! id blueforce >/dev/null 2>&1; then useradd -m -s /bin/bash blueforce; fi +passwd -l blueforce >/dev/null 2>&1 || true +install -d -m 700 -o blueforce -g blueforce /home/blueforce/.ssh +install -m 600 -o blueforce -g blueforce "$tmp_key" "$AUTHORIZED_KEYS" +valid_key_file || { log "FAIL: atomic authorized_keys install did not validate"; exit 1; } +cat > /tmp/blueforce.sudoers <<'EOF' +# Managed by blueforce-installer (03-user). Local edits will be overwritten. +blueforce ALL=(root) NOPASSWD: /usr/local/bin/bf-status, /usr/local/bin/bf-gui-on, /usr/local/bin/bf-gui-off, /bin/systemctl status *, /bin/systemctl is-active *, /bin/systemctl is-enabled *, /usr/bin/docker ps, /usr/bin/docker logs * +EOF +visudo -cf /tmp/blueforce.sudoers +install -m 440 /tmp/blueforce.sudoers "$SUDOERS_FILE" +log "OK: user blueforce has a validated administrator key and restricted sudoers" + + + +#!/usr/bin/env bash +# Set hostname bf- from validated dealer number. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="04-hostname" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [04-hostname] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +[[ -n "$DEALER_ID" ]] || { log "FAIL: DEALER_ID env is empty"; echo "FAIL: DEALER_ID env is empty" >&2; exit 1; } +[[ "$DEALER_ID" =~ ^[0-9]{8}$ ]] || { log "FAIL: bad DEALER_ID format: $DEALER_ID"; echo "FAIL: bad DEALER_ID" >&2; exit 1; } +TARGET="bf-${DEALER_ID}" + +if [[ "$CHECK_MODE" -eq 1 ]]; then + [[ "$(hostname)" == "$TARGET" ]] || { log "FAIL(check): hostname is $(hostname), want $TARGET"; exit 1; } + log "OK(check): hostname is $TARGET" + exit 0 +fi + +if [[ "$(hostname)" == "$TARGET" ]]; then + log "hostname already $TARGET, keeping" +else + hostnamectl set-hostname "$TARGET" + if grep -q "127.0.1.1" /etc/hosts; then + sed -i "s/^127.0.1.1.*/127.0.1.1\t$TARGET/" /etc/hosts + else + echo -e "127.0.1.1\t$TARGET" >> /etc/hosts + fi + log "hostname set to $TARGET" +fi +mkdir -p "$STATE_DIR" +echo "$DEALER_ID" > "$STATE_DIR/dealer-id" +echo "bf-${DEALER_ID}" > "$STATE_DIR/hostname" +echo "BF-${DEALER_ID}" > "$STATE_DIR/device-id" +log "OK: identity files written (BF-${DEALER_ID} / bf-${DEALER_ID})" + + + +#!/usr/bin/env bash +# WireGuard local identity: provisioning creates only a device keypair; enrollment owns wg0.conf. +set -euo pipefail +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}"; WG_DIR="${WG_DIR:-/etc/wireguard}"; CHECK_MODE=0 +[[ "${1:-}" == --check ]] && CHECK_MODE=1 +OFFLINE="${BF_OFFLINE:-0}" +# READY freshness is checked by bf-check-ready with BF_WG_HANDSHAKE_MAX_AGE. +BF_WG_HANDSHAKE_MAX_AGE="${BF_WG_HANDSHAKE_MAX_AGE:-180}" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [06-wireguard] $1" | tee -a "$LOG_FILE"; } +keypair() { [[ -s "$WG_DIR/privatekey" && -s "$WG_DIR/publickey" ]]; } +if [[ "$CHECK_MODE" == 1 ]]; then + keypair || { log 'FAIL(check): WireGuard device keypair missing'; exit 1; } + if [[ "$OFFLINE" == 1 ]]; then [[ ! -e "$WG_DIR/wg0.conf" ]] || { log 'FAIL(check): offline provisioning must not create wg0.conf'; exit 1; }; log 'OK(check): offline WireGuard identity only'; exit 0; fi + [[ -f "$WG_DIR/wg0.conf" ]] || { log 'FAIL(check): enrollment WireGuard config missing'; exit 1; } + systemctl is-enabled --quiet wg-quick@wg0 && systemctl is-active --quiet wg-quick@wg0 || { log 'FAIL(check): enrolled WireGuard inactive'; exit 1; } + log 'OK(check): enrolled WireGuard active'; exit 0 +fi +command -v wg >/dev/null 2>&1 || { [[ "$OFFLINE" == 1 ]] && { log 'FAIL: offline media must supply wireguard-tools'; exit 1; }; apt-get update && apt-get install -y wireguard-tools; } +install -d -m 700 "$WG_DIR" +if ! keypair; then umask 077; wg genkey | tee "$WG_DIR/privatekey" | wg pubkey > "$WG_DIR/publickey"; chmod 600 "$WG_DIR/privatekey" "$WG_DIR/publickey"; fi +if [[ "$OFFLINE" == 1 ]]; then rm -f "$WG_DIR/wg0.conf"; systemctl disable --now wg-quick@wg0 2>/dev/null || true; log 'OK: offline WireGuard keypair generated; hub configuration deferred to enrollment'; exit 0; fi +log 'OK: WireGuard keypair ready; use bf-enroll --token-stdin to obtain hub configuration' + + + +#!/usr/bin/env bash +# Harden sshd only after a validated Blueforce administrator key is installed. +set -euo pipefail +MODULE="07-ssh" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +DROPIN="/etc/ssh/sshd_config.d/99-blueforce.conf" +AUTHORIZED_KEYS="/home/blueforce/.ssh/authorized_keys" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [07-ssh] $1" | tee -a "$LOG_FILE"; } +key_ready() { [[ -s "$AUTHORIZED_KEYS" ]] && ssh-keygen -l -f "$AUTHORIZED_KEYS" >/dev/null 2>&1; } +ADMIN_KEY="${BF_ADMIN_PUBLIC_KEY:-}" +ADMIN_KEY_FILE="${BF_ADMIN_PUBLIC_KEY_FILE:-}" +install_admin_key() { + [[ -n "$ADMIN_KEY" || -n "$ADMIN_KEY_FILE" ]] || return 0 + [[ -z "$ADMIN_KEY" ]] || printf '%s\n' "$ADMIN_KEY" > /tmp/blueforce-admin-key + [[ -z "$ADMIN_KEY_FILE" ]] || { [[ -r "$ADMIN_KEY_FILE" ]] || { log "FAIL: BF_ADMIN_PUBLIC_KEY_FILE is unreadable"; exit 1; }; cp "$ADMIN_KEY_FILE" /tmp/blueforce-admin-key; } + ssh-keygen -l -f /tmp/blueforce-admin-key >/dev/null 2>&1 || { log "FAIL: BF_ADMIN_PUBLIC_KEY is not a valid public key"; exit 1; } + install -d -m 700 -o blueforce -g blueforce /home/blueforce/.ssh + install -m 600 -o blueforce -g blueforce /tmp/blueforce-admin-key "$AUTHORIZED_KEYS" +} +read -r -d '' WANT <<'EOF' || true +# Managed by blueforce-installer (07-ssh). Local edits will be overwritten. +PermitRootLogin no +PasswordAuthentication no +PubkeyAuthentication yes +ChallengeResponseAuthentication no +UsePAM yes +X11Forwarding no +ClientAliveInterval 300 +ClientAliveCountMax 2 +MaxAuthTries 3 +AllowUsers blueforce +EOF +if [[ "$CHECK_MODE" -eq 1 ]]; then + [[ -f "$DROPIN" ]] || { log "FAIL(check): sshd drop-in missing"; exit 1; } + key_ready || { log "FAIL(check): no valid non-empty blueforce authorized_keys"; exit 1; } + grep -qx 'AllowUsers blueforce' "$DROPIN" || { log "FAIL(check): AllowUsers policy is incorrect"; exit 1; } + sshd -t 2>/dev/null || { log "FAIL(check): sshd config test failed"; exit 1; } + log "OK(check): hardened SSH permits only blueforce with a valid key"; exit 0 +fi +export DEBIAN_FRONTEND=noninteractive +command -v sshd >/dev/null 2>&1 || apt-get install -y openssh-server +install_admin_key +key_ready || { log "FAIL: valid non-empty /home/blueforce/.ssh/authorized_keys or BF_ADMIN_PUBLIC_KEY(_FILE) is required before SSH hardening"; exit 1; } +printf '%s\n' "$WANT" > /tmp/99-blueforce.conf.bf +install -m 644 /tmp/99-blueforce.conf.bf "$DROPIN" +sshd -t || { log "FAIL: sshd -t rejected the new config"; exit 1; } +if systemctl list-unit-files | grep -q '^sshd\.service'; then SVC=sshd; else SVC=ssh; fi +systemctl enable "$SVC" >/dev/null 2>&1 || true +systemctl reload-or-restart "$SVC" +log "OK: hardened SSH installed after valid key verification; AllowUsers=blueforce" + + + +#!/usr/bin/env bash +# xRDP + GNOME session, terminal boot default, multi-user. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="08-rdp" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +# shellcheck source=../offline-apt.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/offline-apt.sh" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [08-rdp] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +if [[ "$CHECK_MODE" -eq 1 ]]; then + dpkg -s xrdp >/dev/null 2>&1 || { log "FAIL(check): xrdp not installed"; exit 1; } + systemctl is-enabled --quiet xrdp 2>/dev/null || { log "FAIL(check): xrdp not enabled"; exit 1; } + systemctl is-active --quiet xrdp 2>/dev/null || { log "FAIL(check): xrdp not active"; exit 1; } + systemctl is-enabled --quiet xrdp-sesman 2>/dev/null || { log "FAIL(check): xrdp-sesman not enabled"; exit 1; } + systemctl is-active --quiet xrdp-sesman 2>/dev/null || { log "FAIL(check): xrdp-sesman not active"; exit 1; } + [[ "$(systemctl get-default)" == "multi-user.target" ]] || { log "FAIL(check): default target is not multi-user"; exit 1; } + log "OK(check): xrdp installed+enabled, terminal boot default" + exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive +dpkg -s xrdp >/dev/null 2>&1 || bf_apt_install xrdp +dpkg -s gnome-session >/dev/null 2>&1 || bf_apt_install gnome-session + +# Default GNOME session for RDP logins (per-user override still wins). +if [[ ! -f /etc/skel/.xsession ]]; then + echo "gnome-session" > /etc/skel/.xsession +fi +if id blueforce >/dev/null 2>&1 && [[ ! -f /home/blueforce/.xsession ]]; then + echo "gnome-session" > /home/blueforce/.xsession + chown blueforce:blueforce /home/blueforce/.xsession +fi + +# Module 13 starts xRDP only after the UFW WireGuard-only baseline succeeds. +systemctl set-default multi-user.target +log "OK: xrdp installed and configured; module 13 will enable it after firewall baseline" + + + +#!/usr/bin/env bash +# RustDesk is a required remote channel: only a pinned supplied package is accepted. +set -euo pipefail +MODULE="09-rustdesk" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +# shellcheck source=../offline-apt.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/offline-apt.sh" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +RUSTDESK_SERVER="${RUSTDESK_SERVER:-}" +RUSTDESK_DEB="${RUSTDESK_DEB:-}" +SYSTEM_CONFIG="/etc/rustdesk/RustDesk2.toml" +USER_CONFIG="/home/blueforce/.config/RustDesk/RustDesk2.toml" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [09-rustdesk] $1" | tee -a "$LOG_FILE"; } +valid_server() { + local endpoint="$1" host port + [[ -n "$endpoint" ]] || return 1 + [[ "$endpoint" != *example* && "$endpoint" != *invalid* && "$endpoint" != *REPLACE* && "$endpoint" != *replace* && "$endpoint" != *'<'* && "$endpoint" != *'>'* && "$endpoint" != localhost* ]] || return 1 + [[ "$endpoint" =~ ^[A-Za-z0-9][A-Za-z0-9.-]*(:[1-9][0-9]{0,4})?$ ]] || return 1 + host="${endpoint%%:*}" + [[ -n "$host" ]] || return 1 + if [[ "$endpoint" == *:* ]]; then + port="${endpoint##*:}" + ((10#$port <= 65535)) || return 1 + fi +} +config_endpoint() { + sed -n "s/^rendezvous-server = '\([^']*\)'$/\1/p" "$SYSTEM_CONFIG" 2>/dev/null | head -n 1 +} +configured() { + local endpoint + endpoint="$(config_endpoint)" + valid_server "$endpoint" || return 1 + grep -Fqx "rendezvous-server = '${endpoint}'" "$SYSTEM_CONFIG" >/dev/null 2>&1 && + grep -Fqx "relay-server = '${endpoint}'" "$SYSTEM_CONFIG" >/dev/null 2>&1 && + grep -Fqx "rendezvous-server = '${endpoint}'" "$USER_CONFIG" >/dev/null 2>&1 && + grep -Fqx "relay-server = '${endpoint}'" "$USER_CONFIG" >/dev/null 2>&1 +} +if [[ "$CHECK_MODE" -eq 1 ]]; then + dpkg -s rustdesk >/dev/null 2>&1 || { log "FAIL(check): rustdesk remote channel is not installed"; exit 1; } + configured || { log "FAIL(check): RustDesk client config is missing, inconsistent, or uses a placeholder/non-self-hosted endpoint"; exit 1; } + rustdesk --get-id 2>/dev/null | grep -qE '^[0-9]+$' || { log "FAIL(check): RustDesk client cannot provide a device ID"; exit 1; } + log "OK(check): RustDesk remote channel is installed with a self-hosted client configuration" + exit 0 +fi +valid_server "$RUSTDESK_SERVER" || { log "FAIL: RUSTDESK_SERVER must be a non-placeholder self-hosted host or host:port"; exit 1; } +export DEBIAN_FRONTEND=noninteractive +if [[ "${BF_OFFLINE:-0}" == 1 ]]; then + dpkg -s rustdesk >/dev/null 2>&1 || bf_apt_install rustdesk +else + [[ -n "$RUSTDESK_DEB" && -f "$RUSTDESK_DEB" ]] || { log "FAIL: RUSTDESK_DEB must name a supplied pinned RustDesk .deb; apt sources are not used"; exit 1; } + dpkg -s rustdesk >/dev/null 2>&1 || { dpkg -i "$RUSTDESK_DEB" || apt-get install -f -y; } +fi +for cfgdir in /etc/rustdesk /home/blueforce/.config/RustDesk; do + install -d -m 700 "$cfgdir" + cat > "$cfgdir/RustDesk2.toml" </dev/null || true +configured || { log "FAIL: RustDesk client configuration did not persist"; exit 1; } +install -d -m 700 "$STATE_DIR" +rustdesk --get-id 2>/dev/null | head -1 > "$STATE_DIR/rustdesk-id" || true +[[ -s "$STATE_DIR/rustdesk-id" ]] || { log "FAIL: RustDesk client did not provide a device ID"; exit 1; } +log "OK: RustDesk pinned package installed and self-hosted channel configured" + + + +#!/usr/bin/env bash +# Docker CE + daemon.json with log rotation, service enabled. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="10-docker" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +# shellcheck source=../offline-apt.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/offline-apt.sh" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [10-docker] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +DAEMON_JSON="/etc/docker/daemon.json" +WANT_JSON='{ + "log-driver": "json-file", + "log-opts": {"max-size": "10m", "max-file": "3"}, + "live-restore": true +}' + +if [[ "$CHECK_MODE" -eq 1 ]]; then + command -v docker >/dev/null 2>&1 || { log "FAIL(check): docker missing"; exit 1; } + systemctl is-enabled --quiet docker 2>/dev/null || { log "FAIL(check): docker not enabled"; exit 1; } + [[ -f "$DAEMON_JSON" ]] || { log "FAIL(check): daemon.json missing"; exit 1; } + log "OK(check): docker installed, enabled, daemon.json present" + exit 0 +fi + +if ! command -v docker >/dev/null 2>&1; then + if [[ "${BF_OFFLINE:-0}" == 1 ]]; then + bf_apt_install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + else + apt-get install -y ca-certificates curl gnupg + if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then + install -d -m 0755 /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + chmod a+r /etc/apt/keyrings/docker.gpg + . /etc/os-release + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list + apt-get update + fi + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || apt-get install -y docker.io + fi +fi + +printf '%s\n' "$WANT_JSON" > /tmp/daemon.json.bf +mkdir -p /etc/docker +mv /tmp/daemon.json.bf "$DAEMON_JSON" +systemctl enable --now docker +systemctl is-active --quiet docker || { log "FAIL: docker installed but service not running"; exit 1; } +log "OK: docker ready with log rotation (10m x3) and live-restore" + + + +#!/usr/bin/env bash +# MEG placeholder: install vendor .deb if present, else SKIP + acceptance checklist. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="11-meg" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [11-meg] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +MEG_DEB="${MEG_DEB:-$(ls /opt/blueforce/debs/meg*.deb /opt/blueforce/meg*.deb 2>/dev/null | head -1)}" +MEG_CONTAINER="${MEG_CONTAINER:-meg}" + +acceptance_checklist() { + local fails=0 + # Gate 2: pinned version, never latest. + local img + img=$(docker inspect --format '{{.Config.Image}}' "$MEG_CONTAINER" 2>/dev/null || echo "") + if [[ -z "$img" ]]; then echo "CHECK container-running: SKIP (no container $MEG_CONTAINER yet)"; else echo "CHECK container-running: PASS ($img)"; fi + if [[ "$img" == *":latest" ]]; then echo "CHECK pinned-tag: FAIL (latest forbidden)"; fails=$((fails+1)); else echo "CHECK pinned-tag: PASS"; fi + # Gate 4: restart policy unless-stopped. + if [[ -n "$img" ]]; then + local pol + pol=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$MEG_CONTAINER" 2>/dev/null) + [[ "$pol" == "unless-stopped" ]] && echo "CHECK restart-policy: PASS" || { echo "CHECK restart-policy: FAIL ($pol)"; fails=$((fails+1)); } + fi + # Gate 5: no 0.0.0.0 port bind to the outside. + if ss -tlnp 2>/dev/null | grep -q "0.0.0.0"; then echo "CHECK port-bind: WARN (external bind present — review)"; else echo "CHECK port-bind: PASS"; fi + return "$fails" +} + +if [[ "$CHECK_MODE" -eq 1 ]]; then + if [[ -z "${MEG_DEB:-}" || ! -f "$MEG_DEB" ]] && ! dpkg -s meg >/dev/null 2>&1 && ! docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "$MEG_CONTAINER"; then + log "OK(check): MEG not supplied yet (SKIP state)" + exit 0 + fi + acceptance_checklist || { log "FAIL(check): MEG acceptance checklist failed"; exit 1; } + log "OK(check): MEG acceptance checklist passed" + exit 0 +fi + +if [[ "${MEG_SKIP:-0}" == "1" ]]; then log "SKIP: MEG_SKIP=1"; exit 3; fi + +if ! dpkg -s meg >/dev/null 2>&1 && ! docker ps -a --format '{{.Names}}' 2>/dev/null | grep -qx "$MEG_CONTAINER"; then + if [[ -n "${MEG_DEB:-}" && -f "$MEG_DEB" ]]; then + export DEBIAN_FRONTEND=noninteractive + dpkg -i "$MEG_DEB" || apt-get install -f -y + log "MEG package installed from $MEG_DEB" + else + log "SKIP: no MEG .deb supplied — vendor package pending, continuing" + exit 3 + fi +else + log "MEG already present, keeping" +fi + +if ! acceptance_checklist; then + log "FAIL: MEG acceptance checklist failed — see output above" + exit 1 +fi +log "OK: MEG present and acceptance checklist passed" + + + +#!/usr/bin/env bash +# Node exporter + textfile collector directory. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="12-monitoring" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +# shellcheck source=../offline-apt.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/offline-apt.sh" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [12-monitoring] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +TEXTFILE_DIR="/var/lib/node_exporter/textfile" + +if [[ "$CHECK_MODE" -eq 1 ]]; then + systemctl is-enabled --quiet prometheus-node-exporter 2>/dev/null || systemctl is-enabled --quiet node_exporter 2>/dev/null || { log "FAIL(check): node exporter not enabled"; exit 1; } + [[ -d "$TEXTFILE_DIR" ]] || { log "FAIL(check): textfile dir missing"; exit 1; } + log "OK(check): node exporter enabled, textfile dir present" + exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive +dpkg -s prometheus-node-exporter >/dev/null 2>&1 || bf_apt_install prometheus-node-exporter + +install -d -m 755 "$TEXTFILE_DIR" +# Ensure the textfile collector flag is set (package default may omit it). +OVERRIDE="/etc/systemd/system/prometheus-node-exporter.service.d/blueforce.conf" +mkdir -p "$(dirname "$OVERRIDE")" +printf '[Service]\nExecStart=\nExecStart=/usr/bin/prometheus-node-exporter --collector.textfile.directory=%s\n' "$TEXTFILE_DIR" > /tmp/override.bf +mv /tmp/override.bf "$OVERRIDE" +systemctl daemon-reload +systemctl enable --now prometheus-node-exporter 2>/dev/null || systemctl enable --now node_exporter +log "OK: node exporter enabled with textfile dir $TEXTFILE_DIR" + + + +#!/usr/bin/env bash +# Apply UFW deny-in baseline and persist Docker published-port policy. +set -euo pipefail +MODULE="13-firewall" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +SSH_PORT="${SSH_PORT:-22}" +RDP_PORT="${RDP_PORT:-3389}" +DOCKER_ALLOWLIST="/etc/blueforce/docker-published-port-allowlist.conf" +DOCKER_POLICY_BIN="/usr/local/sbin/blueforce-docker-firewall" +DOCKER_POLICY_UNIT="blueforce-docker-firewall.service" +DOCKER_POLICY_DROPIN="/etc/systemd/system/docker.service.d/blueforce-docker-firewall.conf" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" +# shellcheck source=../offline-apt.sh +source "$SCRIPT_DIR/../offline-apt.sh" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [13-firewall] $1" | tee -a "$LOG_FILE"; } + +if [[ "$CHECK_MODE" -eq 1 ]]; then + ufw status 2>/dev/null | grep -q 'Status: active' || { log "FAIL(check): ufw not active"; exit 1; } + ufw status 2>/dev/null | grep -Eq "${SSH_PORT}/tcp.*on wg0|${SSH_PORT}/tcp.*wg0" || { log "FAIL(check): SSH is not restricted to wg0"; exit 1; } + ufw status 2>/dev/null | grep -Eq "${RDP_PORT}/tcp.*on wg0|${RDP_PORT}/tcp.*wg0" || { log "FAIL(check): RDP is not restricted to wg0"; exit 1; } + [[ -f "$DOCKER_ALLOWLIST" && -x "$DOCKER_POLICY_BIN" && -f "$DOCKER_POLICY_DROPIN" ]] || { log "FAIL(check): persistent Docker firewall assets missing"; exit 1; } + systemctl is-enabled --quiet "$DOCKER_POLICY_UNIT" || { log "FAIL(check): persistent Docker firewall unit is not enabled"; exit 1; } + "$DOCKER_POLICY_BIN" --check || { log "FAIL(check): Docker published-port policy is not enforced"; exit 1; } + log "OK(check): SSH/RDP restricted to wg0 and Docker policy persists through systemd" + exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive +command -v ufw >/dev/null 2>&1 || bf_apt_install ufw +command -v iptables >/dev/null 2>&1 || bf_apt_install iptables +ufw default deny incoming +ufw default allow outgoing +ufw delete allow "$SSH_PORT/tcp" 2>/dev/null || true +ufw delete allow "$RDP_PORT/tcp" 2>/dev/null || true +ufw allow in on wg0 to any port "$SSH_PORT" proto tcp comment 'SSH over WireGuard only' +ufw allow in on wg0 to any port "$RDP_PORT" proto tcp comment 'RDP over WireGuard only' +install -d -m 755 /etc/blueforce /etc/iptables +if [[ ! -f "$DOCKER_ALLOWLIST" ]]; then + cat > "$DOCKER_ALLOWLIST" <<'EOF' +# Explicit Docker published-port exceptions. One reviewed entry per line: +# tcp 8443 +# udp 51820 +# This allowlist intentionally permits no externally published Docker ports by default. +EOF +fi +chown root:root "$DOCKER_ALLOWLIST" +chmod 640 "$DOCKER_ALLOWLIST" +install -o root -g root -m 700 "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" "$DOCKER_POLICY_BIN" +install -o root -g root -m 644 "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" "/etc/systemd/system/$DOCKER_POLICY_UNIT" +install -d -m 755 "$(dirname "$DOCKER_POLICY_DROPIN")" +install -o root -g root -m 644 "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" "$DOCKER_POLICY_DROPIN" +systemctl daemon-reload +systemctl enable "$DOCKER_POLICY_UNIT" +# Docker creates DOCKER-USER during startup; applying now proves the parsed policy. +systemctl start docker +"$DOCKER_POLICY_BIN" +ufw --force enable +# xRDP remains stopped until the deny-in/WireGuard-only rules are active. +systemctl enable xrdp xrdp-sesman >/dev/null 2>&1 || systemctl enable xrdp +systemctl start xrdp xrdp-sesman >/dev/null 2>&1 || systemctl start xrdp +systemctl is-enabled --quiet xrdp && systemctl is-active --quiet xrdp || { log 'FAIL: xrdp did not start after firewall baseline'; exit 1; } +log "OK: UFW allows SSH/RDP only on wg0; xrdp started only after firewall baseline; persisted Docker policy denies all unapproved published ports" + + + +#!/usr/bin/env bash +# APT holds + disable automatic update timers. +set -euo pipefail +MODULE="14-update-policy" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +APT_HOLDS="${APT_HOLDS:-}" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [14-update-policy] $1" | tee -a "$LOG_FILE"; } +if [[ "$CHECK_MODE" -eq 1 ]]; then + for t in apt-daily.timer apt-daily-upgrade.timer; do systemctl is-enabled "$t" 2>/dev/null | grep -q masked || { log "FAIL(check): $t not masked"; exit 1; }; done + log "OK(check): update timers masked"; exit 0 +fi +for t in apt-daily.service apt-daily.timer apt-daily-upgrade.service apt-daily-upgrade.timer; do systemctl mask "$t" >/dev/null 2>&1 || true; systemctl stop "$t" >/dev/null 2>&1 || true; done +printf 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";\nAPT::Periodic::Enable "0";\n' > /tmp/20auto-upgrades.bf +mv /tmp/20auto-upgrades.bf /etc/apt/apt.conf.d/20auto-upgrades +if [[ -n "$APT_HOLDS" ]]; then + read -r -a apt_holds <<< "$APT_HOLDS" + ((${#apt_holds[@]})) && apt-mark hold -- "${apt_holds[@]}" + log "holds applied: ${apt_holds[*]}" +fi +log "OK: automatic updates locked off (timers masked, periodic=0)" + + + +#!/usr/bin/env bash +# journald caps + app logrotate policy. +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do). +set -euo pipefail + +MODULE="15-logrotate" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [15-logrotate] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +JOURNAL_DROPIN="/etc/systemd/journald.conf.d/99-blueforce.conf" +APP_ROTATE="/etc/logrotate.d/blueforce" + +if [[ "$CHECK_MODE" -eq 1 ]]; then + [[ -f "$JOURNAL_DROPIN" && -f "$APP_ROTATE" ]] || { log "FAIL(check): logrotate configs missing"; exit 1; } + log "OK(check): journald caps + app logrotate present" + exit 0 +fi + +mkdir -p /etc/systemd/journald.conf.d +cat > /tmp/journald.bf <<'EOF' +# Managed by blueforce-installer (15-logrotate). +[Journal] +SystemMaxUse=500M +RuntimeMaxUse=100M +MaxRetentionSec=30day +ForwardToSyslog=no +EOF +mv /tmp/journald.bf "$JOURNAL_DROPIN" +systemctl restart systemd-journald 2>/dev/null || true + +cat > /tmp/blueforce-rotate.bf <<'EOF' +# Managed by blueforce-installer (15-logrotate). +/var/log/blueforce*.log /var/log/bf-*.log { + size 10M + rotate 5 + compress + delaycompress + missingok + notifempty + copytruncate +} +EOF +mv /tmp/blueforce-rotate.bf "$APP_ROTATE" +chmod 644 "$APP_ROTATE" +logrotate --debug "$APP_ROTATE" 2>&1 | head -3 || true +log "OK: journald capped (500M/30d), app logs rotate at 10M x5" + + + +#!/usr/bin/env bash +# GNOME minimal and maintained GUI maintenance tools; terminal boot remains default. +set -euo pipefail +MODULE="16-gui" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +CHECK_MODE=0 +[[ "${1:-}" == "--check" ]] && CHECK_MODE=1 +SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [16-gui] $1" | tee -a "$LOG_FILE"; } +if [[ "$CHECK_MODE" -eq 1 ]]; then + dpkg -s ubuntu-desktop-minimal >/dev/null 2>&1 || { log "FAIL(check): ubuntu-desktop-minimal missing"; exit 1; } + [[ -x /usr/local/bin/bf-gui-on && -x /usr/local/bin/bf-gui-off ]] || { log "FAIL(check): maintained bf-gui switches missing"; exit 1; } + [[ -f /etc/systemd/system/bf-gui-on.service && -f /etc/systemd/system/bf-gui-off.service ]] || { log "FAIL(check): manual GUI service units missing"; exit 1; } + [[ "$(systemctl get-default)" == multi-user.target ]] || { log "FAIL(check): terminal boot default was changed"; exit 1; } + log "OK(check): GNOME minimal, maintained switches, and terminal boot default present"; exit 0 +fi +export DEBIAN_FRONTEND=noninteractive +dpkg -s ubuntu-desktop-minimal >/dev/null 2>&1 || apt-get install -y ubuntu-desktop-minimal +for tool in bf-gui-on bf-gui-off; do install -m 755 "$SCRIPT_ROOT/maintenance/$tool" "/usr/local/bin/$tool"; done +for unit in bf-gui-on.service bf-gui-off.service; do install -m 644 "$SCRIPT_ROOT/../config/systemd/$unit" "/etc/systemd/system/$unit"; done +systemctl daemon-reload +systemctl set-default multi-user.target +systemctl disable gdm3 2>/dev/null || systemctl disable gdm 2>/dev/null || true +log "OK: maintained GUI tools and manual units installed; boot default is multi-user" + + + +#!/usr/bin/env bash +# Install diagnostics and enrollment commands without executing enrollment. +set -euo pipefail +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}"; CHECK_MODE=0 +[[ "${1:-}" == --check ]] && CHECK_MODE=1 +SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [17-healthcheck] $1" | tee -a "$LOG_FILE"; } +BINS=(bf-status bf-enroll bf-enroll-now bf-enrollment-status bf-release bf-remote-status bf-check-local bf-check-enrollment bf-check-ready) +if [[ "$CHECK_MODE" == 1 ]]; then + for bin in "${BINS[@]}"; do [[ -x "/usr/local/bin/$bin" ]] || { log "FAIL(check): $bin missing"; exit 1; }; done + [[ -f /etc/systemd/system/blueforce-enroll.service && -f /etc/systemd/system/blueforce-enroll.timer ]] || { log 'FAIL(check): enrollment units missing'; exit 1; } + log 'OK(check): diagnostics and enrollment trigger installed'; exit 0 +fi +install -d -m 700 "$STATE_DIR" /etc/blueforce +for bin in "${BINS[@]}"; do install -m 755 "$SCRIPT_ROOT/diagnostics/$bin" "/usr/local/bin/$bin"; done +install -m 644 "$SCRIPT_ROOT/../config/systemd/blueforce-enroll.service" /etc/systemd/system/blueforce-enroll.service +install -m 644 "$SCRIPT_ROOT/../config/systemd/blueforce-enroll.timer" /etc/systemd/system/blueforce-enroll.timer +[[ -f "$SCRIPT_ROOT/../provisioning/release/manifest.yaml" ]] && install -m 644 "$SCRIPT_ROOT/../provisioning/release/manifest.yaml" /etc/blueforce/release-manifest.yaml +systemctl daemon-reload +systemctl enable blueforce-enroll.timer >/dev/null 2>&1 || true +log 'OK: diagnostics installed; enrollment remains pending until an operator supplies a one-time token' + + + +#!/usr/bin/env bash +# Shared local APT transaction helpers. Offline mode never reads remote sources. +set -euo pipefail + +bf_apt() { + if [[ "${BF_OFFLINE:-0}" == 1 ]]; then + [[ -n "${BF_OFFLINE_APT_CONFIG:-}" && -r "${BF_OFFLINE_APT_CONFIG}" ]] || { + printf 'Offline APT configuration is unavailable.\n' >&2 + return 1 + } + APT_CONFIG="$BF_OFFLINE_APT_CONFIG" apt-get "$@" + else + apt-get "$@" + fi +} + +bf_require_offline_pin() { + local package="$1" + [[ "${BF_OFFLINE:-0}" != 1 ]] && return 0 + local pin + pin="$(awk -F '\t' -v package="$package" '$1 == package {print $1 "=" $2; exit}' "${BF_OFFLINE_REPO}/packages.lock.tsv")" + [[ -n "$pin" ]] || { + printf 'Offline repository lacks required pinned package: %s\n' "$package" >&2 + return 1 + } + printf '%s\n' "$pin" +} + +bf_apt_install() { + local packages=() package pin + for package in "$@"; do + if [[ "${BF_OFFLINE:-0}" == 1 ]]; then + pin="$(bf_require_offline_pin "$package")" || return 1 + packages+=("$pin") + else + packages+=("$package") + fi + done + bf_apt install -y "${packages[@]}" +} + + + +#!/usr/bin/env bash +# Licensed-only AnyDesk exception placeholder. It deliberately installs nothing. +set -euo pipefail + +if [[ "${ANYDESK_LICENSE_CONFIRMED:-}" != "true" ]]; then + printf '%s\n' 'Refusing AnyDesk exception: set ANYDESK_LICENSE_CONFIRMED=true only after the per-device license approval is recorded.' >&2 + exit 2 +fi + +printf '%s\n' 'AnyDesk license confirmation acknowledged. This skeleton intentionally does not download, install, configure, or contain AnyDesk licensing material.' +printf '%s\n' 'Obtain the approved package and license through the organization’s controlled process; record the device exception outside the Blueforce installer.' + + @@ -9189,6 +61632,1785 @@ Elendikleri için değil, free-limitleri olmadığı için not düşüldü; seç
    + +#!/usr/bin/env bash +# +# bf-gui-off - Switch the field terminal back to console (multi-user) mode. +# +# Stops only the local display manager, preserves xRDP remote access, and isolates +# multi-user.target. Idempotent: already-console systems are left untouched. +# +# Install: install -m 0755 bf-gui-off /usr/local/bin/bf-gui-off +# Usage: sudo bf-gui-off +# +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: bf-gui-off [--help] + +Stop the graphical layer and return the device to console mode. + +Options: + --help Show this help and exit + +Behavior: + - Stops only the local display manager (gdm3/gdm/...); xRDP and xrdp-sesman are preserved + - Disables the local display manager so it does not restart on boot + - Runs 'systemctl isolate multi-user.target' +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +if [[ "$(id -u)" -ne 0 ]]; then + echo "ERROR: bf-gui-off must run as root (use sudo)." >&2 + exit 1 +fi + +log() { echo "[bf-gui-off] $*"; } + +# Only the local physical display manager is controlled here. xRDP stays enabled +# and active so remote recovery is available while the console is local-default. +UNITS=(gdm3 gdm sddm lightdm) + +for unit in "${UNITS[@]}"; do + if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then + if systemctl is-active --quiet "${unit}"; then + log "Stopping ${unit} ..." + systemctl stop "${unit}" || log "WARNING: failed to stop ${unit}." + else + log "${unit} already stopped." + fi + systemctl disable "${unit}" >/dev/null 2>&1 || true + fi +done + +log "Isolating multi-user.target ..." +systemctl isolate multi-user.target + +log "GUI is OFF (console mode)." + + + +#!/usr/bin/env bash +# +# bf-gui-on - Switch the field terminal to graphical mode and prepare RDP. +# +# Enables and starts the display manager plus xRDP services, isolates the +# graphical target, then waits until RDP is ready to accept sessions. +# Idempotent: already-graphical systems are left untouched. +# +# Install: install -m 0755 bf-gui-on /usr/local/bin/bf-gui-on +# Usage: sudo bf-gui-on [--timeout SECS] +# +set -euo pipefail + +TIMEOUT=60 +DISPLAY_MANAGER="" + +usage() { + cat <<'EOF' +Usage: bf-gui-on [--timeout SECS] [--help] + +Switch the device to graphical mode and wait until RDP is ready. + +Options: + --timeout SECS Seconds to wait for RDP port 3389 (default: 60) + --help Show this help and exit + +Behavior: + - Enables and starts the display manager (gdm3/gdm) + xrdp + xrdp-sesman + - Runs 'systemctl isolate graphical.target' + - Waits until TCP/3389 accepts connections (RDP ready standby) +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --timeout) TIMEOUT="${2:?missing value for --timeout}"; shift 2 ;; + --help|-h) usage; exit 0 ;; + *) echo "ERROR: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +if [[ "$(id -u)" -ne 0 ]]; then + echo "ERROR: bf-gui-on must run as root (use sudo)." >&2 + exit 1 +fi + +log() { echo "[bf-gui-on] $*"; } + +# Detect installed display manager unit (LAB validates exact names on 26.04.1). +detect_dm() { + local candidate + for candidate in gdm3.service gdm.service sddm.service lightdm.service; do + if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${candidate}"; then + echo "${candidate%.service}" + return 0 + fi + done + return 1 +} + +if DISPLAY_MANAGER="$(detect_dm)"; then + log "Display manager detected: ${DISPLAY_MANAGER}" +else + log "WARNING: no display manager unit found; proceeding with xrdp only." +fi + +UNITS=() +[[ -n "${DISPLAY_MANAGER}" ]] && UNITS+=("${DISPLAY_MANAGER}") +UNITS+=(xrdp xrdp-sesman) + +# Enable units that exist so GUI survives reboot while switched on. +for unit in "${UNITS[@]}"; do + if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then + systemctl enable "${unit}" >/dev/null 2>&1 || true + else + log "WARNING: unit ${unit} not installed; skipping." + fi +done + +CURRENT="$(systemctl get-default 2>/dev/null || echo unknown)" +log "Current default target: ${CURRENT}" + +log "Isolating graphical.target ..." +systemctl isolate graphical.target + +for unit in "${UNITS[@]}"; do + if systemctl list-unit-files --type=service 2>/dev/null | grep -q "^${unit}"; then + if ! systemctl is-active --quiet "${unit}"; then + log "Starting ${unit} ..." + systemctl start "${unit}" || log "WARNING: failed to start ${unit}." + else + log "${unit} already active." + fi + fi +done + +# Wait for RDP standby on TCP/3389. +log "Waiting for RDP (TCP/3389) up to ${TIMEOUT}s ..." +elapsed=0 +while [[ "${elapsed}" -lt "${TIMEOUT}" ]]; do + if (exec 3<>/dev/tcp/127.0.0.1/3389) >/dev/null 2>&1; then + exec 3>&- 2>/dev/null || true + log "RDP is ready (graphical ON)." + exit 0 + fi + sleep 2 + elapsed=$((elapsed + 2)) +done + +echo "ERROR: RDP port 3389 did not open within ${TIMEOUT}s." >&2 +echo "HINT: check 'systemctl status xrdp xrdp-sesman' and journal." >&2 +exit 1 + + + +<# +.SYNOPSIS + Read-only Windows pre-migration data-export manifest for one Blueforce dealer. +.DESCRIPTION + Produces metadata only: approved user folders, removable-drive roots, mapped + network shares, printers and MEG data directories are listed for an operator + to review before any manual copy happens. + + READ-ONLY CONTRACT (asserted by tests/check-migration-static.sh): + * No Set-*, New-*, Remove-* cmdlets, no service control, no network + configuration command, no registry write, no download. + * Nothing is copied, moved, compressed or encrypted. + * No file contents, credentials, browser profiles, password stores, + private keys or application databases are read. + * Directory metadata (path, size, timestamps) only. + * The only writes are the requested JSON and Markdown reports under + -OutputDirectory; with -Check nothing is written at all. + + Output contract: BF--windows-inventory-export.json and + BF--windows-inventory-export.md, named from the 8-digit dealer number - + not from the hostname of the machine being inventoried. +.PARAMETER DealerId + 8-digit Blueforce dealer number (^[0-9]{8}$). Device ID becomes BF-. +.PARAMETER DealerIdUnknown + Explicit opt-in for a device whose dealer number is not known yet. The report + is written as BF-unknown-windows-inventory-export.* and carries a prominent + warning: it must not be attached to a migration record until the dealer + number is confirmed and the script is re-run with -DealerId. +.PARAMETER OutputDirectory + Directory that receives the JSON and Markdown export manifest. +.PARAMETER NoSoftware + Skip the installed-software review list. +.PARAMETER Check + Dry run: validate parameters, print the export plan and the resolved output + paths, write nothing, exit 0. +.EXAMPLE + .\BF-WindowsDataExport.ps1 -DealerId 12010193 -OutputDirectory C:\Blueforce\migration +.EXAMPLE + .\BF-WindowsDataExport.ps1 -DealerIdUnknown -OutputDirectory C:\Blueforce\migration -Check +#> +[CmdletBinding(DefaultParameterSetName = 'KnownDealer')] +param( + [Parameter(Mandatory, ParameterSetName = 'KnownDealer')] + [ValidatePattern('^[0-9]{8}$')] + [string]$DealerId, + + [Parameter(Mandatory, ParameterSetName = 'UnknownDealer')] + [switch]$DealerIdUnknown, + + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$OutputDirectory, + + [switch]$NoSoftware, + + [switch]$Check +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +function Get-SafeValue { + param([object]$Value) + if ($null -eq $Value) { return 'unknown' } + $text = ([string]$Value).Trim() + if ([string]::IsNullOrWhiteSpace($text)) { return 'unknown' } + return $text +} + +function ConvertTo-MarkdownCell { + param([object]$Value) + return ((Get-SafeValue $Value) -replace '\|', '\|' -replace "`r?`n", '; ') +} + +function ConvertTo-Gigabytes { + param([object]$Bytes) + if ($null -eq $Bytes) { return 'unknown' } + return [math]::Round(([double]$Bytes) / 1GB, 2) +} + +function ConvertTo-IsoUtc { + param([object]$Value) + if ($null -eq $Value) { return 'unknown' } + try { return ([datetime]$Value).ToUniversalTime().ToString('o') } catch { return 'unknown' } +} + +function Get-ObjectValue { + param([object]$InputObject, [string]$Name) + if ($null -eq $InputObject) { return $null } + $prop = $InputObject.PSObject.Properties | Where-Object { $_.Name -eq $Name } | Select-Object -First 1 + if ($null -eq $prop) { return $null } + return $prop.Value +} + +function Get-FolderMetadata { + param([string]$Path) + if (-not (Test-Path -LiteralPath $Path -PathType Container)) { return $null } + $item = Get-Item -LiteralPath $Path -Force + [ordered]@{ + path = $item.FullName + last_write_utc = $item.LastWriteTimeUtc.ToString('o') + review_required = $true + export_action = 'manual-copy-after-owner-approval' + } +} + +function Get-ProgramFilesRoots { + $roots = @() + if ($env:ProgramFiles) { $roots += $env:ProgramFiles } + if (${env:ProgramFiles(x86)}) { $roots += ${env:ProgramFiles(x86)} } + if ($env:ProgramData) { $roots += $env:ProgramData } + $roots += 'C:\' + return @($roots | Select-Object -Unique) +} + +# Directory metadata only (path + mtime); contents are never enumerated. +function Get-DirectoryReport { + param([string]$Root, [string]$Filter) + if ([string]::IsNullOrWhiteSpace($Root)) { return @() } + if (-not (Test-Path -LiteralPath $Root -PathType Container)) { return @() } + return @(Get-ChildItem -LiteralPath $Root -Directory -Filter $Filter -ErrorAction SilentlyContinue | + ForEach-Object { + [ordered]@{ + path = $_.FullName + last_write_utc = ConvertTo-IsoUtc $_.LastWriteTimeUtc + review_required = $true + } + }) +} + +# --------------------------------------------------------------------------- +# Identity, parameters, dry-run gate +# --------------------------------------------------------------------------- + +$dealerKnown = ($PSCmdlet.ParameterSetName -eq 'KnownDealer') +$dealerIdValue = 'unknown' +if ($dealerKnown) { $dealerIdValue = $DealerId } +$DealerId = $dealerIdValue +$deviceId = "BF-$DealerId" + +$currentHostname = Get-SafeValue $env:COMPUTERNAME +$targetHostname = 'unknown' +if ($dealerKnown) { $targetHostname = "bf-$DealerId" } + +$now = Get-Date +$collectedAtUtc = $now.ToUniversalTime().ToString('o') +$collectedAtLocal = $now.ToString('o') + +$baseName = "BF-$DealerId-windows-inventory-export" +$jsonPath = Join-Path $OutputDirectory "$baseName.json" +$markdownPath = Join-Path $OutputDirectory "$baseName.md" + +$notes = [System.Collections.Generic.List[string]]::new() +if (-not $dealerKnown) { + $notes.Add('WARNING: dealer number unknown (-DealerIdUnknown). Output is BF-unknown-windows-inventory-export.* and must NOT be attached to a migration record until the dealer number is confirmed and the script is re-run with -DealerId.') +} +$notes.Add('Read-only run: this manifest lists metadata for review; it copies, moves and deletes nothing.') + +if ($Check) { + $softwarePlan = 'collected' + if ($NoSoftware) { $softwarePlan = 'skipped (-NoSoftware)' } + Write-Output "CHECK: $baseName.ps1 read-only dry run" + Write-Output " dealer_id : $dealerIdValue (known: $dealerKnown)" + Write-Output " device_id : $deviceId" + Write-Output " hostname : $currentHostname" + Write-Output " target_hostname : $targetHostname" + Write-Output " output_json : $jsonPath" + Write-Output " output_md : $markdownPath" + Write-Output " software_review : $softwarePlan" + Write-Output ' writes : none (dry run)' + exit 0 +} + +New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null + +# --------------------------------------------------------------------------- +# Collection (metadata only) +# --------------------------------------------------------------------------- + +$candidateFolderNames = @('Desktop', 'Documents', 'Downloads', 'Pictures', 'Videos', 'Music', 'Favorites') +$skippedFolderNames = @('AppData', '.ssh', '.gnupg', '.aws', '.azure', '.config', 'Cookies', 'Searches') + +$userFolders = @(Get-CimInstance -ClassName Win32_UserProfile -ErrorAction SilentlyContinue | + Where-Object { -not $_.Special -and $_.LocalPath } | + ForEach-Object { + $root = $_.LocalPath + @($candidateFolderNames | ForEach-Object { Get-FolderMetadata (Join-Path $root $_) } | Where-Object { $null -ne $_ }) + }) + +$removableRoots = @(Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType=2' -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + path = "$($_.DeviceID)\" + label = Get-SafeValue $_.VolumeName + file_system = Get-SafeValue $_.FileSystem + size_gb = ConvertTo-Gigabytes $_.Size + free_gb = ConvertTo-Gigabytes $_.FreeSpace + review_required = $true + export_action = 'manual-copy-after-owner-approval' + } +}) + +# Mapped network shares: connection metadata only; nothing is read from them. +$mappedDrives = @(Get-CimInstance -ClassName Win32_NetworkConnection -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + local_name = Get-SafeValue $_.LocalName + remote_name = Get-SafeValue $_.RemoteName + connection_type = Get-SafeValue $_.ConnectionType + status = Get-SafeValue $_.Status + review_required = $true + export_action = 'manual-copy-after-owner-approval' + } +}) + +# Printers matter for field terminals (label/receipt printers); configuration +# is recorded, no print job or driver change is issued. +$printers = @(Get-CimInstance -ClassName Win32_Printer -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Name + driver_name = Get-SafeValue $_.DriverName + port_name = Get-SafeValue $_.PortName + is_default = [bool]$_.Default + is_network = [bool]$_.Network + is_shared = [bool]$_.Shared + share_name = Get-SafeValue $_.ShareName + } +}) + +# MEG data directories: path metadata only, no enumeration of contents. +$megDataDirectories = @() +foreach ($root in (Get-ProgramFilesRoots)) { + $megDataDirectories += @(Get-DirectoryReport -Root $root -Filter '*MEG*') +} + +$installedSoftwareReview = @() +if (-not $NoSoftware) { + $installedSoftwareReview = @(Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue | + Where-Object { $_.DisplayName } | + ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.DisplayName + version = Get-SafeValue $_.DisplayVersion + install_location = Get-SafeValue $_.InstallLocation + } + } | Sort-Object -Property { $_['name'] }) +} + +$report = [ordered]@{ + schema_version = 1 + report_type = 'windows-pre-migration-data-export-manifest' + device_id = $deviceId + hostname = $currentHostname.ToLower() + current_hostname = $currentHostname + target_hostname = $targetHostname + dealer_id = $dealerIdValue + dealer_id_known = [bool]$dealerKnown + collected_at = $collectedAtLocal + collected_at_utc = $collectedAtUtc + read_only = $true + copies_performed = 0 + executed_external_tools = @() + notes = @($notes) + excluded_data = @( + 'file contents', 'credentials', 'passwords', 'browser profiles', 'private keys', + 'application databases', 'event logs', 'DPAPI blobs', + 'AppData', '.ssh', '.gnupg', '.aws', '.azure', '.config', + 'Cookies', 'Searches', 'Windows credential vault' + ) + candidate_folder_names = $candidateFolderNames + skipped_folder_names = $skippedFolderNames + candidate_folders = @($userFolders) + removable_media_roots = $removableRoots + mapped_network_drives = $mappedDrives + printers = $printers + meg_data_directories = $megDataDirectories + installed_software_review = $installedSoftwareReview +} + +$report | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $jsonPath -Encoding utf8 + +# --------------------------------------------------------------------------- +# Markdown report +# --------------------------------------------------------------------------- + +$lines = [System.Collections.Generic.List[string]]::new() +$lines.Add("# Windows Veri Aktarım İnceleme Kaydı — $deviceId") +$lines.Add('') +$lines.Add("- Toplama zamanı (UTC): $collectedAtUtc") +$lines.Add("- Mevcut hostname: $currentHostname") +$lines.Add("- Hedef hostname (geçiş sonrası): $targetHostname") +$lines.Add("- Bayi numarası biliniyor mu: $dealerKnown") +$lines.Add('- Bu rapor yalnız metadata içerir; hiçbir dosya kopyalanmaz, taşınmaz veya silinmez.') +$lines.Add('- Aktarım, iş sahibi onayı ve hedef medya doğrulaması sonrasında elle yapılmalıdır.') +$lines.Add('- Hariç tutulanlar: AppData, tarayıcı profilleri, kimlik bilgileri, private key ve uygulama veritabanları.') +$lines.Add('') +if ($notes.Count -gt 0) { + $lines.Add('## Uyarılar') + foreach ($note in $notes) { $lines.Add("- $note") } + $lines.Add('') +} +$lines.Add('## İncelenecek klasörler') +$lines.Add('') +foreach ($folder in $report.candidate_folders) { + $lines.Add("- $($folder['path']) — son değişiklik: $($folder['last_write_utc'])") +} +$lines.Add('') +$lines.Add('## Çıkarılabilir medya kökleri') +$lines.Add('') +foreach ($drive in $report.removable_media_roots) { + $lines.Add("- $($drive['path']) ($($drive['label'])): $($drive['free_gb'])/$($drive['size_gb']) GB boş") +} +$lines.Add('') +$lines.Add('## Eşlenmiş ağ sürücüleri') +$lines.Add('') +foreach ($drive in $report.mapped_network_drives) { + $lines.Add("- $($drive['local_name']) → $($drive['remote_name']) [$($drive['status'])]") +} +$lines.Add('') +$lines.Add('## Yazıcılar') +$lines.Add('') +foreach ($printer in $report.printers) { + $lines.Add("- $($printer['name']) — sürücü: $($printer['driver_name']), port: $($printer['port_name'])") +} +$lines.Add('') +$lines.Add('## MEG veri dizinleri (metadata)') +$lines.Add('') +foreach ($dir in $report.meg_data_directories) { + $lines.Add("- $($dir['path']) (son yazma: $($dir['last_write_utc']))") +} +$lines.Add('') +if ($NoSoftware) { + $lines.Add('Yazılım incelemesi -NoSoftware nedeniyle alınmadı.') +} else { + $lines.Add('## Yazılım incelemesi') + $lines.Add('') + foreach ($software in $report.installed_software_review) { + $lines.Add("- $($software['name']) — $($software['version'])") + } +} +$lines.Add('') +$lines.Add('---') +$lines.Add('') +$lines.Add('Bu manifest salt-okunur bir inceleme kaydıdır. Donanım/ağ/yazılım tarafı için BF-WindowsPreMigrationInventory.ps1 kullanılır.') +$lines | Set-Content -LiteralPath $markdownPath -Encoding utf8 + +Write-Output "Wrote $jsonPath and $markdownPath" + + + +<# +.SYNOPSIS + Read-only Windows pre-migration inventory for one Blueforce dealer. +.DESCRIPTION + Collects the full pre-migration picture of a Windows field terminal: + hardware, Windows version, disks/volumes, network (adapters, IP addresses, + DNS, gateways, routes, network profiles, proxy), serial/COM ports, USB + devices and hardware IDs, drivers, installed software, services, scheduled + tasks, Docker presence, VPN clients (WireGuard/OpenVPN/other), RustDesk and + AnyDesk device IDs, MEG application/service/configuration paths, and the + current Windows hostname. + + READ-ONLY CONTRACT (asserted by tests/check-migration-static.sh): + * No Set-*, New-*, Remove-* cmdlets, no service control, no network + configuration command, no registry write, no download. + * No credential, password, token or private key is collected. + * The registry is only ever read (Get-ItemProperty / Get-ChildItem). + * RustDesk/AnyDesk: only the numeric device ID value is extracted. The + RustDesk id_ed25519 private key and the contents of *.conf, *.ovpn and + *.dpapi files are never read - only their file names are listed. + * No external tool is executed (docker.exe included); all data comes from + CIM, the registry and file/directory metadata. + * The only writes are the JSON and Markdown reports under + -OutputDirectory; with -Check nothing is written at all. + + Output contract: BF--windows-inventory.json and + BF--windows-inventory.md, where is the 8-digit dealer number - not + the hostname of the machine being inventoried. +.PARAMETER DealerId + 8-digit Blueforce dealer number (^[0-9]{8}$). Device ID becomes BF-. +.PARAMETER DealerIdUnknown + Explicit opt-in for a device whose dealer number is not known yet. The report + is written as BF-unknown-windows-inventory.* and carries a prominent warning: + it must not be uploaded to the central inventory until the dealer number is + confirmed and the script is re-run with -DealerId. +.PARAMETER OutputDirectory + Directory that receives BF--windows-inventory.json and .md. +.PARAMETER NoSoftware + Skip the software surface (installed software, services, scheduled tasks, + drivers). Hardware, network, device and MEG-path sections are still collected. +.PARAMETER Check + Dry run: validate parameters, print the collection plan and the resolved + output paths, write nothing, exit 0. +.EXAMPLE + .\BF-WindowsPreMigrationInventory.ps1 -DealerId 12010193 -OutputDirectory C:\Blueforce\migration +.EXAMPLE + .\BF-WindowsPreMigrationInventory.ps1 -DealerIdUnknown -OutputDirectory C:\Blueforce\migration +.EXAMPLE + .\BF-WindowsPreMigrationInventory.ps1 -DealerId 12010193 -OutputDirectory C:\Blueforce\migration -Check +.NOTES + Elevation is not required and nothing is changed. Some CIM sections can be + incomplete when the script runs unelevated; that is reported in "notes". +#> +[CmdletBinding(DefaultParameterSetName = 'KnownDealer')] +param( + [Parameter(Mandatory, ParameterSetName = 'KnownDealer')] + [ValidatePattern('^[0-9]{8}$')] + [string]$DealerId, + + [Parameter(Mandatory, ParameterSetName = 'UnknownDealer')] + [switch]$DealerIdUnknown, + + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$OutputDirectory, + + [switch]$NoSoftware, + + [switch]$Check +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +function Get-SafeValue { + param([object]$Value) + if ($null -eq $Value) { return 'unknown' } + $text = ([string]$Value).Trim() + if ([string]::IsNullOrWhiteSpace($text)) { return 'unknown' } + return $text +} + +function ConvertTo-MarkdownCell { + param([object]$Value) + return ((Get-SafeValue $Value) -replace '\|', '\|' -replace "`r?`n", '; ') +} + +function ConvertTo-Gigabytes { + param([object]$Bytes) + if ($null -eq $Bytes) { return 'unknown' } + return [math]::Round(([double]$Bytes) / 1GB, 2) +} + +function ConvertTo-Megabytes { + param([object]$Bytes) + if ($null -eq $Bytes) { return 'unknown' } + return [long][math]::Round(([double]$Bytes) / 1MB) +} + +function ConvertTo-IsoUtc { + param([object]$Value) + if ($null -eq $Value) { return 'unknown' } + try { return ([datetime]$Value).ToUniversalTime().ToString('o') } catch { return 'unknown' } +} + +# Null-safe property read for CIM/WMI objects, so a missing class or a failed +# probe degrades to $null/'unknown' instead of aborting the report. +function Get-ObjectValue { + param([object]$InputObject, [string]$Name) + if ($null -eq $InputObject) { return $null } + $prop = $InputObject.PSObject.Properties | Where-Object { $_.Name -eq $Name } | Select-Object -First 1 + if ($null -eq $prop) { return $null } + return $prop.Value +} + +function Get-ProgramFilesRoots { + $roots = @() + if ($env:ProgramFiles) { $roots += $env:ProgramFiles } + if (${env:ProgramFiles(x86)}) { $roots += ${env:ProgramFiles(x86)} } + if ($env:ProgramData) { $roots += $env:ProgramData } + $roots += 'C:\' + return @($roots | Select-Object -Unique) +} + +# Reads named values from a registry key. Read-only; missing values stay +# 'unknown' and never abort the report. +function Get-RegistryValues { + param([string]$Path, [string[]]$Names) + $result = [ordered]@{} + foreach ($name in $Names) { $result[$name] = 'unknown' } + if (-not (Test-Path -LiteralPath $Path)) { return $result } + $props = Get-ItemProperty -LiteralPath $Path -ErrorAction SilentlyContinue + if ($null -eq $props) { return $result } + foreach ($name in $Names) { + $prop = $props.PSObject.Properties | Where-Object { $_.Name -eq $name } | Select-Object -First 1 + if ($null -ne $prop) { $result[$name] = Get-SafeValue $prop.Value } + } + return $result +} + +# Reads only the registry values whose NAME matches an exact allow-list +# pattern. Used to pick up path-like settings without ever touching +# credential/secret values that live in the same key. +function Get-RegistryValuesByNamePattern { + param([string]$Path, [string]$NamePattern) + $result = [ordered]@{} + if (-not (Test-Path -LiteralPath $Path)) { return $result } + $props = Get-ItemProperty -LiteralPath $Path -ErrorAction SilentlyContinue + if ($null -eq $props) { return $result } + foreach ($prop in $props.PSObject.Properties) { + if ($prop.Name -match $NamePattern) { $result[$prop.Name] = Get-SafeValue $prop.Value } + } + return $result +} + +# Extracts a single captured value from one line of a configuration file. +# The file content is never returned, stored or reported - only the capture +# group. This helper is NEVER called on key material (RustDesk id_ed25519, +# *.ovpn, *.dpapi). +function Get-ConfigFileValue { + param([string]$Path, [string]$LinePattern, [string]$CapturePattern) + if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) { return 'not-found' } + $hit = Select-String -LiteralPath $Path -Pattern $LinePattern -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($null -eq $hit) { return 'not-found' } + if ($hit.Line -match $CapturePattern) { return (Get-SafeValue $Matches[1]) } + return 'not-found' +} + +function Get-FileVersionInfo { + param([string]$Path) + if (-not $Path) { return 'unknown' } + if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) { return 'not-found' } + $item = Get-Item -LiteralPath $Path -ErrorAction SilentlyContinue + if ($null -eq $item) { return 'unknown' } + if ($null -eq $item.VersionInfo) { return 'unknown' } + return (Get-SafeValue $item.VersionInfo.FileVersion) +} + +# Directory metadata (path + mtime) only; no file contents. +function Get-DirectoryReport { + param([string]$Root, [string]$Filter) + if ([string]::IsNullOrWhiteSpace($Root)) { return @() } + if (-not (Test-Path -LiteralPath $Root -PathType Container)) { return @() } + return @(Get-ChildItem -LiteralPath $Root -Directory -Filter $Filter -ErrorAction SilentlyContinue | + ForEach-Object { + [ordered]@{ + path = $_.FullName + last_write_utc = ConvertTo-IsoUtc $_.LastWriteTimeUtc + review_required = $true + } + }) +} + +# File NAMES only for review lists such as VPN tunnel configs (contents are +# credentials/keys and are deliberately never read). +function Get-FileNameReport { + param([string[]]$Roots, [string]$Filter) + $out = @() + foreach ($root in $Roots) { + if ([string]::IsNullOrWhiteSpace($root)) { continue } + if (-not (Test-Path -LiteralPath $root -PathType Container)) { continue } + $out += @(Get-ChildItem -LiteralPath $root -File -Filter $Filter -ErrorAction SilentlyContinue | + ForEach-Object { + [ordered]@{ + name = $_.Name + path = $_.FullName + last_write_utc = ConvertTo-IsoUtc $_.LastWriteTimeUtc + contents_read = $false + } + }) + } + return @($out) +} + +function Get-NamesOf { + param([object[]]$Items) + return @($Items | ForEach-Object { $_['name'] }) +} + +function Get-InstalledSoftware { + $uninstallPaths = @( + 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', + 'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*', + 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' + ) + $items = Get-ItemProperty -Path $uninstallPaths -ErrorAction SilentlyContinue | + Where-Object { -not [string]::IsNullOrWhiteSpace($_.DisplayName) } | + ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.DisplayName + version = Get-SafeValue $_.DisplayVersion + publisher = Get-SafeValue $_.Publisher + install_date = Get-SafeValue $_.InstallDate + install_location = Get-SafeValue $_.InstallLocation + } + } + return @($items | Sort-Object -Property { $_['name'] }) +} + +# Running services, auto-start services that are NOT running (a migration +# signal), and the subset relevant to remote access / Docker / VPN / MEG. +function Get-ServiceSnapshot { + $watchlist = '(?i)docker|wireguard|openvpn|rustdesk|anydesk|mesh|meg|blueforce|teamviewer|tailscale|zerotier|forti|anyconnect|globalprotect|vpn' + $rows = @(Get-CimInstance -ClassName Win32_Service -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Name + display_name = Get-SafeValue $_.DisplayName + state = Get-SafeValue $_.State + start_mode = Get-SafeValue $_.StartMode + start_name = Get-SafeValue $_.StartName + path = Get-SafeValue $_.PathName + } + }) + $running = @($rows | Where-Object { $_['state'] -eq 'Running' } | Sort-Object -Property { $_['name'] }) + $stoppedAuto = @($rows | Where-Object { $_['state'] -eq 'Stopped' -and $_['start_mode'] -eq 'Auto' } | Sort-Object -Property { $_['name'] }) + $relevant = @($rows | Where-Object { ($_['name'] + ' ' + $_['display_name']) -match $watchlist } | Sort-Object -Property { $_['name'] }) + return [ordered]@{ + total_services = $rows.Count + selection = 'running + auto-start-but-stopped + migration-relevant; a dump of every stopped/disabled service is intentionally omitted to keep the report bounded' + running = $running + auto_start_but_stopped = $stoppedAuto + relevant_to_migration = $relevant + } +} + +# Non-Microsoft scheduled tasks (vendor tasks) plus the migration-relevant +# subset. Uses the ScheduledTasks module only; no other execution path. +function Get-ScheduledTaskSnapshot { + $watchlist = '(?i)docker|meg|blueforce|vpn|wireguard|openvpn|rustdesk|anydesk|mesh|backup|veeam|acronis' + $tasks = @() + try { + $tasks = @(Get-ScheduledTask -ErrorAction Stop | + Where-Object { $_.TaskPath -notlike '\Microsoft\*' } | + ForEach-Object { + [ordered]@{ + task_path = Get-SafeValue $_.TaskPath + task_name = Get-SafeValue $_.TaskName + state = Get-SafeValue ([string]$_.State) + author = Get-SafeValue $_.Author + run_as_user = Get-SafeValue $_.Principal.UserId + } + }) + } catch { + return [ordered]@{ + available = $false + note = 'Get-ScheduledTask unavailable on this host; scheduled-task enumeration skipped (no other tool is invoked).' + total = 0 + items = @() + relevant_to_migration = @() + } + } + $items = @($tasks | Sort-Object -Property { $_['task_path'] + $_['task_name'] }) + return [ordered]@{ + available = $true + note = 'Non-Microsoft task paths only.' + total = $items.Count + items = $items + relevant_to_migration = @($items | Where-Object { ($_['task_path'] + $_['task_name']) -match $watchlist }) + } +} + +# COM/serial ports from three read-only sources: CIM, the SERIALCOMM device +# map, and PnP entities whose friendly name carries a (COMx) suffix. +function Get-ComPortSnapshot { + $cimPorts = @(Get-CimInstance -ClassName Win32_SerialPort -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + device_id = Get-SafeValue $_.DeviceID + name = Get-SafeValue $_.Name + description = Get-SafeValue $_.Description + provider_type = Get-SafeValue $_.ProviderType + pnp_device_id = Get-SafeValue $_.PNPDeviceID + } + }) + $deviceMap = [ordered]@{} + if (Test-Path -LiteralPath 'HKLM:\HARDWARE\DEVICEMAP\SERIALCOMM') { + $props = Get-ItemProperty -LiteralPath 'HKLM:\HARDWARE\DEVICEMAP\SERIALCOMM' -ErrorAction SilentlyContinue + if ($null -ne $props) { + foreach ($prop in $props.PSObject.Properties) { + if ($prop.Name -like 'PS*') { continue } + $deviceMap[$prop.Name] = Get-SafeValue $prop.Value + } + } + } + $pnpPorts = @(Get-CimInstance -ClassName Win32_PnPEntity -ErrorAction SilentlyContinue | + Where-Object { $_.Name -like '*(COM*' } | + ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Name + device_id = Get-SafeValue $_.DeviceID + status = Get-SafeValue $_.Status + } + }) + return [ordered]@{ + cim_serial_ports = $cimPorts + registry_devicemap = $deviceMap + pnp_com_devices = $pnpPorts + } +} + +# USB devices with their hardware IDs (VID_/PID_ live in DeviceID) plus the +# USB host controllers. +function Get-UsbSnapshot { + $devices = @(Get-CimInstance -ClassName Win32_PnPEntity -ErrorAction SilentlyContinue | + Where-Object { $_.DeviceID -like 'USB\*' -or $_.PNPClass -eq 'USB' } | + ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Name + description = Get-SafeValue $_.Description + hardware_id = Get-SafeValue $_.DeviceID + device_class = Get-SafeValue $_.PNPClass + status = Get-SafeValue $_.Status + service = Get-SafeValue $_.Service + } + }) + $controllers = @(Get-CimInstance -ClassName Win32_USBController -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Name + device_id = Get-SafeValue $_.DeviceID + } + }) + return [ordered]@{ + devices = @($devices | Sort-Object -Property { $_['name'] }) + controllers = $controllers + } +} + +function Get-DriverSnapshot { + $drivers = @(Get-CimInstance -ClassName Win32_PnPSignedDriver -ErrorAction SilentlyContinue | + Where-Object { $_.DeviceName } | + ForEach-Object { + [ordered]@{ + device_name = Get-SafeValue $_.DeviceName + device_class = Get-SafeValue $_.DeviceClass + manufacturer = Get-SafeValue $_.Manufacturer + driver_provider = Get-SafeValue $_.DriverProviderName + driver_version = Get-SafeValue $_.DriverVersion + driver_date = ConvertTo-IsoUtc $_.DriverDate + inf_name = Get-SafeValue $_.InfName + } + }) + return [ordered]@{ + total = $drivers.Count + items = @($drivers | Sort-Object -Property { $_['device_name'] }) + } +} + +# Docker presence from install metadata and service state only. docker.exe is +# never executed: no engine contact, no image/build/container side effect. +function Get-DockerSnapshot { + $roots = Get-ProgramFilesRoots + $dockerCli = 'unknown' + $cmd = Get-Command -Name 'docker.exe' -ErrorAction SilentlyContinue + if ($null -ne $cmd) { $dockerCli = Get-SafeValue (Get-ObjectValue $cmd 'Source') } + + $desktopApp = 'not-found' + foreach ($root in $roots) { + $candidate = Join-Path $root 'Docker\Docker\Docker Desktop.exe' + if (Test-Path -LiteralPath $candidate -PathType Leaf) { $desktopApp = $candidate; break } + } + + $service = $null + $svc = Get-CimInstance -ClassName Win32_Service -Filter "Name='com.docker.service'" -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($null -ne $svc) { + $service = [ordered]@{ + name = Get-SafeValue (Get-ObjectValue $svc 'Name') + state = Get-SafeValue (Get-ObjectValue $svc 'State') + start_mode = Get-SafeValue (Get-ObjectValue $svc 'StartMode') + } + } + + $wslDistros = @() + if (Test-Path -LiteralPath 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss') { + $wslDistros = @(Get-ChildItem -LiteralPath 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss' -ErrorAction SilentlyContinue | + ForEach-Object { + $props = Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction SilentlyContinue + if ($null -eq $props) { return } + if (@($props.PSObject.Properties.Name) -contains 'DistributionName') { + Get-SafeValue $props.DistributionName + } + } | Where-Object { $_ }) + } + + $present = ($dockerCli -ne 'unknown') -or ($desktopApp -ne 'not-found') -or ($null -ne $service) + return [ordered]@{ + present = [bool]$present + docker_cli_path = $dockerCli + docker_cli_file_version = Get-FileVersionInfo $dockerCli + desktop_app_path = $desktopApp + desktop_app_file_version = Get-FileVersionInfo $desktopApp + service = $service + wsl_distributions = @($wslDistros) + note = 'Presence and file metadata only; the docker CLI is never executed.' + } +} + +# VPN clients: installed software matches, related services, tunnel/profile +# NAMES (contents of *.conf.dpapi and *.ovpn are credentials and are not read). +function Get-VpnSnapshot { + param([object[]]$Software, [object[]]$Services) + + $softwarePattern = '(?i)(wireguard|openvpn|tailscale|zerotier|anyconnect|forticlient|globalprotect|softether|nordvpn|protonvpn|expressvpn|surfshark|windscribe)' + $softwareMatches = @($Software | Where-Object { ($_['name'] + ' ' + $_['publisher']) -match $softwarePattern }) + $servicePattern = '(?i)wireguard|openvpn|tailscale|zerotier|anyconnect|forticlient|globalprotect|vpnagent' + $serviceMatches = @($Services | Where-Object { ($_['name'] + ' ' + $_['display_name']) -match $servicePattern }) + + $roots = Get-ProgramFilesRoots + $wireguardDirs = @() + $openVpnDirs = @() + foreach ($root in $roots) { + $wireguardDirs += (Join-Path $root 'WireGuard\Data\Configurations') + $openVpnDirs += (Join-Path $root 'OpenVPN\config') + $openVpnDirs += (Join-Path $root 'OpenVPN\config-auto') + } + + $wireguardKeys = @() + if (Test-Path -LiteralPath 'HKLM:\SOFTWARE\WireGuard') { + $wireguardKeys = @(Get-ChildItem -LiteralPath 'HKLM:\SOFTWARE\WireGuard' -ErrorAction SilentlyContinue | + ForEach-Object { Get-SafeValue (Get-ObjectValue $_ 'Name') }) + } + $wireguardTunnels = @(Get-FileNameReport -Roots $wireguardDirs -Filter '*.conf.dpapi') + $openVpnProfiles = @(Get-FileNameReport -Roots $openVpnDirs -Filter '*.ovpn') + + $wireguardPresent = (@($softwareMatches | Where-Object { $_['name'] -match '(?i)wireguard' }).Count -gt 0) -or + ($wireguardKeys.Count -gt 0) -or ($wireguardTunnels.Count -gt 0) + $openVpnPresent = (@($softwareMatches | Where-Object { $_['name'] -match '(?i)openvpn' }).Count -gt 0) -or + ($openVpnProfiles.Count -gt 0) + + return [ordered]@{ + wireguard = [ordered]@{ + present = [bool]$wireguardPresent + registry_tunnels = $wireguardKeys + tunnel_config_files = $wireguardTunnels + contents_note = 'Tunnel configuration contents are never read; only file names are listed.' + } + openvpn = [ordered]@{ + present = [bool]$openVpnPresent + profile_files = $openVpnProfiles + registry_paths = Get-RegistryValuesByNamePattern -Path 'HKLM:\SOFTWARE\OpenVPN' -NamePattern '(?i)^(config_dir|config_auto|config|log_dir|exe_path|install_dir)$' + contents_note = 'Profile contents (certificates/keys) are never read; only file names are listed.' + } + installed_vpn_software = $softwareMatches + vpn_services = $serviceMatches + } +} + +# RustDesk / AnyDesk device IDs. Only the ID value is extracted: for RustDesk +# the registry value literally named 'id' or the id = ... line of +# RustDesk.toml; for AnyDesk the ad.anynet.id value. Private-key files +# (id_ed25519) and password/hash settings are never opened. +function Get-RemoteAccessSnapshot { + param([object[]]$Services) + + $rustdeskId = 'not-found' + foreach ($path in @('HKCU:\Software\RustDesk', 'HKLM:\Software\RustDesk', 'HKLM:\Software\WOW6432Node\RustDesk')) { + if ($rustdeskId -ne 'not-found') { break } + if (-not (Test-Path -LiteralPath $path)) { continue } + $props = Get-ItemProperty -LiteralPath $path -ErrorAction SilentlyContinue + if ($null -eq $props) { continue } + $idProp = $props.PSObject.Properties | Where-Object { $_.Name -eq 'id' } | Select-Object -First 1 + if ($null -ne $idProp) { $rustdeskId = Get-SafeValue $idProp.Value } + } + if ($rustdeskId -eq 'not-found' -and $env:APPDATA) { + foreach ($file in @('RustDesk.toml', 'RustDesk2.toml')) { + $value = Get-ConfigFileValue -Path (Join-Path $env:APPDATA "RustDesk\config\$file") ` + -LinePattern '^\s*id\s*=' -CapturePattern "id\s*=\s*'?([0-9A-Za-z]+)'?" + if ($value -ne 'not-found') { $rustdeskId = $value; break } + } + } + + $anydeskId = 'not-found' + foreach ($path in @('HKLM:\Software\AnyDesk', 'HKCU:\Software\AnyDesk', 'HKLM:\Software\WOW6432Node\AnyDesk')) { + if ($anydeskId -ne 'not-found') { break } + if (-not (Test-Path -LiteralPath $path)) { continue } + $props = Get-ItemProperty -LiteralPath $path -ErrorAction SilentlyContinue + if ($null -eq $props) { continue } + $idProp = $props.PSObject.Properties | + Where-Object { $_.Name -match '(?i)^ad\.anynet\.id$|^anynet[._]?id$|^client[._]?id$' } | + Select-Object -First 1 + if ($null -ne $idProp) { $anydeskId = Get-SafeValue $idProp.Value } + } + if ($anydeskId -eq 'not-found') { + $confFiles = @() + if ($env:ProgramData) { $confFiles += (Join-Path $env:ProgramData 'AnyDesk\system.conf') } + if ($env:APPDATA) { $confFiles += (Join-Path $env:APPDATA 'AnyDesk\user.conf') } + foreach ($file in $confFiles) { + $value = Get-ConfigFileValue -Path $file ` + -LinePattern '^\s*ad\.anynet\.id\s*=' -CapturePattern 'ad\.anynet\.id\s*=\s*([0-9A-Za-z]+)' + if ($value -ne 'not-found') { $anydeskId = $value; break } + } + } + + $servicePattern = '(?i)rustdesk|anydesk|mesh|teamviewer' + return [ordered]@{ + rustdesk_id = $rustdeskId + anydesk_id = $anydeskId + rustdesk_id_source = 'registry value named id, else the id line of RustDesk.toml (the id_ed25519 private key is never read)' + anydesk_id_source = 'registry ad.anynet.id, else the ad.anynet.id line of system.conf/user.conf (password/hash settings are never read)' + remote_access_services = @($Services | Where-Object { ($_['name'] + ' ' + $_['display_name']) -match $servicePattern }) + } +} + +# MEG application/service/configuration paths. Directory and registry key +# NAMES plus path-like registry values only; no directory contents, no +# arbitrary registry values. +function Get-MegSnapshot { + param([object[]]$Software, [object[]]$Services, [string[]]$Roots) + + $megPattern = '(?i)\bmeg\b' + $softwareMatches = @($Software | Where-Object { ($_['name'] + ' ' + $_['publisher']) -match $megPattern }) + $serviceMatches = @($Services | Where-Object { ($_['name'] + ' ' + $_['display_name']) -match $megPattern }) + + $directories = @() + foreach ($root in $Roots) { $directories += @(Get-DirectoryReport -Root $root -Filter '*MEG*') } + + $registryKeys = @() + foreach ($base in @('HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\WOW6432Node', 'HKCU:\Software')) { + if (-not (Test-Path -LiteralPath $base)) { continue } + $registryKeys += @(Get-ChildItem -LiteralPath $base -ErrorAction SilentlyContinue | + Where-Object { $_.PSChildName -match $megPattern } | + ForEach-Object { Get-SafeValue $_.Name }) + } + $registryKeys = @($registryKeys | Where-Object { $_ -ne 'unknown' } | Select-Object -Unique) + + $registryPaths = [ordered]@{} + foreach ($key in $registryKeys) { + # Registry key names come back as HKEY_LOCAL_MACHINE\...; map them to + # the PowerShell drive form before reading. + $readPath = $key -replace '^HKEY_LOCAL_MACHINE', 'HKLM:' -replace '^HKEY_CURRENT_USER', 'HKCU:' + $registryPaths[$key] = Get-RegistryValuesByNamePattern -Path $readPath ` + -NamePattern '(?i)^(install(path|dir)?|config(path|dir)?|data(path|dir)?|app(path|dir)?|exe(path)?|program(path|dir)?)$' + } + + $installLocations = @($softwareMatches | ForEach-Object { $_['install_location'] } | Where-Object { $_ -ne 'unknown' }) + + return [ordered]@{ + software = @($softwareMatches) + services = @($serviceMatches) + config_directories = @($directories) + registry_keys = @($registryKeys) + registry_paths = $registryPaths + install_locations = @($installLocations) + note = 'Directory and registry key names plus path-like values only; no file contents and no arbitrary registry values.' + } +} + +function Get-NetworkSnapshot { + $configs = @(Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration -Filter 'IPEnabled=True' -ErrorAction SilentlyContinue | + ForEach-Object { + $addresses = @($_.IPAddress | Where-Object { $_ }) + [ordered]@{ + description = Get-SafeValue $_.Description + mac_address = Get-SafeValue $_.MACAddress + dhcp_enabled = [bool]$_.DHCPEnabled + dhcp_server = Get-SafeValue $_.DHCPServer + ipv4_addresses = @($addresses | Where-Object { $_ -match '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' }) + ipv6_addresses = @($addresses | Where-Object { $_ -match ':' }) + subnet_masks = @($_.IPSubnet | Where-Object { $_ }) + default_gateways = @($_.DefaultIPGateway | Where-Object { $_ }) + dns_servers = @($_.DNSServerSearchOrder | Where-Object { $_ }) + dns_domain = Get-SafeValue $_.DNSDomain + dns_hostname = Get-SafeValue $_.DNSHostName + } + }) + + $routes = @(Get-CimInstance -ClassName Win32_IP4RouteTable -ErrorAction SilentlyContinue | + ForEach-Object { + [ordered]@{ + destination = Get-SafeValue $_.Destination + netmask = Get-SafeValue $_.Mask + next_hop = Get-SafeValue $_.NextHop + interface_index = Get-SafeValue $_.InterfaceIndex + metric = Get-SafeValue $_.Metric1 + protocol = Get-SafeValue $_.Protocol + route_type = Get-SafeValue $_.Type + } + } | Sort-Object -Property { $_['destination'] }) + + $profiles = @() + $profileRoot = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles' + if (Test-Path -LiteralPath $profileRoot) { + $profiles = @(Get-ChildItem -LiteralPath $profileRoot -ErrorAction SilentlyContinue | + ForEach-Object { + $props = Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction SilentlyContinue + if ($null -eq $props) { return } + [ordered]@{ + name = Get-SafeValue $props.ProfileName + description = Get-SafeValue $props.Description + category = Get-SafeValue $props.Category + } + }) + } + + return [ordered]@{ + interfaces = $configs + macs = @($configs | ForEach-Object { $_['mac_address'] } | Where-Object { $_ -ne 'unknown' } | Select-Object -Unique) + ipv4_addresses = @($configs | ForEach-Object { $_['ipv4_addresses'] } | Where-Object { $_ }) + default_gateways = @($configs | ForEach-Object { $_['default_gateways'] } | Where-Object { $_ } | Select-Object -Unique) + dns_servers = @($configs | ForEach-Object { $_['dns_servers'] } | Where-Object { $_ } | Select-Object -Unique) + routes = $routes + network_profiles = $profiles + profile_source_note = 'Network profile names come from the NetworkList registry hive; no network configuration command is invoked.' + proxy = Get-RegistryValuesByNamePattern -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -NamePattern '(?i)^(ProxyEnable|ProxyServer|ProxyOverride|AutoConfigURL)$' + } +} + +# --------------------------------------------------------------------------- +# Identity, parameters, dry-run gate +# --------------------------------------------------------------------------- + +$dealerKnown = ($PSCmdlet.ParameterSetName -eq 'KnownDealer') +$dealerIdValue = 'unknown' +if ($dealerKnown) { $dealerIdValue = $DealerId } +$DealerId = $dealerIdValue +$deviceId = "BF-$DealerId" +$targetHostname = 'unknown' +if ($dealerKnown) { $targetHostname = "bf-$DealerId" } + +$currentHostname = Get-SafeValue $env:COMPUTERNAME +if ($currentHostname -eq 'unknown') { + $currentHostname = Get-SafeValue (Get-ObjectValue (Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction SilentlyContinue) 'Name') +} +$hostName = $currentHostname.ToLower() + +$now = Get-Date +$collectedAtUtc = $now.ToUniversalTime().ToString('o') +$collectedAtLocal = $now.ToString('o') + +$baseName = "BF-$DealerId-windows-inventory" +$jsonPath = Join-Path $OutputDirectory "$baseName.json" +$markdownPath = Join-Path $OutputDirectory "$baseName.md" + +$isElevated = $false +try { + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $isElevated = ([Security.Principal.WindowsPrincipal]$identity).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +} catch { $isElevated = $false } + +$notes = [System.Collections.Generic.List[string]]::new() +if (-not $dealerKnown) { + $notes.Add('WARNING: dealer number unknown (-DealerIdUnknown). Output is BF-unknown-windows-inventory.* and must NOT be uploaded to the central inventory until the dealer number is confirmed and the script is re-run with -DealerId.') +} +if (-not $isElevated) { + $notes.Add('Not running elevated: some CIM sections may be incomplete. Nothing is changed either way.') +} +$notes.Add('Read-only run: no configuration, service, registry or network state is modified and no download is performed.') + +if ($Check) { + $softwarePlan = 'collected' + if ($NoSoftware) { $softwarePlan = 'skipped (-NoSoftware)' } + Write-Output "CHECK: $baseName.ps1 read-only dry run" + Write-Output " dealer_id : $dealerIdValue (known: $dealerKnown)" + Write-Output " device_id : $deviceId" + Write-Output " hostname : $hostName" + Write-Output " target_hostname: $targetHostname" + Write-Output " output_json : $jsonPath" + Write-Output " output_md : $markdownPath" + Write-Output " software_surface: $softwarePlan" + Write-Output ' writes : none (dry run)' + exit 0 +} + +New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null + +# --------------------------------------------------------------------------- +# Collection +# --------------------------------------------------------------------------- + +$computerSystem = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction SilentlyContinue +$bios = Get-CimInstance -ClassName Win32_BIOS -ErrorAction SilentlyContinue +$operatingSystem = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue +$processor = Get-CimInstance -ClassName Win32_Processor -ErrorAction SilentlyContinue | Select-Object -First 1 +$videoController = Get-CimInstance -ClassName Win32_VideoController -ErrorAction SilentlyContinue | Select-Object -First 1 + +$biosSmbiosVersion = Get-SafeValue (Get-ObjectValue $bios 'SMBIOSBIOSVersion') +$biosVersion = $biosSmbiosVersion +if ($biosVersion -eq 'unknown') { $biosVersion = Get-SafeValue (Get-ObjectValue $bios 'Version') } + +$windowsRegistry = Get-RegistryValues -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Names @( + 'ProductName', 'EditionID', 'DisplayVersion', 'ReleaseId', 'CurrentBuild', 'UBR', 'InstallationType' +) +# Windows ProductId is a licence identifier and is deliberately not collected. + +$hotfixes = @(Get-CimInstance -ClassName Win32_QuickFixEngineering -ErrorAction SilentlyContinue | + ForEach-Object { + [ordered]@{ + hotfix_id = Get-SafeValue $_.HotFixID + description = Get-SafeValue $_.Description + installed_on = Get-SafeValue $_.InstalledOn + } + } | Sort-Object -Property { $_['hotfix_id'] }) + +$diskData = @(Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + name = Get-SafeValue $_.Model + size_gb = ConvertTo-Gigabytes $_.Size + interface_type = Get-SafeValue $_.InterfaceType + media_type = Get-SafeValue $_.MediaType + serial = Get-SafeValue $_.SerialNumber + partitions = Get-SafeValue $_.Partitions + } +}) +$volumeData = @(Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + drive = Get-SafeValue $_.DeviceID + label = Get-SafeValue $_.VolumeName + file_system = Get-SafeValue $_.FileSystem + size_gb = ConvertTo-Gigabytes $_.Size + free_gb = ConvertTo-Gigabytes $_.FreeSpace + } +}) +$userProfiles = @(Get-CimInstance -ClassName Win32_UserProfile -ErrorAction SilentlyContinue | + Where-Object { -not $_.Special -and $_.LocalPath } | + ForEach-Object { + [ordered]@{ + path = Get-SafeValue $_.LocalPath + loaded = [bool]$_.Loaded + last_use_time = ConvertTo-IsoUtc $_.LastUseTime + } + }) + +$installedSoftware = @() +$serviceSnapshot = $null +$serviceRows = @() +$taskSnapshot = $null +$driverSnapshot = $null +if (-not $NoSoftware) { + $installedSoftware = @(Get-InstalledSoftware) + $serviceSnapshot = Get-ServiceSnapshot + $serviceRows = @($serviceSnapshot['running']) + @($serviceSnapshot['relevant_to_migration']) + $taskSnapshot = Get-ScheduledTaskSnapshot + $driverSnapshot = Get-DriverSnapshot +} + +$megRoots = @(Get-ProgramFilesRoots) + +$inventory = [ordered]@{ + schema_version = 1 + report_type = 'windows-pre-migration-inventory' + device_id = $deviceId + hostname = $hostName + current_hostname = $currentHostname + target_hostname = $targetHostname + dealer_id = $dealerIdValue + dealer_id_known = [bool]$dealerKnown + collected_at = $collectedAtLocal + collected_at_utc = $collectedAtUtc + read_only = $true + collection_scope = [ordered]@{ + read_only = $true + elevated = [bool]$isElevated + software_surface_included = (-not $NoSoftware) + executed_external_tools = @() + excluded = @( + 'credentials', 'passwords', 'private keys', 'tokens', 'file contents', + 'browser profiles', 'event logs', 'DPAPI blobs', 'Windows ProductId', + 'VPN tunnel/profile file contents', 'RustDesk id_ed25519 private key' + ) + } + notes = @($notes) + manufacturer = Get-SafeValue (Get-ObjectValue $computerSystem 'Manufacturer') + model = Get-SafeValue (Get-ObjectValue $computerSystem 'Model') + serial = Get-SafeValue (Get-ObjectValue $bios 'SerialNumber') + bios = [ordered]@{ + vendor = Get-SafeValue (Get-ObjectValue $bios 'Manufacturer') + version = $biosVersion + smbios_version = $biosSmbiosVersion + date = Get-SafeValue (Get-ObjectValue $bios 'ReleaseDate') + } + cpu = [ordered]@{ + model = Get-SafeValue (Get-ObjectValue $processor 'Name') + cores = Get-SafeValue (Get-ObjectValue $processor 'NumberOfCores') + logical_processors = Get-SafeValue (Get-ObjectValue $processor 'NumberOfLogicalProcessors') + arch = Get-SafeValue (Get-ObjectValue $operatingSystem 'OSArchitecture') + address_width = Get-SafeValue (Get-ObjectValue $processor 'AddressWidth') + } + memory_mb = ConvertTo-Megabytes (Get-ObjectValue $computerSystem 'TotalPhysicalMemory') + disks = $diskData + volumes = $volumeData + gpu = [ordered]@{ + model = Get-SafeValue (Get-ObjectValue $videoController 'Name') + driver_version = Get-SafeValue (Get-ObjectValue $videoController 'DriverVersion') + video_processor = Get-SafeValue (Get-ObjectValue $videoController 'VideoProcessor') + adapter_ram_mb = ConvertTo-Megabytes (Get-ObjectValue $videoController 'AdapterRAM') + } + os = [ordered]@{ + distro = Get-SafeValue (Get-ObjectValue $operatingSystem 'Caption') + version = Get-SafeValue (Get-ObjectValue $operatingSystem 'Version') + build = Get-SafeValue (Get-ObjectValue $operatingSystem 'BuildNumber') + } + windows = [ordered]@{ + product_name = $windowsRegistry['ProductName'] + edition_id = $windowsRegistry['EditionID'] + display_version = $windowsRegistry['DisplayVersion'] + release_id = $windowsRegistry['ReleaseId'] + current_build = $windowsRegistry['CurrentBuild'] + ubr = $windowsRegistry['UBR'] + installation_type = $windowsRegistry['InstallationType'] + caption = Get-SafeValue (Get-ObjectValue $operatingSystem 'Caption') + version = Get-SafeValue (Get-ObjectValue $operatingSystem 'Version') + build = Get-SafeValue (Get-ObjectValue $operatingSystem 'BuildNumber') + architecture = Get-SafeValue (Get-ObjectValue $operatingSystem 'OSArchitecture') + install_date = ConvertTo-IsoUtc (Get-ObjectValue $operatingSystem 'InstallDate') + last_boot = ConvertTo-IsoUtc (Get-ObjectValue $operatingSystem 'LastBootUpTime') + product_id_collected = $false + hotfixes = $hotfixes + } + network = Get-NetworkSnapshot + serial_ports = Get-ComPortSnapshot + usb = Get-UsbSnapshot + drivers = $driverSnapshot + installed_software = $installedSoftware + services = $serviceSnapshot + scheduled_tasks = $taskSnapshot + docker = Get-DockerSnapshot + vpn = Get-VpnSnapshot -Software $installedSoftware -Services $serviceRows + remote_access = Get-RemoteAccessSnapshot -Services $serviceRows + meg = Get-MegSnapshot -Software $installedSoftware -Services $serviceRows -Roots $megRoots + user_profiles = $userProfiles +} + +$inventory | ConvertTo-Json -Depth 10 | Set-Content -LiteralPath $jsonPath -Encoding utf8 + +# --------------------------------------------------------------------------- +# Markdown report +# --------------------------------------------------------------------------- + +$lines = [System.Collections.Generic.List[string]]::new() +$lines.Add("# Windows Ön Geçiş Envanteri — $deviceId") +$lines.Add('') +$lines.Add("- Toplama zamanı (UTC): $collectedAtUtc") +$lines.Add("- Mevcut hostname: $currentHostname") +$lines.Add("- Hedef hostname (geçiş sonrası): $targetHostname") +$lines.Add("- Bayi numarası biliniyor mu: $dealerKnown") +$lines.Add("- Kapsam: yalnız okuma; kimlik bilgisi, parola, private key, dosya içeriği ve olay kaydı toplanmaz.") +$lines.Add('') +if ($notes.Count -gt 0) { + $lines.Add('## Uyarılar') + foreach ($note in $notes) { $lines.Add("- $note") } + $lines.Add('') +} +$lines.Add('## Kimlik ve donanım') +$lines.Add('') +$lines.Add('| Alan | Değer |') +$lines.Add('|---|---|') +foreach ($item in @( + @{ Name = 'Device ID'; Value = $inventory.device_id }, + @{ Name = 'Mevcut hostname'; Value = $inventory.current_hostname }, + @{ Name = 'Hedef hostname'; Value = $inventory.target_hostname }, + @{ Name = 'Üretici'; Value = $inventory.manufacturer }, + @{ Name = 'Model'; Value = $inventory.model }, + @{ Name = 'Seri no'; Value = $inventory.serial }, + @{ Name = 'BIOS'; Value = "$($inventory.bios.version)" }, + @{ Name = 'CPU'; Value = "$($inventory.cpu.model)" }, + @{ Name = 'Çekirdek'; Value = "$($inventory.cpu.cores)/$($inventory.cpu.logical_processors)" }, + @{ Name = 'Mimari'; Value = $inventory.cpu.arch }, + @{ Name = 'RAM (MB)'; Value = $inventory.memory_mb }, + @{ Name = 'GPU'; Value = $inventory.gpu.model } +)) { $lines.Add("| $($item['Name']) | $(ConvertTo-MarkdownCell $item['Value']) |") } +$lines.Add('') +$lines.Add('## Windows sürümü') +$lines.Add('') +$lines.Add('| Alan | Değer |') +$lines.Add('|---|---|') +foreach ($item in @( + @{ Name = 'Ürün'; Value = $inventory.windows.product_name }, + @{ Name = 'Sürüm (DisplayVersion)'; Value = $inventory.windows.display_version }, + @{ Name = 'ReleaseId'; Value = $inventory.windows.release_id }, + @{ Name = 'Build'; Value = "$($inventory.windows.current_build).$($inventory.windows.ubr)" }, + @{ Name = 'Kurulum tipi'; Value = $inventory.windows.installation_type }, + @{ Name = 'Kurulum tarihi'; Value = $inventory.windows.install_date }, + @{ Name = 'Son boot'; Value = $inventory.windows.last_boot }, + @{ Name = 'Hotfix sayısı'; Value = $inventory.windows.hotfixes.Count } +)) { $lines.Add("| $($item['Name']) | $(ConvertTo-MarkdownCell $item['Value']) |") } +$lines.Add('') +$lines.Add('## Diskler ve birimler') +$lines.Add('') +foreach ($disk in $inventory.disks) { + $lines.Add("- $($disk['name']): $($disk['size_gb']) GB ($($disk['interface_type']), $($disk['media_type'])); seri: $($disk['serial'])") +} +foreach ($volume in $inventory.volumes) { + $lines.Add("- Birim $($volume['drive']) ($($volume['label'])): $($volume['free_gb'])/$($volume['size_gb']) GB boş, $($volume['file_system'])") +} +$lines.Add('') +$lines.Add('## Ağ') +$lines.Add('') +$lines.Add('| Bağdaştırıcı | MAC | DHCP | IPv4 | Gateway | DNS |') +$lines.Add('|---|---|---|---|---|---|') +foreach ($adapter in $inventory.network.interfaces) { + $lines.Add("| $(ConvertTo-MarkdownCell $adapter['description']) | $($adapter['mac_address']) | $($adapter['dhcp_enabled']) | $($adapter['ipv4_addresses'] -join ', ') | $($adapter['default_gateways'] -join ', ') | $($adapter['dns_servers'] -join ', ') |") +} +$lines.Add('') +$lines.Add("- Varsayılan gateway'ler: $($inventory.network.default_gateways -join ', ')") +$lines.Add("- DNS sunucuları: $($inventory.network.dns_servers -join ', ')") +$lines.Add('') +$lines.Add('### Yönlendirme tablosu (IPv4)') +$lines.Add('') +$lines.Add('| Hedef | Mask | Next hop | Metric |') +$lines.Add('|---|---|---|---|') +foreach ($route in $inventory.network.routes) { + $lines.Add("| $($route['destination']) | $($route['netmask']) | $($route['next_hop']) | $($route['metric']) |") +} +$lines.Add('') +$lines.Add('### Ağ profilleri, proxy') +$lines.Add('') +foreach ($profile in $inventory.network.network_profiles) { + $lines.Add("- Profil: $($profile['name']) ($($profile['description']))") +} +foreach ($entry in $inventory.network.proxy.GetEnumerator()) { + $lines.Add("- Proxy $($entry.Key): $($entry.Value)") +} +$lines.Add('') +$lines.Add('## Seri / COM portları') +$lines.Add('') +foreach ($port in $inventory.serial_ports.cim_serial_ports) { + $lines.Add("- $($port['device_id']): $($port['name']) ($($port['description']))") +} +foreach ($port in $inventory.serial_ports.pnp_com_devices) { + $lines.Add("- PnP: $($port['name']) — $($port['device_id']) [$($port['status'])]") +} +foreach ($entry in $inventory.serial_ports.registry_devicemap.GetEnumerator()) { + $lines.Add("- SERIALCOMM $($entry.Key) = $($entry.Value)") +} +$lines.Add('') +$lines.Add('## USB ve donanım kimlikleri') +$lines.Add('') +foreach ($device in $inventory.usb.devices) { + $lines.Add("- $($device['name']) — $($device['hardware_id']) [$($device['status'])]") +} +$lines.Add('') +$lines.Add("- USB denetleyici sayısı: $($inventory.usb.controllers.Count)") +$lines.Add('') +$lines.Add('## Docker') +$lines.Add('') +$lines.Add("- Kurulu: $($inventory.docker.present)") +$lines.Add("- CLI: $($inventory.docker.docker_cli_path) (sürüm: $($inventory.docker.docker_cli_file_version))") +$lines.Add("- Docker Desktop: $($inventory.docker.desktop_app_path)") +if ($null -ne $inventory.docker.service) { + $lines.Add("- Servis: $($inventory.docker.service['name']) [$($inventory.docker.service['state'])]") +} +$lines.Add("- WSL dağıtımları: $($inventory.docker.wsl_distributions -join ', ')") +$lines.Add('') +$lines.Add('## VPN istemcileri') +$lines.Add('') +$wireguardNames = @($inventory.vpn.wireguard.registry_tunnels) + @(Get-NamesOf $inventory.vpn.wireguard.tunnel_config_files) +$openVpnNames = @(Get-NamesOf $inventory.vpn.openvpn.profile_files) +$lines.Add("- WireGuard kurulu: $($inventory.vpn.wireguard.present); tüneller: $($wireguardNames -join ', ')") +$lines.Add("- OpenVPN kurulu: $($inventory.vpn.openvpn.present); profiller: $($openVpnNames -join ', ')") +foreach ($app in $inventory.vpn.installed_vpn_software) { + $lines.Add("- VPN yazılımı: $($app['name']) $($app['version'])") +} +foreach ($svc in $inventory.vpn.vpn_services) { + $lines.Add("- VPN servisi: $($svc['name']) [$($svc['state'])]") +} +$lines.Add('') +$lines.Add('## Uzak erişim kimlikleri') +$lines.Add('') +$lines.Add("- RustDesk ID: $($inventory.remote_access.rustdesk_id)") +$lines.Add("- AnyDesk ID: $($inventory.remote_access.anydesk_id)") +foreach ($svc in $inventory.remote_access.remote_access_services) { + $lines.Add("- Uzak erişim servisi: $($svc['name']) [$($svc['state'])]") +} +$lines.Add('') +$lines.Add('## MEG (uygulama / servis / config yolları)') +$lines.Add('') +foreach ($app in $inventory.meg.software) { + $lines.Add("- Uygulama: $($app['name']) $($app['version']) — $($app['install_location'])") +} +foreach ($svc in $inventory.meg.services) { + $lines.Add("- Servis: $($svc['name']) [$($svc['state'])]") +} +foreach ($dir in $inventory.meg.config_directories) { + $lines.Add("- Dizin: $($dir['path']) (son yazma: $($dir['last_write_utc']))") +} +foreach ($key in $inventory.meg.registry_keys) { + $lines.Add("- Registry anahtarı: $key") +} +$lines.Add('') +if ($NoSoftware) { + $lines.Add('## Yazılım yüzeyi') + $lines.Add('') + $lines.Add('Yazılım envanteri (yüklü yazılım, servisler, zamanlanmış görevler, sürücüler) -NoSoftware nedeniyle alınmadı; ilgili JSON alanları boş bırakıldı.') +} else { + $lines.Add('## Yüklü yazılım') + $lines.Add('') + foreach ($software in $inventory.installed_software) { + $lines.Add("- $($software['name']) — $($software['version']) ($($software['publisher']))") + } + $lines.Add('') + $lines.Add('## Servisler (çalışan, göçle ilgili, auto-start ama durmuş)') + $lines.Add('') + foreach ($svc in $inventory.services.running) { + $lines.Add("- [çalışıyor] $($svc['name']) — $($svc['display_name'])") + } + foreach ($svc in $inventory.services.auto_start_but_stopped) { + $lines.Add("- [durmuş, auto] $($svc['name']) — $($svc['display_name'])") + } + $lines.Add('') + $lines.Add('## Zamanlanmış görevler (Microsoft dışı)') + $lines.Add('') + if ($inventory.scheduled_tasks.available) { + foreach ($task in $inventory.scheduled_tasks.items) { + $lines.Add("- $($task['task_path'])$($task['task_name']) [$($task['state'])]") + } + } else { + $lines.Add($inventory.scheduled_tasks.note) + } + $lines.Add('') + $lines.Add("## Sürücüler ($($inventory.drivers.total) kayıt)") + $lines.Add('') + foreach ($driver in $inventory.drivers.items) { + $lines.Add("- $($driver['device_name']) — $($driver['driver_version']) ($($driver['driver_provider']))") + } +} +$lines.Add('') +$lines.Add('## Kullanıcı profilleri') +$lines.Add('') +foreach ($profile in $inventory.user_profiles) { + $lines.Add("- $($profile['path']) (son kullanım: $($profile['last_use_time']))") +} +$lines.Add('') +$lines.Add('---') +$lines.Add('') +$lines.Add('Bu rapor salt-okunur bir taramadır; hiçbir ayar, servis, ağ veya registry durumu değiştirilmedi. Veri aktarımı için BF-WindowsDataExport.ps1 kullanılır.') +$lines | Set-Content -LiteralPath $markdownPath -Encoding utf8 + +Write-Output "Wrote $jsonPath and $markdownPath" + + + +# Windows → Field OS migration tooling (`scripts/migration/windows/`) + +Read-only inventory and export-manifest tooling that runs **on the Windows +terminal before it is migrated** to Blueforce Field OS (docs/28). It never +installs, never writes to the machine, never touches a service, the registry or +the network configuration, and never collects credentials or secrets. + +## Files + +| File | Report type | Purpose | +|---|---|---| +| `BF-WindowsPreMigrationInventory.ps1` | `windows-pre-migration-inventory` | Hardware, Windows version, disks/volumes, network (IP/DNS/gateway/routes/profiles/proxy), serial-COM ports, USB devices + hardware IDs, drivers, installed software, services, scheduled tasks, Docker presence, VPN clients, RustDesk/AnyDesk IDs, MEG paths, current hostname. | +| `BF-WindowsDataExport.ps1` | `windows-pre-migration-data-export-manifest` | Metadata-only review manifest for the manual data transfer: candidate user folders, removable media, mapped network drives, printers, MEG data directories, installed-software review. Copies nothing. | + +Both scripts emit `BF--windows-inventory*.json` (machine) and +`BF--windows-inventory*.md` (human). + +## Why this directory and not a root `migration/windows/` + +The requested layout was `migration/windows/`; this repository keeps every +operational script under `scripts/` (`scripts/{install,maintenance,diagnostics,recovery,migration}`), +so the tooling lives in `scripts/migration/windows/`. The deviation is +deliberate and documented in: + +- `migration/README.md` (repo root) — pointer file kept at the expected location +- `docs/32-REPOSITORY-AUDIT-AND-CONFLICTS.md` §B-6 — audit entry for the name and location deviation + +Filename deviation from the original request (kept, not "fixed", to preserve +repository consistency). No wrapper scripts are added on purpose: the static +test `tests/check-migration-static.sh` requires **every** `*.ps1` in this +directory to carry the dealer-id/JSON/Markdown/`-NoSoftware` contract, so thin +renamed wrappers would only duplicate the same contract in four files. + +| Requested filename | Repo artifact | Status | +|---|---|---| +| `bf-win-inventory.ps1` | `BF-WindowsPreMigrationInventory.ps1` — identity/hardware/OS/disk blocks | Implemented under the repo name | +| `bf-win-network-export.ps1` | same script, `network` + `serial_ports` + `usb` sections | Merged, no separate file | +| `bf-win-software-export.ps1` | same script, `installed_software` / `services` / `scheduled_tasks` / `drivers` / `docker` / `vpn` / `remote_access` / `meg` sections (skippable with `-NoSoftware`) | Merged, no separate file | +| `bf-win-device-export.ps1` | `BF-WindowsDataExport.ps1` (`BF--windows-inventory-export.json/.md`) | Implemented under the repo name | + +This mapping table is the authoritative name/deviation record: one inventory +report and one export manifest, not four fragmented scripts. + +## How to run + +PowerShell 5.1 (Windows PowerShell) and PowerShell 7+ are both supported. The +scripts are UTF-8 **with BOM** so Windows PowerShell 5.1 reads the Turkish +report headers correctly. + +```powershell +# 1) Dry run first: prints the plan and the output paths, writes nothing. +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\BF-WindowsPreMigrationInventory.ps1 ` + -DealerId 12010193 -OutputDirectory C:\Blueforce\migration -Check + +# 2) Real read-only collection (dealer number known). +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\BF-WindowsPreMigrationInventory.ps1 ` + -DealerId 12010193 -OutputDirectory C:\Blueforce\migration + +# 3) Data-export review manifest (metadata only). +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\BF-WindowsDataExport.ps1 ` + -DealerId 12010193 -OutputDirectory C:\Blueforce\migration + +# 4) Privacy-reduced run: skip the software surface. +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\BF-WindowsPreMigrationInventory.ps1 ` + -DealerId 12010193 -OutputDirectory C:\Blueforce\migration -NoSoftware +``` + +### Execution policy + +`-ExecutionPolicy Bypass` applies to **that one process only**; it does not +change the machine or user execution policy. If the operator cannot use it, +either unblock the files (`Unblock-File .\BF-*.ps1`) or run from an already +permitted location/policy. Elevation is not required: nothing is changed, and +an unelevated run only reports which CIM sections were incomplete (the `notes` +array). + +### Dealer number unknown + +The report name comes from the **8-digit dealer number** (`^[0-9]{8}$`), never +from the machine hostname. If the dealer number is genuinely not known yet, use +the explicit opt-in: + +```powershell +.\BF-WindowsPreMigrationInventory.ps1 -DealerIdUnknown -OutputDirectory C:\Blueforce\migration +``` + +That writes `BF-unknown-windows-inventory.*`, sets `dealer_id_known: false` and +adds a prominent warning in `notes` and at the top of the Markdown report: the +file **must not** be uploaded to the central inventory until the dealer number +is confirmed and the script is re-run with `-DealerId`. Do not guess a dealer +number to "fix" the filename. + +## Output contract + +| Item | Value | +|---|---| +| JSON | `/BF--windows-inventory.json` | +| Markdown | `/BF--windows-inventory.md` | +| Export JSON/MD | `/BF--windows-inventory-export.{json,md}` | +| Device ID | `BF-` (from the dealer number) | +| `report_type` | `windows-pre-migration-inventory` (export manifest: `windows-pre-migration-data-export-manifest`) | +| `read_only` | `true` — always; the run performs no state change | +| `dealer_id_known` | `true`, or `false` on an explicit `-DealerIdUnknown` run | +| `current_hostname` | the existing Windows hostname (unchanged, recorded) | +| `target_hostname` | `bf-` — the hostname expected after migration (docs/02) | +| `schema_version` | `1` | + +Field names are aligned with `scripts/diagnostics/bf-hardware-inventory.sh` +(docs/02 §9) so central tooling can consume both: + +| `bf-hardware-inventory.sh` (Linux) | `BF-WindowsPreMigrationInventory.ps1` (Windows) | +|---|---| +| `schema_version`, `device_id`, `hostname`, `dealer_id`, `collected_at`, `notes` | same names (`collected_at` + `collected_at_utc`, `notes` is an array) | +| `manufacturer`, `model`, `serial` | same | +| `bios{vendor,version,date}` | same (+ `smbios_version`) | +| `cpu{model,cores,arch}` | same (+ `logical_processors`, `address_width`) | +| `memory_mb` | same | +| `disks` | per-disk objects `{name,size_gb,interface_type,media_type,serial}` (doc 02 §9 shape) | +| `network{interfaces,macs}` | `network.interfaces[]` (per-adapter objects) + `network.macs[]`, plus `ipv4_addresses`, `default_gateways`, `dns_servers`, `routes`, `network_profiles`, `proxy` | +| `gpu{model}` | same (+ `driver_version`, `video_processor`, `adapter_ram_mb`) | +| `usb` | `usb{devices[],controllers[]}` (includes USB hardware IDs `USB\VID_xxxx&PID_xxxx`) | +| `serial_ports` | `serial_ports{cim_serial_ports[],registry_devicemap,pnp_com_devices[]}` (COM ports) | +| `os{distro,kernel}` | `os{distro,version,build}` + a `windows{}` block (edition, DisplayVersion, build/UBR, hotfixes) | +| `smart`, `tpm`, `virt`, `temps` | not applicable on Windows; not emitted | +| — | Windows-only blocks: `windows`, `volumes`, `drivers`, `installed_software`, `services`, `scheduled_tasks`, `docker`, `vpn`, `remote_access`, `meg`, `user_profiles`, `collection_scope` | + +## Read-only guarantee + +Asserted mechanically by `tests/check-migration-static.sh` on every run: + +- **Forbidden primitives** — no `Set-*`/`New-*`/`Remove-*` item or property + cmdlet, no service control cmdlet, no network-configuration command of any + kind, no registry write, no download cmdlet, no external process execution + (the exact forbidden families are enumerated in + `tests/check-migration-static.sh`). The only write is the report pair under + `-OutputDirectory` (and `-Check` writes nothing at all). +- **Never collected** — credentials, passwords, tokens, private keys, DPAPI + blobs, file contents, browser profiles, event logs, `Windows ProductId`. +- **Device IDs only** — RustDesk/AnyDesk: exactly one ID value is extracted + (registry value named `id` / `ad.anynet.id`, else the matching one-line value + in `RustDesk.toml` / `system.conf`). The RustDesk `id_ed25519` private key, + AnyDesk password/hash settings and `*.ovpn`/`*.conf.dpapi` contents are never + read — VPN tunnel/profile files are listed **by name only**. +- **Registry is read-only** — `Get-ItemProperty`/`Get-ChildItem` only, and + path-like values are selected by an exact name allow-list so unrelated + (possibly sensitive) values in the same key are ignored. +- **Software surface is opt-out** — `-NoSoftware` skips installed software, + services, scheduled tasks and drivers; hardware, network, device and MEG-path + sections are still collected. +- **Dry run** — `-Check` prints the plan and output paths, writes nothing, + exits `0`. + +## Verification status (honest note) + +There is no PowerShell interpreter on the Linux build host, so these scripts are +statically verified only: syntax/structure review, the `tests/check-migration-static.sh` +contract (tag names, dealer-id regex, JSON/Markdown output, forbidden-primitive +greps) and brace/quote balance checking. **They have not been executed on a real +Windows terminal yet** — first execution belongs to the LAB/pilot step in +docs/28 §10 (`bf-hardware-inventory.sh` runs after migration and its JSON is +diffed against this report). Treat the first run output as unvalidated until +that LAB step is recorded. + +## Related documentation + +- `docs/28-WINDOWS-TO-LINUX-MIGRATION.md` — migration gate, test plan, rollback +- `docs/02-DEVICE-NAMING-AND-INVENTORY.md` — `BF-` identity + JSON contract +- `docs/17-BACKUP-RECOVERY-AND-REINSTALL.md` — L8 reimage / recovery ladder +- `scripts/diagnostics/bf-live-hw-check` — read-only hardware gate used **after** + migration on the Linux side +- `migration/README.md` (repo root) — location pointer + + @@ -9197,51 +63419,28712 @@ Elendikleri için değil, free-limitleri olmadığı için not düşüldü; seç
    + +#!/usr/bin/env bash +# Ansible playbook statik güvenlik kapısı (read-only; ansible-playbook kurulumu GEREKTİRMEZ). +# Denetledikleri: +# 1) 21 playbook envanteri (5 dalga işlemi + 5 rapor + 11 dokümante edilmiş tek-hedef/legacy) ve +# sınıflandırılamayan yeni playbook'a kapalı kapı (fail-closed). Dalga işlemi ve rapor +# playbook'ları TAM dalga kapısına tabidir ve hosts: blueforce kullanamaz; tek cihaz +# teşhis/bakım playbook'ları (docs/09 hedefleme seviyeleri) hedef sınırlama talimatı +# taşımak zorundadır -- bunları dalga kapısına taşımak ayrı bir değişikliktir, bu kapı onları +# sessizce genişletmeye izin vermez. +# 2) dalga kapsamı kapısı: dinamik hosts dalgası, alt çizgili approved dalga listesi, onay +# değişkeni, ansible_play_hosts_all kesişimi ve AYRI production_override (production için şart), +# 3) rapor playbook'larının read-only kalması (mutasyon modülü yok, shell/raw yok, her command +# changed_when: false) ve operation_wave_gate ön kapısı, +# 4) moving tag (:latest) ve Watchtower yasağı, +# 5) bf-security-updates-check.yml'in report-only kalması, +# 6) tüm playbook + inventory YAML'larının parse ve yapı doğrulaması. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PB="$REPO_ROOT/ansible/playbooks" +INV="$REPO_ROOT/ansible/inventory/hosts.example.yml" +GV="$REPO_ROOT/ansible/inventory/group_vars/all.yml" +FAIL=0 + +fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } +pass() { printf 'OK: %s\n' "$*"; } + +# --- 1) Envanter: 16 mevcut + 5 yeni rapor playbook = 21 ------------------------------------- +WAVE_PLAYBOOKS=(bf-collect-logs.yml bf-deploy-update.yml bf-gui-off.yml bf-gui-on.yml bf-run-script.yml) +REPORT_PLAYBOOKS=(bf-fieldos-version.yml bf-provisioning-status.yml bf-enrollment-status.yml bf-remote-channels-check.yml bf-offline-ready-check.yml) +LEGACY_PLAYBOOKS=(bf-ping.yml bf-uptime.yml bf-reboot.yml bf-disk-check.yml bf-package-check.yml bf-security-updates-check.yml bf-docker-status.yml bf-service-restart.yml bf-wireguard-restart.yml bf-rdp-restart.yml bf-rustdesk-restart.yml) +ALL_PLAYBOOKS=("${WAVE_PLAYBOOKS[@]}" "${REPORT_PLAYBOOKS[@]}" "${LEGACY_PLAYBOOKS[@]}") +GATED_PLAYBOOKS=("${WAVE_PLAYBOOKS[@]}" "${REPORT_PLAYBOOKS[@]}") + +if [[ ${#ALL_PLAYBOOKS[@]} -ne 21 ]]; then + fail "playbook envanteri 21 olmalı, tanım ${#ALL_PLAYBOOKS[@]}" +fi +for pb in "${ALL_PLAYBOOKS[@]}"; do + if [[ -f "$PB/$pb" ]]; then pass "present: $pb"; else fail "missing playbook: $pb"; fi +done + +# Sınıflandırılamayan YENİ playbook kabul edilmez: dalga kapısı veya dokümante edilmiş istisna şart. +unclassified=0 +while IFS= read -r -d '' asset; do + base="$(basename "$asset")" + known=0 + for pb in "${ALL_PLAYBOOKS[@]}"; do [[ "$base" == "$pb" ]] && known=1; done + if [[ "$known" -ne 1 ]]; then + fail "unclassified playbook (fail-closed): $base -- ya dalga kapısı (operation_wave/release_wave) taşımalı ya da dokümante edilmiş tek-hedef istisnası olmalı" + unclassified=$((unclassified + 1)) + fi +done < <(find "$PB" -maxdepth 1 -type f -name '*.yml' -print0) +[[ "$unclassified" -eq 0 ]] && pass "playbook sınıflandırması tam: 21/21 (dalga kapılı veya dokümante edilmiş istisna)" + +# --- 2) Dalga kapsamı kapısı + ayrı production_override -------------------------------------- +APPROVED_LITERAL='[lab, pilot_1, pilot_2, wave_1, wave_2, production]' +for group in lab pilot_1 pilot_2 wave_1 wave_2 production; do + grep -q "^[[:space:]]*$group:" "$INV" || fail "inventory dalga grubu eksik: $group" +done +if grep -nE '^[[:space:]]*(lab|pilot|wave|production)-[0-9A-Za-z]' "$INV"; then + fail "inventory dalga grup adları ALT ÇİZGİLİ olmalı; tireli varyant yasak" +else + pass "inventory dalga grupları alt çizgili (lab/pilot_1/pilot_2/wave_1/wave_2/production)" +fi + +for pb in "${GATED_PLAYBOOKS[@]}"; do + file="$PB/$pb" + [[ -f "$file" ]] || continue + if grep -qE '^ hosts: "\{\{ (operation_wave|release_wave) \| default\(' "$file"; then + pass "$pb: dinamik dalga hosts deseni" + else + fail "$pb: hosts dalga desenini ({{ operation_wave|release_wave | default(...) }}) korumalı" + fi + grep -Fq "$APPROVED_LITERAL" "$file" || fail "$pb: approved dalga listesi birebir olmalı: $APPROVED_LITERAL" + if grep -q -- 'operation_confirmed | bool' "$file" || grep -q -- 'wave_gate_confirmed | bool' "$file"; then + pass "$pb: onay kapısı (operation_confirmed/wave_gate_confirmed) mevcut" + else + fail "$pb: onay kapısı eksik (operation_confirmed | bool)" + fi + grep -q 'ansible_play_hosts_all' "$file" || fail "$pb: seçilen hostlar ansible_play_hosts_all ile denetlenmeli" + grep -q 'difference(groups\[' "$file" || fail "$pb: seçilen hostlar dalga grubundan fark olarak denetlenmeli (difference(groups[...]))" + grep -q 'production_override: false' "$file" || fail "$pb: production_override varsayılan false olmalı" + grep -q "'production' or production_override | bool" "$file" || fail "$pb: production dalgası AYRI production_override isteğini denetlemeli" + if grep -qE '^ hosts: blueforce$' "$file"; then + fail "$pb: hosts: blueforce (tüm filo) yasak; dalga kapsamı zorunlu" + else + pass "$pb: tüm-filo hedefi (hosts: blueforce) yok" + fi +done + +if grep -nE '(lab|pilot|wave|production)-[0-9]' "$PB"/*.yml; then + fail "playbook'larda tireli dalga adı bulundu; alt çizgili grup adları zorunlu" +else + pass "playbook'larda tireli dalga adı yok" +fi + +# Rapor playbook'ları: operation_wave_gate ön kapısı (--limit mutabakatı dahil) zorunlu. +for pb in "${REPORT_PLAYBOOKS[@]}"; do + file="$PB/$pb" + [[ -f "$file" ]] || continue + grep -Fq 'operation_wave_gate' "$file" || fail "$pb: operation_wave_gate ön kapısı eksik" + grep -Fq 'hosts: "{{ ansible_limit | default(' "$file" || fail "$pb: dalga ön kapısı --limit ile mutabakat için ansible_limit deseni kullanmalı" + grep -q 'does not intersect the' "$file" || fail "$pb: dalga/limit kesişim reddi (fail-closed mesajı) eksik" +done + +# --- 3) Rapor playbook'ları read-only olmalı ------------------------------------------------- +MUTATING_MODULES='ansible\.builtin\.(shell|raw|script|copy|template|file|lineinfile|replace|blockinfile|user|group|cron|mount|apt|apt_repository|apt_key|apt_repository_key|dpkg_selections|debconf|systemd|systemd_service|service|reboot|package|yum|dnf|pip|get_url|uri|unarchive|archive|git|hostname|sysctl|redhat_subscription|ufw|firewalld|nmcli|command_shell):' +for pb in "${REPORT_PLAYBOOKS[@]}"; do + file="$PB/$pb" + [[ -f "$file" ]] || continue + if grep -nE "$MUTATING_MODULES" "$file"; then + fail "$pb: read-only rapor playbook'unda mutasyon modülü bulundu" + else + pass "$pb: mutasyon modülü yok (stat/slurp/command/debug/assert/set_fact)" + fi + cmd_count="$(grep -c 'ansible\.builtin\.command:' "$file" || true)" + cw_count="$(grep -c 'changed_when: false' "$file" || true)" + if [[ "$cw_count" -ge "$cmd_count" ]]; then + pass "$pb: command görevleri changed_when: false (${cmd_count} command / ${cw_count} changed_when)" + else + fail "$pb: her command görevi changed_when: false taşımalı (${cmd_count} command / ${cw_count} changed_when)" + fi + grep -qi 'read-only' "$file" || fail "$pb: başlıkta read-only sözleşmesi belirtilmeli" + if grep -nE 'changed_when: true|state: (restarted|started|stopped|absent)|--force|git pull|docker pull|rm -rf|mkfs|dd if=' "$file"; then + fail "$pb: read-only sözleşmesini bozan ifade bulundu" + else + pass "$pb: mutasyon/force ifadesi yok" + fi +done + +# --- 4) security-updates-check report-only kalmalı ------------------------------------------ +SU="$PB/bf-security-updates-check.yml" +if [[ -f "$SU" ]]; then + if grep -nE 'state:[[:space:]]*(present|latest)|^[[:space:]]*upgrade:|apt(-get)?[[:space:]].*[[:space:]]install|(apt-get|apt)[[:space:]].*dist-upgrade[[:space:]]*(-y|--assume-yes)|dpkg[[:space:]]+-i|unattended-upgrade[[:space:]]+--' "$SU"; then + fail 'bf-security-updates-check.yml kurulum/yükseltme içeriyor; report-only kalmalı' + else + pass 'bf-security-updates-check.yml report-only (kurulum/yükseltme komutu yok)' + fi + grep -q 'REPORT ONLY' "$SU" && pass 'bf-security-updates-check.yml REPORT ONLY uyarısını koruyor' || fail 'bf-security-updates-check.yml REPORT ONLY uyarısı kaybolmuş' + if grep -qE 'dist-upgrade' "$SU" && ! grep -q 'apt-get -s dist-upgrade' "$SU"; then + fail 'bf-security-updates-check.yml dist-upgrade yalnız simülasyon (-s) olarak koşmalı' + fi +fi + +# Dalga kapısı taşımayan playbook'lar (tek cihaz teşhis/bakım; docs/09 hedefleme seviyeleri) +# en azından hedef sınırlama talimatı veya kendi kapsam assert'ini korumalı. Yeni ve +# sınıflandırılmamış bir playbook bu kapıdan geçemez (bkz. bölüm 1, fail-closed). +for pb in "${LEGACY_PLAYBOOKS[@]}"; do + file="$PB/$pb" + [[ -f "$file" ]] || continue + if grep -q -- '--limit' "$file" || grep -q 'ansible.builtin.assert' "$file"; then + pass "$pb: dalga dışı kullanım hedef sınırlama talimatı taşıyor (--limit veya kapsam assert'i)" + else + fail "$pb: dalga kapısı yok ve hedef sınırlama talimatı da yok (fail-closed)" + fi +done + +# --- 5) Moving tag / Watchtower yasağı ------------------------------------------------------- +if grep -RniE --include='*.yml' --include='*.yaml' --include='*.json' \ + '^[[:space:]]*[^#].*(image:[^#]*:latest([[:space:]#]|$)|watchtower)' \ + "$REPO_ROOT/ansible" "$REPO_ROOT/config" "$REPO_ROOT/monitoring" "$REPO_ROOT/provisioning"; then + fail 'moving tag (:latest) veya Watchtower (otomatik güncelleyici) yapılandırması bulundu' +else + pass 'moving tag (:latest) ve Watchtower yasağı korunuyor' +fi +if grep -RniE --include='*.yml' 'image:[^#]*:latest' "$PB"; then + fail "playbook'larda :latest etiketi bulundu" +else + pass "playbook'larda sabitlenmemiş imaj etiketi yok" +fi + +# --- 6) YAML parse + yapı doğrulaması ------------------------------------------------------- +if python3 - "$REPO_ROOT" <<'PY' +import pathlib +import sys + +import yaml + +root = pathlib.Path(sys.argv[1]) +playbooks = root / "ansible" / "playbooks" +problems = [] + +files = sorted(playbooks.glob("*.yml")) +if len(files) != 21: + problems.append(f"expected 21 playbook YAML files, found {len(files)}") + +for path in files: + try: + data = yaml.safe_load(path.read_text(encoding="utf-8")) + except Exception as exc: # noqa: BLE001 - rapor amaçlı + problems.append(f"{path.name}: YAML parse hatası: {exc}") + continue + if not isinstance(data, list) or not data: + problems.append(f"{path.name}: en üst düzey play listesi olmalı") + continue + for index, play in enumerate(data): + if not isinstance(play, dict): + problems.append(f"{path.name}: play {index} mapping değil") + continue + if "hosts" not in play: + problems.append(f"{path.name}: play {index} hosts anahtarı yok") + if "tasks" not in play and "pre_tasks" not in play: + problems.append(f"{path.name}: play {index} tasks/pre_tasks içermiyor") + if not isinstance(play.get("hosts"), str) or not play.get("hosts", "").strip(): + problems.append(f"{path.name}: play {index} hosts boş veya metin değil") + +for extra in (root / "ansible" / "inventory" / "hosts.example.yml", root / "ansible" / "inventory" / "group_vars" / "all.yml"): + try: + yaml.safe_load(extra.read_text(encoding="utf-8")) + except Exception as exc: # noqa: BLE001 - rapor amaçlı + problems.append(f"{extra.name}: YAML parse hatası: {exc}") + +if problems: + print("\n".join(problems)) + sys.exit(1) +PY +then + pass '21 playbook + inventory YAML parse ve yapı doğrulaması' +else + fail 'YAML parse/yapı doğrulaması başarısız (yukarıdaki satırlar)' +fi + +if [[ "$FAIL" -ne 0 ]]; then + printf 'check-ansible-static: FAILED\n' >&2 + exit 1 +fi +printf 'check-ansible-static: all passed\n' + + + +#!/usr/bin/env bash +# Parse fleet configuration and validate executable shell scripts without running them. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +FAIL=0 +fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } +pass() { printf 'OK: %s\n' "$*"; } + +# Every Bash script under scripts/ must pass syntax parsing. Non-Bash assets are ignored. +while IFS= read -r -d '' script; do + if head -n 1 "$script" | grep -qE '^#!/usr/bin/env bash|^#!/bin/bash'; then + bash -n "$script" && pass "bash parses: ${script#$REPO_ROOT/}" || fail "bash parse error: ${script#$REPO_ROOT/}" + fi +done < <(find "$REPO_ROOT/scripts" -type f -print0) + +# All Ansible and deployable configuration YAML must parse through PyYAML safe_load. +while IFS= read -r -d '' yaml_file; do + if python3 - "$yaml_file" <<'PY' +import sys +import yaml +with open(sys.argv[1], encoding='utf-8') as handle: + yaml.safe_load(handle) +PY + then + pass "yaml parses: ${yaml_file#$REPO_ROOT/}" + else + fail "yaml parse error: ${yaml_file#$REPO_ROOT/}" + fi +done < <(find "$REPO_ROOT/ansible" "$REPO_ROOT/config" "$REPO_ROOT/monitoring" -type f \( -name '*.yml' -o -name '*.yaml' \) -print0) + +# JSON configuration must parse as JSON, not merely as JavaScript. +while IFS= read -r -d '' json_file; do + if python3 - "$json_file" <<'PY' +import json +import sys +with open(sys.argv[1], encoding='utf-8') as handle: + json.load(handle) +PY + then + pass "json parses: ${json_file#$REPO_ROOT/}" + else + fail "json parse error: ${json_file#$REPO_ROOT/}" + fi +done < <(find "$REPO_ROOT/config" "$REPO_ROOT/monitoring" -type f -name '*.json' -print0) + +# Required values preserve the naming and wave policy in docs/09 and docs/10. +INV="$REPO_ROOT/ansible/inventory/hosts.example.yml" +GV="$REPO_ROOT/ansible/inventory/group_vars/all.yml" +[[ -f "$INV" ]] || fail "missing inventory example: $INV" +[[ -f "$GV" ]] || fail "missing shared group variables: $GV" +for group in lab pilot_1 pilot_2 wave_1 wave_2 production; do + grep -q "^[[:space:]]*$group:" "$INV" || fail "inventory missing wave group: $group" +done +for key in wg_subnet wg_interface monitoring_endpoint meg_image_tag reboot_grace_seconds support_bundle_dir; do + grep -q "^$key:" "$GV" || fail "group_vars/all.yml missing key: $key" +done +for pb in bf-collect-logs.yml bf-gui-on.yml bf-gui-off.yml bf-run-script.yml; do + grep -q '^ hosts: "{{ operation_wave' "$REPO_ROOT/ansible/playbooks/$pb" || fail "$pb must dynamically target operation_wave" + grep -q 'production_override: false' "$REPO_ROOT/ansible/playbooks/$pb" || fail "$pb must default production_override to false" +done +FIREWALL_POLICY="$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" +bash -n "$FIREWALL_POLICY" && pass 'bash parses: config/firewall/blueforce-docker-user-restore.sh' || fail 'bash parse error: config/firewall/blueforce-docker-user-restore.sh' +grep -q '^After=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must wait for Docker' +grep -q '^Wants=blueforce-docker-firewall.service$' "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" || fail 'Docker drop-in must start firewall policy' +if grep -RniE --include='*.yml' --include='*.yaml' --include='*.json' '^[[:space:]]*[^#].*(image:[^#]*:latest([[:space:]#]|$)|watchtower)' "$REPO_ROOT/ansible" "$REPO_ROOT/config" "$REPO_ROOT/monitoring"; then + fail "forbidden moving tag or Watchtower configuration found" +fi + +if [[ "$FAIL" -ne 0 ]]; then + printf 'check-configs: FAILED\n' >&2 + exit 1 +fi +printf 'check-configs: all passed\n' + + + +#!/usr/bin/env bash +# Validate migration tooling safety without PowerShell, QEMU, disks, or network access. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +FAIL=0 + +fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } +pass() { printf 'OK: %s\n' "$*"; } +require_file() { [[ -f "$1" ]] && pass "present: ${1#$REPO_ROOT/}" || fail "missing: ${1#$REPO_ROOT/}"; } + +WINDOWS_DIR="$REPO_ROOT/scripts/migration/windows" +ANYDESK="$REPO_ROOT/scripts/install/optional/anydesk/install-anydesk.sh" +HW_CHECK="$REPO_ROOT/scripts/diagnostics/bf-live-hw-check" +QEMU_PLAN="$REPO_ROOT/tests/qemu-field-os-test-plan.md" + +require_file "$WINDOWS_DIR/BF-WindowsPreMigrationInventory.ps1" +require_file "$WINDOWS_DIR/BF-WindowsDataExport.ps1" +require_file "$ANYDESK" +require_file "$HW_CHECK" +require_file "$QEMU_PLAN" + +for script in "$WINDOWS_DIR"/*.ps1; do + [[ -f "$script" ]] || continue + grep -Fq "[ValidatePattern('^[0-9]{8}$')]" "$script" || fail "8-digit DealerId validation missing: ${script#$REPO_ROOT/}" + grep -Fq '[string]$OutputDirectory' "$script" || fail "OutputDirectory parameter missing: ${script#$REPO_ROOT/}" + grep -q 'BF-$DealerId-windows-inventory' "$script" || fail "required BF output basename missing: ${script#$REPO_ROOT/}" + grep -qi 'ConvertTo-Json' "$script" || fail "JSON output missing: ${script#$REPO_ROOT/}" + grep -q 'Markdown' "$script" || fail "Markdown output missing: ${script#$REPO_ROOT/}" + # Turkish report headers need a UTF-8 BOM so Windows PowerShell 5.1 parses the file correctly. + [[ "$(head -c 3 "$script" | od -An -tx1 | tr -d ' \n')" == 'efbbbf' ]] || fail "UTF-8 BOM missing (Windows PowerShell 5.1 compatibility): ${script#$REPO_ROOT/}" +done + +grep -q -- '-NoSoftware' "$WINDOWS_DIR/BF-WindowsPreMigrationInventory.ps1" || fail 'inventory must support -NoSoftware' +grep -q -- '-NoSoftware' "$WINDOWS_DIR/BF-WindowsDataExport.ps1" || fail 'export must support -NoSoftware' + +# Migration scripts are inventory/export only: no credential APIs, writes, service/network/registry mutation, or downloads. +if grep -RniE '(Get-Credential|CredentialManager|Windows\.Security\.Credentials|cmdkey|vaultcmd|ConvertTo-SecureString|Read-Host.*password)' "$WINDOWS_DIR"; then + fail 'credential API or password collection found in Windows migration scripts' +else + pass 'no credential API or password collection in Windows scripts' +fi +if grep -RniE '(Set-Service|Start-Service|Stop-Service|Restart-Service|New-Net|Set-Net|Remove-Net|Disable-Net|Enable-Net|netsh|Set-ItemProperty|New-ItemProperty|Remove-ItemProperty|reg(\.exe)?[[:space:]]+(add|delete)|Invoke-WebRequest|curl|wget|Start-BitsTransfer)' "$WINDOWS_DIR"; then + fail 'forbidden mutation or download primitive found in Windows migration scripts' +else + pass 'Windows scripts have no mutation or download primitive' +fi + +# The export manifest must stay metadata-only: no copy, move, archive or delete primitive. +if grep -RniE '(Copy-Item|Move-Item|Remove-Item|Compress-Archive|Expand-Archive|robocopy|xcopy)' "$WINDOWS_DIR"/*.ps1; then + fail 'copy/move/archive/delete primitive found in Windows migration scripts' +else + pass 'Windows scripts have no copy/move/archive/delete primitive' +fi + +# --------------------------------------------------------------------------- +# Migration scope: every section the migration brief requires must be present, +# still read-only, and still named from the dealer number (not the hostname). +# --------------------------------------------------------------------------- +INVENTORY="$WINDOWS_DIR/BF-WindowsPreMigrationInventory.ps1" +EXPORT="$WINDOWS_DIR/BF-WindowsDataExport.ps1" +WINDOWS_README="$WINDOWS_DIR/README.md" +MIGRATION_POINTER="$REPO_ROOT/migration/README.md" + +require_file "$INVENTORY" +require_file "$EXPORT" +require_file "$WINDOWS_README" +require_file "$MIGRATION_POINTER" + +require_marker() { grep -Fq "$2" "$1" || fail "missing '$2' in ${1#$REPO_ROOT/}"; } + +# Network scope: IP config, DNS, gateway(s), routes, profiles, proxy. +for marker in 'Win32_NetworkAdapterConfiguration' 'DNSServerSearchOrder' 'DefaultIPGateway' \ + 'Win32_IP4RouteTable' 'default_gateways' 'network_profiles' 'ProxyServer'; do + require_marker "$INVENTORY" "$marker" +done +# Software scope: installed software, services, scheduled tasks, drivers, Windows version. +for marker in 'installed_software' 'Win32_Service' 'Get-ScheduledTask' 'Win32_PnPSignedDriver' \ + "'DisplayVersion'" 'Win32_QuickFixEngineering' "'UBR'"; do + require_marker "$INVENTORY" "$marker" +done +# Device scope: COM/serial ports, USB hardware IDs. +for marker in 'Win32_SerialPort' 'SERIALCOMM' 'hardware_id' 'Win32_USBController'; do + require_marker "$INVENTORY" "$marker" +done +# Migration-critical applications: Docker, VPN clients, remote-access IDs, MEG paths. +for marker in 'com.docker.service' 'WireGuard' 'OpenVPN' 'conf.dpapi' '.ovpn' \ + 'rustdesk_id' 'anydesk_id' 'Get-MegSnapshot' 'registry_paths'; do + require_marker "$INVENTORY" "$marker" +done +# Identity: dealer-number naming, existing hostname recorded, target hostname. +for marker in 'current_hostname' 'target_hostname' 'dealer_id_known' 'READ-ONLY CONTRACT' \ + 'DealerIdUnknown' 'WARNING: dealer number unknown' 'executed_external_tools'; do + require_marker "$INVENTORY" "$marker" +done +# Secrets stay out of scope, including the RustDesk private key file. +for marker in 'id_ed25519' 'private keys' 'Windows ProductId'; do + require_marker "$INVENTORY" "$marker" +done +grep -Fq -- '-Check' "$INVENTORY" || fail 'inventory must support -Check (read-only dry run)' +grep -Fq -- '-Check' "$EXPORT" || fail 'export must support -Check (read-only dry run)' + +# Export manifest stays metadata-only and review-gated. +for marker in 'windows-pre-migration-data-export-manifest' 'candidate_folders' 'removable_media_roots' \ + 'mapped_network_drives' 'Win32_NetworkConnection' 'Win32_Printer' 'meg_data_directories' \ + 'copies_performed' 'manual-copy-after-owner-approval' 'READ-ONLY CONTRACT' 'DealerIdUnknown'; do + require_marker "$EXPORT" "$marker" +done + +# Requested-name -> repo-name deviation must stay documented (docs/32 B-6). +for marker in 'bf-win-inventory.ps1' 'bf-win-network-export.ps1' 'bf-win-software-export.ps1' \ + 'bf-win-device-export.ps1' 'BF-WindowsPreMigrationInventory.ps1' 'BF-WindowsDataExport.ps1' \ + 'ExecutionPolicy' 'scripts/migration/windows' 'read-only'; do + require_marker "$WINDOWS_README" "$marker" +done +grep -Fq 'scripts/migration/windows' "$MIGRATION_POINTER" || fail 'migration/README.md must point at scripts/migration/windows' +grep -Fq 'docs/32' "$MIGRATION_POINTER" || fail 'migration/README.md must reference the docs/32 audit entry' +grep -Fiq 'migration/windows' "$MIGRATION_POINTER" || fail 'migration/README.md must name the requested migration/windows path' +pass 'migration scope, naming and location deviations are documented and asserted' + +[[ "$(head -n 1 "$ANYDESK")" == '#!/usr/bin/env bash' ]] || fail 'AnyDesk skeleton requires Bash shebang' +grep -q '^set -euo pipefail$' "$ANYDESK" || fail 'AnyDesk skeleton requires strict mode' +bash -n "$ANYDESK" && pass 'AnyDesk skeleton parses' || fail 'AnyDesk skeleton parse error' +grep -q 'ANYDESK_LICENSE_CONFIRMED=true' "$ANYDESK" || fail 'AnyDesk license confirmation gate missing' +if grep -niE '(curl|wget|apt(-get)?[[:space:]].*install|dnf[[:space:]].*install|zypper[[:space:]].*install|license(_|[[:space:]])?(key|file)|[A-Z0-9]{4}(-[A-Z0-9]{4}){3,})' "$ANYDESK"; then + fail 'AnyDesk skeleton must not download, install, or embed a license' +else + pass 'AnyDesk skeleton has no download, install, or embedded license' +fi + +grep -q '^#!/usr/bin/env bash' "$HW_CHECK" || fail 'hardware check requires Bash shebang' +grep -q '^set -euo pipefail$' "$HW_CHECK" || fail 'hardware check requires strict mode' +bash -n "$HW_CHECK" && pass 'hardware check parses' || fail 'hardware check parse error' +grep -q -- '--json' "$HW_CHECK" || fail 'hardware check --json missing' +grep -q -- '--markdown' "$HW_CHECK" || fail 'hardware check --markdown missing' +for verdict in SUPPORTED WARNING BLOCKED; do grep -q "$verdict" "$HW_CHECK" || fail "hardware verdict missing: $verdict"; done +# Every check the migration gate relies on must be present in the JSON payload. +for hwcheck in architecture ram disk disk_type smart nic nic_link serial usb boot_mode secure_boot tpm virt cpu_virt; do + grep -Fq "\"name\":\"$hwcheck\"" "$HW_CHECK" || fail "hardware check missing: $hwcheck" +done +# Verdict thresholds must be documented in the output, not just implied by code. +grep -Fq '| Kontrol | BLOCKED | WARNING | SUPPORTED |' "$HW_CHECK" || fail 'hardware check threshold table missing from markdown output' +for threshold in '68719476736' '2048' '4096' '64 GiB' '4096 MiB' 'vmx/svm'; do + grep -Fq -- "$threshold" "$HW_CHECK" || fail "hardware threshold not documented: $threshold" +done +pass 'hardware check covers arch/ram/disk/media/smart/nic/link/serial/usb/boot/secure-boot/tpm/virt and documents thresholds' +if grep -niE '(apt(-get)?[[:space:]].*install|dnf[[:space:]].*install|zypper[[:space:]].*install|mkfs|wipefs|dd[[:space:]].*of=|rm[[:space:]]+-rf|systemctl[[:space:]]+(start|stop|restart|enable|disable)|ip[[:space:]]+(link|addr|route)[[:space:]]+(add|del|set)|nmcli[[:space:]].*(up|down|modify))' "$HW_CHECK"; then + fail 'hardware check must not install, wipe, alter services, or alter networking' +else + pass 'hardware check is non-mutating by static pattern' +fi + +for test_id in $(seq 1 18); do + grep -q "T${test_id}" "$QEMU_PLAN" || fail "QEMU/LAB plan missing T${test_id}" +done +grep -qiE 'CI.*statik|statik.*CI' "$QEMU_PLAN" || fail 'QEMU/LAB plan must distinguish CI/static coverage' +grep -qiE 'QEMU|KVM' "$QEMU_PLAN" || fail 'QEMU/LAB plan must cover QEMU/KVM' + +if [[ "$FAIL" -ne 0 ]]; then + printf 'check-migration-static: FAILED\n' >&2 + exit 1 +fi +printf 'check-migration-static: all passed\n' + + + +#!/usr/bin/env bash +# Validate repository specifications and Ansible safety contracts. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PB="$REPO_ROOT/ansible/playbooks" +ROLES="$REPO_ROOT/ansible/roles" +FAIL=0 +fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } +pass() { printf 'OK: %s\n' "$*"; } + +# The canonical documentation set is docs/00..NN. Adding a document is expected +# over time, so the set is derived from the tree instead of pinned to a literal: +# what must hold is that the numbering starts at 00 and has no gaps. +mapfile -t DOCS < <(printf '%s\n' "$REPO_ROOT"/docs/[0-9][0-9]-*.md | sort) +if [[ ${#DOCS[@]} -eq 0 ]]; then + fail "no numbered docs found under docs/" +else + highest=0 + for doc in "${DOCS[@]}"; do + n="$(basename "$doc" | cut -c1-2)" + n=$((10#$n)) + [[ $n -gt $highest ]] && highest=$n + done + for ((i = 0; i <= highest; i++)); do + printf -v number '%02d' "$i" + matches=("$REPO_ROOT"/docs/"$number"-*.md) + [[ -f ${matches[0]} ]] || fail "missing numbered doc: $number (numbering must be gapless)" + done + pass "${#DOCS[@]} numbered docs present (00..$(printf '%02d' "$highest"), gapless)" +fi + +# Docusaurus yalnız numaralı kanonik dokümanları yayımlamalıdır; şablon site içeriği değildir. +SYNC_SCRIPT="$REPO_ROOT/docs-site/sync-docs.sh" +SITE_DOCS="$REPO_ROOT/docs-site/docs" +if [[ ! -x "$SYNC_SCRIPT" ]]; then + fail "docs-site sync script missing or not executable" +elif ! grep -Fq '[0-9][0-9]-*.md' "$SYNC_SCRIPT"; then + fail "docs-site sync script must select only numbered Markdown files" +elif ! grep -Fq '_TEMPLATE.md is never site content' "$SYNC_SCRIPT"; then + fail "docs-site sync script must explicitly exclude the template" +else + pass "docs-site sync contract selects numbered docs and excludes the template" +fi +if [[ -f "$SITE_DOCS/_TEMPLATE.md" ]]; then + fail "docs-site must not contain docs/_TEMPLATE.md" +else + pass "docs-site template is absent" +fi + +# Each numbered doc must retain ordered sections 1 through 13 and at least one diagram. +mermaid_total=0 +for doc in "${DOCS[@]}"; do + heading_list="$(grep -E '^## [0-9]+\.' "$doc" | sed -E 's/^## ([0-9]+)\..*/\1/' | paste -sd, -)" + if [[ "$heading_list" != '1,2,3,4,5,6,7,8,9,10,11,12,13' ]]; then + fail "non-sequential numbered headings in ${doc#$REPO_ROOT/}: ${heading_list:-none}" + fi + count="$(grep -c '^```mermaid$' "$doc" || true)" + if [[ "$count" -lt 1 ]]; then + fail "missing Mermaid block in ${doc#$REPO_ROOT/}" + fi + mermaid_total=$((mermaid_total + count)) +done +# Every numbered doc carries at least one diagram. A fixed global total is +# deliberately not asserted: documents are added over time and a pinned sum turns +# a legitimate addition into a red test. +if [[ "$mermaid_total" -lt "${#DOCS[@]}" ]]; then + fail "Mermaid count ($mermaid_total) is below the document count (${#DOCS[@]}); every doc needs a diagram" +else + pass "${#DOCS[@]}/${#DOCS[@]} docs carry a diagram ($mermaid_total Mermaid blocks total)" +fi + +EXPECTED_PLAYBOOKS=(bf-ping.yml bf-uptime.yml bf-reboot.yml bf-docker-status.yml bf-service-restart.yml bf-wireguard-restart.yml bf-rustdesk-restart.yml bf-rdp-restart.yml bf-collect-logs.yml bf-disk-check.yml bf-package-check.yml bf-security-updates-check.yml bf-deploy-update.yml bf-run-script.yml bf-gui-on.yml bf-gui-off.yml bf-fieldos-version.yml bf-provisioning-status.yml bf-enrollment-status.yml bf-remote-channels-check.yml bf-offline-ready-check.yml) +for pb in "${EXPECTED_PLAYBOOKS[@]}"; do + [[ -f "$PB/$pb" ]] && pass "playbook present: $pb" || fail "missing playbook: $pb" +done + +for role in common wireguard docker monitoring; do + for file in tasks/main.yml defaults/main.yml README.md; do + [[ -f "$ROLES/$role/$file" ]] && pass "role file present: $role/$file" || fail "missing role file: $role/$file" + done +done + +# Safety contracts from docs/09 and docs/10. +grep -q 'serial' "$PB/bf-reboot.yml" || fail 'bf-reboot.yml must batch hosts with serial' +grep -q 'any_errors_fatal: true' "$PB/bf-reboot.yml" || fail 'bf-reboot.yml must halt on errors' +grep -q 'release_wave' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a release wave' +grep -q 'wave_gate_confirmed' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a wave gate' +grep -q 'halt_on_fail' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must enforce halt_on_fail' +grep -q 'max_fail_percentage: 0' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must stop the wave on failure' +grep -q 'serial: 5' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must use the fixed batch size' +grep -q 'production_override' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must require a separate production override' +grep -q 'ansible_play_hosts_all' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must verify selected hosts against the release wave' +grep -q 'Run mandatory post-batch health gate' "$PB/bf-deploy-update.yml" || fail 'bf-deploy-update.yml must run a post-batch health gate' +for pb in bf-collect-logs.yml bf-gui-on.yml bf-run-script.yml bf-gui-off.yml; do + grep -q 'operation_wave' "$PB/$pb" || fail "$pb must require operation_wave" + grep -q 'operation_confirmed' "$PB/$pb" || fail "$pb must require operation_confirmed" + grep -q 'ansible_play_hosts_all' "$PB/$pb" || fail "$pb must verify its selected hosts" + grep -q 'production_override' "$PB/$pb" || fail "$pb must require a separate production override" + grep -q "operation_wave != 'production' or production_override | bool" "$PB/$pb" || fail "$pb must refuse production without production_override=true" +done +if grep -q '^ hosts: blueforce$' "$PB/bf-gui-off.yml"; then + fail 'bf-gui-off.yml must not target the blueforce group by default' +fi +grep -q '^operation_wave:' "$REPO_ROOT/ansible/inventory/group_vars/all.yml" || fail 'shared operation_wave variable missing' +grep -q '^operation_confirmed:' "$REPO_ROOT/ansible/inventory/group_vars/all.yml" || fail 'shared operation_confirmed variable missing' +for asset in config/firewall/blueforce-docker-user-restore.sh config/systemd/blueforce-docker-firewall.service config/systemd/docker.service.d/blueforce-docker-firewall.conf; do + [[ -f "$REPO_ROOT/$asset" ]] || fail "missing persistent Docker firewall asset: $asset" +done +grep -q 'systemctl enable "$DOCKER_POLICY_UNIT"' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module must enable persistent Docker firewall unit' +grep -q 'docker.service.d/blueforce-docker-firewall.conf' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module must install Docker restart coupling' +grep -q 'DOCKER_POLICY_BIN" --check' "$REPO_ROOT/scripts/install/installer/modules/13-firewall.sh" || fail 'firewall module check must verify Docker policy rules' +grep -q '13-firewall' "$REPO_ROOT/scripts/install/installer/modules/18-final-check.sh" || fail 'final check must include the firewall rule verification gate' +grep -q 'bash "$SCRIPT_DIR/$g.sh" --check' "$REPO_ROOT/scripts/install/installer/modules/18-final-check.sh" || fail 'final check must execute every gate in check mode' +grep -q 'ctorigdstport' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall must consume published-port allowlist rules' +grep -q 'iptables -C DOCKER-USER' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall check must verify every installed allowlist rule' +grep -q -- '-i br+ -j RETURN' "$REPO_ROOT/config/firewall/blueforce-docker-user-restore.sh" || fail 'Docker firewall must permit egress from user-defined bridge interfaces' +grep -q '^BindsTo=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must bind to Docker lifecycle' +grep -q '^PartOf=docker.service$' "$REPO_ROOT/config/systemd/blueforce-docker-firewall.service" || fail 'Docker firewall service must restart with Docker' +grep -q '^Wants=blueforce-docker-firewall.service$' "$REPO_ROOT/config/systemd/docker.service.d/blueforce-docker-firewall.conf" || fail 'Docker must start the firewall service on every start' +grep -q 'BF_WG_HANDSHAKE_MAX_AGE' "$REPO_ROOT/scripts/install/installer/modules/06-wireguard.sh" || fail 'WireGuard module must enforce handshake freshness' +grep -q 'configured ||' "$REPO_ROOT/scripts/install/installer/modules/09-rustdesk.sh" || fail 'RustDesk module must prove client configuration' +grep -q 'service_allowlist' "$PB/bf-service-restart.yml" || fail 'bf-service-restart.yml must enforce an allowlist' +grep -q 'script_allowed_dirs' "$PB/bf-run-script.yml" || fail 'bf-run-script.yml must enforce allowed script paths' +grep -Fq "collect_logs_dir is match('^/var/lib/blueforce/support-bundles" "$PB/bf-collect-logs.yml" || fail 'bf-collect-logs.yml must restrict bundles to the approved support directory' +if [[ "$(grep -Fc '| quote' "$PB/bf-collect-logs.yml")" -lt 2 ]]; then + fail 'bf-collect-logs.yml must shell-quote every generated bundle path' +fi + +if grep -RniE --include='*.yml' '^[[:space:]]*[^#].*(image:[^#]*:latest([[:space:]#]|$)|watchtower)' "$PB" "$ROLES/docker"; then + fail "forbidden moving tag or Watchtower configuration found in deploy paths" +else + pass 'no moving tags or auto-updaters in deploy paths' +fi + +if grep -qniE 'state:[[:space:]]*(present|latest)|apt-get .*(upgrade|dist-upgrade)[[:space:]]+-y|apt:.*name:' "$PB/bf-security-updates-check.yml"; then + fail 'bf-security-updates-check.yml must remain report-only' +else + pass 'security update check is report-only' +fi + +# Field OS lifecycle and enrollment contracts must remain explicit and safe. +for asset in scripts/diagnostics/bf-enroll scripts/diagnostics/bf-enroll-now scripts/diagnostics/bf-enrollment-status scripts/diagnostics/bf-release scripts/diagnostics/bf-remote-status scripts/diagnostics/bf-check-local scripts/diagnostics/bf-check-enrollment scripts/diagnostics/bf-check-ready config/systemd/blueforce-enroll.service config/systemd/blueforce-enroll.timer; do + [[ -f "$REPO_ROOT/$asset" ]] && pass "Field OS asset present: $asset" || fail "missing Field OS asset: $asset" +done +grep -q -- '--offline' "$REPO_ROOT/scripts/install/blueforce-install.sh" || fail 'installer must support --offline' +grep -q 'PROVISIONED_OFFLINE' "$REPO_ROOT/scripts/install/blueforce-install.sh" || fail 'installer must record PROVISIONED_OFFLINE' +grep -q 'BF_ADMIN_PUBLIC_KEY' "$REPO_ROOT/scripts/install/installer/modules/07-ssh.sh" || fail 'SSH module must accept an explicit admin public key only before hardening' +grep -q 'systemctl is-active --quiet xrdp' "$REPO_ROOT/scripts/install/installer/modules/08-rdp.sh" || fail 'RDP check must require active xrdp' +if grep -Eq 'systemctl (stop|disable) (xrdp|xrdp-sesman)' "$REPO_ROOT/scripts/maintenance/bf-gui-off"; then fail 'bf-gui-off must never stop or disable xRDP'; else pass 'bf-gui-off preserves xRDP'; fi +grep -q -- '--data-binary "@\$REQUEST_FILE"' "$REPO_ROOT/scripts/diagnostics/bf-enroll" || fail 'enrollment curl must consume the request file' +grep -q -- '-H @<(printf' "$REPO_ROOT/scripts/diagnostics/bf-enroll" || fail 'enrollment Authorization header must use process substitution' +if grep -q 'Authorization: Bearer \*\*\*' "$REPO_ROOT/scripts/diagnostics/bf-enroll"; then fail 'enrollment must not send a redacted literal Authorization value'; fi +grep -q 'central_verification' "$REPO_ROOT/scripts/diagnostics/bf-remote-status" || fail 'remote status must require central verification evidence' +if grep -q 'bf-enrollment-status\|phase="' "$REPO_ROOT/scripts/diagnostics/bf-remote-status"; then fail 'remote status must not infer proof from persisted lifecycle phase'; fi +grep -q 'UNAPPROVED_SKELETON' "$REPO_ROOT/scripts/diagnostics/bf-release" || fail 'release report must reject skeleton manifests' +"$REPO_ROOT/tests/test-field-os-lifecycle.sh" && pass 'Field OS lifecycle shell tests pass' || fail 'Field OS lifecycle shell tests failed' +grep -q 'PROVISIONED_OFFLINE.*ENROLLED.*READY' "$REPO_ROOT/scripts/diagnostics/bf-enrollment-status" || fail 'status must define canonical lifecycle states' +grep -q 'blueforce-install.sh' "$REPO_ROOT/provisioning/firstboot/bf-firstboot" && grep -q -- '--offline' "$REPO_ROOT/provisioning/firstboot/bf-firstboot" || fail 'firstboot must invoke offline installer after dealer ID validation' +grep -q 'BF_FIRSTBOOT_TEST_MODE' "$REPO_ROOT/provisioning/firstboot/bf-firstboot" || fail 'firstboot must provide mutation-free test mode' + +if [[ "$FAIL" -ne 0 ]]; then + printf 'check-specs: FAILED\n' >&2 + exit 1 +fi +printf 'check-specs: all passed\n' + + + +# Field OS QEMU/KVM ve LAB Test Planı + +Bu plan, mevcut `provisioning/iso/test-iso.sh` aracını değiştirmez. Araç checksum ve El Torito metadata doğrulaması yapar; QEMU/KVM önyükleme ve gerçek çevre birimi kabulü ayrı kanıttır. + +## Çalıştırma sınırları + +- CI yalnız statik doğrulama çalıştırır: `tests/check-provisioning-static.sh` ve `tests/check-migration-static.sh`. CI disk yazmaz, ISO boot etmez, QEMU/KVM veya PowerShell gerektirmez. +- QEMU/KVM testleri imzalı artefact ile izole LAB hostunda çalışır. Kurulum hedefi yalnız geçici QCOW2 disktir; fiziksel disk veya üretim ağı kullanılmaz. +- Fiziksel LAB testleri iki temsilci cihazda yapılır. USB/seri/MEG, Secure Boot ve Windows image restore yalnız burada kabul edilir. +- Her T1–T18 sonucu release manifesti, ISO/seed checksum ve kullanılan test ortamıyla kaydedilir. Başarısız test artefact'ın saha dağıtımını engeller. + +## Test matrisi + +| ID | Doğrulama | Ortam | Beklenen kanıt | +|---|---|---|---| +| T1 | Upstream ISO SHA256 doğrulaması | CI statik + LAB | `verify-upstream-iso.sh --check` başarılı | +| T2 | El Torito boot metadata | CI (xorriso varsa) + LAB | `test-iso.sh` başarılı; yoksa fail-closed | +| T3 | Seed yapısal doğrulaması | CI statik | NoCloud `user-data`/`meta-data` ve YAML parse başarılı | +| T4 | Secret ve bayi kimliği taraması | CI statik | provisioning ve migration asset'lerinde secret/kimlik yok | +| T5 | Autoinstall depolama kapısı | CI statik | storage seçimi interaktif, doğrudan wipe yok | +| T6 | UEFI QEMU boot | QEMU/KVM | OVMF ile kurulum menüsü ve seed algılandı | +| T7 | Legacy BIOS QEMU boot | QEMU/KVM | SeaBIOS ile kurulum menüsü ve seed algılandı | +| T8 | Secure Boot | Fiziksel LAB | desteklenen cihazda imzalı upstream yol boot eder | +| T9 | Geçici QCOW2 temiz kurulum | QEMU/KVM | yalnız QCOW2 değişti; sistem `PROVISIONED_OFFLINE` | +| T10 | Air-gapped kurulum | QEMU/KVM | WAN/DNS kapalıyken dış indirme yok | +| T11 | Offline APT manifesti | QEMU/KVM | paketler onaylı snapshot'tan çözülür | +| T12 | İlk açılış durum kapısı | QEMU/KVM | `READY` değil, `PROVISIONED_OFFLINE` görünür | +| T13 | NIC sürücüsü ve bağlantı | QEMU/KVM + fiziksel LAB | arayüz bulunur; fiziksel cihazda link/DHCP kabulü | +| T14 | Disk eşik ve yanlış-disk koruması | QEMU/KVM | 64 GiB altı disk BLOCKED; hedef onayı görünür | +| T15 | RAM ve mimari eşikleri | QEMU/KVM | x86_64/4 GiB temel kabul; alt eşik verdict'i doğru | +| T16 | USB çevre birimi | Fiziksel LAB | USB cihaz envanteri ve MEG kabul senaryosu başarılı | +| T17 | Seri çevre birimi | Fiziksel LAB | tty cihazı ve MEG seri iş akışı başarılı | +| T18 | Windows geri dönüş provası | Fiziksel LAB | hash doğrulanmış image restore sonrası iş akışı gelir | + +## QEMU/KVM örnek disiplin + +QEMU çağrısı release kaydında saklanır; yalnız geçici dosya kullanılır. Örnek hedef: `mktemp -d` altında QCOW2, OVMF değişken kopyası ve host-only ağ. Komut çalıştırılmadan önce ISO checksum, seed checksum ve disk yolunun geçici dizin altında olduğu doğrulanır. Test bitince QCOW2 yalnız LAB saklama politikasına göre imha edilir. + +## Çıkış kriteri + +T1–T5 CI statik olarak yeşil olmadan QEMU/KVM başlatılmaz. T6–T15 tamamlanmadan custom ISO saha artefact'ı olmaz. T16–T18 fiziksel LAB kanıtı olmadan cihaz profili veya Windows geçişi kabul edilmez. + + + +# Semaphore Community limits (working rules for the Blueforce fleet) + +Source: `docs/09-FLEET-MANAGEMENT.md` section 9, "Semaphore Community sinirlari". +This file restates the limits in English as an executable checklist for +playbook authors and Semaphore operators. No Pro/Enterprise feature may be +used anywhere in `ansible/` or in any Semaphore task template. + +## Limits + +1. No OIDC/SSO: Semaphore users are local accounts; access only behind WireGuard. +2. No 2FA: password policy + mandatory VPN compensates; admin accounts are inventoried. +3. No external Vault integration: secrets live in the Semaphore built-in encrypted + Key Store; production secrets are never embedded in playbooks. +4. Concurrency limits (runners/forks): load-test against 700 nodes first, then tune + runner count + Ansible `serial`/`forks`/batch settings. Destructive playbooks + (`bf-reboot.yml`, `bf-deploy-update.yml`) already enforce `serial` + + `max_fail_percentage: 0` + `any_errors_fatal: true`. +5. No workflow may depend on a Pro-only feature. Anything that does not run on + Community is rejected in review (`tests/check-specs.sh` greps for it). + +## Operator checklist + +- [ ] Semaphore reachable only via WireGuard. +- [ ] Every destructive template runs `--check` dry run + `--limit ` first. +- [ ] Waves follow docs/10: lab(2) -> pilot-1(5) -> pilot-2(20) -> wave-1(50) -> wave-2(100) -> production. +- [ ] Secrets referenced from Key Store, never committed to Git. +- [ ] `tests/check-specs.sh` and `tests/check-configs.sh` pass before merge. + + + +#!/usr/bin/env bash +# Exercise the Field OS lifecycle, enrollment and readiness contracts with mocked local services. +# +# This host has no systemd, no apt and no internet, so every external dependency +# (systemctl, wg, ip, dpkg-query, curl) is a mock in $TMP/bin. Scenarios: +# +# 1 secret-safe enrollment request/header/response path +# 2 offline installer fails closed without a local repository +# 3 failed WireGuard activation rolls back and keeps the prior phase +# 4 ROLLBACK/READY: independent proof, fail-closed without central evidence +# 5 skeleton release manifest is never a production release +# 6 state machine: forward-only, no stage skipping, contract validation +# 7 bf-check-local passes without internet and fails closed on key hygiene +# 8 bf-check-enrollment requires central evidence, peer config and handshake +# 9 replay/backwards protection and atomic 0600 state writes +# 10 systemd attempt: PENDING without a token, bounded retry with one staged +# 11 --check dry run never mutates state or sends a request +# 12 enrollment schemas match the real client behaviour +# 13 boot unit cannot loop, carries no credential and stays bounded +set -euo pipefail +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BIN="$REPO_ROOT/scripts/diagnostics" +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT +fail() { printf 'FAIL: %s\n' "$*" >&2; exit 1; } +pass() { printf 'OK: %s\n' "$*"; } + +PUBLIC_KEY='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=' +SERVER_KEY='BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=' +DEALER='12345678' +ENDPOINT='https://control.blueforce.test/enroll' + +make_mock_bin() { + local d="$1" + mkdir -p "$d" + cat > "$d/systemctl" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +printf '%s\n' "$*" >> "$MOCK_CALLS" +case "${1:-}" in + is-active) [[ "${MOCK_SYSTEMCTL_FAIL:-0}" != 1 ]] ;; + is-enabled) [[ "${MOCK_SYSTEMCTL_FAIL:-0}" != 1 ]] ;; + enable|restart) [[ "${MOCK_SYSTEMCTL_FAIL:-0}" != 1 ]] ;; + get-default) printf 'multi-user.target\n' ;; + *) exit 0 ;; +esac +EOF + cat > "$d/curl" <<'EOF' +#!/usr/bin/env bash +# Mock curl: records argv, captures the request file and the header fd, then +# either writes the canned response or fails like a transport/protocol error. +set -euo pipefail +request='' output='' header='' code='' +while [[ $# -gt 0 ]]; do + case "$1" in + --data-binary) request="$2"; shift 2 ;; + --output) output="$2"; shift 2 ;; + --write-out) code="$2"; shift 2 ;; + -H|--header) header="$2"; shift 2 ;; + *) printf 'argv=%s\n' "$1" >> "$MOCK_CURL_LOG"; shift ;; + esac +done +[[ "$request" == @* ]] || exit 91 +cat "${request#@}" > "$MOCK_REQUEST_CAPTURE" +[[ "$header" == @* ]] || exit 92 +cat "${header#@}" > "$MOCK_HEADER_CAPTURE" +if [[ "${MOCK_CURL_FAIL:-0}" == 1 ]]; then + printf '%s' "${MOCK_HTTP_CODE:-000}" + exit "${MOCK_CURL_RC:-7}" +fi +printf '%s' "$MOCK_RESPONSE" > "$output" +[[ -z "$code" ]] || printf '%s' "${MOCK_HTTP_CODE:-200}" +EOF + cat > "$d/wg" <<'EOF' +#!/usr/bin/env bash +case "${1:-}" in + show) printf 'peer %s\n' "${MOCK_HANDSHAKE:-0}" ;; + pubkey) IFS= read -r _key || true; printf '%s\n' "${MOCK_PUBLIC_KEY:-}" ;; + *) exit 0 ;; +esac +EOF + cat > "$d/ip" <<'EOF' +#!/usr/bin/env bash +[[ "${MOCK_IP_FAIL:-0}" == 1 ]] && exit 1 +exit 0 +EOF + cat > "$d/dpkg-query" <<'EOF' +#!/usr/bin/env bash +printf 'install ok installed' +EOF + chmod +x "$d"/* +} + +MOCK_BIN="$TMP/bin"; make_mock_bin "$MOCK_BIN" +export PATH="$MOCK_BIN:$PATH" MOCK_CALLS="$TMP/calls" MOCK_CURL_LOG="$TMP/curl-argv" +export MOCK_REQUEST_CAPTURE="$TMP/request" MOCK_HEADER_CAPTURE="$TMP/header" +export MOCK_PUBLIC_KEY="$PUBLIC_KEY" +STATE_DIR="$TMP/state"; WG_DIR="$TMP/wg"; mkdir -p "$STATE_DIR" "$WG_DIR" +printf '%s\n' "$DEALER" > "$STATE_DIR/dealer-id" +printf '%s\n' 'private-test-key' > "$WG_DIR/privatekey" +printf '%s\n' "$PUBLIC_KEY" > "$WG_DIR/publickey" +chmod 600 "$WG_DIR/privatekey" "$WG_DIR/publickey" "$STATE_DIR/dealer-id" +export STATE_DIR WG_DIR BF_STATE_FILE="$STATE_DIR/state.json" +IDEM="$(python3 -c "import hashlib,sys;print(hashlib.sha256(('p-1|BF-'+sys.argv[1]+'|'+sys.argv[2]).encode()).hexdigest())" "$DEALER" "$PUBLIC_KEY")" + +write_state() { printf '%s\n' "$1" > "$BF_STATE_FILE"; chmod 600 "$BF_STATE_FILE"; } +state_field() { python3 -c "import json,sys;print(json.load(open(sys.argv[1])).get(sys.argv[2]))" "$BF_STATE_FILE" "$1"; } +central_pending='{"status":"pending","verification_id":"cv-1","monitoring":{"status":"pending","verification_id":"mon-1"},"remote":{"status":"pending","verification_id":"rem-1"},"management":{"status":"pending","verification_id":"mgmt-1"}}' +central_verified='{"status":"verified","verification_id":"cv-1","monitoring":{"status":"verified","verification_id":"mon-1"},"remote":{"status":"verified","verification_id":"rem-1"},"management":{"status":"verified","verification_id":"mgmt-1"}}' +pending_state="{\"phase\":\"PROVISIONED_OFFLINE\",\"enrollment_status\":\"PENDING\",\"fleet_status\":\"PENDING\",\"device_id\":\"BF-$DEALER\",\"provisioning_id\":\"p-1\"}" +enrolled_state() { printf '{"phase":"ENROLLED","enrollment_status":"ENROLLED","fleet_status":"PENDING","device_id":"BF-%s","provisioning_id":"p-1","central_verification":%s}' "$DEALER" "$1"; } +ready_state() { printf '{"phase":"READY","enrollment_status":"ENROLLED","fleet_status":"READY","device_id":"BF-%s","provisioning_id":"p-1","central_verification":%s}' "$DEALER" "$1"; } +mocked_response() { printf '{"status":"accepted","device_id":"BF-%s","idempotency_key":"%s","enrollment_id":"enr-1","wireguard":{"address":"10.20.0.17/32","endpoint":"wg.blueforce.test:51820","server_public_key":"%s","allowed_ips":"10.20.0.0/24"},"central_verification":%s}' "$DEALER" "$IDEM" "$SERVER_KEY" "$1"; } + +# --- scenario 1: the secret-safe enrollment path ---------------------------- +write_state "$pending_state" +export MOCK_RESPONSE="$(mocked_response "$central_verified")" +printf '%s\n' 'super-secret-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin >/dev/null +[[ "$(state_field phase)" == 'ENROLLED' ]] || fail 'successful enrollment must commit ENROLLED' +[[ -s "$WG_DIR/wg0.conf" ]] || fail 'successful enrollment must install wg0.conf' +[[ "$(stat -c '%a' "$WG_DIR/wg0.conf")" == '600' ]] || fail 'wg0.conf must be mode 600' +[[ "$(stat -c '%a' "$BF_STATE_FILE")" == '600' ]] || fail 'state.json must be mode 600' +grep -q "BF-$DEALER" "$MOCK_REQUEST_CAPTURE" || fail 'curl must consume the generated request file' +grep -Fqx 'Authorization: Bearer super-secret-token' "$MOCK_HEADER_CAPTURE" || fail 'curl must receive the exact supplied token through process substitution' +! grep -R -F 'super-secret-token' "$TMP" --exclude=header --exclude=request --exclude=enrollment.token || fail 'token persisted outside the transient curl fixture' +! grep -R -F 'super-secret-token' "$MOCK_CURL_LOG" "$STATE_DIR" 2>/dev/null || fail 'token leaked to curl argv, output, or state' +pass 'curl request/header/response path is secret-safe and functional' + +# --- scenario 12 (early check): request body carries public facts only ------- +python3 - "$MOCK_REQUEST_CAPTURE" "$PUBLIC_KEY" <<'PY' +import json, sys +request = json.load(open(sys.argv[1], encoding='utf-8')) +if set(request) != {'device_id', 'wireguard_public_key', 'idempotency_key', 'hardware', 'release'}: + raise SystemExit('unexpected request field set: %s' % sorted(request)) +if request['wireguard_public_key'] != sys.argv[2]: + raise SystemExit('request must carry the local public key') +blob = json.dumps(request).lower() +for banned in ('private', 'secret', 'password', 'passwd', 'bearer', 'authorization'): + if banned in blob: + raise SystemExit('request carries a secret-like field: ' + banned) +PY +! grep -q 'private-test-key' "$MOCK_REQUEST_CAPTURE" || fail 'the WireGuard private key must never be sent' +! grep -q 'super-secret-token' "$MOCK_REQUEST_CAPTURE" || fail 'the one-time token must never be sent in the request body' +pass 'request carries public facts only: no private key, no token, no credential' + +# --- scenario 2: offline installer fails closed ----------------------------- +cat > "$MOCK_BIN/apt-get" <<'EOF' +#!/usr/bin/env bash +printf '%s\n' "$*" >> "$MOCK_APT_CALLS" +exit 90 +EOF +chmod +x "$MOCK_BIN/apt-get" +export MOCK_APT_CALLS="$TMP/apt-calls" +if STATE_DIR="$TMP/offline-state" LOG_FILE="$TMP/offline.log" BF_OFFLINE_REPO="$TMP/missing-offline-repo" "$REPO_ROOT/scripts/install/blueforce-install.sh" --offline --dealer-id "$DEALER" --only 02-system --yes > "$TMP/offline.out" 2>&1; then fail 'offline installer must reject a missing local repository before modules'; fi +[[ ! -e "$MOCK_APT_CALLS" ]] || fail 'offline repository rejection must not invoke apt-get' +! grep -Eqi '(curl|wget|https?://|apt[[:space:]]+download)' "$TMP/offline.out" "$TMP/offline.log" 2>/dev/null || fail 'offline rejection must not run or report network package acquisition' +pass 'offline installer fails closed before package modules when local repository is absent' + +# --- scenario 2b: a Git-LFS pointer is not a package ------------------------- +# The bundle pool travels through Git LFS. A checkout made with smudge disabled +# (which bf-bootstrap does deliberately, to avoid an 884 MB download) leaves +# small pointer texts where the .deb files belong. They satisfy every existence +# test, so the installer must recognise them by content and say what to run -- +# otherwise the run dies later inside `sha256sum -c` and reads as a corrupt +# bundle rather than unfetched payload. +STUB_REPO="$TMP/stub-offline-repo" +mkdir -p "$STUB_REPO/pool" +printf 'stub index\n' > "$STUB_REPO/Packages" +printf 'stub index\n' > "$STUB_REPO/Packages.gz" +printf 'FAKE-SHA256SUMS\n' > "$STUB_REPO/SHA256SUMS" +printf 'package\tversion\tarchitecture\tsha256\tsource\n' > "$STUB_REPO/packages.lock.tsv" +printf 'curl\t8.5.0-2ubuntu10\tamd64\t%s\tcurl_8.5.0-2ubuntu10_amd64.deb\n' \ + '0000000000000000000000000000000000000000000000000000000000000000' >> "$STUB_REPO/packages.lock.tsv" +cat > "$STUB_REPO/pool/curl_8.5.0-2ubuntu10_amd64.deb" <<'POINTER' +version https://git-lfs.github.com/spec/v1 +oid sha256:0000000000000000000000000000000000000000000000000000000000000000 +size 285342 +POINTER +rm -f "$MOCK_APT_CALLS" +if STATE_DIR="$TMP/stub-state" LOG_FILE="$TMP/stub.log" BF_OFFLINE_REPO="$STUB_REPO" "$REPO_ROOT/scripts/install/blueforce-install.sh" --offline --dealer-id "$DEALER" --only 02-system --yes > "$TMP/stub.out" 2>&1; then fail 'offline installer must reject a bundle whose pool holds LFS pointers, not packages'; fi +grep -qi 'indirilmemiş\|işaretçi' "$TMP/stub.out" || fail 'the LFS-pointer refusal must name the cause (pointer text, not a .deb)' +grep -q 'git lfs pull' "$TMP/stub.out" || fail 'the LFS-pointer refusal must tell the operator the command that fixes it' +grep -qi 'checksum' "$TMP/stub.out" && fail 'an LFS pointer must not be reported as a checksum failure; that misdiagnoses unfetched payload as corruption' +[[ ! -e "$MOCK_APT_CALLS" ]] || fail 'an LFS-pointer rejection must not invoke apt-get' +pass 'offline installer recognises a Git-LFS pointer and names the remedy' + +# --- scenario 3: activation failure rolls back, phase is preserved ---------- +write_state "$pending_state" +rm -f "$WG_DIR/wg0.conf" +export MOCK_SYSTEMCTL_FAIL=1 +if printf '%s\n' 'another-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin; then fail 'activation failure must fail enrollment'; fi +[[ "$(state_field phase)" == 'PROVISIONED_OFFLINE' ]] || fail 'activation failure must not commit ENROLLED' +[[ "$(state_field enrollment_status)" == 'PENDING' ]] || fail 'activation failure must leave enrollment PENDING' +[[ ! -e "$WG_DIR/wg0.conf" ]] || fail 'activation failure must roll back a new config' +[[ -z "$(find "$STATE_DIR" -name '.state.json.*' -print -quit)" ]] || fail 'atomic state writes must leave no temporary files' +unset MOCK_SYSTEMCTL_FAIL +pass 'state transition rolls back on WireGuard activation failure and stays PENDING' + +# --- scenario 4: READY proof is independent and fails closed ---------------- +printf '%s\n' 'third-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin >/dev/null +[[ -s "$WG_DIR/wg0.conf" ]] || fail 're-enrollment after a rolled-back attempt must install wg0.conf' +RUST_SYSTEM="$TMP/RustDesk-system.toml"; RUST_USER="$TMP/RustDesk-user.toml" +printf "rendezvous-server = 'rustdesk.blueforce.test'\nrelay-server = 'rustdesk.blueforce.test'\n" > "$RUST_SYSTEM" +cp "$RUST_SYSTEM" "$RUST_USER" +export MOCK_HANDSHAKE="$(date +%s)" BF_RUSTDESK_SYSTEM_CONFIG="$RUST_SYSTEM" BF_RUSTDESK_USER_CONFIG="$RUST_USER" BF_MESH_CONFIG="$TMP/no-mesh" +python3 - "$BF_STATE_FILE" "$central_verified" <<'PY' +import json, sys +path, verified = sys.argv[1], json.loads(sys.argv[2]) +state = json.load(open(path, encoding='utf-8')) +state['central_verification'] = verified +json.dump(state, open(path, 'w', encoding='utf-8')) +PY +"$BIN/bf-check-ready" >/dev/null || fail 'ENROLLED state with independent local and central evidence must become ready-check eligible' +python3 - "$BF_STATE_FILE" <<'PY' +import json, sys +path = sys.argv[1] +state = json.load(open(path, encoding='utf-8')) +del state['central_verification'] +json.dump(state, open(path, 'w', encoding='utf-8')) +PY +if "$BIN/bf-check-ready" > "$TMP/ready-failclosed.out" 2>&1; then fail 'missing central verification evidence must fail closed'; fi +if "$BIN/bf-check-enrollment" > "$TMP/enroll-failclosed.out" 2>&1; then fail 'the ENROLLED gate must fail closed without central evidence'; fi +grep -q 'central_verification is missing' "$TMP/enroll-failclosed.out" || fail 'the ENROLLED gate must name the missing central evidence' +pass 'READY proof is independent of persisted READY and fails closed without central evidence' + +# --- scenario 5: skeleton release manifest ---------------------------------- +RELEASE="$TMP/release.yaml" +printf 'release:\n name: blueforce-provisioning-skeleton\n version: 0.1.0\n status: skeleton\n commit: deadbeef\n' > "$RELEASE" +if BF_RELEASE_MANIFEST="$RELEASE" "$BIN/bf-release" > "$TMP/release.out"; then fail 'skeleton release must be nonzero'; fi +grep -q 'UNAPPROVED_SKELETON' "$TMP/release.out" || fail 'skeleton release must be labelled unapproved' +pass 'nested skeleton manifest is not represented as a production release' + +# --- scenario 6: state machine contract ------------------------------------- +write_state "$pending_state" +[[ "$("$BIN/bf-enrollment-status" --field phase)" == 'PROVISIONED_OFFLINE' ]] || fail 'canonical reader must report the provisioned phase' +write_state "$(enrolled_state "$central_pending")" +"$BIN/bf-enrollment-status" | grep -qx 'Enrollment: ENROLLED' || fail 'ENROLLED stage must be visible before READY' +write_state "$(ready_state "$central_verified")" +"$BIN/bf-enrollment-status" > "$TMP/ready-status.out" || fail 'READY with verified central evidence must be contract-valid' +grep -qx 'Lifecycle: READY' "$TMP/ready-status.out" || fail 'READY stage must be reported' +grep -qx 'Enrollment: COMPLETE' "$TMP/ready-status.out" || fail 'READY implies a complete enrollment' +grep -qx 'Fleet: READY' "$TMP/ready-status.out" || fail 'READY implies fleet READY' +write_state "{\"phase\":\"READY\",\"enrollment_status\":\"PENDING\",\"fleet_status\":\"READY\",\"device_id\":\"BF-$DEALER\",\"provisioning_id\":\"p-1\"}" +if "$BIN/bf-enrollment-status" > "$TMP/skip.out" 2>/dev/null; then fail 'a skipped stage (PROVISIONED_OFFLINE -> READY) must be INVALID'; fi +grep -qx 'Lifecycle: INVALID' "$TMP/skip.out" || fail 'skipped stage must be reported as INVALID' +write_state "$(ready_state "$central_pending")" +if "$BIN/bf-enrollment-status" >/dev/null 2>&1; then fail 'READY without verified channels must be INVALID'; fi +write_state "{\"phase\":\"PROVISIONED_OFFLINE\",\"enrollment_status\":\"PENDING\",\"fleet_status\":\"PENDING\",\"device_id\":\"BF-$DEALER\"}" +if "$BIN/bf-enrollment-status" >/dev/null 2>&1; then fail 'a state without provisioning_id must be INVALID'; fi +if BF_STATE_FILE="$TMP/absent.json" "$BIN/bf-enrollment-status" > "$TMP/absent.out" 2>/dev/null; then fail 'a missing state file must exit non-zero'; fi +grep -qx 'Lifecycle: PENDING' "$TMP/absent.out" || fail 'a missing state file must report PENDING' +pass 'state machine is forward-only, never skips a stage and validates its contract' + +# --- scenario 6b: bf-status lifecycle block --------------------------------- +write_state "$(enrolled_state "$central_pending")" +BF_STATE_FILE="$BF_STATE_FILE" "$BIN/bf-status" > "$TMP/status.out" 2>/dev/null || fail 'bf-status must always exit 0' +grep -qx 'Provisioning : COMPLETE' "$TMP/status.out" || fail 'bf-status must show Provisioning : COMPLETE once central accepted the device' +grep -qx 'Enrollment : ENROLLED' "$TMP/status.out" || fail 'bf-status must show Enrollment : ENROLLED' +grep -qx 'Fleet State : NOT READY' "$TMP/status.out" || fail 'bf-status must show Fleet State : NOT READY before READY' +write_state "$pending_state" +"$BIN/bf-status" > "$TMP/status-pending.out" 2>/dev/null +grep -qx 'Provisioning : PROVISIONED_OFFLINE' "$TMP/status-pending.out" || fail 'bf-status must show the offline provisioning stage' +grep -qx 'Enrollment : PENDING' "$TMP/status-pending.out" || fail 'bf-status must show a pending enrollment' +write_state "$(ready_state "$central_verified")" +"$BIN/bf-status" > "$TMP/status-ready.out" 2>/dev/null +grep -qx 'Fleet State : READY' "$TMP/status-ready.out" || fail 'bf-status must show Fleet State : READY' +write_state "{\"phase\":\"READY\",\"enrollment_status\":\"PENDING\",\"fleet_status\":\"READY\",\"device_id\":\"BF-$DEALER\",\"provisioning_id\":\"p-1\"}" +"$BIN/bf-status" > "$TMP/status-invalid.out" 2>/dev/null +grep -q 'lifecycle state invalid' "$TMP/status-invalid.out" || fail 'bf-status must raise a critical alert for an invalid lifecycle state' +pass 'bf-status prints the Provisioning/Enrollment/Fleet State lifecycle block' + +# --- scenario 7: local gate is offline-safe --------------------------------- +write_state "$pending_state" +rm -f "$WG_DIR/wg0.conf" "$STATE_DIR/enrollment.token" +"$BIN/bf-check-local" > "$TMP/local.out" 2>&1 || fail 'bf-check-local must pass offline with no handshake and no wg0.conf' +grep -q 'local gates PASS' "$TMP/local.out" || fail 'bf-check-local must report a passing local gate' +! grep -q '^FAIL' "$TMP/local.out" || fail 'bf-check-local must not fail any local gate offline' +"$BIN/bf-check-local" --check >/dev/null 2>&1 || fail 'bf-check-local --check must behave like the default run' +[[ ! -e "$WG_DIR/wg0.conf" ]] || fail 'bf-check-local must not create enrollment artifacts' +! grep -Eq '(^|/)(curl|wget|apt|apt-get)( |$)' "$TMP/calls" 2>/dev/null || fail 'bf-check-local must not call network tools' +chmod 644 "$WG_DIR/privatekey" +if "$BIN/bf-check-local" >/dev/null 2>&1; then fail 'a world-readable WireGuard private key must fail the local gate'; fi +chmod 600 "$WG_DIR/privatekey" +MOCK_PUBLIC_KEY='CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=' "$BIN/bf-check-local" >/dev/null 2>&1 && fail 'a mismatched WireGuard keypair must fail the local gate' +if BF_STATE_FILE="$TMP/absent.json" "$BIN/bf-check-local" >/dev/null 2>&1; then fail 'a missing state file must fail the local gate'; fi +pass 'bf-check-local passes offline and fails closed on key hygiene' + +# --- scenario 8: ENROLLED gate needs evidence and a live tunnel ------------- +write_state "$pending_state" +rm -f "$WG_DIR/wg0.conf" +printf '%s\n' 'enrolled-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin >/dev/null +export MOCK_HANDSHAKE="$(date +%s)" +[[ -s "$WG_DIR/wg0.conf" ]] || fail 'a successful enrollment must install the assigned peer configuration' +[[ "$(state_field phase)" == 'ENROLLED' ]] || fail 'a successful enrollment must commit ENROLLED' +"$BIN/bf-check-enrollment" >/dev/null || fail 'ENROLLED gates must pass with peer config, live tunnel and a fresh handshake' +MOCK_HANDSHAKE=0 "$BIN/bf-check-enrollment" >/dev/null 2>&1 && fail 'a missing WireGuard handshake must fail the ENROLLED gate' +export MOCK_HANDSHAKE="$(date +%s)" +MOCK_IP_FAIL=1 "$BIN/bf-check-enrollment" >/dev/null 2>&1 && fail 'a missing wg0 interface must fail the ENROLLED gate' +MOCK_IP_FAIL=1 "$BIN/bf-check-ready" >/dev/null 2>&1 && fail 'a missing wg0 interface must fail the READY gate' +mv "$WG_DIR/wg0.conf" "$TMP/wg0.conf.keep" +"$BIN/bf-check-enrollment" >/dev/null 2>&1 && fail 'a missing peer configuration must fail the ENROLLED gate' +mv "$TMP/wg0.conf.keep" "$WG_DIR/wg0.conf" +write_state "$pending_state" +"$BIN/bf-check-enrollment" >/dev/null 2>&1 && fail 'PROVISIONED_OFFLINE must never pass the ENROLLED gate' +write_state "$(enrolled_state "$central_pending")" +"$BIN/bf-check-enrollment" >/dev/null || fail 'a device with pending central channels is still ENROLLED' +if "$BIN/bf-check-ready" >/dev/null 2>&1; then fail 'pending central channels must never produce READY'; fi +pass 'bf-check-enrollment requires central evidence, peer configuration and a fresh handshake' + +# --- scenario 9: replay and backwards protection ---------------------------- +write_state "$pending_state" +printf '%s\n' 'replay-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin >/dev/null +REPLAY_BEFORE="$(python3 -c "import json,sys;print(json.dumps(json.load(open(sys.argv[1])),sort_keys=True))" "$BF_STATE_FILE")" +if printf '%s\n' 'replay-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin > "$TMP/replay.out" 2>&1; then fail 'a second enrollment without --reenroll must be refused'; fi +grep -q 'already ENROLLED' "$TMP/replay.out" || fail 'the replay refusal must explain the ENROLLED state' +REPLAY_AFTER="$(python3 -c "import json,sys;print(json.dumps(json.load(open(sys.argv[1])),sort_keys=True))" "$BF_STATE_FILE")" +[[ "$REPLAY_BEFORE" == "$REPLAY_AFTER" ]] || fail 'a refused replay must not touch the state file' +printf '%s\n' 'replay-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin --reenroll >/dev/null || fail '--reenroll must re-apply enrollment' +[[ "$(state_field phase)" == 'ENROLLED' ]] || fail '--reenroll must never move the phase backwards' +write_state "$(ready_state "$central_verified")" +if printf '%s\n' 'replay-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin --reenroll > "$TMP/ready-refusal.out" 2>&1; then fail 'a READY device must refuse enrollment even with --reenroll'; fi +grep -q 'never move backwards' "$TMP/ready-refusal.out" || fail 'the READY refusal must explain the forward-only rule' +[[ "$(state_field phase)" == 'READY' ]] || fail 'the READY refusal must not change the phase' +[[ "$(stat -c '%a' "$BF_STATE_FILE")" == '600' ]] || fail 'state writes must stay at mode 600' +[[ -z "$(find "$STATE_DIR" -name '.state.json.*' -print -quit)" ]] || fail 'atomic writes must not leave temporary files' +pass 'replay and backwards transitions are refused, state writes are atomic and 0600' + +# --- scenario 10: systemd attempt and staged token -------------------------- +write_state "$pending_state" +rm -f "$WG_DIR/wg0.conf" "$STATE_DIR/enrollment.token" +BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd > "$TMP/pending.out" 2>&1 || fail 'the boot attempt must exit 0 while nothing is staged' +grep -q 'PENDING' "$TMP/pending.out" || fail 'the boot attempt must report PENDING' +[[ ! -e "$WG_DIR/wg0.conf" ]] || fail 'a pending boot attempt must not install a config' +BF_STATE_FILE="$TMP/absent.json" BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd > "$TMP/unprovisioned.out" 2>&1 || fail 'an unprovisioned device must exit 0 so the unit never loops' +grep -q 'PENDING' "$TMP/unprovisioned.out" || fail 'an unprovisioned device must report PENDING' +BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd >/dev/null 2>&1 || fail 'a boot attempt without central configuration must exit 0' +printf '%s\n' 'staged-secret-token' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin --stage >/dev/null || fail '--stage must store the token' +[[ "$(stat -c '%a' "$STATE_DIR/enrollment.token")" == '600' ]] || fail 'the staged token must be mode 600' +MOCK_CURL_FAIL=1 MOCK_CURL_RC=7 BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd > "$TMP/offline-attempt.out" 2>&1 && fail 'an unreachable endpoint must fail the attempt so the bounded retry can run' +[[ -e "$STATE_DIR/enrollment.token" ]] || fail 'a transient failure must keep the staged token for the bounded retry' +[[ "$(state_field phase)" == 'PROVISIONED_OFFLINE' ]] || fail 'a failed attempt must keep the lifecycle at PROVISIONED_OFFLINE' +[[ ! -e "$WG_DIR/wg0.conf" ]] || fail 'a failed attempt must not leave a WireGuard config behind' +unset MOCK_CURL_FAIL MOCK_CURL_RC +MOCK_CURL_FAIL=1 MOCK_CURL_RC=22 MOCK_HTTP_CODE=403 BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd >/dev/null 2>&1 && fail 'a definitive rejection must fail the attempt' +[[ ! -e "$STATE_DIR/enrollment.token" ]] || fail 'a definitive rejection must discard the consumed token' +unset MOCK_CURL_FAIL MOCK_CURL_RC MOCK_HTTP_CODE +printf '%s\n' 'staged-secret-token-two' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin --stage >/dev/null +touch -d '2 hours ago' "$STATE_DIR/enrollment.token" +BF_ENROLLMENT_TOKEN_MAX_AGE=1800 BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd >/dev/null || fail 'an expired staged token must exit 0 as PENDING' +[[ ! -e "$STATE_DIR/enrollment.token" ]] || fail 'an expired staged token must be discarded' +printf '%s\n' 'staged-secret-token-three' | BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll-now" --stage >/dev/null || fail 'the technician wrapper must stage a token' +[[ -e "$STATE_DIR/enrollment.token" ]] || fail 'bf-enroll-now --stage must leave the token staged' +BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --systemd >/dev/null || fail 'the boot attempt must enroll when a valid token is staged and central is reachable' +[[ "$(state_field phase)" == 'ENROLLED' ]] || fail 'the boot attempt must commit ENROLLED' +[[ ! -e "$STATE_DIR/enrollment.token" ]] || fail 'the staged token must be deleted after use' +! grep -R -F 'staged-secret-token-three' "$TMP" --exclude=header --exclude=request --exclude=enrollment.token || fail 'the staged token must not leak into state, logs or argv' +pass 'the boot attempt stays PENDING without a token and joins automatically with one' + +# --- scenario 11: --check dry run ------------------------------------------- +write_state "$pending_state" +rm -f "$WG_DIR/wg0.conf" "$STATE_DIR/enrollment.token" +BEFORE="$(cat "$BF_STATE_FILE")" +BF_ENROLLMENT_ENDPOINT="$ENDPOINT" "$BIN/bf-enroll" --token-stdin --check > "$TMP/check.out" 2>&1 || fail '--check must succeed on a valid pre-enrollment device' +grep -q 'would enroll' "$TMP/check.out" || fail '--check must describe the planned transition' +[[ "$BEFORE" == "$(cat "$BF_STATE_FILE")" ]] || fail '--check must not touch the state file' +[[ ! -e "$WG_DIR/wg0.conf" ]] || fail '--check must not write a WireGuard config' +[[ ! -e "$STATE_DIR/enrollment.token" ]] || fail '--check must not stage a token' +"$BIN/bf-enroll" --token-stdin --check >/dev/null 2>&1 && fail '--check must fail without an endpoint' +if BF_ENROLLMENT_ENDPOINT='https://example.invalid/enroll' "$BIN/bf-enroll" --token-stdin --check >/dev/null 2>&1; then fail '--check must reject placeholder endpoints'; fi +pass '--check validates without mutating or sending anything' + +# --- scenario 12: schemas match the client behaviour ------------------------ +python3 - "$REPO_ROOT" "$MOCK_REQUEST_CAPTURE" "$MOCK_RESPONSE" <<'PY' +import json, sys +root, request_capture, response_sample = sys.argv[1:4] +request_schema = json.load(open(root + '/provisioning/enrollment/schemas/enrollment-request.schema.json', encoding='utf-8')) +response_schema = json.load(open(root + '/provisioning/enrollment/schemas/enrollment-response.schema.json', encoding='utf-8')) +request = json.load(open(request_capture, encoding='utf-8')) +response = json.loads(response_sample) +if set(request_schema['properties']) != set(request_schema['required']): + raise SystemExit('request schema must close every property it requires') +if set(request) != set(request_schema['required']): + raise SystemExit('captured request does not match the request schema') +for section, keys in (('hardware', ('machine_id', 'product_uuid', 'sys_vendor')), ('release', ('os_release', 'kernel'))): + if set(request_schema['properties'][section]['required']) != set(keys): + raise SystemExit('%s schema fields drifted' % section) + if set(request[section]) != set(keys): + raise SystemExit('captured %s does not match the schema' % section) +required_response = set(response_schema['required']) +if set(response) - set(response_schema['properties']): + raise SystemExit('canned response carries fields the schema forbids') +if not required_response <= set(response): + raise SystemExit('canned response is missing required fields') +if set(response['wireguard']) != set(response_schema['properties']['wireguard']['required']): + raise SystemExit('WireGuard response fields drifted') +if set(response['central_verification']) != set(response_schema['properties']['central_verification']['required']): + raise SystemExit('central verification fields drifted') +blob = json.dumps(response_schema).lower() +for banned in ('private_key', 'privkey', 'password', 'bearer'): + if banned in blob: + raise SystemExit('response schema must not define a secret field: ' + banned) +PY +! grep -q 'BF-12345678' "$REPO_ROOT/provisioning/enrollment/README.md" || fail 'provisioning docs must not embed a device identity' +pass 'enrollment schemas match the implemented request and response contract' + +# --- scenario 13: boot unit cannot loop and carries no credential ----------- +UNIT="$REPO_ROOT/config/systemd/blueforce-enroll.service" +TIMER="$REPO_ROOT/config/systemd/blueforce-enroll.timer" +grep -q '^Restart=on-failure$' "$UNIT" || fail 'the boot unit must retry only failures' +grep -q '^Restart=always' "$UNIT" && fail 'the boot unit must never restart unconditionally' +grep -q '^RestartSec=' "$UNIT" || fail 'the boot unit must delay its bounded retries' +grep -q '^StartLimitBurst=' "$UNIT" || fail 'the boot unit must bound its retries' +grep -q '^StartLimitIntervalSec=' "$UNIT" || fail 'the boot unit must bound its retry window' +grep -q 'ExecStart=/usr/local/bin/bf-enroll --systemd' "$UNIT" || fail 'the boot unit must run the controlled attempt' +grep -q 'Unit=blueforce-enroll.service' "$TIMER" || fail 'the timer must trigger the enrollment attempt' +grep -q 'OnBootSec=' "$TIMER" || fail 'the timer must attempt shortly after boot' +! grep -Eqi '(token|password|secret|bearer)[[:space:]]*=' "$UNIT" "$TIMER" || fail 'the units must not embed a credential' +exec_lines="$(grep -E '^Exec[A-Za-z]*=' "$UNIT" || true)" +[[ -n "$exec_lines" ]] || fail 'the boot unit must define its attempt command' +! printf '%s\n' "$exec_lines" | grep -Eqi 'reboot|shutdown' || fail 'the boot unit must never reboot or shut down the device' +grep -q 'never reboots' "$UNIT" || fail 'the boot unit must document that it never reboots the device' +pass 'the enrollment units retry in a bounded way and carry no credential' + +printf 'test-field-os-lifecycle: all scenarios passed\n' + + + +#!/usr/bin/env bash +# Static and sandboxed behavior test for the first-boot terminal wizard. +# +# It never runs systemd, never touches apt, and never touches the real /var state: every +# scenario works inside a throwaway sandbox with a fake installer. Scenarios that require +# root run in a separate user namespace (unshare -r) and are reported as SKIP when the +# host does not permit that. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +TEST_SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +BF="$REPO_ROOT/provisioning/firstboot/bf-firstboot" +UNIT="$REPO_ROOT/provisioning/firstboot/blueforce-firstboot.service" +README_FILE="$REPO_ROOT/provisioning/firstboot/README.md" + +WORK="$(mktemp -d)" +PASSED=0 +FAILED=0 +SKIPPED=0 + +trap 'rm -rf "$WORK"' EXIT + +ok() { + if [[ -n "${BF_TEST_RESULTS:-}" ]]; then + printf 'PASS\t%s\n' "$*" >>"$BF_TEST_RESULTS" + else + printf 'OK %s\n' "$*" + PASSED=$((PASSED + 1)) + fi +} +bad() { + if [[ -n "${BF_TEST_RESULTS:-}" ]]; then + printf 'FAIL\t%s\n' "$*" >>"$BF_TEST_RESULTS" + else + printf 'FAIL %s\n' "$*" >&2 + FAILED=$((FAILED + 1)) + fi +} +skip() { + if [[ -n "${BF_TEST_RESULTS:-}" ]]; then + printf 'SKIP\t%s\n' "$*" >>"$BF_TEST_RESULTS" + else + printf 'SKIP %s\n' "$*" + SKIPPED=$((SKIPPED + 1)) + fi +} +section() { [[ -n "${BF_TEST_RESULTS:-}" ]] || printf '\n== %s ==\n' "$*"; } + +assert_rc() { + if [[ "$1" == "$2" ]]; then ok "$3"; else bad "$3 (expected exit $1, got $2)"; fi +} +assert_output() { + if [[ "$2" == *"$1"* ]]; then ok "$3"; else bad "$3 (output lacks: $1)"; fi +} +assert_no_output() { + if [[ "$2" != *"$1"* ]]; then ok "$3"; else bad "$3 (output unexpectedly contains: $1)"; fi +} +assert_file() { + if [[ -f "$1" ]]; then ok "$2"; else bad "$2 (missing: $1)"; fi +} +assert_no_file() { + if [[ ! -e "$1" ]]; then ok "$2"; else bad "$2 (unexpected path: $1)"; fi +} +assert_eq() { + if [[ "$1" == "$2" ]]; then ok "$3"; else bad "$3 (expected '$1', got '$2')"; fi +} +assert_grep() { + if grep -qF -- "$1" "$2" 2>/dev/null; then ok "$3"; else bad "$3 (pattern not found in $2)"; fi +} +assert_no_grep() { + if grep -qF -- "$1" "$2" 2>/dev/null; then bad "$3 (forbidden pattern found in $2)"; else ok "$3"; fi +} +assert_no_directive() { + if grep -qE "^[[:space:]]*$1=" "$2" 2>/dev/null; then bad "$3 (forbidden unit directive in $2)"; else ok "$3"; fi +} + +ENV_ARGS=() +SB='' +OUT='' +RC=0 + +new_sandbox() { + SB="$(mktemp -d "$WORK/sb.XXXXXX")" + { + printf '#!/usr/bin/env bash\n' + printf 'printf "%%s\\n" "$*" >> "%s/calls.log"\n' "$SB" + } >"$SB/fake-install.sh" + chmod 755 "$SB/fake-install.sh" + printf 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIexamplePublicKeyForStaticFirstbootTest field@blueforce\n' >"$SB/key.pub" + chmod 600 "$SB/key.pub" + ENV_ARGS=( + "BF_FIRSTBOOT_MARKER=$SB/marker" + "STATE_DIR=$SB/state" + "BF_INSTALLER_PATH=$SB/fake-install.sh" + "BF_ADMIN_PUBLIC_KEY_FILE=$SB/key.pub" + "BF_REIDENTITY_AUDIT_LOG=$SB/audit.log" + "BF_FIRSTBOOT_INPUT_TIMEOUT=10" + ) +} + +installer_calls() { + if [[ -f "$SB/calls.log" ]]; then wc -l <"$SB/calls.log" | tr -d ' '; else printf '0'; fi +} +installer_args() { + if [[ -f "$SB/calls.log" ]]; then cat "$SB/calls.log"; else printf ''; fi +} +sandbox_listing() { + (cd "$SB" && ls -1A | sort | tr '\n' ',') +} +write_marker() { + printf '%s\n' "$1" >"$SB/marker" + chmod 600 "$SB/marker" +} +marker_content() { + if [[ -f "$SB/marker" ]]; then tr -d '[:space:]' <"$SB/marker"; else printf ''; fi +} +file_mode() { + if [[ -e "$1" ]]; then stat -c '%a' "$1"; else printf ''; fi +} + +# Non-interactive invocation: stdin is /dev/null, so the wizard can never prompt. +run_bf() { + set +e + OUT="$(timeout 60 env "${ENV_ARGS[@]}" "$@" 2>&1 &1)" + RC=$? + set -e +} + +# Same, but with no bytes written to the pseudo terminal at all (timeout path). +run_bf_tty_silent() { + local inner + inner="$(pty_command "$@")" + set +e + OUT="$(printf '' | env SHELL=/bin/bash "${ENV_ARGS[@]}" timeout 60 script -qec "$inner" /dev/null 2>&1)" + RC=$? + set -e +} + +# --------------------------------------------------------------------------- +# Source, unit and documentation checks (no execution). +# --------------------------------------------------------------------------- +check_sources() { + section 'static: script, unit, README' + + [[ -x "$BF" ]] && ok 'bf-firstboot is executable' || bad 'bf-firstboot is executable' + assert_eq '#!/usr/bin/env bash' "$(head -n 1 "$BF")" 'bf-firstboot has a bash shebang' + if bash -n "$BF" 2>/dev/null; then ok 'bf-firstboot parses (bash -n)'; else bad 'bf-firstboot parses (bash -n)'; fi + assert_grep 'set -euo pipefail' "$BF" 'bf-firstboot uses strict mode' + assert_grep '^[0-9]{8}$' "$BF" 'bf-firstboot validates the dealer number with the shared regex' + assert_grep '# BLUEFORCE FIELD OS' "$BF" 'bf-firstboot prints the field console banner' + assert_grep "wizard_write '> '" "$BF" 'bf-firstboot prompts with the wizard input marker' + assert_grep '/dev/tty' "$BF" 'bf-firstboot opens /dev/tty when stdin is not a terminal' + assert_grep '/etc/blueforce/dealer-id' "$BF" 'bf-firstboot supports the seeded dealer id file' + assert_grep '--offline' "$BF" 'bf-firstboot calls the installer offline-only' + assert_grep 'blueforce-install.sh' "$BF" 'bf-firstboot targets the local installer' + assert_grep 'BF_FIRSTBOOT_TEST_MODE' "$BF" 'bf-firstboot keeps the mutation-free test mode' + assert_grep '--resume' "$BF" 'bf-firstboot resumes a partial install' + assert_grep '--force-reidentity' "$BF" 'bf-firstboot exposes the admin re-identity path' + assert_grep 'BF_ALLOW_REIDENTITY' "$BF" 'the re-identity path is gated by an operator switch' + assert_grep 'already completed' "$BF" 'bf-firstboot short-circuits on the completion marker' + + assert_no_grep 'curl' "$BF" 'bf-firstboot fetches nothing from the network' + assert_no_grep 'wget' "$BF" 'bf-firstboot does not download via wget' + assert_no_grep 'set -x' "$BF" 'bf-firstboot never traces (no accidental key dump)' + if grep -nE '(^|[^A-Za-z_])(cat|tee|head|tail|awk|printf|echo|cp|scp)[[:space:]]+[^|]*\$KEY_FILE' "$BF" >/dev/null 2>&1; then + bad 'the administrator key file is never read out into a message or a copy' + else + ok 'the administrator key file is never read out into a message or a copy' + fi + + assert_file "$UNIT" 'the first-boot unit is present' + assert_grep 'ConditionPathExists=/etc/blueforce/admin-authorized-key.pub' "$UNIT" 'the unit requires the administrator public key' + assert_grep 'ConditionPathExists=!/var/lib/blueforce/firstboot-complete' "$UNIT" 'the unit is skipped once the marker exists' + assert_grep 'TimeoutStartSec=' "$UNIT" 'the unit bounds its runtime' + assert_grep 'StandardInput=tty-force' "$UNIT" 'the unit attaches the wizard to the console' + assert_grep 'Type=oneshot' "$UNIT" 'the unit is a one-shot service' + assert_grep 'RemainAfterExit=yes' "$UNIT" 'the unit records its result' + assert_grep 'WantedBy=multi-user.target' "$UNIT" 'the unit runs once at boot' + assert_no_directive 'ProtectSystem' "$UNIT" 'the unit does not sandbox paths the offline installer must write' + assert_no_directive 'ProtectHome' "$UNIT" 'the unit keeps /home/blueforce writable for the user module' + + assert_file "$README_FILE" 'the first-boot README is present' + assert_grep 'BLUEFORCE FIELD OS' "$README_FILE" 'the README documents the wizard screen' + assert_grep 'force-reidentity' "$README_FILE" 'the README documents the admin identity change procedure' + assert_grep 'BF_ALLOW_REIDENTITY' "$README_FILE" 'the README documents that identity change is off by default' + assert_grep 'public SSH key' "$README_FILE" 'the README states the administrator key rule' + assert_grep '/var/log/blueforce-reidentity.log' "$README_FILE" 'the README documents the identity change audit record' + assert_grep 'ConditionPathExists' "$README_FILE" 'the README explains the unit conditions' +} + +# --------------------------------------------------------------------------- +# Command line behavior: check mode, validation, automation path, no terminal. +# --------------------------------------------------------------------------- +check_cli() { + section 'cli: validation, check mode, no-terminal fallback' + + new_sandbox + run_bf bash "$BF" --check --dealer-id 12010193 + assert_rc 0 "$RC" 'check mode accepts a valid dealer number' + assert_output 'no changes were made' "$OUT" 'check mode reports that it made no changes' + assert_no_file "$SB/marker" 'check mode writes no marker' + assert_no_file "$SB/state" 'check mode creates no state directory' + assert_eq '0' "$(installer_calls)" 'check mode never runs the installer' + assert_eq 'fake-install.sh,key.pub,' "$(sandbox_listing)" 'check mode leaves the sandbox untouched' + + for candidate in 1234567 123456789 1234abcd '' '12 34 5678'; do + new_sandbox + run_bf bash "$BF" --check --dealer-id "$candidate" + assert_rc 2 "$RC" "invalid dealer number is rejected: '${candidate:-}'" + assert_output '8 digits' "$OUT" "rejection of '${candidate:-}' explains the expected format" + assert_no_file "$SB/marker" "rejection of '${candidate:-}' writes no marker" + done + + new_sandbox + run_bf bash "$BF" --check + assert_rc 2 "$RC" 'check mode without any dealer number fails with a clear error' + assert_no_file "$SB/marker" 'a failed check mode writes no marker' + + new_sandbox + run_bf bash "$BF" --not-a-flag + assert_rc 2 "$RC" 'an unknown argument is rejected' + assert_output 'unknown argument' "$OUT" 'an unknown argument is reported explicitly' + + new_sandbox + run_bf bash "$BF" --dealer-id 1234567 + assert_rc 2 "$RC" 'a 7-digit dealer number never reaches the installer' + assert_no_file "$SB/marker" 'a rejected dealer number writes no marker' + assert_eq '0' "$(installer_calls)" 'a rejected dealer number never runs the installer' + + # Non-interactive mode with no seeded file and no flag must fail closed, without hanging. + new_sandbox + run_bf bash "$BF" --non-interactive + assert_rc 2 "$RC" 'non-interactive mode without any dealer number fails' + if [[ "$OUT" == *'dealer id file is missing or unreadable'* || "$OUT" == *'invalid dealer number'* ]]; then + ok 'non-interactive mode names the unusable dealer id input' + else + bad 'non-interactive mode names the unusable dealer id input' + fi + assert_no_file "$SB/marker" 'the no-input path writes no marker' + + # Explicit file path (automation) is honoured and never opens the wizard. + new_sandbox + printf '12010193\n' >"$SB/dealer-id" + run_bf bash "$BF" --dealer-id-file "$SB/dealer-id" + assert_no_output '# BLUEFORCE FIELD OS' "$OUT" 'the automation path never opens the wizard' + assert_no_output '8 Haneli Bayi Numarası' "$OUT" 'the automation path asks nothing at the console' + assert_eq '0' "$(installer_calls)" 'the automation path runs no installer when it cannot install' + if [[ "$(id -u)" -eq 0 ]]; then + assert_rc 0 "$RC" 'the dealer id file path completes when the test runs as root' + else + assert_rc 1 "$RC" 'the dealer id file path fails closed without root' + assert_output 'must run as root' "$OUT" 'the automation path reports the missing privilege' + assert_no_file "$SB/marker" 'the automation path writes no marker when it cannot install' + fi + + new_sandbox + printf 'nope\n' >"$SB/dealer-id" + run_bf bash "$BF" --dealer-id-file "$SB/dealer-id" + assert_rc 2 "$RC" 'an invalid value in the dealer id file is rejected' + assert_output 'invalid dealer number' "$OUT" 'an invalid file value names the format rule' + + new_sandbox + printf '12010193\n' >"$SB/dealer-id" + run_bf BF_FIRSTBOOT_NONINTERACTIVE=1 bash "$BF" --dealer-id-file "$SB/dealer-id" + assert_no_output '# BLUEFORCE FIELD OS' "$OUT" 'explicit non-interactive mode never opens the wizard' + assert_eq '0' "$(installer_calls)" 'explicit non-interactive mode runs no installer when it cannot install' +} + +# --------------------------------------------------------------------------- +# Wizard behavior through a pseudo terminal. +# --------------------------------------------------------------------------- +check_wizard() { + section 'wizard: pty input, confirmation, attempt limit' + + new_sandbox + run_bf_tty '1234567 +abcd +nope' bash "$BF" + assert_rc 2 "$RC" 'three malformed entries abort the wizard' + assert_output '# BLUEFORCE FIELD OS' "$OUT" 'the wizard shows the field console banner' + assert_output '8 Haneli Bayi Numarası' "$OUT" 'the wizard shows the Turkish dealer number prompt' + assert_output 'deneme 3/3' "$OUT" 'the wizard counts attempts and never accepts malformed input' + assert_output 'not accepted after 3 attempts' "$OUT" 'the wizard aborts with an explicit error after the limit' + assert_no_file "$SB/marker" 'the aborted wizard writes no marker' + assert_eq '0' "$(installer_calls)" 'the aborted wizard never runs the installer' + + new_sandbox + run_bf_tty '1201 0193 +12010193 +e' bash "$BF" + assert_output 'Geçersiz giriş' "$OUT" 'the wizard rejects a malformed entry that contains a space' + assert_output 'deneme 1/3' "$OUT" 'the wizard re-asks once a malformed entry is rejected' + assert_output 'BF-12010193' "$OUT" 'the wizard accepts the corrected entry after a rejection' + + new_sandbox + run_bf_tty '12010193 +e' bash "$BF" + assert_output 'BF-12010193' "$OUT" 'the confirmed wizard shows Device ID BF-' + assert_output 'bf-12010193' "$OUT" 'the confirmed wizard shows hostname bf-' + assert_eq '0' "$(installer_calls)" 'the wizard run does not reach the installer without root' + if [[ "$(id -u)" -eq 0 ]]; then + assert_rc 0 "$RC" 'the confirmed wizard completes when the test runs as root' + else + assert_rc 1 "$RC" 'the confirmed wizard stops at the privilege gate without root' + assert_output 'must run as root' "$OUT" 'the confirmed wizard proceeds past identity validation' + fi + + new_sandbox + run_bf_tty '12010193 +n +12010193 +n +12010193 +n' bash "$BF" + assert_rc 2 "$RC" 'refusing the confirmation three times aborts the wizard' + assert_output 'Onay verilmedi' "$OUT" 'the wizard re-asks when the identity is not confirmed' + assert_eq '0' "$(installer_calls)" 'a refused confirmation never runs the installer' + + new_sandbox + run_bf_tty_silent bash "$BF" + assert_rc 2 "$RC" 'a silent console aborts the wizard instead of waiting forever' + assert_output 'timed out' "$OUT" 'the silent console path explains the timeout' + assert_eq '0' "$(installer_calls)" 'the silent console path never runs the installer' +} + +# --------------------------------------------------------------------------- +# Root-only behavior in a separate user namespace. +# --------------------------------------------------------------------------- +check_root_paths() { + section 'root (namespace): install run, marker, key gate, re-identity' + + new_sandbox + run_bf BF_FIRSTBOOT_TEST_MODE=1 bash "$BF" --dealer-id 12010193 + assert_rc 0 "$RC" 'test mode completes successfully as root' + assert_output "TEST: would run $SB/fake-install.sh --offline --dealer-id 12010193 --yes" "$OUT" 'test mode builds the exact offline installer command' + assert_no_file "$SB/marker" 'test mode is mutation-free (no marker)' + assert_eq '0' "$(installer_calls)" 'test mode never runs the installer' + + new_sandbox + mkdir -p "$SB/state" + printf '01-precheck=OK\n' >"$SB/state/install-state" + run_bf BF_FIRSTBOOT_TEST_MODE=1 bash "$BF" --dealer-id 12010193 + assert_rc 0 "$RC" 'a partial install state is accepted' + assert_output '--resume' "$OUT" 'a partial install is resumed instead of restarted' + + new_sandbox + run_bf bash "$BF" --dealer-id 12010193 + assert_rc 0 "$RC" 'first boot completes with the (fake) installer' + assert_file "$SB/marker" 'the completion marker is written' + assert_eq '600' "$(file_mode "$SB/marker")" 'the marker is mode 600' + assert_eq '12010193' "$(marker_content)" 'the marker records the provisioned dealer number' + assert_eq '--offline --dealer-id 12010193 --yes' "$(installer_args)" 'the installer is called offline with the validated dealer number' + + run_bf bash "$BF" --dealer-id 12010193 + assert_rc 0 "$RC" 'a second run exits successfully' + assert_output 'already completed' "$OUT" 'a provisioned device reports that first boot is done' + assert_eq '1' "$(installer_calls)" 'a provisioned device never runs the installer again' + + run_bf bash "$BF" --dealer-id 87654321 + assert_rc 0 "$RC" 'a different dealer number does not fail the run' + assert_output 'identity changes use the admin procedure' "$OUT" 'a different dealer number points at the admin procedure' + assert_eq '12010193' "$(marker_content)" 'the provisioned identity is unchanged' + assert_eq '1' "$(installer_calls)" 'the installer is not re-run for a different dealer number' + + run_bf_tty '87654321 +e' bash "$BF" + assert_eq '12010193' "$(marker_content)" 'the wizard cannot change a provisioned identity' + assert_eq '1' "$(installer_calls)" 'the wizard does not re-run the installer on a provisioned device' + + new_sandbox + printf -- '-----BEGIN OPENSSH PRIVATE KEY-----\nAAAAB3NzaC1yc2EFIRSTBOOTSECRETBODY\n-----END OPENSSH PRIVATE KEY-----\n' >"$SB/priv.key" + chmod 600 "$SB/priv.key" + run_bf BF_ADMIN_PUBLIC_KEY_FILE="$SB/priv.key" bash "$BF" --dealer-id 12010193 + assert_rc 1 "$RC" 'private key material is refused as an administrator key' + assert_output 'must contain only a public SSH key' "$OUT" 'the refusal states the public-key rule' + assert_no_output 'FIRSTBOOTSECRETBODY' "$OUT" 'no key material is echoed in the error output' + assert_no_output 'PRIVATE KEY' "$OUT" 'the private key header is never echoed' + assert_no_file "$SB/marker" 'a refused key writes no marker' + assert_eq '0' "$(installer_calls)" 'a refused key never runs the installer' + + new_sandbox + chmod 644 "$SB/key.pub" + run_bf bash "$BF" --dealer-id 12010193 + assert_rc 1 "$RC" 'a group/world readable administrator key file is refused' + assert_output 'root-owned' "$OUT" 'the refusal states the ownership and mode rule' + assert_no_file "$SB/marker" 'a refused key mode writes no marker' + + new_sandbox + run_bf BF_ADMIN_PUBLIC_KEY_FILE="$SB/missing.pub" bash "$BF" --dealer-id 12010193 + assert_rc 1 "$RC" 'a missing administrator key file blocks the offline install' + assert_output 'OFFLINE BLOCKED' "$OUT" 'a missing administrator key is reported as an offline block' + + new_sandbox + run_bf bash "$BF" --check --dealer-id 12010193 + assert_rc 0 "$RC" 'check mode succeeds as root' + assert_no_file "$SB/marker" 'check mode writes no marker as root' + assert_no_file "$SB/state" 'check mode creates no state directory as root' + assert_eq '0' "$(installer_calls)" 'check mode runs no installer as root' + assert_eq 'fake-install.sh,key.pub,' "$(sandbox_listing)" 'check mode leaves the sandbox untouched as root' + + new_sandbox + write_marker 12010193 + run_bf bash "$BF" --force-reidentity --dealer-id 55555555 + assert_rc 1 "$RC" 're-identity is refused without the operator gate' + assert_output 'disabled by default' "$OUT" 'the refusal explains that identity change is off by default' + assert_eq '12010193' "$(marker_content)" 'a refused re-identity leaves the marker unchanged' + assert_eq '0' "$(installer_calls)" 'a refused re-identity runs no installer' + assert_no_file "$SB/audit.log" 'a refused re-identity writes no audit record' + + new_sandbox + write_marker 12010193 + run_bf_tty '99999999' BF_ALLOW_REIDENTITY=1 bash "$BF" --force-reidentity --dealer-id 55555555 + assert_rc 2 "$RC" 'a mismatching confirmation aborts the identity change' + assert_output 'confirmation did not match' "$OUT" 'the aborted identity change says why' + assert_eq '12010193' "$(marker_content)" 'the aborted identity change leaves the marker unchanged' + assert_eq '0' "$(installer_calls)" 'the aborted identity change runs no installer' + + new_sandbox + write_marker 12010193 + printf 'not a directory\n' >"$SB/blocker" + run_bf_tty '55555555' BF_ALLOW_REIDENTITY=1 BF_REIDENTITY_AUDIT_LOG="$SB/blocker/audit.log" bash "$BF" --force-reidentity --dealer-id 55555555 + assert_rc 1 "$RC" 'an unwritable audit log fails the identity change closed' + assert_output 'audit log is not writable' "$OUT" 'the failure names the unwritable audit log' + assert_eq '12010193' "$(marker_content)" 'a failed audit leaves the marker unchanged' + assert_eq '0' "$(installer_calls)" 'a failed audit runs no installer' + + new_sandbox + write_marker 12010193 + run_bf_tty '55555555' BF_ALLOW_REIDENTITY=1 bash "$BF" --force-reidentity --dealer-id 55555555 + assert_rc 0 "$RC" 'an admitted identity change completes' + assert_eq '55555555' "$(marker_content)" 'the marker carries the new dealer number' + assert_eq '--offline --dealer-id 55555555 --yes' "$(installer_args)" 'the installer is re-run with the new dealer number' + if compgen -G "$SB/marker.reidentified-*" >/dev/null; then + ok 'the previous identity marker is archived' + else + bad 'the previous identity marker is archived' + fi + assert_output 'AUDIT: identity-change applied' "$OUT" 'the identity change is announced in the run log' + assert_file "$SB/audit.log" 'the identity change writes an audit record' + assert_eq '600' "$(file_mode "$SB/audit.log")" 'the audit record is mode 600' + assert_grep 'identity-change applied old=12010193 new=BF-55555555' "$SB/audit.log" 'the audit record names the old and the new identity' + + new_sandbox + run_bf_tty '12010193 +e' bash "$BF" + assert_rc 0 "$RC" 'the wizard completes the first boot as root' + assert_output '# BLUEFORCE FIELD OS' "$OUT" 'the interactive run shows the banner' + assert_output 'BF-12010193' "$OUT" 'the interactive run shows the Device ID' + assert_eq '12010193' "$(marker_content)" 'the interactive run writes the marker for the confirmed identity' + assert_eq '--offline --dealer-id 12010193 --yes' "$(installer_args)" 'the interactive run calls the installer offline' +} + +if [[ -n "${BF_TEST_RESULTS:-}" ]]; then + # Child mode: only the root-required scenarios run; results go to the parent's file. + cd "$REPO_ROOT" + check_root_paths + exit 0 +fi + +check_sources +check_cli +check_wizard + +section 'root (namespace): install run, marker, key gate, re-identity' +RESULTS_FILE="$WORK/root-results.tsv" +: >"$RESULTS_FILE" +if unshare -r true >/dev/null 2>&1 && [[ "$(unshare -r id -u 2>/dev/null)" == 0 ]]; then + CHILD_LOG="$WORK/child.log" + if unshare -r env BF_TEST_RESULTS="$RESULTS_FILE" bash "$TEST_SCRIPT" >"$CHILD_LOG" 2>&1; then + : + else + printf 'FAIL the privileged (namespace) section did not complete; see the log below\n' >&2 + sed -n '1,20p' "$CHILD_LOG" >&2 + FAILED=$((FAILED + 1)) + fi + if [[ -s "$RESULTS_FILE" ]]; then + while IFS=$'\t' read -r status name; do + case "$status" in + PASS) ok "$name";; + SKIP) skip "$name";; + *) bad "$name";; + esac + done <"$RESULTS_FILE" + else + skip 'the privileged (namespace) section produced no results' + fi +else + skip 'unshare -r is unavailable here: root-only first-boot scenarios were not run' +fi + +printf '\ntest-firstboot-static: %s passed, %s failed, %s skipped\n' "$PASSED" "$FAILED" "$SKIPPED" +if [[ "$FAILED" -ne 0 ]]; then + printf 'test-firstboot-static: FAILED\n' >&2 + exit 1 +fi +printf 'test-firstboot-static: all passed\n' + + + +/* + * Blueforce Field OS — design tokens + * --------------------------------------------------------------------------- + * One source for both operator surfaces: + * - the device console (Python/tkinter, bfos/ui_theme.py reads these values) + * - the central panel (stdlib http.server, web/templates/*) + * + * The surfaces share a status vocabulary because they describe the same fleet + * from two ends. A colour here means one thing everywhere: a device state, a + * severity, or an action weight. It never decorates. + * + * WHY LIGHT, NOT DARK + * The console is used in workshops, dealer service areas and customer sites -- + * bright overhead light, daylight from a roller door, a 14" laptop panel. A + * near-black console loses its own body text there and its state colours + * collapse into equal-brightness smudges. So the ground is light, the text is + * dark, and saturation is spent only where it carries meaning: state. + * + * WHAT THE COLOURS HAVE TO CARRY + * The catalogue is 48 operations, 13 of which write. The state machine has + * three stages and a device can also be failed or absent. That is four + * severities plus one action colour, and no more -- a fifth hue would make the + * distinction something an operator has to read instead of see. + */ + +:root { + /* -- Ground and structure -------------------------------------------- */ + --bg-app: #f6f7f8; /* window ground */ + --bg-panel: #ffffff; /* raised surfaces, cards, table body */ + --bg-sunken: #eef0f2; /* wells: log output, code, inactive rows */ + --bg-header: #1d2530; /* app header; the one dark region */ + --border: #d5d9de; /* hairline between regions */ + --border-strong: #b6bcc4; /* input borders, table rules */ + + /* -- Text ------------------------------------------------------------- */ + --text: #1a1f26; /* body */ + --text-muted: #5c6570; /* secondary lines, labels */ + --text-faint: #8b939c; /* timestamps, hints, placeholders */ + --text-on-dark: #e8ebee; /* header text */ + --text-on-accent: #ffffff; + + /* -- Action ----------------------------------------------------------- */ + /* One accent. It marks the action the operator came to take and the + selection in a list; nothing else. */ + --accent: #1d4ed8; + --accent-hover: #1a43bd; + --accent-active: #16389e; + --accent-soft: #e8eeff; /* selected row, focus ring fill */ + --focus-ring: #1d4ed8; + + /* -- State: the fleet vocabulary -------------------------------------- */ + /* Four severities. Each has a strong form for text and a soft form for + fills, so a badge can be built from either without a second palette. */ + --ok: #15803d; + --ok-soft: #e6f4ea; + --warn: #b45309; + --warn-soft: #fdf3e3; + --danger: #b91c1c; + --danger-soft: #fdecec; + --info: #1d4ed8; + --info-soft: #e8eeff; + --idle: #5c6570; /* not yet acted on: not a failure */ + --idle-soft: #eef0f2; + + /* Device state machine ---------------------------------------------- + PROVISIONED_OFFLINE -> ENROLLED -> READY, and the failure/absence that sit + outside the sequence. Kept as named tokens so no surface invents a fifth + stage or repaints a stage by accident. + + PROVISIONED is deliberately NOT the action accent. The accent means "the + action you came to take" and "the selected row"; a state that borrowed it + made a KURULDU badge and a selected row the same blue, so a list could not + say which of the two it was showing. This slate is distinct from both the + accent and the neutral --idle, and reads as one step along a path. */ + --state-provisioned: #475569; + --state-enrolled: var(--warn); + --state-ready: var(--ok); + --state-failed: var(--danger); + --state-absent: var(--idle); + + /* -- Type ------------------------------------------------------------- */ + /* Workhorse faces only: this is an Operate surface, and the value of a + webfont here is negative -- the fleet installs offline from a committed + pool, so a font CDN is a broken page on every device. The UI face is + whatever the platform ships; the data face is monospace so device ids, + counts and exit codes line up in a column. */ + --font-ui: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", + "DejaVu Sans", sans-serif; + --font-data: ui-monospace, "Cascadia Mono", "JetBrains Mono", Menlo, + Consolas, "DejaVu Sans Mono", monospace; + + --size-xs: 12px; /* timestamps, table meta */ + --size-sm: 13px; /* labels, table body */ + --size-md: 15px; /* body, inputs, buttons */ + --size-lg: 18px; /* card titles */ + --size-xl: 22px; /* view titles */ + --size-2xl: 30px; /* the one headline figure per view */ + + --leading-tight: 1.25; + --leading-normal: 1.5; + + /* -- Space ------------------------------------------------------------ */ + /* A 4px rhythm. Named, so a component never hand-picks 7px. */ + --sp-1: 4px; + --sp-2: 8px; + --sp-3: 12px; + --sp-4: 16px; + --sp-5: 24px; + --sp-6: 32px; + --sp-7: 48px; + + --radius: 6px; + --radius-lg: 10px; + + /* -- Elevation -------------------------------------------------------- */ + /* Two levels. More would separate regions that are not separate. */ + --shadow-sm: 0 1px 2px rgba(16, 24, 40, .06); + --shadow-md: 0 4px 12px rgba(16, 24, 40, .10); + + /* -- Metrics ---------------------------------------------------------- */ + --row-h: 44px; /* fleet table row: comfortable at arm's length */ + --control-h: 36px; /* buttons and inputs share one height */ + --header-h: 56px; + --sidebar-w: 220px; +} + + + +*.deb filter=lfs diff=lfs merge=lfs -text + + + +# Blueforce Field OS — Uygulama Raporu + +**Tarih:** 2026-09-16 +**Kapsam:** Windows 10 saha PC'lerinin Blueforce Field OS'a dönüştürülmesi için provisioning, ISO üretimi, offline kurulum, cihaz durumu ve enrollment katmanları. +**Yöntem:** Bu rapordaki her sayı depodaki gerçek dosyalardan, çalıştırılan testlerden ve üretilen ISO artefaktından okunmuştur. Doğrulanamayan hiçbir iddia "tamam" sayılmamıştır. + +> **Dürüstlük sınırı:** Gerçek bir ISO üretildi ve doğrulandı. Ancak gerçek donanımda boot, gerçek Windows cihaz, gerçek merkez enrollment endpoint'i ve gerçek air-gapped `.deb` kurulumu **henüz yapılmadı**. Bu maddeler §7'de listelidir. + +--- + +## 1. Önceden ne vardı? + +- 00–25 numaralı mimari, işletim, güvenlik, rollout ve runbook dokümantasyonu; `scripts/` (installer + diagnostics), `ansible/`, `config/`, `monitoring/`, `rustdesk/`, `docs-site/` iskeleti. +- Çalışan `blueforce-install.sh` + 18 modül, `BF-<8 hane>` kimlik standardı, `bf-status` / `bf-diagnostics` / `bf-support-bundle` / `bf-hardware-inventory.sh`. +- WireGuard, SSH, xRDP, RustDesk OSS, Docker politikaları, UFW/Docker firewall, log yönetimi, recovery runbook'ları. +- **Eksik olan:** Field OS medya yaşam döngüsü (ISO gerçekten üretilmiyordu), offline paket deposu (manifestler boştu), firstboot kimlik akışı, 3 aşamalı durum modeli, enrollment sözleşmesi, Windows geçiş araçları ve doküman tutarlılığı. + +--- + +## 2. Ne değişti? + +### 2.1 ISO artık gerçekten üretiliyor (en kritik kazanım) + +Önceki durumda `build-blueforce-iso.sh` bir iskeletti: `--allow-remaster` olmadan çıktı üretmiyor, boot menüsünü entegre etmiyor, offline repo eklemiyordu. Şimdi gerçek medya üretiyor. + +**Üretilen artefakt (doğrulandı):** + +| Alan | Değer | +|---|---| +| Dosya | `dist/Blueforce-Field-OS-1.0.0-amd64.iso` | +| Boyut | 6 481 917 952 byte (6.04 GiB) | +| ISO SHA256 | `cb0cc56f0442fbd1418e0d0f35521522f4ec9aa3f203779a67e96d587d431296` | +| Base ISO | `ubuntu-26.04.1-desktop-amd64.iso`, SHA256 `601e30fbf5d97759367c632e2c33630665039b7e2158fd068403da3ccf1bda1f` (Canonical `SHA256SUMS` ile birebir) | +| Base flavour | `desktop` (bkz. §8 baseline sapması) | +| Boot | El Torito **BIOS + UEFI** korundu | +| Build | 2026-09-16T08:00:29Z | + +**Çözülen kök nedenler** (hepsi ölçülmüş hata mesajlarıyla, kalıcı referans: `ubuntu-iso-remaster` skill): + +1. `-boot_image any replay` Ubuntu ISO'larında çalışmaz — GRUB2 MBR kodu kaynak imajın ilk 16 sektöründe, EFI sistemi ise ISO dosya sistemi *dışında* appended partition olarak durur. Çözüm: boot düzenini `xorriso -report_el_torito as_mkisofs` çıktısından okuyup `-as mkisofs` ile yeniden kurmak. +2. `-as mkisofs` xorriso-native `-volume_date` opsiyonunu tanımaz → `--modification-date` kullanılır. +3. `as_mkisofs` kendi `--modification-date` satırını verir; xorriso bunu `-volume_date uuid`'ye çevirip reddeder → filtrelenir. +4. Opsiyon satırları tek argümana çöküyordu → tırnak-honor eden tokenizer (30 argüman). +5. `sed` ile yol değişimi tırnakları bozuyor ve `--interval` alanlarını kaydırıyordu → yol yeniden yazılmaz. + +### 2.2 Offline kurulum sözleşmesi + +- `provisioning/offline-repo/manifests/{base-packages,remote-access,docker}.txt` artık hangi paketlerin gerektiğini **somut** listeliyor (pin formatı `package=version`), paket sürümleri LAB'da doldurulacak. +- `build-offline-repo.sh`: `apt-ftparchive` + `dpkg-deb` zorunlu; pin semantiği doğrulanır; placeholder/eksik pin net hatayla reddedilir. +- ISO içine gömülü repo olmadığında medium `offline_repo_status: not-included` yazar ve hedef cihaz `OFFLINE BLOCKED` ile kapalı kalır — sessizce "kurulmuş gibi" yapmaz. + +### 2.3 Cihaz kimliği ve durum modeli + +- `bf-firstboot`: bayi numarası terminal wizard'ı (`^[0-9]{8}$`), hatalı girişi kabul etmez, 3 denemede net hata; non-interactive modda dosya/argüman yolu. Kimlik değişimi ayrı admin/recovery prosedürüne bağlı. +- Üç aşamalı model: **`PROVISIONED_OFFLINE` → `ENROLLED` → `READY`**. İleri yönlü, atlama ve geri dönüş yok; her geçiş atomik ve 0600. +- `bf-status` artık `Provisioning / Enrollment / Fleet State` satırlarını gösteriyor. +- **Kritik davranış:** internet/WireGuard yokluğu kurulumu FAIL etmez. `bf-check-local` internetsiz PASS verebilir; `bf-check-enrollment` ve `bf-check-ready` merkez kanıtı olmadan **fail-closed** kalır. + +### 2.4 Enrollment (tasarım + istemci) + +- Tek kullanımlık token akışı seçildi; imzalı bootstrap bundle / kalıcı ortak secret / manuel kayıt karşılaştırılıp elendi. +- **700 cihaza aynı kalıcı secret konmaz.** WireGuard **private key cihazdan çıkmaz**; yalnız public key + non-secret metadata gönderilir. +- `blueforce-enroll.service` sınırlı yeniden deneme (`RestartSec`, `StartLimitBurst`), reboot loop yok; internet gelince kendiliğinden katılır, yoksa `PENDING` kalır. +- **Merkezi endpoint bilinçli olarak yazılmadı** (prompt §18: önce tasarım). Sözleşme JSON şemalarıyla sabitlendi. + +### 2.5 Filo otomasyonu + +- Mevcut 16 playbook korundu; **5 read-only** playbook eklendi: `bf-fieldos-version` (hangi cihazda hangi sürüm), `bf-provisioning-status`, `bf-enrollment-status`, `bf-remote-channels-check`, `bf-offline-ready-check`. +- Her playbook dalga kapsam kapısı taşıyor; production ayrıca `production_override` ister. Kapı matrisi canlı test edildi (boş/hatalı dalga, onaysız koşu, dalga dışı `--limit` → rc=2). + +### 2.6 Windows geçişi ve canlı donanım kontrolü + +- Read-only PowerShell envanter/veri dışa aktarma araçları prompt kapsamına (ağ, yazılım, servisler, COM/USB, VPN varlığı, MEG izleri) çıkarıldı; credential toplama yasak. +- `bf-live-hw-check`: Windows silinmeden önce NIC/disk/CPU/RAM/serial/USB kontrolü, `SUPPORTED / WARNING / BLOCKED` sonucu, mutasyonsuz. + +### 2.7 Güvenlik ve dokümantasyon + +- Depo çapında secret taraması; ISO'ya cihaz kimliği/private key/parola gömülmediği builder tarafından **reddedilir**. +- `.gitignore`: ISO, offline repo çıktısı, build scratch ve tüm anahtar/kimlik desenleri repo dışında. +- Doküman seti 33 dosyaya çıktı; medya stratejisi, RDP modeli, durum modeli, GNOME/XFCE ölçümü ve Field OS sürüm takibi kararları tek sesli hale getirildi. + +--- + +## 3. Hangi yeni sistemler eklendi? + +| Sistem | Ne yapar | +|---|---| +| **Field OS ISO build** | Doğrulanmış base ISO'dan tek USB'lik bootable medya üretir; boot düzenini base ISO'dan okuyup yeniden kurar | +| **Assisted autoinstall** | Kurulum otomatik, **disk seçimi operatörde** (`interactive-sections: [storage]`); otomatik wipe yok | +| **Offline APT repo** | Yerel, sürüm pinli `.deb` havuzundan checksum'lı repo üretir | +| **Firstboot wizard** | Bayi numarasını konsoldan toplar, kimliği üretir, offline kurucuyu çağırır | +| **3 aşamalı durum makinesi** | `PROVISIONED_OFFLINE` / `ENROLLED` / `READY`, fail-closed kapılar | +| **Enrollment istemcisi** | Tek kullanımlık token, replay engeli, private key dışarı çıkmaz | +| **Field OS sürüm takibi** | `/etc/blueforce-release`, `bf-release`, filo çapında sürüm raporlama | +| **Windows öncesi keşif** | Salt-okunur envanter + geri dönüş için veri dışa aktarma | +| **Canlı donanım uygunluğu** | Kurulumdan önce SUPPORTED/WARNING/BLOCKED kararı | +| **Dalga kapılı filo otomasyonu** | 21 playbook, dalga + production override zorunluluğu | + +--- + +## 4. Neden eklendi? + +- **Saha interneti yokken kurulum yapılabilmeli** ama cihaz merkez kanıtı olmadan yanlışlıkla READY sayılmamalı. +- **Disk silme güvenliği:** bu ISO, üzerinde başka bir işletim sistemi bulunan gerçek saha PC'lerinde kullanılacak. Bu nedenle V1 bilinçli olarak *assisted*: teknisyen hedef diski onaylar. +- **İzlenebilirlik:** Field OS sürümü, base ISO hash'i, offline snapshot ve kurucu sürümü ayrı ayrı kayıt altında; rollback mümkün. +- **Tek medya kolaylığı:** autoinstall ile Field OS ISO rakip değil, tamamlayıcıdır — biri motor, diğeri paketleme. +- **700 cihazda serbest değişiklik yok:** dalga, onay ve rollback kapıları korunur. + +--- + +## 5. Hangi dosyalar değişti? + +| Alan | İçerik | +|---|---| +| **Provisioning** | `provisioning/{iso,autoinstall,offline-repo,firstboot,enrollment,release}/` | +| **Tanı ve durum** | `scripts/diagnostics/` — `bf-status`, `bf-check-local`, `bf-check-enrollment`, `bf-check-ready`, `bf-enroll`, `bf-enroll-now`, `bf-enrollment-status`, `bf-release`, `bf-remote-status`, `bf-live-hw-check`, `bf-support-bundle`, `bf-hardware-inventory.sh` | +| **Kurulum** | `scripts/install/` (18 modül), `scripts/install/optional/anydesk/` | +| **Geçiş** | `scripts/migration/windows/` + kökte `migration/` işaret dosyası | +| **Filo** | `ansible/{inventory,playbooks,roles}/` (21 playbook, 4 rol) | +| **Yapılandırma** | `config/` (ssh, wireguard, firewall, docker, systemd) | +| **İzleme / uzak erişim** | `monitoring/`, `rustdesk/` | +| **Testler** | `tests/` — 8 test scripti + `run-all.sh` + QEMU planı | +| **Doküman** | `docs/00`–`docs/32` (33 dosya), `README.md`, `SUMMARY.md` | +| **Site** | `docs-site/` (Docusaurus) | + +`dist/`, `.build-lab/`, `*.iso` ve anahtar/secret desenleri `.gitignore` ile repo dışında tutulur. + +--- + +## 6. Hangi testler geçti? + +`bash tests/run-all.sh` → **8/8 PASS, exit 0** (2026-09-16): + +| Test | Kapsam | +|---|---| +| `check-specs.sh` | 33 doküman gapless, §1–§13 sıralı, her dokümanda diyagram, 21 playbook sözleşmesi, secret/moving-tag yasağı | +| `check-configs.sh` | Bash sözdizimi, YAML/JSON parse, inventory dalga grupları | +| `check-provisioning-static.sh` | Autoinstall kimliksiz, otomatik disk silme yok, interaktif depolama kapısı, secret taraması | +| `check-offline-repo-static.sh` | Pin semantiği, placeholder yasağı | +| `check-migration-static.sh` | Windows araçları read-only, credential toplamaz | +| `check-ansible-static.sh` | Kapı deseni, report-only security check, moving tag/Watchtower yasağı | +| `test-firstboot-static.sh` | Bayi no doğrulaması, hatalı giriş reddi, idempotentlik | +| `test-field-os-lifecycle.sh` | Durum geçişleri, offline local gate, ENROLLED fail-closed, replay engeli | + +**ISO doğrulaması (bağımsız, iki araç):** + +| Kontrol | Sonuç | +|---|---| +| El Torito BIOS + UEFI | ikisi de korunmuş | +| Blueforce payload (6 yol) | tümü medyada | +| `interactive-sections: [storage]` | korunmuş | +| Kimlik/secret gömülü mü | **hayır** | +| `apt.fallback: offline-install` | tanımlı | +| GRUB autoinstall satırları | 2 kernel satırı | +| `casper/minimal.squashfs` (3.43 GB) bütünlüğü | **birebir aynı** (xorriso `cmp` + `7z` sha256: `b5ec27b9570e77abb62831a8b652b50eaf089d537e62046189a52231a4fa9bec`) | + +--- + +## 7. Hangi testler LAB gerektiriyor? + +`tests/qemu-field-os-test-plan.md` T1–T18 henüz **çalıştırılmadı**: + +- **Boot kabulü:** UEFI, Legacy BIOS ve **Secure Boot** altında gerçek boot. Remaster edilen medyanın boot zinciri yalnızca metadata düzeyinde doğrulandı. +- **Autoinstall:** Desktop flavour'da Subiquity'nin `/autoinstall.yaml`'ı gerçekten uyguladığı ve depolama ekranını interaktif bıraktığı. +- **Air-gapped kurulum:** gerçek offline `.deb` seti ile bağımlılık çözümü. +- **Firstboot:** gerçek konsolda wizard davranışı; systemd unit'inin boot'u kilitlememesi. +- **GNOME vs XFCE A/B ölçümü** (RAM/CPU/boot süresi/RDP/RustDesk headless/24h-72h stabilite). +- **xRDP + RustDesk headless:** fiziksel monitörsüz cihazda login ekranı ve dummy display davranışı. +- **Power-loss / otomatik kurtarma**, güç dönüşünde servis zinciri. +- **Enrollment:** gerçek merkez endpoint'i, token TTL/iptal, merkezi doğrulama kanıtları. +- **Windows geri dönüş provası:** image restore ve iş akışının geri gelmesi. + +--- + +## 8. Hangi kararlar açık? + +1. **Baseline sapması (LAB kararı gerekli):** kanonik baseline *Ubuntu Server 26.04.1+*; build host'ta doğrulanmış mevcut medya **Desktop** flavour olduğu için ISO bu tabanla üretildi. Sapma manifest'te `baseline_deviation` bloğuyla kayıtlı. Karar: LAB için Desktop kabul edilsin mi, yoksa Server ISO ile mi yeniden üretilsin? (Server yolu tek parametre uzakta.) +2. **Offline paket pinleri:** manifestler hangi paketlerin gerektiğini söylüyor, ancak **somut sürümler ve `.deb` dosyaları yok** — offline repo henüz üretilmedi. Ubuntu 26.04 build makinesi gerekir. +3. **Secure Boot:** remaster edilen medyanın Secure Boot davranışı test edilmedi. +4. **Enrollment kontrol düzlemi:** endpoint, kimlik doğrulama, imzalama, token TTL/iptal politikası ve audit saklama. +5. **Release artefakt saklama:** ISO/seed/offline snapshot retention, imza anahtarı sahibi, release kadansı, EOL. +6. **Windows imaj saklama:** süre, erişim yetkisi, imha ve geri dönüş RTO. +7. **MEG `.deb`:** paket gelmedi; acceptance checklist hazırlıklı bekliyor, hiçbir servis adı/config yolu varsayılmadı. +8. **ISO boyutu:** Desktop tabanı 6.04 GiB; Server tabanına göre (~2.9 GB) USB dağıtımını etkiler. + +--- + +## 9. İlk gerçek LAB PC'sinde sırayla ne yapacağız? + +1. Temsilci Windows PC'yi seç; bayi no ve seri no'yu iki bağımsız kayıtla doğrula. İş sahibi onayı ve kesinti penceresi al. +2. Windows üzerinde `BF-WindowsPreMigrationInventory.ps1` ve `BF-WindowsDataExport.ps1` çalıştır (salt-okunur). Hash doğrulamalı Windows geri dönüş imajı al; nerede tutulduğunu ve restore sahibini kaydet. +3. ISO SHA256'sını doğrula: `sha256sum -c dist/Blueforce-Field-OS-1.0.0-amd64.iso.sha256` → `cb0cc56f...`. +4. Medyayı USB'ye yaz ve **kurulumdan önce canlı oturumda** `bf-live-hw-check` çalıştır. `BLOCKED` çıkarsa dur. +5. Kurulumu başlat. Autoinstall çalışır ama **depolama ekranında hedef diski teknisyen onaylar** — otomatik wipe yok. +6. İlk açılışta wizard'da bayi numarasını gir (ör. `12010193` → `BF-12010193` / `bf-12010193`). `bf-status` ile **yalnız `PROVISIONED_OFFLINE`** görüldüğünü doğrula; cihazı READY olarak teslim etme. +7. Ağ olmadan dış indirme olmadığını ve local servis/boot loglarını kaydet. +8. Kontrollü ağ erişimi sağlandığında ve merkez kontrol düzlemi hazır olduğunda tek kullanımlık token ile enrollment yap (token'ı USB'ye/loga/rapora yazma). +9. `ENROLLED` sonrası WireGuard handshake, xRDP, RustDesk, MeshCentral, monitoring kanıtlarını ayrı ayrı doğrula. Tümü geçmeden READY yazma. +10. Gözlem pencereleri: **24 saat** boot/servis/ağ/uzak erişim · **72 saat** kesinti ve log/disk kararlılığı · **7 gün** saha iş akışı, güç dönüşü ve Windows restore provası. Kanıtlar release kaydına bağlanmadan pilot dalgaya geçme. + +--- + +## 10. Production'a geçmeden önce yapılacaklar + +- **Boot kabulü:** UEFI, Legacy BIOS ve Secure Boot matrisini gerçek donanımda kanıtla. +- **Gerçek offline paket seti:** Ubuntu 26.04 build makinesinde pinli `.deb` havuzunu üret, checksum/lock kaydı al, air-gapped kurulumda dene, ISO'ya gömüp yeniden build et. +- **Baseline kararı:** Desktop tabanını kabul et veya Server ISO ile yeniden üret (manifest `baseline_deviation` kaydı buna göre güncellenir). +- **Enrollment kontrol düzlemi:** endpoint + kimlik doğrulama + imzalama + token TTL/iptal + audit retention. +- **Merkez izleme/uzak erişim kanallarını** gerçek VDS üzerinde doğrula (RustDesk self-hosted hbbs/hbbr, Prometheus/Grafana/Uptime Kuma). +- **Release yönetimi:** artefakt deposu, imza anahtarı, retention/EOL, rollback prosedürü. +- **Windows veri/imaj saklama** ve geri dönüş RTO'sunu resmileştir. +- **Pilot hazırlığı:** envanter, alarm/on-call, eğitim, change approval ve dalga kapıları. Sıra: LAB(2) → P1(5) → P2(20) → W1(50) → W2(100) → production; her adım öncekinin kanıtı olmadan ilerlemez. +- **Zayıflatılmayacak kurallar:** onaysız update yasağı (apt, release upgrade, Docker image, MEG, Field OS), dalga onay kapıları, disk silme güvenliği, secret yasağı. + +--- + +## 11. Build ortamı notu + +ISO build'i bu makinede (CachyOS/Arch) **konteyner içinde** çalıştırıldı (`xorriso 1.5.6`), host'a paket kurulmadı. `apt-ftparchive`/`dpkg-deb` bu host'ta bulunmadığı için **offline `.deb` repo üretimi Ubuntu 26.04 build makinesi gerektirir** (§10). + +--- + +## 12. Delil özeti (git diff ve repo ağacı) + +- Commit edilmemiş çalışma ağacı: değiştirilmiş dokümanlar + yeni provisioning/ansible/config/monitoring/scripts/tests dosyaları. +- Üretilen artefakt: `dist/Blueforce-Field-OS-1.0.0-amd64.iso` (+ `.sha256`, `1.0.0-manifest.yaml`). +- Test sonucu: 8/8 PASS, exit 0. +- Repo ağacının tam çıktısı commit sonrası `git status` / `git diff --stat` ile alınır. + + + +# Product + + + +## Platform + +web + +Two surfaces share this record. The **central panel** is a web surface (browser, server-rendered). The **device console** is a native desktop surface: a Python/tkinter application that ships on each field PC and runs with no network. Visual work on the device console follows the native-platform guidance for its own platform; this value names the surface under design here. + +## Stack + +Python standard library only (`http.server` + server-rendered templates). No framework and no third-party dependency: the fleet installs offline from a committed package pool, and `fastapi`/`uvicorn`/`flask` are not in that pool. Adding one would mean the panel cannot be installed on the devices it manages. Confirmed with the user over FastAPI for this reason. + +## Users + +**Field technician** — a dealer/authorised service person who receives a Windows 10 PC and must turn it into a Blueforce Field OS device. Works at the device, often in a workshop or a customer site, with limited time and no developer background. Job: run the install, know whether it succeeded, and recover when it did not. + +**Central operator** — the person responsible for the whole fleet (~700 devices) from an office browser. Job: see which devices are installed or not, which rollout wave each is in, and push an approved update. Handles many devices per session and needs status, not detail. + +Both operate the same fleet from opposite ends: the technician from the device, the operator from the browser. + +## Product Purpose + +Convert a fleet of Windows 10 field PCs into machines running Blueforce Field OS, and keep them correct afterwards. Success means a technician finishes an install without internet access, without guessing, and without a silent partial state — and an operator can say at any moment which devices are ready and which are not. + +## Positioning + +The install is provably offline and fail-closed. The device carries its own signed package pool, the installer refuses to continue when the contract does not hold rather than half-installing, and every destructive step demands explicit approval with a root gate. Neither property can be copied by a neighbouring tool that assumes internet access or treats a failed check as a warning. + +## Operating Context + +- Fleet: ~700 Windows 10 field PCs, converted in waves LAB(2) → P1(5) → P2(20) → W1(50) → W2(100) → PROD, production behind a separate typed override. +- Install target: Ubuntu 26.04.1 LTS ("Resolute Raccoon"), GNOME desktop installed but not the boot default — the device boots to a terminal and the desktop is switched on when required. +- Network: the field estate is reached over WireGuard; four remote channels are supported (SSH-over-WG, xRDP, RustDesk OSS, MeshCentral). No commercial remote-desktop licence (AnyDesk was rejected). +- Fleet tooling: Ansible CLI + Semaphore Community for orchestration, Prometheus + Node Exporter + Grafana OSS + Uptime Kuma for monitoring, Docusaurus for documentation. +- Device state machine: `PROVISIONED_OFFLINE → ENROLLED → READY`, with no skipping and no going back; `READY` is refused unless every channel reports `verified`. +- Documentation set: 33 numbered Turkish documents plus README/SUMMARY, served through Docusaurus. + +## Capabilities and Constraints + +**Confirmed functionality** — the device console exposes 48 operations: 13 write (all requiring root) and 35 read-only. The installer is `scripts/install/blueforce-install.sh`, driven by an offline bundle at `provisioning/offline-repo/built/` (index + `pool/` of 1321 `.deb` files, ~887 MB). Evidence of fleet state is an inventory and a enrolment token per device. + +**Hard constraints** — no internet during install or normal operation; every user-visible string is Turkish (code, comments and commit messages stay English); destructive operations need an explicit typed confirmation and a root gate; a check that fails stops the operation, it never degrades to a warning. + +**Deliberately undecided** — where the central panel is hosted and how it authenticates to the fleet. Not invented here: the panel is being designed before its deployment model is fixed. + +## Brand Commitments + +Name: **Blueforce Field OS**. Existing operator documentation and console copy are Turkish and already carry the product voice — plain, factual, no marketing register. No logo or palette is binding; no visual identity exists yet. + +## Evidence on Hand + +- `docs/` — 33 numbered Turkish documents, including `01-ARCHITECTURE`, `24-DECISION-LOG` (K-01…K-14), `27-OFFLINE-PROVISIONING`, `33-OPERATOR-CONSOLE`. +- `bfos/` — the device console (`operations.py` catalogue of 48 operations, `runner.py`, `tui.py`, `ui_gui.py`). +- `provisioning/offline-repo/` — the committed package pool and its manifests. +- No analytics, no customer logos, no testimonials, no benchmark numbers, and no screenshots of a working web panel exist. Nothing of the sort may be fabricated. + +## Product Principles + +1. **Fail closed, never half-install.** A device that cannot be verified stays unfinished and says so; a degraded success is worse than a clear refusal. +2. **Offline is a design property, not a deployment accident.** Anything the fleet needs travels with the fleet. +3. **Destructive work is explicit.** Approval and root are gates, not warnings. +4. **State is legible at a glance.** Which wave, which stage, which channel — readable in seconds, from a device screen or across 700 devices. +5. **Turkish for operators, English for the codebase.** No mixed-language surface. + +## Accessibility & Inclusion + +Field devices are operated in workshops and customer sites, sometimes on small or poorly lit screens; the console is used with a keyboard more often than a mouse. Readable contrast and non-colour-only status signalling are requirements, not enhancements. No formal standard (WCAG level) was agreed; none is claimed. + + + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "bfos" +version = "1.0.0" +description = "Blueforce Field OS operator console (Turkish, standard library only)" +readme = "admin/README.md" +requires-python = ">=3.8" +license = { text = "Proprietary" } +authors = [{ name = "Blueforce" }] +# Zero external dependencies on purpose: field devices are installed offline +# from a verified local package bundle (docs/27), and the console must run with +# nothing but the Python standard library. +dependencies = [] +classifiers = [ + "Environment :: Console", + "Intended Audience :: System Administrators", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", +] + +[project.urls] +Documentation = "https://github.com/emirhanmamak-blueforce/Blueforce-Linux" + +[project.scripts] +bfos = "bfos.cli:main" + +[tool.setuptools] +packages = ["bfos"] + + + +#!/usr/bin/env bash +# +# bf-bootstrap.sh — one-command install of the Blueforce Linux admin toolbox. +# +# Documented entry points: +# curl -fsSL https://raw.githubusercontent.com/emirhanmamak-blueforce/Blueforce-Linux/main/admin/bf-bootstrap.sh | sudo bash +# sudo admin/bf-bootstrap.sh # from a checkout +# +# Steps, in order: +# 1. root check (apply mode only; --check is read-only and needs no root), +# 2. Ubuntu release check against the supported baseline (24.04 / 26.04), +# 3. dependency install: git, curl, ansible-core, +# 4. clone the repository into (default /opt/blueforce-linux) or +# fast-forward an existing checkout (never resets, never discards work), +# 5. link admin/bf-*, scripts/diagnostics/bf-* and scripts/maintenance/bf-* +# into /usr/local/bin (idempotent; a re-run refreshes the links), +# 6. make admin/bf-menu executable so `sudo bf-menu` starts the on-device +# installer menu, +# 7. print a clear summary. +# +# Safety +# * This script writes no secret and installs code only: credentials stay on +# the device and are never fetched by the installer (see admin/bf-creds). +# * Re-running it is safe: the checkout is fast-forwarded and the tool links +# are re-created. Nothing is deleted and no `git reset` is ever performed, +# so local work in the checkout is never discarded. +# * --check reports the same plan without touching the system. +# +set -euo pipefail + +REPO_URL="${BF_REPO_URL:-https://github.com/emirhanmamak-blueforce/Blueforce-Linux.git}" +BRANCH_DEFAULT="main" +INSTALL_DIR_DEFAULT="/opt/blueforce-linux" +BIN_DIR="${BF_BIN_DIR:-/usr/local/bin}" +SUPPORTED_UBUNTU=("24.04" "26.04") +# Command name / apt package name pairs for the installer prerequisites. +DEPENDENCY_COMMANDS=(git curl ansible-playbook) +DEPENDENCY_PACKAGES=(git curl ansible-core) + +CHECK_MODE=0 +ASSUME_YES=0 +BRANCH="$BRANCH_DEFAULT" +DIR="" +LINKED=0 +MENU_READY=0 + +usage() { + cat <<'EOF' +Usage: sudo bf-bootstrap.sh [--check] [--dir DIR] [--branch BRANCH] [--yes] [--help] + +Install (or refresh) the Blueforce Linux admin toolbox from git: fetch the +repository, install the prerequisites, link the bf-* tools into +/usr/local/bin, and make `sudo bf-menu` available for the on-device setup. + +Options: + --check Read-only: report what would happen. It never mutates + anything and never requires root. + --dir DIR Checkout directory. Default: the checkout this script lives + in, otherwise /opt/blueforce-linux. + --branch BRANCH Branch to track (default: main). + --yes, -y Do not ask for confirmation. + --help, -h Show this help and exit. + +Environment: + BF_REPO_URL Repository URL (default: the upstream GitHub repository). + BF_INSTALL_DIR Checkout directory; same as --dir. + BF_BIN_DIR Tool link directory (default: /usr/local/bin). + +Notes: + * Installer prerequisites are git, curl and ansible-core (ansible-playbook). + * Supported baseline is Ubuntu 24.04 / 26.04; any other release only warns. + * This script installs code only. It never writes, fetches, or prints a + secret; device credentials are handled by admin/bf-creds. +EOF +} + +say() { printf 'bf-bootstrap: %s\n' "$*"; } +warn() { printf 'bf-bootstrap: WARN: %s\n' "$*" >&2; } +die() { printf 'bf-bootstrap: ERROR: %s\n' "$*" >&2; exit 1; } + +# Git-LFS smudge is disabled for every git operation this script performs. +# +# Why: the offline package pool is ~884 MB of .deb payload tracked through Git +# LFS, and a default clone materialises all of it (measured: 2.7 GB working tree +# against 20 MB with smudge off, a 135x difference). A device that only needs to +# reach the console and the manifest pays that cost on every clone for bytes it +# may never install from. +# +# The trade is explicit: with smudge off the pool files on disk are 131-byte +# pointer texts, and the installer refuses such a bundle rather than installing +# from it ("Nokta dosyası" below). Fetching the payload is therefore a separate, +# deliberate step -- `git lfs pull --include='provisioning/offline-repo/built/pool/*'` +# -- so that "I cloned the repository" and "I have the packages" stay two facts. +# +# This is deliberately the smudge-off half only. Enabling a full `git lfs pull` +# here would reintroduce the 884 MB download this prevents. +export GIT_LFS_SKIP_SMUDGE=1 + +run() { + if [[ "$CHECK_MODE" -eq 1 ]]; then + printf 'bf-bootstrap: check: would run: %s\n' "$*" + return 0 + fi + "$@" +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --check) CHECK_MODE=1; shift ;; + --dir) DIR="${2:?missing value for --dir}"; shift 2 ;; + --branch) BRANCH="${2:?missing value for --branch}"; shift 2 ;; + --yes|-y) ASSUME_YES=1; shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'bf-bootstrap: ERROR: unknown argument: %s\n\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +# --------------------------------------------------------------------------- # +# Where does this script live? When it runs from a checkout, that checkout is +# the default target; the piped one-command form has no checkout, so the +# default install directory is used. +# --------------------------------------------------------------------------- # +SCRIPT_SOURCE="${BASH_SOURCE[0]:-}" +if [[ -n "$SCRIPT_SOURCE" && -r "$SCRIPT_SOURCE" ]]; then + SCRIPT_REAL="$(readlink -f "$SCRIPT_SOURCE" 2>/dev/null || printf '%s' "$SCRIPT_SOURCE")" + CANDIDATE="$(cd "$(dirname "$SCRIPT_REAL")/.." 2>/dev/null && pwd || true)" + if [[ -n "$CANDIDATE" && -f "$CANDIDATE/admin/bf-bootstrap.sh" && -d "$CANDIDATE/scripts/diagnostics" ]]; then + CHECKOUT_ROOT="$CANDIDATE" + fi +fi +if [[ -z "$DIR" ]]; then + DIR="${BF_INSTALL_DIR:-${CHECKOUT_ROOT:-$INSTALL_DIR_DEFAULT}}" +fi + +if [[ -z "$BRANCH" ]]; then + die 'branch must not be empty' +fi + +# --------------------------------------------------------------------------- # +# 1. Root check. --check only reports, so it works as an unprivileged user. +# --------------------------------------------------------------------------- # +if [[ "$CHECK_MODE" -eq 1 ]]; then + if [[ "$(id -u)" -ne 0 ]]; then + say 'check: not running as root; apply mode will require sudo' + fi +else + if [[ "$(id -u)" -ne 0 ]]; then + die "must run as root: sudo $0 (or: sudo bf-bootstrap.sh)" + fi +fi + +# --------------------------------------------------------------------------- # +# 2. Ubuntu release check. A different release is only a warning: the goal is +# to install the toolbox, not to block a working host. +# --------------------------------------------------------------------------- # +DISTRO_ID="" +DISTRO_VERSION="" +DISTRO_PRETTY="unknown" +if [[ -r /etc/os-release ]]; then + # shellcheck disable=SC1091 + . /etc/os-release + DISTRO_ID="${ID:-}" + DISTRO_VERSION="${VERSION_ID:-}" + DISTRO_PRETTY="${PRETTY_NAME:-unknown}" +fi +if [[ "$DISTRO_ID" == "ubuntu" ]]; then + SUPPORTED=0 + for release in "${SUPPORTED_UBUNTU[@]}"; do + if [[ "$DISTRO_VERSION" == "$release" ]]; then + SUPPORTED=1 + fi + done + if [[ "$SUPPORTED" -eq 1 ]]; then + say "ubuntu ${DISTRO_VERSION} is a supported baseline" + else + warn "Ubuntu ${DISTRO_VERSION:-unknown} is outside the tested baseline (${SUPPORTED_UBUNTU[*]}); continuing" + fi +else + warn "this is not an Ubuntu host (ID=${DISTRO_ID:-unknown}, ${DISTRO_PRETTY}); the Field OS baseline is Ubuntu ${SUPPORTED_UBUNTU[*]}" +fi + +# --------------------------------------------------------------------------- # +# Operator confirmation. Only a terminal prompts: the documented one-command +# form (`curl ... | sudo bash`) has no terminal on stdin and never blocks. +# --------------------------------------------------------------------------- # +if [[ "$CHECK_MODE" -eq 0 && "$ASSUME_YES" -eq 0 && -t 0 ]]; then + printf 'Install or update the Blueforce toolbox in %s? [y/N] ' "$DIR" + ANSWER="" + read -r ANSWER || ANSWER="" + if [[ ! "$ANSWER" =~ ^[Yy]([Ee][Ss])?$ ]]; then + say 'aborted by the operator' + exit 2 + fi +fi + +# --------------------------------------------------------------------------- # +# 3. Dependencies. +# --------------------------------------------------------------------------- # +MISSING_COMMANDS=() +MISSING_PACKAGES=() +say 'dependency check' +for index in "${!DEPENDENCY_COMMANDS[@]}"; do + if ! command -v "${DEPENDENCY_COMMANDS[$index]}" >/dev/null 2>&1; then + MISSING_COMMANDS+=("${DEPENDENCY_COMMANDS[$index]}") + MISSING_PACKAGES+=("${DEPENDENCY_PACKAGES[$index]}") + fi +done +if [[ ${#MISSING_PACKAGES[@]} -eq 0 ]]; then + say "dependencies present: ${DEPENDENCY_COMMANDS[*]}" +elif [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would install with apt-get: ${MISSING_PACKAGES[*]} (missing: ${MISSING_COMMANDS[*]})" +else + if ! command -v apt-get >/dev/null 2>&1; then + die "apt-get not found; install these packages first: ${MISSING_PACKAGES[*]}" + fi + say "installing dependencies: ${MISSING_PACKAGES[*]}" + export DEBIAN_FRONTEND=noninteractive + run apt-get update + run apt-get install -y --no-install-recommends "${MISSING_PACKAGES[@]}" +fi + +# --------------------------------------------------------------------------- # +# 4. Repository: clone once, then fast-forward only. +# --------------------------------------------------------------------------- # +update_checkout() { + local remote="" origin_url="" dirty="" + if ! git -C "$DIR" rev-parse --verify --quiet HEAD >/dev/null 2>&1; then + warn "checkout has no commits yet: $DIR; skipping the update" + return 0 + fi + # Prefer `origin`, otherwise accept the checkout's single remote (a local + # clone of this project may name it `github`, as the upstream checkout does). + if git -C "$DIR" remote get-url origin >/dev/null 2>&1; then + remote="origin" + else + remote="$(git -C "$DIR" remote 2>/dev/null | head -n 1 || true)" + fi + if [[ -z "$remote" ]]; then + warn "checkout has no git remote: $DIR; skipping the update" + return 0 + fi + origin_url="$(git -C "$DIR" remote get-url "$remote" 2>/dev/null || true)" + if [[ "$origin_url" != *"Blueforce-Linux"* ]]; then + warn "remote '$remote' looks unexpected: $origin_url" + fi + dirty="$(git -C "$DIR" status --porcelain 2>/dev/null || true)" + if [[ -n "$dirty" ]]; then + warn "local changes present in $DIR; skipping the update (nothing was reset or stashed)" + return 0 + fi + if [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would fast-forward $DIR to $remote/$BRANCH" + return 0 + fi + say "updating $DIR (fast-forward only, remote $remote)" + if ! git -C "$DIR" fetch --prune --quiet "$remote" "$BRANCH"; then + warn "fetch failed (offline?); keeping the current checkout" + return 0 + fi + if ! git -C "$DIR" merge --ff-only --quiet "$remote/$BRANCH"; then + warn "cannot fast-forward to $remote/$BRANCH; keeping the current checkout (no reset performed)" + fi + return 0 +} + +if [[ -e "$DIR" && ! -d "$DIR" ]]; then + die "install directory exists and is not a directory: $DIR" +fi +if [[ -d "$DIR" ]]; then + if [[ -d "$DIR/.git" ]]; then + say "existing checkout: $DIR" + update_checkout + else + die "directory exists but is not a git checkout; refusing to touch it: $DIR" + fi +elif [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would clone $REPO_URL (branch $BRANCH) into $DIR" +else + say "cloning $REPO_URL (branch $BRANCH) into $DIR" + run install -d -m 0755 "$(dirname "$DIR")" + run git clone --branch "$BRANCH" --single-branch -- "$REPO_URL" "$DIR" +fi + +# --------------------------------------------------------------------------- # +# 5. Link the tools into /usr/local/bin. Idempotent: `ln -sfn` refreshes an +# existing link, and a re-run after `git pull` needs no extra step. +# --------------------------------------------------------------------------- # +link_tools() { + local source="" base="" + for source in "$DIR"/admin/bf-* "$DIR"/scripts/diagnostics/bf-* "$DIR"/scripts/maintenance/bf-*; do + if [[ ! -f "$source" ]]; then + continue + fi + base="$(basename "$source")" + if [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would link $source -> $BIN_DIR/$base" + else + chmod 0755 "$source" + ln -sfn "$source" "$BIN_DIR/$base" + fi + LINKED=$((LINKED + 1)) + done +} + +if [[ -d "$DIR" ]]; then + run install -d -m 0755 "$BIN_DIR" + link_tools + if [[ "$LINKED" -eq 0 ]]; then + warn "no bf-* tools found under $DIR (admin/, scripts/diagnostics/, scripts/maintenance/)" + elif [[ "$CHECK_MODE" -eq 0 ]]; then + say "linked $LINKED tools into $BIN_DIR" + fi +elif [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would link the bf-* tools from $DIR into $BIN_DIR" +fi + +# --------------------------------------------------------------------------- # +# 6. Operator console entry point. +# +# The Python console (`admin/bf` -> bfos) is the primary path; the bash +# `bf-menu` stays linked as a fallback so a host without python3 can still be +# operated. +# --------------------------------------------------------------------------- # +PY_CONSOLE="$DIR/admin/bf" +MENU_SOURCE="$DIR/admin/bf-menu" +MENU_READY=0 + +if [[ -f "$PY_CONSOLE" ]]; then + if [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would make $PY_CONSOLE executable and link $BIN_DIR/bf" + else + chmod 0755 "$PY_CONSOLE" + ln -sfn "$PY_CONSOLE" "$BIN_DIR/bf" + say "bf ready: $BIN_DIR/bf (Python console)" + fi + MENU_READY=1 +else + warn "admin/bf is not present in $DIR; the Python console arrives with the next revision of the checkout" +fi + +if [[ -f "$MENU_SOURCE" ]]; then + if [[ "$CHECK_MODE" -eq 1 ]]; then + say "check: would make $MENU_SOURCE executable and link $BIN_DIR/bf-menu" + else + chmod 0755 "$MENU_SOURCE" + ln -sfn "$MENU_SOURCE" "$BIN_DIR/bf-menu" + say "bf-menu ready: $BIN_DIR/bf-menu (bash fallback)" + fi + MENU_READY=1 +else + warn "admin/bf-menu is not present in $DIR; the bash fallback will work once it is in the checkout" +fi + +if [[ "$MENU_READY" -eq 0 ]]; then + warn "no operator console was found in $DIR; link one of admin/bf or admin/bf-menu manually" +fi + +# --------------------------------------------------------------------------- # +# 7. Summary. +# --------------------------------------------------------------------------- # +if [[ "$CHECK_MODE" -eq 1 ]]; then + printf '\nbf-bootstrap: check complete -- no changes were made.\n' + printf ' checkout : %s\n' "$DIR" + printf ' branch : %s\n' "$BRANCH" + printf ' tools : %s tool(s) would be linked into %s\n' "$LINKED" "$BIN_DIR" + printf ' next : sudo bf-bootstrap.sh --yes\n' + exit 0 +fi + +REVISION="" +if [[ -d "$DIR/.git" ]]; then + REVISION="$(git -C "$DIR" rev-parse --short HEAD 2>/dev/null || true)" +fi +printf '\nbf-bootstrap: summary\n' +printf ' repository : %s\n' "$DIR" +printf ' branch : %s\n' "$BRANCH" +if [[ -n "$REVISION" ]]; then + printf ' revision : %s\n' "$REVISION" +fi +printf ' tools : %s linked into %s\n' "$LINKED" "$BIN_DIR" +if [[ -x "$BIN_DIR/bf" ]]; then + printf ' console : %s (Python, primary)\n' "$BIN_DIR/bf" +else + printf ' console : pending (admin/bf is not in the checkout yet)\n' +fi +if [[ -x "$BIN_DIR/bf-menu" ]]; then + printf ' fallback : %s (bash)\n' "$BIN_DIR/bf-menu" +else + printf ' fallback : pending (admin/bf-menu is not in the checkout yet)\n' +fi +# The Python console is the recommended entry point; the bash menu stays as the +# fallback for a host without python3. +if [[ -x "$BIN_DIR/bf" ]]; then + printf ' next : sudo bf\n' +else + printf ' next : sudo bf-menu\n' +fi +printf '\nInstallation complete. To get started: sudo bf\n' +printf 'Kurulum tamam. Başlamak için: sudo bf\n' + + + +"""Command line interface and operator flows for the bfos console. + +Responsibilities: + + * argument parsing (``--full``, ``--dry-run``, ``--check``, ``--repo``, + ``--inventory``, ``--log-file``, ``--version``, ``--lang``, ``--list``, + ``--list-targets``, ``--no-color``), + * repository discovery and the startup checks (inventory, Ansible, audit log), + * the two presentations: the simple default view and ``--full`` detailed mode, + * every operator flow: local install, fleet operations with their gates, the + central preparation screens, the tools and the read-only information. + +Everything that decides *what may run* lives in :mod:`bfos.operations`, and +everything that *runs* lives in :mod:`bfos.runner`; this module only wires the +two together and talks to the operator. +""" + +from __future__ import annotations + +import argparse +import os +import sys +from typing import Dict, List, Optional, Sequence, Tuple + +from . import config, operations, runner, tui +from .operations import ( + GateStep, + GatesGranted, + Inventory, + Operation, + Refused, + Repository, + Target, +) + + +class Quit(Exception): + """The operator asked to leave the console.""" + + +# --------------------------------------------------------------------------- +# Argument parsing +# --------------------------------------------------------------------------- +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog=config.PROGRAM_NAME, + description="{0} — {1}".format(config.PROGRAM_DESCRIPTION, config.VERSION), + formatter_class=argparse.RawDescriptionHelpFormatter, + add_help=False, + epilog=( + "Örnekler:\n" + " sudo bfos basit mod: 1) Kur 2) Durum 3) Çıkış\n" + " sudo bfos --full detaylı mod: 21 playbook, merkez hazırlığı, araçlar\n" + " bfos --dry-run --full komutları yalnız göster, hiçbir şey çalıştırma\n" + " bfos --list işlem kataloğu (etkileşimsiz)\n" + " bfos --list-targets envanterdeki dalgalar, gruplar ve cihazlar\n" + "\n" + "Güvenlik: her komut önce ekranda gösterilir ve onay ister; production dalgası\n" + "ayrı onay (+ production_override=true), sürüm kapılı işlemler yazılı dalga onayı,\n" + "yıkıcı işlemler ikinci onay ister. Denetim kaydı: {log} (mod 600).\n" + ).format(log=config.DEFAULT_LOG_FILE), + ) + parser.add_argument("-h", "--help", action="help", help="bu yardımı göster ve çık") + parser.add_argument("-V", "--version", action="store_true", help="sürümü göster ve çık") + parser.add_argument("--gui", action="store_true", + help="grafik arayüzü aç (varsayılan davranış)") + parser.add_argument("--tui", action="store_true", + help="terminal konsolunu aç (grafik arayüz açılamıyorsa yedek)") + parser.add_argument("--full", action="store_true", + help="detaylı mod: tüm kategoriler ve 21 playbook görünür") + parser.add_argument("--dry-run", action="store_true", + help="komutları yaz, hiçbir şey çalıştırma") + parser.add_argument("--check", action="store_true", + help="komutları --check ile üret (salt okunur; değişiklik uygulanmaz)") + parser.add_argument("--repo", metavar="YOL", default="", + help="Blueforce deposu (varsayılan: konsolun bulunduğu depo)") + parser.add_argument("--inventory", metavar="YOL", default="", + help="Ansible envanteri (varsayılan: /ansible/inventory/hosts.yml)") + parser.add_argument("--log-file", metavar="YOL", default=config.DEFAULT_LOG_FILE, + help="denetim kaydı (varsayılan: {0}, mod 600)".format(config.DEFAULT_LOG_FILE)) + parser.add_argument("--lang", metavar="DİL", default=config.DEFAULT_LANG, + help="arayüz dili (yalnız: {0})".format(", ".join(config.SUPPORTED_LANGS))) + parser.add_argument("--no-color", action="store_true", help="ANSI renklerini kapat (NO_COLOR da geçerli)") + parser.add_argument("--list", action="store_true", + help="işlem kataloğunu yaz ve çık (etkileşimsiz)") + parser.add_argument("--list-targets", action="store_true", + help="envanter hedeflerini yaz ve çık (etkileşimsiz)") + return parser + + +def resolve_repo(explicit: str = "") -> Repository: + """Locate the Blueforce checkout. + + An explicit ``--repo`` (or ``BF_REPO``) is a commitment, not a hint: when it + does not look like the repository the console refuses to run instead of + silently falling back to another checkout. + """ + for candidate in (explicit, os.environ.get("BF_REPO", "")): + if not candidate: + continue + repo = Repository(candidate) + if repo.looks_valid(): + return repo + raise Refused(config.MSG_REPO_INVALID.format(path=candidate)) + package_parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + for candidate in (package_parent, os.getcwd()): + repo = Repository(candidate) + if repo.looks_valid(): + return repo + raise Refused(config.MSG_REPO_INVALID.format(path=package_parent)) + + +# --------------------------------------------------------------------------- +# Application +# --------------------------------------------------------------------------- +class App: + """The operator flows. All I/O goes through :class:`bfos.tui.Console`.""" + + def __init__( + self, + repo: Repository, + console: tui.Console, + runner_: runner.Runner, + inventory: Inventory, + full_mode: bool = False, + check_mode: bool = False, + inventory_error: str = "", + inventory_arg: str = "", + ) -> None: + self.repo = repo + self.console = console + self.runner = runner_ + self.inventory = inventory + self.full_mode = full_mode + self.check_mode = check_mode + self.inventory_error = inventory_error + self.inventory_arg = inventory_arg + + # -- infrastructure ---------------------------------------------------- + def require_inventory(self) -> bool: + """Fleet operations need a readable inventory: explain, never guess.""" + try: + path = self.repo.find_inventory(self.inventory_arg) + except Refused as exc: + self.console.exception(exc) + return False + if path != self.inventory.path: + self.inventory = Inventory.load(path) + return True + + def require_ansible(self) -> bool: + if self.runner.have_ansible(): + return True + self.console.error(config.MSG_ANSIBLE_MISSING) + return False + + def require_root(self) -> bool: + if self.runner.is_root(): + return True + self.console.error(config.MSG_ROOT_REQUIRED) + return False + + def ask_menu(self, screen: tui.Screen) -> Optional[str]: + """Render a screen until a valid key is chosen. + + Returns the chosen key, or ``None`` when the operator goes back. + Raises :class:`Quit` when the operator quits. + """ + while True: + self.console.screen(screen) + outcome, payload = self.console.ask_menu_choice(screen) + if outcome == tui.CHOICE_QUIT: + raise Quit() + if outcome == tui.CHOICE_BACK: + return None + if outcome == tui.CHOICE_ITEM: + return payload + + def pause(self) -> None: + self.console.pause() + + # -- entry point ------------------------------------------------------- + def run(self) -> int: + try: + if self.full_mode: + self.console.note(config.MSG_FULL_MODE_HINT) + self.detailed_loop() + else: + self.simple_loop() + except Quit: + self.console.note(config.MSG_QUIT) + return config.EXIT_OK + + # ------------------------------------------------------------------ + # Simple mode + # ------------------------------------------------------------------ + def simple_loop(self) -> None: + while True: + key = self.ask_menu(tui.simple_menu()) + if key is None: + self.console.note(config.MSG_AT_TOP) + continue + if key == "1": + self.simple_install() + elif key == "2": + self.simple_status() + elif key == "3": + raise Quit() + elif key == "d": + self.full_mode = True + self.console.note(config.MSG_FULL_MODE_HINT) + self.detailed_loop() + else: # pragma: no cover - ask_menu only returns known keys + self.console.warn(config.MSG_UNKNOWN_CHOICE.format(choice=key)) + + def simple_install(self) -> None: + """Guided local install: dealer number, then the installer.""" + self.console.section("Kurulum — bu cihaz") + self.console.note("Bu cihaz Field OS standardına getirilir. Yalnız bu cihaz; filo cihazlarına dokunulmaz.") + dealer = self.ask_dealer() + if dealer is None: + return + try: + installer = self.repo.installer_path() + except Refused as exc: + self.console.exception(exc) + self.pause() + return + offline = self.console.confirm("Çevrimdışı kurulum (yerel paket deposu) kullanılsın mı?") + if offline is None: + raise Quit() + if not self.require_root(): + self.pause() + return + argv = operations.build_install_command( + installer, dealer, offline=offline, check_mode=self.check_mode + ) + label = "kurulum: {0}".format(operations.dealer_to_device_id(dealer)) + self.console.info("Hedef cihaz: {0} ({1})".format( + operations.dealer_to_device_id(dealer), operations.dealer_to_host(dealer))) + self.runner.confirm_and_run(argv, label=label, destructive=True) + self.pause() + + def simple_status(self) -> None: + """Read-only status: identity, provisioning state, health tool.""" + self.console.section("Durum — bu cihaz") + self.console.show_lines(operations.identity_lines()) + self.console.write("") + self.console.show_lines(operations.state_lines()) + self.console.write("") + result = self.run_tool("bf-status", title="bf-status (salt okunur)") + if result is None: + self.console.note("bf-status kurulu değil; yukarıdaki özet gösterildi.") + self.console.note("Bu ekran hiçbir şeyi değiştirmez.") + self.pause() + + def detailed_loop(self) -> None: + while True: + key = self.ask_menu(tui.detailed_menu()) + if key is None: + self.console.note(config.MSG_AT_TOP) + continue + if key == "1": + self.category_install() + elif key == "2": + self.category_devices() + elif key == "3": + self.category_central() + elif key == "4": + self.category_tools() + elif key == "5": + self.category_info() + elif key == "s": + self.full_mode = False + self.console.note(config.MSG_SIMPLE_MODE_HINT) + self.simple_loop() + return + + # ------------------------------------------------------------------ + # Shared input helpers + # ------------------------------------------------------------------ + def ask_dealer(self) -> Optional[str]: + """Ask for a dealer number until it matches ^[0-9]{8}$ (or back/quit).""" + while True: + value = self.console.read(config.MSG_PROMPT_DEALER) + if value is None: + return None + value = value.strip() + if value == "" or value == "0": + return None + if operations.dealer_is_valid(value): + return value + self.console.warn(config.MSG_TARGET_DEALER_INVALID.format(value=value)) + + def ask_extra_vars(self, operation: Operation) -> Optional[List[Tuple[str, str]]]: + """Collect and validate the extra -e variables for one operation.""" + prompt = operation.prompt + if prompt == operations.PROMPT_NONE: + return [] + answers: Dict[str, str] = {} + if prompt == operations.PROMPT_PACKAGES: + self.console.note(config.MSG_PKG_HINT) + value = self.console.read(config.MSG_PROMPT_PACKAGES) + answers["packages"] = "" if value is None else value + elif prompt == operations.PROMPT_SERVICE: + self.console.note(config.MSG_SERVICE_HINT.format(allowlist=" ".join(config.SERVICE_ALLOWLIST))) + value = self.console.read(config.MSG_PROMPT_SERVICE) + answers["service"] = "" if value is None else value + elif prompt == operations.PROMPT_SCRIPT: + self.console.note("İzinli dizinler: {0}".format(" ".join(config.SCRIPT_DIRS))) + path = self.console.read(config.MSG_PROMPT_SCRIPT) + answers["script"] = "" if path is None else path + args = self.console.read(config.MSG_PROMPT_SCRIPT_ARGS) + answers["script_args"] = "" if args is None else args + elif prompt == operations.PROMPT_GRACE: + value = self.console.ask_with_default( + config.MSG_PROMPT_GRACE.format(default=config.DEFAULT_REBOOT_GRACE), + str(config.DEFAULT_REBOOT_GRACE), + ) + answers["grace"] = "" if value is None else value + elif prompt == operations.PROMPT_DISK_PCT: + value = self.console.read(config.MSG_PROMPT_DISK) + answers["disk_pct"] = "" if value is None else value + elif prompt == operations.PROMPT_LOG_LINES: + value = self.console.ask_with_default( + config.MSG_PROMPT_LOG_LINES.format(default=config.DEFAULT_LOG_LINES), + str(config.DEFAULT_LOG_LINES), + ) + answers["log_lines"] = "" if value is None else value + elif prompt == operations.PROMPT_VERSION: + value = self.console.read(config.MSG_PROMPT_VERSION) + answers["expected_version"] = "" if value is None else value + try: + return operations.build_extra_vars(prompt, answers) + except Refused as exc: + self.console.exception(exc) + self.pause() + return None + + # ------------------------------------------------------------------ + # Target selection + # ------------------------------------------------------------------ + def select_target(self, mode: str) -> Optional[Target]: + """Interactive target picker (mirrors bf_target_select).""" + while True: + screen = tui.target_menu() + if mode == config.MODE_RELEASE: + screen = tui.Screen( + title=screen.title, + subtitle="Sürüm kapılı işlemler dalga kapsamlıdır: tek cihaz seçilemez", + entries=screen.entries, + notes=("Yalnız onaylı dalga grupları kabul edilir; filo geneli reddedilir.",), + ) + self.console.screen(screen) + value = self.console.read(config.MSG_PROMPT_TARGET) + if value is None: + return None + choice = value.strip() + if choice == "" or choice == "0": + return None + if choice.lower() == "q": + raise Quit() + if choice == "1": + dealer = self.ask_dealer() + if dealer is None: + continue + word = dealer + elif choice == "2": + word = self.pick_group(mode) + if word is None: + continue + elif choice == "3": + word = "all" + elif choice == "4": + typed = self.console.read("Hedef (bayi no, grup ya da 'all'): ") + if typed is None: + return None + word = typed.strip() + else: + # Anything else is treated as a directly typed target, exactly + # like the bash prompt's "type the target" option. + word = choice + try: + return operations.resolve_target(word, mode, self.inventory) + except Refused as exc: + self.console.exception(exc) + self.pause() + + def pick_group(self, mode: str) -> Optional[str]: + if not self.inventory.resolved: + self.console.warn(config.MSG_INVENTORY_MISSING.format( + dir=self.repo.path(config.INVENTORY_DIR_REL))) + return None + groups = self.inventory.group_names() if mode == config.MODE_ANY else self.inventory.waves_present() + if not groups: + self.console.warn("Envanterde kullanılabilir grup yok.") + return None + self.console.section("Envanterdeki gruplar") + for index, group in enumerate(groups, start=1): + count = len(self.inventory.hosts_of(group)) + suffix = "onaylı dalga" if operations.is_wave(group) else "grup" + self.console.write(tui.render_item(str(index), group, "{0} cihaz, {1}".format(count, suffix), + self.console.palette)) + value = self.console.read("Grup numarası > ") + if value is None: + return None + value = value.strip() + if value.isdigit() and 1 <= int(value) <= len(groups): + return groups[int(value) - 1] + self.console.warn(config.MSG_MENU_RANGE.format(max=len(groups))) + return None + + # ------------------------------------------------------------------ + # Fleet operations + # ------------------------------------------------------------------ + def run_operation(self, operation: Operation) -> None: + """Full flow for one operation: checks, target, gates, execution.""" + try: + scope = self.repo.verify_scope(operation) + except Refused as exc: + self.console.exception(exc) + self.pause() + return + if not self.require_ansible(): + self.pause() + return + if not self.require_inventory(): + self.pause() + return + + self.console.section(operation.label) + self.console.note(operation.description) + if operation.declared_scope == config.SCOPE_RELEASE: + self.console.note("Sürüm kapılı işlem: yalnız onaylı dalga, yazılı dalga onayı zorunlu.") + target = self.select_target(operation.target_mode) + if target is None: + self.console.note(config.MSG_TARGET_NONE) + return + extra_vars = self.ask_extra_vars(operation) + if extra_vars is None: + return + + if scope == config.SCOPE_WAVE and target.kind == operations.KIND_ALL: + self.run_fleet_waves(operation, scope, target, extra_vars) + return + wave = target.wave + if scope in (config.SCOPE_WAVE, config.SCOPE_RELEASE) and not wave: + self.console.error(config.MSG_TARGET_DEVICE_NO_WAVE.format(host=target.limit)) + self.pause() + return + self.gated_run(operation, scope, target, wave, extra_vars) + self.pause() + + def run_fleet_waves( + self, + operation: Operation, + scope: str, + target: Target, + extra_vars: Sequence[Tuple[str, str]], + ) -> None: + """Wave-scoped operation on the whole fleet: one wave at a time. + + The sequence stops at the first wave that is refused or fails, so no + later wave is ever touched by accident. + """ + sequence = operations.wave_sequence(self.inventory) + if not sequence: + self.console.error("Envanterde onaylı dalga yok; filo geneli işlem yapılamaz.") + self.pause() + return + self.console.section("Filo geneli — dalga dalga") + self.console.warn(config.MSG_GATE_WAVE_BY_WAVE.format(order=config.MSG_GATE_ORDER)) + if not self.console.confirm(config.MSG_GATE_START_FIRST): + self.console.note(config.MSG_CANCELLED) + return + for wave, count in sequence: + self.console.section("Dalga '{0}' — {1} cihaz".format(wave, count)) + answer = self.console.read(config.MSG_GATE_WAVE_LOOP_ASK.format(wave=wave, count=count)) + if answer is None: + return + if answer.strip() != wave: + self.console.info(config.MSG_GATE_WAVE_SKIPPED.format(wave=wave)) + self.runner.audit.write(config.AUDIT_CANCEL, "dalga atlandı: {0}".format(wave)) + continue + wave_target = Target( + kind=operations.KIND_GROUP, limit=wave, wave=wave, count=count, + label="dalga '{0}' ({1} cihaz)".format(wave, count), + ) + result = self.gated_run(operation, scope, wave_target, wave, extra_vars, + pause=False, wave_token_already_given=True) + if result is None or not result.ok: + self.console.error(config.MSG_GATE_WAVE_FAILED.format( + wave=wave, rc=(result.rc if result is not None else "-"))) + self.runner.audit.write(config.AUDIT_STOP, "{0} dalgasında durdu: {1}".format( + operation.ident, wave)) + self.pause() + return + self.pause() + + def gated_run( + self, + operation: Operation, + scope: str, + target: Target, + wave: str, + extra_vars: Sequence[Tuple[str, str]], + pause: bool = True, + wave_token_already_given: bool = False, + ): + """Apply the confirmation plan, build the command and run it.""" + try: + wave_gate_supported = self.repo.playbook_uses( + operation.playbook, operations.VAR_WAVE_GATE_CONFIRMED + ) + except Refused as exc: + self.console.exception(exc) + return None + + plan = operations.confirmation_plan( + operation, scope, target, wave=wave, wave_gate_supported=wave_gate_supported + ) + if wave_token_already_given: + # The fleet-wide loop already made the operator type this wave's + # name: it is never asked twice for the same wave. + plan = [step for step in plan if step.key != "wave_token"] + gates = GatesGranted() + if plan: + self.console.section(config.MSG_GATE_PLAN_TITLE) + for step in plan: + granted = self.apply_gate_step(step) + if granted is None: + return None + gates = gates.grant(step) + + self.console.section("İşlem özeti") + self.console.kv("İşlem", operation.label) + self.console.kv("Playbook", "{0}/{1}".format(config.PLAYBOOK_DIR_REL, operation.playbook)) + self.console.kv("Kapsam", scope) + self.console.kv("Envanter", self.inventory.labels()) + self.console.kv("Hedef", target.label) + if wave: + self.console.kv("Dalga", wave) + + try: + argv = operations.build_ansible_command( + self.repo, + self.inventory.path or "", + operation, + scope, + target, + wave=wave, + extra_vars=list(extra_vars), + gates=gates, + check_mode=self.check_mode, + ) + except Refused as exc: + self.console.exception(exc) + if pause: + self.pause() + return None + + self.runner.audit.write( + config.AUDIT_TARGET, + "{0} hedef={1} tür={2} dalga={3}".format( + operation.ident, target.limit, target.kind, wave or "yok"), + ) + result = self.runner.confirm_and_run( + argv, label="{0} — {1}".format(operation.label, target.label), + destructive=operation.destructive, + ) + if pause: + self.pause() + return result + + def apply_gate_step(self, step: GateStep) -> Optional[bool]: + """Ask one confirmation. Returns None when the operator does not grant it.""" + if step.kind == operations.STEP_TOKEN: + granted = self.console.confirm_token(step.message, step.token, step.prompt) + if granted is None: + return None + if not granted: + self.console.warn(self._token_refusal(step)) + self.pause() + return None + return True + granted = self.console.confirm(step.prompt) + if granted is None: + return None + if not granted: + self.console.warn(self._approval_refusal(step)) + self.pause() + return None + return True + + @staticmethod + def _token_refusal(step: GateStep) -> str: + if step.key == "production_token": + return config.MSG_GATE_PRODUCTION_REFUSED + if step.key == "fleet_token": + return config.MSG_GATE_FLEET_REFUSED + return config.MSG_GATE_WAVE_REFUSED + + @staticmethod + def _approval_refusal(step: GateStep) -> str: + if step.key == "production_approval": + return config.MSG_GATE_PRODUCTION_REFUSED + return config.MSG_CANCELLED_RUN + + # ------------------------------------------------------------------ + # Category: Kurulum (this device) + # ------------------------------------------------------------------ + def category_install(self) -> None: + while True: + key = self.ask_menu(tui.install_menu(self.install_items())) + if key is None: + return + if key == "1": + self.install_preflight() + elif key == "2": + self.install_apply(resume=False) + elif key == "3": + self.install_apply(resume=True) + elif key == "4": + self.install_single_module() + elif key == "5": + self.show_file(config.INSTALL_STATE_FILE, "Kurulum modül durumu") + self.pause() + elif key == "6": + self.tail_file(config.INSTALL_LOG_FILE, "Kurulum kaydı (son 40 satır)") + self.pause() + + @staticmethod + def install_items() -> Tuple[Tuple[str, str], ...]: + return ( + ("Ön kontrol (--check)", "kurulum betiği --check; hiçbir şey yazmaz"), + ("Bu cihazı kur", "tam kurulum; bayi numarası sorulur"), + ("Başarısız kurulumu sürdür", "kurulum betiği --resume"), + ("Tek modül çalıştır", "kurulum betiği --only"), + ("Modül durumunu göster", config.INSTALL_STATE_FILE), + ("Kurulum kaydını göster", "{0} son 40 satır".format(config.INSTALL_LOG_FILE)), + ) + + def install_preflight(self) -> None: + installer = self.require_installer() + if installer is None: + return + dealer = self.ask_dealer() + if dealer is None: + return + self.console.note("Salt okunur ön kontrol: --check modunda kayıt, durum ve dizin oluşturulmaz.") + argv = operations.build_install_command(installer, dealer, check_mode=True) + self.runner.run_readonly(argv, title="Ön kontrol: {0}".format( + operations.dealer_to_device_id(dealer))) + self.pause() + + def install_apply(self, resume: bool) -> None: + installer = self.require_installer() + if installer is None: + return + dealer = self.ask_dealer() + if dealer is None: + return + if not self.require_root(): + self.pause() + return + offline = False + if not resume: + answer = self.console.confirm("Çevrimdışı kurulum (yerel paket deposu) kullanılsın mı?") + if answer is None: + raise Quit() + offline = answer + resume_answer = self.console.confirm("Daha önce OK olan modüller atlanılsın mı (--resume)?") + if resume_answer is None: + raise Quit() + resume = resume_answer + argv = operations.build_install_command( + installer, dealer, offline=offline, resume=resume, check_mode=self.check_mode + ) + self.console.info("Hedef cihaz: {0} ({1})".format( + operations.dealer_to_device_id(dealer), operations.dealer_to_host(dealer))) + self.runner.confirm_and_run( + argv, label="kurulum: {0}".format(operations.dealer_to_device_id(dealer)), destructive=True + ) + self.pause() + + def install_single_module(self) -> None: + installer = self.require_installer() + if installer is None: + return + modules = operations.module_names(self.repo) + if not modules: + self.console.warn("Kurulum modülü bulunamadı: scripts/install/installer/modules/") + self.pause() + return + self.console.section("Kurulum modülleri") + for index, name in enumerate(modules, start=1): + self.console.write(tui.render_item(str(index), name, "", self.console.palette)) + value = self.console.read("Modül numarası > ") + if value is None: + return + value = value.strip() + if not value.isdigit() or not (1 <= int(value) <= len(modules)): + self.console.warn(config.MSG_MENU_RANGE.format(max=len(modules))) + self.pause() + return + module = modules[int(value) - 1] + dealer = self.ask_dealer() + if dealer is None: + return + if not self.require_root(): + self.pause() + return + argv = operations.build_install_command( + installer, dealer, only=module, check_mode=self.check_mode + ) + self.runner.confirm_and_run( + argv, label="tek modül ({0}): {1}".format(module, operations.dealer_to_device_id(dealer)), + destructive=True, + ) + self.pause() + + def require_installer(self) -> Optional[str]: + try: + return self.repo.installer_path() + except Refused as exc: + self.console.exception(exc) + self.pause() + return None + + # ------------------------------------------------------------------ + # Category: Cihaz işlemleri (fleet) + # ------------------------------------------------------------------ + def category_devices(self) -> None: + while True: + key = self.ask_menu(tui.devices_menu( + len(operations.REPORT_OPERATIONS), len(operations.MAINTENANCE_OPERATIONS))) + if key is None: + return + if key == "1": + self.operation_list(operations.REPORT_OPERATIONS, + "Salt okunur filo raporları", + "Bu listedeki hiçbir playbook cihazı değiştirmez") + elif key == "2": + self.operation_list(operations.MAINTENANCE_OPERATIONS, + "Filo bakım işlemleri", + "Yıkıcı işlemler iki kez onay ister") + elif key == "3": + if self.require_inventory(): + self.console.show_lines(operations.targets_lines(self.inventory)) + self.pause() + + def operation_list(self, ops: Sequence[Operation], title: str, subtitle: str) -> None: + screen = tui.Screen( + title=title, + subtitle=subtitle, + entries=tuple(tui.item(op.label, op.description) for op in ops), + ) + key = self.ask_menu(screen) + if key is None: + return + index = int(key) - 1 + if 0 <= index < len(ops): + self.run_operation(ops[index]) + + # ------------------------------------------------------------------ + # Category: Merkez hazırlığı + # ------------------------------------------------------------------ + def category_central(self) -> None: + while True: + key = self.ask_menu(tui.central_menu()) + if key is None: + return + if key == "1": + self.console.show_lines(operations.central_readiness_lines( + self.repo, self.inventory, self.inventory_error)) + elif key == "2": + self.console.show_lines(operations.central_endpoint_lines(self.repo)) + elif key == "3": + self.console.show_lines(operations.central_probe_lines(self.repo)) + elif key == "4": + self.console.show_lines(operations.wave_gate_state_lines(self.inventory)) + elif key == "5": + self.console.show_lines(operations.central_checklist_lines()) + self.pause() + + # ------------------------------------------------------------------ + # Category: Araçlar + # ------------------------------------------------------------------ + def category_tools(self) -> None: + while True: + key = self.ask_menu(tui.tools_menu()) + if key is None: + return + if key == "1": + self.tool_git_pull() + elif key == "2": + self.console.show_lines(operations.environment_lines( + self.repo, self.runner.audit.path or self.runner.audit.requested, + self.inventory, self.runner.dry_run, self.runner.check_mode)) + self.console.kv("Denetim kaydı modu", operations.file_mode( + self.runner.audit.path or "")) + self.pause() + elif key == "3": + self.console.show_lines(catalogue_lines()) + self.pause() + elif key == "4": + self.run_tool("bf-check-local", args=("--check",)) + self.pause() + elif key == "5": + self.run_tool("bf-check-enrollment", args=("--check",)) + self.pause() + elif key == "6": + self.run_tool("bf-check-ready", args=("--check",)) + self.pause() + elif key == "7": + if self.run_tool("bf-diagnostics") is None: + self.run_tool("bf-status") + self.pause() + elif key == "8": + self.run_tool(config.TOOL_LIVE_HW_CHECK) + self.pause() + elif key == "9": + self.run_tool("bf-remote-status", args=("--check",)) + self.pause() + elif key == "10": + self.run_tool("bf-release") + self.pause() + elif key == "11": + self.tool_hardware_inventory() + elif key == "12": + self.tool_support_bundle() + elif key == "13": + self.tail_file(self.runner.audit.path or config.DEFAULT_LOG_FILE, + "Konsol denetim kaydı") + self.pause() + + def run_tool(self, tool: str, args: Sequence[str] = (), title: str = ""): + """Run a repository diagnostics tool (read-only screen).""" + try: + path = self.repo.tool_path(tool) + except Refused as exc: + self.console.exception(exc) + return None + argv = [path] + list(args) + return self.runner.run_readonly(argv, title=title or tool) + + def tool_git_pull(self) -> None: + self.runner.confirm_and_run( + ["git", "-C", self.repo.root, "pull", "--ff-only"], + label="depoyu güncelle ({0})".format(self.repo.root), destructive=True, + ) + self.console.note("Depo değişmiş olabilir; konsolu yeniden başlatın.") + self.pause() + + def tool_hardware_inventory(self) -> None: + try: + path = self.repo.tool_path("bf-hardware-inventory.sh") + except Refused as exc: + self.console.exception(exc) + self.pause() + return + dealer = self.ask_dealer() + if dealer is None: + return + out_dir = "/var/lib/blueforce/inventory" if self.runner.is_root() \ + else os.path.join(os.environ.get("XDG_STATE_HOME", os.path.expanduser("~/.local/state")), + "blueforce", "inventory") + argv = [path, "--dealer-id", dealer, "--out-dir", out_dir] + self.runner.run_readonly(argv, title="Donanım envanteri: {0}".format( + operations.dealer_to_device_id(dealer))) + self.pause() + + def tool_support_bundle(self) -> None: + self.run_tool("bf-support-bundle", args=("--out-dir", config.SUPPORT_BUNDLE_OUT_DIR)) + self.pause() + + # ------------------------------------------------------------------ + # Category: Cihaz bilgisi (read-only) + # ------------------------------------------------------------------ + def category_info(self) -> None: + while True: + key = self.ask_menu(tui.info_menu()) + if key is None: + return + if key == "1": + self.console.show_lines(operations.identity_lines()) + elif key == "2": + self.run_tool("bf-status") + elif key == "3": + self.console.show_lines(operations.state_lines()) + elif key == "4": + self.info_network() + elif key == "5": + self.info_resources() + elif key == "6": + self.info_packages() + elif key == "7": + self.info_services() + elif key == "8": + self.info_journal() + elif key == "9": + if self.require_inventory(): + self.console.show_lines(operations.targets_lines(self.inventory)) + elif key == "10": + self.info_resolve_target() + continue + self.pause() + + def _run_readonly(self, argv: Sequence[str], title: str) -> None: + self.runner.run_readonly(argv, title=title) + + def info_network(self) -> None: + self._run_readonly(["ip", "-brief", "address"], "Ağ arayüzleri") + self._run_readonly(["ip", "route", "show", "default"], "Varsayılan rotalar") + if os.path.isfile("/etc/resolv.conf"): + self._run_readonly(["awk", "/^nameserver/{print}", "/etc/resolv.conf"], + "DNS sunucuları (yalnız nameserver satırları)") + self._run_readonly(["wg", "show", "wg0", "listen-port"], "WireGuard dinleme portu") + self._run_readonly(["sh", "-c", "wg show wg0 peers | wc -l"], "WireGuard eş sayısı") + self._run_readonly(["wg", "show", "wg0", "latest-handshakes"], + "WireGuard el sıkışma zamanları (anahtar yok)") + self.console.note("WireGuard özel ve ön paylaşımlı anahtarları asla istenmez, gösterilmez ve kaydedilmez.") + + def info_resources(self) -> None: + self._run_readonly(["df", "-h"], "Dosya sistemleri") + self._run_readonly(["free", "-h"], "Bellek") + self._run_readonly(["uptime"], "Yük ortalaması ve açık kalma süresi") + + def info_packages(self) -> None: + self._run_readonly( + ["dpkg-query", "-W", "-f=${Package} ${Version} ${Status}\n", + "docker-ce", "wireguard", "rustdesk", "xrdp", "openssh-server"], + "Kurulu sabit paketler", + ) + + def info_services(self) -> None: + self._run_readonly( + ["systemctl", "is-active", "ssh", "sshd", "xrdp", "rustdesk", "docker", + "wg-quick@wg0", "meshagent", "cron"], + "Servis durumu (salt okunur)", + ) + + def info_journal(self) -> None: + self._run_readonly(["journalctl", "-p", "err", "-n", "20", "--no-pager"], + "Son journal hataları (20)") + + def info_resolve_target(self) -> None: + self.console.section("Hedefi çözümle") + self.console.note("Bayi numarası, grup adı, 'all' ya da bf- ana makine adı kabul edilir.") + value = self.console.read(config.MSG_PROMPT_TARGET) + if value is None or not value.strip(): + return + if not self.require_inventory(): + self.pause() + return + mode = config.MODE_ANY + answer = self.console.confirm("Bu hedef dalga kapsamlı bir işlem için mi?") + if answer: + mode = config.MODE_WAVE + try: + target = operations.resolve_target(value, mode, self.inventory) + except Refused as exc: + self.console.exception(exc) + self.pause() + return + self.console.kv("Tür", target.kind) + self.console.kv("Ansible --limit", target.limit) + self.console.kv("Dalga", target.wave or "yok") + self.console.kv("Cihaz sayısı", str(target.count)) + self.console.note("Örnek: ansible-playbook -i {0} {1}/bf-ping.yml --limit {2}".format( + self.inventory.labels(), config.PLAYBOOK_DIR_REL, target.limit)) + self.pause() + + # ------------------------------------------------------------------ + # Local helpers + # ------------------------------------------------------------------ + def show_file(self, path: str, title: str) -> None: + self.console.section(title) + try: + with open(path, "r", encoding="utf-8") as handle: + lines = handle.read().splitlines() + except OSError: + self.console.warn("{0} okunamadı veya yok.".format(path)) + return + for line in lines: + self.console.write(" " + line) + + def tail_file(self, path: str, title: str, lines: int = 40) -> None: + if not os.path.isfile(path): + self.console.warn("{0} yok.".format(path)) + return + self.runner.run_readonly(["tail", "-n", str(lines), path], title=title) + + +# --------------------------------------------------------------------------- +# Non-interactive listings +# --------------------------------------------------------------------------- +def catalogue_lines() -> List[str]: + lines: List[str] = [] + for title, ops in ((config.LIST_TITLE_REPORTS, operations.REPORT_OPERATIONS), + (config.LIST_TITLE_MAINTENANCE, operations.MAINTENANCE_OPERATIONS)): + lines.append("") + lines.append(title) + for index, op in enumerate(ops, start=1): + lines.append(" {0:>2}) {1:<34} {2:<36} kapsam={3:<8} yıkıcı={4}".format( + index, op.ident, op.playbook, op.declared_scope, "evet" if op.destructive else "hayır")) + lines.append("") + lines.append(config.LIST_NOTE_WAVE) + lines.append(config.LIST_NOTE_RELEASE) + lines.append(config.LIST_NOTE_PLAYBOOK) + return lines + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +def _wants_tui(args: argparse.Namespace) -> bool: + """Whether this invocation belongs to the terminal console. + + The GUI is the default. A few flags exist only in the terminal console -- + they print text and exit, or tune terminal rendering -- so an invocation + carrying one of them must stay there instead of being swallowed by the + router. ``--tui`` forces it explicitly. + """ + if args.tui: + return True + if args.gui: + return False + # --list prints a text catalogue (the TUI's report format) and exits; it is + # a report, not an interactive surface, so it stays in the terminal console. + return bool(args.list or args.check or args.list_targets or args.no_color + or args.log_file != config.DEFAULT_LOG_FILE + or args.lang != config.DEFAULT_LANG) + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + if args.tui and args.gui: + sys.stderr.write("HATA: --tui ve --gui birlikte kullanılamaz.\n") + return config.EXIT_USAGE + + if args.version: + sys.stdout.write("{0} {1}\n".format(config.PROGRAM_NAME, config.VERSION)) + return config.EXIT_OK + + if args.lang not in config.SUPPORTED_LANGS: + sys.stderr.write(config.MSG_LANG_UNSUPPORTED.format( + value=args.lang, supported=", ".join(config.SUPPORTED_LANGS)) + "\n") + return config.EXIT_USAGE + + if not _wants_tui(args): + # Imported lazily: the GUI pulls in tkinter, and the terminal console + # must keep working on a device where that import is unavailable. + from . import ui_gui + gui_argv: List[str] = [] + if args.full: + gui_argv.append("--full") + if args.dry_run: + gui_argv.append("--dry-run") + if args.repo: + gui_argv.extend(["--repo", args.repo]) + if args.inventory: + gui_argv.extend(["--inventory", args.inventory]) + if args.list: + gui_argv.append("--list") + return ui_gui.main(gui_argv) + + try: + repo = resolve_repo(args.repo) + except Refused as exc: + sys.stderr.write(exc.message + "\n") + if exc.detail: + sys.stderr.write(exc.detail + "\n") + return config.EXIT_USAGE + + palette = config.Palette(tui.color_enabled( + no_color=args.no_color, mode="auto", is_tty=tui.stream_is_tty(sys.stdout))) + console = tui.Console(palette=palette) + + audit = runner.AuditLog(requested=args.log_file) + audit.initialise() + if audit.warning: + console.warn(audit.warning) + + inventory_error = "" + try: + inventory_path = repo.find_inventory(args.inventory) + inventory = Inventory.load(inventory_path) + except Refused as exc: + inventory = Inventory(path=None, groups={}) + inventory_error = exc.message + ("\n" + exc.detail if exc.detail else "") + except (OSError, ValueError) as exc: + inventory = Inventory(path=None, groups={}) + inventory_error = config.MSG_INVENTORY_UNREADABLE.format(path=args.inventory) + "\n" + str(exc) + + # Non-interactive listings first: they need no terminal and no Ansible. + if args.list: + console.show_lines(catalogue_lines()) + return config.EXIT_OK + if args.list_targets: + console.show_lines(operations.targets_lines(inventory)) + return config.EXIT_OK + + console.note("{0} {1} — {2}".format(config.PROGRAM_NAME, config.VERSION, config.SCREEN_SUBTITLE)) + console.kv("Depo", repo.root) + console.kv("Envanter", inventory.labels()) + console.kv("Denetim kaydı", audit.path or "yok") + if args.dry_run: + console.warn(config.MSG_DRY_RUN) + if args.check: + console.info(config.MSG_CHECK_MODE) + if not audit.ready: + console.warn(config.MSG_LOG_NONE) + if not inventory.resolved: + console.warn(inventory_error or config.MSG_INVENTORY_MISSING.format( + dir=repo.path(config.INVENTORY_DIR_REL))) + console.note("Filo kategorileri çalışmayacak; yerel kurulum ve bilgi ekranları kullanılabilir.") + if not runner.Runner.have_ansible(): + console.warn(config.MSG_ANSIBLE_MISSING) + + audit.write(config.AUDIT_SESSION, ( + "{0} {1} başlangıç uid={2} repo={3} dry_run={4} check={5} full={6}" + ).format(config.PROGRAM_NAME, config.VERSION, os.getuid(), repo.root, + args.dry_run, args.check, args.full)) + + app = App( + repo=repo, + console=console, + runner_=runner.Runner(console, audit=audit, dry_run=args.dry_run, check_mode=args.check), + inventory=inventory, + full_mode=args.full, + check_mode=args.check, + inventory_error=inventory_error, + inventory_arg=args.inventory, + ) + try: + code = app.run() + except KeyboardInterrupt: + console.write("") + console.note("Kullanıcı tarafından kesildi (Ctrl+C).") + return 130 + return code + + +if __name__ == "__main__": # pragma: no cover + raise SystemExit(main()) + + + +"""Static configuration for the bfos operator console. + +Everything an operator can read lives here, in Turkish, so the wording can be +reviewed and changed in one place. Identifiers and comments stay English. + +Rules kept in this module: + * standard library only (Python 3.8+), no third-party import, + * no side effect at import time (no directory is created, nothing is read), + * thresholds and allowlists are shared with the Ansible playbooks/docs: the + canonical wave order and the dealer-number pattern come from docs/02 and + docs/10 exactly as admin/lib/targets.sh defines them. +""" + +# --------------------------------------------------------------------------- +# Identity and version +# --------------------------------------------------------------------------- +PROGRAM_NAME = "bfos" +VERSION = "1.0.0" +SCREEN_TITLE = "BLUEFORCE FIELD OS" +SCREEN_SUBTITLE = "Saha cihazı operatör konsolu" +PROGRAM_DESCRIPTION = "Blueforce saha cihazı operatör konsolu (Türkçe)" + +# --------------------------------------------------------------------------- +# Paths +# --------------------------------------------------------------------------- +DEFAULT_LOG_FILE = "/var/log/blueforce-console.log" +LOG_FALLBACK_SUBDIR = ("blueforce", "blueforce-console.log") +LOG_FILE_MODE = 0o600 +LOG_DIR_MODE = 0o700 + +INSTALLER_REL = "scripts/install/blueforce-install.sh" +PLAYBOOK_DIR_REL = "ansible/playbooks" +DIAGNOSTICS_DIR_REL = "scripts/diagnostics" +GROUP_VARS_REL = "ansible/inventory/group_vars/all.yml" +INVENTORY_DIR_REL = "ansible/inventory" +INVENTORY_EXAMPLE_REL = "ansible/inventory/hosts.example.yml" +INVENTORY_CANDIDATES = ("hosts.yml", "hosts.yaml", "hosts", "hosts.ini") + +STATE_FILE = "/var/lib/blueforce/state.json" # nosec - read-only whitelist +INSTALL_STATE_FILE = "/var/lib/blueforce/install-state" +INSTALL_LOG_FILE = "/var/log/blueforce-install.log" +TOOL_BIN_DIR = "/usr/local/bin" +ADMIN_KEY_FILE = "~/.ssh/blueforce_id_ed25519" +SUPPORT_BUNDLE_OUT_DIR = "/var/tmp" + +# --------------------------------------------------------------------------- +# Rules, allowlists and thresholds (mirrors admin/lib/targets.sh + docs/10) +# --------------------------------------------------------------------------- +DEALER_PATTERN = r"^[0-9]{8}$" +HOST_PATTERN = r"^bf-[0-9]{8}$" + +# Canonical rollout order. One place, so the menu, the gate checks and the +# fleet-wide loop can never disagree. +WAVES = ("lab", "pilot_1", "pilot_2", "wave_1", "wave_2", "production") +PRODUCTION_WAVE = "production" + +# Target selection modes. +MODE_ANY = "any" +MODE_WAVE = "wave" +MODE_RELEASE = "release" + +# Scope names derived from the playbook file itself. +SCOPE_SIMPLE = "simple" +SCOPE_WAVE = "wave" +SCOPE_RELEASE = "release" + +SERVICE_ALLOWLIST = ("blueforce-agent", "docker", "ssh", "sshd", "systemd-journald", "cron") +SCRIPT_DIRS = ("/opt/blueforce/bin", "/usr/local/sbin") + +DISK_WARN_MIN = 1 +DISK_WARN_MAX = 100 +DEFAULT_REBOOT_GRACE = 300 +DEFAULT_LOG_LINES = 500 + +# Non-secret identity/lifecycle keys of state.json (whitelist, mirrors bf-menu). +STATE_ALLOWED_KEYS = ("phase", "enrollment_status", "fleet_status", "device_id", "provisioning_id") + +# Central endpoint keys read from group_vars/all.yml for the preparation screens. +CENTRAL_ENDPOINT_KEYS = ( + "wg_subnet", + "wg_interface", + "wg_hub_endpoint", + "monitoring_endpoint", + "monitoring_job", + "update_repo_url", + "update_repo_suite", + "meg_image_tag", + "support_bundle_dir", +) + +# Local diagnostics tools the console can drive (resolved in /usr/local/bin +# first, then in the checkout under scripts/diagnostics/). +DIAGNOSTIC_TOOLS = ( + "bf-status", + "bf-diagnostics", + "bf-check-local", + "bf-check-enrollment", + "bf-check-ready", + "bf-release", + "bf-remote-status", + "bf-support-bundle", + "bf-hardware-inventory.sh", +) + +TOOL_ENROLL_STATUS = "bf-enrollment-status" +TOOL_LIVE_HW_CHECK = "bf-live-hw-check" + +# Language: this console is Turkish-only on purpose (user decision). The option +# exists so a future translation has a single switch to grow into. +SUPPORTED_LANGS = ("tr",) +DEFAULT_LANG = "tr" + +# Layout and exit codes (the bash console uses the same contract). +CONSOLE_WIDTH = 78 +EXIT_OK = 0 +EXIT_FAIL = 1 +EXIT_USAGE = 2 + +# Minimal Python version this console supports. +MIN_PYTHON = (3, 8) + +# --------------------------------------------------------------------------- +# ANSI palette +# --------------------------------------------------------------------------- +ANSI = { + "reset": "\033[0m", + "bold": "\033[1m", + "dim": "\033[2m", + "red": "\033[31m", + "green": "\033[32m", + "yellow": "\033[33m", + "blue": "\033[34m", + "magenta": "\033[35m", + "cyan": "\033[36m", +} + + +class Palette: + """ANSI codes, or empty strings when colour is switched off.""" + + __slots__ = ( + "enabled", + "reset", + "bold", + "dim", + "red", + "green", + "yellow", + "blue", + "magenta", + "cyan", + ) + + def __init__(self, enabled: bool) -> None: + self.enabled = enabled + for name, code in ANSI.items(): + setattr(self, name, code if enabled else "") + + def paint(self, text: str, *names: str) -> str: + """Wrap TEXT in the given colour names (ignored when disabled).""" + if not self.enabled or not names: + return text + prefix = "".join(getattr(self, name) for name in names) + return "{0}{1}{2}".format(prefix, text, self.reset) + + +# --------------------------------------------------------------------------- +# Turkish messages +# --------------------------------------------------------------------------- +# Generic messages +MSG_QUIT = "Konsoldan çıkılıyor." +MSG_BACK = "Geri" +MSG_QUIT_ITEM = "Çıkış" +MSG_AT_TOP = "Zaten ana menüdesiniz." +MSG_UNKNOWN_CHOICE = "Geçersiz seçim: '{choice}'. Lütfen menüdeki numaralardan birini yazın." +MSG_MENU_RANGE = "Lütfen 1 ile {max} arasında bir numara yazın." +MSG_PRESS_ENTER = "Devam etmek için Enter'a basın" +MSG_CANCELLED = "İptal edildi; hiçbir şey çalıştırılmadı." +MSG_CANCELLED_RUN = "İşlem iptal edildi, komut çalıştırılmadı." +MSG_INVALID_INPUT = "Girdi anlaşılamadı: {value}" +MSG_REQUIRED = "Bu alan boş bırakılamaz." +MSG_NOT_A_TTY = "Bu ekran etkileşimli bir uçbirim gerektiriyor; çıkılıyor." + +# Interpreter / environment +MSG_PYTHON_MISSING = ( + "HATA: python3 bulunamadı. bfos operatör konsolu için Python 3.8 veya üzeri gerekir.\n" + "Yedek yol (bash): sudo admin/bf-menu ya da kuruluysa: sudo bf-menu" +) +MSG_PYTHON_OLD = ( + "HATA: Python sürümü çok eski: {version}. bfos için Python 3.8+ gerekir.\n" + "Yedek yol (bash): sudo admin/bf-menu" +) +MSG_LANG_UNSUPPORTED = "Bu konsol yalnızca Türkçe çalışır; '{value}' desteklenmiyor. Kullanılabilir: {supported}." +MSG_REPO_INVALID = ( + "HATA: {path} bir Blueforce deposu gibi görünmüyor (ansible/ ve scripts/ bulunamadı).\n" + "Depoyu klonlayıp konsolu oradan çalıştırın veya --repo YOL ile yolu belirtin." +) +MSG_ANSIBLE_MISSING = ( + "ansible-playbook bu makinede kurulu değil; filo işlemleri çalıştırılamaz.\n" + "Merkez makinaya kurun: sudo apt install ansible (veya: pipx install ansible-core)" +) +MSG_INVENTORY_MISSING = ( + "Ansible envanteri bulunamadı: {dir}\n" + "Gerçek envanteri oluşturun: cp ansible/inventory/hosts.example.yml ansible/inventory/hosts.yml " + "ve bf-<8 haneli bayi no> cihazları doldurun." +) +MSG_INVENTORY_EXAMPLE_ONLY = ( + "Yalnızca örnek envanter var (örnek cihaz kimlikleri içerir): {path}\n" + "Gerçek cihazlara karşı kullanmayın; kopyalayıp gerçek kimlikleri yazın." +) +MSG_INVENTORY_UNREADABLE = "Envanter okunamıyor: {path}" +MSG_ROOT_REQUIRED = ( + "Bu işlem BU cihazda root yetkisi gerektirir.\n" + "Konsolu tekrar sudo ile başlatın: sudo admin/bf" +) +MSG_TOOL_MISSING = ( + "{tool} bulunamadı (/usr/local/bin altında ve depo içinde yok).\n" + "Kurulacak komut: sudo install -m 0755 scripts/diagnostics/{tool} /usr/local/bin/{tool}" +) +MSG_INSTALLER_MISSING = ( + "Kurulum betiği bulunamadı: {path}\n" + "--repo ile doğru depo yolunu gösterin." +) +MSG_PLAYBOOK_MISSING = ( + "Playbook bulunamadı: {path}\n" + "Konsolu deponun içinden çalıştırın (--repo YOL)." +) + +# Target selection +MSG_TARGET_NONE = "Hedef seçilmedi; komut üretilmedi." +MSG_TARGET_EMPTY = "Cihaz seçilmedi." +MSG_TARGET_DEALER_INVALID = ( + "Geçersiz bayi numarası: '{value}'. 8 hane olmalı, boşluk ve harf olmamalı (örn. 12010101)." +) +MSG_TARGET_UNKNOWN = "'{value}' bir bayi numarası (8 hane), grup ya da 'all' değil." +MSG_TARGET_DEVICE_UNKNOWN = ( + "{host} envanterde yok ({inventory}).\n" + "Cihazı önce ilgili dalga grubuna ekleyin." +) +MSG_TARGET_DEVICE_NO_WAVE = ( + "{host} onaylı bir dalgada değil. Dalga kapsamlı işlemler böyle bir cihazı reddeder (fail-closed)." +) +MSG_TARGET_GROUP_UNKNOWN = "'{group}' grubu envanterde yok. Bilinen gruplar: {groups}" +MSG_TARGET_GROUP_NOT_WAVE = ( + "'{group}' onaylı bir dalga değil. Dalga kapsamlı işlemler için: {waves}" +) +MSG_TARGET_GROUP_EMPTY = "'{group}' grubu boş; boş hedef reddedildi." +MSG_TARGET_ALL_EMPTY = "Envanterde hiç cihaz yok; boş hedef reddedildi." +MSG_TARGET_RELEASE_DEVICE = ( + "Sürüm kapılı işlemler dalga kapsamlıdır: tek cihaz seçilemez, dalga grubu seçin." +) +MSG_TARGET_RELEASE_ALL = ( + "Sürüm kapılı işlemler için filo geneli reddedildi: güncelleme dalga dalga yapılır." +) +MSG_TARGET_KNOWN_GROUPS = "Bilinen gruplar: {groups}" + +# Gates +MSG_GATE_PLAN_TITLE = "Güvenlik kapıları" +MSG_GATE_ALREADY = "Bu işlem için ek kapı onayı gerekmiyor." +MSG_GATE_WAVE_TOKEN = ( + "Dalga onayı istendi: '{wave}'. Sürüm kapılı işlemler yalnızca yazılı dalga onayıyla koşar." +) +MSG_GATE_WAVE_TOKEN_ASK = "Onay için dalga adını aynen yazın ({wave}): " +MSG_GATE_WAVE_REFUSED = "Dalga onayı verilmedi; işlem yapılmadı." +MSG_GATE_GATE_FLAG = "Onayla birlikte playbook'a -e wave_gate_confirmed=true iletilecek." +MSG_GATE_PRODUCTION = ( + "DALGA 'production' CANLI FİLODUR. Playbook, operation/üretim onayı olmadan koşmayı reddeder." +) +MSG_GATE_PRODUCTION_ASK = "Canlı filo onayı için 'production' yazın: " +MSG_GATE_PRODUCTION_APPROVAL = ( + "ÜRETİM ONAYI: bu komut canlı filoyu değiştirir ve -e production_override=true iletilecek. Onaylıyor musunuz?" +) +MSG_GATE_PRODUCTION_REFUSED = "Üretim onayı verilmedi; işlem yapılmadı." +MSG_GATE_FLEET_TOKEN = ( + "FİLO GENELİ: komut envanterdeki tüm cihazları ({count}) hedefliyor. Bu en geniş kapsamdır." +) +MSG_GATE_FLEET_TOKEN_ASK = "Filo geneli onayı için 'all' yazın: " +MSG_GATE_FLEET_REFUSED = "Filo geneli onayı verilmedi; işlem yapılmadı." +MSG_GATE_WAVE_BY_WAVE = ( + "Bu playbook dalga kapsamlı: filo, dalga dalga işlenir ve ilk hatada DURUR.\n" + "Sıra: {order}" +) +MSG_GATE_WAVE_LOOP_ASK = "Dalga '{wave}' ({count} cihaz) için onay vermek üzere dalga adını yazın: " +MSG_GATE_WAVE_SKIPPED = "'{wave}' dalgası operatör tarafından atlandı." +MSG_GATE_WAVE_FAILED = "'{wave}' dalgası başarısız oldu (çıkış kodu {rc}); sıra DURDURULDU, sonraki dalgaya dokunulmadı." +MSG_GATE_WAVE_NOT_RUN = "'{wave}' dalgası tamamlanmadı; sıra DURDURULDU." +MSG_GATE_START_FIRST = "İlk dalga ile başlansın mı?" +MSG_GATE_ORDER = "lab → pilot_1 → pilot_2 → wave_1 → wave_2 → production" +MSG_GATE_SCOPE_MISMATCH = ( + "RED: {playbook} için konsol kapsamı '{declared}' bekliyor, playbook '{actual}' diyor.\n" + "Playbook kendi kapılarının kaynağıdır; konsol tablosu güncellenmeden bu playbook çalıştırılmaz." +) +MSG_GATE_NO_TARGET = "Hedef seçilmedi; komut üretilmedi (kapı kuralı)." + +# Prompts / extra variables +MSG_PROMPT_DEALER = "Bayi numarası (8 hane): " +MSG_PROMPT_TARGET = "Hedef (bayi no, grup ya da 'all'): " +MSG_PROMPT_CHOICE = "Seçim > " +MSG_PROMPT_PACKAGES = "Paketler (virgülle ayrılmış, paket=sürüm): " +MSG_PROMPT_SERVICE = "Servis adı: " +MSG_PROMPT_SCRIPT = "Betik yolu (mutlak): " +MSG_PROMPT_SCRIPT_ARGS = "Betik argümanları (isteğe bağlı): " +MSG_PROMPT_GRACE = "Yeniden başlatma için bekleme süresi (saniye) [{default}]: " +MSG_PROMPT_DISK = "Uyarı eşiği yüzdesi (boş = playbook varsayılanı 80): " +MSG_PROMPT_LOG_LINES = "Cihaz başına log satırı [{default}]: " +MSG_PROMPT_VERSION = "Beklenen Field OS sürümü (boş = sapma denetimi yok): " + +MSG_PKG_HINT = "Yalnız kesin sürüm: paket=sürüm (aralık, 'latest' ve boş liste reddedilir)." +MSG_PKG_REQUIRED = "En az bir sabitlenmiş paket gerekir." +MSG_PKG_INVALID = "Geçersiz pin: '{value}'. Beklenen biçim: paket=sürüm (örn. docker-ce=5:27.0.3-1~ubuntu.24.04~noble)." +MSG_PKG_LATEST = ( + "Reddedildi: '{value}' kesin bir sürüm değil. 'latest' politikası yoktur; " + "pinlenmiş sürüm yazın (docs/10)." +) +MSG_SERVICE_HINT = "İzinli servisler: {allowlist}" +MSG_SERVICE_INVALID = "Reddedildi: '{value}' izinli servis listesinde değil (playbook da reddederdi)." +MSG_SCRIPT_ABSOLUTE = "Betik yolu mutlak olmalı (/ ile başlamalı)." +MSG_SCRIPT_OUTSIDE = "Reddedildi: '{value}' izinli dizinlerin dışında ({dirs})." +MSG_GRACE_INVALID = "Bekleme süresi tam sayı saniye olmalı." +MSG_PCT_INVALID = "Eşik {min} ile {max} arasında olmalı." +MSG_LINES_INVALID = "Satır sayısı pozitif bir tam sayı olmalı." + +# Command / run flow +MSG_COMMAND_TITLE = "Çalıştırılacak komut" +MSG_RUN_ASK = "Bu komut çalıştırılsın mı? [y=çalıştır / c=--check ile çalıştır / N=iptal]: " +MSG_DESTRUCTIVE_WARN = "DURUM DEĞİŞTİREN İŞLEM: {label}" +MSG_DESTRUCTIVE_SUB = "Onaylamadan önce yukarıdaki komutu okuyun; seçilen cihazları değiştirir." +MSG_ROOT_REQUIRED = ( + "Bu işlem BU cihazda root yetkisi gerektirir.\n" + "Konsolu tekrar sudo ile başlatın: sudo bf" +) +MSG_DESTRUCTIVE_GATE = ( + "Yıkıcı işlem kapısı: {label} seçilen cihazları değiştirir. " + "Bu onaydan sonra komut üretilir ve çalıştırmadan önce ayrıca sorulur." +) +MSG_ASK_YES_NO = "{question} [e/H]: " +MSG_CHECK_MODE = "Check modu: komut --check ile çalışacak, hiçbir değişiklik uygulanmayacak." +MSG_DRY_RUN = "DENEME (dry-run) MODU: komutlar yazılır, asla çalıştırılmaz." +MSG_DRY_RUN_WARN = "dry-run: yukarıdaki komut ÇALIŞTIRILMADI." +MSG_RUN_OK = "Komut başarıyla tamamlandı (çıkış kodu 0)." +MSG_RUN_FAIL = "Komut {rc} çıkış koduyla başarısız oldu." +MSG_RUN_ABORTED = "Komut {signal} ile kesildi." +MSG_LOG_FALLBACK = "{requested} yazılamıyor; denetim kaydı {fallback} dosyasına yazılıyor (mod 600)." +MSG_LOG_NONE = "Yazılabilir denetim kaydı bulunamadı; bu oturum kaydedilmeyecek." + +# Simple (default) menu +SIMPLE_MENU_TITLE = SCREEN_TITLE +SIMPLE_MENU_SUBTITLE = "Bu cihazı kurmak ve durumunu görmek için 1 veya 2 yazın" +SIMPLE_ITEM_INSTALL_LABEL = "Kur" +SIMPLE_ITEM_INSTALL_DESC = "Bu cihazı Field OS standardına getir (kurulum ekranı)" +SIMPLE_ITEM_STATUS_LABEL = "Durum" +SIMPLE_ITEM_STATUS_DESC = "Kurulum ve cihaz durumunu göster (salt okunur)" +SIMPLE_ITEM_EXIT_LABEL = "Çıkış" +SIMPLE_ITEM_EXIT_DESC = "Konsoldan çık" +SIMPLE_ADVANCED_LABEL = "Detaylı mod" +SIMPLE_ADVANCED_DESC = "Filo işlemleri, merkez hazırlığı, araçlar ve 21 playbook" + +# Full (detailed) menu +FULL_MENU_TITLE = "Detaylı mod" +FULL_MENU_SUBTITLE = "Tüm operasyonlar; güvenlik kapıları her işlemde geçerlidir" +CAT_INSTALL = "Kurulum" +CAT_DEVICES = "Cihaz işlemleri" +CAT_CENTRAL = "Merkez hazırlığı" +CAT_TOOLS = "Araçlar" +CAT_INFO = "Cihaz bilgisi" + +MSG_FULL_MODE_HINT = "Detaylı mod açık: filo işlemleri ve araçlar görünür." +MSG_SIMPLE_MODE_HINT = "Basit mod: 1) Kur, 2) Durum, 3) Çıkış. Detaylı özellikler için 'd' yazın ya da --full ile başlatın." + +# Audit log +AUDIT_SESSION = "SESSION" +AUDIT_TARGET = "TARGET" +AUDIT_RUN = "RUN" +AUDIT_DRYRUN = "DRYRUN" +AUDIT_OK = "OK" +AUDIT_FAIL = "FAIL" +AUDIT_CANCEL = "CANCEL" +AUDIT_STOP = "STOP" + +# Non-interactive listings +LIST_TITLE_REPORTS = "Salt okunur filo raporları (cihazlara dokunmaz)" +LIST_TITLE_MAINTENANCE = "Filo bakım işlemleri (yıkıcı olanlar iki kez onay ister)" +LIST_NOTE_WAVE = "scope=wave -> -e operation_wave= -e operation_confirmed=true" +LIST_NOTE_RELEASE = "scope=release -> -e release_wave= + yazılı dalga onayı" +LIST_NOTE_PLAYBOOK = "Kapsam her playbook dosyasından okunur; uyuşmazsa çalıştırılmaz." + + + +"""Command execution and the audit log for the bfos console. + +Separation of duties: + + * :mod:`bfos.operations` decides *what* may run and produces an argv list, + * this module decides *whether* it runs (confirmation, dry-run, check mode), + executes it with :mod:`subprocess`, reports the exit code, and writes the + audit record. + +Guarantees kept from the bash console (``admin/bf-menu``): + + * the command is always printed **before** it is confirmed and run, + * ``--dry-run`` executes nothing at all, + * the audit log is mode 600 (directories 700) and falls back to + ``$XDG_STATE_HOME/blueforce/`` when ``/var/log`` is not writable, + * no secret reaches the log: a single sanitizer redacts + ``password=``/``token=``/``secret=``/``api_key=``/``private_key=``/``psk=`` + style values and whole PEM blocks, + * raw command output is shown on screen and never copied into the log. +""" + +from __future__ import annotations + +import os +import re +import shlex +import subprocess +import sys +from dataclasses import dataclass, field +from typing import Callable, List, Optional, Sequence + +from . import config + +# --------------------------------------------------------------------------- +# Secret redaction -- the single choke point before anything is logged +# --------------------------------------------------------------------------- +_SECRET_KEY = r"(?:password|passwd|passphrase|secret|token|api[_-]?key|private[_-]?key|preshared[_-]?key|psk|credential)" +_SECRET_ASSIGN_RE = re.compile( + r"((?:" + _SECRET_KEY + r")[A-Za-z0-9_.-]*\s*[=:])\s*(\S+)", + re.IGNORECASE, +) +_PEM_LINE_RE = re.compile(r"BEGIN [A-Z0-9 ]*PRIVATE KEY") +_PEM_BLOCK_RE = re.compile( + r"-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----.*?-----END [A-Z0-9 ]*PRIVATE KEY-----", + re.DOTALL, +) + +REDACTED = "" + + +def redact(text: str) -> str: + """Return TEXT with secret-looking values and PEM blocks removed. + + Deliberately blunt: log records are written for every command, so the + sanitizer must be safe for text that was never meant to be a secret. A PEM + header without its matching footer (truncated line, interrupted paste) is + treated as the start of a secret: everything from the header on is dropped, + because a half-copied key is still a key. + """ + if not text: + return text + cleaned = _PEM_BLOCK_RE.sub(REDACTED, text) + header = _PEM_LINE_RE.search(cleaned) + if header: + cleaned = cleaned[:header.start()] + REDACTED + cleaned = _SECRET_ASSIGN_RE.sub(lambda match: match.group(1) + REDACTED, cleaned) + return cleaned + + +# --------------------------------------------------------------------------- +# Audit log +# --------------------------------------------------------------------------- +def fallback_log_path(state_home: Optional[str] = None, home: Optional[str] = None) -> str: + base = state_home or os.environ.get("XDG_STATE_HOME") or os.path.join( + home or os.path.expanduser("~"), ".local", "state" + ) + return os.path.join(base, *config.LOG_FALLBACK_SUBDIR) + + +def _prepare_log_file(path: str) -> bool: + """Create or tighten PATH to mode 600; True when it is usable.""" + directory = os.path.dirname(path) or "." + try: + if os.path.exists(path): + if not os.path.isfile(path) or not os.access(path, os.W_OK): + return False + os.chmod(path, config.LOG_FILE_MODE) + else: + if not os.path.isdir(directory): + os.makedirs(directory, mode=config.LOG_DIR_MODE, exist_ok=True) + if not os.access(directory, os.W_OK): + return False + fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_APPEND, config.LOG_FILE_MODE) + os.close(fd) + os.chmod(path, config.LOG_FILE_MODE) + except OSError: + return False + return _is_private(path) + + +def _is_private(path: str) -> bool: + """True when only the owner can read the log (never log into a world-readable file).""" + try: + mode = os.stat(path).st_mode + except OSError: + return False + return (mode & 0o077) == 0 + + +@dataclass +class AuditLog: + """Append-only audit trail. Never receives raw command output.""" + + requested: str = config.DEFAULT_LOG_FILE + state_home: Optional[str] = None + home: Optional[str] = None + path: Optional[str] = None + ready: bool = False + warning: str = "" + + def initialise(self) -> None: + for candidate in (self.requested, fallback_log_path(self.state_home, self.home)): + if not candidate: + continue + if _prepare_log_file(candidate): + self.path = candidate + self.ready = True + if candidate != self.requested: + self.warning = config.MSG_LOG_FALLBACK.format( + requested=self.requested, fallback=candidate + ) + return + self.ready = False + self.warning = config.MSG_LOG_NONE + + def write(self, level: str, message: str, timestamp: Optional[str] = None) -> None: + if not self.ready or not self.path: + return + stamp = timestamp or _utc_now() + record = "{0} [{1}] {2}\n".format(stamp, level, redact(message)) + try: + with open(self.path, "a", encoding="utf-8") as handle: + handle.write(record) + except OSError: + # A failing log must never break an operator's session. + self.ready = False + + +def _utc_now() -> str: + import datetime + + return datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +# --------------------------------------------------------------------------- +# Execution +# --------------------------------------------------------------------------- +RUN_MODE_RUN = "run" +RUN_MODE_CHECK = "check" +RUN_MODE_CANCEL = "cancel" + + +@dataclass +class RunResult: + argv: List[str] = field(default_factory=list) + executed: bool = False + dry_run: bool = False + check: bool = False + cancelled: bool = False + rc: Optional[int] = None + signal_name: str = "" + + @property + def ok(self) -> bool: + return self.executed and self.rc == 0 + + +def command_string(argv: Sequence[str]) -> str: + """A copy/pasteable shell line (like ``printf %q`` in the bash console).""" + return " ".join(shlex.quote(part) for part in argv) + + +def default_spawn(argv: Sequence[str]) -> int: + """Run ARGV with inherited stdio and return its exit code.""" + try: + completed = subprocess.run(list(argv), check=False) + return completed.returncode + except FileNotFoundError: + return 127 + except PermissionError: + return 126 + except KeyboardInterrupt: + return 130 + + +class Runner: + """Show, confirm and execute commands; record every decision.""" + + def __init__( + self, + console, + audit: Optional[AuditLog] = None, + dry_run: bool = False, + check_mode: bool = False, + spawn: Optional[Callable[[Sequence[str]], int]] = None, + ) -> None: + self.console = console + self.audit = audit or AuditLog() + self.dry_run = dry_run + self.check_mode = check_mode + self._spawn = spawn or default_spawn + + # -- helpers ----------------------------------------------------------- + def show_command(self, argv: Sequence[str], title: str = config.MSG_COMMAND_TITLE) -> str: + printable = command_string(argv) + self.console.section(title) + self.console.write(" " + printable) + self.console.write("") + return printable + + def _check_flag(self, argv: List[str]) -> List[str]: + if "--check" not in argv: + return argv + ["--check"] + return argv + + def _spawn_exit_code(self, argv: Sequence[str]) -> RunResult: + try: + rc = self._spawn(argv) + except KeyboardInterrupt: + return RunResult(argv=list(argv), executed=True, rc=130, signal_name="SIGINT") + return RunResult(argv=list(argv), executed=True, rc=rc) + + # -- public API -------------------------------------------------------- + def run_readonly(self, argv: Sequence[str], title: str) -> RunResult: + """Run a read-only tool: printed, not confirmed (mirrors bf_show_local_cmd).""" + self.show_command(argv, title=title) + if self.dry_run: + self.console.warn(config.MSG_DRY_RUN_WARN) + self.audit.write(config.AUDIT_DRYRUN, command_string(argv)) + return RunResult(argv=list(argv), dry_run=True) + self.audit.write(config.AUDIT_RUN, command_string(argv)) + result = self._spawn_exit_code(argv) + if result.rc == 0: + self.audit.write(config.AUDIT_OK, "exit=0 :: " + command_string(argv)) + else: + self.console.warn(config.MSG_RUN_FAIL.format(rc=result.rc)) + self.audit.write(config.AUDIT_FAIL, "exit={0} :: {1}".format(result.rc, command_string(argv))) + return result + + def confirm_and_run( + self, + argv: Sequence[str], + label: str, + destructive: bool = False, + check_mode: Optional[bool] = None, + ) -> RunResult: + """Print the command, ask, then run it (or cancel / dry-run).""" + self.show_command(argv) + if self.dry_run: + self.console.warn(config.MSG_DRY_RUN_WARN) + self.audit.write(config.AUDIT_DRYRUN, command_string(argv)) + return RunResult(argv=list(argv), dry_run=True) + + if destructive: + self.console.warn(config.MSG_DESTRUCTIVE_WARN.format(label=label)) + self.console.warn(config.MSG_DESTRUCTIVE_SUB) + + mode = self.console.ask_run(config.MSG_RUN_ASK) + if mode == RUN_MODE_RUN: + final = list(argv) + elif mode == RUN_MODE_CHECK: + final = self._check_flag(list(argv)) + self.console.info(config.MSG_CHECK_MODE) + else: + self.console.info(config.MSG_CANCELLED_RUN) + self.audit.write(config.AUDIT_CANCEL, "operatör iptal etti :: " + command_string(argv)) + return RunResult(argv=list(argv), cancelled=True) + + # NOTE: this method does not enforce root. The terminal console gates a + # destructive operation earlier (App.require_root, config.MSG_ROOT_REQUIRED) + # and the GUI gates it at its execution choke point (ui_gui.run_plan). + # Enforcing here as well double-guarded the same rule and fired before + # the console's own message, so the operator saw the wrong explanation. + self.audit.write(config.AUDIT_RUN, command_string(final)) + result = self._spawn_exit_code(final) + result.check = "--check" in final + if result.rc == 0: + self.console.ok(config.MSG_RUN_OK) + self.audit.write(config.AUDIT_OK, "exit=0 :: " + command_string(final)) + else: + self.console.error(config.MSG_RUN_FAIL.format(rc=result.rc)) + self.audit.write(config.AUDIT_FAIL, "exit={0} :: {1}".format(result.rc, command_string(final))) + return result + + # -- checks ------------------------------------------------------------ + @staticmethod + def have_ansible() -> bool: + return _which("ansible-playbook") is not None + + @staticmethod + def have_python() -> bool: + return sys.version_info >= config.MIN_PYTHON + + @staticmethod + def is_root() -> bool: + return os.geteuid() == 0 + + +def _which(name: str) -> Optional[str]: + for directory in os.environ.get("PATH", "").split(os.pathsep): + candidate = os.path.join(directory, name) + if os.path.isfile(candidate) and os.access(candidate, os.X_OK): + return candidate + return None + + + +"""bfos/ui_gui.py -- Blueforce Field OS Turkce masaustu arayuzu (tkinter). + +Ne yapar +-------- +`admin/bf-menu` terminal konsolunun yaptigi isi ayni is mantigi uzerinden bir +gercek pencereye tasir: + + * basit mod : uc buyuk buton -- Kur / Durum / Cikis (+ "Detayli mod"), + * detayli mod: kategori sekmeleri -- Kurulum, Cihaz islemleri, Merkez + hazirligi, Araclar, Cihaz bilgisi, + * hedef secimi: bayi no alani (^[0-9]{8}$ dogrulamali) + dalga grubu listesi, + * her komut CALISTIRILMADAN ONCE gosterilir ve onay ister; yikici islemlerde + AYRICA ikinci onay istenir, production dalgasi icin "production" yazilir, + * komut ciktisi canli olarak kaydirilabilir bir metin kutusuna akar, + * ekran yoksa (SSH/headless) veya tkinter kurulu degilse net TURKCE hata + verir ve terminal menusunu onerir. + +====================================================================== +SOZLESME -- backend arareyuzu (bfos/operations.py ve bfos/runner.py icin) +====================================================================== +Bu dosya is mantigini TAKLIT ETMEZ; onu bir "backend adapter" uzerinden +kullanir. Gercek moduller (bfos.operations, bfos.runner) yazildiginda asagidaki +sozlesmeyi saglamalari yeterlidir; ui_gui.py onlari otomatik olarak adapte eder. + +Sozlesme (bu dosyada tanimli veri tipleriyle ayni alan adlari): + +1) Operasyon listesi + list_operations() -> Sequence[Operation] + ya da OPERATIONS / OPS / OPERATION_CATALOGUE isimli bir dizi. + Operation alanlari: id (str, tekil), label (str, TURKCE ad), + category (str, su bes kategoriden biri: "Kurulum", "Cihaz islemleri", + "Merkez hazirligi", "Araclar", "Cihaz bilgisi"), destructive (bool), + scope ("local"|"simple"|"wave"|"release"), description (str), + playbook (str, sadece filo islemleri icin "bf-*.yml" adi). + +2) Hedef secimi + Target(kind="dealer"|"group"|"all", value="12010193"|"pilot_1"|"all") + - dealer -> Ansible --limit bf-<8 hane>, insan kimligi BF-<8 hane> + - group -> dalga/grup adi; wave/release kapsamli islemler SADECE onayli + bir dalga grubu kabul eder (lab, pilot_1, pilot_2, wave_1, wave_2, + production); release kapsamli islemler tek cihaz veya "all" KABUL ETMEZ. + +3) Komut uretimi (calistirmadan) + build_command(operation, target, options, grants=None, check_mode=False) + -> CommandPlan + CommandPlan: + * commands : her biri bir argv olan demet (satir listesi + `CommandPlan.lines` uzerinden shlex ile uretilir), + * report_lines: SALT-OKUNUR rapor satirlari; commands bos ise hicbir sey + calistirilmaz, satirlar dogrudan gosterilir, + * destructive / requires_root / operation_id / target_label / notes, + * dry_run / check_mode. + options : {secenek_adi: str} (bkz. Operation.options) + grants : {"wave_gate_confirmed"|"production_override"| + "allow_production_reboot"|"fleet_wide": bool} -- operatorun + ACIK onaylari. Bir kapi bayragi yalniz onay verildiginde ve + playbook o degiskeni kullaniyorsa komuta eklenir. + check_mode: True ise komut --check ile uretilir (degisiklik uygulanmaz). + +4) Kapi onaylari (acik onay adimlari) + gate_steps(operation, target) -> Sequence[GateStepInfo] + GateStepInfo(kind="token"|"approval", key, prompt, message, token, unlocks) + - "token" : operator kutulara `token` sozcugunu yazmak zorundadir + (dalga adi, "production", "GATE", "all"), + - "approval" : evet/hayir onayi (yikici ikinci onay dahil), + - unlocks : onay verilince build_command'a gecirilecek grant adlari. + Arayuz onaylarin TAMAMINI sorar; hicbir kapi sessizce gecilmez. + +5) Komut calistirma (cikti + cikis kodu) + run(plan, on_line=None, cancel=None) -> RunResult(exit_code, ok, output) + on_line(str) her cikti satirinda cagrilir (canli akis icin); + cancel threading.Event ile calisan komut sonlandirilir. + +Uyumluluk icin adapter su adlari da dener (sirayla): + katalog : catalogue_rows | ALL_OPERATIONS | list_operations | operations | + get_operations | OPERATIONS | OPS + komut : build_command | build_plan | command_for | build_ansible_cmd + kosum : run | run_plan | run_command | execute +ve donus degerlerini (dict / dataclass / object) normalize eder. + +bfos.operations ve bfos.runner MEVCUTSA (bu repodaki gercek moduller) arayuz +dogrudan onlari kullanir; hicbir kural kopyalanmaz: + katalog : catalogue_rows() / ALL_OPERATIONS + envanter/hedef : Repository + Inventory.load_repository + resolve_target + komut uretimi : build_ansible_command / build_install_command / + build_tool_command / build_extra_vars + kapilar : confirmation_plan + GatesGranted + denetim kaydi : runner.AuditLog (+ runner.redact) + salt-okunur ekranlar: targets_lines / central_*_lines / identity_lines / + state_lines / environment_lines +Gercek moduller yoksa dosya kendi YERLESIK KATALOG'unu kullanir: bu katalog +admin/bf-menu'nun tablosuyla (id, playbook, kapsam, yikici, ek degisken +kurallari) birebir ayni kurallara ve ayni komut uretimine dayanir. +====================================================================== + +Kullanim: + python3 -m bfos.ui_gui # basit mod + python3 -m bfos.ui_gui --full # dogrudan detayli mod + python3 -m bfos.ui_gui --list # pencere acmadan katalogu yazdir + python3 -m bfos.ui_gui --dry-run # komutlari goster, calistirma + +Notlar: + * tkinter Ubuntu'da hazir gelir (paket: python3-tk); indirme gerekmez. + * Bu dosya tkinter olmadan da ice aktarilabilir: yardimci fonksiyonlar + (dogrulama, komut onizleme, yikici siniflama, headless tespiti) tkinter'siz + calisir, bu yuzden statik testler pencere ACMADAN kosar. +""" + +from __future__ import annotations + +import argparse +import json +import os +import queue +import re +import shlex +import shutil +import subprocess +import sys +import threading +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Callable, Mapping, Sequence + +# --------------------------------------------------------------------------- +# Sabitler -- kullanicinin gordugu TUM metinler Turkce +# --------------------------------------------------------------------------- +WINDOW_TITLE = "Blueforce Field OS — Yönetim" +APP_SUBTITLE = "Blueforce saha cihazı yönetimi (Kur / Durum / Bakım)" + +# Basit modda gorunen uc buyuk buton (sira onemli). +SIMPLE_MODE_BUTTONS: tuple[str, ...] = ("Kur", "Durum", "Çıkış") +SIMPLE_MODE_LABEL = "Detaylı mod" +SIMPLE_MODE_BACK_LABEL = "Basit moda dön" + +#: Birincil eylemin metni (docs/33 §9.2 ile ayni kalir). +RUN_BUTTON_LABEL = "Komutu göster ve çalıştır" + +#: Islem listesindeki tur ve durum sutunlari: renk + SOZCUK (renksiz de okunur). +TYPE_WRITE_LABEL = "YIKICI" +TYPE_READ_LABEL = "salt-okunur" +AVAILABLE_LABEL = "açık" +BLOCKED_LABEL = "kapalı — sudo bf" + +#: Komut cikti panelini gizle/goster (kanit erisilebilir kalir, ekrani kaplamaz). +OUTPUT_HIDE_LABEL = "Çıktı panelini gizle" +OUTPUT_SHOW_LABEL = "Çıktı panelini göster" + +# Detayli moddaki kategori sekmeleri (docs/33 §9.2 ile ayni bes kategori). +CATEGORIES: tuple[str, ...] = ( + "Kurulum", + "Cihaz işlemleri", + "Merkez hazırlığı", + "Araçlar", + "Cihaz bilgisi", +) + +# Onayli dalga sirasi (docs/10; admin/lib/targets.sh BF_WAVES ile ayni). +WAVES: tuple[str, ...] = ("lab", "pilot_1", "pilot_2", "wave_1", "wave_2", "production") +PRODUCTION_WAVE = "production" +GATE_TOKEN_RELEASE = "GATE" + +DEALER_PATTERN = re.compile(r"^[0-9]{8}$") +SCOPE_LABELS: Mapping[str, str] = { + "local": "yerel — bu cihaz", + "simple": "filo — tek cihaz/grup (salt-okunur)", + "wave": "filo — dalga kapılı", + "release": "filo — sürüm kapılı (onaylı dalga)", +} + +# admin/lib/targets.sh + admin/bf-menu ile ayni kurallar. +SERVICE_ALLOWLIST: tuple[str, ...] = ( + "blueforce-agent", + "docker", + "ssh", + "sshd", + "systemd-journald", + "cron", +) +SCRIPT_DIRS: tuple[str, ...] = ("/opt/blueforce/bin", "/usr/local/sbin") +MODULE_PATTERN = re.compile(r"^[0-9]{2}-[a-z0-9][a-z0-9._-]*$") +PACKAGE_PIN_PATTERN = re.compile(r"^[A-Za-z0-9][A-Za-z0-9+_.:-]*=.+$") +HOST_PATTERN = re.compile(r"^bf-[0-9]{8}$") +STATE_JSON_PATH = "/var/lib/blueforce/state.json" +STATE_ALLOWED_KEYS: tuple[str, ...] = ( + "phase", + "enrollment_status", + "fleet_status", + "device_id", + "provisioning_id", +) +INSTALL_STATE_PATH = "/var/lib/blueforce/install-state" +INSTALL_LOG_PATH = "/var/log/blueforce-install.log" + +#: --check eklenebilecek yerel komutlar (kurulum betigi ve kapi araclari). +CHECK_CAPABLE_LOCAL_OPS: tuple[str, ...] = ( + "install-preflight", + "install-local", + "install-resume", + "install-module", + "tools-gate-local", + "tools-gate-enrollment", + "tools-gate-ready", +) +DEFAULT_CONSOLE_LOG = "/var/log/blueforce-console.log" +INSTALLER_REL = "scripts/install/blueforce-install.sh" +PLAYBOOK_DIR_REL = "ansible/playbooks" +MENU_REL = "admin/bf-menu" + +TK_PACKAGE_HINT = "sudo apt install -y python3-tk" +# Grafik arayüz açılamadığında kullanılacak yol: aynı bfos uygulamasının +# terminal konsolu. Bash menü (bf-menu) hâlâ yedek olarak durur ama Python +# konsolu ana yoldur, o yüzden önce o önerilir. +TERMINAL_MENU_HINT = "sudo bf --tui" + +# --------------------------------------------------------------------------- +# tkinter -- opsiyonel ice aktarma +# --------------------------------------------------------------------------- +class _MissingTk: + """tkinter yoksa: kullanildigi anda Turkce hata veren yer tutucu. + + Amac iki yonlu: (1) modul tkinter'siz de ice aktarilabilir kalsin, + (2) GUI kodundaki `tk.X`/`ttk.X` tip denetimi gecerli bir nesne gordugu + icin None uzerinden gelen yanlis uyarilar uretilmesin. + """ + + def __getattr__(self, name: str): + raise RuntimeError( + "tkinter kurulu değil (" + TK_IMPORT_ERROR + "). " + f"Kurmak için: {TK_PACKAGE_HINT}" + ) + + +try: # pragma: no cover - ortama bagli + import tkinter as tk + from tkinter import messagebox, ttk + + HAVE_TKINTER = True + TK_IMPORT_ERROR = "" +except Exception as _tk_exc: # pragma: no cover - ortama bagli + HAVE_TKINTER = False + TK_IMPORT_ERROR = str(_tk_exc) + tk = ttk = messagebox = _MissingTk() # type: ignore[assignment] + + +# --------------------------------------------------------------------------- +# Tasarim belirtecleri -- tek kaynak: bfos/ui_theme.py, o da +# web/static/tokens.css'i birebir yansitir. Bu dosya renk/secim/bosluk +# degeri URETMEZ; hepsi temadan gelir (docs/DESIGN.md "Rules"). +# --------------------------------------------------------------------------- +try: + from bfos import ui_theme as theme +except ImportError: # pragma: no cover - dosya paket disinda yuklendiginde + _THEME_DIR = str(Path(__file__).resolve().parent) + if _THEME_DIR not in sys.path: + sys.path.insert(0, _THEME_DIR) + import ui_theme as theme # type: ignore[no-redef] + + +# --------------------------------------------------------------------------- +# Durum sozlugu (docs/DESIGN.md "Status vocabulary") +# --------------------------------------------------------------------------- +#: Bir cihaz durumunun TUM sozcukleri. Renk tek basina anlam tasimaz: her +#: rozet sozcugunu da yazar, liste renksiz de okunur. +DEVICE_STATES: tuple[str, ...] = ("KURULDU", "KAYITLI", "HAZIR", "HATA", "YOK") + +#: Sozcuk -> token anahtari (tema ile ayni esleme). +STATE_KEYS_BY_WORD: Mapping[str, str] = { + word: key for key, word in theme.STATE_WORDS.items() +} + +#: state.json'da bir denetimin dustugunu gosteren isaretler. +FAILURE_MARKERS: tuple[str, ...] = ("FAIL", "HATA", "ERROR", "BOZUK") + +#: Yetki seviyeleri: tam yetki ve salt-okunur GORUNUR birer durumdur. +PRIVILEGE_FULL = "full" +PRIVILEGE_READ_ONLY = "read_only" +PRIVILEGE_WORDS: Mapping[str, str] = { + PRIVILEGE_FULL: "TAM YETKİ", + PRIVILEGE_READ_ONLY: "SALT-OKUNUR", +} + + +def read_state_values(path: str = STATE_JSON_PATH) -> dict[str, str]: + """state.json'u BEYAZ LISTE ile okur (jeton/anahtar alanlari okunmaz). + + Okunamayan/yok dosya bos sozluk doner: cihaz kurulmamis olabilir ve bu bir + hata degil, ``YOK`` durumudur. + """ + try: + with open(path, "r", encoding="utf-8") as handle: + data = json.load(handle) + except (OSError, ValueError): + return {} + if not isinstance(data, dict): + return {} + values: dict[str, str] = {} + for key in STATE_ALLOWED_KEYS: + value = data.get(key) + if value is None or isinstance(value, bool): + continue + values[key] = str(value) + return values + + +def state_word_from_values(values: Mapping[str, str]) -> str: + """state.json alanlarini sozlukteki TEK sozcuge indirger. + + Sira onemli: once HATA (bir denetim dustu), sonra HAZIR (her kanal + dogrulandi), sonra KAYITLI (kaydedildi, kanallar eksik), sonra KURULDU + (kuruldu, henuz kaydedilmedi). Alan yoksa YOK: hic gorulmemis cihaz. + Acik olumsuzlama ("NOT_ENROLLED") kayit SAYILMAZ: o cihaz kaydedilmemistir. + """ + if not values: + return "YOK" + phase = str(values.get("phase", "")).upper() + fleet = str(values.get("fleet_status", "")).upper() + enrollment = str(values.get("enrollment_status", "")).upper() + if any(marker in field for marker in FAILURE_MARKERS + for field in (phase, fleet, enrollment)): + return "HATA" + if any("READY" in field for field in (phase, fleet, enrollment)): + return "HAZIR" + if any(field.endswith("ENROLLED") and not field.startswith(("NOT_", "UN")) + for field in (phase, fleet, enrollment)): + return "KAYITLI" + if phase or fleet or enrollment: + return "KURULDU" + return "YOK" + + +def device_state_word(path: str = STATE_JSON_PATH) -> str: + """Bu cihazin yerel kurulum/kayit durumu (sozluk sozcugu).""" + return state_word_from_values(read_state_values(path)) + + +def state_badge_style(word: str) -> str: + """Sozcukten rozet stilini cozer; bilinmeyen sozcuk notr rozete duser.""" + key = STATE_KEYS_BY_WORD.get(word) + if key is None: + return theme.STATE_BADGE_STYLE["absent"] + return theme.STATE_BADGE_STYLE[key] + + +def privilege_level(root: bool | None = None) -> str: + """'full' ya da 'read_only'; yetki bir durumdur, satir degil.""" + granted = is_root() if root is None else bool(root) + return PRIVILEGE_FULL if granted else PRIVILEGE_READ_ONLY + + +def privilege_word(level: str) -> str: + """Yetki seviyesinin ekranda gorunen sozcugu.""" + return PRIVILEGE_WORDS.get(level, PRIVILEGE_WORDS[PRIVILEGE_READ_ONLY]) + + +def write_blocked_reason(operation) -> str | None: + """Yazma islemi kapaliysa NEDENINI doner; islem calisabilirse None. + + Yazma islemleri yetkisiz oturumda GIZLENMEZ: listede kalir, dugu kapali + cizilir ve nedenin metni dugmenin kendi uzerinde yazar + (docs/DESIGN.md "Privilege"). + """ + if not operation.needs_root: + return None + return None if write_operations_enabled() else NON_ROOT_DISABLED_HINT + + +def operation_is_write(operation) -> bool: + """True when the operation changes the device (catalogue rule: root).""" + return bool(operation.needs_root) + + +# --------------------------------------------------------------------------- +# Veri tipleri (backend sozlesmesi) +# --------------------------------------------------------------------------- +@dataclass(frozen=True) +class OptionSpec: + """Bir islemin ek parametresi (bf-menu'deki -e degiskenleri).""" + + name: str + label: str + kind: str = "text" # text | int | bool | choice + default: str = "" + choices: tuple[str, ...] = () + hint: str = "" + required: bool = False + validator: Callable[[str], "str | None"] | None = None + + +@dataclass(frozen=True) +class Operation: + """Operasyon katalogu kaydi (sozlesme: bkz. dosya basligi).""" + + id: str + label: str + category: str + destructive: bool = False + scope: str = "local" # local | simple | wave | release + description: str = "" + playbook: str = "" + options: tuple[OptionSpec, ...] = () + # None means "not stated": the value is then derived from `destructive` by + # the property below, so a write operation cannot be marked read-only by + # omission. An operation that genuinely differs states the value. + requires_root: bool | None = None + needs_dealer: bool = False + + @property + def needs_root(self) -> bool: + """Whether this operation must run as root to be allowed.""" + if self.requires_root is None: + return bool(self.destructive) + return bool(self.requires_root) + + @property + def is_fleet(self) -> bool: + return self.scope in ("simple", "wave", "release") + + +@dataclass(frozen=True) +class Target: + """Hedef secimi: bayı no, dalga/grup adi ya da tum filo.""" + + kind: str # dealer | group | all + value: str + + @property + def limit(self) -> str: + if self.kind == "dealer": + return dealer_to_host(self.value) + return self.value + + @property + def label(self) -> str: + if self.kind == "dealer": + return f"cihaz {dealer_to_device_id(self.value)} ({dealer_to_host(self.value)})" + if self.kind == "all": + return "tüm filo (envanterdeki her cihaz)" + if is_wave(self.value): + return f"dalga '{self.value}'" + return f"grup '{self.value}'" + + +@dataclass(frozen=True) +class GateStepInfo: + """Calistirmadan once gereken ACIK operator onayi (sozlesme eki). + + kind : "token" (yazilarak) | "approval" (evet/hayir) + token: kind == "token" ise yazilmasi gereken sozcuk + unlocks: onay verilince backend'e gecirilecek bayrak adlari + (or. "wave_gate_confirmed", "production_override") + """ + + kind: str + key: str + prompt: str + message: str = "" + token: str = "" + unlocks: tuple[str, ...] = () + + +@dataclass(frozen=True) +class CommandPlan: + """Calistirilacak komutlar + ekranda gosterilecek satir listesi. + + `report_lines` dolu ve `commands` bos oldugunda plan HICBIR SEY calistirmaz: + rapor satirlari (bfos.operations icindeki salt-okunur ekranlar) dogrudan + gosterilir. + """ + + commands: tuple[tuple[str, ...], ...] = () + destructive: bool = False + requires_root: bool | None = None + operation_id: str = "" + target_label: str = "" + notes: tuple[str, ...] = () + report_lines: tuple[str, ...] = () + dry_run: bool = False + check_mode: bool = False + + @property + def needs_root(self) -> bool: + """Whether running this plan requires root (derived when not stated).""" + if self.requires_root is None: + return bool(self.destructive) + return bool(self.requires_root) + + @property + def lines(self) -> tuple[str, ...]: + """Kopyala/yapistir edilebilir komut satirlari (bf-menu %q ile ayni fikir).""" + return tuple(shlex.join(argv) for argv in self.commands if argv) + + @property + def is_empty(self) -> bool: + return not any(self.commands) and not self.report_lines + + @property + def is_report_only(self) -> bool: + return not any(self.commands) and bool(self.report_lines) + + +@dataclass +class RunResult: + """Komut calistirma sonucu: cikti + cikis kodu (sozlesme maddesi 4).""" + + exit_code: int + ok: bool + output: str = "" + + +class BackendUnavailable(RuntimeError): + """Gercek backend modulu var ama sozlesmeye uymuyor.""" + + +class CommandError(RuntimeError): + """Komut uretilemedi / secenek gecersiz (TURKCE mesaj tasir).""" + + +def _as_int(value: Any, default: int = 1) -> int: + """Farkli backend'lerin cikis kodu tiplerini (int/str/None) guvenle cevirir.""" + try: + return int(value) + except (TypeError, ValueError): + return default + + +# --------------------------------------------------------------------------- +# Saf yardimcilar: birim testleri bunlari pencere ACMADAN kullanir +# --------------------------------------------------------------------------- +def validate_dealer(value: str) -> bool: + """Bayi no kapisi: ^[0-9]{8}$ (docs/02, K-12).""" + return bool(DEALER_PATTERN.match(value or "")) + + +def dealer_error(value: str) -> str | None: + """Gecerli ise None, degilse Turkce hata metni.""" + if validate_dealer(value): + return None + if not value: + return "Bayi numarası boş olamaz. Tam 8 hane, yalnız rakam girin (örn. 12010193)." + if not value.isdigit(): + return "Bayi numarası yalnız rakam içermelidir (harf, boşluk ve işaret kullanılamaz)." + return ( + f"Geçersiz bayi numarası '{value}': tam 8 hane olmalıdır " + f"(verilen uzunluk: {len(value)}). Örnek: 12010193" + ) + + +def dealer_to_host(dealer: str) -> str: + return f"bf-{dealer}" + + +def dealer_to_device_id(dealer: str) -> str: + return f"BF-{dealer}" + + +def host_to_dealer(host: str) -> str | None: + return host[3:] if HOST_PATTERN.match(host or "") else None + + +def is_wave(name: str) -> bool: + return name in WAVES + + +def validate_wave(value: str) -> str | None: + """Dalga adini dogrular; gecerliyse None doner.""" + if value in WAVES: + return None + return ( + f"Geçersiz dalga '{value}'. Onaylı dalgalar (sırayla): {', '.join(WAVES)}." + ) + + +def validate_disk_pct(value: str) -> str | None: + if value == "": + return None + if not value.isdigit() or not (1 <= int(value) <= 100): + return "Eşik 1 ile 100 arasında bir tam sayı olmalıdır." + return None + + +def validate_grace(value: str) -> str | None: + if value == "": + return None + if not value.isdigit(): + return "Bekleme süresi saniye cinsinden bir tam sayı olmalıdır (örn. 300)." + return None + + +def validate_log_lines(value: str) -> str | None: + if value == "": + return None + if not value.isdigit() or int(value) < 1: + return "Satır sayısı pozitif bir tam sayı olmalıdır (örn. 500)." + return None + + +def validate_service_name(value: str) -> str | None: + if value in SERVICE_ALLOWLIST: + return None + return ( + f"'{value}' izinli servis listesinde değil. İzinli olanlar: " + f"{', '.join(SERVICE_ALLOWLIST)}." + ) + + +def validate_script_path(value: str) -> str | None: + if not value: + return "Script yolu boş olamaz." + if not value.startswith("/"): + return "Script yolu mutlak olmalıdır (örn. /opt/blueforce/bin/kontrol.sh)." + if not any(value == d or value.startswith(d + "/") for d in SCRIPT_DIRS): + return ( + "Script yolu izinli dizinlerin dışında. İzinli dizinler: " + f"{', '.join(SCRIPT_DIRS)}." + ) + return None + + +def validate_package_pins(value: str) -> str | None: + if not value.strip(): + return "En az bir paket sürümü gerekir (biçim: paket=sürüm)." + for pin in value.split(","): + pin = pin.strip() + if not pin: + continue + if not PACKAGE_PIN_PATTERN.match(pin): + return ( + f"Geçersiz pin '{pin}': 'paket=sürüm' biçiminde olmalıdır " + "(örn. docker-ce=5:27.0.3-1~ubuntu.24.04~noble)." + ) + return None + + +def validate_module_name(value: str) -> str | None: + if not value: + return "Modül numarası boş olamaz (örn. 01-precheck)." + if not MODULE_PATTERN.match(value): + return ( + f"Geçersiz modül '{value}': '01-precheck' biçiminde olmalıdır " + "(iki hane, tire, küçük harfli ad)." + ) + return None + + +def validate_expected_version(value: str) -> str | None: + if value == "": + return None + if any(ch.isspace() for ch in value): + return "Sürüm boşluk içermemelidir (örn. 1.0.0)." + return None + + +# --------------------------------------------------------------------------- +# Headless / tkinter hatalari -- net TURKCE yonlendirme +# --------------------------------------------------------------------------- +def headless_error(env: Mapping[str, str] | None = None) -> str | None: + """Ekran yoksa Turkce aciklama doner; ekran varsa None. + + Sadece DISPLAY / WAYLAND_DISPLAY ortam degiskenlerine bakar, boylece + pencere acmadan test edilebilir. + """ + data = os.environ if env is None else env + if data.get("DISPLAY") or data.get("WAYLAND_DISPLAY"): + return None + return ( + "Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil).\n" + "\n" + "SSH veya başsız (headless) bir oturumda masaüstü penceresi açılamaz.\n" + "Bu durumda terminal menüsünü kullanın:\n" + f"\n {TERMINAL_MENU_HINT}\n" + "\n" + "Yerel ekranda çalıştırmak için oturum açık bir makinede deneyin:\n" + " python3 -m bfos.ui_gui\n" + ) + + +def tkinter_missing_message(error: str = "") -> str: + """tkinter kurulu degilse Turkce hata + kurulum ipucu.""" + detail = f" (teknik ayrıntı: {error})" if error else "" + return ( + "tkinter bulunamadı; masaüstü arayüzü başlatılamıyor" + f"{detail}.\n" + "\n" + "Bu, minimal kurulumlarda sık görülür: tkinter ayrı bir sistem paketidir.\n" + "Ubuntu/Debian üzerinde kurmak için:\n" + f"\n {TK_PACKAGE_HINT}\n" + " sudo apt update && sudo apt install -y python3-tk\n" + "\n" + f"tkinter kurmak istemiyorsanız terminal menüsünü kullanın: {TERMINAL_MENU_HINT}\n" + ) + + +def window_start_error(exc: BaseException) -> str: + """Tk() acilamazsa (DISPLAY var ama X/Wayland erisilemiyor) Turkce mesaj.""" + return ( + "Pencere açılamadı; grafik oturumuna erişilemiyor.\n" + f"Teknik ayrıntı: {exc}\n" + "\n" + "Muhtemel nedenler:\n" + " * SSH oturumundasınız ve X yönlendirmesi (ssh -X) yok,\n" + " * ekran kilitli veya grafik oturum kapalı,\n" + " * başka bir kullanıcının X sunucusuna bağlanmaya çalışıyorsunuz.\n" + f"\nTerminal menüsünü kullanın: {TERMINAL_MENU_HINT}\n" + ) + + +# --------------------------------------------------------------------------- +# Onizleme metni (onay pencereleri ve kayit icin tek kaynak) +# --------------------------------------------------------------------------- +def preview_text( + plan: CommandPlan, + *, + operation: Operation | None = None, + target: Target | None = None, +) -> str: + """Calistirilacak komutu gosteren Turkce onay metni.""" + parts: list[str] = [] + if plan.is_report_only: + parts.append("Bu ekran komut çalıştırmaz; salt-okunur rapor gösterir:") + parts.append("") + for line in plan.report_lines: + parts.append(f" {line}") + parts.append("") + else: + parts.append("Çalıştırılacak komut(lar):") + parts.append("") + if plan.is_empty: + parts.append(" (komut üretilemedi)") + for line in plan.lines: + parts.append(f" {line}") + parts.append("") + if operation is not None: + parts.append(f"İşlem : {operation.label} [{operation.id}]") + parts.append(f"Kapsam : {SCOPE_LABELS.get(operation.scope, operation.scope)}") + if operation.description: + parts.append(f"Açıklama: {operation.description}") + if target is not None: + parts.append(f"Hedef : {target.label}") + elif plan.target_label: + parts.append(f"Hedef : {plan.target_label}") + if plan.needs_root: + parts.append("Yetki : root gerekir — konsolu sudo ile açın.") + if plan.check_mode: + parts.append("Kip : --check (deneme) — hiçbir değişiklik uygulanmaz.") + if plan.dry_run: + parts.append("Kip : DENEME (--dry-run) — komut çalıştırılmaz, yalnız gösterilir.") + if plan.destructive: + parts.append("") + parts.append("UYARI: Bu YIKICI bir işlemdir; seçili hedefte değişiklik yapar.") + for note in plan.notes: + parts.append(f"Not : {note}") + return "\n".join(parts) + + +def destructive_operations( + operations: Sequence[Operation] | None = None, +) -> tuple[str, ...]: + """Yikici isaretli operasyonlarin id'leri.""" + ops = OPERATIONS if operations is None else operations + return tuple(op.id for op in ops if op.destructive) + + +def operation_is_destructive(operation_id: str) -> bool: + op = operation_by_id(operation_id) + return bool(op and op.destructive) + + +# --------------------------------------------------------------------------- +# Yerlesik katalog -- admin/bf-menu tablosuyla ayni id/kapsam/yikici degerleri +# (kaynak: admin/bf-menu BF_OPS_REPORT / BF_OPS_MAINTENANCE) +# --------------------------------------------------------------------------- +_FLEET_OPTIONS: Mapping[str, tuple[OptionSpec, ...]] = { + "disk": ( + OptionSpec( + "disk_warn_pct", + "Uyarı eşiği (%)", + kind="int", + default="", + hint="Boş = playbook varsayılanı (80)", + validator=validate_disk_pct, + ), + ), + "fieldos-version": ( + OptionSpec( + "fieldos_expected_version", + "Beklenen Field OS sürümü", + default="", + hint="Boş = drift denetimi atlanır", + validator=validate_expected_version, + ), + ), + "service-restart": ( + OptionSpec( + "service_name", + "Servis adı", + kind="choice", + choices=SERVICE_ALLOWLIST, + required=True, + hint="Yalnız izinli servis adları", + validator=validate_service_name, + ), + ), + "run-script": ( + OptionSpec( + "script_path", + "Script yolu", + required=True, + hint=f"İzinli dizinler: {', '.join(SCRIPT_DIRS)}", + validator=validate_script_path, + ), + OptionSpec("script_args", "Script argümanları", default="", hint="İsteğe bağlı"), + ), + "collect-logs": ( + OptionSpec( + "log_lines", + "Cihaz başına journal satırı", + kind="int", + default="500", + validator=validate_log_lines, + ), + ), + "reboot": ( + OptionSpec( + "reboot_grace_seconds", + "Yeniden başlatma bekleme süresi (saniye)", + kind="int", + default="300", + validator=validate_grace, + ), + ), + "deploy-update": ( + OptionSpec( + "update_packages", + "Paket pinleri (paket=sürüm, virgülle)", + required=True, + hint="Örn. docker-ce=5:27.0.3-1~ubuntu.24.04~noble", + validator=validate_package_pins, + ), + ), +} + +OPERATIONS: tuple[Operation, ...] = ( + # --- Kurulum (bu cihaz; filo cihazina DOKUNMAZ) ------------------------ + Operation( + "install-preflight", + "Kurulum ön kontrolü (--check)", + "Kurulum", + destructive=False, + scope="local", + description="Hiçbir şey yazmadan kurulum ön koşullarını raporlar.", + needs_dealer=True, + ), + Operation( + "install-local", + "Bu cihazı kur", + "Kurulum", + destructive=True, + scope="local", + description="Cihazı kurar, hostname'i bf- yapar.", + requires_root=True, + needs_dealer=True, + options=( + OptionSpec("offline", "Yerel çevrimdışı depodan kur (--offline)", kind="bool"), + OptionSpec("resume", "Zaten OK olan modülleri atla (--resume)", kind="bool"), + ), + ), + Operation( + "install-resume", + "Başarısız kuruluma devam et (--resume)", + "Kurulum", + destructive=True, + scope="local", + description="Yarıda kalan kurulumu idempotent biçimde sürdürür.", + requires_root=True, + needs_dealer=True, + ), + Operation( + "install-module", + "Tek modül çalıştır (--only)", + "Kurulum", + destructive=True, + scope="local", + description="Kurulumun tek bir modülünü çalıştırır.", + requires_root=True, + needs_dealer=True, + options=( + OptionSpec( + "only", + "Modül", + required=True, + hint="Örn. 01-precheck", + validator=validate_module_name, + ), + ), + ), + Operation( + "install-state", + "Kurulum modül durumu", + "Kurulum", + destructive=False, + scope="local", + description="Kurulumun hangi modülde kaldığını gösterir (salt-okunur).", + ), + Operation( + "install-log", + "Kurulum günlüğü (son 40 satır)", + "Kurulum", + destructive=False, + scope="local", + description="Kurulum günlüğünün sonunu gösterir (salt-okunur).", + ), + # --- Cihaz islemleri: salt-okunur raporlar ----------------------------- + Operation("ping", "Ping / erişilebilirlik", "Cihaz işlemleri", False, "simple", + "SSH erişilebilirliği (salt-okunur).", "bf-ping.yml"), + Operation("uptime", "Çalışma süresi ve yük", "Cihaz işlemleri", False, "simple", + "Uptime ve yük ortalaması (salt-okunur).", "bf-uptime.yml"), + Operation("disk", "Disk kullanımı", "Cihaz işlemleri", False, "simple", + "Disk kullanımı; eşik üstünde uyarır.", "bf-disk-check.yml", + options=_FLEET_OPTIONS["disk"]), + Operation("docker", "Docker durumu", "Cihaz işlemleri", False, "simple", + "Docker servisi ve konteynerler (salt-okunur).", "bf-docker-status.yml"), + Operation("packages", "Kurulu paket sürümleri", "Cihaz işlemleri", False, "simple", + "Pinlenmiş paketlerin kurulu sürümleri.", "bf-package-check.yml"), + Operation("security-updates", "Bekleyen güvenlik güncellemeleri", "Cihaz işlemleri", + False, "simple", "Yalnız rapor; hiçbir güncelleme kurmaz.", + "bf-security-updates-check.yml"), + Operation("provisioning-status", "Kurulum fazı raporu", "Cihaz işlemleri", False, + "wave", "Cihaz başına state.json fazı.", "bf-provisioning-status.yml"), + Operation("enrollment-status", "Kayıt (enrollment) ve merkez kanıtı", + "Cihaz işlemleri", False, "wave", + "ENROLLED/READY iddialarını merkezi kanıta karşı denetler.", + "bf-enrollment-status.yml"), + Operation("fieldos-version", "Field OS sürüm raporu", "Cihaz işlemleri", False, "wave", + "Sürüm bilgisi; istenirse drift denetimi.", "bf-fieldos-version.yml", + options=_FLEET_OPTIONS["fieldos-version"]), + Operation("remote-channels", "Uzak erişim kanalları", "Cihaz işlemleri", False, "wave", + "SSH/xRDP/RustDesk/WireGuard hazırlığı.", "bf-remote-channels-check.yml"), + Operation("offline-ready", "Çevrimdışı hazırlık raporu", "Cihaz işlemleri", False, "wave", + "Offline provisioning yerel ön koşulları.", "bf-offline-ready-check.yml"), + # --- Cihaz islemleri: bakim (yikici olanlar isaretli) ------------------- + Operation("rdp-restart", "xRDP servisini yeniden başlat", "Cihaz işlemleri", True, + "simple", "xRDP servisini yeniden başlatır (RDP açık kalır).", + "bf-rdp-restart.yml"), + Operation("rustdesk-restart", "RustDesk servisini yeniden başlat", "Cihaz işlemleri", + True, "simple", "RustDesk servisini yeniden başlatır.", "bf-rustdesk-restart.yml"), + Operation("wireguard-restart", "WireGuard (wg0) yeniden başlat", "Cihaz işlemleri", True, + "simple", "wg-quick@wg0 servisini yeniden başlatır.", "bf-wireguard-restart.yml"), + Operation("service-restart", "İzinli servisi yeniden başlat", "Cihaz işlemleri", True, + "simple", "Yalnız izinli servis adlarını yeniden başlatır.", + "bf-service-restart.yml", options=_FLEET_OPTIONS["service-restart"]), + Operation("gui-off", "Yerel grafik oturumu kapat (headless)", "Cihaz işlemleri", True, + "wave", "Dalgayı multi-user.target'e alır; xRDP'yi durdurmaz.", "bf-gui-off.yml"), + Operation("gui-on", "Yerel grafik oturumu aç (bakım)", "Cihaz işlemleri", True, "wave", + "Grafik oturumu yeniden açar (bakım için).", "bf-gui-on.yml"), + Operation("collect-logs", "Günlük topla / destek paketi", "Cihaz işlemleri", False, + "wave", "Zaman damgalı journal + destek paketi üretir.", "bf-collect-logs.yml", + options=_FLEET_OPTIONS["collect-logs"]), + Operation("run-script", "Onaylı script çalıştır", "Cihaz işlemleri", True, "wave", + "Yalnız onaylı dizinlerdeki scriptleri çalıştırır.", "bf-run-script.yml", + options=_FLEET_OPTIONS["run-script"]), + Operation("reboot", "Kontrollü yeniden başlatma", "Cihaz işlemleri", True, "release", + "Seri yeniden başlatma + sağlık kapısı.", "bf-reboot.yml", + options=_FLEET_OPTIONS["reboot"]), + Operation("deploy-update", "Onaylı paket güncellemesi", "Cihaz işlemleri", True, + "release", "package=sürüm pinleri + dalga ve sağlık kapıları.", + "bf-deploy-update.yml", options=_FLEET_OPTIONS["deploy-update"]), + # --- Merkez hazirligi (salt-okunur denetim; merkez SUNUCUSU kurulmaz) --- + Operation("central-targets", "Envanter hedefleri (dalga/grup/cihaz sayıları)", + "Merkez hazırlığı", False, "local", + "Envanteri ve dalga gruplarını listeler; hiçbir cihaza dokunmaz."), + Operation("central-placeholders", "Doldurulmamış PLACEHOLDER denetimi", + "Merkez hazırlığı", False, "local", + "group_vars/all.yml içinde kalan PLACEHOLDER değerlerini gösterir."), + Operation("central-endpoints", "Yapılandırılmış merkez uç noktaları", + "Merkez hazırlığı", False, "local", + "WireGuard hub, izleme ve depo uç noktalarını (secret hariç) gösterir."), + Operation("central-checklist", "Merkez hazırlık kontrol listesi", + "Merkez hazırlığı", False, "local", + "Kayıttan önce merkezde var olması gerekenleri hatırlatır."), + # --- Araclar ----------------------------------------------------------- + Operation("tools-catalogue", "İşlem kataloğunu göster (--list)", "Araçlar", False, + "local", "Konsolun işlem kataloğunu listeler."), + Operation("tools-git-pull", "Bu kopyayı güncelle (git pull --ff-only)", "Araçlar", True, + "local", "Depo kopyasını ileri sarar; yerel değişikliği silmez."), + Operation("tools-gate-local", "Yerel çevrimdışı kapısı (bf-check-local)", "Araçlar", + False, "local", "Cihazın çevrimdışı kurulum ön koşullarını denetler."), + Operation("tools-gate-enrollment", "Kayıt kapısı (bf-check-enrollment)", "Araçlar", + False, "local", "Kayıt (enrollment) ön koşullarını denetler."), + Operation("tools-gate-ready", "Teslim kapısı (bf-check-ready)", "Araçlar", False, + "local", "Cihazın READY olabilmesi için gerekenleri denetler."), + Operation("tools-diagnostics", "Derin teşhis (bf-diagnostics)", "Araçlar", False, + "local", "Kapsamlı teşhis raporu üretir (salt-okunur)."), + Operation("tools-release", "Field OS sürüm kimliği (bf-release)", "Araçlar", False, + "local", "Cihazdaki Field OS sürümünü gösterir."), + Operation("tools-support-bundle", "Destek paketi oluştur", "Araçlar", False, "local", + "Parola/anahtar içermeyen destek paketi üretir."), + Operation("tools-console-log", "Konsol denetim günlüğü (son 40 satır)", "Araçlar", + False, "local", "Operatör konsolunun denetim günlüğünü gösterir."), + # --- Cihaz bilgisi (salt-okunur) --------------------------------------- + Operation("info-summary", "Durum özeti (sağlık + kurulum durumu)", "Cihaz bilgisi", + False, "local", + "bf-status, whitelist'li state.json alanları ve envanter hedefleri."), + Operation("info-identity", "Kimlik (hostname, cihaz no)", "Cihaz bilgisi", False, + "local", "Makine adı ve cihaz kimliği."), + Operation("info-network", "Ağ (adres, rota, DNS, WireGuard)", "Cihaz bilgisi", False, + "local", "Ağ arayüzleri, varsayılan rota, DNS ve WireGuard durumu."), + Operation("info-resources", "Disk, bellek, yük", "Cihaz bilgisi", False, "local", + "Dosya sistemleri, bellek ve yük ortalaması."), + Operation("info-packages", "Kurulu pinlenmiş paketler", "Cihaz bilgisi", False, "local", + "docker-ce, wireguard, rustdesk, xrdp, openssh-server sürümleri."), + Operation("info-services", "Servis durumu", "Cihaz bilgisi", False, "local", + "ssh, xrdp, rustdesk, docker, wg-quick@wg0, cron durumu."), + Operation("info-journal", "Son journal hataları", "Cihaz bilgisi", False, "local", + "journalctl -p err son 20 satır."), + Operation("info-state", "Kurulum/kayıt durumu (state.json beyaz liste)", "Cihaz bilgisi", + False, "local", + "Yalnız kimlik/durum alanları okunur; token ve anahtar asla gösterilmez."), +) + +_OPERATION_INDEX: Mapping[str, Operation] = {op.id: op for op in OPERATIONS} + + +def operation_by_id(operation_id: str) -> Operation | None: + return _OPERATION_INDEX.get(operation_id) + + +def operations_by_category(category: str) -> tuple[Operation, ...]: + return tuple(op for op in OPERATIONS if op.category == category) + + +# --------------------------------------------------------------------------- +# Yardimci: yol cozumleme (admin/bf-menu ile ayni kurallar) +# --------------------------------------------------------------------------- +def repo_root_from_file() -> Path: + """bfos/ui_gui.py -> depo koku (bir ust dizin).""" + return Path(__file__).resolve().parents[1] + + +def resolve_inventory(repo_root: Path, explicit: str | None = None) -> Path | None: + if explicit: + candidate = Path(explicit).expanduser() + return candidate if candidate.is_file() else None + base = repo_root / "ansible" / "inventory" + for name in ("hosts.yml", "hosts.yaml", "hosts", "hosts.ini"): + candidate = base / name + if candidate.is_file(): + return candidate + return None + + +def resolve_tool(name: str, repo_root: Path | None = None) -> str | None: + """admin/bf-menu bf_tool_path ile ayni sira: /usr/local/bin, sonra depo.""" + system = Path("/usr/local/bin") / name + if system.is_file() and os.access(system, os.X_OK): + return str(system) + root = repo_root or repo_root_from_file() + for sub in ("scripts/diagnostics", "scripts/maintenance"): + candidate = root / sub / name + if candidate.is_file() and os.access(candidate, os.X_OK): + return str(candidate) + return None + + +def playbook_path(repo_root: Path, playbook: str) -> Path: + return repo_root / PLAYBOOK_DIR_REL / playbook + + +def playbook_declares_var(path: Path, var: str) -> bool: + """Playbook dosyasi VAR'i (yorum satirlari haric) kullaniyor mu? + + admin/bf-menu -> bf_playbook_var_present ile ayni fikir: playbook kendi + kapisinin kaynagi kalir, konsol onu varsaymaz. + """ + try: + text = path.read_text(encoding="utf-8", errors="replace") + except OSError: + return False + pattern = re.compile(rf"\b{re.escape(var)}\b") + for line in text.splitlines(): + stripped = line.lstrip() + if stripped.startswith("#"): + continue + if pattern.search(line): + return True + return False + + +def playbook_scope(path: Path) -> str: + """Playbook'un kendi beyan ettigi kapsam: release | wave | simple.""" + if playbook_declares_var(path, "release_wave"): + return "release" + if playbook_declares_var(path, "operation_wave"): + return "wave" + return "simple" + + +def parse_inventory(path: Path) -> dict[str, list[str]]: + """Salt-okunur envanter okuma: {grup: [host, ...]}. + + admin/lib/targets.sh -> bf_inventory_pairs awk okuyucusunun Python + karsiligi: `hosts:` bloklarini iceren en yakin grup anahtari kullanilir. + Amac yalnizca hedef listesi/dalga listesi doldurmak; hicbir sey yazilmaz. + """ + groups: dict[str, list[str]] = {} + stack: list[tuple[int, str]] = [] + hosts_indent: int | None = None + hosts_step: int | None = None + hosts_group = "" + try: + lines = path.read_text(encoding="utf-8", errors="replace").splitlines() + except OSError: + return groups + + for raw in lines: + if raw.lstrip().startswith("#") or not raw.strip() or raw.lstrip().startswith("-"): + continue + if ":" not in raw: + continue + indent = len(raw) - len(raw.lstrip(" ")) + key, _, value = raw.partition(":") + key = key.strip().strip("\"'") + value = value.strip().strip("\"'") + if not key: + continue + while stack and stack[-1][0] >= indent: + stack.pop() + + if key == "hosts" and value == "": + hosts_indent = indent + hosts_step = None + hosts_group = stack[-1][1] if stack else "" + stack.append((indent, key)) + continue + if hosts_indent is not None and indent <= hosts_indent: + hosts_indent = None + hosts_step = None + + if hosts_indent is not None and indent > hosts_indent: + if hosts_step is None: + hosts_step = indent + if indent == hosts_step and hosts_group: + groups.setdefault(hosts_group, []).append(key) + stack.append((indent, key)) + continue + if value == "": + stack.append((indent, key)) + return groups + + +def waves_in_inventory(groups: Mapping[str, Sequence[str]]) -> tuple[str, ...]: + """Envanterde gercekten bulunan onayli dalgalar (yayilim sirasiyla).""" + return tuple(wave for wave in WAVES if groups.get(wave)) + + +def device_wave(host: str, groups: Mapping[str, Sequence[str]]) -> str | None: + for wave in WAVES: + if host in (groups.get(wave) or ()): + return wave + return None + + +# --------------------------------------------------------------------------- +# Komut calistirma (sozlesme maddesi 4) +# --------------------------------------------------------------------------- +def run_command( + argv: Sequence[str], + on_line: Callable[[str], None] | None = None, + cancel: threading.Event | None = None, + cwd: str | None = None, +) -> RunResult: + """Tek komutu calistirir; ciktisi satir satir `on_line`'a akar.""" + argv = [str(a) for a in argv] + if not argv: + return RunResult(2, False, "Boş komut çalıştırılamaz.") + emit = on_line or (lambda _line: None) + try: + proc = subprocess.Popen( # noqa: S603 - argv listesi, shell yok + argv, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + cwd=cwd, + ) + except FileNotFoundError: + message = ( + f"Komut bulunamadı: '{argv[0]}' bu cihazda kurulu değil. " + "Araçları bağlamak için: sudo admin/bf-bootstrap.sh" + ) + emit(message) + return RunResult(127, False, message + "\n") + except OSError as exc: + message = f"Komut başlatılamadı: {' '.join(argv)} ({exc})" + emit(message) + return RunResult(126, False, message + "\n") + + collected: list[str] = [] + assert proc.stdout is not None + for line in proc.stdout: + collected.append(line) + emit(line.rstrip("\n")) + if cancel is not None and cancel.is_set(): + proc.terminate() + note = "Kullanıcı iptal etti; komut sonlandırıldı." + collected.append(note + "\n") + emit(note) + break + exit_code = proc.wait() + return RunResult(exit_code, exit_code == 0, "".join(collected)) + + +def run_plan( + plan: CommandPlan, + on_line: Callable[[str], None] | None = None, + cancel: threading.Event | None = None, + cwd: str | None = None, +) -> RunResult: + """Plan icindeki komutlari sirayla calistirir; ilk hatada DURUR. + + (Wave akisindaki "bir dalga basarisizsa sonraki dalgaya gecme" kuralinin + basit karsiligi: hata sonrasi komut calistirilmaz.) + """ + emit = on_line or (lambda _line: None) + if plan.is_empty: + return RunResult(2, False, "Çalıştırılacak komut yok.\n") + if plan.is_report_only: + for line in plan.report_lines: + emit(line) + return RunResult(0, True, "\n".join(plan.report_lines) + "\n") + if plan.dry_run: + for line in plan.lines: + emit(f"[deneme] {line}") + return RunResult(0, True, "[deneme] komut çalıştırılmadı.\n") + if plan.needs_root and not write_operations_enabled(): + # Last line of defence: every execution path funnels through this + # function, so the root rule holds even if a future caller builds the + # plan itself instead of going through the GUI's run button. + emit("[ENGELLENDİ] " + NON_ROOT_DISABLED_HINT) + return RunResult(2, False, NON_ROOT_DISABLED_HINT + "\n") + + chunks: list[str] = [] + for index, argv in enumerate(plan.commands, start=1): + if not argv: + continue + if len(plan.commands) > 1: + emit(f"--- [{index}/{len(plan.commands)}] {shlex.join(argv)}") + result = run_command(argv, on_line=emit, cancel=cancel, cwd=cwd) + chunks.append(result.output) + if not result.ok: + emit(f"[HATA] Komut {result.exit_code} koduyla bitti: {shlex.join(argv)}") + return RunResult(result.exit_code, False, "".join(chunks)) + return RunResult(0, True, "".join(chunks)) + + +# --------------------------------------------------------------------------- +# Backend: yerlesik katalog (admin/bf-menu kurallari) + gercek modul adapteri +# --------------------------------------------------------------------------- +@dataclass +class GuiContext: + """Arayuzun calisma baglami (yol ve kip bilgisi).""" + + repo_root: Path = field(default_factory=repo_root_from_file) + inventory: Path | None = None + console_log: str = DEFAULT_CONSOLE_LOG + dry_run: bool = False + + @classmethod + def detect(cls, repo: str | None = None, inventory: str | None = None, + dry_run: bool = False) -> "GuiContext": + root = Path(repo).expanduser().resolve() if repo else repo_root_from_file() + return cls( + repo_root=root, + inventory=resolve_inventory(root, inventory), + console_log=os.environ.get("BF_CONSOLE_LOG", DEFAULT_CONSOLE_LOG), + dry_run=dry_run, + ) + + +class CatalogueBackend: + """Yerlesik katalog: admin/bf-menu'nun tablosu + komut uretimi. + + Gercek moduller (bfos.operations / bfos.runner) yoksa arayuz bunu kullanir; + boylece GUI, backend yazilmadan once de dogru komutu gosterip calistirabilir. + """ + + name = "yerleşik katalog (admin/bf-menu kuralları)" + + def __init__(self, ctx: GuiContext): + self.ctx = ctx + self._groups: dict[str, list[str]] | None = None + + # -- envanter (salt-okunur) ------------------------------------------- + @property + def groups(self) -> dict[str, list[str]]: + if self._groups is None: + self._groups = ( + parse_inventory(self.ctx.inventory) if self.ctx.inventory else {} + ) + return self._groups + + def list_operations(self) -> tuple[Operation, ...]: + return OPERATIONS + + def list_waves(self) -> tuple[str, ...]: + present = waves_in_inventory(self.groups) + return present or WAVES + + def inventory_note(self) -> str: + if self.ctx.inventory is None: + note = ( + "Ansible envanteri bulunamadı (ansible/inventory/hosts.yml). " + "Filo işlemleri için envanteri oluşturun: " + "cp ansible/inventory/hosts.example.yml ansible/inventory/hosts.yml" + ) + else: + note = f"Envanter: {self.ctx.inventory}" + if shutil.which("ansible-playbook") is None: + note += ( + " | UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz " + "(sudo apt install ansible)." + ) + return note + + # -- hedef ------------------------------------------------------------- + def validate_target(self, operation: Operation, target: Target) -> str | None: + if target.kind == "dealer": + problem = dealer_error(target.value) + if problem: + return problem + if operation.scope in ("wave", "release"): + if target.kind == "dealer": + if self.ctx.inventory is None: + return ( + "Bu işlem dalga kapılıdır ve cihazın dalgasını çözmek için " + "envanter gerekir; envanter bulunamadı." + ) + wave = device_wave(dealer_to_host(target.value), self.groups) + if not wave: + return ( + f"{dealer_to_host(target.value)} onaylı bir dalga grubunda değil " + f"({', '.join(WAVES)}). Önce cihazı dalgasına ekleyin." + ) + elif target.kind == "all": + if operation.scope == "release": + return ( + "Sürüm kapılı işlemler tüm filo ile çalıştırılamaz: " + "onaylı bir dalga grubu seçin (dalga dalga yayılım)." + ) + elif target.kind == "group" and not is_wave(target.value): + return ( + f"'{target.value}' onaylı bir dalga değil. Dalga kapılı işlemler " + f"şu dalgalardan birini ister: {', '.join(WAVES)}." + ) + return None + + def target_wave(self, operation: Operation, target: Target) -> str | None: + if target.kind == "group" and is_wave(target.value): + return target.value + if target.kind == "dealer": + return device_wave(dealer_to_host(target.value), self.groups) + return None + + # -- kapilar (acik onay adimlari) --------------------------------------- + def gate_steps( + self, operation: Operation, target: Target | None + ) -> tuple[GateStepInfo, ...]: + """Calistirmadan once sorulacak ACIK onaylar (bf-menu ile ayni kurallar). + + Hicbir kapi sessizce gecilmez: dalga adi yazdirilir, production icin + ayrica `production` yazilir, surum kapisi icin GATE yazilir, yikici + islemler icin ikinci onay istenir. + """ + steps: list[GateStepInfo] = [] + wave = self.target_wave(operation, target) if target else None + book = ( + playbook_path(self.ctx.repo_root, operation.playbook) + if operation.playbook + else None + ) + gate_supported = bool(book and playbook_declares_var(book, "wave_gate_confirmed")) + + if operation.scope in ("wave", "release") and wave: + if wave == PRODUCTION_WAVE: + steps.append( + GateStepInfo( + kind="token", + key="production_token", + prompt="PRODUCTION onayı — canlı filo", + message=( + "Seçilen dalga canlı filodur (production).\n" + "Onaylamak için kutuya 'production' yazın; başka bir şey iptal eder." + + ("\nEk olarak dalga kapısı bayrağı onaylanacak." if gate_supported else "") + ), + token=PRODUCTION_WAVE, + unlocks=("wave_gate_confirmed",) if gate_supported else (), + ) + ) + steps.append( + GateStepInfo( + kind="approval", + key="production_approval", + prompt="Production ek onayı", + message=( + "production_override / allow_production_reboot bayrakları " + "yalnız bu onayla eklenir (playbook ilgili değişkeni " + "kullanıyorsa).\nDevam edilsin mi?" + ), + unlocks=("production_override", "allow_production_reboot"), + ) + ) + elif operation.scope == "release" and gate_supported: + steps.append( + GateStepInfo( + kind="token", + key="wave_gate_token", + prompt=f"Sürüm kapısı onayı (dalga: {wave})", + message=( + f"'{wave}' dalgası için sürüm kapısını onaylıyorsunuz.\n" + f"Önceki dalga sağlık kapısını geçtiyse '{GATE_TOKEN_RELEASE}' yazın." + ), + token=GATE_TOKEN_RELEASE, + unlocks=("wave_gate_confirmed",), + ) + ) + if target is not None and target.kind == "all" and operation.scope == "simple": + steps.append( + GateStepInfo( + kind="token", + key="fleet_token", + prompt="FİLO GENELİ onayı", + message=( + "Komut envanterdeki HER cihaza uygulanacak.\n" + "Onaylamak için kutuya 'all' yazın." + ), + token="all", + unlocks=("fleet_wide",), + ) + ) + if operation.destructive: + steps.append( + GateStepInfo( + kind="approval", + key="destructive_approval", + prompt="İKİNCİ ONAY — yıkıcı işlem", + message=( + f"'{operation.label}' seçili hedefte DEĞİŞİKLİK YAPAR.\n" + "Bu onay yalnız bu işlem için geçerlidir. Devam edilsin mi?" + ), + ) + ) + return tuple(steps) + + # -- komut uretimi ----------------------------------------------------- + def build_command( + self, + operation: Operation, + target: Target | None = None, + options: Mapping[str, str] | None = None, + grants: Mapping[str, bool] | None = None, + check_mode: bool = False, + ) -> CommandPlan: + opts = dict(options or {}) + self._check_options(operation, opts) + if operation.scope in ("wave", "release") and target is not None: + problems = self.validate_target(operation, target) + if problems: + raise CommandError(problems) + if operation.is_fleet: + return self._build_fleet_plan(operation, target, opts, dict(grants or {}), check_mode) + return self._build_local_plan(operation, target, opts, check_mode) + + def _check_options(self, operation: Operation, opts: Mapping[str, str]) -> None: + for spec in operation.options: + value = (opts.get(spec.name) or "").strip() + if spec.required and not value: + raise CommandError(f"'{spec.label}' zorunludur ({operation.label}).") + if value and spec.validator: + problem = spec.validator(value) + if problem: + raise CommandError(problem) + + def _build_fleet_plan( + self, + operation: Operation, + target: Target | None, + opts: Mapping[str, str], + grants: Mapping[str, bool], + check_mode: bool = False, + ) -> CommandPlan: + if target is None or not target.value: + raise CommandError( + "Hedef seçilmedi; komut üretilmedi. Bayi numarası veya dalga grubu seçin." + ) + problem = self.validate_target(operation, target) + if problem: + raise CommandError(problem) + if self.ctx.inventory is None: + raise CommandError( + "Ansible envanteri bulunamadı; filo işlemleri komutu üretilemiyor. " + "Beklenen yol: ansible/inventory/hosts.yml (veya --inventory PATH)." + ) + book = playbook_path(self.ctx.repo_root, operation.playbook) + if not book.is_file(): + raise CommandError( + f"Playbook bulunamadı: {PLAYBOOK_DIR_REL}/{operation.playbook}\n" + "Doğru depo kopyasında çalıştırın (--repo PATH) veya checkout'u güncelleyin." + ) + declared = playbook_scope(book) + if declared != operation.scope: + raise CommandError( + f"{operation.playbook} çalıştırılmıyor: konsol kapsamı '{operation.scope}' " + f"beklerken playbook '{declared}' beyan ediyor.\n" + "Playbook kapıların kaynağıdır; tablo ile playbook'u eşitleyin " + "(admin/bf-menu -> bf_playbook_check ile aynı kural)." + ) + + wave = self.target_wave(operation, target) + if operation.scope in ("wave", "release") and not wave: + raise CommandError( + "Bu işlem dalga kapsamlıdır ama hedefte onaylı bir dalga yok. " + "Bir dalga grubu seçin (" + ", ".join(WAVES) + ")." + ) + + argv: list[str] = [ + "ansible-playbook", + "-i", + str(self.ctx.inventory), + str(book), + "--limit", + target.limit, + ] + notes: list[str] = [] + if operation.scope == "wave": + argv += ["-e", f"operation_wave={wave}", "-e", "operation_confirmed=true"] + if ( + wave == PRODUCTION_WAVE + and grants.get("production_override") + and playbook_declares_var(book, "production_override") + ): + argv += ["-e", "production_override=true"] + notes.append( + "Dalga kapısı: yalnız önceki dalga sağlık kapısını ve merkez onayını " + "geçtiyse çalıştırın (docs/10)." + ) + elif operation.scope == "release": + argv += ["-e", f"release_wave={wave}"] + if grants.get("wave_gate_confirmed") and playbook_declares_var( + book, "wave_gate_confirmed" + ): + argv += ["-e", "wave_gate_confirmed=true"] + if playbook_declares_var(book, "reboot_confirmed"): + argv += ["-e", "reboot_confirmed=true"] + if wave == PRODUCTION_WAVE: + if grants.get("production_override") and playbook_declares_var( + book, "production_override" + ): + argv += ["-e", "production_override=true"] + if grants.get("allow_production_reboot") and playbook_declares_var( + book, "allow_production_reboot" + ): + argv += ["-e", "allow_production_reboot=true"] + notes.append( + "Sürüm kapısı: dalga onayı ve sağlık kapısı olmadan çalıştırmayın (docs/10)." + ) + if target.kind == "all" and operation.scope == "wave": + notes.append( + "Tüm filo: dalga kapılı playbook'lar dalga dalga ilerler; her dalgayı " + "ayrı ayrı onaylayın." + ) + + argv += self._extra_vars(operation.id, opts) + if check_mode: + argv.append("--check") + notes.append("--check: playbook hiçbir değişiklik uygulamaz (deneme koşusu).") + return CommandPlan( + commands=(tuple(argv),), + destructive=operation.destructive, + requires_root=operation.needs_root, + operation_id=operation.id, + target_label=target.label + (f" (dalga {wave})" if wave else ""), + notes=tuple(notes), + dry_run=self.ctx.dry_run, + check_mode=check_mode, + ) + + def _extra_vars(self, operation_id: str, opts: Mapping[str, str]) -> list[str]: + value = lambda name: (opts.get(name) or "").strip() # noqa: E731 + extra: list[str] = [] + if operation_id == "disk" and value("disk_warn_pct"): + extra += ["-e", f"disk_warn_pct={value('disk_warn_pct')}"] + elif operation_id == "fieldos-version" and value("fieldos_expected_version"): + extra += ["-e", f"fieldos_expected_version={value('fieldos_expected_version')}"] + elif operation_id == "collect-logs" and value("log_lines"): + extra += ["-e", f"log_lines={value('log_lines')}"] + elif operation_id == "reboot" and value("reboot_grace_seconds"): + extra += ["-e", f"reboot_grace_seconds={value('reboot_grace_seconds')}"] + elif operation_id == "service-restart" and value("service_name"): + extra += ["-e", f"service_name={value('service_name')}"] + elif operation_id == "run-script" and value("script_path"): + extra += ["-e", f"script_path={value('script_path')}"] + if value("script_args"): + extra += ["-e", f"script_args={value('script_args')}"] + elif operation_id == "deploy-update" and value("update_packages"): + pins = [ + f'"{pin.strip()}"' + for pin in value("update_packages").split(",") + if pin.strip() + ] + extra += ["-e", f"update_packages=[{','.join(pins)}]"] + return extra + + def _installer_arg(self) -> str: + installer = self.ctx.repo_root / INSTALLER_REL + if not installer.is_file(): + raise CommandError( + f"Kurulum betiği bulunamadı: {INSTALLER_REL}\n" + "Depo kopyasını doğru verin (--repo PATH) veya checkout'u güncelleyin." + ) + return str(installer) + + def _menu_arg(self) -> str: + menu = self.ctx.repo_root / MENU_REL + if not menu.is_file(): + raise CommandError( + f"Konsol betiği bulunamadı: {MENU_REL}\n" + "Depo kopyasını doğru verin (--repo PATH)." + ) + return str(menu) + + def _tool_argv(self, tool: str, *args: str, optional: bool = False) -> tuple[str, ...] | None: + path = resolve_tool(tool, self.ctx.repo_root) + if path is None: + if optional: + return None + raise CommandError( + f"Araç bulunamadı: {tool}\n" + "Bu araç depoda veya /usr/local/bin altında yok. Bağlamak için: " + "sudo admin/bf-bootstrap.sh" + ) + return (path, *args) + + def _build_local_plan( + self, + operation: Operation, + target: Target | None, + opts: Mapping[str, str], + check_mode: bool = False, + ) -> CommandPlan: + dealer = "" + if operation.needs_dealer: + if target is None or target.kind != "dealer" or not target.value: + raise CommandError( + f"'{operation.label}' için bayi numarası gerekir " + "(hedef alanına 8 haneli bayi no yazın)." + ) + problem = dealer_error(target.value) + if problem: + raise CommandError(problem) + dealer = target.value + commands: list[tuple[str, ...]] = [] + notes: list[str] = [] + op_id = operation.id + + if op_id == "install-preflight": + commands.append( + ("bash", self._installer_arg(), "--dealer-id", dealer, "--check") + ) + notes.append("Ön kontrol hiçbir şey yazmaz (log/state/dizin oluşturmaz).") + elif op_id in ("install-local", "install-resume"): + argv = ["bash", self._installer_arg(), "--dealer-id", dealer] + if op_id == "install-resume" or opts.get("resume") == "1": + argv.append("--resume") + if opts.get("offline") == "1": + argv.append("--offline") + commands.append(tuple(argv)) + notes.append(f"Hedef cihaz kimliği: {dealer_to_device_id(dealer)} ({dealer_to_host(dealer)}).") + elif op_id == "install-module": + commands.append( + ( + "bash", + self._installer_arg(), + "--dealer-id", + dealer, + "--only", + (opts.get("only") or "").strip(), + ) + ) + elif op_id == "install-state": + commands.append(("cat", INSTALL_STATE_PATH)) + elif op_id == "install-log": + commands.append(("tail", "-n", "40", INSTALL_LOG_PATH)) + elif op_id == "central-targets": + commands.append(("bash", self._menu_arg(), "--list-targets")) + elif op_id == "central-placeholders": + commands.append( + ( + "grep", + "-n", + "PLACEHOLDER", + str(self.ctx.repo_root / "ansible" / "inventory" / "group_vars" / "all.yml"), + ) + ) + notes.append("Eşleşme yoksa bu iyi haberdir (PLACEHOLDER kalmamış demektir).") + elif op_id == "central-endpoints": + commands.append( + ( + "grep", + "-nE", + r"^[[:space:]]*(wg_subnet|wg_interface|wg_hub_endpoint|monitoring_endpoint|" + r"monitoring_job|update_repo_url|meg_image_tag|support_bundle_dir)[[:space:]]*:", + str(self.ctx.repo_root / "ansible" / "inventory" / "group_vars" / "all.yml"), + ) + ) + notes.append("Yalnız yapılandırma anahtarları okunur; secret hiçbir zaman gösterilmez.") + elif op_id == "central-checklist": + for line in CENTRAL_CHECKLIST: + notes.append(line) + elif op_id == "tools-catalogue": + commands.append(("bash", self._menu_arg(), "--list")) + elif op_id == "tools-git-pull": + commands.append(("git", "-C", str(self.ctx.repo_root), "pull", "--ff-only")) + notes.append("Çekme sonrası konsol değişmiş olabilir; arayüzü yeniden başlatın.") + elif op_id == "tools-gate-local": + commands.append(self._tool_argv("bf-check-local", "--check") or ()) + elif op_id == "tools-gate-enrollment": + commands.append(self._tool_argv("bf-check-enrollment", "--check") or ()) + elif op_id == "tools-gate-ready": + commands.append(self._tool_argv("bf-check-ready", "--check") or ()) + elif op_id == "tools-diagnostics": + commands.append(self._tool_argv("bf-diagnostics") or ()) + elif op_id == "tools-release": + commands.append(self._tool_argv("bf-release") or ()) + elif op_id == "tools-support-bundle": + commands.append( + self._tool_argv("bf-support-bundle", "--out-dir", "/var/tmp") or () + ) + notes.append("Destek paketi parola, private key veya token içermez.") + elif op_id == "tools-console-log": + commands.append(("tail", "-n", "40", self.ctx.console_log)) + elif op_id == "info-summary": + commands.extend(self._status_summary_commands()) + elif op_id == "info-identity": + commands.append(("hostname",)) + commands.append( + ( + "grep", + "-nE", + r"^[[:space:]]*\"(device_id|phase)\"", + STATE_JSON_PATH, + ) + ) + elif op_id == "info-network": + commands.append(("ip", "-brief", "address")) + commands.append(("ip", "route", "show", "default")) + commands.append(("sh", "-c", "awk '/^nameserver/{print}' /etc/resolv.conf")) + commands.append(("wg", "show", "wg0", "latest-handshakes")) + notes.append("WireGuard private/preshared anahtarları istenmez ve gösterilmez.") + elif op_id == "info-resources": + commands.append(("df", "-h")) + commands.append(("free", "-h")) + commands.append(("uptime",)) + elif op_id == "info-packages": + commands.append( + ( + "dpkg-query", + "-W", + "-f=${Package} ${Version} ${Status}\n", + "docker-ce", + "wireguard", + "rustdesk", + "xrdp", + "openssh-server", + ) + ) + elif op_id == "info-services": + commands.append( + ( + "systemctl", + "is-active", + "ssh", + "sshd", + "xrdp", + "rustdesk", + "docker", + "wg-quick@wg0", + "cron", + ) + ) + elif op_id == "info-journal": + commands.append(("journalctl", "-p", "err", "-n", "20", "--no-pager")) + elif op_id == "info-state": + commands.append( + ( + "grep", + "-nE", + r"^[[:space:]]*\"(phase|enrollment_status|fleet_status|device_id|provisioning_id)\"", + STATE_JSON_PATH, + ) + ) + notes.append( + "Yalnız kimlik/durum alanları okunur; token ve anahtarlar gösterilmez." + ) + else: + raise CommandError(f"Bilinmeyen operasyon: {operation.id}") + + commands = [argv for argv in commands if argv] + if not commands: + raise CommandError( + f"'{operation.label}' için çalıştırılabilir komut üretilemedi. " + "Bu cihazda gerekli araç kurulu olmayabilir (sudo admin/bf-bootstrap.sh)." + ) + # --check yalnizca destekleyen komutlara eklenir (kurulum betigi ve + # bf-check-* kapilari); tail/cat/grep/dpkg gibi komutlara eklenmez. + if check_mode and op_id in CHECK_CAPABLE_LOCAL_OPS: + commands = [tuple(argv) + ("--check",) for argv in commands] + notes.append("--check: yalnız denetim yapılır, değişiklik uygulanmaz.") + label = target.label if target is not None and target.value else "bu cihaz (yerel)" + return CommandPlan( + commands=tuple(commands), + destructive=operation.destructive, + requires_root=operation.needs_root, + operation_id=operation.id, + target_label=label, + notes=tuple(notes), + dry_run=self.ctx.dry_run, + check_mode=check_mode and op_id in CHECK_CAPABLE_LOCAL_OPS, + ) + + def _status_summary_commands(self) -> list[tuple[str, ...]]: + """Durum ozeti: bakim sirasinda kaybolan cikti yerine guvenli, opsiyonel set.""" + commands: list[tuple[str, ...]] = [] + for tool, args in (("bf-status", ()), ("bf-enrollment-status", ("--check",))): + argv = self._tool_argv(tool, *args, optional=True) + if argv: + commands.append(argv) + commands.append( + ( + "grep", + "-nE", + r"^[[:space:]]*\"(phase|enrollment_status|fleet_status|device_id|provisioning_id)\"", + STATE_JSON_PATH, + ) + ) + commands.append(("bash", self._menu_arg(), "--list-targets")) + return commands + + # -- calistirma -------------------------------------------------------- + def run( + self, + plan: CommandPlan, + on_line: Callable[[str], None] | None = None, + cancel: threading.Event | None = None, + ) -> RunResult: + return run_plan(plan, on_line=on_line, cancel=cancel, cwd=str(self.ctx.repo_root)) + + +CENTRAL_CHECKLIST: tuple[str, ...] = ( + "1. WireGuard hub: uç nokta, anahtarlar ve her bf- için eş ataması (docs/08).", + "2. Kayıt (enrollment) token servisi: tek kullanımlık, TTL sınırlı token (docs/29).", + "3. İzleme: Prometheus/VictoriaMetrics + Grafana, device_id etiketi = BF- (docs/14).", + "4. Uzak erişim: RustDesk hbbs/hbbr veya MeshCentral, WireGuard üzerinden erişilebilir (docs/07).", + "5. Paket aynası + saha kurulumları için çevrimdışı anlık görüntü (docs/10, docs/27).", + "6. Gerçek ana makine adlarını içeren Ansible envanteri ve yönetici SSH anahtarı (docs/02, 06, 09).", + "Bu arayüz 6'yı denetler; 1-5'i hazırlamaya yardımcı olur, merkez sunucusu KURMAZ.", +) + + +class ModuleBackend: + """Gercek bfos.operations / bfos.runner modullerini kullanan backend. + + Paylasilan is mantigi TEK kaynaktan gelir (kopyalanmaz): + * katalog : bfos.operations (catalogue_rows / ALL_OPERATIONS) + * envanter/hedef: Inventory.load_repository + resolve_target + * komut uretimi : build_ansible_command / build_install_command / + build_tool_command / build_extra_vars + * kapilar : confirmation_plan + GatesGranted (dalga, production, + surum kapisi, yikici ikinci onay) + * denetim kaydi : bfos.runner.AuditLog (varsa) -- TUI ile ayni kayit. + + Yerel (kurulum / arac / merkez / bilgi) islemler icin modulde karsiligi olan + kurucular kullanilir; karsiligi olmayan salt-okunur ekran ve komutlar + CatalogueBackend'e devredilir (bkz. _local). + """ + + name = "bfos.operations + bfos.runner (gerçek backend)" + + #: modulde komut kurucusu olan yerel arac islemleri: id -> (arac, sabit arg.) + _TOOL_OPS: Mapping[str, tuple[str, tuple[str, ...]]] = { + "tools-gate-local": ("bf-check-local", ()), + "tools-gate-enrollment": ("bf-check-enrollment", ()), + "tools-gate-ready": ("bf-check-ready", ()), + "tools-diagnostics": ("bf-diagnostics", ()), + "tools-release": ("bf-release", ()), + "tools-support-bundle": ("bf-support-bundle", ("--out-dir", "/var/tmp")), + } + + #: modulun salt-okunur rapor ureticileri: id -> fonksiyon adi + _REPORT_OPS: Mapping[str, str] = { + "central-targets": "targets_lines", + "central-readiness": "central_readiness_lines", + "central-endpoints": "central_endpoint_lines", + "central-probe": "central_probe_lines", + "central-wave-gates": "wave_gate_state_lines", + "info-identity": "identity_lines", + "info-state": "state_lines", + } + + def __init__(self, ops_module, runner_module, ctx: GuiContext): + self._ops = ops_module + self._runner = runner_module + self.ctx = ctx + self._local = CatalogueBackend(ctx) + self._repo = ops_module.Repository(str(ctx.repo_root)) + self._inventory = ops_module.Inventory.load_repository( + self._repo, str(ctx.inventory) if ctx.inventory else "" + ) + self._raw_ops: dict[str, Any] = {} + self._catalogue = self._load_catalogue() + self._by_id = {op.id: op for op in self._catalogue} + self._fleet_ids = frozenset(op.id for op in self._catalogue if op.is_fleet) + + # -- katalog ----------------------------------------------------------- + def _load_catalogue(self) -> tuple[Operation, ...]: + """Modulun kataloğu (filo işlemleri) + yerel işlemler (kurulum/araç/...).""" + raw: Any = None + for name in ("catalogue_rows", "list_operations", "operations", + "ALL_OPERATIONS", "OPERATIONS", "OPS", "get_operations"): + candidate = getattr(self._ops, name, None) + if candidate is None: + continue + try: + value = candidate() if callable(candidate) else candidate + except Exception: + continue + if value: + raw = value + break + if not raw: + raise BackendUnavailable( + "bfos.operations içinde operasyon listesi bulunamadı.\n" + "Beklenen: catalogue_rows() / ALL_OPERATIONS " + "(bkz. bfos/ui_gui.py başlığındaki SÖZLEŞME)." + ) + fleet: list[Operation] = [] + for item in raw: + operation = self._normalize_operation(item) + fleet.append(operation) + self._raw_ops[operation.id] = item + if not fleet: + raise BackendUnavailable("bfos.operations boş bir operasyon listesi döndürdü.") + local = tuple(op for op in OPERATIONS if not op.is_fleet) + return tuple(fleet) + local + + @staticmethod + def _normalize_operation(item) -> Operation: + """Modul operasyonunu arayuzun Operation tipine cevirir (SÖZLEŞME).""" + if isinstance(item, Operation): + return item + get = (lambda key, default=None: item.get(key, default)) if isinstance(item, dict) \ + else (lambda key, default=None: getattr(item, key, default)) + op_id = get("id") or get("ident") or get("name") or get("operation_id") + if not op_id: + raise BackendUnavailable("Bir operasyonun id alanı yok (SÖZLEŞME: id zorunlu).") + label = get("label") or get("title") or get("description") or op_id + category = get("category") or "Cihaz işlemleri" + if category not in CATEGORIES: + category = "Cihaz işlemleri" + scope = str(get("scope") or get("declared_scope") or "simple") + prompt = get("prompt") or "none" + destructive = bool(get("destructive") or get("is_destructive") or False) + # requires_root is left None unless the source actually states it, so the + # Operation property derives it from `destructive`. Reading the field + # with a False default marked every real operation read-only and the + # root gate never fired; the catalogue's `destructive` flag is the + # honest signal. An operation that states the value keeps that answer. + stated_root = None + if isinstance(item, dict): + if "requires_root" in item: + stated_root = bool(item["requires_root"]) + elif getattr(item, "requires_root", None) is not None: + stated_root = bool(item.requires_root) + return Operation( + id=str(op_id), + label=str(label), + category=str(category), + destructive=destructive, + scope=scope, + description=str(get("description") or ""), + playbook=str(get("playbook") or ""), + options=_prompt_options(str(prompt)), + requires_root=stated_root, + needs_dealer=bool(get("needs_dealer") or False), + ) + + # -- envanter ---------------------------------------------------------- + def list_operations(self) -> tuple[Operation, ...]: + return self._catalogue + + def list_waves(self) -> tuple[str, ...]: + try: + present = self._inventory.waves_present() + except Exception: + present = () + return tuple(present) or WAVES + + def inventory_note(self) -> str: + note = self._local.inventory_note() + if self._inventory.path: + note = f"Envanter: {self._inventory.path} ({self._inventory.count_all()} cihaz)" + if not self._have_ansible(): + note += ( + " | UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz " + "(sudo apt install ansible)." + ) + return note + + def _have_ansible(self) -> bool: + checker = getattr(getattr(self._runner, "Runner", None), "have_ansible", None) + try: + if callable(checker): + return bool(checker()) + except Exception: + pass + return shutil.which("ansible-playbook") is not None + + def target_wave(self, operation: Operation, target: Target | None) -> str | None: + if target is None or not target.value: + return None + try: + resolved = self._resolve_target(target, operation) + except CommandError: + return None + return resolved.wave or None + + def validate_target(self, operation: Operation, target: Target) -> str | None: + try: + self._resolve_target(target, operation) + except CommandError as exc: + return str(exc) + return None + + def _resolve_target(self, target: Target, operation: Operation): + """Modulun resolve_target'i ile hedefi cozer (Refused -> CommandError).""" + raw_op = self._raw_ops.get(operation.id) + mode = "any" + if raw_op is not None: + mode = getattr(raw_op, "target_mode", "any") + try: + return self._ops.resolve_target(target.value, mode, self._inventory) + except Exception as exc: + raise self._refusal(exc) from exc + + @staticmethod + def _refusal(exc: Exception) -> CommandError: + """Modulun Refused hatasini (mesaj + ayrinti) Turkce CommandError'a cevirir.""" + message = getattr(exc, "message", None) or str(exc) + detail = getattr(exc, "detail", "") or "" + text = f"{message}\n{detail}".strip() if detail else str(message) + if isinstance(exc, CommandError): + return exc + return CommandError(text) + # -- kapilar ----------------------------------------------------------- + def gate_steps( + self, operation: Operation, target: Target | None + ) -> tuple[GateStepInfo, ...]: + """Modulun confirmation_plan'i ile ayni kapi kurallari. + + confirmation_plan yoksa/çağrılamazsa yerel ayna (CatalogueBackend) + kullanilir: kapi sormamak gibi sessiz bir davranis ASLA secilmez. + """ + if operation.id not in self._fleet_ids or target is None or not target.value: + return self._local.gate_steps(operation, target) + planner = getattr(self._ops, "confirmation_plan", None) + raw_op = self._raw_ops.get(operation.id) + if not callable(planner) or raw_op is None: + return self._local.gate_steps(operation, target) + try: + resolved = self._resolve_target(target, operation) + gate_supported = False + plays = getattr(self._repo, "playbook_uses", None) + if callable(plays): + gate_supported = bool(plays(raw_op.playbook, "wave_gate_confirmed")) + steps = planner( + raw_op, raw_op.declared_scope, resolved, + wave_gate_supported=gate_supported, + ) + except Exception: + return self._local.gate_steps(operation, target) + infos: list[GateStepInfo] = [] + for step in steps: + infos.append( + GateStepInfo( + kind=str(getattr(step, "kind", "approval")), + key=str(getattr(step, "key", "")), + prompt=str(getattr(step, "prompt", "")), + message=str(getattr(step, "message", "")), + token=str(getattr(step, "token", "")), + unlocks=tuple(getattr(step, "unlocks", ()) or ()), + ) + ) + return tuple(infos) + + def _gates(self, grants: Mapping[str, bool]): + """Onaylanan bayraklari modulun GatesGranted tipine cevirir.""" + gates_cls = getattr(self._ops, "GatesGranted", None) + if gates_cls is None: + return None + fields = getattr(gates_cls, "__dataclass_fields__", {}) + kwargs = {name: bool(value) for name, value in grants.items() if name in fields} + try: + return gates_cls(**kwargs) + except Exception: + return None + + # -- komut uretimi ----------------------------------------------------- + def build_command( + self, + operation: Operation, + target: Target | None = None, + options: Mapping[str, str] | None = None, + grants: Mapping[str, bool] | None = None, + check_mode: bool = False, + ) -> CommandPlan: + opts = dict(options or {}) + granted = dict(grants or {}) + if operation.id in self._fleet_ids: + return self._build_fleet_plan(operation, target, opts, granted, check_mode) + for builder in (self._build_install_plan, self._build_tool_plan, + self._build_report_plan): + plan = builder(operation, target, opts, check_mode) + if plan is not None: + return plan + # Modulde karsiligi olmayan yerel komut/salt-okunur ekranlar. + return self._local.build_command(operation, target, opts, granted, check_mode) + + def _build_fleet_plan( + self, + operation: Operation, + target: Target | None, + opts: Mapping[str, str], + grants: Mapping[str, bool], + check_mode: bool, + ) -> CommandPlan: + raw_op = self._raw_ops.get(operation.id) + if raw_op is None: + raise CommandError( + f"'{operation.id}' operasyonunun tanımı backend'de bulunamadı." + ) + if target is None or not target.value: + raise CommandError( + "Hedef seçilmedi; komut üretilmedi. Bayi numarası veya dalga grubu seçin." + ) + if not self._inventory.path: + raise CommandError( + "Ansible envanteri bulunamadı; filo işlemleri komutu üretilemiyor. " + "Beklenen yol: ansible/inventory/hosts.yml (veya --inventory PATH)." + ) + verify = getattr(self._repo, "verify_scope", None) + if callable(verify): + # Playbook kendi kapisinin kaynagidir; tablo ile uyusmazsa REDDET. + try: + verify(raw_op) + except Exception as exc: + raise self._refusal(exc) from exc + try: + resolved = self._resolve_target(target, operation) + extra = self._ops.build_extra_vars(raw_op.prompt, opts) + argv = self._ops.build_ansible_command( + self._repo, self._inventory.path, raw_op, raw_op.declared_scope, + resolved, extra_vars=extra, gates=self._gates(grants), + check_mode=check_mode, + ) + except Exception as exc: + raise self._refusal(exc) from exc + + notes: list[str] = [] + if raw_op.declared_scope in ("wave", "release"): + notes.append( + "Dalga/sürüm kapısı: yalnız önceki dalga sağlık kapısını ve merkez " + "onayını geçtiyse çalıştırın (docs/10)." + ) + if not grants.get("wave_gate_confirmed") and _declares( + self._repo, raw_op.playbook, "wave_gate_confirmed" + ): + notes.append( + "Not: wave_gate_confirmed bayrağı yalnız sürüm kapısı onayı verilirse " + "komuta eklenir." + ) + if check_mode: + notes.append("--check: playbook hiçbir değişiklik uygulamaz (deneme koşusu).") + return CommandPlan( + commands=(tuple(argv),), + destructive=bool(raw_op.destructive), + requires_root=False, + operation_id=operation.id, + target_label=str(getattr(resolved, "label", target.label)), + notes=tuple(notes), + dry_run=self.ctx.dry_run, + check_mode=check_mode, + ) + + def _build_install_plan( + self, operation: Operation, target: Target | None, + opts: Mapping[str, str], check_mode: bool, + ) -> CommandPlan | None: + if not operation.id.startswith("install-"): + return None + builder = getattr(self._ops, "build_install_command", None) + if not callable(builder): + return None + if operation.id in ("install-state", "install-log"): + return None + dealer = "" + if operation.needs_dealer: + if target is None or target.kind != "dealer" or not target.value: + raise CommandError( + f"'{operation.label}' için bayi numarası gerekir " + "(hedef alanına 8 haneli bayi no yazın)." + ) + problem = dealer_error(target.value) + if problem: + raise CommandError(problem) + dealer = target.value + try: + installer = self._repo.installer_path() + except Exception as exc: + raise self._refusal(exc) from exc + check = operation.id == "install-preflight" or check_mode + try: + argv = builder( + installer, + dealer, + offline=opts.get("offline") == "1", + resume=operation.id == "install-resume" or opts.get("resume") == "1", + only=(opts.get("only") or "").strip(), + check_mode=check, + ) + except Exception as exc: + raise self._refusal(exc) from exc + notes = [f"Hedef cihaz kimliği: {dealer_to_device_id(dealer)} ({dealer_to_host(dealer)})."] + if operation.id == "install-preflight": + notes.append("Ön kontrol hiçbir şey yazmaz (log/state/dizin oluşturmaz).") + if check: + notes.append("--check: hiçbir değişiklik uygulanmaz.") + return CommandPlan( + commands=(tuple(argv),), + destructive=operation.destructive, + requires_root=operation.needs_root, + operation_id=operation.id, + target_label=f"cihaz {dealer_to_device_id(dealer)} ({dealer_to_host(dealer)})", + notes=tuple(notes), + dry_run=self.ctx.dry_run, + check_mode=check, + ) + + def _build_tool_plan( + self, operation: Operation, target: Target | None, + opts: Mapping[str, str], check_mode: bool, + ) -> CommandPlan | None: + entry = self._TOOL_OPS.get(operation.id) + if entry is None: + return None + builder = getattr(self._ops, "build_tool_command", None) + tool, args = entry + try: + path = self._repo.tool_path(tool) + except Exception as exc: + raise self._refusal(exc) from exc + if not callable(builder): + return None + check = tool.startswith("bf-check-") or check_mode + argv = builder(path, list(args), check_mode=check) + notes: list[str] = [] + if operation.id == "tools-support-bundle": + notes.append("Destek paketi parola, private key veya token içermez.") + return CommandPlan( + commands=(tuple(argv),), + destructive=operation.destructive, + requires_root=operation.needs_root, + operation_id=operation.id, + target_label="bu cihaz (yerel)", + notes=tuple(notes), + dry_run=self.ctx.dry_run, + check_mode=check, + ) + + def _build_report_plan( + self, operation: Operation, target: Target | None, + opts: Mapping[str, str], check_mode: bool, + ) -> CommandPlan | None: + """Modulun salt-okunur ekran ureticileri (komut CALISTIRILMAZ).""" + lines = self._module_report_lines(operation) + if lines is None: + return None + return CommandPlan( + report_lines=tuple(lines), + destructive=False, + operation_id=operation.id, + target_label="bu cihaz (yerel)", + notes=("Salt-okunur ekran: hiçbir komut çalıştırılmadı.",), + dry_run=self.ctx.dry_run, + ) + + def _module_report_lines(self, operation: Operation) -> tuple[str, ...] | None: + ops = self._ops + try: + if operation.id == "central-targets" and hasattr(ops, "targets_lines"): + return tuple(ops.targets_lines(self._inventory)) + if operation.id == "central-placeholders" and hasattr( + ops, "central_readiness_lines" + ): + return tuple(ops.central_readiness_lines(self._repo, self._inventory)) + if operation.id == "central-endpoints" and hasattr(ops, "central_endpoint_lines"): + return tuple(ops.central_endpoint_lines(self._repo)) + if operation.id == "central-checklist" and hasattr(ops, "central_checklist_lines"): + return tuple(ops.central_checklist_lines()) + if operation.id == "info-identity" and hasattr(ops, "identity_lines"): + return tuple(ops.identity_lines()) + if operation.id == "info-state" and hasattr(ops, "state_lines"): + return tuple(ops.state_lines()) + if operation.id == "info-summary" and hasattr(ops, "environment_lines"): + lines = list( + ops.environment_lines( + self._repo, str(self.ctx.console_log), self._inventory, + self.ctx.dry_run, False, + ) + ) + if hasattr(ops, "state_lines"): + lines += [""] + lines += list(ops.state_lines()) + return tuple(lines) + except Exception: + # Rapor uretilemedi: yerel (katalog) yoluna dusulur, hata gizlenmez. + return None + return None + # -- calistirma -------------------------------------------------------- + def run( + self, + plan: CommandPlan, + on_line: Callable[[str], None] | None = None, + cancel: threading.Event | None = None, + ) -> RunResult: + """Komutlari canli ciktiyla calistirir; denetim kaydi modul uzerinden. + + Not: bfos.runner.Runner komutu kendi stdio'suyla calistirir (TUI icin + dogru olan davranis budur) ve ciktiyi dondurmez; GUI metin kutusuna + satir satir akis icin buranin streaming calistiricisi kullanilir. + Denetim kaydi, modulun AuditLog'u varsa onun uzerinden yazilir, boylece + GUI ile TUI ayni bicimde kayit tutar. + """ + audit = self._audit_log() + redact = getattr(self._runner, "redact", None) + command_text = " && ".join(shlex.join(argv) for argv in plan.commands) + if callable(redact): + try: + command_text = str(redact(command_text)) + except Exception: + pass + if audit is not None: + self._audit_write(audit, self._audit_level("AUDIT_RUN", "RUN"), command_text) + result = run_plan(plan, on_line=on_line, cancel=cancel, cwd=str(self.ctx.repo_root)) + if audit is not None: + level = self._audit_level("AUDIT_OK", "OK") if result.ok \ + else self._audit_level("AUDIT_FAIL", "FAIL") + self._audit_write(audit, level, f"exit={result.exit_code} :: {command_text}") + return result + + def _audit_log(self): + """bfos.runner.AuditLog (varsa) -- kurulamazsa None (kayit sessizce atlanir).""" + factory = getattr(self._runner, "AuditLog", None) + if factory is None: + return None + try: + return factory() + except Exception: + return None + + @staticmethod + def _audit_write(audit, level: str, message: str) -> None: + try: + audit.write(level, message) + except Exception: + pass + + def _audit_level(self, name: str, fallback: str) -> str: + config = getattr(self._ops, "config", None) + return str(getattr(config, name, fallback) or fallback) + + +def _declares(repo, playbook: str, var: str) -> bool: + """Playbook VAR'i kullaniyor mu? (modulun okuma yolu varsa onu kullanir.)""" + checker = getattr(repo, "playbook_uses", None) + if not callable(checker): + return False + try: + return bool(checker(playbook, var)) + except Exception: + return False + + +#: Modulun prompt turleri (bfos.operations PROMPT_*) icin arayuz secenekleri. +#: Anahtarlar modulun build_extra_vars() cevap anahtarlariyla AYNI olmalidir. +_PROMPT_OPTION_SPECS: Mapping[str, tuple[OptionSpec, ...]] = { + "none": (), + "packages": ( + OptionSpec( + "packages", + "Paket pinleri (paket=sürüm, virgülle)", + required=True, + hint="Yalnız tam pin; 'latest' ve aralık kabul edilmez", + validator=validate_package_pins, + ), + ), + "service": ( + OptionSpec( + "service", + "Servis adı", + kind="choice", + choices=SERVICE_ALLOWLIST, + required=True, + hint="Yalnız izinli servis adları", + validator=validate_service_name, + ), + ), + "script": ( + OptionSpec( + "script", + "Script yolu", + required=True, + hint=f"İzinli dizinler: {', '.join(SCRIPT_DIRS)}", + validator=validate_script_path, + ), + OptionSpec("script_args", "Script argümanları", default="", hint="İsteğe bağlı"), + ), + "grace": ( + OptionSpec( + "grace", + "Yeniden başlatma bekleme süresi (saniye)", + kind="int", + default="300", + validator=validate_grace, + ), + ), + "disk_pct": ( + OptionSpec( + "disk_pct", + "Uyarı eşiği (%)", + kind="int", + default="", + hint="Boş = playbook varsayılanı (80)", + validator=validate_disk_pct, + ), + ), + "log_lines": ( + OptionSpec( + "log_lines", + "Cihaz başına journal satırı", + kind="int", + default="500", + validator=validate_log_lines, + ), + ), + "expected_version": ( + OptionSpec( + "expected_version", + "Beklenen Field OS sürümü", + default="", + hint="Boş = sapma (drift) denetimi atlanır", + validator=validate_expected_version, + ), + ), +} + + +def _prompt_options(prompt: str) -> tuple[OptionSpec, ...]: + return _PROMPT_OPTION_SPECS.get(prompt, ()) + + +def load_backend(ctx: GuiContext): + """Gercek modulleri dener; yoksa yerlesik katalog'a duser. + + Donus: (backend, not) -- `not` Turkce bilgi satiridir (durum cubugunda + gosterilir), hata DEGILDIR. + """ + add_repo_to_path(ctx.repo_root) + try: + from bfos import operations as operations_module # type: ignore + except Exception as exc: # ImportError ve beklenmeyen hatalar + return ( + CatalogueBackend(ctx), + f"bfos.operations bulunamadı ({type(exc).__name__}); yerleşik katalog " + "kullanılıyor (admin/bf-menu kuralları).", + ) + runner_module = None + try: + from bfos import runner as runner_module # type: ignore # noqa: F811 + except Exception: + runner_module = None + if runner_module is None: + return ( + CatalogueBackend(ctx), + "bfos.runner bulunamadı; komutlar yerleşik çalıştırıcıyla koşuluyor.", + ) + try: + backend = ModuleBackend(operations_module, runner_module, ctx) + except BackendUnavailable as exc: + return CatalogueBackend(ctx), f"UYARI: {exc}" + except Exception as exc: # beklenmeyen modul hatasi arayuzu kilitlemesin + return ( + CatalogueBackend(ctx), + f"UYARI: gerçek backend başlatılamadı ({type(exc).__name__}: {exc}); " + "yerleşik katalog kullanılıyor.", + ) + catalogue = len(backend.list_operations()) + fleet = len(backend._fleet_ids) # noqa: SLF001 - bilgi amacli sayim + return ( + backend, + f"Gerçek backend: bfos.operations + bfos.runner " + f"({fleet} filo işlemi, {catalogue - fleet} yerel işlem).", + ) + + +def add_repo_to_path(repo_root: Path) -> None: + root = str(repo_root) + if root not in sys.path: + sys.path.insert(0, root) + + +# --------------------------------------------------------------------------- +# Cikti paneli + canli akis +# --------------------------------------------------------------------------- +class OutputPane: + """Komut ciktisi kuyusu: salt-okunur GORUNEN, icerlek bir metin alani. + + Olculen sorun: alan duzenlenebilir gibi duruyordu ve ic bosluğu yoktu. Bu + yuzden alan bir kuyuya (``--bg-sunken``) oturur, 12px ic bosluk tasir, + ``cursor="arrow"`` ve ``takefocus=0`` ile "buraya yazilmaz" der; yazi tipi + veri yuzudur (monospace) ki cikis kodlari ve kimlikler hizalansin. + + Ciktinin ham hali KANITTIR, arayuz degil (docs/DESIGN.md kural 6): sonuc + once durum rozetinde gorunur, bu alan kaniti tutar ve gizlenebilir. + """ + + def __init__(self, parent, styles: Mapping[str, str], height: int = 14, + log_path: str = DEFAULT_CONSOLE_LOG): + self.styles = styles + self.frame = ttk.Frame(parent, style=styles["panel"]) + self.frame.pack(fill="both", expand=True) + + head = ttk.Frame(self.frame, style=styles["panel"]) + head.pack(fill="x", padx=theme.SP_3, pady=(theme.SP_3, theme.SP_2)) + ttk.Label(head, text="Komut çıktısı", style=styles["panel_title"]).pack(side="left") + ttk.Label( + head, + text=f"salt-okunur · denetim kaydı: {log_path}", + style=styles["panel_faint"], + ).pack(side="right") + + self.well = ttk.Frame(self.frame, style=styles["sunken"]) + self.well.pack(fill="both", expand=True, + padx=theme.SP_3, pady=(0, theme.SP_3)) + self.text = tk.Text( + self.well, + height=height, + wrap="word", + font=theme.data_font(theme.SIZE_SM), + background=theme.BG_SUNKEN, + foreground=theme.TEXT, + relief="flat", + borderwidth=0, + highlightthickness=0, + padx=theme.SP_3, + pady=theme.SP_2, + cursor="arrow", + takefocus=0, + selectbackground=theme.ACCENT_SOFT, + selectforeground=theme.TEXT, + inactiveselectbackground=theme.ACCENT_SOFT, + ) + self.text.pack(side="left", fill="both", expand=True) + bar = ttk.Scrollbar(self.well, orient="vertical", command=self.text.yview) + self.text.configure(yscrollcommand=bar.set) + bar.pack(side="right", fill="y") + self.text.configure(state="disabled") + + self._queue: "queue.Queue[str]" = queue.Queue() + self._parent = parent + + def append(self, line: str) -> None: + """Herhangi bir is parcacigindan guvenle cagrilabilir (kuyruga yazar).""" + self._queue.put(line) + + def _insert(self, line: str) -> None: + self.text.configure(state="normal") + self.text.insert("end", line + "\n") + self.text.configure(state="disabled") + + def drain(self) -> None: + """Ana is parcaciginda kuyrugu bosaltir (after ile periyodik cagrilir).""" + wrote = False + while True: + try: + line = self._queue.get_nowait() + except queue.Empty: + break + self._insert(line) + wrote = True + if wrote: + self.text.see("end") + self._parent.after(120, self.drain) + + def clear(self) -> None: + self.text.configure(state="normal") + self.text.delete("1.0", "end") + self.text.configure(state="disabled") + + def write_now(self, line: str) -> None: + self.append(line) + self.drain_once() + + def drain_once(self) -> None: + while True: + try: + line = self._queue.get_nowait() + except queue.Empty: + break + self._insert(line) + self.text.see("end") + + # -- gorunurluk (kanit erisilebilir kalir, ekrani kaplamaz) ------------- + def set_visible(self, visible: bool) -> None: + """Cikti kuyusunu gosterir/gizler; panel basligi yerinde kalir.""" + if visible: + self.well.pack(fill="both", expand=True, + padx=theme.SP_3, pady=(0, theme.SP_3)) + else: + self.well.pack_forget() + + def is_visible(self) -> bool: + return bool(self.well.winfo_manager()) + + +# --------------------------------------------------------------------------- +# Arayuz +# --------------------------------------------------------------------------- +class BfGui: # pragma: no cover - pencere gerektirir (statik testler dokunmaz) + """Blueforce Field OS Turkce masaustu arayuzu. + + Yerlesim docs/DESIGN.md "Direction contract" yonergesine gore kurulur: + koyu bir baslik bandi (urun adi, hedef kimligi, cihaz durumu, yetki + seviyesi), altinda beyaz paneller halinde hedef cubugu, islem listesi ve + secenek paneli, bir kuyuda komut ciktisi ve tek bir eylem cubugu. Renk + yalnizca DURUM tasir; tum degerler bfos/ui_theme.py'den gelir (o da + web/static/tokens.css'i yansitir), bu dosyada sabit renk yoktur. + """ + + #: Etiket sutunu genisligi: hedef satiri ve secenek satirlari AYNI hizada + #: baslar (olculen sorun: tutarsiz etiket genislikleri ve sikisik satir). + FIELD_LABEL_WIDTH = 22 + + def __init__(self, root, backend, ctx: GuiContext, *, full_mode: bool = False): + self.root = root + self.backend = backend + self.ctx = ctx + self.cancel_event = threading.Event() + self.running = False + self.option_widgets: dict[str, tuple[str, Any]] = {} + self._panes: dict[str, tuple[Any, Any]] = {} + # Islem tanimlari BACKEND'den gelir (yerlesik katalog ya da gercek + # bfos.operations): secenek adlari backend ile ayni olmak zorundadir. + self._ops_by_id: dict[str, Operation] = { + op.id: op for op in backend.list_operations() + } + self._selected_operation: Operation | None = None + self._current_plan: CommandPlan | None = None + self._rows: dict[str, tuple[Operation, ...]] = {} + self._filters: dict[str, Any] = {} + self._output_visible = True + + # Tema her widget'tan ONCE uygulanir: ttk stilleri dogduklari anda + # gecerli olmali, sonradan boyamak gri bir pencere ve titreme uretir. + self.styles = theme.apply_theme(root) + root.title(WINDOW_TITLE) + root.minsize(1040, 760) + root.columnconfigure(0, weight=1) + # Bantlar: baslik -> uyarilar -> hedef -> govde -> cikti -> eylem. + root.rowconfigure(3, weight=3) + root.rowconfigure(4, weight=2) + + self._build_header() + self._build_notices() + self._build_target_bar() + + self.body = ttk.Frame(root, style=self.styles["frame"]) + self.body.grid(row=3, column=0, sticky="nsew", + padx=theme.SP_4, pady=(theme.SP_3, 0)) + self.simple_frame = ttk.Frame(self.body, style=self.styles["frame"]) + self.detail_frame = ttk.Frame(self.body, style=self.styles["frame"]) + self._build_simple_mode(self.simple_frame) + self._build_detail_mode(self.detail_frame) + + output_area = ttk.Frame(root, style=self.styles["frame"]) + output_area.grid(row=4, column=0, sticky="nsew", + padx=theme.SP_4, pady=(theme.SP_3, 0)) + self.output = OutputPane(output_area, self.styles, height=14, + log_path=ctx.console_log) + self.output.drain() + self._build_footer() + self._apply_privilege_controls() + + self.show_mode(full=full_mode) + self._load_inventory() + + # -- kucuk yardimcilar ------------------------------------------------- + def _badge(self, parent, word: str, style: str): + """Sozcuklu rozet: renk TEK BASINA anlam tasimaz (kural 2).""" + return ttk.Label(parent, text=word, style=style) + + def _set_status(self, word: str, severity: str = "idle") -> None: + """Durum gostergesi: sozcuk + renk (duz gri bir etiket degil).""" + self.status.configure(text=word, style=theme.severity_style(severity)) + + # -- ust bilgi: koyu bant --------------------------------------------- + def _build_header(self) -> None: + """Baslik bandi: urun adi, hedef kimligi, cihaz durumu, yetki. + + Yetki seviyesi burada GORUNUR bir ogedir (rozet), gomulu bir cumle + degil: "bu pencereden ne yapabilirim?" sorusunun cevabi bir adim + geriden okunur (docs/DESIGN.md "Privilege"). + """ + band = ttk.Frame(self.root, style=self.styles["header"]) + band.grid(row=0, column=0, sticky="ew") + band.columnconfigure(2, weight=1) + + identity = ttk.Frame(band, style=self.styles["header"]) + identity.grid(row=0, column=0, sticky="w", + padx=theme.SP_4, pady=(theme.SP_3, theme.SP_1)) + ttk.Label(identity, text=WINDOW_TITLE, + style=self.styles["header_title"]).pack(anchor="w") + ttk.Label(identity, text=APP_SUBTITLE, + style=self.styles["header_meta"]).pack(anchor="w") + + target = ttk.Frame(band, style=self.styles["header"]) + target.grid(row=0, column=1, sticky="w", padx=(theme.SP_5, 0), + pady=(theme.SP_3, theme.SP_1)) + ttk.Label(target, text="HEDEF", style=self.styles["header_meta"]).pack(anchor="w") + self.header_target = ttk.Label(target, text="— seçilmedi", + style=self.styles["header_target"]) + self.header_target.pack(anchor="w") + + badges = ttk.Frame(band, style=self.styles["header"]) + badges.grid(row=0, column=3, sticky="e", + padx=theme.SP_4, pady=(theme.SP_3, theme.SP_1)) + + self._state_word = device_state_word() + state_row = ttk.Frame(badges, style=self.styles["header"]) + state_row.pack(anchor="e") + ttk.Label(state_row, text="Cihaz durumu", + style=self.styles["header_meta"]).pack(side="left") + self.state_badge = self._badge(state_row, self._state_word, + state_badge_style(self._state_word)) + self.state_badge.pack(side="left", padx=(theme.SP_2, 0)) + + self.privilege_level = privilege_level() + priv_row = ttk.Frame(badges, style=self.styles["header"]) + priv_row.pack(anchor="e", pady=(theme.SP_1, 0)) + ttk.Label(priv_row, text="Yetki", + style=self.styles["header_meta"]).pack(side="left") + self.privilege_badge = self._badge( + priv_row, privilege_word(self.privilege_level), + theme.PRIVILEGE_BADGE_STYLE[self.privilege_level]) + self.privilege_badge.pack(side="left", padx=(theme.SP_2, 0)) + if self.ctx.dry_run: + self._badge(priv_row, "DENEME KİPİ", + self.styles["badge_info"]).pack(side="left", padx=(theme.SP_2, 0)) + + def _build_notices(self) -> None: + """Yetki ve kip uyarilari: basligin hemen altinda renkli bir serit. + + Olculen sorun: kritik "Yonetici yetkisi yok" uyarisi monospace bir + paragrafta gomuluydu. Simdi yetki hem baslikta rozet, hem burada + sozcuk + renk; ustune duzene doken tam cumle. + """ + notices = ttk.Frame(self.root, style=self.styles["frame"]) + shown = False + if not is_root(): + # Soylenmezse operator kurulumu baslatir ve yari yolda yetki + # hatasiyla karsilasir; kapi bu yuzden acilista gorunur. + band = ttk.Frame(notices, style=self.styles["warn_band"]) + band.pack(fill="x") + inner = ttk.Frame(band, style=self.styles["warn_band"]) + inner.pack(fill="x", padx=theme.SP_3, pady=theme.SP_2) + ttk.Label(inner, text=privilege_word(PRIVILEGE_READ_ONLY), + style=self.styles["readonly"]).pack(side="left", + padx=(0, theme.SP_3)) + ttk.Label(inner, text=ROOT_REQUIRED_NOTICE, + style=self.styles["warn_label"]).pack(side="left") + shown = True + if self.ctx.dry_run: + band = ttk.Frame(notices, style=self.styles["info_band"]) + band.pack(fill="x", pady=(theme.SP_1, 0) if shown else (0, 0)) + inner = ttk.Frame(band, style=self.styles["info_band"]) + inner.pack(fill="x", padx=theme.SP_3, pady=theme.SP_2) + ttk.Label(inner, text="DENEME KİPİ", + style=self.styles["badge_info"]).pack(side="left", + padx=(0, theme.SP_3)) + ttk.Label(inner, text="Komutlar gösterilir, çalıştırılmaz.", + style=self.styles["info_label"]).pack(side="left") + shown = True + if shown: + notices.grid(row=1, column=0, sticky="ew", padx=theme.SP_4, + pady=(theme.SP_3, 0)) + + # -- hedef cubugu ------------------------------------------------------ + def _build_target_bar(self) -> None: + """Hedef paneli: grid ile hizali etiketler, tek ritim. + + Olculen sorun: satir sikisik ve etiket genislikleri tutarsizdi. Her + etiket ayni sutunda ve ayni sag kenara yaslanir; alanlar arasindaki + bosluk 4px ritmine gore verilir (SP_2 / SP_3 / SP_5). + """ + panel = ttk.Frame(self.root, style=self.styles["panel"]) + panel.grid(row=2, column=0, sticky="ew", padx=theme.SP_4, + pady=(theme.SP_3, 0)) + panel.columnconfigure(4, weight=1) + + ttk.Label(panel, text="HEDEF", style=self.styles["panel_title"]).grid( + row=0, column=0, sticky="w", padx=theme.SP_3, + pady=(theme.SP_2, 0)) + self.mode_button = ttk.Button(panel, text=SIMPLE_MODE_LABEL, + style=self.styles["button"], + command=self.toggle_mode) + self.mode_button.grid(row=0, column=4, sticky="e", padx=theme.SP_3, + pady=(theme.SP_2, 0)) + + self.dealer_var = tk.StringVar() + self.wave_var = tk.StringVar() + self.all_var = tk.IntVar(value=0) + + ttk.Label(panel, text="Bayi no (8 hane)", style=self.styles["field_label"], + width=16, anchor="e").grid( + row=1, column=0, sticky="e", padx=(theme.SP_3, theme.SP_2), + pady=theme.SP_2) + self.dealer_entry = ttk.Entry(panel, textvariable=self.dealer_var, + width=14, style=self.styles["entry"]) + self.dealer_entry.grid(row=1, column=1, sticky="w", pady=theme.SP_2) + self.dealer_entry.bind("", lambda _e: self._on_dealer_change()) + + ttk.Label(panel, text="Dalga", style=self.styles["field_label"], + width=8, anchor="e").grid( + row=1, column=2, sticky="e", padx=(theme.SP_5, theme.SP_2), + pady=theme.SP_2) + self.wave_combo = ttk.Combobox(panel, textvariable=self.wave_var, + values=list(WAVES), width=14, + state="readonly") + self.wave_combo.grid(row=1, column=3, sticky="w", pady=theme.SP_2) + self.wave_combo.bind("<>", + lambda _e: self._on_target_change()) + + ttk.Checkbutton(panel, text="Tüm filo (dikkat)", variable=self.all_var, + style=self.styles["panel_check"], + command=self._on_target_change).grid( + row=1, column=4, sticky="w", padx=theme.SP_5, pady=theme.SP_2) + + self.target_status = ttk.Label(panel, text="", + style=self.styles["panel_muted"]) + self.target_status.grid(row=2, column=0, columnspan=5, sticky="w", + padx=theme.SP_3, pady=(0, theme.SP_2)) + + # -- eylem cubugu ------------------------------------------------------ + def _build_footer(self) -> None: + """Eylem cubugu, IKI satir: eylem + durum, altinda sessiz araclar. + + Tek satira sigdirilan cubukta dugmeler birbirini sikistiriyor ve + sonuncusunun yazisi kirpiliyordu (olculdu: "Cikis" dugmesi "Ck" + gorunuyordu). Birincil eylem kendi satirini alir; yardimcilar ikinci + satirda durur, boylece hicbir kontrol digerinin yerini yemez. + """ + footer = ttk.Frame(self.root, style=self.styles["frame"]) + footer.grid(row=5, column=0, sticky="ew", padx=theme.SP_4, + pady=(theme.SP_3, theme.SP_4)) + footer.columnconfigure(0, weight=1) + + action = ttk.Frame(footer, style=self.styles["frame"]) + action.grid(row=0, column=0, sticky="ew") + self.run_button = ttk.Button(action, text=RUN_BUTTON_LABEL, + style=self.styles["accent_button"], + command=self._on_run_clicked) + self.run_button.pack(side="left") + # Kapali bir yazma isleminin NEDENI, dugmenin yanindaki ayni satirda + # durur (docs/DESIGN.md "Privilege": gizleme yok, nedeni goster). + self.run_reason = ttk.Label(action, text="", style=self.styles["app_warn"]) + self.run_reason.pack(side="left", padx=(theme.SP_3, 0)) + self.status = ttk.Label(action, text="HAZIR", style=self.styles["status"]) + self.status.pack(side="right") + + tools = ttk.Frame(footer, style=self.styles["frame"]) + tools.grid(row=1, column=0, sticky="ew", pady=(theme.SP_2, 0)) + ttk.Button(tools, text="Çıktıyı temizle", style=self.styles["button"], + command=self._clear_output).pack(side="left") + self.cancel_button = ttk.Button(tools, text="Çalışanı iptal et", + style=self.styles["button"], + command=self._cancel, state="disabled") + self.cancel_button.pack(side="left", padx=(theme.SP_2, 0)) + self.check_var = tk.IntVar(value=0) + ttk.Checkbutton(tools, text="Yalnız denetim (--check)", + variable=self.check_var, + style=self.styles["check"]).pack(side="left", + padx=(theme.SP_3, 0)) + self.output_button = ttk.Button(tools, text=OUTPUT_HIDE_LABEL, + style=self.styles["quiet_button"], + command=self._toggle_output) + self.output_button.pack(side="left", padx=(theme.SP_2, 0)) + + # Tek cikis kontrolu: burada (detayli mod) ya da basit modda ucuncu + # buyuk dugme olarak. Ikisi AYNI ANDA gorunmez (olculen sorun: "Cik" + # iki kez duruyordu). + self.exit_button = ttk.Button(tools, text="Çıkış", + style=self.styles["button"], + command=self.root.destroy) + + # Depo ve katalog kaynagi: sessiz bir satir. Baslik bandini token + # yuksekliginde (56px) tutmak icin banddan asagi alindi ve hicbir + # dugmeyle yer yarisi yapmamasi icin kendi satirina konuldu: depo yolu + # okunmasi gereken bir bilgi degil, gorunur kalmasi yeter. + ttk.Label( + footer, + text=f"Depo: {self.ctx.repo_root} · {self.backend.name}", + style=self.styles["faint"], + ).grid(row=2, column=0, sticky="w", pady=(theme.SP_2, 0)) + + # -- basit mod --------------------------------------------------------- + def _build_simple_mode(self, parent) -> None: + """Basit mod: iki is karari ve TEK cikis dugmesi. + + Cikis burada ucuncu buyuk dugmedir; alt cubuktaki kucuk "Cikis" + dugmesi bu modda gizlenir, boylece ayni eylem iki kez durmaz. + """ + box = ttk.Frame(parent, style=self.styles["panel"]) + box.pack(fill="both", expand=True) + inner = ttk.Frame(box, style=self.styles["panel"]) + inner.pack(fill="both", expand=True, padx=theme.SP_6, pady=theme.SP_6) + ttk.Label(inner, text="Ne yapmak istiyorsunuz?", + style=self.styles["section"]).pack(anchor="w", + pady=(0, theme.SP_4)) + for label in SIMPLE_MODE_BUTTONS: + command = { + "Kur": self._simple_install, + "Durum": self._simple_status, + "Çıkış": self.root.destroy, + }[label] + # Aksan yalnizca "operatorun geldigi eylem" icin: Kur. + style_name = (self.styles["big_accent_button"] if label == "Kur" + else self.styles["big_button"]) + button = ttk.Button(inner, text=label, command=command, + style=style_name, width=18) + button.pack(fill="x", pady=theme.SP_2) + if label == "Kur": + self.install_button = button + ttk.Label( + inner, + text=( + "Kur: bu cihazı kurar (bayi no gerekir). Durum: salt-okunur özet.\n" + "Daha fazlası için üstteki '" + SIMPLE_MODE_LABEL + "' düğmesini kullanın." + ), + style=self.styles["panel_muted"], + justify="left", + ).pack(anchor="w", pady=(theme.SP_4, 0)) + self._apply_privilege_controls() + + def _simple_install(self) -> None: + choice = self._choice_dialog( + "Kurulum", + "Bu cihazda ne yapılacak?\n\n" + "Ön kontrol (--check) hiçbir şey yazmaz; kurulum cihazı değiştirir.", + (("Ön kontrol (--check)", "install-preflight"), + ("Kurulumu başlat", "install-local"), + ("Vazgeç", None)), + ) + if not choice: + return + operation = self._ops_by_id.get(choice) + if operation is not None: + self._execute(operation) + + def _simple_status(self) -> None: + operation = self._ops_by_id.get("info-summary") + if operation is None: + return + self._execute(operation) + + # -- detayli mod ------------------------------------------------------- + def _build_detail_mode(self, parent) -> None: + """Detayli mod: ozet serit + bes kategori sekmesi. + + Ozet seritte TEK buyuk rakam var (islem sayisi): DESIGN.md kural 3, + "her gorunumde tek yuksek sesli rakam". Geri kalan her sey sessiz ve + hizali. Yazma islemlerinin sayisi ayrica durur cunku "kac islem cihazi + degistirir?" sorusu bu ekranda sorulur. + """ + strip = ttk.Frame(parent, style=self.styles["frame"]) + strip.pack(fill="x", pady=(0, theme.SP_3)) + operations = tuple(self._ops_by_id.values()) + writes = sum(1 for op in operations if operation_is_write(op)) + ttk.Label(strip, text=str(len(operations)), + style=self.styles["figure"]).pack(side="left") + ttk.Label(strip, text="işlem", style=self.styles["muted"]).pack( + side="left", padx=(theme.SP_1, theme.SP_4)) + ttk.Label(strip, text=f"{writes} yıkıcı", style=self.styles["muted"]).pack( + side="left", padx=(0, theme.SP_3)) + ttk.Label(strip, text=f"{len(operations) - writes} salt-okunur", + style=self.styles["muted"]).pack(side="left") + if self.privilege_level == PRIVILEGE_READ_ONLY: + ttk.Label(strip, text=f"yazma işlemleri kapalı · {NON_ROOT_DISABLED_HINT}", + style=self.styles["app_warn"]).pack(side="right") + + for category in CATEGORIES: + # Satirlar backend'den gelir (katalog sirasi korunur); backend bir + # kategoriyi bos birakirsa yerlesik tabloya dusulur. + self._rows[category] = tuple( + op for op in self._ops_by_id.values() if op.category == category + ) or operations_by_category(category) + + self.notebook = ttk.Notebook(parent) + self.notebook.pack(fill="both", expand=True) + for category in CATEGORIES: + frame = ttk.Frame(self.notebook, style=self.styles["frame"]) + self.notebook.add(frame, text=category) + self._build_category_tab(frame, category) + + def _build_category_tab(self, frame, category: str) -> None: + """Sekme: solda islem listesi (suzgecli), sagda secenekler paneli.""" + frame.columnconfigure(0, weight=3) + frame.columnconfigure(1, weight=2) + frame.rowconfigure(0, weight=1) + + left = ttk.Frame(frame, style=self.styles["panel"]) + left.grid(row=0, column=0, sticky="nsew", padx=(0, theme.SP_3)) + left.columnconfigure(0, weight=1) + left.rowconfigure(2, weight=1) + + head = ttk.Frame(left, style=self.styles["panel"]) + head.grid(row=0, column=0, columnspan=2, sticky="ew", padx=theme.SP_3, + pady=(theme.SP_3, theme.SP_2)) + ttk.Label(head, text="İŞLEMLER", style=self.styles["panel_title"]).pack(side="left") + ttk.Label(head, text=f"{len(self._rows[category])} işlem", + style=self.styles["panel_faint"]).pack(side="right") + + filt = ttk.Frame(left, style=self.styles["panel"]) + filt.grid(row=1, column=0, columnspan=2, sticky="ew", padx=theme.SP_3, + pady=(0, theme.SP_2)) + ttk.Label(filt, text="Süz:", style=self.styles["field_label"], + width=5, anchor="e").pack(side="left", padx=(0, theme.SP_2)) + query = tk.StringVar() + self._filters[category] = query + entry = ttk.Entry(filt, textvariable=query, style=self.styles["entry"]) + entry.pack(side="left", fill="x", expand=True) + entry.bind("", lambda _e, c=category: self._render_rows(c)) + + columns = ("islem", "kapsam", "tur", "durum") + tree = ttk.Treeview(left, columns=columns, show="headings", height=14) + tree.heading("islem", text="İşlem") + tree.heading("kapsam", text="Kapsam") + tree.heading("tur", text="Tür") + tree.heading("durum", text="Durum") + tree.column("islem", width=320, anchor="w") + tree.column("kapsam", width=200, anchor="w") + tree.column("tur", width=100, anchor="center") + tree.column("durum", width=150, anchor="center") + tree.grid(row=2, column=0, sticky="nsew") + scroll = ttk.Scrollbar(left, orient="vertical", command=tree.yview) + tree.configure(yscrollcommand=scroll.set) + scroll.grid(row=2, column=1, sticky="ns") + tree.bind( + "<>", + lambda _e, t=tree, c=category: self._on_operation_selected(t, c), + ) + # Yazma islemleri listede KALIR (gizlenmez): tur sutunu "YIKICI" yazar + # ve yetkisiz oturumda durum sutunu "KAPALI — sudo bf" der. + tree.tag_configure("destructive", foreground=theme.DANGER) + tree.tag_configure("blocked", foreground=theme.IDLE) + setattr(self, f"_tree_{category}", tree) + self._render_rows(category) + + right = ttk.Frame(frame, style=self.styles["panel"]) + right.grid(row=0, column=1, sticky="nsew") + right.columnconfigure(0, weight=1) + ttk.Label(right, text="SEÇENEKLER VE AÇIKLAMA", + style=self.styles["panel_title"]).grid( + row=0, column=0, sticky="w", padx=theme.SP_3, + pady=(theme.SP_3, theme.SP_2)) + detail_label = ttk.Label(right, text="Bir işlem seçin.", + style=self.styles["panel_label"], + wraplength=420, justify="left") + detail_label.grid(row=1, column=0, sticky="w", padx=theme.SP_3) + options_frame = ttk.Frame(right, style=self.styles["panel"]) + options_frame.grid(row=2, column=0, sticky="ew", padx=theme.SP_3, + pady=theme.SP_3) + options_frame.columnconfigure(1, weight=1) + # Sekme basina ayri secenek alani: her sekme kendi islemini gosterir. + self._panes = getattr(self, "_panes", {}) + self._panes[category] = (detail_label, options_frame) + ttk.Label( + right, + text="Komut her zaman önce gösterilir ve onaysız çalıştırılmaz.", + style=self.styles["panel_muted"], + wraplength=420, + justify="left", + ).grid(row=3, column=0, sticky="w", padx=theme.SP_3, + pady=(0, theme.SP_3)) + + def _render_rows(self, category: str) -> None: + """Liste satirlarini (varsa suzgece gore) yeniden cizer.""" + tree = getattr(self, f"_tree_{category}") + query = self._filters[category].get().strip().casefold() + selected = tree.selection() + for item in tree.get_children(): + tree.delete(item) + for op in self._rows[category]: + if query and query not in f"{op.label} {op.id}".casefold(): + continue + blocked = write_blocked_reason(op) is not None + tags = ("destructive",) if op.destructive else () + if blocked: + tags += ("blocked",) + tree.insert( + "", "end", iid=op.id, + values=( + op.label, + SCOPE_LABELS.get(op.scope, op.scope), + TYPE_WRITE_LABEL if op.destructive else TYPE_READ_LABEL, + BLOCKED_LABEL if blocked else AVAILABLE_LABEL, + ), + tags=tags, + ) + for item in selected: + if tree.exists(item): + tree.selection_set(item) + break + + def _on_operation_selected(self, tree, category: str) -> None: + selection = tree.selection() + if not selection: + return + operation = self._ops_by_id.get(selection[0]) + if operation is None: + return + self._selected_operation = operation + self._render_options(operation, category) + self._refresh_run_control() + + def _operation_summary(self, operation: Operation) -> str: + """Secili islemin ekranda gorunen ozeti (kapsam + yetki + tur).""" + text = operation.label + "\n\n" + (operation.description or "Açıklama yok.") + if operation.playbook: + text += f"\n\nAnsible playbook: {PLAYBOOK_DIR_REL}/{operation.playbook}" + text += f"\nKapsam: {SCOPE_LABELS.get(operation.scope, operation.scope)}" + text += ("\nYetki: root gerekir (sudo bf)" if operation.needs_root + else "\nYetki: gerekmez (salt-okunur)") + if operation.destructive: + text += "\n\nBU İŞLEM YIKICIDIR: iki kez onay istenir." + return text + + def _render_options(self, operation: Operation, category: str) -> None: + """Secenekleri hizali bir izgaraya yerlestirir (etiketler ayni hizada).""" + detail_label, options_frame = self._panes[category] + for child in options_frame.winfo_children(): + child.destroy() + self.option_widgets = {} + detail_label.configure(text=self._operation_summary(operation)) + row = 0 + for spec in operation.options: + ttk.Label(options_frame, text=spec.label + ":", + style=self.styles["field_label"], + width=self.FIELD_LABEL_WIDTH, anchor="e").grid( + row=row, column=0, sticky="e", padx=(0, theme.SP_2), + pady=theme.SP_1) + if spec.kind == "bool": + var = tk.BooleanVar(value=spec.default == "1") + widget = ttk.Checkbutton(options_frame, variable=var, + style=self.styles["panel_check"]) + self.option_widgets[spec.name] = ("bool", var) + elif spec.kind == "choice": + var = tk.StringVar(value=spec.default or (spec.choices[0] if spec.choices else "")) + widget = ttk.Combobox(options_frame, textvariable=var, + values=list(spec.choices), width=24, + state="readonly") + self.option_widgets[spec.name] = ("str", var) + else: + var = tk.StringVar(value=spec.default) + widget = ttk.Entry(options_frame, textvariable=var, width=26) + self.option_widgets[spec.name] = ("str", var) + widget.grid(row=row, column=1, sticky="w", pady=theme.SP_1) + if spec.hint: + ttk.Label(options_frame, text=spec.hint, + style=self.styles["panel_faint"], wraplength=200, + justify="left").grid(row=row, column=2, sticky="w", + padx=(theme.SP_2, 0)) + row += 1 + + badges = ttk.Frame(options_frame, style=self.styles["panel"]) + self._badge(badges, + TYPE_WRITE_LABEL if operation.destructive else TYPE_READ_LABEL, + self.styles["badge_destructive"] if operation.destructive + else self.styles["badge_readonly"]).pack(side="left") + if write_blocked_reason(operation): + self._badge(badges, BLOCKED_LABEL, + self.styles["badge_closed"]).pack(side="left", + padx=(theme.SP_2, 0)) + badges.grid(row=row, column=0, columnspan=3, sticky="w", + pady=(theme.SP_2, 0)) + + # -- hedef ------------------------------------------------------------- + def _load_inventory(self) -> None: + waves = self.backend.list_waves() + self.wave_combo.configure(values=list(waves)) + if waves: + self.wave_var.set(waves[0]) + note = self.backend.inventory_note() + self.output.write_now(f"[i] {note}") + self._set_status("HAZIR", "idle") + self._on_target_change() + + def _on_dealer_change(self) -> None: + value = self.dealer_var.get().strip() + problem = dealer_error(value) if value else None + # Alanin kendisi de durumu gosterir: gecersiz giris cercevede. + self.dealer_entry.configure( + style=self.styles["invalid_entry"] if problem else self.styles["entry"] + ) + if problem: + self.target_status.configure(text=problem, + style=self.styles["panel_danger"]) + elif value: + self.target_status.configure( + text=f"Bayi no geçerli: {dealer_to_device_id(value)}", + style=self.styles["panel_ok"]) + self._set_status("HAZIR", "idle") + else: + self.target_status.configure(text="", style=self.styles["panel_muted"]) + self._update_header_target() + + def _on_target_change(self) -> None: + if self.all_var.get(): + self.target_status.configure( + text="Tüm filo seçildi: dalga kapılı işlemler dalga dalga ilerler.", + style=self.styles["panel_muted"], + ) + self.dealer_entry.configure(style=self.styles["entry"]) + else: + self._on_dealer_change() + self._update_header_target() + + def _update_header_target(self) -> None: + """Basliktaki hedef kimligi her secim degisikliginde guncellenir.""" + target = self.current_target() + if target is None or (target.kind == "dealer" + and not validate_dealer(target.value)): + self.header_target.configure(text="— seçilmedi") + return + self.header_target.configure(text=target.label) + + def current_target(self) -> Target | None: + if self.all_var.get(): + return Target("all", "all") + dealer = self.dealer_var.get().strip() + if dealer: + return Target("dealer", dealer) + wave = self.wave_var.get().strip() + if wave: + return Target("group", wave) + return None + + # -- yetki ve birincil eylem ------------------------------------------ + def _apply_privilege_controls(self) -> None: + """Yetkisiz oturum: yazma dugmeleri KAPALI, nedeni dugmenin uzerinde. + + Gizleme yok: yetkisiz operatorde "bu islem var ama kapali" bilgisi + gorunur kalmali, yoksa araci eksik sanir (docs/DESIGN.md "Privilege"). + """ + if hasattr(self, "install_button"): + if self.privilege_level == PRIVILEGE_READ_ONLY: + self.install_button.configure( + text="Kur — kapalı (yönetici yetkisi gerekir: sudo bf)", + state="disabled", + ) + else: + self.install_button.configure(text=SIMPLE_MODE_BUTTONS[0], + state="normal") + if hasattr(self, "run_button"): + self._refresh_run_control() + + def _refresh_run_control(self) -> None: + """Birincil eylem: aksan, yikici icin kirmizi, yetkisizde kapali.""" + operation = self._selected_operation + self.run_reason.configure(text="") + if operation is None: + self.run_button.configure(text=RUN_BUTTON_LABEL, + style=self.styles["accent_button"], + state="normal") + return + reason = write_blocked_reason(operation) + if reason: + self.run_button.configure(text=RUN_BUTTON_LABEL + " — kapalı", + style=self.styles["button"], + state="disabled") + self.run_reason.configure(text=reason, style=self.styles["app_warn"]) + return + self.run_button.configure( + text=RUN_BUTTON_LABEL, + style=(self.styles["danger_button"] if operation.destructive + else self.styles["accent_button"]), + state="normal", + ) + if operation.destructive: + self.run_reason.configure(text="Yıkıcı işlem: iki kez onay istenir.", + style=self.styles["app_warn"]) + + def _toggle_output(self) -> None: + """Kanit panelini gizler/gosterir; sonuc durum rozetinde kalir.""" + self._output_visible = not self._output_visible + self.output.set_visible(self._output_visible) + self.output_button.configure( + text=OUTPUT_HIDE_LABEL if self._output_visible else OUTPUT_SHOW_LABEL + ) + + # -- mod degistirme ---------------------------------------------------- + def show_mode(self, *, full: bool) -> None: + self.simple_frame.pack_forget() + self.detail_frame.pack_forget() + if full: + self.detail_frame.pack(fill="both", expand=True) + self.mode_button.configure(text=SIMPLE_MODE_BACK_LABEL) + # Tek cikis kontrolu: detayli modda alt cubukta, basit modda ucuncu + # buyuk dugme olarak durur; ikisi ayni anda gorunmez. + self.exit_button.pack(side="right") + else: + self.simple_frame.pack(fill="both", expand=True) + self.mode_button.configure(text=SIMPLE_MODE_LABEL) + self.exit_button.pack_forget() + self.full_mode = full + + def toggle_mode(self) -> None: + self.show_mode(full=not self.full_mode) + + # -- calistirma akisi -------------------------------------------------- + def _on_run_clicked(self) -> None: + if self._selected_operation is None: + messagebox.showinfo( + "Seçim gerekli", + "Önce listeden bir işlem seçin, sonra 'Komutu göster ve çalıştır' düğmesine basın.", + ) + return + self._execute(self._selected_operation) + + def _collect_options(self, operation: Operation) -> dict[str, str]: + options: dict[str, str] = {} + for spec in operation.options: + entry = self.option_widgets.get(spec.name) + if not entry: + continue + kind, variable = entry + if kind == "bool": + options[spec.name] = "1" if variable.get() else "0" + else: + options[spec.name] = str(variable.get()).strip() + return options + + def _execute(self, operation: Operation) -> None: + if self.running: + messagebox.showinfo("Bekleyin", "Zaten çalışan bir işlem var.") + return + target = self.current_target() if operation.is_fleet or operation.needs_dealer else None + if operation.needs_dealer and (target is None or target.kind != "dealer"): + messagebox.showerror( + "Bayi numarası gerekli", + "Bu işlem için bayi numarası girin (8 hane, örn. 12010193).", + ) + return + if target is not None and target.kind == "dealer": + problem = dealer_error(target.value) + if problem: + messagebox.showerror("Geçersiz bayi numarası", problem) + return + options = self._collect_options(operation) + check_mode = bool(self.check_var.get()) + try: + draft = self.backend.build_command( + operation, target, options, check_mode=check_mode + ) + except CommandError as exc: + messagebox.showerror("Komut üretilemedi", str(exc)) + return + except BackendUnavailable as exc: + messagebox.showerror("Backend hatası", str(exc)) + return + + # Salt-okunur rapor (komut yok): dogrudan cikti alanina yazilir. + if draft.is_report_only: + self._current_plan = draft + self._show_plan(draft, title=f"Salt-okunur ekran: {operation.label}") + self._start_run(draft) + return + + # 1) Taslak komut GORSTERILIR ve onaylanir: onaysiz hicbir sey calismaz. + if not self._confirm_plan(draft, operation, target, title="Komutu onaylayın"): + self.output.write_now("[i] Kullanıcı vazgeçti; komut çalıştırılmadı.") + return + + # 2) Acik kapilar: dalga adi, production, filo geneli, yikici ikinci onay. + grants = self._collect_grants(operation, target) + if grants is None: + self.output.write_now("[i] Kapı onayı verilmedi; işlem iptal edildi.") + return + + # 3) Kapilar eklendikten sonraki KESIN komut yeniden gosterilir. + try: + plan = self.backend.build_command( + operation, target, options, grants=grants, check_mode=check_mode + ) + except CommandError as exc: + messagebox.showerror("Komut üretilemedi", str(exc)) + return + if plan.lines != draft.lines: + if not self._confirm_plan( + plan, operation, target, + title="KESİN KOMUT (onayların eklendiği son hâl)", + ): + self.output.write_now("[i] Kesin komut onaylanmadı; işlem iptal edildi.") + return + + self._current_plan = plan + self._show_plan(plan, title=f"Çalıştırılıyor: {operation.label}") + self._start_run(plan) + + def _confirm_plan( + self, plan: CommandPlan, operation: Operation, + target: Target | None, title: str, + ) -> bool: + """Komutu gosteren onay penceresi (yikici islemde uyari vurgusu).""" + preview = preview_text(plan, operation=operation, target=target) + return bool( + messagebox.askyesno( + title, + preview + "\n\nBu komut çalıştırılsın mı?", + icon="warning" if plan.destructive else "question", + default="no" if plan.destructive else "yes", + ) + ) + + def _collect_grants( + self, operation: Operation, target: Target | None + ) -> dict[str, bool] | None: + """Backend'in istedigi acik onaylari sorar; iptalde None doner.""" + try: + steps = self.backend.gate_steps(operation, target) + except CommandError as exc: + messagebox.showerror("Kapı onayları alınamadı", str(exc)) + return None + grants: dict[str, bool] = {} + for step in steps: + if step.kind == "token": + answer = self._token_dialog(step.prompt or "Onay", step.message, step.token) + if answer is None or answer.strip() != step.token: + return None + else: + if not messagebox.askyesno( + step.prompt or "Onay", + step.message or "Devam edilsin mi?", + icon="warning", + default="no", + ): + return None + for name in step.unlocks: + grants[name] = True + return grants + + def _show_plan(self, plan: CommandPlan, title: str) -> None: + """Komutu/raporu cikti alanina yazar (kayit ve gozden gecirme icin).""" + self.output.write_now("") + self.output.write_now("=" * 72) + self.output.write_now(f" {title}") + if plan.report_lines and not plan.lines: + for line in plan.report_lines: + self.output.write_now(" " + line) + else: + for line in plan.lines: + self.output.write_now(" " + line) + self.output.write_now("=" * 72) + + def _start_run(self, plan: CommandPlan) -> None: + if plan.needs_root and not write_operations_enabled(): + # The button is disabled for this case, so reaching here means the + # gate was bypassed (stale widget state, a future caller). Refusing + # in the one place every run goes through keeps the rule true for + # the whole surface instead of one control. + self.output.write_now("[ENGELLENDİ] " + NON_ROOT_DISABLED_HINT) + self._set_status("YETKİ YOK", "danger") + return + self.running = True + self.cancel_event.clear() + self.run_button.configure(state="disabled") + self.cancel_button.configure(state="normal") + self._set_status("ÇALIŞIYOR", "info") + + def worker() -> None: + try: + result = self.backend.run( + plan, on_line=self.output.append, cancel=self.cancel_event + ) + except Exception as exc: # backend hatasi arayuzu kilitlemesin + self.output.append(f"[HATA] Çalıştırma başarısız: {exc}") + result = RunResult(1, False, "") + self.root.after(0, lambda: self._finish_run(result)) + + threading.Thread(target=worker, daemon=True).start() + + def _finish_run(self, result: RunResult) -> None: + self.running = False + self._refresh_run_control() + self.cancel_button.configure(state="disabled") + if result.ok: + self.output.append("[OK] Komut başarıyla tamamlandı (çıkış kodu 0).") + self._set_status("TAMAM (çıkış kodu 0)", "ok") + else: + self.output.append(f"[HATA] Komut {result.exit_code} koduyla bitti.") + self._set_status(f"HATA (çıkış kodu {result.exit_code})", "danger") + + def _cancel(self) -> None: + self.cancel_event.set() + self._set_status("İPTAL İSTENDİ", "warn") + + def _clear_output(self) -> None: + self.output.clear() + + # -- kucuk diyaloglar -------------------------------------------------- + def _choice_dialog(self, title: str, message: str, + choices: Sequence[tuple[str, str | None]]) -> str | None: + dialog = tk.Toplevel(self.root) + dialog.title(title) + dialog.configure(bg=theme.BG_APP) + dialog.transient(self.root) + dialog.grab_set() + result: dict[str, str | None] = {"value": None} + + ttk.Label(dialog, text=message, style=self.styles["dialog"], + wraplength=460, justify="left").pack( + padx=theme.SP_4, pady=theme.SP_4, anchor="w" + ) + + def choose(value: str | None) -> None: + result["value"] = value + dialog.destroy() + + row = ttk.Frame(dialog, style=self.styles["frame"]) + row.pack(fill="x", padx=theme.SP_4, pady=(0, theme.SP_4)) + for index, (label, value) in enumerate(choices): + # Ilk secenek aksandir (operatorun geldigi eylem), "Vazgec" sessiz. + style_name = (self.styles["quiet_button"] if value is None + else self.styles["accent_button"] if index == 0 + else self.styles["button"]) + ttk.Button(row, text=label, style=style_name, + command=lambda v=value: choose(v)).pack( + side="left", padx=(0, theme.SP_2) + ) + dialog.wait_window() + return result["value"] + + def _token_dialog(self, title: str, message: str, token: str) -> str | None: + dialog = tk.Toplevel(self.root) + dialog.title(title) + dialog.configure(bg=theme.BG_APP) + dialog.transient(self.root) + dialog.grab_set() + result: dict[str, str | None] = {"value": None} + ttk.Label(dialog, text=message, style=self.styles["dialog"], + wraplength=460, justify="left").pack( + padx=theme.SP_4, pady=theme.SP_4, anchor="w" + ) + var = tk.StringVar() + entry = ttk.Entry(dialog, textvariable=var, width=32, + style=self.styles["entry"]) + entry.pack(padx=theme.SP_4, anchor="w") + entry.focus_set() + + def confirm() -> None: + result["value"] = var.get().strip() + dialog.destroy() + + def cancel() -> None: + result["value"] = None + dialog.destroy() + + row = ttk.Frame(dialog, style=self.styles["frame"]) + row.pack(fill="x", padx=theme.SP_4, pady=theme.SP_4) + ttk.Button(row, text="Onayla", style=self.styles["accent_button"], + command=confirm).pack(side="left", padx=(0, theme.SP_2)) + ttk.Button(row, text="Vazgeç", style=self.styles["quiet_button"], + command=cancel).pack(side="left") + dialog.bind("", lambda _e: confirm()) + dialog.wait_window() + return result["value"] + + +# --------------------------------------------------------------------------- +# Katalog yazdirma (pencere ACMADAN dogrulama icin) +# --------------------------------------------------------------------------- +def print_catalogue(backend, stream=None) -> None: + out = stream or sys.stdout + operations = backend.list_operations() + print(f"Blueforce Field OS — işlem kataloğu ({len(operations)} işlem)", file=out) + for category in CATEGORIES: + items = [op for op in operations if op.category == category] + print(f"\n== {category} ({len(items)} işlem) ==", file=out) + for op in items: + kind = "YIKICI" if op.destructive else "salt-okunur" + playbook = op.playbook or "-" + print( + f" {op.id:<24} {op.label:<46} kapsam={op.scope:<8} {kind:<11} playbook={playbook}", + file=out, + ) + + +# --------------------------------------------------------------------------- +# Yetki kapisi +# --------------------------------------------------------------------------- +def is_root() -> bool: + """True when the process can install, write state and drive Ansible. + + The installer writes to the filesystem, manages services and applies the + firewall baseline, so the GUI is expected to run under sudo. Reports read + the repository and the inventory and work without it, which is why the + console still starts as a normal user and explains the difference instead + of refusing to launch. + """ + geteuid = getattr(os, "geteuid", None) + return True if geteuid is None else geteuid() == 0 + + +ROOT_REQUIRED_NOTICE = ( + "Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik " + "gerektiren işlemler kapalıdır. Tam yetki için: sudo bf" +) +NON_ROOT_DISABLED_HINT = "Bu işlem yönetici yetkisi gerektirir (sudo bf)." + + +def write_operations_enabled() -> bool: + """Whether operations that change the device may be offered.""" + return is_root() + + +# --------------------------------------------------------------------------- +# Baslatma +# --------------------------------------------------------------------------- +def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser( + prog="python3 -m bfos.ui_gui", + description="Blueforce Field OS masaüstü arayüzü (Türkçe, tkinter).", + ) + parser.add_argument("--full", action="store_true", + help="Doğrudan detaylı modda başlat (kategori sekmeleri).") + parser.add_argument("--repo", default=None, help="Depo kökü (varsayılan: bfos'un üst dizini).") + parser.add_argument("--inventory", default=None, help="Ansible envanteri (varsayılan: otomatik).") + parser.add_argument("--dry-run", action="store_true", + help="Komutları göster, hiçbir şey çalıştırma.") + parser.add_argument("--list", action="store_true", + help="Pencere açmadan işlem kataloğunu yazdır ve çık.") + return parser.parse_args(argv) + + +def main(argv: Sequence[str] | None = None) -> int: + args = parse_args(argv) + ctx = GuiContext.detect(repo=args.repo, inventory=args.inventory, dry_run=args.dry_run) + backend, note = load_backend(ctx) + + if args.list: + print_catalogue(backend) + print(f"\n[i] {note}") + return 0 + + if not HAVE_TKINTER: + print(tkinter_missing_message(TK_IMPORT_ERROR), file=sys.stderr) + return 3 + problem = headless_error() + if problem: + print(problem, file=sys.stderr) + return 3 + + root = tk.Tk() + try: + BfGui(root, backend, ctx, full_mode=args.full) + except tk.TclError as exc: # DISPLAY var ama erisilemiyor + print(window_start_error(exc), file=sys.stderr) + return 3 + root.mainloop() + return 0 + + +if __name__ == "__main__": # pragma: no cover + sys.exit(main()) + + + +# + +> Kısa özet: bu doküman neyi kapsar, kimin içindir, hangi kararı verir. (2–3 cümle) + +- Dosya: `docs/NN-KONU.md` +- İlgili kararlar: `24-DECISION-LOG.md#` +- Durum: [ ] Taslak / [ ] İncelemede / [ ] Onaylı + +**Şablon kuralları (bu repoda zorunlu):** + +- Bölümler `## 1.` … `## 13.` sırasıyla ve atlanmadan doldurulur; ek bölümler yalnız `## Ek: ` başlığıyla açılır (numaralı bölüm eklenmez). +- Her numaralı dokümanda **en az bir Mermaid** diyagram bloğu bulunur (akış, katman, durum veya kapı diyagramı). +- Dil: açıklamalar Türkçe; komut, dosya, servis, paket ve terim adları İngilizce kalır. +- Her teknik iddia kaynaklıdır: KARAR bloklarında resmi kaynak URL + sürüm + doğrulama tarihi yazılır; doğrulanamayan davranış "LAB gerekli" etiketiyle açık bırakılır. +- Dosya numarası bir kez verilir ve yeniden kullanılmaz; kararlar (`24-DECISION-LOG.md`) **append-only**dir, mevcut karar silinmez/yeniden numaralanmaz. +- Secret yasak: örneklerde yer tutucu kullanılır (parola, private key, token, cihaz-spesifik kimlik yazılmaz). +- Bu dosya (`_TEMPLATE.md`) numaralı değildir ve `docs-site`'a alınmaz. + +--- + +## 1. Amaç + +Bu dokümanın neden var olduğu, hangi sorunu çözdüğü. + +## 2. Kapsam + +Kapsam içi ve kapsam dışı maddeler: + +- Kapsam içi: ... +- Kapsam dışı: ... + +## 3. Kararlar + +Her teknik karar için aşağıdaki karar bloğunu kullan: + +```text +KARAR: +GEREKÇE: +ALTERNATİF: +RİSK: +MALİYET: <Ücretsiz / Ücretli (işaretli) + not> +LİSANS: +``` + +Örnek: + +```text +KARAR: Filo yönetiminde Ansible + Semaphore UI Community kullanılır. +GEREKÇE: Agent gerektirmez, SSH tabanlıdır, 700 cihaz ölçeğinde yeterlidir. +ALTERNATİF: SaltStack — daha karmaşık kurulum nedeniyle elendi. +RİSK: Playbook hatası filoya yayılabilir; önce LAB(2) grubunda çalıştırılır. +MALİYET: Ücretsiz (self-hosted). +LİSANS: Semaphore Community (kaynak doğrulanacak) — URL + sürüm + tarih eklenecek. +``` + +## 4. Neden Bu Karar? + +Kararların arkasındaki teknik ve operasyonel gerekçeler. Sadelik kuralı burada denetlenir: Kubernetes, microservice, gereksiz agent/DB/cloud öneriliyorsa neden reddedildiği yazılır. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| ... | ... | ... | Elendi / Yedek | + +## 6. Avantajlar + +- ... + +## 7. Dezavantajlar + +- ... + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| ... | Düşük/Orta/Yüksek | ... | ... | + +## 9. Uygulama Planı + +Numaralı adımlar; komutlar İngilizce orijinal adıyla, açıklamalar Türkçe: + +1. ... +2. ... + +```bash +# örnek komut bloğu +hostnamectl set-hostname bf-12010193 +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| ... | ... | LAB(2) | + +## 11. Rollback + +Başarısızlıkta önceki duruma dönüş adımları: + +1. ... +2. ... + +## 12. Kontrol Listesi + +- [ ] ... +- [ ] ... + +## 13. Açık Sorular + +- [ ] ... (sahibi + tarih ile) + +--- + +## Ek: Mermaid Örneği + +```mermaid +flowchart LR + Saha["bf-12010193
    (saha PC'si)"] -->|WireGuard| Merkez["Merkez sunucu"] + Merkez --> Ansible["Ansible/Semaphore"] + Merkez --> Monitor["Monitoring"] +``` +
    + + +# 01 — Sistem Mimarisi + +> Kısa özet: 700 saha cihazlı Blueforce filosunun uçtan uca mimarisi: saha PC'si, WireGuard ağı, 4 erişim kanalı, filo otomasyonu, monitoring ve update zinciri tek bakışta. Kararların görsel karşılığıdır. Bu turda mimari iki noktada kesinleşti: **V1 medyası tek USB Field OS ISO'dur** (autoinstall motoru + offline APT + firstboot; upstream ISO + NoCloud seed geri dönüş yolu — K-20) ve **xRDP her zaman hazırdır** (`bf-gui-*` yalnız yerel fiziksel GUI'yi kontrol eder — K-22). +> +> - Dosya: `docs/01-ARCHITECTURE.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-01…K-24` (tüm mimari bu kararlara dayanır; medya için `#K-20`, RDP/yerel GUI ayrımı için `#K-22`, durum modeli için `#K-21`, masaüstü ölçümü için `#K-23`) +> - Durum: [x] Onaylı (Faz 2 kilidi) + +--- + +## 1. Amaç + +Başka bir DevOps mühendisinin filoyu tek dosyadan anlayıp kurmaya başlayabilmesi: hangi bileşen nerede koşar, trafik nasıl akar, cihaz nasıl boot eder, update nasıl yayılır. + +## 2. Kapsam + +- Kapsam içi: saha cihazı katmanları, merkez (VDS) servisleri, ağ/erişim akışı, boot zinciri, update onay akışı. +- Kapsam dışı: kurulum komutları (03/04/05), playbook detayları (09), metrik listesi detayı (14) — ilgili dokümanlara havale. + +## 3. Kararlar + +```text +KARAR: Filo mimarisi: saha = Ubuntu Server 26.04.1+ üzerinde GNOME katmanlı Blueforce Field OS + Docker(MEG) + WireGuard spoke; V1 medya = TEK USB Field OS ISO (medya kökünde autoinstall.yaml + offline APT repo + firstboot; otomatik disk silme yok), geri dönüş yolu = upstream Ubuntu ISO + NoCloud seed USB; merkez = WireGuard hub + RustDesk hbbs/hbbr + MeshCentral + Ansible/Semaphore + Prometheus/Grafana + Uptime Kuma (hepsi self-hosted, ücretsiz katman). xRDP servisi her zaman hazır (`bf-gui-*` yalnız yerel fiziksel GUI'yi yönetir); durum modeli tek yönlüdür: PROVISIONED_OFFLINE → ENROLLED → READY. +GEREKÇE: K-01…K-24 kararlarının birleşimi; hareketli parça en aza indirildi (agent'sız filo, tek Go binary UI, tek konteyner uptime), iki WireGuard-bağımsız erişim kanalıyla tek-nokta körlüğü engellendi. Tek medya teknisyen hatasını azaltır, otomatik disk silme yasağı (interactive storage) veri kaybını önler; xRDP'nin `bf-gui-on`'dan bağımsız olması yerel GUI kapalı cihazda uzaktan kurtarmayı korur. +ALTERNATİF: K8s-tabanlı yönetim / Cloud-merkezli monitoring — sadelik kuralını bozduğu için elendi (bkz. 24 §4). İki medyalı kurulum (upstream ISO + seed) — tek-medya deneyimi olmadığı için V1 yolu olmaktan çıktı, geri dönüş yolu olarak kaldı (K-20). +RİSK: Merkez VDS tek fiziksel nokta; azaltma: yedekleme + hızlı yeniden kurulum (17-RECOVERY), kritik kanalların ayrı VDS'e taşınabilirliği. Remaster medya boot zinciri kanıtlanmazsa assisted akış bloke olur; azaltma: iki medyalı geri dönüş yolu sıcak tutulur. +MALİYET: Ücretsiz (lisans $0; VDS kira bedeli altyapı maliyetidir). +LİSANS: Bileşen lisansları için 24-DECISION-LOG Ek A'ya bakılır. +``` + +> **Güncelleme (2026-09-16):** Bu bölümdeki "V1 medya = upstream ISO + ayrı NoCloud seed USB" ifadesi K-20 ile güncellendi (V1 = tek USB Field OS ISO; upstream + seed = geri dönüş yolu). §9'daki saha imajı akışı ve §12 kontrol listesi aynı PR'da hizalandı; diyagramlar bu kararlarla uyumludur. + +## 4. Neden Bu Karar? + +Öncelik sırası (kesintisiz çalışma > veri kaybı yok > uzaktan erişim > bakım kolaylığı) mimariyi şekillendirdi: boot zinciri her katmanda otomatik toparlanır (systemd + `unless-stopped` + `wg-quick` enable), erişim 4 kanalla yedeklenir (ikisi WireGuard-bağımsız), update'ler onay zincirinden geçmeden sahaya inmez. Hiçbir katman ücretli lisansa dayanmaz. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Tek kanal (yalnızca SSH) | En sade | Tünel çökerse körlük | Elendi | +| Cloud monitoring (Netdata Cloud vb.) | Hızlı kurulum | 5 node free kotası, 700 cihaz ücretli | Elendi | +| K8s-orkestrasyonlu saha | Ölçek esnekliği | 700 mini PC'de gereksiz yük | Elendi | + +## 6. Avantajlar + +- Tek kimlik (`BF-`/`bf-`) tüm katmanlarda join anahtarı — envanterden monitoring'e aynı ad. +- Her akış (erişim/boot/update) diyagramla sabit; runbook'lar bu diyagramlara prosedür yazar. + +## 7. Dezavantajlar + +- Merkez servis sayısı (hub + 2 erişim + fleet + 2 monitoring + docs) ilk kurulumda tek VDS'e sığsa da yük testinden geçmeli. +- Diyagramlar sözleşmedir: bileşen değişirse 3 Mermaid de aynı PR'da güncellenmeli. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Merkez VDS kesintisi | Düşük | Yüksek | Hızlı yeniden kurulum + yedek VDS planı (17) | +| Boot zincirinde race (Docker WG'den önce kalkar) | Orta | Orta | systemd bağımlılıkları + After= kuralları (16) | +| Onaysız update zinciri bypass eder | Düşük | Yüksek | K-11 kilitleri + Semaphore'da onay adımı (10) | + +## 9. Uygulama Planı + +1. Merkez VDS: WireGuard hub → hbbs/hbbr → MeshCentral → Semaphore → Prometheus/Grafana/Kuma sırasıyla kurulur. +2. Saha imajı: Field OS V1 = tek USB Field OS ISO (autoinstall motoru + offline APT repo + firstboot; `interactive-sections: [storage]` ile diski operatör onaylar) → GNOME → Docker → WireGuard spoke → RustDesk/MeshCentral agent → Node Exporter; offline tamamlanırsa durum `PROVISIONED_OFFLINE`, yalnız enrollment ve merkezi kanal doğrulamasından sonra `READY` (26–29). Medya boot etmezse upstream ISO + NoCloud seed yolu devreye girer (K-20). +3. İlk 2 LAB cihazı bu mimariye göre uca eklenir; 3 akış (erişim/boot/update) + GNOME vs XFCE A/B ölçümü (K-23) testlenir. + +```bash +# örnek: cihaz kimliği standardı (K-12) +hostnamectl set-hostname bf-12010193 +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| 3 Mermaid'deki her ok için bağlantı testi | Uçtan uca akış çalışır | LAB(2) | +| VDS down simülasyonu (hbbs kapalı) | SSH-over-WG + MeshCentral ayakta | P1(5) | +| Güç kesintisi simülasyonu | Boot zinciri sırayla toparlanır | LAB(2) | +| `bf-gui-off` sonrası erişim | xRDP her zaman hazır, uzaktan grafik kurtarma çalışır (K-22) | LAB(2) | +| Tek-USB Field OS ISO ile kurulum | Assisted kurulum, operatör disk onayı, `PROVISIONED_OFFLINE` (K-20) | LAB(2) UEFI+Legacy | + +## 11. Rollback + +Mimari değişikliği 24-DECISION-LOG PR'ı ile yapılır; bu dosyanın diyagramları aynı PR'da güncellenir. Yanlış bileşen seçimi sahaya yayılmadan LAB'da geri alınır (10-UPDATE rollback zinciri). + +## 12. Kontrol Listesi + +- [ ] 3 Mermaid bloğu render oluyor (Docusaurus + GitHub preview). +- [ ] Her bileşen adının kararı 24'te var (K-01…K-24). +- [ ] `bf-` / `BF-` adlandırması diyagramlarda tutarlı. +- [ ] Medya (tek USB Field OS ISO + geri dönüş yolu), RDP'nin her-zaman-hazır olması ve tek yönlü durum modeli diyagramlarla uyumlu (K-20/K-21/K-22). + +## 13. Açık Sorular + +- [ ] Merkez servislerin tek VDS'e sığıp sığmadığı — LAB yük testi (sahibi: 25-ROADMAP). +- [ ] Prometheus federasyonu gerekip gerekmediği — 700 node ölçümü (sahibi: 14-MONITORING). +- [ ] Field OS ISO boot zincirinin (UEFI/Legacy/Secure Boot) LAB kanıtı ve medya tabanı kararı (Desktop flavour) — F2B (sahibi: release yöneticisi) [K-20]. + +--- + +## Ek: Mermaid — 1. Erişim ve yönetim akışı (Internet → WireGuard → SSH/RDP/Mgmt) + +```mermaid +flowchart LR + subgraph SAHA["Saha (bf-)"] + PC["Ubuntu Server 26.04.1
    GNOME + Docker/MEG"] + end + subgraph MERKEZ["Merkez VDS"] + WG["WireGuard hub"] + SEM["Ansible/Semaphore"] + MON["Prometheus/Grafana
    Uptime Kuma"] + RD["RustDesk hbbs/hbbr"] + MC["MeshCentral"] + end + PC -->|Internet: WG tüneli
    PersistentKeepalive=25| WG + WG --> SEM + WG --> MON + WG -->|SSH 22, RDP 3389
    yalnızca tünel içi| PC + PC -->|Internet doğrudan
    VDS genel adresi| RD + PC -->|Internet doğrudan
    VDS genel adresi| MC + RD -.->|WG çökse bile
    ayakta| PC + MC -.->|WG çökse bile
    ayakta| PC + GUI["bf-gui-on / bf-gui-off
    (yalnız yerel fiziksel GUI, K-22)"] -.->|"xRDP'i KONTROL ETMEZ"| WG +``` + +## Ek: Mermaid — 2. Power boot zinciri + +```mermaid +flowchart TB + MEDYA["V1 medya: tek USB Field OS ISO
    (autoinstall + offline APT + firstboot)
    geri dönüş: upstream ISO + seed"] --> PWR["Power ON
    (BIOS: Restore on AC Power Loss = Power On)"] + PWR --> BIOS["BIOS/UEFI"] + BIOS --> UB["Ubuntu Server 26.04.1
    multi-user terminal boot"] + UB --> NET["Network
    (NetworkManager/systemd-networkd)"] + NET --> WGV["WireGuard
    (wg-quick@wg0 enable)"] + WGV --> DKR["Docker daemon
    (log rotasyonlu)"] + DKR --> MEG["MEG konteyneri
    (unless-stopped)"] + MEG --> BF["Blueforce servisleri"] + BF --> REM["Remote: SSH + xRDP (her zaman hazır, K-22) +
    RustDesk + MeshCentral agent"] + REM --> MON["Monitoring:
    Node Exporter + Uptime Push"] + UB -.->|"ileri yönlü durum modeli (K-21)"| ST["PROVISIONED_OFFLINE → ENROLLED → READY"] +``` + +## Ek: Mermaid — 3. Update onay akışı + +```mermaid +flowchart LR + F["Bulundu
    (güvenlik bülteni / MEG sürümü)"] --> R["Rapor
    (etki + geri alma planı)"] + R --> O{"Onay
    (merkezi admin)"} + O -->|Red| F + O -->|Onay| LAB["LAB 2 cihaz"] + LAB -->|Başarılı| P1["PILOT-1 5 cihaz"] + P1 -->|Başarılı| P2["PILOT-2 20 cihaz"] + P2 -->|Başarılı| W1["WAVE-1 50 cihaz"] + W1 -->|Başarılı| W2["WAVE-2 100 cihaz"] + W2 -->|Başarılı| PROD["PRODUCTION
    kalan ~523 cihaz"] + LAB -->|Başarısız| RB["Rollback
    (10-UPDATE zinciri)"] + P1 -->|Başarısız| RB + P2 -->|Başarısız| RB + W1 -->|Başarısız| RB + W2 -->|Başarısız| RB +``` +
    + + +# 03 — Ubuntu Baseline + +> Kısa özet: Saha PC'lerinin standart zemini: Ubuntu Server 26.04.1+ LTS minimal kurulum, GNOME masaüstü (saha standardı; XFCE yalnız LAB A/B ölçüm kolu, K-23), terminale boot edilir, `unattended-upgrades` kapalıdır. BIOS güç-kurtarma ayarı, GUI aç/kapa anahtarları ve RDP'nin her-zaman-hazır ayrımı (K-22) bu dosyadadır. + +- Dosya: `docs/03-UBUNTU-BASELINE.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-01` (OS/sürüm), `K-02` (GNOME saha standardı), `K-03` (boot + bf-gui), `K-11` (otomatik update kapalı), `K-22` (RDP her zaman hazır), `K-23` (GNOME vs XFCE LAB A/B ölçümü) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Her saha PC'sinin aynı minimal zeminden başlamasını garanti etmek: hangi ISO, hangi masaüstü, hangi boot hedefi, hangi servisler açık/kapalı. Bu zemin 04'teki imajın ve 05'teki kurucunun varsayımıdır. + +## 2. Kapsam + +- Kapsam içi: ISO seçimi, BIOS güç-kurtarma ayarı, boot hedefi (multi-user), GUI katmanı (GNOME + xRDP + `bf-gui-*`), `unattended-upgrades` kapatma, açılışta koşan servis listesi. +- Kapsam dışı: imaj üretim yöntemi (04), kurucu modül detayları (05), WireGuard/SSH sertleştirme (06/08/11). + +## 3. Kararlar + +```text +KARAR: Saha standardı Ubuntu Server 26.04.1+ LTS'tir (GUI'siz minimal kurulum; GNOME sonradan eklenir). +GEREKÇE: 26.04.1 LTS resmi indirme sayfasında yayında (kod adı Resolute Raccoon); Server ISO'su varsayılan olarak GUI kurmaz, minimal zemin + ihtiyaca göre GUI standart yoldur. Noktasürüm (.1+) baz alınır çünkü ilk .0 dalgasındaki kurulumcu hataları genelde .1'de toplanır. +ALTERNATİF: Ubuntu 24.04 LTS — 26.04 doğrulanamasaydı yedekti; doğrulandığı için yedekte bekler. Ubuntu Desktop 26.04 (6 GB RAM şartı) saha bütçesini zorladığı için elendi. +RİSK: 26.04.x noktasürümlerinde donanım sürücü farkı; azaltma: golden image LAB(2)'de her saha donanım profilinde test edilir. +MALİYET: Ücretsiz. +LİSANS: Ubuntu LTS ücretsiz (ESM kapsamına bel bağlanmaz) — https://releases.ubuntu.com/ (26.04.1, doğrulanma: 2026-09-15) + https://ubuntu.com/download/desktop (sistem gereksinimi, doğrulanma: 2026-09-15). +``` + +```text +KARAR: Saha masaüstü ortamı GNOME'dur (Ubuntu Desktop standardı) ve bu karar yürürlüktedir. XFCE saha standardı DEĞİLDİR: elenmiş sayılmaz, K-23 uyarınca LAB'da GNOME vs XFCE A/B ölçümünde karşılaştırma koludur ve karar ölçüm verisiyle revize edilebilir. +GEREKÇE: Kullanıcı kararı + Ubuntu Desktop standardı: tanıdık modern masaüstü, teknisyen akışıyla birebir uyum. RDP oturumu + headless RustDesk + düşük RAM'li mini PC koşulları ölçülmeden "tek doğru masaüstü" iddiası kanıtsız kalır; bu yüzden GNOME baseline olarak sabit tutulur, XFCE yalnız LAB ölçüm koluna alınır (ölçüm seti: RAM, CPU, boot süresi, RDP güvenilirliği, RustDesk reboot sonrası davranış, login screen erişimi, dummy display, 24/72 saat stabilite). Ölçüm seti ve 24/72 saat süreleri sabittir; XFCE kolu saha medyasına girmez. RustDesk headless ZORUNLU şartı her iki kolda da aynen korunur. +ALTERNATİF: XFCE — hafif ve düşük kaynak tüketimine rağmen saha standardı değildir (K-02); K-23 uyarınca LAB yedek/karşılaştırma koludur, revizyon yalnız ölçüm verisiyle yapılır. XFCE'yi doğrudan saha standardı yapmak kullanıcı kararı dışı ve kanıtsız olduğu için reddedildi; XFCE'yi tamamen kapatmak da ölçüm şansını yok ettiği için reddedildi. +RİSK: xRDP+GNOME kombinasyonu ek ayar isteyebilir (uyarı: GNOME oturumu RDP'de ek yapılandırma gerektirebilir); azaltma: 13-MEG-LINUX-ACCEPTANCE testi GNOME üzerinde koşar, `bf-gui-*` LAB'da 26.04.1 imajında doğrulanmadan dondurulmaz. A/B ölçümü ek LAB zamanı ve iki masaüstü bakım yükü getirir; azaltma: ölçüm seti/süreleri sabit ve sonuç tek tabloda LAB release kaydına bağlıdır. +MALİYET: Ücretsiz. +LİSANS: GNOME (GPL/LGPL bileşenler), ücretsiz — https://www.gnome.org/ (doğrulanma: 2026-09-15; yeniden doğrulama: 2026-09-16, HTTP 200); XFCE GPL — https://xfce.org/ (doğrulama: 2026-09-16, HTTP 200; yalnız LAB A/B ölçüm adayıdır, saha standardı değildir). +``` + +> **Güncelleme (2026-09-16, K-23):** Yukarıdaki "XFCE elendi / yedekte tutulmaz" ifadesi geçersizdir. Doğru ifade: **GNOME seçildi ve saha standardı olarak kalır; XFCE LAB A/B ölçümünde karşılaştırılır.** Ölçüm verisi gelmeden revizyon yapılmaz; revizyon 24-DECISION-LOG PR'ı ile işlenir. Ayrıntı: `24-DECISION-LOG.md#K-23`. + +```text +KARAR: Cihazlar terminale (multi-user) boot eder. `xrdp` + `xrdp-sesman` multi-user seviyesinde HER ZAMAN enable ve active kalır (RDP kanalı `bf-gui-on` beklemez); `bf-gui-on` / `bf-gui-off` yalnız YEREL FİZİKSEL grafik katmanını (display-manager: gdm3/gdm/sddm/lightdm + default target) systemd üzerinden açar/kapatır. GUI kapalı ≠ RDP kapalı. +GEREKÇE: xRDP mimarisi oturum yöneticisi (sesman) + systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerine kuruludur. xRDP'nin servis seviyesinde sürekli hazır olması, yerel GUI kapalı saha cihazında uzaktan grafik kurtarma kanalını korur (sahaya gitme oranını düşürür); `bf-gui-*` yalnız gereksiz yerel grafik katmanını yönetir. Varsayılan kapalı yerel GUI = düşük RAM, düşük saldırı yüzeyi, öngörülebilir boot. +ALTERNATİF: RDP'yi `bf-gui-on`'a bağlamak — GUI kapalıyken uzaktan grafik kurtarma kaybolur → reddedildi; her zaman grafik boot — kaynak israfı ve 700 cihazda gereksiz hata yüzeyi nedeniyle elendi. +RİSK: Kesin birim adları ve GNOME oturum başlatma satırı 26.04.1'e göre değişebilir; azaltma: LAB'da 26.04.1 imajında doğrulanmadan `bf-gui-*` dondurulmaz. `bf-gui-off` içinde xRDP'i durduran bir satır bulunursa bu sözleşme ihlalidir (`tests/check-specs.sh` bunu zorunlu tutar). +MALİYET: Ücretsiz. +LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15; yeniden doğrulama: 2026-09-16, HTTP 200). +``` + +> **Güncelleme (2026-09-16, K-22):** Bu bloktaki "GUI, display-manager + xRDP servisleri üzerinden yönetilir" ifadesi K-22 ile kesinleştirilmiştir: **`xrdp`/`xrdp-sesman` her zaman enable+active; `bf-gui-on`/`bf-gui-off` yalnız yerel fiziksel GUI'yi (display-manager + default target) yönetir; `bf-gui-off` xRDP servislerini asla durdurmaz veya disable etmez.** Ayrıntı ve kod kanıtı: `24-DECISION-LOG.md#K-22`. + +```text +KARAR: Golden image'da `unattended-upgrades` kapatılır (`/etc/apt/apt.conf.d/20auto-upgrades` değerleri `0` + `apt-daily*.timer` maskeleme). +GEREKÇE: `unattended-upgrades` Ubuntu Server'da varsayılan kurulu ve etkindir, günde bir kez çalışır; kapatılmazsa 700 cihaz ilk açılışta güncellemeye kalkar ("onaysız update yasak" ilkesi delinir). +ALTERNATİF: Otomatik security update'e izin verme — eşzamanlı indirme + onaysız değişim riski nedeniyle elendi. +RİSK: Kapatma adımı imajda atlanırsa filo kendiliğinden güncellenir; azaltma: kurucu final-check + monitoring metriği. +MALİYET: Ücretsiz. +LİSANS: Yok (OS yapılandırması) — https://ubuntu.com/server/docs/how-to/software/automatic-updates/ (doğrulanma: 2026-09-15). +``` + +## 4. Neden Bu Karar? + +Server minimal kurulum + sonradan GNOME (Ubuntu Desktop standardı, kullanıcı kararı; XFCE saha standardı değil, yalnız K-23 LAB A/B ölçüm kolu). Terminale boot, 700 cihazın varsayılan durumunu en öngörülebilir hale getirir; yerel grafik yalnızca bakım penceresinde açılır — uzaktan grafik erişim (xRDP) ise her zaman hazırdır (K-22), yani "yerel GUI kapalı" bir erişim kaybı değildir. Otomatik update'in kapatılması, update zincirinin (10-UPDATE) "onay olmadan değişim yok" ilkesinin teknik kilididir. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Ubuntu 24.04 LTS | Olgun donanım desteği | Daha kısa destek penceresi | Yedek | +| Ubuntu Desktop 26.04 | Tek adımda GUI | 6 GB RAM şartı, şişkin zemin | Elendi | +| XFCE | Hafif, düşük kaynak | Saha standardı değil (GNOME baseline, K-02); yalnız ölçüm kolu | LAB A/B ölçüm adayı (K-23) | +| Yerel GUI her zaman açık | Teknisyen rahatlığı | Kaynak israfı, geniş hata yüzeyi (RDP'yi etkilemez) | Elendi | + +## 6. Avantajlar + +- Minimal zemin = küçük imaj, hızlı kurulum, az saldırı yüzeyi. +- Kapalı GUI varsayılanı = düşük RAM + öngörülebilir boot 700 cihazda çarpan etkisi yapar. +- Kapalı otomatik update = filo sürüm determinizmi. + +## 7. Dezavantajlar + +- GNOME oturum başlatma satırı ve display-manager birim adları 26.04.1'e göre LAB'da doğrulanmadan dondurulamaz. +- Teknisyen **yerel fiziksel** ekran istediğinde ek komut (`bf-gui-on`) gerekir — runbook'a işlenir; uzaktan grafik (RDP) için bu komut gerekmez, xRDP her zaman hazırdır (K-22). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| 26.04.x sürücü farkı heterojen donanımda | Orta | Orta | LAB profil testi (04) | +| `bf-gui-*` birim adları 26.04.1'de farklı | Orta | Düşük | LAB doğrulaması, §13 açık soru | +| `unattended-upgrades` açık unutulur | Orta | Yüksek | final-check + monitoring metriği | +| `bf-gui-off` yanlış yazılıp xRDP'i durdurur (uzaktan kurtarma kaybı) | Düşük | Yüksek | `tests/check-specs.sh` `systemctl stop/disable xrdp*` görürse testi düşürür; 08-rdp check'i active xrdp ister (K-22) | +| GNOME/XFCE kararı kanıtsız revize edilir | Düşük | Orta | A/B ölçüm seti sabit; revizyon yalnız LAB verisiyle ve PR ile (K-23) | + +## 9. Uygulama Planı + +1. BIOS ayarı (her saha PC'sinde, elektrik kesintisi sonrası otomatik açılış için): + - `Restore on AC Power Loss = Power On` (üretici menüsünde `After Power Loss: Power On` / `AC Recovery: Power On` adlarıyla da geçer; teknisyen imaj öncesi menüden doğrular). +2. V1 medya: TEK USB **Blueforce Field OS ISO** (`dist/Blueforce-Field-OS--amd64.iso`); ISO içinde autoinstall (kurulum motoru) + offline APT repo + firstboot bulunur ve kimliksiz zemin kurulur (`unattended-upgrades` kapalıdır). `interactive-sections: [storage]` korunur: kurulum katılımsız ilerler ama diski operatör seçer/onaylar, otomatik disk silme YOKTUR. Geri dönüş yolu her zaman sıcaktır: resmi upstream ISO + NoCloud seed USB (K-20). Medya üretimi ve doğrulaması 26'da, boot kabulü LAB'dadır. +3. Boot hedefi terminale sabitlenir: + +```bash +sudo systemctl set-default multi-user.target +systemctl get-default # multi-user.target beklenir +``` + +4. GNOME + xRDP katmanı kurulur (kurucu 05 üzerinden): + +```bash +sudo apt install -y ubuntu-desktop-minimal xrdp +sudo systemctl enable xrdp xrdp-sesman +# GNOME oturumu varsayılan yapılır (LAB'da 26.04.1'e göre doğrulanacak satır): +echo "gnome-session" > ~/.xsession +``` + +5. GUI aç/kapa anahtarları (kurucu tarafından `/usr/local/bin/` altına yazılır; **yalnız yerel fiziksel GUI**, K-22): + +```bash +sudo bf-gui-on # yalnız display-manager (yerel fiziksel oturum) başlatılır; RDP zaten hazırdır +sudo bf-gui-off # yerel grafik katman durdurulur, cihaz terminale döner; xrdp/xrdp-sesman ACTIVE KALIR +``` + +6. Otomatik update kapatılır: + +```bash +# /etc/apt/apt.conf.d/20auto-upgrades içinde her iki değer 0: +# APT::Periodic::Update-Package-Lists "0"; +# APT::Periodic::Unattended-Upgrade "0"; +sudo systemctl mask apt-daily.timer apt-daily-upgrade.timer +``` + +7. Açılışta koşması beklenen servisler (final-check bunları denetler): `NetworkManager` (veya `systemd-networkd`), `wg-quick@wg0`, `docker`, `xrdp`+`xrdp-sesman` (**her zaman enable/ready; yerel GNOME display-manager durumu bundan bağımsız**), `node_exporter`, RustDesk/MeshCentral agent, `bf-health-push.timer`. Ubuntu 26.04.1 GNOME+xRDP kesin oturum davranışı LAB ile doğrulanmalıdır. +8. GNOME vs XFCE A/B ölçümü (LAB, K-23): aynı donanımda iki kol kurulur ve sabit ölçüm seti doldurulur — RAM, CPU, boot süresi, RDP güvenilirliği, RustDesk reboot sonrası davranışı, login screen erişimi, dummy display davranışı, 24 saat + 72 saat stabilite. RustDesk headless zorunlu şartı iki kolda da aranır; sonuç tablosu LAB release kaydına bağlanır. XFCE kolu saha medyasına girmez; revizyon yalnız bu veriyle yapılır. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| `get-default` | `multi-user.target` | LAB(2) | +| Güç kesintisi simülasyonu | BIOS ayarı ile cihaz kendiliğinden açılır | LAB(2) | +| `bf-gui-on/off` sonrası yerel grafik | Yerel oturum açılır/kapanır (display-manager) | LAB(2) | +| `bf-gui-off` sonrası xRDP | `xrdp`/`xrdp-sesman` **active kalır**, RDP oturumu kurulur (K-22) | LAB(2) | +| `20auto-upgrades` değerleri `0`, timer'lar maskeli | Otomatik apt çalışmaz | LAB(2) imaj denetimi | +| GNOME vs XFCE A/B ölçümü (8 metrik, 24/72 saat) | Tablo dolar; karar LAB verisiyle verilir (K-23) | LAB(2) | +| Tek-USB Field OS ISO ile kurulum (03 zemini) | Kimliksiz zemin kurulur, storage operatör onayı beklenir (K-20) | LAB(2) UEFI+Legacy | + +## 11. Rollback + +1. Yanlış boot hedefi: `sudo systemctl set-default multi-user.target` ile geri alınır. +2. Bozuk GNOME/xRDP katmanı: `bf-gui-off` + paket yeniden kurulumu; son çare imajdan yeniden kurulum (04). +3. Otomatik update yanlışlıkla açıldıysa §9 adım 6 yeniden uygulanır, `apt-daily*` timer durumu denetlenir. + +## 12. Kontrol Listesi + +- [ ] ISO sürümü 26.04.1+ (LAB'da `lsb_release -a` çıktısı kayıtlı). +- [ ] BIOS `Restore on AC Power Loss = Power On` her profilde doğrulandı. +- [ ] `get-default` = `multi-user.target`. +- [ ] `bf-gui-on/off` LAB 26.04.1 imajında test edildi; `bf-gui-off` sonrası xRDP hâlâ active (K-22). +- [ ] `unattended-upgrades` kapalı + timer'lar maskeli. +- [ ] GNOME vs XFCE A/B ölçüm tablosu (8 metrik) doldurulmuş; XFCE saha medyasına girmemiş (K-23). + +## 13. Açık Sorular + +- [ ] GNOME oturum başlatma satırı + `bf-gui-*` kesin birim listesi — LAB 26.04.1 imajında (sahibi: Faz 3). +- [ ] `NetworkManager` vs `systemd-networkd` seçimi — netplan profiliyle birlikte LAB'da netleşecek (sahibi: Faz 3, 08 yazarı). +- [ ] GNOME vs XFCE A/B ölçüm seti ve sonuç tablosu (8 metrik, 24/72 saat) — LAB 2 cihaz (sahibi: platform ekibi + bu dosyanın yazarı) [K-23]. +- [ ] Medya tabanı sapması: LAB ISO'su Desktop flavour ile üretildi; işletim öncesi Server ISO ile yeniden build ya da Desktop tabanının kabulü — LAB/F2B (sahibi: release yöneticisi) [K-20]. + +--- + +## Ek: Zemin Katmanları + +```mermaid +flowchart TB + ISO["V1 medya: tek USB Field OS ISO
    (autoinstall.yaml + offline APT + firstboot)
    geri dönüş: upstream ISO + NoCloud seed"] --> BOOT["Boot hedefi: multi-user.target
    (terminale boot; yerel GUI kapalı varsayılan)"] + BOOT --> GUI["Yerel GUI katmanı (kapalı varsayılan)
    GNOME + bf-gui-on/off"] + BOOT --> RDP["xRDP servisi HER ZAMAN hazır
    xrdp + xrdp-sesman enable+active (K-22)"] + GUI -.->|"bf-gui-off xRDP'i DURDURMAZ"| RDP + RDP --> KILIT["Update kilidi
    unattended-upgrades kapalı + timer maskeli"] + GUI --> KILIT + KILIT --> SERVIS["Açılış servisleri
    wg-quick + docker + node_exporter + agent'lar"] + SERVIS --> AB["LAB A/B: GNOME vs XFCE
    8 metrik + 24/72 saat (K-23)"] +``` +
    + + +# 04 — Golden Image ve Provisioning + +> Kısa özet: Saha imajının nasıl üretildiği ve cihaza nasıl basıldığı: autoinstall **kurulum motorudur**, Blueforce Field OS ISO ise **paketleme** yöntemidir — ikisi rakip değil, birlikte kullanılır (K-20). V1 medyası tek USB Field OS ISO'dur (autoinstall.yaml + offline APT + firstboot medya kökünde); upstream ISO + NoCloud seed USB geri dönüş yoludur. `interactive-sections: [storage]` korunur, otomatik disk silme yoktur. Offline tamamlanma durumu `PROVISIONED_OFFLINE`'dır; `READY` merkezi enrollment ve bağımsız kanıt sonrasındadır. + +- Dosya: `docs/04-GOLDEN-IMAGE-AND-PROVISIONING.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-09` (golden image yöntemi), `K-01` (OS), `K-11` (update kapalı), `K-12` (kimlik imajda değil, ilk boot'ta), `K-20` (medya stratejisi), `K-21` (durum modeli) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Heterojen 700 saha PC'sinde aynı zemini tekrarlanabilir şekilde kurmak: imajın ne içerdiği, ne içermediği (cihaz kimliği), hangi araçla üretildiği ve sahada hangi akışla basıldığı. + +## 2. Kapsam + +- Kapsam içi: yöntem seçimi (karşılaştırma tablosu), imaj içeriği, autoinstall rolü, USB basım akışı, kimlik enjeksiyonu, LAB test matrisi. +- Kapsam dışı: kurucu modül detayları (05), BIOS ayarı detayı (03), rollout lojistiği (18-RECOVERY/18-ROLLOUT). + +## 3. Kararlar + +```text +KARAR: Golden image = kimliksiz Blueforce Field OS zemini: Ubuntu Server 26.04.1+ minimal + `unattended-upgrades` kapalı + `blueforce-install.sh`. Autoinstall kurulum MOTORUDUR ve Blueforce Field OS ISO PAKETLEME/DAĞITIM yöntemidir; ikisi rakip değildir, birlikte kullanılır. V1 medyası TEK USB `Blueforce-Field-OS--amd64.iso`'dur: ISO kökünde `autoinstall.yaml` + offline APT repo + firstboot bulunur. Güvenlik için autoinstall'da `interactive-sections: [storage]` KORUNUR — otomatik disk silme YOKTUR, diski operatör seçip onaylar. Resmi upstream ISO + ayrı NoCloud seed USB, V1'in tek yolu değil geri dönüş/fallback yoludur ve her zaman sıcak tutulur. Cihaz-spesifik kimlik (`bf-`), token veya secret imajda DEĞİL, firstboot/enrollment aşamasında verilir. +GEREKÇE: Donanım heterojenliği bilinmediği için bit-kopya klon (Clonezilla) tek imajda kırılgandır; autoinstall + idempotent kurulum scripti her donanım profilinde aynı zemini kurar, kimlik ilk boot'ta enjekte edilir. Subiquity resmi referansı autoinstall yapılandırmasını `/autoinstall.yaml` yolundan okur ("irrespective of how it was provided"), yani ISO köküne konan dosya desteklenir; `interactive-sections` resmi olarak desteklenir ve `apt.fallback` varsayılanı `offline-install`'dır. Böylece tek-USB deneyimi ile "otomatik disk silme yok" şartı aynı anda sağlanır: ISO autoinstall'ı başlatır, teknisyen yalnız disk adımını onaylar. Hedef akış: USB → Ubuntu → tek script → bayi no → READY (READY yalnız merkezi kanıtla). +ALTERNATİF: Clonezilla bit-kopya (hızlı ama donanım-fragil → yedek yöntem olarak tutulur); Packer + QEMU derleme hattı (ek altyapı, öğrenme eğrisi, 700 PC için aşırı → elendi); cloud-init/NoCloud (autoinstall'ın tamamlayıcısıdır, ayrı seed USB ile geri dönüş yoludur — elenmedi); yalnız upstream ISO + seed (tek-medya deneyimi yok → V1'in tek yolu olmaktan çıktı, geri dönüş yolu olarak kalır); otomatik disk wipe'lı unattended (veri kaybı riski → yasak, F6 kapsamı). +RİSK: İlk imaj heterojen donanımda sürücü eksiltebilir; azaltma: önce `bf-hardware-inventory.sh` taraması (18-ROLLOUT), LAB'da her profilde test. Remaster boot zinciri (UEFI/Legacy/Secure Boot) kanıtlanmazsa saha USB'si açılmayabilir; azaltma: F2B çıkış kriteri = tek-USB assisted kurulumun iki LAB cihazında kanıtı. +MALİYET: Ücretsiz. +LİSANS: Ubuntu autoinstall/subiquity — https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html (interactive-sections, `/autoinstall.yaml`, `apt.fallback`; doğrulama: 2026-09-16, HTTP 200) + https://releases.ubuntu.com/26.04/ (doğrulanma: 2026-09-15). NOT: 26.04.1'e özgü kesin direktifler LAB çıktısıyla kesinleşir. +``` + +> **Güncelleme (2026-09-16, K-20/K-21):** Bu bölümdeki "V1'de resmi upstream ISO + ayrı NoCloud seed USB kullanılır" ve "custom Field ISO ertelendi" ifadeleri geçersizdir. Kanonik karar: **autoinstall motor, Field OS ISO paketleme; V1 medyası tek USB Field OS ISO, upstream ISO + seed geri dönüş yolu.** Ayrıntı: `24-DECISION-LOG.md#K-20`; gerçek üretilmiş artefakt ve doğrulama kaydı: `docs/26-BLUEFORCE-FIELD-OS-ISO.md`. + +## 4. Neden Bu Karar? + +Bit-kopya klon, kaynak makinenin sürücü setini dondurur; farklı anakart/ağ kartı olan sahada açılmayan cihaz üretir. Autoinstall her makinede donanıma göre kurulum yapar, ardından aynı kurucu script aynı zemini kurar — sonuç donanımdan bağımsız deterministik zemin + ilk boot'ta enjekte edilen benzersiz kimliktir. **Custom ISO ile autoinstall rakip değildir:** ISO, aynı autoinstall motorunu + offline APT repo'yu + firstboot'u tek medyada paketler; bu yüzden "custom ISO'yu eledik" demek yanlıştır (K-20). Elenen şey ayrı bir Packer/QEMU derleme hattı kurmaktır; repo içindeki `provisioning/iso/build-blueforce-iso.sh` bu işi mevcut xorriso/zorunlu araçlarla yapar ve boot zincirini LAB kabulüne bağlar. + +## 5. Alternatifler + +| Yöntem | Artı | Eksi | Sonuç | +|---|---|---|---| +| Ubuntu autoinstall (user-data) | Resmi yol, donanım-bağımsız, USB'den katılımsız | Sözdizimi LAB'da doğrulanmalı | **Seçildi (kurulum motoru)** | +| Clonezilla bit-kopya | Çok hızlı klon, basit | Donanım-fragil, kimlik çakışması riski | Yedek yöntem | +| cloud-init / NoCloud seed USB | Autoinstall'i tamamlar, seed değişimi kolay | 26.04 söz dizimi/medya LABEL davranışı LAB'da doğrulanmalı | Geri dönüş yolu (tek medya değil) | +| Tek USB Field OS ISO (remaster) | Tek medya, offline APT + firstboot içinde | UEFI/Legacy/Secure Boot LAB kabulü gerekir | **V1 medyası (F2B)** | +| Packer + QEMU build | Tekrarlanabilir build | Ek altyapı, öğrenme eğrisi, 700 PC için aşırı | Elendi | +| Ansible-only (kurulu OS üstüne) | İmaja gerek yok | Temel OS kurulumu yine manuel/USB gerektirir | Tamamlayıcı (kurucu sonrası filo) | + +> **Faz eşleşmesi (K-20 / 25-ROADMAP):** Tek-USB Field OS ISO işi **F2B — Assisted Offline Field ISO**'dadır; `F6` yalnız PXE / tam unattended / uzaktan provisioning içindir (otomatik disk yapılandırması orada, onay kapısıyla). Bu dosyadaki eski "LAB artefact / F6" ifadesi F2B olarak düzeltilmiştir. + +## 6. Avantajlar + +- İmaj kimliksizdir: tek USB tüm sahada kullanılır, yanlış kimlikli cihaz çıkmaz. +- Kurucu idempotent olduğu için yarım kalan kurulum kaldığı yerden tamamlanır. +- Yedek yöntem (Clonezilla) hazırda bekler; autoinstall bir profilde takılırsa sahada blokaj olmaz. + +## 7. Dezavantajlar + +- Autoinstall sözdizimi Faz 1'de resmi-doğrulamalı değil; LAB çıktısı beklenir. +- İlk kurulum Clonezilla'ya göre daha yavaştır (paket kurulumu her cihazda tekrarlanır). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Heterojen donanımda sürücü eksikliği | Orta | Orta | Envanter taraması + LAB profil matrisi | +| Autoinstall sözdizimi sürüm farkı | Orta | Düşük | LAB 26.04.1 çıktısı dondurulur, dosyası repo'da sürümlenir | +| USB medyası bozuk/eskimiş | Düşük | Düşük | Çift USB + SHA256 doğrulama | +| Remaster Field OS ISO boot etmez (UEFI/Legacy/Secure Boot) | Orta | Yüksek | F2B çıkış kapısı: tek-USB assisted kurulum iki LAB cihazında kanıtlanır; kanıt yoksa upstream ISO + seed yolu sıcak tutulur (K-20) | +| Medya tabanı sapması (LAB ISO'su Ubuntu Desktop flavour ile üretildi) | Yüksek (mevcut durum) | Orta | Sapma gizlenmez: `dist/1.0.0-manifest.yaml` içinde `base_flavor: desktop` + `baseline_deviation` bloğu; işletim öncesi Server ISO ile yeniden build veya Desktop tabanının kabulü (26 §6) | + +## 9. Uygulama Planı + +1. İmaj içeriği (kimliksiz zemin): + - Ubuntu Server 26.04.1+ minimal (GUI yok). **Not (sapma):** LAB'da üretilen `dist/Blueforce-Field-OS-1.0.0-amd64.iso` base flavour'ı `desktop`'tur (build host'ta checksum'ı doğrulanmış tek kurulum medyası Desktop ISO'ydu); GNOME katmanı Desktop medyasıyla geldiği için ek kurulum adımı gerekmez. Server tabanlı medya `--upstream-iso` ile aynı builder'dan çıkar; üretim öncesi Server ISO ile yeniden build ya da Desktop tabanının kabulü kararı 26 §6 ve §13'tedir. + - `unattended-upgrades` kapalı (03 §9 adım 6). + - `blueforce-install.sh` + modüller medyada `/blueforce-provisioning/` altında (ISO'da `firstboot/`, `autoinstall/`, `offline-repo/`, `release/`; kurulu sistemde `/opt/blueforce-installer/`) — LAB'da netleşir. + - Bootstrap SSH anahtarı (ilk Ansible run'ında rotasyon, K-13). +2. Saha akışı (hedef: teknisyen başına <15 dk aktif iş): + +```text +USB (Field OS ISO) tak → autoinstall başlar (Ubuntu kurulumu katılımsız ilerler) + → installer ekranında SADECE disk adımı operatör onayı bekler (interactive-sections: [storage]; otomatik disk silme yok) + → ilk açılışta: firstboot 8 haneli bayi no sorar → sudo ./blueforce-install.sh --dealer-id <8hane> (--offline) + → script bitince: bf-status → PROVISIONED_OFFLINE + → USB çıkar; merkezi enrollment tamamlanana kadar cihaz READY değildir +``` + +```bash +# sahada tek komut (kimlik ilk kez burada verilir) +sudo ./blueforce-install.sh --dealer-id 12010193 +``` + +3. Kimlik enjeksiyonu ilk boot'ta olur: hostname + WireGuard peer + envanter kaydı kurucu tarafından yazılır; imajda hiçbir `bf-` artığı bulunmaz (final-check denetler). +4. LAB test matrisi: envanterde çıkan her donanım profili × (kurulum + güç-kesintisi + `bf-gui-on/off` + final-check) — matris dolmadan WAVE açılmaz. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Aynı USB (Field OS ISO) ile 2 farklı donanım profili | İkisi de PROVISIONED_OFFLINE | LAB(2) | +| Tek-USB assisted kurulumda disk adımı | Operatör onayı beklenir, disk kendiliğinden silinmez (K-20) | LAB(2) UEFI+Legacy | +| İmajda kimlik artığı taraması (`bf-*`, peer key, token, parola) | Hiçbir cihaz-spesifik değer/secret yok | LAB(2) + build CI | +| ISO checksum doğrulaması | `dist/*.iso.sha256` ile eşleşir | LAB(2)/CI | +| Yarım kesilen kurulumun tekrarı | İkinci koşu tamamlar, exit 0 | LAB(2) | +| Clonezilla yedek yöntemi | Autoinstall takılan profilde PROVISIONED_OFFLINE | LAB(2) | +| Geri dönüş yolu (upstream ISO + NoCloud seed) | Aynı zemini kurar; F2B geri alınırsa sıcak yol çalışır | LAB(2) | + +## 11. Rollback + +1. Bozuk imaj: önceki USB sürümüne dönüş (USB'ler sürüm etiketli saklanır). +2. Kurulum sonrası hata: kurucu idempotent yeniden koşar; düzelmezse 17-RECOVERY LEVEL 9 (imajdan temiz kurulum). +3. Autoinstall dosyası hatalıysa düzeltme repo PR'ı ile sürümlenir, SHA256 yeniden yayımlanır. +4. Field OS ISO boot etmezse (F2B) derhal upstream ISO + son onaylı NoCloud seed USB yoluna dönülür (bu yol her zaman sıcak tutulur, K-20). + +## 12. Kontrol Listesi + +- [ ] Autoinstall dosyası repo'da sürümlü + LAB çıktısıyla doğrulanmış. +- [ ] USB SHA256 değeri yayımlanmış ve sahada doğrulanıyor. +- [ ] İmajda kimlik artığı yok (otomatik tarama). +- [ ] Her donanım profili LAB matrisinde READY almış. +- [ ] Clonezilla yedek prosedürü yazılı ve test edilmiş. +- [ ] Tek-USB medyada `interactive-sections: [storage]` korunmuş ve disk otomatik silinmiyor (K-20). +- [ ] F2B/F6 ayrımı doğru anlatılmış: assisted medya F2B, PXE/tam unattended F6 (25-ROADMAP). +- [ ] Medya tabanı sapması (Desktop flavour) kayda geçmiş ve işletim öncesi karar verilmiş (26 §6). + +## 13. Açık Sorular + +- [ ] Kurucu USB'de mi taşınacak, ilk boot'ta merkezden mi çekilecek (saha interneti varsayımı) (sahibi: Faz 3). +- [ ] Autoinstall kesin direktif seti — LAB 26.04.1 çıktısı (sahibi: Faz 3, bu dosyanın yazarı). +- [ ] USB hazırlama standardı (Ventoy vs dd vs Balena) (sahibi: Faz 3). +- [ ] Offline APT repo'nun medyaya gömülmesi (bugün `offline_repo_status: not-included`, pinler `UNPINNED`) — F2B (sahibi: release yöneticisi) [K-20]. +- [ ] Medya tabanı: Desktop flavour kabul mü, Server ISO ile yeniden build mi — F2B çıkış kapısı (sahibi: release yöneticisi) [K-01/K-20]. + +--- + +## Ek: Provisioning Akışı + +```mermaid +flowchart LR + USB["V1 medya: tek USB Field OS ISO
    /autoinstall.yaml + /blueforce-provisioning/
    (interactive-sections: [storage])"] --> KUR["Autoinstall (kurulum motoru)
    Ubuntu zemin kurulur, 18 modül sonra"] + KUR --> DISK["Operatör disk onayı
    otomatik silme YOK"] + DISK --> TEK["firstboot → sudo ./blueforce-install.sh
    --dealer-id <8hane> --offline"] + TEK --> KIMLIK["Kimlik enjeksiyonu
    bf- + peer + envanter"] + KIMLIK --> HAZIR["bf-status → PROVISIONED_OFFLINE"] + HAZIR --> SAHA["ENROLLED → READY
    (merkezi kanıt, 29)"] + FB["Geri dönüş yolu: upstream ISO + NoCloud seed USB"] -.->|"F2B geri alınırsa"| KUR +``` +
    + + +# 07 — Uzaktan Erişim (4 Kanal) + +> Kısa özet: Saha cihazlarına 4 bağımsız erişim kanalı: SSH-over-WireGuard, xRDP + GNOME (service her zaman hazır — K-22), RustDesk OSS self-hosted (birincil grafik), MeshCentral self-hosted (ikincil yönetim). `bf-gui-on`/`bf-gui-off` yalnız **yerel fiziksel** GUI'yi kontrol eder, RDP'yi değil: **GUI kapalı ≠ RDP kapalı**. AnyDesk ücretsiz zorunlu mimarinin parçası DEĞİLDİR (ticari lisans şartı); yalnız `scripts/install/optional/anydesk/` altında lisans onayına bağlı opsiyonel modül vardır. + +- Dosya: `docs/07-REMOTE-ACCESS.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-04` (4 kanal + AnyDesk hükmü), `K-22` (RDP her zaman hazır; `bf-gui-*` yalnız yerel GUI), `K-03` (boot + bf-gui), `K-05` (WireGuard arkası), `K-02`/`K-23` (GNOME saha standardı + LAB A/B ölçümü) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +WireGuard çökse bile sahaya erişimi sürdürecek yedekli uzak-erişim mimarisini sabitlemek: hangi kanal ne için kullanılır, hangisi hangi arızada ayakta kalır, AnyDesk neden yoktur. + +## 2. Kapsam + +- Kapsam içi: 4 kanalın rolü/kurulumu/boot davranışı, WG-çöküşü analizi, AnyDesk hükmü + opsiyonel modül notu, kanal seçim matrisi. +- Kapsam dışı: WireGuard tünel kurulumu (08), SSH anahtar politikası (06), filo otomasyonu (09). + +## 3. Kararlar + +```text +KARAR: Dört erişim kanalı: (1) SSH-over-WireGuard (yönetim/otomasyon), (2) xRDP + GNOME (grafik bakım), (3) RustDesk OSS self-hosted hbbs/hbbr (birincil grafik uzak erişim, WireGuard-bağımsız), (4) MeshCentral self-hosted (ikincil yönetim: terminal/dosya/envanter, WireGuard-bağımsız). AnyDesk mimariden ÇIKARILDI. +GEREKÇE: RustDesk OSS sınırsız istemci, kendi ID+röle altyapısı, E2E şifreli oturum, dosya transferi ve katılımsız erişimi ücretsiz verir; istemcide VDS genel adresi kullanıldığında WireGuard çökse bile kanal ayakta kalır. MeshCentral Apache-2.0 ile ikinci bağımsız düzlemi sağlar. AnyDesk ücretsiz sürümü yalnızca kişisel kullanımı kapsar; 700 kurumsal cihaz ticari kullanımdır ve lisanssız kullanım ihlal olur. +ALTERNATİF: AnyDesk (lisans maliyeti + kapalı kaynak + self-hosted yalnızca en üst planda → elendi; yalnızca müşteri sahasında zaten lisanslıysa opsiyonel installer modülü). Tailscale/ZeroTier (freemium, merkezi kimlik → elendi). +RİSK: İki VDS-bağımlı kanalın tek ortak noktası VDS + genel internet; azaltma: hbbs/hbbr + MeshCentral health monitörü (Uptime Kuma) + yedek VDS planı 17-RECOVERY'de. +MALİYET: Ücretsiz (kendi VDS'i üzerinde; VDS kira bedeli hariç — altyapı maliyeti, lisans değil). +LİSANS: RustDesk istemci+sunucu AGPL-3.0 (1.4.9 / 1.1.16) — https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ + https://rustdesk.com/docs/en/self-host/client-deployment/ (doğrulanma: 2026-09-15); MeshCentral Apache-2.0 (1.2.5) — https://github.com/Ylianst/MeshCentral (doğrulanma: 2026-09-15); AnyDesk hükmü — https://support.anydesk.com/docs/anydesk-licenses.md (doğrulanma: 2026-09-15) + https://anydesk.com/en/pricing. +``` + +```text +KARAR: RDP kanalı HER ZAMAN HAZIRDIR: `xrdp` ve `xrdp-sesman` multi-user seviyesinde sürekli enable ve active kalır; RDP `bf-gui-on` komutuna bağlı DEĞİLDİR. `bf-gui-on` / `bf-gui-off` yalnız YEREL FİZİKSEL grafik katmanını (display-manager: gdm3/gdm/sddm/lightdm + default target) kontrol eder ve `bf-gui-off` xRDP servislerini asla durdurmaz/disable etmez. xRDP GNOME oturumu üzerinden grafik bakım verir ve yalnızca WireGuard arkasında dinler (internete açık RDP portu yoktur). +GEREKÇE: xRDP systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerinden yönetilen bir katmandır; servisi sürekli hazır tutmak, yerel GUI kapalı saha cihazında uzaktan grafik kurtarma kanalını korur (sahaya gitme oranını düşürür). WG-arkası dinleme RDP'yi internet taramasından gizler, yerel GUI'nin kapalı kalması RAM'i ve hata yüzeyini korur. Depodaki kod bu ayrımı uygular: `08-rdp` modülü xrdp+xrdp-sesman'ın enable VE active olmasını, default target'ın multi-user kalmasını doğrular; `15-power-loss` boot zinciri de xRDP'i her zaman ready varsayar. +ALTERNATİF: RDP'yi `bf-gui-on`'a bağlamak — GUI kapalı saha cihazında uzaktan grafik kurtarma kaybolur → reddedildi. RDP'yi doğrudan internete açma — tarama + kaba-kuvvet riski nedeniyle elendi. +RİSK: Kesin birim adları ve GNOME oturum satırı 26.04.1'de değişebilir; azaltma: LAB doğrulaması olmadan `bf-gui-*` dondurulmaz (03). `bf-gui-off` içine xRDP'i durduran bir satır girmesi sözleşme ihlalidir (`tests/check-specs.sh` zorunlu tutar). +MALİYET: Ücretsiz. +LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15; yeniden doğrulama: 2026-09-16, HTTP 200). GNOME GPL/LGPL — https://www.gnome.org/ (doğrulama: 2026-09-16, HTTP 200). +``` + +> **Güncelleme (2026-09-16, K-22):** Bu bölümdeki eski "GUI varsayılan kapalıdır, bakım penceresinde `bf-gui-on` ile açılır → RDP" anlatımı RDP'yi `bf-gui-on`'a bağlı gösteriyordu ve yanlıştı. Doğru ayrım: **RDP servisi her zaman hazır; `bf-gui-*` yalnız yerel fiziksel GUI'yi açar/kapatır.** Ayrıntı ve kod kanıtı: `24-DECISION-LOG.md#K-22`, `docs/03-UBUNTU-BASELINE.md` §9. + +```text +KARAR: Dört kanalın agent/servisleri boot'ta otomatik başlar (systemd enable): `wg-quick@wg0`, RustDesk katılımsız servis, MeshCentral agent, `xrdp`/`xrdp-sesman` (yerel GUI kapalı olsa da her zaman enable/ready). RustDesk'in Ubuntu 26.04.1 headless/katılımsız kesin davranışı LAB ile doğrulanmadan dondurulmaz. +GEREKÇE: Elektrik kesintisi sonrası cihaz açılınca VPN + yedek kanallar kendiliğinden gelir; 16-POWER-LOSS boot zincirinin varsayımıdır. +ALTERNATİF: Manuel başlatma — 700 dokunulmaz cihazda her kesintide saha ziyareti demek → elendi. +RİSK: Boot race (agent ağdan önce kalkar); azaltma: systemd `After=network-online.target` + yeniden deneme, LAB güç-kesinti testiyle doğrulanır. +MALİYET: Ücretsiz. +LİSANS: Yok (OS yapılandırması). +``` + +## 4. Neden Bu Karar? + +Tek tünel körlüğü engellenir: SSH ve RDP WireGuard'a bağımlıdır (güvenlik için), RustDesk ve MeshCentral ise VDS genel adresine doğrudan çıkar (erişilebilirlik için). RustDesk birincil grafiktir çünkü katılımsız erişim + dosya transferini OSS'te verir; MeshCentral ikinci düzlemdir çünkü terminal/dosya/envanter sunar ve RustDesk arızasında devreye girer. RDP'nin servis seviyesinde sürekli hazır olması (K-22) üçüncü bir sigortadır: yerel GUI kapalı bir cihazda bile teknisyen WG üzerinden GNOME oturumu açabilir; bu yüzden `bf-gui-off` xRDP'i asla durdurmaz. AnyDesk'in ücretsiz katmanı ticari kullanımı kapsamadığı için 700 cihazda lisans ihlali doğurur — bu hukuki risk teknik kolaylığa ağır basar ve AnyDesk ücretsiz/zorunlu mimarinin parçası değildir. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| AnyDesk (ücretsiz) | Tanınmış, kolay | Ticari kullanımda lisans ihlali; zorunlu mimarinin parçası değil | Elendi | +| AnyDesk (lisanslı) | Kurumsal destek | 700 cihaz lisans bedeli + kapalı kaynak; ücretsiz mimariye girmez | Opsiyonel modül (bkz. §9) | +| Tailscale/ZeroTier | Kolay mesh | Freemium, merkezi kimlik | Elendi | +| Tek kanal (yalnızca SSH) | En sade | Tünel çökerse körlük | Elendi | +| VNC doğrudan | Basit | Şifresiz/zayıf varyantlar, WG-dışı risk | Elendi | + +## 6. Avantajlar + +- WireGuard çökse bile 2 kanal (RustDesk, MeshCentral) ayakta — filo kör kalmaz. +- Tüm kanallar ücretsiz/self-hosted; veri üçüncü parti buluta çıkmaz. +- Kanal başına rol ayrımı (otomasyon / grafik bakım / grafik erişim / envanter) runbook'ları sadeleştirir. + +## 7. Dezavantajlar + +- 4 kanal = 4 agent/servis bakımı, 4 izleme hedefi (14-MONITORING'e yük). +- RustDesk + MeshCentral aynı VDS'teyse ortak arıza noktası (yedek VDS planı gerekir). +- Teknisyenin hangi kanalı ne zaman kullanacağı eğitim gerektirir (kanal matrisi §9). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| WireGuard çöküşü (istemci/saha tarafı) | Orta | Orta | RustDesk/MeshCentral bağımsız kanallar (§9 analizi) | +| VDS kesintisi (hbbs+hbbr+MeshCentral) | Düşük | Yüksek | Health monitörü + yedek VDS planı (17) | +| RustDesk ID çakışması / key sızıntısı | Düşük | Orta | Self-hosted key, `bf-` etiketi, key rotasyon prosedürü | +| xRDP + GNOME ek ayar ihtiyacı (26.04.1) | Orta | Orta | LAB'da `bf-gui-*` doğrulaması (03); A/B ölçümünde "RDP güvenilirliği" metriği (K-23) | +| `bf-gui-off` yanlış kurgulanır, xRDP durur → uzaktan kurtarma kaybı | Düşük | Yüksek | `tests/check-specs.sh` bf-gui-off içinde `systemctl stop/disable xrdp*` görürse testi düşürür; 08-rdp check'i active xrdp ister (K-22) | +| Lisanssız AnyDesk sahaya sızar | Düşük | Orta | Modül yalnız `ANYDESK_LICENSE_CONFIRMED=true` ile çalışır ve kendisi hiçbir şey kurmaz; lisans kaydı cihaz dışında tutulur (K-04) | + +## 9. Uygulama Planı + +1. Merkez VDS: `hbbs`/`hbbr` (`--net=host` önerilir) + MeshCentral kurulumu, health monitörü (Uptime Kuma) bağlanır. +2. Golden image / Field OS medyası: RustDesk istemcisi (self-hosted key + VDS adresi gömülü) + MeshCentral agent + xRDP kurulu gelir; dördü de systemd enable. `xrdp`/`xrdp-sesman` her zaman enable+active kalır (K-22); `bf-gui-off` bunlara dokunmaz. +3. Cihaz kimliği (`bf-`, 02) RustDesk etiketi + MeshCentral adı + Ansible inventory adı olarak aynı yazılır. +4. Opsiyonel AnyDesk modülü (zorunlu mimarinin parçası DEĞİLDİR): depoda tek yeri `scripts/install/optional/anydesk/install-anydesk.sh`. Modül yalnızca `ANYDESK_LICENSE_CONFIRMED=true` verildiğinde devam eder ve **kasıtlı olarak hiçbir şey indirmez/kurmaz**; lisanslı paket kurumun kendi kontrollü sürecinden gelir, cihaz istisnası Blueforce installer'ının dışında kayda geçer. Lisanssız cihaza kurulmaz. + +```bash +# örnek: kanal durum denetimi (saha cihazında) +systemctl is-active wg-quick@wg0 xrdp xrdp-sesman rustdesk meshcentral 2>/dev/null +ss -tlnp | grep -E ':(22|3389)' # yalnızca WG arayüzünde dinlemeli +# yerel GUI kapalıyken de RDP çalışmalı (K-22): +sudo bf-gui-off && systemctl is-active xrdp xrdp-sesman # ikisi de "active" dönmeli +``` + +### Kanal seçim matrisi + +| Durum | Kullanılacak kanal | +|---|---| +| Normal bakım (komut/config) | SSH-over-WireGuard | +| Grafik bakım (teknisyen) | xRDP + GNOME (WG üzerinden; **yerel GUI kapalı olsa da çalışır**, K-22) | +| WireGuard çöktü, grafik lazım | RustDesk OSS (birincil yedek) | +| WireGuard + RustDesk çöktü | MeshCentral terminal/dosya | +| Otomasyon (filo) | Ansible-over-SSH (09), kanal değil araç | +| Sahada yerel fiziksel ekran gerekiyor | `bf-gui-on` (yalnız yerel GUI; RDP'yi etkilemez) | + +### WG çökerse RustDesk analizi + +RustDesk istemcisi tünele değil VDS genel adresine (`hbbs`/`hbbr` portları) doğrudan internetten çıkar; WireGuard arayüzü down olsa bile `eth0/wlan0` üzerinden röle/ID sunucusuna ulaşır. Bu bağımsızlığın iki önkoşulu vardır: (1) saha interneti ayaktadır (elektrik + ISS), (2) VDS ayaktadır. İkisi de varsa teknisyen RustDesk'ten girip `wg-quick@wg0`'ı onarır — yani RustDesk hem yedek kanal hem WG kurtarma aracıdır. Tek ortak arıza: saha internet kesintisi (o zaman hiçbir uzaktan kanal çalışmaz, 16/17 prosedürleri) veya VDS kesintisi (o zaman MeshCentral da gider; yedek VDS planı 17'de). + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| 4 kanalın normal durumda erişilebilirliği | Tümü OK | LAB(2) | +| `bf-gui-off` sonrası RDP oturumu | `xrdp`/`xrdp-sesman` active kalır, GNOME oturumu WG üzerinden açılır (K-22) | LAB(2) | +| `wg-quick@wg0` stop → RustDesk oturumu | Bağlantı kurulur | LAB(2) | +| WG down + RustDesk kapalı → MeshCentral terminal | Komut çalışır | P1(5) | +| Güç kesintisi → 4 kanalın otomatik dönüşü | Tümü 5 dk içinde OK | LAB(2) | +| RDP portu internetten tarama | Kapalı (yalnızca WG) | LAB(2) | +| Lisanssız AnyDesk denemesi | Modül kurulum yapmaz, `ANYDESK_LICENSE_CONFIRMED` yoksa durur | LAB(2) | + +## 11. Rollback + +1. Arızalı kanalın önceki agent sürümüne dönüşü 10-UPDATE dalga zinciriyle yapılır. +2. RustDesk key değişikliğinde eski key geçiş süresi boyunca tutulur, sonra iptal edilir. +3. Son çare: kanal agent'ı kaldırılıp kalan 3 kanalla işletim sürdürülür (17-RECOVERY). + +## 12. Kontrol Listesi + +- [ ] hbbs/hbbr + MeshCentral VDS'te ayakta, Uptime Kuma izliyor. +- [ ] 4 servisin tamamı boot-enable, güç-kesinti testinden geçti. +- [ ] SSH/RDP yalnızca WG arayüzünde dinliyor. +- [ ] `bf-gui-off` sonrası `xrdp` + `xrdp-sesman` hâlâ active (K-22 kanıtı kayıtlı). +- [ ] RustDesk etiketleri `bf-` ile eşleşiyor. +- [ ] AnyDesk hiçbir lisanssız cihaza kurulu değil; modül yalnız `scripts/install/optional/anydesk/` altında ve lisans onayı kapısıyla. + +## 13. Açık Sorular + +- [ ] hbbs/hbbr ile MeshCentral aynı VDS'te mi, ayrı mı — yük testiyle karar (sahibi: 25-ROADMAP). +- [ ] RustDesk self-hosted key rotasyon sıklığı (sahibi: 11-SECURITY yazarı). +- [ ] GNOME vs XFCE A/B ölçümünde "RDP güvenilirliği" ve "login screen erişimi" metriklerinin ölçüm yöntemi (sahibi: platform ekibi) [K-23]. +- [ ] RustDesk headless/katılımsız servis davranışının reboot sonrası kanıtı (her iki masaüstü kolunda) (sahibi: platform ekibi) [K-23]. + +--- + +## Ek: Mermaid — kanal bağımsızlığı ve RDP'nin GUI'den ayrılması + +```mermaid +flowchart LR + PC["Saha bf-"] -->|WG tüneli| WG["WireGuard hub"] + WG --> SSH["SSH / Ansible"] + WG --> RDP["xRDP + GNOME
    (her zaman hazır, K-22)"] + PC -->|doğrudan internet
    VDS genel adresi| RD["RustDesk hbbs/hbbr"] + PC -->|doğrudan internet
    VDS genel adresi| MC["MeshCentral"] + GUI["bf-gui-on/off
    (yalnız yerel fiziksel GUI)"] -.->|"KONTROL ETMEZ"| RDP + WG -.->|çökerse| DOWN{"WG down?"} + DOWN -->|evet| RD + DOWN -->|evet| MC +``` +
    + + +# 08 — WireGuard Ağı ve Network + +> Kısa özet: Hub-spoke WireGuard topolojisi: merkez hub, her saha cihazı `bf-<8hane>` peer'ı, `PersistentKeepalive = 25`, boot'ta otomatik tünel. SSH/RDP yalnızca tünel içinden erişilir; saha internetindeki Turkcell paket bitimi/dönüşü etkileri bu dosyadadır. + +- Dosya: `docs/08-WIREGUARD-AND-NETWORK.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-05` (hub-spoke + keepalive + otomatik reconnect), `K-12` (peer adı = cihaz kimliği), `K-04` (WG çökerse yedek kanallar) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +700 cihazlık VPN topolojisini, peer adlandırma sözleşmesini, NAT arkasında tüneli ayakta tutan keepalive değerini ve saha interneti (Turkcell mobil veri) gerçekleriyle başa çıkma planını sabitlemek. + +## 2. Kapsam + +- Kapsam içi: hub-spoke topoloji, peer = bayi ID eşleşmesi, keepalive, `wg-quick@wg0` otostart, subnet/IP planı, SSH/RDP'nin WG-arkası kuralı, Turkcell paket bitimi/dönüşü notu. +- Kapsam dışı: SSH anahtar politikası (06), RustDesk/MeshCentral kurulumu (07), firewall detayları (11). + +## 3. Kararlar + +```text +KARAR: Hub-spoke WireGuard: merkez sunucu hub, her saha cihazı spoke (peer adı = `bf-<8hane>`); istemcide `PersistentKeepalive = 25` + `wg-quick@wg0` systemd enable; RDP/SSH dış dünyaya kapalı, yalnızca WireGuard arkasında. +GEREKÇE: Resmi QuickStart NAT arkasındaki eş için 25 sn keepalive'i "geniş güvenlik-duvarı yelpazesiyle çalışan makul aralık" olarak verir; `wg-quick@.service` Ubuntu paketinden gelir, enable = açılışta otomatik VPN. Elektrik kesintisi sonrası cihaz açılınca VPN kendiliğinden gelir. +ALTERNATİF: Keepalive kapalı / agresif 10 sn — kapalı NAT eşlemesini düşürür, agresif değer saha verisi olmadan yazılmaz; PİLOT-1 kopma sayacına göre ayarlanır. +RİSK: Turkcell CGNAT davranışı resmi kaynaktan doğrulanamaz (operatör bilgisi); azaltma: PİLOT-1'de 7/24 kopma sayacı, aralık saha verisiyle ayarlanır. +MALİYET: Ücretsiz. +LİSANS: WireGuard OSS (Ubuntu paketi `wireguard-tools 1.0.20250521-1ubuntu1`) — https://www.wireguard.com/quickstart/ + https://packages.ubuntu.com/resolute/wireguard-tools (doğrulanma: 2026-09-15). +``` + +```text +KARAR: Her WireGuard peer adı cihaz kimliğine eşittir (`bf-<8hane>` = hostname = Ansible inventory adı = monitoring etiketi); hub tarafında peer başına sabit tünel IP'si atanır. +GEREKÇE: Tek kimlik (K-12) 9 sistemde join anahtarıdır; peer adı farklı olsaydı WG log'undan cihaz bulmak manuel eşleştirme gerektirirdi. Sabit IP = envanterde `bf- → 10.x` haritası, runbook ve monitoring sorguları deterministik olur. +ALTERNATİF: Rastgele peer adı / dinamik IP — okunamaz, izlenemez → elendi. +RİSK: Bayi no değişirse peer yeniden adlandırılmalı; azaltma: 02-NAMING yeniden-no prosedürü. +MALİYET: Ücretsiz. +LİSANS: Yok (isimlendirme standardı). +``` + +## 4. Neden Bu Karar? + +Saha cihazları NAT/CGNAT arkasındadır; merkez onlara ulaşamaz, onlar merkeze çıkar. Hub-spoke bu gerçeğe uyar: spoke keepalive ile NAT eşlemesini canlı tutar, hub yalnızca dinler. 25 sn, resmi dokümanın "makul aralık" değeridir — saha ölçümü olmadan daha agresif yazmak veri israfı, kapatmak kopma demektir. Peer = bayi ID kuralı, 700 peer'lı hub config'ini insan tarafından okunabilir tutar. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Keepalive kapalı | Az trafik | NAT eşlemesi düşer, tünel ölür | Elendi | +| Keepalive 10 sn | Daha canlı eşleme | Saha verisi olmadan veri israfı | Yedek (PİLOT-1 verisine göre) | +| Full-mesh | Spoke'lar arası doğrudan | 700 cihazda key/config patlaması | Elendi | +| Tailscale/ZeroTier | Kolay | Freemium, merkezi kimlik | Elendi (K-04) | + +## 6. Avantajlar + +- Kernel-seviyesi VPN: düşük CPU, düşük gecikme, mini PC dostu. +- Otostart: elektrik kesintisi sonrası teknisyen müdahalesi gerekmez. +- Sabit IP + peer adı = monitoring ve Ansible'da doğrudan adresleme. + +## 7. Dezavantajlar + +- Hub tek darboğaz: 700 eşin handshake + trafiği tek VDS'ten geçer (yük testi gerekir). +- CGNAT davranışları (özellikle mobil) resmi kaynaktan doğrulanamaz; ayar saha verisine bağımlıdır. +- Peer ekleme/çıkarma merkez config'inde yapılır; otomasyonsuz 700 peer yönetilemez (09'a bağımlılık). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Turkcell CGNAT NAT eşlemesini erken düşürür | Orta | Orta | PİLOT-1 7/24 kopma sayacı; aralık saha verisiyle ayarlanır | +| Turkcell paket bitimi → veri durur | Orta | Yüksek | Paket izleme + bitim alarmı (bkz. §9); kota-dostu keepalive | +| Hub VDS darboğazı (700 eş) | Orta | Yüksek | Yük testi + peer başına trafik limiti; gerekirse 2. hub | +| Peer private key sızıntısı | Düşük | Orta | Peer bazlı iptal (tek peer silinir, filo etkilenmez) | + +## 9. Uygulama Planı + +1. Merkez hub kurulur, subnet planı dondurulur (ör. `10.8.0.0/16`, hub `10.8.0.1`, cihazlara sabit `/32`). +2. Her cihaz için peer üretilir: adı `bf-<8hane>`, tünel IP'si envanter haritasından. +3. İstemci config'i (`/etc/wireguard/wg0.conf`): hub endpoint + `PersistentKeepalive = 25` + `wg-quick@wg0 enable`. +4. Peer ekleme/çıkarma yalnız 29-ENROLLMENT sonrasında Ansible rolüyle yapılır (09); hub config'i Git'te sürümlenir. `PROVISIONED_OFFLINE` cihaz peer/handshake doğrulanmadan `READY` olamaz. +5. PİLOT-1'de kopma sayacı koşar (handshake yaşı metriği 14'te), keepalive saha verisiyle ayarlanır. + +```bash +# örnek: istemci konfigürasyonu (değerler envanterden gelir) +# /etc/wireguard/wg0.conf +# [Interface] PrivateKey = / Address = 10.8.0.15/32 +# [Peer] PublicKey = / Endpoint = :51820 +# PersistentKeepalive = 25 / AllowedIPs = 10.8.0.0/16 + +sudo systemctl enable --now wg-quick@wg0 +sudo wg show wg0 latest-handshakes # kopma sayacı girdisi +``` + +### Turkcell paket bitimi / dönüşü notu + +Saha bağlantısı Turkcell mobil veri ise iki gerçek vardır: (1) hat CGNAT arkasındadır — merkez cihaza ulaşamaz, keepalive'lı giden tünel zorunludur; (2) kota bitiminde veri durur veya hız düşer — tünel sessizce ölür, cihaz "çevrimdışı" görünür ama arıza değildir. Önlemler: kota-dostu keepalive (25 sn varsayılan, PİLOT verisiyle ayarlanır; gereksiz agresif değer kotayı eritir), paket bitimine Uptime Kuma "last seen" alarmı + sorumlu bayiye bildirim akışı (14), kota dönüşünde tünelin kendiliğinden toparlanması (`wg-quick` + keepalive yeniden handshake eder, ek işlem gerekmez). Paket yenileme/dönüş prosedürü (hat sahibi, yenileme adımı) 18-ROLLOUT runbook'una yazılır — bu dosya yalnızca teknik davranışı sabitler. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Boot sonrası `wg show` handshake | 3 dk içinde güncel handshake | LAB(2) | +| NAT arkasında 24 saat tünel | Kopma yok (sayaç temiz) | P1(5) | +| Kota simülasyonu (veri kes) → geri ver | Tünel kendiliğinden toparlanır | LAB(2) | +| SSH/RDP internetten tarama | Kapalı; yalnızca `10.8.0.0/16` içinden açık | LAB(2) | +| 700 eş yük projeksiyonu | Hub CPU/bant genişliği sınırlar içinde | Yük testi | + +## 11. Rollback + +1. Hatalı hub config'i Git'teki önceki sürüme döndürülür, `systemctl reload wg-quick@wg0`. +2. Keepalive değişikliği sorun çıkarırsa önceki değere Ansible ile toplu dönüş (10-UPDATE dalga sırası). +3. Son çare: WG down iken RustDesk/MeshCentral (07) ile cihaza girilip config elle düzeltilir. + +## 12. Kontrol Listesi + +- [ ] Peer adları `bf-<8hane>` ile birebir, envanterle eşleşiyor. +- [ ] Tüm istemcilerde `PersistentKeepalive = 25` (veya PİLOT-onaylı değer). +- [ ] `wg-quick@wg0` tüm sahada enable. +- [ ] SSH/RDP yalnızca WG arayüzünde dinliyor. +- [ ] PİLOT-1 kopma sayacı koşuyor, sonuç 24-DECISION-LOG'a işlenecek. + +## 13. Açık Sorular + +- [ ] Keepalive'ın PİLOT-1 verisine göre 25 sn'de kalıp kalmayacağı (sahibi: 08 yazarı, P1 sonrası). +- [ ] Hub'un 700 eşi tek VDS'te taşıyıp taşımayacağı — yük testi (sahibi: 25-ROADMAP). +- [ ] Turkcell kota/bitim prosedürünün işletme sahibi (sahibi: 18-ROLLOUT yazarı). + +--- + +## Ek: Mermaid — hub-spoke + keepalive + +```mermaid +flowchart TB + subgraph SAHA["Saha (NAT/CGNAT arkası)"] + S1["bf-12010193
    10.8.0.15"] + S2["bf-12010194
    10.8.0.16"] + end + HUB["WireGuard hub
    10.8.0.1:51820"] + S1 -->|handshake + keepalive 25sn
    giden bağlantı| HUB + S2 -->|handshake + keepalive 25sn
    giden bağlantı| HUB + HUB -->|SSH/RDP yalnızca
    tünel içi| S1 +``` +
    + + +# 14 — İzleme ve Sağlık (Monitoring & Health) + +> Kısa özet: 17 metrik + Prometheus/Node Exporter/Grafana OSS + Uptime Kuma + `bf-status`/`bf-diagnostics`/`bf-support-bundle` sözleşmeleri. Monitoring operatörü ve saha teknisyeni içindir. +> +> - Dosya: `docs/14-MONITORING-AND-HEALTH.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-07`, `#K-14` +> - Durum: [ ] Taslak + +--- + +## 1. Amaç + +700 cihazda "hangisi ölü, hangisi hasta, hangisi sağlıklı" sorusuna iki perdede cevap: mühendis için metrik (Prometheus), teknisyen için UP/DOWN + last-seen (Uptime Kuma). + +## 2. Kapsam + +- Kapsam içi: 17 metrik listesi, Prometheus/Node Exporter/Grafana OSS/Uptime Kuma rolleri, scrape/retention ilkeleri, 3 saha komutu sözleşmesi. +- Kapsam dışı: log içerik politikası (15), alarm bildirim hedefleri detayı (kurulum dokümanına havale), merkez donanım siparişi. + +## 3. Kararlar + +```text +KARAR: Birincil metrik yığını Prometheus + Node Exporter + Grafana OSS'tir; 17 metriğin tamamı burada toplanır. +GEREKÇE: 17 metriğin tamamı yalnızca bu yığında ücretsiz ve kotasız toplanır (WireGuard/Docker/MEG sağlığı textfile collector ile). +ALTERNATİF: Netdata Cloud — Free 5 node kotası 700 cihazda ücrete düşer, elendi. Yalnızca Kuma — metrik körlüğü, elendi. +RİSK: 700 node kardinalite/saklama yükü; azaltma: 60 sn scrape, 30–90 gün retention, `BF-` etiket şeması. +MALİYET: Ücretsiz. +LİSANS: Prometheus/Node Exporter Apache-2.0 — https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/ (2026-09-15); Grafana OSS AGPL-3.0 — https://grafana.com/oss/ (2026-09-15). +``` + +```text +KARAR: Tamamlayıcı olarak Uptime Kuma: saha-teknisyeni dostu UP/DOWN panosu + Push "last seen" + bildirimler. +GEREKÇE: Metrik bilmeyen teknisyene en basit çevrimdışı alarmını verir (20 sn aralık, 90+ bildirim servisi, tek konteyner). +ALTERNATİF: Yalnızca Grafana alarmı — teknisyen için karmaşık, elendi. +RİSK: Kuma metrik vermez; azaltma: Prometheus ile birlikte koşar, rol çakışması yok. +MALİYET: Ücretsiz. +LİSANS: Uptime Kuma MIT — https://github.com/louislam/uptime-kuma (2026-09-15). +``` + +```text +KARAR: Özel metrikler (WireGuard handshake, Docker, MEG) Node Exporter textfile collector `.prom` dosyalarıyla verilir. +GEREKÇE: Standart Prometheus yolu; özel exporter yazma yükü yok. +ALTERNATİF: Özel exporter geliştirme — bakım yükü, elendi. +RİSK: `.prom` yazım hatası scrape'i bozar; azaltma: cron/systemd timer çıktısı atomik yazılır. +MALİYET: Ücretsiz. +LİSANS: Node Exporter Apache-2.0 — https://github.com/prometheus/node_exporter (2026-09-15). +``` + +```text +KARAR: Saha sağlık sözleşmeleri: `bf-status` (hızlı bakış), `bf-diagnostics` (derin tanı), `bf-support-bundle` (secret sızdırmaz paket). +GEREKÇE: 700 dokunulmaz cihazda logsuz metrik kör, metriksiz log sağırdır; bundle secret dışlama kuralıyla güvenli uzaktan tanı sağlar. +ALTERNATİF: Harici log platformu (Loki/ELK) ilk fazda — ek servis yükü, elendi (Faz-sonrası hedef). +RİSK: Bundle'a secret kaçması; azaltma: dışlama listesi + üreticide maskeleme testi. +MALİYET: Ücretsiz. +LİSANS: systemd-journald / textfile (Apache-2.0) — https://github.com/prometheus/node_exporter (2026-09-15). +``` + +## 4. Neden Bu Karar? + +İki kullanıcı, iki hız: mühendis kök nedeni metrikten bulur, teknisyen kesintiyi Kuma'dan görür. Scrape 60 sn + retention 30–90 gün, 700 node'da merkez yükünü taşınabilir tutar. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Yalnızca Uptime Kuma | Çok kolay | Metrik körlüğü | Elendi | +| Netdata Cloud | Zengin agent | Free 5 node kotası | Elendi | +| Netdata Parent self-hosted | Zengin | Merkezi tasarım yükü + kota riski | Elendi | +| Loki/ELK ilk fazda | Güçlü log | Ek servis yükü, sadelik ihlali | Faz-sonrasına ertelendi | + +## 6. Avantajlar + +- Tamamı ücretsiz ve kotasız; 700 cihaz lisans duvarına çarpmaz. +- Tek kimlik (`BF-`) metrikten loga join anahtarıdır. + +## 7. Dezavantajlar + +- Prometheus 700 node işletme bilgisi ister; retention LAB ölçümü olmadan donanım siparişi verilmemeli. +- Kuma + Prometheus çift kurulum merkezde iki servis demektir. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Kardinalite patlaması | Orta | Orta | 60 sn scrape, etiket disiplini, federasyon hedefi | +| Retention şişmesi | Orta | Orta | 30–90 gün, PİLOT hacim ölçümü | +| Bundle secret sızıntısı | Düşük | Yüksek | Dışlama listesi + maskeleme testi | + +## 9. Uygulama Planı + +1. Merkez: Prometheus + Grafana OSS + Uptime Kuma kurulur. +2. Saha: Node Exporter + textfile cron/timer + Kuma Push kurulur. +3. Etiket şeması `device_id="BF-"` tüm metriklerde uygulanır. +4. `bf-status` / `bf-diagnostics` / `bf-support-bundle` sahaya dağıtılır. `bf-status`, yaşam döngüsü durumunu açık gösterir: offline kurulum `PROVISIONED_OFFLINE`, token sonrası `ENROLLED`, Prometheus/Kuma + WireGuard + erişim doğrulanınca `READY` (27/29). + +```bash +# saha: Node Exporter + textfile dizini (örnek) +systemctl enable --now node_exporter +ls /var/lib/node_exporter/textfile/ # *.prom buraya atomik yazılır + +# WireGuard handshake örneği (üretici script özeti) +# wg show wg0 latest-handshakes > /var/lib/node_exporter/textfile/wireguard.prom.tmp \ +# && mv .../wireguard.prom.tmp .../wireguard.prom +``` + +### 17 metrik listesi + +| # | Metrik | Kaynak | Ne için | +|---|---|---|---| +| 1 | `up` | Prometheus scrape | Cihaz scrape edilebilir mi (ölü/diri) | +| 2 | `node_cpu_seconds_total` | Node Exporter | CPU yükü | +| 3 | `node_memory_MemAvailable_bytes` | Node Exporter | RAM baskısı | +| 4 | `node_filesystem_avail_bytes` | Node Exporter | Disk dolumu | +| 5 | `node_load1/5/15` | Node Exporter | Yük ortalaması | +| 6 | `node_network_receive/transmit_bytes_total` | Node Exporter | Ağ trafiği | +| 7 | `node_systemd_unit_state` | Node Exporter (systemd) | Kritik servis ayakta mı | +| 8 | `node_timex_offset_seconds` | Node Exporter | Saat kayması (TLS/WG için kritik) | +| 9 | `node_boot_time_seconds` | Node Exporter | Beklenmedik reboot tespiti | +| 10 | `wireguard_last_handshake_seconds` | textfile | Tünel canlılığı (stale = kopuk) | +| 11 | `wireguard_transfer_bytes` | textfile | Tünel trafiği | +| 12 | `docker_container_running` | textfile | MEG/yan konteyner ayakta mı | +| 13 | `docker_container_restart_count` | textfile | Crash-loop tespiti | +| 14 | `meg_up` | textfile | MEG sağlığı (kabul madde 6 ile aynı kaynaktan) | +| 15 | `meg_last_success_timestamp` | textfile | MEG iş yapıyor mu (stale = takılı) | +| 16 | `unattended_upgrade_active` | textfile | K-11 kilidi delinmiş mi (1 = ihlal) | +| 17 | `kuma_push_last_seen` | Uptime Kuma Push | Teknisyen "last seen" görünümü | + +Scrape: 60 sn. Retention: 30–90 gün (LAB ölçümüyle kesinleşir). + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Scrape + 17 metrik | Grafana panosu dolu | P1(5) | +| WG down simülasyonu | Metrik 10 stale + Kuma DOWN | P1(5) | +| Konteyner kill | Metrik 12/13 alarm | LAB(2) | +| `unattended-upgrade` açma | Metrik 16 = 1 alarm | LAB(2) | +| Kuma Push kesintisi | last-seen bayatlar | P1(5) | + +## 11. Rollback + +1. Bozuk exporter/push, önceki sürüme Ansible ile geri alınır. +2. Prometheus config hatasında önceki config + `promtool check config` ile dönüş. +3. Son çare: monitoring'siz işletim (erişim kanalları bağımsızdır — 01). + +## 12. Kontrol Listesi + +- [ ] 17 metriğin tamamı Grafana'da görünüyor. +- [ ] Kuma UP/DOWN + Push last-seen çalışıyor. +- [ ] Etiket şeması `BF-` tutarlı. +- [ ] Scrape 60 sn, retention 30–90 gün aralığında. + +### `bf-status` örnek çıktısı (16 satır sözleşmesi) + +```text +BF-12010193 2026-09-15 12:00 +03 OK +uptime: 6d 4h 12m | load: 0.31 0.28 0.22 +cpu: 8% | mem: 1.1/3.8G (29%) | disk /: 9.2/28G (33%) +net: wg0 UP, handshake 12s ago | rx 41M tx 18M +docker: daemon UP | meg:1.2.3 running 6d (restarts 0) +meg: UP, last success 40s ago +systemd: docker OK | wg-quick@wg0 OK | xrdp OFF | node_exporter OK +unattended-upgrades: DISABLED (timer masked) +ufw: active, default DENY in | 22/3389 wg0-only +gui: OFF (multi-user) | rdp sessions: 0 +kuma push: OK 30s ago | prometheus scrape: OK 45s ago +rustdesk: online | meshcentral: online +boot: 2026-09-09 07:48 (power-loss recovery OK) +alerts: 0 critical, 1 warning (disk trend) +next: support bundle: bf-support-bundle +``` + +`bf-diagnostics`: yukarıdakinin detaylı sürümü (servis log kuyrukları + `ss` + `df -i` + textfile içerikleri). `bf-support-bundle`: aynı paketin tarball'ı; WireGuard private key, RustDesk şifresi, SSH private key ve `authorized_keys` dışı secret'lar ASLA pakete girmez (üretici maskeleme testinden geçer). + +## 13. Açık Sorular + +- [ ] Prometheus retention/kardinalite hesabı (700 × 60 sn) — LAB ölçümü (sahibi: 14 yazarı). +- [ ] Bildirim hedefleri (SMS/e-posta/webhook) — merkez kurulumunda netleşecek (sahibi: Faz 3). +- [ ] Federasyon gerekip gerekmediği — 700 node ölçümü (sahibi: 14 yazarı). + +--- + +## Ek: Mermaid — Metrik akışı + +```mermaid +flowchart LR + SAHA["Saha bf-
    Node Exporter + textfile"] -->|scrape 60sn| PROM["Prometheus"] + PROM --> GRAF["Grafana OSS"] + SAHA -->|Push last-seen| KUMA["Uptime Kuma"] + KUMA --> TECH["Teknisyen panosu"] + GRAF --> ENG["Mühendis panosu"] + SAHA -->|bf-status| CONSOLE["Saha konsolu"] +``` +
    + + +# 16 — Elektrik Kesintisi ve Otomatik Kurtarma + +> Kısa özet: güç geldikten sonra cihazın dokunulmadan işe dönmesi: BIOS ayarı, boot zinciri, systemd bağımlılıkları, kurtarma doğrulaması. Saha ve LAB ekibi içindir. +> +> - Dosya: `docs/16-POWER-LOSS-AND-AUTO-RECOVERY.md` +> - İlgili kararlar: `24-DECISION-LOG.md#K-03`, `#K-05`, `#K-10` +> - Durum: [ ] Taslak + +--- + +## 1. Amaç + +Elektrik kesintisini sıradan olay haline getirmek: güç gelir, cihaz açılır, VPN kurulur, konteynerler kalkar, MEG işe döner — teknisyen dokunmaz. + +## 2. Kapsam + +- Kapsam içi: BIOS güç ayarı, boot hedefi, systemd sıralaması ve bağımlılıkları, kurtarma testi. +- Kapsam dışı: UPS yatırımı, veri yedekleme (17), update rollback (10). + +## 3. Kararlar + +```text +KARAR: BIOS "Restore on AC Power Loss = Power On" tüm sahada standarttır; cihaz terminale (multi-user) boot eder. +GEREKÇE: Güç gelince açılmayan cihaz kurtarma zincirine hiç giremez; terminal boot en düşük kaynakla en öngörülebilir zemindir (K-03). +ALTERNATİF: Grafik boot / manuel açma — kaynak israfı + saha ziyareti, elendi. +RİSK: Heterojen BIOS menülerinde ayar adı farklı olabilir; azaltma: donanım profil başına LAB kaydı. +MALİYET: Ücretsiz. +LİSANS: Yok (donanım ayarı). +``` + +```text +KARAR: Boot zinciri systemd bağımlılıklarıyla sıralanır: network → `wg-quick@wg0` → `docker.service` → MEG/uygulama birimleri → remote/monitoring ajanları; `xrdp`/`xrdp-sesman` her zaman enable/ready kalır, yerel GNOME display-manager durumu bağımsızdır. +GEREKÇE: Sırasız boot race üretir (Docker WG'den önce kalkar, MEG ağ bulamaz); `After=`/`Wants=` zinciri her açılışta aynı sırayı garanti eder. +ALTERNATİF: Bağımlılıksız "hepsi enable" — açılışta rastgele sıra, elendi. +RİSK: Birim adları 26.04.1'e göre değişebilir; azaltma: LAB imajında doğrulanmadan dondurulmaz (K-03 riski). +MALİYET: Ücretsiz. +LİSANS: Yok (systemd yapılandırması). +``` + +```text +KARAR: Kurtarma `unless-stopped` + `wg-quick enable` + daemon enable üzerine kurulur; kesinti "manuel stop" sayılmaz. +GEREKÇE: K-10 gereği kesinti sonrası konteynerler kendiliğinden kalkar; K-05 gereği VPN kendiliğinden gelir. Ek kurtarma servisi gerekmez. +ALTERNATİF: Özel kurtarma scripti/cron — hareketli parça artar, elendi. +RİSK: Yanlışlıkla stop edilen kritik konteyner kalkmaz (tasarlanan davranış); azaltma: `bf-status` ile görünürlük. +MALİYET: Ücretsiz. +LİSANS: Docker CE ücretsiz — https://docs.docker.com/engine/containers/start-containers-automatically/ (doğrulanma: 2026-09-15). +``` + +## 4. Neden Bu Karar? + +Kurtarma, ek yazılımla değil sıralamayla çözülür: her katman bir öncekinin hazır olduğuna bakarak kalkar. Sadelik kuralı burada en literally uygulanır — zincirde özel bileşen yok. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| UPS ile kesintiyi önleme | Kesinti yaşanmaz | 700 cihazda donanım maliyeti | Saha kararına bırakıldı (bu dokümanın dışı) | +| Özel kurtarma servisi | Esnek | Ek bakım yükü | Elendi | +| Grafik boot | Teknisyene tanıdık | Kaynak + hata yüzeyi | Elendi | + +## 6. Avantajlar + +- Kurtarma testi tek komutla tekrarlanır (fişi çek / reboot); sonuç deterministiktir. +- Zincirdeki her halka standart systemd mekanizmasıdır, özel bilgi gerektirmez. + +## 7. Dezavantajlar + +- Uzun kesintide saat kayması olabilir; NTP senkronu zincire dahildir ama ilk WG handshake gecikebilir. +- Bozuk diskte (kirli filesystem) boot fsck'e takılabilir; journal + ext4 varsayılanı bu riski küçültür. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Boot race (sıra bozuk) | Orta | Orta | `After=` zinciri + LAB güç testi | +| BIOS ayarı profilde yok | Düşük | Yüksek | Profil başına LAB kaydı | +| Saat kaymasıyla WG/TLS gecikmesi | Orta | Düşük | NTP bekleme + handshake metriği (14) | + +## 9. Uygulama Planı + +1. BIOS güç ayarı profillere işlenir. +2. Boot hedefi multi-user yapılır; GUI kapalı standarttır. +3. systemd bağımlılıkları yazılır, enable zinciri kurulur. +4. Güç kesintisi simülasyonuyla doğrulanır. + +```bash +# boot hedefi (terminal standart) +systemctl set-default multi-user.target +systemctl get-default + +# enable zinciri +systemctl enable wg-quick@wg0 docker node_exporter +# MEG/uygulama birimleri docker sonrası kalkar: +# /etc/systemd/system/meg-app.service.d/override.conf +# [Unit] +# After=docker.service wg-quick@wg0.service network-online.target +# Wants=network-online.target +# [Install] +# WantedBy=multi-user.target + +# zincir denetimi +systemd-analyze critical-chain docker.service +systemd-analyze critical-chain wg-quick@wg0.service +``` + +```bash +# kurtarma doğrulaması (güç testi sonrası) +uptime -s +systemctl is-active wg-quick@wg0 docker +docker ps --format '{{.Names}} {{.Status}}' +bf-status +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Fiş çekme simülasyonu (güç kesintisi) | Müdahalesiz tam zincir kalkar | LAB(2) | +| Reboot sonrası sıra | network → WG → Docker → MEG | LAB(2) | +| Manuel stop + reboot | Durdurulan kalkmaz (tasarlanan) | LAB(2) | +| 10 ardışık güç döngüsü | 10/10 kurtarma | P1(5) | +| WG handshake süresi | Metrik 10 makul aralıkta tazelenir | P1(5) | + +## 11. Rollback + +1. Bozuk bağımlılıkta override dosyası kaldırılır, daemon-reload + reboot ile önceki sıra geri gelir. +2. Boot hedefine takılmada konsoldan `systemctl set-default` düzeltilir. +3. Son çare: golden image yeniden kurulumu (17-RECOVERY LEVEL 9). + +## 12. Kontrol Listesi + +- [ ] BIOS güç ayarı profilde kayıtlı. +- [ ] Boot hedefi multi-user. +- [ ] `wg-quick@wg0`, `docker`, ajanlar enable. +- [ ] `After=` zinciri dosyada ve LAB'da doğrulandı. +- [ ] Güç testi 10/10 geçti (P1). + +## 13. Açık Sorular + +- [ ] Kesin birim adları + GNOME oturum satırı — LAB 26.04.1 imajı (sahibi: Faz 3, 03/04 yazarları). +- [ ] NTP bekleme süresi eşiği — P1 ölçümü (sahibi: 16 yazarı). + +--- + +## Ek: Mermaid — Boot zinciri ve systemd bağımlılıkları + +```mermaid +flowchart TB + PWR["Power ON
    (BIOS Power On)"] --> TGT["multi-user.target
    (terminal boot)"] + TGT --> NET["network-online.target"] + NET --> WG["wg-quick@wg0
    After network-online"] + WG --> DKR["docker.service
    After network"] + DKR --> MEG["MEG / uygulama birimleri
    After docker + wg-quick"] + MEG --> AGT["RustDesk + MeshCentral
    + node_exporter + Kuma Push"] + AGT --> BF["bf-status OK"] +``` +
    + + +# 19 — Sorun Giderme (Troubleshooting) + +> Kısa özet: Sahada ve merkezde en sık görülen arızaların belirti → neden → komut → çözüm tablosu. 17-RECOVERY "hangi seviye" sorusunu, bu doküman "o seviyede hangi komut" sorusunu cevaplar. + +- Dosya: `docs/19-TROUBLESHOOTING.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-03` (xRDP/GUI), `#K-04` (erişim kanalları), `#K-05` (WireGuard), `#K-10` (Docker), `#K-14` (`bf-status`, support-bundle) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Tekrar eden arızalarda teşhisi hızlandırmak: belirtiyi bulan teknisyen/admin, tabloya bakıp ilk komutu 30 saniyede çalıştırır. Her girdide "ne zaman üst seviyeye çık" notu vardır. + +## 2. Kapsam + +- Kapsam içi: boot, ağ/VPN, SSH, RDP/GUI, RustDesk, MeshCentral, Docker/MEG, disk, monitoring ve operatör arayüzü (grafik/terminal konsol, paket deposu keşfi) belirti tabloları. +- Kapsam dışı: seviye kararları (17), adım-adım kurulum (20), merkez onay akışı (21), arayüzün tüm ekranları (33). + +## 3. Kararlar + +```text +KARAR: Her arıza girdisi aynı formatta yazılır: Belirti → Olası nedenler (olasılık sırasıyla) → Tanı komutları → Çözüm → Yükseltme kriteri. +GEREKÇE: Standart format, acemi teknisyenin bile doğru sırayla (tanıdan önce çözüm yok) ilerlemesini sağlar; her çözüm denenebilir komutla verilir. +ALTERNATİF: Serbest-anlatım sorun listesi — komutlar dağınık kalır, otomasyona çevrilemez; elendi. +RİSK: Tablo eskirse yanlış yönlendirir; azaltma: her PİLOT dalgası sonrası tablo gözden geçirilir. +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +Sorun giderme, kurtarma merdiveninin (17) "içini" doldurur: 17 hangi LEVEL, 19 o LEVEL'de hangi komut. Olasılık sırası önemlidir — en yaygın neden önce yazılır, teknisyen zamanı boşa harcanmaz. Yükseltme kriteri her girdinin sigortasıdır (inatla aynı komutu tekrarlamak yasak). + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Harici bilgi tabanı (Wiki araması) | Aranabilir | Çevrimdışı sahada erişilemez, Git akışı yok | Elendi (22'de Docusaurus içinde bu dosya zaten aranabilir) | +| Her arıza için ayrı sayfa | Detaylı | 700 cihazda 100 sayfa yönetilemez | Elendi (gerekirse Ek'e taşınır) | + +## 6. Avantajlar + +- Tek dosya, çevrimdışı da okunur (USB'de veya basılı). +- Komutlar kopyala-yapıştırılabilir; açıklamalar Türkçe, komut adları İngilizce orijinal. + +## 7. Dezavantajlar + +- 26.04.1'e özgü çıktı farkları LAB'da güncellenmelidir (kesin servis adları, log yolları). +- MEG'e özgü arızalar 13-MEG-ACCEPTANCE'tan beslenmelidir; bu dosya iskelettir. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Eski komut (servis adı değişti) | Orta | Orta | LAB'da her komut çalıştırılıp doğrulanır | +| Secret'lı komut geçmişe düşer | Düşük | Yüksek | Support-bundle kuralı (K-14); komutlarda secret yazılmaz | + +## 9. Uygulama Planı + +Önce genel tanı (her arızada ilk 60 saniye): + +```bash +bf-status +systemctl --failed +ip -brief addr; ip route show default +wg show wg0 2>&1 | head -20 +docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.RestartPolicy}}' +df -h / /var/lib/docker | cat +``` + +Aynı raporlar operatör arayüzünden de okunur (komut ezberi gerekmez): + +```text +Arayüzden: sudo bf → `Durum` düğmesi (Durum özeti) ya da Detaylı mod → Cihaz bilgisi sekmesi + (kimlik, ağ/WireGuard, kaynaklar, servisler, son journal hataları — hepsi salt-okunur) +Komutla (yedek): sudo bf --tui → Cihaz bilgisi menüsü +``` + +### T-1 — Cihaz açılmıyor / ekranda hiçbir şey yok + +| # | Neden (olasılık sırası) | Tanı | Çözüm | +|---|---|---|---| +| 1 | Elektrik yok / BIOS güç ayarı | Priz, adaptör, güç LED'i | BIOS "Restore on AC Power Loss = Power On" (16) | +| 2 | Monitör/kablo | Başka kablo/ekran dene | Değiştir | +| 3 | Disk ölmüş | BIOS diski görmüyor | Donanım değişimi → L8 yeni diskte | + +Yükseltme: donanım sağlamsa ama OS açılmıyorsa T-2'ye geç. + +### T-2 — Boot terminale düşmüyor / servisler kalkmıyor + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | Failed servis var | `systemctl --failed`, `journalctl -xb -p err` | İlgili servis girdisine git (T-3…T-6) | +| 2 | Disk dolu | `df -h /` | Docker log temizliği + rotasyon kontrolü (T-7) | +| 3 | Bozuk çekirdek/paket | `dpkg --audit`, `apt --fix-broken install` | 17-L7; olmazsa L8 | + +### T-3 — WireGuard tüneli yok (`wg show` boş / handshake eski) + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | Servis inaktif | `systemctl status wg-quick@wg0` | `sudo systemctl enable --now wg-quick@wg0` | +| 2 | Anahtar/config hatası | `journalctl -u wg-quick@wg0 --no-pager`, `wg show wg0 latest-handshakes` | Config'i merkezden yeniden bas (17-L5); peer adı `bf-` mi kontrol et | +| 3 | Saha interneti yok / CGNAT | `ping -c3 8.8.8.8`, modem arayüzü | Yerel ağ düzeltilir; kopma sayacı not edilir (P1 görevi) | +| 4 | Merkez hub down | Başka cihazdan hub'a bak | 17-L9 kolu işletilir | + +Yükseltme: WG kalkmıyorsa RustDesk/MeshCentral ile devam (17-L4); onlar de yoksa saha ziyareti. + +### T-4 — SSH bağlanmıyor (WG ayaktayken) + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | sshd down / anahtar eşleşmiyor | `systemctl status ssh`, `ssh -vvv blueforce@bf-` | Anahtarı merkezden yeniden dağıt (K-13); password denemesi YOK | +| 2 | Yanlış IP/hostname | `ip -brief addr`, envanter karşılaştır | 02-NAMING'e göre düzelt | +| 3 | Güvenlik duvarı | `sudo ufw status`, `ss -tlnp` | 11-HARDENING standardına döndür | + +### T-5 — RDP açılmıyor / siyah ekran / hemen kopuyor + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | GUI katmanı kapalı | `systemctl status display-manager xrdp xrdp-sesman` | `bf-gui-on`, tekrar dene | +| 2 | Oturum çakışması (yerel + RDP aynı kullanıcı) | `who`, `loginctl list-sessions` | Ayrı kullanıcı/oturum; eski oturumu kapat | +| 3 | xRDP config bozulmuş | `journalctl -u xrdp --no-pager` | Bilinen-iyi config'i bas (17-L5) | + +### T-6 — RustDesk bağlanmıyor + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | İstemci servis/uygulama kapalı | RustDesk durumu, ID görünüyor mu | Servisi başlat; ID+röle adresi merkez değerlerle aynı mı | +| 2 | Key uyuşmazlığı | İstemci key vs hbbs key | Merkezi key'i yeniden bas (07-REMOTE-ACCESS) | +| 3 | hbbs/hbbr down | Merkezden konteyner/servis durumu | Merkez tarafını ayağa kaldır; health monitörü (Kuma) ne diyor | + +### T-7 — Docker/MEG kalkmıyor veya sürekli restart + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | Restart loop (config/entrypoint) | `docker ps`, `docker logs --tail 100 ` | Config düzelt + `docker compose up -d` (17-L6) | +| 2 | Disk dolu (rotasyonsuz log) | `df -h /var/lib/docker`, `du -sh /var/lib/docker/containers/*` | `daemon.json` rotasyonu uygula; taşan logu buda | +| 3 | `latest` çekilmiş / sürüm kaymış | `docker images`, compose tag kontrolü | Sabit tag'e döndür (K-10); Watchtower varsa kaldır | +| 4 | Port çakışması / UFW bypass | `ss -tlnp`, `docker port ` | `127.0.0.1`-bind standardına döndür (K-10) | + +### T-8 — Disk doluyor + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | Docker json-file logları | `du -sh /var/lib/docker/containers/*` | Rotasyon + budama, `docker system prune` (dikkatli) | +| 2 | journald şişmiş | `journalctl --disk-usage` | `SystemMaxUse` limiti + `journalctl --vacuum-size=` | +| 3 | Prometheus retention (merkez) | `df -h`, retention ayarı | 30–90 gün bandına çek (K-07) | + +### T-9 — Monitoring'de cihaz gri/kayıp + +| # | Neden | Tanı | Çözüm | +|---|---|---|---| +| 1 | Node Exporter down | `systemctl status node_exporter`, hedef scrape logu | Servisi başlat; textfile dizin izni | +| 2 | Uptime Push gelmiyor | Kuma "last seen" | Cihaz interneti + push job'ı (T-3'e dön) | +| 3 | Etiket yanlış (`BF-`) | Prometheus target etiketleri | Envanterle eşitle (02) | + +### T-10 — Grafik operatör arayüzü açılmıyor (`sudo bf` pencere açmıyor / hemen kapanıyor) + +| # | Neden (olasılık sırası) | Tanı | Çözüm | +|---|---|---|---| +| 1 | Ekran yok (SSH/başsız oturum) | Ekranda "Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil)" + yönlendirme; çıkış kodu `3` | `sudo bf --tui` ile aynı işlemleri terminal konsolunda yürüt; yerel ekranda pencereli kullanmak için oturum açık bir makinede `sudo bf` | +| 2 | `python3-tk` kurulu değil (minimal imaj) | "tkinter bulunamadı; masaüstü arayüzü başlatılamıyor" + paket ipucu; çıkış kodu `3` | Çevrimdışı sahada paket kurulmaz: paket offline depoda pinlidir (`manifests/base-packages.txt`) ve normal kurulumla gelir. Eksikse `sudo bf --tui` ile devam et ve merkeze bildir; kurulum sonu kapısı (`18-final-check`) bu durumda **WARN** yazar ve kurulumu düşürmez | +| 3 | `DISPLAY` var ama X/Wayland erişilemiyor (ssh -X yok, oturum kilitli) | "Pencere açılamadı; grafik oturumuna erişilemiyor" + teknik ayrıntı; çıkış kodu `3` | `sudo bf --tui`; yerel oturumda çalıştırıyorsan kilitli ekranı aç veya `ssh -X` yerine yerel konsolu kullan | +| 4 | Uygulama açıldı ama yazma işlemleri kapalı | Arayüzde "Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf" | Komutu `sudo` ile çalıştır; aynı işlem root olmadan çalıştırma katmanında da reddedilir | + +Yükseltme: pencere hiç açılmıyorsa ve `sudo bf --tui` de çalışmıyorsa (Python 3.8+ yok veya `bfos` paketi bulunamıyor) merkeze telefon aç; yedek bash menü `sudo admin/bf-menu` ana yol değildir, yalnız acil yedektir. + +### T-11 — "Yerel paket deposu bulunamadı" (kurulum paket adımlarına geçmiyor) + +| # | Neden (olasılık sırası) | Tanı | Çözüm | +|---|---|---|---| +| 1 | Depo cihazda hiç yok | Ekranda `HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md` + **aranan yollar** + `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.`; çıkış kodu `1`, sistem değişmez | Paket setini git ile tam olarak getir (paketler Git LFS ile gelir) ya da repo sorumlusunun bıraktığı kopyayı `/opt/blueforce/offline-repo` altına koy; kurulumu tekrar çalıştır | +| 2 | `packages/` dolu ama indeks (`built/`) yok | Aynı "depo yok" hatası: aday eksiksiz sayılmaz | Kurucu `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS` dosyalarının **hepsini** arar; yalnız `.deb` havuzu yetmez. Repo sorumlusu `build-index.sh` ile `built/` dizinini üretip commit eder | +| 3 | Depo bulundu ama bozuk/eksik | `OFFLINE BLOCKED: ` + Türkçe çıkış nedeni (ör. checksum doğrulaması başarısız, kilit biçimi bozuk, pinlenen paket depoda yok); çıkış kodu `1` | Sahada onarılmaz: repo sorumlusu seti `add-packages.sh` + `build-index.sh` ile yeniden üretir, güncel git tarafı çekilir ve komut tekrarlanır. Cihazda hiçbir değişiklik yapılmadı | +| 4 | `BF_OFFLINE_REPO` yanlış | `OFFLINE BLOCKED: BF_OFFLINE_REPO mutlak bir yerel dizin olmalıdır.` | Değişkeni kaldır (varsayılan arama sırası kullanılır) veya geçerli bir mutlak dizin ver | +| 5 | "--offline bayrağını vermedim" kuşkusu | — | Bayrak **zorunlu değil**: kurucu depoyu her durumda otomatik arar (sıra: `BF_OFFLINE_REPO` → `/provisioning/offline-repo/built` → `/opt/blueforce/offline-repo`) | + +Yükseltme: paket seti sahada üretilmez/onarılmaz. İki denemede de aynı hata varsa cihazda hata ayıklamayı bırak, repo sorumlusuna başvur; kurulum paket adımlarına geçmediği için cihaz yarım durumda **kalmaz** (fail-closed). + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Her T girdisindeki ilk tanı komutu LAB'da çalışır | Komut + örnek çıktı bu dosyada | LAB(2) | +| WG-kill → T-3 → L4 onarım tatbikatı | < hedef sürede tünel döner | P1(5) | +| Disk-doldur simülasyonu → T-8 | Alarm + temizlik çalışır | LAB(2) | +| `DISPLAY` yok + `python3-tk` yok senaryoları → T-10 | Her iki durumda Türkçe yönlendirme, çıkış kodu 3, `--tui` önerisi | LAB(2) | +| Depo dizini kaldırılmış cihazda kurulum → T-11 | Türkçe hata + aranan yollar + çıkış nedeni, exit 1, sistem değişmez | LAB(2) | +| Yalnız `packages/`, indeks yok → T-11/2 | Kurulum "depo yok" diyerek durur (fail-closed) | LAB(2) | + +## 11. Rollback + +Yanlış çözüm uygulandıysa 17-L3 (son değişikliği geri alma) işletilir; tanı komutlarının kendisi read-only'dir, rollback gerektirmez. + +## 12. Kontrol Listesi + +- [ ] Her girdide Yükseltme kriteri var. +- [ ] Komutların tamamı LAB 26.04.1 imajında denendi. +- [ ] Hiçbir girdide secret/şifre yazılmıyor. +- [ ] MEG'e özgü satırlar 13 ile çapraz linkli. +- [ ] T-10/T-11 çıkış kodları (3 / 1) ve hata metinleri gerçek çıktıyla doğrulandı. +- [ ] Arayüz yolu belirtilen her girdide "Arayüzden" + "Komutla (yedek)" satırı var. + +## 13. Açık Sorular + +- [ ] Kesin `bf-gui-*` birim adları + GNOME oturum satırı — LAB çıktısı (sahibi: Faz 3). +- [ ] MEG log hacmi ölçümü → T-8 eşikleri (sahibi: 12-DOCKER yazarı). +- [ ] Turkcell CGNAT tanı notları — P1 verisi (sahibi: 08-WIREGUARD yazarı). +- [ ] `python3-tk` dışındaki grafik bağımlılıklarının da offline pinde gerekli olup olmadığı — LAB doğrulaması (sahibi: 27 + 33 yazarları). + +--- + +## Ek: Triyaj Akışı (hangi T girdisi?) + +```mermaid +flowchart TB + SORUN["Arıza bildirimi
    bf-status + systemctl --failed"] --> ARAC{"Sorun cihaz mı,
    operatör arayüzü mü?"} + ARAC -->|"Arayüz açılmıyor"| T10["T-10: DISPLAY / tkinter → sudo bf --tui"] + ARAC -->|"Kurulum paket adımına geçmiyor"| T11["T-11: yerel paket deposu"] + ARAC -->|Cihaz| ACILIR{"Cihaz açılıyor mu?"} + ACILIR -->|Hayır| T1["T-1: güç / BIOS / disk"] + ACILIR -->|Evet| BOOTOK{"Servisler kalkıyor mu?"} + BOOTOK -->|Hayır| T2["T-2: failed servis / disk dolu"] + BOOTOK -->|Evet| WG{"wg show handshake güncel mi?"} + WG -->|Hayır| T3["T-3: WireGuard + L4 yedek kanal"] + WG -->|Evet| SSH{"SSH oluyor mu?"} + SSH -->|Hayır| T4["T-4: sshd / anahtar / UFW"] + SSH -->|Evet| RDP{"RDP açılıyor mu?"} + RDP -->|Hayır| T5["T-5: bf-gui-on / xRDP"] + RDP -->|Evet| DERIN["T-6+: Docker / MEG / disk (T-7/T-8)"] +``` +
    + + +# 24 — Karar Günlüğü (Decision Log) + +> Kısa özet: Blueforce 700 cihaz Linux filosunun tüm nihai mimari kararları tek tabloda; her karar KARAR/GEREKÇE/ALTERNATİF/RİSK/MALİYET/LİSANS bloğu + resmi kaynak URL ile. Diğer numaralı dokümanların başvurduğu kilit dosyadır (K-01…K-24). +> +> - Dosya: `docs/24-DECISION-LOG.md` +> - İlgili kararlar: bu dosyanın kendisi kilit kaynaktır; `01-ARCHITECTURE.md` bu kararları diyagramlaştırır. +> - Durum: [x] Onaylı (Faz 2 kilidi; değişiklik bu dosyadan PR ile yapılır) +> - Kural: tüm kararlarda FREE sürümler baz alınır; Pro/Enterprise zorunlu mimariye girmez. +> - Doğrulama günü: 2026-09-15 (tüm URL'ler bu tarihte HTTP 200 ile çekildi). İkinci doğrulama turu: 2026-09-16 (Subiquity autoinstall referansı + GNOME/XFCE/xrdp/NoCloud URL'leri yeniden HTTP 200 ile doğrulandı); ayrıntı `research/` dosyalarında. +> - Numaralandırma kuralı: **append-only**. Mevcut K-01…K-19 silinmez/yeniden numaralanmaz (başka dokümanlar `#K-16`, `#K-17`, `#K-18`, `#K-19` başlıklarına link verir); yeni kararlar bir sonraki boş numaradan eklenir. Bu turda eklenen: K-20…K-24. + +--- + +## 1. Amaç + +27 izlenebilirlik sorusunun (bkz. §13 ve Ek B) her birinin hangi karara dayandığını tek yerden göstermek; kararsız veya varsayıma dayalı seçim bırakmamak. + +## 2. Kapsam + +- Kapsam içi: OS/GUI/boot, 4 erişim kanalı (RDP her-zaman-hazır ayrımı dahil), WireGuard, fleet, monitoring, docs, golden image, Docker, cihaz kimliği, update dalgaları, Field OS ISO/medya stratejisi, offline provisioning, enrollment/durum modeli, release + Field OS sürüm kimliği ve Windows geçişi — aşağıdaki K-01…K-24 kararları. +- Kapsam dışı: script kodları, VDS kurulum komutları, gerçek cihaz test sonuçları (Faz 3+ işi; ilgili dokümanlara havale edilir). + +## 3. Kararlar + +### K-01 — Baz işletim sistemi ve sürüm + +```text +KARAR: Saha standardı Ubuntu Server 26.04.1+ LTS'tir (GUI'siz minimal kurulum; GNOME sonradan eklenir). +GEREKÇE: 26.04.1 LTS resmi indirme sayfasında yayında (kod adı Resolute Raccoon); Server ISO'su varsayılan olarak GUI kurmaz, minimal zemin + ihtiyaca göre GUI standart yoldur. Noktasürüm (.1+) baz alınır çünkü ilk .0 dalgasındaki kurulumcu hataları genelde .1'de toplanır (LAB imaj testiyle kesinleşir). +ALTERNATİF: Ubuntu 24.04 LTS — 26.04 doğrulanamasaydı yedekti; doğrulandığı için yedekte bekler. Ubuntu Desktop 26.04 (6 GB RAM şartı) saha bütçesini zorladığı için elendi. +RİSK: 26.04.x noktasürümlerinde donanım sürücü farkı; azaltma: golden image LAB(2)'de her saha donanım profilinde test edilir. +MALİYET: Ücretsiz. +LİSANS: Ubuntu LTS ücretsiz (açık kaynak bileşenler; ESM kapsamına bel bağlanmaz) — https://releases.ubuntu.com/ (26.04.1, doğrulanma: 2026-09-15) + https://ubuntu.com/download/desktop (sistem gereksinimi, doğrulanma: 2026-09-15). +``` + +### K-02 — Masaüstü ortamı (GNOME) + +```text +KARAR: Saha masaüstü ortamı GNOME'dur (Ubuntu Desktop standardı); XFCE elendi. +GEREKÇE: Kullanıcı kararı + Ubuntu Desktop standardı: tanıdık modern masaüstü, teknisyen akışıyla birebir uyum. +ALTERNATİF: XFCE — hafif ve düşük kaynak tüketimine rağmen kullanıcı kararıyla elendi; ancak K-23 uyarınca LAB A/B ölçümü için yedekte tutulur (ölçüm sonucu bu kararı revize edebilir; saha standardı ölçüm bitene kadar GNOME kalır). +RİSK: xRDP+GNOME kombinasyonu ek ayar isteyebilir (uyarı: GNOME oturumu RDP'de ek yapılandırma gerektirebilir); azaltma: 13-MEG-LINUX-ACCEPTANCE testi GNOME üzerinde koşar, `bf-gui-*` LAB'da 26.04.1 imajında doğrulanmadan dondurulmaz. +MALİYET: Ücretsiz. +LİSANS: GNOME (GPL/LGPL bileşenler), ücretsiz — https://www.gnome.org/ (doğrulanma: 2026-09-15; yeniden doğrulama: 2026-09-16, HTTP 200). +``` + +> **Güncelleme (2026-09-16):** K-02 geçerli kalır; yalnız **K-23** ile ölçüme bağlanır. Saha standardı GNOME'dur; XFCE saha standardı değildir, LAB A/B ölçüm adayıdır. İki karar çelişmez: baseline = GNOME, revizyon kapısı = LAB verisi. + +### K-03 — Boot davranışı ve GUI aç/kapa + +```text +KARAR: Cihazlar terminale (multi-user) boot eder; grafik katman `bf-gui-on` / `bf-gui-off` ile systemd üzerinden açılıp kapatılır. +GEREKÇE: xRDP mimarisi oturum yöneticisi (sesman) + systemd servis birimleri (`xrdp`, `xrdp-sesman`) üzerine kuruludur; GUI, display-manager + xRDP servisleri üzerinden yönetilebilir bir katman olarak modellenir. Varsayılan kapalı GUI = düşük RAM, düşük saldırı yüzeyi, öngörülebilir boot. +ALTERNATİF: Her zaman grafik boot — kaynak israfı ve 700 cihazda gereksiz hata yüzeyi nedeniyle elendi. +RİSK: Kesin birim adları ve GNOME oturum başlatma satırı 26.04.1'e göre değişebilir; azaltma: LAB'da 26.04.1 imajında doğrulanmadan `bf-gui-*` dondurulmaz. +MALİYET: Ücretsiz. +LİSANS: xRDP Apache-2.0, ücretsiz — https://github.com/neutrinolabs/xrdp (v0.10.6.1, 2026-07-07; doğrulanma: 2026-09-15). +``` + +> **Güncelleme (2026-09-16):** `bf-gui-on` / `bf-gui-off` yalnız **yerel fiziksel** grafik katmanı (display-manager + default target) yönetir; `xrdp`/`xrdp-sesman` her zaman enable/active kalır ve RDP bu anahtarlara bağlı değildir — ayrıntı ve kanıt: **K-22**. + +### K-04 — Uzaktan erişim kanalları (4 kanal) + +```text +KARAR: Dört erişim kanalı: (1) SSH-over-WireGuard (yönetim/otomasyon), (2) xRDP + GNOME (grafik bakım), (3) RustDesk OSS self-hosted hbbs/hbbr (birincil grafik uzak erişim, WireGuard-bağımsız), (4) MeshCentral self-hosted (ikincil yönetim: terminal/dosya/envanter, WireGuard-bağımsız). AnyDesk mimariden ÇIKARILDI. +GEREKÇE: RustDesk OSS sınırsız istemci, kendi ID+röle altyapısı, E2E şifreli oturum, dosya transferi ve katılımsız erişimi ücretsiz verir; istemcide VDS genel adresi kullanıldığında WireGuard çökse bile kanal ayakta kalır. MeshCentral Apache-2.0 ile ikinci bağımsız düzlemi sağlar. AnyDesk ücretsiz sürümü yalnızca kişisel kullanımı kapsar; 700 kurumsal cihaz ticari kullanımdır ve lisanssız kullanım ihlal olur (en az Advanced planı gerekirdi). +ALTERNATİF: AnyDesk (lisans maliyeti + kapalı kaynak + self-hosted yalnızca en üst planda → elendi; yalnızca müşteri sahasında zaten lisanslıysa opsiyonel installer modülü). Tailscale/ZeroTier (freemium, merkezi kimlik → elendi). +RİSK: İki VDS-bağımlı kanalın tek ortak noktası VDS + genel internet; azaltma: hbbs/hbbr `--net=host` + health monitörü (Uptime Kuma) + yedek VDS planı 17-RECOVERY'de. +MALİYET: Ücretsiz (kendi VDS'i üzerinde; VDS kira bedeli hariç — altyapı maliyeti, lisans değil). +LİSANS: RustDesk istemci+sunucu AGPL-3.0 (1.4.9 / 1.1.16) — https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ + https://rustdesk.com/docs/en/self-host/client-deployment/ (doğrulanma: 2026-09-15); MeshCentral Apache-2.0 (1.2.5) — https://github.com/Ylianst/MeshCentral (doğrulanma: 2026-09-15); AnyDesk hükmü — https://support.anydesk.com/docs/anydesk-licenses.md (doğrulanma: 2026-09-15) + https://anydesk.com/en/pricing. +``` + +### K-05 — WireGuard modeli + +```text +KARAR: Hub-spoke WireGuard: merkez sunucu hub, her saha cihazı spoke (peer adı = `bf-<8hane>`); istemcide `PersistentKeepalive = 25` + `wg-quick@wg0` systemd enable; RDP/SSH dış dünyaya kapalı, yalnızca WireGuard arkasında. +GEREKÇE: Resmi QuickStart NAT arkasındaki eş için 25 sn keepalive'i "geniş güvenlik-duvarı yelpazesiyle çalışan makul aralık" olarak verir; `wg-quick@.service` Ubuntu paketinden gelir, enable = açılışta otomatik VPN. Elektrik kesintisi sonrası cihaz açılınca VPN kendiliğinden gelir. +ALTERNATİF: Keepalive kapalı / agresif 10 sn — kapalı NAT eşlemesini düşürür, agresif değer saha verisi olmadan yazılmaz; PİLOT-1 kopma sayacına göre ayarlanır. +RİSK: Turkcell CGNAT davranışı resmi kaynaktan doğrulanamaz (operatör bilgisi); azaltma: PİLOT-1'de 7/24 kopma sayacı, aralık saha verisiyle ayarlanır. +MALİYET: Ücretsiz. +LİSANS: WireGuard OSS (Ubuntu paketi `wireguard-tools 1.0.20250521-1ubuntu1`) — https://www.wireguard.com/quickstart/ + https://packages.ubuntu.com/resolute/wireguard-tools (doğrulanma: 2026-09-15). +``` + +### K-06 — Filo yönetimi + +```text +KARAR: Birincil filo otomasyonu Ansible CLI (SSH, agent'sız); operatör arayüzü Semaphore UI Community (self-hosted, MIT). Hiçbir playbook Pro/Enterprise özelliğine bağlanmaz. +GEREKÇE: En düşük hareketli parça (SSH + YAML + tek Go binary); 700 cihazda ek agent/master/K8s maliyeti yok. Community ücretsizliği resmi fiyat sayfasıyla kanıtlı ("$0, free forever"); Pro en fazla 500 managed node desteklediği için 700 cihazda ücretli yol zaten kapalı. +ALTERNATİF: AWX (K8s yükü + release'ler refactoring nedeniyle duraklatıldı → elendi); Salt (minion agent + master PKI → elendi); Rudder Community (relay/Enterprise modülleri + öğrenme eğrisi → elendi); MeshCentral (erişim aracı, filo otomasyonu değil → bu rolde elendi). +RİSK: Semaphore tek nokta arızası → Ansible CLI bağımsız çalışır (UI çökse filo durmaz). Community'de OIDC/2FA/Vault yok → Semaphore yalnızca WireGuard arkasında, erişim VPN + SSH anahtarı ile; gizliler yerleşik şifreli Key Store'da. +MALİYET: Ücretsiz (kendi VDS'i üzerinde). +LİSANS: Ansible GPL-3.0 — https://github.com/ansible/ansible; Semaphore Community MIT — https://github.com/semaphoreui/semaphore + https://semaphoreui.com/pricing (doğrulanma: 2026-09-15). +``` + +### K-07 — Monitoring + +```text +KARAR: Birincil Prometheus + Node Exporter + Grafana OSS (17 metriğin tamamı); tamamlayıcı Uptime Kuma (saha-teknisyeni dostu UP/DOWN panosu + Push "last seen" + bildirimler). Netdata elendi. +GEREKÇE: 17 metriğin tamamı yalnızca Prometheus yığınında ücretsiz ve kotasız toplanır (WireGuard handshake, Docker, MEG sağlığı textfile collector ile). Netdata Cloud Free 5 node kotası 700 cihazda ücrete düşer. Uptime Kuma metrik vermez ama en basit çevrimdışı alarmını verir (20 sn aralık, 90+ bildirim servisi, tek konteyner). +ALTERNATİF: Yalnızca Uptime Kuma (metrik körlüğü → elendi); Netdata self-hosted Parent (merkezi tasarım yükü + kota riski → elendi). +RİSK: 700 node'da saklama/kardinalite; azaltma: scrape 60 sn, retention 30–90 gün, etiket şeması `BF-` standardında, federasyon/fazlı rollout. +MALİYET: Ücretsiz. +LİSANS: Prometheus/Node Exporter Apache-2.0 — https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/; Grafana OSS AGPL-3.0 (değişikliksiz self-host) — https://grafana.com/oss/; Uptime Kuma MIT — https://github.com/louislam/uptime-kuma (doğrulanma: 2026-09-15). +``` + +### K-08 — Doküman platformu + +```text +KARAR: Docusaurus (`docs-site/` iskeleti; `docs/*.md` tek kaynak, site derlemesi CI'da). +GEREKÇE: "AI-güncelleme" kriterini yalnızca Git-yerleşik Markdown çözer (ajan `.md`'yi doğrudan yazar, review PR'dan geçer). Wiki.js'nin DB+servis yükü sadelik kuralını bozar; TriliumNext tek-kullanıcı bilgi tabanıdır. MkDocs'a karşı Docusaurus: yerleşik sürümleme + yerleşik i18n + MDX; derleme maliyeti eşdeğerdir. +ALTERNATİF: MkDocs + Material (eşdeğer sadelikte güçlü ikinci; Docusaurus derleme hattı sorun çıkarırsa geçiş maliyeti düşük çünkü kaynak yine düz Markdown — yedekte tutulur). Wiki.js (DB yükü → elendi). TriliumNext (ekip akışı yok → elendi). +RİSK: Node derleme hattı bozulabilir; azaltma: kilitli bağımlılıklar + CI derleme testi; derleme bozulsa bile `docs/*.md` ham haliyle okunur. +MALİYET: Ücretsiz. +LİSANS: Docusaurus MIT — https://github.com/facebook/docusaurus + https://docusaurus.io/docs/markdown-features/diagrams (doğrulanma: 2026-09-15). +``` + +### K-09 — Golden image yöntemi + +```text +KARAR: Golden image = Ubuntu Server 26.04.1+ minimal + `unattended-upgrades` kapalı + `blueforce-install.sh` tek kurucu (bayi no → READY); imaj, preseed/autoinstall dosyasıyla üretilir, cihaz-spesifik kimlik (`bf-`) imajda DEĞİL ilk açılışta verilir. +GEREKÇE: Donanım heterojenliği bilinmediği için bit-kopya klon (Clonezilla) tek imajda kırılgandır; autoinstall + idempotent kurulum scripti her donanım profilinde aynı zemini kurar, kimlik ilk boot'ta enjekte edilir. Hedef akış: USB → Ubuntu → tek script → bayi no → READY. +ALTERNATİF: Clonezilla bit-kopya (hızlı ama donanım-fragil → yedek yöntem olarak tutulur); Packer/custom ISO (ek derleme hattı yükü → elendi); cloud-init (autoinstall'a göre saha-USB akışına daha az uygun → elendi). +RİSK: İlk imaj heterojen donanımda sürücü eksiltebilir; azaltma: önce `bf-hardware-inventory.sh` taraması (18-ROLLOUT), LAB'da her profilde test. +MALİYET: Ücretsiz. +LİSANS: Ubuntu autoinstall/subiquity (ücretsiz, Ubuntu lisans seti içinde) — https://releases.ubuntu.com/26.04/ (doğrulanma: 2026-09-15). NOT: Faz 1'de resmi autoinstall sözdizimi ayrıca doğrulanmadı; kesin direktifler 04-GOLDEN-IMAGE'da LAB çıktısıyla yazılır. +``` + +### K-15 — Blueforce Field OS kurulum medyası + +```text +KARAR: Blueforce Field OS = Ubuntu Server 26.04.1+ LTS üzerinde GNOME katmanı; V1 kurulum medyası resmi upstream ISO + ayrı NoCloud seed USB'dir. Autoinstall ve custom Field ISO tamamlayıcıdır; custom ISO yalnız LAB build artefact'ı olarak ele alınır. +GEREKÇE: Upstream ISO + seed, cihaz-spesifik veriyi medyadan ayırır ve remaster boot riskini V1'den uzak tutar. Custom ISO dağıtım kolaylığı sağlayabilir ancak UEFI/Legacy/Secure Boot davranışı kanıtlanmadan standart değildir. +ALTERNATİF: Yalnız custom remaster ISO — doğrulanmamış boot zinciri nedeniyle V1 için elendi; custom build gelecekte tamamlayıcıdır. +RİSK: 26.04 autoinstall veya remaster davranışı değişir; azaltma: her release'te checksum + LAB matrisi. +MALİYET: Ücretsiz. +LİSANS: Ubuntu Server — https://ubuntu.com/download/server ; Subiquity — https://canonical-subiquity.readthedocs-hosted.com/en/latest/ ; NoCloud — https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html (26.04 kesin davranışı LAB gerektirir). +``` + +### K-16 — Assisted offline provisioning durumu + +```text +KARAR: İnternetsiz assisted provisioning imzalı/sürümlü ISO, seed ve offline APT snapshot ile yapılır; başarılı yerel sonuç yalnız PROVISIONED_OFFLINE'dır. +GEREKÇE: Saha bağlantısı yokken kurulum tamamlanabilir, ancak merkezi kimlik/kanal doğrulaması olmadan READY iddiası güvenli değildir. +ALTERNATİF: İnternet gelene kadar kurmamak — saha blokajı nedeniyle elendi; rastgele .deb taşıma — bağımlılık/sürüm belirsizliği nedeniyle elendi. +RİSK: Eski snapshot veya medya secret taşıması; azaltma: manifest/checksum, medya secret taraması, sürüm son kullanma tarihi. +MALİYET: Ücretsiz. +LİSANS: APT — https://manpages.ubuntu.com/manpages/noble/en/man8/apt.8.html ; dpkg — https://manpages.ubuntu.com/manpages/noble/en/man1/dpkg.1.html (26.04 offline akışı LAB gerektirir). +``` + +### K-17 — Cihaz enrollment ve READY kapısı + +```text +KARAR: PROVISIONED_OFFLINE cihaz, BF-'ya bağlı kısa ömürlü tek-kullanımlık token ile ENROLLED olur; yalnız WireGuard, merkezi erişim ve monitoring kanalları doğrulanınca READY olur. +GEREKÇE: Token cihaz kimliğini bağlar, fakat bağlantı/health kanıtı değildir. Ayrı durumlar yanlış teslimi ve ortak bootstrap secret riskini önler. +ALTERNATİF: Kalıcı ortak token — sızıntı blast-radius'u filo geneli olduğu için elendi; manuel kayıt — denetim zayıf olduğu için elendi. +RİSK: Token çalınması/yanlış kullanım; azaltma: TTL, atomik tek kullanım, cihaz bağlama, iptal ve audit kaydı. +MALİYET: Ücretsiz. +LİSANS: OpenSSH — https://www.openssh.com/ ; WireGuard — https://www.wireguard.com/ ; token API kurum içi uygulama ve LAB doğrulamasıdır. +``` + +### K-18 — Field OS release ve rollback yönetimi + +```text +KARAR: Field OS release'i immutable manifestli bir artefact setidir: upstream ISO referansı, seed, offline APT snapshot, installer/Ansible commit'i, uygulama sürümleri ve checksum'lar birlikte sürümlenir; rollback önceki onaylı release'e döner. +GEREKÇE: OS sürümü tek başına davranışı açıklamaz; release manifesti tekrarlanabilir kurulum, denetim ve gerçek rollback hedefi sağlar. +ALTERNATİF: latest/yalnız Git branch — artefact bileşimi ve rollback hedefi belirsiz olduğu için elendi. +RİSK: Eksik artefact veya test edilmemiş rollback; azaltma: manifest kapısı, checksum/imza ve LAB rollback kanıtı. +MALİYET: Ücretsiz. +LİSANS: Git — https://git-scm.com/doc ; Ubuntu releases — https://releases.ubuntu.com/ ; Docker image sürümleme — https://docs.docker.com/reference/cli/docker/image/pull/. +``` + +### K-19 — Windows'tan Linux'e geçiş + +```text +KARAR: Her Windows saha cihazında önce envanter + hash doğrulanmış geri dönüş imajı alınır, sonra temiz Field OS kurulumu ve kabul yapılır; V1'de yerinde dönüşüm ve dual-boot yoktur. +GEREKÇE: Temiz kurulum drift'i azaltır; geri dönüş imajı uygulama/periferik kabulü başarısız olduğunda kanıtlı çıkış verir. +ALTERNATİF: Yerinde dönüşüm veya dual-boot — disk/bootloader karmaşıklığı ve destek yükü nedeniyle elendi. +RİSK: Gizli iş/veri bağımlılığı; azaltma: iş sahibi onayı, image restore provası ve 13-MEG kabul kapısı. +MALİYET: Ücretsiz araçlar kullanılabilir; image depolama altyapı maliyetidir. +LİSANS: Ubuntu — https://ubuntu.com/download/server ; Clonezilla — https://clonezilla.org/ ; Windows lisans/uygulama durumu kurum tarafından doğrulanır. +``` + +> **2026-09-16 turu — yeni kararlar (K-20…K-24).** Aşağıdaki bloklar bu turda eklendi. Numaralar append-only'dir: K-16 (offline provisioning durumu), K-17 (enrollment), K-18 (release), K-19 (Windows geçişi) **silinmedi/yeniden numaralanmadı**; `docs/27`, `docs/29`, `docs/30` ve `docs/28` bu başlıklara link verir. İstenen konularla eşleşme: "medya stratejisi güncellemesi" → K-20; "durum modeli" → K-21 (K-16/K-17 ile birlikte okunur); "RDP her zaman hazır" → K-22; "GNOME vs XFCE A/B ölçümü" → K-23; "Field OS sürüm yönetimi" → K-24 (K-18 ile birlikte okunur). + +### K-20 — Medya stratejisi: autoinstall kurulum motoru, Blueforce Field OS ISO paketleme yöntemidir + +```text +KARAR: Autoinstall kurulum MOTORUDUR; Blueforce Field OS ISO ise PAKETLEME/DAĞITIM yöntemidir. İkisi rakip değildir, birlikte kullanılır: Field OS ISO içinde autoinstall + offline APT repo + firstboot bulunur. Güvenlik için autoinstall'da `interactive-sections: [storage]` KORUNUR — otomatik disk silme YOKTUR (operatör disk onayı verir). Teslim sırası: F2B'de assisted tek-USB Field OS ISO üretilir; upstream ISO + NoCloud seed USB geri dönüş yoludur. K-15 geçersiz kılınmaz, yedek yol olarak korunur. +GEREKÇE: Subiquity resmi referansı: autoinstall yapılandırması `/autoinstall.yaml` yolunda okunur ("irrespective of how it was provided") → ISO köküne konan autoinstall dosyası desteklenir. `interactive-sections` resmi olarak desteklenir ("A list of configuration keys to still show in the user interface"). `storage` bölümü resmi olarak "can be interactive: true" işaretlidir ve varsayılanı tek-disk sistemde lvm layout'tur; yani storage interactive bırakılmazsa kurulum en büyük diski kendiliğinden bölümler. Bu yüzden tek-USB deneyimi ile "otomatik disk silme yok" güvenlik şartı AYNI ANDA sağlanır: ISO autoinstall'ı başlatır, teknisyen yalnız disk adımını onaylar. Ayrıca `apt.fallback` varsayılanı `offline-install` ("revert to an offline installation") olduğu için internetsiz kurulum tasarım gereği çalışır. +ALTERNATİF: Yalnız upstream ISO + NoCloud seed USB (tek medya deneyimi yok; prompt hedefi karşılanmaz → V1'in tek yolu olmaktan çıkar, yedek/geri dönüş yolu olarak kalır); Yalnız custom remaster ISO (UEFI/Legacy/Secure Boot boot zinciri LAB'da kanıtlanmadan sahaya çıkar → reddedildi); otomatik disk wipe'lı unattended (veri kaybı riski → yasak, F6 kapsamı). +RİSK: Remaster boot zinciri (UEFI/Legacy/Secure Boot) LAB'da kanıtlanmazsa saha USB'si açılmayabilir; azaltma: F2B çıkış kriteri = tek USB assisted kurulumun iki LAB cihazında kanıtı; kanıt yoksa F3 başlamaz ve upstream ISO + seed yolu sıcak tutulur. +MALİYET: Ücretsiz. +LİSANS: Subiquity autoinstall — https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html (interactive-sections; `/autoinstall.yaml` yolu; `apt.fallback` default `offline-install`; `storage` "can be interactive: true" — doğrulama: 2026-09-16, HTTP 200); cloud-init NoCloud — https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html (doğrulama: 2026-09-16); Ubuntu Server ISO — https://ubuntu.com/download/server. +``` + +### K-21 — Cihaz durum modeli (tek kaynak): PROVISIONED_OFFLINE → ENROLLED → READY + +```text +KARAR: Cihaz yaşam döngüsü ÜÇ durumdur ve tek kaynağı `/var/lib/blueforce/state.json` + `bf-enrollment-status` çıktısıdır: PROVISIONED_OFFLINE (offline kurulum bitti, merkez doğrulaması yok) → ENROLLED (tek kullanımlık token tüketildi, WireGuard atomik kuruldu) → READY (merkezi monitoring/remote/management kanıtı + yerel WG/xRDP/RustDesk kontrolleri). READY TEK DURUM DEĞİLDİR: "işletim sistemi kuruldu" READY değildir, "token alındı" READY değildir. K-16 ve K-17 bu modelin parçalarıdır; K-21 ikisini tek sözleşmede sabitler. +GEREKÇE: Kod ve testler aynı sözleşmeyi uygular: `blueforce-install.sh --offline` başarıyla biterse state.json'a `phase=PROVISIONED_OFFLINE`, `enrollment_status=PENDING`, `fleet_status=PENDING` yazar; `bf-enrollment-status` yalnız bu üç durumu geçerli sayar (aksi halde `INVALID`/`PENDING` + exit≠0); `bf-enroll` yalnız PROVISIONED_OFFLINE/ENROLLED fazından enrollment kabul eder; `--offline` olmadan bu damga yazılmaz. `bf-check-ready` kalıcı READY değerini okumaz, güncel handshake ve merkez kanıtını bağımsız denetler; kanıt eksikse fail-closed kalır. +ALTERNATİF: İkili model (kuruldu/kurulmadı) — "merkezce güvenildi" farkını görünmez kılar ve yanlış teslim üretir → elendi; READY'yi installer çıkış kodu yapmak — ağ/merkez kanıtı olmadan READY iddiası doğurur → reddedildi. +RİSK: Merkez kanıt alanları (`central_verification`) `pending` kalırsa cihaz ENROLLED'da bekler ve teslim gecikir; azaltma: enrollment yanıt sözleşmesi zorunlu alanları (29), fail-closed READY kapısı, 24/72 saat gözlem penceresi (IMPLEMENTATION-REPORT §9). +MALİYET: Ücretsiz. +LİSANS: systemd/journald (LGPL bileşenler) — https://www.freedesktop.org/software/systemd/man/latest/systemctl.html ; token API kurum içi uygulamadır (27/29). +``` + +### K-22 — RDP her zaman hazır; `bf-gui-on` / `bf-gui-off` yalnız yerel fiziksel GUI'yi kontrol eder + +```text +KARAR: `xrdp` ve `xrdp-sesman` multi-user seviyesinde HER ZAMAN enable ve active kalır; RDP kanalı `bf-gui-on` komutuna bağlı DEĞİLDİR. `bf-gui-on` / `bf-gui-off` yalnız YEREL FİZİKSEL grafik katmanını (display-manager: gdm3/gdm/sddm/lightdm + default target) kontrol eder. `bf-gui-off` xRDP servislerini asla durdurmaz veya disable etmez. Başka bir deyişle: GUI kapalı ≠ RDP kapalı. +GEREKÇE: Depodaki kod bu ayrımı uygular: `08-rdp` modülü xrdp+xrdp-sesman'ın enable VE active olmasını, default target'ın multi-user kalmasını doğrular; `bf-gui-off` yalnız display-manager'ı durdurur ve "xRDP stays enabled and active so remote recovery is available" sözleşmesini taşır; `tests/check-specs.sh` bf-gui-off içinde `systemctl stop/disable xrdp*` görürse testi bilinçli olarak düşürür ve 08-rdp check'i active xrdp ister; `16-POWER-LOSS` boot zinciri de xrdp'in her zaman ready olduğunu varsayar. Bu ayrım 700 cihazda yerel GUI kapalıyken de uzaktan kurtarma kanalını korur. +ALTERNATİF: RDP'yi `bf-gui-on`'a bağlamak — GUI kapalı saha cihazında uzaktan grafik kurtarma kaybolur (sahaya gitme oranı artar) → reddedildi; her zaman grafik boot — kaynak israfı ve geniş hata yüzeyi (K-03) → elendi. +RİSK: GNOME oturumu RDP üzerinden ek yapılandırma isteyebilir; azaltma: 13-MEG kabulü GNOME üzerinde koşar; LAB'da 26.04.1 imajında xRDP+GNOME ve bf-gui-* doğrulanmadan dondurulmaz. +MALİYET: Ücretsiz. +LİSANS: xRDP Apache-2.0 (v0.10.6.1) — https://github.com/neutrinolabs/xrdp (doğrulama: 2026-09-16, HTTP 200); GNOME GPL/LGPL — https://www.gnome.org/ (doğrulama: 2026-09-16, HTTP 200). +``` + +### K-23 — GNOME saha standardı kalır; LAB'da GNOME vs XFCE A/B ölçümü yapılır + +```text +KARAR: Saha masaüstü ortamı GNOME'dur (K-02 yürürlükte kalır, geçersiz kılınmaz). Buna ek olarak LAB'da GNOME vs XFCE A/B ölçümü yapılacak ve karar ölçüm sonucuna bağlanacaktır. Ölçüm seti sabittir: (1) RAM tüketimi, (2) CPU tüketimi, (3) boot süresi, (4) RDP güvenilirliği, (5) RustDesk'in reboot sonrası davranışı, (6) login screen erişimi, (7) dummy display davranışı, (8) 24 saat ve 72 saat stabilite. RustDesk headless ZORUNLU şartı her iki kolda da aynen korunur. Ölçüm sonucu K-02'yi revize edebilir; veri gelmeden revizyon yapılmaz. +GEREKÇE: GNOME kullanıcı kararıdır; ancak saha koşulları (RDP oturumu + headless RustDesk + düşük RAM'li mini PC'ler) ölçülmeden "tek doğru masaüstü" iddiası kanıtsız kalır. A/B ölçümü kararı kanıta bağlar: baseline GNOME olarak sabit kalır, XFCE yalnız ölçüm adayıdır. Bu yazım K-02 ile çelişmez — K-02 sahada geçerli olan karardır, K-23 onu ölçüm kapısına bağlayan revizyon mekanizmasıdır. +ALTERNATİF: XFCE'yi doğrudan saha standardı yapmak — kullanıcı kararı dışı ve kanıtsız → elendi; XFCE'yi tamamen kapatmak — PİLOT'ta kanıtsız revizyon talebi doğurur ve ölçüm şansı kaybolur → elendi. +RİSK: A/B ölçümü LAB zamanı ve iki masaüstü bakım yükü getirir; azaltma: ölçüm seti ve süreleri (24/72 saat) sabittir, sonuç tek tabloda tutulur ve LAB release kaydına bağlanır; XFCE kolu saha medyasına girmez. +MALİYET: Ücretsiz. +LİSANS: GNOME GPL/LGPL — https://www.gnome.org/ ; XFCE GPL — https://xfce.org/ (her ikisi de doğrulama: 2026-09-16, HTTP 200; XFCE yalnız LAB ölçüm adayıdır, saha standardı değildir). +``` + +### K-24 — Field OS sürüm kimliği: `/etc/blueforce-release` + `bf-release` + +```text +KARAR: Cihazın Field OS sürüm kimliği tek komutla okunur: `bf-release` (kaynak sırası: `BF_RELEASE_MANIFEST` → `/etc/blueforce/release-manifest.yaml` → legacy `/etc/blueforce-release` → repo içi `provisioning/release/manifest.yaml`). Manifest `status: skeleton` ise komut sürümü **UNAPPROVED_SKELETON** olarak raporlar ve sıfırdan farklı döner; skeleton release DAĞITILABİLİR release sayılmaz. Sürüm kimliği, K-18'deki immutable release manifestiyle (ISO referansı, seed, offline APT snapshot, installer/Ansible commit'i, checksum'lar) eşleşmek zorundadır. `/etc/blueforce-release` nonsecret bir cihaz-üstü kimlik dosyasıdır: token, private key veya parola içermez. +GEREKÇE: Sahada "hangi Field OS sürümü çalışıyor?" sorusu secret sızdırmadan, tek komutla ve denetlenebilir biçimde yanıtlanmalıdır. Depodaki davranış bunu uygular: `17-healthcheck` kurulumda `provisioning/release/manifest.yaml` dosyasını `/etc/blueforce/release-manifest.yaml` olarak kurar; `bf-release` YAML ve legacy KEY=VALUE biçimini okuyabilir, okunamayan/`skeleton` manifestte exit≠0 verir ve `tests/check-specs.sh` bu ret davranışını (`UNAPPROVED_SKELETON`) zorunlu tutar. Böylece sahte/iskelet sürüm kimliği cihazda "release var" izlenimi üretemez. +ALTERNATİF: Yalnız `git tag` — sahada checkout yoktur, cihaz kendi sürümünü okuyamaz → elendi; yalnız `lsb_release`/`os-release` — yalnız Ubuntu tabanını gösterir, Field OS katmanını ve release bileşimini göstermez → elendi. +RİSK: AÇIK KONU: `/etc/blueforce-release` bugün yalnız OKUMA yoludur (legacy biçim için uyumluluk var) ve onu yazan bir release pipeline adımı depoda yok; bu dosya yazılmazsa cihaz kimliği `/etc/blueforce/release-manifest.yaml`'a (kurulum anındaki iskelet manifest) düşer ve `bf-release` UNAPPROVED_SKELETON döner. Azaltma: gerçek release üretildiğinde manifestin status'u `released` olacak ve yazma adımı 30-FIELD-OS-RELEASE-MANAGEMENT sahibi tarafından eklenmelidir. +MALİYET: Ücretsiz. +LİSANS: Git — https://git-scm.com/doc ; Ubuntu releases — https://releases.ubuntu.com/ ; Docker image sürümleme — https://docs.docker.com/reference/cli/docker/image/pull/ . +``` + +### K-10 — Docker restart politikası ve imaj disiplini + +```text +KARAR: Tüm saha konteynerlerinde restart politikası `unless-stopped`; `latest` etiketi yasak (sabit tag zorunlu); Watchtower yok; log rotasyonu (`max-size`/`max-file`) daemon.json'da zorunlu; yayımlanan portlar `127.0.0.1`'e bağlanır (UFW bypass'a karşı). +GEREKÇE: `unless-stopped`, `always`'in aksine teknisyenin bakım için durdurduğu konteyneri reboot sonrası sürpriz kalkıştan korur; elektrik kesintisi kurtarması aynen çalışır (kesinti "manuel stop" sayılmaz). Hareketli `latest` etiketi 700 cihazda determinizmi bozar ("onaysız update yasak" politikası). Watchtower hem politikayı ihlal eder (otomatik updater) hem upstream'de arşivlenmiştir. Docker varsayılan `json-file` logu rotasyon yapmaz → dolan disk = kilitlenen cihaz. Docker yayımlanan portlarda UFW'yi baypas eder (resmi belgeli) → localhost-bind + WireGuard üzerinden erişim. +ALTERNATİF: `always` (öngörülemez bakım davranışı → elendi); `iptables:false` (resmi doküman "çoğu kullanıcı için uygun değil" diye uyarır → varsayılan çözüm değil); digest pinleme (`@sha256`) PİLOT-2'de değerlendirilecek ek sıkılık adımı. +RİSK: `max-size/max-file` değerleri MEG log hacmine göre ayarlanmazsa ya disk dolar ya log kaybolur; azaltma: PİLOT'ta hacim ölçülür, 12-DOCKER'da sabitlenir. +MALİYET: Ücretsiz (Docker CE). +LİSANS: Docker CE ücretsiz (Business/Scout mimaride yok) — https://docs.docker.com/engine/containers/start-containers-automatically/ + https://docs.docker.com/engine/logging/configure/ + https://docs.docker.com/engine/network/packet-filtering-firewalls/ (doğrulanma: 2026-09-15); Watchtower arşiv durumu — https://github.com/containrrr/watchtower (doğrulanma: 2026-09-15). +``` + +### K-11 — Otomatik güncelleme yasağı + +```text +KARAR: Golden image'da `unattended-upgrades` kapatılır (`/etc/apt/apt.conf.d/20auto-upgrades` değerleri `0` + `apt-daily*.timer` maskeleme); tüm güncellemeler LAB→PİLOT→WAVE→PROD onay zincirinden geçer (dalgalar: LAB(2)/P1(5)/P2(20)/W1(50)/W2(100)/PROD). +GEREKÇE: `unattended-upgrades` Ubuntu Server'da varsayılan kurulu ve etkindir, günde bir kez çalışır; kapatılmazsa 700 cihaz ilk açılışta güncellemeye kalkar ("onaysız update yasak" ilkesi delinir). Kaçan timer makine açılışında hemen tetiklenir (`Persistent=true` davranışı) — saha PC'leri sık kapanan makinelerdir. +ALTERNATİF: Otomatik security update'e izin verme — 700 cihazda eşzamanlı indirme + onaysız değişim riski nedeniyle elendi; security update'ler öncelik işaretli onaylı dalga ile çıkar. +RİSK: Kapatma adımı imajda atlanırsa filo kendiliğinden güncellenir; azaltma: `blueforce-install.sh` final-check + monitoring'de `Unattended-Upgrade` durumu metriği. +MALİYET: Ücretsiz. +LİSANS: Yok (işletim sistemi yapılandırması) — https://ubuntu.com/server/docs/how-to/software/automatic-updates/ + https://manpages.ubuntu.com/manpages/resolute/en/man8/unattended-upgrade.8.html (doğrulanma: 2026-09-15). +``` + +### K-12 — Cihaz kimliği standardı + +```text +KARAR: 8 haneli bayi no → Device ID `BF-` (büyük), hostname `bf-` (küçük); WireGuard peer adı, RustDesk etiketi, Ansible inventory adı, monitoring etiketi hepsi aynı ID'yi kullanır. Örnek: `BF-12010193` / `bf-12010193`. +GEREKÇE: Tek kimlik = 9 sistemde (DNS/hostname, WireGuard, RustDesk, MeshCentral, Ansible, Prometheus, log, envanter, runbook) join anahtarı; büyük/küçük ayrımı insan-makine karışıklığını önler (insan `BF-`, makine `bf-`). +ALTERNATİF: Rastgele UUID / MAC-tabanlı ad — saha teknisyeni için okunamaz, bayi eşleşmesi manuel olur → elendi. +RİSK: Bayi no değişirse kimlik çakışması; azaltma: 02-NAMING'de yeniden-no prosedürü + envanter benzersizlik kontrolü. +MALİYET: Ücretsiz. +LİSANS: Yok (isimlendirme standardı). +``` + +### K-13 — SSH kimlik doğrulama mimarisi + +```text +KARAR: `blueforce` bakım kullanıcısı + anahtar zorunlu (password SSH kapalı, root SSH kapalı); 700 cihaza tek private key YAYILMAZ — admin başına anahtar + cihazlarda `authorized_keys` merkezi dağıtımı (Ansible), uzun vadede SSH CA hedefi. +GEREKÇE: Tek private key'in sızıntı blast-radius'u 700 cihazdır; per-admin anahtar + merkezi dağıtım sızıntıyı tek anahtarın iptaline indirger. Servisler ayrı system user ile çalışır, sudo kontrollüdür. +ALTERNATİF: Tek paylaşılan private key (basit ama 700 cihazlık blast-radius → elendi); password auth (kaba-kuvvet yüzeyi → elendi). +RİSK: Anahtar dağıtım gecikmesi yeni cihazda erişimsizlik; azaltma: golden image'da bootstrap anahtarı + ilk Ansible run'ında rotasyon. +MALİYET: Ücretsiz. +LİSANS: OpenSSH (BSD-lisanslı), ücretsiz. +``` + +### K-14 — Log ve sağlık disiplini + +```text +KARAR: Birincil metrik/monitoring K-07; log tarafında journald + Docker `json-file` rotasyonlu + textfile `.prom` (WireGuard handshake, Docker, MEG) + `bf-status` / `bf-diagnostics` / `bf-support-bundle` (secret sızdırmaz) sözleşmeleri. +GEREKÇE: 700 dokunulmaz cihazda logsuz metrik kör, metriksiz log sağırdır; textfile collector özel metriklerin (WireGuard/MEG) standart Prometheus yoludur. Support-bundle secret dışlama kuralıyla güvenli uzaktan tanı sağlar. +ALTERNATİF: Harici log platformu (Loki/ELK) ilk fazda — ek servis yükü, sadelik kuralını bozar → Faz-sonrası hedef olarak 15-LOGGING'e not edilir. +RİSK: Log hacmi retention'ı şişirir; azaltma: PİLOT'ta hacim ölçümü + limitler 15-LOGGING'de. +MALİYET: Ücretsiz. +LİSANS: systemd-journald / Node Exporter textfile (Apache-2.0) — https://github.com/prometheus/node_exporter (doğrulanma: 2026-09-15). +``` + +--- + +## 4. Neden Bu Karar? + +Tüm kararlarda aynı üç filtre uygulandı: (1) %100 ücretsiz/self-hosted — resmi URL + sürüm + tarih olmadan lisans iddiası yazılmadı; (2) sadelik — Kubernetes, microservice, gereksiz agent/DB/cloud önerisi reddedildi (AWX'in K8s zorunluluğu, Salt master PKI, Wiki.js DB yükü, harici log platformu); (3) onaysız update yasağı — unattended-upgrades, `latest`, Watchtower aynı ilkeden elendi. 700 ölçeğinde her "küçük varsayılan" (günlük otomatik update, rotasyonsuz log, UFW bypass) filo-çapı arızaya dönüşür; kararlar bu çarpanı küçültür. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Ubuntu 24.04 LTS | Olgun donanım desteği | 26.04 doğrulandı, daha kısa destek penceresi | Yedek | +| XFCE | Hafif, düşük kaynak | Kullanıcı kararıyla saha standardı olmadı (GNOME baseline) | LAB A/B ölçüm adayı (K-23) | +| AnyDesk | Tanınmış, kolay | Ticari lisans zorunlu (700 cihaz), kapalı kaynak | Elendi | +| Tailscale/ZeroTier | Kolay mesh | Freemium, merkezi kimlik | Elendi | +| AWX | Güçlü UI | K8s zorunlu, release'ler duraklatıldı | Elendi | +| Salt / Rudder | Ölçeklenir | Agent+master/relay yükü, öğrenme eğrisi | Elendi | +| Netdata Cloud | Zengin agent | Free 5 node kotası, 700 cihaz ücretli | Elendi | +| Yalnızca Uptime Kuma | Çok kolay | Metrik körlüğü | Elendi | +| Wiki.js | Güçlü editör | DB+servis yükü, Git akışı dolaylı | Elendi | +| MkDocs + Material | Eşdeğer sade | Sürümleme/i18n eklentiyle | Yedek (güçlü ikinci) | +| TriliumNext | Hafif | Tek kullanıcı, ekip akışı yok | Elendi | +| Clonezilla bit-kopya | Hızlı klon | Donanım-fragil | Yedek yöntem | +| Docker `always` | Her koşulda ayakta | Bakım-stop'u reboot'ta deler | Elendi | +| Watchtower | Otomatik imaj | Politika ihlali + arşivlenmiş upstream | Elendi | +| Tek paylaşılan SSH key | Basit | 700 cihazlık blast-radius | Elendi | + +## 6. Avantajlar + +- 24 kararın tamamı ücretsiz katmanda kanıtlı; zorunlu mimaride lisans bedeli yok. +- Her kararın resmi kaynak URL'si + sürümü + doğrulama tarihi var; varsayıma dayalı karar yok (belirsizler LAB/PİLOT'a havale edildi). +- 4 erişim kanalından ikisi WireGuard-bağımsız; tek tünel arızası filoyu kör etmez. +- Tek-USB Field OS medyası (K-20) ile tek-medya deneyimi sağlanırken otomatik disk silme yasağı (interactive storage) korunur. + +## 7. Dezavantajlar + +- K-09 (golden image) Faz 1'de tam resmi-doğrulamalı değil; autoinstall sözdizimi LAB çıktısına bağımlı. +- Semaphore Community'de OIDC/2FA/Vault yokluğu operasyonel disiplinle (VPN-arkası + Key Store) kapatılıyor; bu disiplin bozulursa güvenlik açığı doğar. +- Prometheus 700 node işletme bilgisi ister; retention/kardinalite LAB'da ölçülmeden donanım siparişi verilmemeli. +- K-20 ile tek-USB Field OS ISO hedeflenir, fakat remaster boot zinciri LAB'da kanıtlanana kadar saha medyası upstream ISO + seed olarak kalır (ikili medya geçiş dönemi). +- K-24 açık konusu: `/etc/blueforce-release` dosyasını yazan release pipeline adımı henüz yok; cihaz sürüm kimliği iskelet manifest'e düşerse `bf-release` UNAPPROVED_SKELETON döner. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| `unattended-upgrades` imajda açık unutulur | Orta | Yüksek (filo kendiliğinden güncellenir) | install.sh final-check + monitoring metriği (K-11) | +| Docker UFW bypass ile MEG portu dışa açılır | Orta | Yüksek | localhost-bind standardı + 11-HARDENING denetimi (K-10) | +| Semaphore çöker, filo yönetimsiz kalır | Düşük | Orta | Ansible CLI bağımsız çalışır (K-06) | +| 26.04.x sürücü farkı heterojen donanımda | Orta | Orta | LAB'da profil başına imaj testi (K-01/K-09) | +| Tek VDS iki bağımsız kanalı da barındırırsa ortak arıza | Düşük | Yüksek | hbbs/hbbr + MeshCentral ayrı VDS veya yedek planı (K-04) | +| 700 node Prometheus kardinalite patlaması | Orta | Orta | 60 sn scrape, 30–90 gün retention, `BF-` etiket şeması (K-07) | +| Remaster Field OS ISO boot etmez (UEFI/Legacy/Secure Boot) | Orta | Yüksek | F2B çıkış kapısı: 2 LAB cihazında assisted kurulum kanıtı; aksi halde F3 başlamaz, upstream ISO + seed yolu sıcak (K-20) | +| Skeleton manifest ile "release var" izlenimi | Düşük | Orta | `bf-release` skeleton manifestte exit≠0 (UNAPPROVED_SKELETON); check-specs bu davranışı zorunlu tutar (K-24) | +| GNOME/XFCE kararı kanıtsız revize edilir | Düşük | Orta | A/B ölçüm seti sabit; revizyon yalnız LAB verisiyle ve PR ile (K-23) | + +## 9. Uygulama Planı + +1. Golden image'a K-01/K-02/K-03/K-10/K-11 uygulanır (04-GOLDEN-IMAGE). +2. WireGuard hub + ilk peer'lar K-05'e göre kurulur (08-WIREGUARD). +3. hbbs/hbbr + MeshCentral VDS'leri K-04'e göre ayağa kaldırılır (07-REMOTE-ACCESS). +4. Ansible + Semaphore K-06'ya göre kurulur; ilk playbook LAB(2)'de koşar (09-FLEET). +5. Prometheus + Uptime Kuma K-07'ye göre kurulur; 17 metrik LAB'da doğrulanır (14-MONITORING). +6. Update zinciri K-11 dalgalarıyla işletilir (10-UPDATE). + +```bash +# örnek: cihaz kimliği standardı (K-12) +hostnamectl set-hostname bf-12010193 +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| `20auto-upgrades` değerleri `0`, timer'lar maskeli | Otomatik apt çalışmaz | LAB(2) imaj denetimi | +| `bf-gui-on/off` sonrası RDP oturumu | GNOME oturumu açılır/kapanır | LAB(2) | +| WireGuard down iken RustDesk oturumu | Bağlantı kurulur (bağımsız kanal) | P1(5) | +| `docker inspect` restart politikası | `unless-stopped` tüm saha konteynerlerinde | LAB(2) | +| Semaphore kapalı iken Ansible CLI run | Playbook başarıyla koşar | LAB(2) | +| Scrape + 17 metrik + Uptime Push | Grafana + Kuma panoları dolu | P1(5) | +| `bf-gui-off` sonrası RDP oturumu | xRDP active kalır, GNOME oturumu açılır (K-22) | LAB(2) | +| `bf-release` çıktısı (skeleton manifest) | `UNAPPROVED_SKELETON` + exit≠0; sahte sürüm gösterilmez (K-24) | LAB(2) | +| Tek-USB Field OS ISO assisted kurulum | Autoinstall başlar, storage adımı operatör onayı bekler, disk kendiliğinden silinmez (K-20) | LAB(2) UEFI+Legacy | +| GNOME vs XFCE A/B ölçümü | 8 metrik tablosu dolar; karar LAB verisiyle verilir (K-23) | LAB(2) | + +## 11. Rollback + +1. Yanlış karar tespitinde bu dosya PR ile düzeltilir; bağımlı dokümanlar (01, 03, 07, 08, 09, 12, 14) aynı PR'da güncellenir. +2. İmaj-kritik karar (K-01/K-11) geri alınırsa golden image yeniden üretilir, sahaya sürülmüş dalga 10-UPDATE rollback zinciriyle geri alınır. +3. Son çare: karar öncesi imaj sürümüne dönüş (17-RECOVERY LEVEL 9). + +## 12. Kontrol Listesi + +- [ ] 24 kararın her birinde KARAR/GEREKÇE/ALTERNATİF/RİSK/MALİYET/LİSANS + kaynak URL var. +- [ ] Ücretli hiçbir araç zorunlu mimaride değil; AnyDesk hükmü resmi URL'li. +- [ ] `unattended-upgrades`, `latest`, Watchtower yasakları üç dosyada da tutarlı (03/10/12). +- [ ] Ek B'deki 27 sorunun her biri ≥1 karara bağlı (boş hücre yok). +- [ ] Ek B'ye eklenen S-28…S-37 (Field OS soruları) da ≥1 karara bağlı. +- [ ] RDP/durum modeli/medya/GNOME ölçümü/sürüm kimliği konularında ikinci tur kararları (K-20…K-24) ile K-02/K-03/K-15/K-16/K-17/K-18 arasında çelişki yok. + +## 13. Açık Sorular + +- [ ] GNOME oturum başlatma satırı + `bf-gui-*` kesin birim listesi — LAB 26.04.1 imajında (sahibi: Faz 3, 03/04 yazarları). +- [ ] MEG log hacmine göre `max-size/max-file` kesin değerleri — PİLOT ölçümü (sahibi: 12-DOCKER yazarı). +- [ ] Turkcell NAT kopma sayacı + keepalive ayarı — P1 7/24 sayaç (sahibi: 08-WIREGUARD yazarı). +- [ ] Digest pinleme (`@sha256`) kararı — PİLOT-2 değerlendirmesi (sahibi: 12-DOCKER yazarı). +- [ ] Prometheus retention/kardinalite hesabı (700 × 60 sn) — LAB ölçümü (sahibi: 14-MONITORING yazarı). +- [ ] Semaphore Global Runner sayısı + eşzamanlılık — 700 node yük testi (sahibi: 09-FLEET yazarı). +- [ ] GNOME vs XFCE A/B ölçüm seti ve sonuç tablosu (8 metrik, 24/72 saat) — LAB 2 cihaz (sahibi: platform ekibi + 03 yazarı) [K-23]. +- [ ] F2B tek-USB Field OS ISO: iso builder'ın gerçek üretime geçirilmesi + UEFI/Legacy/Secure Boot LAB matrisi — LAB (sahibi: provisioning/release yöneticisi) [K-20]. +- [ ] Offline APT repo somut paket pinleri (base-packages/remote-access/docker manifestleri) — LAB (sahibi: release yöneticisi) [K-20/K-16]. +- [ ] `/etc/blueforce-release` yazma adımının release pipeline'a eklenmesi — 30 release yönetimi (sahibi: release yöneticisi) [K-24]. + +--- + +## Ek A: Kaynak Tablosu (URL + sürüm + tarih) + +| # | Kaynak | Sürüm/tarih | +|---|---|---| +| 1 | https://releases.ubuntu.com/ | 26.04.1 LTS Resolute Raccoon, 2026-09-15 | +| 2 | https://releases.ubuntu.com/26.04/ | Server GUI kurmaz notu, 2026-09-15 | +| 3 | https://ubuntu.com/download/desktop | 2 GHz / 6 GB / 25 GB, 2026-09-15 | +| 4 | https://ubuntu.com/server/docs/how-to/software/automatic-updates/ | güncel Server docs, 2026-09-15 | +| 5 | https://manpages.ubuntu.com/manpages/resolute/en/man8/unattended-upgrade.8.html | 2.12ubuntu9, 2026-09-15 | +| 6 | https://www.gnome.org/ | Desktop standardı beyanı, 2026-09-15 | +| 7 | https://github.com/neutrinolabs/xrdp | v0.10.6.1 (2026-07-07), 2026-09-15 | +| 8 | https://www.wireguard.com/quickstart/ | keepalive 25 sn, 2026-09-15 | +| 9 | https://packages.ubuntu.com/resolute/wireguard-tools | 1.0.20250521-1ubuntu1, 2026-09-15 | +| 10 | https://docs.docker.com/engine/network/packet-filtering-firewalls/ | UFW bypass, 2026-09-15 | +| 11 | https://docs.docker.com/engine/logging/configure/ | log rotasyon, 2026-09-15 | +| 12 | https://docs.docker.com/engine/containers/start-containers-automatically/ | unless-stopped, 2026-09-15 | +| 13 | https://github.com/containrrr/watchtower | arşivli, 2026-09-15 | +| 14 | https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/ | mimari hbbs/hbbr, 2026-09-15 | +| 15 | https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/ | compose + portlar, 2026-09-15 | +| 16 | https://rustdesk.com/docs/en/self-host/client-deployment/ | OSS toplu dağıtım, 2026-09-15 | +| 17 | https://rustdesk.com/pricing/ | Individual ~11,88 / Basic ~23,88 USD/ay, 2026-09-15 | +| 18 | https://support.anydesk.com/docs/anydesk-licenses.md | ticari lisans şartı (güncelleme 2025-10-30), 2026-09-15 | +| 19 | https://anydesk.com/en/pricing | Solo/Standard/Advanced/Ultimate, 2026-09-15 | +| 20 | https://github.com/Ylianst/MeshCentral | 1.2.5 (2026-08-12), Apache-2.0, 2026-09-15 | +| 21 | https://github.com/ansible/ansible | GPL-3.0, 2026-09-15 | +| 22 | https://github.com/semaphoreui/semaphore + https://semaphoreui.com/pricing | MIT, Community $0, 2026-09-15 | +| 23 | https://github.com/prometheus/prometheus + https://prometheus.io/docs/guides/node-exporter/ | Apache-2.0, 2026-09-15 | +| 24 | https://grafana.com/oss/ | AGPL-3.0 OSS, 2026-09-15 | +| 25 | https://github.com/louislam/uptime-kuma | MIT, 2026-09-15 | +| 26 | https://github.com/facebook/docusaurus + https://docusaurus.io/docs/markdown-features/diagrams | MIT, 2026-09-15 | +| 27 | https://github.com/prometheus/node_exporter | textfile collector, 2026-09-15 | + +--- + +## Ek B: 27 Soru → Karar İzlenebilirliği + +> NOT: `SUMMARY.md` artık üretilmiştir (2026-09-15/16); aşağıdaki S-01…S-27 listesi şartname + plandaki 27 kritik sorunun Faz 2 karşılığıdır ve SUMMARY'deki aynı sorular bu kararlara linklenir. 2026-09-16 turunda SUMMARY'ye eklenen 10 Field OS sorusu S-28…S-37 olarak listelenmiştir. + +| # | Soru | Karar | Doküman | +|---|---|---|---| +| S-01 | Hangi Ubuntu sürümü? | K-01 (Server 26.04.1+ LTS) | 03-UBUNTU-BASELINE | +| S-02 | Server mı Desktop mı? | K-01 (Server, GUI'siz kurulum) | 03 | +| S-03 | GNOME mu XFCE mi? | K-02 (GNOME; XFCE elendi) | 03, 07 | +| S-04 | Boot terminale mi grafiğe mi? | K-03 (terminal + bf-gui-on/off) | 03, 16 | +| S-05 | SSH nasıl (kullanıcı, auth, root)? | K-13 (key zorunlu, root kapalı) | 06 | +| S-06 | 700 cihazda tek key riski nasıl çözülür? | K-13 (per-admin key + CA hedefi) | 06 | +| S-07 | RDP hangi sunucu/masaüstü ile? | K-03 (xRDP + GNOME) | 07 | +| S-08 | RustDesk OSS neyi kapsar, Pro gerekir mi? | K-04 (OSS yeterli, Pro yok) | 07 | +| S-09 | WireGuard çökerse uzak erişim sürer mi? | K-04 (RustDesk/MeshCentral bağımsız) | 07, 08 | +| S-10 | 4. erişim kanalı hangisi? | K-04 (MeshCentral) | 07 | +| S-11 | AnyDesk ücretsiz kullanılabilir mi? | K-04 (HAYIR — mimariden çıkarıldı) | 07, 23 | +| S-12 | WireGuard modeli + keepalive + otomatik reconnect? | K-05 (hub-spoke, 25 sn, wg-quick enable) | 08 | +| S-13 | RDP/SSH dış dünyaya açık mı? | K-05 (hayır — WireGuard arkası) | 08, 11 | +| S-14 | Filo yönetimi hangi araç? | K-06 (Ansible + Semaphore Community) | 09 | +| S-15 | Semaphore Pro gerekir mi? | K-06 (hayır — kanıtlı) | 09, 23 | +| S-16 | Monitoring hangi yığın, 17 metrik nasıl? | K-07 (Prometheus + Kuma) | 14 | +| S-17 | Çevrimdışı/last-seen nasıl izlenir? | K-07 (`up` + Push monitör) | 14 | +| S-18 | Onaysız update politikası nedir? | K-11 (yasak + dalgalı onay zinciri) | 10 | +| S-19 | `unattended-upgrades` ne olacak? | K-11 (imajda kapalı) | 03, 10 | +| S-20 | Update dalgaları neler? | K-11 (LAB(2)/P1(5)/P2(20)/W1(50)/W2(100)/PROD) | 10, 18 | +| S-21 | Docker restart politikası ne? | K-10 (`unless-stopped`) | 12 | +| S-22 | `latest` / Watchtower serbest mi? | K-10 (ikisi de yasak) | 12 | +| S-23 | Docker + UFW çakışması nasıl çözülür? | K-10 (localhost-bind) | 11, 12 | +| S-24 | Log disiplini nedir? | K-10 + K-14 (rotasyon + textfile + bundle) | 12, 15 | +| S-25 | Golden image yöntemi ne? | K-09 (autoinstall + install.sh) | 04, 05 | +| S-26 | Cihaz kimliği standardı ne? | K-12 (`BF-` / `bf-`) | 02 | +| S-27 | Doküman platformu hangisi? | K-08 (Docusaurus) | 22 | + +### Ek B-2: 10 Field OS sorusu → karar (2026-09-16 turu) + +| # | Soru | Karar | Doküman | +|---|---|---|---| +| S-28 | Blueforce Field OS nedir? | K-01 + K-02 + K-20 (Ubuntu LTS üzerinde GNOME katmanlı, tek-USB paketlenebilen saha OS standardı) | 00, 01, 26, 31 | +| S-29 | ISO nasıl build edilir? | K-20 (autoinstall motoru + Field OS ISO paketleme; `provisioning/iso/build-blueforce-iso.sh` — bugün iskelet, gerçek build açık) | 26, 31 | +| S-30 | Offline kurulum nasıl çalışır? | K-16 + K-20 (`apt.fallback=offline-install` + offline APT snapshot + `--offline`) | 27, 31 | +| S-31 | Device state'leri nedir? | K-21 (PROVISIONED_OFFLINE → ENROLLED → READY) | 27, 29 | +| S-32 | Internet olmadan ne olur? | K-16 + K-21 (yerel kurulum tamam, durum PROVISIONED_OFFLINE; READY iddiası yok) | 27 | +| S-33 | Internet gelince ne olur? | K-17 + K-21 (tek kullanımlık token → ENROLLED; WG/erişim/monitoring doğrulaması → READY) | 29 | +| S-34 | Enrollment nasıl olur? | K-17 (`BF-` bağlı, TTL'li, tek kullanımlık token; `bf-enroll --token-stdin`) | 29 | +| S-35 | Windows'tan geçmeden önce ne yedeklenir? | K-19 (envanter + hash doğrulamalı geri dönüş imajı + veri dışa aktarma) | 28 | +| S-36 | Rollback nasıl olur? | K-18 + K-20 + K-22 (önceki onaylı release manifesti; gerekirse upstream ISO + onaylı seed ile yeniden kurulum) | 30, 26 | +| S-37 | Field OS version nasıl takip edilir? | K-24 (`/etc/blueforce-release` + `bf-release`; skeleton manifest reddedilir) | 30 | + +--- + +## Ek: Karar Haritası (hangi soru hangi karara?) + +```mermaid +flowchart LR + SORU["37 soru
    S-01…S-27 + S-28…S-37"] --> ZEMIN["Zemin: K-01/K-02/K-03
    K-09/K-10/K-11/K-12"] + SORU --> AG["Ağ + erişim: K-04/K-05/K-13"] + SORU --> OPS["Operasyon: K-06/K-07/K-14"] + SORU --> DOC["Docs: K-08"] + SORU --> FIELD["Field OS: K-15/K-16/K-17/K-18/K-19
    K-20/K-21/K-22/K-23/K-24"] + ZEMIN --> D1["03/04/05/10/12/02"] + AG --> D2["07/08/06/11"] + OPS --> D3["09/14/15"] + DOC --> D4["22"] + FIELD --> D5["26/27/28/29/30/31
    + 24 bu dosya"] +``` +
    + + +# 25 — Uygulama Yol Haritası (Implementation Roadmap) + +> Kısa özet: Blueforce 700 cihaz projesinin FAZ'lı yol haritası: F0 Windows + donanım keşfi → F1 merkez altyapı → F2A Blueforce bootstrap stabilizasyon → F2B Assisted Offline Field ISO → F3 LAB (2 cihaz) → F4 P1-P2-W1-W2 dalgaları → F5 production rollout → F6 gerçek zero-touch PXE. Katılımsız/PXE otomasyonu YALNIZ F6'dır; F2B assisted (operatör disk onaylı) tek-USB medyadır ve erken fazların hiçbirinde otomatik disk silme yoktur. + +- Dosya: `docs/25-IMPLEMENTATION-ROADMAP.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-01`…`#K-24`; özellikle `#K-09` (golden image), `#K-11` (dalgalar), `#K-15`/`#K-20` (medya stratejisi), `#K-16`/`#K-17`/`#K-21` (offline + durum modeli), `#K-18`/`#K-24` (release + sürüm kimliği) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Projeyi "ne, hangi sırada, hangi kapıdan geçerek" sorusuyla yönetmek. Her FAZ'ın girişi, çıkışı ve sahibi bellidir; bir FAZ kapanmadan sonrakine iş taşınmaz. F2A/F2B ayrımı, "kurucu ve bootstrap çalışıyor" ile "tek USB'lik Field OS medyası üretildi" işlerinin farklı risk sınıfları olduğunu görünür kılar. + +## 2. Kapsam + +- Kapsam içi: FAZ tanımı, sıra ve bağımlılıklar, her FAZ'ın çıkış kriteri, assisted (F2B) ile zero-touch (F6) provisioning'in yeri, doküman-faz eşleşmesi. +- Kapsam dışı: dalga cihaz sayıları detayı (18), update onay akışı (10), komut-seviyesi kurulum (03/04/05). + +## 3. Kararlar + +```text +KARAR: Yol haritası 8 adımdır (7 FAZ + F2 ikiye ayrılır): F0 Windows + donanım keşfi → F1 Merkez altyapı → F2A Blueforce bootstrap stabilizasyon → F2B Assisted Offline Field ISO → F3 LAB (2 cihaz, uçtan uca) → F4 P1-P2-W1-W2 dalgaları → F5 Production rollout (~523) + işletme/release yönetimi → F6 Gerçek zero-touch PXE. F6 YALNIZ PXE / tam unattended / uzaktan (remote) provisioning içindir; assisted kurulum F2B'de biter ve otomatik disk silme hiçbir fazda yoktur. +GEREKÇE: Sıra bağımlılıkları zorlar: Windows/donanım keşfi olmadan imaj (K-09), merkez altyapı olmadan enrollment/WG (K-05/K-17), bootstrap stabil olmadan medya (F2A→F2B), medya kanıtlanmadan LAB kabulü (F2B→F3), LAB kabulü olmadan dalga (K-11) olmaz. F2A/F2B ayrımı riskleri ayırır: F2A "kurucu idempotent ve kapıları çalışıyor" iddiasıdır (upstream ISO + NoCloud seed ile sınanır), F2B ise "tek USB Field OS ISO assisted kurar" iddiasıdır (remaster boot zinciri riski buradadır). F6'nın ayrı ve son FAZ olması, zero-touch/PXE'nin iptal edilebilir (proje yine de biter) ama atlanamaz (sırası gelmeden yapılmaz) olduğunu söyler. +ALTERNATİF: Zero-touch PXE'i en başa koymak — kanıtlanmamış akışın otomasyonu hata çarpanı üretir, üstelik otomatik disk silme veri kaybı riski taşır → elendi (F6'ya taşındı). Tek-faz "hepsini yap" planı — kapısız ilerleme, filo-çapı risk → elendi. F2A/F2B'yi birleştirmek — medya riski ile kurucu riski aynı kapıya sıkışır ve hangi iddianın kanıtlandığı belirsizleşir → elendi. +RİSK: FAZ atlama baskısı (takvim); azaltma: her FAZ çıkışı 21'deki onay yetkilisinin imzasına bağlıdır. +MALİYET: Ücretsiz (işgücü planlaması; VDS kira hariç). +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +Klasik hata sırası tersine çevirmektir: önce otomasyon, sonra temel. Bu harita bilerek "sıkıcı" sırayı seçer — önce elle çalışan, sonra kendiliğinden çalışan. F6'nın ayrı FAZ olması zero-touch'un iptal edilebilir ama atlanamaz olduğunu söyler. F2A/F2B ayrımı ise aynı mantığı içeride uygular: **assisted** medya (teknisyen disk onayı verir, `interactive-sections: [storage]`) ile **unattended** medya (F6, operatör girdisi yok) karıştırılmaz. F2B'nin assisted kalması prompt'un "otomatik disk silme yok" şartının faz seviyesindeki karşılığıdır (K-20). Her FAZ bir karar grubunu hayata geçirir; harita ile 24-DECISION-LOG arasındaki bağ tabloyla sabittir. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Zero-touch/PXE ilk FAZ | Erken otomasyon | Kanıtlanmamış akışın otomasyonu + otomatik disk silme riski | Elendi (F6'ya taşındı) | +| Tek F2 (bootstrap + medya birlikte) | Daha az faz | Kurucu ve boot zinciri riski aynı kapıda karışır | Elendi (F2A/F2B) | +| Az FAZ (3 büyük) | Kısa plan | Kapılar seyrek, risk büyük | Elendi | +| Çok FAZ (12+) | Detaylı | Yönetim yükü, faz yorgunluğu | Elendi | + +## 6. Avantajlar + +- Her FAZ bağımsız kapanır; proje yarıda kalsa bile kazanım (örn. F1 merkezi, F2A stabil kurucu) kalır. +- F6 opsiyoneldir: assisted akışla (F2B→F5) filo kurulabilir, zero-touch sonradan eklenir. +- Assisted/unattended ayrımı sayesinde "otomatik disk silme yok" güvenlik şartı faz yapısında görünür kalır. + +## 7. Dezavantajlar + +- FAZ disiplini yavaş görünür; paydaşa "neden zero-touch en sonda" açıklaması gerekir (gerekçe §4'tür). +- FAZ'lar arası bekleme (gözetim süreleri) takvimi uzatır. +- F2A ve F2B iki ayrı kapı demektir; tek kapılı plana göre bir faz daha fazla onay toplantısı gerekir. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| FAZ çıkışı atlanır, sonrakine geçilir | Orta | Yüksek | Onay yetkilisi imzası zorunlu (21) | +| Merkez VDS donanımı yetersiz çıkar (F1) | Orta | Orta | LAB yük testi; servisleri ikinci VDS'e bölme planı (01) | +| Windows keşfi eksik yapılır, geçişte sürpriz bağımlılık çıkar (F0→F3) | Orta | Yüksek | İş sahibi onayı + hash doğrulamalı geri dönüş imajı (28) | +| Donanım profili imajı kırar (F2B→F3) | Orta | Orta | F0 envanteri + F3 profil matrisi | +| Remaster Field OS ISO boot etmez (F2B) | Orta | Yüksek | UEFI/Legacy/Secure Boot matrisi; aksi halde F3 başlamaz ve upstream ISO + seed yolu sıcak tutulur (26) | +| F6'da otomatik provisioning veri siler | Düşük | Yüksek | F6 yalnız boş/teslim edilmiş disklere uygulanır; assisted (F2B) yol her zaman yedek | + +## 9. Uygulama Planı + +| FAZ | Ad | Kararlar | Çıkış kriteri | Dokümanlar | +|---|---|---|---|---| +| F0 | Windows + donanım keşfi | K-12 (kimlik), K-19 (Windows envanteri), K-09 (tarama-önce) | Her saha PC için envanter (üretici/model/CPU/RAM/disk/NIC/GPU/seri no/bayi no) + Windows iş yükü ve geri dönüş imajı listesi onaylı | 02, 18, 28 | +| F1 | Merkez altyapı | K-04, K-05, K-06, K-07, K-08 | WG hub + hbbs/hbbr + MeshCentral + Semaphore + Prometheus/Grafana/Kuma ayakta; L9 tatbikatı yapıldı | 06, 07, 08, 09, 14, 17-L9 | +| F2A | Blueforce bootstrap stabilizasyon | K-01, K-03, K-09, K-10, K-11, K-12, K-13, K-22 | `blueforce-install.sh` upstream ISO + NoCloud seed ile idempotent ve tekrar çalıştırılabilir; 18 modül ve `--check` kapıları yeşil; `bf-status`/`bf-enrollment-status` beklenen durumu yazıyor; xRDP kalıcı aktif (K-22) | 03, 04, 05, 06, 11, 12, 16 | +| F2B | Assisted Offline Field ISO | K-15, K-16, K-20, K-21, K-24 | Tek USB `Blueforce-Field-OS--amd64.iso` UEFI+Legacy'de boot ediyor; autoinstall çalışıyor; storage adımı operatör onayı bekliyor (otomatik silme yok); offline APT snapshot'tan kurulum bitiyor; firstboot bayi no alıp `PROVISIONED_OFFLINE` yazıyor; `bf-release` gerçek release kimliği döndürüyor | 05, 26, 27, 30 | +| F3 | LAB (2 cihaz) | K-11, K-14, K-05, K-17, K-18, K-19, K-21, K-23 | 2 LAB cihazında uçtan uca: erişim + boot + update + enrollment + Windows geçiş kabulü + rollback yeşil; teknisyen desteksiz kurulum yapabildi; GNOME vs XFCE A/B ölçüm tablosu dolduruldu | 18, 19, 20, 10, 28, 29, 30, 31 | +| F4 | Dalgalar P1-P2-W1-W2 | K-11, K-06, K-07, K-14 | P1(5) → P2(20) → W1(50) → W2(100): her dalga çıkış kriteri + halt kaydı; destek yükü hedefte | 18, 21, 14 | +| F5 | Production rollout (~523) + işletme/release yönetimi | Tümü | Filo READY; rutinler (günlük/haftalık), immutable release manifest ve rollback kanıtı devrede; `v1` doküman kesildi | 21, 22, 23, 30 | +| F6 | Gerçek zero-touch PXE | K-20 (unattended kolu), K-18 | YALNIZ PXE / tam unattended / uzaktan provisioning: ağ üzerinden operatör girdisi olmadan kurulum + otomatik disk yapılandırması; assisted (F2B) yolu geri dönüş olarak sıcak | 26, 30 | + +Akış/bağımlılık notları: + +- F2A → F2B kapısı: "kurucu stabil" kanıtı yoksa tek-USB medya üretimi başlamaz (medya, kurucunun test ortamıdır; tersi değil). +- F2B → F3 kapısı: assisted tek-USB medya iki LAB cihazında (UEFI + Legacy) kanıtlanmazsa LAB kabulü başlamaz. +- F6, F5'ten sonra başlar ve F5'in kapanmasına engel değildir; F6 başarısız olursa proje F5 haliyle tamam sayılır ve assisted akış yedek kalır. + +```bash +# örnek: FAZ kapısı kontrolü (merkez) +# F2B/F3 çıkışı için LAB doğrulama seti +bf-release # gerçek release kimliği (skeleton değil) +bf-enrollment-status # PROVISIONED_OFFLINE → ENROLLED → READY +ansible-playbook playbooks/verify-lab.yml --limit lab +bf-support-bundle --out /tmp/f3-gate-bundle.tar.gz +``` + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| F0 Windows/donanım keşfi ve imaj listesi | Her cihaz için profil + geri dönüş imajı kaydı var | Saha/LAB | +| F1 L9 tatbikatı (boş VDS'e kur) | Tüm merkez servisleri ayağa kalkar | İzole VDS | +| F2A kurucu idempotent çalışma | İkinci koşu hata üretmez, `--check` yeşil | LAB(2) | +| F2B tek-USB assisted kurulum | UEFI + Legacy boot; storage onayı beklenir; `PROVISIONED_OFFLINE` | LAB(2) | +| F2B offline kurulum (air-gapped) | Paketler yerel snapshot'tan kurulur, dış indirme yok | LAB(2) air-gapped | +| F3 3-akış + enrollment + rollback | Erişim/boot/update + ENROLLED/READY + geri alma yeşil | LAB(2) | +| F3 GNOME vs XFCE A/B | 8 metrik tablosu dolar (RAM/CPU/boot/RDP/RustDesk/login/dummy/24-72h) | LAB(2) | +| F6 zero-touch PXE prova | PXE ile operatör girdisi olmadan READY'ye kadar akış | F5 sonrası LAB | + +## 11. Rollback + +1. FAZ içi hata: ilgili dalga/iş 17-RECOVERY veya 10-UPDATE zinciriyle geri alınır; FAZ tekrarlanır. +2. FAZ kararı yanlışsa (örn. medya veya masaüstü yöntemi): 24-DECISION-LOG PR'ı + bağımlı FAZ'ların tekrarı. +3. F2B geri alınırsa upstream ISO + NoCloud seed yoluna dönülür (bu yol her zaman sıcak tutulur). +4. F6 geri alınırsa assisted (F2B) akışa dönülür; PXE'siz filo işletilmeye devam eder. + +## 12. Kontrol Listesi + +- [ ] Her FAZ'ın çıkış kriteri + sahibi yazılı ve onaylı. +- [ ] F2A/F2B ayrımı ve F2B'nin assisted (otomatik disk silme yok) olduğu paydaşça kabul edildi. +- [ ] F6'nın yalnız PXE / tam unattended / uzaktan provisioning olduğu ve F5 sonrası ayrı FAZ olduğu kabul edildi. +- [ ] Doküman-faz eşleşmesi (tablodaki son sütun) güncel. +- [ ] Onay yetkilisi (asıl+vekil) tanımlı (21). + +## 13. Açık Sorular + +- [ ] FAZ tarihleri ve teknisyen kapasite planı (sahibi: yönetim + 18). +- [ ] F1 VDS donanım siparişi için LAB yük ölçümü (sahibi: 14-MONITORING yazarı). +- [ ] F2B gerçek ISO build'i ve UEFI/Legacy/Secure Boot matrisi — `provisioning/iso/build-blueforce-iso.sh` bugün iskelet (sahibi: provisioning/release yöneticisi). +- [ ] F2B offline APT snapshot için somut paket pinleri (base-packages/remote-access/docker manifestleri) (sahibi: release yöneticisi). +- [ ] F0 Windows keşif kapsamı: hangi uygulama/veri sınıfları zorunlu (sahibi: iş sahibi + 28 yazarı). +- [ ] F6 kapsamı (PXE şart mı, USB-preseed yeter mi, otomatik disk yapılandırması hangi onayla) — F5 verisi sonrası (sahibi: 04 yazarı). + +--- + +## Ek: Mermaid — FAZ akışı + +```mermaid +flowchart LR + F0["F0 Windows +
    donanım keşfi"] --> F1["F1 Merkez
    altyapı"] + F1 --> F2A["F2A Blueforce
    bootstrap stabil."] + F2A --> F2B["F2B Assisted Offline
    Field OS ISO"] + F2B --> F3["F3 LAB
    2 cihaz"] + F3 --> F4["F4 P1-P2-W1-W2"] + F4 --> F5["F5 Production
    rollout ~523"] + F5 --> F6["F6 Zero-touch PXE
    (ayrı FAZ)"] + F2B -. "geri dönüş" .-> F0 +``` +
    + + +# First boot — terminal wizard, kimlik koruması ve yarıda kalan kurulum + +Bu dizin, cihazın ilk açılışında sahada çalışan giriş noktasını barındırır: + +- `bf-firstboot` — bayi numarasını toplayan/doğrulayan ve yerel offline kurucuyu bir kez çalıştıran script. Kurucu paket deposunu kendisi bulur; internet gerekmez, teknisyen hiçbir şey indirmez. +- `blueforce-firstboot.service` — boot'ta script'i bir kez çalıştıran systemd unit'i. +- Bu doküman — gerçek davranış, otomasyon yolu, kimlik değişimi prosedürü ve secret kuralları. + +İlk boot, yalnız Subiquity'nin assisted storage onayıyla tamamlanan kurulumdan ve yeniden başlatmadan sonra çalışır. +Kimlik formatı `^[0-9]{8}$` (`docs/02-DEVICE-NAMING-AND-INVENTORY.md`) ve merkezi durumlar +(`PROVISIONED_OFFLINE` → `ENROLLED` → `READY`, `docs/29-DEVICE-ENROLLMENT.md`) bu adımın dışındadır: +firstboot yalnız offline provision'ı yapar, enrollment ve READY ayrı adımlardır. + +## 1. Wizard (teknisyen ekranı) + +Konsolda (TTY mevcut ve otomasyon istenmemiş) teknisyen şu ekranı görür: + +```text +# BLUEFORCE FIELD OS +8 Haneli Bayi Numarası: +> _ +``` + +Davranış: + +- Girdi `^[0-9]{8}$` ile doğrulanır. **Hatalı girdi kabul edilmez**; hata satırı ve `(deneme N/3)` ile yeniden sorulur. + Yalnız baştaki/sondaki boşluk kırpılır (yapıştırma artığı); değerin içinde boşluk veya rakam dışı karakter varsa geçersiz sayılır. +- 3 hatalı denemeden sonra script net bir hatayla `exit 2` verir ve hiçbir değişiklik yapmaz + (`BF_FIRSTBOOT_MAX_ATTEMPTS` ile deneme sayısı değiştirilebilir). +- Doğru girdide onay ekranı gösterilir; onay `e`/`evet`/`y`/`yes` ile alınır: + +```text +Device ID (cihaz kimliği): BF- +Hostname (makine adı) : bf- +Kurulum bu kimlikle başlatılsın mı? [e/H]: +``` + +- Onay verilmezse kurulum başlamaz; deneme hakkı tükenirse `exit 2`. +- `read` zaman aşımına uğrarsa (varsayılan 300 sn, `BF_FIRSTBOOT_INPUT_TIMEOUT`) script + "no terminal input arrived" hatasıyla `exit 2` verir; konsolda kimse olmadığında sonsuza kadar bloklamaz. + +TTY seçimi: stdin zaten bir terminal ise (systemd `StandardInput=tty-force` durumu) fd 0 kullanılır; +değilse `/dev/tty` açılır; o da açılamıyorsa wizard atlanır ve argüman/dosya yoluna düşülür. + +## 2. Kimlik çözümleme sırası + +| # | Kaynak | Mod | +|---|---|---| +| 1 | `--dealer-id <8hane>` | non-interactive (otomasyon) | +| 2 | `--dealer-id-file ` | non-interactive (otomasyon) | +| 3 | `--interactive` | wizard (TTY zorunlu) | +| 4 | `BF_FIRSTBOOT_NONINTERACTIVE=1` | non-interactive; seed dosyası (`/etc/blueforce/dealer-id`) okunur | +| 5 | Seed dosyası `/etc/blueforce/dealer-id` geçerliyse | non-interactive; wizard atlanır (log satırı yazılır) | +| 6 | TTY mevcut | wizard | +| 7 | Hiçbiri | net hata + `exit 2` (argüman/dosya önerilir) | + +Otomasyon yolu (1, 2, 4) hiçbir soru sormaz: seed/USB ile kurulan cihazda teknisyen girdisi gerekmez. +1. ve 2. maddeler açıkça verildiği için onay ekranı çıkmaz; bu bilinçli bir otomasyon kapısıdır. + +### Komut arayüzü + +```bash +sudo bf-firstboot # wizard (konsol) +sudo bf-firstboot --dealer-id <8hane> # otomasyon +sudo bf-firstboot --dealer-id-file /path/to/dealer-id +sudo bf-firstboot --check --dealer-id <8hane> # salt-okunur denetim +sudo bf-firstboot --interactive # seed dosyası olsa bile wizard +BF_FIRSTBOOT_NONINTERACTIVE=1 sudo bf-firstboot # boot/otomasyon +``` + +Ortam değişkenleri: `BF_FIRSTBOOT_MARKER` (marker yolu), `STATE_DIR` (varsayılan `/var/lib/blueforce`), +`BF_INSTALLER_PATH` (kurucu yolu), `BF_ADMIN_PUBLIC_KEY_FILE`, `BF_FIRSTBOOT_MAX_ATTEMPTS`, +`BF_FIRSTBOOT_INPUT_TIMEOUT`, `BF_FIRSTBOOT_TEST_MODE`, `BF_FIRSTBOOT_NONINTERACTIVE`. + +### Çıkış kodları + +| Kod | Anlam | +|---|---| +| 0 | Kurulum tamam (marker yazıldı) veya zaten tamamlanmış (idempotent) veya `--check` raporu | +| 1 | Offline önkoşul eksik (admin public key), root yok, kurucu yok, veya kurucu hata verdi | +| 2 | Girdi hatası: geçersiz bayi numarası, terminal yok, onay verilmedi, deneme tükendi | + +## 3. İdempotentlik ve yarıda kalan kurulum + +- Marker: `/var/lib/blueforce/firstboot-complete` (mode `600`, içinde bayi numarası). +- Marker varsa script **hiçbir şey yapmaz**: sormaz, yazmaz, kurucuyu çağırmaz, `exit 0`. Wizard bu durumda asla açılmaz. +- Marker varken farklı bir bayi numarası verilirse identity değişmez; yalnız uyarı yazılır ve admin prosedürüne + (§4) işaret edilir. Sıradan kullanıcı yoluyla kimlik değiştirilemez. +- Marker yalnız kurucu başarıyla bittikten sonra yazılır (`set -euo pipefail` sayesinde hata hâlinde yazılmaz). +- Önceki koşu yarıda kaldıysa (`$STATE_DIR/install-state` dolu) kurucu `--resume` ile çağrılır: + kurucu `--offline --dealer-id --yes` (+ gerekirse `--resume`) argümanlarıyla koşar. +- Script kurucuyu `--offline` ile çağırır. **Bu bayrak artık zorunlu değildir**: kurucu yerel + paket deposunu kendisi bulur (`BF_OFFLINE_REPO` → `/provisioning/offline-repo/built` → + `/opt/blueforce/offline-repo`). firstboot bayrağı geriye uyumluluk için verir; sonuç aynıdır: + yerel depodan, internet olmadan kurulum ve `PROVISIONED_OFFLINE` durumu. +- `--check` hiçbir dosya/dizin/log üretmez ve kurucuyu çağırmaz. + +### Depo bulunamazsa / doğrulanamazsa + +firstboot kurucuyu çağırır; paket deposuna ilişkin karar ve mesaj **kurucunun** sorumluluğundadır. +İki farklı durum vardır ve ikisinde de firstboot marker **yazmaz** (cihaz provision edilmiş sayılmaz): + +| Durum | Kim söyler | Ekranda ne görünür (kısaltılmış) | Sonuç | +|---|---|---|---| +| Yerel depo hiç yok (üç arama yerinde de yok) | Kurucu | `HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md` … `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.` | `exit 1`; hiçbir şey değişmez | +| Depo bulundu ama doğrulanamadı (checksum, kilit, eksik pin) | Kurucu | `OFFLINE BLOCKED: ` … `ÇIKIŞ NEDENİ: yerel paket deposu doğrulanamadı…` | `exit 1`; hiçbir şey değişmez | +| Admin public key eksik/geçersiz | firstboot'un kendi kapısı | `OFFLINE BLOCKED: seed-provided BF_ADMIN_PUBLIC_KEY_FILE is required.` (veya anahtar kuralı satırı) | `exit 1`; kurucu hiç çağrılmaz | + +Çözüm sahadaki teknisyenin işi değildir: mesajı repo sorumlusuna iletmek ve depo düzeltildikten +sonra kurulumu tekrar çalıştırmak yeterlidir. Kurulumu yapan kişi hiçbir şey indirmez; paketler +git deposunda taşınır. + +## 4. Kimlik değişimi prosedürü (admin / recovery — varsayılan KAPALI) + +Bayi numarası değişimi **sıradan kullanıcı yolu değildir**. Wizard ve normal koşu bu yolu içermez. +Yalnız root + açık operatör kapısı + yazılı onay + audit kaydı ile çalışır: + +1. Fiziksel konsolda root oturumu açılır ve operatör kapısı açıkça verilir: `BF_ALLOW_REIDENTITY=1`. +2. Komut: `BF_ALLOW_REIDENTITY=1 sudo -E bf-firstboot --force-reidentity --dealer-id `. +3. Ekranda eski/yeni kimlik ve "dokuz merkezi sistem güncellenmeli" uyarısı gösterilir. +4. Onay, **yeni bayi numarasının yeniden yazılması** ile alınır; eşleşmezse hiçbir değişiklik yapılmaz (`exit 2`). +5. Kurucu yeni kimlikle koşar, eski marker `firstboot-complete.reidentified-` olarak saklanır, + yeni marker yazılır. +6. Her adım `/var/log/blueforce-reidentity.log` (mode `600`, UTC zaman + `uid=`) ve journal'a yazılır: + kim, ne zaman, eski → yeni. Audit log yazılamıyorsa değişim **reddedilir** (fail-closed). + +Kapılar: root değilse `exit 1`; `BF_ALLOW_REIDENTITY=1` yoksa `exit 1`; TTY yoksa `exit 2`. +Değişimden sonra `docs/02-DEVICE-NAMING-AND-INVENTORY.md` §9'daki yeniden-numaralandırma adımları +(WireGuard peer, RustDesk/MeshCentral etiketi, Ansible inventory, monitoring etiketi) uygulanır. + +## 5. Secret kuralları + +- `BF_ADMIN_PUBLIC_KEY_FILE` **yalnız public SSH key** içerebilir; root sahipliğinde ve grup/dünya + tarafından yazılamaz olmalıdır (`root:600` veya `root:640`). Private key, inline anahtar veya + boş/okunamayan dosya `OFFLINE BLOCKED` ile reddedilir. +- Bu kural değiştirilmedi: dosya `ssh-ed25519`/`ssh-rsa`/`ssh-ecdsa`/`sk-ssh-ed25519` public key satırı + ile başlamalı ve `PRIVATE KEY` içermemelidir. +- Script secret **loglamaz**: mesajlarda yalnız dosya yolları ve cihaz kimlikleri geçer; anahtar içeriği, + token, parola hiçbir satıra yazılmaz (`--force-reidentity` audit kaydı da yalnız kimlikleri yazar). +- Wizard girdisi ekrana yankılanır (teknisyen yazar); bu ekran token/parola istemez, yalnız bayi numarası alır. +- Kurucu, yerel paket deposunu kendisi bulur (`BF_OFFLINE_REPO` → `/provisioning/offline-repo/built` + → `/opt/blueforce/offline-repo`); `--offline` bayrağı gerekmez. Internet kurulum için gerekmez. + Public-key önkoşulu geçtikten sonra: + * depo hiç yoksa kurucu Türkçe `HATA: Yerel paket deposu yok…` + `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.` ile durur; + * depo bulunup da doğrulanamazsa (geçerli yerel APT indeksleri, checksum/lock ya da tüm somut + pinli paketler eksik/bozuk) kurucu `OFFLINE BLOCKED: ` ile durur. + Her iki durumda cihaz provision edilmiş sayılmaz ve firstboot marker yazmaz. Yalnız yerel depo + + public-key önkoşulları geçerse `PROVISIONED_OFFLINE` yazılır. Ayrıntı: §3 ve + `provisioning/offline-repo/README.md` §3. + +## 6. systemd unit ve boot'u kilitlememe + +`blueforce-firstboot.service`: + +- `ConditionPathExists=/etc/blueforce/admin-authorized-key.pub` — zorunlu seed önkoşulu yoksa unit hiç başlamaz. +- `ConditionPathExists=!/var/lib/blueforce/firstboot-complete` — provision edilmiş cihazda atlanır (başarısız sayılmaz). +- `StandardInput=tty-force` + `TTYPath=/dev/tty1` — wizard sahada konsolda görünür. +- TTY kurulamazsa (konsolsuz/headless sistem) systemd unit'i başarısız sayar, **boot devam eder**; + script de TTY yoksa argüman/dosya yoluna düşer. +- `TimeoutStartSec=45min` — konsolda kimse yoksa job sonsuza kadar açık kalmaz. +- `Type=oneshot`, `RemainAfterExit=yes`, `WantedBy=multi-user.target` — boot'ta bir kez çalışır. +- `NoNewPrivileges=yes`, `PrivateTmp=yes` korunur. `ProtectSystem=strict` ve `ProtectHome=yes` + **bilinçli olarak yoktur**: offline kurucu `/etc`, `/usr` ve `/home/blueforce` altına yazar. + +Not: unit çıktısı konsol TTY'sine gider; aynı satırlar `logger -t bf-firstboot` ile journal'a da yazılır, +kurucu kendi logunu `/var/log/blueforce-install.log` içinde tutar. + +## 7. Test + +```bash +bash tests/test-firstboot-static.sh +``` + +Statik test, gerçek systemd/apt işlemi yapmadan şunları doğrular: bayi numarası regex'i, hatalı girdinin +reddi, wizard ekranı ve onay akışı (pty ile), marker idempotentliği, kimlik değişiminin kapalı olması, +public-key önkoşulu ve secret sızıntısı olmadığı, `--check` ve `BF_FIRSTBOOT_TEST_MODE` modlarının +mutasyonsuzluğu. Root gerektiren senaryolar `unshare -r` ile ayrı bir kullanıcı ad alanında koşar; +bu izin yoksa ilgili testler `SKIP` olarak raporlanır. + + + +#!/usr/bin/env bash +# Build the bootable Blueforce Field OS installation ISO from a local, verified upstream ISO. +# +# Output contract (written next to --output): +# dist/Blueforce-Field-OS--amd64.iso +# .sha256 SHA256 of the produced ISO +# -manifest.yaml release manifest (field_os_version, base_os, ubuntu_version, ...) +# +# The build is flavour-agnostic: --upstream-iso may point at an Ubuntu Server or an +# Ubuntu Desktop ISO. The flavour is detected from the ISO volume label, recorded in +# the manifest as base_flavor, and never inferred from the file name alone. +# +# Safeguards that must not be weakened: +# * Nothing is downloaded. The upstream ISO and its SHA256 record must already exist +# locally, and the digest is always recomputed from the real file. +# * Device identity, dealer id, private keys and passwords are never embedded. The +# builder refuses to run when it finds them in the media inputs. +# * The media root carries autoinstall.yaml with `interactive-sections: [storage]`, +# so the operator still selects and confirms the target disk. No automatic wipe. +# * Existing boot files are never destroyed: every patched boot configuration keeps a +# pristine copy on the media as .blueforce-orig. +# +# --check validates every precondition and writes nothing. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +VERIFY_SCRIPT="$SCRIPT_DIR/verify-upstream-iso.sh" +VERSION_FILE="$SCRIPT_DIR/field-os-version" +PROVISIONING_DIR="$REPO_ROOT/provisioning" +AUTOINSTALL_DIR="$PROVISIONING_DIR/autoinstall" +FIRSTBOOT_DIR="$PROVISIONING_DIR/firstboot" +RELEASE_DIR="$PROVISIONING_DIR/release" +OFFLINE_REPO_DIR="$PROVISIONING_DIR/offline-repo" +OFFLINE_AUTODETECT="$OFFLINE_REPO_DIR/built" +# `build-index.sh` writes to built/. Older tooling in this repository used +# build/, so accept that as a second candidate rather than silently building a +# medium without the package set. +OFFLINE_AUTODETECT_LEGACY="$OFFLINE_REPO_DIR/build" +DEFAULT_DIST="$REPO_ROOT/dist" +MEDIA_PREFIX="/blueforce-provisioning" +FIRSTBOOT_PATH="$MEDIA_PREFIX/firstboot" +ARCH="amd64" +REPRO_STAMP="2024010100000000" + +# Identity and credential patterns that must never reach the media. Written with +# bracket expressions so this scanner cannot match its own source text. +IDENTITY_PATTERN='(BEGIN[[:space:]]+(OPENSSH|RSA|EC|DSA|PGP)[[:space:]]+PRIVATE[[:space:]]+KEY|WG_PRIVATE[[:space:]]+KEY|dealer[-_ ]?id[[:space:]]*[:=][[:space:]]*[0-9]{8}|BF-[0-9]{8}|bf-[0-9]{8})' +CREDENTIAL_PATTERN='(password|passwd|credential|api[_-]?key|access[_-]?token)[[:space:]]*[:=][[:space:]]*[^[:space:]<#]' + +usage() { + cat <<'USAGE' +Usage: build-blueforce-iso.sh --upstream-iso PATH --checksum-file PATH [options] + +Builds the bootable Blueforce Field OS installation medium from a local, SHA256 +verified Ubuntu ISO (Server or Desktop flavour). No image is downloaded. + +Required: + --upstream-iso PATH Local Ubuntu ISO used as the base medium + --checksum-file PATH SHA256SUMS record for that ISO (alias: --checksum) + +Options: + --output PATH ISO path (default: dist/Blueforce-Field-OS--amd64.iso) + --version VERSION Field OS version (default: provisioning/iso/field-os-version) + --offline-repo DIR Built offline APT repository to embed (Packages, Packages.gz, + SHA256SUMS, packages.lock.tsv). Default: auto-detect + provisioning/offline-repo/built, else build without it. + --require-offline-repo Fail closed when no built offline repository is available + --volid LABEL ISO volume label (default: the upstream label, preserved so the + live-media discovery path stays untouched; recorded in the manifest) + --work-dir DIR Scratch directory (default: the output filesystem when it has + room, else $TMPDIR, else /var/tmp; needs about 2x the base ISO) + --keep-work Do not delete the scratch directory (debugging) + --reproducible Ask xorriso for fixed volume and file dates (byte-stable rebuilds) + --allow-remaster Deprecated no-op: this command always performs a real build + --check Validate every precondition, write nothing, exit 0/1 + --help Show this help + +Media layout produced inside the ISO: + /autoinstall.yaml assisted autoinstall (root of the medium) + /blueforce-provisioning/firstboot/ first boot payload (fixed contract path) + /blueforce-provisioning/autoinstall/ NoCloud seed copy of the same configuration + /blueforce-provisioning/offline-repo/ offline APT tooling, manifests and built repo + /blueforce-provisioning/release/ release and media metadata +USAGE +} + +die() { printf 'ERROR: %s\n' "$*" >&2; exit 1; } +ok() { printf 'OK: %s\n' "$*"; } +note() { printf '%s\n' "$*"; } +step() { printf '\n==> %s\n' "$*"; } +warn() { printf 'WARNING: %s\n' "$*" >&2; } + +UPSTREAM="" +CHECKSUM_RECORD="" +OUTPUT="" +OUTPUT_DIR="" +ISO_NAME="" +SHA_FILE="" +MANIFEST="" +VERSION="" +OFFLINE_REPO="" +OFFLINE_MODE="none" +REQUIRE_OFFLINE=0 +VOLID="" +VOLID_SOURCE="upstream-preserved" +CHECK_ONLY=0 +REPRODUCIBLE=0 +KEEP_WORK=0 +OPT_WORK_DIR="" +WORK_DIR="" +WORK_ROOT="" +MEDIA="" +UP_IS_SIZE_KB=0 +BASE_FLAVOR="unknown" +UBUNTU_VERSION="unknown" +UP_VOLID="" +UPSTREAM_SHA256="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --upstream-iso) UPSTREAM="${2:-}"; shift 2 ;; + --checksum|--checksum-file) CHECKSUM_RECORD="${2:-}"; shift 2 ;; + --output) OUTPUT="${2:-}"; shift 2 ;; + --version) VERSION="${2:-}"; shift 2 ;; + --offline-repo) OFFLINE_REPO="${2:-}"; shift 2 ;; + --require-offline-repo) REQUIRE_OFFLINE=1; shift ;; + --volid) VOLID="${2:-}"; VOLID_SOURCE="explicit"; shift 2 ;; + --work-dir) OPT_WORK_DIR="${2:-}"; shift 2 ;; + --keep-work) KEEP_WORK=1; shift ;; + --reproducible) REPRODUCIBLE=1; shift ;; + --allow-remaster) warn "--allow-remaster is deprecated and ignored: this command always builds a real ISO."; shift ;; + --check) CHECK_ONLY=1; shift ;; + --help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +[[ -n "$UPSTREAM" ]] || { printf 'Missing required argument: --upstream-iso\n' >&2; usage >&2; exit 2; } +[[ -n "$CHECKSUM_RECORD" ]] || { printf 'Missing required argument: --checksum-file\n' >&2; usage >&2; exit 2; } + +# ----------------------------------------------------------------- small tools -- + +free_kb() { + df -Pk -- "$1" 2>/dev/null | awk 'NR==2 {print $4}' +} + +existing_ancestor() { + local path="$1" + while [[ ! -d "$path" && "$path" != "/" ]]; do + path="$(dirname "$path")" + done + printf '%s' "$path" +} + +detect_flavor_from_label() { + local label="$1" + case "$label" in + *Server*) printf 'server' ;; + *Desktop*) printf 'desktop' ;; + *[Uu]buntu*) printf 'desktop' ;; + *) printf 'unknown' ;; + esac +} + +version_from_text() { + printf '%s' "$1" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -n 1 || true +} + +base_os_string() { + if [[ "$UBUNTU_VERSION" == "unknown" ]]; then + printf 'Ubuntu %s' "$BASE_FLAVOR" + else + # Title-case the flavour for display only; the machine-readable flavour stays + # in base_flavor, so nothing depends on this cosmetic spelling. + printf 'Ubuntu %s %s LTS' "$(printf '%s' "${BASE_FLAVOR:0:1}" | tr '[:lower:]' '[:upper:]')${BASE_FLAVOR:1}" "$UBUNTU_VERSION" + fi +} + +# ------------------------------------------------------------------ parameters -- + +resolve_parameters() { + if [[ -z "$VERSION" ]]; then + [[ -r "$VERSION_FILE" ]] || die "Field OS version file is missing: $VERSION_FILE (pass --version)" + VERSION="$(tr -d '[:space:]' < "$VERSION_FILE")" + fi + [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){1,3}([-.+][0-9A-Za-z.-]+)?$ ]] \ + || die "Invalid Field OS version '${VERSION}': expected e.g. 1.0.0 or 1.1.0-rc1" + + ISO_NAME="Blueforce-Field-OS-${VERSION}-${ARCH}.iso" + if [[ -z "$OUTPUT" ]]; then + OUTPUT="$DEFAULT_DIST/$ISO_NAME" + elif [[ "$OUTPUT" != /* ]]; then + OUTPUT="$PWD/$OUTPUT" + fi + [[ "$(basename "$OUTPUT")" == *.iso ]] || die "--output must name an .iso file: $OUTPUT" + OUTPUT_DIR="$(dirname "$OUTPUT")" + SHA_FILE="${OUTPUT}.sha256" + MANIFEST="$OUTPUT_DIR/${VERSION}-manifest.yaml" + + case "$(basename "$UPSTREAM")" in + *"${ARCH}"*) : ;; + *i386*|*arm64*|*ppc64el*|*s390x*) die "Only ${ARCH} media is supported; got: $(basename "$UPSTREAM")" ;; + *) warn "Upstream ISO name does not mention ${ARCH}: $(basename "$UPSTREAM")" ;; + esac +} + +require_media_inputs() { + local missing=() file + local -a required=( + "$AUTOINSTALL_DIR/autoinstall.yaml" + "$AUTOINSTALL_DIR/user-data" + "$AUTOINSTALL_DIR/meta-data" + "$FIRSTBOOT_DIR/bf-firstboot" + "$FIRSTBOOT_DIR/blueforce-firstboot.service" + "$RELEASE_DIR/manifest.yaml" + ) + for file in "${required[@]}"; do + [[ -f "$file" ]] || missing+=("${file#"$REPO_ROOT"/}") + done + [[ -d "$OFFLINE_REPO_DIR" ]] || missing+=("${OFFLINE_REPO_DIR#"$REPO_ROOT"/}/") + [[ ${#missing[@]} -eq 0 ]] || die "Required provisioning inputs are missing: ${missing[*]}" + ok "provisioning inputs present (autoinstall, firstboot, offline-repo tooling, release manifest)" +} + +resolve_offline_repo() { + local missing=() marker + if [[ -n "$OFFLINE_REPO" && "$OFFLINE_REPO" != "none" ]]; then + [[ -d "$OFFLINE_REPO" ]] || die "Offline repository directory not found: $OFFLINE_REPO" + elif [[ -z "$OFFLINE_REPO" && -d "$OFFLINE_AUTODETECT" ]]; then + OFFLINE_REPO="$OFFLINE_AUTODETECT" + elif [[ -z "$OFFLINE_REPO" && -d "$OFFLINE_AUTODETECT_LEGACY" ]]; then + OFFLINE_REPO="$OFFLINE_AUTODETECT_LEGACY" + warn "Using the legacy offline repository path ${OFFLINE_AUTODETECT_LEGACY#"$REPO_ROOT"/}; build-index.sh writes to built/ instead." + else + OFFLINE_REPO="" + fi + + if [[ -z "$OFFLINE_REPO" ]]; then + if [[ "$REQUIRE_OFFLINE" -eq 1 ]]; then + die "No built offline APT repository found (looked at ${OFFLINE_AUTODETECT#"$REPO_ROOT"/} and --offline-repo). Build one with provisioning/offline-repo/build-index.sh, then retry." + fi + OFFLINE_MODE="not-included" + warn "No built offline APT repository is embedded: the medium ships the offline tooling and manifests only." + warn "Package installation on the installed system stays OFFLINE BLOCKED until a repository is built and re-embedded." + return + fi + + for marker in Packages Packages.gz SHA256SUMS packages.lock.tsv; do + [[ -f "$OFFLINE_REPO/$marker" ]] || missing+=("$marker") + done + [[ ${#missing[@]} -eq 0 ]] || die "Offline repository $OFFLINE_REPO is incomplete; missing: ${missing[*]}" + OFFLINE_MODE="embedded" + ok "offline APT repository will be embedded: $OFFLINE_REPO" +} + +scan_media_inputs() { + local -a scan_dirs=("$AUTOINSTALL_DIR" "$FIRSTBOOT_DIR" "$RELEASE_DIR" "$OFFLINE_REPO_DIR") + local hits + hits="$(grep -RIlE --exclude='*.md' -- "$IDENTITY_PATTERN" "${scan_dirs[@]}" 2>/dev/null || true)" + [[ -z "$hits" ]] || die "Device identity found in media inputs; refusing to build:"$'\n'"$hits" + hits="$(grep -RIlE --exclude='*.md' -- "$CREDENTIAL_PATTERN" "${scan_dirs[@]}" 2>/dev/null || true)" + [[ -z "$hits" ]] || die "Credential-like value found in media inputs; refusing to build:"$'\n'"$hits" + ok "media inputs carry no device identity, private key or credential" +} + +resolve_work_root() { + local need_kb=$(( UP_IS_SIZE_KB * 2 + 1048576 )) candidate available detail="" + local -a candidates=() + if [[ -n "$OPT_WORK_DIR" ]]; then + candidates=("$OPT_WORK_DIR") + elif [[ "$CHECK_ONLY" -eq 1 ]]; then + # Dry runs create no directories, so judge the filesystem the output will land on. + candidates=("$(existing_ancestor "$OUTPUT_DIR")" "${TMPDIR:-/tmp}" "/var/tmp") + else + # Real builds reuse the output directory, which keeps the scratch tree on the same + # filesystem as the artifact and inside a directory that already has to exist. + install -d "$OUTPUT_DIR" || die "Could not create the output directory: $OUTPUT_DIR" + candidates=("$OUTPUT_DIR" "${TMPDIR:-/tmp}" "/var/tmp") + fi + for candidate in "${candidates[@]}"; do + if [[ ! -d "$candidate" ]]; then + detail+=" ${candidate}: not a directory"$'\n' + continue + fi + available="$(free_kb "$candidate")" + if [[ -n "$available" && "$available" -ge "$need_kb" ]]; then + WORK_ROOT="$candidate" + return 0 + fi + detail+=" ${candidate}: $(( ${available:-0} / 1024 )) MiB free"$'\n' + done + die "Not enough scratch space. This build extracts the base ISO and writes a new one, so it needs about $(( need_kb / 1024 )) MiB free. Checked: +${detail}Pass --work-dir with a directory that has room. Nothing is downloaded to satisfy this." +} + +# ------------------------------------------------------------------- preflight -- + +preflight() { + step "Preconditions" + + [[ -f "$UPSTREAM" ]] || die "Upstream ISO not found: $UPSTREAM" + [[ -s "$UPSTREAM" ]] || die "Upstream ISO is empty: $UPSTREAM" + UP_IS_SIZE_KB=$(( $(stat -c %s -- "$UPSTREAM") / 1024 )) + ok "upstream ISO present: $(basename "$UPSTREAM") ($(( UP_IS_SIZE_KB / 1024 )) MiB)" + [[ -f "$CHECKSUM_RECORD" ]] || die "Checksum record not found: $CHECKSUM_RECORD" + + command -v xorriso >/dev/null 2>&1 \ + || die "xorriso is required to build bootable media and was not found in PATH. Install it (for example: apt-get install xorriso) and retry. Nothing was written." + ok "xorriso available: $(xorriso --version 2>/dev/null | awk 'NR==1 {print $2}')" + + local boot_report + boot_report="$(xorriso -indev "$UPSTREAM" -report_el_torito plain 2>&1)" \ + || die "xorriso cannot read El Torito boot metadata from $(basename "$UPSTREAM"); refusing to build. Nothing was written." + # xorriso exits 0 even when the input is not an ISO at all: it prints + # "No ISO 9660 image at LBA 0" and reports nothing. Combined with a checksum + # record that happens to match, that would let a non-ISO file through the + # preflight, so assert positively that boot metadata was actually produced. + grep -qE 'El Torito boot img' <<<"$boot_report" \ + || die "$(basename "$UPSTREAM") is not usable as an installation ISO: no El Torito boot image was reported. Nothing was written." + grep -qE 'El Torito boot img.*BIOS' <<<"$boot_report" \ + || warn "upstream ISO reports no BIOS El Torito entry; the produced medium may not boot on Legacy BIOS" + grep -qE 'El Torito boot img.*(UEFI|EFI)' <<<"$boot_report" \ + || warn "upstream ISO reports no UEFI El Torito entry; the produced medium may not boot on UEFI" + ok "El Torito boot metadata readable from the upstream ISO" + + UP_VOLID="$(sed -n 's/^Volume id[^:]*:[[:space:]]*//p' <<<"$boot_report" | head -n 1 | tr -d "\"'" || true)" + UP_VOLID="${UP_VOLID:-unknown}" + BASE_FLAVOR="$(detect_flavor_from_label "$UP_VOLID")" + UBUNTU_VERSION="$(version_from_text "$UP_VOLID")" + [[ -n "$UBUNTU_VERSION" ]] || UBUNTU_VERSION="unknown" + ok "base label '${UP_VOLID}' => base_flavor=${BASE_FLAVOR}, ubuntu_version=${UBUNTU_VERSION}" + if [[ "$BASE_FLAVOR" != "server" ]]; then + warn "Base medium is not the documented Server baseline (docs/24 K-01, docs/26)." + warn "The deviation is recorded in the manifest as base_flavor=${BASE_FLAVOR}; a Server ISO can be used with --upstream-iso." + fi + + [[ -n "$VOLID" ]] || VOLID="$UP_VOLID" + [[ "$VOLID" != "unknown" ]] || VOLID="BLUEFORCE_FIELD_OS" + (( ${#VOLID} <= 32 )) || die "Volume label too long for ISO 9660 (max 32 characters): $VOLID" + ok "output volume label: '${VOLID}' (${VOLID_SOURCE})" + + require_media_inputs + resolve_offline_repo + + local -a existing=() + [[ -e "$OUTPUT" ]] && existing+=("$OUTPUT") + [[ -e "$SHA_FILE" ]] && existing+=("$SHA_FILE") + [[ -e "$MANIFEST" ]] && existing+=("$MANIFEST") + [[ ${#existing[@]} -eq 0 ]] || die "Refusing to overwrite existing artifacts: ${existing[*]}" + ok "no existing artifact would be overwritten" + + scan_media_inputs + + local verify_output + if ! verify_output="$("$VERIFY_SCRIPT" --iso "$UPSTREAM" --checksum "$CHECKSUM_RECORD" --check 2>&1)"; then + printf '%s\n' "$verify_output" >&2 + die "Upstream ISO failed SHA256 verification against $CHECKSUM_RECORD" + fi + UPSTREAM_SHA256="$(sha256sum -- "$UPSTREAM" | awk '{print $1}')" + ok "upstream SHA256 recomputed from the real file: $UPSTREAM_SHA256" + + resolve_work_root + ok "scratch directory will be created under: ${WORK_ROOT} (about $(( (UP_IS_SIZE_KB * 2 + 1048576) / 1024 )) MiB required)" + + ok "output contract: $OUTPUT" + ok " ${SHA_FILE}" + ok " ${MANIFEST}" +} + +# -------------------------------------------------------------- boot injection -- + +# Insert the `autoinstall` kernel argument into a boot configuration file without +# damaging the original: the pristine copy is kept on the medium as .blueforce-orig. +# kind=grub -> `linux`/`linuxefi` lines get the argument right after the kernel path, +# ahead of the `---` separator. +# kind=isolinux -> `append` lines get the argument right after the keyword. +# Re-running is idempotent: lines that already request autoinstall are left untouched. +inject_autoinstall_arg() { + local file="$1" kind="$2" out="${1}.blueforce-inject.tmp" line changed=0 + : > "$out" + while IFS= read -r line || [[ -n "$line" ]]; do + if [[ "$kind" == "grub" ]] \ + && [[ "$line" =~ ^([[:space:]]*(linux|linuxefi)[[:space:]]+)([^[:space:]]+)(.*)$ ]] \ + && [[ "$line" != *autoinstall* ]]; then + printf '%s%s autoinstall%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}" >> "$out" + changed=$((changed + 1)) + continue + fi + if [[ "$kind" == "isolinux" ]] \ + && [[ "$line" =~ ^([[:space:]]*(append|APPEND)[[:space:]]+)(.*)$ ]] \ + && [[ "$line" != *autoinstall* ]]; then + printf '%sautoinstall %s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[3]}" >> "$out" + changed=$((changed + 1)) + continue + fi + printf '%s\n' "$line" >> "$out" + done < "$file" + + if [[ "$changed" -gt 0 ]]; then + [[ -e "${file}.blueforce-orig" ]] || cp -p "$file" "${file}.blueforce-orig" + mv "$out" "$file" + else + rm -f "$out" + fi + printf '%d' "$changed" +} + +inject_boot_configuration() { + step "Boot configuration" + local -a grub_files=( + "$MEDIA/boot/grub/grub.cfg" + "$MEDIA/boot/grub/loopback.cfg" + "$MEDIA/EFI/boot/grub.cfg" + ) + local -a isolinux_files=( + "$MEDIA/isolinux/txt.cfg" + "$MEDIA/isolinux/isolinux.cfg" + "$MEDIA/isolinux/gtk.cfg" + ) + local file changed grub_total=0 isolinux_total=0 + for file in "${grub_files[@]}"; do + [[ -f "$file" ]] || continue + changed="$(inject_autoinstall_arg "$file" grub)" + grub_total=$((grub_total + changed)) + ok "GRUB ${file#"$MEDIA"/}: ${changed} kernel line(s) now request autoinstall" + done + for file in "${isolinux_files[@]}"; do + [[ -f "$file" ]] || continue + changed="$(inject_autoinstall_arg "$file" isolinux)" + isolinux_total=$((isolinux_total + changed)) + ok "isolinux ${file#"$MEDIA"/}: ${changed} append line(s) now request autoinstall" + done + + [[ $((grub_total + isolinux_total)) -gt 0 ]] \ + || die "No recognised boot configuration (GRUB or isolinux) was found in the upstream ISO; refusing to write a medium that cannot start the installer." + if [[ "$grub_total" -eq 0 ]]; then + warn "No GRUB configuration was patched: automatic autoinstall start is not prepared for this base ISO." + fi + if [[ "$isolinux_total" -eq 0 ]]; then + note "note: this base ISO carries no isolinux configuration (Legacy BIOS boots through the El Torito GRUB image, which reads the patched GRUB configuration)." + fi +} + +# --------------------------------------------------------------------- staging -- + +write_media_metadata() { + local release_file="$MEDIA$MEDIA_PREFIX/release/blueforce-release" + cat > "$release_file" < "$MEDIA$MEDIA_PREFIX/release/media-info.yaml" <"$WORK_DIR/extract.log" 2>&1; then + tail -n 15 "$WORK_DIR/extract.log" >&2 + die "ISO filesystem extraction failed (log: $WORK_DIR/extract.log)" + fi + chmod -R u+w "$MEDIA" + ok "upstream tree extracted to the scratch directory" + + install -d "$MEDIA$MEDIA_PREFIX/autoinstall" "$MEDIA$MEDIA_PREFIX/firstboot" \ + "$MEDIA$MEDIA_PREFIX/offline-repo" "$MEDIA$MEDIA_PREFIX/release" + + install -m 0644 "$AUTOINSTALL_DIR/autoinstall.yaml" "$MEDIA/autoinstall.yaml" + install -m 0644 "$AUTOINSTALL_DIR/autoinstall.yaml" "$MEDIA$MEDIA_PREFIX/autoinstall/autoinstall.yaml" + install -m 0644 "$AUTOINSTALL_DIR/user-data" "$MEDIA$MEDIA_PREFIX/autoinstall/user-data" + install -m 0644 "$AUTOINSTALL_DIR/meta-data" "$MEDIA$MEDIA_PREFIX/autoinstall/meta-data" + if [[ -f "$AUTOINSTALL_DIR/README.md" ]]; then + install -m 0644 "$AUTOINSTALL_DIR/README.md" "$MEDIA$MEDIA_PREFIX/autoinstall/README.md" + fi + ok "autoinstall configuration placed at /autoinstall.yaml and ${MEDIA_PREFIX}/autoinstall/" + + install -m 0755 "$FIRSTBOOT_DIR/bf-firstboot" "$MEDIA$FIRSTBOOT_PATH/bf-firstboot" + install -m 0644 "$FIRSTBOOT_DIR/blueforce-firstboot.service" "$MEDIA$FIRSTBOOT_PATH/blueforce-firstboot.service" + if [[ -f "$FIRSTBOOT_DIR/README.md" ]]; then + install -m 0644 "$FIRSTBOOT_DIR/README.md" "$MEDIA$FIRSTBOOT_PATH/README.md" + fi + ok "firstboot payload placed at ${FIRSTBOOT_PATH}/" + + cp -a "$OFFLINE_REPO_DIR/." "$MEDIA$MEDIA_PREFIX/offline-repo/" + rm -f "$MEDIA$MEDIA_PREFIX/offline-repo/packages/.gitkeep" + if [[ "$OFFLINE_MODE" == "embedded" ]]; then + install -d "$MEDIA$MEDIA_PREFIX/offline-repo/built" + cp -a "$OFFLINE_REPO/." "$MEDIA$MEDIA_PREFIX/offline-repo/built/" + ok "offline APT repository placed at ${MEDIA_PREFIX}/offline-repo/built/" + else + ok "offline APT tooling and manifests placed at ${MEDIA_PREFIX}/offline-repo/ (no built repository)" + fi + + install -m 0644 "$RELEASE_DIR/manifest.yaml" "$MEDIA$MEDIA_PREFIX/release/manifest.yaml" + write_media_metadata + chmod -R a+rX "$MEDIA$MEDIA_PREFIX" +} + +# --------------------------------------------------------------------- ISO out -- + +# Rebuild the boot structure from the base ISO's own layout. +# +# Why this is not `-boot_image any replay`: +# Ubuntu live ISOs carry boot information in two places that a replay cannot +# re-establish, because neither is a data file inside the ISO9660 tree: +# 1. the GRUB2 MBR boot code lives in the first 16 sectors of the *source +# image*, and +# 2. the EFI system partition is an APPENDED PARTITION, i.e. a byte range of +# the source image. +# Replaying them fails with: +# "Cannot enable EL Torito boot image #1 because it is not a data file in +# the ISO filesystem" +# "Cannot refer by GRUB2 MBR to data outside of ISO 9660 filesystem" +# +# `xorriso -report_el_torito as_mkisofs` emits the exact option set that +# reconstructs the layout, so it is read from the base ISO at build time rather +# than hard-coded. That keeps Server and Desktop flavours, and future ISO +# revisions, working without editing this script. +read_boot_layout_options() { + local lines="$WORK_DIR/boot-layout.lines" tokens="$1" + xorriso -indev "$UPSTREAM" -report_el_torito as_mkisofs >"$WORK_DIR/boot-layout.raw" 2>/dev/null || true + + # Step 1: keep the mkisofs option lines only, and drop the options this script + # owns. + # + # `--modification-date` must be dropped: xorriso translates it into its own + # `-volume_date uuid`, which then rejects the value as "not an ECMA-119 time + # string". This script controls the date itself. + # + # Nothing else is rewritten. The `--interval:local_fs:...` operands inside + # `--grub2-mbr` and `-append_partition` already name the base ISO with the very + # path this build passed to xorriso, so they are used verbatim. Rewriting them + # (e.g. via sed or an extra gsub) reorders the interval fields and xorriso then + # fails with "Number text too short or too long in interval reader description + # string". If a future build ever reads and writes the base ISO under different + # paths, that rewrite has to replace the path operand in place, not prefix it. + awk ' + /^-/ { + if ($0 ~ /^-V / || $0 == "-V" || $0 ~ /^-o / || $0 == "-o" || $0 ~ /^--modification-date[= ]/) next + print + } + ' "$WORK_DIR/boot-layout.raw" >"$lines" + + # Step 2: split each line into individual arguments. + # + # as_mkisofs quotes values that contain spaces or commas, and those quoted + # values must reach xorriso as ONE argument. Emitting one option per line and + # relying on the shell to strip the quotes does not work: the option and its + # value collapse into a single argument, and xorriso then reports + # "Unrecognized option '--grub2-mbr --interval:...'". + # So tokenise here: honour quotes while splitting, then drop the quote + # characters, and emit one argument per line for mapfile to collect. + awk ' + { + line = $0; n = length(line); i = 1; token = ""; inq = 0 + while (i <= n) { + c = substr(line, i, 1) + if (c == "'"'"'") { inq = !inq; i++; continue } + if (!inq && (c == " " || c == "\t")) { + if (token != "") { print token; token = "" } + i++; continue + } + token = token c; i++ + } + if (token != "") print token + } + ' "$lines" >"$tokens" + + grep -q -- '-append_partition' "$tokens" || return 1 + return 0 +} + +assemble_iso() { + step "Writing the ISO" + # The boot layout comes from the base ISO itself; see read_boot_layout_options. + if ! read_boot_layout_options "$WORK_DIR/boot-layout.opts"; then + die "could not read a usable boot layout from $(basename "$UPSTREAM"); refusing to write a medium that may not boot." + fi + + local -a boot_opts=() + while IFS= read -r line; do + [[ -n "$line" ]] && boot_opts+=("$line") + done <"$WORK_DIR/boot-layout.opts" + step "Boot layout: ${#boot_opts[@]} option line(s) replayed from the base ISO" + + local -a cmd=(xorriso -as mkisofs) + cmd+=(-V "$VOLID") + if [[ "$REPRODUCIBLE" -eq 1 ]]; then + # -as mkisofs does not know xorriso's -volume_date; the mkisofs-compatible + # spelling is --modification-date=. + # File mtimes come from the extracted base ISO plus the files this script + # installs, and are already stable for identical inputs; --reproducible only + # has to pin the volume-level dates for a byte-stable rebuild. + cmd+=("--modification-date=$REPRO_STAMP") + fi + cmd+=("${boot_opts[@]}" -o "$OUTPUT" "$MEDIA") + + # Diagnostic: record the exact argv before running it. This is what settles + # "the file looks right but xorriso still rejects an option" reports. + local -a trace_cmd=() + if [[ "${BF_ISO_TRACE:-0}" == "1" ]]; then + { printf 'argv:'; printf ' %q' "${cmd[@]}"; printf '\n'; } >"$WORK_DIR/assemble-argv.txt" + fi + + if ! "${cmd[@]}" >"$WORK_DIR/assemble.log" 2>&1; then + tail -n 20 "$WORK_DIR/assemble.log" >&2 + [[ -s "$WORK_DIR/assemble-argv.txt" ]] && cat "$WORK_DIR/assemble-argv.txt" >&2 + rm -f "$OUTPUT" + die "xorriso failed to write the output ISO; the incomplete file was removed." + fi + [[ -s "$OUTPUT" ]] || { rm -f "$OUTPUT"; die "xorriso reported success but produced no data."; } + ok "ISO written: $OUTPUT ($(( $(stat -c %s -- "$OUTPUT") / 1024 / 1024 )) MiB)" +} + +extract_from_iso() { + local iso_path="$1" dest="$2" + rm -f "$dest" + xorriso -osirrox on -indev "$OUTPUT" -extract "$iso_path" "$dest" >/dev/null 2>&1 + [[ -f "$dest" ]] +} + +verify_output_iso() { + step "Verifying the produced medium" + local check_dir="$WORK_DIR/verify" + install -d "$check_dir" + + xorriso -indev "$OUTPUT" -report_el_torito plain > "$WORK_DIR/boot-report.txt" 2>&1 || true + grep -qE 'El Torito boot img.*BIOS' "$WORK_DIR/boot-report.txt" \ + || { rm -f "$OUTPUT"; die "produced ISO lost its BIOS El Torito entry; the broken output was removed."; } + grep -qE 'El Torito boot img.*(UEFI|EFI)' "$WORK_DIR/boot-report.txt" \ + || { rm -f "$OUTPUT"; die "produced ISO lost its UEFI El Torito entry; the broken output was removed."; } + grep -qF "Volume id : '$VOLID'" "$WORK_DIR/boot-report.txt" \ + || warn "produced ISO reports a different volume label than requested (${VOLID})" + ok "El Torito boot entries preserved (BIOS + UEFI) and readable by xorriso" + + extract_from_iso /autoinstall.yaml "$check_dir/autoinstall.yaml" \ + || { rm -f "$OUTPUT"; die "the produced ISO has no /autoinstall.yaml at the medium root."; } + grep -q 'interactive-sections: \[storage\]' "$check_dir/autoinstall.yaml" \ + || { rm -f "$OUTPUT"; die "medium autoinstall lost 'interactive-sections: [storage]'; the broken output was removed."; } + grep -q 'offline-install' "$check_dir/autoinstall.yaml" \ + || { rm -f "$OUTPUT"; die "medium autoinstall is missing the offline-install apt fallback."; } + grep -q "$MEDIA_PREFIX/firstboot" "$check_dir/autoinstall.yaml" \ + || { rm -f "$OUTPUT"; die "medium autoinstall does not place the firstboot payload from ${FIRSTBOOT_PATH}/."; } + grep -q 'blueforce-firstboot.service' "$check_dir/autoinstall.yaml" \ + || { rm -f "$OUTPUT"; die "medium autoinstall does not enable blueforce-firstboot.service."; } + ok "medium root /autoinstall.yaml verified (interactive storage, offline-install fallback, firstboot late-commands)" + + extract_from_iso /boot/grub/grub.cfg "$check_dir/grub.cfg" \ + || { rm -f "$OUTPUT"; die "the produced ISO has no /boot/grub/grub.cfg; the broken output was removed."; } + grep -q 'autoinstall' "$check_dir/grub.cfg" \ + || { rm -f "$OUTPUT"; die "the medium GRUB configuration does not start autoinstall; the broken output was removed."; } + ok "medium GRUB configuration requests autoinstall on boot" + if extract_from_iso /boot/grub/grub.cfg.blueforce-orig "$check_dir/grub.cfg.orig"; then + ok "pristine GRUB configuration kept on the medium as grub.cfg.blueforce-orig" + fi + + local -a expected=( + "$MEDIA_PREFIX/firstboot/bf-firstboot" + "$MEDIA_PREFIX/firstboot/blueforce-firstboot.service" + "$MEDIA_PREFIX/release/blueforce-release" + "$MEDIA_PREFIX/release/media-info.yaml" + "$MEDIA_PREFIX/release/manifest.yaml" + "$MEDIA_PREFIX/offline-repo/manifests/base-packages.txt" + ) + local relative + for relative in "${expected[@]}"; do + extract_from_iso "$relative" "$check_dir/payload" \ + || { rm -f "$OUTPUT"; die "the produced ISO is missing ${relative}; the broken output was removed."; } + done + ok "firstboot, release and offline-repo payloads present in the produced ISO" + + if [[ "$OFFLINE_MODE" == "embedded" ]]; then + extract_from_iso "$MEDIA_PREFIX/offline-repo/built/Packages" "$check_dir/Packages" \ + || { rm -f "$OUTPUT"; die "the offline APT index is missing from the produced ISO."; } + ok "offline APT repository index present in the produced ISO" + fi +} + +# ------------------------------------------------------------------ artifacts -- + +package_version_from_offline_repo() { + local lock="" value name + [[ "$OFFLINE_MODE" == "embedded" ]] && lock="$OFFLINE_REPO/packages.lock.tsv" + if [[ -z "$lock" || ! -f "$lock" ]]; then + printf 'unknown' + return + fi + for name in "$@"; do + value="$(awk -F'\t' -v p="$name" 'NR > 1 && $1 == p {print $2; exit}' "$lock" | head -n 1 || true)" + if [[ -n "$value" ]]; then + printf '%s' "$value" + return + fi + done + printf 'unknown' +} + +package_version_by_pattern() { + local pattern="$1" lock="" value + if [[ "$OFFLINE_MODE" != "embedded" ]]; then + printf 'unknown' + return + fi + lock="$OFFLINE_REPO/packages.lock.tsv" + [[ -f "$lock" ]] || { printf 'unknown'; return; } + value="$(awk -F'\t' -v pat="$pattern" 'NR > 1 && $1 ~ pat {print $2; exit}' "$lock" | head -n 1 || true)" + printf '%s' "${value:-unknown}" +} + +write_dist_artifacts() { + step "Checksums and manifest" + local iso_sha256 build_date git_commit git_state + iso_sha256="$(sha256sum -- "$OUTPUT" | awk '{print $1}')" + printf '%s %s\n' "$iso_sha256" "$(basename "$OUTPUT")" > "$SHA_FILE" + ok "checksum written: $SHA_FILE" + + build_date="$(date -u +%Y-%m-%dT%H:%M:%SZ)" + git_commit="$(git -C "$REPO_ROOT" rev-parse --short HEAD 2>/dev/null || true)" + git_commit="${git_commit:-unknown}" + # Distinguish "clean", "dirty" and "cannot tell". If git is unavailable or the + # tree is not a repository, the status command fails and the previous form would + # silently report "clean" - a claim the build has no evidence for. + if ! git -C "$REPO_ROOT" rev-parse --git-dir >/dev/null 2>&1; then + git_state="unknown" + elif [[ -n "$(git -C "$REPO_ROOT" status --porcelain 2>/dev/null | head -n 1 || true)" ]]; then + git_state="dirty-worktree" + else + git_state="clean" + fi + + local rustdesk_pkg docker_pkg xrdp_pkg wireguard_pkg meg_pkg installer_pkg packages_source + rustdesk_pkg="$(package_version_by_pattern '^(rustdesk|rustdesk-server)$')" + docker_pkg="$(package_version_from_offline_repo docker-ce docker.io docker)" + xrdp_pkg="$(package_version_from_offline_repo xrdp xorgxrdp gnome-session)" + wireguard_pkg="$(package_version_from_offline_repo wireguard wireguard-tools)" + meg_pkg="$(package_version_by_pattern '^meg')" + installer_pkg="$(package_version_by_pattern '^blueforce-installer')" + if [[ "$OFFLINE_MODE" == "embedded" ]]; then + packages_source="embedded offline APT lock file (packages.lock.tsv)" + else + packages_source="no built offline repository was embedded; every package version is reported as unknown on purpose" + fi + + { + printf 'schema_version: 1\n' + printf 'field_os_version: "%s"\n' "$VERSION" + printf 'base_os: "%s"\n' "$(base_os_string)" + printf 'base_flavor: "%s"\n' "$BASE_FLAVOR" + printf 'base_iso_filename: "%s"\n' "$(basename "$UPSTREAM")" + printf 'ubuntu_version: "%s"\n' "$UBUNTU_VERSION" + printf 'ubuntu_iso_sha256: "%s"\n' "$UPSTREAM_SHA256" + printf 'git_commit: "%s"\n' "$git_commit" + printf 'git_worktree: "%s"\n' "$git_state" + printf 'build_date: "%s"\n' "$build_date" + printf 'architecture: "%s"\n' "$ARCH" + printf 'iso_volid: "%s"\n' "$VOLID" + printf 'iso_filename: "%s"\n' "$(basename "$OUTPUT")" + printf 'iso_sha256: "%s"\n' "$iso_sha256" + printf 'release_status: "lab-artifact"\n' + printf 'packages:\n' + printf ' rustdesk: "%s"\n' "$rustdesk_pkg" + printf ' docker: "%s"\n' "$docker_pkg" + printf ' xrdp: "%s"\n' "$xrdp_pkg" + printf ' wireguard: "%s"\n' "$wireguard_pkg" + printf ' meg_package_version: "%s"\n' "$meg_pkg" + printf ' blueforce_installer_version: "%s"\n' "$installer_pkg" + printf 'packages_source: "%s"\n' "$packages_source" + printf 'media:\n' + printf ' autoinstall_config: "/autoinstall.yaml"\n' + printf ' interactive_sections: [storage]\n' + printf ' apt_fallback: "offline-install"\n' + printf ' firstboot_path: "%s/"\n' "$FIRSTBOOT_PATH" + printf ' offline_repo_status: "%s"\n' "$OFFLINE_MODE" + printf ' boot: "El Torito BIOS + UEFI rebuilt from the base ISO boot layout; autoinstall requested on every kernel line"\n' + printf ' checksum_record: "%s"\n' "$(basename "$CHECKSUM_RECORD")" + printf 'safety:\n' + printf ' device_identity_embedded: false\n' + printf ' automatic_disk_wipe: false\n' + printf ' identity_collection_point: "firstboot (dealer ID is entered on the installed system)"\n' + if [[ "$BASE_FLAVOR" != "server" ]]; then + printf 'baseline_deviation:\n' + printf ' documented_baseline: "Ubuntu Server 26.04.1+ LTS (docs/24 K-01, docs/26, docs/32)"\n' + printf ' built_base: "%s"\n' "$(base_os_string)" + printf ' reason: "The only checksum-verified installation medium available on this build host is the %s ISO, and builds must not download another image."\n' "$BASE_FLAVOR" + printf ' impact: "Desktop media already ships GNOME, so the GNOME desktop layer needs no extra installation step on the target. Server media stays supported through --upstream-iso."\n' + printf ' decision_needed: "Accept the Desktop-based baseline for LAB, or rebuild against a Server ISO before production use."\n' + printf ' lab_required: true\n' + else + printf 'baseline_deviation: none\n' + fi + printf 'notes:\n' + printf ' - "The build date lives in this manifest only; the ISO itself carries no build timestamp."\n' + printf ' - "Boot acceptance (UEFI, Legacy BIOS, Secure Boot) and the autoinstall path on this flavour are LAB work; this artifact is not a production release."\n' + printf ' - "Device identity, dealer ID, private keys and passwords are never embedded; identity is collected at firstboot."\n' + } > "$MANIFEST" + ok "manifest written: $MANIFEST" +} + +print_summary() { + step "Done" + note "Field OS version : $VERSION" + note "Base medium : $(base_os_string) [base_flavor=${BASE_FLAVOR}]" + note "Base ISO SHA256 : $UPSTREAM_SHA256" + note "ISO : $OUTPUT" + note "ISO checksum : $SHA_FILE" + note "Manifest : $MANIFEST" + note "Offline repo : $OFFLINE_MODE" + note "" + note "The medium boots into an operator-assisted install: storage stays interactive and" + note "device identity is entered at firstboot. UEFI/BIOS boot acceptance is still a LAB step." +} + +main() { + resolve_parameters + preflight + if [[ "$CHECK_ONLY" -eq 1 ]]; then + step "Check passed" + note "All preconditions for $ISO_NAME are satisfied. Nothing was written." + exit 0 + fi + + WORK_DIR="$(mktemp -d "$WORK_ROOT/blueforce-iso.XXXXXX")" || die "Could not create a scratch directory under $WORK_ROOT" + cleanup() { + if [[ "$KEEP_WORK" -eq 1 ]]; then + printf 'Scratch directory kept: %s\n' "$WORK_DIR" + else + rm -rf -- "$WORK_DIR" + fi + } + trap cleanup EXIT + + prepare_media + inject_boot_configuration + assemble_iso + verify_output_iso + write_dist_artifacts + print_summary +} + +main "$@" + + + +# Blueforce Field OS - offline APT deposu künyesi (repository record) +# +# Bu dosyayı provisioning/offline-repo/build-index.sh üretir; elle düzenlemeyin. +# Depoda hangi Ubuntu sürümü, hangi mimari ve hangi paketlerin bulunduğunu +# kanıtlar. Kurucu bu dosyayı okumaz; denetim ve yeniden üretim içindir. +# +# Yol: provisioning/offline-repo/built/ -> hedef cihazda /opt/blueforce/offline-repo +schema_version: 1 +description: "Offline APT deposunun künyesi" +repository: + name: 'blueforce-offline-apt' + format: 'apt-deb' + state: 'BUILT' + ubuntu_release: '26.04' + architecture: 'amd64' + generated_at: '2026-09-16T18:55:57Z' + generated_by: 'provisioning/offline-repo/build-index.sh' + package_count: 1321 + total_bytes: 927393560 + total_size: '884.4 MiB' + pool: 'pool/' + bundle_dir: 'provisioning/offline-repo/built' + install_path: '/opt/blueforce/offline-repo' + consumer: 'scripts/install/blueforce-install.sh --offline' + index_files: + - 'Packages' + - 'Packages.gz' + - 'packages.lock.tsv' + - 'SHA256SUMS' + index_sha256: + Packages: 'e608222b648a07f0223e0dde07b62f3e67e52620de5ee7ab786fc23093fe7cac' + Packages.gz: '9253dabe3c6e547176acebec84512024b392f55f5f556fb8b523f7553e8341c0' + packages.lock.tsv: 'd2846fefb7961ebed6a8156fa6a4c1abcc6b5d5aa4f9ba4afad01915b50a905d' + manifests: + - 'base-packages.txt' + - 'docker.txt' + - 'remote-access.txt' + pinned_packages: 33 +packages: + - package: '3cpio' + version: '0.14.0-1ubuntu1' + architecture: 'amd64' + sha256: 'f5c5134cfde8015c24a511b1f3087af7387280ddf009e0d83e92676bf8b9c4ac' + size_bytes: 285342 + source: '3cpio_0.14.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'accountsservice' + version: '23.13.9-8ubuntu5.2' + architecture: 'amd64' + sha256: 'f4aa92d98b523787aab1582487b7099448cd01ad56cabdbb596f3ea20f09d072' + size_bytes: 72650 + source: 'accountsservice_23.13.9-8ubuntu5.2_amd64.deb' + pinned_in: [] + - package: 'acl' + version: '2.3.2-2' + architecture: 'amd64' + sha256: '74bb8008be63c1deb1cd9e9ebde8189a762962a6cc4e0a36d4943380ed46a15f' + size_bytes: 39366 + source: 'acl_2.3.2-2_amd64.deb' + pinned_in: [] + - package: 'adwaita-icon-theme' + version: '50.0-1' + architecture: 'all' + sha256: 'db9f11a94f993de589e7d8879664cb371eb8aefc8a2bce100d923951e4ef30c8' + size_bytes: 580384 + source: 'adwaita-icon-theme_50.0-1_all.deb' + pinned_in: [] + - package: 'alsa-base' + version: '1.0.25+dfsg-0ubuntu9' + architecture: 'all' + sha256: 'e8eabd601da99025d1c1e3cbff5dea11d9ec3792dd18485ef957e486d21eb679' + size_bytes: 144288 + source: 'alsa-base_1.0.25+dfsg-0ubuntu9_all.deb' + pinned_in: [] + - package: 'alsa-topology-conf' + version: '1.2.5.1-3build1' + architecture: 'all' + sha256: 'bbc3fc573a85d8dfbc30f83c5ee709f76963bb72a96d10943dc149ce1fdf8074' + size_bytes: 15646 + source: 'alsa-topology-conf_1.2.5.1-3build1_all.deb' + pinned_in: [] + - package: 'alsa-ucm-conf' + version: '1.2.15.3-1ubuntu1.5' + architecture: 'all' + sha256: 'a086022cda58b905cab9a0b8d9be50bab1e2f854724b874f44862cdf00f15f5d' + size_bytes: 106020 + source: 'alsa-ucm-conf_1.2.15.3-1ubuntu1.5_all.deb' + pinned_in: [] + - package: 'alsa-utils' + version: '1.2.15.2-1ubuntu1' + architecture: 'amd64' + sha256: 'd24c8b4b7155fe184873a808482f317c23fa8858e36cf9712235c9accdd43884' + size_bytes: 1217576 + source: 'alsa-utils_1.2.15.2-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'anacron' + version: '2.3-45ubuntu1' + architecture: 'amd64' + sha256: '243d09f952b9d9d83f0717e1ad2b41436e99b4352e79eb94d791483740e05189' + size_bytes: 29528 + source: 'anacron_2.3-45ubuntu1_amd64.deb' + pinned_in: [] + - package: 'apparmor' + version: '5.0.2-0ubuntu1~26.04.1' + architecture: 'amd64' + sha256: '8621170a44534ef32ab4f7e26a5cacabb2077a5a95bcb5236c0652f118032820' + size_bytes: 379516 + source: 'apparmor_5.0.2-0ubuntu1~26.04.1_amd64.deb' + pinned_in: [] + - package: 'apport' + version: '2.34.1-0ubuntu0.1' + architecture: 'all' + sha256: 'f9daec86d175e75040b9723fad22ce54d1ccec9d0a00829ab3e8a7f4add603a9' + size_bytes: 83878 + source: 'apport_2.34.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'apport-core-dump-handler' + version: '2.34.1-0ubuntu0.1' + architecture: 'all' + sha256: '7a52cb6a63084a6bc4b3cbdcb966323027209dbe62ff868c4235713aae96104c' + size_bytes: 9674 + source: 'apport-core-dump-handler_2.34.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'apport-gtk' + version: '2.34.1-0ubuntu0.1' + architecture: 'all' + sha256: '38cd5d6f4a1fe3f77b517ee32f06a0fd10c140fb1f8ca65e664aca023179d9d2' + size_bytes: 9852 + source: 'apport-gtk_2.34.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'apport-symptoms' + version: '0.25build1' + architecture: 'all' + sha256: '4d84a8ade9b48c128e53cfd871a254104b4d0c443837642a6bf5817f5b8f77ba' + size_bytes: 13038 + source: 'apport-symptoms_0.25build1_all.deb' + pinned_in: [] + - package: 'appstream' + version: '1.1.2-1' + architecture: 'amd64' + sha256: 'a4b97af1709a6809619afeb18b73a15100e70b0683544027ca1ba8f0655b8643' + size_bytes: 72440 + source: 'appstream_1.1.2-1_amd64.deb' + pinned_in: [] + - package: 'apt-config-icons' + version: '1.1.2-1' + architecture: 'all' + sha256: '4c8fdfa01d54c5b58d4d0aee2ba4cf54b261b88b9b834ae6d369b41cc06cb7a0' + size_bytes: 4328 + source: 'apt-config-icons_1.1.2-1_all.deb' + pinned_in: [] + - package: 'apt-config-icons-hidpi' + version: '1.1.2-1' + architecture: 'all' + sha256: '90d3b2b81892c79e3b3d7ee5fbf6cfccdb38cf9559354ed6b2d438bf537350a9' + size_bytes: 4252 + source: 'apt-config-icons-hidpi_1.1.2-1_all.deb' + pinned_in: [] + - package: 'apt-transport-https' + version: '3.2.0' + architecture: 'all' + sha256: '1b87f0d3826ddecffd7c584332abc779696855a5c7da114a1778e988e4e664ea' + size_bytes: 3928 + source: 'apt-transport-https_3.2.0_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'aptdaemon' + version: '2.0.2build1' + architecture: 'all' + sha256: 'f61792620f6b4a59f7ae66cbde2e60aa2e1e43f80acb2d603e1764de851959d7' + size_bytes: 12394 + source: 'aptdaemon_2.0.2build1_all.deb' + pinned_in: [] + - package: 'aptdaemon-data' + version: '2.0.2build1' + architecture: 'all' + sha256: '470cc371c84a8d305387c4fe9ea02ce41cffb2a483b947c056a47198d87040b3' + size_bytes: 179964 + source: 'aptdaemon-data_2.0.2build1_all.deb' + pinned_in: [] + - package: 'aspell' + version: '0.60.8.2-3' + architecture: 'amd64' + sha256: 'fc682bc1080e5ceb6ca1e620e817d009bf37d5acae9077cbb834af2d594a6a45' + size_bytes: 89708 + source: 'aspell_0.60.8.2-3_amd64.deb' + pinned_in: [] + - package: 'aspell-en' + version: '2020.12.07-0-1.1build1' + architecture: 'all' + sha256: '02e624fc2537d0268330b214039941ff4a41116c89c99b11f7f43110f7bf33ff' + size_bytes: 303032 + source: 'aspell-en_2020.12.07-0-1.1build1_all.deb' + pinned_in: [] + - package: 'at-spi2-common' + version: '2.60.4-0ubuntu0.1' + architecture: 'all' + sha256: '2ed4e9bf31e9d76c65ec60c79dcdde5be27979b67d7c5e1a8b7d32cc97c82c41' + size_bytes: 6604 + source: 'at-spi2-common_2.60.4-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'at-spi2-core' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: '8de8d211ef7f517bb2182cf50bd25d36bfce546030f30519ebdfd230612cb209' + size_bytes: 59560 + source: 'at-spi2-core_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'avahi-daemon' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: '2ee0d3765a2bc7eba82fdb4fe9a1e3d37d4b795276cd9001bdb33d59458d4b40' + size_bytes: 64024 + source: 'avahi-daemon_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'baobab' + version: '49.1-2' + architecture: 'amd64' + sha256: '6330bfc7d5b90188e5194f61bb2dd2a1bfef95828347701892b889821f5778e7' + size_bytes: 137630 + source: 'baobab_49.1-2_amd64.deb' + pinned_in: [] + - package: 'bc' + version: '1.07.1-4build1' + architecture: 'amd64' + sha256: 'cbc2e84d1f5dfe8debebebf24869988b8cf12151de5a66cce298d3f370dfe919' + size_bytes: 86458 + source: 'bc_1.07.1-4build1_amd64.deb' + pinned_in: [] + - package: 'bind9-dnsutils' + version: '1:9.20.24-1ubuntu0.3' + architecture: 'amd64' + sha256: 'e149f6d40e29b4915b237aed92ba972c6c5ff565a056066e7fd5d20204cca832' + size_bytes: 163510 + source: 'bind9-dnsutils_1%3a9.20.24-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'bind9-host' + version: '1:9.20.24-1ubuntu0.3' + architecture: 'amd64' + sha256: '0506d3148a63e5fd2ca3df54a6024fb275d4cdc179f431afd89afbcc3d201910' + size_bytes: 49658 + source: 'bind9-host_1%3a9.20.24-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'bind9-libs' + version: '1:9.20.24-1ubuntu0.3' + architecture: 'amd64' + sha256: '7b0826714aea9c412452d0e7c310218e0dd6114e763fc6f1b9e90d1091dd3547' + size_bytes: 1312808 + source: 'bind9-libs_1%3a9.20.24-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'binutils' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: 'd14fc7bf644b495083f77c99ff168f1a2215c8b3b7ad5202e0345dc1092002b0' + size_bytes: 224544 + source: 'binutils_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'binutils-common' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '3c846f001d87b16e5038a3919ca975276808a2db17459308a9d0f965c1cddac5' + size_bytes: 221612 + source: 'binutils-common_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'binutils-x86-64-linux-gnu' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '91fa094c31783f7ccf0f0df8ed06447655c40476ba61fc95dbd245a313f8171e' + size_bytes: 1150176 + source: 'binutils-x86-64-linux-gnu_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'bluez' + version: '5.85-4ubuntu0.2' + architecture: 'amd64' + sha256: '3d10739644e47a795ca5605b8693f9821b0812c28daf95b11aa2d1f12d567d08' + size_bytes: 1550492 + source: 'bluez_5.85-4ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'bluez-cups' + version: '5.85-4ubuntu0.2' + architecture: 'amd64' + sha256: '9204262033d802191aecee9f47c3d970c7147ea846bbd22f609c0793ce51ab7a' + size_bytes: 27846 + source: 'bluez-cups_5.85-4ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'bluez-obexd' + version: '5.85-4ubuntu0.2' + architecture: 'amd64' + sha256: '287ddfddf6074fb4dd4586e474bec54d7cccebc77dd2933b193dfcd125cbf1d3' + size_bytes: 243752 + source: 'bluez-obexd_5.85-4ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'bolt' + version: '0.9.10-1' + architecture: 'amd64' + sha256: '2a91d14abab644e9bb7f0250459e6f5b5c75b109b9244cd12282c753a5d42c1f' + size_bytes: 142144 + source: 'bolt_0.9.10-1_amd64.deb' + pinned_in: [] + - package: 'brltty' + version: '6.7-1ubuntu6' + architecture: 'amd64' + sha256: '81b7adffacea9ecf86cab24b66fd0b2bc0f7272106afa285c4b6e3f8891c45d8' + size_bytes: 1654728 + source: 'brltty_6.7-1ubuntu6_amd64.deb' + pinned_in: [] + - package: 'bsdextrautils' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: 'a711db104cbae55b4b4bdbc646111b819164446c6762826d8a39983635729603' + size_bytes: 86650 + source: 'bsdextrautils_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'bubblewrap' + version: '0.11.1-1ubuntu0.1' + architecture: 'amd64' + sha256: 'b353088d1003adb3f760deeccfb84c47928a36c8dc102bf680efc94eb19f4408' + size_bytes: 50806 + source: 'bubblewrap_0.11.1-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'busybox-initramfs' + version: '1:1.37.0-7ubuntu1' + architecture: 'amd64' + sha256: 'ce2e5af197a7e16931a32470beec9750e6f6c3cb1b1572c936aec0638a6503a2' + size_bytes: 190892 + source: 'busybox-initramfs_1%3a1.37.0-7ubuntu1_amd64.deb' + pinned_in: [] + - package: 'busybox-static' + version: '1:1.37.0-7ubuntu1' + architecture: 'amd64' + sha256: 'fd605342f62268753076aa7d9321ff098b36ba53e47434145a9aedc28fd141a4' + size_bytes: 1033568 + source: 'busybox-static_1%3a1.37.0-7ubuntu1_amd64.deb' + pinned_in: [] + - package: 'ca-certificates' + version: '20260601~26.04.1' + architecture: 'all' + sha256: '6077d27c6b6f8b23590cb01ff877ed8c804a67a5442cc32b5a33da10d2bd0e90' + size_bytes: 138514 + source: 'ca-certificates_20260601~26.04.1_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'cloud-guest-utils' + version: '0.33-1build1' + architecture: 'all' + sha256: '23041599f546279bb1fda510cb1154e2f8892444d38be39da9a03289b2bb43b8' + size_bytes: 18670 + source: 'cloud-guest-utils_0.33-1build1_all.deb' + pinned_in: [] + - package: 'cloud-init' + version: '26.1-0ubuntu3~26.04.1' + architecture: 'all' + sha256: 'a9a6115ee0ff0c4e04997f7dccc23a4aec4545cd25c39fcfac527224cf040bba' + size_bytes: 2110 + source: 'cloud-init_26.1-0ubuntu3~26.04.1_all.deb' + pinned_in: [] + - package: 'cloud-init-base' + version: '26.1-0ubuntu3~26.04.1' + architecture: 'all' + sha256: '1ea9b30278090bff9eab18641397ef6d097a286c3ae9e9348759f256b3d91629' + size_bytes: 587498 + source: 'cloud-init-base_26.1-0ubuntu3~26.04.1_all.deb' + pinned_in: [] + - package: 'colord' + version: '1.4.8-3' + architecture: 'amd64' + sha256: '0bd99a498f6030db7fb85a1cd7e0bf100615dcab2ba6c0c1c4f231279fc68756' + size_bytes: 219688 + source: 'colord_1.4.8-3_amd64.deb' + pinned_in: [] + - package: 'colord-data' + version: '1.4.8-3' + architecture: 'all' + sha256: 'ad714cd24a4a30a1e3dd262b002648a1b9deca08008cd3574b7a42e34a51589f' + size_bytes: 1255772 + source: 'colord-data_1.4.8-3_all.deb' + pinned_in: [] + - package: 'console-setup' + version: '1.237ubuntu3.1' + architecture: 'all' + sha256: '220b7317f878d2099c7911657fa98507a89ca47bad3c76ae34239b9fda149cf4' + size_bytes: 102654 + source: 'console-setup_1.237ubuntu3.1_all.deb' + pinned_in: [] + - package: 'console-setup-linux' + version: '1.237ubuntu3.1' + architecture: 'all' + sha256: '18f100eb0e3baf792e2c091e00276a3c65e507c15306aebd8d71b09ba1d3804e' + size_bytes: 6206020 + source: 'console-setup-linux_1.237ubuntu3.1_all.deb' + pinned_in: [] + - package: 'containerd.io' + version: '2.3.5-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: 'a5988582d779e62dd968a1f2312ff8cd25670c185ebf94e4e5331ad1dcc1c287' + size_bytes: 22409096 + source: 'containerd.io_2.3.5-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: ['docker.txt'] + - package: 'cpp' + version: '4:15.2.0-5ubuntu1' + architecture: 'amd64' + sha256: '05a64873a18fb10d52ba2c8ee1fd0a605a974d75264d824ef2771c799f49ea63' + size_bytes: 22420 + source: 'cpp_4%3a15.2.0-5ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cpp-15' + version: '15.2.0-16ubuntu1' + architecture: 'amd64' + sha256: 'baacc9086e17c8cadc3603365e660f907bca483de4446e56e6f1bc25da4c02be' + size_bytes: 1030 + source: 'cpp-15_15.2.0-16ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cpp-15-x86-64-linux-gnu' + version: '15.2.0-16ubuntu1' + architecture: 'amd64' + sha256: '1649aa71c45b047feda5b9ca303c94799bdba5befa5c9de9735cbfc59c3ef93f' + size_bytes: 12899858 + source: 'cpp-15-x86-64-linux-gnu_15.2.0-16ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cpp-x86-64-linux-gnu' + version: '4:15.2.0-5ubuntu1' + architecture: 'amd64' + sha256: '18b35148f64d0bb17b5c34efa6bdeefa4df9ca122ba12130f7245bccd65a950a' + size_bytes: 5840 + source: 'cpp-x86-64-linux-gnu_4%3a15.2.0-5ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cracklib-runtime' + version: '2.9.6-5.2build3' + architecture: 'amd64' + sha256: 'b4796647beb74387211fcf9265ef6aa1e3539585de91f8b81a3fa3645ad8c612' + size_bytes: 147498 + source: 'cracklib-runtime_2.9.6-5.2build3_amd64.deb' + pinned_in: [] + - package: 'crash' + version: '9.0.1+~16.3-1ubuntu1' + architecture: 'amd64' + sha256: 'f233ef2a645cd77830b389e2168b75deec5ccc55cde0f342a7e20851ddbda0b0' + size_bytes: 5180566 + source: 'crash_9.0.1+~16.3-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cron' + version: '3.0pl1-200ubuntu1' + architecture: 'amd64' + sha256: '6b2b3b88313f35b30f50af59940c0b6ba82d992021585430763ffa3f71fb6b03' + size_bytes: 88556 + source: 'cron_3.0pl1-200ubuntu1_amd64.deb' + pinned_in: [] + - package: 'cron-daemon-common' + version: '3.0pl1-200ubuntu1' + architecture: 'all' + sha256: '1630217f880e7a6c1a689365fce3b75ce34a2f09f1688ca56d5e4063f9bd5d9c' + size_bytes: 15748 + source: 'cron-daemon-common_3.0pl1-200ubuntu1_all.deb' + pinned_in: [] + - package: 'cups' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: 'c164caf8c9c5d41f056895f6737423ae57943cf23440889a4ca16042327f5add' + size_bytes: 292606 + source: 'cups_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-browsed' + version: '2.1.1-0ubuntu3' + architecture: 'amd64' + sha256: 'fca5e52a4504fe6672197635b800323273f2d8221b416a38604fa89f944950b3' + size_bytes: 118402 + source: 'cups-browsed_2.1.1-0ubuntu3_amd64.deb' + pinned_in: [] + - package: 'cups-bsd' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: '26975659cba7ea97371a44c2ac34ce1813f4a691b715881f38b3a28f6f9f7757' + size_bytes: 42324 + source: 'cups-bsd_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-client' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: 'cddb97968598f332299ca17a32137b0936b1b2d11c450fd48548732f805d0818' + size_bytes: 153692 + source: 'cups-client_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-common' + version: '2.4.16-1ubuntu1.3' + architecture: 'all' + sha256: '2059cf512e584786357d21d89701c67cf7e4e128f6f12e7bbc04a3cb2c408603' + size_bytes: 274412 + source: 'cups-common_2.4.16-1ubuntu1.3_all.deb' + pinned_in: [] + - package: 'cups-core-drivers' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: '7473dec4a2e4eef38861fec60188559cc5e9ebb06fa10290a3f044d1d66a7a63' + size_bytes: 28980 + source: 'cups-core-drivers_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-daemon' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: '570d4b6c925a999bf127fbb45c732331a2a57864b6889bc54f22ef3a2db10559' + size_bytes: 366524 + source: 'cups-daemon_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-filters' + version: '2.0.1-0ubuntu4.1' + architecture: 'amd64' + sha256: '36141549cc52bd2cf2a02eaebcf8646dc4c99bc57b57c06f5c4f749b28e78535' + size_bytes: 125098 + source: 'cups-filters_2.0.1-0ubuntu4.1_amd64.deb' + pinned_in: [] + - package: 'cups-filters-core-drivers' + version: '2.0.1-0ubuntu4.1' + architecture: 'amd64' + sha256: 'c6e09dd33f33620f3cf9f1f71d50c5ce32b0ead0f8c516f3eff38f65f223df6b' + size_bytes: 51190 + source: 'cups-filters-core-drivers_2.0.1-0ubuntu4.1_amd64.deb' + pinned_in: [] + - package: 'cups-ipp-utils' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: 'd0b65f5076bdc542e714f69659559c3bc5f6104fb061d7b162a9cd90355da7ce' + size_bytes: 232028 + source: 'cups-ipp-utils_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-pk-helper' + version: '0.2.6-2.1build1' + architecture: 'amd64' + sha256: '034acb4da654cc54a3dbe1c6c9ffeda3218303b259f833a0fc442056d6b0af24' + size_bytes: 49076 + source: 'cups-pk-helper_0.2.6-2.1build1_amd64.deb' + pinned_in: [] + - package: 'cups-ppdc' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: 'd64b410c16204a4c51dcf26ad326467356d10fb07d5f35e8067747e520eed3e9' + size_bytes: 120510 + source: 'cups-ppdc_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'cups-server-common' + version: '2.4.16-1ubuntu1.3' + architecture: 'all' + sha256: '197fa1ab57a888c5013a5e7b8e9a6617a88bc11291a83ac13931415e07130d11' + size_bytes: 415788 + source: 'cups-server-common_2.4.16-1ubuntu1.3_all.deb' + pinned_in: [] + - package: 'curl' + version: '8.18.0-1ubuntu2.5' + architecture: 'amd64' + sha256: '646c41ecab7fa98ea99fb1957f73ce891d0d420e0aa138f8cc6f4b247ef5bde3' + size_bytes: 272202 + source: 'curl_8.18.0-1ubuntu2.5_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'dbus' + version: '1.16.2-2ubuntu4' + architecture: 'amd64' + sha256: '3e19a3e85d696b164a1a0e0419b919ceb19cd9d89b6fdbb0d1c4caa0f6e5e526' + size_bytes: 24152 + source: 'dbus_1.16.2-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'dbus-bin' + version: '1.16.2-2ubuntu4' + architecture: 'amd64' + sha256: '9c191045a54eae56c583e4c29993ed75c521fbc18f312820387e0e8a514ab76a' + size_bytes: 40052 + source: 'dbus-bin_1.16.2-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'dbus-daemon' + version: '1.16.2-2ubuntu4' + architecture: 'amd64' + sha256: '5e8b9f5527234cfb15f95f8449595e4118aa6a378f71b9472ba718c4e253508b' + size_bytes: 118996 + source: 'dbus-daemon_1.16.2-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'dbus-session-bus-common' + version: '1.16.2-2ubuntu4' + architecture: 'all' + sha256: 'c4debf213b12e178096ca1eb8c6afd6de74b425da998a7788c42252c1f99ef3d' + size_bytes: 54462 + source: 'dbus-session-bus-common_1.16.2-2ubuntu4_all.deb' + pinned_in: [] + - package: 'dbus-system-bus-common' + version: '1.16.2-2ubuntu4' + architecture: 'all' + sha256: '96a330e99f4d130d3aa1842881488f507d11ec46d897f410fe7afad14ed8c3a4' + size_bytes: 55898 + source: 'dbus-system-bus-common_1.16.2-2ubuntu4_all.deb' + pinned_in: [] + - package: 'dbus-user-session' + version: '1.16.2-2ubuntu4' + architecture: 'amd64' + sha256: 'cf0b0c4d223f3465df0e057f1a0810d69643a4d3e64734d72ce5e5b488a9618c' + size_bytes: 9682 + source: 'dbus-user-session_1.16.2-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'dc' + version: '1.07.1-4build1' + architecture: 'amd64' + sha256: 'e5e22aa8607bcafb64f03f9fa8c6494f32e33b76f6de3d3f6db40231ce6c92b8' + size_bytes: 49626 + source: 'dc_1.07.1-4build1_amd64.deb' + pinned_in: [] + - package: 'dconf-cli' + version: '0.49.0-4' + architecture: 'amd64' + sha256: 'a79fb20ecbb95391aa5df2d2e8442200c150425a0800e89a0d806e196366e51f' + size_bytes: 28548 + source: 'dconf-cli_0.49.0-4_amd64.deb' + pinned_in: [] + - package: 'dconf-gsettings-backend' + version: '0.49.0-4' + architecture: 'amd64' + sha256: '4da7b8309d49079ebac028c1f3284df02463da451cbd5f90ea61e535534531ac' + size_bytes: 22172 + source: 'dconf-gsettings-backend_0.49.0-4_amd64.deb' + pinned_in: [] + - package: 'dconf-service' + version: '0.49.0-4' + architecture: 'amd64' + sha256: '7f247f6032e72f86b1877f0020de77a0f8a11de256cf8f1726c072cf09585d31' + size_bytes: 27696 + source: 'dconf-service_0.49.0-4_amd64.deb' + pinned_in: [] + - package: 'desktop-file-utils' + version: '0.28-1build1' + architecture: 'amd64' + sha256: '4bc2c38ed9722d6ccdc7b27e77852f35363d06b8a8d786856aed4ffea98840b7' + size_bytes: 54312 + source: 'desktop-file-utils_0.28-1build1_amd64.deb' + pinned_in: [] + - package: 'dhcpcd-base' + version: '1:10.3.0-7' + architecture: 'amd64' + sha256: '8b58af259355e50864c650dca5f07fc81cd1e3ad87fc5b813048a4653daaefd2' + size_bytes: 227896 + source: 'dhcpcd-base_1%3a10.3.0-7_amd64.deb' + pinned_in: [] + - package: 'dictionaries-common' + version: '1.31.4' + architecture: 'all' + sha256: '465aa924e33faecfacf7925f6fb7ab92ecb97505e6bf204db34b93ee5a3fa749' + size_bytes: 176602 + source: 'dictionaries-common_1.31.4_all.deb' + pinned_in: [] + - package: 'distro-info' + version: '1.15' + architecture: 'amd64' + sha256: '9d65499fef4fa9b558ea25a5cfa232d1b96c2c1b52a62919c403e8f7e78700e5' + size_bytes: 20232 + source: 'distro-info_1.15_amd64.deb' + pinned_in: [] + - package: 'distro-info-data' + version: '0.72-0ubuntu0.26.04.1' + architecture: 'all' + sha256: '7dc20e15aa612cbc8cde8b9f07612e462232b57dd81bfdc134d2062f8d7bd90f' + size_bytes: 6118 + source: 'distro-info-data_0.72-0ubuntu0.26.04.1_all.deb' + pinned_in: [] + - package: 'dmidecode' + version: '3.6-2ubuntu1' + architecture: 'amd64' + sha256: '36ac8fce0b6a4f16faaa824faa67501487f0c91e7b8d24993b3c3e7b4d46073d' + size_bytes: 72828 + source: 'dmidecode_3.6-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'dmsetup' + version: '2:1.02.205-2ubuntu3' + architecture: 'amd64' + sha256: 'a90c4e24ec00bf166071860671f195b5240b56b9a583813af551a0b68f629a36' + size_bytes: 79372 + source: 'dmsetup_2%3a1.02.205-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'dmz-cursor-theme' + version: '0.4.5.3build1' + architecture: 'all' + sha256: '85a8b3b0ce547fdbe3dce6e8721ebd1e7a124343e670375a5aa8c50e41bb0f6d' + size_bytes: 247860 + source: 'dmz-cursor-theme_0.4.5.3build1_all.deb' + pinned_in: [] + - package: 'dns-root-data' + version: '2025080400build1' + architecture: 'all' + sha256: 'f246a598331f362860f1360792cf497372a07d84dd0d3dabc2a9344d7d6d5f83' + size_bytes: 6022 + source: 'dns-root-data_2025080400build1_all.deb' + pinned_in: [] + - package: 'dnsmasq-base' + version: '2.92-1ubuntu0.4' + architecture: 'amd64' + sha256: 'fef2ce81dc80dd9099ab0539d169c7f0c2178946c9bb1cc2b9a263c1b00de5ea' + size_bytes: 438978 + source: 'dnsmasq-base_2.92-1ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'docbook-xml' + version: '4.5-13build1' + architecture: 'all' + sha256: '7e8e0c6b5204aa8816683d29d7f7ca9280cbc866838a4f62adb497e9886a6ae5' + size_bytes: 73994 + source: 'docbook-xml_4.5-13build1_all.deb' + pinned_in: [] + - package: 'docker-buildx-plugin' + version: '0.37.1-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: '7d74d16440db560d3dc45d5f7ac83fb2cefb964f4edfabf82dd17a804ac42331' + size_bytes: 17271368 + source: 'docker-buildx-plugin_0.37.1-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: ['docker.txt'] + - package: 'docker-ce' + version: '5:29.8.1-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: '9a07ee2e75ebe60f7be95ea27a0d5b5358f8ed01ea93ef91c17ee1eed2eba9b8' + size_bytes: 24339208 + source: 'docker-ce_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: ['docker.txt'] + - package: 'docker-ce-cli' + version: '5:29.8.1-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: '3569f6f998c101c499884fc3d1f0d2696a37ae1db381cc1f5cfe4ca4cda143fa' + size_bytes: 17552060 + source: 'docker-ce-cli_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: ['docker.txt'] + - package: 'docker-ce-rootless-extras' + version: '5:29.8.1-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: 'f97a8dcdb4b5e489e53be3283d58fcd136e918b5b6027ca7f9a5d436d24966ba' + size_bytes: 10182052 + source: 'docker-ce-rootless-extras_5%3a29.8.1-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: [] + - package: 'docker-compose-plugin' + version: '5.5.1-1~ubuntu.26.04~resolute' + architecture: 'amd64' + sha256: '49b640226e70a6193ddea8115bec3e1b99493c50a15ac3b7d46d2ec6abeb5464' + size_bytes: 8012592 + source: 'docker-compose-plugin_5.5.1-1~ubuntu.26.04~resolute_amd64.deb' + pinned_in: ['docker.txt'] + - package: 'dosfstools' + version: '4.2-1.2build1' + architecture: 'amd64' + sha256: '6b1b2bba6458ca4444cae467db7faff6fd2f350373a95be23333d76dd019c58f' + size_bytes: 87860 + source: 'dosfstools_4.2-1.2build1_amd64.deb' + pinned_in: [] + - package: 'dracut' + version: '110-11ubuntu0.1' + architecture: 'all' + sha256: '5c889098b7cf533851be933feea66587dd637c2f5de8b1b9009f824d1fc732da' + size_bytes: 8240 + source: 'dracut_110-11ubuntu0.1_all.deb' + pinned_in: [] + - package: 'dracut-core' + version: '110-11ubuntu0.1' + architecture: 'amd64' + sha256: 'a8b9af489e0968620246dbbbbb6e211e49e2f4df0d28de98af22fb860ab7c0b0' + size_bytes: 329650 + source: 'dracut-core_110-11ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'dracut-install' + version: '110-11ubuntu0.1' + architecture: 'amd64' + sha256: 'c4f00013b155a28c726eff14d1d00f70658ba00d5ab874246179d0bd4a72b7dd' + size_bytes: 46256 + source: 'dracut-install_110-11ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'eatmydata' + version: '131-2build1' + architecture: 'all' + sha256: 'f21c9721593142db551fb2671e44c3bc4694a50a9880cd3687eb8700c7eb1186' + size_bytes: 5596 + source: 'eatmydata_131-2build1_all.deb' + pinned_in: [] + - package: 'eject' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: 'b249154e608cf714cd166cf63be820c26f8124a7657a0258bb139c8ba9741dcc' + size_bytes: 40298 + source: 'eject_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'emacsen-common' + version: '3.0.8build1' + architecture: 'all' + sha256: 'e630031549f68eaa2db722d3573b5b86f469df27d967645250050cdbcbcd752e' + size_bytes: 14032 + source: 'emacsen-common_3.0.8build1_all.deb' + pinned_in: [] + - package: 'enchant-2' + version: '2.8.2+dfsg1-3build1' + architecture: 'amd64' + sha256: 'f1142906a045a2124c483f47b411865609866b6f7db46da679deaee5869cca99' + size_bytes: 19076 + source: 'enchant-2_2.8.2+dfsg1-3build1_amd64.deb' + pinned_in: [] + - package: 'espeak-ng-data' + version: '1.52.0+dfsg-5build1' + architecture: 'amd64' + sha256: '8304ebf2260a5cf16394625a9b6bfc7cea6c29cc30e55d4cfa0e85da0d3cf56a' + size_bytes: 9261438 + source: 'espeak-ng-data_1.52.0+dfsg-5build1_amd64.deb' + pinned_in: [] + - package: 'ethtool' + version: '1:6.19-1' + architecture: 'amd64' + sha256: 'ccb2f06f17d13410a76f52c69454451751275f036e6faff08acf1de1527fe35a' + size_bytes: 322774 + source: 'ethtool_1%3a6.19-1_amd64.deb' + pinned_in: [] + - package: 'evolution-data-server' + version: '3.56.2-8' + architecture: 'amd64' + sha256: '7d72ccd1741f4098197505012168bd0d2ef825f294e1f68532b71360f1628b07' + size_bytes: 715830 + source: 'evolution-data-server_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'evolution-data-server-common' + version: '3.56.2-8' + architecture: 'all' + sha256: 'e7b82a9c4e3489c86dd1ab1a68a87a79c36213e155d391ff00f43ec41edadbcb' + size_bytes: 190518 + source: 'evolution-data-server-common_3.56.2-8_all.deb' + pinned_in: [] + - package: 'exfatprogs' + version: '1.3.2-1' + architecture: 'amd64' + sha256: '3ccd90a7a4cd55f088cf5a1abffb0b3348c607ff1c3cfb984630bc7b2f48d3c6' + size_bytes: 81458 + source: 'exfatprogs_1.3.2-1_amd64.deb' + pinned_in: [] + - package: 'fdisk' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: '1789910902f6c260e5345440fd86b00ac0f34c69795a6f2be67cd4ab3e38fa2b' + size_bytes: 139076 + source: 'fdisk_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'file' + version: '1:5.46-5build2' + architecture: 'amd64' + sha256: '968b0e503f877a81c67bf82b634973e73901f6c4f4c741b5ec09824120791cd3' + size_bytes: 22026 + source: 'file_1%3a5.46-5build2_amd64.deb' + pinned_in: [] + - package: 'firefox' + version: '1:1snap1-0ubuntu9.1' + architecture: 'amd64' + sha256: 'abd8b2c56a05c9c15f3f050713ab795e58c2ff1a868869a2bf40e9b26ee4d2ea' + size_bytes: 68286 + source: 'firefox_1%3a1snap1-0ubuntu9.1_amd64.deb' + pinned_in: [] + - package: 'fontconfig' + version: '2.17.1-3ubuntu1' + architecture: 'amd64' + sha256: '5f87d9f0ff7189e5dbf7bedd1ef6c09ea81747bc68dd5263ea811b471f23ee65' + size_bytes: 180360 + source: 'fontconfig_2.17.1-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'fontconfig-config' + version: '2.17.1-3ubuntu1' + architecture: 'amd64' + sha256: '304cc61f61b94399453db02e1032d9f74a0bd737307acb4ed847f8da9406b8c1' + size_bytes: 38454 + source: 'fontconfig-config_2.17.1-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'fonts-adwaita' + version: '49.0+dfsg-2' + architecture: 'all' + sha256: 'f8f0deb9b00788cbe6d52fedb029b411db27bee4f6b43943edad79829e8321eb' + size_bytes: 68348 + source: 'fonts-adwaita_49.0+dfsg-2_all.deb' + pinned_in: [] + - package: 'fonts-adwaita-sans' + version: '49.0+dfsg-2' + architecture: 'all' + sha256: '69439ea5a600a1b6dd8f17e1a45951e7c100b5acb2df7af849a04558c45acb93' + size_bytes: 772754 + source: 'fonts-adwaita-sans_49.0+dfsg-2_all.deb' + pinned_in: [] + - package: 'fonts-dejavu-core' + version: '2.37-8build1' + architecture: 'all' + sha256: 'f4606b12eb41ddf7932d3a1ebc2019f9bbf90d0824943a2dc0c77a00f43019f2' + size_bytes: 834166 + source: 'fonts-dejavu-core_2.37-8build1_all.deb' + pinned_in: [] + - package: 'fonts-dejavu-mono' + version: '2.37-8build1' + architecture: 'all' + sha256: 'bf5ad873961972ea8f1299ef99c1854715e68d9aa798830fb78c5b222ddeb4b9' + size_bytes: 502164 + source: 'fonts-dejavu-mono_2.37-8build1_all.deb' + pinned_in: [] + - package: 'fonts-droid-fallback' + version: '1:8.1.0r7-1~1.gbp36536bbuild1' + architecture: 'all' + sha256: 'ce3303e44d61409ee93d32d2a50e26af7a8c49b6f71fbf4b1ca7077488234651' + size_bytes: 2011114 + source: 'fonts-droid-fallback_1%3a8.1.0r7-1~1.gbp36536bbuild1_all.deb' + pinned_in: [] + - package: 'fonts-liberation' + version: '1:2.1.5-3build1' + architecture: 'all' + sha256: '47f156bc945cfc69cf2f2a0c19b8c82b67a685738d3846673462de6a73266e1b' + size_bytes: 1604662 + source: 'fonts-liberation_1%3a2.1.5-3build1_all.deb' + pinned_in: [] + - package: 'fonts-liberation-sans-narrow' + version: '1:1.07.6-4build1' + architecture: 'all' + sha256: 'b860cd58dc89b4d91ff7b775e759aba62561a5d7226508cf5fbdaff01bade9cd' + size_bytes: 196390 + source: 'fonts-liberation-sans-narrow_1%3a1.07.6-4build1_all.deb' + pinned_in: [] + - package: 'fonts-noto-cjk' + version: '1:20240730+repack1-1build1' + architecture: 'all' + sha256: 'be378a571b8f49b4b9146f7d13b31990950d35ee3e0bf1999f554c3ed5670dc0' + size_bytes: 61175182 + source: 'fonts-noto-cjk_1%3a20240730+repack1-1build1_all.deb' + pinned_in: [] + - package: 'fonts-noto-color-emoji' + version: '2.051-1build1' + architecture: 'all' + sha256: '040b1e0a0700c849b9ce59d97878019e16720d18063f7d0585d906ea609d7235' + size_bytes: 9967220 + source: 'fonts-noto-color-emoji_2.051-1build1_all.deb' + pinned_in: [] + - package: 'fonts-noto-core' + version: '20201225-2build1' + architecture: 'all' + sha256: '25999af6e6665266b1f055d351fc5008534e65c9f7bdda1e7fb5a7574c42372f' + size_bytes: 13277790 + source: 'fonts-noto-core_20201225-2build1_all.deb' + pinned_in: [] + - package: 'fonts-noto-mono' + version: '20201225-2build1' + architecture: 'all' + sha256: 'b9b3e49f6a6926e3be9817c39587a4eeff48d147cb21fdd799f89a045fe097c5' + size_bytes: 433958 + source: 'fonts-noto-mono_20201225-2build1_all.deb' + pinned_in: [] + - package: 'fonts-ubuntu' + version: '0.869+git20240321-0ubuntu2' + architecture: 'all' + sha256: 'f406a58d53ba6f1b7d0c8b9641ee599181cfaaf433c4fd1276a7fe2f10ae9e38' + size_bytes: 1076616 + source: 'fonts-ubuntu_0.869+git20240321-0ubuntu2_all.deb' + pinned_in: [] + - package: 'fonts-urw-base35' + version: '20200910-8build1' + architecture: 'all' + sha256: 'be59254289c670d5c6580ce381995292aa05c9dd4bc5fa65b9dbaa527b55adda' + size_bytes: 10937814 + source: 'fonts-urw-base35_20200910-8build1_all.deb' + pinned_in: [] + - package: 'foomatic-db-compressed-ppds' + version: '20250819-1build1' + architecture: 'all' + sha256: 'ae9c1af11ce07fc2cb56cb0a87f8c4a7d21a774ca5e10b260fddb1977947c884' + size_bytes: 322532 + source: 'foomatic-db-compressed-ppds_20250819-1build1_all.deb' + pinned_in: [] + - package: 'fprintd' + version: '1.94.5-4' + architecture: 'amd64' + sha256: '52728aed9fa0d1620b24044545482113e75fee59c22acf7fad2fce4f6b631661' + size_bytes: 95312 + source: 'fprintd_1.94.5-4_amd64.deb' + pinned_in: [] + - package: 'freeipmi-common' + version: '1.6.16-1ubuntu0.1' + architecture: 'all' + sha256: '340a22f204486c0f178a1c1dad70360538b33679af4420b4f72b3dd6bcd82a47' + size_bytes: 180762 + source: 'freeipmi-common_1.6.16-1ubuntu0.1_all.deb' + pinned_in: [] + - package: 'fuse3' + version: '3.18.2-1' + architecture: 'amd64' + sha256: 'a867fe3be1cbca271df70748b003232592c052233be5976d2a590f02327158db' + size_bytes: 27490 + source: 'fuse3_3.18.2-1_amd64.deb' + pinned_in: [] + - package: 'fwupd' + version: '2.1.1-1ubuntu3.1' + architecture: 'amd64' + sha256: '19dd482b85dcf1344cfe3e90f52088485426a074cfb019ec7d4ced65734793d9' + size_bytes: 12703386 + source: 'fwupd_2.1.1-1ubuntu3.1_amd64.deb' + pinned_in: [] + - package: 'fwupd-signed' + version: '1.55+1.7-1' + architecture: 'amd64' + sha256: '0ac47da21856267d0cccd81ed0ded0165bfee15375821bf389ed75ae91fa8232' + size_bytes: 30618 + source: 'fwupd-signed_1.55+1.7-1_amd64.deb' + pinned_in: [] + - package: 'gamemode' + version: '1.8.2-2build1' + architecture: 'amd64' + sha256: '25e566cd0e29c5ea98b3f07d56395e270767c97cd9f37046cfe50f54b150b690' + size_bytes: 17512 + source: 'gamemode_1.8.2-2build1_amd64.deb' + pinned_in: [] + - package: 'gamemode-daemon' + version: '1.8.2-2build1' + architecture: 'amd64' + sha256: 'a2238ef709a071223ce579cbcac9c20507731ebf17eff65ee8361fdbdd5369f6' + size_bytes: 70644 + source: 'gamemode-daemon_1.8.2-2build1_amd64.deb' + pinned_in: [] + - package: 'gcc-15-base' + version: '15.2.0-16ubuntu1' + architecture: 'amd64' + sha256: '5a302d705d562fb7e150415b00651c00fed58b633faadff0b332eac1b73fadb3' + size_bytes: 39040 + source: 'gcc-15-base_15.2.0-16ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gcr' + version: '3.41.2-6' + architecture: 'amd64' + sha256: '81fc97e9cac4d5beab2b61cb100705eea14b9d812c9181ea798205bb92844afe' + size_bytes: 60450 + source: 'gcr_3.41.2-6_amd64.deb' + pinned_in: [] + - package: 'gcr4' + version: '4.4.0.1-8' + architecture: 'amd64' + sha256: '89caf5746a48018ac325095ed1371abc4916ef515f9d1c39e87c73757b81cb9d' + size_bytes: 43954 + source: 'gcr4_4.4.0.1-8_amd64.deb' + pinned_in: [] + - package: 'gdb' + version: '17.1-2ubuntu1' + architecture: 'amd64' + sha256: 'e1034f3c120b99d9a34964b274d81d7525c4f22bf76f9f31308014a6bec20b3e' + size_bytes: 4173290 + source: 'gdb_17.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gdisk' + version: '1.0.10-2build1' + architecture: 'amd64' + sha256: '8bff3d86ac03a3f13312d73c52e594c4572308cf0373439b0567837c774a19e7' + size_bytes: 258530 + source: 'gdisk_1.0.10-2build1_amd64.deb' + pinned_in: [] + - package: 'gdm3' + version: '50.1-0ubuntu0.1' + architecture: 'amd64' + sha256: '6d979c79ce3492236e9a2467c5a11e4f5355f087f08ca0dfc0e0e3320b5d2aae' + size_bytes: 246294 + source: 'gdm3_50.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'geoclue-2.0' + version: '2.7.2-2ubuntu3' + architecture: 'amd64' + sha256: '32e3c75cd3ad2acae2c4ef282a816516822306484f7e6605a59126dad2597aba' + size_bytes: 106006 + source: 'geoclue-2.0_2.7.2-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'geocode-glib-common' + version: '3.26.4-3' + architecture: 'all' + sha256: 'f1261a0a2e3829cf1603b3a4b3dd2f9eec857cdac7d22ad238dc034a3cc7ac3e' + size_bytes: 19134 + source: 'geocode-glib-common_3.26.4-3_all.deb' + pinned_in: [] + - package: 'gettext-base' + version: '0.23.2-1' + architecture: 'amd64' + sha256: '5a1a4cd407a868e766626f551646b00880fc1534db5e6d47208310a17252f306' + size_bytes: 42256 + source: 'gettext-base_0.23.2-1_amd64.deb' + pinned_in: [] + - package: 'ghostscript' + version: '10.06.0~dfsg-3ubuntu1' + architecture: 'amd64' + sha256: '30a71a4e787afa88617b8f9239fd4ddbccfddb54dc63fef0b1687cecc60e510c' + size_bytes: 43158 + source: 'ghostscript_10.06.0~dfsg-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-accountsservice-1.0' + version: '23.13.9-8ubuntu5.2' + architecture: 'amd64' + sha256: 'ebd57ea07ae33b06cf9849d98392dcdc994ea67fb6d875f34eae8dd4c99e3af7' + size_bytes: 5344 + source: 'gir1.2-accountsservice-1.0_23.13.9-8ubuntu5.2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-adw-1' + version: '1.9.1-0ubuntu0.1' + architecture: 'amd64' + sha256: '634bc3d42b0fa94559fa5d9841adf42a645c121a6a848f8270ab36e0efd1bdaf' + size_bytes: 46674 + source: 'gir1.2-adw-1_1.9.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-atk-1.0' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: '51c76d8da01f7393cc29229e050addf92a84f1e1fa4d62fb41f2495e14f09e99' + size_bytes: 23176 + source: 'gir1.2-atk-1.0_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-atspi-2.0' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: 'c1094d9dda13dfa5d0f9dab2270e9eba36968197bb6262d98a4d99186ac59f45' + size_bytes: 22578 + source: 'gir1.2-atspi-2.0_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-dbusmenu-glib-0.4' + version: '18.10.20180917~bzr492+repack1-4build1' + architecture: 'amd64' + sha256: '22daa702e579d72bac3887b0fbd4a54340424a19730aefd2079ef3f1451449f9' + size_bytes: 7050 + source: 'gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-4build1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-freedesktop' + version: '1.86.0-6build1' + architecture: 'amd64' + sha256: 'b03241fd8fcee4ee829ebfecadf28799ec7da36c2e0ab49f2626def937a1f4b6' + size_bytes: 66000 + source: 'gir1.2-freedesktop_1.86.0-6build1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gck-2' + version: '4.4.0.1-8' + architecture: 'amd64' + sha256: '8108abbbcca7b3fcac82d69cd2562a0cc32f6e1e2963eb0610c0534be8fb7533' + size_bytes: 10752 + source: 'gir1.2-gck-2_4.4.0.1-8_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gcr-4' + version: '4.4.0.1-8' + architecture: 'amd64' + sha256: '7ae3ce47e33fbfa3b30f30f43fc52625fa72095829748c5d169f47d3e6d61e3e' + size_bytes: 13980 + source: 'gir1.2-gcr-4_4.4.0.1-8_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gdesktopenums-3.0' + version: '50.0-1ubuntu2' + architecture: 'amd64' + sha256: 'a9eae556dc799df2b9681714c26a3feaeb200c4206594fcf2cf95f9a376a405d' + size_bytes: 10164 + source: 'gir1.2-gdesktopenums-3.0_50.0-1ubuntu2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gdkpixbuf-2.0' + version: '2.44.5+dfsg-4ubuntu1' + architecture: 'amd64' + sha256: '58a8f3f358a96d0039671c697a8241781fc95f70593aafef78b7d09625305d13' + size_bytes: 9312 + source: 'gir1.2-gdkpixbuf-2.0_2.44.5+dfsg-4ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gdm-1.0' + version: '50.1-0ubuntu0.1' + architecture: 'amd64' + sha256: 'a82639e1bb188eeb7cf985f3739427d6e701cbeb69526c020eb39a780570b8ee' + size_bytes: 10004 + source: 'gir1.2-gdm-1.0_50.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-geoclue-2.0' + version: '2.7.2-2ubuntu3' + architecture: 'amd64' + sha256: '32534963075b451aa2c723ae2096ddb13d3d4365945392e8ae7ba94dcefb0643' + size_bytes: 6192 + source: 'gir1.2-geoclue-2.0_2.7.2-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'gir1.2-girepository-3.0' + version: '2.88.0-1' + architecture: 'amd64' + sha256: '0c88684f606a84ba792aa09909e2ef1cc65eba7262789bbb387c4d00f339f9fb' + size_bytes: 25132 + source: 'gir1.2-girepository-3.0_2.88.0-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-glib-2.0' + version: '2.88.0-1' + architecture: 'amd64' + sha256: 'b4b0b4822f5cae347a6ed288adb60a8ebb2f9ea9ee66469e4a810f48b89a87aa' + size_bytes: 182516 + source: 'gir1.2-glib-2.0_2.88.0-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gmenu-3.0' + version: '3.38.1-1ubuntu1' + architecture: 'amd64' + sha256: 'fafc76d4e7d4ea45ff6bfe9992f1f0d5a547aeae5e7db2c46c35c1731c1bb0de' + size_bytes: 3744 + source: 'gir1.2-gmenu-3.0_3.38.1-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomeautoar-0.1' + version: '0.4.5-5' + architecture: 'amd64' + sha256: '9acd8fb0f912992e1660d81ced96d004e4f4069808a9b84ee0239b74d03993b5' + size_bytes: 4528 + source: 'gir1.2-gnomeautoar-0.1_0.4.5-5_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomebg-4.0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '3f42af66fec0c50d09b8d31501527b5dd285e689da15f0abce7202f63bb3574b' + size_bytes: 4512 + source: 'gir1.2-gnomebg-4.0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomebluetooth-3.0' + version: '47.1-5' + architecture: 'amd64' + sha256: 'd357d32976242090c317647eb19b8e9208ac811e89d1119578c44b00bb800255' + size_bytes: 4746 + source: 'gir1.2-gnomebluetooth-3.0_47.1-5_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomedesktop-3.0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: 'e793934c521a2d1f9e6a956d9191d198fd62909116c1e810c4dcfab77505bdd9' + size_bytes: 10022 + source: 'gir1.2-gnomedesktop-3.0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomedesktop-4.0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '8218a177aa366bb3f124bb9364743ebefb1024672d3427d7ab74d94ef812f1db' + size_bytes: 5846 + source: 'gir1.2-gnomedesktop-4.0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gnomeqr-4.0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '5850a0847902085e922af6008aa5ada8bf3c77e82fb27149425b1a4b25e7e8a0' + size_bytes: 3762 + source: 'gir1.2-gnomeqr-4.0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-graphene-1.0' + version: '1.10.8-5build1' + architecture: 'amd64' + sha256: '83473d0c46e2f0f05e9a74274e8116a919007e01a375c8f9bd281a1c7fc03999' + size_bytes: 11082 + source: 'gir1.2-graphene-1.0_1.10.8-5build1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gstreamer-1.0' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '211ce8acd5cff28532472a1679d27ac254a8edfa2a901a65e6a1471c66118a5d' + size_bytes: 97834 + source: 'gir1.2-gstreamer-1.0_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gtk-3.0' + version: '3.24.52-0ubuntu1' + architecture: 'amd64' + sha256: 'd6d33238376565ea10358c946a1eb1dd1d638a0ffd7b4399c3871244d53811f5' + size_bytes: 240490 + source: 'gir1.2-gtk-3.0_3.24.52-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gtk-4.0' + version: '4.22.4+ds-0ubuntu0.1' + architecture: 'amd64' + sha256: '4ce9a8d81aa672e3c41afdde78678abdee33ff0bfdeb2d22e5812f1cbfbab2f9' + size_bytes: 223874 + source: 'gir1.2-gtk-4.0_4.22.4+ds-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-gweather-4.0' + version: '4.4.4-4' + architecture: 'amd64' + sha256: '485f336cba9dad6cc0cf33d4257db52f731c76140b82551ad49d57f3b79d600d' + size_bytes: 7372 + source: 'gir1.2-gweather-4.0_4.4.4-4_amd64.deb' + pinned_in: [] + - package: 'gir1.2-handy-1' + version: '1.8.3-3build1' + architecture: 'amd64' + sha256: 'dc729c1d015c1ae81138af22ed3533f8521296fc8fc85cf0650bec99e1d6bcd4' + size_bytes: 17874 + source: 'gir1.2-handy-1_1.8.3-3build1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-harfbuzz-0.0' + version: '12.3.2-2' + architecture: 'amd64' + sha256: 'e91702d05c014768a85814efde45133b0e1a75faf1c8ff51a31563644229ffc6' + size_bytes: 44606 + source: 'gir1.2-harfbuzz-0.0_12.3.2-2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-ibus-1.0' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: 'ef94b3853acdf6c1d1d2ee247ba2aa42e49744eafee58cdf9616020502b39f3f' + size_bytes: 87360 + source: 'gir1.2-ibus-1.0_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-javascriptcoregtk-4.1' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'd3e152e1b2fb6a9549fc1f733582d90d6049dd88881b536b7c465c71365f0094' + size_bytes: 38958 + source: 'gir1.2-javascriptcoregtk-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-mutter-18' + version: '50.1-0ubuntu2.2' + architecture: 'amd64' + sha256: 'acece18b86d3cb5c6194df5e3401818e81edeb33d4b97ea3ad6a2ed0cecfa7c2' + size_bytes: 133512 + source: 'gir1.2-mutter-18_50.1-0ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-nm-1.0' + version: '1.54.3-2ubuntu3' + architecture: 'amd64' + sha256: 'e4ae7fc1a7017518b5e268c444feca597c5996239f282571e1ff382ad3f7de60' + size_bytes: 89866 + source: 'gir1.2-nm-1.0_1.54.3-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'gir1.2-nma4-1.0' + version: '1.10.6-7' + architecture: 'amd64' + sha256: '63e0a77707eea2315fe9912d67777cd3b49cd8d9f4b93e65de0385d660bac6ad' + size_bytes: 6348 + source: 'gir1.2-nma4-1.0_1.10.6-7_amd64.deb' + pinned_in: [] + - package: 'gir1.2-notify-0.7' + version: '0.8.8-1' + architecture: 'amd64' + sha256: '66325b907ce2d3261b1a06b89ac8a32532aa2ed5819bfcc2fc93356c04c6125b' + size_bytes: 4126 + source: 'gir1.2-notify-0.7_0.8.8-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-packagekitglib-1.0' + version: '1.3.4-3ubuntu1.2' + architecture: 'amd64' + sha256: 'bece2590fc1e6befc4ad99d6146694581cc928db238eaa08b85f3e77577f8e72' + size_bytes: 25560 + source: 'gir1.2-packagekitglib-1.0_1.3.4-3ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-pango-1.0' + version: '1.57.0-1' + architecture: 'amd64' + sha256: '799885145fe5982478fc53ce0206072a7dd402d6e42f5f7a951a78e9e49bcb84' + size_bytes: 34848 + source: 'gir1.2-pango-1.0_1.57.0-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-polkit-1.0' + version: '127-2ubuntu1.1' + architecture: 'amd64' + sha256: '2e73cbeef4422da0d390523716bbb2d8f63ed74dae73e546412090d1ad75586d' + size_bytes: 8808 + source: 'gir1.2-polkit-1.0_127-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-rsvg-2.0' + version: '2.61.3+dfsg-3' + architecture: 'amd64' + sha256: '35468e313e59a20d9388b554a6d02634c65a17596d928723c228a17f1ce486e0' + size_bytes: 11076 + source: 'gir1.2-rsvg-2.0_2.61.3+dfsg-3_amd64.deb' + pinned_in: [] + - package: 'gir1.2-secret-1' + version: '0.21.7-2build1' + architecture: 'amd64' + sha256: '9c057deb9c39ae68c803c922aab875cf52bb33bd5b0b3b53ceb638b5dbc843e2' + size_bytes: 9340 + source: 'gir1.2-secret-1_0.21.7-2build1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-snapd-2' + version: '1.72-0ubuntu3' + architecture: 'amd64' + sha256: '2f1ce5a6cfdfd15d0bde1b3bc774d5d35a85f2f5fda28e5b32495c8412c46b08' + size_bytes: 18018 + source: 'gir1.2-snapd-2_1.72-0ubuntu3_amd64.deb' + pinned_in: [] + - package: 'gir1.2-soup-3.0' + version: '3.6.6-1' + architecture: 'amd64' + sha256: '046d809c27d3b31ef3942a72386408a759c328be2a71c81ccc5c201b10eb394d' + size_bytes: 22486 + source: 'gir1.2-soup-3.0_3.6.6-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-upowerglib-1.0' + version: '1.91.1-1' + architecture: 'amd64' + sha256: '3308387bdb13c3da8cf2a5f924f60e180aae9623ff78825579c88ba2636c2578' + size_bytes: 5452 + source: 'gir1.2-upowerglib-1.0_1.91.1-1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-vte-2.91' + version: '0.84.0-2' + architecture: 'amd64' + sha256: '41e72d980945aa13aeac331f62d784fb089edb510a256ba65b6d7142564c59e1' + size_bytes: 18486 + source: 'gir1.2-vte-2.91_0.84.0-2_amd64.deb' + pinned_in: [] + - package: 'gir1.2-webkit2-4.1' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '708bc6befabd6edae038d15b6fbcefa609368aaaf59ec9dc6c77278e152fe482' + size_bytes: 104994 + source: 'gir1.2-webkit2-4.1_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'gir1.2-wnck-3.0' + version: '43.3-1build1' + architecture: 'amd64' + sha256: 'bdef0db4470d6667e6340ad6ef455e8aa81094e662e3875a4d19da6be7081e93' + size_bytes: 10268 + source: 'gir1.2-wnck-3.0_43.3-1build1_amd64.deb' + pinned_in: [] + - package: 'git' + version: '1:2.53.0-1ubuntu1' + architecture: 'amd64' + sha256: 'c3b36d7357dea773eefe6c4f97ebff416e5afee22489dc1f729e31d6f47872e9' + size_bytes: 4227374 + source: 'git_1%3a2.53.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'git-man' + version: '1:2.53.0-1ubuntu1' + architecture: 'all' + sha256: 'cc2870c52d3d6845bd792e861930dd6afc5fe165edb0c8c3700332c3bfbd666e' + size_bytes: 1202472 + source: 'git-man_1%3a2.53.0-1ubuntu1_all.deb' + pinned_in: [] + - package: 'gjs' + version: '1.88.0-1' + architecture: 'amd64' + sha256: '8fe90b1cbdb4ecd6d0f70dbcd60f6b834b858e06ad599f16deaaa73100649767' + size_bytes: 120214 + source: 'gjs_1.88.0-1_amd64.deb' + pinned_in: [] + - package: 'glib-networking' + version: '2.80.1-1build2' + architecture: 'amd64' + sha256: '19781460ab64af9244f089d1cb79f57f44dda08a7db5f5ac8b88b3d79215125c' + size_bytes: 64812 + source: 'glib-networking_2.80.1-1build2_amd64.deb' + pinned_in: [] + - package: 'glib-networking-common' + version: '2.80.1-1build2' + architecture: 'all' + sha256: 'a1189141109b442a85d9dbbd695d10ce0a817fa530bab2b9dd0fc45cbebba09f' + size_bytes: 6834 + source: 'glib-networking-common_2.80.1-1build2_all.deb' + pinned_in: [] + - package: 'glib-networking-services' + version: '2.80.1-1build2' + architecture: 'amd64' + sha256: 'aff71f4fcc8e493a45ba8e3cd36207747a76633b35769415c74b48e049b2c3b9' + size_bytes: 13086 + source: 'glib-networking-services_2.80.1-1build2_amd64.deb' + pinned_in: [] + - package: 'glycin-loaders' + version: '2.1.1+ds-0ubuntu1' + architecture: 'amd64' + sha256: '2b94910793dddd6cc6cc689bea65c526e3c3e3dfd2125f4464c239fc6e5856d4' + size_bytes: 2979102 + source: 'glycin-loaders_2.1.1+ds-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'glycin-thumbnailers' + version: '2.1.1+ds-0ubuntu1' + architecture: 'amd64' + sha256: '545e2b60f3a2ceefe6f1b99c98b229806aafde57fdcae6b67030b7a09b808cc2' + size_bytes: 222602 + source: 'glycin-thumbnailers_2.1.1+ds-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gnome-accessibility-themes' + version: '3.28-5' + architecture: 'all' + sha256: '0a93934df79efa3114968521f607c0cddd35c1db3be5ac6cd46d58f66276e236' + size_bytes: 2321952 + source: 'gnome-accessibility-themes_3.28-5_all.deb' + pinned_in: [] + - package: 'gnome-bluetooth-3-common' + version: '47.1-5' + architecture: 'all' + sha256: 'baf5ee3e5e5ba2080d565c57b1a049fc5226c4eaf70c779cad58b8ba30cd25e8' + size_bytes: 163656 + source: 'gnome-bluetooth-3-common_47.1-5_all.deb' + pinned_in: [] + - package: 'gnome-bluetooth-sendto' + version: '47.1-5' + architecture: 'amd64' + sha256: '0fef6d29b9dbbb88e50a30eeb485fcb5acfe76d7dcab444261d38f97a7fc83d8' + size_bytes: 13228 + source: 'gnome-bluetooth-sendto_47.1-5_amd64.deb' + pinned_in: [] + - package: 'gnome-calculator' + version: '1:50.0-1ubuntu1' + architecture: 'amd64' + sha256: '959598983285cc7f3c09d0c47524505b9fa5fcc56fc8f1b3aeb581dfe27318db' + size_bytes: 454750 + source: 'gnome-calculator_1%3a50.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gnome-characters' + version: '50.0-1' + architecture: 'amd64' + sha256: '5af17d8d07ce0ed1ba082cb863b3c4907d8234d0ec78ec9289dfff662a9a5b11' + size_bytes: 485030 + source: 'gnome-characters_50.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-clocks' + version: '50.0-1' + architecture: 'amd64' + sha256: 'dd72b4998e721ad6f3c73dd03981b54d1d579c4a4050dd8c4e32c6eff1a33c61' + size_bytes: 1773286 + source: 'gnome-clocks_50.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-control-center' + version: '1:50.3-0ubuntu0.2' + architecture: 'amd64' + sha256: '0c940c78379e37509da54f14b9c2eaa7695280dfda6e16a00090ad77b99c7a77' + size_bytes: 1871210 + source: 'gnome-control-center_1%3a50.3-0ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'gnome-control-center-data' + version: '1:50.3-0ubuntu0.2' + architecture: 'all' + sha256: '78ea685c595cd7b0d1d2d3d42359200892eca0e0c96f0b71855c43ccd1a42293' + size_bytes: 161490 + source: 'gnome-control-center-data_1%3a50.3-0ubuntu0.2_all.deb' + pinned_in: [] + - package: 'gnome-control-center-faces' + version: '1:50.3-0ubuntu0.2' + architecture: 'all' + sha256: 'f1ee11647b14d1f9f3eabc070d5480928c52415f94654575c3ac8472cad1a680' + size_bytes: 1115108 + source: 'gnome-control-center-faces_1%3a50.3-0ubuntu0.2_all.deb' + pinned_in: [] + - package: 'gnome-desktop3-data' + version: '44.5-1ubuntu1' + architecture: 'all' + sha256: '50bdc946d47908d38f3e96d979eb0e2e53a31873fce124b7c8ee93725b6dad47' + size_bytes: 32158 + source: 'gnome-desktop3-data_44.5-1ubuntu1_all.deb' + pinned_in: [] + - package: 'gnome-disk-utility' + version: '46.1-2ubuntu2' + architecture: 'amd64' + sha256: 'ae54e76c2732546561f9444e85e5c04bad89cac5e01a701cd9c098e2bb207cbc' + size_bytes: 198886 + source: 'gnome-disk-utility_46.1-2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'gnome-font-viewer' + version: '49.0-1' + architecture: 'amd64' + sha256: '7510d6480cc138a552ec6e36419f198fa3d61507bba098a47388f0c653ea873b' + size_bytes: 62638 + source: 'gnome-font-viewer_49.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-initial-setup' + version: '50.0-0ubuntu7.1' + architecture: 'amd64' + sha256: '268d971491abe2fef77925b304f7c3ad22a7a12cf5d6ffae6778c0d0a63a6e0b' + size_bytes: 898052 + source: 'gnome-initial-setup_50.0-0ubuntu7.1_amd64.deb' + pinned_in: [] + - package: 'gnome-keyring' + version: '50.0-1' + architecture: 'amd64' + sha256: '8b5acd08a0857f8622087271bcfd5c72e8585fa0e02d1a56706b0d1c6bf66a34' + size_bytes: 606958 + source: 'gnome-keyring_50.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-keyring-pkcs11' + version: '50.0-1' + architecture: 'amd64' + sha256: '821956354c95ec78ba601e0c814057a8f99c3f7cc99277fb12cbe79c7a69914c' + size_bytes: 26110 + source: 'gnome-keyring-pkcs11_50.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-logs' + version: '49.0-1' + architecture: 'amd64' + sha256: 'bcf68f3dd689353b632262f259330795379c8dcf889cc2bdd21ebb46247c0486' + size_bytes: 123842 + source: 'gnome-logs_49.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-menus' + version: '3.38.1-1ubuntu1' + architecture: 'amd64' + sha256: 'bbc653161f70183310f3ca880bec9e2d90e7b80ad90f31a4e0762ab93055dca4' + size_bytes: 10874 + source: 'gnome-menus_3.38.1-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gnome-online-accounts' + version: '3.58.0-1' + architecture: 'amd64' + sha256: '306913fb919e3dcf01cda6e3029dacb18644cadd1bcc58fb06e2014e5269d824' + size_bytes: 86386 + source: 'gnome-online-accounts_3.58.0-1_amd64.deb' + pinned_in: [] + - package: 'gnome-remote-desktop' + version: '50.2-0ubuntu0.1' + architecture: 'amd64' + sha256: '67f947c0d088ab984bde86657bed7956b9c7abb1a90bf7a705ad258548238e61' + size_bytes: 328892 + source: 'gnome-remote-desktop_50.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gnome-session' + version: '50.1-0ubuntu0.1' + architecture: 'all' + sha256: '3425c8e260ca89df3a136b3b55ff372effe306fa5d0ac6981371d0932944ca44' + size_bytes: 54192 + source: 'gnome-session_50.1-0ubuntu0.1_all.deb' + pinned_in: ['remote-access.txt'] + - package: 'gnome-session-bin' + version: '50.1-0ubuntu0.1' + architecture: 'amd64' + sha256: 'a5e64a55e660b82a732a4a24bbae4529d4040e794232201345efacdb43c07700' + size_bytes: 85068 + source: 'gnome-session-bin_50.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gnome-session-canberra' + version: '0.30-18ubuntu3' + architecture: 'amd64' + sha256: '93ffcda57d1cf11abea97c5a484a8424dbad9ed105bd9b106999cbce204a9992' + size_bytes: 6892 + source: 'gnome-session-canberra_0.30-18ubuntu3_amd64.deb' + pinned_in: [] + - package: 'gnome-session-common' + version: '50.1-0ubuntu0.1' + architecture: 'all' + sha256: '42428debf5153dce76602b23229c987faac286edf910ac26ade3841350e54f2c' + size_bytes: 18926 + source: 'gnome-session-common_50.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'gnome-settings-daemon' + version: '50.0-1ubuntu1' + architecture: 'amd64' + sha256: '68cc2bb46f5771a54e292306654bc867cfe18e9ba6ab3a8ae85e5e8ec9058d49' + size_bytes: 308708 + source: 'gnome-settings-daemon_50.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gnome-settings-daemon-common' + version: '50.0-1ubuntu1' + architecture: 'all' + sha256: '1fbbe762169f60a022c37d98059868fad5b4d5bb2ff52522c68edb8ab5ee4380' + size_bytes: 21986 + source: 'gnome-settings-daemon-common_50.0-1ubuntu1_all.deb' + pinned_in: [] + - package: 'gnome-shell' + version: '50.1-0ubuntu1.2' + architecture: 'amd64' + sha256: 'c1966176f38017d05eae9ed5e14f54b7d5d798dca7cfcad50b2ab7de2ec32f88' + size_bytes: 977594 + source: 'gnome-shell_50.1-0ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'gnome-shell-common' + version: '50.1-0ubuntu1.2' + architecture: 'all' + sha256: '86da4316ab54d045a96e65b96eb28ec283b63cbb389f55a2e3ae05336eb53dbf' + size_bytes: 187668 + source: 'gnome-shell-common_50.1-0ubuntu1.2_all.deb' + pinned_in: [] + - package: 'gnome-shell-ubuntu-extensions' + version: '50.26.04.7ubuntu' + architecture: 'all' + sha256: 'ac1bd47a587cb8b803dcf3197782e5f79e3a8d3c795f784024ea9c3f44584458' + size_bytes: 293280 + source: 'gnome-shell-ubuntu-extensions_50.26.04.7ubuntu_all.deb' + pinned_in: [] + - package: 'gnome-terminal' + version: '3.58.0-1ubuntu1' + architecture: 'amd64' + sha256: 'c0af28a928f92cbcbd6a4262dedbf02240a7ede9c534b8e5c24f00e741d68690' + size_bytes: 224256 + source: 'gnome-terminal_3.58.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gnome-terminal-data' + version: '3.58.0-1ubuntu1' + architecture: 'all' + sha256: '3edefea99bca8b45f95c03f8e77212ce2c217318742d50084ca4f386975dc7e5' + size_bytes: 40002 + source: 'gnome-terminal-data_3.58.0-1ubuntu1_all.deb' + pinned_in: [] + - package: 'gnome-text-editor' + version: '50.1-0ubuntu0.1' + architecture: 'amd64' + sha256: '375aa2fe53a81a570105584ff837a2c6038117b0cc9171349c055e0cc6388c03' + size_bytes: 199186 + source: 'gnome-text-editor_50.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gnome-themes-extra' + version: '3.28-5' + architecture: 'amd64' + sha256: '0adbe694cc05b4739a41c7e3cafc0f86d60317f489b91c90771f6b7ff399ba2e' + size_bytes: 15330 + source: 'gnome-themes-extra_3.28-5_amd64.deb' + pinned_in: [] + - package: 'gnome-themes-extra-data' + version: '3.28-5' + architecture: 'all' + sha256: '854250372b1e17260666f2f92258aff060c3299b82a220ff348cf5aa2534dbf9' + size_bytes: 69392 + source: 'gnome-themes-extra-data_3.28-5_all.deb' + pinned_in: [] + - package: 'gnome-user-docs' + version: '50.0-0ubuntu1' + architecture: 'all' + sha256: 'a02b2d43d6761b44d84ec9f4e106869ec23a4cf955c0cb12081f9bbfc8efc637' + size_bytes: 1842124 + source: 'gnome-user-docs_50.0-0ubuntu1_all.deb' + pinned_in: [] + - package: 'gnupg' + version: '2.4.8-4ubuntu3.1' + architecture: 'all' + sha256: 'f8e4e754a843b1334e90092aac4c24433836d0756c996f37822d33905f2596e5' + size_bytes: 310662 + source: 'gnupg_2.4.8-4ubuntu3.1_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'gpg-wks-client' + version: '2.4.8-4ubuntu3.1' + architecture: 'amd64' + sha256: '5cec1674a1c09cfb5d5eeb0f8fcb37a2ae5396b6271946d133c6755320fc1e0a' + size_bytes: 71934 + source: 'gpg-wks-client_2.4.8-4ubuntu3.1_amd64.deb' + pinned_in: [] + - package: 'groff-base' + version: '1.23.0-10' + architecture: 'amd64' + sha256: 'ffd67d3d60092b772b8276fb087f5a328a7ee7dafba197f16fc874cba5320279' + size_bytes: 1023374 + source: 'groff-base_1.23.0-10_amd64.deb' + pinned_in: [] + - package: 'grub-common' + version: '2.14-2ubuntu2.1' + architecture: 'amd64' + sha256: '7be8b3a7e40ea3f4d125521291cecda828f2051419472d167896d78b011d90f6' + size_bytes: 2238 + source: 'grub-common_2.14-2ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'grub2-common' + version: '2.14-2ubuntu2.1' + architecture: 'amd64' + sha256: '588adef32c4e4cb41f3cb82a0d0d24e5200e69071f4febeda91a84889217b2d1' + size_bytes: 2585520 + source: 'grub2-common_2.14-2ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'gsettings-desktop-schemas' + version: '50.0-1ubuntu2' + architecture: 'all' + sha256: '491a48fd8f64611584e08be7069ffc0aa2b1a97c8fef38c1c9239a5b590369fd' + size_bytes: 37776 + source: 'gsettings-desktop-schemas_50.0-1ubuntu2_all.deb' + pinned_in: [] + - package: 'gsettings-ubuntu-schemas' + version: '0.0.7+21.10.20210712-0ubuntu4' + architecture: 'all' + sha256: 'fc2a103eaa71218206013f6f07aa234bf4d8c0f2fd6f412d3addf09d91eef295' + size_bytes: 5700 + source: 'gsettings-ubuntu-schemas_0.0.7+21.10.20210712-0ubuntu4_all.deb' + pinned_in: [] + - package: 'gst-audio-thumbnailer' + version: '1.0.0-0ubuntu1' + architecture: 'amd64' + sha256: '10c58092417e275eb7eced7dcf3f544f42f892149537ffa6efb3f014d0b6f20d' + size_bytes: 315220 + source: 'gst-audio-thumbnailer_1.0.0-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gst-video-thumbnailer' + version: '1.0.0-0ubuntu1' + architecture: 'amd64' + sha256: '92a9e31d167a2e07ce2aec86c334decbba0799ae8b39de09f183932e97b068da' + size_bytes: 332054 + source: 'gst-video-thumbnailer_1.0.0-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-alsa' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '0032c217aa171f4be9f002ee701dfa36e7fa27ffc2e75087a430f4e96fb6e5e3' + size_bytes: 50938 + source: 'gstreamer1.0-alsa_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-gl' + version: '1.28.2-1' + architecture: 'amd64' + sha256: 'aa92038413d2ed5f07c22fb396840b284bae8399f1ae7786d94bb48fea0d40a5' + size_bytes: 128572 + source: 'gstreamer1.0-gl_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-packagekit' + version: '1.3.4-3ubuntu1.2' + architecture: 'amd64' + sha256: '4d0a0f3f19a298878ee888cd303305395889416db0995e66276d7beca586cf08' + size_bytes: 9346 + source: 'gstreamer1.0-packagekit_1.3.4-3ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-pipewire' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: '19295cf1ca0e20eb755f4c0c284e5379d036f96bfb28ff5a4ed7f4eccfe23e3f' + size_bytes: 71960 + source: 'gstreamer1.0-pipewire_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-plugins-base' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '6389c16d6133e72c6619d295bc3675a89141dbe81868ecf26b55e81baaa26e7a' + size_bytes: 750140 + source: 'gstreamer1.0-plugins-base_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-plugins-base-apps' + version: '1.28.2-1' + architecture: 'amd64' + sha256: 'da22a622e6149053492c065c95220cbba91b7d952d2b9a7719c2b091c4a4b7a2' + size_bytes: 46044 + source: 'gstreamer1.0-plugins-base-apps_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-plugins-good' + version: '1.28.2-2ubuntu0.1' + architecture: 'amd64' + sha256: '6d66475d950ef45b4f33908c496f3044deacd0db25f2738b1460b322e87d9916' + size_bytes: 2311062 + source: 'gstreamer1.0-plugins-good_1.28.2-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-tools' + version: '1.28.2-1' + architecture: 'amd64' + sha256: 'f78ede6b2d0c94007d462f009b8dff08471f9dec72b1ca0d758f87cb41dc7a2c' + size_bytes: 75806 + source: 'gstreamer1.0-tools_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gstreamer1.0-x' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '4d37e49a702394a3a95dd40ccde5b3c3fbee4139f86eb06e580f3704dd831f56' + size_bytes: 91746 + source: 'gstreamer1.0-x_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'gtk-update-icon-cache' + version: '4.22.4+ds-0ubuntu0.1' + architecture: 'amd64' + sha256: 'd9cc7406c53f609ab81cb5b95b965ab926f711d7d7ea0711151cf36d5c1f2826' + size_bytes: 42654 + source: 'gtk-update-icon-cache_4.22.4+ds-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'gtk2-engines-murrine' + version: '0.98.2-4ubuntu1' + architecture: 'amd64' + sha256: 'c31cc39a0c578f3e0bc5f8a75b35ffc66efe12855ac6ea97124d610073f4a0c9' + size_bytes: 106666 + source: 'gtk2-engines-murrine_0.98.2-4ubuntu1_amd64.deb' + pinned_in: [] + - package: 'gtk2-engines-pixbuf' + version: '2.24.33-10' + architecture: 'amd64' + sha256: '7f3c1edcea66228effc506b3b1a02aff7489d8626b7900419c8afbd4b0b5a141' + size_bytes: 26146 + source: 'gtk2-engines-pixbuf_2.24.33-10_amd64.deb' + pinned_in: [] + - package: 'gvfs' + version: '1.60.0-1' + architecture: 'amd64' + sha256: '1d058f1415c579b0c9bb6f6588c85a25240c4fa6c5c334043ef642e5eb1bd9d6' + size_bytes: 118520 + source: 'gvfs_1.60.0-1_amd64.deb' + pinned_in: [] + - package: 'gvfs-backends' + version: '1.60.0-1' + architecture: 'amd64' + sha256: '47539a412eddf1cee2177c70bd01da7f2fe21f5a35868edbfe1e777f58f0c178' + size_bytes: 356068 + source: 'gvfs-backends_1.60.0-1_amd64.deb' + pinned_in: [] + - package: 'gvfs-common' + version: '1.60.0-1' + architecture: 'all' + sha256: 'a280c7264c469e06a3df31e5fe8581adddf7a071d7722797738af2bd92488248' + size_bytes: 10894 + source: 'gvfs-common_1.60.0-1_all.deb' + pinned_in: [] + - package: 'gvfs-daemons' + version: '1.60.0-1' + architecture: 'amd64' + sha256: 'dd047e0a614dacc96762a1030314eb2fab2e065e66d1a30f6ecc7cbb5aac426f' + size_bytes: 110822 + source: 'gvfs-daemons_1.60.0-1_amd64.deb' + pinned_in: [] + - package: 'gvfs-fuse' + version: '1.60.0-1' + architecture: 'amd64' + sha256: 'b6bce8501e70ee42738e89d5166d18ebff03322782a08e81b5c066249fa97403' + size_bytes: 21284 + source: 'gvfs-fuse_1.60.0-1_amd64.deb' + pinned_in: [] + - package: 'gvfs-libs' + version: '1.60.0-1' + architecture: 'amd64' + sha256: '201416c07aeccf80838f6e2ea7991c2f69039b2259a98b91bfbc1527dc1df433' + size_bytes: 106344 + source: 'gvfs-libs_1.60.0-1_amd64.deb' + pinned_in: [] + - package: 'heif-gdk-pixbuf' + version: '1.21.2-3ubuntu0.4' + architecture: 'amd64' + sha256: '6df182c82992359537e1e1440901cf69a9eb64b554d3e295ea3f28266afcdd0c' + size_bytes: 7760 + source: 'heif-gdk-pixbuf_1.21.2-3ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'heif-thumbnailer' + version: '1.21.2-3ubuntu0.4' + architecture: 'amd64' + sha256: '95523beeec9ae5c34af9abc41f328864e627c7626dd4c89f77fe116edc7397a6' + size_bytes: 14764 + source: 'heif-thumbnailer_1.21.2-3ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'hicolor-icon-theme' + version: '0.18-2build1' + architecture: 'all' + sha256: 'd05726c4a4dc15079ed2bd6ef633e7d6dca4c4be20296148b1c558dbd5a6c570' + size_bytes: 13154 + source: 'hicolor-icon-theme_0.18-2build1_all.deb' + pinned_in: [] + - package: 'hplip' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'amd64' + sha256: '83840ce5ea10fe5b07129515ac6ab935869f83bbb7dfe47d6303b76ecea1b6d4' + size_bytes: 205862 + source: 'hplip_3.24.4+dfsg0-0ubuntu8.1_amd64.deb' + pinned_in: [] + - package: 'hplip-data' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'all' + sha256: 'b950f206c33b641217df8102a5e362f7600c58cc27709835904becf5ced3eeec' + size_bytes: 6462222 + source: 'hplip-data_3.24.4+dfsg0-0ubuntu8.1_all.deb' + pinned_in: [] + - package: 'hunspell-en-us' + version: '1:2020.12.07-4build1' + architecture: 'all' + sha256: '81820320c9bd2cbceef26783ef8d9f78e7deba57b1c47944ef82662a7632ad3e' + size_bytes: 585498 + source: 'hunspell-en-us_1%3a2020.12.07-4build1_all.deb' + pinned_in: [] + - package: 'hwctl' + version: '0.11.0-0ubuntu1' + architecture: 'amd64' + sha256: 'c4c6393598d467b56a85ae8c1146820ab76a94b83ffe47ea2d50adf5c5e6a7a4' + size_bytes: 567132 + source: 'hwctl_0.11.0-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'ibus' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: '4e08784f24ec54cbd28ffeb05518a684e5afb4d634dcf2e3c3d5a016ff430bc0' + size_bytes: 340792 + source: 'ibus_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'ibus-data' + version: '1.5.34~rc2-1' + architecture: 'all' + sha256: '0a767edbc7cfb46625b582638105e9ccfee8306cb5197c462ce55ec06dd1429b' + size_bytes: 15528472 + source: 'ibus-data_1.5.34~rc2-1_all.deb' + pinned_in: [] + - package: 'ibus-gtk' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: '554addd5de37663a727d1a10533e33cc69d9aed744c37d0a0b6db895e5d3c956' + size_bytes: 19122 + source: 'ibus-gtk_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'ibus-gtk3' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: '70ef1c0f5670fd0c1406085426e3ef0ad677aac644b290c0598222648af714b8' + size_bytes: 19686 + source: 'ibus-gtk3_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'ibus-gtk4' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: '88208f87c4b68592f652732c55309501c7a51b7962c0641c2a138e8e4f5b6daf' + size_bytes: 18942 + source: 'ibus-gtk4_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'ibus-table' + version: '1.17.16-1build1' + architecture: 'all' + sha256: '76be4846deaa16ad325ea238628dbe628d7c257c0cbdb3f6a6abaca82c541f57' + size_bytes: 982100 + source: 'ibus-table_1.17.16-1build1_all.deb' + pinned_in: [] + - package: 'ibverbs-providers' + version: '61.0-2ubuntu3' + architecture: 'amd64' + sha256: '2bc9b503295271f8dd82cf40644a4a9b3af86e1bfb93c3396aa96c1c56ad34b4' + size_bytes: 416890 + source: 'ibverbs-providers_61.0-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'iio-sensor-proxy' + version: '3.8-1' + architecture: 'amd64' + sha256: '73b84bd1bb96ab4874d86e2818c3e0a992e8071a959c86650255c2160ea7e074' + size_bytes: 38732 + source: 'iio-sensor-proxy_3.8-1_amd64.deb' + pinned_in: [] + - package: 'im-config' + version: '0.62' + architecture: 'all' + sha256: '20a83ff67deb010b3481cb58dfd7a7b099c21342d537d9b9f82714f59dd00e17' + size_bytes: 29754 + source: 'im-config_0.62_all.deb' + pinned_in: [] + - package: 'initramfs-tools-bin' + version: '0.151ubuntu1' + architecture: 'amd64' + sha256: '83301b7dd2a75b441df2bbfb33effac401c52d5eb61475e206eeaf09151e9db4' + size_bytes: 24218 + source: 'initramfs-tools-bin_0.151ubuntu1_amd64.deb' + pinned_in: [] + - package: 'initramfs-tools-core' + version: '0.151ubuntu1' + architecture: 'all' + sha256: '09a2413b6d4e5719c795ed9fd3b6b6e3396274513d6d8b232ca79dc6d9ebc46c' + size_bytes: 50322 + source: 'initramfs-tools-core_0.151ubuntu1_all.deb' + pinned_in: [] + - package: 'inputattach' + version: '1:1.8.1-2build2' + architecture: 'amd64' + sha256: 'ff86079a30e84f6f2ee1540b4dcdf1ca08e692b9490b4934be5450ecc6e7e51c' + size_bytes: 23872 + source: 'inputattach_1%3a1.8.1-2build2_amd64.deb' + pinned_in: [] + - package: 'ipmitool' + version: '1.8.19-10ubuntu1' + architecture: 'amd64' + sha256: '11730b6274a3c1365c43e5a649e96628469394a584eeae12f980ecd84ac9e795' + size_bytes: 2122492 + source: 'ipmitool_1.8.19-10ubuntu1_amd64.deb' + pinned_in: [] + - package: 'ipp-usb' + version: '0.9.31-1' + architecture: 'amd64' + sha256: 'e2619fada03a5061350c82db7a45be95ee5837029f8a1b7272adf4fa5398850a' + size_bytes: 2513816 + source: 'ipp-usb_0.9.31-1_amd64.deb' + pinned_in: [] + - package: 'iproute2' + version: '6.19.0-1ubuntu1.1' + architecture: 'amd64' + sha256: '05e53ae079adf844a11d1a531acd96b2b2021be130ac2f0bd49166bce3bd0f98' + size_bytes: 1197918 + source: 'iproute2_6.19.0-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'iptables' + version: '1.8.11-2ubuntu3' + architecture: 'amd64' + sha256: '187b16f9375f53ce6a1618a29de52bb177b620589ada29e4a3e25de5d594e66f' + size_bytes: 381074 + source: 'iptables_1.8.11-2ubuntu3_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'iso-codes' + version: '4.20.1-1' + architecture: 'all' + sha256: '7df9871f8f18c779cca92b04c87f6e727f4e11caa3bf0f233ff7d10a9ad2bb0d' + size_bytes: 3898972 + source: 'iso-codes_4.20.1-1_all.deb' + pinned_in: [] + - package: 'iw' + version: '6.17-1' + architecture: 'amd64' + sha256: '5addb9bf7cddd0b0582d1bfe62f003598368cf15b0604584821a24b81326296a' + size_bytes: 117672 + source: 'iw_6.17-1_amd64.deb' + pinned_in: [] + - package: 'jq' + version: '1.8.1-4ubuntu2' + architecture: 'amd64' + sha256: 'bb7f69de12414f6e52eea1da952ed7226b8e3fd9db74f93bb8ea3f2f39f4836f' + size_bytes: 72432 + source: 'jq_1.8.1-4ubuntu2_amd64.deb' + pinned_in: [] + - package: 'kbd' + version: '2.7.1-2ubuntu2' + architecture: 'amd64' + sha256: '1399e779f027563729c1895ba3ac314e2ea966e37e5c984840d689298352934e' + size_bytes: 238014 + source: 'kbd_2.7.1-2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'kdump-tools' + version: '1:1.10.7ubuntu3' + architecture: 'amd64' + sha256: 'd886c44f8171c8cb033ac8e26e494d195c145520911bf1c84cf66364753a6e57' + size_bytes: 36804 + source: 'kdump-tools_1%3a1.10.7ubuntu3_amd64.deb' + pinned_in: [] + - package: 'kexec-tools' + version: '1:2.0.32-3ubuntu1' + architecture: 'amd64' + sha256: '13605d639a06aac649ab3181ea02f33a2b9b501e47c6b8ba5dc03bf94b9b5c74' + size_bytes: 99890 + source: 'kexec-tools_1%3a2.0.32-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'keyboard-configuration' + version: '1.237ubuntu3.1' + architecture: 'all' + sha256: '65b766338253578922435d755873baae2c4c008623181eb85ff7ddbfbfe7cf32' + size_bytes: 211372 + source: 'keyboard-configuration_1.237ubuntu3.1_all.deb' + pinned_in: [] + - package: 'klibc-utils' + version: '2.0.14-1ubuntu2' + architecture: 'amd64' + sha256: '642657e87e56184a3d696f35019531ece1f7fd1b220c3df79776e7dba756cc16' + size_bytes: 100130 + source: 'klibc-utils_2.0.14-1ubuntu2_amd64.deb' + pinned_in: [] + - package: 'kmod' + version: '34.2-2ubuntu2' + architecture: 'amd64' + sha256: '5595fb6bb2fba1dc53e005e17d24a389450296bdc5defb19dbcc0aa0ae33ae91' + size_bytes: 100832 + source: 'kmod_34.2-2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'language-selector-common' + version: '0.228build1' + architecture: 'all' + sha256: '4d5dba0f03c9862803a29499bc0010907a4d93898a455cfce65f6a485d3a4bed' + size_bytes: 260882 + source: 'language-selector-common_0.228build1_all.deb' + pinned_in: [] + - package: 'language-selector-gnome' + version: '0.228build1' + architecture: 'all' + sha256: 'be0ce5cd9cc184a88dc7c3ce02a2dce23d258b4b2b828c916f9ca08325681f81' + size_bytes: 19718 + source: 'language-selector-gnome_0.228build1_all.deb' + pinned_in: [] + - package: 'laptop-detect' + version: '0.16+nmu1build1' + architecture: 'all' + sha256: 'dec803016e6f7c30d6dfe104ba5874f8342985608d7db96c95cb647a0f91fdf6' + size_bytes: 5076 + source: 'laptop-detect_0.16+nmu1build1_all.deb' + pinned_in: [] + - package: 'ldap-utils' + version: '2.6.10+dfsg-1ubuntu5' + architecture: 'amd64' + sha256: 'ff4e8b04702304536f412378bcc1271ec196b0e99461245290d4a6cae4fa0fc8' + size_bytes: 152194 + source: 'ldap-utils_2.6.10+dfsg-1ubuntu5_amd64.deb' + pinned_in: [] + - package: 'less' + version: '668-1build1' + architecture: 'amd64' + sha256: '45720ff981ef4c34b44e62cf1b5fd73dcb3d16031120387307e899f480d78092' + size_bytes: 171848 + source: 'less_668-1build1_amd64.deb' + pinned_in: [] + - package: 'libaa1' + version: '1.4p5-51.1build1' + architecture: 'amd64' + sha256: '29d70bf6215e766de874e13b242de0fd168c6e769ae20d93089830d99478aefe' + size_bytes: 50800 + source: 'libaa1_1.4p5-51.1build1_amd64.deb' + pinned_in: [] + - package: 'libabsl20260107' + version: '20260107.0-4' + architecture: 'amd64' + sha256: '84c1afe45fdeada1772ab88be29e21b9e0970174bac3dc348e8f797d8f6f073f' + size_bytes: 587956 + source: 'libabsl20260107_20260107.0-4_amd64.deb' + pinned_in: [] + - package: 'libaccountsservice0' + version: '23.13.9-8ubuntu5.2' + architecture: 'amd64' + sha256: '4c3bca934a145513f39fbc9ff1baa98e422b4b293a3b4a07534ad995850e01c9' + size_bytes: 62844 + source: 'libaccountsservice0_23.13.9-8ubuntu5.2_amd64.deb' + pinned_in: [] + - package: 'libadwaita-1-0' + version: '1.9.1-0ubuntu0.1' + architecture: 'amd64' + sha256: 'b8634157cc1efd09fee058e19df34faf004e536b0410b13367e814fb3f2b190b' + size_bytes: 529720 + source: 'libadwaita-1-0_1.9.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libao-common' + version: '1.2.2+20180113-1.2ubuntu2' + architecture: 'all' + sha256: 'bf04acc24a9fca9b23b70138668931c73740fc7762e79f5673aa7d36799eaef1' + size_bytes: 5876 + source: 'libao-common_1.2.2+20180113-1.2ubuntu2_all.deb' + pinned_in: [] + - package: 'libao4' + version: '1.2.2+20180113-1.2ubuntu2' + architecture: 'amd64' + sha256: 'e29b0d0da895ed0d6f295f685fdfd15f78902c82cee72d1724f9961f735680f3' + size_bytes: 33850 + source: 'libao4_1.2.2+20180113-1.2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libaom3' + version: '3.13.1-2ubuntu0.1' + architecture: 'amd64' + sha256: '74d46764b6b336d15682fb7d6203e6e1052be4ffb1ec371237989bab59fa829d' + size_bytes: 1969262 + source: 'libaom3_3.13.1-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libapparmor1' + version: '5.0.2-0ubuntu1~26.04.1' + architecture: 'amd64' + sha256: '50570ebe581bbfeead4403571b75ee275955c6bcbd1b4bf342228772549162b9' + size_bytes: 51292 + source: 'libapparmor1_5.0.2-0ubuntu1~26.04.1_amd64.deb' + pinned_in: [] + - package: 'libappstream5' + version: '1.1.2-1' + architecture: 'amd64' + sha256: '7269ad98c70e9696ba3b8d78ca2c876224acfd0b2a3bb960e7f23a2c8d2207cb' + size_bytes: 240636 + source: 'libappstream5_1.1.2-1_amd64.deb' + pinned_in: [] + - package: 'libarchive13t64' + version: '3.8.5-1ubuntu2.2' + architecture: 'amd64' + sha256: '3e069924c6d18381485c9cfa148f290dc3e8c8f31720aee8f1943c704116a361' + size_bytes: 397050 + source: 'libarchive13t64_3.8.5-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libasound2-data' + version: '1.2.15.3-1ubuntu1.1' + architecture: 'all' + sha256: 'aad0eb27b9fab12c9fa9ed0b223c7ce871003fd3a564ad8eca4ecdea978ac347' + size_bytes: 19568 + source: 'libasound2-data_1.2.15.3-1ubuntu1.1_all.deb' + pinned_in: [] + - package: 'libasound2t64' + version: '1.2.15.3-1ubuntu1.1' + architecture: 'amd64' + sha256: '96e20cf5c9095ef54ba46fccffea5c01cf2de17a1012c5683a67e43504a6d726' + size_bytes: 415812 + source: 'libasound2t64_1.2.15.3-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libaspell15' + version: '0.60.8.2-3' + architecture: 'amd64' + sha256: 'dca532c0b95cfd23580dfc613f3525efd878c0451c2e85a54bea26324eeb1d56' + size_bytes: 332956 + source: 'libaspell15_0.60.8.2-3_amd64.deb' + pinned_in: [] + - package: 'libasyncns0' + version: '0.8-7' + architecture: 'amd64' + sha256: '952ea8a8d01a4fe98ff8379553a7a3764492897464c2684105f76ebb6b19939a' + size_bytes: 12384 + source: 'libasyncns0_0.8-7_amd64.deb' + pinned_in: [] + - package: 'libatasmart4' + version: '0.19-6' + architecture: 'amd64' + sha256: '335bc0c05e62ce81e5cc05424bf75baa0a56f288e1e9a3c59618f85b99d44607' + size_bytes: 24982 + source: 'libatasmart4_0.19-6_amd64.deb' + pinned_in: [] + - package: 'libatk-adaptor' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: '79c0fe32b0dd6e5c8eaa6879bc9d5280951247573d5d3dc01a3e81027d2c8e69' + size_bytes: 6256 + source: 'libatk-adaptor_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libatk-bridge2.0-0t64' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: 'c634e1fd25dff5d0ff5384bf3ac9d784725e776448591283cee67deaced29c27' + size_bytes: 67230 + source: 'libatk-bridge2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libatk1.0-0t64' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: '6308ae8c10599780f0e672a39930c07639523bf3f7406f90ee7dada6acd505a0' + size_bytes: 53538 + source: 'libatk1.0-0t64_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libatomic1' + version: '16-20260322-1ubuntu1' + architecture: 'amd64' + sha256: '82fa61135e7154d7958feaa91ec1808a688eb1e0e06822ab35e99e2480feb148' + size_bytes: 11396 + source: 'libatomic1_16-20260322-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libatopology2t64' + version: '1.2.15.3-1ubuntu1.1' + architecture: 'amd64' + sha256: '44018a675fd0fa79176c9f3fa5440f16dfc62ccd5870d0336d7b13dbdab19ad7' + size_bytes: 49944 + source: 'libatopology2t64_1.2.15.3-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libatspi2.0-0t64' + version: '2.60.4-0ubuntu0.1' + architecture: 'amd64' + sha256: '6db6e1d7d40f15d38ab5ec302463ac502a057560294d9c73ede22998f733fbd8' + size_bytes: 85514 + source: 'libatspi2.0-0t64_2.60.4-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libauthen-sasl-perl' + version: '2.2000-1' + architecture: 'all' + sha256: '859bdfa2180edb7d88081bb5cbfbc6a31e6560ca4632233d1d0c76d22e77fe27' + size_bytes: 47766 + source: 'libauthen-sasl-perl_2.2000-1_all.deb' + pinned_in: [] + - package: 'libavahi-client3' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: 'a0677750521663c898d25ddd0566127712ff4803108ec67182330a27fce85774' + size_bytes: 27220 + source: 'libavahi-client3_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libavahi-common-data' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: 'db013cab614418c47073faac4e16f652cb4532458cd8b919f70c717f235d1091' + size_bytes: 27194 + source: 'libavahi-common-data_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libavahi-common3' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: '2213977fd25dab90f3566d3163576955eb74dc89954c48ba6e2bd960fdcd45e2' + size_bytes: 23580 + source: 'libavahi-common3_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libavahi-core7' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: '5c2b3ffd155675dcfc49f7da3f69648a021feaaeec38c9ff9185f5521015eb63' + size_bytes: 89102 + source: 'libavahi-core7_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libavahi-glib1' + version: '0.8-18ubuntu1.1' + architecture: 'amd64' + sha256: '4e80e023d5b9d15cb65c15b100a8834d3d59f773d087e54a499e21a2a8e55358' + size_bytes: 8246 + source: 'libavahi-glib1_0.8-18ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libavc1394-0' + version: '0.5.4-5build4' + architecture: 'amd64' + sha256: '00d5ebc6da7c640cdd03e4fd398d11e66afd3087f4cd2b73ee0d0efb372a5995' + size_bytes: 15410 + source: 'libavc1394-0_0.5.4-5build4_amd64.deb' + pinned_in: [] + - package: 'libayatana-appindicator3-1' + version: '0.5.94-1build1' + architecture: 'amd64' + sha256: 'bd33f95efc37c2dfe11d8fd365524d124e96e48e4157c35bf0351fae3c494b9d' + size_bytes: 24744 + source: 'libayatana-appindicator3-1_0.5.94-1build1_amd64.deb' + pinned_in: [] + - package: 'libayatana-ido3-0.4-0' + version: '0.10.4-1build1' + architecture: 'amd64' + sha256: '4370ae093a09ec3b5193b080937ba73a23197c0d8aefb9b0ef964fbe156bb53a' + size_bytes: 57904 + source: 'libayatana-ido3-0.4-0_0.10.4-1build1_amd64.deb' + pinned_in: [] + - package: 'libayatana-indicator3-7' + version: '0.9.4-2' + architecture: 'amd64' + sha256: 'e86190cb4138ded3e408527d41e7e2bd56a7c651b17e1a53e6b0eb46a2533309' + size_bytes: 32018 + source: 'libayatana-indicator3-7_0.9.4-2_amd64.deb' + pinned_in: [] + - package: 'libbabeltrace1' + version: '1.5.11-5build1' + architecture: 'amd64' + sha256: 'ef5b7809f1d7fe9c62056bc970d15a43c621b11674a7a57d0ef2ccd61871014b' + size_bytes: 165286 + source: 'libbabeltrace1_1.5.11-5build1_amd64.deb' + pinned_in: [] + - package: 'libbasicobjects0t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: 'f310575ede5513d7f582da23ce4e9e38a10d2cefe08271829c884450e3080c96' + size_bytes: 6026 + source: 'libbasicobjects0t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libbinutils' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '1376a5e49c8dc2ba938fadc15fce40dd01c7fbf1adf2d506a2a7cf7148e347c8' + size_bytes: 602104 + source: 'libbinutils_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libblockdev-crypto3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'a1eecb757023cbc88ff0f13c9f65d843ca74419417a29e3fea2cff612518b2a0' + size_bytes: 24170 + source: 'libblockdev-crypto3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-fs3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'd18a23d5fdce332738e4784bd44450e57c6046d1b43fc180e69ab9daa4b5875e' + size_bytes: 35414 + source: 'libblockdev-fs3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-loop3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: '7c0ce083bd60bfc65fee6d55c4050b39326d55c82afcfdd890d78c61142f7646' + size_bytes: 7444 + source: 'libblockdev-loop3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-mdraid3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'f7ef2ac65630d37adae67180d424ea29f90d2850b73d0c2d904aa62dfad9d0f2' + size_bytes: 12584 + source: 'libblockdev-mdraid3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-nvme3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'fa0ac345e58510dcef6102a8102bb09817deef65ab218a0f8216920a1e7e0bd5' + size_bytes: 17526 + source: 'libblockdev-nvme3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-part3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'b9df3dee433e55262dbe0c29c49c70457874c5ac79e97880b78972abf36f9b6f' + size_bytes: 15404 + source: 'libblockdev-part3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-smart3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: '1c1257fb1cd58cf21cc68e3dd6dcff4dccb65d10ade391047006f329247bd665' + size_bytes: 10554 + source: 'libblockdev-smart3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-swap3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'c138e325d4aa11172ae076d84953b64dda2edacc30c3262fb5d848037c6b3e76' + size_bytes: 7754 + source: 'libblockdev-swap3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev-utils3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'f70cbf557395fed9df4589d961b281a65450329c9bccd179f4190bb1244c4eb1' + size_bytes: 20104 + source: 'libblockdev-utils3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libblockdev3' + version: '3.4.0-1' + architecture: 'amd64' + sha256: 'c633448d605b5aa028184c60a1240b942fa2896b46ee1c832ac524c26347cffa' + size_bytes: 49736 + source: 'libblockdev3_3.4.0-1_amd64.deb' + pinned_in: [] + - package: 'libbluetooth3' + version: '5.85-4ubuntu0.2' + architecture: 'amd64' + sha256: 'b78dddd9ea8caf8ae075be519b79ca69689f6b8ce98727f0942cb81fcb0c69f9' + size_bytes: 78170 + source: 'libbluetooth3_5.85-4ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libbpf1' + version: '1:1.6.3-1ubuntu1' + architecture: 'amd64' + sha256: 'ec7e4acb71b824e218da4d78496b44827d2a33100e7230732002d3459872e993' + size_bytes: 184746 + source: 'libbpf1_1%3a1.6.3-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libbrlapi0.8' + version: '6.7-1ubuntu6' + architecture: 'amd64' + sha256: 'b3218fd4461a1b5f59cc28b5213e521cf251f0d55fd068c02c15d2777ff4c305' + size_bytes: 28614 + source: 'libbrlapi0.8_6.7-1ubuntu6_amd64.deb' + pinned_in: [] + - package: 'libbrotli1' + version: '1.2.0-3build1' + architecture: 'amd64' + sha256: '858242571fc2585c1f8eb83ae01d020f0f4a92679d0de8fe31146f6687bdd84a' + size_bytes: 342830 + source: 'libbrotli1_1.2.0-3build1_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'libbytesize-common' + version: '2.12-1' + architecture: 'all' + sha256: 'cb6b60c0a0f6f0876b3d5cc2ff6d7a8ac678090df3ffb780ed62c45cc74a3448' + size_bytes: 3482 + source: 'libbytesize-common_2.12-1_all.deb' + pinned_in: [] + - package: 'libbytesize1' + version: '2.12-1' + architecture: 'amd64' + sha256: '8360d35d1d98e7ce7a2e0d1084bac7ff2d63abf9c0dcbfa57799b23efe3c3d13' + size_bytes: 13610 + source: 'libbytesize1_2.12-1_amd64.deb' + pinned_in: [] + - package: 'libc6-dbg' + version: '2.43-2ubuntu2.4' + architecture: 'amd64' + sha256: '523851368691971a1553c7dacc7cf9e0cd54a78ca70bbdd735d932f16e089ae3' + size_bytes: 6405752 + source: 'libc6-dbg_2.43-2ubuntu2.4_amd64.deb' + pinned_in: [] + - package: 'libcaca0' + version: '0.99.beta20-6ubuntu2.1' + architecture: 'amd64' + sha256: 'b96575004d6529c128492bf21a937f97c7728e4c88a19a50b4d9eee950780170' + size_bytes: 204812 + source: 'libcaca0_0.99.beta20-6ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'libcairo-gobject-perl' + version: '1.005-4build4' + architecture: 'amd64' + sha256: '3156aef0a54b1c864105e951fc61e6fd02c733716a8424895229e5fcbfb0d691' + size_bytes: 11960 + source: 'libcairo-gobject-perl_1.005-4build4_amd64.deb' + pinned_in: [] + - package: 'libcairo-gobject2' + version: '1.18.4-3' + architecture: 'amd64' + sha256: '1d48661d59bb164fc27e88bb8e6a8dab0cdfdbf35ea5d2bbf3ebffe849a38822' + size_bytes: 127288 + source: 'libcairo-gobject2_1.18.4-3_amd64.deb' + pinned_in: [] + - package: 'libcairo-perl' + version: '1.109-5build1' + architecture: 'amd64' + sha256: 'e8abeb2e59db3df6384bbc62b1ca1286c011b6ed977a38e6323718421e60a588' + size_bytes: 93514 + source: 'libcairo-perl_1.109-5build1_amd64.deb' + pinned_in: [] + - package: 'libcairo-script-interpreter2' + version: '1.18.4-3' + architecture: 'amd64' + sha256: '516ad272f711e3c4550307ff6d6e1cbc828e3f4744471ffa0389430739197c81' + size_bytes: 61364 + source: 'libcairo-script-interpreter2_1.18.4-3_amd64.deb' + pinned_in: [] + - package: 'libcairo2' + version: '1.18.4-3' + architecture: 'amd64' + sha256: '525ab7b5ad6529ea35aa09308ddd1fd2325c85ad70e7483ba66b526d8ee9f7a7' + size_bytes: 578678 + source: 'libcairo2_1.18.4-3_amd64.deb' + pinned_in: [] + - package: 'libcamel-1.2-64t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: '2f69745dd71354ee00e4243159168fe73678cc52a8ae4f89afbda91514282971' + size_bytes: 503908 + source: 'libcamel-1.2-64t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libcanberra-gtk3-0' + version: '0.30-18ubuntu3' + architecture: 'amd64' + sha256: '454c4152ede8df500babd20649ca94e7865c3fa3a6ba82e5cbfdaf6c28baac32' + size_bytes: 8270 + source: 'libcanberra-gtk3-0_0.30-18ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libcanberra-gtk3-module' + version: '0.30-18ubuntu3' + architecture: 'amd64' + sha256: '6f65c709a9a368b2501c23e007352e402bcc0e8e390609519d557d1d88be4498' + size_bytes: 10492 + source: 'libcanberra-gtk3-module_0.30-18ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libcanberra-pulse' + version: '0.30-18ubuntu3' + architecture: 'amd64' + sha256: '0cd567060da8080ead8656d97370e74918680b612f5fd832ea39afdb154246a4' + size_bytes: 12324 + source: 'libcanberra-pulse_0.30-18ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libcanberra0' + version: '0.30-18ubuntu3' + architecture: 'amd64' + sha256: 'c31767686f429f84db8723d7b864bf829e24269f235228415262fb52752cc667' + size_bytes: 40514 + source: 'libcanberra0_0.30-18ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libcap2' + version: '1:2.75-10ubuntu2' + architecture: 'amd64' + sha256: '150603a0792b1d22aa0bde0a26c27b413018c799284003e4b43cba587a5b3a18' + size_bytes: 29264 + source: 'libcap2_1%3a2.75-10ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libcap2-bin' + version: '1:2.75-10ubuntu2' + architecture: 'amd64' + sha256: 'd92a8f9affbd2277d191e65978ba2a194d00d00a04f52ee9d1bca2a2ba26697d' + size_bytes: 33524 + source: 'libcap2-bin_1%3a2.75-10ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libcares2' + version: '1.34.6-1' + architecture: 'amd64' + sha256: '163c4c1b52abbd150dd3d1e112cbf2db528d75c09146b36f69f535218319ce23' + size_bytes: 101600 + source: 'libcares2_1.34.6-1_amd64.deb' + pinned_in: [] + - package: 'libcbor0.10' + version: '0.10.2-2ubuntu3' + architecture: 'amd64' + sha256: '97153fe6f78a737d08227e7df8b185ddb064e69febdea8993ebde37a97b2527f' + size_bytes: 25286 + source: 'libcbor0.10_0.10.2-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libcdio-cdda2t64' + version: '10.2+2.0.2-2' + architecture: 'amd64' + sha256: 'd9863ed4c0e5591bbb3cbfe163005bcd529cc5fca3d439c1b3ae864e8c3c7440' + size_bytes: 16850 + source: 'libcdio-cdda2t64_10.2+2.0.2-2_amd64.deb' + pinned_in: [] + - package: 'libcdio-paranoia2t64' + version: '10.2+2.0.2-2' + architecture: 'amd64' + sha256: 'eec8f3e7074d73520122a503ade4620c91151611383451ff9ceffbf98b76aa6c' + size_bytes: 17134 + source: 'libcdio-paranoia2t64_10.2+2.0.2-2_amd64.deb' + pinned_in: [] + - package: 'libcdio19t64' + version: '2.2.0-4build1' + architecture: 'amd64' + sha256: '6643707a81accf28c9a3b6c205e945a460343f9a26867a831ed4e62ef421fadd' + size_bytes: 64266 + source: 'libcdio19t64_2.2.0-4build1_amd64.deb' + pinned_in: [] + - package: 'libcdparanoia0' + version: '3.10.2+debian-14ubuntu2' + architecture: 'amd64' + sha256: 'f40173218707554907b32bb3f3d695817f7fb1bf3b0e7acb9746a5ac69a56ebb' + size_bytes: 48274 + source: 'libcdparanoia0_3.10.2+debian-14ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libclone-perl' + version: '0.47-1' + architecture: 'amd64' + sha256: '93718230fcba6109ee3f7c3076496e85dcfb440692d1a68cd1b011ef749105a0' + size_bytes: 10710 + source: 'libclone-perl_0.47-1_amd64.deb' + pinned_in: [] + - package: 'libcollection4t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: '92cf4d36ead1d45befaf898944301c9198b2862b6657b24fbab08f4aa119eafc' + size_bytes: 23414 + source: 'libcollection4t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libcolord-gtk4-1t64' + version: '0.3.1-2' + architecture: 'amd64' + sha256: 'a9c38484d7baa9c4a07e5dcde89382d707a6f50d22a9de4a7b15b026154a4e86' + size_bytes: 17460 + source: 'libcolord-gtk4-1t64_0.3.1-2_amd64.deb' + pinned_in: [] + - package: 'libcolord2' + version: '1.4.8-3' + architecture: 'amd64' + sha256: '063718186165d691f1b14d77d6ae7abefaf567c7331a463cbe97fa4a1e0b0fac' + size_bytes: 149688 + source: 'libcolord2_1.4.8-3_amd64.deb' + pinned_in: [] + - package: 'libcolorhug2' + version: '1.4.8-3' + architecture: 'amd64' + sha256: '9788d12ff3b66451918b1689aca52d39ef09775b423fb46846bd2948cef7596d' + size_bytes: 38318 + source: 'libcolorhug2_1.4.8-3_amd64.deb' + pinned_in: [] + - package: 'libcrack2' + version: '2.9.6-5.2build3' + architecture: 'amd64' + sha256: '7236fa656d64c8d99fddf1bf108ecc9bb408e821d1bd4f684b1f0ac70467628c' + size_bytes: 27970 + source: 'libcrack2_2.9.6-5.2build3_amd64.deb' + pinned_in: [] + - package: 'libcrypt-urandom-perl' + version: '0.55-1' + architecture: 'amd64' + sha256: 'a243fe9d0c0a2cba1425031aca048fcc7dfc8a05ec13e59e4da498f9b56d593e' + size_bytes: 14832 + source: 'libcrypt-urandom-perl_0.55-1_amd64.deb' + pinned_in: [] + - package: 'libcryptsetup12' + version: '2:2.8.4-1ubuntu4' + architecture: 'amd64' + sha256: 'b391ec9f41abc8d303c0ac90105a69737f901d427f1c29a267346c0ad73fa56c' + size_bytes: 270892 + source: 'libcryptsetup12_2%3a2.8.4-1ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libctf-nobfd0' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '5ca038ae110ddf65e190b9fe88822592abd45cecba5001f3e4ce7692ca1f31be' + size_bytes: 101990 + source: 'libctf-nobfd0_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libctf0' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '34b1757ce619720541c7e1e8d8f3aa506cb327731374e284ffb6ec872a2c566f' + size_bytes: 100082 + source: 'libctf0_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libcue2' + version: '2.2.1-4.2' + architecture: 'amd64' + sha256: '6495164789f5e923a7cbb2dc8343a7e773fdce7210e0fcdb2df72c2629860365' + size_bytes: 18362 + source: 'libcue2_2.2.1-4.2_amd64.deb' + pinned_in: [] + - package: 'libcups2t64' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: '2617a78cbd830310e31813420ea34159347f1121709d2f00c93a87fa666bfcda' + size_bytes: 268968 + source: 'libcups2t64_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'libcupsfilters2-common' + version: '2.1.1-0ubuntu5' + architecture: 'all' + sha256: '36e59e4278b8308c32a6d3a20ddbd6f64a4b20196b5dfbdfcf3eff80de9a845e' + size_bytes: 244486 + source: 'libcupsfilters2-common_2.1.1-0ubuntu5_all.deb' + pinned_in: [] + - package: 'libcupsfilters2t64' + version: '2.1.1-0ubuntu5' + architecture: 'amd64' + sha256: '5987ad8579515ddda3b19d5cb8316dd93fd2bf0d2f138bb3f46b59d6f4cb3575' + size_bytes: 323796 + source: 'libcupsfilters2t64_2.1.1-0ubuntu5_amd64.deb' + pinned_in: [] + - package: 'libcupsimage2t64' + version: '2.4.16-1ubuntu1.3' + architecture: 'amd64' + sha256: 'e84b07b6514be97845303ae010bd759280873bd9b5ce6ac1bec23ee445cc3850' + size_bytes: 6724 + source: 'libcupsimage2t64_2.4.16-1ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'libcurl3t64-gnutls' + version: '8.18.0-1ubuntu2.5' + architecture: 'amd64' + sha256: '2b0b6cbb1f025ba565baff58f28a24da6ecaccf8848ec068ca16498362aa1a33' + size_bytes: 418616 + source: 'libcurl3t64-gnutls_8.18.0-1ubuntu2.5_amd64.deb' + pinned_in: [] + - package: 'libdaemon0' + version: '0.14-7.1ubuntu5' + architecture: 'amd64' + sha256: '14e59626de6a35cffc5dcac463ca4fbb1c809ff3b81bca267c1edb8161fef7f7' + size_bytes: 13256 + source: 'libdaemon0_0.14-7.1ubuntu5_amd64.deb' + pinned_in: [] + - package: 'libdata-dump-perl' + version: '1.25-1' + architecture: 'all' + sha256: '91514d4b78329ea1bdf6f964613149d5b53ceaf90627998d65f13e306712f452' + size_bytes: 25924 + source: 'libdata-dump-perl_1.25-1_all.deb' + pinned_in: [] + - package: 'libdatrie1' + version: '0.2.14-1' + architecture: 'amd64' + sha256: '1ba5a9190119370912ec5955c8129cdf2780a098ed6c80e9ecca05cc515bd039' + size_bytes: 19776 + source: 'libdatrie1_0.2.14-1_amd64.deb' + pinned_in: [] + - package: 'libdbus-1-3' + version: '1.16.2-2ubuntu4' + architecture: 'amd64' + sha256: 'af7be2be588d15a16c696ab43ba3e92bd5f9a6850e8780234059b02a67716e58' + size_bytes: 186306 + source: 'libdbus-1-3_1.16.2-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libdbusmenu-glib4' + version: '18.10.20180917~bzr492+repack1-4build1' + architecture: 'amd64' + sha256: '92e0340601b2cae7bc3780f309bc7d1bef2812413a03a0430e92da638df8be15' + size_bytes: 43056 + source: 'libdbusmenu-glib4_18.10.20180917~bzr492+repack1-4build1_amd64.deb' + pinned_in: [] + - package: 'libdbusmenu-gtk3-4' + version: '18.10.20180917~bzr492+repack1-4build1' + architecture: 'amd64' + sha256: '0e36b3dfba6349cd8d35bf59a64049ed43efc88e9f12e4bebd9d3093889ecba5' + size_bytes: 27974 + source: 'libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-4build1_amd64.deb' + pinned_in: [] + - package: 'libdconf1' + version: '0.49.0-4' + architecture: 'amd64' + sha256: 'd7a12b52a4803bf3e4c270c9367db4ac20f03412a9dc948e0272348889a151bd' + size_bytes: 40516 + source: 'libdconf1_0.49.0-4_amd64.deb' + pinned_in: [] + - package: 'libdebuginfod-common' + version: '0.194-4' + architecture: 'all' + sha256: '151b5cfce8702069ef2caaa09bba3af4e28415fcb87bc948465747a370402b0b' + size_bytes: 12342 + source: 'libdebuginfod-common_0.194-4_all.deb' + pinned_in: [] + - package: 'libdebuginfod1t64' + version: '0.194-4' + architecture: 'amd64' + sha256: '2d1eacbaf69feb2ba6a775e53606b2bf85cd975f7a3832d4d46d414443241b6e' + size_bytes: 20688 + source: 'libdebuginfod1t64_0.194-4_amd64.deb' + pinned_in: [] + - package: 'libdecor-0-0' + version: '0.2.5-1' + architecture: 'amd64' + sha256: '23ea4cd788fe5bf9883fd125dd1ac973db807b9a888dae70abde5bb9d2584de1' + size_bytes: 16464 + source: 'libdecor-0-0_0.2.5-1_amd64.deb' + pinned_in: [] + - package: 'libdecor-0-plugin-1-gtk' + version: '0.2.5-1' + architecture: 'amd64' + sha256: 'b4cfcd3a52fe6863fd8fba353fbac279772512333877ac5d7043932da7a85a9f' + size_bytes: 22610 + source: 'libdecor-0-plugin-1-gtk_0.2.5-1_amd64.deb' + pinned_in: [] + - package: 'libdee-1.0-4' + version: '1.2.7+17.10.20170616-8build1' + architecture: 'amd64' + sha256: '8d42f4debd53f4cfc1ccd53231fce9988ab214dd5df842f4672308afee29ab98' + size_bytes: 86240 + source: 'libdee-1.0-4_1.2.7+17.10.20170616-8build1_amd64.deb' + pinned_in: [] + - package: 'libdeflate0' + version: '1.23-2ubuntu1' + architecture: 'amd64' + sha256: '40ee517cffd3730405be6ae30826533bec0ddf8773bb7ac2cccd22a57acafc25' + size_bytes: 51702 + source: 'libdeflate0_1.23-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libdevmapper1.02.1' + version: '2:1.02.205-2ubuntu3' + architecture: 'amd64' + sha256: '679251083dfdab47493131744496aac22a027104cce5617df890416891352b7d' + size_bytes: 142030 + source: 'libdevmapper1.02.1_2%3a1.02.205-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libdex-1-1' + version: '1.1.0-1' + architecture: 'amd64' + sha256: '17a112de72b8e45083d0a1cb05704d6ba42930ef5ca1cb1bd486b17a7e2de10b' + size_bytes: 70172 + source: 'libdex-1-1_1.1.0-1_amd64.deb' + pinned_in: [] + - package: 'libdhash1t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: '80b86c174c04d4267f143cc66ddec5ba93fb06224636ada6ea2055e39d9ed6a1' + size_bytes: 8900 + source: 'libdhash1t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libdisplay-info3' + version: '0.3.0-1' + architecture: 'amd64' + sha256: '91ab4717cc8cf4c6c591970e1ad165aace9c91f6283c8b5a2652ceebf571ccea' + size_bytes: 87808 + source: 'libdisplay-info3_0.3.0-1_amd64.deb' + pinned_in: [] + - package: 'libdjvulibre-text' + version: '3.5.29-1' + architecture: 'all' + sha256: '54300431ee2e613382946baddc01ecd6135bb9d086ec914d0a727b8c14ce497b' + size_bytes: 50558 + source: 'libdjvulibre-text_3.5.29-1_all.deb' + pinned_in: [] + - package: 'libdjvulibre21' + version: '3.5.29-1' + architecture: 'amd64' + sha256: 'c0a3ffd95125ef0f12b4c38993f0485738f3a97a4ecfc663aae6b274b4384b0b' + size_bytes: 646524 + source: 'libdjvulibre21_3.5.29-1_amd64.deb' + pinned_in: [] + - package: 'libdotconf0' + version: '1.4.1-1build1' + architecture: 'amd64' + sha256: '30a3316c7a9323238d019a01f37420c96ef8c8d73d3df0ecbe5e8652882821a0' + size_bytes: 14772 + source: 'libdotconf0_1.4.1-1build1_amd64.deb' + pinned_in: [] + - package: 'libdrm-amdgpu1' + version: '2.4.131-1' + architecture: 'amd64' + sha256: 'f992d3b87be69d160d433626e2144f6446946143cb83bdc71adef71766783de0' + size_bytes: 23178 + source: 'libdrm-amdgpu1_2.4.131-1_amd64.deb' + pinned_in: [] + - package: 'libdrm-common' + version: '2.4.131-1' + architecture: 'all' + sha256: 'a32b8d623c04310d049cde28cdbbd339575cdc26c8dc741d7de708a954eff528' + size_bytes: 9774 + source: 'libdrm-common_2.4.131-1_all.deb' + pinned_in: [] + - package: 'libdrm-intel1' + version: '2.4.131-1' + architecture: 'amd64' + sha256: '77411c3b93c8756862a18ccaa4413a65777f40819abdd1468954ba859c8aa740' + size_bytes: 66680 + source: 'libdrm-intel1_2.4.131-1_amd64.deb' + pinned_in: [] + - package: 'libdrm-nouveau2' + version: '2.4.131-1' + architecture: 'amd64' + sha256: '18d713650e23febe76e127b7419e49eded0ecb83bad4ec8050cd6a11a4adcb71' + size_bytes: 18808 + source: 'libdrm-nouveau2_2.4.131-1_amd64.deb' + pinned_in: [] + - package: 'libdrm-radeon1' + version: '2.4.131-1' + architecture: 'amd64' + sha256: '5497783eae2652128ea00f1f0aeac940ab5b079137191bf6d58d789d4908e841' + size_bytes: 21466 + source: 'libdrm-radeon1_2.4.131-1_amd64.deb' + pinned_in: [] + - package: 'libdrm2' + version: '2.4.131-1' + architecture: 'amd64' + sha256: 'b87e6f715d0795a88b53fbe268004a1acbd0d728da0cc0ab9108aff5ab4e1929' + size_bytes: 42304 + source: 'libdrm2_2.4.131-1_amd64.deb' + pinned_in: [] + - package: 'libduktape207' + version: '2.7.0+tests-0ubuntu4' + architecture: 'amd64' + sha256: 'cf32ab1bc85d6426743ac9f4769d4489519e3ee9967d85d5662f0d52d024712f' + size_bytes: 143678 + source: 'libduktape207_2.7.0+tests-0ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libdv4t64' + version: '1.0.0-17.1build2' + architecture: 'amd64' + sha256: '1574d30cd72fdb2b26c8c06fd20c69d7f65bb39e4d1ca5db885069202cddb1ee' + size_bytes: 64286 + source: 'libdv4t64_1.0.0-17.1build2_amd64.deb' + pinned_in: [] + - package: 'libdw1t64' + version: '0.194-4' + architecture: 'amd64' + sha256: '5b3812ee2a663fef35e71fc1b9d6e29379bf9c38ac67ec954390e117513234b7' + size_bytes: 284846 + source: 'libdw1t64_0.194-4_amd64.deb' + pinned_in: [] + - package: 'libeatmydata1' + version: '131-2build1' + architecture: 'amd64' + sha256: 'eb5e950cb18e85d26e749a2b9e92a56177038e93c7eef35c388bdccb9a51abb3' + size_bytes: 7606 + source: 'libeatmydata1_131-2build1_amd64.deb' + pinned_in: [] + - package: 'libebackend-1.2-11t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: '45b91540d36f72e6502a1521a7072180ddfda9d3b63f816b2c124d6f29613a3e' + size_bytes: 114992 + source: 'libebackend-1.2-11t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libebook-1.2-21t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: 'aa0d683f7ca6c7bf76e3eb98a39b83b056cf0ce124f7609b484e5c1981cca489' + size_bytes: 91298 + source: 'libebook-1.2-21t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libebook-contacts-1.2-4t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: '8f5a6766829a6b3e18bd956e2e645316b9f0f54174a3f8b2127bd8004c0def8d' + size_bytes: 67592 + source: 'libebook-contacts-1.2-4t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libecal-2.0-3' + version: '3.56.2-8' + architecture: 'amd64' + sha256: 'ed72235014e135632af481346f3eed6f4edc5874c096a0a0d8ee206f0c1459e1' + size_bytes: 173880 + source: 'libecal-2.0-3_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libedata-book-1.2-27t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: 'f85a9a99611eb9b3d9cdb191040c4d2d7f49eacfbc945b8794990876c8ef0a7d' + size_bytes: 262222 + source: 'libedata-book-1.2-27t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libedata-cal-2.0-2t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: 'e64fd2baaf7597dd1787eda671453962cc996ebcd0c775c2570509d161fbd6f3' + size_bytes: 137212 + source: 'libedata-cal-2.0-2t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libedataserver-1.2-27t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: 'a2ec776c97a2ad89b557ca07e0eecb8133878fcc3e26832c00a75ab8b9c08bfd' + size_bytes: 287314 + source: 'libedataserver-1.2-27t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libedataserverui-1.2-4t64' + version: '3.56.2-8' + architecture: 'amd64' + sha256: '1815c1576891c95ac7d417776488aca75e5ac5533f4a3f2459a3d805ae8e2ea3' + size_bytes: 78048 + source: 'libedataserverui-1.2-4t64_3.56.2-8_amd64.deb' + pinned_in: [] + - package: 'libedit2' + version: '3.1-20251016-1' + architecture: 'amd64' + sha256: '22338fcbcaae99f67ca7b2e20d1730bc29d3c02bcd2414e457f99be96442ee29' + size_bytes: 96920 + source: 'libedit2_3.1-20251016-1_amd64.deb' + pinned_in: [] + - package: 'libeditorconfig0' + version: '0.12.10+~0.17.1-3ubuntu0.1' + architecture: 'amd64' + sha256: '382d0dc3141e74be93ea675893168b3a198e5fcfe9c36d7dcb68d40e4b06b0f7' + size_bytes: 14184 + source: 'libeditorconfig0_0.12.10+~0.17.1-3ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libefiboot1t64' + version: '39-2' + architecture: 'amd64' + sha256: '0449451d9aef91d5f7eaa50862908b3f7ce49619f8a7c11ee0a7aea2b5c6b744' + size_bytes: 41728 + source: 'libefiboot1t64_39-2_amd64.deb' + pinned_in: [] + - package: 'libefivar1t64' + version: '39-2' + architecture: 'amd64' + sha256: '32b7887c6a8dcf8d1a71c57702b6d794709fb55fb8013b353197c8e9dfe309ce' + size_bytes: 61042 + source: 'libefivar1t64_39-2_amd64.deb' + pinned_in: [] + - package: 'libegl-mesa0' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '938813d9d6bb7ccf8315af1f8bb2770ad4b9d240ad177f0da420db3e94600d6b' + size_bytes: 133774 + source: 'libegl-mesa0_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'libegl1' + version: '1.7.0-3' + architecture: 'amd64' + sha256: 'cf2a6549bbc4339671901bde97c0ca41c380c5783179ef68977bf86151f03766' + size_bytes: 29654 + source: 'libegl1_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libei1' + version: '1.5.0-3' + architecture: 'amd64' + sha256: 'd3b0b40cb7cf3686c0aaebf6e6b4e11c8903d295fb9b5ffc9e66d99cf8448f7b' + size_bytes: 42774 + source: 'libei1_1.5.0-3_amd64.deb' + pinned_in: [] + - package: 'libeis1' + version: '1.5.0-3' + architecture: 'amd64' + sha256: 'c676058cef2ae12884cb63b644c3d7188d5e04e455824307b927af008bf94668' + size_bytes: 44010 + source: 'libeis1_1.5.0-3_amd64.deb' + pinned_in: [] + - package: 'libelf1t64' + version: '0.194-4' + architecture: 'amd64' + sha256: 'c2feae172b14d2a8317348023c5e0b6572314c097a9f7b8225c62b0988cc8d92' + size_bytes: 57140 + source: 'libelf1t64_0.194-4_amd64.deb' + pinned_in: [] + - package: 'libenchant-2-2' + version: '2.8.2+dfsg1-3build1' + architecture: 'amd64' + sha256: '065fbd885526f31285914daffebcd4a28a65162504fc13f879e188de9e4f7920' + size_bytes: 59212 + source: 'libenchant-2-2_2.8.2+dfsg1-3build1_amd64.deb' + pinned_in: [] + - package: 'libencode-locale-perl' + version: '1.05-3' + architecture: 'all' + sha256: '11c7ea66f45a1447cc90b3b12d30f8ae30e0aaa16f6808878ca1be04e1dca763' + size_bytes: 11568 + source: 'libencode-locale-perl_1.05-3_all.deb' + pinned_in: [] + - package: 'libepoxy0' + version: '1.5.10-2build1' + architecture: 'amd64' + sha256: '2f4525535b2c7c6d61cc5c131f1cb3f5c0d70177ccf550a05f80d12016dfcfdf' + size_bytes: 226466 + source: 'libepoxy0_1.5.10-2build1_amd64.deb' + pinned_in: [] + - package: 'liberror-perl' + version: '0.17030-1' + architecture: 'all' + sha256: 'cb85c869fe056e9e466efcfa3403408b0a87db1da1cafa585140a9be59fe58a1' + size_bytes: 23518 + source: 'liberror-perl_0.17030-1_all.deb' + pinned_in: [] + - package: 'libespeak-ng1' + version: '1.52.0+dfsg-5build1' + architecture: 'amd64' + sha256: '73f01703f367560ca5f4acad10d00058ac103a0db46cf0a722e1eec8de2b7251' + size_bytes: 211318 + source: 'libespeak-ng1_1.52.0+dfsg-5build1_amd64.deb' + pinned_in: [] + - package: 'libevdev2' + version: '1.13.6+dfsg-1' + architecture: 'amd64' + sha256: '34bd437962ea3eaf32b75b5f0dd07447d2ace9d9065e76d2ebf69154f3b54d5a' + size_bytes: 37674 + source: 'libevdev2_1.13.6+dfsg-1_amd64.deb' + pinned_in: [] + - package: 'libexempi8' + version: '2.6.6-2build1' + architecture: 'amd64' + sha256: 'f08f87b4c41a4ccf6f537e59c504eac03dc1a4b1f6ce547e146bd5056d241f14' + size_bytes: 546422 + source: 'libexempi8_2.6.6-2build1_amd64.deb' + pinned_in: [] + - package: 'libexif12' + version: '0.6.25-2ubuntu0.1' + architecture: 'amd64' + sha256: 'b367c14a9da0f6c4356cf8b2615ad847242ad7e647daea6f19a45fea644298c4' + size_bytes: 83908 + source: 'libexif12_0.6.25-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libexiv2-28' + version: '0.28.8+dfsg-1' + architecture: 'amd64' + sha256: 'd6ce2c1699dcbccf64a5c90c1774ac143c757ca9ab737d9609456e3aed06a97f' + size_bytes: 976560 + source: 'libexiv2-28_0.28.8+dfsg-1_amd64.deb' + pinned_in: [] + - package: 'libexiv2-data' + version: '0.28.8+dfsg-1' + architecture: 'all' + sha256: '5a1796235e89d4eca0703d70029eab9bcf0247e09001075ca62da6e6d534328f' + size_bytes: 5700 + source: 'libexiv2-data_0.28.8+dfsg-1_all.deb' + pinned_in: [] + - package: 'libexpat1' + version: '2.7.4-1' + architecture: 'amd64' + sha256: 'ef78089497946219cac03209d951bbfff93480104e791b770a7bf6429452e475' + size_bytes: 93950 + source: 'libexpat1_2.7.4-1_amd64.deb' + pinned_in: [] + - package: 'libextutils-depends-perl' + version: '0.8002-1' + architecture: 'all' + sha256: 'dce81d59f6f8a8c55f31a645ba140c47695c86ded461ef6735fb159ad1332449' + size_bytes: 14338 + source: 'libextutils-depends-perl_0.8002-1_all.deb' + pinned_in: [] + - package: 'libfdisk1' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: '38c1e94e279ae2bee0e6dd2a7cb8787e2e549f792bf49bde5204dd60a8292441' + size_bytes: 163734 + source: 'libfdisk1_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libffi8' + version: '3.5.2-4' + architecture: 'amd64' + sha256: '4a7423124bbd459c0aa38b7389ec7802fa6899654767a95fc27de70967fedd48' + size_bytes: 26348 + source: 'libffi8_3.5.2-4_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'libfftw3-single3' + version: '3.3.10-2fakesync1build3' + architecture: 'amd64' + sha256: '716e082f8b472d7447d394913ddf0067ab60b31f35ef014dbcecc610e6560e93' + size_bytes: 865152 + source: 'libfftw3-single3_3.3.10-2fakesync1build3_amd64.deb' + pinned_in: [] + - package: 'libfido2-1' + version: '1.16.0-2build1' + architecture: 'amd64' + sha256: 'e74f757c08a3c9827453de9986101b43ca1069de6be9b8a7eeb438943f73f11f' + size_bytes: 84576 + source: 'libfido2-1_1.16.0-2build1_amd64.deb' + pinned_in: [] + - package: 'libfile-basedir-perl' + version: '0.09-2' + architecture: 'all' + sha256: '508a573da1e7f57217a03738109cd734a7edb73c43197085004dcdec2b3ad8ea' + size_bytes: 14396 + source: 'libfile-basedir-perl_0.09-2_all.deb' + pinned_in: [] + - package: 'libfile-desktopentry-perl' + version: '0.23-1' + architecture: 'all' + sha256: 'ee2331bef27fb35121714aba564d57a9fc038f204a8555573bbb66f0898fbc38' + size_bytes: 16870 + source: 'libfile-desktopentry-perl_0.23-1_all.deb' + pinned_in: [] + - package: 'libfile-listing-perl' + version: '6.16-1' + architecture: 'all' + sha256: 'd37a2a2f6998b3db159f469f04eff9d44fda75d49ebaeb824d047b235d827bbe' + size_bytes: 11332 + source: 'libfile-listing-perl_6.16-1_all.deb' + pinned_in: [] + - package: 'libfile-mimeinfo-perl' + version: '0.36-2' + architecture: 'all' + sha256: '4d56f38e13b76b11b0c5a2b6216efe14026788905a1c305f2e5af2fd7417c52f' + size_bytes: 40610 + source: 'libfile-mimeinfo-perl_0.36-2_all.deb' + pinned_in: [] + - package: 'libflac14' + version: '1.5.0+ds-5' + architecture: 'amd64' + sha256: 'ea6cbd9399a646b073d36d8d33444f39f9f1dd63f5fa8cd18906573f51cc305b' + size_bytes: 167804 + source: 'libflac14_1.5.0+ds-5_amd64.deb' + pinned_in: [] + - package: 'libflashrom1' + version: '1.6.0-2ubuntu1.1' + architecture: 'amd64' + sha256: '052e3cbcdc62affe59e8ee596abc0da63cce3e7f86ea46149b18fd06c3da05d4' + size_bytes: 226376 + source: 'libflashrom1_1.6.0-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libfont-afm-perl' + version: '1.20-4' + architecture: 'all' + sha256: '8607b7a6845707e3ff97ee0790e04002710f1aaf4094e0aeca050a104bddb1a6' + size_bytes: 12990 + source: 'libfont-afm-perl_1.20-4_all.deb' + pinned_in: [] + - package: 'libfontconfig1' + version: '2.17.1-3ubuntu1' + architecture: 'amd64' + sha256: '72ba4fc43155566b46442b741a6892d5d1f1581ba58cdfd037aabf47ad9080f7' + size_bytes: 144082 + source: 'libfontconfig1_2.17.1-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libfontenc1' + version: '1:1.1.8-1build2' + architecture: 'amd64' + sha256: '1fab0e125d793da45d91b346c334c496776d69709a7ea78c3b34d5db6db69eab' + size_bytes: 14052 + source: 'libfontenc1_1%3a1.1.8-1build2_amd64.deb' + pinned_in: [] + - package: 'libfprint-2-2' + version: '1:1.95.1+tod1-0ubuntu2' + architecture: 'amd64' + sha256: 'aa09cc1ac94608ac1dcaca0bfda0b172a466b6d6ad99a2fc8f5477c23222842a' + size_bytes: 305118 + source: 'libfprint-2-2_1%3a1.95.1+tod1-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libfprint-2-tod1' + version: '1:1.95.1+tod1-0ubuntu2' + architecture: 'amd64' + sha256: 'aad2e14758121dede1d30aafed754374c7716f735e58074105eded2fb1c8ab9e' + size_bytes: 93324 + source: 'libfprint-2-tod1_1%3a1.95.1+tod1-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libfreeaptx0' + version: '0.2.2-1build1' + architecture: 'amd64' + sha256: '34bc0fc4708e3f901f63211715dfd93f647d97d26d02cc335d9b569c8036ce7f' + size_bytes: 13682 + source: 'libfreeaptx0_0.2.2-1build1_amd64.deb' + pinned_in: [] + - package: 'libfreeipmi17' + version: '1.6.16-1ubuntu0.1' + architecture: 'amd64' + sha256: 'b5cbdd3a27d0afef2b6fcc1a4f673af471cec0108c507df852dbd0e6e46c4c3a' + size_bytes: 931172 + source: 'libfreeipmi17_1.6.16-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libfreerdp-server3-3' + version: '3.31.0+dfsg-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '25352bd5c4bcd537b021a2e8d5f703345522ed187a7da90f25c3bdac663bc0d1' + size_bytes: 102762 + source: 'libfreerdp-server3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libfreerdp3-3' + version: '3.31.0+dfsg-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'ba51dbc5c2bce3de8515b04cc287a804424f651a4820ad52d91b8fe4a9461cc0' + size_bytes: 813474 + source: 'libfreerdp3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libfreetype6' + version: '2.14.2+dfsg-1ubuntu0.1' + architecture: 'amd64' + sha256: '6b4a9275b158307ecb4f6ba7088f2731b017b775a9b65c61afcb5b15be3e8cf5' + size_bytes: 408644 + source: 'libfreetype6_2.14.2+dfsg-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libfribidi0' + version: '1.0.16-5' + architecture: 'amd64' + sha256: '47fb50e96401a46c06d5122cd04cc42316f65530b9f868d2d450576a379d5d34' + size_bytes: 26594 + source: 'libfribidi0_1.0.16-5_amd64.deb' + pinned_in: [] + - package: 'libftdi1-2' + version: '1.6~rc1-1build1' + architecture: 'amd64' + sha256: '180fb0080df4340c2890e94c08ef089c555521ec9f7e3ee7b85fd217d40acaf7' + size_bytes: 30670 + source: 'libftdi1-2_1.6~rc1-1build1_amd64.deb' + pinned_in: [] + - package: 'libfuse3-4' + version: '3.18.2-1' + architecture: 'amd64' + sha256: '59ae972173e389eb981aaeae874b3d6aafe7eceff284f94e5c21ee1d049548c6' + size_bytes: 92984 + source: 'libfuse3-4_3.18.2-1_amd64.deb' + pinned_in: [] + - package: 'libfwupd3' + version: '2.1.1-1ubuntu3.1' + architecture: 'amd64' + sha256: '6b2632406478ee905fcc26af5d27bdeabb5fc2a9c08bc218669a40e91a73eadb' + size_bytes: 145132 + source: 'libfwupd3_2.1.1-1ubuntu3.1_amd64.deb' + pinned_in: [] + - package: 'libfyaml0' + version: '0.9.4-1' + architecture: 'amd64' + sha256: 'fb93f8517a7fbabbe890fe6c35f4854f2890547d2b5b76532ee60060d4de94cd' + size_bytes: 300734 + source: 'libfyaml0_0.9.4-1_amd64.deb' + pinned_in: [] + - package: 'libgamemode0' + version: '1.8.2-2build1' + architecture: 'amd64' + sha256: 'b542a5ecae1c6674768b192ac98a031621d2b73252bb502f584533f28fb9bf31' + size_bytes: 8236 + source: 'libgamemode0_1.8.2-2build1_amd64.deb' + pinned_in: [] + - package: 'libgamemodeauto0' + version: '1.8.2-2build1' + architecture: 'amd64' + sha256: '9e05312a3ffd06da99a55bd324adc2eb166fb0e5a945d17de4905a10db5648ee' + size_bytes: 8772 + source: 'libgamemodeauto0_1.8.2-2build1_amd64.deb' + pinned_in: [] + - package: 'libgbm1' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '5d2d1eaf0f72c5a2c4aef692e5660c6fa61e46542c4d9cb5593ba8bd020b2eea' + size_bytes: 49194 + source: 'libgbm1_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'libgck-1-0' + version: '3.41.2-6' + architecture: 'amd64' + sha256: 'a8dd84aa3583486942728f2266a1d3b9d1fa5b2799b830bfe8e884d5da93cfa1' + size_bytes: 80376 + source: 'libgck-1-0_3.41.2-6_amd64.deb' + pinned_in: [] + - package: 'libgck-2-2' + version: '4.4.0.1-8' + architecture: 'amd64' + sha256: 'd002ab48cfd02d17ea577d48871e6d6d47b9a25ea8211df51bee205cb41cf481' + size_bytes: 78382 + source: 'libgck-2-2_4.4.0.1-8_amd64.deb' + pinned_in: [] + - package: 'libgcr-4-4' + version: '4.4.0.1-8' + architecture: 'amd64' + sha256: 'ddee1a92057340b19e604403443f23d43afb4d76188ce89576cdfabab0f3f4d7' + size_bytes: 204978 + source: 'libgcr-4-4_4.4.0.1-8_amd64.deb' + pinned_in: [] + - package: 'libgcr-base-3-1' + version: '3.41.2-6' + architecture: 'amd64' + sha256: '9513409787d4dc4242943c0d8a4fb2de12ff21c281612007402bd0d731aa9b64' + size_bytes: 200850 + source: 'libgcr-base-3-1_3.41.2-6_amd64.deb' + pinned_in: [] + - package: 'libgcr-ui-3-1' + version: '3.41.2-6' + architecture: 'amd64' + sha256: '6181c2e4a574ed06ef2118aeb248c4188f496ce2c06a7dd06ca3f61580c4332b' + size_bytes: 124882 + source: 'libgcr-ui-3-1_3.41.2-6_amd64.deb' + pinned_in: [] + - package: 'libgd3' + version: '2.3.3-13ubuntu2' + architecture: 'amd64' + sha256: '1a50c33b68c378003223cc30c8eaea2e17e113e7a65ed7cb6baef72983b739a9' + size_bytes: 129548 + source: 'libgd3_2.3.3-13ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libgdbm-compat4t64' + version: '1.26-1build1' + architecture: 'amd64' + sha256: 'e9ef750cc8ba426dee52f56aba0150e7e463b2658173bed8c4ca2927eec1c447' + size_bytes: 6796 + source: 'libgdbm-compat4t64_1.26-1build1_amd64.deb' + pinned_in: [] + - package: 'libgdbm6t64' + version: '1.26-1build1' + architecture: 'amd64' + sha256: '0752eddff4c494d682f433cac2f1d25196f0a405eb8c6b0b10ec46432f6fec71' + size_bytes: 36470 + source: 'libgdbm6t64_1.26-1build1_amd64.deb' + pinned_in: [] + - package: 'libgdk-pixbuf-2.0-0' + version: '2.44.5+dfsg-4ubuntu1' + architecture: 'amd64' + sha256: 'ccd902384546225842384de0c46dad4670ccdda17b697bed4518610ed2e08e89' + size_bytes: 100992 + source: 'libgdk-pixbuf-2.0-0_2.44.5+dfsg-4ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgdk-pixbuf2.0-bin' + version: '2.44.5+dfsg-4ubuntu1' + architecture: 'amd64' + sha256: 'ea447cab507c8672e27004be1447c438d0abb3188fffd28aa49381980b294501' + size_bytes: 11198 + source: 'libgdk-pixbuf2.0-bin_2.44.5+dfsg-4ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgdk-pixbuf2.0-common' + version: '2.44.5+dfsg-4ubuntu1' + architecture: 'all' + sha256: '2476d552009724d9b027236fcd2e4540a46f419d9d8b881f1d92edf10d6fcc13' + size_bytes: 5754 + source: 'libgdk-pixbuf2.0-common_2.44.5+dfsg-4ubuntu1_all.deb' + pinned_in: [] + - package: 'libgdm1' + version: '50.1-0ubuntu0.1' + architecture: 'amd64' + sha256: '044e3825d2979ebf3d3a6846f9fcd54d71c65ba6459e6704aec10b53f349e5c8' + size_bytes: 60486 + source: 'libgdm1_50.1-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libgee-0.8-2' + version: '0.20.8-2' + architecture: 'amd64' + sha256: 'e2a87e8415a637d9e44a2ecd0386cee113b0cd3c3e0563e168e81c7ea3c4f637' + size_bytes: 230314 + source: 'libgee-0.8-2_0.20.8-2_amd64.deb' + pinned_in: [] + - package: 'libgeoclue-2-0' + version: '2.7.2-2ubuntu3' + architecture: 'amd64' + sha256: '79eab8bb756c10d73a7e9e14db486a513e72e0d92741e0496b0881d5a86a1e62' + size_bytes: 33694 + source: 'libgeoclue-2-0_2.7.2-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libgeocode-glib-2-0' + version: '3.26.4-3' + architecture: 'amd64' + sha256: '589ea635e9fb597517d7755cad80e33add17be72c9f62ad769751694bfce3d0e' + size_bytes: 45884 + source: 'libgeocode-glib-2-0_3.26.4-3_amd64.deb' + pinned_in: [] + - package: 'libgexiv2-2' + version: '0.14.6-2' + architecture: 'amd64' + sha256: 'fa4a4d6c5c108396d7c1b218ea6a11b9948672fadaf0463a4a8df70d836b3c79' + size_bytes: 78882 + source: 'libgexiv2-2_0.14.6-2_amd64.deb' + pinned_in: [] + - package: 'libgif7' + version: '5.2.2-1ubuntu3.2' + architecture: 'amd64' + sha256: 'fce81875eaab4e01ca97ed7de1cc41e3ab589a09beb95b09c8ddd2caf2581284' + size_bytes: 34680 + source: 'libgif7_5.2.2-1ubuntu3.2_amd64.deb' + pinned_in: [] + - package: 'libgirepository-1.0-1' + version: '1.86.0-6build1' + architecture: 'amd64' + sha256: 'c795b1be91db3db57c31786523929815f01a461951132dd7570b4579a861d27f' + size_bytes: 85974 + source: 'libgirepository-1.0-1_1.86.0-6build1_amd64.deb' + pinned_in: [] + - package: 'libgirepository-2.0-0' + version: '2.88.0-1' + architecture: 'amd64' + sha256: '994595dcff5f8cc736d70a4798314006dce41da34d95511786039239440669f4' + size_bytes: 76106 + source: 'libgirepository-2.0-0_2.88.0-1_amd64.deb' + pinned_in: [] + - package: 'libgjs0' + version: '1.88.0-1' + architecture: 'amd64' + sha256: 'e037f9d935e3762e39eddcc6ec39b7482804c9d2f2a97749e97a409d9e2397e8' + size_bytes: 498268 + source: 'libgjs0_1.88.0-1_amd64.deb' + pinned_in: [] + - package: 'libgl1' + version: '1.7.0-3' + architecture: 'amd64' + sha256: '83ec3a454b28e947a6886e9ae8167e129e25d7a2fd741aaffcdca76eddff5955' + size_bytes: 98292 + source: 'libgl1_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libgl1-mesa-dri' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '585dfac64d7ca95a9813faad9f14c361d788069b7578859fb426c657dd528f08' + size_bytes: 38166 + source: 'libgl1-mesa-dri_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'libgles2' + version: '1.7.0-3' + architecture: 'amd64' + sha256: '60113d7ec92c7ccdbd09e90b379bb9041581af3b85e28b3f250374025bb6440e' + size_bytes: 17458 + source: 'libgles2_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libglib-object-introspection-perl' + version: '0.052-1' + architecture: 'amd64' + sha256: '3d1ed6d17d7b8a6d2c9634c9a60c5f613f4534a801043180023508636bbc22e4' + size_bytes: 69386 + source: 'libglib-object-introspection-perl_0.052-1_amd64.deb' + pinned_in: [] + - package: 'libglib-perl' + version: '3:1.329.4-1' + architecture: 'amd64' + sha256: '36c7d9e801c20f8a5cae0cfe41c59f9d8ec057dc492208271eb082812a0fce22' + size_bytes: 319464 + source: 'libglib-perl_3%3a1.329.4-1_amd64.deb' + pinned_in: [] + - package: 'libglib2.0-0t64' + version: '2.88.0-1' + architecture: 'amd64' + sha256: '8883a2bd236e54af0af33d7115835929c959bc50fd02ba63496ab6908b0c204a' + size_bytes: 1596744 + source: 'libglib2.0-0t64_2.88.0-1_amd64.deb' + pinned_in: [] + - package: 'libglib2.0-bin' + version: '2.88.0-1' + architecture: 'amd64' + sha256: 'f0832941a48e3b4d487c94fba1708a70dcdadff9e9eb6604ec7645d71872fd35' + size_bytes: 99418 + source: 'libglib2.0-bin_2.88.0-1_amd64.deb' + pinned_in: [] + - package: 'libglib2.0-data' + version: '2.88.0-1' + architecture: 'all' + sha256: '86bcb6fb96b1f2f429741af853c7817982edaeae114a5162e8aa681cf3d2b596' + size_bytes: 37776 + source: 'libglib2.0-data_2.88.0-1_all.deb' + pinned_in: [] + - package: 'libglu1-mesa' + version: '9.0.2-1.1build2' + architecture: 'amd64' + sha256: '0559dbb28c2e34e01243fdaf19797165fbf577e613c420d207e31246152f24f0' + size_bytes: 158904 + source: 'libglu1-mesa_9.0.2-1.1build2_amd64.deb' + pinned_in: [] + - package: 'libglvnd0' + version: '1.7.0-3' + architecture: 'amd64' + sha256: 'db2cd8cff67e3e210f5223dfe41f000efd4d3d887ab05bda2e88c4a622f12b36' + size_bytes: 64072 + source: 'libglvnd0_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libglx-mesa0' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '17ff6239daaf75337d3697c1e5f1ef3e190c4c2dd73a9f0edfc36868ef41905c' + size_bytes: 125602 + source: 'libglx-mesa0_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'libglx0' + version: '1.7.0-3' + architecture: 'amd64' + sha256: 'e0b75c32f773201ebca2184d94dfc34f6e09470c7cf6e425d48b270e516fd909' + size_bytes: 38932 + source: 'libglx0_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libglycin-2-0' + version: '2.1.1+ds-0ubuntu1' + architecture: 'amd64' + sha256: '99b6836d1068436e7f92cc3a7b2c2c0efddeea12dc50c16a727f45bc044d4393' + size_bytes: 1484272 + source: 'libglycin-2-0_2.1.1+ds-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libglycin-gtk4-2-0' + version: '2.1.1+ds-0ubuntu1' + architecture: 'amd64' + sha256: '896c2d56850ce8936e350d626a99542edc3e6b59ecad41a921a07ced1726a40b' + size_bytes: 140410 + source: 'libglycin-gtk4-2-0_2.1.1+ds-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-autoar-0-0' + version: '0.4.5-5' + architecture: 'amd64' + sha256: '37a54e236039ae2343e39a6e394357d37a8b4baf7581167ef7a397a62b85881f' + size_bytes: 31004 + source: 'libgnome-autoar-0-0_0.4.5-5_amd64.deb' + pinned_in: [] + - package: 'libgnome-bg-4-2t64' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '9b033899793669df114600e8807e8555300b4c82e6cfefb0946527b066f95516' + size_bytes: 24580 + source: 'libgnome-bg-4-2t64_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-bluetooth-3.0-13' + version: '47.1-5' + architecture: 'amd64' + sha256: '6d4755d98382364f39e40b328715da3782e05348b9f8319b0ae85b79484f7854' + size_bytes: 51180 + source: 'libgnome-bluetooth-3.0-13_47.1-5_amd64.deb' + pinned_in: [] + - package: 'libgnome-bluetooth-ui-3.0-13' + version: '47.1-5' + architecture: 'amd64' + sha256: '141902b52821922a3210729a91c2bb7921eb69b5c840eb70caac4f6fbb580e9f' + size_bytes: 60650 + source: 'libgnome-bluetooth-ui-3.0-13_47.1-5_amd64.deb' + pinned_in: [] + - package: 'libgnome-desktop-3-20t64' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '81b47c68529265a355a51be0110089ff113f2d56ba08d987f6d596f1f4ebb75a' + size_bytes: 95552 + source: 'libgnome-desktop-3-20t64_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-desktop-4-2t64' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: 'dc622a8f7985e60f0e21b73bb192bcdfa60d6de8ee42ef9d01dec3e737eb63f3' + size_bytes: 87566 + source: 'libgnome-desktop-4-2t64_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-menu-3-0' + version: '3.38.1-1ubuntu1' + architecture: 'amd64' + sha256: '542ebd199ed85f417c627eccbdb7e3301d74efdb1f8d1e070580cf3dddae556b' + size_bytes: 48884 + source: 'libgnome-menu-3-0_3.38.1-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-qr-4-0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '0113f9d4958d6cc9202840989caf4e676247bbb21bed4bad4ed7116b61c18d0f' + size_bytes: 59514 + source: 'libgnome-qr-4-0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgnome-qr-gtk-4-0' + version: '44.5-1ubuntu1' + architecture: 'amd64' + sha256: '8b253370a7d1724a70e3b0f4fa74f73919a1a493dc20c5f73fd3cfe6ef72ad0b' + size_bytes: 8944 + source: 'libgnome-qr-gtk-4-0_44.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgoa-1.0-0b' + version: '3.58.0-1' + architecture: 'amd64' + sha256: '567304bba58dac0fcfc7c566d0030c32bac7e03341f3e46386fa5b59f2d629cd' + size_bytes: 68700 + source: 'libgoa-1.0-0b_3.58.0-1_amd64.deb' + pinned_in: [] + - package: 'libgoa-1.0-common' + version: '3.58.0-1' + architecture: 'all' + sha256: 'd0f6e61ceb702bb05eb0d5c182b69ea70e8f757221fc4df195b30ea07188e9dc' + size_bytes: 4704 + source: 'libgoa-1.0-common_3.58.0-1_all.deb' + pinned_in: [] + - package: 'libgoa-backend-1.0-2' + version: '3.58.0-1' + architecture: 'amd64' + sha256: '7451be62fc37381dd75f4cb0ae7cbc12326a2b0f77015f11c92cada4f734d8a6' + size_bytes: 117746 + source: 'libgoa-backend-1.0-2_3.58.0-1_amd64.deb' + pinned_in: [] + - package: 'libgomp1' + version: '16-20260322-1ubuntu1' + architecture: 'amd64' + sha256: 'add19738c63794d2aa9ac529d3b8aebe2e88980faecb6c1c59f07aefd6c3c314' + size_bytes: 162278 + source: 'libgomp1_16-20260322-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgpgme45' + version: '2.0.1-2build1' + architecture: 'amd64' + sha256: 'b95f81d26bd4922510eb58a08f9c0bf143781cb23a907ce9ede7a3b1c6024be6' + size_bytes: 139814 + source: 'libgpgme45_2.0.1-2build1_amd64.deb' + pinned_in: [] + - package: 'libgpgmepp7' + version: '2.0.0-2' + architecture: 'amd64' + sha256: '3dd75723159c2c171382f836e491d83d71f5fdf7a58c9f6754d85ff0c725b761' + size_bytes: 131100 + source: 'libgpgmepp7_2.0.0-2_amd64.deb' + pinned_in: [] + - package: 'libgphoto2-6t64' + version: '2.5.33-1ubuntu1.1' + architecture: 'amd64' + sha256: 'b2ad6865249a228b531beae7d987e95bdde043ff96609da4391d68f34195afee' + size_bytes: 760670 + source: 'libgphoto2-6t64_2.5.33-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libgphoto2-l10n' + version: '2.5.33-1ubuntu1.1' + architecture: 'all' + sha256: '83769ada07dd0069ca66b61f52f675fb09134edfe9bf761996acee5ed60bf462' + size_bytes: 12894 + source: 'libgphoto2-l10n_2.5.33-1ubuntu1.1_all.deb' + pinned_in: [] + - package: 'libgphoto2-port12t64' + version: '2.5.33-1ubuntu1.1' + architecture: 'amd64' + sha256: '5b42dffffeaab80afeb6d8d0dfb32a0ec0e4f780c82c672f967df7a01fadb496' + size_bytes: 58208 + source: 'libgphoto2-port12t64_2.5.33-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libgpm2' + version: '1.20.7-12build1' + architecture: 'amd64' + sha256: '5e65176de6c982105c33956d9c698735ffef16464b43f462620c2bcce6d48036' + size_bytes: 14422 + source: 'libgpm2_1.20.7-12build1_amd64.deb' + pinned_in: [] + - package: 'libgprofng0' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '6b066ab912300b2c6a965a9a8045da45c237a52b76c2c11d8f2ceaf7aabfacbb' + size_bytes: 897584 + source: 'libgprofng0_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libgraphene-1.0-0' + version: '1.10.8-5build1' + architecture: 'amd64' + sha256: '0c73a0aee47f87f496c9150121b04281def45d8e52564e059b59ebd9f22f5360' + size_bytes: 46178 + source: 'libgraphene-1.0-0_1.10.8-5build1_amd64.deb' + pinned_in: [] + - package: 'libgraphite2-3' + version: '1.3.14-11ubuntu1.1' + architecture: 'amd64' + sha256: 'b4a4fbeb00c8553a20c31874c153cbcd856cfc1dda1c9b8252fa1d9bfbec24fc' + size_bytes: 72928 + source: 'libgraphite2-3_1.3.14-11ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libgs-common' + version: '10.06.0~dfsg-3ubuntu1' + architecture: 'all' + sha256: 'be7c90d171aff0597b35ebdb2eefd5a4a8e50a444bcb81ad43c2d120387d3cfb' + size_bytes: 176406 + source: 'libgs-common_10.06.0~dfsg-3ubuntu1_all.deb' + pinned_in: [] + - package: 'libgs10' + version: '10.06.0~dfsg-3ubuntu1' + architecture: 'amd64' + sha256: '0e8652c2f0ff6ed0ca711bd085e97c492c3d0ae6605dfa8fc543d415720ddfed' + size_bytes: 4404850 + source: 'libgs10_10.06.0~dfsg-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgs10-common' + version: '10.06.0~dfsg-3ubuntu1' + architecture: 'all' + sha256: 'ff18e8ae397fb6c49037ce632e299d0faccc8851cb19fb536fd3c1f26d911541' + size_bytes: 492106 + source: 'libgs10-common_10.06.0~dfsg-3ubuntu1_all.deb' + pinned_in: [] + - package: 'libgsf-1-114' + version: '1.14.53-1.1' + architecture: 'amd64' + sha256: 'f89d967ec790cdb28f3f22159b58ff068a42ac172a8961d66e7f7717e031068e' + size_bytes: 105712 + source: 'libgsf-1-114_1.14.53-1.1_amd64.deb' + pinned_in: [] + - package: 'libgsf-1-common' + version: '1.14.53-1.1' + architecture: 'all' + sha256: '8839055ef6179339edf647ef5f0ade59c2c9e2487beb0cff28469e07a40a661e' + size_bytes: 13708 + source: 'libgsf-1-common_1.14.53-1.1_all.deb' + pinned_in: [] + - package: 'libgsound0t64' + version: '1.0.3-4' + architecture: 'amd64' + sha256: 'd5d786afa3f997ae744f4eb2ab8fa7c4cf4fa5240a71d1fa534ea1ee9cb59b5e' + size_bytes: 9134 + source: 'libgsound0t64_1.0.3-4_amd64.deb' + pinned_in: [] + - package: 'libgssdp-1.6-0' + version: '1.6.4-5' + architecture: 'amd64' + sha256: 'd1e2cae7a249ff1ccd68487e4e620fff95120e798a60e7a24d0723c07c53d0a3' + size_bytes: 41316 + source: 'libgssdp-1.6-0_1.6.4-5_amd64.deb' + pinned_in: [] + - package: 'libgstreamer-gl1.0-0' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '6425c5677ba4ff8c02358fa822f792f7cdfe80aca4165765eb1189d2c9521363' + size_bytes: 229988 + source: 'libgstreamer-gl1.0-0_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'libgstreamer-plugins-base1.0-0' + version: '1.28.2-1' + architecture: 'amd64' + sha256: '6a118599d9336390547d76993382f24fb358a0637ce312ee1b01917e0bddd36d' + size_bytes: 920576 + source: 'libgstreamer-plugins-base1.0-0_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'libgstreamer-plugins-extra1.0-0' + version: '1.28.2-1ubuntu1.1' + architecture: 'amd64' + sha256: '1eebb4613a15100b9b5efb15614da49489e6c6e6121297c51dff5dc91487b374' + size_bytes: 510250 + source: 'libgstreamer-plugins-extra1.0-0_1.28.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libgstreamer1.0-0' + version: '1.28.2-1' + architecture: 'amd64' + sha256: 'b960e6d5f23c895e6aabe8bd31bca14f14d24d47b0e6122ac3c6130c4a2fe9f5' + size_bytes: 1217804 + source: 'libgstreamer1.0-0_1.28.2-1_amd64.deb' + pinned_in: [] + - package: 'libgtk-3-0t64' + version: '3.24.52-0ubuntu1' + architecture: 'amd64' + sha256: 'd03b766dd7ba2becf66cf21424bb441af4dbf62841b314af2720df74d95bda1a' + size_bytes: 3072368 + source: 'libgtk-3-0t64_3.24.52-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgtk-3-bin' + version: '3.24.52-0ubuntu1' + architecture: 'amd64' + sha256: '40687ab50213d458256cf11485ba188c8ae51d6674144c49e568be3b1410f784' + size_bytes: 73916 + source: 'libgtk-3-bin_3.24.52-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgtk-3-common' + version: '3.24.52-0ubuntu1' + architecture: 'all' + sha256: 'bd402f87b106a975272fb12cdeb49d26ff6521e4c909b37b4b091797bf2a732d' + size_bytes: 1423872 + source: 'libgtk-3-common_3.24.52-0ubuntu1_all.deb' + pinned_in: [] + - package: 'libgtk-4-1' + version: '4.22.4+ds-0ubuntu0.1' + architecture: 'amd64' + sha256: '5ae394b2cdd4c09cb725e8a6686af27e33b476c6aca6caf016dce068b0702b2b' + size_bytes: 3551986 + source: 'libgtk-4-1_4.22.4+ds-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libgtk-4-bin' + version: '4.22.4+ds-0ubuntu0.1' + architecture: 'amd64' + sha256: 'fc49dca37c93c9434131eb1f7d96c9fb8290815b2ef3a4de01c4445c00b38a16' + size_bytes: 3674882 + source: 'libgtk-4-bin_4.22.4+ds-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libgtk-4-common' + version: '4.22.4+ds-0ubuntu0.1' + architecture: 'all' + sha256: '701267c163e22c901b81733d8a6369cb7edf783618b30a35a663bb8111e67554' + size_bytes: 1546346 + source: 'libgtk-4-common_4.22.4+ds-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'libgtk3-perl' + version: '0.038-3' + architecture: 'all' + sha256: '1d1c8f2229c32fcf536c55862cc5db43b64a6cf1b3f6feca6d21cbf54e6271f4' + size_bytes: 29234 + source: 'libgtk3-perl_0.038-3_all.deb' + pinned_in: [] + - package: 'libgtksourceview-5-0' + version: '5.18.0-3' + architecture: 'amd64' + sha256: '851c90f202cadf480e1fe24eba14ee9b8e584bb8b7537681db8cd9ec1c2f0265' + size_bytes: 609318 + source: 'libgtksourceview-5-0_5.18.0-3_amd64.deb' + pinned_in: [] + - package: 'libgtksourceview-5-common' + version: '5.18.0-3' + architecture: 'all' + sha256: '2c81bbbd23e32e1bfe96394318f14d92cefe97da7885f9c0d7f51879f430cfcb' + size_bytes: 14954 + source: 'libgtksourceview-5-common_5.18.0-3_all.deb' + pinned_in: [] + - package: 'libgtop-2.0-11' + version: '2.41.3-2ubuntu1' + architecture: 'amd64' + sha256: 'db542f3ad50bbb9db0723ba6a970739f7c3e4c4b747250f39170dc5bd413abf5' + size_bytes: 40612 + source: 'libgtop-2.0-11_2.41.3-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libgtop2-common' + version: '2.41.3-2ubuntu1' + architecture: 'all' + sha256: '027920b974a7477358de1d6d08ca1127bc1f315c4d17dd838d933cea26781b0d' + size_bytes: 4332 + source: 'libgtop2-common_2.41.3-2ubuntu1_all.deb' + pinned_in: [] + - package: 'libgudev-1.0-0' + version: '1:238-7build1' + architecture: 'amd64' + sha256: 'fdf0708cb0fbc95c553e3379cf77f6b1c9bb485cf3244c6246c31c7312467c81' + size_bytes: 15936 + source: 'libgudev-1.0-0_1%3a238-7build1_amd64.deb' + pinned_in: [] + - package: 'libgupnp-1.6-0' + version: '1.6.9-4' + architecture: 'amd64' + sha256: '18b90a37277442074ce0c5e1954031b9d4466919516bf36ee1d684394d6e7bfc' + size_bytes: 93634 + source: 'libgupnp-1.6-0_1.6.9-4_amd64.deb' + pinned_in: [] + - package: 'libgupnp-av-1.0-3' + version: '0.14.4-3' + architecture: 'amd64' + sha256: '139b54971810fed2bd88adaf9082fd1152284ed057d0bd4ef784a3f57b1d959a' + size_bytes: 75984 + source: 'libgupnp-av-1.0-3_0.14.4-3_amd64.deb' + pinned_in: [] + - package: 'libgupnp-dlna-2.0-4' + version: '0.12.0-8' + architecture: 'amd64' + sha256: '3c443d3b6830f10db19ee85eaf0b82b8f3ed2c3ca077c228f4c041c99d7ec835' + size_bytes: 58702 + source: 'libgupnp-dlna-2.0-4_0.12.0-8_amd64.deb' + pinned_in: [] + - package: 'libgusb2a' + version: '0.4.9-7' + architecture: 'amd64' + sha256: '638367d04ee955fdfdcb1524f40f7db482cc624892c4db9a7a97ef41244c0836' + size_bytes: 39342 + source: 'libgusb2a_0.4.9-7_amd64.deb' + pinned_in: [] + - package: 'libgweather-4-0t64' + version: '4.4.4-4' + architecture: 'amd64' + sha256: 'aada232d86cdc5dc6c179ca4f4050fb6e11b96fa9309d7f5583c82f104853061' + size_bytes: 361978 + source: 'libgweather-4-0t64_4.4.4-4_amd64.deb' + pinned_in: [] + - package: 'libgweather-4-common' + version: '4.4.4-4' + architecture: 'all' + sha256: '8e3c53a03cd4d06fc59f56a63ef7c3ad4a1a050c37bddaa31186d653510de417' + size_bytes: 192528 + source: 'libgweather-4-common_4.4.4-4_all.deb' + pinned_in: [] + - package: 'libgxps2t64' + version: '0.3.2-6' + architecture: 'amd64' + sha256: 'c6a1df57576448223369be6fa33cc0b921b9c51ef4e6d58d9e7137fe1651c04e' + size_bytes: 58358 + source: 'libgxps2t64_0.3.2-6_amd64.deb' + pinned_in: [] + - package: 'libhandy-1-0' + version: '1.8.3-3build1' + architecture: 'amd64' + sha256: '9acc9624f8d50399e6a3a5183ada5ed04edffdf1e5ba176fa404cb8322c4237c' + size_bytes: 233854 + source: 'libhandy-1-0_1.8.3-3build1_amd64.deb' + pinned_in: [] + - package: 'libharfbuzz-gobject0' + version: '12.3.2-2' + architecture: 'amd64' + sha256: '1312f58a50fac42b088766dbf4dd3c73137c3fbfb875eda130a68ada382f875c' + size_bytes: 33252 + source: 'libharfbuzz-gobject0_12.3.2-2_amd64.deb' + pinned_in: [] + - package: 'libharfbuzz-icu0' + version: '12.3.2-2' + architecture: 'amd64' + sha256: 'eee0f49c4c19e29df01aacbf3cbd06dfa29ed850c5ae186ff2ada49b2cc4807c' + size_bytes: 11788 + source: 'libharfbuzz-icu0_12.3.2-2_amd64.deb' + pinned_in: [] + - package: 'libharfbuzz-subset0' + version: '12.3.2-2' + architecture: 'amd64' + sha256: '5135ba4f61cc3f71f73d3992b68b2fb08eedac7269a7070ce16d44671f143c04' + size_bytes: 491630 + source: 'libharfbuzz-subset0_12.3.2-2_amd64.deb' + pinned_in: [] + - package: 'libharfbuzz0b' + version: '12.3.2-2' + architecture: 'amd64' + sha256: 'ec93ea39ddeb5a98179b60eab4af234b6c676f1958106645d1f4b19280d4cd09' + size_bytes: 519090 + source: 'libharfbuzz0b_12.3.2-2_amd64.deb' + pinned_in: [] + - package: 'libheif-plugin-aomdec' + version: '1.21.2-3ubuntu0.4' + architecture: 'amd64' + sha256: '15d31cc704ff59c1c5c908560588eb2c8ccfe517a753544574cedb4ca95900b7' + size_bytes: 14742 + source: 'libheif-plugin-aomdec_1.21.2-3ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'libheif-plugin-aomenc' + version: '1.21.2-3ubuntu0.4' + architecture: 'amd64' + sha256: '69dcee112eae13f5ae654980403d2181f9b500b6b869f9c7b655147db24b8b41' + size_bytes: 20952 + source: 'libheif-plugin-aomenc_1.21.2-3ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'libheif1' + version: '1.21.2-3ubuntu0.4' + architecture: 'amd64' + sha256: 'cc8aead298c9b2b1ec01ea5cf4d617aa107f2ff028ddcc39028c31ccb025d5ab' + size_bytes: 545844 + source: 'libheif1_1.21.2-3ubuntu0.4_amd64.deb' + pinned_in: [] + - package: 'libhpmud0' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'amd64' + sha256: '0c03898f4e3be947ee45ccf6f1e1d99d39ff20eb7ec2f41ba55675f1bf554a5e' + size_bytes: 123284 + source: 'libhpmud0_3.24.4+dfsg0-0ubuntu8.1_amd64.deb' + pinned_in: [] + - package: 'libhtml-form-perl' + version: '6.13-1build1' + architecture: 'all' + sha256: '80dcc81dbc5f1e3bf6d5cc3bd958df3ea4e07ec3f8f8d9eda1d556923eab7ea3' + size_bytes: 31290 + source: 'libhtml-form-perl_6.13-1build1_all.deb' + pinned_in: [] + - package: 'libhtml-format-perl' + version: '2.16-2' + architecture: 'all' + sha256: 'b16a43f7ef44d31adcff0775b2c11d45c95121ce55a3331f572058d3bd42f067' + size_bytes: 36880 + source: 'libhtml-format-perl_2.16-2_all.deb' + pinned_in: [] + - package: 'libhtml-parser-perl' + version: '3.83-1ubuntu0.1' + architecture: 'amd64' + sha256: 'f0375ca3a7166d8f305dec34aba40f40cef32f99e0d7e508c5c8dbb67f108f71' + size_bytes: 85658 + source: 'libhtml-parser-perl_3.83-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libhtml-tagset-perl' + version: '3.24-1' + architecture: 'all' + sha256: '01f8ed65eecedce4efbe97f1f4c6d536c070f7044dc5ac8b91b268a47f5750ff' + size_bytes: 14142 + source: 'libhtml-tagset-perl_3.24-1_all.deb' + pinned_in: [] + - package: 'libhtml-tree-perl' + version: '5.07-3' + architecture: 'all' + sha256: 'e2759b8b8ab5a879923718c9335e256f508ea17e4c8c810c52d11a19fcd088b2' + size_bytes: 199830 + source: 'libhtml-tree-perl_5.07-3_all.deb' + pinned_in: [] + - package: 'libhttp-cookies-perl' + version: '6.11-1' + architecture: 'all' + sha256: '1dcb51ac2201ecf596741c5234bb6aa8d4f65c8ac1f71e56f17a484a2424e60f' + size_bytes: 18208 + source: 'libhttp-cookies-perl_6.11-1_all.deb' + pinned_in: [] + - package: 'libhttp-daemon-perl' + version: '6.16-1ubuntu0.26.04.1' + architecture: 'all' + sha256: '11c841178a65e43be30f25bec283fe753921b36d5a3c9f02061af032914bd47b' + size_bytes: 22100 + source: 'libhttp-daemon-perl_6.16-1ubuntu0.26.04.1_all.deb' + pinned_in: [] + - package: 'libhttp-date-perl' + version: '6.06-1ubuntu0.26.04.1' + architecture: 'all' + sha256: '0c8aaf66cbdc31fb508d79cadfb5dc75c88bacdcbd76f71f083385f7940d17ce' + size_bytes: 10572 + source: 'libhttp-date-perl_6.06-1ubuntu0.26.04.1_all.deb' + pinned_in: [] + - package: 'libhttp-message-perl' + version: '7.01-1ubuntu1' + architecture: 'all' + sha256: '3262822fd110cf66c398095bc0cfd69c21dda513f15f3ff9fbe9e5dc344f7ff4' + size_bytes: 76070 + source: 'libhttp-message-perl_7.01-1ubuntu1_all.deb' + pinned_in: [] + - package: 'libhttp-negotiate-perl' + version: '6.01-2' + architecture: 'all' + sha256: 'c39b2d426a434c2a7f1ddd5c19b2f72a0c07f767932d15f97d31a4dad408c25a' + size_bytes: 12368 + source: 'libhttp-negotiate-perl_6.01-2_all.deb' + pinned_in: [] + - package: 'libhunspell-1.7-0' + version: '1.7.2+really1.7.2-11' + architecture: 'amd64' + sha256: '2787cc87d5e7b1381b05f7cfb568e5044b8b0f15b62b14fd2ffe255f7c7a4329' + size_bytes: 315810 + source: 'libhunspell-1.7-0_1.7.2+really1.7.2-11_amd64.deb' + pinned_in: [] + - package: 'libhwy1t64' + version: '1.3.0-2' + architecture: 'amd64' + sha256: '8b4e74f6fc7c9a08956f1430fe5d80f4d8970a08fe24df9e187d57753f652c7a' + size_bytes: 767902 + source: 'libhwy1t64_1.3.0-2_amd64.deb' + pinned_in: [] + - package: 'libhyphen0' + version: '2.8.8-7build4' + architecture: 'amd64' + sha256: 'eda68421ab4d85d79cc3bdc0ee5cac6bf80b8741187446f019a98d9e40bc1101' + size_bytes: 26730 + source: 'libhyphen0_2.8.8-7build4_amd64.deb' + pinned_in: [] + - package: 'libibus-1.0-5' + version: '1.5.34~rc2-1' + architecture: 'amd64' + sha256: '74a80664f054cec242dc8e4147a6455969a52fd1e7ff68add97b0f4cc0c0dd6b' + size_bytes: 180936 + source: 'libibus-1.0-5_1.5.34~rc2-1_amd64.deb' + pinned_in: [] + - package: 'libibverbs1' + version: '61.0-2ubuntu3' + architecture: 'amd64' + sha256: '1d9e2e86e6500dabb6143c04adea8d122c7caa72aae3832de88d7ada4fa97201' + size_bytes: 70568 + source: 'libibverbs1_61.0-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libical3t64' + version: '3.0.20-2build1' + architecture: 'amd64' + sha256: '99be1a4b6133a9b785ab618454fd86924e039bc78612eb2c72c33e7392f5f1c2' + size_bytes: 307558 + source: 'libical3t64_3.0.20-2build1_amd64.deb' + pinned_in: [] + - package: 'libice6' + version: '2:1.1.1-1build1' + architecture: 'amd64' + sha256: 'd755a3f99a4895165703aad60ff15cf931e04da41b35facb15393d7d4b2c0242' + size_bytes: 44016 + source: 'libice6_2%3a1.1.1-1build1_amd64.deb' + pinned_in: [] + - package: 'libicu78' + version: '78.2-2ubuntu1' + architecture: 'amd64' + sha256: 'c8b97930f9e365d6d00978144b468ac8397ef07d2fb2c453869f05fc3a98c4ca' + size_bytes: 11456466 + source: 'libicu78_78.2-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libidn12' + version: '1.43-2ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '93f52978f16f850f0a27891d373304f41a0aa986f82921b3267224b26fdcc2f5' + size_bytes: 57800 + source: 'libidn12_1.43-2ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libiec61883-0' + version: '1.2.0-8' + architecture: 'amd64' + sha256: '6fd159a125d70973915a4d4a3a9ea0a3713b35b6c8b36eed4120ef4a235c152b' + size_bytes: 25708 + source: 'libiec61883-0_1.2.0-8_amd64.deb' + pinned_in: [] + - package: 'libieee1284-3t64' + version: '0.2.11-14.1build2' + architecture: 'amd64' + sha256: 'e2d8497cb45f5a99a018c4b83a88ecba44805442fdc3b82d5b541ed99f257c08' + size_bytes: 22018 + source: 'libieee1284-3t64_0.2.11-14.1build2_amd64.deb' + pinned_in: [] + - package: 'libijs-0.35' + version: '0.35-16' + architecture: 'amd64' + sha256: '9f65ccd8b1afde140286b2890064bb1119afabc5aead01ed0aa741134ee8cc94' + size_bytes: 15582 + source: 'libijs-0.35_0.35-16_amd64.deb' + pinned_in: [] + - package: 'libimagequant0' + version: '4.4.1-1' + architecture: 'amd64' + sha256: 'da65f428985ce4cf9ee3cd4f845749812f006909ba6c130bd6c9fa7d1d491988' + size_bytes: 264352 + source: 'libimagequant0_4.4.1-1_amd64.deb' + pinned_in: [] + - package: 'libimobiledevice-1.0-6' + version: '1.4.0-1build1' + architecture: 'amd64' + sha256: 'b5277ade48034e54db3f0b714ab0935b4657632fbdd8ec3d795e2c044272a622' + size_bytes: 138190 + source: 'libimobiledevice-1.0-6_1.4.0-1build1_amd64.deb' + pinned_in: [] + - package: 'libimobiledevice-glue-1.0-0' + version: '1.3.2-2build1' + architecture: 'amd64' + sha256: 'c2e1b9b47592a645be9ece937f3c4f18a99a8de0d9f79134dca9d4582bcdfcdb' + size_bytes: 33830 + source: 'libimobiledevice-glue-1.0-0_1.3.2-2build1_amd64.deb' + pinned_in: [] + - package: 'libini-config5t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: '6512a039125162e5b8bb01940ce1c5be14abcc91810afd3ca60ebb45346d1d82' + size_bytes: 43914 + source: 'libini-config5t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libinih1' + version: '61-1ubuntu1' + architecture: 'amd64' + sha256: '6ee8d9867cc98d192a7b6bc589c61aad12b2e8479c6a0217932afa6c2db99df6' + size_bytes: 7726 + source: 'libinih1_61-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libinireader0' + version: '61-1ubuntu1' + architecture: 'amd64' + sha256: 'e3758dc01da47a9c793995bc7560bf1d503616080c81f023949a881103edc10d' + size_bytes: 13134 + source: 'libinireader0_61-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libinput-bin' + version: '1.31.1-1ubuntu1.2' + architecture: 'amd64' + sha256: '2b9635549e990d505c2f0e62eeb9abe9055ea58a810b06725f78eef49264851f' + size_bytes: 24484 + source: 'libinput-bin_1.31.1-1ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'libinput10' + version: '1.31.1-1ubuntu1.2' + architecture: 'amd64' + sha256: 'da31dc35e4644394705d111c55562f676000ac30b9f854201a7ca5b7a25eb215' + size_bytes: 160660 + source: 'libinput10_1.31.1-1ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'libinsights0' + version: '0.9.3ubuntu' + architecture: 'amd64' + sha256: '4eac325ea009508e6d51c0a005c254bb910972c8da265313e42e142378542e45' + size_bytes: 2624148 + source: 'libinsights0_0.9.3ubuntu_amd64.deb' + pinned_in: [] + - package: 'libio-html-perl' + version: '1.004-3' + architecture: 'all' + sha256: '999f8b54d84ac26dda0340ac4ab3263d190688dd92f312e62f3d499807687ed9' + size_bytes: 15870 + source: 'libio-html-perl_1.004-3_all.deb' + pinned_in: [] + - package: 'libio-pty-perl' + version: '1:1.20-1build3' + architecture: 'amd64' + sha256: '6f88732539ef0ac6019f9cfb5bdd374416e25a4894b296733a2451063ad5e496' + size_bytes: 31368 + source: 'libio-pty-perl_1%3a1.20-1build3_amd64.deb' + pinned_in: [] + - package: 'libio-socket-ssl-perl' + version: '2.098-1' + architecture: 'all' + sha256: '1a4dcfe2ab054c03d68ec45f51c715c4b1c6f00b516bfb0e9d10c2a2c81a4db3' + size_bytes: 204670 + source: 'libio-socket-ssl-perl_2.098-1_all.deb' + pinned_in: [] + - package: 'libio-stringy-perl' + version: '2.113-2' + architecture: 'all' + sha256: '8b0afc8b50d5db3d7606e6ce89deb5b1a68676707709f1771e19bbc7405b0d14' + size_bytes: 45298 + source: 'libio-stringy-perl_2.113-2_all.deb' + pinned_in: [] + - package: 'libip4tc2' + version: '1.8.11-2ubuntu3' + architecture: 'amd64' + sha256: 'be25148d60125f6866dfa7940f3f1371fff4b0e8a1a9500780ad50cb8aaa0895' + size_bytes: 24182 + source: 'libip4tc2_1.8.11-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libip6tc2' + version: '1.8.11-2ubuntu3' + architecture: 'amd64' + sha256: '3d9fdb3171f1167ab3f5182de11db63bcd27aae71838618f3d46806b3134428e' + size_bytes: 24446 + source: 'libip6tc2_1.8.11-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libipa-hbac0t64' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'bf0a1f18069ac0601c2569d7e061cef5e93b3c33a1917830b72a33b948a17b2f' + size_bytes: 15724 + source: 'libipa-hbac0t64_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libipc-run-perl' + version: '20250809.0-1build1' + architecture: 'all' + sha256: 'fca30465aeb724e2627bdc1da21616e6eeafbab7e80952202796882bb8b8a58c' + size_bytes: 94512 + source: 'libipc-run-perl_20250809.0-1build1_all.deb' + pinned_in: [] + - package: 'libipc-system-simple-perl' + version: '1.30-2' + architecture: 'all' + sha256: 'acb7603a5d3231bbe55054b7754c38b25e6acca1a0ac03f65a09e11ba4335fa2' + size_bytes: 22310 + source: 'libipc-system-simple-perl_1.30-2_all.deb' + pinned_in: [] + - package: 'libipt2' + version: '2.1.2-3' + architecture: 'amd64' + sha256: '0113f73b628f0fdeb00bb0099268088e5bbbbd231d03d65d2dac60edb3cb57ea' + size_bytes: 49182 + source: 'libipt2_2.1.2-3_amd64.deb' + pinned_in: [] + - package: 'libisl23' + version: '0.27-1build1' + architecture: 'amd64' + sha256: '02ea5de2ab6ddba978606ad58647bf6371ea68c0ed63aa5d6d0d3b8c1fe77ea3' + size_bytes: 690670 + source: 'libisl23_0.27-1build1_amd64.deb' + pinned_in: [] + - package: 'libjansson4' + version: '2.14-2build4' + architecture: 'amd64' + sha256: '1dc986ac3cf112384919d1a339a952e8a86bede9890a4489c016fdc266a036ca' + size_bytes: 33250 + source: 'libjansson4_2.14-2build4_amd64.deb' + pinned_in: [] + - package: 'libjavascriptcoregtk-4.1-0' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'd77a6bad6f53b76a78bcb6ecbd9d56c1855f63af3a23c412f6590ffc1d807836' + size_bytes: 8088236 + source: 'libjavascriptcoregtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libjavascriptcoregtk-6.0-1' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'a278b88a4b0633ad4c40e0de09a5990815798db7aae80defdba095e9eb3dc032' + size_bytes: 8088994 + source: 'libjavascriptcoregtk-6.0-1_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libjbig0' + version: '2.1-6.1ubuntu3' + architecture: 'amd64' + sha256: 'bb2ffa4e359ee7a29dab9902b45e5c85de06f019272700cb2538e4762f141ee8' + size_bytes: 30028 + source: 'libjbig0_2.1-6.1ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libjbig2dec0' + version: '0.20-1ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '5c95617786982adc08f0991900400802b4e7037dda3e2f3a6bc9d0a6c6f04841' + size_bytes: 63576 + source: 'libjbig2dec0_0.20-1ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libjcat1' + version: '0.2.5-1build1' + architecture: 'amd64' + sha256: 'b244182d1ac9ed41b2fcbbc664489b4a4f7b60dbef99e3cfa25694b38380641f' + size_bytes: 35416 + source: 'libjcat1_0.2.5-1build1_amd64.deb' + pinned_in: [] + - package: 'libjemalloc2' + version: '5.3.0-4' + architecture: 'amd64' + sha256: 'df00a1d37c735bfb1830418efb721c2c0b79cd0a735c3d35e4015eb6a4d2683d' + size_bytes: 263476 + source: 'libjemalloc2_5.3.0-4_amd64.deb' + pinned_in: [] + - package: 'libjpeg-turbo8' + version: '2.1.5-4ubuntu4' + architecture: 'amd64' + sha256: '07672ce1f4d187e005ea0cc35d03e515ba056f3d3e7a9a25d3ef386e184da8c5' + size_bytes: 152810 + source: 'libjpeg-turbo8_2.1.5-4ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libjpeg8' + version: '8c-2ubuntu12' + architecture: 'amd64' + sha256: '1403d44d2c2d3eba6a7a8aea97fab0bac2e89e144a3bf600adfdd3ecdc3d9394' + size_bytes: 2142 + source: 'libjpeg8_8c-2ubuntu12_amd64.deb' + pinned_in: [] + - package: 'libjq1' + version: '1.8.1-4ubuntu2' + architecture: 'amd64' + sha256: '3ced45ef4154cce59ce9fc74cc606b7361fa1b2f088b31a903d54fbcee75cb43' + size_bytes: 146208 + source: 'libjq1_1.8.1-4ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libjs-sphinxdoc' + version: '8.2.3-12' + architecture: 'all' + sha256: '13a0c814f4b0000ac420f7d10b4ded7574bf2fe1becb781b4471e742a6c04d1c' + size_bytes: 28370 + source: 'libjs-sphinxdoc_8.2.3-12_all.deb' + pinned_in: [] + - package: 'libjson-c5' + version: '0.18+ds-3' + architecture: 'amd64' + sha256: 'a19fa7f6504920f13e5fd291cf3c626d7201a48a0d80fde7cdac34f95306d352' + size_bytes: 35930 + source: 'libjson-c5_0.18+ds-3_amd64.deb' + pinned_in: [] + - package: 'libjson-glib-1.0-0' + version: '1.10.8+ds-2' + architecture: 'amd64' + sha256: '7b2a877a55554709e550ab2112eb3f8429c653d2340ef718d5ddeaf8b191ecd5' + size_bytes: 69816 + source: 'libjson-glib-1.0-0_1.10.8+ds-2_amd64.deb' + pinned_in: [] + - package: 'libjson-glib-1.0-common' + version: '1.10.8+ds-2' + architecture: 'all' + sha256: '4f04c6e07d49abf34a0192dec6c9ca9e1ce664eaf6517cb725a8f9ca33ab4d62' + size_bytes: 6142 + source: 'libjson-glib-1.0-common_1.10.8+ds-2_all.deb' + pinned_in: [] + - package: 'libjxl-gdk-pixbuf' + version: '0.11.1-6ubuntu4.2' + architecture: 'amd64' + sha256: '82f12d81d9cade1f6379340b319d64d05318eba5d7fdce8e8975a8f13c25e062' + size_bytes: 10054 + source: 'libjxl-gdk-pixbuf_0.11.1-6ubuntu4.2_amd64.deb' + pinned_in: [] + - package: 'libjxl0.11' + version: '0.11.1-6ubuntu4.2' + architecture: 'amd64' + sha256: 'ad047c32784c7e3d1119f32c164876ae8f60c545c25354c9d673a958eef183df' + size_bytes: 1269230 + source: 'libjxl0.11_0.11.1-6ubuntu4.2_amd64.deb' + pinned_in: [] + - package: 'libklibc' + version: '2.0.14-1ubuntu2' + architecture: 'amd64' + sha256: 'a09471ffaac8fbd48194007a4400325a9e0ec69eabbdcc23916011b4060c777e' + size_bytes: 47498 + source: 'libklibc_2.0.14-1ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libkmod2' + version: '34.2-2ubuntu2' + architecture: 'amd64' + sha256: 'bb55dd5908866cf5b76b642ddfcb494ab35adb43ccba07431116398b373d4845' + size_bytes: 50890 + source: 'libkmod2_34.2-2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'liblc3-1' + version: '1.1.3+dfsg-1build1' + architecture: 'amd64' + sha256: '61d9af5cabb5288695dad37d7a887b5d2793b966c738cb43d98d36017ca41054' + size_bytes: 95326 + source: 'liblc3-1_1.1.3+dfsg-1build1_amd64.deb' + pinned_in: [] + - package: 'liblcms2-2' + version: '2.17-1ubuntu0.2' + architecture: 'amd64' + sha256: '0fcc048872daa6a242d548b78b76749044800d3be5a883123ca45eb4c8c65e05' + size_bytes: 169156 + source: 'liblcms2-2_2.17-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'liblcms2-utils' + version: '2.17-1ubuntu0.2' + architecture: 'amd64' + sha256: 'a58b8edc53a5f06fa6a57788a0ce57c60fd63f355fd296ba02d4912df3b8236e' + size_bytes: 45544 + source: 'liblcms2-utils_2.17-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libldacbt-abr2' + version: '2.0.2.3+git20200429+ed310a0-5build1' + architecture: 'amd64' + sha256: 'fd8d353f5090cc72729ecbbfcb5d3d5eafa08d894518158106a0df3f1181a828' + size_bytes: 4876 + source: 'libldacbt-abr2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb' + pinned_in: [] + - package: 'libldacbt-enc2' + version: '2.0.2.3+git20200429+ed310a0-5build1' + architecture: 'amd64' + sha256: '000b286931549a4e2c1bb28a9b06b83fd8aa79c99e7b04503afbe2078aad638b' + size_bytes: 28628 + source: 'libldacbt-enc2_2.0.2.3+git20200429+ed310a0-5build1_amd64.deb' + pinned_in: [] + - package: 'libldb2' + version: '2:2.11.0+samba4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: 'd9c599cde03ad8f07e75a0318cbb7c381b968ad77ca7f47ccfb397218f218270' + size_bytes: 150184 + source: 'libldb2_2%3a2.11.0+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'liblerc4' + version: '4.0.0+ds-5ubuntu2' + architecture: 'amd64' + sha256: '29051d37d010a7a0e3b5648f73f30d35eb1e313061137c88f3a2c2078925a36d' + size_bytes: 206718 + source: 'liblerc4_4.0.0+ds-5ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libllvm21' + version: '1:21.1.8-6ubuntu1' + architecture: 'amd64' + sha256: '9e758998dcb4aa27abbe64f2dee7bc490d9eb0721afa334a82a2b1bf6c7648f9' + size_bytes: 30710558 + source: 'libllvm21_1%3a21.1.8-6ubuntu1_amd64.deb' + pinned_in: [] + - package: 'liblmdb0' + version: '0.9.31-1build2' + architecture: 'amd64' + sha256: 'b702706b751b51516988230cefbe74643a373dcf28878dd77f735048117f88b5' + size_bytes: 49516 + source: 'liblmdb0_0.9.31-1build2_amd64.deb' + pinned_in: [] + - package: 'liblocale-gettext-perl' + version: '1.07-8' + architecture: 'amd64' + sha256: '67dba813307624944c9c2443a8e6f3efdd330bcad006de6413fa8c4cac5d40ca' + size_bytes: 15846 + source: 'liblocale-gettext-perl_1.07-8_amd64.deb' + pinned_in: [] + - package: 'liblouis-data' + version: '3.36.0-1' + architecture: 'all' + sha256: 'f3bb432706c8e32a11028da4a797d2bbacb1166027effd01d9c8d7ed4978b5d5' + size_bytes: 2426288 + source: 'liblouis-data_3.36.0-1_all.deb' + pinned_in: [] + - package: 'liblouis20' + version: '3.36.0-1' + architecture: 'amd64' + sha256: '0a354158b63d132d77af58e051a17451229b261002b9e0c5aa0343ad9ce040f6' + size_bytes: 95952 + source: 'liblouis20_3.36.0-1_amd64.deb' + pinned_in: [] + - package: 'liblouisutdml-bin' + version: '2.12.0-8build1' + architecture: 'amd64' + sha256: '3a88b6334ae9e5d80392b7984953c93a007215e667f6228e91d96822a8f70189' + size_bytes: 9668 + source: 'liblouisutdml-bin_2.12.0-8build1_amd64.deb' + pinned_in: [] + - package: 'liblouisutdml-data' + version: '2.12.0-8build1' + architecture: 'all' + sha256: 'a0705c62c2e6f1283ad05654f4f71894a04bf749206cfaea498bdbdb1ca56ecd' + size_bytes: 50088 + source: 'liblouisutdml-data_2.12.0-8build1_all.deb' + pinned_in: [] + - package: 'liblouisutdml9t64' + version: '2.12.0-8build1' + architecture: 'amd64' + sha256: 'a9138993317e8b3529102544b45f469d2b76b87043861e44f820317ec99f4a20' + size_bytes: 92286 + source: 'liblouisutdml9t64_2.12.0-8build1_amd64.deb' + pinned_in: [] + - package: 'liblsof0' + version: '4.99.4+dfsg-2build2' + architecture: 'amd64' + sha256: '86ba7fb7ceee83651a60616891b5a216c5c62631d4b3d482f63a0fc9cc0f7be7' + size_bytes: 56480 + source: 'liblsof0_4.99.4+dfsg-2build2_amd64.deb' + pinned_in: [] + - package: 'libltdl7' + version: '2.5.4-9' + architecture: 'amd64' + sha256: 'c0279172b218093c674151044326457f6cb3e2ce0b1241380e3897e65677283e' + size_bytes: 43668 + source: 'libltdl7_2.5.4-9_amd64.deb' + pinned_in: [] + - package: 'liblua5.4-0' + version: '5.4.8-1build1' + architecture: 'amd64' + sha256: 'ff589ea3f181b89dd76b0240f79c59ac2f13f24e2053f624f774f596c7ef7897' + size_bytes: 162684 + source: 'liblua5.4-0_5.4.8-1build1_amd64.deb' + pinned_in: [] + - package: 'liblwp-mediatypes-perl' + version: '6.04-2' + architecture: 'all' + sha256: 'a8e1de745f650233753c5e7e9d914d357eaedf2a32d333aa98728c5f6601dfcc' + size_bytes: 20102 + source: 'liblwp-mediatypes-perl_6.04-2_all.deb' + pinned_in: [] + - package: 'liblwp-protocol-https-perl' + version: '6.14-1' + architecture: 'all' + sha256: 'd4e9ae3ad7f0b2603151da0bffd9e2821668d39b1c8f2d31db646d42bbf5b69b' + size_bytes: 9040 + source: 'liblwp-protocol-https-perl_6.14-1_all.deb' + pinned_in: [] + - package: 'liblzo2-2' + version: '2.10-3build2' + architecture: 'amd64' + sha256: 'ffc9f1fea544f200b7b47a77e0ec89f70d493b5393ea2f7a43f6b9685b3341b8' + size_bytes: 55968 + source: 'liblzo2-2_2.10-3build2_amd64.deb' + pinned_in: [] + - package: 'libmagic-mgc' + version: '1:5.46-5build2' + architecture: 'amd64' + sha256: '3264ec3ed617abec65c55f2e165cf78f8c9dd006859faf0d863a8bc6095a67fd' + size_bytes: 336574 + source: 'libmagic-mgc_1%3a5.46-5build2_amd64.deb' + pinned_in: [] + - package: 'libmagic1t64' + version: '1:5.46-5build2' + architecture: 'amd64' + sha256: '855e4f4a543789a427ad9aef77a31fbf99aebdd33576caa467e67a4301cd2d20' + size_bytes: 90760 + source: 'libmagic1t64_1%3a5.46-5build2_amd64.deb' + pinned_in: [] + - package: 'libmailtools-perl' + version: '2.22-1' + architecture: 'all' + sha256: '33c29b0c7536731fe056649669ad2d2cdaf406411a04e090d5a0fe3fa4055a19' + size_bytes: 77076 + source: 'libmailtools-perl_2.22-1_all.deb' + pinned_in: [] + - package: 'libmalcontent-0-0' + version: '0.14.0-0ubuntu1.2' + architecture: 'amd64' + sha256: '4157ed7ac889c37ee459cd5de52df27854d1db19c8f150019282eeb7b035398f' + size_bytes: 40234 + source: 'libmalcontent-0-0_0.14.0-0ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'libmalcontent-common' + version: '0.14.0-0ubuntu1.2' + architecture: 'all' + sha256: 'b38b2edc753d7203ae8648cc41ce364a7b509f48f7c3553924198f5a183c0f76' + size_bytes: 11216 + source: 'libmalcontent-common_0.14.0-0ubuntu1.2_all.deb' + pinned_in: [] + - package: 'libmaxminddb0' + version: '1.12.2-1build2' + architecture: 'amd64' + sha256: '3ea71228684a480b2183b72de1c99126965ef98c1b8def81f65e346298024fed' + size_bytes: 18864 + source: 'libmaxminddb0_1.12.2-1build2_amd64.deb' + pinned_in: [] + - package: 'libmbim-glib4' + version: '1.32.0-2ubuntu1' + architecture: 'amd64' + sha256: '58e905818f0f2080f85aafdf104ca167c7a6b8ae0e0591372f5a9ba500792fdc' + size_bytes: 236006 + source: 'libmbim-glib4_1.32.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmbim-proxy' + version: '1.32.0-2ubuntu1' + architecture: 'amd64' + sha256: '4da8e1f09c476836ce2efcd3bf2e64a910e1e214683eb7283536c1bf9c0d761c' + size_bytes: 6264 + source: 'libmbim-proxy_1.32.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmbim-utils' + version: '1.32.0-2ubuntu1' + architecture: 'amd64' + sha256: 'a6b275dab16122d2db40a12828b05bc2c0d5536a0bf681fd39b568dc3a35f1ec' + size_bytes: 75308 + source: 'libmbim-utils_1.32.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmediaart-2.0-0' + version: '1.9.7-3' + architecture: 'amd64' + sha256: 'face445bcee3dd11b0fbfb12710422d527b6c20394a8384db3b14e117fdb30dc' + size_bytes: 18482 + source: 'libmediaart-2.0-0_1.9.7-3_amd64.deb' + pinned_in: [] + - package: 'libmm-glib0' + version: '1.25.95-1ubuntu1' + architecture: 'amd64' + sha256: '8f77d6a2bbc4900ba736de74f62b2d78bb5d73e84383ac46e95936131ec92c89' + size_bytes: 260106 + source: 'libmm-glib0_1.25.95-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmnl0' + version: '1.0.5-3build1' + architecture: 'amd64' + sha256: 'ab5e2781b0e2a2155cf154c658a2e6cf419d95a28c3121aefb159df6453102e5' + size_bytes: 12560 + source: 'libmnl0_1.0.5-3build1_amd64.deb' + pinned_in: [] + - package: 'libmozjs-140-0' + version: '140.8.0-4' + architecture: 'amd64' + sha256: 'c67719532b781b6501b784b8ecd76e42748de2f3d81a653098697fc3d426c61f' + size_bytes: 11757962 + source: 'libmozjs-140-0_140.8.0-4_amd64.deb' + pinned_in: [] + - package: 'libmp3lame0' + version: '3.101~svn6525+dfsg-2' + architecture: 'amd64' + sha256: '20ab98afff633ed2c8e2cfb1b69a2c0a0cb86c8328b663c5825e6592dab600b4' + size_bytes: 121446 + source: 'libmp3lame0_3.101~svn6525+dfsg-2_amd64.deb' + pinned_in: [] + - package: 'libmpc3' + version: '1.3.1-3' + architecture: 'amd64' + sha256: 'a95c75b486f26fe8b140a632fd9e2883b7e2efc21f7586e155d27d2d2ff0ddc0' + size_bytes: 54628 + source: 'libmpc3_1.3.1-3_amd64.deb' + pinned_in: [] + - package: 'libmpfr6' + version: '4.2.2-3' + architecture: 'amd64' + sha256: '74defa71b7f81d66b103afccfce750ad356976696b40c96c846ddc956fcfe937' + size_bytes: 361268 + source: 'libmpfr6_4.2.2-3_amd64.deb' + pinned_in: [] + - package: 'libmpg123-0t64' + version: '1.33.3-2' + architecture: 'amd64' + sha256: '5bb06d8890eecd357da520a21e592a93267bb4b48a4f8946d6d67c366f511bbd' + size_bytes: 176430 + source: 'libmpg123-0t64_1.33.3-2_amd64.deb' + pinned_in: [] + - package: 'libmsgraph-1-1' + version: '0.3.3-3build1' + architecture: 'amd64' + sha256: '8bcffcf8a08329f8fdaaff42cfe6cc36fa8f9272fd3015c0b270df6879ef19f6' + size_bytes: 35392 + source: 'libmsgraph-1-1_0.3.3-3build1_amd64.deb' + pinned_in: [] + - package: 'libmtdev1t64' + version: '1.1.7-1build1' + architecture: 'amd64' + sha256: 'd5e3b70bec533015ac924b69b13e21c7ad0eef8e84183d1eaff9529e603f4c39' + size_bytes: 15162 + source: 'libmtdev1t64_1.1.7-1build1_amd64.deb' + pinned_in: [] + - package: 'libmtp-common' + version: '1.1.22-1ubuntu1' + architecture: 'all' + sha256: '2e168f0da2dc8a46cbd6eaa81bf299e3d76b5e1ee69a0a1412c475dcc7a58b4d' + size_bytes: 20346 + source: 'libmtp-common_1.1.22-1ubuntu1_all.deb' + pinned_in: [] + - package: 'libmtp-runtime' + version: '1.1.22-1ubuntu1' + architecture: 'amd64' + sha256: '2935dbd79326f0533a27122ee5ba9c1379fc9c0dbda84f14d55c27c849170e55' + size_bytes: 6190 + source: 'libmtp-runtime_1.1.22-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmtp9t64' + version: '1.1.22-1ubuntu1' + architecture: 'amd64' + sha256: 'ba2279c6d50532e9a2a484b30253ebaa360af37bd11d8dd3214338574c597e7f' + size_bytes: 162936 + source: 'libmtp9t64_1.1.22-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libmutter-18-0' + version: '50.1-0ubuntu2.2' + architecture: 'amd64' + sha256: 'c9cbb657eaf673602d8eb95292a5a8b1d2302dc7f03fa707daa860b8a612b858' + size_bytes: 1498144 + source: 'libmutter-18-0_50.1-0ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libnautilus-extension4' + version: '1:50.2.2-0ubuntu0.1' + architecture: 'amd64' + sha256: 'f55976cc2792848d8c69518a44593a1b9c1304936b37777cd8b22e2051caed0b' + size_bytes: 22674 + source: 'libnautilus-extension4_1%3a50.2.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libncurses6' + version: '6.6+20251231-1' + architecture: 'amd64' + sha256: 'ef354764c18dd6034325c255b636f108dc6d4f5e64d4cafb22975e76421f3d28' + size_bytes: 114146 + source: 'libncurses6_6.6+20251231-1_amd64.deb' + pinned_in: [] + - package: 'libndp0' + version: '1.9-1build1' + architecture: 'amd64' + sha256: '5ff885eeabf5e293232cda13484454b80aa291098d6b1385c53ee905612bce9e' + size_bytes: 13114 + source: 'libndp0_1.9-1build1_amd64.deb' + pinned_in: [] + - package: 'libnet-dbus-perl' + version: '1.2.0-2build4' + architecture: 'amd64' + sha256: '32fe77bab16f4600244b64cad4daabc3bda96c8b504a4f144cd8af53dcd9c28e' + size_bytes: 164956 + source: 'libnet-dbus-perl_1.2.0-2build4_amd64.deb' + pinned_in: [] + - package: 'libnet-http-perl' + version: '6.24-1build1' + architecture: 'all' + sha256: '6d16156e6b3803eea6e69cacd93252d463fe2e3e3612cc97f2f101462c5398f8' + size_bytes: 21656 + source: 'libnet-http-perl_6.24-1build1_all.deb' + pinned_in: [] + - package: 'libnet-smtp-ssl-perl' + version: '1.04-2' + architecture: 'all' + sha256: '5e2209f46511c3aedd528b363c6c5243dc8bec0a7681b46cf49e6afb04eaf28f' + size_bytes: 6218 + source: 'libnet-smtp-ssl-perl_1.04-2_all.deb' + pinned_in: [] + - package: 'libnet-ssleay-perl' + version: '1.94-3' + architecture: 'amd64' + sha256: '69372215b26f1939c1ae21517bb57692fc64d7afe7534257ead0100138689629' + size_bytes: 318024 + source: 'libnet-ssleay-perl_1.94-3_amd64.deb' + pinned_in: [] + - package: 'libnetfilter-conntrack3' + version: '1.1.1-1' + architecture: 'amd64' + sha256: 'facfd45a7cf6bab8ef30adbe693d6486f22e5253263f9d53b4e70b53f768970e' + size_bytes: 47520 + source: 'libnetfilter-conntrack3_1.1.1-1_amd64.deb' + pinned_in: [] + - package: 'libnetplan1' + version: '1.2-1ubuntu5.1' + architecture: 'amd64' + sha256: '7ea06d69095c1b912ced77d9ba1aeed67eb18e60e9a67ba03d45f164382c3071' + size_bytes: 132066 + source: 'libnetplan1_1.2-1ubuntu5.1_amd64.deb' + pinned_in: [] + - package: 'libnewt0.52' + version: '0.52.25-1ubuntu3' + architecture: 'amd64' + sha256: '4aba21a5364aeb3778946e75b2f7b420b44a77cc5c1cd32935279eae4d8c0e99' + size_bytes: 47588 + source: 'libnewt0.52_0.52.25-1ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libnfnetlink0' + version: '1.0.2-3build1' + architecture: 'amd64' + sha256: 'e76b638fef2c1ebf78260972a52c4716df5752b29a952aeddc0c091a74f179c2' + size_bytes: 15078 + source: 'libnfnetlink0_1.0.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libnfs14' + version: '5.0.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'cfed9f8dedae4c1aa0f079837adae4f3f551bdff3af5cb30bbf9ed74187e49e4' + size_bytes: 110198 + source: 'libnfs14_5.0.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libnfsidmap1' + version: '1:2.8.5-1ubuntu1' + architecture: 'amd64' + sha256: '66f6a767957ef82e42b549d9f6444d968fc0517f79b7147a80049e6e75df2738' + size_bytes: 51412 + source: 'libnfsidmap1_1%3a2.8.5-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libnftables1' + version: '1.1.6-1' + architecture: 'amd64' + sha256: '0e5abb5719052d9f12aadf91a3f3d5192a2e85d035ee81d07c3055a0f79d8b8f' + size_bytes: 390468 + source: 'libnftables1_1.1.6-1_amd64.deb' + pinned_in: [] + - package: 'libnftnl11' + version: '1.3.1-1' + architecture: 'amd64' + sha256: 'a2f4d4a4ce3fac7e473c8de60a3d8948a58e9850cd8e2ced17263aa73dda7199' + size_bytes: 72288 + source: 'libnftnl11_1.3.1-1_amd64.deb' + pinned_in: [] + - package: 'libnl-3-200' + version: '3.12.0-2' + architecture: 'amd64' + sha256: '52fda1b991baa2d0fbe82f5dfb15584dcb1f25a7e3d311e2e319cc33858b4f2c' + size_bytes: 58810 + source: 'libnl-3-200_3.12.0-2_amd64.deb' + pinned_in: [] + - package: 'libnl-genl-3-200' + version: '3.12.0-2' + architecture: 'amd64' + sha256: '8f25551ea6e925070c36ad1653e1201aa5fd62f3d0d8552071104b5b33813f3c' + size_bytes: 12386 + source: 'libnl-genl-3-200_3.12.0-2_amd64.deb' + pinned_in: [] + - package: 'libnl-route-3-200' + version: '3.12.0-2' + architecture: 'amd64' + sha256: '58c5fa3c2f5226ffb1846db6cf7318196dbf5294a4354edd00fdae2db30a45dc' + size_bytes: 204148 + source: 'libnl-route-3-200_3.12.0-2_amd64.deb' + pinned_in: [] + - package: 'libnm0' + version: '1.54.3-2ubuntu3' + architecture: 'amd64' + sha256: '43658f6f4ba4baf8bba1951560e4d02e9cf99214442136bc6dcd0fb0115247cd' + size_bytes: 495248 + source: 'libnm0_1.54.3-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libnma-common' + version: '1.10.6-7' + architecture: 'all' + sha256: '1185d15ff0ec06e97483869e1e736b4c825fbacf127aedbfe8fda3f3f6c0422d' + size_bytes: 3820 + source: 'libnma-common_1.10.6-7_all.deb' + pinned_in: [] + - package: 'libnma-gtk4-0' + version: '1.10.6-7' + architecture: 'amd64' + sha256: 'fbc9062fd946b7cf2ec50ca5c9a9f707ee9e02de68fe8b0f7d96d53480a4d787' + size_bytes: 93978 + source: 'libnma-gtk4-0_1.10.6-7_amd64.deb' + pinned_in: [] + - package: 'libnma0' + version: '1.10.6-7' + architecture: 'amd64' + sha256: '9fbd195fd86dccc86ef344ddd8f50da3945da4eadc01a83289f219c46d59882a' + size_bytes: 94644 + source: 'libnma0_1.10.6-7_amd64.deb' + pinned_in: [] + - package: 'libnotify-bin' + version: '0.8.8-1' + architecture: 'amd64' + sha256: 'bfc31bf33d581aaac2bbfbbd85b2a90ca93ec67bd602e34bfdff83319a131f8f' + size_bytes: 10802 + source: 'libnotify-bin_0.8.8-1_amd64.deb' + pinned_in: [] + - package: 'libnotify4' + version: '0.8.8-1' + architecture: 'amd64' + sha256: '9bfebcb17db3153100d8a0f748d9da1409ba2157e095f640ef618c0fa89b89bc' + size_bytes: 28632 + source: 'libnotify4_0.8.8-1_amd64.deb' + pinned_in: [] + - package: 'libnspr4' + version: '2:4.38.2-1ubuntu1' + architecture: 'amd64' + sha256: '2f28284b35765aaccad1785ab017425e1ca378c395256331f9c662d04335d43f' + size_bytes: 118396 + source: 'libnspr4_2%3a4.38.2-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libnss-mdns' + version: '0.15.1-5' + architecture: 'amd64' + sha256: '96debaf57a6806101e3902c168da38d7f6f927b77bf97c83de137e4ee62c287b' + size_bytes: 24758 + source: 'libnss-mdns_0.15.1-5_amd64.deb' + pinned_in: [] + - package: 'libnss-sss' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'c7fd332ba671fab74b184fbf57652125c7de1b9cdf4ad9c62d6f90dcf39d958c' + size_bytes: 29978 + source: 'libnss-sss_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libnss-systemd' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '9dc03fc62f6010bb1ca252a8403e1f9848dd629756e8cd657afa6b15f35222d1' + size_bytes: 226508 + source: 'libnss-systemd_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'libnss3' + version: '2:3.120-1ubuntu2.1' + architecture: 'amd64' + sha256: '27ae6a8dbc2b8b750731c9098abb8750c5d584c79c5a024316d0b3c9bb50971c' + size_bytes: 1515036 + source: 'libnss3_2%3a3.120-1ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'libntfs-3g89t64' + version: '1:2022.10.3-5ubuntu1.1' + architecture: 'amd64' + sha256: '502462e2f9b33ebf6ad31788b7488b4a5f36ce1ee2670fa01f2113bf74d51382' + size_bytes: 161914 + source: 'libntfs-3g89t64_1%3a2022.10.3-5ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libnvme1t64' + version: '1.16.1-4' + architecture: 'amd64' + sha256: 'fd7692b19e904b1eae10a4457b1b5c5cc16ddb99334f7ce608acce138dd30ac3' + size_bytes: 91150 + source: 'libnvme1t64_1.16.1-4_amd64.deb' + pinned_in: [] + - package: 'liboeffis1' + version: '1.5.0-3' + architecture: 'amd64' + sha256: '8c64c961da0fb331554f02c416865d7ae6d1c9499959dc4b799b693183780e34' + size_bytes: 12760 + source: 'liboeffis1_1.5.0-3_amd64.deb' + pinned_in: [] + - package: 'libogg0' + version: '1.3.6-2' + architecture: 'amd64' + sha256: '9d62d5e64a55ecfc17a7aeb00a5ca5fdf095bd68c1c397146c81867bec35c31f' + size_bytes: 23394 + source: 'libogg0_1.3.6-2_amd64.deb' + pinned_in: [] + - package: 'libonig5' + version: '6.9.10-1build1' + architecture: 'amd64' + sha256: '050ad79c8c02956d896407ff66fddcb24e114b307cde196a0226697cf643ef88' + size_bytes: 174350 + source: 'libonig5_6.9.10-1build1_amd64.deb' + pinned_in: [] + - package: 'libopengl0' + version: '1.7.0-3' + architecture: 'amd64' + sha256: 'ccdcf477a19c1f51c20aa7569e953dbb5bc9456b57e2d3e325f8fda2650106ca' + size_bytes: 32780 + source: 'libopengl0_1.7.0-3_amd64.deb' + pinned_in: [] + - package: 'libopenipmi0t64' + version: '2.0.37-1build1' + architecture: 'amd64' + sha256: '8a4faa81c8f62cfab210048f915aa6fd765102740337efbce142493b0c01d1b5' + size_bytes: 509422 + source: 'libopenipmi0t64_2.0.37-1build1_amd64.deb' + pinned_in: [] + - package: 'libopenjp2-7' + version: '2.5.4-1ubuntu0.1' + architecture: 'amd64' + sha256: 'e004284779778e47573997b8994109120b5d5101e6b6c7dfa9b30b346c819845' + size_bytes: 186936 + source: 'libopenjp2-7_2.5.4-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libopus0' + version: '1.6.1-1' + architecture: 'amd64' + sha256: '395f9e1bf29b804e42471e225976d69355c220bbfe469cb4ed387d36184b9bcc' + size_bytes: 3563890 + source: 'libopus0_1.6.1-1_amd64.deb' + pinned_in: [] + - package: 'liborc-0.4-0t64' + version: '1:0.4.42-2' + architecture: 'amd64' + sha256: '247e3b2100d94e897398e45548beba164b90917130333d6c540a0e3403e82906' + size_bytes: 283098 + source: 'liborc-0.4-0t64_1%3a0.4.42-2_amd64.deb' + pinned_in: [] + - package: 'libpackagekit-glib2-18' + version: '1.3.4-3ubuntu1.2' + architecture: 'amd64' + sha256: '94ca729f07c6e4e931989756419ea47cd20949f81e6fee4038a27396bc6f65f3' + size_bytes: 120678 + source: 'libpackagekit-glib2-18_1.3.4-3ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'libpam-cap' + version: '1:2.75-10ubuntu2' + architecture: 'amd64' + sha256: '2d87164ef02681074dcb868ce2c8e51b9fa440e8a3f8e3b430033c566c54cad6' + size_bytes: 12714 + source: 'libpam-cap_1%3a2.75-10ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libpam-fprintd' + version: '1.94.5-4' + architecture: 'amd64' + sha256: 'eaa6a621b73815eb2b696c1860822507fc844ac01f5a53f140cbc6c9afa33403' + size_bytes: 13356 + source: 'libpam-fprintd_1.94.5-4_amd64.deb' + pinned_in: [] + - package: 'libpam-gnome-keyring' + version: '50.0-1' + architecture: 'amd64' + sha256: '84928e07f6696e1c77bf998a826178fcd26aaaa9687b43d9d0d30efd70403ff4' + size_bytes: 15446 + source: 'libpam-gnome-keyring_50.0-1_amd64.deb' + pinned_in: [] + - package: 'libpam-pwquality' + version: '1.4.5-5build1' + architecture: 'amd64' + sha256: 'abde1ead4ad22168ff44e26160408913960cec7219a7b5fefe9b9da2af6a22ee' + size_bytes: 11820 + source: 'libpam-pwquality_1.4.5-5build1_amd64.deb' + pinned_in: [] + - package: 'libpam-sss' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '8069c859aa907cf46df4d12bbea11cae1a49402b9bb79cdcd1b5737e0c253fe5' + size_bytes: 49856 + source: 'libpam-sss_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libpam-systemd' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: 'f27ddf40b22f231732899e3d3fcd3a622b88666c02cd5e32690a92794ba92d38' + size_bytes: 273636 + source: 'libpam-systemd_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'libpanel-1-1' + version: '1.10.3-1' + architecture: 'amd64' + sha256: 'c6bc7140d574db96e1ae2bb06749eca200c54ad624b33e855a1f85836b95e4f1' + size_bytes: 124136 + source: 'libpanel-1-1_1.10.3-1_amd64.deb' + pinned_in: [] + - package: 'libpanel-common' + version: '1.10.3-1' + architecture: 'all' + sha256: 'b69928e5c424656a0431dd51d26062f86aa6d5389ebe8a9a004e6b27f75f130e' + size_bytes: 4928 + source: 'libpanel-common_1.10.3-1_all.deb' + pinned_in: [] + - package: 'libpango-1.0-0' + version: '1.57.0-1' + architecture: 'amd64' + sha256: '309f30a8ea77e0264a3c8b66811188f5b788fe87b33be3cafd97c8f221235591' + size_bytes: 240576 + source: 'libpango-1.0-0_1.57.0-1_amd64.deb' + pinned_in: [] + - package: 'libpangocairo-1.0-0' + version: '1.57.0-1' + architecture: 'amd64' + sha256: 'a989e666bb0d64636a10a1253c949f92a282782d79d1725e0e1acc17282909a5' + size_bytes: 29026 + source: 'libpangocairo-1.0-0_1.57.0-1_amd64.deb' + pinned_in: [] + - package: 'libpangoft2-1.0-0' + version: '1.57.0-1' + architecture: 'amd64' + sha256: 'c1e08ebf03feded26a42a0f07f94789e5995b402d704d2faafdc86fffda0b28b' + size_bytes: 53260 + source: 'libpangoft2-1.0-0_1.57.0-1_amd64.deb' + pinned_in: [] + - package: 'libpangoxft-1.0-0' + version: '1.57.0-1' + architecture: 'amd64' + sha256: '8d2b4be34ebc5aeeae0b92506a8a13941a47fe39e5ef4ea767981b50ac638a61' + size_bytes: 20562 + source: 'libpangoxft-1.0-0_1.57.0-1_amd64.deb' + pinned_in: [] + - package: 'libpaper-utils' + version: '2.2.5-0.3maysync1' + architecture: 'amd64' + sha256: '9e6da1c4574a50a3143d2cb698d7e672f645f67715fb8fedc537fed64e8af837' + size_bytes: 15574 + source: 'libpaper-utils_2.2.5-0.3maysync1_amd64.deb' + pinned_in: [] + - package: 'libpaper2' + version: '2.2.5-0.3maysync1' + architecture: 'amd64' + sha256: 'e667f3a89b8237f15f43bc837f1f6606fdf5164a7670338573a4dc16a04c0fb4' + size_bytes: 17218 + source: 'libpaper2_2.2.5-0.3maysync1_amd64.deb' + pinned_in: [] + - package: 'libparted2t64' + version: '3.6-6' + architecture: 'amd64' + sha256: '3414de187cab783d61d5026ba53006be299429235cb32480c8099d1004e71e85' + size_bytes: 151996 + source: 'libparted2t64_3.6-6_amd64.deb' + pinned_in: [] + - package: 'libpath-utils1t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: '513d941185c25e2e29fed5b5b2628d160e184995c031d46d7ddd242109a55bd4' + size_bytes: 8934 + source: 'libpath-utils1t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'libpcap0.8t64' + version: '1.10.6-1ubuntu1' + architecture: 'amd64' + sha256: '69a466a55042ba8fe1bf738c29b01dd54edaf260c44426edbf0a08677ec29b1d' + size_bytes: 160818 + source: 'libpcap0.8t64_1.10.6-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libpcaudio0' + version: '1.3-1build1' + architecture: 'amd64' + sha256: '8b34341737d4c3ff830620413f11d9e2add1d049a47e475d4f97169a1bb2a705' + size_bytes: 9154 + source: 'libpcaudio0_1.3-1build1_amd64.deb' + pinned_in: [] + - package: 'libpci3' + version: '1:3.14.0-1build2' + architecture: 'amd64' + sha256: 'a3aea5aeec6bc5d22c9d73c3c42f7c7dba5eae30e7b86f5a842e89f2ea93352c' + size_bytes: 38064 + source: 'libpci3_1%3a3.14.0-1build2_amd64.deb' + pinned_in: [] + - package: 'libpciaccess0' + version: '0.18.1-1ubuntu4.1' + architecture: 'amd64' + sha256: '8733699ae9d7102a84cd10a1f0f0769b684c6ca8842035db389bb6b8310f72dd' + size_bytes: 18980 + source: 'libpciaccess0_0.18.1-1ubuntu4.1_amd64.deb' + pinned_in: [] + - package: 'libpcre2-32-0' + version: '10.46-1build1' + architecture: 'amd64' + sha256: 'a385713732a7411d39ba5c057f8e5727d0cdf3bf8afa36cbe1104c66ae2acd5b' + size_bytes: 227024 + source: 'libpcre2-32-0_10.46-1build1_amd64.deb' + pinned_in: [] + - package: 'libpcsclite1' + version: '2.4.1-1' + architecture: 'amd64' + sha256: '9287a7219e33c52f2a647bdfbaf4b6156de843b191d69aa60d101baeb5160032' + size_bytes: 24558 + source: 'libpcsclite1_2.4.1-1_amd64.deb' + pinned_in: [] + - package: 'libperl5.40' + version: '5.40.1-7ubuntu0.3' + architecture: 'amd64' + sha256: 'cf480ce25c4dc859e48619df013f820f7259f02f93397cf9975de548fd356bce' + size_bytes: 4888904 + source: 'libperl5.40_5.40.1-7ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'libphonenumber8' + version: '8.13.51+ds-5' + architecture: 'amd64' + sha256: '38fca71dff6d653431d78444489b29f47471a989fac8c509417aca65da94a398' + size_bytes: 270364 + source: 'libphonenumber8_8.13.51+ds-5_amd64.deb' + pinned_in: [] + - package: 'libpipeline1' + version: '1.5.8-2' + architecture: 'amd64' + sha256: 'e1502fe2af97a4e832fe076bef1e60851ec48da841e3e580674293552630df35' + size_bytes: 31428 + source: 'libpipeline1_1.5.8-2_amd64.deb' + pinned_in: [] + - package: 'libpipewire-0.3-0t64' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'dd242fed45d140f6b619b3b4a3b9938db7fda94acbe54e4bd93294832c2b10a6' + size_bytes: 300886 + source: 'libpipewire-0.3-0t64_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libpipewire-0.3-common' + version: '1.6.2-1ubuntu1.1' + architecture: 'all' + sha256: '886d0def069dcfef7885205faa46f431b68937480092ebd51d991948731121b0' + size_bytes: 12074 + source: 'libpipewire-0.3-common_1.6.2-1ubuntu1.1_all.deb' + pinned_in: [] + - package: 'libpipewire-0.3-modules' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'bd560a213d2613eb924eab1b5bf0bf878ef40e96b19c551269d0f7c96e539cef' + size_bytes: 881816 + source: 'libpipewire-0.3-modules_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libpixman-1-0' + version: '0.46.4-1' + architecture: 'amd64' + sha256: '55a274db32d4824a1f1a48c42e959fe4293a4e4b545d400d89949cfabe160cc3' + size_bytes: 287322 + source: 'libpixman-1-0_0.46.4-1_amd64.deb' + pinned_in: [] + - package: 'libpkcs11-helper1t64' + version: '1.31.0-1' + architecture: 'amd64' + sha256: '93b7050b8103ee665465929bab0e19c7d9cb845a376ef5880e6e355bf025dd6b' + size_bytes: 51176 + source: 'libpkcs11-helper1t64_1.31.0-1_amd64.deb' + pinned_in: [] + - package: 'libplist-2.0-4' + version: '2.7.0+git20250820-1build1' + architecture: 'amd64' + sha256: '04eb26d40bbb9cee682e6f51a25a1b311351b4c30722b8174acd67d4144bce47' + size_bytes: 51138 + source: 'libplist-2.0-4_2.7.0+git20250820-1build1_amd64.deb' + pinned_in: [] + - package: 'libplymouth5' + version: '24.004.60+git20250831.4a3c171d-0ubuntu8' + architecture: 'amd64' + sha256: '11d0fd3a398f5bbc024503dee70fe160a1fc2bdcd4d8732e99dbbed847406fe2' + size_bytes: 137016 + source: 'libplymouth5_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb' + pinned_in: [] + - package: 'libpng16-16t64' + version: '1.6.57-1' + architecture: 'amd64' + sha256: 'e3af297b2131aea35eab7e2751b4158ec7ae4ffb6d746043199f766fc727744f' + size_bytes: 194194 + source: 'libpng16-16t64_1.6.57-1_amd64.deb' + pinned_in: [] + - package: 'libpolkit-agent-1-0' + version: '127-2ubuntu1.1' + architecture: 'amd64' + sha256: 'd8f87b9a1f0dc475d94bff1aa743df1ee172b161657e461e7d1c3382fe50d3ff' + size_bytes: 18064 + source: 'libpolkit-agent-1-0_127-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libpolkit-gobject-1-0' + version: '127-2ubuntu1.1' + architecture: 'amd64' + sha256: '4bf5528ff1273d4ce6b1f523a3aa0ce05af485a37d78daccb75cc29f1a2cfd0d' + size_bytes: 45786 + source: 'libpolkit-gobject-1-0_127-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libpoppler-cpp3' + version: '26.01.0-2ubuntu0.1' + architecture: 'amd64' + sha256: '94b4727e767f4434f394bc8c48bec48eed44ff6e8c6e52aaef085d637b135ace' + size_bytes: 42194 + source: 'libpoppler-cpp3_26.01.0-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libpoppler-glib8t64' + version: '26.01.0-2ubuntu0.1' + architecture: 'amd64' + sha256: '07d4b1cea48c34e5480b029151d200a64ec1a21d41275eb54aa19b64372d8afa' + size_bytes: 167834 + source: 'libpoppler-glib8t64_26.01.0-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libpoppler156' + version: '26.01.0-2ubuntu0.1' + architecture: 'amd64' + sha256: '8f9b381982deed672786b89d97473ad33e0a8d4f3dc44c6c8f6653b69030ca94' + size_bytes: 1238410 + source: 'libpoppler156_26.01.0-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libpopt0' + version: '1.19+dfsg-2build1' + architecture: 'amd64' + sha256: 'ae57295d9a5d1551b866824c766a279f675172a05dd8d759fcdd52da3c3ac28f' + size_bytes: 29376 + source: 'libpopt0_1.19+dfsg-2build1_amd64.deb' + pinned_in: [] + - package: 'libportal-gtk4-1' + version: '0.9.1-2build1' + architecture: 'amd64' + sha256: 'c2ab5f601d83093d996485b0c2adceb71fb6d04ea2a142b514bc5d27ba8ab70e' + size_bytes: 12614 + source: 'libportal-gtk4-1_0.9.1-2build1_amd64.deb' + pinned_in: [] + - package: 'libportal1' + version: '0.9.1-2build1' + architecture: 'amd64' + sha256: '5fa20cfdb5bad67edd498b237c9f8a40f73387611768e5a56a1c99b152b743df' + size_bytes: 58488 + source: 'libportal1_0.9.1-2build1_amd64.deb' + pinned_in: [] + - package: 'libppd2' + version: '2:2.1.1-0ubuntu2' + architecture: 'amd64' + sha256: '0d8a70f3366515f2d7812440c7e5b1b3af232604cd2a3e981ebea51df0537aed' + size_bytes: 253560 + source: 'libppd2_2%3a2.1.1-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libppd2-common' + version: '2:2.1.1-0ubuntu2' + architecture: 'all' + sha256: 'f9b615c53f02d0ff78373a6456fc40db0679d0db6572e254b1d96cdddbaa8330' + size_bytes: 9346 + source: 'libppd2-common_2%3a2.1.1-0ubuntu2_all.deb' + pinned_in: [] + - package: 'libppsdocument-4.0-6' + version: '50.2-0ubuntu0.1' + architecture: 'amd64' + sha256: 'fda85bb65a3b944a8769c9357e9d2300982b03873fc44bd6e6c18d5c60b09acb' + size_bytes: 161264 + source: 'libppsdocument-4.0-6_50.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libppsview-4.0-5' + version: '50.2-0ubuntu0.1' + architecture: 'amd64' + sha256: 'e3899ca62698b84560ec26a4df5f85058063abf9c9c8442043bc7ceeb57be2c1' + size_bytes: 179320 + source: 'libppsview-4.0-5_50.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libprotobuf32t64' + version: '3.21.12-15ubuntu1' + architecture: 'amd64' + sha256: 'adab0eb28161aea2101e33d8b4c8a336ad62c34c70e01bd3d7c1026279ca5757' + size_bytes: 955360 + source: 'libprotobuf32t64_3.21.12-15ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libproxy1v5' + version: '0.5.12-1' + architecture: 'amd64' + sha256: '2ad0a703309adfdf14477543fae4f5b7dc7e32f8f7cd17d87c40be9161997239' + size_bytes: 28344 + source: 'libproxy1v5_0.5.12-1_amd64.deb' + pinned_in: [] + - package: 'libpulse-mainloop-glib0' + version: '1:17.0+dfsg1-2ubuntu4' + architecture: 'amd64' + sha256: '0c67401bf812a8584fef22ee87a1906f219c3a05d18d48300e39e528eaad9075' + size_bytes: 12560 + source: 'libpulse-mainloop-glib0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libpulse0' + version: '1:17.0+dfsg1-2ubuntu4' + architecture: 'amd64' + sha256: 'd2998fcca587cb21447302a551bfaa6caa7052e7f00a1b041adf4237dd65e4a3' + size_bytes: 293408 + source: 'libpulse0_1%3a17.0+dfsg1-2ubuntu4_amd64.deb' + pinned_in: [] + - package: 'libpwquality-common' + version: '1.4.5-5build1' + architecture: 'all' + sha256: '6b52c3f3ea6d6a77b305bf34eb242a28cb5fa50f7d452438967bd308fd04c884' + size_bytes: 7846 + source: 'libpwquality-common_1.4.5-5build1_all.deb' + pinned_in: [] + - package: 'libpwquality1' + version: '1.4.5-5build1' + architecture: 'amd64' + sha256: 'd62dda61e4d0e134a85d2af2d15b5f863b2a1c8a8ab43069f16da1c5a7aeb388' + size_bytes: 14010 + source: 'libpwquality1_1.4.5-5build1_amd64.deb' + pinned_in: [] + - package: 'libpython3-stdlib' + version: '3.14.3-0ubuntu2' + architecture: 'amd64' + sha256: '75d0c4c28732f8e08d5da25a47676dbe923e4b15a8f7a77110ab370325889df5' + size_bytes: 8476 + source: 'libpython3-stdlib_3.14.3-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libpython3.14' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: '76c12c7936d7a2e898f972b8b40ec74f3b58f1a534e67e256e1aa9d28c6c43d8' + size_bytes: 2579290 + source: 'libpython3.14_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libpython3.14-minimal' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: 'fac6f0728cf9490a7a698e6b343e4140283e92355b060193c04f5770a666df8a' + size_bytes: 916446 + source: 'libpython3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libpython3.14-stdlib' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: '3c267ef0f902f763c3615cbf28dd6fe91d2e4f603075d7f03db99f8d4eb66f46' + size_bytes: 2415042 + source: 'libpython3.14-stdlib_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libqmi-glib5' + version: '1.38.0-1' + architecture: 'amd64' + sha256: 'ae6396d1c1b16b093b34df537fa1892079e9ce4f7c0b7fa6af7825dcd07e9873' + size_bytes: 980024 + source: 'libqmi-glib5_1.38.0-1_amd64.deb' + pinned_in: [] + - package: 'libqmi-proxy' + version: '1.38.0-1' + architecture: 'amd64' + sha256: '04aec1083022f2745030e67ecb995593b9550848fcf3701228b369705e4aaf3b' + size_bytes: 6140 + source: 'libqmi-proxy_1.38.0-1_amd64.deb' + pinned_in: [] + - package: 'libqmi-utils' + version: '1.38.0-1' + architecture: 'amd64' + sha256: '266e8d1a46acd6e1ec32d8c496e0eb2330450d73050c294179f4434bb21bef64' + size_bytes: 211508 + source: 'libqmi-utils_1.38.0-1_amd64.deb' + pinned_in: [] + - package: 'libqpdf30' + version: '12.3.2-1' + architecture: 'amd64' + sha256: '354aba90fac426ae0a46e7386b933068c7ae55853227fdbc79d4374c2bd881f2' + size_bytes: 889280 + source: 'libqpdf30_12.3.2-1_amd64.deb' + pinned_in: [] + - package: 'libqrtr-glib0' + version: '1.2.2-2ubuntu1' + architecture: 'amd64' + sha256: '8ce9e67b2e9018c521faa0a872cf6b83e2254f3459246473804fb5e3567c60ad' + size_bytes: 18300 + source: 'libqrtr-glib0_1.2.2-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libraqm0' + version: '0.10.4-1' + architecture: 'amd64' + sha256: '85aefc091871221e4aa08d86615dd0e5140380928452418bd1e4e5226fee4628' + size_bytes: 15458 + source: 'libraqm0_0.10.4-1_amd64.deb' + pinned_in: [] + - package: 'libraw1394-11' + version: '2.1.2-2build4' + architecture: 'amd64' + sha256: '86628e0427e4df2f4b31dd6d6afe61a550cc6eb0d078f372b322e55e79fb7221' + size_bytes: 26092 + source: 'libraw1394-11_2.1.2-2build4_amd64.deb' + pinned_in: [] + - package: 'libreadline8t64' + version: '8.3-4' + architecture: 'amd64' + sha256: '260b3333e9f714252593b83fb31d2571097b64d337d0d7100aae7349029821fc' + size_bytes: 164290 + source: 'libreadline8t64_8.3-4_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'libref-array1t64' + version: '0.6.2-3build1' + architecture: 'amd64' + sha256: 'bcd9df6590849ac65fe32d2eec97aa216c7cd938fa2555623a0c37a0d074867a' + size_bytes: 7588 + source: 'libref-array1t64_0.6.2-3build1_amd64.deb' + pinned_in: [] + - package: 'librest-1.0-0' + version: '0.10.2-1' + architecture: 'amd64' + sha256: 'c803774236c7392fa73e9ed1349acd7d658d40234f39f44fa7f6c254404bea0a' + size_bytes: 36904 + source: 'librest-1.0-0_0.10.2-1_amd64.deb' + pinned_in: [] + - package: 'libroc0.4' + version: '0.4.0+dfsg-5ubuntu3.1' + architecture: 'amd64' + sha256: 'eef5591226e19f82e709aedcdb89180ce94989f26f73810b64421a599a7162dd' + size_bytes: 284986 + source: 'libroc0.4_0.4.0+dfsg-5ubuntu3.1_amd64.deb' + pinned_in: [] + - package: 'librsvg2-2' + version: '2.61.3+dfsg-3' + architecture: 'amd64' + sha256: 'af1d01163b01f45a027054c3e0bcdadf01d5d318b8b9ffdcaa13c01ec4e2f2e7' + size_bytes: 1864840 + source: 'librsvg2-2_2.61.3+dfsg-3_amd64.deb' + pinned_in: [] + - package: 'librsvg2-common' + version: '2.61.3+dfsg-3' + architecture: 'amd64' + sha256: '0742e9d6a8f39f925a4f760512f1227bae3d7396208205b576a9bac9ca1c4b6e' + size_bytes: 153060 + source: 'librsvg2-common_2.61.3+dfsg-3_amd64.deb' + pinned_in: [] + - package: 'librygel-core-2.8-0' + version: '45.0-1ubuntu1' + architecture: 'amd64' + sha256: '8c4890469434dcfb7e0c435a038fcbbb574e8b8613521e6a13a4bb0ad61ab231' + size_bytes: 112324 + source: 'librygel-core-2.8-0_45.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'librygel-db-2.8-0' + version: '45.0-1ubuntu1' + architecture: 'amd64' + sha256: 'e238a271444ae97f0088f96cb0a5ce15b6609e08be0f589feede53b96a887c1b' + size_bytes: 23682 + source: 'librygel-db-2.8-0_45.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'librygel-renderer-2.8-0' + version: '45.0-1ubuntu1' + architecture: 'amd64' + sha256: '9991ea25f1ef529fa28f93ffa5996b6aa7f8cc868e8acc5d58aae1676b4775a7' + size_bytes: 51486 + source: 'librygel-renderer-2.8-0_45.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'librygel-server-2.8-0' + version: '45.0-1ubuntu1' + architecture: 'amd64' + sha256: '67a370401dff770aaeceeed3208a22019754d0a17e17c6172a9dc102c712c0ab' + size_bytes: 210506 + source: 'librygel-server-2.8-0_45.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libsamplerate0' + version: '0.2.2-4build2' + architecture: 'amd64' + sha256: 'c554aed04aa0c47928039dc158e26c2b6da44b4570d400574110dcdaedd03360' + size_bytes: 1342514 + source: 'libsamplerate0_0.2.2-4build2_amd64.deb' + pinned_in: [] + - package: 'libsane-common' + version: '1.4.0-1ubuntu1' + architecture: 'all' + sha256: 'bab39d46a52af80fa9a4b711de0f9b031d50124929ecdba7a34f623f5e1e513d' + size_bytes: 918898 + source: 'libsane-common_1.4.0-1ubuntu1_all.deb' + pinned_in: [] + - package: 'libsane-hpaio' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'amd64' + sha256: '84e81795305c8457af92f8e3d4e4bb74d9c357d78d780e91388e9a3ef1c43247' + size_bytes: 135394 + source: 'libsane-hpaio_3.24.4+dfsg0-0ubuntu8.1_amd64.deb' + pinned_in: [] + - package: 'libsane1' + version: '1.4.0-1ubuntu1' + architecture: 'amd64' + sha256: 'ce047e7455510f5b7e31df0e7dc3950799aa6e1a1d112806424795780691314f' + size_bytes: 2904028 + source: 'libsane1_1.4.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libsasl2-modules' + version: '2.1.28+dfsg1-9ubuntu3' + architecture: 'amd64' + sha256: '01adc1798ccd25f9e87cf7cfb218103a75d53d21847b6a301cef1e9513ac8ce1' + size_bytes: 71286 + source: 'libsasl2-modules_2.1.28+dfsg1-9ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libsasl2-modules-gssapi-mit' + version: '2.1.28+dfsg1-9ubuntu3' + architecture: 'amd64' + sha256: '47df65c89d1aebbc2faadfdb1bd0ce0183a1390d5bdb087ec95164757b73b827' + size_bytes: 30662 + source: 'libsasl2-modules-gssapi-mit_2.1.28+dfsg1-9ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libsbc1' + version: '2.1-1build1' + architecture: 'amd64' + sha256: '7d3bc03489593a24345025509c4e2aed73a12d229df6e5d0f9667214aeca37ea' + size_bytes: 36328 + source: 'libsbc1_2.1-1build1_amd64.deb' + pinned_in: [] + - package: 'libsecret-1-0' + version: '0.21.7-2build1' + architecture: 'amd64' + sha256: '5cf26cf395af46280fda3fca0b36abe5122588afb36b839a69cbca21b89ed362' + size_bytes: 118550 + source: 'libsecret-1-0_0.21.7-2build1_amd64.deb' + pinned_in: [] + - package: 'libsecret-common' + version: '0.21.7-2build1' + architecture: 'all' + sha256: 'ac8c3a7214a6f85147c6fb1c516baf64abf26cf1fc90623671a848ed377d4932' + size_bytes: 5608 + source: 'libsecret-common_0.21.7-2build1_all.deb' + pinned_in: [] + - package: 'libsensors-config' + version: '1:3.6.2-2build1' + architecture: 'all' + sha256: '57193f731de79bbad343a1369e6e95b13096c08ba166c7e193bfc24d78f960fb' + size_bytes: 6862 + source: 'libsensors-config_1%3a3.6.2-2build1_all.deb' + pinned_in: [] + - package: 'libsensors5' + version: '1:3.6.2-2build1' + architecture: 'amd64' + sha256: '9249cd2be68acd7b589030df72a457b89fadea6c426002b00648ad2d153d9748' + size_bytes: 28936 + source: 'libsensors5_1%3a3.6.2-2build1_amd64.deb' + pinned_in: [] + - package: 'libsframe3' + version: '2.46-3ubuntu2' + architecture: 'amd64' + sha256: '05541ea1edb19e54bea297a21a9c33d0b99ca2cfe2e86d4a67335e6640667cfc' + size_bytes: 20576 + source: 'libsframe3_2.46-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'libsharpyuv0' + version: '1.5.0-0.1build1' + architecture: 'amd64' + sha256: '4e2c0a8aa97dafd923f00d77ca017d14f16ab79d3b1120892c8215a0b5fb7892' + size_bytes: 17650 + source: 'libsharpyuv0_1.5.0-0.1build1_amd64.deb' + pinned_in: [] + - package: 'libshout3' + version: '2.4.6-1build3' + architecture: 'amd64' + sha256: 'fe638ec034df5294f3f47d60a308d0d9454e91a9fb0d9f7b718908604da489be' + size_bytes: 50936 + source: 'libshout3_2.4.6-1build3_amd64.deb' + pinned_in: [] + - package: 'libsimdutf31' + version: '8.0.0-1' + architecture: 'amd64' + sha256: 'fd01a52b2feaaf93839f1ba07bf11131fd377d2aaaef95c3a439a5bd333b459f' + size_bytes: 146898 + source: 'libsimdutf31_8.0.0-1_amd64.deb' + pinned_in: [] + - package: 'libslang2' + version: '2.3.3-5build1' + architecture: 'amd64' + sha256: 'edfe8c7fd65e36959efcb4a116141d3c1287f9717eea1eee429d3a3d460d1d93' + size_bytes: 503528 + source: 'libslang2_2.3.3-5build1_amd64.deb' + pinned_in: [] + - package: 'libsm6' + version: '2:1.2.6-1build1' + architecture: 'amd64' + sha256: '8f0d18029ed6918c8a422c8108d5efe6bc3a0e264dc65844b47132aad426536c' + size_bytes: 16866 + source: 'libsm6_2%3a1.2.6-1build1_amd64.deb' + pinned_in: [] + - package: 'libsmbclient0' + version: '2:4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: 'd607a125cf912b23f5a432ee28a8e358bda17f6eb4b1561b72930b1262aeff80' + size_bytes: 63740 + source: 'libsmbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libsnapd-glib-2-1' + version: '1.72-0ubuntu3' + architecture: 'amd64' + sha256: '6d61a082f9ee7c1c547c60b833b9015aa96eda6291578e854ef83362d4621488' + size_bytes: 119720 + source: 'libsnapd-glib-2-1_1.72-0ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libsnappy1v5' + version: '1.2.2-2' + architecture: 'amd64' + sha256: '1679c696614780a0137e2b484ade47fc226177556e261bace9a779ae98b29346' + size_bytes: 30830 + source: 'libsnappy1v5_1.2.2-2_amd64.deb' + pinned_in: [] + - package: 'libsndfile1' + version: '1.2.2-4' + architecture: 'amd64' + sha256: '678c7e95dea924d1ebe6c59879009dc3e7b61491bc32bd63bea200487d60a454' + size_bytes: 218520 + source: 'libsndfile1_1.2.2-4_amd64.deb' + pinned_in: [] + - package: 'libsnmp-base' + version: '5.9.4+dfsg-2ubuntu3' + architecture: 'all' + sha256: '4e07606d47746eec43c2afbe17b33fba33a93b8dd04866848cc3f0336e4e39ce' + size_bytes: 206668 + source: 'libsnmp-base_5.9.4+dfsg-2ubuntu3_all.deb' + pinned_in: [] + - package: 'libsnmp40t64' + version: '5.9.4+dfsg-2ubuntu3' + architecture: 'amd64' + sha256: 'd00833347422359b85315aba3cfbb356db99310624f40bfb422d980182d9d2cc' + size_bytes: 1083894 + source: 'libsnmp40t64_5.9.4+dfsg-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libsonic0' + version: '0.2.0-13build2' + architecture: 'amd64' + sha256: '29b13ed4a03146b042e9b36d2db981f8522e40363e1bbd692a4c0a351eb3d33f' + size_bytes: 11516 + source: 'libsonic0_0.2.0-13build2_amd64.deb' + pinned_in: [] + - package: 'libsoup-3.0-0' + version: '3.6.6-1' + architecture: 'amd64' + sha256: '1e64ec18ac23c235174cd8a5a67b7b087af4172c40e8466216122982feff25a2' + size_bytes: 297092 + source: 'libsoup-3.0-0_3.6.6-1_amd64.deb' + pinned_in: [] + - package: 'libsoup-3.0-common' + version: '3.6.6-1' + architecture: 'all' + sha256: 'ed47b65b4691273b9330b8371defd9dd5ea6980556f2923ef83e8f78ad8dc02b' + size_bytes: 13578 + source: 'libsoup-3.0-common_3.6.6-1_all.deb' + pinned_in: [] + - package: 'libsource-highlight-common' + version: '3.1.9-4.3build2' + architecture: 'all' + sha256: '9208a5cb2e873ae7bcc458f13d51aaec29a04c563df926cad9145af8a4234bf4' + size_bytes: 64234 + source: 'libsource-highlight-common_3.1.9-4.3build2_all.deb' + pinned_in: [] + - package: 'libsource-highlight4t64' + version: '3.1.9-4.3build2' + architecture: 'amd64' + sha256: 'ac2cae4028ef60f003bd62f719a0c9d2451c3ff3f72da6e9fef8808de7636b8a' + size_bytes: 273064 + source: 'libsource-highlight4t64_3.1.9-4.3build2_amd64.deb' + pinned_in: [] + - package: 'libspa-0.2-bluetooth' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: '44e437438cad1e41fceed61036687d43c653765149a87db34e67aa2c5304aefc' + size_bytes: 471888 + source: 'libspa-0.2-bluetooth_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libspa-0.2-modules' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'bd423aecf6f1ea8c3873bfc3c5141b97f275f80eb60ba7270a97c4e613f87b82' + size_bytes: 1152092 + source: 'libspa-0.2-modules_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'libspeechd-module0' + version: '0.12.1-2ubuntu1' + architecture: 'amd64' + sha256: '91b4a260c7dc00cae4619bfd1fc60acc03467a6c220d686680629ed5b0999254' + size_bytes: 15936 + source: 'libspeechd-module0_0.12.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libspeechd2' + version: '0.12.1-2ubuntu1' + architecture: 'amd64' + sha256: 'bcc710c6e635615d7a1b9ad910109b3c2400c9e5faebfd72f73c76aa048f7f7c' + size_bytes: 24104 + source: 'libspeechd2_0.12.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libspeex1' + version: '1.2.1-3build1' + architecture: 'amd64' + sha256: 'a680f573914fde02780f169e03d754cfc905b04fa4ef24663eb8d27f10033804' + size_bytes: 63298 + source: 'libspeex1_1.2.1-3build1_amd64.deb' + pinned_in: [] + - package: 'libspeexdsp1' + version: '1.2.1-3build1' + architecture: 'amd64' + sha256: 'f7f312d0b692658e5aaa9c6c4860baa9edbf8855fbc37d20e9b7f2ad17358943' + size_bytes: 45478 + source: 'libspeexdsp1_1.2.1-3build1_amd64.deb' + pinned_in: [] + - package: 'libspelling-1-2' + version: '0.4.9-1build1' + architecture: 'amd64' + sha256: '1389974b075075c0c4abb5f3eb4d70e49a633516c512c8f1d437e6c4f5ffb3b5' + size_bytes: 58142 + source: 'libspelling-1-2_0.4.9-1build1_amd64.deb' + pinned_in: [] + - package: 'libspelling-common' + version: '0.4.9-1build1' + architecture: 'all' + sha256: 'a904fc5d2a4b6219a721441e02f710ad078f8671ee50d560ec6d16cdda8b078d' + size_bytes: 2800 + source: 'libspelling-common_0.4.9-1build1_all.deb' + pinned_in: [] + - package: 'libsqlite3-0' + version: '3.46.1-9ubuntu0.2' + architecture: 'amd64' + sha256: '8671ee6299becd379a13ffb7a50cf4ee48f2a02ef1ea0d6dd1de829a704aa11b' + size_bytes: 719420 + source: 'libsqlite3-0_3.46.1-9ubuntu0.2_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'libsss-certmap0' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '15338a9d22388df8f3c6fa81f0c134500cb647995a78ececa26e53c5c496998c' + size_bytes: 45686 + source: 'libsss-certmap0_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libsss-idmap0' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'b9361e8fb9dee71a0a12fb991a4217ae1d5fc470134a076023829eae8e924311' + size_bytes: 21416 + source: 'libsss-idmap0_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libsss-nss-idmap0' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'a3ddcac8865688571223c74f78c4a35ea3bcc8380d83e5f1191e33cb5cda3d07' + size_bytes: 28988 + source: 'libsss-nss-idmap0_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'libstartup-notification0' + version: '0.12-8build1' + architecture: 'amd64' + sha256: 'f2bce732be30ef78e242fa05677e0034da70cb854709635f17f0a509719c8ff4' + size_bytes: 19144 + source: 'libstartup-notification0_0.12-8build1_amd64.deb' + pinned_in: [] + - package: 'libstemmer0d' + version: '3.0.1-1' + architecture: 'amd64' + sha256: 'ff03ff070cebf6e5949dc48df012e707b43cc381e4c6da5ece52282af6476eb6' + size_bytes: 171642 + source: 'libstemmer0d_3.0.1-1_amd64.deb' + pinned_in: [] + - package: 'libsysprof-6-6' + version: '50.0-1' + architecture: 'amd64' + sha256: '2121d9d2a027bd70203ee0584ff046eb7bf17c537a77c91eecf0517d1e3f63f6' + size_bytes: 190520 + source: 'libsysprof-6-6_50.0-1_amd64.deb' + pinned_in: [] + - package: 'libsysprof-6-modules' + version: '50.0-1' + architecture: 'amd64' + sha256: 'b1f0e4fa0ec2c561008a254ec8447cc563d9d2cf9aa26818b6c6ff195172d4d8' + size_bytes: 22028 + source: 'libsysprof-6-modules_50.0-1_amd64.deb' + pinned_in: [] + - package: 'libsystemd-shared' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '9b30b1e96cc8b48f94a2df5c1cbee7690e16f727d71b40c458a64aabe15db35f' + size_bytes: 2462336 + source: 'libsystemd-shared_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'libtag2' + version: '2.2.1-3' + architecture: 'amd64' + sha256: '9b74ea1de651e630956a6f2004de1e52855b1b76730e4ae2a125cfbb81bb9506' + size_bytes: 422258 + source: 'libtag2_2.2.1-3_amd64.deb' + pinned_in: [] + - package: 'libtalloc2' + version: '2:2.4.3+samba4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: 'f2d5bb6a77cbe17efbd9e077caf41757dc5b602b5c15fc243077beb87c20e184' + size_bytes: 50956 + source: 'libtalloc2_2%3a2.4.3+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libtcl8.6' + version: '8.6.17+dfsg-1build1' + architecture: 'amd64' + sha256: '7e062e6b4c8e4c4c5122679c193c4567c1bf4dab3555a64ea2449a256cfd8043' + size_bytes: 1003440 + source: 'libtcl8.6_8.6.17+dfsg-1build1_amd64.deb' + pinned_in: [] + - package: 'libtdb1' + version: '2:1.4.14+samba4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: '12a81cae04403ab6abf1239876c1ccf6142067ecb923e8af5854829898965101' + size_bytes: 70458 + source: 'libtdb1_2%3a1.4.14+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libteamdctl0' + version: '1.31-1build4' + architecture: 'amd64' + sha256: '0e4cdcba8844bc2cc9787f86ed8bc8df27e5fddcd0400688097f98f3780c8da1' + size_bytes: 12458 + source: 'libteamdctl0_1.31-1build4_amd64.deb' + pinned_in: [] + - package: 'libtevent0t64' + version: '2:0.17.1+samba4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: 'c44b855af26408fec0aa149bc7d00acd7595621215ba278885173f7eee033f44' + size_bytes: 41968 + source: 'libtevent0t64_2%3a0.17.1+samba4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libtext-charwidth-perl' + version: '0.04-11build4' + architecture: 'amd64' + sha256: '55089bcbe8f6213d500900769f5161e35fb9e4147cf472b469a37e1d1e96a022' + size_bytes: 9530 + source: 'libtext-charwidth-perl_0.04-11build4_amd64.deb' + pinned_in: [] + - package: 'libtext-iconv-perl' + version: '1.7-8.1' + architecture: 'amd64' + sha256: '9543434d570888be8d079a7277f935e963336d84a672cff6a3899957f7c59cf3' + size_bytes: 13644 + source: 'libtext-iconv-perl_1.7-8.1_amd64.deb' + pinned_in: [] + - package: 'libtext-wrapi18n-perl' + version: '0.06-10' + architecture: 'all' + sha256: '936619071dd5d81ff672b685af9ad20e1f524be2241cbd80556aedc376844a36' + size_bytes: 7694 + source: 'libtext-wrapi18n-perl_0.06-10_all.deb' + pinned_in: [] + - package: 'libthai-data' + version: '0.1.30-1' + architecture: 'all' + sha256: '345fa75fcec8b562e2c6a4a5cd61187e7b825c8379fadb7f3f60d64d73ab1b72' + size_bytes: 154800 + source: 'libthai-data_0.1.30-1_all.deb' + pinned_in: [] + - package: 'libthai0' + version: '0.1.30-1' + architecture: 'amd64' + sha256: 'c06f206be1ef7aa8208110b38945205ebc742dd777cbb39142baa555fe61390a' + size_bytes: 19174 + source: 'libthai0_0.1.30-1_amd64.deb' + pinned_in: [] + - package: 'libtheora1' + version: '1.2.0+dfsg-6' + architecture: 'amd64' + sha256: 'd4c3f4f488e53bf85fa5798ef07fda19519c5f54702c17c6528c4893ae5cbd99' + size_bytes: 139776 + source: 'libtheora1_1.2.0+dfsg-6_amd64.deb' + pinned_in: [] + - package: 'libtheoradec2' + version: '1.2.0+dfsg-6' + architecture: 'amd64' + sha256: 'ba95870a379eb408156f76922ddebceef0a9293ce92abb9112a86ada0751eb84' + size_bytes: 55638 + source: 'libtheoradec2_1.2.0+dfsg-6_amd64.deb' + pinned_in: [] + - package: 'libtheoraenc2' + version: '1.2.0+dfsg-6' + architecture: 'amd64' + sha256: 'fee798e4313614856255942dafa86975f0f68538974e0edc600a844e1f151166' + size_bytes: 106272 + source: 'libtheoraenc2_1.2.0+dfsg-6_amd64.deb' + pinned_in: [] + - package: 'libtie-ixhash-perl' + version: '1.23-4' + architecture: 'all' + sha256: '8ca609994bc5000622e212f23e7e7d39f1b0e2f23cd770ea25f4039d0c7524f8' + size_bytes: 11300 + source: 'libtie-ixhash-perl_1.23-4_all.deb' + pinned_in: [] + - package: 'libtiff6' + version: '4.7.0-3ubuntu5' + architecture: 'amd64' + sha256: 'f48cb837a644826b9411ecd9692cbd57fbcb57b5b8fba026652d9204b3acb169' + size_bytes: 205792 + source: 'libtiff6_4.7.0-3ubuntu5_amd64.deb' + pinned_in: [] + - package: 'libtime-duration-perl' + version: '1.21-2' + architecture: 'all' + sha256: '0a26c970c323e7a95465674e4393bfaa18883777274672df61444dd7c5cdf7a5' + size_bytes: 12322 + source: 'libtime-duration-perl_1.21-2_all.deb' + pinned_in: [] + - package: 'libtimedate-perl' + version: '2.3300-2' + architecture: 'all' + sha256: '71c8cf8da8e3f273070268f093cf7b418371be2c8a70566875d0fe6b5d119f89' + size_bytes: 33972 + source: 'libtimedate-perl_2.3300-2_all.deb' + pinned_in: [] + - package: 'libtinysparql-3.0-0' + version: '3.11.0-1' + architecture: 'amd64' + sha256: '0ce9b37325ceed91344c775dcf3b70db0e7140ab18b6567cb44e411b67f05a6f' + size_bytes: 323170 + source: 'libtinysparql-3.0-0_3.11.0-1_amd64.deb' + pinned_in: [] + - package: 'libtirpc-common' + version: '1.3.7-0.1' + architecture: 'all' + sha256: 'debc1757cd9b13ec7837e6e76bd9aaf8ae0f622de0e45043e4f5c6e255375814' + size_bytes: 7114 + source: 'libtirpc-common_1.3.7-0.1_all.deb' + pinned_in: [] + - package: 'libtirpc3t64' + version: '1.3.7-0.1' + architecture: 'amd64' + sha256: 'a6c68bbbcbaf2941aee004e581289958c690d17b867be510940a82df2a5572c1' + size_bytes: 80910 + source: 'libtirpc3t64_1.3.7-0.1_amd64.deb' + pinned_in: [] + - package: 'libtk8.6' + version: '8.6.17-1build1' + architecture: 'amd64' + sha256: '9956a0f9252ce0bc3be1a97fa06b53e2697d25c24f7dcff25fc17e7b52c3db6f' + size_bytes: 793390 + source: 'libtk8.6_8.6.17-1build1_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'libtotem-plparser-common' + version: '3.26.6-3' + architecture: 'all' + sha256: '13fa95414ef977fdffe5d75accfb5999e383cb018a1d8aa3edf4258068c57d25' + size_bytes: 3844 + source: 'libtotem-plparser-common_3.26.6-3_all.deb' + pinned_in: [] + - package: 'libtotem-plparser18' + version: '3.26.6-3' + architecture: 'amd64' + sha256: '332a5a8a9d4b744d2a6af78acace096685aaa586ed8001d368bda514b9579476' + size_bytes: 61860 + source: 'libtotem-plparser18_3.26.6-3_amd64.deb' + pinned_in: [] + - package: 'libtry-tiny-perl' + version: '0.32-1' + architecture: 'all' + sha256: '2f506f17ea63a5f1f2eb8aa26bfac15e6ba37862287a045ac4b27ff8b0e9a9e3' + size_bytes: 21238 + source: 'libtry-tiny-perl_0.32-1_all.deb' + pinned_in: [] + - package: 'libtss2-esys-3.0.2-0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '945ce965bc35dd229fec38c8c35638326d61b74995a22459f59d50bcc4b6bbb3' + size_bytes: 150304 + source: 'libtss2-esys-3.0.2-0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-mu-4.0.1-0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '598bb51f250ee8a9c05a1c6610a938671d292d5cbe7f8265fde79d9d285a711d' + size_bytes: 59190 + source: 'libtss2-mu-4.0.1-0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-rc0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '8bfb7d88fa9c83f37fe77a06d9745fc0176c28df079486ccacd2b8b6a927a652' + size_bytes: 12370 + source: 'libtss2-rc0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-sys1t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '7e519ca206bee638184c94251bffb150354216a234a6ee67855da39325bc0256' + size_bytes: 34538 + source: 'libtss2-sys1t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-cmd0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: 'aa01ff47dc2bcf694f07081b4813c14e3e5deba4558c3dc51b3917931d989726' + size_bytes: 12726 + source: 'libtss2-tcti-cmd0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-device0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '4e3f119e57f1e794edd70bf4e1aa840a6263ab936a209b150c2b352ee48b7db8' + size_bytes: 13954 + source: 'libtss2-tcti-device0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-libtpms0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: 'b597ee0e8f387f82eeb7e09f62eb3353d689a5674f00f4580e2f73227dc4cb4a' + size_bytes: 13040 + source: 'libtss2-tcti-libtpms0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-mssim0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: 'a98ab8f06b6484304b57549bb7898c73c0f7996250f55d3abc4b707ab87bd4d8' + size_bytes: 14006 + source: 'libtss2-tcti-mssim0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-spi-helper0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '8c04fd74d8890ef23cae424222497e6d75e46a25a119eea44c3a2dd6f71a72bc' + size_bytes: 13026 + source: 'libtss2-tcti-spi-helper0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tcti-swtpm0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: 'd914df0c4b3f5259b27f579338aab9420230eefce8c340a5ffb44edcf9566eab' + size_bytes: 14108 + source: 'libtss2-tcti-swtpm0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtss2-tctildr0t64' + version: '4.1.3-6' + architecture: 'amd64' + sha256: '292c9bfcda2f6563a11f47d9e6530c467e8eea256dfd59a5d6626b2823d4d73a' + size_bytes: 13420 + source: 'libtss2-tctildr0t64_4.1.3-6_amd64.deb' + pinned_in: [] + - package: 'libtwolame0' + version: '0.4.0-2build4' + architecture: 'amd64' + sha256: 'f83717d357ca0d038ff333615d9aba6d19a888b93630e8142815f81e16cb0f22' + size_bytes: 52614 + source: 'libtwolame0_0.4.0-2build4_amd64.deb' + pinned_in: [] + - package: 'libuchardet0' + version: '0.0.8-2' + architecture: 'amd64' + sha256: '7ba592f208d28eecffb33494b636fb75fbe7917dc193f4190ad2a6d1c56450a4' + size_bytes: 75794 + source: 'libuchardet0_0.0.8-2_amd64.deb' + pinned_in: [] + - package: 'libudisks2-0' + version: '2.10.91-1ubuntu2.1' + architecture: 'amd64' + sha256: '52d797d03908af230f9bf19d91a173c747fee6c49835d59d1be5cf3805edbe02' + size_bytes: 175772 + source: 'libudisks2-0_2.10.91-1ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'libunity-protocol-private0' + version: '7.1.4+19.04.20190319-6.1ubuntu1' + architecture: 'amd64' + sha256: 'a1855fbce17fff96e1fed915385102091925e7b92827afd766fb3f7b8ec850b1' + size_bytes: 88290 + source: 'libunity-protocol-private0_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libunity-scopes-json-def-desktop' + version: '7.1.4+19.04.20190319-6.1ubuntu1' + architecture: 'all' + sha256: '898868492d7a5dca58e114ccce2f30ae78235a4f3798cbd83a2264f3672b15e5' + size_bytes: 3586 + source: 'libunity-scopes-json-def-desktop_7.1.4+19.04.20190319-6.1ubuntu1_all.deb' + pinned_in: [] + - package: 'libunity9' + version: '7.1.4+19.04.20190319-6.1ubuntu1' + architecture: 'amd64' + sha256: '2fea821dfdf3e620bda6fcee6641480336afa9af98276aa202df18894c36831e' + size_bytes: 217732 + source: 'libunity9_7.1.4+19.04.20190319-6.1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libunwind8' + version: '1.8.3-0ubuntu1' + architecture: 'amd64' + sha256: '7a9978fadf0940f45500ced0fba219cb5954f322a31068b7b32ad04f3ddc5c3f' + size_bytes: 59630 + source: 'libunwind8_1.8.3-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libupower-glib3' + version: '1.91.1-1' + architecture: 'amd64' + sha256: '6f2d824e70aab09105a9bd8bde3d77cdfe9d391779fadeaca3043d339ed00b80' + size_bytes: 43872 + source: 'libupower-glib3_1.91.1-1_amd64.deb' + pinned_in: [] + - package: 'liburcu8t64' + version: '0.15.6-1' + architecture: 'amd64' + sha256: 'de2e04225d0f1324ab5ee880e61427a5fa23de0a3563610386f5fc3eca653a02' + size_bytes: 64652 + source: 'liburcu8t64_0.15.6-1_amd64.deb' + pinned_in: [] + - package: 'liburi-perl' + version: '5.34-2build1' + architecture: 'all' + sha256: '0e8f2fbd6ab3444d23e1fff6a348d8872b8328548ad95c113d8011728c6809e6' + size_bytes: 100454 + source: 'liburi-perl_5.34-2build1_all.deb' + pinned_in: [] + - package: 'liburing2' + version: '2.14-1' + architecture: 'amd64' + sha256: 'c0f1ed55d2eaa6e5d1224513b787c71348c6ab983e9c4178a417a7ffac3a8a00' + size_bytes: 25404 + source: 'liburing2_2.14-1_amd64.deb' + pinned_in: [] + - package: 'libusb-1.0-0' + version: '2:1.0.29-2build1' + architecture: 'amd64' + sha256: '0f3f167c22d00994276b6425a306d1c0b6047e2ea2eb850afbdaf00968330484' + size_bytes: 56906 + source: 'libusb-1.0-0_2%3a1.0.29-2build1_amd64.deb' + pinned_in: [] + - package: 'libusbmuxd-2.0-7' + version: '2.1.1-1' + architecture: 'amd64' + sha256: 'f4cd323620e90c825069f0866d038347deded8d8d0c469ab42c75ba34e231f67' + size_bytes: 17898 + source: 'libusbmuxd-2.0-7_2.1.1-1_amd64.deb' + pinned_in: [] + - package: 'libuv1t64' + version: '1.51.0-2ubuntu1' + architecture: 'amd64' + sha256: '5c9b857d7d6a0c22b30dae45d518b375452cf7c663fc9381e3f0760ba3fb8cce' + size_bytes: 103390 + source: 'libuv1t64_1.51.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libv4l-0t64' + version: '1.32.0-2ubuntu1' + architecture: 'amd64' + sha256: '23b41e9e45ca64525f64f23e50d325123382225b68db18dd3a6b74be50a43cd4' + size_bytes: 158926 + source: 'libv4l-0t64_1.32.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libv4lconvert0t64' + version: '1.32.0-2ubuntu1' + architecture: 'amd64' + sha256: 'aa9fbbedeb94f9def39a05f9d953d0c9a72b0dc8b59c944b53844ec25f23f2f5' + size_bytes: 90078 + source: 'libv4lconvert0t64_1.32.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libva-drm2' + version: '2.23.0-1ubuntu1' + architecture: 'amd64' + sha256: 'f56b0cb850dcd8af45929b2da7cc1fbdf64245fbcec99033298499a8db2765a3' + size_bytes: 7112 + source: 'libva-drm2_2.23.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libva-x11-2' + version: '2.23.0-1ubuntu1' + architecture: 'amd64' + sha256: '247f651d07a0e3e237c6d48f2b7f3f9de9609b69a4c047c471f50147dd13286f' + size_bytes: 12176 + source: 'libva-x11-2_2.23.0-1ubuntu1_amd64.deb' + pinned_in: ['remote-access.txt'] + - package: 'libva2' + version: '2.23.0-1ubuntu1' + architecture: 'amd64' + sha256: '83053abb11b8b0169bfb2abbd209a44ddeb4e56223980cdcfc0218b09e845f00' + size_bytes: 76506 + source: 'libva2_2.23.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libvisual-0.4-0' + version: '0.4.2-4' + architecture: 'amd64' + sha256: 'd2afc14cba71cd7ca7571b835146171c5fbd92b36acc863da9ebf96419ef8e7f' + size_bytes: 116984 + source: 'libvisual-0.4-0_0.4.2-4_amd64.deb' + pinned_in: [] + - package: 'libvolume-key1' + version: '0.3.12-10build2' + architecture: 'amd64' + sha256: 'cfd320ae710e0b4ee98d296feaafc4963aed789186a92e529204793bfd9c473e' + size_bytes: 40610 + source: 'libvolume-key1_0.3.12-10build2_amd64.deb' + pinned_in: [] + - package: 'libvorbis0a' + version: '1.3.7-3build2' + architecture: 'amd64' + sha256: 'e8577fd985c3a2bc61212be338207cc2a95e7d6892acaeccb3d455da13e4a480' + size_bytes: 100972 + source: 'libvorbis0a_1.3.7-3build2_amd64.deb' + pinned_in: [] + - package: 'libvorbisenc2' + version: '1.3.7-3build2' + architecture: 'amd64' + sha256: 'b4230d0064eee971727b204e3d0644a4deb4a3d882eaac2304d379e7a5439f2a' + size_bytes: 79598 + source: 'libvorbisenc2_1.3.7-3build2_amd64.deb' + pinned_in: [] + - package: 'libvorbisfile3' + version: '1.3.7-3build2' + architecture: 'amd64' + sha256: '8cd42cc285e34f915e0e769bcffab29c4267fb6453295ed309d50f8f376eef37' + size_bytes: 17248 + source: 'libvorbisfile3_1.3.7-3build2_amd64.deb' + pinned_in: [] + - package: 'libvpx12' + version: '1.16.0-3' + architecture: 'amd64' + sha256: 'e1b852dfaa099fbcc60ab08d4e340553a7701c501544089609838c9417ba5fa0' + size_bytes: 1243784 + source: 'libvpx12_1.16.0-3_amd64.deb' + pinned_in: [] + - package: 'libvte-2.91-0' + version: '0.84.0-2' + architecture: 'amd64' + sha256: '612230c9fcec7a14996d4eb70ebbe2293845315b46c7b14165694a990223b910' + size_bytes: 381146 + source: 'libvte-2.91-0_0.84.0-2_amd64.deb' + pinned_in: [] + - package: 'libvte-2.91-common' + version: '0.84.0-2' + architecture: 'amd64' + sha256: '7f4b1ca229e01c6cd29d7ca1ccd0fb01b9d2e86bebd3e495db464f07a326e651' + size_bytes: 16934 + source: 'libvte-2.91-common_0.84.0-2_amd64.deb' + pinned_in: [] + - package: 'libvte-2.91-gtk4-0' + version: '0.84.0-2' + architecture: 'amd64' + sha256: '9b038781acf8a27c7489bf62eaaa851e02607b5694c1806132404bb98731b393' + size_bytes: 383226 + source: 'libvte-2.91-gtk4-0_0.84.0-2_amd64.deb' + pinned_in: [] + - package: 'libvulkan1' + version: '1.4.341.0-1' + architecture: 'amd64' + sha256: 'b4aca7a519d6318347f15a0e485c636603005e2553dae1a986272ac8c96176b0' + size_bytes: 157194 + source: 'libvulkan1_1.4.341.0-1_amd64.deb' + pinned_in: [] + - package: 'libwacom-common' + version: '2.18.0-1' + architecture: 'all' + sha256: '40498c518af6224bd21a931c8d393a93c318d52c2ee475432d6fa529c70c30ad' + size_bytes: 117250 + source: 'libwacom-common_2.18.0-1_all.deb' + pinned_in: [] + - package: 'libwacom9' + version: '2.18.0-1' + architecture: 'amd64' + sha256: 'a2555343e9c9a533e2ca5185895a043d8068912c5d95095d7e3a9f8a078dd919' + size_bytes: 28352 + source: 'libwacom9_2.18.0-1_amd64.deb' + pinned_in: [] + - package: 'libwavpack1' + version: '5.9.0-1' + architecture: 'amd64' + sha256: '67ae8eb2aba5cd2a2c32cc47bdaabec7b809458e11c55cfd6a64fe28d0b17ca2' + size_bytes: 92332 + source: 'libwavpack1_5.9.0-1_amd64.deb' + pinned_in: [] + - package: 'libwayland-client0' + version: '1.24.0-2' + architecture: 'amd64' + sha256: '094db0e190b53872e4d5310cd5fa09ca28ee3936386cd09e5f7d13e645aa12ab' + size_bytes: 28530 + source: 'libwayland-client0_1.24.0-2_amd64.deb' + pinned_in: [] + - package: 'libwayland-cursor0' + version: '1.24.0-2' + architecture: 'amd64' + sha256: '941affa9ef61b0cca5cfac1fab13e8e78168af306709df4adf546c76be82a1de' + size_bytes: 10770 + source: 'libwayland-cursor0_1.24.0-2_amd64.deb' + pinned_in: [] + - package: 'libwayland-egl1' + version: '1.24.0-2' + architecture: 'amd64' + sha256: '692358c252186b132f6807548cffffe6f358d5b2139e8d57d0763b1f3ba28c61' + size_bytes: 6248 + source: 'libwayland-egl1_1.24.0-2_amd64.deb' + pinned_in: [] + - package: 'libwayland-server0' + version: '1.24.0-2' + architecture: 'amd64' + sha256: '9f0278d02d401c9fd0f2b4b06d37ea0b1e7cecbb6a8d2539427f810d80c409dc' + size_bytes: 35942 + source: 'libwayland-server0_1.24.0-2_amd64.deb' + pinned_in: [] + - package: 'libwbclient0' + version: '2:4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: '94f2f8e193ccd6b8901c36846391ac198d9ac77224fe66717f6e206f4720b02e' + size_bytes: 57916 + source: 'libwbclient0_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'libwebkit2gtk-4.1-0' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '0d30994ddaa395026ed6e91e99608841597ebb492555de8a1c8fd83259c10da1' + size_bytes: 25718128 + source: 'libwebkit2gtk-4.1-0_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libwebkitgtk-6.0-4' + version: '2.52.6-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'b3c40096f4dabf5b0fc4453e8cb8df340619ed45a34a601b53538693d60afd8c' + size_bytes: 25458198 + source: 'libwebkitgtk-6.0-4_2.52.6-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libwebp7' + version: '1.5.0-0.1build1' + architecture: 'amd64' + sha256: '0a846cf63522d9c1f28d31bdd53e35e223d590a0971bb6927b3ee5092934ce9d' + size_bytes: 263542 + source: 'libwebp7_1.5.0-0.1build1_amd64.deb' + pinned_in: [] + - package: 'libwebpdemux2' + version: '1.5.0-0.1build1' + architecture: 'amd64' + sha256: '05213cc9919e32e261479ec3a5fdf561da77f06d137046dd0d8b622ea3f0ea79' + size_bytes: 12804 + source: 'libwebpdemux2_1.5.0-0.1build1_amd64.deb' + pinned_in: [] + - package: 'libwebpmux3' + version: '1.5.0-0.1build1' + architecture: 'amd64' + sha256: 'e4da6abdb642623afd2e4a60ef354539f8b74ba0f2daaaeb0e058a392d4ae571' + size_bytes: 26446 + source: 'libwebpmux3_1.5.0-0.1build1_amd64.deb' + pinned_in: [] + - package: 'libwebrtc-audio-processing-1-3' + version: '1.3-3build2' + architecture: 'amd64' + sha256: '9aed48f9a96df74a82c65b996ad2bef712dc77cd57569aca0a604f51e26a8291' + size_bytes: 410554 + source: 'libwebrtc-audio-processing-1-3_1.3-3build2_amd64.deb' + pinned_in: [] + - package: 'libwhoopsie-preferences0' + version: '23build4' + architecture: 'amd64' + sha256: '620795acdfb8a496044260c8fd901209616e18da494eff38b5a57d9c531b73af' + size_bytes: 14734 + source: 'libwhoopsie-preferences0_23build4_amd64.deb' + pinned_in: [] + - package: 'libwhoopsie0' + version: '0.2.82ubuntu' + architecture: 'amd64' + sha256: '7b689ad54e2d3f9ba025c44b0c1e9d7afcb23df32267dd5cd3b0ae3ea3675a27' + size_bytes: 9872 + source: 'libwhoopsie0_0.2.82ubuntu_amd64.deb' + pinned_in: [] + - package: 'libwinpr3-3' + version: '3.31.0+dfsg-0ubuntu0.26.04.1' + architecture: 'amd64' + sha256: '9590bd12c632dd6ab2413d84dcb2417adc9aaf47aa67656861f3f19a9968a0f1' + size_bytes: 399088 + source: 'libwinpr3-3_3.31.0+dfsg-0ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libwireplumber-0.5-0' + version: '0.5.13-1ubuntu1' + architecture: 'amd64' + sha256: '5e5364a1e625e2e51cc2c92f7de813f2ee57b73c15eba63a68657dbd4d47861f' + size_bytes: 321566 + source: 'libwireplumber-0.5-0_0.5.13-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libwmf-0.2-7' + version: '0.2.14-1' + architecture: 'amd64' + sha256: 'ca38f81214be4605404f808062b2c780cabac1b7c830367ebb5a07578e825d58' + size_bytes: 92846 + source: 'libwmf-0.2-7_0.2.14-1_amd64.deb' + pinned_in: [] + - package: 'libwmf-0.2-7-gtk' + version: '0.2.14-1' + architecture: 'amd64' + sha256: 'b1978f52b4dbe623c3de42e3ba76fced22afe6ea823ea7cf40e63c2ff191cf23' + size_bytes: 17634 + source: 'libwmf-0.2-7-gtk_0.2.14-1_amd64.deb' + pinned_in: [] + - package: 'libwmflite-0.2-7' + version: '0.2.14-1' + architecture: 'amd64' + sha256: '16dfaa480ecec8c9b436d7b2957ea085f9871f3bf8accae93d593175e3d00267' + size_bytes: 67604 + source: 'libwmflite-0.2-7_0.2.14-1_amd64.deb' + pinned_in: [] + - package: 'libwnck-3-0' + version: '43.3-1build1' + architecture: 'amd64' + sha256: 'ed9662390c61fe7a2e2f7b6e1996a309d7c22a6f4b22342d115d037fad1e4436' + size_bytes: 114840 + source: 'libwnck-3-0_43.3-1build1_amd64.deb' + pinned_in: [] + - package: 'libwnck-3-common' + version: '43.3-1build1' + architecture: 'all' + sha256: '88466e17f3f455ebe8af70089c3a883407ef0819117c40227dbc3086d05cf7ef' + size_bytes: 20200 + source: 'libwnck-3-common_43.3-1build1_all.deb' + pinned_in: [] + - package: 'libwrap0' + version: '7.6.q-36build2' + architecture: 'amd64' + sha256: 'a3784ca083c626c3ae41cdd32d4c5898554650dc77d2b54dbb1197a38198adf8' + size_bytes: 48490 + source: 'libwrap0_7.6.q-36build2_amd64.deb' + pinned_in: [] + - package: 'libwww-perl' + version: '6.81-1ubuntu0.1' + architecture: 'all' + sha256: '0cfd279321a889cfc1ba48e2679623f8110947ea05e595c32c002f9086f3c09e' + size_bytes: 140310 + source: 'libwww-perl_6.81-1ubuntu0.1_all.deb' + pinned_in: [] + - package: 'libwww-robotrules-perl' + version: '6.02-1build1' + architecture: 'all' + sha256: '61862314f03e9c603f0b747999981a0ea6904b4d736bc46da7c6624ac2ac5f0f' + size_bytes: 12386 + source: 'libwww-robotrules-perl_6.02-1build1_all.deb' + pinned_in: [] + - package: 'libx11-6' + version: '2:1.8.13-1' + architecture: 'amd64' + sha256: '7e643e76063b94df9159c8b8fd4b8bf53d2fbf119c9889a5cc6842b6be272e4f' + size_bytes: 657070 + source: 'libx11-6_2%3a1.8.13-1_amd64.deb' + pinned_in: [] + - package: 'libx11-data' + version: '2:1.8.13-1' + architecture: 'all' + sha256: '8188c233d59dc419205c314ef8f230fc83ca7a3e7e9b9671f18b469fd3e428ae' + size_bytes: 114288 + source: 'libx11-data_2%3a1.8.13-1_all.deb' + pinned_in: [] + - package: 'libx11-protocol-perl' + version: '0.56-9' + architecture: 'all' + sha256: '3e1225b15f7921617a19e6e122353a3336bf32ca84654546b5b6b75b48d259eb' + size_bytes: 121944 + source: 'libx11-protocol-perl_0.56-9_all.deb' + pinned_in: [] + - package: 'libx11-xcb1' + version: '2:1.8.13-1' + architecture: 'amd64' + sha256: 'e20ab288f2f756800ae25e7a827ae70aee64272f692dd3cb8f706764b6767de9' + size_bytes: 7960 + source: 'libx11-xcb1_2%3a1.8.13-1_amd64.deb' + pinned_in: [] + - package: 'libxau6' + version: '1:1.0.11-1build2' + architecture: 'amd64' + sha256: '6c0b2dd4654db30449754e6e1adf84a34d8a8d7dddeb75f8c9c463ad86645274' + size_bytes: 7502 + source: 'libxau6_1%3a1.0.11-1build2_amd64.deb' + pinned_in: [] + - package: 'libxaw7' + version: '2:1.0.16-1build1' + architecture: 'amd64' + sha256: '8771b09a2ed641887411b9c5e10621440972340710fa4a8e015f062e5a7f5930' + size_bytes: 190216 + source: 'libxaw7_2%3a1.0.16-1build1_amd64.deb' + pinned_in: [] + - package: 'libxcb-damage0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '24933e0f99b64847e8e915bc3acb42fc55f12db6aa219d3bec3e02b8004c39cb' + size_bytes: 5034 + source: 'libxcb-damage0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-dri2-0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: 'bbc1f3f83d2ffe8f4596b7e745febf82aa90ca0e1916579cad2cce27041335ca' + size_bytes: 7334 + source: 'libxcb-dri2-0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-dri3-0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '2e0e3916c647a74e081621f385aa296dab3052b2582b0781d9fbea2f15696ef4' + size_bytes: 7540 + source: 'libxcb-dri3-0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-glx0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '857c34618ae56b2577d8d439cf86f80375582626193efaa3229c6767106a1a20' + size_bytes: 24654 + source: 'libxcb-glx0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-present0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '64f23e7166461758d158220305e93a98fe75c570b68f96303a1c2395a58d5d7d' + size_bytes: 6112 + source: 'libxcb-present0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-randr0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '78977a067ec1d59bb4ded1b35835d0ba70e6538aac1ea7edefe413795aaa0d4f' + size_bytes: 17930 + source: 'libxcb-randr0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-render0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '2bdd10dd88c99523a62bfcc2b71b59fdf93ee396e8baf617c76fc3ec38f39bde' + size_bytes: 16208 + source: 'libxcb-render0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-res0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '7c1d617a2b260fba96570eb9d0223ee25cb788bf82cb6731b6a709540473f2ad' + size_bytes: 6780 + source: 'libxcb-res0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-shape0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '64f09e1434f232c4297b634e857772ab6c11cb3fae116ad6d557d563c8f3b385' + size_bytes: 6172 + source: 'libxcb-shape0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-shm0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: 'e70d52936aabd7a90e9cd8af0f54ca050cde244f8382ffc5524ba65117c199c4' + size_bytes: 5808 + source: 'libxcb-shm0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-sync1' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '8883f5e6badab24cb7487390bf1a888bb714e406f6c799345c33e4b69a8f3112' + size_bytes: 9348 + source: 'libxcb-sync1_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb-util1' + version: '0.4.1-1build1' + architecture: 'amd64' + sha256: 'cf20c1093b223f82dc970cf38c3907ba0f4b70607820ff1c13d64ef51c0d1656' + size_bytes: 11070 + source: 'libxcb-util1_0.4.1-1build1_amd64.deb' + pinned_in: [] + - package: 'libxcb-xfixes0' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '00c1381b61e2e5b8a78e89b15818a214a8f44f1fae6a9ddd95e7c61de8ea33d2' + size_bytes: 10192 + source: 'libxcb-xfixes0_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcb1' + version: '1.17.0-2ubuntu1' + architecture: 'amd64' + sha256: '069e64705e4a5721a223b4d22643bbaeaa63a6efbb56ebd3d7c4a31c4a26fa1c' + size_bytes: 49022 + source: 'libxcb1_1.17.0-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxcomposite1' + version: '1:0.4.6-1build1' + architecture: 'amd64' + sha256: 'b8557d5aba1e575acfb169f47e798c449c8a5ca05846861f1480724d4cfc5ce3' + size_bytes: 6664 + source: 'libxcomposite1_1%3a0.4.6-1build1_amd64.deb' + pinned_in: [] + - package: 'libxcursor1' + version: '1:1.2.3-1build1' + architecture: 'amd64' + sha256: '0f3d9816a3a557590ca1b31f2548b1988ad7ec9de976bad07cc24cc7d69b4ee7' + size_bytes: 22108 + source: 'libxcursor1_1%3a1.2.3-1build1_amd64.deb' + pinned_in: [] + - package: 'libxcvt0' + version: '0.1.3-1build1' + architecture: 'amd64' + sha256: '3660c17f9a96c3fe1edd81b2795a17d273b3da39444f2d39f715ebd85cabe6ff' + size_bytes: 5852 + source: 'libxcvt0_0.1.3-1build1_amd64.deb' + pinned_in: [] + - package: 'libxdamage1' + version: '1:1.1.7-1' + architecture: 'amd64' + sha256: 'dd751597c6216105774a93769972d1cb6dad5fd1ba91f090197d7acc85c406cb' + size_bytes: 6582 + source: 'libxdamage1_1%3a1.1.7-1_amd64.deb' + pinned_in: [] + - package: 'libxdmcp6' + version: '1:1.1.5-2' + architecture: 'amd64' + sha256: 'd5d51e67063ff11e81698d8ee90bab5af763dc0a793929f33712bb74e7633768' + size_bytes: 10800 + source: 'libxdmcp6_1%3a1.1.5-2_amd64.deb' + pinned_in: [] + - package: 'libxdo3' + version: '1:3.20160805.1-5.1build1' + architecture: 'amd64' + sha256: 'b4edfb3fcb5a3b6bd2b407dbb6f7071c975db611e86774d8a3026a28133e96e5' + size_bytes: 22542 + source: 'libxdo3_1%3a3.20160805.1-5.1build1_amd64.deb' + pinned_in: ['remote-access.txt'] + - package: 'libxext6' + version: '2:1.3.4-1build3' + architecture: 'amd64' + sha256: 'b867ba9daa9437ba3f18cba9646d9e3db55e5197bd4feb53184b1414c05210ca' + size_bytes: 30840 + source: 'libxext6_2%3a1.3.4-1build3_amd64.deb' + pinned_in: [] + - package: 'libxfixes3' + version: '1:6.0.0-2build2' + architecture: 'amd64' + sha256: 'f3a71f6aa12000480c419e44f3aa5bdca7eb862b720d0307661b4e886db1c5f8' + size_bytes: 11102 + source: 'libxfixes3_1%3a6.0.0-2build2_amd64.deb' + pinned_in: [] + - package: 'libxfont2' + version: '1:2.0.6-2ubuntu0.2' + architecture: 'amd64' + sha256: 'eeca46a661876466a8f96469054427f0b18a10a758c4c69d2c5f20b290f6f056' + size_bytes: 96496 + source: 'libxfont2_1%3a2.0.6-2ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'libxft2' + version: '2.3.6-1build2' + architecture: 'amd64' + sha256: 'a6ad7fd2294e8e04d553919b5beed0269ebc6f73d41261ed1059c7fde83227f0' + size_bytes: 45110 + source: 'libxft2_2.3.6-1build2_amd64.deb' + pinned_in: [] + - package: 'libxi6' + version: '2:1.8.2-2' + architecture: 'amd64' + sha256: 'b975dd89cac8c32a3cf622e1b7f5434db59f37eda87dfee399d0806d9953db0a' + size_bytes: 33120 + source: 'libxi6_2%3a1.8.2-2_amd64.deb' + pinned_in: [] + - package: 'libxinerama1' + version: '2:1.1.4-3build2' + architecture: 'amd64' + sha256: '02d3dce422acc3ac9b5491f47acdd07bc7c3f78ce193865f2920d38b10fbadf5' + size_bytes: 6472 + source: 'libxinerama1_2%3a1.1.4-3build2_amd64.deb' + pinned_in: [] + - package: 'libxkbcommon0' + version: '1.13.1-1' + architecture: 'amd64' + sha256: '7988d2375d10277ab4a54641aa6181accfaf3f5d25e48b050bf42a9583d4f926' + size_bytes: 159038 + source: 'libxkbcommon0_1.13.1-1_amd64.deb' + pinned_in: [] + - package: 'libxkbfile1' + version: '1:1.1.0-1build5' + architecture: 'amd64' + sha256: '40bf42bc549b5d1f848e2ce8c1bafc9777e0fd4b943bbff922dd340f7ab3f5d7' + size_bytes: 70116 + source: 'libxkbfile1_1%3a1.1.0-1build5_amd64.deb' + pinned_in: [] + - package: 'libxkbregistry0' + version: '1.13.1-1' + architecture: 'amd64' + sha256: '21dc9f060ecfa872f9761016dd5e759f5a26cad8cd0689dad4bb3a0575107642' + size_bytes: 16622 + source: 'libxkbregistry0_1.13.1-1_amd64.deb' + pinned_in: [] + - package: 'libxml-parser-perl' + version: '2.47-1ubuntu1' + architecture: 'amd64' + sha256: 'd3f6ebe9aa48553d1b797fe1c32ef484d211406e0d83c55131ed7ed21597171d' + size_bytes: 201324 + source: 'libxml-parser-perl_2.47-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'libxml-twig-perl' + version: '1:3.54-1build1' + architecture: 'all' + sha256: '0686775e315eadeaf03f9f846c18d51c01a088e8de07c0d018474d00932c1f17' + size_bytes: 157162 + source: 'libxml-twig-perl_1%3a3.54-1build1_all.deb' + pinned_in: [] + - package: 'libxml-xpathengine-perl' + version: '0.14-2' + architecture: 'all' + sha256: '938c131969b95b7eb369f42956e8be4462bc179883e09d2806f3560e81f6de81' + size_bytes: 32570 + source: 'libxml-xpathengine-perl_0.14-2_all.deb' + pinned_in: [] + - package: 'libxml2-16' + version: '2.15.2+dfsg-0.1ubuntu0.1' + architecture: 'amd64' + sha256: '14211c45bb75f9543e6053207533370047873ade7e4c70f7285400f1df6c898f' + size_bytes: 606124 + source: 'libxml2-16_2.15.2+dfsg-0.1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'libxmlb2' + version: '0.3.24-2' + architecture: 'amd64' + sha256: '12aa2999751f0e0944b8369f6c1c17ee50182644545c9a2c5f22dc5188c91c11' + size_bytes: 68230 + source: 'libxmlb2_0.3.24-2_amd64.deb' + pinned_in: [] + - package: 'libxmu6' + version: '2:1.1.3-4' + architecture: 'amd64' + sha256: '15e9c3a2bd4132a2873b339b4af578dd19462f1eee705b025f656ea548aba19f' + size_bytes: 48862 + source: 'libxmu6_2%3a1.1.3-4_amd64.deb' + pinned_in: [] + - package: 'libxmuu1' + version: '2:1.1.3-4' + architecture: 'amd64' + sha256: '30dfe0950ff901ed359eb96d6f81f082bb4b5c15aae6c03b92ddf309300871fb' + size_bytes: 9450 + source: 'libxmuu1_2%3a1.1.3-4_amd64.deb' + pinned_in: [] + - package: 'libxpm4' + version: '1:3.5.17-1ubuntu0.26.04.1' + architecture: 'amd64' + sha256: 'ef412a3ef4323e49c837fb442e53e575f8cffba077b38db16e89e28db238b42b' + size_bytes: 37216 + source: 'libxpm4_1%3a3.5.17-1ubuntu0.26.04.1_amd64.deb' + pinned_in: [] + - package: 'libxrandr2' + version: '2:1.5.4-1build1' + architecture: 'amd64' + sha256: 'd0052315ac1417234777c0872568a86fce4d3a3316c041e5a2200da70f43a855' + size_bytes: 19622 + source: 'libxrandr2_2%3a1.5.4-1build1_amd64.deb' + pinned_in: [] + - package: 'libxrender1' + version: '1:0.9.12-1build1' + architecture: 'amd64' + sha256: '60b2f01e8124318e2a11049b82c764fd4c05c21adba11312e93ab116d6594f1e' + size_bytes: 19204 + source: 'libxrender1_1%3a0.9.12-1build1_amd64.deb' + pinned_in: [] + - package: 'libxres1' + version: '2:1.2.1-1build2' + architecture: 'amd64' + sha256: 'c7794a754880ef7bde4a73c0257dd48d8e3f387ee1618ba97f8e5cf5cdd7c80f' + size_bytes: 7036 + source: 'libxres1_2%3a1.2.1-1build2_amd64.deb' + pinned_in: [] + - package: 'libxshmfence1' + version: '1.3.3-1build1' + architecture: 'amd64' + sha256: '85d6b6883a35e1a3b78af3dda6bb6b843c06cbead030a00d9de7d31a8077d562' + size_bytes: 5284 + source: 'libxshmfence1_1.3.3-1build1_amd64.deb' + pinned_in: [] + - package: 'libxslt1.1' + version: '1.1.45-0.1' + architecture: 'amd64' + sha256: 'd2ad5edf215939cc0fe74ca6cb9910060915233032a7c7074d4f206702c802a1' + size_bytes: 165368 + source: 'libxslt1.1_1.1.45-0.1_amd64.deb' + pinned_in: [] + - package: 'libxss1' + version: '1:1.2.3-1build4' + architecture: 'amd64' + sha256: '04339441bb49c8b9c6d3297bb569b3b774de61e422f5e7334c34225b08709035' + size_bytes: 7084 + source: 'libxss1_1%3a1.2.3-1build4_amd64.deb' + pinned_in: [] + - package: 'libxt6t64' + version: '1:1.2.1-1.3build1' + architecture: 'amd64' + sha256: 'b4255d5aea7986fa06ae3a3599f9e5c38a58ded1c3b79cfaf3c2959ad160eeff' + size_bytes: 172702 + source: 'libxt6t64_1%3a1.2.1-1.3build1_amd64.deb' + pinned_in: [] + - package: 'libxtables12' + version: '1.8.11-2ubuntu3' + architecture: 'amd64' + sha256: 'e21126e0544e3b795633fb5b06bb7f2b9a493ebc5ab07b007db0f7f68c0a0aed' + size_bytes: 36650 + source: 'libxtables12_1.8.11-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'libxtst6' + version: '2:1.2.5-1build1' + architecture: 'amd64' + sha256: 'c150c1bacec599cf70609ce1236fd06accacd96e280205090bdd57fd73ee0e4b' + size_bytes: 13130 + source: 'libxtst6_2%3a1.2.5-1build1_amd64.deb' + pinned_in: [] + - package: 'libxv1' + version: '2:1.0.13-1' + architecture: 'amd64' + sha256: '235a7eb12cb1dc5ac4151d8ed7527bbcce41f1ab367fd6282ded29560e6eb5c1' + size_bytes: 10826 + source: 'libxv1_2%3a1.0.13-1_amd64.deb' + pinned_in: [] + - package: 'libxvmc1' + version: '2:1.0.12-2build4' + architecture: 'amd64' + sha256: 'f55191a36c43f1e3d5881ddfaea1001e117c6366583865a48edb5755f67338d3' + size_bytes: 13352 + source: 'libxvmc1_2%3a1.0.12-2build4_amd64.deb' + pinned_in: [] + - package: 'libxxf86dga1' + version: '2:1.1.5-1build2' + architecture: 'amd64' + sha256: '479687bd0cae59b5e062a6c642cdee30f2d0ad6eb7c713e0f10dd785beb404a0' + size_bytes: 11864 + source: 'libxxf86dga1_2%3a1.1.5-1build2_amd64.deb' + pinned_in: [] + - package: 'libxxf86vm1' + version: '1:1.1.4-2' + architecture: 'amd64' + sha256: 'ff01ae50526c23c6c747e1efd98ee3785a1d28458e865277fc367c565bb94703' + size_bytes: 10610 + source: 'libxxf86vm1_1%3a1.1.4-2_amd64.deb' + pinned_in: [] + - package: 'libyaml-0-2' + version: '0.2.5-2build3' + architecture: 'amd64' + sha256: 'bdeecb9b4309731eef49eea87cf126e343d12d3823e32f0286e3e5f18f437994' + size_bytes: 52650 + source: 'libyaml-0-2_0.2.5-2build3_amd64.deb' + pinned_in: [] + - package: 'libyelp-1-0' + version: '49.0-5ubuntu0.1' + architecture: 'amd64' + sha256: '5530c69219bddc1935c21ac253e1289d249e1f595c8e44bd0e2c9cec48c3f0da' + size_bytes: 98088 + source: 'libyelp-1-0_49.0-5ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'linux-base' + version: '4.15ubuntu5' + architecture: 'all' + sha256: 'df05419ee01f989ea1495d1ee6ef11fa22f1ea742182def9159740037251fa86' + size_bytes: 30536 + source: 'linux-base_4.15ubuntu5_all.deb' + pinned_in: [] + - package: 'linux-sound-base' + version: '1.0.25+dfsg-0ubuntu9' + architecture: 'all' + sha256: 'bc90f0ae88150ae8e3185626a836caf3f81dfe4f9a77d290f7260d64e164a32b' + size_bytes: 12712 + source: 'linux-sound-base_1.0.25+dfsg-0ubuntu9_all.deb' + pinned_in: [] + - package: 'linux-sysctl-defaults' + version: '4.15ubuntu5' + architecture: 'all' + sha256: '6c414e68e23b82fd62df9ce4d75b427071219bf4e80ce85fcbab57eade4eed7d' + size_bytes: 6208 + source: 'linux-sysctl-defaults_4.15ubuntu5_all.deb' + pinned_in: [] + - package: 'locales' + version: '2.43-2ubuntu2.4' + architecture: 'all' + sha256: 'a1abf41b517f767018d5eab519d55b9269fe0a04ae49ea35f7c3ad1b8870ab32' + size_bytes: 4225234 + source: 'locales_2.43-2ubuntu2.4_all.deb' + pinned_in: [] + - package: 'localsearch' + version: '3.11.0-1ubuntu1.1' + architecture: 'amd64' + sha256: '0d1e647e655f9fa749515fa0aad656b2f700e3914c9e70eee6adb44be7b93da2' + size_bytes: 415752 + source: 'localsearch_3.11.0-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'loupe' + version: '50.0-0ubuntu2' + architecture: 'amd64' + sha256: '6af0e93b1a0ccf5b5bd09ce5acec03cf4e9c0577bf874195113ce17aa0b91052' + size_bytes: 2098584 + source: 'loupe_50.0-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'lsb-release' + version: '12.1-2build1' + architecture: 'all' + sha256: '992cd1c4d62332bc2000d87438a479578af71e719df6430079734791060583aa' + size_bytes: 6174 + source: 'lsb-release_12.1-2build1_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'lsof' + version: '4.99.4+dfsg-2build2' + architecture: 'amd64' + sha256: '4f61cd2ad30fc73f53d66d769395d343c268a526f7901e14ae69f530b468435b' + size_bytes: 238920 + source: 'lsof_4.99.4+dfsg-2build2_amd64.deb' + pinned_in: [] + - package: 'luit' + version: '2.0.20250912-1' + architecture: 'amd64' + sha256: '787954ae8ebb8ad1069278e52ec2a80d8a5701b55f4c89d397745b72debe435e' + size_bytes: 41556 + source: 'luit_2.0.20250912-1_amd64.deb' + pinned_in: [] + - package: 'makedumpfile' + version: '1:1.7.7-1' + architecture: 'amd64' + sha256: 'b3e66bc9414ce9b1cf4498704c453a70cd5a16679ec86ffc972a523c1e6a31a0' + size_bytes: 188546 + source: 'makedumpfile_1%3a1.7.7-1_amd64.deb' + pinned_in: [] + - package: 'man-db' + version: '2.13.1-1build1' + architecture: 'amd64' + sha256: '8f5f22abe63c90c76363f9ce182671bc2ced4a7259170f2c634cd96b4ad3acfe' + size_bytes: 1392108 + source: 'man-db_2.13.1-1build1_amd64.deb' + pinned_in: [] + - package: 'media-types' + version: '14.0.0build1' + architecture: 'all' + sha256: 'f3412d08032210541d25c4e00fa492ce527af245ac9bec2e543d81a59b4426aa' + size_bytes: 31434 + source: 'media-types_14.0.0build1_all.deb' + pinned_in: [] + - package: 'memtest86+' + version: '8.00-3' + architecture: 'amd64' + sha256: '8aaf23ceab202090967030280362c32f55b6e6af30cedfbb3c6ede41a4e81cbd' + size_bytes: 148812 + source: 'memtest86+_8.00-3_amd64.deb' + pinned_in: [] + - package: 'mesa-libgallium' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '7f123a545774034793ba3516c5fad0be88de68ad91319a4b220d98b32a289451' + size_bytes: 11241306 + source: 'mesa-libgallium_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'mesa-vulkan-drivers' + version: '26.0.8-1ubuntu0.3' + architecture: 'amd64' + sha256: '27db5fa34d50d208b58cc94317b573065329740bb98d0e12b7947b06a9d02a4e' + size_bytes: 19109714 + source: 'mesa-vulkan-drivers_26.0.8-1ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'mobile-broadband-provider-info' + version: '20251101-1build1' + architecture: 'all' + sha256: '5a4821ebe3f996104f2b00c94a7eb6511e88469ce1a2082af2fa6a1a34192310' + size_bytes: 65918 + source: 'mobile-broadband-provider-info_20251101-1build1_all.deb' + pinned_in: [] + - package: 'modemmanager' + version: '1.25.95-1ubuntu1' + architecture: 'amd64' + sha256: '230439882a79b3f1fd11ed715b658f86213e6355a4b5ed38ee91cbd1f71aface' + size_bytes: 1177868 + source: 'modemmanager_1.25.95-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'mokutil' + version: '0.7.2-2' + architecture: 'amd64' + sha256: '7d0a173bfc17241f983b8c25fd34dd3b41e1c314803bbdea2f4cace417da3480' + size_bytes: 28136 + source: 'mokutil_0.7.2-2_amd64.deb' + pinned_in: [] + - package: 'moreutils' + version: '0.69-1build1' + architecture: 'amd64' + sha256: '932639e63e49a9912cd27457688f2a971faddcde985a0a38970fa713c30fcc3f' + size_bytes: 56976 + source: 'moreutils_0.69-1build1_amd64.deb' + pinned_in: [] + - package: 'mscompress' + version: '0.4-10build2' + architecture: 'amd64' + sha256: '2c2207a2c67d93f161f6cc8bb1877687e7af35e67b8afa01173636f4872d84d6' + size_bytes: 9556 + source: 'mscompress_0.4-10build2_amd64.deb' + pinned_in: [] + - package: 'mutter-common' + version: '50.1-0ubuntu2.2' + architecture: 'all' + sha256: 'cf0f3cff9e965bb590852318a01290f4fdff90eefcf1d695254335faa8421dd4' + size_bytes: 38700 + source: 'mutter-common_50.1-0ubuntu2.2_all.deb' + pinned_in: [] + - package: 'mutter-common-bin' + version: '50.1-0ubuntu2.2' + architecture: 'amd64' + sha256: '6414537f37eaa13988488496542ed79b9f24d168e5b708b79cc1606ad1f904e8' + size_bytes: 54462 + source: 'mutter-common-bin_50.1-0ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'nautilus' + version: '1:50.2.2-0ubuntu0.1' + architecture: 'amd64' + sha256: '97961c5419e6cd105a053f16e2f4205653c4d951ac7ac7b4da68a767546af56d' + size_bytes: 570250 + source: 'nautilus_1%3a50.2.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'nautilus-data' + version: '1:50.2.2-0ubuntu0.1' + architecture: 'all' + sha256: '4084720b6a6e4b6881c17fe514ebc305b9484e0f17d44bb050a15f88a0490dd9' + size_bytes: 17002 + source: 'nautilus-data_1%3a50.2.2-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'nautilus-sendto' + version: '3.8.6-8ubuntu1' + architecture: 'amd64' + sha256: 'e959905e710d7c161a31f0091d998bc370ae903ee551424d15cb71c8dd4d8b1a' + size_bytes: 23738 + source: 'nautilus-sendto_3.8.6-8ubuntu1_amd64.deb' + pinned_in: [] + - package: 'ncurses-term' + version: '6.6+20251231-1' + architecture: 'all' + sha256: '23b67d85b6c8857fd40aded8554f59751460c8d35f0a0573562021480acbca62' + size_bytes: 279792 + source: 'ncurses-term_6.6+20251231-1_all.deb' + pinned_in: [] + - package: 'netbase' + version: '6.5build1' + architecture: 'all' + sha256: 'f008e39aada379d64166153d5e37ccc4f18b3e334babb9e32c4da9b4396ee733' + size_bytes: 13036 + source: 'netbase_6.5build1_all.deb' + pinned_in: [] + - package: 'netcat-openbsd' + version: '1.234-1' + architecture: 'amd64' + sha256: 'a17549cec3db5cbe8c1f05117aa599499edbdc95e980db0a38086faf2a330e56' + size_bytes: 44048 + source: 'netcat-openbsd_1.234-1_amd64.deb' + pinned_in: [] + - package: 'netplan-generator' + version: '1.2-1ubuntu5.1' + architecture: 'amd64' + sha256: 'c9ca94ed0ff4bbd7d83ae1d16e2b9118270431c38696ae80f7c7c5126688c161' + size_bytes: 65070 + source: 'netplan-generator_1.2-1ubuntu5.1_amd64.deb' + pinned_in: [] + - package: 'netplan.io' + version: '1.2-1ubuntu5.1' + architecture: 'amd64' + sha256: '3c6efa64031a2d79b504dd513e42883fb65ec117deaf3b810d19b5b291c2d454' + size_bytes: 69552 + source: 'netplan.io_1.2-1ubuntu5.1_amd64.deb' + pinned_in: [] + - package: 'network-manager' + version: '1.54.3-2ubuntu3' + architecture: 'amd64' + sha256: '3c085ad0c5ccca5558bfca5197b322f4e2c8f278edaf5f7d8962d4e20488c2fb' + size_bytes: 2456994 + source: 'network-manager_1.54.3-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'network-manager-config-connectivity-ubuntu' + version: '1.54.3-2ubuntu3' + architecture: 'all' + sha256: '42a7d35d594fd6b6b12e00e2b8e59c34bece4d1ee8c3972d473d9659702dbc32' + size_bytes: 2260 + source: 'network-manager-config-connectivity-ubuntu_1.54.3-2ubuntu3_all.deb' + pinned_in: [] + - package: 'network-manager-l10n' + version: '1.54.3-2ubuntu3' + architecture: 'all' + sha256: '9f53f04f77d3591e9b8009d6d15cc735421217b6e79280f496db7a961ba4ef26' + size_bytes: 12182 + source: 'network-manager-l10n_1.54.3-2ubuntu3_all.deb' + pinned_in: [] + - package: 'network-manager-openvpn' + version: '1.12.5-1' + architecture: 'amd64' + sha256: '59454667f5217c5d30290efb31fe915d997a323bf5be1a30ce13b763cf922938' + size_bytes: 61694 + source: 'network-manager-openvpn_1.12.5-1_amd64.deb' + pinned_in: [] + - package: 'network-manager-openvpn-gnome' + version: '1.12.5-1' + architecture: 'amd64' + sha256: 'a9ab333b41b8a9c1384f28eb5d4de6cafc8b9ede8ea267b39d3dddf9e24ae32e' + size_bytes: 59070 + source: 'network-manager-openvpn-gnome_1.12.5-1_amd64.deb' + pinned_in: [] + - package: 'network-manager-pptp' + version: '1.2.12-6' + architecture: 'amd64' + sha256: '815edfffeff434bbbcb76efab772233fd291b6b35e0ee625e9cab5e9f4533bb1' + size_bytes: 34684 + source: 'network-manager-pptp_1.2.12-6_amd64.deb' + pinned_in: [] + - package: 'network-manager-pptp-gnome' + version: '1.2.12-6' + architecture: 'amd64' + sha256: '942f49bc7face385928da24f2d2651841ce2c6733d3cff70f1db0a7c3a21331f' + size_bytes: 28036 + source: 'network-manager-pptp-gnome_1.2.12-6_amd64.deb' + pinned_in: [] + - package: 'nftables' + version: '1.1.6-1' + architecture: 'amd64' + sha256: 'fcdeae9ed9761550619d062f8ae87a2399c84ab87f4535bcb9ab0d3649aba59a' + size_bytes: 76202 + source: 'nftables_1.1.6-1_amd64.deb' + pinned_in: [] + - package: 'nm-connection-editor' + version: '1.36.0-4ubuntu1' + architecture: 'amd64' + sha256: '0d26a7108d940497878d7f990271a3c93c32e826cf3c057c5573a3125d93c446' + size_bytes: 224462 + source: 'nm-connection-editor_1.36.0-4ubuntu1_amd64.deb' + pinned_in: [] + - package: 'ntfs-3g' + version: '1:2022.10.3-5ubuntu1.1' + architecture: 'amd64' + sha256: '7a02c9f13b08953f98cc326eef70c7b9b517a1d1a4d3bfc74f5752c80880a153' + size_bytes: 411194 + source: 'ntfs-3g_1%3a2022.10.3-5ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'nvme-cli' + version: '2.16-1' + architecture: 'amd64' + sha256: '2dee6fe3ef62fbd30065759efbc7593a289e8dc0e7b82ecb57d67f518e2dc57e' + size_bytes: 901478 + source: 'nvme-cli_2.16-1_amd64.deb' + pinned_in: [] + - package: 'openipmi' + version: '2.0.37-1build1' + architecture: 'amd64' + sha256: 'dac3322406c0453f43e85f14c74fa0f841f3ca0722bd4d3cc7f9a2d1bc11e5d9' + size_bytes: 177814 + source: 'openipmi_2.0.37-1build1_amd64.deb' + pinned_in: [] + - package: 'openprinting-ppds' + version: '20250819-1build1' + architecture: 'all' + sha256: '8e99a7573a66559557fde2d2970c7c9ba15d25f9b0c64d4aa8c1ffbbb07ce949' + size_bytes: 6281884 + source: 'openprinting-ppds_20250819-1build1_all.deb' + pinned_in: [] + - package: 'openssh-client' + version: '1:10.2p1-2ubuntu3.6' + architecture: 'amd64' + sha256: 'd47ae7d97b3751264f921cc3df09a70915e85ad980c94b99e651e21c36e3d987' + size_bytes: 935454 + source: 'openssh-client_1%3a10.2p1-2ubuntu3.6_amd64.deb' + pinned_in: [] + - package: 'openssh-server' + version: '1:10.2p1-2ubuntu3.6' + architecture: 'amd64' + sha256: '108256262b0fb7bb8eddd92e87230f775c90eb321413e8789754b3509f7b55c6' + size_bytes: 621574 + source: 'openssh-server_1%3a10.2p1-2ubuntu3.6_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'openssh-sftp-server' + version: '1:10.2p1-2ubuntu3.6' + architecture: 'amd64' + sha256: '16bfb714d404ccbee3623d08f280a3671512ecbe9590565fac621c85bcee7766' + size_bytes: 37440 + source: 'openssh-sftp-server_1%3a10.2p1-2ubuntu3.6_amd64.deb' + pinned_in: [] + - package: 'openssl' + version: '3.5.5-1ubuntu3.5' + architecture: 'amd64' + sha256: '0cea6b98673ff88218b7e5f18c1bd42f06bdfcae6c1ebc9964adf3bc41420c19' + size_bytes: 1242916 + source: 'openssl_3.5.5-1ubuntu3.5_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'openvpn' + version: '2.7.0-1ubuntu1.2' + architecture: 'amd64' + sha256: 'ae6c69da5eb4077f39f8d12827d7603d7294ffb0ea733ca32b643ddeffecd032' + size_bytes: 706598 + source: 'openvpn_2.7.0-1ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'orca' + version: '50.2-0ubuntu0.1' + architecture: 'all' + sha256: 'abba2a0f5231c4cd4237e6cc2989166e242682e69bf0a1ad3245701b1f6ccbeb' + size_bytes: 611866 + source: 'orca_50.2-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'os-prober' + version: '1.84ubuntu1' + architecture: 'amd64' + sha256: '16fe1703355df54a48d16942647448f9313895bd9750b33a92d3f1e64087af63' + size_bytes: 18684 + source: 'os-prober_1.84ubuntu1_amd64.deb' + pinned_in: [] + - package: 'p11-kit' + version: '0.26.2-2' + architecture: 'amd64' + sha256: '3a61dfa5b4d04d204b38c5f555e8e916427f175f04e29dec4f6cf7b787d54a5d' + size_bytes: 152784 + source: 'p11-kit_0.26.2-2_amd64.deb' + pinned_in: [] + - package: 'p11-kit-modules' + version: '0.26.2-2' + architecture: 'amd64' + sha256: '633ac53737f9a284acc3df4d1d717857902fe04a222f19331c7b18092fe2448b' + size_bytes: 355018 + source: 'p11-kit-modules_0.26.2-2_amd64.deb' + pinned_in: [] + - package: 'packagekit' + version: '1.3.4-3ubuntu1.2' + architecture: 'amd64' + sha256: '45df03f3b6755f67fcecf5de1624e1ae8ec4808cf6804da47693e17bc5bd51b7' + size_bytes: 505628 + source: 'packagekit_1.3.4-3ubuntu1.2_amd64.deb' + pinned_in: [] + - package: 'papers' + version: '50.2-0ubuntu0.1' + architecture: 'amd64' + sha256: '6f1553f6594ae26bac5d3e6778cce8070ce3778656bb05325787946bfbad1e0a' + size_bytes: 2057380 + source: 'papers_50.2-0ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'papers-common' + version: '50.2-0ubuntu0.1' + architecture: 'all' + sha256: 'c38b589c28febc104e84048afe834a43288a34cd0ca367b7eabb3d86e6741420' + size_bytes: 114984 + source: 'papers-common_50.2-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'parted' + version: '3.6-6' + architecture: 'amd64' + sha256: '91dd4af8802c8f9b7faa53031dad52b8a344ef3ee659514f7c641576e3b3debf' + size_bytes: 43842 + source: 'parted_3.6-6_amd64.deb' + pinned_in: [] + - package: 'patch' + version: '2.8-2build1' + architecture: 'amd64' + sha256: '0e5a899095d92d6db9585183a5225504f5dc5ecaffdfe2a25d745a9502de3b30' + size_bytes: 95680 + source: 'patch_2.8-2build1_amd64.deb' + pinned_in: [] + - package: 'pci.ids' + version: '0.0~2026.02.12-1' + architecture: 'all' + sha256: '0ff0f097128bad2652dae41b8afa2266dfeec939935f43b0a87a50bc17e2f77d' + size_bytes: 298774 + source: 'pci.ids_0.0~2026.02.12-1_all.deb' + pinned_in: [] + - package: 'pciutils' + version: '1:3.14.0-1build2' + architecture: 'amd64' + sha256: '9365cca3e3e97f58cd8f6f31c82492ae03e0f33c85c46c177ff19b045978541a' + size_bytes: 95452 + source: 'pciutils_1%3a3.14.0-1build2_amd64.deb' + pinned_in: [] + - package: 'pcmciautils' + version: '018-19' + architecture: 'amd64' + sha256: 'a4419de089412644665f8ded9868449f61dedff7e132020c80c5c3bceeaba1cf' + size_bytes: 26296 + source: 'pcmciautils_018-19_amd64.deb' + pinned_in: [] + - package: 'perl' + version: '5.40.1-7ubuntu0.3' + architecture: 'amd64' + sha256: 'e06e80879beca89fc363a5ecbc0e15ceae68aed20bc8e4ea952a10d45f69a47d' + size_bytes: 262084 + source: 'perl_5.40.1-7ubuntu0.3_amd64.deb' + pinned_in: [] + - package: 'perl-modules-5.40' + version: '5.40.1-7ubuntu0.3' + architecture: 'all' + sha256: '19c81efa2c37662080df7d44289b9b5c516205ee8cf9c54410b0031ff2208e41' + size_bytes: 3212300 + source: 'perl-modules-5.40_5.40.1-7ubuntu0.3_all.deb' + pinned_in: [] + - package: 'perl-openssl-defaults' + version: '7build4' + architecture: 'amd64' + sha256: 'fbd40b547a3bd8bf626da4405b9c0dd4d623b368daf74eb81292fe896917c91b' + size_bytes: 6710 + source: 'perl-openssl-defaults_7build4_amd64.deb' + pinned_in: [] + - package: 'pigz' + version: '2.8-1build1' + architecture: 'amd64' + sha256: '9571cde9f1132b2aafe63a0c06aa93342fcd6ee1bad83e681647fe7592acc0db' + size_bytes: 66850 + source: 'pigz_2.8-1build1_amd64.deb' + pinned_in: [] + - package: 'pinentry-gnome3' + version: '1.3.2-3ubuntu1' + architecture: 'amd64' + sha256: 'aa23bc62b2cb5a659b3ade1846b3dd317af4bc96da9c607dde234f71253d91d0' + size_bytes: 44340 + source: 'pinentry-gnome3_1.3.2-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'pipewire' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'b45ea88bc80ee127a6ea8d16c19b965af50613f68d0b5679b80d4bd6eb80394f' + size_bytes: 108552 + source: 'pipewire_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'pipewire-alsa' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: 'eafe997957960a6b3b35f23c4c79159f7b19b58c1b186cfcecf694384aac8bc1' + size_bytes: 52542 + source: 'pipewire-alsa_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'pipewire-audio' + version: '1.6.2-1ubuntu1.1' + architecture: 'all' + sha256: '6bdaea8c46846f361f30b82290be8549f99ba17d3ae872d973856dac47f0a875' + size_bytes: 4098 + source: 'pipewire-audio_1.6.2-1ubuntu1.1_all.deb' + pinned_in: [] + - package: 'pipewire-bin' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: '292e2227c5c1368929a47e2709f92665e1274f6fcd86c876e18c4ae4b3747a71' + size_bytes: 654080 + source: 'pipewire-bin_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'pipewire-pulse' + version: '1.6.2-1ubuntu1.1' + architecture: 'amd64' + sha256: '2d618e4e07c61d48c10b2acf89f283191ff3e414530e3e07e0af26a2c187326e' + size_bytes: 9540 + source: 'pipewire-pulse_1.6.2-1ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'pkexec' + version: '127-2ubuntu1.1' + architecture: 'amd64' + sha256: '13cee770b506148abff92aafbbb364e203807a61b7548fa9aca3e1d72827b002' + size_bytes: 15602 + source: 'pkexec_127-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'plymouth' + version: '24.004.60+git20250831.4a3c171d-0ubuntu8' + architecture: 'amd64' + sha256: '70abc40f1d4a8caeae443310e397cd8b17f2a5e9769c797d79ce479de13870b0' + size_bytes: 134832 + source: 'plymouth_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb' + pinned_in: [] + - package: 'plymouth-label' + version: '24.004.60+git20250831.4a3c171d-0ubuntu8' + architecture: 'amd64' + sha256: 'ad8f341e0f2500c983a33a3b42f850f8844a13b15e6ea6dccfcce29c81d0ca88' + size_bytes: 9602 + source: 'plymouth-label_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb' + pinned_in: [] + - package: 'plymouth-theme-spinner' + version: '24.004.60+git20250831.4a3c171d-0ubuntu8' + architecture: 'amd64' + sha256: '19ff2c73b357ce5ee30cdd0cc420691b19b830ad323e286508c6117e9b85e363' + size_bytes: 172762 + source: 'plymouth-theme-spinner_24.004.60+git20250831.4a3c171d-0ubuntu8_amd64.deb' + pinned_in: [] + - package: 'policykit-desktop-privileges' + version: '0.22build1' + architecture: 'all' + sha256: 'd357ef30efb90b21f2e63833b3d49efecb09fc59785c18adef2c2a634a2c4a36' + size_bytes: 3588 + source: 'policykit-desktop-privileges_0.22build1_all.deb' + pinned_in: [] + - package: 'polkitd' + version: '127-2ubuntu1.1' + architecture: 'amd64' + sha256: 'c1935129f2d9d76db7c9d3f29cad2c85de0e5c1a568b7a8a6140131c2804a0d8' + size_bytes: 102300 + source: 'polkitd_127-2ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'poppler-data' + version: '0.4.12-1build1' + architecture: 'all' + sha256: '6d2d873d2a77a76ea2a156c15a5ae798fe3711d8736cd2ff3872f53d57567e0e' + size_bytes: 2000170 + source: 'poppler-data_0.4.12-1build1_all.deb' + pinned_in: [] + - package: 'poppler-utils' + version: '26.01.0-2ubuntu0.1' + architecture: 'amd64' + sha256: '16399d6fe46fbef3259297601ffeeaf024d725b02cdd6d8ddbbc2f4b0aa1ed7d' + size_bytes: 231310 + source: 'poppler-utils_26.01.0-2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'power-profiles-daemon' + version: '0.30-2' + architecture: 'amd64' + sha256: '476b74a46ec1ae19d1c43bfa00957d53dd9a51ea8229da06d8aee87e4ea7653e' + size_bytes: 56906 + source: 'power-profiles-daemon_0.30-2_amd64.deb' + pinned_in: [] + - package: 'ppp' + version: '2.5.2-1+1.2' + architecture: 'amd64' + sha256: 'b80c9d944cc929eb4b1556aeb2fd06eff37a5163ef18838ae533c0f0fb6efbae' + size_bytes: 356484 + source: 'ppp_2.5.2-1+1.2_amd64.deb' + pinned_in: [] + - package: 'pptp-linux' + version: '1.10.0-2build1' + architecture: 'amd64' + sha256: 'f12d5e0c8139656a69cc74be3357391965fb5c2e4ba46d67de2796dabb85a392' + size_bytes: 39922 + source: 'pptp-linux_1.10.0-2build1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-brlaser' + version: '6.2.8-1' + architecture: 'amd64' + sha256: 'ceea4b95ffa50d7e6c8bd99f1d365d3f0722aa0c8e6a4b8fefcbdace90a8c1b2' + size_bytes: 24218 + source: 'printer-driver-brlaser_6.2.8-1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-c2esp' + version: '27-11ubuntu8' + architecture: 'amd64' + sha256: '8ec58b3cb4d0fe253063a0e6352514dce43f4d4a25ccad122943800680ee5804' + size_bytes: 32680 + source: 'printer-driver-c2esp_27-11ubuntu8_amd64.deb' + pinned_in: [] + - package: 'printer-driver-foo2zjs' + version: '20200505dfsg0-3ubuntu1' + architecture: 'amd64' + sha256: '979f8bc0e3fdc1a7602ee35034818c7ea207321e5c0c469a7a92c1ac12714aef' + size_bytes: 146788 + source: 'printer-driver-foo2zjs_20200505dfsg0-3ubuntu1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-foo2zjs-common' + version: '20200505dfsg0-3ubuntu1' + architecture: 'all' + sha256: '3aa8af4816a8d84ed0c7eba78bdadd52567a826f26d18116efbab96d2f43bfb7' + size_bytes: 595278 + source: 'printer-driver-foo2zjs-common_20200505dfsg0-3ubuntu1_all.deb' + pinned_in: [] + - package: 'printer-driver-hpcups' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'amd64' + sha256: '5e128db58f0f7b47a0f52bf1d00959617d6debada5ba8a68e25d97b6e0ad02bf' + size_bytes: 250186 + source: 'printer-driver-hpcups_3.24.4+dfsg0-0ubuntu8.1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-m2300w' + version: '0.51-15build3' + architecture: 'amd64' + sha256: '114daf5e6f0e6d26712bbd6aed099bb48cb9c341d0ef45f91be656ec1db29bfb' + size_bytes: 302776 + source: 'printer-driver-m2300w_0.51-15build3_amd64.deb' + pinned_in: [] + - package: 'printer-driver-min12xxw' + version: '0.0.9-11build4' + architecture: 'amd64' + sha256: '0158b5c2a3dbec5b8eed2ca328f3f27b1402eb870c38b4694faf1c06a17d6a10' + size_bytes: 46286 + source: 'printer-driver-min12xxw_0.0.9-11build4_amd64.deb' + pinned_in: [] + - package: 'printer-driver-pnm2ppa' + version: '1.13+nondbs-0ubuntu11' + architecture: 'amd64' + sha256: '374f0c7ddb9bf06006459df8da0e45e18704c4f61e88abef2013bdad9bed6f2f' + size_bytes: 249020 + source: 'printer-driver-pnm2ppa_1.13+nondbs-0ubuntu11_amd64.deb' + pinned_in: [] + - package: 'printer-driver-postscript-hp' + version: '3.24.4+dfsg0-0ubuntu8.1' + architecture: 'amd64' + sha256: '624c45738ca1410990eabe1a54666d6d01cbb1fa2dd1fb33e220c16dcc42ac78' + size_bytes: 1381382 + source: 'printer-driver-postscript-hp_3.24.4+dfsg0-0ubuntu8.1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-ptouch' + version: '1.7.1-1build1' + architecture: 'amd64' + sha256: 'f59ec76fbcea603467b0dc26fce1d988a0e5669eff347d575592a95b1b7fb8b1' + size_bytes: 25456 + source: 'printer-driver-ptouch_1.7.1-1build1_amd64.deb' + pinned_in: [] + - package: 'printer-driver-pxljr' + version: '1.4+repack0-6build3' + architecture: 'amd64' + sha256: '601017b8567bc37e65c1b792accd3bb0f6f8dee2e16876aafdcc1d0ae47ea1c7' + size_bytes: 27142 + source: 'printer-driver-pxljr_1.4+repack0-6build3_amd64.deb' + pinned_in: [] + - package: 'printer-driver-sag-gdi' + version: '0.1-8build1' + architecture: 'all' + sha256: 'ffdb3fe9d7156f34e3f2e4ad883a498db5b58b5d9ee53fcc6740a2a964a15466' + size_bytes: 8554 + source: 'printer-driver-sag-gdi_0.1-8build1_all.deb' + pinned_in: [] + - package: 'printer-driver-splix' + version: '2.0.1-2' + architecture: 'amd64' + sha256: 'a33d32720e620109989587538ef87d27d407adf54a5e9697aeb9f5e38bdfbfab' + size_bytes: 39728 + source: 'printer-driver-splix_2.0.1-2_amd64.deb' + pinned_in: [] + - package: 'prometheus-node-exporter' + version: '1.10.2-1' + architecture: 'amd64' + sha256: '64dc6b1fd378013829cb75a46e2f93603da361aeeb616f2ebaac9a7162ce266b' + size_bytes: 5112574 + source: 'prometheus-node-exporter_1.10.2-1_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'prometheus-node-exporter-collectors' + version: '0.0~git20241119.a2b43e1-1build1' + architecture: 'all' + sha256: '8325167690db390e8f338b17d376270dda318b328e04bdaad37b7d709ff66cd1' + size_bytes: 33606 + source: 'prometheus-node-exporter-collectors_0.0~git20241119.a2b43e1-1build1_all.deb' + pinned_in: [] + - package: 'psmisc' + version: '23.7-2ubuntu2' + architecture: 'amd64' + sha256: 'a4a44a91506938bd8a3c0a75a92bd005423a9fdad5372107b53388b34fb58683' + size_bytes: 179200 + source: 'psmisc_23.7-2ubuntu2_amd64.deb' + pinned_in: [] + - package: 'ptyxis' + version: '50.1-1ubuntu2' + architecture: 'amd64' + sha256: '27d1b9970c45c1e10be0ef41b51073bdc6b54ba16f7a49a3b716e72a2d21eaa9' + size_bytes: 247482 + source: 'ptyxis_50.1-1ubuntu2_amd64.deb' + pinned_in: [] + - package: 'python-apt-common' + version: '3.1.0ubuntu1.1' + architecture: 'all' + sha256: 'e3637c6c0eeb83dc1de181d44f0bc27d8a5c3813bc9bff6c1ed181f1996a59bf' + size_bytes: 16976 + source: 'python-apt-common_3.1.0ubuntu1.1_all.deb' + pinned_in: [] + - package: 'python-babel-localedata' + version: '2.17.0-2' + architecture: 'all' + sha256: '746f068262e81264d22cf78b06a86cabafc00fae650e379f8598bb395fcf61d0' + size_bytes: 6670976 + source: 'python-babel-localedata_2.17.0-2_all.deb' + pinned_in: [] + - package: 'python3' + version: '3.14.3-0ubuntu2' + architecture: 'amd64' + sha256: '1ff88ad587f9e52e9f333ab00ae0babea93ac5222fc6909039c4190affe1d574' + size_bytes: 22938 + source: 'python3_3.14.3-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'python3-apport' + version: '2.34.1-0ubuntu0.1' + architecture: 'all' + sha256: '3f4febbe890796cb56256a00060187090f2a8a3bdf5359fedd0ea66e20e87da2' + size_bytes: 96384 + source: 'python3-apport_2.34.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'python3-apt' + version: '3.1.0ubuntu1.1' + architecture: 'amd64' + sha256: 'e199afdd199b4bcee7eb37ceca32cc873cb847e8e36ba83df2d778ec6b9a0bf2' + size_bytes: 165306 + source: 'python3-apt_3.1.0ubuntu1.1_amd64.deb' + pinned_in: [] + - package: 'python3-aptdaemon' + version: '2.0.2build1' + architecture: 'all' + sha256: '40945b00aedd570f06bc3ee9a630703c68828d051aef494bd28b72f0935f2b1c' + size_bytes: 66368 + source: 'python3-aptdaemon_2.0.2build1_all.deb' + pinned_in: [] + - package: 'python3-aptdaemon.gtk3widgets' + version: '2.0.2build1' + architecture: 'all' + sha256: '73cd309b596ea5242dae16e53504ec4a15e960d6f06cf109ccf7f4692d34d487' + size_bytes: 13042 + source: 'python3-aptdaemon.gtk3widgets_2.0.2build1_all.deb' + pinned_in: [] + - package: 'python3-attr' + version: '25.4.0-1build1' + architecture: 'all' + sha256: '1307217d4b0c7bc7e7edeb3f3102a42d0ceb281f9108132a393235b124c6de40' + size_bytes: 53742 + source: 'python3-attr_25.4.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-autocommand' + version: '2.2.2-4' + architecture: 'all' + sha256: 'c8cfcc4d3e59e71b1ecfc36828e6e83dc824f3b641a15783afa368c3f98d1c49' + size_bytes: 13878 + source: 'python3-autocommand_2.2.2-4_all.deb' + pinned_in: [] + - package: 'python3-babel' + version: '2.17.0-2' + architecture: 'all' + sha256: 'ee9520dcbb3574627166ab9ecde1cff2ee66e70af42bd1a00580dd7457ce6239' + size_bytes: 100730 + source: 'python3-babel_2.17.0-2_all.deb' + pinned_in: [] + - package: 'python3-bcrypt' + version: '5.0.0-3build1' + architecture: 'amd64' + sha256: '27db1482adbaac3c8f56396096011761c121a34f6a3c54b700fd0c41f6f5ddf3' + size_bytes: 220548 + source: 'python3-bcrypt_5.0.0-3build1_amd64.deb' + pinned_in: [] + - package: 'python3-blinker' + version: '1.9.0-2build1' + architecture: 'all' + sha256: '1272e5991259cd08aa65fc35585d1748b251146b514bfc97a633fdf143dcf63a' + size_bytes: 10898 + source: 'python3-blinker_1.9.0-2build1_all.deb' + pinned_in: [] + - package: 'python3-brlapi' + version: '6.7-1ubuntu6' + architecture: 'amd64' + sha256: '27e17d7d2e400b9d7ca47c20638b960fb956aa41fe79e086e0a43e8d04ab5e74' + size_bytes: 94028 + source: 'python3-brlapi_6.7-1ubuntu6_amd64.deb' + pinned_in: [] + - package: 'python3-cairo' + version: '1.27.0-2build2' + architecture: 'amd64' + sha256: '5b6d64aa6e760f53f5fa20e6ce4b5ffbe7a93cb86d0749b1a7a591b1dc961818' + size_bytes: 118842 + source: 'python3-cairo_1.27.0-2build2_amd64.deb' + pinned_in: [] + - package: 'python3-certifi' + version: '2026.1.4+ds-1' + architecture: 'all' + sha256: '4e84efd4e4b0f3f72b9ec4c8c2c21927e4e4bbf2af8b91aaa39235eaf2e3d3a8' + size_bytes: 10284 + source: 'python3-certifi_2026.1.4+ds-1_all.deb' + pinned_in: [] + - package: 'python3-cffi-backend' + version: '2.0.0-3build1' + architecture: 'amd64' + sha256: '2c826b9005866afc4ffc3e9cbb690ed8de56f01981d9b61f39dc21634170d5db' + size_bytes: 85520 + source: 'python3-cffi-backend_2.0.0-3build1_amd64.deb' + pinned_in: [] + - package: 'python3-chardet' + version: '5.2.0+dfsg-2build1' + architecture: 'all' + sha256: 'ca6541b1e2b184f42be7cac8a3967537bb359c28a81bc73ff964a85f78177983' + size_bytes: 115430 + source: 'python3-chardet_5.2.0+dfsg-2build1_all.deb' + pinned_in: [] + - package: 'python3-click' + version: '8.2.0+0.really.8.1.8-1build1' + architecture: 'all' + sha256: '8ee0b7d16f7fcbc05e6e6ad28ee8d0251d76248eac64b0e9f775f61690fcac05' + size_bytes: 80162 + source: 'python3-click_8.2.0+0.really.8.1.8-1build1_all.deb' + pinned_in: [] + - package: 'python3-configobj' + version: '5.0.9-1build1' + architecture: 'all' + sha256: 'ec9cc28c7991c8309c99b9ba3efaef968bfb6e39f35937e00fe1e5ea65298c67' + size_bytes: 34084 + source: 'python3-configobj_5.0.9-1build1_all.deb' + pinned_in: [] + - package: 'python3-cryptography' + version: '46.0.5-1ubuntu2' + architecture: 'amd64' + sha256: '86f3c885ee9a8b3ba09357752e472a949cc31b3e443efa78a494b83bb3e11f77' + size_bytes: 1152640 + source: 'python3-cryptography_46.0.5-1ubuntu2_amd64.deb' + pinned_in: [] + - package: 'python3-cups' + version: '2.0.4-3build1' + architecture: 'amd64' + sha256: 'caa02488f8c6f8cb8965eb282fc8217cffbfe9794aa88a209e7e2c69b56a0048' + size_bytes: 61018 + source: 'python3-cups_2.0.4-3build1_amd64.deb' + pinned_in: [] + - package: 'python3-cupshelpers' + version: '1.5.18-4ubuntu2' + architecture: 'all' + sha256: 'd933777dfe9e3884ba4027059ce4ca62f8604dba9ff75ba52d9a7a17add0ec9f' + size_bytes: 33688 + source: 'python3-cupshelpers_1.5.18-4ubuntu2_all.deb' + pinned_in: [] + - package: 'python3-dasbus' + version: '1.7-2build1' + architecture: 'all' + sha256: 'f23fe76bccef656219f5fa634cec2c14191420c32a6f8befd95b5703cae607c7' + size_bytes: 51664 + source: 'python3-dasbus_1.7-2build1_all.deb' + pinned_in: [] + - package: 'python3-dbus' + version: '1.4.0-1build2' + architecture: 'amd64' + sha256: 'ce67cc0a2f375bf539b8eb5edaa6a64ed221806f5ea4d0255311be611424b27c' + size_bytes: 100516 + source: 'python3-dbus_1.4.0-1build2_amd64.deb' + pinned_in: [] + - package: 'python3-debconf' + version: '1.5.92' + architecture: 'all' + sha256: '7f6b7e83ebfcc512295c151f8144b5df739e043601fe8abbb060261891a43cda' + size_bytes: 4162 + source: 'python3-debconf_1.5.92_all.deb' + pinned_in: [] + - package: 'python3-debian' + version: '1.0.1ubuntu2' + architecture: 'all' + sha256: 'f15459b4c7165015b598b29fe9fa2c25a5a78007ecd7a6af5a7673062eeb3550' + size_bytes: 121490 + source: 'python3-debian_1.0.1ubuntu2_all.deb' + pinned_in: [] + - package: 'python3-decorator' + version: '5.2.1-2' + architecture: 'all' + sha256: '45cb8bbd3cf5f012caf2ae4fcd5c68bd3a32480bf1911d0bfaa26f075d3b61c0' + size_bytes: 28060 + source: 'python3-decorator_5.2.1-2_all.deb' + pinned_in: [] + - package: 'python3-defer' + version: '1.0.6-2.1ubuntu2' + architecture: 'all' + sha256: 'f0b2c37b1317a1c2c88dafb1570009f31cdbc2fb439e2ae97653446e9d4ee404' + size_bytes: 10890 + source: 'python3-defer_1.0.6-2.1ubuntu2_all.deb' + pinned_in: [] + - package: 'python3-distro' + version: '1.9.0-1build1' + architecture: 'all' + sha256: 'afb074d1d8118a6f414d2d667c6025838ea16529c2ccf9c675e79bdadcea48bf' + size_bytes: 16964 + source: 'python3-distro_1.9.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-distro-info' + version: '1.15' + architecture: 'all' + sha256: '62bb827d8602b9c7aacd25766098b3f75fbca2ef8bdfd7cbacec4db8957a80f5' + size_bytes: 8006 + source: 'python3-distro-info_1.15_all.deb' + pinned_in: [] + - package: 'python3-distupgrade' + version: '1:26.04.23' + architecture: 'all' + sha256: '2a74be7d4a914eb8c0833c0db92504291e976a58effc97c31d0a27caea6fbf1b' + size_bytes: 101828 + source: 'python3-distupgrade_1%3a26.04.23_all.deb' + pinned_in: [] + - package: 'python3-gi' + version: '3.56.2-1' + architecture: 'amd64' + sha256: 'dae2c57b518e9d77c00e41f83ee0f3f8de07732c1cc755f4ff1b6fb7bff59a10' + size_bytes: 237662 + source: 'python3-gi_3.56.2-1_amd64.deb' + pinned_in: [] + - package: 'python3-httplib2' + version: '0.22.0-1ubuntu0.1' + architecture: 'all' + sha256: '03af683aa5cf693e72c0dfc2be9ea323b1f16371d113349bcdffe12ee4799321' + size_bytes: 32092 + source: 'python3-httplib2_0.22.0-1ubuntu0.1_all.deb' + pinned_in: [] + - package: 'python3-ibus-1.0' + version: '1.5.34~rc2-1' + architecture: 'all' + sha256: '79dfc171d5754ea496b48068a9425212d57bd8842398e49846f24f4bad364314' + size_bytes: 7400 + source: 'python3-ibus-1.0_1.5.34~rc2-1_all.deb' + pinned_in: [] + - package: 'python3-idna' + version: '3.11-1ubuntu0.1' + architecture: 'all' + sha256: '3c212bce4961c5b8b3730fa6ebf98800848fe4fb5af1b56e477992ea1e03bcd1' + size_bytes: 47090 + source: 'python3-idna_3.11-1ubuntu0.1_all.deb' + pinned_in: [] + - package: 'python3-inflect' + version: '7.5.0-1build1' + architecture: 'all' + sha256: 'aa434e7c8255eb990cddd176118780337b484b585c26d3f83eeade715c2c6afc' + size_bytes: 33984 + source: 'python3-inflect_7.5.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-jaraco.context' + version: '6.0.1-2' + architecture: 'all' + sha256: '77a7a93f3ca98d7eb904dce96d3333c3b92afd0b17066c1c1a823f9fd1d41bad' + size_bytes: 8198 + source: 'python3-jaraco.context_6.0.1-2_all.deb' + pinned_in: [] + - package: 'python3-jaraco.functools' + version: '4.1.0-1build1' + architecture: 'all' + sha256: 'f5ecd527fe2f3bee3313e458b8f3f46c6ed0fe1315192b6b6d9bf02eb47e31f3' + size_bytes: 11816 + source: 'python3-jaraco.functools_4.1.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-jaraco.text' + version: '4.0.0-1build1' + architecture: 'all' + sha256: '87073055d11204e08b2382e517cb8cb8f28e1eb34e3409ca8c9786dd2f33b9ba' + size_bytes: 11634 + source: 'python3-jaraco.text_4.0.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-jinja2' + version: '3.1.6-1build1' + architecture: 'all' + sha256: '083e378d3d76dfc17b43b26b3663b3081f4ad468ff51f509213cf0fd5fe74048' + size_bytes: 109304 + source: 'python3-jinja2_3.1.6-1build1_all.deb' + pinned_in: [] + - package: 'python3-json-pointer' + version: '2.4-4' + architecture: 'all' + sha256: '8923fca5667f642b62eb3a6787ec92a4848ed224d8a27bc2781d73df428a99dd' + size_bytes: 8540 + source: 'python3-json-pointer_2.4-4_all.deb' + pinned_in: [] + - package: 'python3-jsonpatch' + version: '1.32-6' + architecture: 'all' + sha256: '8bd4b12c72de7f2503fbff705ebc259512a26c478118dd66180572e40d054340' + size_bytes: 12366 + source: 'python3-jsonpatch_1.32-6_all.deb' + pinned_in: [] + - package: 'python3-jsonschema' + version: '4.19.2-6ubuntu2' + architecture: 'all' + sha256: 'b628c6c7ab5020ab78e563d9d7da51abdfdf0e3cca2cbcf2130b6785a7b9f7fe' + size_bytes: 65546 + source: 'python3-jsonschema_4.19.2-6ubuntu2_all.deb' + pinned_in: [] + - package: 'python3-jsonschema-specifications' + version: '2023.12.1-4' + architecture: 'all' + sha256: 'bae21c1970c207a6435f5a2ddee4ee3cec3e7275c9eda3ca32f58eb81ae1524a' + size_bytes: 9238 + source: 'python3-jsonschema-specifications_2023.12.1-4_all.deb' + pinned_in: [] + - package: 'python3-jwt' + version: '2.10.1-4ubuntu1' + architecture: 'all' + sha256: 'cbcb368eda304fd96eff92b2f86060ace798546ac9853c7dd5989b2eda9aff17' + size_bytes: 20564 + source: 'python3-jwt_2.10.1-4ubuntu1_all.deb' + pinned_in: [] + - package: 'python3-launchpadlib' + version: '2.1.0-1build1' + architecture: 'all' + sha256: '06e2e6e3b6c4197ce6b2dfcf8eea429aa93ff66c6d88af2fb96f0b9cd3e080af' + size_bytes: 126482 + source: 'python3-launchpadlib_2.1.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-lazr.restfulclient' + version: '0.14.6-3build1' + architecture: 'all' + sha256: 'dcb6ebf8fb40e44e14eadc0381e777acdbcca268167e1735c16a90d7f79243cb' + size_bytes: 51126 + source: 'python3-lazr.restfulclient_0.14.6-3build1_all.deb' + pinned_in: [] + - package: 'python3-lazr.uri' + version: '1.0.6-7build1' + architecture: 'all' + sha256: '15bc56d33343538edaba3d695386096521c2d83c47ce68d4021cb29927830806' + size_bytes: 13922 + source: 'python3-lazr.uri_1.0.6-7build1_all.deb' + pinned_in: [] + - package: 'python3-linkify-it' + version: '2.0.3-1ubuntu3' + architecture: 'all' + sha256: '7f1d1593dad089a66f684da1a08cb1a85ba5bb8a272192d4d9573492da9b86e0' + size_bytes: 19384 + source: 'python3-linkify-it_2.0.3-1ubuntu3_all.deb' + pinned_in: [] + - package: 'python3-louis' + version: '3.36.0-1' + architecture: 'all' + sha256: 'bd27383bd95e85ea30d7c5d7e5d1c25dba8752eebd3549d94f2f2fc627edc269' + size_bytes: 9678 + source: 'python3-louis_3.36.0-1_all.deb' + pinned_in: [] + - package: 'python3-markdown-it' + version: '3.0.0-3build1' + architecture: 'all' + sha256: '4c1bcfe37221a20c98324f543aee6eb110f928232c32e16568c1ec5ee8ee66ef' + size_bytes: 54402 + source: 'python3-markdown-it_3.0.0-3build1_all.deb' + pinned_in: [] + - package: 'python3-markupsafe' + version: '3.0.3-1build1' + architecture: 'amd64' + sha256: '3580a536b61dd32b468468f371e3dba1fe39d8cc27ba0eec66e3cafd069ba1ca' + size_bytes: 11812 + source: 'python3-markupsafe_3.0.3-1build1_amd64.deb' + pinned_in: [] + - package: 'python3-mdurl' + version: '0.1.2-1build1' + architecture: 'all' + sha256: '3d22adc869c549e73aac71decc9aa196540fa3706c97b652ce940ebc876de7ac' + size_bytes: 9328 + source: 'python3-mdurl_0.1.2-1build1_all.deb' + pinned_in: [] + - package: 'python3-minimal' + version: '3.14.3-0ubuntu2' + architecture: 'amd64' + sha256: 'd5f37616b30209d8c10c4a705d7bf9558ca21e058fc2b2bd2ffcf37a74a42861' + size_bytes: 25808 + source: 'python3-minimal_3.14.3-0ubuntu2_amd64.deb' + pinned_in: [] + - package: 'python3-more-itertools' + version: '10.8.0-1build1' + architecture: 'all' + sha256: 'b73e8627d39af347eb3e5cab4cf3fc4e2bf0780f52b6f3e14b6eaf07174b0719' + size_bytes: 63658 + source: 'python3-more-itertools_10.8.0-1build1_all.deb' + pinned_in: [] + - package: 'python3-netplan' + version: '1.2-1ubuntu5.1' + architecture: 'amd64' + sha256: '724ce127da1578e45e54b0c9772e6059cb0320c5225e13cedd49f3dabdc5331f' + size_bytes: 24810 + source: 'python3-netplan_1.2-1ubuntu5.1_amd64.deb' + pinned_in: [] + - package: 'python3-oauthlib' + version: '3.3.1-1build1' + architecture: 'all' + sha256: '55ecdecf703c95993ae9e31579bd8fe03ba3dee7648afdec31e88f457f506ab9' + size_bytes: 93656 + source: 'python3-oauthlib_3.3.1-1build1_all.deb' + pinned_in: [] + - package: 'python3-olefile' + version: '0.47-1build1' + architecture: 'all' + sha256: '0253e3bc965d6c622795f3cd241fd214170bc1a59a2077eb64b4fa63f77e510c' + size_bytes: 37248 + source: 'python3-olefile_0.47-1build1_all.deb' + pinned_in: [] + - package: 'python3-passlib' + version: '1.9.3-1ubuntu1' + architecture: 'all' + sha256: 'aa9de2e4f8240e51d4c2ed301338caa6844363b1ac0ea15616db1d1e4fd70a76' + size_bytes: 536520 + source: 'python3-passlib_1.9.3-1ubuntu1_all.deb' + pinned_in: [] + - package: 'python3-pexpect' + version: '4.9-4' + architecture: 'all' + sha256: '882349bec3cdc45b8db110baadb4ab71152577cfa2714f45670f0c8026006588' + size_bytes: 48350 + source: 'python3-pexpect_4.9-4_all.deb' + pinned_in: [] + - package: 'python3-pil' + version: '12.1.1-2ubuntu1.3' + architecture: 'amd64' + sha256: '0e33c688dbe2842ed401b7bc7ef901fb1bc41c117825d50a06f5d88fcc4534f0' + size_bytes: 488496 + source: 'python3-pil_12.1.1-2ubuntu1.3_amd64.deb' + pinned_in: [] + - package: 'python3-pkg-resources' + version: '78.1.1-0.1build1' + architecture: 'all' + sha256: '766b8dbdb1c8eab99a03f8a3717038c874344e801d5aae99fb1f546f11a6d0a1' + size_bytes: 144256 + source: 'python3-pkg-resources_78.1.1-0.1build1_all.deb' + pinned_in: [] + - package: 'python3-problem-report' + version: '2.34.1-0ubuntu0.1' + architecture: 'all' + sha256: '54ac0d4bb7bbab4a460c1113437922d90fa3e47927d9fb675fd0f43ca2fbb814' + size_bytes: 17404 + source: 'python3-problem-report_2.34.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'python3-prometheus-client' + version: '0.21.1+ds1-1build1' + architecture: 'all' + sha256: '4719a6da616cd27b23a06dff86a3a6d2923e09a2c6bfa4b7af30c68e5810fe59' + size_bytes: 46012 + source: 'python3-prometheus-client_0.21.1+ds1-1build1_all.deb' + pinned_in: [] + - package: 'python3-psutil' + version: '7.1.0-1ubuntu1' + architecture: 'amd64' + sha256: 'e32074ff3ab5dd5ba76fad23867ff73fbe11953a28614a11adea96e9721e1d16' + size_bytes: 190812 + source: 'python3-psutil_7.1.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'python3-ptyprocess' + version: '0.7.0-6build1' + architecture: 'all' + sha256: 'cb9e6bf2015a53e6512670d5a5b0b1597e7243d7a80cf4e795cccded51b48b2a' + size_bytes: 14964 + source: 'python3-ptyprocess_0.7.0-6build1_all.deb' + pinned_in: [] + - package: 'python3-pygments' + version: '2.19.2+dfsg-1' + architecture: 'all' + sha256: '04752577e04f168907da62beb805286c5781febe089359030676d729bea7dd2e' + size_bytes: 843366 + source: 'python3-pygments_2.19.2+dfsg-1_all.deb' + pinned_in: [] + - package: 'python3-pyparsing' + version: '3.3.2-2' + architecture: 'all' + sha256: '17a8fadfaf4fd4608e4559863de48aa7be64dfb6a7c48c7386337b92d2412e84' + size_bytes: 98588 + source: 'python3-pyparsing_3.3.2-2_all.deb' + pinned_in: [] + - package: 'python3-referencing' + version: '0.36.2-1ubuntu2' + architecture: 'all' + sha256: 'c3388fd31aa4c9c8c84baf62ada45b01ec33548e56c69707c98d95c7853582be' + size_bytes: 22244 + source: 'python3-referencing_0.36.2-1ubuntu2_all.deb' + pinned_in: [] + - package: 'python3-requests' + version: '2.32.5+dfsg-1ubuntu1' + architecture: 'all' + sha256: '9c7aa89bdfa0a57289a59ad4a7f16465dca265d7c5601f680e33f5264db9c3d0' + size_bytes: 53138 + source: 'python3-requests_2.32.5+dfsg-1ubuntu1_all.deb' + pinned_in: [] + - package: 'python3-rich' + version: '13.9.4-1.2' + architecture: 'all' + sha256: '5bf416727be0d0f9120f3241502525e22f600a92fd7c5d6ccf1192a3afdf3d87' + size_bytes: 190412 + source: 'python3-rich_13.9.4-1.2_all.deb' + pinned_in: [] + - package: 'python3-rpds-py' + version: '0.27.1-2ubuntu3' + architecture: 'amd64' + sha256: '5ee2a2330885fb73754eaa3325873937877bf1a67a3b2e56d627a4ade3905be9' + size_bytes: 281344 + source: 'python3-rpds-py_0.27.1-2ubuntu3_amd64.deb' + pinned_in: [] + - package: 'python3-serial' + version: '3.5-2build1' + architecture: 'all' + sha256: '81def9a464776c50d88a270c709adb7b136195a62fcca4b962d3355c92c5097f' + size_bytes: 78850 + source: 'python3-serial_3.5-2build1_all.deb' + pinned_in: [] + - package: 'python3-setproctitle' + version: '1.3.7-2build1' + architecture: 'amd64' + sha256: '43f3a83f9b804ba4b5508bccbbe30b7f9cbe6bf9ada8140ca8e37ad272d2f573' + size_bytes: 18890 + source: 'python3-setproctitle_1.3.7-2build1_amd64.deb' + pinned_in: [] + - package: 'python3-setuptools' + version: '78.1.1-0.1build1' + architecture: 'all' + sha256: '7dbe7963bacc589b5f3d48dbad14fb3815cf097b1173cde207c0d91268bc83cc' + size_bytes: 661184 + source: 'python3-setuptools_78.1.1-0.1build1_all.deb' + pinned_in: [] + - package: 'python3-software-properties' + version: '0.120.1' + architecture: 'all' + sha256: '6660ceeaaeb22df70dc2895f3ce1708d03eb28af013e812b15f4b83f2de0b3e8' + size_bytes: 28740 + source: 'python3-software-properties_0.120.1_all.deb' + pinned_in: [] + - package: 'python3-speechd' + version: '0.12.1-2ubuntu1' + architecture: 'all' + sha256: 'c811605eeaafa03f8f5577cffa4f15a6bc26d01d95a6f44ca851a22f0eba8524' + size_bytes: 46232 + source: 'python3-speechd_0.12.1-2ubuntu1_all.deb' + pinned_in: [] + - package: 'python3-sss' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '8020a5a8f769bd1516daa373cdd6c6786fe6abd8b935ae1d7c8914b9edca901d' + size_bytes: 44032 + source: 'python3-sss_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'python3-systemd' + version: '235-1build9' + architecture: 'amd64' + sha256: 'e42f6958ed288ccf13e8a91a3c4303d1c1a4a14a92a77473678e88adb58f85d7' + size_bytes: 43622 + source: 'python3-systemd_235-1build9_amd64.deb' + pinned_in: [] + - package: 'python3-tk' + version: '3.14.3-0ubuntu2' + architecture: 'amd64' + sha256: '8178789dc8142a23b3d91117b72d46faf26aec85585225034ceb86c7d9064905' + size_bytes: 8764 + source: 'python3-tk_3.14.3-0ubuntu2_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'python3-typeguard' + version: '4.4.4-2' + architecture: 'all' + sha256: 'e542a6394e75b2195df733a26dfd7e34621d696aab076649d60b7256b7574af3' + size_bytes: 28914 + source: 'python3-typeguard_4.4.4-2_all.deb' + pinned_in: [] + - package: 'python3-typing-extensions' + version: '4.15.0-2' + architecture: 'all' + sha256: 'a1698f372c57b8ff7960368db30ffd56828e172f64bf515799d75e4eb7691018' + size_bytes: 84160 + source: 'python3-typing-extensions_4.15.0-2_all.deb' + pinned_in: [] + - package: 'python3-uc-micro' + version: '1.0.3-1build1' + architecture: 'all' + sha256: '85f08cfc3417fe29a2334aa6bc85d39eb5a97aa6d076ddd6434aa51f16b24980' + size_bytes: 5702 + source: 'python3-uc-micro_1.0.3-1build1_all.deb' + pinned_in: [] + - package: 'python3-update-manager' + version: '1:26.04.5' + architecture: 'all' + sha256: 'c976d09006041316d01d44987005be753308852a0696220d39c88c90aac48db9' + size_bytes: 40758 + source: 'python3-update-manager_1%3a26.04.5_all.deb' + pinned_in: [] + - package: 'python3-urllib3' + version: '2.6.3-1ubuntu1.1' + architecture: 'all' + sha256: 'fb51c1a32334c96dc72df6768ffe8848ba7a3f22be271e822d384077b78817e5' + size_bytes: 96704 + source: 'python3-urllib3_2.6.3-1ubuntu1.1_all.deb' + pinned_in: [] + - package: 'python3-wadllib' + version: '2.0.0-3' + architecture: 'all' + sha256: '3ce47762fa78c9cfd36ab348bcf4ad6d63eaac821828d3ebc3fb214b41ba534d' + size_bytes: 36320 + source: 'python3-wadllib_2.0.0-3_all.deb' + pinned_in: [] + - package: 'python3-xdg' + version: '0.28-3' + architecture: 'all' + sha256: '3398d0bb193d7ebedf907f43a008346722e0c6d2c3c138cb3dc17080be878e70' + size_bytes: 37348 + source: 'python3-xdg_0.28-3_all.deb' + pinned_in: [] + - package: 'python3-xkit' + version: '0.5.0ubuntu8' + architecture: 'all' + sha256: '0ddef9ad0812d3b30dc502c08688960f064b50ea1470c5107a11a76c6a22ee88' + size_bytes: 17842 + source: 'python3-xkit_0.5.0ubuntu8_all.deb' + pinned_in: [] + - package: 'python3-yaml' + version: '6.0.3-1build1' + architecture: 'amd64' + sha256: '77271ce1fc2470f8b6b436f40fe55dd014d307f582d552209cac756f7f1b1a25' + size_bytes: 136956 + source: 'python3-yaml_6.0.3-1build1_amd64.deb' + pinned_in: [] + - package: 'python3-zipp' + version: '3.23.0-1build1' + architecture: 'all' + sha256: '2a99b7c109d679a0347f620a52323fc0a2c32c281ed12cba2116370653ed802a' + size_bytes: 10370 + source: 'python3-zipp_3.23.0-1build1_all.deb' + pinned_in: [] + - package: 'python3.14' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: '780c308c47d8afcbb7d339f0023350e7cf60c1a37e9572a1f88774cc18f60526' + size_bytes: 830272 + source: 'python3.14_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'python3.14-minimal' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: '0a7ea8a52834f9b3de0f11758924f80f7a6ebcbb4b02a55ba4f457503569f55f' + size_bytes: 2579044 + source: 'python3.14-minimal_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: [] + - package: 'python3.14-tk' + version: '3.14.4-1ubuntu0.2' + architecture: 'amd64' + sha256: '7dbd69bdfebb4eb433ad7ea3429349f6ac86f5dab8fde65770e3aea4ec822a2e' + size_bytes: 104576 + source: 'python3.14-tk_3.14.4-1ubuntu0.2_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'readline-common' + version: '8.3-4' + architecture: 'all' + sha256: '53cdc5a963bbdda938f8996496a5e78bcf484e6e41a2ef2c0f8cf566808f71f5' + size_bytes: 61514 + source: 'readline-common_8.3-4_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'resources' + version: '1.10.2-0ubuntu3.1' + architecture: 'amd64' + sha256: 'f240bdfa5e81f521751951e093c85228618475e875383f38f81db0b4505d12d9' + size_bytes: 1937762 + source: 'resources_1.10.2-0ubuntu3.1_amd64.deb' + pinned_in: [] + - package: 'rfkill' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: '90ae767c528c3d98c2598ab6d7dfc34217bbf83555bad3642c5e070397517679' + size_bytes: 34218 + source: 'rfkill_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'rtkit' + version: '0.14-1' + architecture: 'amd64' + sha256: '87025d92fff2cda675b6b97a3003f7a1405a1226c0ef066a5edb7579660238d0' + size_bytes: 37690 + source: 'rtkit_0.14-1_amd64.deb' + pinned_in: [] + - package: 'rustdesk' + version: '1.4.9' + architecture: 'amd64' + sha256: '7244ba47c40e804172044bfbe659467c54ce46554c98e78c8c0406f1d612fda3' + size_bytes: 23375776 + source: 'rustdesk-1.4.9-x86_64.deb' + pinned_in: ['remote-access.txt'] + - package: 'rygel' + version: '45.0-1ubuntu1' + architecture: 'amd64' + sha256: 'c83e62815a97aac8b8818d56cb676d53ff6c21de975ffc07de02143e6aa2f06a' + size_bytes: 329708 + source: 'rygel_45.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'samba-libs' + version: '2:4.23.6+dfsg-1ubuntu2.2' + architecture: 'amd64' + sha256: 'b76c628d7198bcdbb06cdd562f0264bf9482b35f95593296e02b570a188f99e9' + size_bytes: 6648704 + source: 'samba-libs_2%3a4.23.6+dfsg-1ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'sane-airscan' + version: '0.99.36-2ubuntu1' + architecture: 'amd64' + sha256: '9468b214636c1289d9f462abe6ca270e49dc18af28b42e776cf12970b29b699d' + size_bytes: 148166 + source: 'sane-airscan_0.99.36-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'sane-utils' + version: '1.4.0-1ubuntu1' + architecture: 'amd64' + sha256: '463d4c1cf4b3d40711b42b7c0151da612bf1d1629eb04f4fefad0d824f9e65a8' + size_bytes: 204344 + source: 'sane-utils_1.4.0-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'sbsigntool' + version: '0.9.4-3.1ubuntu9' + architecture: 'amd64' + sha256: 'e8709091cc42e0053ef3736d03e7c4afcd1798424bbb04e41199e95ce2c3766e' + size_bytes: 52296 + source: 'sbsigntool_0.9.4-3.1ubuntu9_amd64.deb' + pinned_in: [] + - package: 'screen' + version: '4.9.1-3ubuntu2' + architecture: 'amd64' + sha256: '768d0adef7c8b9f5a1e690333a7a07e9e58b67b4d85dca0ef4119d989a03b91e' + size_bytes: 648710 + source: 'screen_4.9.1-3ubuntu2_amd64.deb' + pinned_in: [] + - package: 'seahorse' + version: '47.0.1-3build1' + architecture: 'amd64' + sha256: '5c50947a81a292c000d9aa2f711378b3a9278ac14e5e70a0c53237fda6dfc4a2' + size_bytes: 413634 + source: 'seahorse_47.0.1-3build1_amd64.deb' + pinned_in: [] + - package: 'secureboot-db' + version: '1.9build2' + architecture: 'amd64' + sha256: 'e358f9d86ca91d71d44cc97ff63033547746657948e68721ce90c5c347d24390' + size_bytes: 19062 + source: 'secureboot-db_1.9build2_amd64.deb' + pinned_in: [] + - package: 'sgml-base' + version: '1.31+nmu1build1' + architecture: 'all' + sha256: '9ef16e373319feb10fa112eec5d906b302cd2c7b870af231f347d96d8db549e8' + size_bytes: 11158 + source: 'sgml-base_1.31+nmu1build1_all.deb' + pinned_in: [] + - package: 'sgml-data' + version: '2.0.11+nmu1build1' + architecture: 'all' + sha256: '27ed22901a5d7c0e9bc486eed538745b7e672f7d6efa20d75bc0280089200894' + size_bytes: 176660 + source: 'sgml-data_2.0.11+nmu1build1_all.deb' + pinned_in: [] + - package: 'shared-mime-info' + version: '2.4-5build3' + architecture: 'amd64' + sha256: 'da2eb52074c56dc60f6e446166ad799baa9a53e619971debd033e99ed37f158f' + size_bytes: 476082 + source: 'shared-mime-info_2.4-5build3_amd64.deb' + pinned_in: [] + - package: 'smartmontools' + version: '7.5-2' + architecture: 'amd64' + sha256: 'ab211f171a9595f6b9686caaec44ca07a623c4605923caae756e2446e055e0ff' + size_bytes: 664482 + source: 'smartmontools_7.5-2_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'snapd' + version: '2.76.3+ubuntu26.04' + architecture: 'amd64' + sha256: '1e3a926f32da79884ab05ee65363e8968cfcfe9df5839fd40da80f9f49756c97' + size_bytes: 42585780 + source: 'snapd_2.76.3+ubuntu26.04_amd64.deb' + pinned_in: [] + - package: 'software-properties-common' + version: '0.120.1' + architecture: 'all' + sha256: '4eeb906a718dc3e708aa50821e35be1ec7d9584c33e88fc1fadb53bed9c1d7f2' + size_bytes: 16556 + source: 'software-properties-common_0.120.1_all.deb' + pinned_in: [] + - package: 'sound-icons' + version: '0.1-8build1' + architecture: 'all' + sha256: '8b9d5d8955b7ab82a4edc81fbecd6c0a7ade43ce1b6244e18ad1e4b2ecac62be' + size_bytes: 517138 + source: 'sound-icons_0.1-8build1_all.deb' + pinned_in: [] + - package: 'sound-theme-freedesktop' + version: '0.8-7build1' + architecture: 'all' + sha256: '17eab7b1c0dad976da5873d98792af0df10b1e2c702404fc11ceb151053f3163' + size_bytes: 384340 + source: 'sound-theme-freedesktop_0.8-7build1_all.deb' + pinned_in: [] + - package: 'speech-dispatcher' + version: '0.12.1-2ubuntu1' + architecture: 'amd64' + sha256: 'f8300fd793a251968e7e7d98b5adc7e8365ca320cb8bd39a465142ffa6b78785' + size_bytes: 4232308 + source: 'speech-dispatcher_0.12.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'speech-dispatcher-audio-plugins' + version: '0.12.1-2ubuntu1' + architecture: 'amd64' + sha256: 'f4a6125d8c9936e2619c8bbf0456b5623e09ea996cd2b940fda2473ee7eba520' + size_bytes: 38290 + source: 'speech-dispatcher-audio-plugins_0.12.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'speech-dispatcher-espeak-ng' + version: '0.12.1-2ubuntu1' + architecture: 'amd64' + sha256: '51e4e03ba24dad5becd5bbd93cb61d5895df30d43f27ea5482c9ad311125b46a' + size_bytes: 24202 + source: 'speech-dispatcher-espeak-ng_0.12.1-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'spice-vdagent' + version: '0.23.0-1ubuntu0.1' + architecture: 'amd64' + sha256: 'aef0367f5c63482814a912f7bdfc544cd877900a7353b22fc32dc90fe6e63af0' + size_bytes: 65992 + source: 'spice-vdagent_0.23.0-1ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'squashfs-tools' + version: '1:4.7.5-1' + architecture: 'amd64' + sha256: '3d4bf31f24105c4cc44da6b69ec130ed1784236059185f6d85bdd592c37a7bca' + size_bytes: 228228 + source: 'squashfs-tools_1%3a4.7.5-1_amd64.deb' + pinned_in: [] + - package: 'ssh-import-id' + version: '5.11-0ubuntu4' + architecture: 'all' + sha256: '901e1f40654bf083c1eabb7b09baec0fcc3fe23bcc6cdc07f7af99015d254029' + size_bytes: 10244 + source: 'ssh-import-id_5.11-0ubuntu4_all.deb' + pinned_in: [] + - package: 'ssl-cert' + version: '1.1.3ubuntu2' + architecture: 'all' + sha256: '4c59f4b329dcf63b73af41a9e686c944c4b03a6da36a4f4d8a864a935495e61c' + size_bytes: 18760 + source: 'ssl-cert_1.1.3ubuntu2_all.deb' + pinned_in: [] + - package: 'sssd' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'd7ab2be5dd0978128e4d9f468bfa32ef46340ab89a26b102c52dbd9201365a5c' + size_bytes: 4062 + source: 'sssd_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-ad' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'b2e0c77a820221659e4168c9230460266ad42932e76044fa8f970a7627ececfd' + size_bytes: 133168 + source: 'sssd-ad_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-ad-common' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '498bfac27403518a91aea7a1cb629d35559c82116eebb5709d0f9771154a6f18' + size_bytes: 73146 + source: 'sssd-ad-common_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-common' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '3b2a046b8fb2fde70f68cfb484544b78e260ec74a1f12e721b287dec59bf2096' + size_bytes: 1137678 + source: 'sssd-common_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-ipa' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '116181ce0f43e363b77f6ac4a8c6432cdb3415139449b10a79a614c54ec71d0d' + size_bytes: 223288 + source: 'sssd-ipa_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-krb5' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '000596df2b1c64496d2f69facad09bc791236f653f6cb306e786b859f17ca1f8' + size_bytes: 14518 + source: 'sssd-krb5_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-krb5-common' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'bf510ceabec0f137fc12324b681b864d102732fd14ac65a73ef10f01c5f2c125' + size_bytes: 92940 + source: 'sssd-krb5-common_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-ldap' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: 'dc859f033537ff462b983bfea5ca27d0eea9f191d4fdb5db81b1dcadf5c398cc' + size_bytes: 32010 + source: 'sssd-ldap_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'sssd-proxy' + version: '2.12.0-1ubuntu5.4' + architecture: 'amd64' + sha256: '2e9bd733a21cdc21383afaa529824600f4f5ff04f47c5675ca8fa2beef7348ed' + size_bytes: 44858 + source: 'sssd-proxy_2.12.0-1ubuntu5.4_amd64.deb' + pinned_in: [] + - package: 'switcheroo-control' + version: '3.0-2' + architecture: 'amd64' + sha256: '7ec5e18c8b933a32db8a8f74749f42b9afec36bbbfaa8f00512dc15c09284647' + size_bytes: 20756 + source: 'switcheroo-control_3.0-2_amd64.deb' + pinned_in: [] + - package: 'sysprof' + version: '50.0-1' + architecture: 'amd64' + sha256: 'cf540d381dd24719c1107640dfce53c10cb9292607634028734a2d924f69ac56' + size_bytes: 548626 + source: 'sysprof_50.0-1_amd64.deb' + pinned_in: [] + - package: 'system-config-printer-common' + version: '1.5.18-4ubuntu2' + architecture: 'all' + sha256: '2214c686d038a0e444e869f08f112571673f78c115d07c5133e530886b220e24' + size_bytes: 108846 + source: 'system-config-printer-common_1.5.18-4ubuntu2_all.deb' + pinned_in: [] + - package: 'system-config-printer-udev' + version: '1.5.18-4ubuntu2' + architecture: 'amd64' + sha256: '6214416b12a740564317736bb2e011cc10555a019b11821afcf1d5b1dffefd17' + size_bytes: 21560 + source: 'system-config-printer-udev_1.5.18-4ubuntu2_amd64.deb' + pinned_in: [] + - package: 'systemd' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '1b2eca56c5cfdbc1aca78591a68f94b7e1c996abd52095587069776b816b9dca' + size_bytes: 3128676 + source: 'systemd_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'systemd-cryptsetup' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '1e276f5437760fa5720b878b6af373e0692412671537dd8ba31e30208aff3ab8' + size_bytes: 124294 + source: 'systemd-cryptsetup_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'systemd-hwe-hwdb' + version: '259.5.3ubuntu' + architecture: 'all' + sha256: 'd51cf1f5ac54db201f097770dbb7f1523c210b292a8c1d6432ce9f4b9c2a1950' + size_bytes: 3384 + source: 'systemd-hwe-hwdb_259.5.3ubuntu_all.deb' + pinned_in: [] + - package: 'systemd-oomd' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '40553c30101bd43ce53c8e6b66d2880b18a1e1a8acecca4846238ed7150f0ca8' + size_bytes: 40516 + source: 'systemd-oomd_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'systemd-resolved' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '99f133977b1d262c8344cd88acb10eaaa091e95370693aee162560476760cb9e' + size_bytes: 298578 + source: 'systemd-resolved_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'systemd-sysv' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: '2c76e690808c26fbc3bdbfe47d760ba50e7dcb0a821eded3d00412117ae0516e' + size_bytes: 9250 + source: 'systemd-sysv_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'systemd-timesyncd' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: 'ba2ba9b29cfa5d854e822dd793d1258c58f3f5a384c8ba2c4ccf9556fdb0cee4' + size_bytes: 41200 + source: 'systemd-timesyncd_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'tcl' + version: '8.6.16build1' + architecture: 'amd64' + sha256: 'c5079db96e5422efe2430f65c18cb71decc5cdd83d541bacd4961f00ad8ba3d9' + size_bytes: 4200 + source: 'tcl_8.6.16build1_amd64.deb' + pinned_in: [] + - package: 'tcl8.6' + version: '8.6.17+dfsg-1build1' + architecture: 'amd64' + sha256: 'd934d87e4aa94d72c9034785bdb77a8d0c65de8bfcaea3082246ac854c59359a' + size_bytes: 14872 + source: 'tcl8.6_8.6.17+dfsg-1build1_amd64.deb' + pinned_in: [] + - package: 'tecla' + version: '49.0-2' + architecture: 'amd64' + sha256: '74da21fe0e704c1c3f3f126adf2f51c03612afff56bcd5f64bc5f678a8325a02' + size_bytes: 28180 + source: 'tecla_49.0-2_amd64.deb' + pinned_in: [] + - package: 'tinysparql' + version: '3.11.0-1' + architecture: 'amd64' + sha256: '19b2cf9435ce158226fad6f9a8ec9f7fcb27f2a720f6dfc59e9381755a02fea7' + size_bytes: 431222 + source: 'tinysparql_3.11.0-1_amd64.deb' + pinned_in: [] + - package: 'tpm-udev' + version: '4.1.3-6' + architecture: 'all' + sha256: '39ff45ec97f71566f8a258aea43121bfa64819a976816e3377e4579c632cdd16' + size_bytes: 7908 + source: 'tpm-udev_4.1.3-6_all.deb' + pinned_in: [] + - package: 'tzdata' + version: '2026c-0ubuntu0.26.04.1' + architecture: 'all' + sha256: 'd1b10c964c53344b2b99d093bd437391460eec9a872961c2beb256d64a8c5bbf' + size_bytes: 193008 + source: 'tzdata_2026c-0ubuntu0.26.04.1_all.deb' + pinned_in: [] + - package: 'ubuntu-advantage-desktop-daemon' + version: '1.13build1' + architecture: 'amd64' + sha256: 'e1296d91ea57d987c178c85d348bbb8cc5b417016a9a2c0c2f909e487af77659' + size_bytes: 22232 + source: 'ubuntu-advantage-desktop-daemon_1.13build1_amd64.deb' + pinned_in: [] + - package: 'ubuntu-desktop-minimal' + version: '1.570.3' + architecture: 'amd64' + sha256: 'fba2c0b58d1a82f7137368166c61c8b77ffdf14c6d4a94184f76c84860bece46' + size_bytes: 9402 + source: 'ubuntu-desktop-minimal_1.570.3_amd64.deb' + pinned_in: ['remote-access.txt'] + - package: 'ubuntu-docs' + version: '26.04.1' + architecture: 'all' + sha256: '763f4cc37ca81a034d73ce4ba1649ea6f0f70ef4c36ac9cecd1a50dea2d15454' + size_bytes: 220192 + source: 'ubuntu-docs_26.04.1_all.deb' + pinned_in: [] + - package: 'ubuntu-drivers-common' + version: '1:0.10.9' + architecture: 'amd64' + sha256: 'f9ebd255473f18f1172cf5fe04ed91a899cef0be8ba4a09e9b7d8d36dbc3c9e6' + size_bytes: 65114 + source: 'ubuntu-drivers-common_1%3a0.10.9_amd64.deb' + pinned_in: [] + - package: 'ubuntu-insights' + version: '0.9.3ubuntu' + architecture: 'amd64' + sha256: '9930fd641b97dfac1acae039788c34dbd7cb09b2cfc3b2e29f93f69cbfbf1b57' + size_bytes: 3030088 + source: 'ubuntu-insights_0.9.3ubuntu_amd64.deb' + pinned_in: [] + - package: 'ubuntu-pro-client' + version: '37.2ubuntu0.1' + architecture: 'amd64' + sha256: 'e494e7aa2973c94baf44f066a78dbe382f4efe56af8ae61e7c7b4dcbf0f9c603' + size_bytes: 242864 + source: 'ubuntu-pro-client_37.2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'ubuntu-pro-client-l10n' + version: '37.2ubuntu0.1' + architecture: 'amd64' + sha256: 'c3e8c92c3be76d4d0935f89fa02819b56c30f986be6e2a09b477b96e2bcec8a1' + size_bytes: 19768 + source: 'ubuntu-pro-client-l10n_37.2ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'ubuntu-release-upgrader-core' + version: '1:26.04.23' + architecture: 'all' + sha256: 'b99d3e734ce409d6bfca619fc72c48f1b3959fd1699aa54f5e4ce074a32e652a' + size_bytes: 24890 + source: 'ubuntu-release-upgrader-core_1%3a26.04.23_all.deb' + pinned_in: [] + - package: 'ubuntu-release-upgrader-gtk' + version: '1:26.04.23' + architecture: 'all' + sha256: '08c232cdff46f5733e8b9a403b7b8f12f9df44830ed6b220d7e376cce0655f1a' + size_bytes: 9050 + source: 'ubuntu-release-upgrader-gtk_1%3a26.04.23_all.deb' + pinned_in: [] + - package: 'ubuntu-report' + version: '1.7.3ubuntu4' + architecture: 'amd64' + sha256: 'c1f2ab8fb24f4fb4279895f971cb45a2843b3fe719a8f53fa139433a7f70340f' + size_bytes: 2879722 + source: 'ubuntu-report_1.7.3ubuntu4_amd64.deb' + pinned_in: [] + - package: 'ubuntu-session' + version: '50.1-0ubuntu0.1' + architecture: 'all' + sha256: '3ff88b755bb2dd2d9944c6a5613adc840444db166057a0880b803a0d76203c96' + size_bytes: 3758 + source: 'ubuntu-session_50.1-0ubuntu0.1_all.deb' + pinned_in: [] + - package: 'ubuntu-settings' + version: '26.04.6' + architecture: 'all' + sha256: 'c7f84378b9b7ec3bbb4ba6e1b1d6b3829bc6861ac64d35fb2b715dc8e8397adb' + size_bytes: 92228 + source: 'ubuntu-settings_26.04.6_all.deb' + pinned_in: [] + - package: 'ubuntu-wallpapers' + version: '26.04.2' + architecture: 'all' + sha256: 'd7f7acea3bb3dcd547a4be8aa5515b63c9e2a66e110d7a52ea98323f9c14b68e' + size_bytes: 8858352 + source: 'ubuntu-wallpapers_26.04.2_all.deb' + pinned_in: [] + - package: 'ubuntu-wallpapers-resolute' + version: '26.04.2' + architecture: 'all' + sha256: 'f0af7ff4a3fd5bc3b63885bfa14ed9c3ba320dc9a4fa948f9c506b715a59df88' + size_bytes: 56333376 + source: 'ubuntu-wallpapers-resolute_26.04.2_all.deb' + pinned_in: [] + - package: 'ucf' + version: '3.0052ubuntu1' + architecture: 'all' + sha256: '42354d322fda598511b62288123e8b4b6daf6b7bbb268d68e8e7f88efa498305' + size_bytes: 44280 + source: 'ucf_3.0052ubuntu1_all.deb' + pinned_in: [] + - package: 'udev' + version: '259.5-0ubuntu3.4' + architecture: 'amd64' + sha256: 'b4de0a05d8cd58e5de0ebb7a5c73784dda6a61df2fe5129affa7e4a5aef282ad' + size_bytes: 1500726 + source: 'udev_259.5-0ubuntu3.4_amd64.deb' + pinned_in: [] + - package: 'udisks2' + version: '2.10.91-1ubuntu2.1' + architecture: 'amd64' + sha256: 'c78dcfa3503993bccf0dbf401e90483e57c42f72d29ca1e4743b006626169ac4' + size_bytes: 308322 + source: 'udisks2_2.10.91-1ubuntu2.1_amd64.deb' + pinned_in: [] + - package: 'ufw' + version: '0.36.2-9build1' + architecture: 'all' + sha256: '3ece5b2e7a678f5be9678643dc5f8f8457becceec32e863ad1ada1a33e2160b4' + size_bytes: 169538 + source: 'ufw_0.36.2-9build1_all.deb' + pinned_in: ['base-packages.txt'] + - package: 'unattended-upgrades' + version: '2.12ubuntu9' + architecture: 'all' + sha256: '129682f0176cbeabba735f550cb64bdfbcd9c99f4d2377c247f8235ccfe0b4af' + size_bytes: 53334 + source: 'unattended-upgrades_2.12ubuntu9_all.deb' + pinned_in: [] + - package: 'unzip' + version: '6.0-29ubuntu1' + architecture: 'amd64' + sha256: '1f6f2bdcde84641e89c9367a7a99d90e990efa3e487a8d625241c2f9c55db5f4' + size_bytes: 179964 + source: 'unzip_6.0-29ubuntu1_amd64.deb' + pinned_in: [] + - package: 'update-inetd' + version: '4.54build1' + architecture: 'all' + sha256: '1185e6269f6976177e9e1f42a3adc6d8b34ddeaed5b512e06bade8336f8b3c77' + size_bytes: 23016 + source: 'update-inetd_4.54build1_all.deb' + pinned_in: [] + - package: 'update-manager' + version: '1:26.04.5' + architecture: 'all' + sha256: 'abab86378fd38e086791c47fd0de4eee5fb27aa08fb5d5b195561306d276a199' + size_bytes: 554138 + source: 'update-manager_1%3a26.04.5_all.deb' + pinned_in: [] + - package: 'update-manager-core' + version: '1:26.04.5' + architecture: 'all' + sha256: '8113cd178a707fdd6a10b41c624f868760806c74a55b6d2058a1962e7f6b21ad' + size_bytes: 11592 + source: 'update-manager-core_1%3a26.04.5_all.deb' + pinned_in: [] + - package: 'update-notifier' + version: '3.207.2' + architecture: 'amd64' + sha256: '8d40ec225bdb8eceee40b73e796cb2d5f599e3e1710391b2ea4df6894b14dbec' + size_bytes: 60796 + source: 'update-notifier_3.207.2_amd64.deb' + pinned_in: [] + - package: 'update-notifier-common' + version: '3.207.2' + architecture: 'all' + sha256: '26628c4c2ad0da034ebf029e9684940e4dbee00f74ed2a0518183a0d2a54c0c9' + size_bytes: 211926 + source: 'update-notifier-common_3.207.2_all.deb' + pinned_in: [] + - package: 'upower' + version: '1.91.1-1' + architecture: 'amd64' + sha256: '53e1a42d63b592355ebaf1566de37d1c7358e1065aaef8030015cb28ebbe9b81' + size_bytes: 101024 + source: 'upower_1.91.1-1_amd64.deb' + pinned_in: [] + - package: 'usb-modeswitch' + version: '2.6.2-1ubuntu1' + architecture: 'amd64' + sha256: 'a6a8aead77c0524f1921220bc6b31a435ab80d554978209423383a770f315a3c' + size_bytes: 44222 + source: 'usb-modeswitch_2.6.2-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'usb-modeswitch-data' + version: '20191128-7build1' + architecture: 'all' + sha256: 'e7e454c369ca3d26de6f2911fa6f49e932ff47bf5563b45c50aadc72f45872ce' + size_bytes: 30420 + source: 'usb-modeswitch-data_20191128-7build1_all.deb' + pinned_in: [] + - package: 'usb.ids' + version: '2025.12.13-1' + architecture: 'all' + sha256: '3a5151b50b822e93a6636301b300b6d41ff57489f2c499f8f80ca30515bf010f' + size_bytes: 223744 + source: 'usb.ids_2025.12.13-1_all.deb' + pinned_in: [] + - package: 'usbmuxd' + version: '1.1.1-7' + architecture: 'amd64' + sha256: 'd0806534674c53d33f28a7cf01e1ef3e0b81d777c0e8cfe494942cd3b8b47b60' + size_bytes: 42060 + source: 'usbmuxd_1.1.1-7_amd64.deb' + pinned_in: [] + - package: 'usbutils' + version: '1:019-1' + architecture: 'amd64' + sha256: '2c5e1d731be948d1dba9e63ba04ba7b95394e43dad3ecd58738ec0cb8192b284' + size_bytes: 83944 + source: 'usbutils_1%3a019-1_amd64.deb' + pinned_in: [] + - package: 'user-session-migration' + version: '0.5.1' + architecture: 'amd64' + sha256: '29e293be756b80aba747d775473b342aeb2686191b90465ebff8187f9d665ff4' + size_bytes: 10718 + source: 'user-session-migration_0.5.1_amd64.deb' + pinned_in: [] + - package: 'uuid-runtime' + version: '2.41.3-3ubuntu2.2' + architecture: 'amd64' + sha256: '4badc1132e60f937c7c08024f8f70022a30a72b64c8fe7e8d35c3e85391a69ff' + size_bytes: 48512 + source: 'uuid-runtime_2.41.3-3ubuntu2.2_amd64.deb' + pinned_in: [] + - package: 'wamerican' + version: '2020.12.07-4build1' + architecture: 'all' + sha256: '69cb601ca0aa3a0750026a81d97b591431047a3823d785a5cc972235ecee69cc' + size_bytes: 242090 + source: 'wamerican_2020.12.07-4build1_all.deb' + pinned_in: [] + - package: 'webp-pixbuf-loader' + version: '0.2.7-3' + architecture: 'amd64' + sha256: '4d4c3d5d023aa157767c271172332f4e305cbc6dc8ba1506490784aa96f134b8' + size_bytes: 11532 + source: 'webp-pixbuf-loader_0.2.7-3_amd64.deb' + pinned_in: [] + - package: 'wget' + version: '1.25.0-2ubuntu4.4' + architecture: 'amd64' + sha256: '47f9cd72f1cf79865a128d101fbfb0fbf0db8606db318735078afab9af66be3b' + size_bytes: 352416 + source: 'wget_1.25.0-2ubuntu4.4_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'whoopsie' + version: '0.2.82ubuntu' + architecture: 'amd64' + sha256: '76399e507fde65ef34791939f5d154be72948dbc374d0e424c7850d92330cdc8' + size_bytes: 20270 + source: 'whoopsie_0.2.82ubuntu_amd64.deb' + pinned_in: [] + - package: 'whoopsie-preferences' + version: '23build4' + architecture: 'amd64' + sha256: 'dfe4b806b28ea42d90b99bf2b12f02d33e26078f0c2b86d6a72a1263af8c265b' + size_bytes: 8980 + source: 'whoopsie-preferences_23build4_amd64.deb' + pinned_in: [] + - package: 'wireguard-tools' + version: '1.0.20250521-1ubuntu1' + architecture: 'amd64' + sha256: 'e948f176ea0324252b7f07327becd1d5df14290ef4fafa392a9d41e96b0459c8' + size_bytes: 89628 + source: 'wireguard-tools_1.0.20250521-1ubuntu1_amd64.deb' + pinned_in: ['base-packages.txt'] + - package: 'wireless-regdb' + version: '2026.05.30-0ubuntu1~26.04.1' + architecture: 'all' + sha256: '09eb267396235ac61a902eca2631b4c16ee1436b853ecd271c5d0673dfe640be' + size_bytes: 7146 + source: 'wireless-regdb_2026.05.30-0ubuntu1~26.04.1_all.deb' + pinned_in: [] + - package: 'wireplumber' + version: '0.5.13-1ubuntu1' + architecture: 'amd64' + sha256: '8f7109279a58c132abc3656f8bd597de5c23bb622b4d9bb4f6fe6aec1a4e34dd' + size_bytes: 106574 + source: 'wireplumber_0.5.13-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'wpasupplicant' + version: '2:2.11-0ubuntu5' + architecture: 'amd64' + sha256: 'c64c5f1c9cb333cd766abdc4e8732404c65787f34228e841b6447376a3887a90' + size_bytes: 1573582 + source: 'wpasupplicant_2%3a2.11-0ubuntu5_amd64.deb' + pinned_in: [] + - package: 'wsdd' + version: '2:0.8-5ubuntu1' + architecture: 'all' + sha256: '9ef0c538ddcf878bfcb6f69a2c91c5984ed9370245bbf1f4432399667fcf833f' + size_bytes: 36112 + source: 'wsdd_2%3a0.8-5ubuntu1_all.deb' + pinned_in: [] + - package: 'x11-apps' + version: '7.7+11build4' + architecture: 'amd64' + sha256: 'f22231c5b84e61bf571bce721d91845ca2b3b92212d72aba0ba5aeac09d57422' + size_bytes: 718988 + source: 'x11-apps_7.7+11build4_amd64.deb' + pinned_in: [] + - package: 'x11-common' + version: '1:7.7+26ubuntu1' + architecture: 'all' + sha256: '60b7a5982b477e10b9f11e2278289135f79e9dc75a312575778b21a0a631bea5' + size_bytes: 22520 + source: 'x11-common_1%3a7.7+26ubuntu1_all.deb' + pinned_in: [] + - package: 'x11-session-utils' + version: '7.7+6build3' + architecture: 'amd64' + sha256: 'd7a87ca7049e25a984ceaef1bba526ce33e6df1930224423ec7479d9e25c054e' + size_bytes: 70014 + source: 'x11-session-utils_7.7+6build3_amd64.deb' + pinned_in: [] + - package: 'x11-utils' + version: '7.7+7build1' + architecture: 'amd64' + sha256: '3a0c0837b22aaa643a2e1d6eb509c0e3e2732b16c5eecd1b18d0885aaa17f973' + size_bytes: 191112 + source: 'x11-utils_7.7+7build1_amd64.deb' + pinned_in: [] + - package: 'x11-xkb-utils' + version: '7.7+9build1' + architecture: 'amd64' + sha256: 'f17d61317a9f0db99db7a2c7b81d462a35008c85089fb573d2175ed504f6157b' + size_bytes: 170262 + source: 'x11-xkb-utils_7.7+9build1_amd64.deb' + pinned_in: [] + - package: 'x11-xserver-utils' + version: '7.7+11build1' + architecture: 'amd64' + sha256: '5963dd34415a4b6e590c2cf4ce71c85dced09bce9fa58b8e4de88eb63fa7b2d1' + size_bytes: 170654 + source: 'x11-xserver-utils_7.7+11build1_amd64.deb' + pinned_in: [] + - package: 'xauth' + version: '1:1.1.2-1.1build1' + architecture: 'amd64' + sha256: '14c923bfbd465033fa755f3ec812c3482971982a7a5f466a042be1276dde50aa' + size_bytes: 25718 + source: 'xauth_1%3a1.1.2-1.1build1_amd64.deb' + pinned_in: [] + - package: 'xbitmaps' + version: '1.1.1-2.2build1' + architecture: 'all' + sha256: '672d1aa56dcb8aedb9baa2e5d35b68a0eaf70763d4bd890020d0dd0c6497be42' + size_bytes: 22258 + source: 'xbitmaps_1.1.1-2.2build1_all.deb' + pinned_in: [] + - package: 'xbrlapi' + version: '6.7-1ubuntu6' + architecture: 'amd64' + sha256: '36f0641e59e630ece728fab537efae5d50f6c8f55b79ddacbe957fcf961426db' + size_bytes: 87904 + source: 'xbrlapi_6.7-1ubuntu6_amd64.deb' + pinned_in: [] + - package: 'xcursor-themes' + version: '1.0.6-0ubuntu2' + architecture: 'all' + sha256: '2a68cc61f0f24922c3cf727d03f76d30db7723f68c6d3616732043306016bf2d' + size_bytes: 371884 + source: 'xcursor-themes_1.0.6-0ubuntu2_all.deb' + pinned_in: [] + - package: 'xcvt' + version: '0.1.3-1build1' + architecture: 'amd64' + sha256: 'a3114a86fdaf7fda89e941163e278f029187511175be19229175f95f8ee8ddf1' + size_bytes: 7082 + source: 'xcvt_0.1.3-1build1_amd64.deb' + pinned_in: [] + - package: 'xdg-dbus-proxy' + version: '0.1.7-1' + architecture: 'amd64' + sha256: 'd8643ee790c1b36fa3f98c239edad013b59755539358138a64fc77ac5669ca39' + size_bytes: 25966 + source: 'xdg-dbus-proxy_0.1.7-1_amd64.deb' + pinned_in: [] + - package: 'xdg-desktop-portal' + version: '1.21.1+ds-1ubuntu3' + architecture: 'amd64' + sha256: 'f43095459e2c9c8dad23686b8699c452510217f79b2c76c914028c89521d7b53' + size_bytes: 365602 + source: 'xdg-desktop-portal_1.21.1+ds-1ubuntu3_amd64.deb' + pinned_in: [] + - package: 'xdg-desktop-portal-gnome' + version: '50.0-0ubuntu1' + architecture: 'amd64' + sha256: 'f6aa16fe441072706f91470e8d3362a75b44acf387ebedb4660478316e6ed9aa' + size_bytes: 159610 + source: 'xdg-desktop-portal-gnome_50.0-0ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xdg-desktop-portal-gtk' + version: '1.15.3-2ubuntu1' + architecture: 'amd64' + sha256: '9b923cd46711ba3369ad07d99e71e1668e7a9ceef60475b0ac40c89bc083c6a4' + size_bytes: 81616 + source: 'xdg-desktop-portal-gtk_1.15.3-2ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xdg-terminal-exec' + version: '0.14.0-1ubuntu0.1' + architecture: 'all' + sha256: '4973e24dedb9508a1eecd025b764f9b04cb1753105dcc6703930b85906289866' + size_bytes: 23876 + source: 'xdg-terminal-exec_0.14.0-1ubuntu0.1_all.deb' + pinned_in: [] + - package: 'xdg-user-dirs' + version: '0.19-1' + architecture: 'amd64' + sha256: '6a582b915086aeb27a8ba6c4585fd9a350e1098b218c22447ccd5cc9a222b09b' + size_bytes: 19302 + source: 'xdg-user-dirs_0.19-1_amd64.deb' + pinned_in: [] + - package: 'xdg-user-dirs-gtk' + version: '0.16-1' + architecture: 'amd64' + sha256: '756647a58231a45b2d4112c00272ec079d66f58ce775990113c71df05f74d079' + size_bytes: 10850 + source: 'xdg-user-dirs-gtk_0.16-1_amd64.deb' + pinned_in: [] + - package: 'xdg-utils' + version: '1.2.1-2ubuntu2' + architecture: 'all' + sha256: 'ab0236062d2552e8c67763d9514e751900b0d64cf86c5df6e20f67cb2bd4789e' + size_bytes: 66076 + source: 'xdg-utils_1.2.1-2ubuntu2_all.deb' + pinned_in: [] + - package: 'xfonts-base' + version: '1:1.0.5+nmu1build1' + architecture: 'all' + sha256: 'eec889b51e1c8f8485015e3d0b18892656436cc41906d8bdb6f89a88e2c41375' + size_bytes: 5939824 + source: 'xfonts-base_1%3a1.0.5+nmu1build1_all.deb' + pinned_in: [] + - package: 'xfonts-encodings' + version: '1:1.0.5-0ubuntu3' + architecture: 'all' + sha256: '1d0610635e1fe757c8df0ec2c2cef511203c7e7bf81bbff332031c8bf87b1847' + size_bytes: 575772 + source: 'xfonts-encodings_1%3a1.0.5-0ubuntu3_all.deb' + pinned_in: [] + - package: 'xfonts-scalable' + version: '1:1.0.3-1.3build1' + architecture: 'all' + sha256: 'da5b0c9b9044f35517855bb655dbe3ad45a20ad4daff08f478c524ab81587844' + size_bytes: 303768 + source: 'xfonts-scalable_1%3a1.0.3-1.3build1_all.deb' + pinned_in: [] + - package: 'xfonts-utils' + version: '1:7.7+7build1' + architecture: 'amd64' + sha256: '97e8c7ce05e09ea5b766c99f4d77e20cb70db61396c2e83bb43715c6e2f0ac1e' + size_bytes: 97066 + source: 'xfonts-utils_1%3a7.7+7build1_amd64.deb' + pinned_in: [] + - package: 'xinit' + version: '1.4.2-1build1' + architecture: 'amd64' + sha256: '197b713ce497a06388dd52f01906a0f51baed770df0e36314f76bed11e343f9b' + size_bytes: 17508 + source: 'xinit_1.4.2-1build1_amd64.deb' + pinned_in: [] + - package: 'xinput' + version: '1.6.4-1build2' + architecture: 'amd64' + sha256: 'ac7510aceeef862279f4147afb00bc96f38183af488254aab2e12e502711d029' + size_bytes: 29070 + source: 'xinput_1.6.4-1build2_amd64.deb' + pinned_in: [] + - package: 'xkb-data' + version: '2.46-2' + architecture: 'all' + sha256: 'a24f82b33020836444593a7ffbed959458852e28cfe16de2ff95bcbdcfbdb2d3' + size_bytes: 392778 + source: 'xkb-data_2.46-2_all.deb' + pinned_in: [] + - package: 'xml-core' + version: '0.19build1' + architecture: 'all' + sha256: '402af4ddb2810ea931609fcfedce54fe9cdfdc95e4b33c48349df8f97fe4b6cb' + size_bytes: 20254 + source: 'xml-core_0.19build1_all.deb' + pinned_in: [] + - package: 'xorg' + version: '1:7.7+26ubuntu1' + architecture: 'amd64' + sha256: '234a602609d352a8dd25c048a4f4dcbbf49452283328cf3f07927394dff478ec' + size_bytes: 2876 + source: 'xorg_1%3a7.7+26ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xorg-docs-core' + version: '1:1.7.3-1' + architecture: 'all' + sha256: 'def68bc547a21de8d5dee36ccfba135b567528ec1ce6ac9d470766919276ac7a' + size_bytes: 41278 + source: 'xorg-docs-core_1%3a1.7.3-1_all.deb' + pinned_in: [] + - package: 'xorgxrdp' + version: '1:0.10.2-1build1' + architecture: 'amd64' + sha256: '137792c2204e44fcea1c80742d3804af098236677c6b586fff6c938894f289d4' + size_bytes: 69762 + source: 'xorgxrdp_1%3a0.10.2-1build1_amd64.deb' + pinned_in: ['remote-access.txt'] + - package: 'xrdp' + version: '0.10.1-4.1' + architecture: 'amd64' + sha256: 'c4b3688b0d839369f0b3c8faa4940597c5aa51d1573ab1d4ce63ccb53add82be' + size_bytes: 668968 + source: 'xrdp_0.10.1-4.1_amd64.deb' + pinned_in: ['remote-access.txt'] + - package: 'xserver-common' + version: '2:21.1.22-1ubuntu1' + architecture: 'all' + sha256: '9865ebf6555ba9d7fae0bd3b1e66610e3404aa66495cb00bdd1f1d162cc14483' + size_bytes: 29680 + source: 'xserver-common_2%3a21.1.22-1ubuntu1_all.deb' + pinned_in: [] + - package: 'xserver-xorg' + version: '1:7.7+26ubuntu1' + architecture: 'amd64' + sha256: '7f7b902f1560e4e71e24de1d80c39ed7f97558a5f805cd8b7c456f53470d2d9c' + size_bytes: 64454 + source: 'xserver-xorg_1%3a7.7+26ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-core' + version: '2:21.1.22-1ubuntu1' + architecture: 'amd64' + sha256: 'd57a180707a4ef7ced547e2fd7c254c05212d389a5a31566fb67f2dd576f2a5c' + size_bytes: 1524806 + source: 'xserver-xorg-core_2%3a21.1.22-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-legacy' + version: '2:21.1.22-1ubuntu1' + architecture: 'amd64' + sha256: '9d2e314e8e4dfb847f4939db10fed5bc160e18a3352fe0fc4f4491a6b9aca0de' + size_bytes: 36998 + source: 'xserver-xorg-legacy_2%3a21.1.22-1ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-all' + version: '1:7.7+26ubuntu1' + architecture: 'amd64' + sha256: '157ee5784159b544379f2e4b4b7caed7baf520dc990777c7d975e69606f6be77' + size_bytes: 4764 + source: 'xserver-xorg-video-all_1%3a7.7+26ubuntu1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-amdgpu' + version: '25.0.0-1' + architecture: 'amd64' + sha256: '2ad02b29948e6611e6a0a68952a0d94fdc9687ca7f5fe125e17fc3cc11b7bc6a' + size_bytes: 70432 + source: 'xserver-xorg-video-amdgpu_25.0.0-1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-ati' + version: '1:22.0.0-1build2' + architecture: 'amd64' + sha256: '7123a3774e26ec2d312eeccc49502b32cf8d9081265537e47deea857db754074' + size_bytes: 6714 + source: 'xserver-xorg-video-ati_1%3a22.0.0-1build2_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-fbdev' + version: '1:0.5.0-2build3' + architecture: 'amd64' + sha256: 'cec820e983f2b710779c8d7369fd97dff3454b535b0b7187d15f414a767098aa' + size_bytes: 12668 + source: 'xserver-xorg-video-fbdev_1%3a0.5.0-2build3_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-intel' + version: '2:2.99.917+git20210115-1build2' + architecture: 'amd64' + sha256: 'b71fbe896f54be1ea4bc9e0a1ba7e87d62d5cd71e1605de96997281b0404f430' + size_bytes: 791290 + source: 'xserver-xorg-video-intel_2%3a2.99.917+git20210115-1build2_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-nouveau' + version: '1:1.0.18-1build1' + architecture: 'amd64' + sha256: 'e16df74aa85092ba17fbcfc307bbe0fab1c20f134b8a116bb3b2108801c6c31b' + size_bytes: 92520 + source: 'xserver-xorg-video-nouveau_1%3a1.0.18-1build1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-qxl' + version: '0.1.6-1.1build1' + architecture: 'amd64' + sha256: 'af1a270dbac53f44598d43fa2303c82f55daa71b1c7a8078ecf2b13311ab8137' + size_bytes: 82848 + source: 'xserver-xorg-video-qxl_0.1.6-1.1build1_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-radeon' + version: '1:22.0.0-1build2' + architecture: 'amd64' + sha256: '93969e5b643555c5b19fe64a1f0611adbcb178353013bef75cdb47b945045005' + size_bytes: 160694 + source: 'xserver-xorg-video-radeon_1%3a22.0.0-1build2_amd64.deb' + pinned_in: [] + - package: 'xserver-xorg-video-vesa' + version: '1:2.6.0-2build1' + architecture: 'amd64' + sha256: 'fe02831a5f755ebb54237d2a1f9d6b54465541ac987a35a44fa167e4b489e1ae' + size_bytes: 15898 + source: 'xserver-xorg-video-vesa_1%3a2.6.0-2build1_amd64.deb' + pinned_in: [] + - package: 'xwayland' + version: '2:24.1.10-1' + architecture: 'amd64' + sha256: 'f620802e59cb10a4d66e0ed2abf16ad425be1ab2b7a3deef1c2b367647c2c7a5' + size_bytes: 1006600 + source: 'xwayland_2%3a24.1.10-1_amd64.deb' + pinned_in: [] + - package: 'xz-utils' + version: '5.8.3-1' + architecture: 'amd64' + sha256: '5a8cddf80d9f5aeee1f39315158cfcc0f3e2c7573f9d6236fc6b85537400a937' + size_bytes: 405624 + source: 'xz-utils_5.8.3-1_amd64.deb' + pinned_in: [] + - package: 'yaru-theme-gnome-shell' + version: '26.04.5.1ubuntu' + architecture: 'all' + sha256: '55131b0a1fd8408cbd6bf24fc27bce8e33071cc4894c215b87e5c3f16c06f4b8' + size_bytes: 73162 + source: 'yaru-theme-gnome-shell_26.04.5.1ubuntu_all.deb' + pinned_in: [] + - package: 'yaru-theme-gtk' + version: '26.04.5.1ubuntu' + architecture: 'all' + sha256: 'e66576554ab66d6c6bcd3a86ce1ab9347c861907f81fd89df927bd1c326a7225' + size_bytes: 1841544 + source: 'yaru-theme-gtk_26.04.5.1ubuntu_all.deb' + pinned_in: [] + - package: 'yaru-theme-icon' + version: '26.04.5.1ubuntu' + architecture: 'all' + sha256: 'd0269daa895d85a72948995497a0848ab3bd6138df59b52c21a814ccf4c7b0a6' + size_bytes: 34011480 + source: 'yaru-theme-icon_26.04.5.1ubuntu_all.deb' + pinned_in: [] + - package: 'yaru-theme-sound' + version: '26.04.5.1ubuntu' + architecture: 'all' + sha256: 'c322b7f3694822900080ab363731b698002a674dc24d8175da1b19c9b478b47c' + size_bytes: 1059412 + source: 'yaru-theme-sound_26.04.5.1ubuntu_all.deb' + pinned_in: [] + - package: 'yelp' + version: '49.0-5ubuntu0.1' + architecture: 'amd64' + sha256: 'f22123289c4b604027300c161f246058f27cdfcd5dc3565201d8e5c683499749' + size_bytes: 558690 + source: 'yelp_49.0-5ubuntu0.1_amd64.deb' + pinned_in: [] + - package: 'yelp-xsl' + version: '49.0-2' + architecture: 'all' + sha256: '8d0f46b49a0b2a8e947a02f62bd1691efac33796690b7afef2f2559d29941275' + size_bytes: 212538 + source: 'yelp-xsl_49.0-2_all.deb' + pinned_in: [] + - package: 'zenity' + version: '4.2.1-1' + architecture: 'amd64' + sha256: 'e292234fe2a5075364d93dad9cdaf12c9499f5b088d08b09cf62f8da8cf908c5' + size_bytes: 77564 + source: 'zenity_4.2.1-1_amd64.deb' + pinned_in: [] + - package: 'zenity-common' + version: '4.2.1-1' + architecture: 'all' + sha256: '92701ab2028632c635c1757b3980ea9cf6d6110d7d84bd527e5e6a29b5e6009d' + size_bytes: 261490 + source: 'zenity-common_4.2.1-1_all.deb' + pinned_in: [] + - package: 'zip' + version: '3.0-15ubuntu3' + architecture: 'amd64' + sha256: 'ef8e6376ecdaa82f4f7fbd1f6fb8cbf7818a1305c8e7b015c1aa9f4bdc77d12a' + size_bytes: 174984 + source: 'zip_3.0-15ubuntu3_amd64.deb' + pinned_in: [] + - package: 'zstd' + version: '1.5.7+dfsg-3' + architecture: 'amd64' + sha256: '032bf3699c23d653caeadf1d97521af9cc09401035164637e64ad79997947d6a' + size_bytes: 672078 + source: 'zstd_1.5.7+dfsg-3_amd64.deb' + pinned_in: [] + + + +# Blueforce Field OS - offline APT pin manifest: Docker CE +# +# Target release : Ubuntu 26.04 LTS, architecture amd64 (LAB confirms both) +# Format : one exact pin per line -> package=version ("#" starts a comment) +# Consumed by : scripts/install/blueforce-install.sh --offline, which refuses to +# run any package module unless every pin here is present in the +# bundle lock file /packages.lock.tsv. +# +# UNPINNED is a sentinel, not a version. Fill it in LAB: +# 1. acquire the reviewed .deb for the package into one local pool directory +# 2. read the exact version: dpkg-deb -f .deb Package Version +# 3. replace UNPINNED with that version, keeping the line shape: +# docker-ce= +# 4. verify with the static plan: ../build-offline-repo.sh --dry-run-plan +# (it must print PLAN READY before --check or a real build is attempted) +# +# Rules enforced by the tooling: lower-case package names, exactly one pin per +# package across all manifests, no inline comments, no whitespace around "=", +# no placeholder/replace/todo tokens. Adding or removing a package is a contract +# change: update manifests/requirements.tsv in the same edit or the plan fails. + +# These packages are NOT in the Ubuntu archive: they come from the reviewed Docker +# CE repository snapshot and must be supplied as local .deb files. containerd.io is +# the runtime bundled with Docker CE, not Ubuntu's "containerd" package. +# Installer module 10-docker.sh installs exactly this set in --offline mode. +docker-ce=5:29.8.1-1~ubuntu.26.04~resolute +docker-ce-cli=5:29.8.1-1~ubuntu.26.04~resolute +containerd.io=2.3.5-1~ubuntu.26.04~resolute +docker-buildx-plugin=0.37.1-1~ubuntu.26.04~resolute +docker-compose-plugin=5.5.1-1~ubuntu.26.04~resolute + + + +# Blueforce Field OS - offline APT pin manifest: remote access and desktop +# +# Target release : Ubuntu 26.04 LTS, architecture amd64 (LAB confirms both) +# Format : one exact pin per line -> package=version ("#" starts a comment) +# Consumed by : scripts/install/blueforce-install.sh --offline, which refuses to +# run any package module unless every pin here is present in the +# bundle lock file /packages.lock.tsv. +# +# UNPINNED is a sentinel, not a version. Fill it in LAB: +# 1. acquire the reviewed .deb for the package into one local pool directory +# 2. read the exact version: dpkg-deb -f .deb Package Version +# 3. replace UNPINNED with that version, keeping the line shape: +# xrdp= +# 4. verify with the static plan: ../build-offline-repo.sh --dry-run-plan +# (it must print PLAN READY before --check or a real build is attempted) +# +# Rules enforced by the tooling: lower-case package names, exactly one pin per +# package across all manifests, no inline comments, no whitespace around "=", +# no placeholder/replace/todo tokens. Adding or removing a package is a contract +# change: update manifests/requirements.tsv in the same edit or the plan fails. + +# --- remote desktop (installer module 08-rdp.sh) --- +xrdp=0.10.1-4.1 +# X11 backend used by the GNOME session behind xRDP. xrdp recommends it; the LAB +# must confirm the dependency closure of the reviewed pool before the build. +xorgxrdp=1:0.10.2-1build1 +gnome-session=50.1-0ubuntu0.1 + +# --- full desktop stack (installer module 16-gui.sh) --- +ubuntu-desktop-minimal=1.570.3 + +# --- RustDesk: vendor .deb, absent from the Ubuntu archive --- +# Version is the reviewed self-hosted client build. Record where that .deb came +# from in the bundle lock row for the package. +rustdesk=1.4.9 + +# rustdesk 1.4.9's own Depends line names these two, and nothing else in the +# manifest pulls them in: the vendor .deb is installed with dpkg, so its +# dependencies are not resolved from a remote source at install time. Without +# them `dpkg -i rustdesk` leaves the package unconfigured on a device whose +# desktop closure we do not ship. +libxdo3=1:3.20160805.1-5.1build1 +libva-x11-2=2.23.0-1ubuntu1 + + + +# Blueforce Field OS - offline APT deposu künyesi (repository record) +# +# Bu dosya provisioning/offline-repo/ şablonudur: şemayı belgeler ve derleme +# yapılmadan önceki durumu (state: UNBUILT, packages: []) gösterir. build-index.sh +# derleme kaydını buraya YAZMAZ -- varsayılan hedef /repo-manifest.yaml +# (yani built/repo-manifest.yaml) ve bu şablona yazmak reddedilir. Elle +# düzenlemeyin. +# +# Amaç: deponun hangi Ubuntu sürümü, hangi mimari ve hangi paketlerle +# üretildiğini kanıtlamak. Kurucu (scripts/install/blueforce-install.sh +# --offline) bu dosyayı OKUMAZ; denetim, yeniden üretim ve teslim kaydı için +# insan okur. Kurucunun doğruladığı dosyalar: Packages, Packages.gz, +# packages.lock.tsv, SHA256SUMS ve pool/ içindeki .deb dosyaları. +# +# Aşağıdaki değerler "henüz derlenmedi" durumunu gösterir: packages/ altına +# paket eklenip ./build-index.sh çalıştırıldığında gerçek değerler yazılır. +# +# Alan listesi (şema): +# schema_version bu dosyanın sürümü +# repository.* deponun künyesi ve dizin/indeks bilgileri +# repository.state UNBUILT (henüz indissiz) ya da BUILT +# repository.package_count / total_bytes / total_size paket sayısı ve boyut +# repository.index_sha256 indeks dosyalarının SHA256 değerleri +# repository.manifests okunan pin manifestleri +# repository.pinned_packages manifestlerdeki pin sayısı +# packages[] her paket: ad, sürüm, mimari, sha256, boyut, dosya adı, +# pinned_in (hangi manifestte pinli; boş liste = yalnızca +# bağımlılık olarak eklenmiş) + +schema_version: 1 +description: "Offline APT deposunun künyesi" + +repository: + name: 'blueforce-offline-apt' + format: 'apt-deb' + state: 'UNBUILT' + ubuntu_release: 'unknown' + architecture: 'amd64' + generated_at: 'UNBUILT' + generated_by: 'provisioning/offline-repo/build-index.sh' + package_count: 0 + total_bytes: 0 + total_size: '0 B' + pool: 'pool/' + bundle_dir: 'provisioning/offline-repo/built' + install_path: '/opt/blueforce/offline-repo' + consumer: 'scripts/install/blueforce-install.sh --offline' + index_files: + - 'Packages' + - 'Packages.gz' + - 'packages.lock.tsv' + - 'SHA256SUMS' + index_sha256: + Packages: 'UNBUILT' + Packages.gz: 'UNBUILT' + packages.lock.tsv: 'UNBUILT' + manifests: + - 'base-packages.txt' + - 'docker.txt' + - 'remote-access.txt' + pinned_packages: 0 + +# Derleme sonrası doldurulacak biçim (bu blok yalnızca örnektir, veri değildir): +# packages: +# - package: 'curl' +# version: '8.9.1-1ubuntu1' +# architecture: 'amd64' +# sha256: '<64 haneli sha256>' +# size_bytes: 123456 +# source: 'curl_8.9.1-1ubuntu1_amd64.deb' +# pinned_in: ['base-packages.txt'] +packages: [] + + + +#!/usr/bin/env bash +# Pre-flight checks: root, Ubuntu release, RAM and disk. +# +# Network is informational here and never a gate: an offline install takes its +# packages from the local bundle, so it needs neither the Internet nor the +# central endpoint. Three things are reported separately for the operator: +# 1. local network link — no intent, not used by the install, +# 2. Internet — NOT required for an offline install (no warning), +# 3. central connection — not needed during install; that is the enrollment +# stage's job. +# This module therefore never fails because a network probe failed. +# +# Idempotent: safe to re-run. Supports --check for read-only verification. +# Exit codes: 0 = OK, 3 = SKIP (optional step, nothing to do), 1 = real failure. +set -euo pipefail + +MODULE="01-precheck" +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}" +DEALER_ID="${DEALER_ID:-}" +BF_HOSTNAME="${BF_HOSTNAME:-}" +BF_DEVICE="${BF_DEVICE:-}" +STATE_DIR="${STATE_DIR:-/var/lib/blueforce}" + +log() { + local msg="$1" + mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true + echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [01-precheck] $msg" | tee -a "$LOG_FILE" +} + +CHECK_MODE=0 +if [[ "${1:-}" == "--check" ]]; then CHECK_MODE=1; fi +MIN_RAM_MB=2048 +MIN_DISK_MB=20480 + +fail() { log "FAIL: $1"; echo "FAIL: $1" >&2; exit 1; } +info() { log "BİLGİ: $1"; } + +# Read-only network report. Nothing here can fail the install. +report_network() { + if ip -o link show up 2>/dev/null | grep -qv ' lo:'; then + info "yerel ağ: bağlantı var (kurulum için gerekmiyor, kullanılmıyor)" + else + info "yerel ağ: bağlantı görünmüyor (kurulum için gerekmiyor, kullanılmıyor)" + fi + if [[ "${BF_OFFLINE:-0}" == 1 ]]; then + # Offline install: no probe at all, and no warning either. + info "internet: kurulum yerel paket deposundan yapılır; internet GEREKMEZ" + elif getent hosts archive.ubuntu.com >/dev/null 2>&1; then + info "internet: erişilebilir (geliştirme/test kipi)" + else + info "internet: erişilemiyor (bu kurulum için gerekmez)" + fi + info "merkez bağlantısı: kurulum sırasında gerekmez; enrollment aşamasında doğrulanır" +} + +run_checks() { + [[ "$(id -u)" -eq 0 ]] || fail "must run as root" + if [[ -f /etc/os-release ]]; then + # shellcheck disable=SC1091 + . /etc/os-release + [[ "${VERSION_ID:-}" == 26.04* ]] || fail "unsupported OS: ${NAME:-unknown} ${VERSION_ID:-unknown} (need Ubuntu 26.04)" + else + fail "/etc/os-release not found" + fi + local ram_mb disk_mb + ram_mb=$(awk '/MemTotal/ {printf "%d", $2/1024}' /proc/meminfo) + [[ "$ram_mb" -ge "$MIN_RAM_MB" ]] || fail "RAM too low: ${ram_mb}MB (need >= ${MIN_RAM_MB}MB)" + disk_mb=$(df -m / --output=avail | tail -1 | tr -d ' ') + [[ "$disk_mb" -ge "$MIN_DISK_MB" ]] || fail "disk too low: ${disk_mb}MB free on / (need >= ${MIN_DISK_MB}MB)" + report_network + log "OK: ön denetim geçti (Ubuntu ${VERSION_ID}, RAM ${ram_mb}MB, disk ${disk_mb}MB boş; yerel kurulum=$([[ "${BF_OFFLINE:-0}" == 1 ]] && echo evet || echo hayır))" +} + +run_checks + + + +#!/usr/bin/env bash +# Network report for the field device. It separates three things that used to be +# one gate: +# 1. local network link — informational; the install does not use it, +# 2. Internet — NOT required: packages come from the local bundle, +# so external name resolution is not mandatory and a +# failing lookup must never stop the run, +# 3. central connection — not needed during install; enrollment checks it. +# +# The module therefore always exits 0: no network condition can fail an install. +set -euo pipefail +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}"; CHECK_MODE=0 +[[ "${1:-}" == --check ]] && CHECK_MODE=1 +OFFLINE="${BF_OFFLINE:-0}"; ENDPOINT="${BF_ENROLLMENT_ENDPOINT:-}" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [05-network] $1" | tee -a "$LOG_FILE"; } +local_link() { ip -o link show up 2>/dev/null | grep -qv ' lo:'; } +internet() { ping -c1 -W3 1.1.1.1 >/dev/null 2>&1 || getent hosts archive.ubuntu.com >/dev/null 2>&1; } +central() { [[ "$ENDPOINT" =~ ^https://[^[:space:]/]+ ]] && curl --connect-timeout 3 -fsSI "$ENDPOINT" >/dev/null 2>&1; } + +if local_link; then + log 'BİLGİ: yerel ağ bağlantısı var (kurulum için gerekmiyor)' +else + log 'BİLGİ: yerel ağ bağlantısı görünmüyor (kurulum için gerekmiyor)' +fi + +if [[ "$OFFLINE" == 1 ]]; then + log 'BİLGİ: internet: kurulum yerel paket deposundan yapılır; internet GEREKMEZ' + log 'BİLGİ: Apt kaynakları yerel depoyu gösterir; dış DNS çözümlenemese de kurulum sürer' +else + if internet; then + log 'BİLGİ: internet erişilebilir (geliştirme/test kipi; üretimde gerekmez)' + else + log 'BİLGİ: internet erişilemiyor (bu kurulum için gerekmez)' + fi +fi + +if [[ -n "$ENDPOINT" ]]; then + if central; then + log 'BİLGİ: merkez kayıt uç noktası şu an erişilebilir (kurulumda yine de gerekmez)' + else + log 'BİLGİ: merkez kayıt uç noktasına şu an erişilemiyor; kurulum DURMAZ, enrollment aşamasında yeniden denenir' + fi +else + log 'BİLGİ: merkez kayıt uç noktası tanımlı değil; bağlantı enrollment aşamasında kurulur' +fi +log 'OK: ağ raporu tamam; kurulum internetsiz tamamlanabilir' +exit 0 + + + +#!/usr/bin/env bash +# Final lifecycle gate: offline completes locally; READY requires enrolled remote proof. +set -euo pipefail +LOG_FILE="${LOG_FILE:-/var/log/blueforce-install.log}"; STATE_DIR="${STATE_DIR:-/var/lib/blueforce}"; CHECK_MODE=0 +[[ "${1:-}" == --check ]] && CHECK_MODE=1 +OFFLINE="${BF_OFFLINE:-0}"; SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +log() { echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) [18-final-check] $1" | tee -a "$LOG_FILE"; } + +# Operator GUI runtime gate. The field application is the Python GUI (bfos), and +# tkinter is a separate package on Ubuntu: a minimal image has python3 but no +# window toolkit, so the operator would be left with no working entry point and +# no network to fix it. Checked here because every install path reaches this +# module, offline or not. When the GUI is unavailable the terminal console still +# works, so this reports the degradation instead of aborting the install. +if python3 -c 'import tkinter' >/dev/null 2>&1; then + log 'OK: operatör arayüzü (tkinter) hazır' +else + log 'WARN: tkinter yok; operatör arayüzü açılamaz. Terminal konsolu çalışır: sudo bf --tui' + log 'WARN: python3-tk paketi bu imajda eksik (offline depoda pinli: provisioning/offline-repo/manifests/base-packages.txt)' +fi +if [[ "$CHECK_MODE" == 1 ]]; then + command -v bf >/dev/null 2>&1 || log 'WARN(check): bf komutu PATH üzerinde yok; kurulum bf simgesini oluşturur' +fi + +if [[ "$OFFLINE" == 1 ]]; then + # Only local gates are meaningful offline. No central peer, handshake, or READY claim. + for g in 01-precheck 02-system 03-user 04-hostname 05-network 06-wireguard 07-ssh 08-rdp 10-docker 11-meg 12-monitoring 13-firewall 14-update-policy 15-logrotate 16-gui 17-healthcheck; do + LOG_FILE=/dev/null BF_OFFLINE=1 bash "$SCRIPT_DIR/$g.sh" --check >/dev/null || { log "FAIL: offline local gate $g failed"; exit 1; } + done + [[ "$CHECK_MODE" == 1 ]] && { log 'OK(check): offline local gates pass'; exit 0; } + log 'OK: offline local gates pass; installer records PROVISIONED_OFFLINE'; exit 0 +fi +[[ "$CHECK_MODE" == 1 ]] && exec /usr/local/bin/bf-check-ready +/usr/local/bin/bf-check-ready +python3 - "$STATE_DIR/state.json" <<'PY' +import json,os,sys,tempfile +p=sys.argv[1]; s=json.load(open(p)); +if s.get('phase') not in ('ENROLLED','READY'): raise SystemExit('not enrolled') +s.update({'phase':'READY','fleet_status':'READY'}) +fd,t=tempfile.mkstemp(prefix='state.json.',dir=os.path.dirname(p)); os.fchmod(fd,0o600) +with os.fdopen(fd,'w') as f: json.dump(s,f,sort_keys=True); f.write('\n') +os.replace(t,p) +PY +log 'OK: enrolled device has current handshake and remote checks; READY recorded' + + + +# Blueforce kurulumu (`scripts/install/`) + +Bu klasör cihazı kuran betiği içerir. Kurulumu yapan kişinin bilmesi gereken +her şey bu sayfada. + +--- + +## 1. Kurulum yapan kişi ne yapar? + +**Tek komut:** + +```bash +sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678 +``` + +- `--dealer-id` tek zorunlu bilgidir: 8 haneli bayi numarası. +- Betik numaradan ana makine adını (`bf-12345678`) ve cihaz kimliğini + (`BF-12345678`) kendisi üretir. +- Kurulum sırasında başka hiçbir soru sorulmaz. Onay istemeyen (fabrika/otomatik) + senaryoda sonuna `--yes` ekleyin. +- Kurulum bittiğinde cihaz yerinde kurulmuş olur ve `PROVISIONED_OFFLINE` + durumuna geçer. Cihazın **READY** sayılması için merkeze kayıt (enrollment) + gerekir; bu ayrı bir adımdır, kuruluma dahil değildir. + +Paket aramaz, paket indirmez, apt kaynağı eklemez, anahtar getirmez. Bunların +hepsi zaten hazırdır. + +--- + +## 2. Paketler nereden gelir? + +Paketler **git deposunun içinde** taşınır: + +```text +provisioning/offline-repo/built/ hazır paket seti (pool/, Packages, SHA256SUMS, packages.lock.tsv) +``` + +Bunları **repo sorumlusu** hazırlar ve commit eder; kurulumu yapan kişi sadece +depoyu çeker. Paket setinin nasıl üretildiği, hangi paketlerin neden +gerektiği ve sorun giderme adımları: + +```text +provisioning/offline-repo/README.md +``` + +Kurucu paket setini kendi kendine bulur. Arama sırası: + +| Sıra | Yer | Ne zaman kullanılır | +|---|---|---| +| 1 | `BF_OFFLINE_REPO` ortam değişkeni | Repo sorumlusu farklı bir dizin verdiyse (nadir) | +| 2 | `provisioning/offline-repo/built` | Normal durum: kurucu betiğin bulunduğu repo | +| 3 | `/opt/blueforce/offline-repo` | Paket seti cihaza ISO/medya ile kopyalanmışsa | + +Bulunan depo kurulumdan önce baştan sona doğrulanır: dosya listesi, +checksum (`SHA256SUMS`) ve pinlenen her paketin depoda gerçekten durması. +Doğrulama geçmezse kurulum **hiç başlamaz**. + +--- + +## 3. İnternet gerekmez — neden? + +- Sahada internet yok veya güvenilmez; kurulumun ihtiyaç duyduğu her paket + yanında taşınır ve cihazdaki tek kaynak yerel depodur. +- Kurulum çalışırken Apt kaynakları yalnızca bu yerel depoyu gösterir. Dış + adreslere, DNS çözümlemesine veya indirmeye ihtiyaç duyulmaz. +- Bu yüzden **internet erişimi kontrolü kurulumu durdurmaz**: `01-precheck` + modülü interneti sadece bilgi olarak yazar. `05-network` modülü de bağlantı + yokken geçer (yerel ağ, internet ve merkez bağlantısı ayrı ayrı raporlanır; + hiçbiri kurulum için şart değildir). +- Merkez bağlantısı (WireGuard, izleme, kayıt) kurulumdan sonra, **enrollment + aşamasında** doğrulanır. + +Yalnızca geliştirme/test makinesi için `--online` vardır: paketleri internetten +çeker. **Üretimde kullanmayın** — sahada kurulum yerel depodan yapılır. + +--- + +## 4. Bir şey ters giderse + +### "Yerel paket deposu yok" hatası + +```text +HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md +``` + +Anlamı: cihazda kullanılacak paket seti yok. Kurulum başlamadı, sistemde +hiçbir değişiklik yapılmadı. Yapılacaklar: + +1. Depoyu tam olarak çekin (`git pull`) veya repo sorumlusunun verdiği kopyayı + `/opt/blueforce/offline-repo` altına koyun. +2. Komutu yeniden çalıştırın. Aynı numarayla devam edebilirsiniz. + +Ekranda aranan yerlerin listesi yazar; o listeyi repo sorumlusuna iletmek +yeterlidir. + +### `OFFLINE BLOCKED` mesajları + +Depo bulundu ama eksik ya da bozuk demektir (checksum tutmuyor, pinlenen paket +depoda yok, kilit/indeks dosyası boş...). Kurulum yine başlamaz ve sistem +değişmez. Mesajın altındaki "Ne yapmalı" satırı depoyu nasıl düzelteceğinizi +söyler; ayrıntılı tablo `provisioning/offline-repo/README.md` içindedir. +Sahada çözülmez — depoyu düzeltip yeniden getirmek gerekir. + +### Kurulum kesildi, devam etmek istiyorum + +```bash +sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678 --resume +``` + +`--resume` daha önce tamamlanmış adımları atlar. Bütün adımlar tekrar +çalıştırılabilir (idempotent); bir adımı iki kez çalıştırmak zarar vermez. + +### Kurulum yapıldı mı, kontrol etmek istiyorum + +```bash +sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678 --check +``` + +`--check` hiçbir şeyi değiştirmez (log, durum dosyası, dizin oluşturmaz); +yalnızca rapor verir. Denetim de aynı paket sözleşmesini doğruladığı için +depo yine gerekir. + +### Kayıtlar nerede? + +| Ne | Yer | +|---|---| +| Kurulum günlüğü | `/var/log/blueforce-install.log` | +| Adım adım durum | `/var/lib/blueforce/install-state` | +| Cihaz durumu | `/var/lib/blueforce/state.json` | + +--- + +## 5. Seçenekler (normalde gerekmez) + +| Seçenek | Ne yapar | +|---|---| +| `--dealer-id NUMARA` | Zorunlu. 8 haneli bayi numarası. | +| `--yes`, `-y` | Onay sormadan başla. | +| `--check` | Salt okunur denetim. | +| `--from NN` | `NN` numaralı adımdan başla (örn. `--from 06`). | +| `--only AD` | Yalnız tek adımı çalıştır (örn. `--only 05-network`). | +| `--resume` | Daha önce tamamlanan adımları atla. | +| `--help`, `-h` | Yardım metni. | +| `--offline` | Yerel depoyu kullanmayı zorlar. Artık gerekmez; varsayılan davranış zaten budur (eski komutlar bozulmasın diye duruyor). | +| `--online` | Yalnız geliştirme/test: paketleri internetten çeker. Üretimde kullanılmaz. | + +Kurulum sonucu: `0` başarılı · `1` kurulum durdu (depo ya da adım hatası) · +`2` komut/parametre hatası. + +--- + +## 6. Kurulum adımları (modül haritası) + +Her adım tekrar çalıştırılabilir ve `--check` destekler. + +`01-precheck` · `02-system` · `03-user` · `04-hostname` · `05-network` · +`06-wireguard` · `07-ssh` · `08-rdp` · `09-rustdesk` · `10-docker` · `11-meg` · +`12-monitoring` · `13-firewall` · `14-update-policy` · `15-logrotate` · +`16-gui` · `17-healthcheck` · `18-final-check` + +Uzak erişim için her cihaza özel değerler gerekir: `WG_ADDRESS`, `WG_ENDPOINT`, +`WG_PEER_PUBKEY`, `RUSTDESK_SERVER` ve yerel `RUSTDESK_DEB`. Yer tutucu +değerler kabul edilmez; WireGuard erişimi `BF_WG_HANDSHAKE_MAX_AGE` saniyeden +(öntanımlı `180`) daha yeni bir eş el sıkışması ister (`REQUIRE_WIREGUARD=false` +ile kapatılabilir). + +Docker'ın dışa açtığı portlar öntanımlı olarak kapalıdır. Yalnız incelenmiş +`tcp PORT` / `udp PORT` satırları +`/etc/blueforce/docker-published-port-allowlist.conf` dosyasına eklenir; +`blueforce-docker-firewall.service` bu politikayı Docker her başladığında +yeniden uygular. + +Not: AnyDesk bilinçli olarak yoktur. Uzak erişim SSH-over-WireGuard, xRDP ve +RustDesk ile sağlanır; AnyDesk elle yapılan cihaz başına bir istisnadır. + + + +#!/usr/bin/env bash +# Validate provisioning assets, the bootable ISO builder contract, and the safety rules +# of the autoinstall payload. Nothing is built, no disk is touched, no network is used. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PROVISIONING="$REPO_ROOT/provisioning" +ISO_DIR="$PROVISIONING/iso" +BUILDER="$ISO_DIR/build-blueforce-iso.sh" +AUTOINSTALL="$PROVISIONING/autoinstall/autoinstall.yaml" +USER_DATA="$PROVISIONING/autoinstall/user-data" +FAIL=0 + +fail() { printf 'FAIL: %s\n' "$*" >&2; FAIL=1; } +pass() { printf 'OK: %s\n' "$*"; } +require_file() { [[ -f "$1" ]] && pass "present: ${1#"$REPO_ROOT"/}" || fail "missing: ${1#"$REPO_ROOT"/}"; } + +# require_in +require_in() { + if grep -qE -- "$2" "$1"; then + pass "$3" + else + fail "$3 (pattern not found in ${1#"$REPO_ROOT"/}: $2)" + fi +} + +# forbid_in +forbid_in() { + if grep -qE -- "$2" "$1"; then + fail "$3 (forbidden pattern in ${1#"$REPO_ROOT"/}: $2)" + else + pass "$3" + fi +} + +required_files=( + provisioning/README.md + provisioning/autoinstall/autoinstall.yaml + provisioning/autoinstall/user-data + provisioning/autoinstall/meta-data + provisioning/autoinstall/README.md + provisioning/iso/build-blueforce-iso.sh + provisioning/iso/verify-upstream-iso.sh + provisioning/iso/test-iso.sh + provisioning/iso/README.md + provisioning/iso/field-os-version + provisioning/iso/ubuntu-26.04.1-SHA256SUMS + provisioning/offline-repo/build-offline-repo.sh + provisioning/offline-repo/manifests/base-packages.txt + provisioning/offline-repo/manifests/remote-access.txt + provisioning/offline-repo/manifests/docker.txt + provisioning/offline-repo/README.md + provisioning/firstboot/bf-firstboot + provisioning/firstboot/blueforce-firstboot.service + provisioning/firstboot/README.md + provisioning/enrollment/schemas/enrollment-request.schema.json + provisioning/enrollment/schemas/enrollment-response.schema.json + provisioning/enrollment/README.md + provisioning/release/manifest.yaml + provisioning/release/README.md + tests/run-all.sh +) +for relative in "${required_files[@]}"; do require_file "$REPO_ROOT/$relative"; done + +# The package pool is the reason the installer never downloads: a directory that +# exists but holds nothing is the failure this asserts against. (.gitkeep is gone +# on purpose -- the pool is what keeps the directory in git now.) +if [[ -d "$REPO_ROOT/provisioning/offline-repo/packages" ]]; then + pool_count="$(find "$REPO_ROOT/provisioning/offline-repo/packages" -maxdepth 1 -name '*.deb' | wc -l)" + pass "offline package pool directory exists ($pool_count .deb files)" +else + fail 'provisioning/offline-repo/packages/ is missing' +fi + +if [[ ! -d "$PROVISIONING" ]]; then + printf 'check-provisioning-static: FAILED\n' >&2 + exit 1 +fi + +# Provisioning scripts must be Bash, strict-mode, and parse without execution. +while IFS= read -r -d '' script; do + first_line="$(head -n 1 "$script")" + [[ "$first_line" == '#!/usr/bin/env bash' ]] || fail "Bash shebang required: ${script#"$REPO_ROOT"/}" + grep -q '^set -euo pipefail$' "$script" || fail "strict mode required: ${script#"$REPO_ROOT"/}" + bash -n "$script" && pass "bash parses: ${script#"$REPO_ROOT"/}" || fail "bash parse error: ${script#"$REPO_ROOT"/}" +done < <(find "$PROVISIONING" -type f \( -name '*.sh' -o -name 'bf-firstboot' \) -print0) + +# JSON schemas and YAML assets must be structurally parseable. The checks need python3 +# (plus PyYAML for the YAML side); when the interpreter or module is missing they are +# reported as skipped instead of failing, so the suite stays usable in minimal containers. +PYTHON_JSON=0 +if command -v python3 >/dev/null 2>&1 && python3 -c 'import json' >/dev/null 2>&1; then + PYTHON_JSON=1 +fi +PYTHON_YAML=0 +if command -v python3 >/dev/null 2>&1 && python3 -c 'import yaml' >/dev/null 2>&1; then + PYTHON_YAML=1 +fi + +if [[ "$PYTHON_JSON" -eq 1 ]]; then + while IFS= read -r -d '' json_file; do + if python3 -c 'import json,sys; json.load(open(sys.argv[1], encoding="utf-8"))' "$json_file"; then + pass "json parses: ${json_file#"$REPO_ROOT"/}" + else + fail "json parse error: ${json_file#"$REPO_ROOT"/}" + fi + done < <(find "$PROVISIONING" -type f -name '*.json' -print0) +else + printf 'NOTE: json parse checks skipped (python3 with the json module is unavailable)\n' +fi + +if [[ "$PYTHON_YAML" -eq 1 ]]; then + while IFS= read -r -d '' yaml_file; do + if python3 -c 'import sys,yaml; yaml.safe_load(open(sys.argv[1], encoding="utf-8"))' "$yaml_file"; then + pass "yaml parses: ${yaml_file#"$REPO_ROOT"/}" + else + fail "yaml parse error: ${yaml_file#"$REPO_ROOT"/}" + fi + done < <(find "$PROVISIONING" -type f \( -name '*.yaml' -o -name '*.yml' \) -print0) +else + printf 'NOTE: yaml parse checks skipped (python3 with PyYAML is unavailable)\n' +fi + +# ---------------------------------------------------------------- autoinstall -- +if [[ -f "$AUTOINSTALL" && -f "$USER_DATA" ]]; then + grep -q '^autoinstall:$' "$AUTOINSTALL" || fail 'autoinstall.yaml must have an autoinstall root' + grep -qE '^[[:space:]]*interactive-sections:[[:space:]]*\[storage\][[:space:]]*$' "$AUTOINSTALL" || fail 'autoinstall.yaml must require interactive storage' + if grep -qE '^[[:space:]]*identity:' "$AUTOINSTALL" "$USER_DATA"; then + fail 'autoinstall must not embed an identity' + else + pass 'autoinstall contains no identity block' + fi + + # Storage directives are checked on the effective YAML (comments stripped) so that + # documentation comments cannot be mistaken for real directives. + for payload in "$AUTOINSTALL" "$USER_DATA"; do + if sed -E 's/(^|[[:space:]])#.*$//' "$payload" \ + | grep -qE '(^|[[:space:]])(layout|match|wipe|grub_device|device|path):[[:space:]]*[^[:space:]]'; then + fail "autoinstall must not directly select or wipe a disk: ${payload#"$REPO_ROOT"/}" + else + pass "no direct disk selection or wipe directive: ${payload#"$REPO_ROOT"/}" + fi + done + + require_in "$AUTOINSTALL" '^[[:space:]]*fallback:[[:space:]]*offline-install[[:space:]]*$' \ + 'autoinstall declares the offline-install apt fallback' + require_in "$USER_DATA" '^[[:space:]]*fallback:[[:space:]]*offline-install[[:space:]]*$' \ + 'seed user-data declares the offline-install apt fallback' + require_in "$AUTOINSTALL" '/opt/blueforce/offline-repo' \ + 'late-commands place the offline repository at /opt/blueforce/offline-repo' + require_in "$AUTOINSTALL" 'cdrom/blueforce-provisioning/firstboot/bf-firstboot' \ + 'late-commands install the firstboot payload from the fixed media path' + require_in "$AUTOINSTALL" 'systemctl enable blueforce-firstboot\.service' \ + 'late-commands enable blueforce-firstboot.service' + require_in "$AUTOINSTALL" '/etc/blueforce-release' \ + 'late-commands place /etc/blueforce-release on the target' + + # The seed copy and the media copy must stay in sync. + AUTO_LATE="$(sed -n '/late-commands:/,$p' "$AUTOINSTALL" | grep -E '^[[:space:]]*-' | sed -E 's/^[[:space:]]*-[[:space:]]*//' || true)" + SEED_LATE="$(sed -n '/late-commands:/,$p' "$USER_DATA" | grep -E '^[[:space:]]*-' | sed -E 's/^[[:space:]]*-[[:space:]]*//' || true)" + if [[ -n "$AUTO_LATE" && "$AUTO_LATE" == "$SEED_LATE" ]]; then + pass 'seed user-data late-commands match the media autoinstall' + else + fail 'seed user-data late-commands differ from autoinstall.yaml' + fi +fi + +# ------------------------------------------------------------- ISO builder ---- +if [[ -f "$BUILDER" ]]; then + # Assertions about executable behaviour run against a comment-stripped view so that a + # documentation comment can neither satisfy nor trip a code contract check. + CODE_VIEW="$(mktemp)" + trap 'rm -rf "${TMP_TEST:-}" "$CODE_VIEW"' EXIT + sed -E 's/(^|[[:space:]])#.*$//' "$BUILDER" > "$CODE_VIEW" + require_in "$BUILDER" 'Blueforce-Field-OS-\$\{VERSION\}-\$\{ARCH\}\.iso' \ + 'builder names the ISO after the released version contract' + require_in "$BUILDER" '"\$\{OUTPUT\}\.sha256"' 'builder writes .sha256' + require_in "$BUILDER" '\$\{VERSION\}-manifest\.yaml' 'builder writes -manifest.yaml' + require_in "$BUILDER" '\-\-checksum-file' 'builder accepts an explicit checksum record' + forbid_in "$BUILDER" 'Refusing remaster without --allow-remaster' \ + 'real build is no longer gated behind --allow-remaster' + require_in "$BUILDER" '\-\-check\)' 'builder provides a dry-run mode' + + # Media layout and automatic autoinstall start. + require_in "$BUILDER" '\$MEDIA/autoinstall\.yaml' 'autoinstall.yaml is written to the media root' + require_in "$BUILDER" 'FIRSTBOOT_PATH="\$MEDIA_PREFIX/firstboot"' 'firstboot path is fixed at /blueforce-provisioning/firstboot' + require_in "$BUILDER" 'inject_autoinstall_arg' 'builder injects the autoinstall kernel argument itself' + require_in "$BUILDER" 'blueforce-orig' 'builder keeps a pristine copy of every boot file it patches' + require_in "$BUILDER" 'boot/grub/grub\.cfg' 'GRUB configuration is patched' + require_in "$BUILDER" 'isolinux' 'isolinux configuration is patched when the base ISO has one' + # The boot structure is rebuilt from the base ISO's own layout recipe: a replay cannot + # re-create the GRUB2 MBR (first 16 sectors of the source image) or the appended EFI + # system partition. Those options are read at build time, never hard-coded. + require_in "$BUILDER" 'report_el_torito as_mkisofs' 'boot layout is read from the base ISO at build time' + require_in "$BUILDER" '\-as mkisofs' 'the medium is written with the base ISO boot recipe' + require_in "$BUILDER" 'append_partition' 'builder fails closed when the base layout has no appended EFI partition' + require_in "$BUILDER" 'modification-date' 'reproducible builds pin the mkisofs modification date' + forbid_in "$CODE_VIEW" '\-boot_image any replay' 'boot layout is no longer replayed' + forbid_in "$BUILDER" '28732ac11ff8d211ba4b00a0c93ec93b|appended_partition_2_start_|local_fs:[0-9]' \ + 'boot layout values are not hard-coded in the builder' + require_in "$BUILDER" 'El Torito boot img.*BIOS' 'builder asserts the BIOS El Torito entry survives' + require_in "$BUILDER" 'El Torito boot img.*\(UEFI\|EFI\)' 'builder asserts the UEFI El Torito entry survives' + require_in "$BUILDER" 'interactive-sections: \\\[storage\\\]' 'builder re-checks interactive storage inside the produced media' + require_in "$BUILDER" 'rm -f "\$OUTPUT"' 'builder removes a broken output instead of leaving a half-good ISO' + + # Offline repository embedding. + require_in "$BUILDER" 'Packages\.gz' 'builder requires a complete offline repository before embedding it' + require_in "$BUILDER" 'offline-repo/built' 'built offline repository is placed on the media' + + # Manifest contract. + require_in "$BUILDER" 'field_os_version' 'manifest records field_os_version' + require_in "$BUILDER" 'base_flavor' 'manifest records the detected base_flavor' + require_in "$BUILDER" 'base_iso_filename' 'manifest records the base ISO file name' + require_in "$BUILDER" 'ubuntu_iso_sha256' 'manifest records ubuntu_iso_sha256' + require_in "$BUILDER" 'git_commit' 'manifest records the git commit' + require_in "$BUILDER" 'build_date' 'manifest records the build date' + require_in "$BUILDER" 'meg_package_version' 'manifest records the package versions' + require_in "$BUILDER" 'blueforce_installer_version' 'manifest records the installer version' + require_in "$BUILDER" 'baseline_deviation' 'manifest records the documented-baseline deviation' + forbid_in "$BUILDER" '[0-9a-f]{64}' 'builder embeds no hard-coded SHA256 digest' + + # No download and no device identity in the builder. + forbid_in "$BUILDER" '\b(curl|wget|apt-get download|apt download)\b' 'builder downloads nothing' + forbid_in "$BUILDER" 'BF-[0-9]{8}' 'builder embeds no device identity' + + # The version file must be usable as an artifact name component. + if [[ -f "$ISO_DIR/field-os-version" ]] \ + && grep -qE '^[0-9]+(\.[0-9]+){1,3}([-.+][0-9A-Za-z.-]+)?$' "$ISO_DIR/field-os-version"; then + pass 'field-os-version holds a valid version string' + else + fail 'field-os-version must hold a version such as 1.0.0' + fi + + # The upstream checksum record must not be a hand-written digest store: it must carry a + # SHA256SUMS-style entry for a real Ubuntu image name. + if [[ -f "$ISO_DIR/ubuntu-26.04.1-SHA256SUMS" ]] \ + && grep -qE '^[0-9a-f]{64} \*ubuntu-[0-9.]+-(live-server|desktop)-amd64\.iso$' "$ISO_DIR/ubuntu-26.04.1-SHA256SUMS"; then + pass 'upstream checksum record is a Canonical SHA256SUMS file' + else + fail 'upstream checksum record is missing or malformed' + fi + + # --check and failure paths stay non-destructive. + TMP_TEST="$(mktemp -d)" + printf 'not an iso\n' > "$TMP_TEST/junk-amd64.iso" + printf '%s *junk-amd64.iso\n' "$(sha256sum "$TMP_TEST/junk-amd64.iso" | awk '{print $1}')" > "$TMP_TEST/SHA256SUMS" + if bash "$BUILDER" --upstream-iso "$TMP_TEST/missing-amd64.iso" --checksum-file "$TMP_TEST/SHA256SUMS" \ + --output "$TMP_TEST/out.iso" --check > "$TMP_TEST/missing.out" 2>&1; then + fail 'builder must reject a missing upstream ISO' + elif grep -q 'Upstream ISO not found' "$TMP_TEST/missing.out"; then + pass 'builder rejects a missing upstream ISO with a clear message' + else + fail "builder failed without explaining the missing upstream ISO: $(head -n 1 "$TMP_TEST/missing.out")" + fi + + # A real build must refuse a base medium that carries no ISO 9660 boot catalog, and it + # must not leave an artifact behind when it does. + if bash "$BUILDER" --upstream-iso "$TMP_TEST/junk-amd64.iso" --checksum-file "$TMP_TEST/SHA256SUMS" \ + --output "$TMP_TEST/out2.iso" > "$TMP_TEST/junkbuild.out" 2>&1; then + fail 'a real build must refuse a base medium that carries no ISO 9660 boot catalog' + else + pass 'real build refuses a non-bootable base medium' + fi + grep -qE 'ERROR: ' "$TMP_TEST/junkbuild.out" \ + && pass 'the refusal is explained with an explicit error' \ + || fail 'real build refused a non-bootable base medium without an explicit error' + [[ ! -e "$TMP_TEST/out2.iso" && ! -e "$TMP_TEST/out2.iso.sha256" ]] \ + && pass 'refused real build wrote no output artifacts' \ + || fail 'refused real build left output artifacts behind' + + # Dry-run behaviour on a medium that is not an ISO image: xorriso exits 0 and just says + # "No ISO 9660 image at LBA 0", so this is reported rather than asserted until the + # preflight probe checks for a boot catalog line itself. + if bash "$BUILDER" --upstream-iso "$TMP_TEST/junk-amd64.iso" --checksum-file "$TMP_TEST/SHA256SUMS" \ + --output "$TMP_TEST/out.iso" --check > "$TMP_TEST/junk.out" 2>&1; then + printf 'NOTE: --check accepted a file with no El Torito catalog (xorriso exits 0 on it); tighten the preflight boot-metadata probe when convenient\n' + else + pass 'dry run rejects a medium that carries no El Torito catalog' + fi + [[ ! -e "$TMP_TEST/out.iso" && ! -e "$TMP_TEST/out.iso.sha256" ]] \ + && pass 'dry run wrote no output artifacts' \ + || fail 'dry run left output artifacts behind' + + # Optional: when a real verified base ISO and xorriso are available, the dry run must pass. + if [[ -n "${BF_TEST_UPSTREAM_ISO:-}" && -f "${BF_TEST_UPSTREAM_ISO:-}" && -f "$ISO_DIR/ubuntu-26.04.1-SHA256SUMS" ]] \ + && command -v xorriso >/dev/null 2>&1; then + if bash "$BUILDER" --upstream-iso "$BF_TEST_UPSTREAM_ISO" --checksum-file "$ISO_DIR/ubuntu-26.04.1-SHA256SUMS" \ + --output "$TMP_TEST/real.iso" --check > "$TMP_TEST/real.out" 2>&1; then + pass 'builder dry run passes against the real verified base ISO' + else + fail "builder dry run failed against ${BF_TEST_UPSTREAM_ISO}: $(tail -n 1 "$TMP_TEST/real.out")" + fi + [[ ! -e "$TMP_TEST/real.iso" ]] && pass 'dry run wrote no ISO' || fail 'dry run wrote an ISO' + else + pass 'real-ISO dry run skipped (set BF_TEST_UPSTREAM_ISO and install xorriso to enable it)' + fi +fi + +# ------------------------------------------------------- secrets and identity -- +# No credentials, private keys, device IDs, or machine identities belong in the skeleton. +# Two tiers: +# 1. hard indicators (key blocks, WireGuard keys, RustDesk server, device identity) are +# scanned across the whole provisioning tree, +# 2. the heuristic "secret-looking assignment" scan covers the directories whose files +# are actually copied into the installation medium, which is the same set the builder +# re-scans before it writes one. +# The heuristic requires an alphanumeric character in the value, so an empty placeholder +# such as `token = ""` is not reported while any concrete value still is. (A source file +# that assigns a bare identifier named `token` still trips tier 2 by design; rename such a +# variable rather than widening the rule.) +if grep -RniE --exclude='check-provisioning-static.sh' --exclude='*.md' \ + '(BEGIN (OPENSSH|RSA|EC|DSA|PGP) PRIVATE KEY|WG_(PRIVATE|PEER)_|RUSTDESK_SERVER[[:space:]]*=[[:space:]]*[^<[:space:]#]*[A-Za-z0-9])' \ + "$PROVISIONING"; then + fail 'secret-like value found in provisioning assets' +elif grep -RniE --exclude='check-provisioning-static.sh' --exclude='*.md' \ + '(^|[^A-Za-z])(password|passwd|token|api[_-]?key|secret)[[:space:]]*[:=][[:space:]]*[^<[:space:]#]*[A-Za-z0-9]' \ + "$PROVISIONING/autoinstall" "$PROVISIONING/firstboot" "$PROVISIONING/release" "$PROVISIONING/offline-repo"; then + fail 'secret-like value found in assets that are copied into the medium' +else + pass 'no secret-like value found in provisioning assets' +fi +if grep -RniE --exclude='check-provisioning-static.sh' 'BF-[0-9]{8}|bf-[0-9]{8}|dealer[-_ ]?id[[:space:]]*[:=][[:space:]]*[0-9]{8}' "$PROVISIONING"; then + fail 'device-specific identity found in provisioning assets' +else + pass 'no embedded device identity found' +fi + +# Firstboot may invoke only the explicit offline installer after a dealer ID check. +if grep -q 'blueforce-install\.sh' "$PROVISIONING/firstboot/bf-firstboot" && grep -q -- '--offline' "$PROVISIONING/firstboot/bf-firstboot"; then + pass 'firstboot installer path is explicit offline-only' +else + fail 'firstboot must invoke the installer only with --offline' +fi +grep -q 'BF_FIRSTBOOT_TEST_MODE' "$PROVISIONING/firstboot/bf-firstboot" && pass 'firstboot has mutation-free test mode' || fail 'firstboot test mode missing' + +grep -q 'interactive-sections: \[storage\]' "$AUTOINSTALL" && pass 'assisted storage is explicit' || fail 'assisted storage declaration missing' +grep -q 'apt-ftparchive' "$PROVISIONING/offline-repo/build-offline-repo.sh" && pass 'offline repository uses apt-ftparchive' || fail 'offline repository must use apt-ftparchive' +grep -q 'sha256sum' "$PROVISIONING/iso/verify-upstream-iso.sh" && pass 'upstream SHA256 verification present' || fail 'upstream SHA256 verification missing' + +if [[ "$FAIL" -ne 0 ]]; then + printf 'check-provisioning-static: FAILED\n' >&2 + exit 1 +fi +printf 'check-provisioning-static: all passed\n' + + + +#!/usr/bin/env bash +# Single entry point for the repository test suite. +# +# Runs every tests/*.sh (except this file) in sorted order, reports each result, and +# exits with the sum of the individual exit codes so that a single non-zero test can +# never be mistaken for a clean run. +# +# Usage: +# bash tests/run-all.sh # run everything +# bash tests/run-all.sh offline firstboot # run only tests whose name contains a term +# +# -e is deliberately not set: a failing test must not abort the rest of the run, it has +# to be reported and counted. +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +SELF="$(basename "${BASH_SOURCE[0]}")" + +filters=("$@") +tests=() +while IFS= read -r script; do + tests+=("$script") +done < <(find "$SCRIPT_DIR" -maxdepth 1 -type f \( -name '*.sh' -o -name 'test_*.py' -o -name 'check_*.py' \) ! -name "$SELF" | sort) + +if [[ ${#tests[@]} -eq 0 ]]; then + printf 'run-all: no tests found in %s\n' "$SCRIPT_DIR" >&2 + exit 1 +fi + +selected=() +for script in "${tests[@]}"; do + if [[ ${#filters[@]} -eq 0 ]]; then + selected+=("$script") + continue + fi + for filter in "${filters[@]}"; do + if [[ "$(basename "$script")" == *"$filter"* ]]; then + selected+=("$script") + break + fi + done +done + +if [[ ${#selected[@]} -eq 0 ]]; then + printf 'run-all: no test matched: %s\n' "${filters[*]}" >&2 + exit 1 +fi + +printf 'run-all: %d test file(s) from %s\n' "${#selected[@]}" "$REPO_ROOT" +exit_code_sum=0 +failures=() + +for script in "${selected[@]}"; do + name="$(basename "$script")" + printf '\n=== %s ===\n' "$name" + case "$script" in + *.py) + # Python suites run from the repository root so `import bfos` and + # `tests.test_*` module paths resolve. + ( cd "$REPO_ROOT" && python3 "$script" ) + ;; + *) + ( cd "$REPO_ROOT" && bash "$script" ) + ;; + esac + status=$? + if [[ "$status" -eq 0 ]]; then + printf '%s\n' "--- $name: PASS" + else + printf '%s\n' "--- $name: FAIL (exit $status)" + failures+=("$name") + fi + exit_code_sum=$((exit_code_sum + status)) +done + +printf '\n=== run-all summary ===\n' +printf 'tests run : %d\n' "${#selected[@]}" +# Build the failing-name suffix explicitly: inlining this command substitution in +# the printf argument list makes the empty-array case drop an argument and printf +# then reports "usage: printf ...". +failure_suffix="" +if [[ ${#failures[@]} -gt 0 ]]; then + failure_suffix=" (${failures[*]})" +fi +printf 'failed : %d%s\n' "${#failures[@]}" "$failure_suffix" +printf 'exit code : %d (sum of individual exit codes)\n' "$exit_code_sum" + +if [[ "$exit_code_sum" -gt 255 ]]; then + exit 255 +fi +exit "$exit_code_sum" + + + +#!/usr/bin/env python3 +"""bfos.ui_gui -- statik testler (stdlib unittest, pencere ACMAZ). + +Bu testler GUI'yi baslatmaz ve hicbir Tk penceresi olusturmaz; yalnizca +tkinter'siz calisan yardimcilari ve backend sozlesmesini dogrular: + + * bayi no dogrulamasi (^[0-9]{8}$) ve Turkce hata metinleri, + * komut onizleme metni (calistirilacak komut onizlemede GORUNUR), + * yikici islem siniflandirmasi (katalog + playbook ile capraz kontrol), + * headless (SSH) tespiti ve tkinter eksikligi mesaji, + * hedef/kapi kurallari: release -> tek cihaz yok, production -> token, + * --check kipi, salt-okunur rapor plani, + * komut calistirma: canli satir akisi + cikis kodu (gercek subprocess), + * tasarim sozlesmesi: tema token'lari web/static/tokens.css ile birebir ayni, + durum sozlugu (KURULDU/KAYITLI/HAZIR/HATA/YOK) ve yetki kapisi gorunurlugu. + +Calistirma: + python3 tests/test_bfos_gui_static.py -v +""" + +from __future__ import annotations + +import contextlib +import importlib.util +import io +import json +import os +import re +import shutil +import sys +import tempfile +import textwrap +import unittest +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +UI_GUI_PATH = REPO_ROOT / "bfos" / "ui_gui.py" + + +def _load_ui_gui(): + """ui_gui.py'yi paket __init__'ini calistirmadan yukler (izole import).""" + if not UI_GUI_PATH.is_file(): + raise unittest.SkipTest(f"bulunamadi: {UI_GUI_PATH}") + if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + name = "bfos_ui_gui_static_test" + spec = importlib.util.spec_from_file_location(name, UI_GUI_PATH) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + # dataclasses kayitli bir modul bekler; bu kayit zorunludur. + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +ui = _load_ui_gui() + +INVENTORY_YAML = textwrap.dedent( + """ + # gecici test envanteri (gercek cihaz degil) + all: + children: + blueforce: + children: + lab: + hosts: + bf-12010101: + ansible_host: 10.42.0.11 + pilot_1: + hosts: + bf-12010193: + ansible_host: 10.42.1.11 + production: + hosts: + bf-12010999: + ansible_host: 10.42.9.11 + """ +).strip() + "\n" + + +class StaticCase(unittest.TestCase): + """Tum testler icin ortak kurulum: gecici envanter + backend.""" + + tmpdir: tempfile.TemporaryDirectory + + @classmethod + def setUpClass(cls) -> None: + cls.tmpdir = tempfile.TemporaryDirectory(prefix="bfos-gui-test-") + cls.inventory = Path(cls.tmpdir.name) / "hosts.yml" + cls.inventory.write_text(INVENTORY_YAML, encoding="utf-8") + cls.ctx = ui.GuiContext.detect(inventory=str(cls.inventory)) + cls.backend, cls.backend_note = ui.load_backend(cls.ctx) + + @classmethod + def tearDownClass(cls) -> None: + cls.tmpdir.cleanup() + + # -- kucuk yardimcilar ------------------------------------------------- + def operation(self, operation_id: str): + for op in self.backend.list_operations(): + if op.id == operation_id: + return op + self.fail(f"katalogda islem yok: {operation_id}") + + def available_fleet_operation(self, scope: str = "simple"): + """Playbook'u DISKTE olan bir filo islemi (depo es zamanli degisebilir).""" + for op in self.backend.list_operations(): + if op.is_fleet and op.scope == scope and op.playbook and \ + ui.playbook_path(REPO_ROOT, op.playbook).is_file(): + return op + self.skipTest(f"kullanilabilir {scope} kapsamli filo islemi yok") + + SAMPLE_VALUES = { + "script": "/opt/blueforce/bin/deneme.sh", + "packages": "docker-ce=5:27.0.3-1~ubuntu.24.04~noble", + "service": "docker", + "only": "01-precheck", + "grace": "300", + "log_lines": "500", + } + + def valid_options(self, operation) -> dict: + """Zorunlu secenekler icin gecerli ornek degerlerle sozluk uretir.""" + options: dict = {} + for spec in operation.options: + value = self.SAMPLE_VALUES.get(spec.name, spec.default) + if spec.required and not value: + self.skipTest(f"{operation.id}: '{spec.name}' icin ornek deger yok") + options[spec.name] = value + return options + + def dealer_target(self, dealer: str = "12010193"): + return ui.Target("dealer", dealer) + + def group_target(self, group: str = "pilot_1"): + return ui.Target("group", group) + + +class TestDealerValidation(StaticCase): + def test_valid_dealer_numbers(self) -> None: + for value in ("12010193", "00000000", "99999999"): + self.assertTrue(ui.validate_dealer(value), value) + self.assertIsNone(ui.dealer_error(value), value) + + def test_invalid_dealer_numbers(self) -> None: + for value in ("", "1201019", "120101933", "1201019a", "1201 0193", + " 12010193", "12010193 ", "bf-12010193", "12345678"): + self.assertFalse(ui.validate_dealer(value), repr(value)) + self.assertIsNotNone(ui.dealer_error(value), repr(value)) + + def test_error_message_is_turkish_and_actionable(self) -> None: + message = ui.dealer_error("1201019") + self.assertIn("8 hane", message) + self.assertIn("1201019", message) + self.assertIn("12010193", message) # ornek deger + self.assertIn("rakam", ui.dealer_error("abcdefgh")) + + def test_dealer_derived_names(self) -> None: + self.assertEqual(ui.dealer_to_host("12010193"), "bf-12010193") + self.assertEqual(ui.dealer_to_device_id("12010193"), "BF-12010193") + self.assertEqual(ui.host_to_dealer("bf-12010193"), "12010193") + self.assertIsNone(ui.host_to_dealer("sunucu-1")) + + def test_dealer_host_matches_repo_conventions(self) -> None: + # docs/02: hostname bf-<8 hane>, insan kimligi BF-<8 hane> + self.assertEqual(ui.HOST_PATTERN.pattern, r"^bf-[0-9]{8}$") + self.assertEqual(ui.DEALER_PATTERN.pattern, r"^[0-9]{8}$") + + +class TestHeadlessAndTkinter(StaticCase): + def test_detects_headless_without_display(self) -> None: + message = ui.headless_error({}) + self.assertIsNotNone(message) + self.assertIn("DISPLAY", message) + self.assertIn("SSH", message) + # Grafik arayüz açılamadığında önerilen yol aynı uygulamanın terminal + # konsoludur; bash menü artık yedek (bkz. TERMINAL_MENU_HINT). + self.assertIn("bf --tui", message) + self.assertIn("python3 -m bfos.ui_gui", message) + + def test_display_and_wayland_are_accepted(self) -> None: + self.assertIsNone(ui.headless_error({"DISPLAY": ":0"})) + self.assertIsNone(ui.headless_error({"WAYLAND_DISPLAY": "wayland-0"})) + self.assertIsNone(ui.headless_error({"DISPLAY": ":99", + "WAYLAND_DISPLAY": "wayland-9"})) + + def test_tkinter_missing_message_mentions_package(self) -> None: + message = ui.tkinter_missing_message("No module named '_tkinter'") + self.assertIn("python3-tk", message) + self.assertIn("apt", message) + self.assertIn("bf --tui", message) + self.assertIn("_tkinter", message) + + def test_window_start_error_is_turkish(self) -> None: + message = ui.window_start_error(RuntimeError("no display name and no $DISPLAY")) + self.assertIn("Pencere açılamadı", message) + self.assertIn("ssh -X", message) + self.assertIn("bf --tui", message) + + def test_import_does_not_create_a_window(self) -> None: + # tkinter varsa bile modul import'u bir Tk koku olusturmamalidir: + # BfGui yalnizca acikca verilen bir root ile kurulabilir. + self.assertIsInstance(ui.HAVE_TKINTER, bool) + import inspect + + signature = inspect.signature(ui.BfGui.__init__) + self.assertIn("root", signature.parameters) + # Yardimcilar tkinter olmadan da cagrilabilir. + self.assertIsNone(ui.dealer_error("12010193")) + + def test_main_list_prints_catalogue_without_a_window(self) -> None: + buffer = io.StringIO() + with contextlib.redirect_stdout(buffer): + code = ui.main(["--list", "--inventory", str(self.inventory)]) + self.assertEqual(code, 0) + output = buffer.getvalue() + self.assertIn("işlem kataloğu", output) + for category in ui.CATEGORIES: + self.assertIn(category, output) + + def test_main_reports_headless_with_exit_3(self) -> None: + env = {k: v for k, v in os.environ.items() + if k not in ("DISPLAY", "WAYLAND_DISPLAY")} + stderr = io.StringIO() + import unittest.mock as mock + + with mock.patch.dict(os.environ, env, clear=True), \ + contextlib.redirect_stderr(stderr): + code = ui.main([]) + self.assertEqual(code, 3) + # Aynı uygulamanın terminal konsoluna yönlendirmeli (bf --tui). + self.assertIn("bf --tui", stderr.getvalue()) + + +class TestRootGate(StaticCase): + """Tam yetkili GUI: yazma işlemleri root ister, raporlar her zaman açık. + + Katalogun kendi `destructive` işareti ölçüt alınır (bkz. ui_gui + _normalize_operation); bu yüzden testler katalogdan örnek seçer, sabit + isimlere bağlanmaz. + """ + + def test_is_root_reflects_the_effective_uid(self) -> None: + original = os.geteuid + try: + os.geteuid = lambda: 0 + self.assertTrue(ui.is_root()) + self.assertTrue(ui.write_operations_enabled()) + os.geteuid = lambda: 1000 + self.assertFalse(ui.is_root()) + self.assertFalse(ui.write_operations_enabled()) + finally: + os.geteuid = original + + def test_destructive_operations_require_root(self) -> None: + writes = [op for op in self.backend.list_operations() if op.destructive] + self.assertTrue(writes, "katalogda yazma işlemi yok; kapı test edilemez") + for op in writes: + self.assertTrue(op.needs_root, + f"{op.id} yıkıcı ama needs_root değil") + + def test_read_only_operations_do_not_require_root(self) -> None: + reports = [op for op in self.backend.list_operations() if not op.destructive] + self.assertTrue(reports, "katalogda salt-okunur işlem yok") + frozen = [op.id for op in reports if op.needs_root] + self.assertEqual([], frozen, + "salt-okunur işlemler root istememeli: " + ", ".join(frozen)) + + def test_notice_names_the_command_to_get_privileges(self) -> None: + self.assertIn("sudo bf", ui.ROOT_REQUIRED_NOTICE) + self.assertIn("sudo bf", ui.NON_ROOT_DISABLED_HINT) + + def test_run_plan_refuses_a_root_plan_without_root(self) -> None: + """Son savunma hattı: çalıştırma tek noktadan geçer.""" + plan = ui.CommandPlan( + commands=(("true",),), + destructive=True, + requires_root=True, + operation_id="install-local", + ) + original = os.geteuid + try: + os.geteuid = lambda: 1000 + result = ui.run_plan(plan) + finally: + os.geteuid = original + self.assertFalse(result.ok) + self.assertEqual(2, result.exit_code) + self.assertIn("yönetici yetkisi", result.output.lower()) + + def test_run_plan_allows_a_root_plan_when_root(self) -> None: + plan = ui.CommandPlan( + commands=(("true",),), + destructive=True, + requires_root=True, + operation_id="install-local", + ) + original = os.geteuid + try: + os.geteuid = lambda: 0 + result = ui.run_plan(plan) + finally: + os.geteuid = original + self.assertTrue(result.ok, result.output) + + +class TestSimpleModeLayout(StaticCase): + def test_three_big_buttons_in_simple_mode(self) -> None: + self.assertEqual(ui.SIMPLE_MODE_BUTTONS, ("Kur", "Durum", "Çıkış")) + self.assertEqual(ui.SIMPLE_MODE_LABEL, "Detaylı mod") + + def test_window_title_is_turkish(self) -> None: + self.assertEqual(ui.WINDOW_TITLE, "Blueforce Field OS — Yönetim") + + def test_five_category_tabs(self) -> None: + self.assertEqual( + ui.CATEGORIES, + ("Kurulum", "Cihaz işlemleri", "Merkez hazırlığı", "Araçlar", "Cihaz bilgisi"), + ) + + +class TestCatalogue(StaticCase): + def test_operations_have_unique_ids_and_known_categories(self) -> None: + operations = self.backend.list_operations() + self.assertGreaterEqual(len(operations), 21) + ids = [op.id for op in operations] + self.assertEqual(len(ids), len(set(ids)), "islem id'leri tekil olmali") + for op in operations: + self.assertIn(op.category, ui.CATEGORIES, op.id) + self.assertTrue(op.label.strip(), op.id) + + def test_every_category_has_at_least_one_operation(self) -> None: + for category in ui.CATEGORIES: + with self.subTest(category=category): + self.assertTrue( + [op for op in self.backend.list_operations() if op.category == category], + f"{category} kategorisi bos", + ) + + def test_fleet_operation_playbooks_match_declared_scope(self) -> None: + """Konsol tablosu playbook'la uyusmali; playbook yoksa CALISTIRMA reddedilir. + + (bf_playbook_check + fail-closed kuralinin statik karsiligi.) + """ + checked = 0 + missing: list[str] = [] + for op in self.backend.list_operations(): + if not op.is_fleet: + continue + book = ui.playbook_path(REPO_ROOT, op.playbook) + if not book.is_file(): + # Eksik playbook SESSIZ gecilemez: komut uretimi reddedilmeli. + missing.append(f"{op.id} ({op.playbook})") + with self.subTest(operation=op.id): + with self.assertRaises(ui.CommandError): + self.backend.build_command(op, self.group_target()) + continue + with self.subTest(operation=op.id): + self.assertEqual( + ui.playbook_scope(book), op.scope, + f"{op.playbook}: tablo '{op.scope}' derken playbook " + f"'{ui.playbook_scope(book)}' beyan ediyor", + ) + checked += 1 + self.assertGreaterEqual(checked, 15) + if missing: + print(f"\n[UYARI] bu checkout'ta playbook dosyası eksik: {', '.join(missing)}" + " -> ilgili işlemler fail-closed olarak reddediliyor") + + def test_every_ansible_playbook_is_covered_or_known(self) -> None: + """Katalog disinda kalan playbook varsa gorunur olmali (sessiz kapsam disi yok).""" + catalogue = {op.playbook for op in self.backend.list_operations() if op.is_fleet} + on_disk = {p.name for p in (REPO_ROOT / "ansible" / "playbooks").glob("bf-*.yml")} + self.assertEqual(on_disk - catalogue, set()) + + def test_operation_ids_match_admin_bf_menu_catalogue(self) -> None: + """id'ler admin/bf-menu tablosuyla ayni olmali (iki giris noktasi ayrisamaz).""" + menu = (REPO_ROOT / "admin" / "bf-menu").read_text(encoding="utf-8") + for op in self.backend.list_operations(): + if op.is_fleet: + with self.subTest(operation=op.id): + self.assertIn(f'"{op.id}|', menu) + + +class TestDestructiveClassification(StaticCase): + YIKICI = ("rdp-restart", "rustdesk-restart", "wireguard-restart", "service-restart", + "gui-off", "gui-on", "run-script", "reboot", "deploy-update", + "install-local", "install-resume", "install-module", "tools-git-pull") + SALT_OKUNUR = ("ping", "uptime", "disk", "docker", "packages", "security-updates", + "provisioning-status", "enrollment-status", "fieldos-version", + "remote-channels", "offline-ready", "collect-logs", "install-preflight", + "install-state", "install-log", "central-targets", "info-summary", + "tools-release", "tools-support-bundle") + + def test_destructive_ids_are_flagged(self) -> None: + flagged = set(ui.destructive_operations(self.backend.list_operations())) + for operation_id in self.YIKICI: + with self.subTest(operation=operation_id): + self.assertIn(operation_id, flagged) + self.assertTrue(ui.operation_is_destructive(operation_id)) + + def test_read_only_ids_are_not_flagged(self) -> None: + flagged = set(ui.destructive_operations(self.backend.list_operations())) + for operation_id in self.SALT_OKUNUR: + with self.subTest(operation=operation_id): + self.assertNotIn(operation_id, flagged) + self.assertFalse(ui.operation_is_destructive(operation_id)) + + def test_destructive_flag_reaches_the_plan(self) -> None: + plan = self.backend.build_command(self.operation("reboot"), self.group_target(), + {"grace": "300"}) + self.assertTrue(plan.destructive) + plan = self.backend.build_command(self.operation("ping"), self.group_target()) + self.assertFalse(plan.destructive) + + def test_unknown_operation_is_not_destructive(self) -> None: + self.assertFalse(ui.operation_is_destructive("boyle-bir-islem-yok")) + + +class TestCommandPreview(StaticCase): + def test_fleet_preview_shows_the_exact_command(self) -> None: + operation = self.available_fleet_operation() + target = self.dealer_target() + plan = self.backend.build_command(operation, target, self.valid_options(operation)) + preview = ui.preview_text(plan, operation=operation, target=target) + self.assertTrue(plan.lines, "en az bir komut satiri uretilmeli") + for line in plan.lines: + self.assertIn(line, preview) + self.assertIn("ansible-playbook", preview) + self.assertIn("--limit", preview) + self.assertIn("bf-12010193", preview) + self.assertIn(operation.playbook, preview) + self.assertIn("Çalıştırılacak komut", preview) + + def test_preview_marks_destructive_operations(self) -> None: + operation = self.operation("deploy-update") + plan = self.backend.build_command( + operation, self.group_target(), + {"packages": "docker-ce=5:27.0.3-1~ubuntu.24.04~noble"}, + ) + preview = ui.preview_text(plan, operation=operation) + self.assertIn("UYARI", preview) + self.assertIn("YIKICI", preview) + self.assertIn("update_packages=", preview) + + def test_preview_lists_target_and_scope_in_turkish(self) -> None: + operation = self.operation("provisioning-status") + target = self.group_target() + plan = self.backend.build_command(operation, target) + preview = ui.preview_text(plan, operation=operation, target=target) + self.assertIn("dalga", preview.lower()) + self.assertIn("dalga kapılı", preview) + + def test_preview_of_report_only_plan_says_nothing_runs(self) -> None: + operation = self.operation("central-targets") + plan = self.backend.build_command(operation, None) + self.assertTrue(plan.is_report_only) + preview = ui.preview_text(plan, operation=operation) + self.assertIn("komut çalıştırmaz", preview) + self.assertNotIn("Çalıştırılacak komut(lar)", preview) + + def test_check_mode_is_visible_in_command_and_preview(self) -> None: + operation = self.available_fleet_operation() + target = self.group_target() + plan = self.backend.build_command( + operation, target, self.valid_options(operation), check_mode=True + ) + self.assertTrue(plan.check_mode) + self.assertIn("--check", " ".join(plan.lines)) + preview = ui.preview_text(plan, operation=operation, target=target) + self.assertIn("--check", preview) + self.assertIn("değişiklik uygulanmaz", preview) + + def test_options_change_the_previewed_command(self) -> None: + operation = self.operation("disk") + options = {spec.name: "75" for spec in operation.options if "disk" in spec.name} + if not options: + self.skipTest("disk isleminin esik secenegi yok") + plan = self.backend.build_command(operation, self.group_target(), options) + self.assertIn("disk_warn_pct=75", " ".join(plan.lines)) + + def test_invalid_option_is_refused_with_turkish_message(self) -> None: + operation = self.operation("service-restart") + name = "service" if any(s.name == "service" for s in operation.options) else "service_name" + with self.assertRaises(ui.CommandError) as ctx: + self.backend.build_command(operation, self.group_target(), {name: "kritik-servis"}) + self.assertIn("izinli", str(ctx.exception).lower()) + + def test_missing_required_option_is_refused(self) -> None: + operation = self.operation("deploy-update") + name = "packages" if any(s.name == "packages" for s in operation.options) \ + else "update_packages" + with self.assertRaises(ui.CommandError): + self.backend.build_command(operation, self.group_target(), {name: ""}) + + +class TestGatesAndTargets(StaticCase): + def test_wave_operation_requires_wave_token(self) -> None: + # A wave-scoped READ-ONLY report asks for no gate token -- the bash + # console behaves the same way (see bfos/operations.confirmation_plan: + # only release-gated runs and the production wave ask for a written + # token). What must hold is that the built command carries the wave + # scope and the confirmation flag, so the playbook's own gate accepts it. + steps = self.backend.gate_steps(self.operation("provisioning-status"), + self.group_target()) + tokens = [s.token for s in steps if s.kind == "token"] + self.assertEqual([], tokens, + "a read-only wave report must not ask for a gate token") + plan = self.backend.build_command(self.operation("provisioning-status"), + self.group_target(), {}, {}) + argv = list(plan.commands[0]) + self.assertIn("operation_wave=pilot_1", argv) + self.assertIn("operation_confirmed=true", argv) + + def test_release_gated_operation_requires_wave_token(self) -> None: + # The gate that must never disappear: reboot/deploy-update are + # release-gated, so the wave name has to be typed before anything runs. + steps = self.backend.gate_steps(self.operation("reboot"), + self.group_target()) + tokens = [s.token for s in steps if s.kind == "token"] + self.assertIn("pilot_1", tokens) + + def test_destructive_operation_requires_second_approval(self) -> None: + steps = self.backend.gate_steps(self.operation("gui-off"), self.group_target()) + self.assertTrue([s for s in steps if s.kind == "approval"], steps) + + def test_production_wave_requires_production_token(self) -> None: + steps = self.backend.gate_steps(self.operation("gui-off"), + self.group_target("production")) + tokens = [s.token for s in steps if s.kind == "token"] + self.assertIn("production", tokens) + unlocks = {name for step in steps for name in step.unlocks} + self.assertIn("production_override", unlocks) + + def test_release_scope_refuses_single_device_and_fleet(self) -> None: + operation = self.operation("reboot") + with self.assertRaises(ui.CommandError) as ctx: + self.backend.build_command(operation, self.dealer_target(), {"grace": "300"}) + self.assertIn("dalga", str(ctx.exception).lower()) + with self.assertRaises(ui.CommandError): + self.backend.build_command(operation, ui.Target("all", "all"), {"grace": "300"}) + + def test_wave_scope_refuses_a_non_wave_group(self) -> None: + operation = self.operation("gui-on") + with self.assertRaises(ui.CommandError): + self.backend.build_command(operation, self.group_target("blueforce")) + + def test_wave_scope_on_a_dealer_resolves_the_wave(self) -> None: + plan = self.backend.build_command(self.operation("gui-off"), self.dealer_target()) + line = " ".join(plan.lines) + self.assertIn("operation_wave=pilot_1", line) + self.assertIn("operation_confirmed=true", line) + self.assertIn("bf-12010193", line) + + def test_unknown_dealer_outside_inventory_is_refused(self) -> None: + operation = self.available_fleet_operation() + with self.assertRaises(ui.CommandError) as ctx: + self.backend.build_command(operation, self.dealer_target("12010000")) + self.assertIn("12010000", str(ctx.exception)) + + def test_invalid_dealer_never_builds_a_command(self) -> None: + operation = self.available_fleet_operation() + with self.assertRaises(ui.CommandError): + self.backend.build_command(operation, self.dealer_target("123")) + + def test_grants_change_the_gated_command(self) -> None: + operation = self.operation("reboot") + target = self.group_target("production") + options = {"grace": "120"} + if not any(s.name == "grace" for s in operation.options): + options = {"reboot_grace_seconds": "120"} + draft = self.backend.build_command(operation, target, options) + final = self.backend.build_command( + operation, target, options, + grants={"wave_gate_confirmed": True, "production_override": True, + "allow_production_reboot": True}, + ) + joined = " ".join(final.lines) + self.assertIn("allow_production_reboot=true", joined) + self.assertNotIn("allow_production_reboot=true", " ".join(draft.lines)) + self.assertNotEqual(draft.lines, final.lines) + + def test_no_gate_flag_is_ever_added_silently(self) -> None: + """Onaysiz hicbir komut kapi bayragi tasimamali (fail-closed).""" + checked = 0 + for operation in self.backend.list_operations(): + if not operation.is_fleet or operation.scope == "simple": + continue + target = self.group_target("production" if operation.scope == "release" + else "pilot_1") + options = self.valid_options(operation) + try: + plan = self.backend.build_command(operation, target, options) + except ui.CommandError: + # Playbook eksik/kapi reddi: komut URETILMEDI, bu da guvenli. + continue + with self.subTest(operation=operation.id): + joined = " ".join(plan.lines) + for flag in ("wave_gate_confirmed=true", "production_override=true", + "allow_production_reboot=true"): + self.assertNotIn(flag, joined, + f"{operation.id}: onaysiz kapi bayragi uretildi") + checked += 1 + self.assertGreaterEqual(checked, 1) + + +class TestRunnerStreaming(StaticCase): + def test_run_command_streams_lines_and_returns_exit_code(self) -> None: + lines: list[str] = [] + result = ui.run_command( + [sys.executable, "-c", "print('merhaba'); print('dunya')"], + on_line=lines.append, + ) + self.assertEqual(result.exit_code, 0) + self.assertTrue(result.ok) + self.assertEqual(lines, ["merhaba", "dunya"]) + self.assertIn("merhaba", result.output) + + def test_run_command_reports_nonzero_exit_code(self) -> None: + result = ui.run_command([sys.executable, "-c", "import sys; sys.exit(3)"]) + self.assertEqual(result.exit_code, 3) + self.assertFalse(result.ok) + + def test_missing_command_gives_turkish_message(self) -> None: + result = ui.run_command(["boyle-bir-komut-yok-12345"]) + self.assertEqual(result.exit_code, 127) + self.assertFalse(result.ok) + self.assertIn("bulunamadı", result.output) + self.assertIn("bf-bootstrap", result.output) + + def test_run_plan_stops_at_the_first_failure(self) -> None: + plan = ui.CommandPlan( + commands=( + (sys.executable, "-c", "import sys; print('ilk'); sys.exit(4)"), + (sys.executable, "-c", "print('IKINCI-CALISMAMALI')"), + ) + ) + lines: list[str] = [] + result = ui.run_plan(plan, on_line=lines.append) + self.assertEqual(result.exit_code, 4) + self.assertFalse(result.ok) + self.assertIn("ilk", lines) + self.assertNotIn("IKINCI-CALISMAMALI", lines) + + def test_run_plan_executes_nothing_for_a_report_plan(self) -> None: + plan = ui.CommandPlan(report_lines=("satır 1", "satır 2")) + lines: list[str] = [] + result = ui.run_plan(plan, on_line=lines.append) + self.assertTrue(result.ok) + self.assertEqual(lines, ["satır 1", "satır 2"]) + self.assertEqual(result.exit_code, 0) + + def test_dry_run_plan_does_not_execute(self) -> None: + plan = ui.CommandPlan( + commands=((sys.executable, "-c", "print('CALISMAMALI')"),), + dry_run=True, + ) + lines: list[str] = [] + result = ui.run_plan(plan, on_line=lines.append) + self.assertTrue(result.ok) + # Yalnizca "[deneme] " satiri yazilir; komutun CIKTISI yazilmaz. + self.assertTrue(lines) + self.assertTrue(all(line.startswith("[deneme] ") for line in lines), lines) + self.assertNotIn("CALISMAMALI", result.output) + self.assertIn("[deneme]", result.output) + + +class TestInventoryHelpers(StaticCase): + def test_parses_groups_and_hosts(self) -> None: + groups = ui.parse_inventory(self.inventory) + self.assertEqual(groups.get("pilot_1"), ["bf-12010193"]) + self.assertEqual(groups.get("lab"), ["bf-12010101"]) + self.assertEqual(groups.get("production"), ["bf-12010999"]) + + def test_wave_list_follows_rollout_order(self) -> None: + groups = ui.parse_inventory(self.inventory) + self.assertEqual(ui.waves_in_inventory(groups), ("lab", "pilot_1", "production")) + self.assertEqual(ui.WAVES, + ("lab", "pilot_1", "pilot_2", "wave_1", "wave_2", "production")) + + def test_device_wave_lookup(self) -> None: + groups = ui.parse_inventory(self.inventory) + self.assertEqual(ui.device_wave("bf-12010193", groups), "pilot_1") + self.assertIsNone(ui.device_wave("bf-99999999", groups)) + + def test_missing_inventory_does_not_crash(self) -> None: + self.assertEqual(ui.parse_inventory(Path("/yok/boyle/bir/dosya.yml")), {}) + + def test_missing_machine_inventory_is_reported_in_turkish(self) -> None: + backend = ui.CatalogueBackend(ui.GuiContext(repo_root=REPO_ROOT, inventory=None)) + note = backend.inventory_note() + self.assertIn("envanter", note.lower()) + self.assertIn("hosts.yml", note) + + def test_inventory_note_survives_and_warns_without_ansible(self) -> None: + """Not uretimi hicbir durumda patlamamali (eksik import regresyonu).""" + for backend in ( + ui.CatalogueBackend(ui.GuiContext(repo_root=REPO_ROOT, + inventory=self.inventory)), + self.backend, + ): + with self.subTest(backend=type(backend).__name__): + note = backend.inventory_note() + self.assertIn("Envanter", note) + if shutil.which("ansible-playbook") is None: + self.assertIn("ansible-playbook bulunamadı", note) + + def test_dealer_wave_gate_requires_inventory(self) -> None: + backend = ui.CatalogueBackend(ui.GuiContext(repo_root=REPO_ROOT, inventory=None)) + problem = backend.validate_target( + ui.operation_by_id("gui-off") or ui.OPERATIONS[0], self.dealer_target() + ) + self.assertIsNotNone(problem) + + +class TestCatalogueBackendFallback(StaticCase): + """Gercek moduller yoksa da ayni kurallar gecerli olmali (ayna backend).""" + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.fallback = ui.CatalogueBackend(cls.ctx) + + def test_fallback_has_the_same_fleet_operations(self) -> None: + fleet = {op.id for op in self.fallback.list_operations() if op.is_fleet} + self.assertGreaterEqual(len(fleet), 21) + self.assertIn("ping", fleet) + self.assertIn("deploy-update", fleet) + + def test_fallback_builds_the_same_core_arguments(self) -> None: + operation = None + for candidate in self.fallback.list_operations(): + if candidate.is_fleet and candidate.scope == "simple" and candidate.playbook \ + and ui.playbook_path(REPO_ROOT, candidate.playbook).is_file(): + operation = candidate + break + if operation is None: + self.skipTest("kullanilabilir basit kapsamli filo islemi yok") + options = {spec.name: self.SAMPLE_VALUES[spec.name] + for spec in operation.options if spec.name in self.SAMPLE_VALUES} + plan = self.fallback.build_command(operation, self.dealer_target(), options) + joined = " ".join(plan.lines) + self.assertIn("ansible-playbook", joined) + self.assertIn(f"-i {self.ctx.inventory}", joined) + self.assertIn("--limit bf-12010193", joined) + + def test_fallback_uses_the_same_destructive_table(self) -> None: + destructive = set(ui.destructive_operations(self.fallback.list_operations())) + self.assertEqual(destructive, set(ui.destructive_operations())) + + def test_fallback_refuses_missing_inventory(self) -> None: + backend = ui.CatalogueBackend(ui.GuiContext(repo_root=REPO_ROOT, inventory=None)) + with self.assertRaises(ui.CommandError) as ctx: + backend.build_command(ui.operation_by_id("uptime"), self.dealer_target()) + self.assertIn("envanter", str(ctx.exception).lower()) + + def test_fallback_refuses_scope_mismatch_with_the_playbook(self) -> None: + """Tablo playbook'la celisirse komut URETILMEZ (bf_playbook_check kurali).""" + wrong = ui.Operation( + id="uptime", label="Yanlış kapsam", category="Cihaz işlemleri", + destructive=False, scope="wave", playbook="bf-uptime.yml", + ) + with self.assertRaises(ui.CommandError) as ctx: + self.fallback.build_command(wrong, self.group_target()) + self.assertIn("bf-uptime.yml", str(ctx.exception)) + self.assertIn("kapsam", str(ctx.exception).lower()) + + def test_fallback_installs_only_with_a_valid_dealer(self) -> None: + installer = REPO_ROOT / ui.INSTALLER_REL + if not installer.is_file(): + self.skipTest("kurulum betigi bu checkout'ta yok") + plan = self.fallback.build_command( + ui.operation_by_id("install-preflight"), self.dealer_target() + ) + joined = " ".join(plan.lines) + self.assertIn("--dealer-id 12010193", joined) + self.assertIn("--check", joined) + self.assertFalse(plan.destructive) + + +# --------------------------------------------------------------------------- +# Tasarim sozlesmesi (docs/DESIGN.md + web/static/tokens.css) +# --------------------------------------------------------------------------- +def _srgb_channel(value: float) -> float: + return value / 12.92 if value <= 0.03928 else ((value + 0.055) / 1.055) ** 2.4 + + +def relative_luminance(colour: str) -> float: + """WCAG bagil parlaklik (hex token rengi).""" + r, g, b = (int(colour[index:index + 2], 16) / 255 for index in (1, 3, 5)) + return 0.2126 * _srgb_channel(r) + 0.7152 * _srgb_channel(g) + 0.0722 * _srgb_channel(b) + + +def contrast_ratio(first: str, second: str) -> float: + """Iki token rengi arasindaki WCAG kontrast orani.""" + a, b = relative_luminance(first), relative_luminance(second) + lighter, darker = max(a, b), min(a, b) + return (lighter + 0.05) / (darker + 0.05) + + +class TestThemeMirrorsTokensCss(StaticCase): + """bfos/ui_theme.py, web/static/tokens.css'in BIREBIR aynasi olmali. + + Iki yuzey (cihaz konsolu + merkez panel) ayni sozlugu konusur; bir tarafta + degistirilip digerinde unutulan bir token sessiz bir ayrisma olurdu. Bu + yuzden aynalama testtir (docs/DESIGN.md, "Rules"). + """ + + CSS_PATH = REPO_ROOT / "web" / "static" / "tokens.css" + + #: Tk'de karsiligi olmayan token'lar (golge, yazi tipi listesi, satir + #: yuksekligi orani, yuvarlaklik): konsol bunlari kullanmaz, ama CSS'te + #: kalirlar cunku merkez panel kullanir. + NOT_MIRRORED = ( + "--font-ui", "--font-data", + "--leading-tight", "--leading-normal", + "--shadow-sm", "--shadow-md", + "--radius", "--radius-lg", + ) + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.theme = ui.theme + cls.css = cls._parse_tokens(cls.CSS_PATH.read_text(encoding="utf-8")) + + @staticmethod + def _parse_tokens(text: str) -> dict: + """`--ad: deger;` ciftlerini toplar, var(--x) referanslarini cozer.""" + raw = { + match.group(1): match.group(2).strip() + for match in re.finditer(r"(--[a-z0-9-]+)\s*:\s*([^;]+);", text) + } + resolved = {} + for name, value in raw.items(): + reference = re.fullmatch(r"var\((--[a-z0-9-]+)\)", value) + resolved[name] = raw.get(reference.group(1), value) if reference else value + return resolved + + def test_the_mirror_source_exists(self) -> None: + self.assertTrue(self.CSS_PATH.is_file(), str(self.CSS_PATH)) + self.assertTrue(self.css, "tokens.css icinde token bulunamadi") + + def test_every_mirrored_value_equals_the_css(self) -> None: + for name, value in self.theme.ALL_TOKENS.items(): + with self.subTest(token=name): + self.assertIn(name, self.css, f"{name} tokens.css'te yok") + css_value = self.css[name] + if css_value.endswith("px"): + css_value = css_value[:-2] + self.assertEqual(value, css_value.strip(), + f"{name}: ui_theme.py ile tokens.css ayrismis") + + def test_the_colour_palette_is_fully_mirrored(self) -> None: + """CSS'teki her RENK tokeninin Python karsiligi olmali (fazla renk = hata).""" + css_colours = {name for name, value in self.css.items() if value.startswith("#")} + python_colours = {name for name, value in self.theme.TOKENS.items() + if value.startswith("#")} + self.assertEqual(css_colours, python_colours) + self.assertTrue(css_colours) + + def test_state_and_severity_pairs_have_readable_contrast(self) -> None: + """Durum renkleri gunesli atolyede okunmali; rozet sozcugu de yaninda.""" + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT, self.theme.BG_APP), 7.0) + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT, self.theme.BG_PANEL), 7.0) + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT_MUTED, + self.theme.BG_PANEL), 4.5) + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT_FAINT, + self.theme.BG_PANEL), 3.0) + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT_ON_DARK, + self.theme.BG_HEADER), 7.0) + self.assertGreaterEqual(contrast_ratio(self.theme.TEXT_ON_ACCENT, + self.theme.ACCENT), 4.5) + # En dusuk cift "yesil zemin + yesil yazi" (4.42:1); esik bunun altina inmez. + for key, word in self.theme.STATE_WORDS.items(): + with self.subTest(state=word): + self.assertGreaterEqual( + contrast_ratio(self.theme.STATE_TEXT_COLOUR[key], + self.theme.STATE_FILL[key]), 4.4) + for severity in self.theme.SEVERITIES: + with self.subTest(severity=severity): + self.assertGreaterEqual( + contrast_ratio(self.theme.SEVERITY_TEXT[severity], + self.theme.SEVERITY_FILL[severity]), 4.4) + + def test_fonts_resolve_to_platform_families_without_downloads(self) -> None: + """Webfont yok: aday listesi platformda VAR OLAN bir yuzeye duser.""" + self.assertTrue(self.theme.FONT_UI_CANDIDATES) + self.assertTrue(self.theme.FONT_DATA_CANDIDATES) + self.assertTrue(self.theme.FONT_UI_FALLBACK) + self.assertTrue(self.theme.FONT_DATA_FALLBACK) + for family in (list(self.theme.FONT_UI_CANDIDATES) + + list(self.theme.FONT_DATA_CANDIDATES)): + with self.subTest(family=family): + self.assertNotIn("/", family) + self.assertNotIn(".ttf", family.lower()) + self.assertNotIn("http", family.lower()) + + def test_px_tokens_convert_to_tk_point_sizes(self) -> None: + sizes = (self.theme.SIZE_XS, self.theme.SIZE_SM, self.theme.SIZE_MD, + self.theme.SIZE_LG, self.theme.SIZE_XL, self.theme.SIZE_2XL) + for size in sizes: + with self.subTest(size=size): + self.assertLess(self.theme.point_size(size), size) + self.assertGreaterEqual(self.theme.point_size(size), 7) + # Siralama korunur: buyuk token daha buyuk puan uretir (esitlik yok). + points = [self.theme.point_size(size) for size in sizes] + self.assertEqual(points, sorted(points)) + self.assertEqual(len(set(points)), len(points)) + + def test_the_space_rhythm_is_the_committed_one(self) -> None: + self.assertEqual( + [self.theme.SP_1, self.theme.SP_2, self.theme.SP_3, self.theme.SP_4, + self.theme.SP_5, self.theme.SP_6, self.theme.SP_7], + [4, 8, 12, 16, 24, 32, 48], + ) + self.assertEqual(self.theme.ROW_H, 44) + self.assertEqual(self.theme.HEADER_H, 56) + + +class TestStateVocabulary(StaticCase): + """Durum sozlugu: TEK sozcuk, renk tek basina anlam tasimaz.""" + + def test_the_five_words_are_exactly_the_committed_ones(self) -> None: + self.assertEqual(ui.DEVICE_STATES, + ("KURULDU", "KAYITLI", "HAZIR", "HATA", "YOK")) + self.assertEqual(set(ui.DEVICE_STATES), set(ui.theme.STATE_WORDS.values())) + + def test_every_word_has_its_own_badge_style(self) -> None: + styles = [ui.state_badge_style(word) for word in ui.DEVICE_STATES] + self.assertEqual(len(set(styles)), len(styles), styles) + for style in styles: + self.assertTrue(style.endswith(".Badge.TLabel"), style) + for key, style in ui.theme.STATE_BADGE_STYLE.items(): + with self.subTest(state=key): + self.assertEqual(style, + ui.state_badge_style(ui.theme.STATE_WORDS[key])) + + def test_every_word_has_its_own_text_colour(self) -> None: + self.assertEqual(len(set(ui.theme.STATE_TEXT_COLOUR.values())), + len(ui.DEVICE_STATES)) + + def test_badge_fills_come_from_the_token_set(self) -> None: + """Dolgu renkleri token kumesinden gelir; uydurulmus renk yok.""" + allowed = set(ui.theme.TOKENS.values()) | set(ui.theme.SEVERITY_FILL.values()) + for key, fill in ui.theme.STATE_FILL.items(): + with self.subTest(state=key): + self.assertIn(fill, allowed) + self.assertIn(ui.theme.STATE_TEXT_COLOUR[key], allowed) + + def test_provisioned_is_not_the_action_accent(self) -> None: + """KURULDU ile secili satir ayni maviye boyanamaz (tokens.css).""" + self.assertNotEqual(ui.theme.STATE_TEXT_COLOUR["provisioned"], + ui.theme.ACCENT) + self.assertNotEqual(ui.theme.STATE_FILL["provisioned"], + ui.theme.ACCENT_SOFT) + + def test_unknown_word_falls_back_to_a_neutral_badge(self) -> None: + self.assertEqual(ui.state_badge_style("BOYLE-BIR-DURUM-YOK"), + ui.theme.STATE_BADGE_STYLE["absent"]) + + def test_the_state_machine_maps_to_one_word(self) -> None: + cases = ( + ({}, "YOK"), + ({"phase": "PROVISIONED_OFFLINE"}, "KURULDU"), + ({"phase": "PROVISIONED_OFFLINE", + "enrollment_status": "ENROLLED"}, "KAYITLI"), + ({"fleet_status": "READY"}, "HAZIR"), + ({"phase": "FAILED"}, "HATA"), + ({"enrollment_status": "NOT_ENROLLED"}, "KURULDU"), + ) + for values, expected in cases: + with self.subTest(values=values): + self.assertEqual(ui.state_word_from_values(values), expected) + + def test_missing_or_broken_state_file_is_the_absent_state(self) -> None: + self.assertEqual(ui.device_state_word("/yok/boyle/bir/state.json"), "YOK") + self.assertEqual(ui.read_state_values("/yok/boyle/bir/state.json"), {}) + with tempfile.TemporaryDirectory() as tmp: + broken = Path(tmp) / "state.json" + broken.write_text("{bu json degil", encoding="utf-8") + self.assertEqual(ui.device_state_word(str(broken)), "YOK") + + def test_state_json_is_read_through_a_whitelist(self) -> None: + """Jeton ve anahtar alanlari ekrana/loga ASLA okunmaz (K-14).""" + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / "state.json" + path.write_text(json.dumps({ + "phase": "READY", + "device_id": "BF-12010193", + "enrollment_token": "SEKRET-JETON", + "private_key": "-----BEGIN PRIVATE KEY-----", + }), encoding="utf-8") + values = ui.read_state_values(str(path)) + self.assertEqual(ui.device_state_word(str(path)), "HAZIR") + self.assertIn("device_id", values) + self.assertNotIn("enrollment_token", values) + self.assertNotIn("private_key", values) + self.assertNotIn("SEKRET-JETON", json.dumps(values)) + self.assertNotIn("BEGIN PRIVATE KEY", json.dumps(values)) + + +class TestPrivilegeIsVisible(StaticCase): + """Yetki bir durumdur: yazma islemleri gizlenmez, KAPATILIR ve nedeni yazar.""" + + def test_privilege_levels_have_wording_and_a_badge(self) -> None: + self.assertEqual(ui.privilege_level(True), ui.PRIVILEGE_FULL) + self.assertEqual(ui.privilege_level(False), ui.PRIVILEGE_READ_ONLY) + self.assertEqual("SALT-OKUNUR", ui.privilege_word(ui.PRIVILEGE_READ_ONLY)) + self.assertEqual("TAM YETKİ", ui.privilege_word(ui.PRIVILEGE_FULL)) + self.assertEqual(set(ui.theme.PRIVILEGE_BADGE_STYLE), + {ui.PRIVILEGE_FULL, ui.PRIVILEGE_READ_ONLY}) + + def test_unprivileged_writes_stay_in_the_list_with_a_reason(self) -> None: + writes = [op for op in self.backend.list_operations() if op.needs_root] + reports = [op for op in self.backend.list_operations() if not op.needs_root] + self.assertTrue(writes, "katalogda yazma islemi yok; kapi test edilemez") + original = os.geteuid + try: + os.geteuid = lambda: 1000 + for op in writes: + with self.subTest(operation=op.id): + self.assertEqual(ui.write_blocked_reason(op), + ui.NON_ROOT_DISABLED_HINT) + self.assertTrue(ui.operation_is_write(op)) + for op in reports: + with self.subTest(operation=op.id): + self.assertIsNone(ui.write_blocked_reason(op)) + self.assertFalse(ui.operation_is_write(op)) + os.geteuid = lambda: 0 + for op in writes: + with self.subTest(operation=op.id): + self.assertIsNone(ui.write_blocked_reason(op)) + finally: + os.geteuid = original + + def test_the_blocked_reason_names_the_command_to_get_privileges(self) -> None: + self.assertIn("sudo bf", ui.NON_ROOT_DISABLED_HINT) + self.assertIn("yönetici", ui.NON_ROOT_DISABLED_HINT.lower()) + + +class TestConsoleLayoutContract(StaticCase): + """Olculen sorunlar geri gelmesin: kaynak duzeyinde baglayici kurallar.""" + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.source = UI_GUI_PATH.read_text(encoding="utf-8") + + def test_the_view_has_no_hardcoded_colour(self) -> None: + """Renk token'dir, literal degil (docs/DESIGN.md kural 1).""" + self.assertEqual(re.findall(r"#[0-9a-fA-F]{3,8}\b", self.source), []) + + def test_there_is_exactly_one_exit_control(self) -> None: + """'Cik' tek kontrol: ya basit modda ya alt cubukta, ayni anda degil.""" + self.assertEqual(self.source.count('text="Çıkış"'), 1) + self.assertIn("Çıkış", ui.SIMPLE_MODE_BUTTONS) + for needle in ("self.exit_button.pack(side=\"right\")", + "self.exit_button.pack_forget()"): + with self.subTest(needle=needle): + self.assertIn(needle, self.source) + + def test_the_header_carries_the_privilege_element(self) -> None: + """Yetki gomulu bir cumle degil, basliktaki gorunur bir rozet.""" + for needle in ("PRIVILEGE_BADGE_STYLE", "self.privilege_badge", + 'text="Yetki"', "ROOT_REQUIRED_NOTICE", + 'style=self.styles["warn_band"]'): + with self.subTest(needle=needle): + self.assertIn(needle, self.source) + + def test_the_header_carries_the_device_state_and_target(self) -> None: + for needle in ("self.state_badge", "self.header_target", + "device_state_word()", "state_badge_style("): + with self.subTest(needle=needle): + self.assertIn(needle, self.source) + + def test_write_operations_are_disabled_not_hidden(self) -> None: + for needle in ('state="disabled"', "BLOCKED_LABEL", "AVAILABLE_LABEL", + "write_blocked_reason"): + with self.subTest(needle=needle): + self.assertIn(needle, self.source) + + def test_the_status_strip_is_a_state_pill_not_a_plain_label(self) -> None: + self.assertIn("theme.severity_style", self.source) + self.assertNotIn('text="Hazır."', self.source) + + def test_the_output_area_is_a_read_only_well(self) -> None: + for needle in ('state="disabled"', "BG_SUNKEN", "data_font", + 'cursor="arrow"'): + with self.subTest(needle=needle): + self.assertIn(needle, self.source) + + def test_the_view_reads_its_values_from_the_theme_module(self) -> None: + self.assertIn("ui_theme as theme", self.source) + self.assertTrue((REPO_ROOT / "bfos" / "ui_theme.py").is_file()) + + +if __name__ == "__main__": + unittest.main(verbosity=2) + + + +#!/usr/bin/env python3 +"""Unit tests for the bfos operator console (standard library only). + +Run: + + python3 -m unittest tests.test_bfos -v + python3 -m unittest discover -s tests + +Everything here is hermetic: no device, no Ansible, no terminal, no root and no +network. Playbooks are read from the real checkout (they are the source of +truth for their own gates) and every command is captured by a fake spawner, so +nothing is ever executed. +""" + +from __future__ import annotations + +import io +import json +import os +import shutil +import stat +import subprocess +import sys +import tempfile +import unittest +from unittest import mock + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if REPO_ROOT not in sys.path: + sys.path.insert(0, REPO_ROOT) + +from bfos import cli, config, operations, runner, tui # noqa: E402 +from bfos.operations import ( # noqa: E402 + GatesGranted, + Inventory, + Refused, + Repository, + STEP_APPROVAL, + STEP_TOKEN, +) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- +class FakeSpawn: + """Captures argv instead of running anything.""" + + def __init__(self, codes=None): + self.calls = [] + self.codes = list(codes or []) + + def __call__(self, argv): + self.calls.append(list(argv)) + if self.codes: + return self.codes.pop(0) + return 0 + + +class ScriptedConsole(tui.Console): + """A Console fed from a list; an exhausted list behaves like EOF.""" + + def __init__(self, answers=(), **kwargs): + self._answers = list(answers) + self._index = 0 + super().__init__( + out=io.StringIO(), + interactive=False, + palette=config.Palette(False), + reader=self._next, + **kwargs + ) + + def _next(self, prompt): + if self._index >= len(self._answers): + return None + value = self._answers[self._index] + self._index += 1 + return value + + def output(self): + return self.out.getvalue() + + +def make_temp_repo(base, inventory_text=None, playbook_overrides=None): + """A minimal repository: real playbooks (copied), its own inventory and scripts. + + The playbooks are **copied**, never symlinked: a test that deletes or edits a + playbook must never be able to reach the real checkout. + """ + os.makedirs(os.path.join(base, "ansible", "inventory", "group_vars"), exist_ok=True) + os.makedirs(os.path.join(base, "scripts", "install"), exist_ok=True) + os.makedirs(os.path.join(base, "scripts", "diagnostics"), exist_ok=True) + shutil.copytree(os.path.join(REPO_ROOT, "ansible", "playbooks"), + os.path.join(base, "ansible", "playbooks")) + real_group_vars = os.path.join(REPO_ROOT, "ansible", "inventory", "group_vars", "all.yml") + if os.path.isfile(real_group_vars): + shutil.copy(real_group_vars, os.path.join(base, "ansible", "inventory", "group_vars", "all.yml")) + if inventory_text is not None: + with open(os.path.join(base, "ansible", "inventory", "hosts.yml"), "w", encoding="utf-8") as handle: + handle.write(inventory_text) + shutil.copy(os.path.join(REPO_ROOT, "scripts", "install", "blueforce-install.sh"), + os.path.join(base, "scripts", "install", "blueforce-install.sh")) + stub = os.path.join(base, "scripts", "diagnostics", "bf-status") + with open(stub, "w", encoding="utf-8") as handle: + handle.write("#!/bin/sh\necho stub\n") + os.chmod(stub, 0o755) + for name in ("bf-diagnostics", "bf-check-local", "bf-check-enrollment", "bf-check-ready"): + path = os.path.join(base, "scripts", "diagnostics", name) + shutil.copy(stub, path) + os.chmod(path, 0o755) + for name, text in (playbook_overrides or {}).items(): + with open(os.path.join(base, "ansible", "playbooks", name), "w", encoding="utf-8") as handle: + handle.write(text) + return Repository(base) + + +SIMPLE_INVENTORY = """\ +all: + children: + blueforce: + children: + lab: + hosts: + bf-12010101: + ansible_host: 10.42.0.11 + bf-12010102: + ansible_host: 10.42.0.12 + pilot_1: + hosts: + bf-12010201: + ansible_host: 10.42.1.11 + production: + hosts: + bf-12010601: + ansible_host: 10.42.5.11 + vars: + ansible_user: blueforce +""" + + +# --------------------------------------------------------------------------- +# Catalogue and scope: the playbook is the source of truth +# --------------------------------------------------------------------------- +class TestCatalogue(unittest.TestCase): + def setUp(self): + self.repo = Repository(REPO_ROOT) + + def test_21_operations_and_unique_rows(self): + self.assertEqual(21, len(operations.ALL_OPERATIONS)) + self.assertEqual(11, len(operations.REPORT_OPERATIONS)) + self.assertEqual(10, len(operations.MAINTENANCE_OPERATIONS)) + idents = [op.ident for op in operations.ALL_OPERATIONS] + playbooks = [op.playbook for op in operations.ALL_OPERATIONS] + self.assertEqual(len(idents), len(set(idents))) + self.assertEqual(len(playbooks), len(set(playbooks))) + + def test_catalogue_matches_the_playbook_directory(self): + on_disk = sorted( + name for name in os.listdir(self.repo.path(config.PLAYBOOK_DIR_REL)) + if name.endswith(".yml") and not name.startswith(".") + ) + catalogued = sorted(op.playbook for op in operations.ALL_OPERATIONS) + self.assertEqual(on_disk, catalogued) + + def test_every_declared_scope_matches_the_playbook_file(self): + for op in operations.ALL_OPERATIONS: + with self.subTest(playbook=op.playbook): + self.assertEqual(op.declared_scope, self.repo.verify_scope(op)) + + def test_scope_drift_is_refused(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp, playbook_overrides={ + "bf-ping.yml": "---\n- hosts: all\n vars:\n release_wave: lab\n tasks: []\n" + }) + ping = operations.find_operation("ping") + with self.assertRaises(Refused) as caught: + repo.verify_scope(ping) + self.assertIn("bf-ping.yml", caught.exception.message) + + def test_missing_playbook_is_refused(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp) + os.unlink(os.path.join(tmp, "ansible", "playbooks", "bf-ping.yml")) + with self.assertRaises(Refused): + repo.verify_scope(operations.find_operation("ping")) + + def test_destructive_flags_match_the_docs(self): + self.assertFalse(operations.find_operation("ping").destructive) + self.assertTrue(operations.find_operation("reboot").destructive) + self.assertTrue(operations.find_operation("deploy-update").destructive) + self.assertEqual(config.SCOPE_RELEASE, operations.find_operation("reboot").declared_scope) + self.assertEqual(config.SCOPE_RELEASE, operations.find_operation("deploy-update").declared_scope) + + def test_target_modes_follow_the_scope(self): + self.assertEqual(config.MODE_ANY, operations.find_operation("ping").target_mode) + self.assertEqual(config.MODE_WAVE, operations.find_operation("gui-off").target_mode) + self.assertEqual(config.MODE_RELEASE, operations.find_operation("deploy-update").target_mode) + + +class TestScopeDerivation(unittest.TestCase): + def test_scope_from_variables(self): + self.assertEqual(config.SCOPE_RELEASE, operations.playbook_scope("x: {{ release_wave }}")) + self.assertEqual(config.SCOPE_WAVE, operations.playbook_scope("x: {{ operation_wave }}")) + self.assertEqual(config.SCOPE_SIMPLE, operations.playbook_scope("hosts: blueforce")) + + def test_full_line_comments_do_not_count(self): + text = "# release_wave is documented here\nhosts: blueforce\n" + self.assertEqual(config.SCOPE_SIMPLE, operations.playbook_scope(text)) + + def test_word_boundaries_are_respected(self): + self.assertEqual(config.SCOPE_SIMPLE, operations.playbook_scope("release_waves: []")) + + def test_inline_comment_parity_with_bash(self): + # The bash console strips only full-line comments, and so does this one: + # a variable named in a trailing comment still counts, which keeps the + # two consoles from disagreeing about a playbook. + text = "hosts: blueforce # release_wave\n" + self.assertEqual(config.SCOPE_RELEASE, operations.playbook_scope(text)) + + +# --------------------------------------------------------------------------- +# Identity and inventory +# --------------------------------------------------------------------------- +class TestIdentity(unittest.TestCase): + def test_dealer_number_pattern(self): + self.assertTrue(operations.dealer_is_valid("12010101")) + self.assertFalse(operations.dealer_is_valid("1201010")) + self.assertFalse(operations.dealer_is_valid("120101011")) + self.assertFalse(operations.dealer_is_valid("1201010a")) + self.assertFalse(operations.dealer_is_valid(" 12010101")) + self.assertFalse(operations.dealer_is_valid("")) + + def test_host_and_device_id_mapping(self): + self.assertEqual("bf-12010101", operations.dealer_to_host("12010101")) + self.assertEqual("BF-12010101", operations.dealer_to_device_id("12010101")) + self.assertEqual("12010101", operations.host_to_dealer("bf-12010101")) + self.assertIsNone(operations.host_to_dealer("web-01")) + + def test_waves_are_the_canonical_six(self): + self.assertEqual( + ("lab", "pilot_1", "pilot_2", "wave_1", "wave_2", "production"), config.WAVES) + self.assertTrue(operations.is_wave("production")) + self.assertFalse(operations.is_wave("blueforce")) + + +class TestInventory(unittest.TestCase): + def setUp(self): + self.inventory = Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml") + + def test_groups_and_counts(self): + self.assertEqual(("lab", "pilot_1", "production"), self.inventory.group_names()) + self.assertEqual(2, len(self.inventory.hosts_of("lab"))) + self.assertEqual(("bf-12010101", "bf-12010102"), self.inventory.hosts_of("lab")) + self.assertEqual(4, self.inventory.count_all()) + self.assertTrue(self.inventory.resolved) + + def test_vars_block_is_not_read_as_a_host(self): + self.assertNotIn("ansible_user", self.inventory.all_hosts()) + + def test_wave_order_and_host_wave(self): + self.assertEqual(("lab", "pilot_1", "production"), self.inventory.waves_present()) + self.assertEqual("lab", self.inventory.host_wave("bf-12010101")) + self.assertEqual("production", self.inventory.host_wave("bf-12010601")) + self.assertIsNone(self.inventory.host_wave("bf-99999999")) + + def test_example_inventory_from_the_repo_parses(self): + example = Repository(REPO_ROOT).path(config.INVENTORY_EXAMPLE_REL) + inventory = Inventory.load(example) + self.assertEqual(6, len(inventory.waves_present())) + self.assertEqual(15, inventory.count_all()) + self.assertEqual(5, len(inventory.hosts_of("pilot_1"))) + + def test_example_inventory_is_never_auto_selected(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp) + shutil.copy(os.path.join(REPO_ROOT, config.INVENTORY_EXAMPLE_REL), + repo.path(config.INVENTORY_EXAMPLE_REL)) + with self.assertRaises(Refused) as caught: + repo.find_inventory() + self.assertIn("hosts.example.yml", caught.exception.detail) + self.assertIn("hosts.yml", caught.exception.message) + + def test_unreadable_explicit_inventory_is_refused(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp) + with self.assertRaises(Refused): + repo.find_inventory(os.path.join(tmp, "nope.yml")) + + def test_missing_inventory_yields_an_unresolved_view(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp) + inventory = Inventory.load_repository(repo) + self.assertFalse(inventory.resolved) + self.assertEqual("çözümlenmedi", inventory.labels()) + + def test_load_repository_reads_hosts_yml(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp, inventory_text=SIMPLE_INVENTORY) + inventory = Inventory.load_repository(repo) + self.assertTrue(inventory.resolved) + self.assertEqual(4, inventory.count_all()) + + +# --------------------------------------------------------------------------- +# Target selection and its refusal paths +# --------------------------------------------------------------------------- +class TestTargets(unittest.TestCase): + def setUp(self): + self.inventory = Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml") + + def resolve(self, word, mode=config.MODE_ANY): + return operations.resolve_target(word, mode, self.inventory) + + def test_single_device(self): + target = self.resolve("12010101") + self.assertEqual(operations.KIND_HOST, target.kind) + self.assertEqual("bf-12010101", target.limit) + self.assertEqual("lab", target.wave) + self.assertEqual(1, target.count) + + def test_hostname_is_accepted_as_convenience(self): + target = self.resolve("bf-12010101") + self.assertEqual("bf-12010101", target.limit) + + def test_group_and_wave(self): + self.assertEqual("lab", self.resolve("lab", config.MODE_WAVE).limit) + self.assertEqual(2, self.resolve("lab", config.MODE_WAVE).count) + + def test_all(self): + target = self.resolve("all") + self.assertEqual(operations.KIND_ALL, target.kind) + self.assertEqual("all", target.limit) + self.assertEqual(4, target.count) + + def test_bad_dealer_number_is_refused(self): + for value in ("1201", "1201010x", "120101011", "1201 0101"): + with self.subTest(value=value): + with self.assertRaises(Refused) as caught: + self.resolve(value) + self.assertIn("bayi numarası", caught.exception.message) + + def test_unknown_device_is_refused(self): + with self.assertRaises(Refused) as caught: + self.resolve("99999999") + self.assertIn("envanterde yok", caught.exception.message) + + def test_device_outside_a_wave_is_refused_for_wave_scope(self): + inventory = Inventory.parse( + "all:\n children:\n blueforce:\n children:\n" + " ops:\n hosts:\n bf-12019999:\n" + ) + with self.assertRaises(Refused) as caught: + operations.resolve_target("12019999", config.MODE_WAVE, inventory) + self.assertIn("onaylı bir dalgada değil", caught.exception.message) + + def test_release_scope_refuses_a_single_device(self): + with self.assertRaises(Refused) as caught: + self.resolve("12010101", config.MODE_RELEASE) + self.assertIn("dalga grubu", caught.exception.message) + + def test_release_scope_refuses_the_whole_fleet(self): + with self.assertRaises(Refused) as caught: + self.resolve("all", config.MODE_RELEASE) + self.assertIn("reddedildi", caught.exception.message) + + def test_wave_scope_refuses_a_non_wave_group(self): + inventory = Inventory.parse( + "all:\n children:\n blueforce:\n children:\n" + " ops:\n hosts:\n bf-12010101:\n" + ) + with self.assertRaises(Refused) as caught: + operations.resolve_target("ops", config.MODE_WAVE, inventory) + self.assertIn("onaylı bir dalga değil", caught.exception.message) + + def test_unknown_group_is_refused(self): + with self.assertRaises(Refused) as caught: + self.resolve("wave_9") + self.assertIn("grup", caught.exception.message) + self.assertIn("lab", caught.exception.detail) # the known groups are listed + + def test_empty_group_and_empty_fleet_are_refused(self): + empty = Inventory.parse("all:\n children:\n blueforce:\n children:\n lab:\n hosts:\n") + with self.assertRaises(Refused): + operations.resolve_target("lab", config.MODE_WAVE, empty) + with self.assertRaises(Refused): + operations.resolve_target("all", config.MODE_ANY, empty) + + def test_empty_word_is_refused(self): + with self.assertRaises(Refused): + self.resolve("") + + def test_wave_sequence_is_in_rollout_order(self): + self.assertEqual((("lab", 2), ("pilot_1", 1), ("production", 1)), + operations.wave_sequence(self.inventory)) + + +# --------------------------------------------------------------------------- +# Gates +# --------------------------------------------------------------------------- +class TestGatePlan(unittest.TestCase): + def plan(self, ident, scope, word, mode=None, wave_gate=False): + op = operations.find_operation(ident) + inventory = Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml") + target = operations.resolve_target(word, mode or op.target_mode, inventory) + return operations.confirmation_plan(op, scope, target, wave=target.wave, + wave_gate_supported=wave_gate) + + def test_simple_readonly_operation_needs_no_gate(self): + self.assertEqual([], self.plan("ping", config.SCOPE_SIMPLE, "12010101")) + + def test_wave_scoped_read_only_report_needs_no_token(self): + # bash parity: bf_confirm_wave_gate returns immediately for a + # non-production wave, so a wave-scoped report asks no token. + self.assertEqual([], self.plan("collect-logs", config.SCOPE_WAVE, "lab")) + + def test_wave_scoped_destructive_operation_only_adds_the_second_approval(self): + steps = self.plan("gui-off", config.SCOPE_WAVE, "lab") + self.assertEqual(["destructive_approval"], [step.key for step in steps]) + + def test_release_scope_requires_a_written_wave_token(self): + steps = self.plan("deploy-update", config.SCOPE_RELEASE, "lab", wave_gate=True) + token = steps[0] + self.assertEqual(STEP_TOKEN, token.kind) + self.assertEqual("lab", token.token) + self.assertIn("dalga onayı", token.message.lower()) + self.assertIn(operations.VAR_WAVE_GATE_CONFIRMED, token.unlocks) + + def test_release_wave_token_unlocks_nothing_when_the_playbook_has_no_gate(self): + steps = self.plan("reboot", config.SCOPE_RELEASE, "lab", wave_gate=False) + self.assertEqual((), steps[0].unlocks) + + def test_production_needs_the_typed_word_and_a_separate_approval(self): + steps = self.plan("deploy-update", config.SCOPE_RELEASE, "production", + mode=config.MODE_RELEASE, wave_gate=True) + kinds = [(step.kind, step.key) for step in steps] + # The production approval *is* the destructive second confirmation: it + # names the flag it unlocks, so no generic duplicate is added after it. + self.assertEqual([(STEP_TOKEN, "production_token"), (STEP_APPROVAL, "production_approval")], kinds) + self.assertEqual("production", steps[0].token) + self.assertIn(operations.VAR_PRODUCTION_OVERRIDE, steps[1].unlocks) + self.assertIn(operations.VAR_ALLOW_PRODUCTION_REBOOT, steps[1].unlocks) + + def test_destructive_operation_asks_twice(self): + with_destructive = self.plan("gui-off", config.SCOPE_WAVE, "lab") + without = self.plan("collect-logs", config.SCOPE_WAVE, "lab") + self.assertIn("destructive_approval", [step.key for step in with_destructive]) + self.assertNotIn("destructive_approval", [step.key for step in without]) + self.assertIn("Yıkıcı işlem kapısı", with_destructive[0].message) + + def test_production_wave_of_a_wave_scoped_playbook_also_needs_both_steps(self): + steps = self.plan("gui-off", config.SCOPE_WAVE, "production") + self.assertEqual(["production_token", "production_approval"], + [step.key for step in steps]) + + def test_fleet_wide_simple_run_requires_the_word_all(self): + steps = self.plan("ping", config.SCOPE_SIMPLE, "all") + self.assertEqual(1, len(steps)) + self.assertEqual("all", steps[0].token) + self.assertIn("fleet_wide", steps[0].unlocks) + + def test_fleet_wide_gated_run_leaves_the_token_to_the_per_wave_loop(self): + # The fleet-wide target itself has no wave, so no wave token belongs at + # this level: run_fleet_waves asks each wave's name once, per wave, and + # the per-wave plan is then applied without re-asking it. + fleet_steps = self.plan("gui-off", config.SCOPE_WAVE, "all", mode=config.MODE_ANY) + self.assertEqual(["destructive_approval"], [step.key for step in fleet_steps]) + per_wave = self.plan("gui-off", config.SCOPE_WAVE, "lab") + self.assertEqual(["destructive_approval"], [step.key for step in per_wave]) + release = self.plan("deploy-update", config.SCOPE_RELEASE, "lab", wave_gate=True) + self.assertEqual("lab", release[0].token) + + def test_granting_sets_only_the_offered_flags(self): + steps = self.plan("deploy-update", config.SCOPE_RELEASE, "lab", wave_gate=True) + gates = GatesGranted() + self.assertFalse(gates.wave_gate_confirmed) + granted = gates.grant(steps[0]) + self.assertTrue(granted.wave_gate_confirmed) + self.assertFalse(granted.production_override) + + +# --------------------------------------------------------------------------- +# Extra variables +# --------------------------------------------------------------------------- +class TestExtraVars(unittest.TestCase): + def test_package_pins(self): + pins = operations.parse_packages("docker-ce=1:27.0.3, wireguard=1.0") + self.assertEqual(["docker-ce=1:27.0.3", "wireguard=1.0"], pins) + self.assertEqual('["docker-ce=1:27.0.3","wireguard=1.0"]', + operations.packages_expression(pins)) + + def test_bad_package_pins_are_refused(self): + for value in ("", "docker-ce", "docker-ce=latest=", "=1.2", "docker-ce=latest"): + with self.subTest(value=value): + with self.assertRaises(Refused): + operations.parse_packages(value) + + def test_latest_is_refused_with_a_policy_message(self): + with self.assertRaises(Refused) as caught: + operations.parse_packages("docker-ce=latest") + self.assertIn("latest", caught.exception.message) + + def test_service_allowlist(self): + self.assertEqual("docker", operations.parse_service("docker")) + with self.assertRaises(Refused) as caught: + operations.parse_service("nginx") + self.assertIn("izinli servis", caught.exception.message) + + def test_script_paths_are_confined(self): + self.assertEqual([("script_path", "/opt/blueforce/bin/check.sh")], + operations.parse_script("/opt/blueforce/bin/check.sh")) + pairs = operations.parse_script("/usr/local/sbin/x.sh", "--dry-run") + self.assertEqual([("script_path", "/usr/local/sbin/x.sh"), ("script_args", "--dry-run")], pairs) + for value in ("relative.sh", "/tmp/x.sh", "/opt/blueforce/binsneaky.sh"): + with self.subTest(value=value): + with self.assertRaises(Refused): + operations.parse_script(value) + + def test_grace_period(self): + self.assertEqual("300", operations.parse_grace("")) + self.assertEqual("60", operations.parse_grace("60")) + for value in ("-1", "abc", "1.5"): + with self.subTest(value=value): + with self.assertRaises(Refused): + operations.parse_grace(value) + + def test_disk_threshold(self): + self.assertEqual([], operations.parse_disk_pct("")) + self.assertEqual([("disk_warn_pct", "90")], operations.parse_disk_pct("90")) + for value in ("0", "101", "abc"): + with self.subTest(value=value): + with self.assertRaises(Refused): + operations.parse_disk_pct(value) + + def test_log_lines_and_version(self): + self.assertEqual("500", operations.parse_log_lines("")) + self.assertEqual("10", operations.parse_log_lines("10")) + with self.assertRaises(Refused): + operations.parse_log_lines("0") + self.assertEqual([], operations.parse_expected_version("")) + self.assertEqual([("fieldos_expected_version", "1.0.0")], + operations.parse_expected_version("1.0.0")) + + def test_build_extra_vars_dispatch(self): + self.assertEqual([], operations.build_extra_vars(operations.PROMPT_NONE, {})) + self.assertEqual([("log_lines", "250")], + operations.build_extra_vars(operations.PROMPT_LOG_LINES, {"log_lines": "250"})) + with self.assertRaises(Refused): + operations.build_extra_vars("bilinmeyen", {}) + + +# --------------------------------------------------------------------------- +# Command building +# --------------------------------------------------------------------------- +class TestCommandBuilding(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.repo = make_temp_repo(self.tmp.name, inventory_text=SIMPLE_INVENTORY) + self.inventory = Inventory.load(self.repo.path(os.path.join(config.INVENTORY_DIR_REL, "hosts.yml"))) + + def tearDown(self): + self.tmp.cleanup() + + def build(self, ident, word, mode=None, extra=(), gates=None, check=False): + op = operations.find_operation(ident) + target = operations.resolve_target(word, mode or op.target_mode, self.inventory) + return operations.build_ansible_command( + self.repo, self.inventory.path, op, op.declared_scope, target, + wave=target.wave, extra_vars=extra, gates=gates or GatesGranted(), check_mode=check, + ) + + def test_simple_scope_gets_only_a_limit(self): + argv = self.build("ping", "12010101") + self.assertEqual([ + "ansible-playbook", "-i", self.inventory.path, + self.repo.playbook_path("bf-ping.yml"), "--limit", "bf-12010101", + ], argv) + self.assertNotIn("-e", argv) + + def test_wave_scope_sets_wave_and_confirmation(self): + argv = self.build("gui-off", "lab") + self.assertIn("-e", argv) + self.assertIn("operation_wave=lab", argv) + self.assertIn("operation_confirmed=true", argv) + self.assertNotIn("production_override=true", argv) + + def test_production_wave_adds_the_override_only_when_granted(self): + without = self.build("gui-off", "production") + self.assertNotIn("production_override=true", without) + with_override = self.build("gui-off", "production", gates=GatesGranted(production_override=True)) + self.assertIn("production_override=true", with_override) + + def test_release_scope_flags(self): + argv = self.build("deploy-update", "lab") + self.assertIn("release_wave=lab", argv) + self.assertNotIn("wave_gate_confirmed=true", argv) + gated = self.build("deploy-update", "lab", gates=GatesGranted(wave_gate_confirmed=True)) + self.assertIn("wave_gate_confirmed=true", gated) + + def test_reboot_confirmation_is_always_added_for_the_reboot_playbook(self): + argv = self.build("reboot", "lab") + self.assertIn("reboot_confirmed=true", argv) + self.assertNotIn("allow_production_reboot=true", argv) + + def test_production_release_run_carries_every_gate_flag(self): + argv = self.build("reboot", "production", mode=config.MODE_RELEASE, + gates=GatesGranted(wave_gate_confirmed=True, production_override=True, + allow_production_reboot=True)) + for flag in ("release_wave=production", "allow_production_reboot=true", + "reboot_confirmed=true"): + self.assertIn(flag, argv) + # bf-reboot.yml does not declare production_override: the builder never + # invents a variable the playbook does not know (parity rule). + self.assertNotIn("production_override=true", argv) + + def test_production_override_is_passed_to_the_playbook_that_declares_it(self): + argv = self.build("deploy-update", "production", mode=config.MODE_RELEASE, + gates=GatesGranted(wave_gate_confirmed=True, production_override=True)) + self.assertIn("release_wave=production", argv) + self.assertIn("wave_gate_confirmed=true", argv) + self.assertIn("production_override=true", argv) + + def test_check_mode_appends_the_flag(self): + self.assertEqual("--check", self.build("ping", "lab", check=True)[-1]) + + def test_extra_vars_are_appended_before_the_check_flag(self): + argv = self.build("deploy-update", "lab", + extra=[("update_packages", '[\"docker-ce=1:27\"]')], check=True) + self.assertIn('update_packages=["docker-ce=1:27"]', argv) + self.assertEqual("--check", argv[-1]) + + def test_no_command_without_a_target(self): + op = operations.find_operation("ping") + with self.assertRaises(Refused): + operations.build_ansible_command(self.repo, self.inventory.path, op, + config.SCOPE_SIMPLE, None) + + def test_wave_scope_without_a_wave_is_refused(self): + op = operations.find_operation("gui-off") + target = operations.Target(operations.KIND_HOST, "bf-12010101", "", 1, "cihaz") + with self.assertRaises(Refused): + operations.build_ansible_command(self.repo, self.inventory.path, op, + config.SCOPE_WAVE, target, wave="") + + def test_release_scope_with_a_non_wave_target_is_refused(self): + op = operations.find_operation("deploy-update") + target = operations.Target(operations.KIND_GROUP, "ops", "", 3, "grup") + with self.assertRaises(Refused): + operations.build_ansible_command(self.repo, self.inventory.path, op, + config.SCOPE_RELEASE, target, wave="ops") + + def test_no_playbook_variable_is_added_that_the_playbook_does_not_declare(self): + # bf-gui-off.yml declares production_override but no release_wave; the + # builder must never hand a playbook a variable it did not declare. + argv = self.build("collect-logs", "lab", extra=[("log_lines", "100")]) + self.assertIn("log_lines=100", argv) + self.assertNotIn("release_wave=lab", argv) + + +class TestLocalCommands(unittest.TestCase): + def test_installer_command(self): + argv = operations.build_install_command("/repo/scripts/install/blueforce-install.sh", "12010101", + offline=True, resume=True, check_mode=True) + self.assertEqual([ + "bash", "/repo/scripts/install/blueforce-install.sh", "--dealer-id", "12010101", + "--offline", "--resume", "--check", + ], argv) + + def test_installer_command_rejects_a_bad_dealer_number(self): + with self.assertRaises(Refused): + operations.build_install_command("/x/install.sh", "1201") + + def test_tool_command(self): + self.assertEqual(["bf-remote-status", "--check"], + operations.build_tool_command("bf-remote-status", ("--check",))) + + def test_module_names_is_a_tuple(self): + self.assertIsInstance(operations.module_names(Repository(REPO_ROOT)), tuple) + + def test_tool_path_resolution(self): + repo = Repository(REPO_ROOT) + resolved = repo.tool_path("bf-status") + self.assertTrue(resolved.endswith(os.path.join("scripts", "diagnostics", "bf-status")) + or resolved.startswith(config.TOOL_BIN_DIR)) + with self.assertRaises(Refused): + repo.tool_path("bf-does-not-exist") + + def test_installer_missing_is_refused(self): + with tempfile.TemporaryDirectory() as tmp: + repo = make_temp_repo(tmp) + os.unlink(repo.path(config.INSTALLER_REL)) + with self.assertRaises(Refused): + repo.installer_path() + + +# --------------------------------------------------------------------------- +# Redaction and the audit log +# --------------------------------------------------------------------------- +class TestRedaction(unittest.TestCase): + def test_assignments_are_redacted(self): + text = ("-e password=hunter2 -e api_key=abcd1234 -e PSK=deadbeef " + "-e private_key_path=/root/id_rsa -e credential=a1b2c3") + cleaned = runner.redact(text) + for secret in ("hunter2", "abcd1234", "deadbeef", "a1b2c3"): + self.assertNotIn(secret, cleaned) + self.assertIn("", cleaned) + + def test_pem_blocks_are_redacted(self): + pem = "-----BEGIN OPENSSH PRIVATE KEY-----\nAAAAB3NzaC1yc2E\n-----END OPENSSH PRIVATE KEY-----" + self.assertEqual("", runner.redact(pem)) + + def test_truncated_pem_header_is_still_marked(self): + self.assertNotIn("AAAAB3NzaC1yc2E", runner.redact("-----BEGIN RSA PRIVATE KEY-----\nAAAAB3NzaC1yc2E")) + + def test_ordinary_commands_are_untouched(self): + line = ('ansible-playbook -i /opt/blueforce-linux/ansible/inventory/hosts.yml ' + '/opt/blueforce-linux/ansible/playbooks/bf-deploy-update.yml --limit lab ' + '-e release_wave=lab -e update_packages=["docker-ce=1:27.0.3"]') + self.assertEqual(line, runner.redact(line)) + + def test_empty_input(self): + self.assertEqual("", runner.redact("")) + + +class TestAuditLog(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.path = os.path.join(self.tmp.name, "blueforce-console.log") + + def test_log_is_created_with_mode_600(self): + audit = runner.AuditLog(requested=self.path, state_home=self.tmp.name) + audit.initialise() + self.assertTrue(audit.ready) + self.assertEqual(self.path, audit.path) + self.assertEqual("", audit.warning) + self.assertEqual(0o600, stat.S_IMODE(os.stat(self.path).st_mode)) + + def test_existing_world_readable_log_is_tightened(self): + with open(self.path, "w", encoding="utf-8") as handle: + handle.write("") + os.chmod(self.path, 0o644) + audit = runner.AuditLog(requested=self.path, state_home=self.tmp.name) + audit.initialise() + self.assertEqual(0o600, stat.S_IMODE(os.stat(self.path).st_mode)) + + def test_unwritable_path_falls_back_to_the_state_directory(self): + audit = runner.AuditLog(requested="/proc/1/definitely-not-writable/console.log", + state_home=self.tmp.name) + audit.initialise() + self.assertTrue(audit.ready) + self.assertEqual(runner.fallback_log_path(self.tmp.name), audit.path) + self.assertIn("mod 600", audit.warning) + self.assertEqual(0o600, stat.S_IMODE(os.stat(audit.path).st_mode)) + + def test_never_writes_a_secret(self): + audit = runner.AuditLog(requested=self.path, state_home=self.tmp.name) + audit.initialise() + audit.write(config.AUDIT_RUN, "ansible-playbook -e password=topsecret1 -e psk=deadbeef") + with open(self.path, "r", encoding="utf-8") as handle: + content = handle.read() + self.assertNotIn("topsecret1", content) + self.assertNotIn("deadbeef", content) + self.assertIn("", content) + self.assertIn("[RUN]", content) + + def test_no_output_is_written_when_no_log_is_available(self): + audit = runner.AuditLog(requested="/proc/1/definitely-not-writable/console.log", + state_home="/proc/1/definitely-not-writable") + audit.initialise() + self.assertFalse(audit.ready) + self.assertEqual(config.MSG_LOG_NONE, audit.warning) + audit.write(config.AUDIT_RUN, "yazılmayacak") # must not raise + + +# --------------------------------------------------------------------------- +# Runner +# --------------------------------------------------------------------------- +class TestRunner(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.audit = runner.AuditLog(requested=os.path.join(self.tmp.name, "log"), + state_home=self.tmp.name) + self.audit.initialise() + self.spawn = FakeSpawn() + + def make(self, answers, dry_run=False, check_mode=False): + console = ScriptedConsole(answers) + return console, runner.Runner(console, audit=self.audit, dry_run=dry_run, + check_mode=check_mode, spawn=self.spawn) + + def log_text(self): + with open(self.audit.path, "r", encoding="utf-8") as handle: + return handle.read() + + def test_dry_run_executes_nothing(self): + console, run = self.make([], dry_run=True) + result = run.confirm_and_run(["ansible-playbook", "--version"], "deneme") + self.assertTrue(result.dry_run) + self.assertFalse(result.executed) + self.assertEqual([], self.spawn.calls) + self.assertIn("ÇALIŞTIRILMADI", console.output()) + self.assertIn("[DRYRUN]", self.log_text()) + + def test_confirmed_run_reports_the_exit_code(self): + console, run = self.make(["y"]) + self.spawn.codes = [0] + result = run.confirm_and_run(["ansible-playbook", "pb.yml", "--limit", "lab"], "işlem", + destructive=True) + self.assertTrue(result.executed) + self.assertEqual(0, result.rc) + self.assertTrue(result.ok) + self.assertEqual([["ansible-playbook", "pb.yml", "--limit", "lab"]], self.spawn.calls) + self.assertIn("[OK]", self.log_text()) + self.assertIn("başarıyla tamamlandı", console.output()) + + def test_check_answer_appends_check(self): + console, run = self.make(["c"]) + run.confirm_and_run(["ansible-playbook", "pb.yml"], "işlem") + self.assertEqual([["ansible-playbook", "pb.yml", "--check"]], self.spawn.calls) + self.assertIn("--check", self.log_text()) + + def test_anything_else_cancels(self): + for answer in ("", "h", "hayır", "n"): + with self.subTest(answer=answer): + self.spawn.calls = [] + console, run = self.make([answer]) + result = run.confirm_and_run(["ansible-playbook", "pb.yml"], "işlem") + self.assertTrue(result.cancelled) + self.assertEqual([], self.spawn.calls) + self.assertIn("[CANCEL]", self.log_text()) + + def test_eof_cancels_instead_of_running(self): + console, run = self.make([]) + result = run.confirm_and_run(["ansible-playbook", "pb.yml"], "işlem") + self.assertTrue(result.cancelled) + self.assertEqual([], self.spawn.calls) + + def test_failure_is_reported(self): + console, run = self.make(["y"]) + self.spawn.codes = [2] + result = run.confirm_and_run(["ansible-playbook", "pb.yml"], "işlem") + self.assertEqual(2, result.rc) + self.assertFalse(result.ok) + self.assertIn("[FAIL]", self.log_text()) + self.assertIn("çıkış koduyla başarısız", console.output()) + + def test_readonly_run_does_not_ask(self): + console, run = self.make([]) + run.run_readonly(["bf-status"], title="bf-status") + self.assertEqual([["bf-status"]], self.spawn.calls) + + def test_command_is_shown_before_it_runs(self): + console, run = self.make(["h"]) + run.confirm_and_run(["ansible-playbook", "--limit", "lab"], "işlem") + output = console.output() + self.assertIn("Çalıştırılacak komut", output) + self.assertIn("ansible-playbook --limit lab", output) + + def test_command_string_quotes_arguments(self): + self.assertEqual("ansible-playbook -e 'a b'", runner.command_string( + ["ansible-playbook", "-e", "a b"])) + + +# --------------------------------------------------------------------------- +# TUI contract without a terminal +# --------------------------------------------------------------------------- +class TestTuiContract(unittest.TestCase): + def test_simple_menu_has_exactly_three_basic_actions(self): + screen = tui.simple_menu() + items = [entry.label for _, entry in screen.items()] + self.assertEqual(["Kur", "Durum", "Çıkış"], items) + self.assertEqual(("1", "2", "3", "d"), screen.keys()) + + def test_simple_view_hides_the_detailed_features(self): + text = tui.render_screen(tui.simple_menu()) + self.assertIn(config.SCREEN_TITLE, text) + for hidden in (config.CAT_DEVICES, config.CAT_CENTRAL, config.CAT_TOOLS, config.CAT_INFO, ".yml"): + self.assertNotIn(hidden, text) + self.assertIn("Detaylı mod", text) + + def test_detailed_menu_has_the_five_categories(self): + screen = tui.detailed_menu() + labels = [entry.label for _, entry in screen.items()] + self.assertEqual([config.CAT_INSTALL, config.CAT_DEVICES, config.CAT_CENTRAL, + config.CAT_TOOLS, config.CAT_INFO], labels) + self.assertEqual(("1", "2", "3", "4", "5", "s"), screen.keys()) + + def test_every_screen_offers_back_and_quit(self): + repo = Repository(REPO_ROOT) + screens = [ + tui.simple_menu(), tui.detailed_menu(), + tui.install_menu(cli.App.install_items()), + tui.devices_menu(11, 10), tui.central_menu(), tui.tools_menu(), + tui.info_menu(), tui.target_menu(), + ] + self.assertTrue(screen_collection_is_nonempty(screens)) + for screen in screens: + with self.subTest(screen=screen.title): + text = tui.render_screen(screen) + self.assertIn("0) Geri", text) + self.assertIn("q) Çıkış", text) + + def test_colours_are_ansi_and_can_be_switched_off(self): + plain = tui.render_screen(tui.simple_menu(), config.Palette(False)) + colourful = tui.render_screen(tui.simple_menu(), config.Palette(True)) + self.assertNotIn("\033[", plain) + self.assertIn("\033[", colourful) + self.assertIn(config.SCREEN_TITLE, plain) + + def test_color_enabled_rules(self): + with mock.patch.dict(os.environ, {"NO_COLOR": "1"}): + self.assertFalse(tui.color_enabled(is_tty=True)) + with mock.patch.dict(os.environ, {}, clear=False): + os.environ.pop("NO_COLOR", None) + self.assertTrue(tui.color_enabled(is_tty=True)) + self.assertFalse(tui.color_enabled(is_tty=False)) + self.assertFalse(tui.color_enabled(mode="never", is_tty=True)) + self.assertTrue(tui.color_enabled(mode="always", is_tty=False)) + + def test_menu_choice_interpretation(self): + keys = ("1", "2", "3", "d") + self.assertEqual((tui.CHOICE_BACK, ""), tui.interpret_menu_choice("", keys)) + self.assertEqual((tui.CHOICE_BACK, ""), tui.interpret_menu_choice("0", keys)) + self.assertEqual((tui.CHOICE_QUIT, ""), tui.interpret_menu_choice("q", keys)) + self.assertEqual((tui.CHOICE_QUIT, ""), tui.interpret_menu_choice("Q", keys)) + self.assertEqual((tui.CHOICE_ITEM, "2"), tui.interpret_menu_choice("2", keys)) + self.assertEqual((tui.CHOICE_INVALID, "9"), tui.interpret_menu_choice("9", keys)) + self.assertEqual((tui.CHOICE_INVALID, "abc"), tui.interpret_menu_choice("abc", keys)) + + def test_invalid_choice_gets_a_turkish_warning(self): + console = ScriptedConsole(["7"]) + outcome, _ = console.ask_menu_choice(tui.simple_menu()) + self.assertEqual(tui.CHOICE_INVALID, outcome) + self.assertIn("Geçersiz seçim", console.output()) + + def test_eof_quits_the_menu(self): + console = ScriptedConsole([]) + self.assertIsNone(console.read("Seçim > ")) + self.assertEqual((tui.CHOICE_QUIT, ""), console.ask_menu_choice(tui.simple_menu())) + + def test_turkish_confirmations(self): + console = ScriptedConsole(["e", "h", "", "evet"]) + self.assertTrue(console.confirm("Onay?")) + self.assertFalse(console.confirm("Onay?")) + self.assertFalse(console.confirm("Onay?")) + self.assertTrue(console.confirm("Onay?")) + self.assertIn("[e/H]", console.output()) + + def test_invalid_yes_no_is_re_asked(self): + console = ScriptedConsole(["belki", "e"]) + self.assertTrue(console.confirm("Onay?")) + self.assertIn("Girdi anlaşılamadı", console.output()) + + def test_token_confirmation_requires_the_exact_word(self): + console = ScriptedConsole(["lab", "lab-1", "LAB"]) + self.assertTrue(console.confirm_token("uyarı", "lab", "yazın: ")) + self.assertFalse(console.confirm_token("uyarı", "lab", "yazın: ")) + self.assertFalse(console.confirm_token("uyarı", "lab", "yazın: ")) + + def test_ask_run_mapping_matches_the_runner(self): + self.assertEqual(tui.RUN, runner.RUN_MODE_RUN) + self.assertEqual(tui.CHECK, runner.RUN_MODE_CHECK) + self.assertEqual(tui.CANCEL, runner.RUN_MODE_CANCEL) + console = ScriptedConsole(["y", "c", "x"]) + self.assertEqual(tui.RUN, console.ask_run()) + self.assertEqual(tui.CHECK, console.ask_run()) + self.assertEqual(tui.CANCEL, console.ask_run()) + + +def screen_collection_is_nonempty(screens): + return len(screens) == 8 + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- +class TestCli(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.env = mock.patch.dict(os.environ, { + "XDG_STATE_HOME": self.tmp.name, + "BF_CONSOLE_LOG": os.path.join(self.tmp.name, "console.log"), + "BF_REPO": "", + }) + self.env.start() + self.addCleanup(self.env.stop) + + def test_parser_accepts_the_documented_flags(self): + args = build_args(["--full", "--dry-run", "--check", "--repo", "/x", "--inventory", "/y", + "--lang", "tr", "--no-color"]) + self.assertTrue(args.full and args.dry_run and args.check and args.no_color) + self.assertEqual("/x", args.repo) + self.assertEqual("/y", args.inventory) + self.assertEqual("tr", args.lang) + + def test_version(self): + out = io.StringIO() + with mock.patch("sys.stdout", out): + code = cli.main(["--version"]) + self.assertEqual(config.EXIT_OK, code) + self.assertEqual("bfos {0}\n".format(config.VERSION), out.getvalue()) + + def test_unsupported_language_is_refused_in_turkish(self): + err = io.StringIO() + with mock.patch("sys.stderr", err): + code = cli.main(["--lang", "en"]) + self.assertEqual(config.EXIT_USAGE, code) + self.assertIn("yalnızca Türkçe", err.getvalue()) + + def test_invalid_repository_is_a_usage_error(self): + # This asserts the terminal console's own repository resolution. The + # flag is explicit because --repo is valid for the GUI too: without + # --tui the router would hand the call to the window and the assertion + # would measure nothing (it also hangs a test runner with a display). + err = io.StringIO() + with mock.patch("sys.stderr", err): + code = cli.main(["--tui", "--repo", os.path.join(self.tmp.name, "not-a-repo")]) + self.assertEqual(config.EXIT_USAGE, code) + self.assertIn("Blueforce deposu", err.getvalue()) + + def test_gui_is_the_default_surface(self): + """Bayraksız çağrı grafik arayüze gider (varsayılan davranış).""" + args = build_args([]) + self.assertFalse(cli._wants_tui(args)) + + def test_tui_flag_forces_the_terminal_console(self): + self.assertTrue(cli._wants_tui(build_args(["--tui"]))) + self.assertFalse(cli._wants_tui(build_args(["--gui"]))) + + def test_terminal_only_flags_stay_in_the_terminal(self): + """Rapor ve terminal ayarı bayrakları GUI'ye kaptırılmaz.""" + for argv in (["--list"], ["--list-targets"], ["--check"], ["--no-color"]): + self.assertTrue(cli._wants_tui(build_args(argv)), argv) + # Dil bayrağı yalnız varsayılandan FARKLI verildiğinde terminale çeker; + # --lang tr varsayılanın kendisidir ve GUI'yi engellemez. + self.assertTrue(cli._wants_tui(build_args(["--lang", "en"]))) + self.assertFalse(cli._wants_tui(build_args(["--lang", "tr"]))) + + def test_gui_and_tui_together_are_refused(self): + err = io.StringIO() + with mock.patch("sys.stderr", err): + code = cli.main(["--gui", "--tui"]) + self.assertEqual(config.EXIT_USAGE, code) + self.assertIn("birlikte kullanılamaz", err.getvalue()) + + def test_list_is_non_interactive_and_covers_21_operations(self): + out = io.StringIO() + with mock.patch("sys.stdout", out): + code = cli.main(["--list", "--log-file", os.path.join(self.tmp.name, "console.log")]) + self.assertEqual(config.EXIT_OK, code) + text = out.getvalue() + self.assertIn("kapsam=simple", text) + self.assertIn("kapsam=release", text) + self.assertEqual(21, sum(1 for line in text.splitlines() if "kapsam=" in line)) + + def test_list_targets_without_an_inventory_still_explains(self): + out = io.StringIO() + with mock.patch("sys.stdout", out): + code = cli.main(["--list-targets"]) + self.assertEqual(config.EXIT_OK, code) + self.assertIn("DALGALAR", out.getvalue()) + + def test_resolve_repo_finds_the_checkout(self): + self.assertEqual(REPO_ROOT, cli.resolve_repo("").root) + + def test_catalogue_lines_are_turkish(self): + text = "\n".join(cli.catalogue_lines()) + self.assertIn("Salt okunur filo raporları", text) + self.assertIn("yıkıcı=evet", text) + + +def build_args(argv): + with mock.patch("sys.stdout", io.StringIO()): + return cli.build_parser().parse_args(argv) + + +# --------------------------------------------------------------------------- +# The admin/bf entry point +# --------------------------------------------------------------------------- +class TestAdminEntryPoint(unittest.TestCase): + PATH = os.path.join(REPO_ROOT, "admin", "bf") + + def test_file_exists_and_is_executable(self): + self.assertTrue(os.path.isfile(self.PATH)) + self.assertTrue(os.access(self.PATH, os.X_OK)) + + def test_file_is_valid_python(self): + with open(self.PATH, "r", encoding="utf-8") as handle: + source = handle.read() + compile(source, self.PATH, "exec") + + def test_python_entry_point_calls_bfos_cli(self): + completed = subprocess.run([sys.executable, self.PATH, "--version"], + capture_output=True, text=True, check=False) + self.assertEqual(0, completed.returncode) + self.assertEqual("bfos {0}".format(config.VERSION), completed.stdout.strip()) + + def test_missing_python3_prints_a_turkish_error_and_the_bash_fallback(self): + with tempfile.TemporaryDirectory() as empty: + completed = subprocess.run( + ["/bin/sh", self.PATH], + capture_output=True, text=True, check=False, + env={"PATH": empty, "LC_ALL": "C.UTF-8"}, + ) + self.assertEqual(3, completed.returncode) + self.assertIn("python3 bulunamadı", completed.stderr) + self.assertIn("bf-menu", completed.stderr) + + def test_repository_root_is_discovered(self): + completed = subprocess.run([sys.executable, self.PATH, "--list"], + capture_output=True, text=True, check=False, + env=dict(os.environ, XDG_STATE_HOME=tempfile.gettempdir())) + self.assertEqual(0, completed.returncode) + self.assertIn("kapsam=wave", completed.stdout) + + +# --------------------------------------------------------------------------- +# Operator flows end to end (no terminal, nothing executed) +# --------------------------------------------------------------------------- +class TestAppFlows(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.repo = make_temp_repo(self.tmp.name, inventory_text=SIMPLE_INVENTORY) + self.inventory = Inventory.load( + self.repo.path(os.path.join(config.INVENTORY_DIR_REL, "hosts.yml"))) + self.spawn = FakeSpawn() + # A fake ansible-playbook on PATH so have_ansible() is true without + # installing anything; the fake spawner still captures every command. + self.bin = os.path.join(self.tmp.name, "bin") + os.makedirs(self.bin, exist_ok=True) + ansible = os.path.join(self.bin, "ansible-playbook") + with open(ansible, "w", encoding="utf-8") as handle: + handle.write("#!/bin/sh\nexit 0\n") + os.chmod(ansible, 0o755) + self.env = mock.patch.dict(os.environ, {"PATH": self.bin + os.pathsep + os.environ["PATH"]}) + self.env.start() + self.addCleanup(self.env.stop) + self.audit = runner.AuditLog(requested=os.path.join(self.tmp.name, "console.log"), + state_home=self.tmp.name) + self.audit.initialise() + + def make_app(self, answers): + console = ScriptedConsole(answers) + run = runner.Runner(console, audit=self.audit, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory, + full_mode=True) + return app, console + + def log_text(self): + with open(self.audit.path, "r", encoding="utf-8") as handle: + return handle.read() + + def test_release_gated_operation_on_a_wave_requires_token_and_confirmation(self): + app, console = self.make_app( + ["2", "2", "10", "lab", "docker-ce=1:27.0.3", "lab", "e", "y"]) + code = app.run() + self.assertEqual(config.EXIT_OK, code) + self.assertEqual(1, len(self.spawn.calls)) + argv = self.spawn.calls[0] + self.assertEqual("ansible-playbook", argv[0]) + self.assertEqual(["--limit", "lab"], argv[argv.index("--limit"):argv.index("--limit") + 2]) + for expected in ("release_wave=lab", "wave_gate_confirmed=true", + 'update_packages=["docker-ce=1:27.0.3"]'): + self.assertIn(expected, argv) + self.assertNotIn("--check", argv) + self.assertIn("[RUN]", self.log_text()) + self.assertIn("başarıyla tamamlandı", console.output()) + + def test_wave_token_withheld_runs_nothing(self): + app, console = self.make_app(["2", "2", "10", "lab", "docker-ce=1:27.0.3", "pilot_1"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("Dalga onayı verilmedi", console.output()) + + def test_production_run_requires_the_typed_word_and_the_override(self): + app, _ = self.make_app( + ["2", "2", "10", "production", "docker-ce=1:27.0.3", "production", "e", "y"]) + app.run() + self.assertEqual(1, len(self.spawn.calls)) + argv = self.spawn.calls[0] + for expected in ("release_wave=production", "production_override=true", + "wave_gate_confirmed=true"): + self.assertIn(expected, argv) + + def test_production_run_without_the_override_approval_runs_nothing(self): + app, console = self.make_app( + ["2", "2", "10", "production", "docker-ce=1:27.0.3", "production", "h"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("Üretim onayı verilmedi", console.output()) + + def test_wrong_production_word_is_refused(self): + app, console = self.make_app( + ["2", "2", "10", "production", "docker-ce=1:27.0.3", "Production"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("Üretim onayı verilmedi", console.output()) + + def test_fleet_wide_wave_loop_stops_at_the_first_failure(self): + self.spawn.codes = [1] # the lab wave fails immediately + app, console = self.make_app(["2", "2", "5", "all", "e", "lab", "e", "y"]) + app.run() + self.assertEqual(1, len(self.spawn.calls), "no later wave may be touched") + self.assertEqual("lab", self.spawn.calls[0][self.spawn.calls[0].index("--limit") + 1]) + self.assertIn("[STOP]", self.log_text()) + self.assertIn("DURDURULDU", console.output()) + + def test_fleet_wide_simple_run_requires_the_word_all(self): + app, console = self.make_app(["2", "1", "1", "all", "yanliş"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("Filo geneli onayı verilmedi", console.output()) + + def test_fleet_wide_simple_run_proceeds_with_the_word_all(self): + app, _ = self.make_app(["2", "1", "1", "all", "all", "y"]) + app.run() + self.assertEqual(1, len(self.spawn.calls)) + self.assertEqual("all", self.spawn.calls[0][self.spawn.calls[0].index("--limit") + 1]) + + def test_fleet_wide_loop_skips_a_wave_whose_name_is_not_typed(self): + app, console = self.make_app(["2", "2", "5", "all", "e", "pilot_1", "lab"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("atlandı", console.output()) + self.assertIn("[CANCEL]", self.log_text()) + + def test_read_only_operation_records_the_target(self): + app, _ = self.make_app(["2", "1", "1", "lab", "y"]) + app.run() + self.assertEqual([["ansible-playbook", "-i", self.inventory.path, + self.repo.playbook_path("bf-ping.yml"), "--limit", "lab"]], self.spawn.calls) + self.assertIn("[TARGET] ping hedef=lab", self.log_text()) + + def test_invalid_dealer_number_is_reported_and_nothing_runs(self): + app, console = self.make_app(["2", "1", "1", "1", "1234"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("Geçersiz bayi numarası", console.output()) + + def test_unknown_target_word_is_reported(self): + app, console = self.make_app(["2", "1", "1", "wave_9"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("bir bayi numarası (8 hane), grup ya da 'all' değil", console.output()) + + def test_scope_drift_refuses_to_run_the_operation(self): + repo = make_temp_repo(os.path.join(self.tmp.name, "drift"), playbook_overrides={ + "bf-ping.yml": "---\n- hosts: all\n vars:\n release_wave: lab\n tasks: []\n" + }) + app, console = self.make_app([]) + app.repo = repo + app.run_operation(operations.find_operation("ping")) + self.assertEqual([], self.spawn.calls) + self.assertIn("RED", console.output()) + + def test_dry_run_mode_executes_nothing(self): + console = ScriptedConsole(["2", "1", "1", "lab"]) + run = runner.Runner(console, audit=self.audit, dry_run=True, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory, + full_mode=True) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("ÇALIŞTIRILMADI", console.output()) + + def test_check_mode_appends_check_to_the_fleet_command(self): + console = ScriptedConsole(["2", "1", "1", "lab", "y"]) + run = runner.Runner(console, audit=self.audit, check_mode=True, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory, + full_mode=True, check_mode=True) + app.run() + self.assertEqual("--check", self.spawn.calls[0][-1]) + + def test_simple_mode_status_is_read_only(self): + console = ScriptedConsole(["2"]) + run = runner.Runner(console, audit=self.audit, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory) + code = app.run() + self.assertEqual(config.EXIT_OK, code) + text = console.output() + self.assertIn("KİMLİK", text) + self.assertIn("Durum", text) + self.assertIn("bf-status", text) + + def test_simple_mode_quit_leaves_cleanly(self): + console = ScriptedConsole(["q"]) + run = runner.Runner(console, audit=self.audit, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory) + self.assertEqual(config.EXIT_OK, app.run()) + self.assertIn("Konsoldan çıkılıyor", console.output()) + + def test_simple_mode_d_shortcut_opens_the_detailed_menu(self): + console = ScriptedConsole(["d", "s", "q"]) + run = runner.Runner(console, audit=self.audit, spawn=self.spawn) + app = cli.App(repo=self.repo, console=console, runner_=run, inventory=self.inventory) + app.run() + self.assertIn(config.CAT_DEVICES, console.output()) + + @unittest.skipIf(os.geteuid() == 0, "root check cannot fail as root") + def test_local_install_requires_root(self): + app, console = self.make_app(["1", "2", "12010101", "h", "h"]) + app.run() + self.assertEqual([], self.spawn.calls) + self.assertIn("root yetkisi gerektirir", console.output()) + + def test_install_preflight_uses_check_mode_and_needs_no_root(self): + app, _ = self.make_app(["1", "1", "12010101"]) + app.run() + self.assertEqual(1, len(self.spawn.calls)) + argv = self.spawn.calls[0] + self.assertEqual("bash", argv[0]) + self.assertIn("--dealer-id", argv) + self.assertIn("--check", argv) + + def test_compare_with_the_bash_console_contract(self): + """The python command must match the documented bash -e set for a wave run.""" + app, _ = self.make_app(["2", "2", "7", "lab", "100", "y"]) + app.run() + argv = self.spawn.calls[0] + # bash: ansible-playbook -i INV PB --limit lab -e operation_wave=lab + # -e operation_confirmed=true -e log_lines=100 + self.assertEqual([ + "ansible-playbook", "-i", self.inventory.path, + self.repo.playbook_path("bf-collect-logs.yml"), "--limit", "lab", + "-e", "operation_wave=lab", "-e", "operation_confirmed=true", + "-e", "log_lines=100", + ], argv) + + +# --------------------------------------------------------------------------- +# Read-only reports +# --------------------------------------------------------------------------- +class TestReports(unittest.TestCase): + def test_targets_report(self): + inventory = Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml") + text = "\n".join(operations.targets_lines(inventory)) + self.assertIn("DALGALAR (yayılma sırası)", text) + self.assertIn("lab", text) + self.assertIn("envanterde yok", text) # waves the inventory does not have + + def test_wave_gate_state_explains_the_rule(self): + inventory = Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml") + text = "\n".join(operations.wave_gate_state_lines(inventory)) + self.assertIn("production", text) + self.assertIn("production_override", text) + + def test_central_checklist_is_turkish(self): + text = "\n".join(operations.central_checklist_lines()) + self.assertIn("MERKEZ HAZIRLIK LİSTESİ", text) + + def test_central_endpoints_read_group_vars(self): + text = "\n".join(operations.central_endpoint_lines(Repository(REPO_ROOT))) + self.assertIn("wg_hub_endpoint", text) + self.assertNotIn("operation_wave", text.replace("operation_wave", "", 0)) # no secret/noise keys + + def test_central_readiness_reports_placeholders(self): + text = "\n".join(operations.central_readiness_lines( + Repository(REPO_ROOT), Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml"))) + self.assertIn("PLACEHOLDER", text) + self.assertIn("[OK] Envanter", text) + + def test_state_whitelist_keeps_tokens_out(self): + with tempfile.TemporaryDirectory() as tmp: + path = os.path.join(tmp, "state.json") + with open(path, "w", encoding="utf-8") as handle: + json.dump({"phase": "READY", "device_id": "BF-12010101", + "enrollment_token": "supersecret"}, handle) + values = operations.state_values(path) + self.assertEqual({"phase": "READY", "device_id": "BF-12010101"}, values) + + def test_state_lines_explain_a_missing_file(self): + text = "\n".join(operations.state_lines("/nonexistent/state.json")) + self.assertIn("kurulmamış olabilir", text) + + def test_environment_report_lists_the_console(self): + text = "\n".join(operations.environment_lines( + Repository(REPO_ROOT), "/tmp/x.log", + Inventory.parse(SIMPLE_INVENTORY, path="hosts.yml"), dry_run=True, check_mode=False)) + self.assertIn("bfos {0}".format(config.VERSION), text) + self.assertIn("dry-run : evet", text) + + def test_endpoint_splitting(self): + self.assertEqual(("vpn.example.com", 51820), operations.split_endpoint("vpn.example.com:51820")) + self.assertEqual(("monitoring.example.com", 8428), + operations.split_endpoint("http://monitoring.example.com:8428")) + self.assertEqual(("mirror.example.com", 80), + operations.split_endpoint("http://mirror.example.com/ubuntu")) + self.assertEqual(("", None), operations.split_endpoint("")) + + def test_file_mode(self): + with tempfile.TemporaryDirectory() as tmp: + path = os.path.join(tmp, "f") + with open(path, "w", encoding="utf-8") as handle: + handle.write("") + os.chmod(path, 0o600) + self.assertEqual("600", operations.file_mode(path)) + self.assertEqual("?", operations.file_mode(os.path.join(tmp, "missing"))) + + +if __name__ == "__main__": + unittest.main(verbosity=2) + + + +# 05 — Tek-Tık Kurucu (One-Click Installer) + +> Kısa özet: Sahadaki tek giriş noktası **grafik operatör uygulamasıdır**: `sudo bf` → Kurulum sekmesi → "Bu cihazı kur". Bayi no doğrulaması, 18 modül, idempotent yeniden-koşu ve final-check kapısı `blueforce-install.sh`'ın işidir. Paketler git deposunda taşınır; **kurulum internetsizdir**. Terminal yedeği: `sudo bf --tui`. + +- Dosya: `docs/05-ONE-CLICK-INSTALLER.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-09` (tek kurucu), `K-11` (update kapalı), `K-12` (kimlik formatı), `K-03` (bf-gui), `K-10` (Docker disiplini), `K-16` (offline) +- İlgili dokümanlar: `33-OPERATOR-CONSOLE.md` (arayüz rehberi), `27-OFFLINE-PROVISIONING.md` (paket deposu sözleşmesi) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Saha teknisyeninin uzmanlık gerektirmeden cihazı standarda getirmesi: tek giriş noktası (`sudo bf`), tek girdi (8 haneli bayi no), net sonuç (`PROVISIONED_OFFLINE` / hata + neden). Yarım kalan veya hatalı kurulumun güvenli tekrarı. + +Teknisyen terminal komutu, bayrak veya dosya yolu ezberlemez: kurulum grafik arayüzdeki düğmeyle başlatılır, komut arayüzde gösterilir ve onay alınmadan çalıştırılmaz. + +## 2. Kapsam + +- Kapsam içi: grafik uygulama üzerinden kurulum akışı, kurucu betiğin komut yüzeyi, bayi-no doğrulama, 18 modül listesi ve sırası, paket deposu keşfi ve hata durumları, idempotency kuralları, log/çıkış kodları. +- Kapsam dışı: modül iç kodları (repo `scripts/install/installer/modules/`), imaj üretim yöntemi (04), filo-side yapılandırma (09), arayüzün tüm ekranları (33). + +## 3. Kararlar + +```text +KARAR: Saha kurulumunun tek giriş noktası grafik operatör uygulamasıdır: `sudo bf` → Kurulum sekmesi → "Bu cihazı kur". Kurucu betik (`scripts/install/blueforce-install.sh`) bu düğmenin çağırdığı motordur ve aynı akış terminalden `sudo bf --tui` ile de yürütülebilir. Eski bash menü (`admin/bf-menu`) yedek yoldur, ana yol değildir. +GEREKÇE: Tek giriş noktası ve tek düğme teknisyen hatasını en aza indirir; grafik arayüz komutu çalıştırmadan önce gösterir ve onay ister, böylece görünmez komut kalmaz. Bayi no `^[0-9]{8}$` ile doğrulanır; format kapısı yanlış kimliğin 9 sisteme yayılmasını baştan engeller (K-12). +ALTERNATİF: Yalnız bash menülü kurulum (`admin/bf-menu`) — grafik arayüz yoksa çalışır ama sahadaki ana yolu oluşturmaz; yedek olarak korundu. Çok scriptli kurulum (ağ.sh, gui.sh, …) — sıra hatası ve atlanan adım riski nedeniyle elendi. +RİSK: Tek dosya büyüdükçe bakımı zorlaşır; azaltma: 18 bağımsız modül + ana orkestratör ayrımı. Grafik arayüz `python3-tk` gerektirir; azaltma: paket offline depoda pinlidir ve ekransız/paketsiz ortamda uygulama Türkçe yönlendirme yapıp `--tui` önerir. +MALİYET: Ücretsiz. +LİSANS: Yok (şirket içi script + standart kütüphane ile yazılmış Python arayüz). +``` + +```text +KARAR: Kurucu 18 modülden oluşur (`01-precheck` … `18-final-check`); her modül idempotenttir — yeniden koşu güvenli ve kaldığı yerden tamamlayıcıdır. Paketler yerel paket deposundan gelir ve depo otomatik bulunur; `--offline` bayrağı zorunlu değildir. +GEREKÇE: Saha elektriği/kesintisi yarım kurulum üretir; idempotency olmadan her kesinti temiz-kurulum demektir. Final-check kapısı (modül 18) exit 0 vermeden cihaz kurulu sayılmaz; offline akışta sonuç `PROVISIONED_OFFLINE`, token sonrası `ENROLLED`, yalnız merkezi kanallar doğrulanınca `READY` olur (27/29). Depoyu kuran kişinin hatırlaması gereken bayrak sayısı sıfırdır. +ALTERNATİF: Tek seferlik (non-idempotent) script — kesinti durumunda belirsiz ara durum nedeniyle elendi. `--offline` bayrağını zorunlu tutmak — operatör bayrağı unuttuğunda kurulum durur; bayrak geriye uyumluluk için korundu. +RİSK: Modülün idempotent yazılmaması (çift kayıt, çift key); azaltma: §10'daki çift-koşu testi her modül için zorunlu. +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +700 cihaz × teknisyen başına değişen beceri = kurulumun "tek düğme + tek soru" olması şarttır. Grafik arayüz bu düğmeyi verir; 18 modül ise her kararın (update-kapalı, Docker-disiplini, GUI-anahtarı, kimlik, servisler) ayrı denetlenebilir adımıdır. Modül numarası log satırında görünür, arıza hangi adımda kaldıysa oradan devam edilir; arayüz aynı durumu "Kurulum modül durumu" işlemiyle salt-okunur gösterir. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Grafik arayüz + tek kurucu betik | Tek giriş, komut ezberi yok, onay görünür | Grafik katman gerekir (`python3-tk`, ekran) | **Seçildi** | +| Yalnız bash menülü kurulum (`admin/bf-menu`) | Grafik katman gerekmez | Ana yol olarak terminal bilgisi ister; ekran yok | Yedek yol | +| Çok scriptli kurulum | Küçük dosyalar | Sıra/atlama hatası | Elendi | +| Non-idempotent tek script | Daha basit kod | Kesintide temiz-kurulum zorunluluğu | Elendi | +| İnteraktif sihirbaz (çok sorulu) | Esnek | Teknisyen hatası, otomasyona kapalı | Elendi | + +## 6. Avantajlar + +- Tek giriş noktası (`sudo bf`) = eğitim maliyeti minimum, runbook tek sayfa. +- Idempotency = kesinti korkusu yok, "bir daha koş" her sorunun ilk cevabı. +- Final-check = kurulum sonucu ölçülebilir, dalga kapılarına bağlanır. +- İnternetsiz çalışır: paketler repoda gelir, kuran kişi hiçbir şey indirmez. + +## 7. Dezavantajlar + +- 18 modülün her biri için idempotency testi yazma maliyeti. +- Tek giriş noktası, modül-atlama (debug) ihtiyacında `--from/--only/--resume` bayraklarını zorunlu kılar. +- Grafik arayüz `python3-tk` paketine ve bir grafik oturuma bağlıdır; bu ikisi yoksa operatör terminal konsoluna (`sudo bf --tui`) düşer. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Modül idempotent değil (çift kayıt) | Orta | Orta | Çift-koşu testi (§10) + code review kuralı | +| Teknisyen yanlış no girer | Orta | Orta | Format kapısı (`^[0-9]{8}$`) + onay ekranı (`BF-12010193, onaylıyor musunuz?`) | +| Kurucu yarıda kesilir, cihaz ara durumda sahaya alınır | Düşük | Yüksek | Final-check exit 0 olmadan kurulum tamamlanmaz; arayüzdeki "Kurulum modül durumu" ve `bf-status` bunu gösterir | +| Grafik arayüz açılmaz (başsız oturum) | Orta | Düşük | Uygulama Türkçe hata + `sudo bf --tui` önerir (19 §T-10) | +| `python3-tk` eksik kalır | Düşük | Orta | Paket offline depoda pinli; `18-final-check` tkinter'ı denetler ve eksikse WARN yazar | + +## 9. Uygulama Planı + +### 1. Giriş noktası — grafik operatör uygulaması (ana yol) + +```bash +sudo bf # grafik arayüz (bfos paketi, bfos/ui_gui.py, Tkinter) +``` + +Akış: + +1. Pencere açılır: başlık **Blueforce Field OS — Yönetim**. +2. Basit modda üç düğme vardır: `Kur`, `Durum`, `Çıkış`. Üstteki **`Detaylı mod`** ile 5 sekme açılır: `Kurulum`, `Cihaz işlemleri`, `Merkez hazırlığı`, `Araçlar`, `Cihaz bilgisi`. +3. Üst çubuktaki **Hedef > Bayi no (8 hane)** alanına numara yazılır (örn. `12010193`); format geçersizse arayüz uyarır ve komut üretilmez. +4. `Kurulum` sekmesinde **`Bu cihazı kur`** (veya hiçbir şey yazmayan ön kontrol **`Kurulum ön kontrolü (--check)`**) seçilir. +5. Arayüz komutu **önce ekranda gösterir**, sonra onay ister; onaylanmadan çalıştırılmaz. Yıkıcı işlemler ikinci kez sorar; production kapsamı ayrı onay ister. +6. Kurulum çıktısı ekranda akar; bitince sonuç ve çıkış kodu görünür. + +`Bu cihazı kur` işleminin iki opsiyonel seçeneği vardır: `Yerel çevrimdışı depodan kur (--offline)` ve `Zaten OK olan modülleri atla (--resume)`. **`--offline` işaretlenmese de varsayılan kaynak yerel depodur**; bayrak yalnız niyeti sabitler. + +### 2. Yedek yol — terminal konsolu + +```bash +sudo bf --tui # aynı uygulamanın terminal arayüzü (grafik ekran yoksa / tkinter yoksa) +``` + +- `DISPLAY` ve `WAYLAND_DISPLAY` tanımlı değilse (SSH, başsız kurulum) uygulama Türkçe açıklama yazar ve **çıkış kodu 3** ile `sudo bf --tui` önerir. +- `python3-tk` kurulu değilse (`tkinter` import edilemiyor) aynı şekilde Türkçe hata + `python3-tk` kurulum ipucu verir ve **çıkış kodu 3** ile terminal konsolunu önerir. +- Eski bash menü `sudo admin/bf-menu` **yalnız yedek yoldur**; dokümanlarda ve iş akışında ana yol olarak kullanılmaz. + +### 3. Yetki + +- `sudo bf` = tam yetki (kurulum, servis, firewall, Ansible). +- Root değilse uygulama başlangıçta uyarır ve yalnız **salt-okunur raporları** çalıştırır: "Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf". Yazma işlemleri hem arayüzde kapalıdır hem de çalıştırma katmanında reddedilir (onaylansa bile komut çalışmaz). + +### 4. Bayi-no doğrulama + +`^[0-9]{8}$`; uymazsa arayüz geçersiz numarayı reddeder ve kurucu komut üretilmez (doğrudan CLI kullanımında exit 2 + kullanım mesajı). Geçerliyse onay ekranında `BF-12010193` + hostname `bf-12010193` gösterilir. + +### 5. 18 modül (sıra sözleşmedir, yeri `scripts/install/installer/modules/`) + +| # | Modül | İşlev | +|---|---|---| +| 01 | `01-precheck` | Root, Ubuntu sürümü, RAM/disk ön kontrolü; ağ yalnız bilgi (kapı değil) | +| 02 | `02-system` | Temel APT kaynakları, `unattended-upgrades` kapatma, saat dilimi (K-11) | +| 03 | `03-user` | `blueforce` bakım kullanıcısı, kısıtlı sudoers, zorunlu yönetici anahtarı (K-13) | +| 04 | `04-hostname` | Doğrulanmış bayi no'dan hostname `bf-` (K-12) | +| 05 | `05-network` | Ağ raporu: yerel bağlantı, rota/DNS (DNS zorunlu tutulmaz — offline kurulum) | +| 06 | `06-wireguard` | Cihaz anahtar çifti; `wg0.conf` enrollment'ın işidir (K-05/K-17) | +| 07 | `07-ssh` | Yönetici anahtarı doğrulandıktan **sonra** sshd sertleştirme | +| 08 | `08-rdp` | xRDP + GNOME oturumu, terminale boot varsayılanı, multi-user (K-03/K-22) | +| 09 | `09-rustdesk` | Yalnız pinli/sağlanan paketten RustDesk istemci (K-04) | +| 10 | `10-docker` | Docker CE + rotasyonlu `daemon.json` + enable (K-10) | +| 11 | `11-meg` | MEG yer tutucusu: vendor `.deb` varsa kurar, yoksa SKIP + kabul listesi | +| 12 | `12-monitoring` | Node Exporter + textfile collector dizini (K-07) | +| 13 | `13-firewall` | UFW deny-in tabanı + Docker yayın-portu politikasının kalıcılığı (K-05/K-10) | +| 14 | `14-update-policy` | APT hold'ları + otomatik update zamanlayıcılarını kapatma (K-11) | +| 15 | `15-logrotate` | journald tavanları + uygulama logrotate politikası (K-14) | +| 16 | `16-gui` | GNOME minimal + bakım araçları; terminale boot varsayılanı (K-03) | +| 17 | `17-healthcheck` | Teşhis ve enrollment komutlarını kurar; enrollment'ı çalıştırmaz | +| 18 | `18-final-check` | Son yaşam döngüsü kapısı: offline yerelde tamamlanır, `READY` merkez kanıtı ister; tkinter denetimi (yoksa WARN) | + +Modül çıkış kodları: `0` OK, `3` SKIP (opsiyonel adım, yapılacak bir şey yok), diğer ≠ 0 FAIL. + +### 6. Paket deposu — otomatik keşif, iki hata durumu, sıfır indirme + +Installer paket deposunu **kendi bulur**; `--offline` bayrağı **gerekmez** (geriye uyumluluk için kabul edilir, yalnız yerel depoyu zorlar). Arama sırası (ilk eksiksiz aday kazanır): + +1. `BF_OFFLINE_REPO` ortam değişkeni (operatör/repo sorumlusu override'ı), +2. `/provisioning/offline-repo/built` (git deposuyla gelen paket seti), +3. `/opt/blueforce/offline-repo` (cihaza kurulmuş paket deposu). + +Depo bulunduğunda ekrana Türkçe duyuru yazılır: `Yerel paket deposu bulundu: paket, ` + `Depo`, `Kaynak`, `Kip` satırları. İki farklı başarısızlık vardır ve **ikisinde de paket modüllerinden önce durulur, sistemde hiçbir değişiklik yapılmaz**: + +| Durum | Ekran | Sonuç | +|---|---|---| +| Depo hiçbir yerde yok | `HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md` + aranan yollar + `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.` | exit 1 | +| Depo bulundu ama bozuk/eksik | `OFFLINE BLOCKED: ` + Türkçe çıkış nedeni (ör. checksum uyuşmazlığı, eksik `Packages`/`packages.lock.tsv`, eksik pin) | exit 1 | + +Uzak APT kaynağı, `curl`, `wget`, anahtar indirme veya `apt download` çağrılmaz. Yalnız geliştirme/test için `--online` vardır ve üretim cihazlarında kullanılmaz (DİKKAT uyarısı yazar). + +### 7. Kurucu betiğin komut yüzeyi (yedek/otomasyon) + +```bash +sudo ./scripts/install/blueforce-install.sh --dealer-id 12010193 [--from 07] [--only 18-final-check] [--resume] [--check] [--yes] +# --check : değişiklik yapmadan denetim (final-check + modül durumları) +# --from : belirtilen modülden devam et | --only: tek modül koş | --resume: OK modülleri atla +# --yes : onay sormadan başla (otomasyon; GUI bu bayrağı kullanmaz) +# --offline: yerel depoyu zorla (varsayılan zaten yerel) | --online: yalnız geliştirme/test +``` + +### 8. Idempotency kuralları (her modül için zorunlu) + +- Varlık kontrolü önce (`id blueforce`, `dpkg -l`, `systemctl is-enabled`): varsa atla, yoksa kur. +- Dosya yazımları atomik (tmp + rename) ve tekrarlanabilir (aynı girdi → aynı çıktı). +- Anahtar/secret üretimi bir kez; `--force` olmadan yeniden üretilmez. +- Her modül `/var/log/blueforce-install.log` dosyasına modül no + OK/SKIP/FAIL satırı yazar. + +### 9. Çıkış kodları ve sonuç durumu + +Kurucu betik: `0` başarı (offline akışta `PROVISIONED_OFFLINE`), `1` engellendi veya modül hatası (no logda), `2` argüman/format hatası. Grafik/terminal arayüz: `3` grafik katman yok (ekran veya `python3-tk`), `2` kullanım hatası (`--tui` + `--gui` birlikte verilemez), `0` normal kapanış. + +`READY` bir kurucu çıkış kodu değildir: offline akış `PROVISIONED_OFFLINE` yazar, `READY` yalnız merkezi kanallar doğrulandığında (29/30) yazılır. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Geçersiz no (7/9 hane, harf, boş) | Arayüz reddeder / CLI exit 2, kurulum başlamaz | LAB(2) | +| `sudo bf` ile kurulum (grafik) | Komut önce gösterilir, onay ister, kurulum `PROVISIONED_OFFLINE` ile biter | LAB(2) masaüstü oturumu | +| `DISPLAY` yokken `sudo bf` | Türkçe yönlendirme + `sudo bf --tui` önerisi, exit 3, sistem değişmez | LAB(2) SSH | +| `python3-tk` yokken `sudo bf` | Türkçe "tkinter bulunamadı" + paket ipucu, exit 3 | LAB(2) minimal imaj | +| Her modülün çift-koşusu | İkinci koşu exit 0, durum değişmez (diff boş) | LAB(2) | +| Elektrik-kesintisi simülasyonu (modül 09 ortasında kill) | `--from 09` veya arayüzdeki `--resume` ile tamamlanır, final exit 0 | LAB(2) | +| `18-final-check` tüm kapıları | Eksik adımda FAIL + modül nosu, başarı damgası yok | LAB(2) | +| `--check` kuru koşusu (GUI ön kontrol / CLI) | Değişiklik yapmaz, rapor üretir | P1(5) | +| Depo yokken kurulum denemesi | Türkçe hata + aranan yollar + çıkış nedeni, exit 1, sistem değişmez | LAB(2) | +| Depo bozukken kurulum denemesi | `OFFLINE BLOCKED: ` + Türkçe çıkış nedeni, exit 1 | LAB(2) | + +## 11. Rollback + +1. Modül hatası: arayüzdeki "Kurulum modül durumu"/log ile modül nosu bulunur; `--from ` veya arayüzdeki `Başarısız kuruluma devam et (--resume)` ile sürdürülür. +2. Yanlış no: doğru no ile tam yeniden koşu (idempotent, hostname modülü üzerine yazar). +3. Düzelmeyen cihaz: 17-RECOVERY LEVEL 9 (temiz imaj + kurucu). +4. Paket deposu bozuksa sahada onarılmaz: repo sorumlusu depoyu yeniden üretip commit eder, güncel git tarafı çekilir ve komut tekrarlanır (27 §11). + +## 12. Kontrol Listesi + +- [ ] 18 modül dosyası `scripts/install/installer/modules/` altında numaralı ve çalışır durumda. +- [ ] Grafik arayüzde `Kurulum` sekmesi ve `Bu cihazı kur` işlemi bayi-no kapısına bağlı. +- [ ] Uygulama ekransız ortamda ve tkinter yokken Türkçe yönlendirme + `--tui` önerisi verip exit 3 ile çıkıyor. +- [ ] Her modülde varlık-kontrolü + log satırı var. +- [ ] Format regex'i 02 ile aynı (`^[0-9]{8}$`). +- [ ] `18-final-check` K-10/K-11 kapılarını ve tkinter denetimini içeriyor. +- [ ] Depo keşif sırası ve iki hata durumu (yok / bozuk) ekranda Türkçe ve fail-closed. +- [ ] `--check/--from/--only/--resume` bayrakları çalışıyor; `--offline` zorunlu değil. + +## 13. Açık Sorular + +- [ ] Paket setinin sahaya taşınması: git clone (Git LFS) mı, repo sorumlusunun hazırladığı `/opt/blueforce/offline-repo` kopyası mı birincil? (sahibi: Faz 3, 04/27 yazarları ile ortak) +- [ ] MEG sabit tag'inin kim tarafından, hangi onay ile güncelleneceği (sahibi: 10-UPDATE / 12-DOCKER yazarları). +- [ ] Arayüzün grafik ekran gerektirmeyen cihazlarda varsayılan modu (`--tui` mi, grafik mi) — saha ölçümü ile karar (sahibi: 33 + saha operasyonu). + +--- + +## Ek: Kurulum Akışı (grafik arayüz) + +```mermaid +flowchart TB + CMD["sudo bf
    (grafik operatör uygulaması)"] --> EKRAN{"Grafik ekran +
    python3-tk var mı?"} + EKRAN -->|Hayır| TUI["Türkçe yönlendirme + exit 3
    sudo bf --tui"] + EKRAN -->|Evet| HEDEF["Hedef: Bayi no (8 hane)"] + HEDEF --> FMT{"^[0-9]{8}$ ?"} + FMT -->|Hayır| UYARI["Arayüz uyarır
    komut üretilmez"] + FMT -->|Evet| KUR["Kurulum sekmesi
    'Bu cihazı kur'"] + KUR --> ONAY["Komut gösterilir + onay
    (yıkıcı: ikinci onay)"] + ONAY --> DEPO{"Yerel paket deposu aranır
    BF_OFFLINE_REPO → built → /opt/blueforce/offline-repo"} + DEPO -->|"hiçbiri yok"| YOK["Türkçe hata + aranan yollar
    ÇIKIŞ NEDENİ: bulunamadı · exit 1"] + DEPO -->|"bozuk/eksik"| BOZ["OFFLINE BLOCKED: sebep
    exit 1 · sistem değişmez"] + DEPO -->|"eksiksiz"| M01["01-precheck … 17-healthcheck
    (idempotent modüller)"] + M01 --> M18["18-final-check"] + M18 -->|Hepsi OK| OFFLINE["PROVISIONED_OFFLINE"] + M18 -->|FAIL| LOG["modül nosu + log yolu
    --from / --resume ile devam"] + OFFLINE --> ENR["Token → ENROLLED"] + ENR --> READY["Merkez kanalları doğrulandı → READY"] +``` +
    + + +# 20 — Saha Teknisyeni Runbook + +> Kısa özet: Sahada cihaz başına giden teknisyenin el kitabı. Tek akış: USB'yi tak → Ubuntu'yu kur → `sudo bf` → bayi numarasını gir → sonucu gör. Komut ezberi istenmez: kurulum, durum ve destek paketi grafik arayüzdeki düğmelerle yapılır; her adımda "ne göreceksin, ne yazacaksın" vardır. + +- Dosya: `docs/20-FIELD-TECHNICIAN-RUNBOOK.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-09` (USB → kurucu → bayi no), `#K-12` (bayi no → `BF-`), `#K-14` (`bf-status`, support-bundle), `#K-16` (offline kurulum) +- İlgili dokümanlar: `33-OPERATOR-CONSOLE.md` (arayüz rehberi), `27-OFFLINE-PROVISIONING.md` (paket deposu) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Teknisyenin sahada tek başına, telefonsuz bile cihazı teslim edilebilir hale getirmesi. Bu dosya "neden" anlatmaz, "ne yap" söyler. Neden merak eden 01'e bakar. + +## 2. Kapsam + +- Kapsam içi: USB ile sıfır kurulum, grafik arayüzü açma, bayi no girişi, kurulum sonucunu doğrulama, arızalı cihazda ilk 3 hareket, merkeze ne zaman telefon açılacağı. +- Kapsam dışı: merkez onayları (21), arıza teşhis tablosu detayı (19 — sadece yönlendirme), update dalgaları (10). + +## 3. Kararlar + +```text +KARAR: Teknisyen akışı 4 adımdır: USB → Ubuntu kur → `sudo bf` ile kurulum (bayi no) → sonucu gör. Grafik arayüz tek giriş noktasıdır; terminal konsolu (`sudo bf --tui`) yalnız grafik ekran veya tkinter yoksa kullanılan yedektir. Teknisyen hostname, IP, anahtar, paket yolu veya config dosyası ile uğraşmaz; paketler depoyla gelir ve kurulumda internet gerekmez. +GEREKÇE: K-09/K-16'nın hedef akışı; insan hatası en çok elle config ve ezberlenen komutta olur. Teknisyenin tek manuel girdisi 8 haneli bayi numarasıdır (K-12). +ALTERNATİF: Teknisyene tam Linux eğitimi + manuel kurulum — 700 cihazda standardizasyon bozulur; elendi. Yalnız bash menülü kurulum — grafik arayüz varken gereksiz terminal bilgisi ister; yedek yol olarak korundu. +RİSK: Depo kopyası eski sürüm kalır; azaltma: repo sürüm etiketi + merkezden "şu sürümden eski kopyayı kullanma" duyurusu. +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +Teknisyenin işi "bilgisayarcılık" değil "bayi cihazını çalışır teslim etmek"tir. Karar, teknisyenin dikkatini tek kritik noktaya toplar: bayi numarasını doğru girmek. Geri kalan her şey uygulama + merkez otomasyonudur. Bu yüzden bu dosya kısa cümlelerle, emir kipiyle yazılır. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Grafik arayüz (`sudo bf`) | Tek düğme, komut ezberi yok, onay görünür | Grafik katman gerekir | **Seçildi** | +| Detaylı Linux kılavuzu | Bilgili teknisyen | Uzun, hata açık, herkes okumaz | Elendi | +| Merkezden uzaktan kurulum (teknisyensiz) | Saha maliyeti yok | İlk kurulumda cihazda internet/VPN yok | Elendi (ilk kurulum sahada) | + +## 6. Avantajlar + +- Yeni teknisyen 1 saatlik eğitimle sahaya çıkar. +- Her cihaz aynı adımla kurulur; "ustalık farkı" kapanır. +- Kurulum internetsiz çalışır: paket seti depodan gelir, hiçbir şey indirilmez. + +## 7. Dezavantajlar + +- Uygulamanın yapmadığını teknisyen de yapamaz; olağandışı durumda merkeze bağımlıdır (bilerek böyle). +- Depo kopyası (paket setiyle birlikte ~888 MB) fiziksel/lojistik takip ister. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Bayi no yanlış girilir | Orta | Yüksek | Arayüz `BF-`'yu gösterir, teknisyen bayiye onaylatır | +| Eski depo kopyası ile kurulum | Orta | Orta | Repo sürüm etiketi + kurucu başlangıçta depoyu ve paket sayısını söyler | +| Grafik arayüz açılmaz (ekran/tkinter) | Orta | Orta | `sudo bf --tui` yedeği; sorun merkeze bildirilir | +| Sonuç görülmeden sahadan çıkılır | Düşük | Yüksek | Kontrol listesi imzalanmadan iş kapanmaz | + +## 9. Uygulama Planı + +### A. Sıfır kurulum (yeni cihaz) — 4 adım + +**ADIM 1 — USB'yi tak, bilgisayarı aç.** + +1. Kurulum USB'sini tak. +2. Bilgisayarı aç, USB'den başlat (açılışta genelde F12/F8/F2 — ekranda yazar). +3. Ubuntu kurulum ekranı gelene kadar bekle. + +> Göreceğin: Ubuntu kurulum ekranı. Bunu görmüyorsan: USB tam takılı mı, BIOS boot sırası USB mi? Olmazsa merkeze telefon aç. + +**ADIM 2 — Ubuntu'yu kur ve depo kopyasını getir.** + +1. Ekrandaki kurulumu varsayılanlarla tamamla (dil: Türkçe, disk: tamamını kullan). +2. Kurulum bitince USB'yi çıkarma, bilgisayarı yeniden başlat. +3. Repo kopyasını cihaza getir (merkezin söylediği yolla: `git clone` — paketler Git LFS ile birlikte gelir — veya hazır kopya `/opt/blueforce/offline-repo` altına konur). + +> Paketler repoyla birlikte gelir; **internetten hiçbir şey indirilmez**. + +**ADIM 3 — Grafik arayüzü aç, bayi numarasını gir, kurulumu başlat.** + +1. Terminali aç, şunu yaz: + +```bash +sudo bf +``` + +2. Pencere açılır: başlık **Blueforce Field OS — Yönetim**. (Ekran yoksa veya tkinter yoksa uygulama Türkçe uyarı verir; o zaman `sudo bf --tui` yaz — §D.) +3. Üst çubuktaki **Hedef > Bayi no (8 hane)** alanına **8 haneli bayi numarasını** yaz. Faturadaki/sistemdeki numarayı kullan. Örnek: `12010193`. +4. **Kurulum** sekmesi → **`Bu cihazı kur`**. +5. Arayüz komutu ekranda gösterir ve onay ister. `BF-12010193` görünüyor mu? Doğruysa onayla; yanlışsa iptal et ve numarayı düzelt. + +```text +Arayüzden: sudo bf → Hedef: Bayi no (8 hane) → Kurulum → "Bu cihazı kur" +Komutla (yedek): + sudo bf --tui # terminal konsolu; Kurulum menüsünden aynı akış + sudo ./scripts/install/blueforce-install.sh --dealer-id 12010193 +``` + +6. Numarayı bayiye sesli onaylat: "Cihaz numaranız BF-12010193, doğru mu?" + +**ADIM 4 — Sonucu gör, çık.** + +1. Kurulum bitene kadar bekle (kapatma, fişi çekme). Cihazın açık kalması şart. +2. Sonucu gör: + +```text +Arayüzden: `Durum` düğmesi (basit mod) → Durum özeti ya da Kurulum sekmesi → "Kurulum modül durumu" +Komutla (yedek): bf-status +``` + +3. **`PROVISIONED_OFFLINE`** görmen normaldir: kurulum yerelde tamamlandı, cihaz internetsiz kuruldu. Bu durumda cihaz `READY` değildir. +4. İnternet geldiğinde merkezden tek-kullanımlık enrollment token iste ve 29'daki adımı uygula. +5. Token sonrası **ENROLLED** görünür; WireGuard, remote ve monitoring merkezi doğrulaması bitince **READY** görürsün. +6. READY sonrası kontrol listesini doldur (§12), sahadan çık. + +### B. Arızalı cihaza gittin — ilk 3 hareket + +1. Durumu oku: + +```text +Arayüzden: sudo bf → `Durum` düğmesi (Durum özeti) +Komutla (yedek): bf-status +``` + +Kırmızı satır hangisi? Not al. +2. Bilgisayarı bir kez yeniden başlat. Düzelirse READY'yi gör, çık. +3. Düzelmezse destek paketini al, merkeze gönder: + +```text +Arayüzden: sudo bf → Detaylı mod → Araçlar sekmesi → "Destek paketi oluştur" +Komutla (yedek): bf-support-bundle --out /tmp/bf--bundle.tar.gz +``` + +Paketi merkeze ilet (telefonla nasıl göndereceğin söylenir), merkez sana söylemeden başka komut çalıştırma. + +### C. Merkeze telefon açma kuralları + +Hemen ara: sonucu alamıyorsan, aynı arıza 2 cihazda üst üste çıktıysa, donanım kırık/yanık kokusu varsa, bayi numarasından emin değilsen. +Arama: cihaz başında ol, `BF-`'yu ve durum özetini/`bf-status` çıktısını hazır tut. + +### D. Grafik arayüz açılmıyor — yedek yol + +| Belirti | Ne yap | +|---|---| +| "Grafik ekran bulunamadı" / SSH oturumu | `sudo bf --tui` yaz; aynı işlemler terminal menüsünde numaralarla yürür | +| "tkinter bulunamadı" | `sudo bf --tui` ile devam et ve merkeze bildir; `python3-tk` paketi kurulum depounda pinlidir (19 §T-10) | +| Pencere açıldı ama dondu | Pencereyi kapat, `sudo bf --tui` ile devam et, merkeze bildir | + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Sıfır teknisyen 4 adımı desteksiz yapar | Hedef teslim durumu < hedef süre | LAB(2) | +| Yanlış bayi no girilir | Uygulama uyarır, komut üretilmez/çalışmaz | LAB(2) | +| Ekransız oturumda `sudo bf` | Türkçe yönlendirme + `sudo bf --tui` önerisi, exit 3 | LAB(2) | +| Depo kopyası olmayan cihazda kurulum | Türkçe hata + aranan yollar + çıkış nedeni, sistem değişmez | LAB(2) | +| Elektrik kesintisi simülasyonu sonrası durum | Kurulum kaldığı yerden tamamlanır; durum doğru raporlanır | LAB(2) | + +## 11. Rollback + +Teknisyen rollback yapmaz. Kurulum yarıda kesildiyse: `sudo bf` → Kurulum sekmesi → **`Başarısız kuruluma devam et (--resume)`** (komutla yedek: aynı kurucu `--resume` bayrağıyla). İkinci denemede de olmazsa merkeze telefon aç — merkez 17-RECOVERY'den seviyeyi seçer. + +## 12. Kontrol Listesi + +- [ ] Depo kopyası/checkout sürümü güncel (etiket + merkez duyurusu eşleşiyor). +- [ ] `BF-` bayiye onaylatıldı. +- [ ] Kurulum sonucu görüldü (`PROVISIONED_OFFLINE` normaldir; READY için §A/ADIM 4-5). +- [ ] Cihaz fişe + internete bağlı bırakıldı. +- [ ] İş formu dolduruldu (bayi no, tarih, teknisyen adı). + +## 13. Açık Sorular + +- [ ] Depo kopyasının sahaya taşınma/sürüm takip yöntemi (git clone + LFS mı, hazır kopya mı) (sahibi: merkezi admin, 21). +- [ ] İş formu kağıt mı mobil mi (sahibi: 25-ROADMAP). +- [ ] Hedef kurulum süresi (öneri: P2'de ölçülecek). + +--- + +## Ek: Mermaid — teknisyen akışı + +```mermaid +flowchart TB + USB["USB tak → aç"] --> KUR["Ubuntu kur"] + KUR --> DEPO["Depo kopyasını getir
    (paketler LFS ile gelir, indirme yok)"] + DEPO --> BF["sudo bf"] + BF --> EKRAN{"Grafik ekran +
    python3-tk var mı?"} + EKRAN -->|Hayır| TUI["sudo bf --tui
    (yedek terminal konsolu)"] + EKRAN -->|Evet| NO["Hedef: Bayi no (8 hane)"] + TUI --> NO + NO --> ONAY["Arayüz komutu gösterir + onay
    BF-no'yu bayiye onaylat"] + ONAY --> BEKLE["Kurulum bitsin
    (kapatma / fişi çekme)"] + BEKLE --> DURUM["Durum: PROVISIONED_OFFLINE / ENROLLED / READY"] + DURUM -->|"READY"| CIK["Formu doldur → çık"] + DURUM -->|"sorun var"| TEL["Destek paketi + merkeze telefon aç"] +``` +
    + + +# 21 — Merkezi Yönetici Runbook + +> Kısa özet: Merkezdeki yöneticinin el kitabı: hangi işlemi kim onaylar, update'i kim başlatır, dalga kapıları nasıl açılır, teknisyen ne zaman sahaya sürülür. Yetki ve sıra bu dosyadadır. Filo işlemleri grafik arayüzden (`sudo bf` → `Cihaz işlemleri`) yürütülür; komut satırı karşılıkları yedek/otomasyon yoludur. + +- Dosya: `docs/21-CENTRAL-ADMIN-RUNBOOK.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-06` (Ansible/Semaphore), `#K-11` (onay zinciri + dalgalar), `#K-13` (anahtar dağıtımı) +- İlgili dokümanlar: `33-OPERATOR-CONSOLE.md` (arayüz rehberi), `10-UPDATE-AND-ROLLBACK-POLICY.md` (dalga politikası), `20-FIELD-TECHNICIAN-RUNBOOK.md` (saha) +- Durum: [ ] Taslak + +--- + +## 1. Amaç + +Merkezde "kim, neyi, hangi sırayla yapar" sorusunu kapatmak. Update'i kim başlatır, dalgayı kim onaylar, acil durumda kim karar verir — hepsi burada yazar, kriz anında aranmaz. İşlemler tek arayüzde toplanır: `sudo bf` (grafik) veya `sudo bf --tui` (yedek terminal konsolu). + +## 2. Kapsam + +- Kapsam içi: rol ve onay yetkileri, update başlatma akışı, dalga kapı prosedürü, arayüz üzerinden filo işlemi yürütme, anahtar/erişim yönetimi, acil durum yetkisi, günlük/haftalık rutinler. +- Kapsam dışı: tek cihaz kurulum adımları (20), komut-seviyesi teşhis (19), kurtarma seviye tablosu (17 — buradan çağrılır), merkez sunucusunun kurulumu (arayüzde yalnız "Merkez hazırlığı" denetimleri vardır). + +## 3. Kararlar + +```text +KARAR: Update'i yalnızca merkezi yönetici başlatır; teknisyen, bayi veya otomatik zamanlayıcı update tetikleyemez. Her dalga geçişi açık onay gerektirir: arayüzden çalıştırıldığında "production" yazma adımı + production ek onayı, gündelik/sürüm kapsamlı işlemlerde kapı sözcüğü; Semaphore iş akışı kullanılıyorsa kapı adımı Semaphore'dadır. +GEREKÇE: K-11 "onaysız update yasak" ilkesinin operasyonel karşılığıdır; tek başlatma noktası = denetlenebilirlik. Otomatik tetikleyici olmaması, zamanlanmış sürprizleri engeller. Onay olmadan komut üretilmez: arayüz komutu önce gösterir, kapı adımını geçmeyen çağrıda bayrağı kendiliğinden eklemez. +ALTERNATİF: Takvimli otomatik dalga başlatma — onay kaydı zayıflar, arızada "kim başlattı" belirsizleşir; elendi. +RİSK: Yönetici izindeyken update kilitlenir; azaltma: en az 2 onay yetkilisi tanımlanır (asıl + vekil). +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +```text +KARAR: Acil güvenlik update'inde dalga sırası atlanamaz ama gözetim süreleri kısaltılabilir; kısaltma kararı ve gerekçesi kayda geçirilir. +GEREKÇE: Sıra atlamak (LAB'ı geçmeden PROD'a çıkmak) filo-çapı riskidir; süre kısaltmak ise bilinçli hızlandırmadır. Kayıt, sonradan denetimi sağlar. +ALTERNATİF: Acilde direkt PROD — geri dönüşü olmayan hata riski; elendi. +RİSK: "Acil" etiketi suistimal edilir; azaltma: acil tanımı (CVSS eşiği / aktif sömürü) 10-UPDATE'ta yazılıdır. +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +700 cihazda en tehlikeli cümle "ben başlattım sandım"dır. Başlatma yetkisini tek role toplamak, hem hatayı hem suçu önler: hata olursa kayıttan bulunur, suçlama olursa kayıt konuşur. Vekil kuralı, tek kişiye bağımlılığı kaldırır. Arayüz bu disiplini görünür kılar: dalga kapsamlı her işlemde komut, bayraklarıyla birlikte ekranda gösterilir, production dalgası için `production` yazılmadan komut çalışmaz; her karar `/var/log/blueforce-console.log` (mod `600`) dosyasına düşer. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Herkes update başlatabilir | Hızlı | Onaysız yayılım, denetimsizlik | Elendi | +| Tam otomatik pipeline | Eforsuz | Politika ihlali (K-11) | Elendi | +| Tek onay yetkilisi | Net | İzin/hastalıkta kilit | Elendi (asıl+vekil) | +| Yalnız serbest `ansible-playbook` komutu | Esnek | Kapı bayrakları elle yazılır, atlanabilir | Elendi (arayüz kapıyı bayrakla bağlar) | + +## 6. Avantajlar + +- Her update'in "kim başlattı, kim onayladı, ne zaman" kaydı vardır (konsol denetim günlüğü). +- Acil durumda bile sıra korunur; hız, sıranın içinde ayarlanır. +- Hedef seçimi tek yerden yapılır: tek cihaz (bayi no), dalga grubu (lab, pilot_1, pilot_2, wave_1, wave_2, production) veya tüm filo. + +## 7. Dezavantajlar + +- Onay adımı update'i yavaşlatır (bilerek; hız 25-ROADMAP'ta acil yoluyla dengelenir). +- Kapı adımı atlanırsa (serbest CLI ile run) politika kağıtta kalır — teknik zorunluluk şarttır. +- Arayüz grafik katman gerektirir; merkez sunucusunda yoksa `sudo bf --tui` kullanılır. + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Kapı adımı bypass edilir (arayüz dışı CLI run) | Orta | Yüksek | Semaphore/arayüz dışı prod run yasaktır; denetim günlüğü izlenir | +| İki yetkili de ulaşılamaz | Düşük | Orta | Acil iletişim zinciri + önceden tanımlı duraklatma (devam etme, durdur) | +| Anahtar sızıntısı | Düşük | Yüksek | Per-admin anahtar iptali + rotasyon (K-13) | +| Yanlış hedefe işlem (grup/tüm filo) | Orta | Yüksek | Hedef arayüzde tek tek seçilir; `--limit` komutta görünür, onay istenir | + +## 9. Uygulama Planı + +### Roller + +| Rol | Kim | Yetkisi | +|---|---|---| +| Onay yetkilisi (asıl + vekil) | İsimle tanımlanır | Dalga başlatma/onay, acil kısaltma kararı, L8/L9 kararı | +| Operatör | Merkez ekibi | Onaylanmış job'u çalıştırma, monitoring izleme, teknisyen yönlendirme | +| Teknisyen | Saha ekibi | 20'deki akış; update/dalga başlatamaz | +| İzleyici (read-only) | Yönetim | Panoları görür, işlem yapamaz | + +### Standart update akışı (yönetici gözüyle) + +1. Update talebi gelir (güvenlik bülteni / MEG sürümü / OS yaması) → etki + geri alma planı raporlanır. +2. Onay yetkilisi LAB'ı başlatır: Semaphore'da job + kayıt (veya arayüzden dalga işlemi). +3. LAB çıkış kriteri tuttuysa P1 → P2 → W1 → W2 → PROD, her kapıda açık onay. +4. Herhangi bir dalgada halt kuralı (18) tetiklenirse: yayılım DURUR, 17-L3 işletilir, kök neden bulunmadan kapı açılmaz. +5. PROD bitiminde kapanış kaydı (başarı/arıza sayısı, süre). + +```text +Arayüzden (merkez operatörü): + sudo bf → Detaylı mod → Cihaz işlemleri sekmesi + → işlemi seç (örn. "Kontrollü yeniden başlatma" / "Onaylı paket güncellemesi") + → Hedef: dalga grubu (lab, pilot_1, pilot_2, wave_1, wave_2, production) + → kapı adımı: production için 'production' yazmak ZORUNLU + → komut ekranda gösterilir → onay → çalışır + +Komutla (yedek / otomasyon): + ansible-playbook -i ansible/inventory/... ansible/playbooks/bf-reboot.yml \ + --limit wave_p1 -e operation_wave=wave_1 -e operation_confirmed=true +# production_override / allow_production_reboot yalnız production ek onayıyla eklenir. +# Kapı kuralı: önceki dalga sağlık kapısını geçmediyse çalıştırılmaz (10). +``` + +Planlama/denetim komutlarının arayüz karşılıkları: + +```text +Arayüzden: sudo bf → Merkez hazırlığı sekmesi + (envanter hedefleri ve dalga/cihaz sayıları, PLACEHOLDER denetimi, + merkez uç noktaları, hazırlık kontrol listesi — hepsi salt-okunur) +Komutla (yedek): sudo bf --tui → Merkez hazırlığı menüsü + admin/bf-menu --list-targets # yedek bash menüsü +``` + +### Anahtar ve erişim yönetimi + +1. Yeni admin: anahtarı üretilir, `authorized_keys`'e Ansible ile dağıtılır (K-13); eski/ayrılan adminin anahtarı aynı yolla kaldırılır. +2. Paylaşılan tek private key YOKTUR; böyle bir dosya görülürse olay kaydı açılır. +3. Semaphore yalnızca WireGuard arkasından erişilir; gizliler yerleşik şifreli Key Store'dadır (K-06). + +### Günlük / haftalık rutinler + +- Günlük (operatör, 10 dk): Uptime Kuma UP/DOWN, Prometheus `up` == 0 listesi, gece reboot olanlar, yedek job durumu. Cihaz durumu için arayüzden `Durum` düğmesi ya da `Cihaz işlemleri > Kurulum fazı raporu`. +- Haftalık (yönetici, 30 dk): dalga takvimi, açık halt'lar, anahtar/envanter uyumsuzlukları, `PROVISIONED_OFFLINE`/`ENROLLED` bekleyen cihaz kuyruğu, release manifest/rollback kanıtı ve L9 tatbikat sayacı (27/29/30). + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| Onaysız PROD run denemesi | Engellenir (`production` yazılmadan komut çalışmaz) + denetim günlüğüne yazılır | Merkez test | +| Semaphore kapalıyken Ansible CLI run | Onaylı iş CLI'dan koşar (K-06) | LAB(2) | +| Vekil ile dalga onayı | Kayıtta vekil adı görünür | Merkez test | +| Arayüzden dalga hedefi seçimi | Komutta doğru `--limit` görünür, yanlış hedefte komut üretilmez | Merkez test | +| Grafik arayüz yokken yönetim işlemleri | `sudo bf --tui` ile aynı işlemler yürütülür | LAB(2) SSH | + +## 11. Rollback + +1. Hatalı dalga: 17-L3 + 10-UPDATE rollback zinciri; kapı bir sonraki dalgaya kapatılır. +2. Hatalı onay: aynı yetkili (veya vekil) durdurma kararı verir; "devam" kararı verilemez, yalnızca "dur + geri al". +3. Arayüzden başlatılan yanlış kapsamlı işlem: komut ekranda ve denetim günlüğünde hedefiyle kayıtlıdır; kapsam bu kayıttan doğrulanıp geri alma adımı planlanır. + +## 12. Kontrol Listesi + +- [ ] Asıl + vekil isimle tanımlı ve iletişim bilgileri güncel. +- [ ] Semaphore'da PROD kapı adımı teknik olarak zorunlu; arayüzde production için 'production' yazma adımı çalışıyor. +- [ ] Her dalga onayı kayıtlı (kim, ne zaman, hangi sürüm) — `/var/log/blueforce-console.log` mod `600`. +- [ ] Ayrılan personelin anahtarı kaldırıldı. +- [ ] Merkez operatörleri grafik arayüzü (`sudo bf`) ve yedek terminal konsolunu (`sudo bf --tui`) biliyor. + +## 13. Açık Sorular + +- [ ] Acil tanımı eşikleri (CVSS/aktif sömürü) — 10-UPDATE ile ortak onay (sahibi: yönetici). +- [ ] Kapanış raporu formatı ve saklama süresi (sahibi: 25-ROADMAP). +- [ ] Read-only yönetim panosu kapsamı (sahibi: 14-MONITORING yazarı). +- [ ] Arayüzün merkez sunucusunda (`sudo bf --tui` mi, grafik mi) varsayılan kullanımı (sahibi: 33 + merkez ekibi). + +--- + +## Ek: Update Onay Akışı (yönetici gözüyle) + +```mermaid +flowchart TB + TALEP["Update talebi
    (güvenlik / MEG / OS)"] --> KAYIT["Değişiklik kaydı
    kapsam + geri alma planı"] + KAYIT --> ONAY{"Onay yetkilisi
    (asıl veya vekil)"} + ONAY -->|Ret| KAPANIR["Kapanış kaydı (ret)"] + ONAY -->|Onay| UI["sudo bf → Cihaz işlemleri
    hedef: dalga grubu"] + UI --> KAPI0{"Kapı adımı
    production ise 'production' yaz"} + KAPI0 -->|Geçmedi| DUR0["Komut çalışmaz
    (denetim günlüğü: CANCEL)"] + KAPI0 -->|Geçti| LAB["LAB(2) → P1(5) → P2(20)"] + LAB --> KAPI{"Sağlık kapısı temiz mi?"} + KAPI -->|Halt| DUR["Yayılım DURUR → 17-L3 rollback"] + KAPI -->|Temiz| WAVE["W1(50) → W2(100) → PROD(~523)"] + WAVE --> RAPOR["Kapanış kaydı
    (başarı/arıza/süre)"] +``` +
    + + +# 27 — Offline Provisioning + +> Kısa özet: Paketler **git deposunun içindedir** (`provisioning/offline-repo/built/pool/`, 1321 `.deb`, ~884 MB, Git LFS ile takip edilir). Saha kurulumu internet **gerektirmez**: `sudo bf` → Kurulum sekmesi → "Bu cihazı kur" → 8 haneli bayi no → onay. Paket yükü klonla birlikte gelmez (bilerek; bkz. §4), yerel aynadan taşınır ve kurucu depoyu kendi bulur. Bu yol yalnız `PROVISIONED_OFFLINE` durumuna getirir; cihaz, tek kullanımlık enrollment token ve merkezi kanallar doğrulanmadan `ENROLLED` veya `READY` olmaz. +> +> - Dosya: `docs/27-OFFLINE-PROVISIONING.md` +> +> **Uygulama sözleşmesi:** Kurucu, paket setini **kendi kendine bulur** ve varsayılan olarak yerel depodan kurar; `--offline` bayrağı artık **gerekmez** (geriye uyumluluk için kabul edilir, yalnız yerel depoyu zorlar). Arama sırası: (1) `BF_OFFLINE_REPO` ortam değişkeni, (2) `/provisioning/offline-repo/built`, (3) `/opt/blueforce/offline-repo`; ilk eksiksiz aday kazanır. Yerel `file:` APT kaynağı dışında hiçbir kaynak kullanılmaz: uzak APT source, curl, wget, anahtar indirme veya `apt download` çağrılmaz. **İnternet kurulum için gerekmez.** İki farklı başarısızlık vardır: depo hiç yoksa kurulum Türkçe bir hata, aranan yollar ve `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.` ile durur; depo bulunup da doğrulanamazsa (eksik `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS`; checksum uyuşmazlığı; boş/bozuk kilit; eksik pin) `OFFLINE BLOCKED: ` ile durur. Her iki durumda da paket modüllerinden önce durulur, kurulum başlamaz ve sistemde hiçbir değişiklik yapılmaz. Paketler bu git deposunda taşınır ve **repo sorumlusu** tarafından `add-packages.sh` + `build-index.sh` ile bu depoya konur; kuran kişi hiçbir şey indirmez. Yalnız geliştirme/test için `--online` vardır ve **üretim cihazlarında kullanılmaz**. Grafik arayüz `python3-tk` paketine bağlıdır; bu paket offline depoda bilinçli olarak pinlidir (`manifests/base-packages.txt`). +> - İlgili kararlar: `24-DECISION-LOG.md#K-16`, `#K-09`, `#K-11`, `#K-12` +> - İlgili dokümanlar: `05-ONE-CLICK-INSTALLER.md` (kurucu), `33-OPERATOR-CONSOLE.md` (arayüz), `provisioning/offline-repo/README.md` (paket hazırlama) +> - Durum: [ ] Taslak + +--- + +## 1. Amaç + +Saha interneti kesik veya güvenilmezken tekrarlanabilir, denetlenebilir ve secretsiz ilk kurulumu tanımlamak. Kuran kişi paket aramaz, indirmez, bayrak ezberlemez: paket seti depoda sürümlenir ve yerel aynadan taşınır. + +## 2. Kapsam + +- Kapsam içi: git checkout (paketler dahil) veya kurulmuş `/opt/blueforce/offline-repo`, offline APT bundle (`built/`), kurucunun yerel depoyu otomatik bulması, iki hata durumu, grafik arayüz üzerinden kurulum, `python3-tk` pini, durum damgası ve sonradan enrollment. +- Kapsam dışı: merkezi peer atama ve token doğrulama (29), release imzalama (30), paket setinin nasıl üretildiği (repo sorumlusunun işi, `provisioning/offline-repo/README.md`). + +## 3. Kararlar + +```text +KARAR: Paket seti git deposunda taşınır ve cihaz grafik arayüzden (`sudo bf` → Kurulum → "Bu cihazı kur") internetsiz kurulur; paket deposu kurucu tarafından otomatik bulunur ve sonuç durumu yalnızca PROVISIONED_OFFLINE'dır. +GEREKÇE: Paket indirme veya merkezi API'ye erişim yokken cihaz standarda getirilebilir; fakat merkezde doğrulanmamış kimlik ve kanallar READY iddiası yapamaz. Kuran kişinin indirme yapmaması ve bayrak hatırlamaması saha hatasını ortadan kaldırır: yerel depo varsayılan ve tek kaynaktır. +ALTERNATİF: İnternet gelene kadar kurulum yapmama — saha ziyareti ve bekleme maliyeti nedeniyle elendi. Kurulumu `--offline` bayrağına bağlamak — operatör bayrağı unuttuğunda kurulum durur; otomatik keşif seçildi, bayrak geriye uyumluluk için korundu. +RİSK: Eski veya karışık paket snapshot'ı; manifest, checksum ve release kimliği ile azaltılır. Yanlış/eski depo bulunması; arama sırası ve her adayda eksiksizlik denetimi ile azaltılır. Grafik arayüzün `python3-tk` paketine bağımlılığı; paketin offline depoda pinlenmesi ve eksikliğinde `sudo bf --tui` yedeği ile azaltılır. +MALİYET: Ücretsiz (depo boyutu git tarafında ~888 MB). +LİSANS: APT — https://manpages.ubuntu.com/manpages/noble/en/man8/apt.8.html ; dpkg — https://manpages.ubuntu.com/manpages/noble/en/man1/dpkg.1.html ; Ubuntu offline kurulum ayrıntısı 26.04 için LAB doğrulamalıdır. +``` + +## 4. Neden Bu Karar? + +**Paketler ayrı bir medyada değil, bu git deposunda taşınır:** `provisioning/offline-repo/built/pool/` altında 1321 `.deb` (~884 MB) durur ve `.gitattributes` ile **Git LFS** üzerinden takip edilir (`*.deb filter=lfs ...`). Bu yüzden sahada "hangi paket nereden geldi?" sorusu ne internete ne de dış medyaya bağlıdır; aynı soru `packages.lock.tsv` ve `repo-manifest.yaml` ile yanıtlanır. + +Kuran kişi paket **aramaz**, ama paket yükünü kendiliğinden de indirmez — bu bilinçli bir ayrımdır. LFS yükü ~884 MB olduğu ve 700 cihazın her biri onu çekerse aylık bant kotası ilk günde tükeneceği için klon hafif tutulur; yük **yerel aynadan** (USB ya da repo sorumlusunun bıraktığı kopya) gelir, sahada internet gerekmez. Yalnız internet varken ve tek seferlik bir çekme uygunsa `git lfs pull --include='provisioning/offline-repo/built/pool/*'` kullanılır. + +Durum makinesi, "kuruldu" ile "merkezce güvenildi" arasındaki farkı görünür yapar: offline kurulum yalnız `PROVISIONED_OFFLINE` üretir. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Sürümlü offline APT bundle + repoda taşınan paketler | Tekrarlanabilir, indirme yok, medya lojistiği yok | Git deposu ~888 MB büyür (LFS) | **Seçildi** | +| Ayrı fiziksel seed USB medyası | Depo küçük kalır | Medya zimmeti/sürüm takibi, kaybolma riski | Yedek/geri dönüş yolu | +| Rastgele `.deb` dosyaları | İlk anda kolay | Bağımlılık/sürüm belirsiz | Elendi | +| İnternet bekleme | Basit | Saha blokajı | Elendi | +| Yerel depoyu operatörün `--offline` bayrağıyla göstermesi | Basit | Bayrak unutulunca kurulum durur, saha hatası üretir | Elendi (bayrak geriye uyumluluk için korundu) | + +## 6. Avantajlar + +- Bağlantısız sahada standarda yakın kurulum; **kuran kişi hiçbir indirme yapmaz** ve bayrak ezberlemez. +- Paket manifesti ve kilit dosyası ile hangi sürümün yüklendiği kanıtlanır. +- Nesil farkı yoktur: repo sorumlusu paketleri bir kez commit eder, 700 cihaz aynı setten kurulur. +- Kurulum akışı grafik arayüzde tek düğmedir; terminal bilgisi gerekmez. + +## 7. Dezavantajlar + +- Git deposu paket setiyle birlikte büyür (LFS; içerik-hash ile tekilleşir, ~884 MB). Klon hafiftir ama paket yükü ayrıca taşınmalıdır: 700 cihazın her biri LFS'ten çekerse bant kotası tükenir, bu yüzden yük yerel aynadan dağıtılır. +- Offline cihaz merkezi izleme ve erişim kanalları doğrulanana kadar operasyonel olarak hazır değildir. +- Paket snapshot'ı yenilenmediği sürece güvenlik güncellemeleri geride kalır (onaysız update zaten yasak, K-11). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Eski güvenlik paketi | Orta | Orta | Süre sonu olan release medyası/repo sürümü, hızlı enrollment kuyruğu | +| Secret repoda kalır | Düşük | Yüksek | Secret taraması (test), token yalnız bir kez ve cihazda girilir | +| Yarım paket işlemi | Orta | Orta | `dpkg --configure -a`, idempotent kurucu | +| Kurucu yanlış/eski depoyu bulur | Düşük | Orta | Arama sırası sabittir; aday eksiksiz değilse kullanılmaz, `BF_OFFLINE_REPO` ile açıkça yönlendirilebilir | +| Paketler var ama indeks (`built/`) yok | Orta | Yüksek | Kurucu fail-closed durur ("yerel paket deposu yok"); repo sorumlusu `build-index.sh` koşup `built/` dizinini commit eder | +| Grafik arayüz açılamıyor | Orta | Düşük | `python3-tk` offline depoda pinli; ekransız ortamda `sudo bf --tui` | + +## 9. Uygulama Planı + +1. Medya/repo manifesti: Field OS release, ISO checksum, offline APT snapshot kimliği, kurucu commit'i. +2. Paket setini **repo sorumlusu** hazırlar: `.deb` dosyalarını `add-packages.sh` ile `provisioning/offline-repo/packages/` altına koyar (Git LFS), pinleri `manifests/*.txt` içinde `package=version` olarak doldurur, `build-index.sh` ile `provisioning/offline-repo/built/` indeksini (`Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS`, `pool/`) üretir. Kuran kişi yalnız git tarafını çeker. +3. Kurulumda yalnız genel paketler kullanılır; kurucu yerel depoyu **otomatik bulur** ve `--offline` gerekmez. +4. Kurucu yerel durum dosyasına `PROVISIONED_OFFLINE` yazar; `READY` yazması yasaktır. +5. İnternet geldiğinde 29'daki tek-kullanımlık token ile enrollment başlatılır; sonra merkezi kanallar test edilir. + +### Kuran kişinin akışı (grafik arayüz — ana yol) + +1. Depoyu getir: `git clone ` — **paketler bilerek gelmez.** Bootstrap (ve her git işlemi) `GIT_LFS_SKIP_SMUDGE=1` ile çalışır, çünkü paket yükü ~884 MB'tır ve tam klon sahada 2.7 GB'lık bir çalışma kopyası üretir (ölçüldü; smudge kapalıyken 20 MB). Paket yükünü almanın iki yolu var: + - **Yerel ayna (önerilen, sahada internet yok):** repo sorumlusunun hazırladığı `/opt/blueforce/offline-repo` kopyasını taşıyın; ya da + - **Hedefli LFS çekme (yalnız internet varken):** depo kökünde + + ``` + git lfs pull --include='provisioning/offline-repo/built/pool/*' + ``` + + Bu yalnız teslim havuzunu indirir (`packages/` altındaki kaynak kopyayı çekmez, aynı baytları ikinci kez indirmez). + Paketler gelmediyse kurucu bunu **tek cümleyle** söyler (`Paketler henüz indirilmemiş: … Git LFS işaretçisi`), çünkü havuzdaki dosyalar `.deb` değil 131 baytlık işaretçi metnidir. +2. `sudo bf` — pencere açılır: **Blueforce Field OS — Yönetim**. +3. Üst çubuk **Hedef > Bayi no (8 hane)** alanına numarayı yaz (örn. `12010193`). +4. **Kurulum** sekmesi → **`Bu cihazı kur`** (hiçbir şey yazmayan ön kontrol için: `Kurulum ön kontrolü (--check)`). +5. Komut ekranda gösterilir, onay istenir; onaylandıktan sonra kurulum çalışır. `--offline` işaretlemek **zorunlu değildir** (varsayılan kaynak zaten yerel depodur). +6. Sonuç: `PROVISIONED_OFFLINE`. Arayüzdeki **Kurulum modül durumu** ve `bf-status` ile doğrulanır. + +```bash +# Ana yol (grafik arayüz) +sudo bf +# → Hedef: Bayi no (8 hane) → Kurulum sekmesi → "Bu cihazı kur" + +# Yedek yol (grafik ekran yoksa veya python3-tk yoksa): aynı uygulamanın terminal arayüzü +sudo bf --tui + +# Doğrudan kurucu ile (otomasyon / teşhis) +sudo ./scripts/install/blueforce-install.sh --dealer-id 12010193 + +# Bilinçli olarak başka bir depo dizinini göstermek (nadir, repo sorumlusu isterse) +BF_OFFLINE_REPO=/mnt/blueforce-repo/built \ + sudo ./scripts/install/blueforce-install.sh --dealer-id 12010193 +``` + +### Depo keşfi ve iki hata durumu + +Sıra (ilk eksiksiz aday kazanır): `BF_OFFLINE_REPO` → `/provisioning/offline-repo/built` → `/opt/blueforce/offline-repo`. Bir aday "eksiksiz" sayılmak için `Packages`, `Packages.gz`, `packages.lock.tsv` ve `SHA256SUMS` dosyalarının hepsini içermelidir; yalnız `packages/` (ham `.deb` havuzu) yeterli **değildir** — indeksin `build-index.sh` ile üretilmiş olması gerekir. + +Depo bulunduğunda ekranda şu duyuru çıkar: + +```text +Yerel paket deposu bulundu: paket, + Depo : + Kaynak : + Kip : yerel kurulum. İnternet, paket indirme ve ek anahtar gerekmez. +``` + +Depo hiçbir yerde yoksa kurulum başlamadan durur: + +```text +HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md + +Aranan yerler: + - depodaki hazır paket seti — yok: /provisioning/offline-repo/built + - cihazdaki kurulu paket deposu — yok: /opt/blueforce/offline-repo + +Ne yapmalı: + 1) Paket setini git ile tam olarak getirin ... ya da /opt/blueforce/offline-repo altına koyun. + 2) Kurulumu yeniden çalıştırın. + +Kuruluma hiç başlanmadı; sistemde hiçbir değişiklik yapılmadı. +ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı. +``` + +Depo bulundu ama doğrulanamadıysa (bozuk/eksik içerik) kurulum yine başlamaz: + +```text +OFFLINE BLOCKED: + Depo : + Ne yapmalı : paket setini yeniden üretip git ile getirin (provisioning/offline-repo/README.md) + ÇIKIŞ NEDENİ: yerel paket deposu doğrulanamadı; kurulum başlamadı ve + sistemde hiçbir değişiklik yapılmadı. +``` + +`--online` yalnız geliştirme/test makinesi içindir; paketleri internetten çeker ve üretim cihazlarında kullanılmaz. + +### `python3-tk` neden offline depoda pinli? + +Grafik operatör uygulaması Tkinter ile yazılmıştır ve tkinter Ubuntu'da **ayrı bir pakettir** (`python3-tk`); minimal Ubuntu Server kurulumunda Python vardır ama tkinter yoktur. İnternetsiz sahada `apt install python3-tk` **çalışmaz**, bu yüzden paket ve bağımlılık kümesi (`python3-tk`, `python3.14-tk`, `libtk8.6`) `provisioning/offline-repo/manifests/base-packages.txt` içinde pinlidir ve depodan gelir. Kurulum sonu kapısı `scripts/install/installer/modules/18-final-check.sh` tkinter'ı denetler; eksikse **WARN** yazar ve kurulumu düşürmez (cihaz yine kurulur, operatör terminal konsoluna `sudo bf --tui` ile devam eder). + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| İnternetsiz kurulum | Paketler manifestten kurulur, dış indirme yok | LAB(2) air-gapped | +| Depo yolu verilmeden kurulum | Kurucu depoyu otomatik bulur (`repo/built`), duyuru satırını yazar | LAB(2) | +| Grafik arayüzden kurulum | `sudo bf` → Kurulum → "Bu cihazı kur" ile `PROVISIONED_OFFLINE` | LAB(2) masaüstü oturumu | +| `BF_OFFLINE_REPO` ile başka dizin | Verilen dizin kullanılır; geçersizse durur | LAB(2) | +| Depo hiç yok | Türkçe hata + aranan yollar + `ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı.`, exit 1, sistem değişmez | LAB(2) | +| Depo var ama bozuk (checksum/pin) | `OFFLINE BLOCKED: ` + Türkçe çıkış nedeni, exit 1, sistem değişmez | LAB(2) | +| Yalnız `packages/` var, `built/` yok | Depo "yok" sayılır, kurulum başlamaz (fail-closed) | LAB(2) | +| `python3-tk` eksik imaj | `sudo bf` Türkçe hata + ipucu, exit 3; `18-final-check` WARN yazar, kurulum düşmez | LAB(2) | +| DNS/WAN kesik | Kurucu dış indirme istemez; `01-precheck` ağı yalnız bilgi olarak yazar, `05-network` DNS zorunlu tutmaz | LAB(2) | +| `--online` üretimde denenmez | Yalnız geliştirme/test; kurucu uyarı yazar | LAB(2) | +| `bf-status` | `PROVISIONED_OFFLINE`; READY değil | LAB(2) | +| Bağlantı sonrası enrollment | ENROLLED → READY kapıları çalışır | LAB(2) | + +## 11. Rollback + +1. Paket işlemi bozuksa aynı onaylı snapshot ile `dpkg --configure -a` ve kurucu yeniden çalıştırılır. +2. Yanlış repo sürümü geri çekilir; önceki onaylı manifestle yeniden kurulur. +3. Yerel depo bozuksa sahada onarılmaz: repo sorumlusu depoyu yeniden üretip commit eder (`add-packages.sh` + `build-index.sh`), kurulum yapan kişi güncel git tarafını çekip komutu tekrarlar. +4. Kimlik/token hatasında cihaz resetlenmez; 29'daki token iptal/yenileme prosedürü uygulanır. +5. Arayüz sorunuysa (ekran/tkinter) rollback gerekmez: `sudo bf --tui` ile aynı akış yürütülür. + +## 12. Kontrol Listesi + +- [ ] Paket kaynağı repoda: `provisioning/offline-repo/packages/` (1321 `.deb`, Git LFS ile takip ediliyor; teslim kopyası `built/pool/` içindedir). +- [ ] Bundle indeksi repoda: `provisioning/offline-repo/built/` (`Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS`, `pool/`). +- [ ] Paket yükü sahaya taşındı: yerel ayna (USB ya da `/opt/blueforce/offline-repo`) — klon LFS yükünü **bilerek** getirmez, bu adım atlanırsa kurucu `Paketler henüz indirilmemiş: … Git LFS işaretçisi` ile durur. +- [ ] `repo-manifest.yaml` güncel; pin listesi ile paket havuzu uyuşuyor. +- [ ] Depoda/repoda cihaz kimliği, private key veya kalıcı token yok. +- [ ] `python3-tk` ve bağımlılıkları `manifests/base-packages.txt` içinde pinli; `18-final-check` tkinter'ı denetliyor. +- [ ] Kuran kişinin komutu `--offline` bayrağı istemiyor; depo otomatik bulunuyor. +- [ ] Grafik arayüz akışı (bayi no → Kurulum → "Bu cihazı kur") yazılı ve ekransız ortam için `sudo bf --tui` belgeli. +- [ ] İnternet kapalıyken kurulum tamamlanıyor; dış indirme çağrısı yok. +- [ ] `PROVISIONED_OFFLINE` görünür ve READY kapısı kapalı. +- [ ] Sonradan enrollment sahibi/kuyruğu kayıtlı. + +## 13. Açık Sorular + +- [ ] Offline paket seti yenileme sıklığı ve Git LFS bant genişliği/kotaysa sahaya taşıma yöntemi — sahibi: release yöneticisi. +- [ ] Paketlerin sahaya taşınmasında git clone mu, hazır `/opt/blueforce/offline-repo` kopyası mı birincil — sahibi: saha operasyonu + 05 yazarı. +- [ ] `--online` geliştirme yolunun hangi ortamlarda serbest olduğu — sahibi: yönetim + 26/33 yazarları. + +--- + +## Ek: Keşif ve durum akışı + +```mermaid +flowchart LR + M["git clone (hafif: LFS smudge kapalı)
    + paket yükü yerel aynadan"] --> G["sudo bf → Kurulum → 'Bu cihazı kur'"] + G --> D{"Kurucu yerel depoyu arar
    BF_OFFLINE_REPO → repo/built → /opt/blueforce/offline-repo"} + D -->|"hiçbiri yok / eksik"| X["HATA: Yerel paket deposu yok
    aranan yollar + ÇIKIŞ NEDENİ · exit 1
    sistem değişmez"] + D -->|"eksiksiz aday bulundu"| V{"Doğrulama katmanı:
    dosya listesi, SHA256SUMS, kilit, pin ↔ pool"} + V -->|"başarısız"| B["OFFLINE BLOCKED: sebep
    ÇIKIŞ NEDENİ: doğrulanamadı · exit 1"] + V -->|"geçti"| P["PROVISIONED_OFFLINE"] + P --> T["Tek kullanımlık token"] + T --> E["ENROLLED"] + E --> C["WG + erişim + izleme doğrulama"] + C --> R["READY"] +``` +
    + + +# 33 — Operatör Arayüzü Rehberi (`bf`) + +> Kısa özet: Bu rehber, Linux/DevOps'a yeni başlayan bir operatörün Blueforce cihazını **git deposundan** kurmasını ve tek giriş noktası olan `sudo bf` **grafik operatör uygulaması** ile cihazı işletmesini adım adım anlatır. Kurulum, filo işlemleri, merkez hazırlığı, araçlar ve cihaz bilgisi işlerinin tamamı bu pencereden açılır; komut ezberlemek gerekmez. + +- Dosya: `docs/33-OPERATOR-CONSOLE.md` +- İlgili kararlar: `24-DECISION-LOG.md#K-09` (golden image + kurucu), `#K-12` (kimlik formatı `^[0-9]{8}$`), `#K-13` (SSH anahtar zorunlu), `#K-11` (onaysız update yasağı), `#K-21` (durum modeli), `#K-22` (RDP her zaman hazır / `bf-gui-*` yalnız yerel GUI) +- Uygulama: Python paketi `bfos` (depo kökü) — `bfos/ui_gui.py` (grafik arayüz, tkinter), `bfos/ui_theme.py` (tasarım belirteçleri: `web/static/tokens.css`'in aynası), `bfos/tui.py` + `bfos/cli.py` (terminal konsolu), `bfos/operations.py` (iş mantığı + işlem kataloğu), `bfos/runner.py` (çalıştırma + denetim kaydı), `bfos/config.py` (Türkçe metinler) +- Giriş noktası: `admin/bf` (sarmalayıcı) → `sudo bf` ve `sudo bf --tui`. Kurucu: `admin/bf-bootstrap.sh` +- Yedek yol: `admin/bf-menu` + `admin/lib/*` (eski bash konsolu) — ana yol değildir; yalnız Python'suz cihazlar ve olağanüstü durumlar için korunur +- Durum: [ ] Taslak — pencere yerleşimi ve örnek satırlar LAB'da alınan gerçek koşuyla güncellenir + +> **Dürüstlük notu (bu reponun kuralı):** Aşağıdaki pencere ve çıktı örnekleri, tasarımı anlatmak için yazılmıştır. Gösterilen metinler uygulamanın kaynağından (`bfos/ui_gui.py`, `bfos/config.py`, `bfos/runner.py`) alınmış **gerçek satır biçimleridir**; ancak pencere yerleşimi tema, ekran çözünürlüğü ve envanter içeriğine göre birebir farklı görünür. Kurulum betiğinin kendi çıktısı (`[installer] ...` satırları) LAB koşusunda bu dosyaya işlenir (§10, §13). + +--- + +## 1. Amaç + +**Bu araç nedir?** `bf`, cihaza `sudo bf` yazınca açılan **grafik operatör uygulamasıdır**. Varsayılan olarak **basit mod** gelir: ekranda üç büyük düğme vardır — `Kur`, `Durum`, `Çıkış`. Üst çubuktaki `Detaylı mod` düğmesiyle **5 kategori sekmesi** açılır: Kurulum, Cihaz işlemleri, Merkez hazırlığı, Araçlar, Cihaz bilgisi. Listeden bir işlem seçip `Komutu göster ve çalıştır` düğmesine basarsın; uygulama senin adına doğru komutu üretir, çalıştırmadan **önce gösterip onay ister** ve ne yaptığını Türkçe satırlarla akıtır. + +**Neyi kolaylaştırır?** Normalde cihazı kurmak, durumunu okumak, teşhis paketi almak veya bir filo işlemi başlatmak için onlarca komutu ve doğru sırasını bilmek gerekir. `bf` bunları sekmeler ve arama yapılabilir listeler altında toplar, her komutu **çalıştırmadan önce** gösterir, tehlikeli işlemlerde ikinci kez sorar, `production` dalgası ve sürüm kapısı için ayrı onay ister ve her işlemi bir denetim kaydına (`/var/log/blueforce-console.log`, mod `600`) yazar. Kısacası: ezberleyeceğin tek şey `sudo bf` komutudur. + +## 2. Kapsam + +- Kapsam içi: Ubuntu'da ilk kurulum (git'ten indir + bootstrap), basit mod ve 5 kategori sekmesi, üst çubuktan hedef seçimi (bayi no / dalga / tüm filo), uçtan uca örnek seans, yetki modeli (`sudo bf` = tam yetki), şifre dosyası (`bf-creds`) davranışı, grafik arayüz açılamadığında ne olacağı, en sık hatalar ve güvenlik kuralları. +- Kapsam dışı: ISO/firstboot/offline provisioning yolu (26, 27 — artık **ikincil/opsiyonel**), merkez sunucularının kurulumu (07, 09 — arayüz yalnız **hazırlar ve denetler**, kurmaz), update onay zincirinin merkez tarafı (10, 21), rol bazlı eğitim müfredatı (31). + +## 3. Kararlar + +```text +KARAR: Cihaz ve filo işlemlerinin tek operatör giriş noktası `sudo bf` grafik uygulamasıdır + (`bfos/ui_gui.py`, tkinter). Operatör komut ezberlemez; basit modda üç düğmeden, + detaylı modda kategori sekmesinden seçer. +GEREKÇE: Operatör profili Linux/DevOps'a yeni başlayan kişidir; serbest komut yazımı 700 cihazda + yazım hatasını filo arızasına çevirir (K-11 blast-radius). Arayüz her komutu + çalıştırmadan önce gösterir ve onay ister; dalga kapılı playbook'lara bayrak sessizce + geçirilmez, operatör kapıyı ayrıca onaylar. +ALTERNATİF: Numara yazılan terminal menüsü (`sudo bf --tui`, aynı iş mantığı) — grafik ekran + yoksa (SSH/başsız oturum) yedek yol olarak korunur. Eski bash konsolu (`admin/bf-menu`) + — Python'suz cihaz için son çare olarak durur, ana yol değildir. + Yalnız merkez Semaphore UI — saha cihazında çevrimdışıyken erişilemez; merkez tarafı + için korunur (09). +RİSK: Arayüzün katalog tablosu, altındaki playbook'tan ayrışır ve yanlış kapıyla çalıştırır; + azaltma: komut üretimi playbook kapsamını (simple/wave/release) playbook dosyasının + kendisinden okuyup karşılaştırır, uyuşmazlıkta **çalıştırmayı reddeder** + (`bfos/operations.py` + `bfos/ui_gui.py` → kapsam karşılaştırması; yıkıcı işlemler için + ayrıca katalog playbook'la senkron doğrulanır). +MALİYET: Ücretsiz. +LİSANS: Yok (kurum içi operatör aracı). +``` + +```text +KARAR: Kurulum git deposundan yapılır: depo klonlanır ve `sudo admin/bf-bootstrap.sh` + (veya `curl -fsSL /admin/bf-bootstrap.sh | sudo bash`) çalıştırılır. Kurulum + paketleri DEPONUN İÇİNDEDİR (`provisioning/offline-repo/packages/`, 1321 .deb, Git LFS): + kurulan cihaz HİÇBİR ŞEY İNDİRMEZ, kurulum için internet gerekmez. ISO/firstboot yolu + (26, 27) silinmez, ikincil/opsiyonel yol olarak korunur. +GEREKÇE: Dağıtım imajı/ISO üretimi bu fazda yapılmayacaktır; en hızlı doğrulanabilir yol, sürümü + Git geçmişiyle izlenebilen tek bir bootstrap scriptidir. Bootstrap repoyu + `/opt/blueforce-linux` (veya bulunduğu checkout) altına alır, ön koşulları kurar, + `bf-*` araçlarını ve grafik arayüz girişini (`/usr/local/bin/bf`) `/usr/local/bin`'e + bağlar; cihaz kimliği (bayi no) hiçbir zaman bir imaja gömülmez (K-09/K-12). + İnternet yalnız `git clone` adımında gerekir; saha cihazı kurulduktan sonra çevrimdışı + çalışır. +ALTERNATİF: Tek USB Field OS ISO (K-20) — üretim/doğrulama maliyeti yüksek olduğu için bu fazda + birincil yol değil; yedek olarak korunur. USB'ye elle kopyalama — sürüm izi ve + güncellenebilirlik yok; elendi. +RİSK: `curl | bash` deseni kötüye kullanıma açıktır; azaltma: script yalnız resmi depo + adresinden çalıştırılır, `git clone` ile içeriği önce incelenebilir, secret yazmaz, + `git reset`/`stash` yapmaz ve yerel değişiklikleri asla silmez. +MALİYET: Ücretsiz. +LİSANS: Yok (kurum içi script). +``` + +```text +KARAR: Grafik arayüz varsayılandır; açılamıyorsa uygulama SUSMAZ: Türkçe hata verir ve + `sudo bf --tui` yolunu önerir. Grafik arayüz için gereken `python3-tk` paketi çevrimdışı + depoda pinlidir (`provisioning/offline-repo/manifests/base-packages.txt`) ve kurulum + sonu kapısı `scripts/install/installer/modules/18-final-check.sh` tkinter'ı ayrıca + denetler; eksikse kurulum durdurulmaz, WARN yazıp terminal konsolunu işaret eder. +GEREKÇE: Minimal imajlarda `python3` vardır ama pencere araç takımı yoktur; operatör ne arayüz + ne de başka bir yol bulamazsa elinde hiçbir giriş noktası kalmaz ve cihazda internet + olmadığı için bu durumu düzeltemez. Paketin depoda pinli olması bu riski kurulum + anında kapatır; kapı ayrıca görünür bir uyarı bırakır. +ALTERNATİF: tkinter'ı kurulum dışı bırakmak — sahada tek giriş noktası terminale düşerdi; elendi. + tkinter yokluğunda kurulumu durdurmak — çalışan bir terminal konsolu varken cihazı + kurulmamış bırakırdı; elendi (uyarı verilir, kurulum sürer). +RİSK: Çevrimdışı depo güncellenmezse pin eskir; azaltma: paket seti Git LFS ile sürümlenir ve + depo bütünlüğü kurulum öncesi doğrulanır (offline depo denetimi). +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +```text +KARAR: Şifre/kimlik bilgisi üretimi OPSİYONELDİR ve VARSAYILAN OLARAK KAPALIDIR; yalnız + `bf-creds --generate` açıkça istendiğinde üretilir ve parola hiçbir zaman + ekrana/loga/komut satırına yazılmaz. +GEREKÇE: SSH zaten anahtar zorunludur (parola girişi kapalı, `blueforce` hesabı kilitli — K-13); + kullanılmayan bir parola üretmek sızma yüzeyini büyütür. Varsayılan kapalı olması + secret'ın git'e/medyaya/support bundle'a kaçmasını da baştan engeller. +ALTERNATİF: Kurulumda otomatik parola üretimi — hiçbir kanal bu parolayı kullanmadığı için + gereksiz secret üretir; elendi. Parolayı repoya/ISO'ya gömmek — secret yasağına aykırı; + yasak. +RİSK: Kayıt dosyası yanlış yere kopyalanıp paylaşılır; azaltma: dosya `/root` altında mod + `600`, `--fetch` hedefi `admin/secrets/` git-ignore'lu (dizin `700`), parola yalnız + dosyaya yazılır. +MALİYET: Ücretsiz. +LİSANS: Yok. +``` + +## 4. Neden Bu Karar? + +700 cihazlık bir filoda en pahalı hata, teknisyenin yanlış komutu yanlış cihazda çalıştırmasıdır. Grafik arayüz bu riski dört yerden küçültür: (1) operatör komut yazmaz, listeden doğru işlemi seçer; (2) her komut **çalıştırılmadan önce bir onay penceresinde** görünür ve onay ister — "ne çalışacak?" sorusu asla cevapsız kalmaz, komut çıktı alanına da ayrıca yazılır; (3) filo işlemleri hedefi üst çubuktan açıkça seçtirir (bayi no / dalga / tüm filo) ve dalga kapılarını (production için `production` yazma, sürüm kapısı için `GATE` yazma) operatöre ayrıca onaylatır; (4) yıkıcı işlemler ikinci bir onay penceresi ister ve yetki yoksa düğme yerine **çalıştırma katmanı** reddeder. Grafik arayüz aynı zamanda bir görünürlük kazancıdır: katalogda hangi işlemin kapsamı (`yerel — bu cihaz`, `filo — dalga kapılı`, `filo — sürüm kapılı`) ve türü (`salt-okunur` / `YIKICI`) olduğu listede renkli olarak durur. + +Git tabanlı kurulum "hangi sürüm sahada?" sorusunu `git log` ile yanıtlanabilir kılar; kurulum paketlerinin depoda Git LFS ile durması ise "saha cihazı kurulurken ne indiriyor?" sorusunu **hiçbir şey** olarak yanıtlar. Şifre üretiminin varsayılan kapalı olması aynı felsefenin devamıdır: anahtar zaten var, ikinci bir gizli bilgi üretmenin faydası yok. + +## 5. Alternatifler + +| Alternatif | Artı | Eksi | Sonuç | +|---|---|---|---| +| Grafik operatör uygulaması (`sudo bf`, tkinter) | En keşfedilebilir; komutu gösterip onay ister; hedef ve kapılar tek ekranda; denetim kaydı tutar; çevrimdışı çalışır | Grafik oturum gerekir; tkinter paketi (depoda pinli) | **Seçildi** | +| Terminal konsolu (`sudo bf --tui`, aynı `bfos` iş mantığı) | Grafik ekran gerektirmez; SSH/başsız oturumda çalışır | Numara yazmaya dayanır, daha az keşfedilebilir | Yedek (grafik açılamazsa önerilir) | +| Eski bash konsolu (`admin/bf-menu`) | Python'suz cihazda da çalışır | Ayrı bir katalog tablosu; iki giriş noktası zamanla ayrışır | Yedek (son çare) | +| Dokümandan komut kopyalama | Araç gerektirmez | Sıra atlama + yanlış hedef riski | Elendi | +| Yalnız Semaphore UI (web) | Güzel arayüz, merkezden yönetim | Saha cihazında çevrimdışı erişilemez; cihaz-kurulumunu kapsamaz | Merkez için korunur (09) | +| Tek düz komut scripti (`bf-do`) | Basit | Keşfedilebilirlik ve hedef seçimi yok, acemi için anlaşılmaz | Elendi | + +## 6. Avantajlar + +- Öğrenme maliyeti tek satır: `sudo bf`. Basit modda iki iş kararı yeter: `Kur`, `Durum`. +- Her komut çalıştırılmadan önce onay penceresinde gösterilir; komut çıktı alanına da yazılır. Tehlikeli işlemler iki kez onaylanır — yanlış komut/yanlış sıra riski ortadan kalkar. +- Katalogda 48 işlem vardır ve her birinin kapsamı ile türü listede görünür: **13 işlem yıkıcı (yazma)**, **35 işlem salt-okunur**. Yıkıcı satırlar listede kırmızı gösterilir (`YIKICI` / `salt-okunur` sütunu). +- Filo işlemleri yalnız mevcut playbook'larla ve açık bir hedefle çalışır; arayüz **yeni playbook üretmez** ve envanter dışı bir cihaza dokunmaz. +- Uzun süren işler arka planda koşar: çıktı canlı akar, pencere kilitlenmez, `Çalışanı iptal et` ile durdurulabilir. +- Çevrimdışı çalışır — ISO/firstboot yoluna bağımlı değildir; kurulum paketleri de depodadır, saha cihazı hiçbir şey indirmez. +- Grafik ekran yoksa uygulama Türkçe hata verip `sudo bf --tui` yolunu gösterir; operatör kör bırakılmaz. +- Denetim kaydı (`/var/log/blueforce-console.log`, mod `600`) komutu, hedefi ve çıkış kodunu kaydeder; **secret ve ham komut çıktısı kayda yazılmaz** (tek bir temizleyici, `password=`/`token=`/`secret=`/`private_key=`/PEM bloklarını `` yapar). + +## 7. Dezavantajlar + +- Katalog tablosu ile playbook'lar arasında kapsam (scope) uyuşmazlığı olursa komut üretilmez ve arayüz **çalıştırmayı reddeder**; bu, playbook güncellemesiyle katalog kaydının birlikte güncellenmesini zorunlu kılar. +- Grafik arayüz bir pencere sistemine ihtiyaç duyar: `DISPLAY`/`WAYLAND_DISPLAY` yoksa (başsız sunucu, X yönlendirmesiz SSH) açılmaz — o durumda terminal konsoluna düşülür. +- Cihaz işlemleri sekmesindeki filo işlemleri için makinede `ansible-playbook` gerekir; yoksa arayüz envanter notunda `UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz` satırını gösterir ve komut üretilemez. +- Çok özel/tek seferlik işler katalogda yoksa operatör kabuğa döner (kataloğa ekleme PR ile yapılır, `bfos/operations.py`). +- Grafik katalog, terminal konsolunun kapsamının tamamını taşır: 48 işlemin hepsi `Detaylı mod` sekmelerinden erişilebilir (ölçüldü; `Araçlar` sekmesinde 9 işlem, `Cihaz bilgisi` sekmesinde ortam/kimlik/ağ/kaynak/servis ekranları). `sudo bf --tui` kolaylık için vardır, eksik bir yetenek için değil. +- Her onay ayrı bir denetim satırı üretir; komutun ham çıktısı kayda kopyalanmaz (K-14). + +## 8. Riskler + +| Risk | Olasılık | Etki | Azaltma | +|---|---|---|---| +| Katalog bayatlar, yanlış kapıyla çalıştırır | Orta | Yüksek | Komut üretimi playbook kapsamını dosyadan okur, uyuşmazlıkta reddeder; statik testler katmanında katalog↔playbook doğrulaması her sürümde koşar | +| Operatör "tüm filo" hedefini yanlışlıkla seçer | Orta | Yüksek | Wave-scoped playbook'larda filo dalga dalga ilerler, her dalga **ayrı onaylanır**; production için `production` yazma zorunlu (09/10) | +| Yetkisiz oturumda yazma işlemi denenir | Orta | Orta | Açılışta başlıkta uyarı şeridi; yazma işlemleri kapalı ve çalıştırma katmanı da reddeder (`[ENGELLENDİ]`), §9.8 | +| Grafik arayüz açılamaz (başsız/X yok) | Orta | Orta | Türkçe hata + `sudo bf --tui` önerisi, çıkış kodu 3; terminal konsolu aynı iş mantığını kullanır | +| `python3-tk` imajda eksik kalır | Düşük | Orta | Paket çevrimdışı depoda pinli; kurulum sonu kapısı tkinter'ı denetler ve eksikse WARN + `--tui` yolu yazar | +| `curl \| bash` ile sahte script çalıştırma | Düşük | Yüksek | Yalnız resmi depo adresi; `git clone` + gözden geçirme önerilir | +| Şifre kaydı yanlışlıkla paylaşılır | Düşük | Yüksek | Varsayılan kapalı; `/root/blueforce-credentials.txt` mod `600`; `admin/secrets/` git-ignore'lu (§9.5) | +| İşlem yarıda kalkar (elektrik) | Orta | Orta | Kurulum idempotent; `Kurulum → Başarısız kuruluma devam et` (`--resume`) sunulur (§11) | +| Arayüz, envanter dışı cihaza dokunur | Düşük | Yüksek | Hedefler envanterden çözülür; cihaz/grup bulunamazsa komut üretilmez | + +## 9. Uygulama Planı + +Bu bölüm sıfırdan başlayan içindir. Her adımda **hangi komutu nereye yazacağın** ve **ekranda ne göreceğin** yazılıdır. + +### 9.1 Ubuntu'da ilk kurulum — adım adım + +**Ön koşullar (elinde olması gerekenler):** + +- Ubuntu Server tabanlı bir makine (desteklenen baseline `24.04` / `26.04`). +- `sudo` yetkisi olan bir kullanıcı. +- Kurulum başlangıcında **internet** (repoyu git'ten indirmek için). Kurulum paketleri deponun içinde geldiği için cihaza kurulan hiçbir şey indirilmez; cihaz kurulduktan sonra çalışması için internet gerekmez. + +**Adım 1 — Terminali aç.** Ekranda şöyle bir satır görürsün: + +```text +emirhan@makine:~$ +``` + +`$` işareti "senin yazacağın yer" demektir; **`$` işaretini sen yazmazsın.** Aşağıdaki komutları bu satıra yazıp Enter'a bas. + +**Adım 2 — Git kurulu mu?** + +```bash +git --version +``` + +Beklenen çıktı: `git version 2.x.y`. `command not found` yazarsa kur: + +```bash +sudo apt update && sudo apt install -y git +``` + +`[sudo] password for emirhan:` yazınca **klavyeden parolanı yaz** — ekranda hiçbir karakter görünmez, bu normaldir — sonra Enter. + +**Adım 3 — Depoyu indir (klonla).** + +```bash +git clone https://github.com/emirhanmamak-blueforce/Blueforce-Linux.git +cd Blueforce-Linux +``` + +Ekranda `Cloning into 'Blueforce-Linux'...` görürsün ve komut `$` satırına döner. Depo Git LFS kullandığı için kurulum paket setinin de indiğinden emin ol (`git lfs pull`); paket sayısı `provisioning/offline-repo/packages/` altında **1321** `.deb` olmalıdır. + +**Adım 4 — Bootstrap'ı çalıştır.** İki yol var, ikisi de aynı sonucu verir. + +*Yol A — depo içinden (önerilen; önce içeriği inceleyebilirsin):* + +```bash +sudo admin/bf-bootstrap.sh +``` + +*Yol B — tek satırla (depoyu klonlamadan; repoyu `/opt/blueforce-linux` altına klonlar):* + +```bash +curl -fsSL https://raw.githubusercontent.com/emirhanmamak-blueforce/Blueforce-Linux/main/admin/bf-bootstrap.sh | sudo bash +``` + +> `sudo admin/bf-bootstrap.sh --check` **hiçbir şeyi değiştirmeden** ne yapılacağını raporlar (root bile gerekmez). Önce bunu çalıştırmak iyi alışkanlıktır. + +Bootstrap `bf-*` araçlarını `/usr/local/bin`'e bağlar ve **grafik arayüz girişini** hazırlar; kendi özet çıktısında iki konsolu ayrı satırlarda bildirir: `console : /usr/local/bin/bf (Python, primary)` ve `fallback : /usr/local/bin/bf-menu (bash)`. Son satırlar: + +```text +bf-bootstrap: summary + repository : /opt/blueforce-linux + branch : main + revision : + tools : linked into /usr/local/bin + console : /usr/local/bin/bf (Python, primary) + fallback : /usr/local/bin/bf-menu (bash) + next : sudo bf + +Installation complete. To get started: sudo bf +Kurulum tamam. Başlamak için: sudo bf +``` + +| Bootstrap ne yapar | Ne yapmaz | +|---|---| +| Ön koşulları kurar (`git`, `curl`, `ansible-core`) | Cihaz kimliği (bayi no) atamaz | +| Repoyu klonlar veya mevcut checkout'u **fast-forward** eder | `git reset` / `git stash` yapmaz; yerel değişikliği **silmez** | +| `admin/bf-*`, `scripts/diagnostics/bf-*`, `scripts/maintenance/bf-*` araçlarını `/usr/local/bin`'e bağlar | Parola/secret üretmez veya indirmez | +| `admin/bf`'yi çalıştırılabilir yapıp `/usr/local/bin/bf` bağını kurar (`bf-menu` yedek olarak kalır) | Disk bölmez, servis silmez, onaysız paket güncellemez | + +**Adım 5 — Arayüzü aç ve doğrula.** + +```bash +sudo bf +``` + +Pencere açılıyorsa kurulum tamam. Bundan sonra her iş için aynı komut: + +```bash +sudo bf +``` + +> **Bundan sonra ezberleyeceğin tek şey bu komuttur.** Pencereden çıkmak için `Çıkış` düğmesi: **basit modda** üçüncü büyük düğme, **detaylı modda** eylem çubuğunun alt satırında. Tek çıkış kontrolü olduğu için ikisi aynı anda görünmez. + +**tkinter notu (grafik arayüz için gerekli).** Pencerenin açılabilmesi için `python3-tk` paketi gerekir. Bu paket **çevrimdışı depoda pinlidir** (`provisioning/offline-repo/manifests/base-packages.txt`), yani normal kurulumda senin bir şey yapmana gerek yoktur; kurulum sonu kapısı (`scripts/install/installer/modules/18-final-check.sh`) tkinter'ı denetler. Yine de eksikse uygulama şu Türkçe hatayı verir ve çıkış kodu `3` ile biter: + +```text +tkinter bulunamadı; masaüstü arayüzü başlatılamıyor (teknik ayrıntı: ...). + +Bu, minimal kurulumlarda sık görülür: tkinter ayrı bir sistem paketidir. +Ubuntu/Debian üzerinde kurmak için: + + sudo apt install -y python3-tk + sudo apt update && sudo apt install -y python3-tk + +tkinter kurmak istemiyorsanız terminal menüsünü kullanın: sudo bf --tui +``` + +İnternet yoksa paketi kuramazsın; **terminal konsolu çalışmaya devam eder**: `sudo bf --tui`. + +**Grafik ekran yoksa (SSH / başsız oturum).** `DISPLAY` ve `WAYLAND_DISPLAY` tanımlı değilse pencere açılmaz; uygulama şu Türkçe mesajı yazıp çıkış kodu `3` ile biter: + +```text +Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil). + +SSH veya başsız (headless) bir oturumda masaüstü penceresi açılamaz. +Bu durumda terminal menüsünü kullanın: + + sudo bf --tui + +Yerel ekranda çalıştırmak için oturum açık bir makinede deneyin: + python3 -m bfos.ui_gui +``` + +### 9.2 Arayüzü kullanma — sekme sekme + +`sudo bf` çalıştırınca **basit mod** açılır. Pencere **koyu bir başlık bandıyla** açılır; bandda solda `Blueforce Field OS — Yönetim` ve `Blueforce saha cihazı yönetimi (Kur / Durum / Bakım)`, ortada **hedef kimliği** (`HEDEF`: `— seçilmedi` / `cihaz BF-12010193 (bf-12010193)` / `dalga 'pilot_1'` / `tüm filo (envanterdeki her cihaz)`), sağda **cihaz durumu** rozeti (`KURULDU` / `KAYITLI` / `HAZIR` / `HATA` / `YOK`) ve **yetki** rozeti (`TAM YETKİ` ya da `SALT-OKUNUR`) durur. Yetki bir durumdur, gömülü bir cümle değildir: yetkisiz açılışta bandın hemen altında turuncu bir şerit aynı bilgiyi tam cümleyle yineler. Bandın altında `HEDEF` paneli (bayi no, dalga, tüm filo), gövde, komut çıktısı ve eylem çubuğu gelir; depo yolu ile kullanılan katalog kaynağı (örn. `bfos.operations + bfos.runner`) bandın içinde sessiz bir satırdır. + +**Basit mod (varsayılan):** ekranda `Ne yapmak istiyorsunuz?` sorusu ve üç büyük düğme — `Kur`, `Durum`, `Çıkış`. `Kur` bir seçim penceresi açar: `Ön kontrol (--check)`, `Kurulumu başlat`, `Vazgeç`. `Durum` salt-okunur özeti (`info-summary`) çalıştırır. Daha fazlası için üst çubuktaki **`Detaylı mod`** düğmesine bas. + +```text + Ne yapmak istiyorsunuz? + + [ Kur ] bu cihazı kurar (bayi no gerekir) + [ Durum ] salt-okunur özet + [ Çıkış ] pencereyi kapatır +``` + +**Detaylı mod:** 5 kategori **sekmesi** açılır. Sekmelerin üstünde bir **özet şerit** vardır: büyük rakam işlem sayısıdır (`48 işlem`), yanında `13 yıkıcı` ve `35 salt-okunur` sessiz satırlar olarak durur; yetkisiz oturumda şeridin sağında `yazma işlemleri kapalı` yazar. Her sekmede solda işlem listesi (sütunlar: `İşlem`, `Kapsam`, `Tür`, `Durum`) ve üstünde bir `Süz:` alanı, sağda `SEÇENEKLER VE AÇIKLAMA` paneli vardır; seçtiğin işlemin kapsamı, playbook yolu ve varsa zorunlu alanları orada görünür. `Tür` sütunu yıkıcı işlemlerde kırmızı `YIKICI`, diğerlerinde `salt-okunur` yazar; `Durum` sütunu işlemin çalıştırılabilir olduğunu (`açık`) ya da kapalı olduğunu (`kapalı — sudo bf`) söyler. Eylem çubuğu iki satırdır: üstte `Komutu göster ve çalıştır` (yıkıcı işlem seçiliyse kırmızı, yetkisizse kapalı ve nedeni yanında yazılı) ve sağında durum göstergesi (`HAZIR` / `ÇALIŞIYOR` / `TAMAM` / `HATA` — sözcük + renk); altta `Çıktıyı temizle`, `Çalışanı iptal et`, `Yalnız denetim (--check)`, `Çıktı panelini gizle` ve `Çıkış`. + +| Sekme | İşlem sayısı | Yazma (yıkıcı) | Salt-okunur | +|---|---|---|---| +| **Kurulum** | 6 | 3 (`Bu cihazı kur`, `Başarısız kuruluma devam et`, `Tek modül çalıştır`) | 3 (ön kontrol, modül durumu, kurulum günlüğü) | +| **Cihaz işlemleri** | 21 | 9 (servis yeniden başlatmalar, grafik oturumu aç/kapat, betik, reboot, paket güncellemesi) | 12 (11 filo raporu + log toplama) | +| **Merkez hazırlığı** | 4 | 0 | 4 | +| **Araçlar** | 9 | 1 (`Bu kopyayı güncelle`) | 8 | +| **Cihaz bilgisi** | 8 | 0 | 8 | +| **Toplam** | **48** | **13** | **35** | + +Sekme sekme hangi işler var: + +**1) Kurulum (bu cihaz)** — yalnız **senin oturduğun makineyi** kurar; hiçbir filo cihazına dokunmaz. Üst çubukta **bayi no (8 hane)** dolu olmalıdır; boşsa `Komutu göster ve çalıştır` bir uyarı penceresi açar. + +| # | İşlem (arayüzde görünen ad) | Tür | Ne yapar | +|---|---|---|---| +| 1 | Kurulum ön kontrolü (--check) | salt-okunur | Kurulum betiğini `--check` ile çalıştırır; hiçbir şey yazmaz (kayıt/durum/dizin oluşturmaz) | +| 2 | Bu cihazı kur | **YIKICI** | Tam kurulum; hedef cihaz kimliği `BF-`, ana makine adı `bf-` | +| 3 | Başarısız kuruluma devam et (--resume) | **YIKICI** | Yarıda kalan kurulumu idempotent biçimde sürdürür; zaten `OK` olan modüller atlanır | +| 4 | Tek modül çalıştır (--only) | **YIKICI** | Tek bir kurulum modülünü çalıştırır (`01-precheck` … `18-final-check`), modül adı seçenekten girilir | +| 5 | Kurulum modül durumu | salt-okunur | `/var/lib/blueforce/install-state` içeriğini gösterir: hangi modül hangi durumda | +| 6 | Kurulum günlüğü (son 40 satır) | salt-okunur | `/var/log/blueforce-install.log` sonunu gösterir | + +Kurulum seçenekleri: `Yerel çevrimdışı depodan kur (--offline)` ve `Zaten OK olan modülleri atla (--resume)` onay kutuları. Kurulum paketleri deponun içinde olduğu için **--offline pratikte varsayılan yoldur**; cihaz hiçbir şey indirmez. Geçersiz bayi no'da (7/9 hane, harf, boşluk) komut hiç üretilmez: üst çubukta kırmızı uyarı çıkar ve `Komutu göster ve çalıştır` bir hata penceresi açar. + +**2) Cihaz işlemleri (filo)** — yalnız repodaki **mevcut** playbook'ları, açık bir hedefle çalıştırır. Üst çubuktan bayi no, dalga ya da `Tüm filo (dikkat)` seçilir. + +*Salt-okunur raporlar (11 işlem, hiçbiri cihazı değiştirmez):* + +| # | İşlem | Ne yapar | +|---|---|---| +| 1 | Erişilebilirlik testi (ping) | SSH erişilebilirliği | +| 2 | Çalışma süresi | Açık kalma süresi ve sistem yükü | +| 3 | Disk kullanımı | Disk doluluğu; eşik üstünde uyarır (eşik opsiyonel girilir) | +| 4 | Docker durumu | Docker servisi ve konteynerler | +| 5 | Paket sürümleri | Sabitlenmiş paketlerin kurulu sürümleri | +| 6 | Bekleyen güvenlik güncellemeleri | **Yalnız rapor**; hiçbir paket kurmaz | +| 7 | Kurulum fazı raporu | Cihaz başına `state.json` fazı | +| 8 | Kayıt ve merkez kanıtı | ENROLLED/READY iddialarını merkezi kanıta karşı denetler | +| 9 | Field OS sürüm raporu | Sürüm; istenirse sapma (drift) denetimi | +| 10 | Uzak erişim kanalları | SSH/xRDP/RustDesk/WireGuard hazırlığı | +| 11 | Çevrimdışı hazırlık raporu | İnternetsiz kurulum için yerel ön koşullar | + +*Bakım işlemleri (10 işlem; 9'u yıkıcı, hepsi ikinci onay ister):* + +| İşlem | Kapsam | Not | +|---|---|---| +| xRDP servisini yeniden başlat | tek cihaz/grup | Servis yeniden başlatma | +| RustDesk servisini yeniden başlat | tek cihaz/grup | Servis yeniden başlatma | +| WireGuard servisini yeniden başlat | tek cihaz/grup | `wg-quick@wg0` | +| İzinli bir servisi yeniden başlat | tek cihaz/grup | Yalnız izinli servis adları (`blueforce-agent`, `docker`, `ssh`, `sshd`, `systemd-journald`, `cron`) | +| Grafik arayüzü kapat (headless) | dalga kapılı | Dalgayı `multi-user.target`'e alır | +| Grafik arayüzü aç (bakım) | dalga kapılı | Grafik oturumu yeniden başlatır | +| Log topla / destek paketi | dalga kapılı | Zaman damgalı journal + destek paketi (salt-okunur) | +| Onaylı betik çalıştır | dalga kapılı | Yalnız `/opt/blueforce/bin` ve `/usr/local/sbin` | +| Kontrollü yeniden başlatma | sürüm kapılı | Sıralı yeniden başlatma + sağlık kapısı; bekleme süresi girilir | +| Onaylı paket güncellemesi kur | sürüm kapılı | `paket=sürüm` pinleri + dalga ve sağlık kapıları | + +> **`GUI kapat` xRDP'i durdurmaz.** `xrdp`/`xrdp-sesman` her zaman enable+active kalır; `bf-gui-*` yalnız **yerel fiziksel** grafik katmanını kontrol eder (K-22). "GUI kapalı ≠ RDP kapalı." + +**3) Merkez hazırlığı** — merkez entegrasyonunu **denetler/hazırlar**; merkez sunucusunu **kurmaz**. Dört işlemin tamamı salt-okunurdur: + +| # | İşlem | Ne gösterir | +|---|---|---| +| 1 | Envanter hedefleri | Dalga/grup/cihaz sayıları | +| 2 | Doldurulmamış PLACEHOLDER denetimi | `ansible/inventory/group_vars/all.yml` içinde kalan PLACEHOLDER değerleri | +| 3 | Yapılandırılmış merkez uç noktaları | WireGuard hub, izleme ve depo anahtarları (**secret gösterilmez**) | +| 4 | Merkez hazırlık kontrol listesi | Kayıttan önce merkezde var olması gerekenler | + +> `--tui` menüsünde bu sekmenin karşılığında ayrıca "Merkez hazırlık durumu", "uç noktaları dene" (DNS+TCP) ve "dalga geçiş kapısı durumu" ekranları vardır. + +**4) Araçlar** — repo ve yerel yardımcılar. Yalnız `Bu kopyayı güncelle (git pull --ff-only)` yazma işlemidir; kalan 8'i salt-okunurdur: `İşlem kataloğunu göster (--list)`, `Yerel çevrimdışı kapısı (bf-check-local)`, `Kayıt kapısı (bf-check-enrollment)`, `Teslim kapısı (bf-check-ready)`, `Derin teşhis (bf-diagnostics)`, `Field OS sürüm kimliği (bf-release)`, `Destek paketi oluştur`, `Konsol denetim günlüğü (son 40 satır)`. + +**5) Cihaz bilgisi** — sekiz salt-okunur ekran: `Durum özeti (sağlık + kurulum durumu)`, `Kimlik (hostname, cihaz no)`, `Ağ (adres, rota, DNS, WireGuard)`, `Disk, bellek, yük`, `Kurulu pinlenmiş paketler`, `Servis durumu`, `Son journal hataları`, `Kurulum/kayıt durumu (state.json beyaz liste)`. + +> **Not (WireGuard):** Arayüz WireGuard private/preshared key'lerini **hiçbir zaman istemez, göstermez veya kaydetmez**; yalnız peer durumunu, port ve el sıkışma zamanlarını okur. + +### 9.3 Hedef seçimi: tek cihaz mı dalga mı + +Filo işlemlerinde hedef **üst çubuktan** seçilir; işlem seçildiğinde ekran hedefi ayrıca sormaz, çubuktaki değeri kullanır: + +```text + HEDEF [ Detaylı mod ] + Bayi no (8 hane) [ 12010193 ] Dalga [ pilot_1 ▾ ] [ ] Tüm filo (dikkat) + Bayi no geçerli: BF-12010193 +``` + +| Hedef türü | Çubukta ne yaparsın | Örnek | Boyut | Tipik kullanım | +|---|---|---|---|---| +| Tek cihaz | Bayi no alanına 8 hane yaz | `12010193` | 1 | Arıza teşhisi, tek cihaz bakımı | +| Dalga / grup | `Dalga` açılır listesinden bir dalga seç | `lab` | 2 | Yeni playbook denemesi (önce LAB kuralı) | +| Dalga / grup | `Dalga` listesi | `pilot_1` / `pilot_2` / `wave_1` / `wave_2` | 5 / 20 / 50 / 100 | Kademeli yayılım (K-11) | +| Tüm filo | `Tüm filo (dikkat)` kutusunu işaretle | — | kalan | Yalnız onaylı; dalga dalga ilerler | + +Bayi no alanına yazdıkça anında doğrulanır; geçerliyse durum satırı `Bayi no geçerli: BF-12010193` yazar, geçersizse kırmızı uyarı görünür (örn. `Geçersiz bayi numarası '1201019': tam 8 hane olmalıdır (verilen uzunluk: 7). Örnek: 12010193`). + +Kurallar (arayüzün kendi davranışı): + +- **Tek cihaz** normalde en güvenli seçenektir; cihaz envanterde yoksa komut **üretilmez** (`... onaylı bir dalga grubunda değil` veya `envanterde yok`). +- **Dalga / grup** listesi, envanterde gerçekten bulunan onaylı dalgalarla doldurulur; envanter okunamazsa varsayılan onaylı dalga sırası gösterilir. +- **Wave-scoped** bir playbook'ta tüm filo seçilirse araç, dalgaları **sırayla** (`lab → pilot_1 → pilot_2 → wave_1 → wave_2 → production`) işler ve **her dalga için ayrı ayrı** onay ister; bir dalga başarısız olursa sonraki dalgaya **geçmez** (katalogdaki filo işlemleri ilk hatada durur). +- **Release-gated** playbook'lar (reboot, paket güncellemesi) tek cihaz veya tüm filo kabul etmez; **tek onaylı dalga** ister. +- **production** dalgası ayrıca `production` yazdırılarak, sürüm kapısı ise `GATE` yazdırılarak onaylanır. Hiçbir kapı sessizce geçilmez: onay pencereleri sırayla `PRODUCTION onayı — canlı filo`, `Production ek onayı`, `Sürüm kapısı onayı (dalga: )`, `FİLO GENELİ onayı` (kutuya `all` yazılır) ve `İKİNCİ ONAY — yıkıcı işlem` başlıklarıyla açılır. + +### 9.4 Uçtan uca örnek seans + +Aşağıdaki iki kısa seans, kurulumdan günlük işletime tipik akışı gösterir. Metin biçimleri uygulamanın kendi metinleridir; kurulum betiğinin kendi `[installer]` satırları LAB koşusunda eklenir. + +**Seans A — Yeni cihazın kurulumu (bayi no girme)** + +```text +emirhan@makine:~$ sudo bf +``` + +Pencere açılır: `Blueforce Field OS — Yönetim` / `Blueforce saha cihazı yönetimi (Kur / Durum / Bakım)`. + +1) Üst çubuktaki `Bayi no (8 hane)` alanına `12010193` yaz: + +```text + HEDEF + Bayi no (8 hane) [ 12010193 ] Dalga [ lab ▾ ] [ ] Tüm filo (dikkat) + Bayi no geçerli: BF-12010193 +``` + +2) Basit modda `Kur` düğmesine bas. Seçim penceresi açılır (başlık: `Kurulum`): + +```text + Bu cihazda ne yapılacak? + + Ön kontrol (--check) hiçbir şey yazmaz; kurulum cihazı değiştirir. + + [ Ön kontrol (--check) ] [ Kurulumu başlat ] [ Vazgeç ] +``` + +3) Önce `Ön kontrol (--check)` ile kuru koşu yapmak iyi alışkanlıktır: komut çıktı alanında görünür ve çalışır — hiçbir şey yazmaz. + +```text +======================================================================== + Çalıştırılıyor: Kurulum ön kontrolü (--check) + bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --check +======================================================================== +... (kurulum betiğinin kendi --check satırları) ... +[OK] Komut başarıyla tamamlandı (çıkış kodu 0). +``` + +4) Şimdi gerçek kurulum: yeniden `Kur` → `Kurulumu başlat`. Komut, **çalışmadan önce** bir onay penceresinde gösterilir: + +```text + Çalıştırılacak komut(lar): + + bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --offline + + İşlem : Bu cihazı kur [install-local] + Kapsam : yerel — bu cihaz + Açıklama: Cihazı kurar, hostname'i bf- yapar. + Hedef : cihaz BF-12010193 (bf-12010193) + Yetki : root gerekir — konsolu sudo ile açın. + Not : Hedef cihaz kimliği: BF-12010193 (bf-12010193). + + UYARI: Bu YIKICI bir işlemdir; seçili hedefte değişiklik yapar. + + Bu komut çalıştırılsın mı? [Evet] [Hayır] +``` + +`Evet` dedikten sonra **ikinci onay** gelir (yıkıcı işlem), ardından komut çıktı alanına yazılır ve koşar: + +```text +======================================================================== + Çalıştırılıyor: Bu cihazı kur + bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --offline +======================================================================== +... (kurulum betiği yerel paket deposunu bulur, 18 modülü sırayla koşar) ... +[OK] Komut başarıyla tamamlandı (çıkış kodu 0). +``` + +Kurulum sonunda cihaz `PROVISIONED_OFFLINE` olur; **`READY` değildir** — merkeze kayıt (enrollment) ve merkezi kanal kanıtı gerekir (K-21). Bunu görmek için `Cihaz bilgisi` sekmesinden `Kurulum/kayıt durumu (state.json beyaz liste)` ya da `Durum özeti` açılır. + +**Seans B — Günlük kontrol (salt-okunur rapor) ve teşhis paketi** + +```text +Üst çubuk: Hedef: [ 12010193 ] Dalga [ pilot_1 ▾ ] +Detaylı mod → Cihaz işlemleri sekmesi → listeden "Erişilebilirlik testi (ping)" satırını seç +Alt çubuk: [ Komutu göster ve çalıştır ] +``` + +Onay penceresi: + +```text + Çalıştırılacak komut(lar): + + ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/bf-ping.yml --limit bf-12010193 + + İşlem : Erişilebilirlik testi (ping) [ping] + Kapsam : filo — tek cihaz/grup (salt-okunur) + Hedef : cihaz BF-12010193 (bf-12010193) + Not : (playbook çıktısı canlı akar) + + Bu komut çalıştırılsın mı? [Evet] [Hayır] +``` + +Çıktı alanında playbook çıktısı canlı akar; iş bitince: + +```text +[OK] Komut başarıyla tamamlandı (çıkış kodu 0). +``` + +Teşhis paketi için: `Araçlar` sekmesi → `Destek paketi oluştur`. Paket yolu çıktı alanında yazılır ve paket **parola, private key veya token içermez** (K-14). Denetim kaydını görmek için aynı sekmedeki `Konsol denetim günlüğü (son 40 satır)` açılır. + +### 9.5 Kimlik bilgileri / şifre dosyası (opsiyonel — varsayılan KAPALI) + +**Önce şunu bil:** SSH bu cihazda **anahtar zorunludur**; parola girişi kapalıdır ve `blueforce` bakım hesabı kilitlidir (K-13). Yani günlük yönetim için parolaya ihtiyaç yoktur. Bu yüzden şifre üretimi **varsayılan olarak kapalıdır** ve yalnız açıkça istenirse yapılır. + +| Konu | Davranış (`admin/bf-creds`) | +|---|---| +| Varsayılan | **Kapalı.** `sudo bf-creds` hiçbir parola üretmez; yalnız cihazda **zaten var olan** gizlileri raporlar. | +| Üretme | `sudo bf-creds --generate` — cihaz kaydını yazar (ayrıca `BF_GENERATE_CREDENTIALS=1`) | +| Kayıt dosyası | `/root/blueforce-credentials.txt` (mod `0600`) — cihaz kimliği (`BF-`), hostname, oluşturma zamanı, WireGuard **public** anahtarı + private anahtarın **yolu** (içeriği değil), varsa RustDesk ID ve yerel **yönetici parolası** | +| Çekme (merkeze/kasaya) | `sudo bf-creds --fetch` — `/admin/secrets/.txt` (dizin `0700`, dosya `0600`, **git-ignore'lu**) | +| Parola ekranda görünür mü? | **Hayır.** Parola yalnızca dosyaya yazılır; stdout/stderr'e, log'a veya komut satırına asla konmaz. | +| Git'e / ISO'ya / destek paketine girer mi? | **Hayır.** Secret hiçbir zaman depoya, medyaya veya support bundle'a konmaz. | +| SSH'ı değiştirir mi? | **Hayır.** `bf-creds` `sshd_config`'i düzenlemez, hesap açmaz/kilit açmaz, parola girişi yolunu açmaz. | + +**Neden varsayılan kapalı?** Kullanılmayan her secret fazladan bir sızma yüzeyidir. Anahtar tabanlı erişim varken ikinci bir parola üretmek, sadece "git'e kaçabilecek yeni bir dosya" yaratır. İstisna (ör. yerel konsolda geçici bir parola isteyen bir ekip) `--generate` ile karşılanır ve kayıt dosyasının varlığı kayda geçer. **Varsayılanı değiştirmek bir karar gerektirir; sessizce açılmaz.** + +### 9.6 Bir şey ters giderse — en sık 5 hata + +| # | Belirti (ekranda ne görürsün) | Neden | Çözüm | +|---|---|---|---| +| 1 | `bf: command not found` | Bootstrap çalışmamış veya araçlar bağlanmamış | Bootstrap'ı tekrar koş: `sudo admin/bf-bootstrap.sh`; sonra tam yoldan dene: `sudo /usr/local/bin/bf`. Python'suz cihazda yedek: `sudo bf-menu` | +| 2 | Başlık bandında turuncu `SALT-OKUNUR` rozeti ve bandın altında turuncu şerit: `Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf` | Arayüz `sudo` olmadan açıldı; yazma işlemleri kapalı (listede kalır, `Durum` sütunu `kapalı — sudo bf` yazar) | Pencereyi kapat ve `sudo bf` ile aç (§9.8) | +| 3 | Hata penceresi: `Geçersiz bayi numarası '1201019': tam 8 hane olmalıdır (verilen uzunluk: 7). Örnek: 12010193` | Bayi no 8 haneli ve yalnız rakam olmalı | Tam 8 hane, sadece rakam gir; baştaki sıfırı silme. Örnek: `12010193` | +| 4 | Envanter notunda `UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz (sudo apt install ansible).` | Makinede Ansible yok | `sudo apt install ansible` (reponun kurulumu `ansible-core`'u zaten kurar) ve araçları bağla: `sudo admin/bf-bootstrap.sh` | +| 5 | `Komut üretilemedi`: `Playbook bulunamadı: ansible/playbooks/...` veya `... konsol kapsamı 'X' beklerken playbook 'Y' beyan ediyor.` | Katalog ile repo checkout'u uyuşmuyor (eski checkout veya `--repo` yanlış) | `Araçlar` sekmesinden `Bu kopyayı güncelle (git pull --ff-only)` veya doğru repoyu ver: `sudo bf --repo /opt/blueforce-linux`; arayüzü yeniden başlat | + +Ek olarak sık görülen dört durum: + +- **Grafik ekran yok** (`Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil).`, çıkış kodu 3): Terminal konsolunu kullan: `sudo bf --tui`. Yerel ekranda oturum açık bir makinede `python3 -m bfos.ui_gui` çalışır. +- **tkinter yok** (`tkinter bulunamadı; masaüstü arayüzü başlatılamıyor ...`): `sudo apt install -y python3-tk` (paket çevrimdışı depoda pinlidir) ya da `sudo bf --tui`. +- **`Pencere açılamadı; grafik oturumuna erişilemiyor.`**: SSH oturumundasın ve X yönlendirmesi yok, ekran kilitli ya da başka bir kullanıcının X sunucusuna bağlanıyorsun; `sudo bf --tui` ile devam et. +- **`git clone` internet/DNS hatası** (`Could not resolve host`): İnternet/DNS'i kontrol et; **yalnız bu adımda** internet gerekir. Kurulum paketleri depodadır, saha cihazı hiçbir şey indirmez. + +### 9.7 Güvenlik kuralları + +1. **Secret git'e, ISO'ya veya destek paketine girmez.** Parola, private key ve token repoda/medyada bulunmaz; destek paketi çıktısı secret sızdırmaz (K-14). Denetim kaydı da tek bir temizleyiciden geçer: `password=`/`token=`/`secret=`/`api_key=`/`private_key=`/`psk=` değerleri ve PEM blokları `` olur. +2. **Onaysız update yoktur.** Güncelleme yalnız `Cihaz işlemleri` sekmesindeki `Onaylı paket güncellemesi kur` ile, `paket=sürüm` pinleri + dalga kapısı + sağlık kapısı altında yapılır (K-11). Serbest `apt upgrade`, `latest` imaj veya otomatik güncelleyici mimaride yoktur (`Bekleyen güvenlik güncellemeleri` **yalnız rapor**tur). +3. **Yıkıcı işlemler onaylıdır.** Her komut çalıştırılmadan önce onay penceresinde gösterilir, onay istenir ve çıktı alanına da yazılır; yıkıcı işlemler ayrıca ikinci kez sorulur; onaylar eklendikten sonra komut değiştiyse **kesin komut** yeniden gösterilip onaylatılır. `production` dalgası için `production`, sürüm kapısı için `GATE`, tüm filo için `all` yazılması zorunludur. Disk bölme/silme arayüzde otomatikleştirilmemiştir. +4. **Yetki kapısı çalıştırma katmanındadır.** Yetkisiz oturumda yazma işlemleri kapalıdır ve komut planı root gerektiriyorsa çalıştırma katmanı son savunma olarak reddeder (`[ENGELLENDİ]`); ayrıntı §9.8. +5. **SSH yalnız anahtarla.** Parola girişi kapalı, `blueforce` hesabı kilitli; paylaşılan private key yasaktır (K-13). +6. **Tek kullanımlık enrollment token kaydedilmez.** Token arayüz dışında bir kez girilir; denetim kaydı ham çıktıyı ve secret'ı yazmaz (K-17). +7. **Cihaz kimliği imajda taşınmaz.** Bayi no yalnız ilk kurulum seansında üst çubuktaki alana girilir (K-09/K-12). + +### 9.8 Yetki modeli + +Arayüz beklenen kullanımda **tam yetkili** çalışır: `sudo bf`. Kurulum betiği dosya sistemine yazar, servisleri yönetir ve güvenlik duvarı temel çizgisini uygular; bu yüzden yazma işlemleri root ister. Ama arayüz root olmadan da **açılır** — çünkü raporlar repoyu ve envanteri okur, root gerektirmez. + +| Durum | Ne olur | +|---|---| +| `sudo bf` (tam yetki) | Başlık bandında yeşil `TAM YETKİ` rozeti. 48 işlemin tamamı çalışır: kurulum, filo bakımı, paket güncellemesi, kontrollü reboot ve `--check` koşuları | +| Root değil (yetkisiz açılış) | Başlık bandında turuncu `SALT-OKUNUR` rozeti; bandın altında turuncu şerit: `Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf`. **35 salt-okunur işlem** çalışır (raporlar, envanter denetimi, bilgi ekranları, destek paketi); **13 yıkıcı işlem listede kalır ama kapalıdır** (`Tür` = `YIKICI`, `Durum` = `kapalı — sudo bf`) ve `Komutu göster ve çalıştır` düğmesi kapalı çizilip nedenini kendi yanında yazar | +| Yetkisizken yazma denenirse | Yazma işlemleri düğme düzeyinde kapalıdır; bir yol bulunup denenirse **çalıştırma katmanı** reddeder ve çıktı alanına `[ENGELLENDİ] Bu işlem yönetici yetkisi gerektirir (sudo bf).` yazılır, işlem çalışmaz (çıkış kodu 2) | +| `--check` kipi | Salt-okunur olduğu için yetki istemez: `Yalnız denetim (--check)` kutusu işaretliyse deneme koşusu yetkisiz oturumda da yapılabilir | + +Hangi işlemler yetki ister: katalogda **13 yıkıcı işlem** — `Bu cihazı kur`, `Başarısız kuruluma devam et`, `Tek modül çalıştır` (Kurulum); servis yeniden başlatmalar (`xRDP`, `RustDesk`, `WireGuard`, izinli servis), `Grafik arayüzü kapat/aç`, `Onaylı betik çalıştır`, `Kontrollü yeniden başlatma`, `Onaylı paket güncellemesi kur` (Cihaz işlemleri); `Bu kopyayı güncelle` (Araçlar). Yetki kuralı tek kaynaktan türetilir: bir işlem yıkıcı olarak işaretliyse root gerektirir; ayrıca belirtildiyse o değer geçerlidir. + +Planlama yetki istemez: komut önizlemesi, onay pencereleri ve `--check` üretimi root olmadan da çalışır, böylece operatör "bu benim yetkimle ne yapar?" sorusunu cevaplayabilir. Reddetme yalnız **gerçek çalıştırmaya** düşer. + +## 10. Test Planı + +| Test | Beklenen sonuç | Ortam | +|---|---|---| +| `sudo admin/bf-bootstrap.sh` iki kez koşulur | İkinci koşu hata üretmez (idempotent), araçlar yerinde, `/usr/local/bin/bf` bağlı | LAB(2) | +| `sudo bf --list` / `python3 -m bfos.ui_gui --list` | 48 işlem, 5 kategori, 13 YIKICI / 35 salt-okunur, pencere açılmadan listelenir | LAB(2) | +| `sudo bf` açılır, `Çıkış` ile kapanır | Pencere açılır, hiçbir değişiklik yapılmaz | LAB(2) | +| `python3 tests/test_bfos_gui_static.py` | Tema belirteçleri `web/static/tokens.css` ile birebir aynı; durum sözlüğü beş sözcük; yetkisiz oturumda yazma işlemleri listede ve nedeni yazılı; pencere açılmadan koşar | LAB(2) | +| `sudo bf --tui` ile aynı işlem listesi | Terminal konsolu iki giriş noktası ayrışmadan çalışır | LAB(2) | +| Grafik ekran olmadan (`env -u DISPLAY -u WAYLAND_DISPLAY sudo bf`) | Türkçe hata + `sudo bf --tui` önerisi, çıkış kodu `3` | LAB(2) | +| tkinter'siz ortamda başlatma | Türkçe hata + `python3-tk` ipucu + `--tui` önerisi, çıkış kodu `3`; kurulum sonu kapısı bunu WARN olarak kaydeder | LAB(2) | +| Kurulum → `Ön kontrol (--check)` | Değişiklik yok, rapor üretir | LAB(2) | +| Kurulum → `Bu cihazı kur`, bayi no `12010193`, `--offline` | `PROVISIONED_OFFLINE`; ana makine adı `bf-12010193`; ağ erişimi olmadan tamamlanır | LAB(2) | +| Geçersiz bayi no (7/9 hane, harf) | Kırmızı uyarı; `Komutu göster ve çalıştır` hata penceresi açar, komut üretilmez | LAB(2) | +| Cihaz işlemleri → `Kontrollü yeniden başlatma`, tek cihaz | İki onay istenir; cihaz yeniden başlar; denetim satırı yazılır | LAB(2) | +| Wave-scoped playbook, hedef `Tüm filo (dikkat)` | Dalga dalga; her dalga ayrı onaylanır; hata sonraki dalgayı durdurur | LAB(2) | +| production dalgası denemesi | `production` yazılmadan çalışmaz | LAB(2) | +| Araçlar → `Konsol denetim günlüğü` | Mod `600`; secret ve ham komut çıktısı yok | LAB(2) | +| Yetkisiz oturum: `bf --dry-run` ile yazma işlemi planla, sonra çalıştırmayı dene | Başlıkta uyarı şeridi; `[ENGELLENDİ]` satırı; hiçbir komut çalışmaz; çıkış kodu 2 | LAB(2) | +| `sudo bf-creds` (bayraksız) | Hiçbir parola üretilmez, açıkça söyler | LAB(2) | +| `sudo bf-creds --generate` | Kayıt dosyası `0600`; parola ekranda görünmez | LAB(2) | + +## 11. Rollback + +1. Kurulum yarıda kaldıysa: `Kurulum` sekmesi → `Başarısız kuruluma devam et (--resume)`; modüller idempotenttir ve zaten `OK` olanlar atlanır. +2. Yanlış bayi no girildiyse: doğru no ile tam yeniden koşu; kimlik modülü ana makine adını üzerine yazar (K-12). +3. Bootstrap yanlış kurulduysa: repoyu güncelleyip (`Araçlar` → `Bu kopyayı güncelle`, `git pull --ff-only`) yeniden koş; bootstrap **hiçbir şeyi silmez, `git reset`/`stash` yapmaz**, yerel çalışmanı korur. +4. Filo işlemi başarısız dalga bıraktıysa: `Onaylı paket güncellemesi kur` geri alma zinciri önceki onaylı release manifestine döner (10, 30). +5. Grafik arayüz bozulduysa/başlatılamıyorsa: iş emri durdurmaz — `sudo bf --tui` ile aynı iş mantığına devam edilir; Python'un kendisi de yoksa yedek bash konsolu `sudo bf-menu` kullanılır. +6. Çözülmeyen cihaz: 17-RECOVERY seviye merdiveni (L8 = temiz yeniden kurulum) uygulanır. + +## 12. Kontrol Listesi + +- [x] `bfos` paketi ve giriş dosyası `admin/bf` repoda mevcut; `sudo bf` grafik arayüzü açar, `sudo bf --tui` terminal konsolu. +- [x] `admin/bf-bootstrap.sh` `/usr/local/bin/bf` bağını kurar; bash konsolu (`admin/bf-menu`) yedek olarak korunur, ana yol değildir. +- [x] Kurulum git tabanlı (clone + bootstrap); kurulum paketleri depoda (1321 `.deb`, Git LFS) — kuran kişi hiçbir şey indirmez. +- [x] `python3-tk` çevrimdışı depoda pinli; kurulum sonu kapısı tkinter'ı denetler ve eksikse WARN + `--tui` yolu bildirir. +- [x] Her komut çalıştırılmadan önce gösterilip onaylanıyor; yıkıcı işlemler iki kez soruyor; onay sonrası komut değişirse kesin komut yeniden onaylatılıyor. +- [x] Bayi no kapısı `^[0-9]{8}$`; geçersiz girişte komut üretilmiyor. +- [x] Filo işlemleri açık hedefle; wave-scoped filo akışı dalga dalga ilerliyor; production için `production` yazma zorunlu. +- [x] Katalog, playbook kapsamıyla uyuşmazsa çalıştırmayı reddediyor (kapsam playbook dosyasından okunur). +- [x] Yetki modeli: `sudo bf` tam yetki; yetkisiz açılışta yazma işlemleri kapalı ve çalıştırma katmanı `[ENGELLENDİ]` ile reddediyor. +- [x] Pencere `docs/DESIGN.md` yönergesine göre çiziliyor: koyu başlık bandı (ürün adı + hedef kimliği + cihaz durumu + yetki), beyaz paneller, `KURULDU`/`KAYITLI`/`HAZIR`/`HATA`/`YOK` rozetleri (sözcük + renk), tek çıkış kontrolü; renk ve boşluk değerleri `bfos/ui_theme.py` üzerinden `web/static/tokens.css`'ten geliyor ve statik testle karşılaştırılıyor. +- [x] Grafik ekran/tkinter yokluğunda Türkçe hata + `sudo bf --tui` önerisi ve çıkış kodu 3. +- [x] Şifre üretimi varsayılan **kapalı**; yalnız `bf-creds --generate` ile üretiliyor; parola ekrana/loga gitmiyor. +- [x] `Cihaz işlemleri` içinde onaysız güncelleme seçeneği **yok**; `Bekleyen güvenlik güncellemeleri` yalnız rapor. +- [x] Denetim kaydı mod `600`; secret ve ham komut çıktısı yazılmıyor. +- [ ] Örnek pencere/çıktı satırları gerçek LAB koşusuyla (özellikle kurulum betiğinin `[installer]` satırları) güncellendi. + +## 13. Açık Sorular + +- [ ] Katalog işlemlerinin playbook kümesiyle tam eşleşmesi: yeni playbook'lar kataloğa nasıl eklenecek (`bfos/operations.py` + sekme tablosu) ve bu süreç hangi PR şablonuyla yürüyecek (sahibi: 09 + arayüz sahibi). +- [ ] Terminal konsolunda bulunup grafik katalogda ayrı işlem olmayan araçlar (ortam bilgisi, canlı donanım kontrolü, uzak erişim durumu, donanım envanteri, merkez uç noktası probu) sekme listesine taşınacak mı; iki giriş noktası bu noktada bilinçli olarak ayrı mı kalacak (sahibi: arayüz sahibi + 15). +- [ ] Merkez hazırlığı ekranlarının gerçek merkez uç noktaları geldiğinde hangi kanıtı "hazır" sayacağı (sahibi: 29/21 yazarları). +- [ ] `bf-creds --fetch` hedefinin (`admin/secrets/`) kurumsal kasa (vault) akışına bağlanması (sahibi: 06-ssh + merkezi admin). +- [ ] Arayüz işlem geçmişinin merkezi log toplamaya (Loki/ELK, Faz-sonrası) dahil edilip edilmeyeceği (sahibi: 15-LOGGING yazarı). +- [ ] Git kurulumu ile ISO/firstboot yolunun uzun vadeli rolü: ISO tamamen arşiv mi, yedek yol mu kalır (sahibi: yönetim + 26 yazarı). +- [ ] Kurumsal proxy/air-gapped sahalarda `git clone` yerine iç ayna (mirror) deposu kullanılacak mı; bootstrap `--repo`/`BF_REPO_URL` ile buna hazır mı (sahibi: merkezi admin). +- [ ] Grafik arayüzün uzak masaüstü (xRDP) oturumu üzerinden de çalıştırılması desteklenen/desteklenmeyen bir senaryo mu; K-22 ile ilişkisi (sahibi: 08-rdp + arayüz sahibi). + +--- + +## Ek: Arayüz haritası + +```mermaid +flowchart TB + START["sudo bf
    (grafik arayüz, varsayılan)"] --> WIN["Pencere: Blueforce Field OS — Yönetim
    üst çubuk: Bayi no (8 hane) + Dalga + Tüm filo"] + WIN --> SIMPLE["Basit mod (varsayılan)
    3 büyük düğme: Kur / Durum / Çıkış"] + WIN -->|"üstte 'Detaylı mod'"| DETAIL["Detaylı mod
    5 kategori sekmesi"] + SIMPLE -. "Detaylı mod düğmesi" .-> DETAIL + DETAIL --> T1["Kurulum (6 işlem, 3 yazma)
    ön kontrol / bu cihazı kur / resume / --only
    modül durumu / kurulum günlüğü"] + DETAIL --> T2["Cihaz işlemleri (21 işlem, 9 yazma)
    11 salt-okunur rapor + 10 bakım işlemi"] + DETAIL --> T3["Merkez hazırlığı (4, hepsi salt-okunur)
    envanter / PLACEHOLDER / uç noktalar / kontrol listesi"] + DETAIL --> T4["Araçlar (9 işlem, 1 yazma)
    checkout güncelle / katalog / kapılar / destek paketi / denetim kaydı"] + DETAIL --> T5["Cihaz bilgisi (8, hepsi salt-okunur)
    özet / kimlik / ağ / kaynaklar / paketler / servisler / journal / state"] + WIN --> FOOT["Alt çubuk: Komutu göster ve çalıştır / Çıktıyı temizle /
    Çalışanı iptal et / Yalnız denetim (--check) / Çıkış"] + FOOT --> GATES{"Onaylar: komut önizleme →
    dalga adı / production / GATE / all →
    yıkıcı ikinci onay"} + GATES --> RUN["Komut çıktı alanına yazılır ve koşar
    denetim kaydı: /var/log/blueforce-console.log (600)"] + START -. "grafik ekran veya tkinter yoksa
    (çıkış kodu 3, Türkçe hata)" .-> TUI["sudo bf --tui
    (terminal konsolu, yedek)"] + TUI -. "python3 yoksa" .-> BASH["admin/bf-menu
    (bash konsolu, son çare)"] +``` + +## Ek: İlk kurulum ve durum akışı + +```mermaid +flowchart LR + G["git clone
    Blueforce-Linux"] --> LFS["git lfs pull
    provisioning/offline-repo/packages/
    1321 .deb"] + LFS --> B["sudo admin/bf-bootstrap.sh
    (veya curl | sudo bash)"] + B --> BF["/usr/local/bin/bf
    + bf-menu (yedek)"] + BF --> GUI["sudo bf
    grafik arayüz"] + GUI --> ID["Üst çubuk: bayi no gir
    ör. 12010193"] + ID --> INST["Kurulum sekmesi → Bu cihazı kur
    --offline (yerel paket deposu)"] + INST --> MOD["18/18 modül OK
    + final-check: tkinter kapısı"] + MOD --> PO["PROVISIONED_OFFLINE
    yerel kurulum bitti"] + PO -->|"Cihaz bilgisi: kayıt durumu"| EN["ENROLLED"] + EN -->|merkez kanal kanıtı| RDY["READY
    teslim edilebilir"] + GUI -. "grafik ekran yok / tkinter yok" .-> TUI["sudo bf --tui"] + B -. "ISO/firstboot yolu
    (ikincil, opsiyonel)" .-> FB["docs/26 / docs/27"] +``` + +## Ek: Hızlı referans (arayüz ↔ komut) + +Her satırda önce **arayüzdeki yol**, sonra aynı işin **`sudo bf --tui` (terminal konsolu)** karşılığı, en altta altta çalışan komut/playbook yazar. + +| Arayüzde (grafik) | `sudo bf --tui` karşılığı | Altında çalışan komut / playbook | +|---|---|---| +| Basit mod → `Kur` → `Ön kontrol (--check)` | `1) Kur` → `1) Ön kontrol (--check)` | `blueforce-install.sh --dealer-id <8hane> --check` | +| Basit mod → `Kur` → `Kurulumu başlat` | `1) Kur` → `2) Bu cihazı kur` | `blueforce-install.sh --dealer-id <8hane>` (`--offline`, `--resume` opsiyonel) | +| Kurulum → `Başarısız kuruluma devam et` | Kurulum → `3) Başarısız kurulumu sürdür` | `blueforce-install.sh --dealer-id <8hane> --resume` | +| Kurulum → `Tek modül çalıştır (--only)` | Kurulum → `4) Tek modül çalıştır` | `blueforce-install.sh --dealer-id <8hane> --only ` | +| Kurulum → `Kurulum modül durumu` / `Kurulum günlüğü` | Kurulum → `5)` / `6)` | `/var/lib/blueforce/install-state`, `/var/log/blueforce-install.log` | +| Basit mod → `Durum` / Cihaz bilgisi → `Durum özeti` | `1) Kur` menüsünden `2) Durum` / Cihaz bilgisi → `2) Sağlık özeti` | `bf-status`, `state.json` beyaz listesi, envanter hedefleri | +| Cihaz işlemleri → `Erişilebilirlik testi (ping)` | Cihaz işlemleri → `1) Salt okunur raporlar` → ping | `bf-ping.yml` | +| Cihaz işlemleri → `Field OS sürüm raporu` | Cihaz işlemleri → salt-okunur raporlar → Field OS sürümü | `bf-fieldos-version.yml` | +| Cihaz işlemleri → `Log topla / destek paketi` | Cihaz işlemleri → `2) Bakım işlemleri` → log topla | `bf-collect-logs.yml` | +| Cihaz işlemleri → `Kontrollü yeniden başlatma` | Cihaz işlemleri → bakım işlemleri → kontrollü reboot | `bf-reboot.yml` (sürüm kapılı, sıralı + sağlık kapısı) | +| Cihaz işlemleri → `Onaylı paket güncellemesi kur` | Cihaz işlemleri → bakım işlemleri → onaylı güncelleme | `bf-deploy-update.yml` (`paket=sürüm` pinleri) | +| Cihaz işlemleri → `Grafik arayüzü kapat/aç` | Cihaz işlemleri → bakım işlemleri → GUI off / on | `bf-gui-off.yml` / `bf-gui-on.yml` (xRDP'e dokunmaz, K-22) | +| Merkez hazırlığı → `Envanter hedefleri` | Merkez hazırlığı → `1..5` ekranları | envanter okuma + `group_vars/all.yml` denetimi + DNS/TCP probe (`--tui`) | +| Araçlar → `Bu kopyayı güncelle` | Araçlar → `1) Depoyu güncelle` | `git -C pull --ff-only` | +| Araçlar → `İşlem kataloğunu göster` | Araçlar → `3) İşlem kataloğunu göster` | `bf --list` (48 işlem, kategori kategori) | +| Araçlar → `Yerel çevrimdışı kapısı` / `Kayıt kapısı` / `Teslim kapısı` | Araçlar → `4)`, `5)`, `6)` | `bf-check-local`, `bf-check-enrollment`, `bf-check-ready` (`--check`) | +| Araçlar → `Derin teşhis` / `Field OS sürüm kimliği` | Araçlar → `7)`, `10)` | `bf-diagnostics` (yoksa `bf-status`), `bf-release` | +| Araçlar → `Destek paketi oluştur` | Araçlar → `12) Destek paketi` | `bf-support-bundle --out-dir /var/tmp` | +| Araçlar → `Konsol denetim günlüğü` | Araçlar → `13) Konsol denetim kaydını göster` | `tail -n 40 /var/log/blueforce-console.log` | +| Cihaz bilgisi → `Kimlik` / `Ağ` / `Disk, bellek, yük` / `Servis durumu` / `Son journal hataları` | Cihaz bilgisi → `1)`, `4)`, `5)`, `7)`, `8)` | `hostname` + `state.json`, `ip`/`resolv.conf`/`wg show`, `df`-`free`-`uptime`, `systemctl is-active`, `journalctl -p err -n 20` | +| Cihaz bilgisi → `Kurulum/kayıt durumu` | Cihaz bilgisi → `3) Kurulum ve kayıt durumu` | `state.json` beyaz liste (`phase`, `enrollment_status`, `fleet_status`, `device_id`, `provisioning_id`) | +| (arayüzde ayrı işlem değil) | Araçlar → `2) Ortam ve sürüm bilgisi`, `8) Canlı donanım / OS kontrolü`, `9) Uzak erişim kanalları`, `11) Donanım envanteri` | `environment_lines`, `bf-live-hw-check`, `bf-remote-status --check`, `bf-hardware-inventory.sh` | +| Arayüz dışı (opsiyonel) | Arayüz dışı (opsiyonel) | `sudo bf-creds --generate` / `--fetch` | +| Denetim kaydı | Denetim kaydı | `/var/log/blueforce-console.log` (mod `600`; yazılamazsa `$XDG_STATE_HOME/blueforce/blueforce-console.log`) | +| Grafik ekran/tkinter yoksa | Bu konsol | `sudo bf --tui`; Python yoksa `sudo bf-menu` | +
    + + +# Blueforce Field OS - offline APT pin manifest: base system packages +# +# Target release : Ubuntu 26.04 LTS, architecture amd64 (LAB confirms both) +# Format : one exact pin per line -> package=version ("#" starts a comment) +# Consumed by : scripts/install/blueforce-install.sh --offline, which refuses to +# run any package module unless every pin here is present in the +# bundle lock file /packages.lock.tsv. +# +# UNPINNED is a sentinel, not a version. Fill it in LAB: +# 1. acquire the reviewed .deb for the package into one local pool directory +# 2. read the exact version: dpkg-deb -f .deb Package Version +# 3. replace UNPINNED with that version, keeping the line shape: +# openssh-server= +# 4. verify with the static plan: ../build-offline-repo.sh --dry-run-plan +# (it must print PLAN READY before --check or a real build is attempted) +# +# Rules enforced by the tooling: lower-case package names, exactly one pin per +# package across all manifests, no inline comments, no whitespace around "=", +# no placeholder/replace/todo tokens. Adding or removing a package is a contract +# change: update manifests/requirements.tsv in the same edit or the plan fails. + +# --- base tooling (installer module 02-system.sh, BASE_PKGS) --- +curl=8.18.0-1ubuntu2.5 +wget=1.25.0-2ubuntu4.4 +ca-certificates=20260601~26.04.1 +gnupg=2.4.8-4ubuntu3.1 +lsb-release=12.1-2build1 +# Transitional dummy on apt >= 2.0 (https is built into apt). Kept for air-gapped +# parity with the reference build; the LAB may drop it after review. +apt-transport-https=3.2.0 + +# --- remote shell and encrypted transport (modules 07-ssh.sh, 06-wireguard.sh) --- +openssh-server=1:10.2p1-2ubuntu3.6 +wireguard-tools=1.0.20250521-1ubuntu1 + +# --- field diagnostics: SMART disk health evidence --- +# Consumed by scripts/diagnostics/bf-diagnostics and bf-hardware-inventory.sh. +smartmontools=7.5-2 + +# --- firewall baseline (module 13-firewall.sh) --- +ufw=0.36.2-9build1 +iptables=1.8.11-2ubuntu3 + +# --- operator GUI (bfos/ui_gui.py; module 18-final-check.sh) --- +# tkinter ships as its own package on Ubuntu, so a minimal image has Python but +# no GUI. Without it the operator application cannot open its window at all -- +# and the fleet has no network to fetch it from. +python3-tk=3.14.3-0ubuntu2 +# python3-tk's own dependency closure. Pinned explicitly because the installer +# resolves nothing from a remote source: whatever the pin does not name must +# already be on the image. +python3.14-tk=3.14.4-1ubuntu0.2 +libtk8.6=8.6.17-1build1 +libreadline8t64=8.3-4 +readline-common=8.3-4 +libffi8=3.5.2-4 +libsqlite3-0=3.46.1-9ubuntu0.2 +libbrotli1=1.2.0-3build1 +openssl=3.5.5-1ubuntu3.5 + +# --- monitoring (module 12-monitoring.sh) --- +# The textfile collector ships inside this package; no extra dependency is needed. +prometheus-node-exporter=1.10.2-1 + + + +# Manifest audit table - the contract behind manifests/*.txt +# +# Four TAB-separated columns, one row per required package: +# manifest package required-by why +# +# build-offline-repo.sh --dry-run-plan fails on drift in either direction: +# * a row whose package is not pinned in that manifest -> MISSING PACKAGES +# * a pin in a manifest with no row here -> PLAN ERROR (rogue pin) +# +# scripts/install/blueforce-install.sh never reads this file: it is the audit +# trail for humans and for the dry-run plan. Kernel modules and other artifacts +# that are not shipped as .deb files are out of scope. +base-packages.txt curl scripts/install/installer/modules/02-system.sh BASE_PKGS: HTTPS transfers for installer tooling +base-packages.txt wget scripts/install/installer/modules/02-system.sh BASE_PKGS: downloader expected by field runbooks +base-packages.txt ca-certificates scripts/install/installer/modules/02-system.sh BASE_PKGS: root store for TLS verification +base-packages.txt gnupg scripts/install/installer/modules/02-system.sh BASE_PKGS: signature handling for reviewed artifacts +base-packages.txt lsb-release scripts/install/installer/modules/02-system.sh BASE_PKGS: distribution identification +base-packages.txt apt-transport-https scripts/install/installer/modules/02-system.sh BASE_PKGS-adjacent: transitional dummy on apt >= 2.0, kept for parity +base-packages.txt openssh-server scripts/install/installer/modules/07-ssh.sh managed SSH access channel +base-packages.txt wireguard-tools scripts/install/installer/modules/06-wireguard.sh wg command for the WireGuard tunnel +base-packages.txt smartmontools scripts/diagnostics/bf-diagnostics SMART disk health evidence for field reports +base-packages.txt ufw scripts/install/installer/modules/13-firewall.sh host firewall baseline +base-packages.txt iptables scripts/install/installer/modules/13-firewall.sh rule backends used by the firewall module +base-packages.txt prometheus-node-exporter scripts/install/installer/modules/12-monitoring.sh node exporter including the textfile collector +base-packages.txt python3-tk scripts/install/installer/modules/18-final-check.sh tkinter is a separate package on Ubuntu; without it the operator GUI cannot start +base-packages.txt python3.14-tk scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt libtk8.6 scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt libreadline8t64 scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt readline-common scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt libffi8 scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt libsqlite3-0 scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt libbrotli1 scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +base-packages.txt openssl scripts/install/installer/modules/18-final-check.sh python3-tk dependency closure; the installer resolves nothing from a remote source +remote-access.txt rustdesk scripts/install/installer/modules/09-rustdesk.sh pinned vendor .deb; not in the Ubuntu archive +remote-access.txt libxdo3 scripts/install/installer/modules/09-rustdesk.sh rustdesk 1.4.9 Depends; pulled explicitly because the vendor .deb is installed with dpkg, not from an APT source +remote-access.txt libva-x11-2 scripts/install/installer/modules/09-rustdesk.sh rustdesk 1.4.9 Depends; pulled explicitly because the vendor .deb is installed with dpkg, not from an APT source +remote-access.txt xrdp scripts/install/installer/modules/08-rdp.sh RDP access channel +remote-access.txt xorgxrdp scripts/install/installer/modules/08-rdp.sh X11 backend recommended by xrdp for the GNOME session +remote-access.txt gnome-session scripts/install/installer/modules/08-rdp.sh session started by xRDP logins +remote-access.txt ubuntu-desktop-minimal scripts/install/installer/modules/16-gui.sh minimal desktop stack for the field device +docker.txt docker-ce scripts/install/installer/modules/10-docker.sh container engine +docker.txt docker-ce-cli scripts/install/installer/modules/10-docker.sh docker CLI used by modules and diagnostics +docker.txt containerd.io scripts/install/installer/modules/10-docker.sh runtime bundled with Docker CE +docker.txt docker-buildx-plugin scripts/install/installer/modules/10-docker.sh buildx plugin requested by the offline install path +docker.txt docker-compose-plugin scripts/install/installer/modules/10-docker.sh compose v2 plugin for the field stack + + + +#!/usr/bin/env bash +# Offline APT repository intake. +# +# Validate reviewed Debian packages and copy them into +# provisioning/offline-repo/packages/ so that they can be committed to git. The +# repository owner runs this on an Ubuntu machine; the device that later +# installs from the bundle never downloads anything. +# +# Guarantees: +# * nothing is downloaded and nothing is resolved from a remote source, +# * a file that is not a readable Debian binary package is refused, +# * a package for a foreign architecture is refused (the target is amd64, +# packages marked "all" are accepted), +# * a second version of a package that is already accepted is refused instead +# of silently overwritten: manifests/*.txt pin exactly one version, +# * manifests/*.txt is never edited here. For every pin that still reads the +# UNPINNED sentinel the exact replacement line is printed for the owner. +# +# --check performs the same validation without copying anything. +# +# User-facing output is Turkish; code and comments are English. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PACKAGES_DIR="$SCRIPT_DIR/packages" +TARGET_ARCH='amd64' +ALLOWED_ARCH_RE='^(amd64|all)$' +PACKAGE_NAME_RE='^[a-z0-9][a-z0-9+.-]*$' +PIN_RE='^[a-z0-9][a-z0-9+.-]*=[^[:space:]]+$' +UNPINNED='UNPINNED' + +usage() { + cat <<'EOF' +Kullanım: add-packages.sh [seçenekler] [ ...] + add-packages.sh --from DIZIN [--manifest DOSYA] + +İncelenmiş .deb dosyalarını provisioning/offline-repo/packages/ altına ekler. +Hiçbir indirme yapmaz: dosyaları siz verirsiniz, bu araç yalnızca doğrular. + +Seçenekler: + --from DIZIN DIZIN içindeki tüm *.deb dosyalarını aday olarak alır + --manifest DOSYA Yalnızca bu manifestteki pinlere uyan adayları ekler + (birden fazla --manifest verilebilir) + --include-all --manifest ile birlikte: pin dışı adayları da ekler + (bağımlılık paketleri için gerekir) + --packages DIZIN Hedef dizin (varsayılan: