summaryrefslogtreecommitdiffstats
path: root/source/d/slacktrack/slacktrack-project/scripts/slackdtxt
blob: a32bf690f4140352c83235c18e63e24a7d278766 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#!/bin/bash
#
# Copyright 2002, 2009   Stuart Winter, Surrey, England, United Kingdom.
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
##################################################################################
# Program: slackdtxt
# Purpose: Create package-ver-arch-build.txt files from slack-desc files.
#          For use after running a SlackBuild script - you do not need to
#          use this program for a package produced by slacktrack -- use its
#          -c switch instead.
# Author : Stuart Winter <mozes@slackware.com>
# Date...: 24-Sep-2011
# Version: 1.05
#################################################################################
# History
##########
# 24-Sep-2011 - v1.05
#             * Look for 'install/slack-desc' and './install/slack-desc'
#               in the packages.  This provides support for malformed packages 
#               that have not been created with the Slackware 'makepkg' command.
#               Thanks to Helmut Hullen for the suggestion.
# 15-May-2009 - v1.04
#             * Adjust to handle .tgz, .tbz, .tlz, .txz file extensions/
#               compression formats.
# 04-Sep-2008 - v1.03
#             * Display the filename of the .tgz being processed.
#             * .txt files now use the time stamp of the corresponding .tgz
#             * New default: only create a .txt or sign a package if there
#               isn't an existing .txt or .asc *or* the .txt's time stamp
#               isn't the same as the .tgz's.
#             * Fixed bug where the gpg signing key wasn't being picked up
#               at the command line.
#             * Always wipe temp file when exiting
#             * A GPG signing key must be specified -- it will not fall back
#               on the default.  This is because the code to check check the
#               command line operators doesn't work.  I checked the supplied
#               examples for getopt and even they don't work!
# 28-Sep-2003 - v1.02
#             * Added option -G, --gpg-sign to sign the .tgz package
#               (Patch from Emanuele Vicentini)
#             * Removed -t option.  You may now do specify the file after
#               as before (but without -t) or specify more than one package
#               at once: eg  slackdtxt *.tgz
# 11-Jul-2003 - v1.01
#             * Fixed problem with checking the exit code from getopt.
#               (reported by Emanuele Vicentini).
# 02-Mar-2003 - v1.00
#             * Created
##################################################################################

# Program name
PROGNAME=slackdtxt

# Version
VERSION="${PROGNAME} v1.03 by Stuart Winter <mozes@slackware.com>"

# Temporary store for the slack-desc file
DESCTMPFILE="/var/tmp/$$.slackdtxt.desc.$$"

trap "rm -f $DESCTMPFILE" EXIT

############################## Functions###################################
function display_usage () {
printf "Usage: ${PROGNAME} [options] <package file/list of package files>\n"
if [ ! -z "$1" ]; then
   echo "Use $( basename $0 ) --help for a list of options"
fi
}

function display_help () {
printf "${VERSION}\n\n$(display_usage)

Startup:
 -h,   --help                   Display this help
 -v,   --version                Display version information

Main options:
 -s,   --slackdescfile <file>   'slack-desc' file (cannot be used when
                                specifying more than one package file)
 -d,   --destdir   <directory>  The directory in which to store the package
                                file & create the .txt description file within
                                Omitting this flag implies --nodelete
 -n,   --nodelete               Do not delete the original package file.
                                once moved into destination directory
 -G,   --gpg-sign <key id>      Sign the package with GnuPG
 -f,   --force                  Force creation of a .txt and GPG signing.
                                By default, .txt files are only created and 
                                packages signed if there is no existing .txt
                                or .asc file, or the .txt time stamps aren't
                                the same as the package's.
"
}

###############################################################################

############################## Configuration variables #########################
# These can be changed via the command line switches
#
DELETEPKG="Yes"
# By default, don't force signing nor creation of .txt files
FORCE=No
################################################################################

