On Tue, May 17, 2005 at 19:35:22 +0200, maximilian attems wrote:
> On Tue, 17 May 2005, Tino Keitel wrote:
> 
> > On Sat, May 14, 2005 at 18:23:27 +0200, maximilian attems wrote:
> > > hello tino,
> > > 
> > > thanks for your patch,
> > > i had a look at it, but got mad with all the
> > > "x$foo" = "xtrue" and reworked it a bit.

This broke all tests using [ -n $foo ], I corrected it in the attached
patch. It's a diff against 0.1.79.

[...]

> > > could you please give it some more testing.
> > > in the cleanup version i might push into the initrd-tools.
> > > if i get postive feedback.
> > 
> > I tested my original patch with interactive password request. It would
> > be nice if someone could test it with keyfiles and/or keyscripts (I'll
> > try to test keyfile support if I find some time for it).
> > 
> > Regards,
> > Tino
> well if you don't give it some runs,
> and correct it if it does work out,
> i don't know how it would reach sarge.
> 
> as it seems we are doing one last initrd-tools round.
> no i don't have the time or the usage habit of testing cryptsetup.

I tested the attached patch with interactive passwort request as well
as with a key file. It doesn't make much sense to store the key in the
initrd but it could also be read from a USB storage device (which could
be mounted via /keyscripts supplied by the user, but as I can not find
any documentation for /keyscripts, I didn't try this). Anyway, it
worked without problems.

I also tested the error handling with invalid lines in /etc/crypttab
and it looks good. Error messages are now a bit more descriptive, too.

Another change is that I removed the portion in the previous patch
which only removed a blank line.

Regards,
Tino
Only in initrd-tools-0.1.79/debian: files
Only in initrd-tools-0.1.79/debian: initrd-tools
diff -ru initrd-tools-0.1.79_orig/mkinitrd initrd-tools-0.1.79/mkinitrd
--- initrd-tools-0.1.79_orig/mkinitrd   2005-05-13 11:42:47.000000000 +0200
+++ initrd-tools-0.1.79/mkinitrd        2005-05-19 16:24:57.000000000 +0200
@@ -323,6 +323,66 @@
        fi
 }
 
+dmcrypt_parse_crypttab() {
+    TABFILE=/etc/crypttab
+
+    egrep "^$dmname" $TABFILE | while read dst src key opt ; do
+       if [ -n "$key" ] && [ "$key" != "none" ]; then
+           INTERACTIVE="no"
+       else
+           INTERACTIVE="yes"
+       fi
+
+       PARAMS=""
+
+       # Parse the options field, convert to cryptsetup parameters
+       # and contruct the command line
+       while [ -n "$opt" ] ; do
+           ARG=`echo $opt | sed "s/,.*//"`
+           opt=${opt##$ARG}
+           opt=${opt##,}
+           PARAM=`echo $ARG | sed "s/=.*//"`
+           VALUE=${ARG##$PARAM=}
+
+           case "$PARAM" in
+               cipher)
+                   PARAM=-c
+                   if [ ! -n "$VALUE" ] ; then
+                       echo "No value for cipher option in /etc/crypttab." >&2
+                       exit 1
+                   fi
+                   ;;
+               size)
+                   PARAM=-s
+                   if [ ! -n "$VALUE" ] ; then
+                       echo "No value for size option in /etc/crypttab." >&2
+                       exit 1
+                   fi
+                   ;;
+               hash)
+                   PARAM=-h
+                   if [ ! -n "$VALUE" ] ; then
+                       echo "No value for hash option in /etc/crypttab." >&2
+                       exit 1
+                   fi
+                   ;;
+               verify)
+                   PARAM=-y
+                   VALUE=""
+                   ;;
+               esac
+
+           PARAMS="$PARAMS $PARAM $VALUE"
+       done
+
+       if [ "$INTERACTIVE" = "yes" ] ; then
+           echo "$PARAMS"
+       else
+           echo "$PARAMS -d $key"
+       fi
+    done
+}
+
 dmcrypt() {
        local cipher_mode devname submajor subminor
        
@@ -341,6 +401,8 @@
                exit 1
        fi
        
+       export dmname
+       cryptcmd=`dmcrypt_parse_crypttab`
        eval "$(stat -c 'submajor=$((0x%t)); subminor=$((0x%T))' $(readlink -f 
"$devname"))"
        
        if [ $submajor != $(dmsetup deps $dmname | sed 's/^.*(\([0-9]*\), 
\([0-9]*\))$/\1/') \
@@ -365,6 +427,7 @@
 export device
 export dmname="$dmname"
 export cipher_mode="$cipher_mode"
+export cryptcmd="$cryptcmd"
 for i in /keyscripts/*; do
        [ -f "\$i" ] || continue
        case "\$i" in
@@ -377,7 +440,7 @@
        esac
 done
 [ -b /dev/mapper/\$dmname ] || \\
-       /sbin/cryptsetup -c \$cipher_mode create \$dmname \$device
+       /sbin/cryptsetup \$cryptcmd create \$dmname \$device
 
 umount -n dev2
 EOF

Reply via email to