3 # Create an RPM for a webmin or usermin module or theme
5 $target_dir = "/tmp"; # where to copy the RPM to
7 if (-d "/usr/src/OpenLinux") {
8 $basedir = "/usr/src/OpenLinux";
11 $basedir = "/usr/src/redhat";
13 $licence = "Freeware";
15 $< = $>; # If running setuid
16 $ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin";
19 # Parse command-line args
21 local $a = &untaint(shift(@ARGV));
22 if ($a eq "--force-theme") {
25 elsif ($a eq "--rpm-dir") {
26 $basedir = &untaint(shift(@ARGV));
28 elsif ($a eq "--licence" || $a eq "--license") {
29 $licence = &untaint(shift(@ARGV));
31 elsif ($a eq "--rpm-depends") {
34 elsif ($a eq "--no-prefix") {
37 elsif ($a eq "--vendor") {
38 $vendor = &untaint(shift(@ARGV));
40 elsif ($a eq "--provides") {
41 $provides = &untaint(shift(@ARGV));
43 elsif ($a eq "--url") {
46 elsif ($a eq "--release") {
47 $release = &untaint(shift(@ARGV));
49 elsif ($a eq "--usermin") {
52 elsif ($a eq "--target-dir") {
53 $target_dir = &untaint(shift(@ARGV));
55 elsif ($a eq "--dir") {
56 $final_mod = &untaint(shift(@ARGV));
58 elsif ($a eq "--requires") {
59 push(@extrareqs, shift(@ARGV));
61 elsif ($a eq "--allow-overwrite") {
64 elsif ($a eq "--sign") {
67 elsif ($a =~ /^\-\-/) {
68 print STDERR "Unknown option $a\n";
83 print STDERR "usage: makemodulerpm.pl [--force-theme]\n";
84 print STDERR " [--rpm-dir directory]\n";
85 print STDERR " [--rpm-depends]\n";
86 print STDERR " [--no-prefix]\n";
87 print STDERR " [--vendor name]\n";
88 print STDERR " [--licence name]\n";
89 print STDERR " [--url url]\n";
90 print STDERR " [--provides provides]\n";
91 print STDERR " [--usermin]\n";
92 print STDERR " [--release number]\n";
93 print STDERR " [--target-dir directory]\n";
94 print STDERR " [--dir directory-in-package]\n";
95 print STDERR " [--allow-overwrite]\n";
96 print STDERR " <module> [version]\n";
99 chop($par = `/usr/bin/dirname $dir`);
100 $par = &untaint($par);
101 chop($source_mod = `/bin/basename $dir`);
102 $source_mod = &untaint($source_mod);
103 $source_dir = "$par/$source_mod";
104 $mod = $final_mod || $source_mod;
106 die "RPM directory $basedir does not exist";
108 if ($mod eq "." || $mod eq "..") {
109 die "directory must be an actual directory (module) name, not \"$mod\"";
111 $spec_dir = "$basedir/SPECS";
112 $rpm_source_dir = "$basedir/SOURCES";
113 $rpm_dir = "$basedir/RPMS/noarch";
114 $source_rpm_dir = "$basedir/SRPMS";
115 if (!-d $spec_dir || !-d $rpm_source_dir || !-d $rpm_dir) {
116 die "RPM directory $basedir is not valid";
119 # Is this actually a module or theme directory?
120 -d $source_dir || die "$dir is not a directory";
121 if (&read_file("$source_dir/module.info", \%minfo) && $minfo{'desc'}) {
122 $depends = join(" ", map { s/\/[0-9\.]+//; $_ }
123 grep { !/^[0-9\.]+$/ }
124 split(/\s+/, $minfo{'depends'}));
125 if ($minfo{'usermin'} && (!$minfo{'webmin'} || $force_usermin)) {
127 $desc = "Usermin module for '$minfo{'desc'}'";
132 $desc = "Webmin module for '$minfo{'desc'}'";
135 $iver = $minfo{'version'};
138 elsif (&read_file("$source_dir/theme.info", \%tinfo) && $tinfo{'desc'}) {
139 if ($tinfo{'usermin'} && (!$tinfo{'usermin'} || $force_usermin)) {
141 $desc = "Usermin theme '$tinfo{'desc'}'";
146 $desc = "Webmin theme '$tinfo{'desc'}'";
149 $iver = $tinfo{'version'};
154 die "$source_dir does not appear to be a webmin module or theme";
156 $prefix = "" if ($no_prefix);
157 $ucprog = ucfirst($prog);
158 $ver ||= $iver; # Use module.info version, or 1
161 # Copy the directory to a temp location for tarring
162 system("/bin/mkdir -p /tmp/makemodulerpm");
163 system("cd $par && /bin/cp -rpL $source_mod /tmp/makemodulerpm/$mod");
164 system("/usr/bin/find /tmp/makemodulerpm -name .svn | xargs rm -rf");
165 system("/usr/bin/find /tmp/makemodulerpm -name .xvpics | xargs rm -rf");
166 system("/usr/bin/find /tmp/makemodulerpm -name '*.bak' | xargs rm -rf");
167 system("/usr/bin/find /tmp/makemodulerpm -name '*~' | xargs rm -rf");
168 system("/usr/bin/find /tmp/makemodulerpm -name '*.rej' | xargs rm -rf");
169 system("/usr/bin/find /tmp/makemodulerpm -name core | xargs rm -rf");
170 system("/bin/chown -R root:bin /tmp/makemodulerpm/$mod");
172 # Tar up the directory
173 system("cd /tmp/makemodulerpm && tar czhf $rpm_source_dir/$mod.tar.gz $mod");
174 system("/bin/rm -rf /tmp/makemodulerpm");
176 # Build list of dependencies on other RPMs, for inclusion as an RPM
179 foreach $d (split(/\s+/, $minfo{'depends'})) {
180 local ($dwebmin, $dmod, $dver);
181 if ($d =~ /^[0-9\.]+$/) {
182 # Depends on a version of Webmin
185 elsif ($d =~ /^(\S+)\/([0-9\.]+)$/) {
186 # Depends on some version of a module
191 # Depends on any version of a module
195 # If the module is part of Webmin, we don't need to depend on it
198 &read_file("$dmod/module.info", \%dinfo);
199 next if ($dinfo{'longdesc'});
201 push(@rdeps, $dwebmin ? ("webmin", ">=", $dwebmin) :
202 $dver ? ($prefix.$dmod, ">=", $dver) :
206 $rdeps = join(" ", @rdeps, @extrareqs);
208 # Create the SPEC file
209 $providesheader = $provides ? "Provides: $provides" : undef;
210 $vendorheader = $vendor ? "Vendor: $vendor" : undef;
211 $urlheader = $url ? "URL: $url" : undef;
212 open(SPEC, ">$spec_dir/$prefix$mod.spec");
214 %define __spec_install_post %{nil}
220 PreReq: /bin/sh /usr/bin/perl /usr/libexec/$prog
221 Requires: /bin/sh /usr/bin/perl /usr/libexec/$prog $rdeps
226 Vendor: Jamie Cameron
227 BuildRoot: /tmp/%{name}-%{version}
228 BuildArchitectures: noarch
239 (find . -name '*.cgi' ; find . -name '*.pl') | perl -ne 'chop; open(F,\$_); \@l=<F>; close(F); \$l[0] = "#\!/usr/bin/perl\$1\n" if (\$l[0] =~ /#\!\\S*perl\\S*(.*)/); open(F,">\$_"); print F \@l; close(F)'
240 (find . -name '*.cgi' ; find . -name '*.pl') | xargs chmod +x
243 mkdir -p %{buildroot}/usr/libexec/$prog/$mod
244 cp -rp * %{buildroot}/usr/libexec/$prog/$mod
245 echo rpm >%{buildroot}/usr/libexec/$prog/$mod/install-type
248 [ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
251 /usr/libexec/$prog/$mod
254 # Check if webmin/usermin is installed
255 if [ ! -r /etc/$prog/config -o ! -d /usr/libexec/$prog ]; then
256 echo "$ucprog does not appear to be installed on your system."
257 echo "This RPM cannot be installed unless the RPM version of $ucprog"
258 echo "is installed first."
261 if [ "$depends" != "" -a "$rpmdepends" != 1 ]; then
262 # Check if depended webmin/usermin modules are installed
263 for d in $depends; do
264 if [ ! -r /usr/libexec/$prog/\$d/module.info ]; then
265 echo "This $ucprog module depends on the module \$d, which is"
266 echo "not installed on your system."
271 # Check if this module is already installed
272 if [ -d /usr/libexec/$prog/$mod -a "\$1" = "1" -a "$allow_overwrite" != "1" ]; then
273 echo "This $ucprog module is already installed on your system."
278 if [ "$post_config" = "1" ]; then
279 # Copy config file to /etc/webmin or /etc/usermin
280 os_type=`grep "^os_type=" /etc/$prog/config | sed -e 's/os_type=//g'`
281 os_version=`grep "^os_version=" /etc/$prog/config | sed -e 's/os_version=//g'`
282 /usr/bin/perl /usr/libexec/$prog/copyconfig.pl \$os_type \$os_version /usr/libexec/$prog /etc/$prog $mod
284 # Update the ACL for the root user, or the first user in the ACL
285 grep "^root:" /etc/$prog/webmin.acl >/dev/null
286 if [ "\$?" = "0" ]; then
289 user=`head -1 /etc/$prog/webmin.acl | cut -f 1 -d :`
291 mods=`grep \$user: /etc/$prog/webmin.acl | cut -f 2 -d :`
292 echo \$mods | grep " $mod" >/dev/null
293 if [ "\$?" != "0" ]; then
294 grep -v ^\$user: /etc/$prog/webmin.acl > /tmp/webmin.acl.tmp
295 echo \$user: \$mods $mod > /etc/$prog/webmin.acl
296 cat /tmp/webmin.acl.tmp >> /etc/$prog/webmin.acl
297 rm -f /tmp/webmin.acl.tmp
300 if [ "$force_theme" != "" -a "$istheme" = "1" ]; then
301 # Activate this theme
302 grep -v "^preroot=" /etc/$prog/miniserv.conf >/etc/$prog/miniserv.conf.tmp
303 (cat /etc/$prog/miniserv.conf.tmp ; echo preroot=$mod) > /etc/$prog/miniserv.conf
304 rm -f /etc/$prog/miniserv.conf.tmp
305 grep -v "^theme=" /etc/$prog/config >/etc/$prog/config.tmp
306 (cat /etc/$prog/config.tmp ; echo theme=$mod) > /etc/$prog/config
307 rm -f /etc/$prog/config.tmp
308 (/etc/$prog/stop && /etc/$prog/start) >/dev/null 2>&1
310 rm -f /etc/$prog/module.infos.cache
312 # Run post-install function
313 if [ "$prog" = "webmin" ]; then
314 cd /usr/libexec/$prog
315 WEBMIN_CONFIG=/etc/$prog WEBMIN_VAR=/var/$prog /usr/libexec/$prog/run-postinstalls.pl $mod
318 # Run post-install shell script
319 if [ -r "/usr/libexec/$prog/$mod/postinstall.sh" ]; then
320 cd /usr/libexec/$prog
321 WEBMIN_CONFIG=/etc/$prog WEBMIN_VAR=/var/$prog /usr/libexec/$prog/$mod/postinstall.sh
325 # De-activate this theme, if in use and if we are not upgrading
326 if [ "$istheme" = "1" -a "\$1" = "0" ]; then
327 grep "^preroot=$mod" /etc/$prog/miniserv.conf >/dev/null
328 if [ "\$?" = "0" ]; then
329 grep -v "^preroot=$mod" /etc/$prog/miniserv.conf >/etc/$prog/miniserv.conf.tmp
330 (cat /etc/$prog/miniserv.conf.tmp) > /etc/$prog/miniserv.conf
331 rm -f /etc/$prog/miniserv.conf.tmp
332 grep -v "^theme=$mod" /etc/$prog/config >/etc/$prog/config.tmp
333 (cat /etc/$prog/config.tmp) > /etc/$prog/config
334 rm -f /etc/$prog/config.tmp
335 (/etc/$prog/stop && /etc/$prog/start) >/dev/null 2>&1
338 # Run the pre-uninstall script, if we are not upgrading
339 if [ "$prog" = "webmin" -a "\$1" = "0" -a -r "/usr/libexec/$prog/$mod/uninstall.pl" ]; then
340 cd /usr/libexec/$prog
341 WEBMIN_CONFIG=/etc/$prog WEBMIN_VAR=/var/$prog /usr/libexec/$prog/run-uninstalls.pl $mod
349 # Build the actual RPM
350 $cmd = -x "/usr/bin/rpmbuild" ? "/usr/bin/rpmbuild" : "/bin/rpm";
351 system("$cmd -ba $spec_dir/$prefix$mod.spec") && exit;
352 unlink("$rpm_source_dir/$mod.tar.gz");
356 system("rpm --resign $rpm_dir/$prefix$mod-$ver-$release.noarch.rpm $source_rpm_dir/$prefix$mod-$ver-$release.src.rpm");
359 if ($target_dir =~ /:/) {
361 system("scp $rpm_dir/$prefix$mod-$ver-$release.noarch.rpm $target_dir/$prefix$mod-$ver-$release.noarch.rpm");
365 system("/bin/cp $rpm_dir/$prefix$mod-$ver-$release.noarch.rpm $target_dir/$prefix$mod-$ver-$release.noarch.rpm");
368 # read_file(file, &assoc, [&order], [lowercase])
369 # Fill an associative array with name=value pairs from a file
372 open(ARFILE, $_[0]) || return 0;
375 if (!/^#/ && /^([^=]+)=(.*)$/) {
376 $_[1]->{$_[3] ? lc($1) : $1} = $2;
377 push(@{$_[2]}, $1) if ($_[2]);