[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: