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
|