#!/usr/bin/python # -*- coding: utf-8 -*- import os import apt_pkg import apt import gzip import re import tempfile import StringIO import glob import urlparse import shutil class ProgressProxy: 'Monitors the progress of a URL download' def __init__(self, url ): self.url = url def curlStatusCallback( self, dltotal, dlnow, ultotal, ulnow): if dltotal > 0: print self.url + ' ' + str( (dlnow / dltotal ) * 100) class Remaster: 'Takes a list of packages and builds a custom installer CD' def __init__(self, output, mirror = None, label = None, dist = None, arch = None, packagelist = None, tempdir = None, version = None, modules = None, components = None, preseedOptions = None, kernelPackage = None, tasks = None, extramirrors = [], buildPackages = [], installers = None ): self.extramirrors = extramirrors self.output = output self.label = label or os.path.basename( output ) self.mirrorurl = mirror or 'http://archive.ubuntu.com/ubuntu/' self.dist = dist or 'jaunty' self.arch = arch or 'i386' self.version = version or '1.0' self.tasks = tasks or [ 'standard' ] self.packagelist = packagelist or [ ] self.modules = modules or [ 'main' ] self.components = components or [ 'updates', 'security' ] self.kernelPackage = kernelPackage or 'linux-image' self.tmpdir = tempfile.mkdtemp( dir=tempdir ) self.outputDir = os.path.join( self.tmpdir, 'cdrom') + '/' self.isoBootDir = os.path.join( self.outputDir, 'isolinux' ) + '/' self.debBinaryDir = os.path.join( self.outputDir,'dists', self.dist, 'main','binary-' + self.arch ) + '/' self.debInstallerDir = os.path.join( self.outputDir,'dists', self.dist, 'main','debian-installer','binary-' + self.arch ) + '/' self.poolDir = os.path.join( self.outputDir, 'pool','main' ) + '/' self.buildPackages = buildPackages self.archiveDir = os.path.join( self.tmpdir, 'archives') + '/' self.configDir = os.path.join( self.tmpdir, 'config') + '/' self.pbuilderPrefix = os.path.join( self.tmpdir, 'pbuilder') + '/' self.aptConfFileName = os.path.join( self.configDir, 'apt.conf') self.archiveConfFileName = os.path.join( self.configDir, 'aptarchive.conf') self.binaryReleaseFile = os.path.join( self.debBinaryDir, 'Release') self.releaseFile = os.path.join( self.outputDir,'dists', self.dist, 'Release') self.overrides = os.path.join( self.tmpdir, 'overrides') self.extraOverrides = os.path.join( self.tmpdir, 'extraOverrides') self.installOverrides = os.path.join( self.tmpdir, 'installOverrides') self.installers = installers self.preseedOptions = preseedOptions or [] url = urlparse.urlparse(self.mirrorurl) proto = url.scheme hostname = url.netloc directory = url.path self.preseedOptions.append( ['tasksel','tasksel/first','multiselect', ','.join(self.tasks) ] ) self.preseedOptions.append( ['d-i','pkgsel/include','string', ' '.join( self.packagelist ) ] ) self.preseedOptions.append( ['d-i','pkgsel/include/install-recommends','boolean','false' ] ) for idx, extra in enumerate(self.extramirrors): self.preseedOptions.append( ['d-i','apt-setup/local%s/repository' % idx,'string',extra] ) self.preseedOptions.append( ['bootstrap-base','base-installer/kernel/image','select', self.kernelPackage ] ) self.packagelist.append('grub-pc') self.packagelist.append(self.kernelPackage) self.aptOptProgress = apt.progress.OpTextProgress() self.aptFetchProgress = apt.progress.TextFetchProgress() self.aptCache = None self.aptAcquire = None self.aptDepCache = None self.aptRecords = None self.aptSourceList = None def configureInstallerSourceList( self, rootDir ): sourceListFileHandle = open( os.path.join( rootDir, 'config/sources.list'), 'w' ) for module in self.modules: sourceListFileHandle.write( 'deb ' + self.mirrorurl + ' ' + self.dist + ' ' + module + '/debian-installer\n') for component in self.components: sourceListFileHandle.write( 'deb ' + self.mirrorurl + ' ' + self.dist + '-' + component + ' ' + module + '/debian-installer\n' ) sourceListFileHandle.close() def configurePackageSourceList( self, rootDir ): sourceListFileHandle = open( os.path.join( rootDir, 'config/sources.list'), 'w' ) for module in self.modules: sourceListFileHandle.write( 'deb ' + self.mirrorurl + ' ' + self.dist + ' ' + module + '\n') for component in self.components: sourceListFileHandle.write( 'deb ' + self.mirrorurl + ' ' + self.dist + '-' + component + ' ' + module + '\n' ) for extra in self.extramirrors: sourceListFileHandle.write( 'deb ' + extra + '\n' ) sourceListFileHandle.write( 'deb copy://' + self.pbuilderPrefix + '/result ./\n') sourceListFileHandle.close() def configureApt( self, rootDir ): apt_pkg.Config.Set('APT::Architecture', self.arch ) apt_pkg.Config.Set('APT::Authentication::TrustCDROM', 'true' ) apt_pkg.Config.Set('APT::Install-Recommends', 'false' ) apt_pkg.Config.Set('APT::Install-Suggests', 'false' ) apt_pkg.Config.Set('APT::Archives::MaxAge', '30' ) apt_pkg.Config.Set('APT::Archives::MinAge', '2' ) apt_pkg.Config.Set('APT::Archives::MaxSize', '500' ) apt_pkg.Config.Set('APT::Get::Download-Only', 'true' ) apt_pkg.Config.Set('APT::Get::Assume-Yes', 'true' ) apt_pkg.Config.Set('APT::Get::ReInstall', 'true' ) apt_pkg.Config.Set('APT::Get::AllowUnauthenticated', 'true' ) apt_pkg.Config.Set('Dir::Cache', self.archiveDir ) apt_pkg.Config.Set('Dir::Etc', os.path.join( rootDir, 'config') ) apt_pkg.Config.Set('Dir::State', os.path.join( rootDir, 'state') ) apt_pkg.Config.Set('Dir::State::status',os.path.join( rootDir, 'status/status') ) apt_pkg.Config.Set('DPkg::Options' '--root=' + rootDir, 'root' ) def makeAptDirStructure( self, rootDir ): os.makedirs( os.path.join( rootDir, 'state/lists/partial') ) os.makedirs( os.path.join( rootDir, 'config') ) os.makedirs( os.path.join( rootDir, 'status') ) os.makedirs( os.path.join( rootDir, 'root') ) status = open( os.path.join( rootDir, 'status/status'), 'w' ) status.write( '' ) status.close() def makeDirStructure( self ): os.makedirs( self.configDir ) os.makedirs( self.poolDir ) os.makedirs( self.isoBootDir ) os.makedirs( self.debInstallerDir ) os.makedirs( self.debBinaryDir ) os.makedirs( os.path.join( self.archiveDir, 'archives/partial') ) def cleanDirStructure( self ): shutil.rmtree( self.tmpdir ) def makePreseed( self ): preseedData = '' for option in self.preseedOptions: preseedData += ' '.join(option) + '\n' preseedHandle = StringIO.StringIO( preseedData ) self.injectFileIntoInitrd( os.path.join( self.tmpdir, 'initrd.gz'), 'preseed.cfg', preseedHandle ) def updateAptCache(self): self.aptCache = apt_pkg.GetCache(self.aptOptProgress) self.aptSourceList = apt_pkg.GetPkgSourceList() self.aptSourceList.ReadMainList() try: self.aptCache.Update(self.aptFetchProgress, self.aptSourceList) except SystemError: print 'Error ' self.aptCache.Open(self.aptOptProgress) self.aptDepCache = apt_pkg.GetDepCache(self.aptCache) self.aptRecords = apt_pkg.GetPkgRecords(self.aptCache) def initApt( self ): apt_pkg.InitConfig() apt_pkg.InitSystem() apt_pkg.ReadConfigFile(apt_pkg.Config, self.aptConfFileName ) self.aptAcquire = apt_pkg.GetAcquire( self.aptFetchProgress ) def queueFileDownload( self, uri, destFile ): apt_pkg.GetPkgAcqFile(self.aptAcquire, uri=uri, descr= uri + ' -> ' + os.path.basename( destFile ) , destFile=destFile) def runDownloadQueue( self ): res = self.aptAcquire.Run() if res != self.aptAcquire.ResultContinue: return False return True def downloadFile(self, uri, destFile ): self.queueFileDownload( uri, destFile) return self.runDownloadQueue() def makePbuilderConfig( self ): os.makedirs( self.pbuilderPrefix + '/build' ) os.makedirs( self.pbuilderPrefix + '/result' ) os.makedirs( self.pbuilderPrefix + '/archives' ) packagesGz = gzip.open( '%s/result/Packages.gz' % self.pbuilderPrefix, 'w') packagesGz.write('') packagesGz.close() releaseFile = open('%s/result/Release' % self.pbuilderPrefix, 'w' ) releaseFile.write('Archive: %s\n' % self.dist) releaseFile.write('Component: main\n') releaseFile.write('Origin: pbuilder\n') releaseFile.write('Label: pbuilder\n') releaseFile.write('Architecture: %s' % self.arch ) releaseFile.close() self.pbuilderConfig = '--basetgz %s/base.tgz ' % self.pbuilderPrefix self.pbuilderConfig += '--buildplace %s/build ' % self.pbuilderPrefix self.pbuilderConfig += '--buildresult %s/result ' % self.pbuilderPrefix self.pbuilderConfig += '--mirror "%s" ' % self.mirrorurl self.pbuilderConfig += '--othermirror "deb file://%s/result ./ | deb %s" ' % ( self.pbuilderPrefix, ' | deb '.join( self.extramirrors ) ) self.pbuilderConfig += '--aptcache %s/archives ' % self.pbuilderPrefix self.pbuilderConfig += '--components "%s" ' % ' '.join( self.modules ) self.pbuilderConfig += '--distribution %s ' % self.dist self.pbuilderConfig += '--bindmounts %s/result ' % self.pbuilderPrefix self.pbuilderConfig += '--architecture %s ' % self.arch os.system('pbuilder create %s' % self.pbuilderConfig ) def pbuildPackages( self ): for package in self.buildPackages: if os.system('pbuilder update %s' % self.pbuilderConfig ) != 0: raise Exception('Update Failure') if os.system('pbuilder build %s %s' % ( self.pbuilderConfig, package ) ) != 0: raise Exception('Build Failure') os.system('cd %s/result && apt-ftparchive packages . | gzip > Packages.gz' % self.pbuilderPrefix) def makeConfig( self ): aptConfFileHandle = open( self.aptConfFileName, 'w' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Origin "Debian Remaster Script";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Label "'+ self.label + '";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Suite "' + self.dist + '";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Codename "' + self.dist + '";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Architectures "' + self.arch + '";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Components "main";\n' ) aptConfFileHandle.write( 'APT::FTPArchive::Release::Description "Installer for ' + self.label + ' on the ' + self.arch + '";\n' ) aptConfFileHandle.close() archiveConfFileHandle = open( self.archiveConfFileName, 'w' ) archiveConfFileHandle.write( 'Dir::ArchiveDir "' + self.outputDir + '";\n' ) archiveConfFileHandle.write( 'Dir::CacheDir "' + self.tmpdir + '";\n' ) archiveConfFileHandle.write( 'TreeDefault::Directory "pool/";\n' ) archiveConfFileHandle.write( 'Default::Packages::Extensions ".deb";\n' ) archiveConfFileHandle.write( 'Default::Packages::Compress ". gzip";\n' ) archiveConfFileHandle.write( 'Default::Contents::Compress "gzip";\n' ) archiveConfFileHandle.write( 'BinDirectory "pool/main" {\n' ) archiveConfFileHandle.write( ' Packages "dists/'+ self.dist +'/main/binary-'+ self.arch + '/Packages";\n' ) archiveConfFileHandle.write( ' Contents "dists/'+ self.dist +'/Contents-'+ self.arch + '";\n' ) archiveConfFileHandle.write( ' BinOverride "'+ self.overrides + '";\n' ) archiveConfFileHandle.write( ' ExtraOverride "'+ self.extraOverrides + '";\n' ) archiveConfFileHandle.write( '};\n' ) archiveConfFileHandle.close() releaseFileHandle = open( self.binaryReleaseFile, 'w') releaseFileHandle.write( 'Archive: '+ self.dist + '\n' ) releaseFileHandle.write( 'Version: '+ self.version + '\n' ) releaseFileHandle.write( 'Component: main\n' ) releaseFileHandle.write( 'Origin: Debian Remaster Script\n' ) releaseFileHandle.write( 'Label: Custom packages for ' + self.label + '\n' ) releaseFileHandle.write( 'Architecture: ' + self.arch + '\n' ) releaseFileHandle.close() def copyInstaller( self ): shutil.copy( os.path.join( self.installers, 'initrd.gz'), os.path.join( self.tmpdir, 'initrd.gz' )) shutil.copy( os.path.join( self.installers, 'vmlinuz'), os.path.join( self.tmpdir, 'vmlinuz' )) return True def contatonateFiles( self, sources, target ): targetFile = open( target, 'w' ) for sourceFileName in sources: sourceFile = open( sourceFileName, 'r' ) targetFile.write( sourceFile.read() ) sourceFile.close() targetFile.close() def downloadOverrides( self ): urlHash = {} overrides = [] extraOverrides = [] installOverrides = [] for module in self.modules: override = os.path.join( self.tmpdir, 'override.' + self.dist + '.' + module ) extraOverride = os.path.join( self.tmpdir, 'override.' + self.dist + '.extra.' + module ) installOverride = os.path.join( self.tmpdir, 'override.' + self.dist + '.' + module + '.debian-installer' ) self.queueFileDownload( self.mirrorurl + '/indices/override.' + self.dist + '.' + module, override ) self.queueFileDownload( self.mirrorurl + '/indices/override.' + self.dist + '.extra.' + module, extraOverride ) self.queueFileDownload( self.mirrorurl + '/indices/override.' + self.dist + '.' + module + '.debian-installer', installOverride ) overrides.append( override ) extraOverrides.append( extraOverride ) installOverrides.append( installOverride ) for component in self.components: moduleOverride = os.path.join( self.tmpdir,'override.' + self.dist + '-' + component + '.' + module) moduleExtraOverride = os.path.join( self.tmpdir,'override.' + self.dist + '-' + component + '.extra.' + module ) self.queueFileDownload( self.mirrorurl + '/indices/override.' + self.dist + '-' + component + '.' + module, moduleOverride ) self.queueFileDownload( self.mirrorurl + '/indices/override.' + self.dist + '-' + component + '.extra.' + module, moduleExtraOverride ) overrides.append( moduleOverride ) extraOverrides.append( moduleExtraOverride ) self.runDownloadQueue() self.contatonateFiles( overrides, self.overrides ) self.contatonateFiles( extraOverrides, self.extraOverrides ) self.contatonateFiles( installOverrides, self.installOverrides ) def downloadUdebs( self ): root = os.path.join( self.tmpdir, 'installer' ) self.makeAptDirStructure( root ) self.configureInstallerSourceList( root ) self.configureApt( root ) self.updateAptCache() for pkg in self.aptCache.Packages: if pkg.Section == 'debian-installer': self.aptDepCache.MarkInstall(pkg) self.downloadArchives() def downloadDebs( self ): root = os.path.join( self.tmpdir, 'packages' ) self.pbuildPackages() self.makeAptDirStructure( root ) self.configurePackageSourceList( root ) self.configureApt( root ) self.updateAptCache() self.markCorePackageList() self.markExtraInstalls() self.downloadArchives() def markExtraInstalls( self ): for task in self.tasks: self.markTaskPackages( task ) for pkgName in self.packagelist: self.aptDepCache.MarkInstall(self.aptCache[pkgName]) def downloadArchives(self): pm = apt_pkg.GetPackageManager( self.aptDepCache ) pm.GetArchives(self.aptAcquire, self.aptSourceList, self.aptRecords ) self.aptAcquire.Run() def makeFtpArchive( self ): for file in glob.glob(self.archiveDir + 'archives/*.*deb'): shutil.copy( file, self.poolDir ) packages = open( self.debInstallerDir + 'Packages', 'w') packagesGz = gzip.open( self.debInstallerDir + 'Packages.gz', 'w') ## Because of a bug in the debian installer you must sort the package list and do this manually. for package in os.popen('cd ' + self.outputDir + '; dpkg-scanpackages -t udeb . ' + self.installOverrides + ' | sort-dctrl'): packages.write( package ) packagesGz.write( package ) packages.close() packagesGz.close() os.popen('apt-ftparchive -c ' + self.aptConfFileName + ' generate ' + self.archiveConfFileName) releaseFile = open( self.releaseFile, 'w') releaseFile.write( os.popen('apt-ftparchive -c ' + self.aptConfFileName + ' release ' + self.outputDir + '/dists/' + self.dist).read() ) releaseFile.close() def buildUsbBoot( self ): shutil.copy( '/usr/lib/syslinux/syslinux.com', os.path.join( self.outputDir, 'syslinux.com') ) shutil.copy( '/usr/lib/syslinux/vesamenu.c32', os.path.join( self.outputDir, 'vesamenu.c32') ) shutil.copy( os.path.join( self.tmpdir, 'vmlinuz'), os.path.join( self.outputDir, 'vmlinuz')) shutil.copy( os.path.join( self.tmpdir, 'initrd.gz'), os.path.join( self.outputDir, 'initrd.gz')) isolinuxConf = open( os.path.join( self.outputDir, 'syslinux.cfg'), 'w' ) isolinuxConf.write( 'default vesamenu.c32\n') isolinuxConf.write( 'menu title ' + self.label + ' Installer Options\n') isolinuxConf.write( 'prompt 0\n') isolinuxConf.write( 'timeout 0\n') isolinuxConf.write( 'label item0\n') isolinuxConf.write( 'menu label Basic install\n') isolinuxConf.write( 'kernel /vmlinuz\n') isolinuxConf.write( 'append initrd=/initrd.gz debconf/priority=critical cdrom-detect/try-usb=true\n') isolinuxConf.write( 'label item1\n') isolinuxConf.write( 'menu label Expert install\n') isolinuxConf.write( 'kernel /vmlinuz\n') isolinuxConf.write( 'append initrd=/initrd.gz debconf/priority=low cdrom-detect/try-usb=true\n') isolinuxConf.close() def buildIsoBoot( self ): shutil.copy( '/usr/lib/syslinux/isolinux.bin', os.path.join( self.isoBootDir, 'isolinux.bin')) shutil.copy( '/usr/lib/syslinux/vesamenu.c32', os.path.join( self.isoBootDir, 'vesamenu.c32')) shutil.copy( os.path.join( self.tmpdir, 'vmlinuz'), os.path.join( self.isoBootDir, 'vmlinuz')) shutil.copy( os.path.join( self.tmpdir, 'initrd.gz'), os.path.join( self.isoBootDir, 'initrd.gz')) isolinuxConf = open( os.path.join( self.isoBootDir,'isolinux.cfg'), 'w' ) isolinuxConf.write( 'default vesamenu.c32\n') isolinuxConf.write( 'menu title ' + self.label + ' Installer Options\n') isolinuxConf.write( 'prompt 0\n') isolinuxConf.write( 'timeout 0\n') isolinuxConf.write( 'label item0\n') isolinuxConf.write( 'menu label Basic install\n') isolinuxConf.write( 'kernel /isolinux/vmlinuz\n') isolinuxConf.write( 'append initrd=/isolinux/initrd.gz debconf/priority=high cdrom-detect/try-usb=true DEBCONF_DEBUG=developer\n') isolinuxConf.write( 'label item1\n') isolinuxConf.write( 'menu label Expert install\n') isolinuxConf.write( 'kernel /isolinux/vmlinuz\n') isolinuxConf.write( 'append initrd=/isolinux/initrd.gz debconf/priority=low cdrom-detect/try-usb=true DEBCONF_DEBUG=developer\n') #isolinuxConf.write( 'label ' + self.label + ' debug install\n') #isolinuxConf.write( 'kernel /isolinux/vmlinuz\n') #isolinuxConf.write( 'append initrd=/isolinux/initrd.gz debconf/priority=low cdrom-detect/try-usb=true DEBCONF_DEBUG=developer\n') isolinuxConf.close() def buildInstallFilesystem( self ): os.mkdir( os.path.join( self.outputDir, '.disk') ) diskfile = open( os.path.join( self.outputDir, '.disk/cd_type'), 'w' ) diskfile.write( 'full_cd/single' ) diskfile.close() diskfile = open(os.path.join( self.outputDir, '.disk/base_installable'), 'w' ) diskfile.write( '\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, '.disk/base_include'), 'w' ) diskfile.write( '\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, '.disk/base_exclude'), 'w' ) diskfile.write( '\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, '.disk/info'), 'w' ) diskfile.write( self.label + ' "' + self.dist + '" - Release ' + self.version + ' for ' + self.arch + '\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, '.disk/udeb_include'), 'w' ) diskfile.write( '\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, '.disk/base_components'), 'w' ) diskfile.write( 'main\n' ) diskfile.close() diskfile = open( os.path.join( self.outputDir, 'README.diskdefines'), 'w' ) diskfile.write( '#define DISKNAME ' + self.label + ' "' + self.dist + '" - Release ' + self.version + ' for ' + self.arch + '\n') diskfile.write( '#define TYPE binary\n') diskfile.write( '#define TYPEbinary 1\n') diskfile.write( '#define ARCH ' + self.arch + '\n') diskfile.write( '#define ARCH' + self.arch + ' 1\n') diskfile.write( '#define DISKNUM 1\n') diskfile.write( '#define DISKNUM1 1\n') diskfile.write( '#define TOTALNUM 0\n') diskfile.write( '#define TOTALNUM0 1\n') diskfile.close() def writeIso( self ): for statusline in os.popen( 'mkisofs -r -o ' + self.output + ' -V "' + self.label + ' Installer" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ' + self.outputDir ): print statusline def markTaskPackages( self, task ): for pkg in self.aptCache.Packages: version = self.aptDepCache.GetCandidateVer(pkg) if version and version.FileList: f, index = version.FileList[0] self.aptRecords.Lookup((f, index)) section = apt_pkg.ParseSection(self.aptRecords.Record) if section.has_key('Task'): if task in section['Task'].split(','): self.aptDepCache.MarkInstall(pkg) def markCorePackageList( self ): for pkg in self.aptCache.Packages: version = self.aptDepCache.GetCandidateVer(pkg) if ( version and version.Priority <= apt_pkg.PriStandard ) or pkg.Essential or pkg.Important: self.aptDepCache.MarkInstall(pkg) def injectFileIntoInitrd( self, initrd, fileName, contents ): initrdDir = tempfile.mkdtemp() os.popen( 'cd ' + initrdDir + '; gzip -dc ' + initrd + ' | fakeroot cpio -id') file = open( initrdDir + '/' + fileName, 'w') file.write( contents.read() ) file.close() os.popen( 'cd ' + initrdDir + '; find ./ | cpio -H newc -o | gzip -9 > ' + initrd ) shutil.rmtree( initrdDir ) tasks = ['server'] components = [ 'updates', 'security' ] mirror = 'http://mirror.anl.gov/ubuntu' label = 'Goldstar Farms' kernelPackage = 'linux-image-server' dist = 'lucid' arch = 'amd64' packagelist = [ 'dnsmasq', 'smartmontools','powernowd', 'wvdial', 'python-libvirt', 'libvirt-bin', 'ubuntu-virt-server','samba','winbind','smbfs', 'libpam-smbpass','alsa-utils','rungetty', 'python-dbus', 'xinit', 'xserver-xorg-video-intel', 'xserver-xorg-input-all', 'xfonts-base', 'libgl1-mesa-dri', 'xserver-xorg-video-fbdev', 'xserver-xorg-video-vesa', 'xterm', 'whiptail', 'pulseaudio','nodm','tinywm','ufw', ] modules = [ 'main', 'universe', 'multiverse' ] preseedOptions = [ [ 'd-i','debian-installer/locale','string','en' ], [ 'd-i','debian-installer/language','string','en' ], [ 'd-i','console-setup/ask_detect','boolean','false' ], [ 'd-i','console-setup/layoutcode','string','us' ], [ 'd-i','console-setup/variant','select','USA' ], [ 'netcfg','netcfg/use_dhcp','boolean','true' ], [ 'netcfg','netcfg/get_hostname','string','farm' ], [ 'netcfg','netcfg/get_domain','string','goldstar.local' ], [ 'netcfg','netcfg/network-manager','boolean','false' ], [ 'netcfg','netcfg/disable_dhcp','boolean','false' ], [ 'd-i','time/zone','string','US/Central' ], [ 'grub-installer','grub-installer/only_debian','boolean','false' ], [ 'grub-installer','grub-installer/bootdev','string','/dev/sda' ], [ 'grub-installer','grub-installer/with_other_os','boolean','false' ], [ 'bootstrap-base','base-installer/initramfs-tools/driver-policy','select','dep' ], [ 'bootstrap-base','base-installer/kernel/linux/initramfs-tools/driver-policy','string','dep' ], [ 'bootstrap-base','base-installer/install-recommends','boolean','false' ], [ 'clock-setup','clock-setup/utc','boolean','true' ], [ 'clock-setup','clock-setup/ntp','boolean','true' ], [ 'clock-setup','clock-setup/ntp-server','string','pool.ntp.org' ], [ 'user-setup','passwd/root-login','boolean','true' ], [ 'user-setup','passwd/root-password','password','r00tme' ], [ 'user-setup','passwd/root-password-again','password','r00tme' ], [ 'user-setup','passwd/username','string','user' ], [ 'user-setup','passwd/user-default-groups','string','users' ], [ 'user-setup','user-setup/encrypt-home','boolean','false' ], [ 'user-setup','passwd/user-fullname','string','Samba user' ], [ 'user-setup','passwd/make-user','boolean','true' ], [ 'user-setup','passwd/user-password','password','password' ], [ 'user-setup','passwd/user-password-again','password','password' ], [ 'user-setup','user-setup/allow-password-weak','boolean','true' ], [ 'pkgsel','pkgsel/upgrade','select','safe-upgrade' ], [ 'pkgsel','pkgsel/install-language-support','boolean','false' ], [ 'pkgsel','pkgsel/update-policy','select','none' ], [ 'pkgsel','pkgsel/updatedb','boolean','true' ], [ 'pkgsel','pkgsel/include/install-recommends','boolean','false' ], [ 'pkgsel','pkgsel/language-pack-patterns','string' ], [ 'apt-mirror-setup','apt-setup/use_mirror','boolean','true'], [ 'choose-mirror-bin','mirror/country','string','manual'], [ 'choose-mirror-bin','mirror/protocol','string', 'http' ], [ 'choose-mirror-bin','mirror/codename','string', dist ], [ 'choose-mirror-bin','mirror/suite','string', dist ], [ 'choose-mirror-bin','mirror/http/mirror','string', 'mirror.anl.gov' ], [ 'choose-mirror-bin','mirror/http/hostname','string', 'mirror.anl.gov' ], [ 'choose-mirror-bin','mirror/http/directory','string', '/ubuntu' ], [ 'apt-mirror-setup','apt-setup/universe','boolean','true' ], [ 'apt-mirror-setup','apt-setup/multiverse','boolean','true' ], [ 'apt-mirror-setup','apt-setup/security','boolean','false' ], [ 'popularity-contest','popularity-contest/participate','boolean','false' ], ] iso = 'goldstar.iso' extramirrors =[ 'http://ppa.launchpad.net/dnjl/ppa/ubuntu %s main' % dist, 'http://mirror.anl.gov/ubuntu %s-backports %s' % ( dist, ' '.join( modules ) ), 'http://security.ubuntu.com/ubuntu %s-security %s' % ( dist, ' '.join( modules ) )] buildPackages = [] installers = "debian-installer-20081029ubuntu102.2/build/dest/cdrom" remaster = Remaster(iso, modules = modules, arch = arch, packagelist = packagelist, label = label, mirror = mirror, tasks = tasks, components = components, dist = dist, extramirrors = extramirrors, preseedOptions = preseedOptions, kernelPackage = kernelPackage, buildPackages = buildPackages, installers = installers ) remaster.makeDirStructure() remaster.makeConfig() remaster.initApt() remaster.makePbuilderConfig() remaster.copyInstaller() remaster.downloadOverrides() remaster.downloadUdebs() remaster.downloadDebs() remaster.makeFtpArchive() remaster.makePreseed() remaster.buildIsoBoot() remaster.buildUsbBoot() remaster.buildInstallFilesystem() remaster.writeIso() remaster.cleanDirStructure() print remaster.tmpdir