#!/bin/sh
#251031 sfs
# quick_add_unsigned.sh - Быстрое добавление неподписанных пакетов
#REPO_NAME="${1:-myrepo}"
[ "$1" ] && REPO_NAME="$1" || REPO_NAME="$(basename "`pwd`")"

#KEY_ID="${2:-$(gpg --list-secret-keys --keyid-format LONG | grep -oP 'rsa4096/\K[0-9A-F]{16}' | head -1)}"
KEY_ID="${2:-$(gpg --list-secret-keys --with-colons | awk -F: '$1 == "fpr" {print $10; exit}')}"

if [[ -z "$KEY_ID" ]]; then
    echo "Ошибка: Не найден GPG ключ"
    exit 1
fi

echo "Добавление неподписанных пакетов в $REPO_NAME..."
echo "Используется ключ: $KEY_ID"

# Создаем временный файл для списка пакетов
temp_list=$(mktemp)

# Находим и подписываем неподписанные пакеты
for pkg in *.pkg.tar.xz *.pkg.tar.zst; do
    [[ ! -f "$pkg" ]] && continue
    
    if [[ ! -f "${pkg}.sig" ]] || ! gpg --verify "${pkg}.sig" 2>/dev/null; then
        echo "Подписывается: $pkg"
        gpg --detach-sign --batch --yes --default-key "$KEY_ID" "$pkg"
        echo "$pkg" >> "$temp_list"
    fi
done

# Добавляем в репозиторий если есть что добавлять
if [[ -s "$temp_list" ]]; then
    echo "Добавление пакетов в репозиторий..."
#    xargs -a "$temp_list" repo-add -s -k "$KEY_ID" "${REPO_NAME}.db.tar.gz"
    xargs -a "$temp_list" repo-add "${REPO_NAME}.db.tar.gz"
    echo "Готово!"
else
    echo "Нет неподписанных пакетов"
fi

rm -f "$temp_list"
X(){
n="$REPO_NAME"
rm $n.db &&
    cp $n.db.tar.gz $n.db
#mv $n.db.tar.gz.sig $n.db.sig
rm $n.files &&
    cp $n.files.tar.gz $n.files
#mv $n.files.tar.gz.sig $n.files.sig
}
X
exit
#
# Подписать все пакеты Arch независимо от формата сжатия
for pkg in *.pkg.tar.xz *.pkg.tar.zst ; do
    if [ ! -f "${pkg}.sig" ]; then
        echo "Signing ${pkg}..."
#        echo $pkg
        gpg --detach-sign --default-key your-key-id "$pkg"
#    else
#        echo "Already signed: ${pkg}"
    fi
done
exit
for pkg in *.pkg.tar.*; do
    if [[ ! -f "${pkg}.sig" ]]; then
        echo "Signing ${pkg}..."
        gpg --detach-sign --default-key your-key-id "$pkg"
    else
        echo "Already signed: ${pkg}"
    fi
done


exit
id="`gpg --list-secret-keys --with-colons | awk -F: '$1 == "fpr" {print $10; exit}'`"
[ ! "$id" ] && o="-n" || o="-n -s -k $id"
[ "$1" = "--help" ] &&   echo "Usage: $0 [repo-name]
    Создает из *.pkg.tar.xz в текущей директории arch репозиторий" && exit 
[ "$1" ] && n="$1" || n="$(basename "`pwd`")"
repo-add $o $n.db.tar.xz *.pkg.tar.*
#repo-add $o --files $n.files.tar.xz *.pkg.tar.*

mv $n.db.tar.xz $n.db
mv $n.db.tar.xz.sig $n.db.sig
mv $n.files.tar.xz $n.files
mv $n.files.tar.xz.sig $n.files.sig
exit
Подписание собственного Arch Linux репозитория
В Arch используется GPG-подпись файла базы репозитория (например, myrepo.db.tar.gz → подписывается как myrepo.db.tar.gz.sig).

✅ Пошаговая инструкция: как подписать свой Arch-репозиторий
🔑 Шаг 1: Создайте GPG-ключ (если ещё нет)

gpg --full-generate-key
Тип ключа: (1) RSA and RSA
Размер: 4096
Срок: 0 (бессрочный) или на несколько лет
Имя/почта: например, MyRepo <admin@myrepo.org>
💡 Запомните ID ключа (например, ABC123DEF456) — он понадобится. 

Посмотреть ключи:
gpg --list-secret-keys
📦 Шаг 2: Создайте/обновите репозиторий с помощью repo-add
Предположим, ваш репозиторий в /srv/repo/, и вы добавляете пакет mypackage-1.0-1-x86_64.pkg.tar.zst:

cd /srv/repo/
repo-add -s -k ABC123DEF456 myrepo.db.tar.zst mypackage-1.0-1-x86_64.pkg.tar.zst
🔹 Ключевые флаги: 
-s — подписать базу репозитория
-k ABC123DEF456 — использовать конкретный GPG-ключ (по ID или email)
После этого появятся файлы:
myrepo.db.tar.zst        # база репозитория
myrepo.db.tar.zst.sig    # GPG-подпись ✅
⚠️ Если не указать -k, repo-add попытается использовать первый найденный секретный ключ. 

🌐 Шаг 3: Сделайте публичный ключ доступным
Пользователи должны импортировать ваш публичный ключ, чтобы pacman мог проверить подпись.
Экспортируйте ключ:
gpg --armor --export "admin@myrepo.org" > /srv/repo/myrepo-key.asc
Теперь он доступен по URL, например:
https://myserver.org/repo/myrepo-key.asc

🖥️ Шаг 4: Настройка на клиенте (у пользователя)
Импортируйте ключ:
sudo pacman-key --recv-keys ABC123DEF456  # если ключ в keyserver
# ИЛИ
curl -O https://myserver.org/repo/myrepo-key.asc
sudo pacman-key --add myrepo-key.asc

Подтвердите доверие:
pacman-key --list-keys
sudo pacman-key --finger ABC123DEF456  # проверьте отпечаток!
sudo pacman-key --lsign-key ABC123DEF456

Добавьте репозиторий в /etc/pacman.conf:
[myrepo]
SigLevel = Required DatabaseOptional
Server = https://myserver.org/repo/$arch
🔹 SigLevel = Required — требует подписи для пакетов и базы.
🔹 DatabaseOptional — позволяет обновлять базу, даже если .sig временно недоступен (опционально). 

🔄 Шаг 5: Обновление репозитория
Каждый раз при добавлении/удалении пакета пересоздавайте базу с подписью:

repo-add -s -k ABC123DEF456 myrepo.db.tar.zst *.pkg.tar.zst
💡 repo-add автоматически обновит базу и переподпишет её. 

🔒 Дополнительно: подпись отдельных пакетов (опционально)
По умолчанию в Arch подписывается только база репозитория, а не каждый .pkg.tar.zst.

Но вы можете подписать и сами пакеты:
gpg --detach-sign mypackage-1.0-1-x86_64.pkg.tar.zst
→ появится mypackage-1.0-1-x86_64.pkg.tar.zst.sig

Тогда в pacman.conf можно указать:
SigLevel = PackageRequired DatabaseRequired
Однако это редко используется — обычно достаточно подписи базы.

🛠️ Полезные команды
Посмотреть содержимое базы
tar -tvf myrepo.db.tar.zst
Проверить подпись базы
gpg --verify myrepo.db.tar.zst.sig myrepo.db.tar.zst
Экспортировать ключ в бинарном виде
gpg --export ABC123DEF456 > myrepo-key.gpg
