Debian Repository Erstellung
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Werte Skolelinuxer,
ich hatte vor langer Zeit mal ein Script erstellt um mir ein "privates" Repository zu generieren.
Dabei verwende ich nicht die pool Struktur. Ihr könnt Euch das ja mal ansehen - ich habe dabei eine Menge gelernt.
Eintrag in /etc/apt/sources.list.d/<Repository>.list
Einbinden kann man das Repository entweder lokal:
deb file:///home/<Benutzername>/<Repository> wheezy main contrib non-free
deb-src file:///home/<Benutzername>/<Repository> wheezy main contrib non-free
oder per Webserver (bei mir apache2):
deb http://localhost/<Repository> wheezy main contrib non-free
deb-src http://localhost/<Repository> wheezy main contrib non-free
Dabei liegt der Ordner in /var/www/<Repository> (apache2 mit default Einstellungen).
Falls Ihr einen GNUPG-Schlüssel habt, könnt Ihr Euer Repository damit signieren.
Benutzung: Einfach das Script im Repositoryordner aufrufen.
Beim ersten Aufruf wird eine Config-Datei erstellt (im Ordner <Repository>/project).
Ich hoffe, dass ich einen produktiven Vorschlag damit machen konnte.
Gruß Marcel
P.S.: Ich finde irgenwie kein Ende...
...also beschreibe ich auch noch die Source- und Binary-Paketerstellung.
Als Beispiel benutze ich das Paket 'tar'.
Die Pakete build-essential dpkg-dev debhelper dh-make fakeroot installieren
(Sudo-Rechte setze ich voraus).
sudo apt-get install build-essential dpkg-dev debhelper dh-make fakeroot
mkdir -p ~/build/tar
cd ~/build/tar
# Quellcode holen
apt-get source tar
# Bauabhängigkeiten installieren
sudo apt-get build-dep tar
# je nach Version in den Quellordner wechseln
cd tar-1.27.1
# Signiertes Source Paket bauen
dpkg-buildpackage -pgpg -S -k<GNUPGKEY> -tc
# oder unsigniert
dpkg-buildpackage -pgpg -S -us -uc -tc
# Signiertes Binary (.deb) Paket(e) bauen
dpkg-buildpackage -rfakeroot -b -pgpg -k<GNUPGKEY> -tc
# oder unsigniert
dpkg-buildpackage -rfakeroot -b -us -uc -tc
Man erhält dann folgende (oder ähnliche) Dateien im Verzeichnis ~/build/tar:
tar_1.27.1-1~bpo70+1_amd64.deb # Binärpaket
tar_1.27.1-1~bpo70+1.debian.tar.gz # Debianänderungen gegenüber dem Originalarchiv
tar_1.27.1-1~bpo70+1.dsc # Informationen über das Quellpaket
tar_1.27.1-1~bpo70+1_source.changes # Zusätzliche Informationen nach dem Bauvorgang
tar_1.27.1.orig.tar.xz # Originalarchiv
tar-scripts_1.27.1-1~bpo70+1_amd64.deb # Binärpaket
Man sieht direkt, daß ich tar aus dem wheezy Backport Repository geholt habe und für die amd64 Architektur übersetzt wurde.
Dabei wurden zwei Binarypakete 'gebaut'.
Diese Dateien packt man nun ins Repository, z.B.
/home/<Benutzername>/<Repositoryname>/<Distribution>/main/t/tar
Anschließend ruft man das Script mkrepo in /home/<Benutzername>/<Repositoryname> auf.
Dieses erstellt nun den Ordner /home/<Benutzername>/<Repositoryname>/dists.
Dort sind eine Menge Infos und Prüfsummen zu finden (die das eigentliche Problem betreffen).
Ich hoffe, dass diese Infos ausreichend sind.
Viel Spaß und Erfolg
Marcel
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/
iQEcBAEBAgAGBQJToYfRAAoJEGtSOaqeZbPkl8YH/jKDPniC84dHy4LLBYsAPK90
FWK8s+uH0xjVXiD57gxdVD0FqBRcNE4rCgVaEuldooZvstyFNa6kIUhlpxUYRgL6
MphoRNH1oV6yct/1xMoyJuV0yX+KFanjdop4zau8pUE6ror6enTyRjMgDvWEY2H0
6dPX59QaAaNfj5//QfhETVZuhc/W7QBz1YIb//PBbmkH663hDTAvbbyKbtD1ER2x
fn251wEof0u7B+pPYorhV2NpxKjl/D+3Vm9Mc7yZKVAynESEcjhrgmTRNVL4F6RX
/E71JdBQO/iT07v8bLEW5673LVkozpxFCnE1JtOARqOk25o1h+rcRg0fOUG3KCc=
=DIo2
-----END PGP SIGNATURE-----
#!/bin/bash
#
# To use gnupg set variable GPGKEY to your key
# or export it in environment
#
#GPGKEY="xxxxxxxx"
GPG=/usr/bin/gpg
LANG="C"
[ -e /etc/default/locale ] && . /etc/default/locale
LC_ALL="${LANG}"
REVISION="0.1-1"
RELEASE_DATE="Sun, 20 Apr 2014 21:38:00 +0200"
DATE=$(date -R)
ORIGIN="$(hostname)"
DISTRIBUTION=""
CODENAME=""
VERSION=""
DESCRIPTION="Debian Repository"
ARCHITECTURES="$(uname -r)"
GZIP="true"
BZIP2="true"
MD5SUMS="true"
SHA1SUMS="true"
SHA256SUMS="true"
SHA512SUMS="false"
LINK="true"
###############
## Functions ##
###############
error()
{
echo
echo "## ERROR: ${1}"
echo
[ -e "${REPOSITORY}/.dists.tmp" ] && rm -rf "${REPOSITORY}/.dists.tmp"
[ -e "${REPOSITORY}/.dists" ] && rm -rf "${REPOSITORY}/.dists"
[ -z "$2" ] || exit $2
}
make_component_release()
{
[ -z "${1}" ] && error "no argument" 1
[ -z "${ORIGIN}" ] && error "no origin" 1
[ -z "${LABEL}" ] && error "no label" 1
[ -z "${VERSION}" ] && error "no version" 1
[ -z "${DISTRIBUTION}" ] && error "no distribution" 1
[ -z "${CODENAME}" ] && error "no codename" 1
[ -z "${COMPONENT}" ] && error "no component" 1
if [ "${1}" = "source" ]
then
DEST=.dists.tmp/${CODENAME}/${COMPONENT}/source/Release
else
DEST=.dists.tmp/${CODENAME}/${COMPONENT}/binary-${1}/Release
fi
cat >${DEST} <<EOF
Archive: ${DISTRIBUTION}
Origin: ${ORIGIN}
Label: ${LABEL}
Version: ${VERSION}
Component: ${COMPONENT}
Architecture: ${1}
EOF
}
make_release()
{
[ -z "${ORIGIN}" ] && error "no origin" 1
[ -z "${LABEL}" ] && error "no label" 1
[ -z "${DISTRIBUTION}" ] && error "no distribution" 1
[ -z "${VERSION}" ] && error "no version" 1
[ -z "${CODENAME}" ] && error "no codename" 1
[ -z "${DATE}" ] && error "no date" 1
[ -z "${ARCHITECTURES}" ] && error "no architectures" 1
[ -z "${COMPONENTS}" ] && error "no components" 1
[ -z "${DESCRIPTION}" ] && error "no description" 1
cat >.dists.tmp/${CODENAME}/Release <<EOF
Origin: ${ORIGIN}
Label: ${LABEL}
Suite: ${DISTRIBUTION}
Version: ${VERSION}
Codename: ${CODENAME}
Date: ${DATE}
Architectures: ${ARCHITECTURES}
Components: ${COMPONENTS}
Description: ${DESCRIPTION}
EOF
FILES=`find .dists.tmp/${CODENAME} -name Packages -o -name Packages.gz -o -name Packages.bz2 \
-o -name Sources -o -name Sources.gz -o -name Sources.bz2 -o -name Release | \
sed "s/.dists.tmp\/\${CODENAME}\/Release//;s/.dists.tmp\/\${CODENAME}\///"`
if [ "${MD5SUMS}" = "true" ]
then
echo "## generating md5 checksums"
echo "MD5Sum:" >>.dists.tmp/${CODENAME}/Release
for m in $FILES; do
SIZE=`wc -c .dists.tmp/${CODENAME}/$m | sed 's/ *\([0-9]*\).*/\1/'`
SUM=`md5sum .dists.tmp/${CODENAME}/$m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
printf " %s %16d %s\n" $SUM $SIZE $m >>.dists.tmp/${CODENAME}/Release
done
fi
if [ "${SHA1SUMS}" = "true" ]
then
echo "## generating sha1 checksums"
echo "SHA1:" >>.dists.tmp/${CODENAME}/Release
for m in $FILES; do
echo -n " " >>.dists.tmp/${CODENAME}/Release
SIZE=`wc -c .dists.tmp/${CODENAME}/$m | sed 's/ *\([0-9]*\).*/\1/'`
SUM=`sha1sum .dists.tmp/${CODENAME}/$m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
printf "%s %16d %s\n" $SUM $SIZE $m >>.dists.tmp/${CODENAME}/Release
done
fi
if [ "${SHA256SUMS}" = "true" ]
then
echo "## generating sha256 checksums"
echo "SHA256:" >>.dists.tmp/${CODENAME}/Release
for m in $FILES; do
echo -n " " >>.dists.tmp/${CODENAME}/Release
SIZE=`wc -c .dists.tmp/${CODENAME}/$m | sed 's/ *\([0-9]*\).*/\1/'`
SUM=`sha256sum .dists.tmp/${CODENAME}/$m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
printf "%s %16d %s\n" $SUM $SIZE $m >>.dists.tmp/${CODENAME}/Release
done
fi
if [ "${SHA512SUMS}" = "true" ]
then
echo "## generating sha512 checksums"
echo "SHA512:" >>.dists.tmp/${CODENAME}/Release
for m in $FILES; do
echo -n " " >>.dists.tmp/${CODENAME}/Release
SIZE=`wc -c .dists.tmp/${CODENAME}/$m | sed 's/ *\([0-9]*\).*/\1/'`
SUM=`sha512sum .dists.tmp/${CODENAME}/$m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
printf "%s %16d %s\n" $SUM $SIZE $m >>.dists.tmp/${CODENAME}/Release
done
fi
[ "${GZIP}" = "true" ] && gzip -c9 .dists.tmp/${CODENAME}/Release >.dists.tmp/${CODENAME}/Release.gz
[ "${BZIP2}" = "true" ] && bzip2 -k .dists.tmp/${CODENAME}/Release
echo "## sign release file"
if [ ! -z "$GPGKEY" ]
then
[ -e $GPG ] || error "gpg not found" 1
$GPG --sign-with $GPGKEY -abs -o .dists.tmp/${CODENAME}/Release.gpg .dists.tmp/${CODENAME}/Release
fi
}
make_packages_and_sources()
{
for COMPONENT in ${CODENAME}/*
do
COMPONENT="$(basename ${COMPONENT})"
[ "$COMPONENT" = "index.html" ] && continue
if [ -z "${COMPONENTS}" ]
then
COMPONENTS="${COMPONENT}"
else
COMPONENTS="${COMPONENTS} ${COMPONENT}"
fi
echo "## processing binaries: ${LABEL} ${CODENAME} ${COMPONENT}"
for ARCH in ${ARCHITECTURES}
do
mkdir -p .dists.tmp/${CODENAME}/${COMPONENT}/binary-${ARCH}
dpkg-scanpackages ${OPTS} -a ${ARCH} ${CODENAME}/${COMPONENT} /dev/null 2>/dev/null \
>.dists.tmp/${CODENAME}/${COMPONENT}/binary-${ARCH}/Packages
[ "${GZIP}" = "true" ] && /bin/gzip -c9 .dists.tmp/${CODENAME}/${COMPONENT}/binary-${ARCH}/Packages \
>.dists.tmp/${CODENAME}/${COMPONENT}/binary-${ARCH}/Packages.gz
[ "${BZIP2}" = "true" ] && /bin/bzip2 -k .dists.tmp/${CODENAME}/${COMPONENT}/binary-${ARCH}/Packages
make_component_release ${ARCH}
done
echo "## processing sources: ${LABEL} ${CODENAME} ${COMPONENT}"
mkdir .dists.tmp/${CODENAME}/${COMPONENT}/source
dpkg-scansources ${CODENAME}/${COMPONENT} /dev/null 2>/dev/null \
>.dists.tmp/${CODENAME}/${COMPONENT}/source/Sources
[ "${GZIP}" = "true" ] && /bin/gzip -c9 .dists.tmp/${CODENAME}/${COMPONENT}/source/Sources \
>.dists.tmp/${CODENAME}/${COMPONENT}/source/Sources.gz
[ "${BZIP2}" = "true" ] && /bin/bzip2 -k .dists.tmp/${CODENAME}/${COMPONENT}/source/Sources
make_component_release source
done
}
##########
## Main ##
##########
while getopts zjc:h flag; do
case ${flag} in
z)
[ -e /bin/gzip ] || error "gzip not found" 1
GZIP="true"
;;
j)
[ -e /bin/bzip2 ] || error "bzip2 not found" 1
BZIP2="true"
;;
c)
case ${OPTARG} in
md5)
[ -e /usr/bin/md5sum ] || error "md5sum not found" 1
MD5SUMS="true"
;;
sha1)
[ -e /usr/bin/sha1sum ] || error "sha1sum not found" 1
SHA1SUMS="true"
;;
sha256)
[ -e /usr/bin/sha256sum ] || error "sha256sum not found" 1
SHA256SUMS="true"
;;
sha512)
[ -e /usr/bin/sha512sum ] || error "sha512sum not found" 1
SHA512SUMS="true"
;;
*)
error "unknown checksum method: ${OPTARG}" 1
;;
esac
;;
h)
cat <<EOF
mkrepo-${REVISION}
Release Date: ${RELEASE_DATE}
usage: mkrepo [-zjc:h] [path_to_repository]
-z use gzip to compress Packages and Sources
-j use bzip2 to compress Packages and Sources
-c md5|sha1|sha256|sha512 use checksums in release file
-h this help
EOF
exit 0
;;
esac
done
set -- extra $@
shift ${OPTIND}
REPOSITORY="${1}"
[ -z "${1}" ] && REPOSITORY="."
[ -d "${REPOSITORY}" ] || error "not a directory: ${REPOSITORY}"
cd "${REPOSITORY}"
[ -e .dists.tmp ] && rm -rf .dists.tmp
REPOSITORY=$(pwd)
LABEL="$(basename ${REPOSITORY})"
cat <<EOF
## =============================================
## mkrepo-${REVISION}
## Release Date: ${RELEASE_DATE}
## =============================================
## generating repository ${REPOSITORY}
EOF
if [ ! -e project/.${LABEL}.cfg ]
then
cat <<EOF
A configuration file will be created in the project directory.
After editing use STRG-x to save and exit the editor.
Press <ENTER> to continue.
EOF
read x
[ -d project ] || mkdir project
cat >project/.${LABEL}.cfg <<EOF
#
# Configuration file for repository $(basename $REPOSITORY)
# You have to set DISTRIBUTION and VERSION at least"
#
ORIGIN="${ORIGIN}"
LABEL="${LABEL}"
DISTRIBUTION="${DISTRIBUTION}"
CODENAME="${CODENAME}"
VERSION="${VERSION}"
DESCRIPTION="${DESCRIPTION}"
ARCHITECTURES="${ARCH}"
GPGKEY="${GPGKEY}"
GZIP="${GZIP}"
BZIP2="${BZIP2}"
MD5SUMS="${MD5SUMS}"
SHA1SUMS="${SHA1SUMS}"
SHA256SUMS="${SHA256SUMS}"
SHA512SUMS="${SHA512SUMS}"
LINK="true"
EOF
[ -x /bin/nano ] && nano project/.${LABEL}.cfg
fi
. ./project/.${LABEL}.cfg
[ -z "${LABEL}" ] && error "no label" 1
[ -z "${DISTRIBUTION}" ] && error "no distribution" 1
[ -z "${VERSION}" ] && error "no version" 1
[ -z "${DESCRIPTION}" ] && error "no description" 1
[ -z "${ARCHITECTURES}" ] && error "no architectures" 1
[ -z "${CODENAME}" ] && CODENAME=${DISTRIBUTION}
if [ -d "${CODENAME}" ]
then
[ -L ${DISTRIBUTION} ] && rm -f ${DISTRIBUTION}
[ -z PACKAGES="$(find ${CODENAME} -name *.deb)" ] && error "no binary packages found" 1
[ -z SOURCES="$(find ${CODENAME} -name *.dsc)" ] && error "no source packages found" 1
else
error "not a directory: ${CODENAME}" 1
fi
echo "## origin: ${ORIGIN}"
echo "## architectures: ${ARCHITECTURES}"
echo "## processing archive: ${DISTRIBUTION} (Codename: ${CODENAME}, Version: ${VERSION})"
make_packages_and_sources
make_release
rm -rf dists
mv .dists.tmp dists
if [ "${CODENAME}" != "${DISTRIBUTION}" ]
then
cd dists
if [ ! -e ${DISTRIBUTION} ]
then
echo "## creating link ${DISTRIBUTION} to ${CODENAME}"
ln -s ${CODENAME} ${DISTRIBUTION}
fi
cd ..
fi
if [ -e .dists.old ] && [ $(ls .dists.old/ | wc -l) != 0 ]
then
cd dists
if [ "${LINK}" = "true" ]
then
echo "## making links to older distributions"
ln -s ../.dists.old/* .
else
echo "## copying older distributions"
cp -aR ../.dists.old/* .
fi
cd ..
fi
echo "## ready"
exit 0
#EOF
Reply to: