#!/usr/bin/python # import os,shutil,sys,time def extract(fname,member,outdir): if not os.path.isdir(outdir): os.mkdir(outdir) (i1,o1)=os.popen2(['ar','p',fname,member]) i1.close() (i2,o2)=os.popen2(['tar','-xzf','-','-C',outdir]) o2.close() shutil.copyfileobj(o1,i2) o1.close() i2.close() def targz(srcdir): tmp=os.getcwd() os.chdir(srcdir) # symlink at the end f=os.popen("(find . '!' -type l -print0;find . -type l -print0)|tar --null -cf - -T - --no-recursion|gzip -9c","r") out=f.read() f.close() os.chdir(tmp) return out class ArFile: def __init__(self,fname): self.off=0 self.f=file(fname,'w') self.write("!\n") def close(self): self.f.close() def write(self,val): self.off+=len(val) self.f.write(val) def align(self): if self.off&1: self.write("\n") def writemember(self,name,t,value): self.write("%-16s%-12d0 0 100644 %-10d`\n%s"%(name,t,len(value),value)) self.align() if len(sys.argv)==3 and sys.argv[1]=='-x': fname=sys.argv[2] extract(fname,'control.tar.gz','control') extract(fname,'data.tar.gz','data') elif len(sys.argv)==3 and sys.argv[1]=='-c': #ar crsv bah.deb debian-binary control.tar.gz data.tar.gz fname=sys.argv[2] f=ArFile(fname) # according to dpkg/dpkg-deb/build.c t=int(time.time()) f.writemember("debian-binary",t,"2.0\n") f.writemember("control.tar.gz",t,targz("control")) f.writemember("data.tar.gz",t,targz("data")) f.close() else: print """Name: debalter - a .deb alteration tool debalter is a simple tools that can be used to manipulate .deb files with a simplier interface than dpkg-deb. Usage: debalter -x file.deb will uncompress the debian archive in the current directory creating two sub-directories, "control" and "data". debalter -c file.deb will create a debian archive from the sub-directories "control" and "data" found in the current directory """