def __init__(self, ips, args): self.dir = dirname(ips) self.name = basename(ips).split('.', 1)[0] self.args = args # # Suck the manifest into a class structure for parsing # self.mf = Manifest() self.mf.set_content(pathname=ips) self.depends = ['${shlibs:Depends}', '${misc:Depends}'] self.post = [] # Holds str lines for pkgname.postinst self.pre = [] # '' pkgname.preinst self.rm = [] # '' pkgname.prerm self.fix = [] # '' pkgname.fixperms self.svc = {} pfmri = self.mf.get('pkg.fmri', None) self.pkgfmri = PkgFmri(pfmri) if pfmri else None self.pkgname = None self.process = False # Debian attrs (for pylint) self.origname = None self.rep = None self.pri = None self.wd = None self.ver = None self.arch = None self.origver = None
class IPSConvert: """class for converting from ips packages""" def __init__(self, ips, args): self.dir = dirname(ips) self.name = basename(ips).split('.', 1)[0] self.args = args # # Suck the manifest into a class structure for parsing # self.mf = Manifest() self.mf.set_content(pathname=ips) self.depends = ['${shlibs:Depends}', '${misc:Depends}'] self.post = [] # Holds str lines for pkgname.postinst self.pre = [] # '' pkgname.preinst self.rm = [] # '' pkgname.prerm self.fix = [] # '' pkgname.fixperms self.svc = {} pfmri = self.mf.get('pkg.fmri', None) self.pkgfmri = PkgFmri(pfmri) if pfmri else None self.pkgname = None self.process = False # Debian attrs (for pylint) self.origname = None self.rep = None self.pri = None self.wd = None self.ver = None self.arch = None self.origver = None def initdebpkg(self): """Initialize the object for conversion to Debian format""" # # Some packages won't have fmri attributes. Old code skipped them, so we # will, too. # if not self.pkgfmri: if self.args.v: print "%s: No fmri attribute found. Skipping." % (self.name) return False # # We get our package names from the pkg.fmri attribute after # a little post processing # self.pkgname = self.pkgfmri.pkg_name.replace('/','-').replace('_','-') \ .lower() # # This is mostly taken straight from the perl code. # There, we skipped any obsoleted or renamed packages, consolidations, # or packages we specifically mark to be ignored. # if self.mf.get('pkg.obsolete', None): if self.args.v: print "%s: Package is obsolete. Ignoring." % (self.pkgname) return elif 'consolidation' in self.pkgname: if self.args.v: print "%s: Package is a consolidation. Ignoring." \ % (self.pkgname) return elif ign.get(self.pkgname): if self.args.v: print "%s: Package is marked to be ignored." % (self.pkgname) return if self.mf.get('pkg.renamed', None): for rdep in self.mf.gen_actions_by_type('depend'): try: repfmri = PkgFmri(rdep.attrs.get('fmri')) except(IllegalFmri) as err: if 'build version' in str(err): repfmri = PkgFmri(rdep.attrs.get('fmri').split('@')[0]) else: raise rname = repfmri.pkg_name.replace('/','-') \ .replace('_','-').lower() if rname == "consolidation-osnet-osnet-incorporation": continue reps = drep.get(rname) or [] if self.pkgname not in reps: reps.append(self.pkgname) drep[rname] = reps return self.process = True def gendebpkg(self): """Generate a debian style package source from an ips manifest""" # # origver is XBS-ORIGINAL-VERSION, taken from part of # the fmri's version string. # origname is the debian "Provides" field. It comes from # everything after the last '/' in the fmri. # self.origver = self.args.origver or str(self.pkgfmri.version.release) self.origname = self.pkgfmri.pkg_name.rsplit('/', 1)[-1].lower() self.arch = self.mf.get('variant.arch', None) if (type(self.arch) == list and len(self.arch) != 0): self.arch = self.arch[0] self.arch = 'solaris-%s' % (self.arch or 'i386') # # Get the debian Replaces, Priorities, and Version fields, either from # CLI or ips2deb conf files. # self.rep = self.args.rep or ', '.join(drep.get(self.pkgname) or []) self.pri = self.args.pri or dpri.get(self.pkgname, [''])[0] self.ver = self.args.ver or dver.get(self.pkgname, [''])[0] # Dependencies # # Some packages were set to be dependent on sunwcs, even though it's not # directly listed in the manifest. We replicate that behavior. here. # There's other extra behavior when we generate sunwcs later on. # TODO: perhaps find a better way to handle this. # if self.args.spec or spec.get(self.pkgname): self.depends.append('sunwcs') for dep in self.mf.gen_actions_by_type('depend'): fmri = dep.attrs.get('fmri') # # Ignore dependencies we don't care about. # TODO: there has to be a cleaner way to do this... # TODO2: if this is 'cleaner', figure out which of these are # whole-string matches and clean up the REGEX. # if not fmri or dep.attrs['type'] != 'require': continue try: dfmri = PkgFmri(fmri) except(IllegalFmri) as err: if 'build version' in str(err): dfmri = PkgFmri(fmri.split('@')[0]) else: raise if dfmri.is_name_match( '.*__TBD.*|.*consolidation.*|.*release/name.*|' '.*compatibility-packages-sunwxwplt.*|.*runtime/perl.*'): continue # # Same deal as pkgfmri. # depstr = dfmri.pkg_name.replace('/','-').replace('_','-').lower() if dep.attrs.get('pkg.debug.depend.file') and self.ver: if "driver-serial-usbsksp-usbs49-fw" in depstr or \ depstr in self.depends: # # the perl code filters out "sunwcsd" as a possible # source of dependencies. Apparently, that's handled # elsewhere in the new process, because removing the check # for SUNWcsd here doesn't change anything, and we don't # miss any dependencies without it. # continue depstr += ' (>= %s)' % (self.ver) self.depends.append(depstr) # # Get directory name for holding output, based either on CLI args or # The path to the file we're reading from # self.wd = join(self.args.wd or self.dir, self.name) # # Create the output directories, removing it if it already exists. # if exists(self.wd): rmtree(self.wd) makedirs(join(self.wd, 'debian')) bwd = join(self.wd, 'debian', self.pkgname) # # Create the directories for every dir action in the manifest. # Also adds related commands to package files. # for d in self.mf.gen_actions_by_type('dir'): pth = d.attrs['path'] dest = join(bwd, pth) if not exists(dest): makedirs(dest, int(d.attrs['mode'], 8)) # # Solaris, by default, won't let you chown a file as non-root. # However, we still want to build the package if we can't # chown files. # try: chown(dest, getpwnam(d.attrs['owner']).pw_uid, getgrnam(d.attrs['group']).gr_gid) except(OSError) as err: if 'Not owner' in str(err): pass else: raise self.fix.append("chmod %s $DEST/%s" % (d.attrs['mode'], pth)) self.fix.append("chown %s:%s $DEST/%s" % (d.attrs['owner'], d.attrs['group'], pth)) # # Copy all of the files from the file actions into their appropriate # directories. Also adds related commands to package files. # if self.pkgname == 'sunwcs' and self.mf.actions_bytype.get('file'): self.post.append( """cp -f $BASEDIR/usr/bin/cp $BASEDIR/usr/bin/ln cp -f $BASEDIR/usr/bin/cp $BASEDIR/usr/bin/mv cp -f $BASEDIR/usr/lib/isaexec $BASEDIR/usr/bin/ksh cp -f $BASEDIR/usr/lib/isaexec $BASEDIR/usr/bin/ksh93 cp -f $BASEDIR/usr/lib/isaexec $BASEDIR/usr/sbin/rem_drv cp -f $BASEDIR/usr/lib/isaexec $BASEDIR/usr/sbin/update_drv""") for f in self.mf.gen_actions_by_type('file'): pth = f.attrs['path'] # # From perl code: # 'use etc/motd from base-files package' # if 'etc/motd' in pth: continue self.fix.append("mkdir -p $DEST/" + dirname(pth)) # # Some packages don't include a dir action for every directory in # the file actions. That's probably a bug, but we don't want to # error out just because of that, so we might as well check to make # sure the directory exists. # dest = join(bwd, pth) if not exists(dirname(dest)): makedirs(dirname(dest)) # # Try to find this file in the directories supplied via CLI. # If we can't, throw an error. # cpth = pth if f.hash == 'NOHASH' or f.attrs.get('chash') else f.hash src = '' for d in self.args.dir: if exists(join(d, cpth)): src = join(d, cpth) if not src: raise Exception("Couldn't find %s in supplied directories" % (cpth)) copyfile(src, dest) chmod(dest, int(f.attrs['mode'], 8)) try: chown(dest, getpwnam(f.attrs['owner']).pw_uid, getgrnam(f.attrs['group']).gr_gid) except(OSError) as err: if 'Not owner' in str(err): pass else: raise self.fix.append( """test -f "$DEST/%s" || echo '== Missing: %s' test -f "$DEST/%s" || exit 1 chmod %s "$DEST/%s" chown %s:%s "$DEST/%s" """.strip(' ') % (pth, pth, pth, f.attrs['mode'], pth, f.attrs['owner'], f.attrs['group'], pth)) pres = f.attrs.get('preserve') if pres == 'renamenew': self.fix.append("mv $DEST/%s $DEST/%s.new" % (pth, pth)) self.post.append( "([ -f $BASEDIR/%s ] || mv -f $BASEDIR/%s.new $BASEDIR/%s)" % (pth,pth,pth)) elif pres == 'renameold': self.fix.append("mv $DEST/%s $DEST/%s.%s" % (pth,pth,self.pkgname)) self.post.append( """([ -f $BASEDIR/%s ] && cp -f $BASEDIR/%s $BASEDIR/%s.old ) ([ -f $BASEDIR/%s.%s ] && mv -f $BASEDIR/%s.%s $BASEDIR/%s )""" % (pth,pth,pth,pth,self.pkgname,pth,self.pkgname,pth)) elif pres == 'legacy': self.fix.append("mv $DEST/%s $DEST/%s.%s" % (pth,pth,self.pkgname)) self.post.append( """([ -f $BASEDIR/%s ] || rm -f $BASEDIR/%s.%s ) ([ -f $BASEDIR/%s ] && mv -f $BASEDIR/%s $BASEDIR/%s.legacy ) ([ -f $BASEDIR/%s.%s ] && mv -f $BASEDIR/%s.%s $BASEDIR/%s )""" % (pth,pth,self.pkgname,pth,pth,pth,pth,pth,self.pkgname,pth)) elif pres == 'true': self.fix.append("mv $DEST/%s $DEST/%s.%s" % (pth,pth,self.pkgname)) self.post.append( """([ -f $BASEDIR/%s.saved ] && mv -f $BASEDIR/%s.saved $BASEDIR/%s ) ([ -f $BASEDIR/%s ] || mv -f $BASEDIR/%s.%s $BASEDIR/%s ) ([ -f $BASEDIR/%s ] && rm -f $BASEDIR/%s.%s)""" % (pth,pth,pth,pth,pth,self.pkgname,pth,pth,pth,self.pkgname)) self.rm.append( "([ -f $BASEDIR/%s ] && " "mv -f $BASEDIR/%s $BASEDIR/%s.saved)" % (pth,pth,pth)) if f.attrs.get('variant.opensolaris.zone') == 'global': self.post.append( '[ "$ZONEINST" = "1" ] && ([ -f $BASEDIR/%s ] && ' 'rm -f $BASEDIR/%s)' % (pth,pth)) rfmri = f.attrs.get('restart_fmri') if rfmri and not self.svc.get(rfmri): self.svc[rfmri] = 1 self.post.append( '[ "${BASEDIR}" = "/" ] && ( /usr/sbin/svcadm restart %s ' '|| true )' % (rfmri)) # # Add commands for each hardlink action into # the appropriate package files. # if self.pkgname == 'sunwcs' and self.mf.actions_bytype.get('hardlink'): self.fix.append( """mkdir -p $DEST/usr/bin && cp -f $DEST/usr/bin/cp $DEST/usr/bin/ln mkdir -p $DEST/usr/bin && cp -f $DEST/usr/bin/cp $DEST/usr/bin/mv mkdir -p $DEST/usr/bin && cp -f $DEST/usr/lib/isaexec $DEST/usr/bin/ksh mkdir -p $DEST/usr/bin && cp -f $DEST/usr/lib/isaexec $DEST/usr/bin/ksh93 mkdir -p $DEST/usr/bin && cp -f $DEST/usr/lib/isaexec $DEST/usr/sbin/rem_drv mkdir -p $DEST/usr/bin && cp -f $DEST/usr/lib/isaexec $DEST/usr/sbin/update_drv\ """) hlskip = ['usr/bin/ln', 'usr/bin/mv', 'usr/bin/ksh', 'usr/bin/ksh93', 'usr/sbin/rem_drv', 'usr/sbin/update_drv'] for hl in self.mf.gen_actions_by_type('hardlink'): pth = hl.attrs['path'] # # There are some hardlinks we don't care about, so skip them. # if pth in hlskip: continue if hl.attrs.get('variant.opensolaris.zone') == 'global': self.post.append( '[ "$ZONEINST" = "1" ] || (mkdir -p $BASEDIR/%s && ' 'cd $BASEDIR/%s && ln -f %s %s)' % (dirname(pth), dirname(pth), hl.attrs['target'], basename(pth))) self.rm.append('[ "$ZONEINST" = "1" ] || rm -f $BASEDIR/%s' % (pth)) else: self.post.append( "mkdir -p $BASEDIR/%s && (cd $BASEDIR/%s && ln -f %s %s)" % (dirname(pth), dirname(pth), hl.attrs['target'], basename(pth))) self.rm.append('rm -f $BASEDIR/%s' % (pth)) # # Add appropriate commands for each driver action # to the appropriate package files. # TODO: Do it "the IPS way"? # for drv in self.mf.gen_actions_by_type('driver'): name = drv.attrs.get('name') privs = drv.attrs.get('privs') policy = drv.attrs.get('policy') devlink = drv.attrs.get('devlink') oPerm = drv.attrs.get('perms') oClPerm = drv.attrs.get('clone_perms') cls = drv.attrs.get('class') alias = drv.attrs.get('alias') opts = '' if type(cls) == list: cls = ' '.join(cls) if type(alias) == list: alias = '" "'.join(alias) if type(policy) == list: policy = ", ".join(policy) if type(oPerm) == list: oPerm = "','".join(oPerm) if type(privs) == list: privs = privs[0] if privs: opts += ' -P %s' % (privs) if policy: policy = policy.replace('"',"") opts += " -p \'%s\'" % (policy) clopts = opts if cls: opts += " -c '%s'" % (cls) if alias: opts += " -i '\"%s\"'" % (alias) if not oPerm: clopts = opts else: opts += " -m \'%s\'" % (oPerm.replace('"',"'")) self.post.append('[ "$ZONEINST" = "1" ] || ' '(grep -c "^%s " $BASEDIR/etc/name_to_major >/dev/null ' '|| ( add_drv -n $BASEDIR_OPT %s %s ) )' % (name, opts, name)) self.rm.append( '[ "$ZONEINST" = "1" ] || ( rem_drv -n $BASEDIR_OPT %s )' % (name)) if oClPerm: if type(oClPerm) != list: oClPerm = [oClPerm] for perm in oClPerm: perm = perm.replace('"','') self.post.append('[ "$ZONEINST" = "1" ] || ' '(grep -c "^clone:%s" $BASEDIR/etc/minor_perm ' '>/dev/null || update_drv -n -a $BASEDIR_OPT %s ' '-m \'%s\' clone)' % (perm, clopts, perm)) self.rm.append('[ "$ZONEINST" = "1" ] || ' '(grep -c "^clone:%s" $BASEDIR/etc/minor_perm ' '>/dev/null && update_drv -n -d $BASEDIR_OPT %s ' '-m \'%s\' clone)' % (perm, clopts, perm)) if devlink: devlink = devlink.replace('\\t','\t') fields = devlink.split() self.post.append('[ "$ZONEINST" = "1" ] || ' '(grep -c "^%s" $BASEDIR/etc/devlink.tab ' '>/dev/null || (echo "%s" >> $BASEDIR/etc/devlink.tab))' % (fields[0], devlink)) self.rm.append('[ "$ZONEINST" = "1" ] || ' '( cat $BASEDIR/etc/devlink.tab | sed -e \'/^%s/d\' ' '> $BASEDIR/etc/devlink.tab.new; ' 'mv $BASEDIR/etc/devlink.tab.new ' '$BASEDIR/etc/devlink.tab )' % (fields[0])) # TODO: do we need this? if self.mf.actions_bytype.get('driver'): if len(self.post): self.post.append('') if len(self.rm): self.rm.append('') # # Add commands for each link action to the appropriate package files. # mediator = [] # temporary location for mediator command old_mtr = None; for link in self.mf.gen_actions_by_type('link'): pth = link.attrs['path'] target = link.attrs['target'] mtr = link.attrs.get('mediator') mtr_ver = link.attrs.get('mediator-version') mtr_pri = link.attrs.get('mediator-priority') if old_mtr and mtr != old_mtr: raise Exception("%s: multiple mediator groups per manifest " "not supported" % (self.pkgname)) dire = dirname(pth) if not dire: dire = '.' alt = pth.replace("/","-") if mtr: alt_pri = 99 elif mtr_pri == 'vendor': alt_pri = 10 else: alt_pri = 0 if mtr and link.attrs.get('variant.opensolaris.zone'): raise Exception("%s: mediated links using " "variant.opensolaris.zone not supported" % (self.pkgname)) if mtr and len(mediator) == 0: makedirs(join(bwd, "var/mediator")) copyfile("/dev/null", join(bwd, "var/mediator/", self.pkgname)) self.fix.append("mkdir -p $DEST/var/mediator") # The following will "just work" as our update-alternatives # honors the BASEDIR environment variable. mediator.append( '(update-alternatives --quiet ' '--install /var/mediator/%s %s /var/mediator/%s %s' %(mtr, mtr, self.pkgname, alt_pri)) self.rm.append( """if [ "$1" != "upgrade" ]; then (update-alternatives --quiet --remove %s /var/mediator/%s) fi """ %(mtr, self.pkgname)) if link.attrs.get('variant.opensolaris.zone') == 'global': self.post.append( '[ "$ZONEINST" = "1" ] || (mkdir -p $BASEDIR/%s && ' 'ln -f -s %s $BASEDIR/%s)' % (dire, target, pth)) else: # != 'global' if mtr: mediator.append('--slave /%s %s /%s/%s' %(pth, alt, dire, target)) else: self.fix.append('mkdir -p $DEST/%s && ln -f -s %s $DEST/%s' % (dire, target, pth)) if len(mediator): mediator.append(')') self.post.append(' '.join(mediator)) # Groups for grp in self.mf.gen_actions_by_type('group'): self.post.append(""" if ! getent group %s >/dev/null 2>&1 ; then groupadd -g %s %s fi""" % (grp.attrs['groupname'], grp.attrs['gid'], grp.attrs['groupname'])) # Users for usr in self.mf.gen_actions_by_type('user'): name = usr.attrs['username'] uid = usr.attrs['uid'] gcos = usr.attrs.get('gcos-field') shell = usr.attrs.get('login-shell') grp = usr.attrs.get('group') self.post.append(""" if ! getent passwd %s >/dev/null 2>&1 ; then useradd %s%s%s%s%s fi""" % (name, ' -c "%s"' % (gcos) if gcos else '', ' -s %s' % (shell) if shell else '', ' -u ' + uid, ' -g %s' % (grp) if grp else '', ' -m ' + name)) return True def savedebpkg(self): """Create source files for a debian package""" # # If there are no actions we care about, # don't bother creating any files. # if not (len(self.depends) or self.mf.actions_bytype.get('dir') \ or self.mf.actions_bytype.get('file') \ or self.mf.actions_bytype.get('hardlink') \ or self.mf.actions_bytype.get('user') \ or self.mf.actions_bytype.get('group')): print "%s: Nothing to save. Exiting." % (self.pkgname) return control = open(join(self.wd, 'debian', 'control'), 'w') control.write("""Source: %s Section: %s Priority: %s XBS-Original-Version: %s XBS-Category: %s Maintainer: %s Package: %s Architecture: %s Depends: %s Provides: %s%s Description: %s %s """ % (self.pkgname, self.args.sect, self.pri, self.origver, self.args.sect, self.args.main, self.pkgname, self.arch, ', '.join(self.depends), self.origname.replace('_','-'), '\nReplaces: %s' % (self.rep) if self.rep else '', self.mf.get('pkg.summary', 'none'), self.mf.get('pkg.description', 'none'))) control.close() change = open(join(self.wd, 'debian', 'changelog'), 'w') change.write("""%s (%s) unstable; urgency=low * Temporary file, need only for package generation process -- %s %s """ % (self.pkgname, self.ver, self.args.main, strftime("%a, %d %h %Y %H:%M:%S %z"))) change.close() compat = open(join(self.wd, 'debian', 'compat'),'w') compat.write('7\n') compat.close() copy = open(join(self.wd, 'debian', 'copyright'),'w') copy.write(""" Copyright: Copyright (c) 2011 illumian. All rights reserved. Use is subject to license terms. """) copy.close() fixperms = open(join(self.wd, 'debian', self.pkgname + '.fixperms'), 'w') fixperms.write( """#!/bin/sh export PATH=%s %s """ % ("/usr/bin:/sbin:/usr/sbin" if len(self.fix) else '', '\n'.join(self.fix) if len(self.fix) else '')) fixperms.close() if len(self.post): postinst = open(join(self.wd, 'debian', self.pkgname + '.postinst'), 'w') postinst.write( """#!/bin/sh # postinst script for %s # # see: dh_installdeb(1) #set -e # summary of how this script can be called: # * <postinst> \`configure\' <most-recently-configured-version> # * <old-postinst> \`abort-upgrade\' <new version> # * <conflictor\'s-postinst> \`abort-remove\' \`in-favour\' <package> # <new-version> # * <postinst> \`abort-remove\' # * <deconfigured\'s-postinst> \`abort-deconfigure\' \`in-favour\' # <failed-install-package> <version> \`removing\' # <conflicting-package> <version> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package PATH=/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH if [ "${BASEDIR:=/}" != "/" ]; then BASEDIR_OPT="-b $BASEDIR" fi case "$1" in configure) %s ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \'$1\'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 """ % (self.pkgname, '\n\t'.join(self.post))) postinst.close() if len(self.pre): preinst = open(join(self.wd, 'debian', self.pkgname + '.preinst'), 'w') preinst.write( """#!/bin/sh # preinst script for sunwcs # # see: dh_installdeb(1) #set -e # summary of how this script can be called: # * <new-preinst> \`install' # * <new-preinst> \`install' <old-version> # * <new-preinst> \`upgrade' <old-version> # * <old-preinst> \`abort-upgrade' <new-version> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package PATH=/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH if [ "${BASEDIR:=/}" != "/" ]; then BASEDIR_OPT="-b $BASEDIR" fi case "$1" in install|upgrade) %s ;; abort-upgrade) ;; *) echo "preinst called with unknown argument '$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 """ % ('\n\t'.join(self.pre))) preinst.close() if len(self.rm): prerm = open(join(self.wd, 'debian', self.pkgname + '.prerm'), 'w') prerm.write( """#!/bin/sh # prerm script for sunwcs # # see: dh_installdeb(1) #set -e # summary of how this script can be called: # * <prerm> \`remove\' # * <old-prerm> \`upgrade' <new-version> # * <new-prerm> \`failed-upgrade' <old-version> # * <conflictor's-prerm> \`remove' \`in-favour' <package> <new-version> # * <deconfigured\'s-prerm> \`deconfigure' \`in-favour' # <package-being-installed> <version> \`removing' # <conflicting-package> <version> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package PATH=/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH if [ "${BASEDIR:=/}" != "/" ]; then BASEDIR_OPT="-b $BASEDIR" fi case "$1" in remove|upgrade|deconfigure) %s ;; failed-upgrade) ;; *) echo "prerm called with unknown argument '$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 """ % ('\n\t'.join(self.rm))) prerm.close() rpath = join(self.wd, 'debian', 'rules') rules = open(rpath, 'w') rules.write( """#!/usr/bin/gmake -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 #MYGATE := ${BASEGATE} DEST := $(CURDIR)/debian/%s ##configure: configure-stamp ##configure-stamp: ## dh_testdir # Add here commands to configure the package. ## touch configure-stamp ##build: build-stamp build: ##build-stamp: configure-stamp # dh_testdir # Add here commands to compile the package. # touch $@ clean: dh_testdir dh_testroot -rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. # -$(MAKE) clean # dh_clean ##install: build install: ## dh_testdir ## dh_testroot ## dh_clean -k ## dh_installdirs # Add here commands to install the package into debian/tmp. # mkdir -p $(CURDIR)/debian/tmp # mv proto/* $(CURDIR)/debian/tmp # Build architecture-independent files here. ##binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. ##binary-arch: build install binary-arch: dh_testdir dh_testroot # test -f $(CURDIR)/debian/%s.fixperms && MYSRCDIR=$(MYGATE) DEST=$(DEST)\ /bin/sh $(CURDIR)/debian/%s.fixperms test -f $(CURDIR)/debian/%s.fixperms && DEST=$(DEST)\ /bin/sh $(CURDIR)/debian/%s.fixperms # dh_makeshlibs -p%s dh_makeshlibs dh_installdeb rm -f $(CURDIR)/debian/%s/DEBIAN/conffiles # dh_shlibdeps debian/tmp/lib/* debian/tmp/usr/lib/* -dh_shlibdeps -Xdebian/sunwcs/usr/kernel/* -- --ignore-missing-info dh_gencontrol dh_md5sums dh_builddeb -- -Zbzip2 -z9 ##binary: binary-indep binary-arch binary: binary-arch ##.PHONY: build clean binary-indep binary-arch binary install configure .PHONY: clean binary-arch binary """ % (self.pkgname, self.pkgname, self.pkgname, self.pkgname, self.pkgname, self.pkgname, self.pkgname)) rules.close() chmod(rpath, 0777) conffiles = open(join(self.wd, 'debian', self.pkgname + '.conffiles'), 'w') conffiles.write('\n') conffiles.close()