PARAMS="$( getopt -qn "$( basename $0 )" -o s:d:fnhvG: -l slackdescfile:,destdir:,nodelete,force,help,version,gpg-sign: -- "$@" )"
# If params are incorrect then
if [ $? -gt 0 ]; then display_help ; exit 2 ; fi
eval set -- "${PARAMS}"
for param in $*; do
  case "$param" in
     -s|--slackdescfile) SLACKDESCFILE="$2"
                         shift 2;;

     -d|--destdir)       DESTDIR="$2"
			 shift 2;;

     -n|--nodelete)      DELETEPKG="No"
                         shift 1;;
   
     -f|--force)         FORCE="Yes"
                         shift 1;;

     -G|--gpg-sign)      SIGNPACKAGE="Yes"
                         SIGNINGKEY="$2"
                         shift 2 ;;

     -h|--help)          display_help ; exit ;;

     -v|--version)       printf "${VERSION}\n" ; exit;;   
 
     --) shift; break;;
  esac 
done

# Do we have the relevant information to proceed?
if [ -z "${1}" ]; then
   display_usage help
   exit 2
fi

# Do we have too *much* information to proceed?
if [ $# -gt 1 -a ! -z "${SLACKDESCFILE}" ]; then
   echo "Error: You cannot specify a slack-desc file when"
   echo "       specifying more than one package file"
   display_usage help
   exit 2
fi

# Let's check if user really has gpg.
if [ "${SIGNPACKAGE}" = "Yes" ]; then
   which gpg >/dev/null 2>&1 || { echo "${PROGNAME}: Warning: Cannot find gpg; disabling signature creation"; unset SIGNPACKAGE; }
fi

# Main loop, handle any number (well, not really but you know..)
# of package files specified at the command line.
for PKGFILE in $*; do

# If we were given a destination dir then check whether it exists
# Now giving a dest dir allows us to do
#  # for i in *.t?z ; do slackdtxt -t $i ; done
# and create .txt files for all the package files in a dir.
if [ ! -z "${DESTDIR}" ]; then
   DESTDIR="${DESTDIR}/" # otherwise when we tar without specifying a dest dir, it becomes /package-blah.tgz
   if [ ! -d "${DESTDIR}" ]; then
      echo "${PROGNAME}: ERROR: The destination directory does not exist"
      exit 6
   fi
  else
   DELETEPKG="No" # otherwise we'd delete our only copy
fi

# Does the specified package exist?
if [ ! -s "${PKGFILE}" ]; then
   echo "${PROGNAME}: ERROR: The specified package "${PKGFILE}" does not exist"
   exit 7
fi

# Does the specified slack-desc file exist ?
if [ ! -z "${SLACKDESCFILE}" ]; then
   if [ ! -s "${SLACKDESCFILE}" ]; then
      echo "${PROGNAME}: Warning: The specified slack-desc file ${SLACKDESCFILE} does not exist;"
      echo "                    will try and extract from the package."
      unset SLACKDESCFILE
  else
     # .. the file is fine.
     # copy the slack-desc file to the temp location so I don't have
     # to code around having the user specify one and having to take one
     # from the package then delete it.
     cp -f "${SLACKDESCFILE}" "${DESCTMPFILE}" 
     # .. but if copying it fails then we'll take it from the package anyway.
     if [ $? -gt 0 ]; then
        unset SLACKDESCFILE
      else
        SLACKDESCFILE="${DESCTMPFILE}" # we'll use the /var/tmp version now
     fi
  fi
fi
############################## Main program###################################

# Move the pakage file to the dest dir if we were given one
if [ ! -z "${DESTDIR}" ]; then
   echo -n "${PROGNAME}: Copying package to destination directory"
   cp -fa "${PKGFILE}" "${DESTDIR}"
   if [ $? -gt 0 ]; then
      printf "\n${PROGNAME}: ERROR: Failed to copy the package\n"
      exit 8
    else
      echo " ... done"
   fi
fi

# Test the copied package -- it probably isn't corrupt (eg no disk space on $DESTDIR)
# as the cp would have errored, but I'd like to check anyway
if [ ! -z "${DESTDIR}" ]; then
   echo -n "${PROGNAME}: Verifying the version of the package in the destination directory"
   tar ftz "${DESTDIR}$( basename ${PKGFILE} )" >/dev/null 2>&1
   if [ $? -gt 0 ]; then
      printf "\n${PROGNAME}: ERROR: The package in ${DESTDIR} is corrupt\n"
      exit 8
    else
      echo " ... done"
   fi
fi

# If we weren't given a slack-desc file then try and pull one from the
# package
if [ -z "${SLACKDESCFILE}" ]; then
   SLACKDESCFILE="${DESCTMPFILE}"
   echo    "${PROGNAME}: Processing $( basename ${PKGFILE} ) ..."
   echo -n "${PROGNAME}: Attempting to extract install/slack-desc from the package"
   # In case somebody's not used 'makepkg' (which uses tar-1.13) to create the package,
   # and tar has created the archive index with absolute path names.
   # (it's a malformed package in this case, but we may as well support it)
   tar fOx "${PKGFILE}" install/slack-desc ./install/slack-desc > "${SLACKDESCFILE}" 2>/dev/null
   if [ ! -s "${SLACKDESCFILE}" ]; then
      printf "\n${PROGNAME}: ERROR: Failed to extract the slack-desc file from the package\n"
      rm -f "${SLACKDESCFILE}" # it may be zero bytes/empty
      exit 8
    else
      echo " ... done"
   fi
fi

# Turn the slack-desc file into a .txt file;
# only if there isn't an existing .txt or the .txt is older than the package
# unless -f,--force is specified.
SLACKTXTFILE="${DESTDIR}$( echo $( basename $PKGFILE ) | rev | cut -d. -f2- | rev ).txt"
if [ $SLACKTXTFILE -ot $PKGFILE -o $SLACKTXTFILE -nt $PKGFILE -o "$FORCE" = "Yes" ]; then
   egrep -v '^($|#| *\|)' "${SLACKDESCFILE}" > $SLACKTXTFILE
   rm -f "${SLACKDESCFILE}"
   # Set the time stamp to that of the package:
   touch -r $PKGFILE $SLACKTXTFILE
   echo "${PROGNAME}: $SLACKTXTFILE created"
 else
   echo "${PROGNAME}: Not created .txt - is same age as package (use -f to override)"
fi

# Let's sign the original package with user's gpg key
if [ ! -z "${SIGNPACKAGE}" ]; then
# If the .asc is the same time stamp as the package, don't sign unless
# forced.
   if [ ${DESTDIR}${PKGFILE}.asc -ot $PKGFILE -o ${DESTDIR}${PKGFILE}.asc -nt $PKGFILE -o "$FORCE" = "Yes" ]; then
      echo -n "${PROGNAME}: signing ${PKGFILE} with ${SIGNINGKEY:-your default} key"
      GPG_OPTIONS="--detach-sign --armor --yes"
      if [ "${SIGNINGKEY}" ]; then
         GPG_OPTIONS="${GPG_OPTIONS} --local-user $SIGNINGKEY"
      fi
      gpg ${GPG_OPTIONS} --output ${DESTDIR}${PKGFILE}.asc ${PKGFILE}
      if [ $? -ne 0 ]; then
         echo "${PROGNAME}: ERROR: Signature has not been correctly generated"
        else
         echo " ... done"
         # Set time stamp to that of the package:
         touch -r $PKGFILE ${DESTDIR}${PKGFILE}.asc
      fi
    else
      echo "${PROGNAME}: Not signed package - is same age as package (use -f to override)"   
  fi
fi

# Delete the package ?
if [ "${DELETEPKG}" = "Yes" ]; then
   echo -n "${PROGNAME}: Deleting the original package"
   rm -f "${PKGFILE}"
   if [ $? -gt 0 ]; then
      printf "\n${PROGNAME}: Warning: unable to delete package\n"
    else
      echo " ... done"
   fi
fi

unset SLACKDESCFILE

# Exit from main loop
done