#!/usr/local/bin/perl -w # Make an rpm file out of a pkg, or something. Incomplete. # Waider Feb 1998 my %pkglist; my %subpkglist; my $SADM_DIR = '/var/sadm'; my $INSTALL_CONT = 'install/contents'; my $SPEC_DIR = '/usr/local/src/redhat/SPECS'; my $SRC_DIR = '/usr/local/src/redhat/SOURCES'; my $BUILD_DIR = '/usr/local/src/redhat/BUILD'; my $contfile = "$SADM_DIR/$INSTALL_CONT"; open( CONT, "<$contfile" ) || die "$contfile: $!\n"; CONTENTS: while( ) { my ( $major, $minor, $perms, $user, $group, @pkgs ); my ($file, $type, $subpkg, @rest ) = split; next if $file =~ /^#/; undef @pkgs; TYPESWITCH: { if ( $type eq 'c' ) # character device { ( $major, $minor, $perms, $user, $group, @pkgs ) = @rest; last; } if ( $type eq 'd' ) # directory { ( $perms, $user, $group, @pkgs ) = @rest; #last; next CONTENTS; } if ( $type eq 'e' ) # config file, apparently. { ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest; last; } if ( $type eq 'f' ) # file { $file =~ s/^(.*)=.*$/$1/; ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest; last; } if ( $type eq 'l' ) # hard link { $file =~ s/^(.*)=.*$/$1/; @pkgs = @rest; last; } if ( $type eq 's' ) # symlink { $file =~ s/^(.*)=.*$/$1/; @pkgs = @rest; last; } if ( $type eq 'v' ) # config file, also. { ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest; last; } die "Unknown file type $type on line $.\n$_"; } if ( !defined( @pkgs )) { warn "Couldn't find package for line $.\n"; } else { for( @pkgs ) { s/^(.*):.*$/$1/; # ignore package qualifiers my $filelist = $pkglist{ $_ }; $filelist = "", print "New package: $_\n" if ( !defined( $filelist )); # $file =~ s#^.*/(.+)$#$1#; # basename, cheap. $filelist .= ( length( $filelist ) ? ",$file" : $file ); $pkglist{ $_ } = $filelist; } } } close( CONT ); for $pkg ( keys %pkglist ) { $filelist = $pkglist{ $pkg }; warn "No files in $pkg\n", next if !defined( $filelist ); # Grab data from the pkg directory $summary = "Autogenerated RPM for $pkg"; $description = "Autogenerated RPM for $pkg"; $group = "Utilities"; $subcat = "Text"; $version = "0.0.0"; open( PKG, "<$SADM_DIR/pkg/$pkg/pkginfo" ) || die "Glark ($pkg)!\n"; while( ) { /^NAME=(.*)$/ and $summary = $1; /^DESC=(.*)$/ and $description = $1; /^VERSION=(.*),REV=(.*)$/ and $version = $1; /^CATEGORY=(.*)$/ and $group = ucfirst( $1 ); /^PRODNAME=(.*)$/ and $subcat = $1; } close( PKG ); if ( open( DEP, "<$SADM_DIR/pkg/$pkg/install/depend" )) { $deps = ""; while( ) { next if /^(\#.*|\s*)$/; chomp; if ( /^\s/ ) { $deps .= ""; # field delimiter } else { $deps .= "\n" } $deps .= $_; } close( DEP ); $deps .= "\n"; # Parse deps undef @pkgdeps; while( $deps =~ /[PIR]\s(.*?)\s.*\n/g ) { push @pkgdeps, $1 if $1 ne $pkg; } if ( $#pkgdeps > -1 ) { $deps = join( ',', @pkgdeps ); } } print "Generating spec for $pkg version $version.\n"; open( SPEC, ">$SPEC_DIR/$pkg-".$version."_1.spec" ); print SPEC "Summary: $summary\n"; print SPEC "Name: $pkg\n"; print SPEC "Version: $version\n"; print SPEC "Release: 1\n"; print SPEC "Source: $pkg-$version.tar.gz\n"; print SPEC "Copyright: Proprietary\n"; print SPEC "Group: $group/$subcat\n"; print SPEC "Requires: $deps\n"; print SPEC "%description\n$description\n\n"; print SPEC "%prep\n"; print SPEC "%setup\n\n"; print SPEC "%build\n\n"; print SPEC "%install\n\n"; print SPEC "%files\n"; print SPEC join( '\n', split( ',', $filelist )); print SPEC "\n"; close( SPEC ); system( "mkdir $BUILD_DIR/$pkg-$version" ); system( "echo '".$description."' > $BUILD_DIR/$pkg-$version/README" ); system( "cd $BUILD_DIR && tar cf $pkg-$version.tar $pkg-$version" ); system( "gzip -9 $BUILD_DIR/$pkg-$version.tar" ); system( "mv $BUILD_DIR/$pkg-$version.tar.gz $SRC_DIR/$pkg-$version.tar.gz" ); system( "/bin/rm -rf $BUILD_DIR/$pkg-$version" ); }