blog post about using mini-dinstall on people.d.o
authorStefano Zacchiroli <zack@upsilon.cc>
Fri, 24 Apr 2009 12:23:48 +0000 (14:23 +0200)
committerStefano Zacchiroli <zack@upsilon.cc>
Fri, 24 Apr 2009 12:23:48 +0000 (14:23 +0200)
blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput.mdwn [new file with mode: 0644]
blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/dinstall-people.d.o [new file with mode: 0644]
blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-release.sh [new file with mode: 0644]
blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-remote [new file with mode: 0644]

diff --git a/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput.mdwn b/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput.mdwn
new file mode 100644 (file)
index 0000000..fb02fa2
--- /dev/null
@@ -0,0 +1,134 @@
+[[!meta date="2009-04-24 14:30:15 +0200"]]
+# dput + mini-dinstall to ease people.d.o uploads
+
+As DDs we often want to offer *unofficial* packages, but still
+preserving a bit of "authoritativeness". A widespread solution is to
+upload somewhere under <http://people.debian.org/~LOGIN> as an APT
+repository.
+
+I've been using that solution too since ... ever, but I've never been
+happy about how to advertise the packages, probably just because I've
+never liked `dpkg-scan{packages,sources}` and hackish scripts built on
+top of them. My goal, as simple as it can be, is to work as I do to
+prepare "real" packages to be uploaded to the Debian archive, and just
+upload to people.d.o as the final step.
+
+Thanks to DSA which satisfied a request of mine by installing a while
+ago [mini-dinstall](http://packages.debian.org/sid/mini-dinstall) on
+ravel, today I've finally set up a work-flow that enabled me to reach
+my goal. This post is a quick howto to implement that setup.
+
+If you have suggestions about where (wiki.d.o? devref?) to paste these
+info so that other DDs can more easily find them in the future, please
+let me know, via comments or mailing me.
+
+## Step 1: configure mini-dinstall on people.debian.org
+
+On people.debian.org, create a ~/.mini-dinstall.conf file containing
+something like the following:
+
+        [DEFAULT]
+        mail_to = zack
+        incoming_permissions = 0750
+        architectures = all, i386, amd64
+        archive_style = flat
+        dynamic_reindex = 1
+        archivedir = /home/zack/public_html/debian/
+        generate_release = 1
+        release_origin = Zack
+        release_label = Zack
+        release_description = Unofficial Debian packages maintained by Stefano Zacchiroli
+        
+        [zack-unstable]
+        release_suite = zack-unstable
+
+
+Highlights of that conf:
+
+* "flat" archive style means "all in one dir", a more structured
+  alternative is "simple-subdir"
+* you request to generate a `Release` file, which is needed for the
+  secure APT machinery; various fields of that file are specified by
+  the `release_*` options
+* you call your suite "zack-unstable" (well, I do :-) ). That suite
+  must match the distribution in your `debian/changelog` entries. In
+  theory you can use legacy names such as "unstable", but as we are
+  humans and we make mistakes, better to use invalid suite names that
+  will be refused by dak if you upload to the wrong queue
+
+The resulting repository will be accessible using the following
+`/etc/apt/sources.list` lines:
+
+        deb http://people.debian.org/~zack/debian zack-unstable/
+        deb-src http://people.debian.org/~zack/debian zack-unstable/
+
+## Step 2: configure dput
+
+The default incoming dir of mini-dinstall, relative to the configured
+archivedir, is `mini-dinstall/incoming`. The following entry for your
+`~/.dput.cf` (on the machine you upload from) will therefore setup
+your [dput](http://packages.debian.org/sid/dput) for uploads:
+
+        [people.debian.org]
+        fqdn = people.debian.org
+        method = scp
+        login = *
+        incoming = /home/zack/public_html/debian/mini-dinstall/incoming
+        post_upload_command = ssh people.debian.org mini-dinstall -b
+
+The only interesting detail here is the post upload command, which
+will run a "pulse" of mini-dinstall on people.d.o just after the
+upload, to process the uploaded file. Alternatively, you can leave
+mini-dinstall running on people.d.o, but I consider it unnecessary
+(because usually you are the only one able to upload to your home
+dir), unelegant, and complicated (because you then need to verify
+mini-dinstall is running).
+
+## Step 3: enjoy (i.e., upload)
+
+Now you can prepare your packages as you always do (which means using
+[cowbuilder](http://packages.debian.org/sid/cowbuilder)!) and, when
+you are done with your `foo_1.0-1_amd64.changes`, upload it doing:
+
+        $ dput people.debian.org foo_1.0-1_amd64.changes
+
+## Signing the Release file
+
+The above setup does not sign `Release` files, which means your APT
+users will receive complaints from the secure APT machinery. To fix
+that you must sign the `Release` file with some key and distribute the
+key to your users to be processed by `apt-key add`.
+
+You have a couple of ways to sign the release file automatically:
+
+1. <small>(/me doesn't like this)</small> use a GPG key created for
+  the occasion, store that key (including the private part) on
+  people.d.o, and use the mini-dinstall contrib script
+  [[sign-release.sh]] by adding something like the following to your
+  `mini-dinstall.conf`:
+
+          release_signscript = ~/bin/sign-release.sh
+
+2. <small>(/me likes this)</small> use some script to sign the Release
+  file remotely and send the resulting deatched sig back to people.d.o
+  just after the mini-dinstall pulse. To achieve that, the most
+  elegant way would be to fix debsign wishlist
+  [#465240](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=465240)
+  (volunteers? :-) ). As I'm lazy, I'm using my own [[sign-remote]]
+  script, which is a bit more generic.
+  
+  Unfortunately, to hook into dput post upload hook mechanism, you
+  need an indirection script because I failed to make dput like
+  ";"-separated shell commands. All in all, here is my actual
+  `~/.dput.cf` stanza:
+
+          [people.debian.org]
+          fqdn = people.debian.org
+          method = scp
+          login = *
+          incoming = /home/zack/public_html/debian/mini-dinstall/incoming
+          post_upload_command = /home/zack/bin/dinstall-people.d.o
+
+  with [[dinstall-people.d.o]] being rather trivial.
+
+[[!tag lang/english planet/debian howto debian]]
diff --git a/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/dinstall-people.d.o b/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/dinstall-people.d.o
new file mode 100644 (file)
index 0000000..8177006
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/bash
+echo "I: running mini-dinstall on the remote host ..."
+ssh people.debian.org mini-dinstall -b
+sign-remote people.debian.org:~/public_html/debian/zack-unstable/Release
diff --git a/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-release.sh b/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-release.sh
new file mode 100644 (file)
index 0000000..a3a8331
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/bash
+# -*- coding: utf-8 -*-
+# Sample script to GPG sign Release files
+# Copyright © 2002 Colin Walters <walters@debian.org>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+# Usage:
+
+# You need to create a secret keyring (secring.gpg).  You can use your
+# existing one, or create a new one by doing something like the
+# following:
+
+# $ GNUPGHOME=/src/debian/mini-dinstall/s3kr1t gnupg --gen-key
+
+set -e
+
+# User variables
+# MAKE SURE TO MAKE THIS DIRECTORY 0700!
+export GNUPGHOME=/src/debian/mini-dinstall/s3kr1t
+if [ ! -d "$GNUPGHOME" ]; then
+  mkdir -p "$GNUPGHOME"
+fi
+if [ -z "$USER" ]; then
+    USER=$(id -n -u)
+fi
+# This is just a default value
+KEYID=$(getent passwd $USER | cut -f 5 -d : | cut -f 1 -d ,)
+PASSPHRASE=$(cat "$GNUPGHOME/passphrase")
+
+# These should fail if for some reason the directory isn't owned by us
+chown "$USER" "$GNUPGHOME"
+chmod 0700 "$GNUPGHOME"
+
+# Initialize GPG
+gpg --help 1>/dev/null 2>&1 || true
+
+rm -f Release.gpg.tmp
+echo "$PASSPHRASE" | gpg --no-tty --batch --passphrase-fd=0 --default-key "$KEYID" --detach-sign -o Release.gpg.tmp "$1"
+mv Release.gpg.tmp Release.gpg
diff --git a/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-remote b/blog/posts/2009/04/howto:_uploading_to_people.d.o_using_dput/sign-remote
new file mode 100644 (file)
index 0000000..f49af78
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# Copyright © 2009 Stefano Zacchiroli <zack@upsilon.cc>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+if [ -z "$1" ] ; then
+    echo "Usage: sign-remote HOSTNAME:PATH"
+    exit 2
+fi
+url="$1"
+host=$(echo "$url" | cut -f 1 -d':')
+path=$(echo "$url" | cut -f 2 -d':')
+base=$(dirname "$path")
+if [ -z "$host" -o -z "$path" ] ; then
+    echo "Malformed remote \"URL\", must follow the \"HOSTNAME:PATH\" convention."
+    exit 2
+fi
+
+tmp=`mktemp`
+sig="$tmp.gpg"
+trap "rm -f $tmp $sig" EXIT
+
+echo "I: retrieving file to sign from remote host ..."
+scp "$url" $tmp
+echo "I: signing ..."
+gpg --detach-sign --batch -o $sig $tmp
+echo "I: sending back signature ..."
+scp $sig "$host":"$path.gpg"
+echo "I: remote signing done."