#!/bin/bash set -euo pipefail # Usage: ./edit-deb-fixed.sh if [ $# -lt 4 ]; then echo "Usage: $0 " exit 1 fi ORIG_DEB="$1" MOD_DEB="$2" NEW_PACKAGE="$3" NEW_DESCRIPTION="$4" if [ ! -e "$ORIG_DEB" ]; then echo "Error: input .deb not found: $ORIG_DEB" exit 1 fi ORIG_DEB_ABS="$(readlink -f "$ORIG_DEB")" MOD_DEB_ABS="$(readlink -f "$MOD_DEB" 2>/dev/null || printf "%s/%s" "$(pwd)" "$MOD_DEB")" TMPDIR="$(mktemp -d)" cleanup() { rm -rf "$TMPDIR" } trap cleanup EXIT cd "$TMPDIR" # 1) Распаковать deb ar x "$ORIG_DEB_ABS" # 2) Найти control.tar.* shopt -s nullglob controls=(control.tar.*) if [ ${#controls[@]} -eq 0 ]; then echo "Error: control.tar.* not found inside the .deb" exit 1 fi control_file="${controls[0]}" EXT="${control_file##*.}" # 3) Распаковать control mkdir control tar -xpf "$control_file" -C control if [ ! -f control/control ]; then echo "Error: control file 'control/control' is missing" exit 1 fi # 4) Правим Package и Description awk -v pkg="$NEW_PACKAGE" -v desc="$NEW_DESCRIPTION" ' BEGIN{pkg_done=0; desc_done=0} /^Package: / && !pkg_done { print "Package: " pkg; pkg_done=1; next } /^Description: / && !desc_done { print "Description: " desc; desc_done=1; next } { print } ' control/control > control/control.new mv control/control.new control/control # 5) Пересобрать control.tar.* с root:root rm -f "$control_file" case "$EXT" in gz) tar --sort=name --owner=0 --group=0 -cpzf control.tar.gz -C control . ;; xz) tar --sort=name --owner=0 --group=0 -cpJf control.tar.xz -C control . ;; zst) if tar --help 2>&1 | grep -q -- '--zstd'; then tar --sort=name --owner=0 --group=0 --zstd -cpf control.tar.zst -C control . else tar --sort=name --owner=0 --group=0 -cpf - -C control . | zstd -19 -c -o control.tar.zst fi ;; *) echo "Error: unknown control archive extension: .$EXT" exit 1 ;; esac # 6) Найти и распаковать data.tar.* data_files=(data.tar.*) if [ ${#data_files[@]} -eq 0 ]; then echo "Error: data.tar.* not found in the .deb" exit 1 fi data_file="${data_files[0]}" DATA_EXT="${data_file##*.}" mkdir data tar -xpf "$data_file" -C data # 7) Пересобрать data.tar.* с root:root rm -f "$data_file" case "$DATA_EXT" in gz) tar --sort=name --owner=0 --group=0 -cpzf data.tar.gz -C data . ;; xz) tar --sort=name --owner=0 --group=0 -cpJf data.tar.xz -C data . ;; zst) if tar --help 2>&1 | grep -q -- '--zstd'; then tar --sort=name --owner=0 --group=0 --zstd -cpf data.tar.zst -C data . else tar --sort=name --owner=0 --group=0 -cpf - -C data . | zstd -19 -c -o data.tar.zst fi ;; *) echo "Error: unknown data archive extension: .$DATA_EXT" exit 1 ;; esac # 8) Собрать новый deb ar rcs "$MOD_DEB_ABS" debian-binary "control.tar.$EXT" "data.tar.$DATA_EXT" # 9) Проверка echo "✅ Done. New package created at: $MOD_DEB_ABS" dpkg-deb -I "$MOD_DEB_ABS" || true