]>
Commit | Line | Data |
---|---|---|
fcac2376 AM |
1 | #!/bin/bash |
2 | # | |
3 | # bacman: recreate a package from a running system | |
4 | # This script rebuilds an already installed package using metadata | |
5 | # stored into the pacman database and system files | |
6 | # | |
7 | # (c) 2008 - locci <carlocci_at_gmail_dot_com> | |
8 | # | |
9 | # This program is free software; you can redistribute it and/or modify | |
10 | # it under the terms of the GNU General Public License as published by | |
11 | # the Free Software Foundation; either version 2 of the License, or | |
12 | # (at your option) any later version. | |
13 | # | |
14 | # This program is distributed in the hope that it will be useful, | |
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | # GNU General Public License for more details. | |
18 | # | |
19 | # You should have received a copy of the GNU General Public License | |
20 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | # | |
22 | ||
23 | readonly progname="bacman" | |
24 | readonly progver="0.2.0" | |
25 | ||
26 | # | |
27 | # User Friendliness | |
28 | # | |
29 | function usage(){ | |
30 | echo "This program recreates a package using pacman's db and system files" | |
31 | echo "Usage: $progname <installed package name>" | |
32 | echo "Example: $progname kernel26" | |
33 | } | |
34 | ||
35 | if [ $# -ne 1 ] ; then | |
36 | usage | |
37 | exit 1 | |
38 | fi | |
39 | ||
40 | if [ "$1" = "--help" -o "$1" = "-h" ] ; then | |
41 | usage | |
42 | exit 0 | |
43 | fi | |
44 | ||
45 | if [ "$1" = "--version" -o "$1" = "-v" ]; then | |
46 | echo "$progname version $progver" | |
47 | echo "Copyright (C) 2008 locci" | |
48 | exit 0 | |
49 | fi | |
50 | ||
51 | # | |
52 | # Fakeroot support | |
53 | # | |
54 | if [ $EUID -gt 0 ]; then | |
55 | if [ -f /usr/bin/fakeroot ]; then | |
56 | echo "Entering fakeroot environment" | |
57 | export INFAKEROOT="1" | |
58 | /usr/bin/fakeroot -u -- $0 $1 | |
59 | exit $? | |
60 | else | |
61 | echo "WARNING: installing fakeroot or running ${progname} as root is required to" | |
62 | echo " preserve the ownership permissions of files in some packages" | |
63 | echo "" | |
64 | fi | |
65 | fi | |
66 | ||
67 | # | |
68 | # Setting environmental variables | |
69 | # | |
70 | if [ ! -r /etc/pacman.conf ]; then | |
71 | echo "ERROR: unable to read /etc/pacman.conf" | |
72 | exit 1 | |
73 | fi | |
74 | ||
75 | eval $(awk '/DBPath/ {print $1$2$3}' /etc/pacman.conf) | |
76 | pac_db="${DBPath:-/var/lib/pacman/}/local" | |
77 | ||
78 | if [ ! -r /etc/makepkg.conf ]; then | |
79 | echo "ERROR: unable to read /etc/makepkg.conf" | |
80 | exit 1 | |
81 | fi | |
82 | ||
83 | source "/etc/makepkg.conf" | |
84 | if [ -r ~/.makepkg.conf ]; then | |
85 | source ~/.makepkg.conf | |
86 | fi | |
87 | ||
88 | pkg_arch=${CARCH:-'unknown'} | |
89 | pkg_dest="${PKGDEST:-$PWD}" | |
90 | pkg_pkger=${PACKAGER:-'Unknown Packager'} | |
91 | ||
92 | pkg_name="$1" | |
93 | pkg_dir="$(echo $pac_db/$pkg_name-[0-9]*)" | |
94 | pkg_namver="${pkg_dir##*/}" | |
95 | ||
96 | # | |
97 | # Checks everything is in place | |
98 | # | |
99 | if [ ! -d "$pac_db" ] ; then | |
100 | echo "ERROR: pacman database directory ${pac_db} not found" | |
101 | exit 1 | |
102 | fi | |
103 | ||
104 | if [ ! -d "$pkg_dir" ] ; then | |
105 | echo "ERROR: package ${pkg_name} not found in pacman database" | |
106 | exit 1 | |
107 | fi | |
108 | ||
109 | # | |
110 | # Begin | |
111 | # | |
112 | echo Package: ${pkg_namver} | |
113 | work_dir=$(mktemp -d -p /tmp) | |
114 | cd $work_dir || exit 1 | |
115 | ||
116 | # | |
117 | # File copying | |
118 | # | |
119 | echo "Copying package files..." | |
120 | ||
121 | cat "$pkg_dir"/files | | |
122 | while read i; do | |
123 | if [ -z "$i" ] ; then | |
124 | continue | |
125 | fi | |
126 | ||
127 | if [[ "$i" =~ %[A-Z]*% ]] ; then | |
128 | current=$i | |
129 | continue | |
130 | fi | |
131 | ||
132 | case $current in | |
133 | %FILES%) | |
134 | ret=0 | |
135 | if [ -e "/$i" ]; then | |
136 | bsdtar -cnf - "/$i" 2> /dev/null | bsdtar -xpf - | |
137 | ||
138 | # Workaround to bsdtar not reporting a missing file as an error | |
139 | if [ ! -e "$work_dir"/"$i" ]; then | |
140 | echo "" | |
141 | echo "ERROR: unable to add /$i to the package" | |
142 | echo " If your user does not have permssion to read this file then" | |
143 | echo " you will need to run $progname as root" | |
144 | rm -rf $work_dir | |
145 | exit 1 | |
146 | fi | |
147 | else | |
148 | echo "" | |
149 | echo "WARNING: package file /$i is missing" | |
150 | echo "" | |
151 | fi | |
152 | ||
153 | ||
154 | ;; | |
155 | esac | |
156 | done | |
157 | ||
158 | ret=$? | |
159 | if [ $ret -ne 0 ]; then | |
160 | rm -rf $work_dir | |
161 | exit 1 | |
162 | fi | |
163 | ||
164 | pkg_size=$(du -sk | awk '{print $1 * 1024}') | |
165 | ||
166 | if [ -f "$pkg_dir/install" ] ; then | |
167 | cp "$pkg_dir/install" "$work_dir/.INSTALL" | |
168 | fi | |
169 | if [ -f $pkg_dir/changelog ] ; then | |
170 | cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG" | |
171 | fi | |
172 | ||
173 | # | |
174 | # .PKGINFO stuff | |
175 | # | |
176 | echo Generating .PKGINFO metadata... | |
177 | echo "# Generated by $progname $progver" > .PKGINFO | |
178 | if [ "$INFAKEROOT" = "1" ]; then | |
179 | echo "# Using $(fakeroot -v)" >> .PKGINFO | |
180 | fi | |
181 | echo "# $(LC_ALL=C date)" >> .PKGINFO | |
182 | echo "#" >> .PKGINFO | |
183 | ||
184 | cat "$pkg_dir"/{desc,files,depends} | | |
185 | while read i; do | |
186 | if [[ -z "$i" ]]; then | |
187 | continue; | |
188 | fi | |
189 | ||
190 | if [[ "$i" =~ %[A-Z]*% ]] ; then | |
191 | current=$i | |
192 | continue | |
193 | fi | |
194 | ||
195 | case "$current" in | |
196 | # desc | |
197 | %NAME%) | |
198 | echo "pkgname = $i" >> .PKGINFO | |
199 | ;; | |
200 | %VERSION%) | |
201 | echo "pkgver = $i" >> .PKGINFO | |
202 | ;; | |
203 | %DESC%) | |
204 | echo "pkgdesc = $i" >> .PKGINFO | |
205 | ;; | |
206 | %URL%) | |
207 | echo "url = $i" >> .PKGINFO | |
208 | ;; | |
209 | %LICENSE%) | |
210 | echo "license = $i" >> .PKGINFO | |
211 | ;; | |
212 | %ARCH%) | |
213 | echo "arch = $i" >> .PKGINFO | |
214 | ;; | |
215 | %BUILDDATE%) | |
216 | echo "builddate = $(date -u "+%s")" >> .PKGINFO | |
217 | ;; | |
218 | %PACKAGER%) | |
219 | echo "packager = $pkg_pkger" >> .PKGINFO | |
220 | ;; | |
221 | %SIZE%) | |
222 | echo "size = $pkg_size" >> .PKGINFO | |
223 | ;; | |
224 | %GROUPS%) | |
225 | echo "group = $i" >> .PKGINFO | |
226 | ;; | |
227 | %REPLACES%) | |
228 | echo "replaces = $i" >> .PKGINFO | |
229 | ;; | |
230 | %FORCE%) | |
231 | echo "force = true" >> .PKGINFO | |
232 | ;; | |
233 | ||
234 | # files | |
235 | %BACKUP%) | |
236 | # strip the md5sum after the tab | |
237 | echo "backup = ${i%%$'\t'*}" >> .PKGINFO | |
238 | ;; | |
239 | ||
240 | # depends | |
241 | %DEPENDS%) | |
242 | echo "depend = $i" >> .PKGINFO | |
243 | ;; | |
244 | %OPTDEPENDS%) | |
245 | echo "optdepend = $i" >> .PKGINFO | |
246 | ;; | |
247 | %CONFLICTS%) | |
248 | echo "conflict = $i" >> .PKGINFO | |
249 | ;; | |
250 | %PROVIDES%) | |
251 | echo "provides = $i" >> .PKGINFO | |
252 | ;; | |
253 | esac | |
254 | done | |
255 | ||
256 | # | |
257 | # Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL | |
258 | # | |
259 | chown root:root $work_dir/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null | |
260 | chmod 644 $work_dir/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null | |
261 | ||
262 | # | |
263 | # Generate the package | |
264 | # | |
265 | echo "Generating the package..." | |
266 | ||
267 | ret=0 | |
268 | bsdtar -czf "$pkg_dest/$pkg_namver-$pkg_arch.tar.gz" $(ls -A) || ret=$? | |
269 | if [ $ret -ne 0 ]; then | |
270 | echo "ERROR: unable to write package to $pkg_dest" | |
271 | echo " Maybe the disk is full or you do not have write access" | |
272 | rm -rf $work_dir | |
273 | exit 1 | |
274 | fi | |
275 | ||
276 | rm -rf $work_dir | |
277 | ||
278 | echo Done | |
279 | ||
280 | exit 0 | |
281 | ||
282 | # vim: set ts=2 sw=2 noet: |