Sat, 21 Feb 2009 16:39:01 +0100
Patch gnupg and its dependency gcrypt to accept use of the IDEA cipher.
This effort seems to be flawed, as runtime tests of generating a
revokation certificate for a IDEA encrypted key were inconclusive.
Suspicion rests on a flawed implementation or patch logic.
michael@13 | 1 | #!@l_prefix@/lib/openpkg/bash |
michael@13 | 2 | ## |
michael@13 | 3 | ## lsync -- Access Layer Synchronization Tool |
michael@13 | 4 | ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> |
michael@13 | 5 | ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> |
michael@13 | 6 | ## |
michael@13 | 7 | ## Permission to use, copy, modify, and distribute this software for |
michael@13 | 8 | ## any purpose with or without fee is hereby granted, provided that |
michael@13 | 9 | ## the above copyright notice and this permission notice appear in all |
michael@13 | 10 | ## copies. |
michael@13 | 11 | ## |
michael@13 | 12 | ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
michael@13 | 13 | ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
michael@13 | 14 | ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
michael@13 | 15 | ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
michael@13 | 16 | ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
michael@13 | 17 | ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
michael@13 | 18 | ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
michael@13 | 19 | ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
michael@13 | 20 | ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
michael@13 | 21 | ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
michael@13 | 22 | ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
michael@13 | 23 | ## SUCH DAMAGE. |
michael@13 | 24 | ## |
michael@13 | 25 | |
michael@13 | 26 | ## |
michael@13 | 27 | ## filesystem hierarchy configuration |
michael@13 | 28 | ## |
michael@13 | 29 | |
michael@13 | 30 | # program name and version/date |
michael@13 | 31 | progname="lsync" |
michael@13 | 32 | progvers="1.0.4" |
michael@13 | 33 | progdate="04-Aug-2001" |
michael@13 | 34 | |
michael@13 | 35 | # root directory |
michael@13 | 36 | # (if empty, .lsyncrc files provide default) |
michael@13 | 37 | root="" |
michael@13 | 38 | |
michael@13 | 39 | # subdirectory where packages are physically installed |
michael@13 | 40 | pkgdir="PKG" |
michael@13 | 41 | |
michael@13 | 42 | # subdirectories which are synchronized between physically |
michael@13 | 43 | # installed package areas and access layer |
michael@13 | 44 | subdirs="bin,sbin,man,info,include,lib" |
michael@13 | 45 | |
michael@13 | 46 | ## |
michael@13 | 47 | ## command line option parsing |
michael@13 | 48 | ## |
michael@13 | 49 | |
michael@13 | 50 | # default run-time modes |
michael@13 | 51 | nop=0 |
michael@13 | 52 | quiet=0 |
michael@13 | 53 | trace=0 |
michael@13 | 54 | help='' |
michael@13 | 55 | init=0 |
michael@13 | 56 | uninstall=0 |
michael@13 | 57 | local=0 |
michael@13 | 58 | |
michael@13 | 59 | # be aware of .lsyncrc files |
michael@13 | 60 | cwd=`pwd` |
michael@13 | 61 | while [ 1 ]; do |
michael@13 | 62 | if [ -f "$cwd/.lsyncrc" ]; then |
michael@13 | 63 | set -- `cat $cwd/.lsyncrc` "$@" |
michael@13 | 64 | fi |
michael@13 | 65 | [ ".$cwd" = ./ ] && break |
michael@13 | 66 | cwd=`echo $cwd | sed -e 's;/[^/]*$;;' -e 's;^$;/;'` |
michael@13 | 67 | done |
michael@13 | 68 | if [ ".$HOME" != . -a -f "$HOME/.lsyncrc" ]; then |
michael@13 | 69 | set -- `cat $HOME/.lsyncrc` "$@" |
michael@13 | 70 | fi |
michael@13 | 71 | |
michael@13 | 72 | # iterate over argument line |
michael@13 | 73 | for opt |
michael@13 | 74 | do |
michael@13 | 75 | case $opt in |
michael@13 | 76 | -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
michael@13 | 77 | *) arg='' ;; |
michael@13 | 78 | esac |
michael@13 | 79 | case $opt in |
michael@13 | 80 | -n|--nop ) nop=1 ;; |
michael@13 | 81 | -q|--quiet ) quiet=1 ;; |
michael@13 | 82 | -t|--trace ) trace=1 ;; |
michael@13 | 83 | -v|--version ) version=1 ;; |
michael@13 | 84 | -h|--help ) help="Usage" ;; |
michael@13 | 85 | -i|--init ) init=1 ;; |
michael@13 | 86 | -u|--uninstall ) uninstall=1 ;; |
michael@13 | 87 | -l|--local ) local=1 ;; |
michael@13 | 88 | --root=* ) root=$arg ;; |
michael@13 | 89 | --pkgdir=* ) pkgdir=$arg ;; |
michael@13 | 90 | --subdirs=* ) subdirs=$arg ;; |
michael@13 | 91 | * ) help="Invalid option \`$opt'"; break ;; |
michael@13 | 92 | esac |
michael@13 | 93 | done |
michael@13 | 94 | |
michael@13 | 95 | # error or usage message |
michael@13 | 96 | if [ ".$help" != . ]; then |
michael@13 | 97 | if [ ".$help" != ".Usage" ]; then |
michael@13 | 98 | echo "$progname:ERROR: $help" 1>&2 |
michael@13 | 99 | fi |
michael@13 | 100 | cat 1>&2 <<EOT |
michael@13 | 101 | Usage: $progname [options] |
michael@13 | 102 | |
michael@13 | 103 | Global options: |
michael@13 | 104 | --version, -v display tool version information |
michael@13 | 105 | --help, -h display usage information |
michael@13 | 106 | --init, -i create an initial directory hierarchy |
michael@13 | 107 | |
michael@13 | 108 | Run-time options: |
michael@13 | 109 | --nop, -n perform no filesystem operations |
michael@13 | 110 | --quiet, -q display no verbose messages |
michael@13 | 111 | --trace, -t display performed filesystem operations |
michael@13 | 112 | --local, -l process a local package area only |
michael@13 | 113 | --uninstall, -u uninstall all files |
michael@13 | 114 | |
michael@13 | 115 | Filesystem options: |
michael@13 | 116 | --root=DIR override root directory |
michael@13 | 117 | --pkgdir=DIR override package sub-directory |
michael@13 | 118 | --subdirs=DIR override synchronized sub-directories |
michael@13 | 119 | |
michael@13 | 120 | Current configuration: |
michael@13 | 121 | root directory: $root |
michael@13 | 122 | package root subdir: $pkgdir |
michael@13 | 123 | synchronized subdirs: $subdirs |
michael@13 | 124 | EOT |
michael@13 | 125 | if [ ".$help" != ".Usage" ]; then |
michael@13 | 126 | exit 2 |
michael@13 | 127 | else |
michael@13 | 128 | exit 0 |
michael@13 | 129 | fi |
michael@13 | 130 | fi |
michael@13 | 131 | |
michael@13 | 132 | # version information |
michael@13 | 133 | if [ ".$version" = .1 ]; then |
michael@13 | 134 | echo "$progname $progvers ($progdate)" |
michael@13 | 135 | exit 0 |
michael@13 | 136 | fi |
michael@13 | 137 | |
michael@13 | 138 | # make sure a root directory was found or specified |
michael@13 | 139 | if [ ".$root" = . ]; then |
michael@13 | 140 | echo "$progname:ERROR: no root directory specified!" 1>&2 |
michael@13 | 141 | echo "$progname:HINT: use --root=DIR option explicitly on command line" 1>&2 |
michael@13 | 142 | echo "$progname:HINT: or implicitly inside an .lsyncrc file in your home" 1>&2 |
michael@13 | 143 | echo "$progname:HINT: directory or in any parent directory." 1>&2 |
michael@13 | 144 | exit 3 |
michael@13 | 145 | fi |
michael@13 | 146 | |
michael@13 | 147 | ## |
michael@13 | 148 | ## helper functions |
michael@13 | 149 | ## |
michael@13 | 150 | |
michael@13 | 151 | display_hd () { |
michael@13 | 152 | if [ ".$headline" != . ]; then |
michael@13 | 153 | if [ ".$quiet" = .0 ]; then |
michael@13 | 154 | echo "$headline" |
michael@13 | 155 | fi |
michael@13 | 156 | headline='' |
michael@13 | 157 | fi |
michael@13 | 158 | } |
michael@13 | 159 | |
michael@13 | 160 | display_op () { |
michael@13 | 161 | if [ ".$quiet" = .0 ]; then |
michael@13 | 162 | echo " $@" |
michael@13 | 163 | fi |
michael@13 | 164 | } |
michael@13 | 165 | |
michael@13 | 166 | display_warning () { |
michael@13 | 167 | echo "$progname:WARNING: $*" 1>&2 |
michael@13 | 168 | } |
michael@13 | 169 | |
michael@13 | 170 | display_error () { |
michael@13 | 171 | echo "$progname:ERROR: $*" 1>&2 |
michael@13 | 172 | } |
michael@13 | 173 | |
michael@13 | 174 | perform_op () { |
michael@13 | 175 | if [ ".$trace" = .1 ]; then |
michael@13 | 176 | echo " \$ $@" |
michael@13 | 177 | fi |
michael@13 | 178 | if [ ".$nop" = .0 ]; then |
michael@13 | 179 | eval "$@" |
michael@13 | 180 | fi |
michael@13 | 181 | } |
michael@13 | 182 | |
michael@13 | 183 | ## |
michael@13 | 184 | ## main processing |
michael@13 | 185 | ## |
michael@13 | 186 | |
michael@13 | 187 | # extend a "man" subdir to a complete list with subdirs |
michael@13 | 188 | # in order to avoid special cases in the loop processing |
michael@13 | 189 | manex='' |
michael@13 | 190 | if [ ".$init" = .1 ]; then |
michael@13 | 191 | manex='man' |
michael@13 | 192 | fi |
michael@13 | 193 | for i in 1 2 3 4 5 6 7 8; do |
michael@13 | 194 | manex="$manex,man/man$i" |
michael@13 | 195 | done |
michael@13 | 196 | manex=`echo $manex | sed -e 's;^,;;'` |
michael@13 | 197 | subdirs=`echo $subdirs | sed -e "s;man;$manex;"` |
michael@13 | 198 | |
michael@13 | 199 | # special processing: create initial hierarchy |
michael@13 | 200 | if [ ".$init" = .1 ]; then |
michael@13 | 201 | if [ ! -d $root ]; then |
michael@13 | 202 | echo "creating $root" |
michael@13 | 203 | perform_op "mkdir $root" || exit 1 |
michael@13 | 204 | fi |
michael@13 | 205 | for subdir in $pkgdir `IFS=,; echo $subdirs`; do |
michael@13 | 206 | if [ ! -d "$root/$subdir" ]; then |
michael@13 | 207 | echo "creating $root/$subdir" |
michael@13 | 208 | perform_op "mkdir $root/$subdir" || exit 1 |
michael@13 | 209 | fi |
michael@13 | 210 | done |
michael@13 | 211 | exit 0 |
michael@13 | 212 | fi |
michael@13 | 213 | |
michael@13 | 214 | # make sure the root directory actually exists |
michael@13 | 215 | if [ ! -d "$root" ]; then |
michael@13 | 216 | display_warning "root directory \`$root' does not exist" |
michael@13 | 217 | exit 3 |
michael@13 | 218 | fi |
michael@13 | 219 | |
michael@13 | 220 | # if processing is restricted to a local package area, pre-determine its name |
michael@13 | 221 | if [ ".$local" = .1 ]; then |
michael@13 | 222 | realroot=`cd $root; pwd` |
michael@13 | 223 | realthis=`pwd` |
michael@13 | 224 | pkgname=`expr "$realthis" : "^$realroot/$pkgdir/\\([^/]*\\).*"` |
michael@13 | 225 | if [ ".$pkgname" = . ]; then |
michael@13 | 226 | display_error "you are not staying under a local package sub-directory" |
michael@13 | 227 | exit 3 |
michael@13 | 228 | fi |
michael@13 | 229 | fi |
michael@13 | 230 | |
michael@13 | 231 | # now perform the synchronization for each sub-directory... |
michael@13 | 232 | for subdir in `IFS=,; echo $subdirs`; do |
michael@13 | 233 | headline="$root/$subdir:" |
michael@13 | 234 | |
michael@13 | 235 | # make sure the subdir actually exists in the access layer |
michael@13 | 236 | if [ ! -d "$root/$subdir" ]; then |
michael@13 | 237 | display_warning "access layer directory \`$root/$subdir' does not exist" |
michael@13 | 238 | continue |
michael@13 | 239 | fi |
michael@13 | 240 | |
michael@13 | 241 | # |
michael@13 | 242 | # PASS 1: remove dangling symbolic links in access layer |
michael@13 | 243 | # |
michael@13 | 244 | |
michael@13 | 245 | # iterate over all symlinks in the access layer subdir |
michael@13 | 246 | for link in . `ls "$root/$subdir/" | sed -e "s;^$root/$subdir/*;;g"`; do |
michael@13 | 247 | test ".$link" = ".." && continue |
michael@13 | 248 | |
michael@13 | 249 | # determine the target file of the symlink |
michael@13 | 250 | target=`ls -l "$root/$subdir/$link" 2>/dev/null | sed -e 's;.*-> *;;'` |
michael@13 | 251 | if [ ".$target" = . ]; then |
michael@13 | 252 | display_warning "$root/$subdir/$link seems to be not a symbolic link" |
michael@13 | 253 | continue |
michael@13 | 254 | fi |
michael@13 | 255 | |
michael@13 | 256 | # (optionally) make sure that link target points into local package area |
michael@13 | 257 | if [ ".$local" = .1 -a .`expr $target : "../$pkgdir/$pkgname/.*"` = .0 ]; then |
michael@13 | 258 | continue |
michael@13 | 259 | fi |
michael@13 | 260 | |
michael@13 | 261 | # check whether link is valid, i.e., points to |
michael@13 | 262 | # an existing target file or directory |
michael@13 | 263 | if [ ".$uninstall" = .1 ] ||\ |
michael@13 | 264 | [ ! -f "$root/$subdir/$target" -a \ |
michael@13 | 265 | ! -d "$root/$subdir/$target" ]; then |
michael@13 | 266 | # target no longer exists, so remove dangling symlink |
michael@13 | 267 | display_hd |
michael@13 | 268 | display_op "remove: $link -> $target" |
michael@13 | 269 | perform_op "rm -f $root/$subdir/$link" |
michael@13 | 270 | fi |
michael@13 | 271 | done |
michael@13 | 272 | |
michael@13 | 273 | # if we are uninstalling only, our work is now done |
michael@13 | 274 | if [ ".$uninstall" = ".1" ]; then |
michael@13 | 275 | continue |
michael@13 | 276 | fi |
michael@13 | 277 | |
michael@13 | 278 | # |
michael@13 | 279 | # PASS 2: create new symbolic links in access layer |
michael@13 | 280 | # |
michael@13 | 281 | |
michael@13 | 282 | # calculate the corresponding reverse directory for the current subdir |
michael@13 | 283 | revdir=`echo $subdir | sed -e 's;[^/][^/]*;..;g'` |
michael@13 | 284 | |
michael@13 | 285 | # iterate over all package directories |
michael@13 | 286 | for dir in . `ls "$root/$pkgdir/" | sed -e "s;^$root/$pkgdir/*;;g"`; do |
michael@13 | 287 | test ".$dir" = ".." && continue |
michael@13 | 288 | |
michael@13 | 289 | # (optionally) make sure that we operate only for the local package area |
michael@13 | 290 | if [ ".$local" = .1 -a ".$dir" != ".$pkgname" ]; then |
michael@13 | 291 | continue |
michael@13 | 292 | fi |
michael@13 | 293 | |
michael@13 | 294 | # skip all directories with appended version numbers |
michael@13 | 295 | # in order to support manual versioning of packages |
michael@13 | 296 | case $dir in |
michael@13 | 297 | *-[0-9]* ) continue ;; |
michael@13 | 298 | esac |
michael@13 | 299 | |
michael@13 | 300 | # skip if package directory or package sub-directories has sticky bit set |
michael@13 | 301 | if [ ".`ls -l -d $root/$pkgdir/$dir 2>/dev/null | cut -c10`" = .t ] ||\ |
michael@13 | 302 | [ ".`ls -l -d $root/$pkgdir/$dir/$subdir 2>/dev/null | cut -c10`" = .t ]; then |
michael@13 | 303 | continue |
michael@13 | 304 | fi |
michael@13 | 305 | |
michael@13 | 306 | # check whether the processed subdir exists in package area |
michael@13 | 307 | if [ -d "$root/$pkgdir/$dir/$subdir" ]; then |
michael@13 | 308 | |
michael@13 | 309 | # iterate over all files/directories in package's subdir |
michael@13 | 310 | for file in . `ls "$root/$pkgdir/$dir/$subdir/" |\ |
michael@13 | 311 | sed -e "s;^$root/$pkgdir/$dir/$subdir/*;;g"`; do |
michael@13 | 312 | test ".$file" = ".." && continue |
michael@13 | 313 | |
michael@13 | 314 | # calculate the access layer symlink target |
michael@13 | 315 | target="$revdir/$pkgdir/$dir/$subdir/$file" |
michael@13 | 316 | |
michael@13 | 317 | # check whether a possibly conflicting symlink exists |
michael@13 | 318 | exlink=`ls -l $root/$subdir/$file 2>/dev/null` |
michael@13 | 319 | if [ ".$exlink" != . ]; then |
michael@13 | 320 | extarget=`echo $exlink | sed -e 's;.*-> *;;'` |
michael@13 | 321 | if [ ".$extarget" = . ]; then |
michael@13 | 322 | display_warning "$root/$subdir/$file exits, but seems to be not a symbolic link" |
michael@13 | 323 | elif [ ".$extarget" != ".$target" ]; then |
michael@13 | 324 | display_hd |
michael@13 | 325 | display_op "conflict: $file -> $extarget [existing]" |
michael@13 | 326 | display_op " $file -> $target [alternative]" |
michael@13 | 327 | fi |
michael@13 | 328 | continue |
michael@13 | 329 | fi |
michael@13 | 330 | |
michael@13 | 331 | # create new symlink in access layer |
michael@13 | 332 | display_hd |
michael@13 | 333 | display_op "create: $file -> $target" |
michael@13 | 334 | perform_op "cd $root/$subdir && ln -s $target $file" |
michael@13 | 335 | done |
michael@13 | 336 | fi |
michael@13 | 337 | done |
michael@13 | 338 | done |
michael@13 | 339 |