Added some tree scrubs to the code;
This commit is contained in:
parent
272ec190c7
commit
d58f206122
@ -461,12 +461,11 @@ class Lorax(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def create_install_image(self, type="squashfs"):
|
def create_install_image(self, type="squashfs"):
|
||||||
# scrub the install tree
|
|
||||||
install = images.Install(self.conf)
|
|
||||||
install.run()
|
|
||||||
|
|
||||||
installimg = os.path.join(self.conf.imagesdir, "install.img")
|
installimg = os.path.join(self.conf.imagesdir, "install.img")
|
||||||
|
|
||||||
|
if os.path.exists(installimg):
|
||||||
|
os.unlink(installimg)
|
||||||
|
|
||||||
if type == "squashfs":
|
if type == "squashfs":
|
||||||
cmd = "mksquashfs %s %s -all-root -no-fragments -no-progress" \
|
cmd = "mksquashfs %s %s -all-root -no-fragments -no-progress" \
|
||||||
% (self.conf.treedir, installimg)
|
% (self.conf.treedir, installimg)
|
||||||
@ -474,8 +473,7 @@ class Lorax(object):
|
|||||||
err, output = commands.getstatusoutput(cmd)
|
err, output = commands.getstatusoutput(cmd)
|
||||||
if err:
|
if err:
|
||||||
self.se.info(output)
|
self.se.info(output)
|
||||||
# XXX this gives an error on read only filesystem
|
return False
|
||||||
#return False
|
|
||||||
|
|
||||||
elif type == "cramfs":
|
elif type == "cramfs":
|
||||||
if self.conf.buildarch == "sparc64":
|
if self.conf.buildarch == "sparc64":
|
||||||
@ -505,6 +503,11 @@ class Lorax(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def create_boot_iso(self):
|
def create_boot_iso(self):
|
||||||
|
bootiso = os.path.join(self.conf.imagesdir, "boot.iso")
|
||||||
|
|
||||||
|
if os.path.exists(bootiso):
|
||||||
|
os.unlink(bootiso)
|
||||||
|
|
||||||
efiboot = os.path.join(self.conf.imagesdir, "efiboot.img")
|
efiboot = os.path.join(self.conf.imagesdir, "efiboot.img")
|
||||||
|
|
||||||
if os.path.exists(efiboot):
|
if os.path.exists(efiboot):
|
||||||
@ -520,9 +523,9 @@ class Lorax(object):
|
|||||||
biosargs = "-b isolinux/isolinux.bin -c isolinux/boot.cat" \
|
biosargs = "-b isolinux/isolinux.bin -c isolinux/boot.cat" \
|
||||||
" -no-emul-boot -boot-load-size 4 -boot-info-table"
|
" -no-emul-boot -boot-load-size 4 -boot-info-table"
|
||||||
mkisocmd = "mkisofs -v -o %s %s %s -R -J -V %s -T -graft-points" \
|
mkisocmd = "mkisofs -v -o %s %s %s -R -J -V %s -T -graft-points" \
|
||||||
" isolinux=%s images=%s %s" % (os.path.join(self.conf.imagesdir,
|
" isolinux=%s images=%s %s" % (bootiso, biosargs, efiargs,
|
||||||
"boot.iso"), biosargs, efiargs, self.conf.product,
|
self.conf.product, self.conf.isolinuxdir, self.conf.imagesdir,
|
||||||
self.conf.isolinuxdir, self.conf.imagesdir, efigraft)
|
efigraft)
|
||||||
self.so.debug(mkisocmd)
|
self.so.debug(mkisocmd)
|
||||||
err, out = commands.getstatusoutput(mkisocmd)
|
err, out = commands.getstatusoutput(mkisocmd)
|
||||||
if err:
|
if err:
|
||||||
@ -616,6 +619,10 @@ class Lorax(object):
|
|||||||
initrd.run()
|
initrd.run()
|
||||||
|
|
||||||
self.so.header(":: Creating the install image")
|
self.so.header(":: Creating the install image")
|
||||||
|
|
||||||
|
self.so.info("Scrubbing the install tree")
|
||||||
|
tree.scrub()
|
||||||
|
|
||||||
ok = self.create_install_image()
|
ok = self.create_install_image()
|
||||||
if not ok:
|
if not ok:
|
||||||
self.se.error("Unable to create the install image")
|
self.se.error("Unable to create the install image")
|
||||||
|
@ -1,341 +0,0 @@
|
|||||||
import stat
|
|
||||||
import commands
|
|
||||||
import glob
|
|
||||||
import fnmatch
|
|
||||||
import pwd
|
|
||||||
import grp
|
|
||||||
|
|
||||||
|
|
||||||
class Lorax(object):
|
|
||||||
|
|
||||||
def scrub_treedir(self):
|
|
||||||
# XXX here comes a lot of crazy tree modification stuff, beware! XXX
|
|
||||||
|
|
||||||
# create dogtail conf files
|
|
||||||
dogtailconf = os.path.join(self.conf.datadir, 'dogtail', '%gconf.xml')
|
|
||||||
if os.path.isfile(dogtailconf):
|
|
||||||
dst = os.path.join(self.conf.treedir, '.gconf', 'desktop', 'gnome', 'interface')
|
|
||||||
os.makedirs(dst)
|
|
||||||
shutil.copy2(dogtailconf, dst)
|
|
||||||
|
|
||||||
touch(os.path.join(self.conf.treedir, '.gconf', 'desktop', '%gconf.xml'))
|
|
||||||
touch(os.path.join(self.conf.treedir, '.gconf', 'desktop', 'gnome', '%gconf.xml'))
|
|
||||||
|
|
||||||
# XXX wth is this part useful for?
|
|
||||||
|
|
||||||
# XXX this one already exists
|
|
||||||
#os.makedirs(os.path.join(self.conf.treedir, 'lib'))
|
|
||||||
os.makedirs(os.path.join(self.conf.treedir, 'firmware'))
|
|
||||||
os.makedirs(os.path.join(self.conf.treedir, 'modules'))
|
|
||||||
|
|
||||||
# XXX this will overwrite the modules which are installed, why would i want to do that?
|
|
||||||
#os.symlink('/modules', os.path.join(self.conf.treedir, 'lib', 'modules'))
|
|
||||||
#os.symlink('/firmware', os.path.join(self.conf.treedir, 'lib', 'firmware'))
|
|
||||||
|
|
||||||
# create debug dirs
|
|
||||||
os.makedirs(os.path.join(self.conf.treedir, 'usr', 'lib', 'debug'))
|
|
||||||
os.makedirs(os.path.join(self.conf.treedir, 'usr', 'src', 'debug'))
|
|
||||||
|
|
||||||
# copy stubs
|
|
||||||
for file in ('raidstart', 'raidstop', 'losetup', 'list-harddrives', 'loadkeys', 'mknod',
|
|
||||||
'syslogd'):
|
|
||||||
src = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda', file + '-stub')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', file)
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
|
|
||||||
# move anaconda executable
|
|
||||||
src = os.path.join(self.conf.treedir, 'usr', 'sbin', 'anaconda')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', 'anaconda')
|
|
||||||
shutil.move(src, dst)
|
|
||||||
|
|
||||||
# move anaconda libraries
|
|
||||||
src = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda-runtime', 'lib*')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'usr', self.conf.libdir)
|
|
||||||
for name in glob.iglob(src):
|
|
||||||
shutil.move(name, dst)
|
|
||||||
|
|
||||||
# change tree permissions
|
|
||||||
root_uid = pwd.getpwnam('root')[2]
|
|
||||||
root_gid = grp.getgrnam('root')[2]
|
|
||||||
|
|
||||||
for root, files, dirs in os.walk(self.conf.treedir):
|
|
||||||
os.chown(root, root_uid, root_gid)
|
|
||||||
os.chmod(root, 0755)
|
|
||||||
|
|
||||||
for file in files:
|
|
||||||
path = os.path.join(root, file)
|
|
||||||
os.chown(path, root_uid, root_gid)
|
|
||||||
|
|
||||||
mode = os.stat(path).st_mode
|
|
||||||
if (mode & stat.S_IXUSR) or (mode & stat.S_IXGRP) or (mode & stat.S_IXOTH):
|
|
||||||
os.chmod(path, 0555)
|
|
||||||
else:
|
|
||||||
os.chmod(path, 0444)
|
|
||||||
|
|
||||||
# create ld.so.conf
|
|
||||||
ldsoconf = os.path.join(self.conf.treedir, 'etc', 'ld.so.conf')
|
|
||||||
touch(ldsoconf)
|
|
||||||
|
|
||||||
procdir = os.path.join(self.conf.treedir, 'proc')
|
|
||||||
if not os.path.isdir(procdir):
|
|
||||||
os.makedirs(procdir)
|
|
||||||
os.system('mount -t proc proc %s' % procdir)
|
|
||||||
|
|
||||||
f = open(ldsoconf, 'w')
|
|
||||||
f.write('/usr/kerberos/%s\n' % self.conf.libdir)
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
cwd = os.getcwd()
|
|
||||||
os.chdir(self.conf.treedir)
|
|
||||||
os.system('/usr/sbin/chroot %s /sbin/ldconfig' % self.conf.treedir)
|
|
||||||
os.chdir(cwd)
|
|
||||||
|
|
||||||
if self.conf.buildarch not in ('s390', 's390x'):
|
|
||||||
# XXX this is not in usr
|
|
||||||
rm(os.path.join(self.conf.treedir, 'usr', 'sbin', 'ldconfig'))
|
|
||||||
|
|
||||||
# XXX why are we removing this?
|
|
||||||
#rm(os.path.join(self.conf.treedir, 'etc', 'ld.so.conf'))
|
|
||||||
os.system('umount %s' % procdir)
|
|
||||||
|
|
||||||
# figure out the gtk+ theme to keep
|
|
||||||
gtkrc = os.path.join(self.conf.treedir, 'etc', 'gtk-2.0', 'gtkrc')
|
|
||||||
gtk_theme_name = None
|
|
||||||
gtk_engine = None
|
|
||||||
gtk_icon_themes = []
|
|
||||||
|
|
||||||
if os.path.isfile(gtkrc):
|
|
||||||
f = open(gtkrc, 'r')
|
|
||||||
lines = f.readlines()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
for line in lines:
|
|
||||||
line = line.strip()
|
|
||||||
if line.startswith('gtk-theme-name'):
|
|
||||||
gtk_theme_name = line[line.find('=') + 1:]
|
|
||||||
gtk_theme_name = gtk_theme_name.replace('"', '').strip()
|
|
||||||
|
|
||||||
# find the engine for this theme
|
|
||||||
gtkrc = os.path.join(self.conf.treedir, 'usr', 'share', 'themes',
|
|
||||||
gtk_theme_name, 'gtk-2.0', 'gtkrc')
|
|
||||||
if os.path.isfile(gtkrc):
|
|
||||||
f = open(gtkrc, 'r')
|
|
||||||
engine_lines = f.readlines()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
for engine_line in engine_lines:
|
|
||||||
engine_line = engine_line.strip()
|
|
||||||
if engine_line.find('engine') != -1:
|
|
||||||
gtk_engine = engine_line[engine_line.find('"') + 1:]
|
|
||||||
gtk_engine = gtk_engine.replace('"', '').strip()
|
|
||||||
break
|
|
||||||
|
|
||||||
elif line.startswith('gtk-icon-theme-name'):
|
|
||||||
icon_theme = line[line.find('=') + 1:]
|
|
||||||
icon_theme = icon_theme.replace('"', '').strip()
|
|
||||||
gtk_icon_themes.append(icon_theme)
|
|
||||||
|
|
||||||
# bring in all inherited themes
|
|
||||||
while True:
|
|
||||||
icon_theme_index = os.path.join(self.conf.treedir, 'usr', 'share', 'icons',
|
|
||||||
icon_theme, 'index.theme')
|
|
||||||
if os.path.isfile(icon_theme_index):
|
|
||||||
inherits = False
|
|
||||||
f = open(icon_theme_index, 'r')
|
|
||||||
icon_lines = f.readlines()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
for icon_line in icon_lines:
|
|
||||||
icon_line = icon_line.strip()
|
|
||||||
if icon_line.startswith('Inherits='):
|
|
||||||
inherits = True
|
|
||||||
icon_theme = icon_line[icon_line.find('=') + 1:]
|
|
||||||
icon_theme = icon_theme.replace('"', '').strip()
|
|
||||||
gtk_icon_themes.append(icon_theme)
|
|
||||||
break
|
|
||||||
|
|
||||||
if not inherits:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
# remove themes we don't need
|
|
||||||
theme_path = os.path.join(self.conf.treedir, 'usr', 'share', 'themes')
|
|
||||||
if os.path.isdir(theme_path):
|
|
||||||
for theme in filter(lambda theme: theme != gtk_theme_name, os.listdir(theme_path)):
|
|
||||||
theme = os.path.join(theme_path, theme)
|
|
||||||
shutil.rmtree(theme, ignore_errors=True)
|
|
||||||
|
|
||||||
# remove icons we don't need
|
|
||||||
icon_path = os.path.join(self.conf.treedir, 'usr', 'share', 'icons')
|
|
||||||
if os.path.isdir(icon_path):
|
|
||||||
for icon in filter(lambda icon: icon not in gtk_icon_themes, os.listdir(icon_path)):
|
|
||||||
icon = os.path.join(icon_path, icon)
|
|
||||||
shutil.rmtree(icon, ignore_errors=True)
|
|
||||||
|
|
||||||
# remove engines we don't need
|
|
||||||
tmp_path = os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'gtk-2.0')
|
|
||||||
if os.path.isdir(tmp_path):
|
|
||||||
fnames = map(lambda fname: os.path.join(tmp_path, fname, 'engines'), os.listdir(tmp_path))
|
|
||||||
dnames = filter(lambda fname: os.path.isdir(fname), fnames)
|
|
||||||
for dir in dnames:
|
|
||||||
engines = filter(lambda engine: engine.find(gtk_engine) == -1, os.listdir(dir))
|
|
||||||
for engine in engines:
|
|
||||||
engine = os.path.join(dir, engine)
|
|
||||||
os.unlink(engine)
|
|
||||||
|
|
||||||
# remove locales
|
|
||||||
langtable = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda', 'lang-table')
|
|
||||||
localepath = os.path.join(self.conf.treedir, 'usr', 'share', 'locale')
|
|
||||||
if os.path.isfile(langtable):
|
|
||||||
locales = set()
|
|
||||||
all_locales = set()
|
|
||||||
|
|
||||||
f = open(langtable, 'r')
|
|
||||||
lines = f.readlines()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
for line in lines:
|
|
||||||
line = line.strip()
|
|
||||||
if not line or line.startswith('#'):
|
|
||||||
continue
|
|
||||||
|
|
||||||
fields = line.split('\t')
|
|
||||||
|
|
||||||
if os.path.isdir(os.path.join(localepath, fields[1])):
|
|
||||||
locales.add(fields[1])
|
|
||||||
|
|
||||||
locale = fields[3].split('.')[0]
|
|
||||||
if os.path.isdir(os.path.join(localepath, locale)):
|
|
||||||
locales.add(locale)
|
|
||||||
|
|
||||||
for locale in os.listdir(localepath):
|
|
||||||
all_locales.add(locale)
|
|
||||||
|
|
||||||
locales_to_remove = list(all_locales.difference(locales))
|
|
||||||
for locale in locales_to_remove:
|
|
||||||
rmpath = os.path.join(localepath, locale)
|
|
||||||
shutil.rmtree(rmpath, ignore_errors=True)
|
|
||||||
|
|
||||||
# fixup joe links
|
|
||||||
joedir = os.path.join(self.conf.treedir, 'etc', 'joe')
|
|
||||||
if os.path.isdir(joedir):
|
|
||||||
os.symlink('jpicorc', os.path.join(joedir, 'picorc'))
|
|
||||||
os.symlink('jpicorc', os.path.join(joedir, 'jnanorc'))
|
|
||||||
os.symlink('jpicorc', os.path.join(joedir, 'nanorc'))
|
|
||||||
os.symlink('jmacsrc', os.path.join(joedir, 'emacsrc'))
|
|
||||||
os.symlink('jmacs', os.path.join(self.conf.treedir, 'usr', 'bin', 'emacs'))
|
|
||||||
os.symlink('jpico', os.path.join(self.conf.treedir, 'usr', 'bin', 'pico'))
|
|
||||||
os.symlink('jpico', os.path.join(self.conf.treedir, 'usr', 'bin', 'nano'))
|
|
||||||
|
|
||||||
# fix up some links for man page related stuff
|
|
||||||
for file in ['nroff', 'groff', 'iconv', 'geqn', 'gtbl', 'gpic', 'grefer']:
|
|
||||||
src = os.path.join('mnt', 'sysimage', 'usr', 'bin', file)
|
|
||||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', file)
|
|
||||||
if not os.path.isfile(dst):
|
|
||||||
os.symlink(src, dst)
|
|
||||||
|
|
||||||
# create selinux config
|
|
||||||
if os.path.exists(os.path.join(self.conf.treedir, 'etc', 'selinux', 'targeted')):
|
|
||||||
src = os.path.join(self.conf.datadir, 'selinux', 'config')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'etc', 'selinux', 'config')
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
|
|
||||||
# create libuser.conf
|
|
||||||
src = os.path.join(self.conf.datadir, 'libuser', 'libuser.conf')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'etc', 'libuser.conf')
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
|
|
||||||
# configure fedorakmod
|
|
||||||
fedorakmodconf = os.path.join(self.conf.treedir, 'etc', 'yum', 'pluginconf.d',
|
|
||||||
'fedorakmod.conf')
|
|
||||||
replace(fedorakmodconf, r'\(installforallkernels\) = 0', r'\1 = 1')
|
|
||||||
|
|
||||||
# fix /etc/man.config to point into /mnt/sysimage
|
|
||||||
manconfig = os.path.join(self.conf.treedir, 'etc', 'man.config')
|
|
||||||
|
|
||||||
# don't change MANPATH_MAP lines now
|
|
||||||
replace(manconfig, r'^MANPATH[^_MAP][ \t]*', r'&/mnt/sysimage')
|
|
||||||
# change MANPATH_MAP lines now
|
|
||||||
replace(manconfig, r'^MANPATH_MAP[ \t]*[a-zA-Z0-9/]*[ \t]*', r'&/mnt/sysimage')
|
|
||||||
|
|
||||||
# move yum repos
|
|
||||||
src = os.path.join(self.conf.treedir, 'etc', 'yum.repos.d')
|
|
||||||
dst = os.path.join(self.conf.treedir, 'etc', 'anaconda.repos.d')
|
|
||||||
shutil.move(src, dst)
|
|
||||||
|
|
||||||
# remove libunicode-lite
|
|
||||||
rm(os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'libunicode-lite*'))
|
|
||||||
|
|
||||||
# make bash link
|
|
||||||
# XXX already exists
|
|
||||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'bash')):
|
|
||||||
# rm(os.path.join(self.conf.treedir, 'bin', 'ash'))
|
|
||||||
# os.symlink('bash', os.path.join(self.conf.treedir, 'bin', 'sh'))
|
|
||||||
|
|
||||||
# make awk link
|
|
||||||
# XXX already exists
|
|
||||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'gawk')):
|
|
||||||
# os.symlink('awk', os.path.join(self.conf.treedir, 'bin', 'gawk'))
|
|
||||||
|
|
||||||
# copy bootloaders
|
|
||||||
bootpath = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda-runtime', 'boot')
|
|
||||||
if not os.path.isdir(bootpath):
|
|
||||||
os.makedirs(bootpath)
|
|
||||||
|
|
||||||
if self.conf.buildarch in ('i386', 'i586', 'x86_64'):
|
|
||||||
for file in os.listdir(os.path.join(self.conf.treedir, 'boot')):
|
|
||||||
if file.startswith('memtest'):
|
|
||||||
src = os.path.join(self.conf.treedir, 'boot', file)
|
|
||||||
dst = os.path.join(bootpath, file)
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
elif self.conf.buildarch in ('sparc',):
|
|
||||||
for file in os.listdir(os.path.join(self.conf.treedir, 'boot')):
|
|
||||||
if file.endswith('.b'):
|
|
||||||
src = os.path.join(self.conf.treedir, 'boot', file)
|
|
||||||
dst = os.path.join(bootpath, file)
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
elif self.conf.buildarch in ('ppc', 'ppc64'):
|
|
||||||
src = os.path.join(self.conf.treedir, 'boot', 'efika.forth')
|
|
||||||
shutil.copy2(src, bootpath)
|
|
||||||
elif self.conf.buildarch in ('alpha',):
|
|
||||||
src = os.path.join(self.conf.treedir, 'boot', 'bootlx')
|
|
||||||
shutil.copy2(src, bootpath)
|
|
||||||
elif self.conf.buildarch in ('ia64',):
|
|
||||||
src = os.path.join(self.conf.treedir, 'boot', 'efi', 'EFI', 'redhat', '*')
|
|
||||||
shutil.copy2(src, bootpath)
|
|
||||||
|
|
||||||
# remove not needed directories
|
|
||||||
# XXX i need this for kernel
|
|
||||||
#for dir in ('boot', 'home', 'root', 'tmp'):
|
|
||||||
# rm(os.path.join(self.conf.treedir, dir))
|
|
||||||
|
|
||||||
# remove not needed files
|
|
||||||
to_remove = set()
|
|
||||||
for root, dirs, files in os.walk(self.conf.treedir):
|
|
||||||
for file in files:
|
|
||||||
path = os.path.join(root, file)
|
|
||||||
if fnmatch.fnmatch(path, '*.a'):
|
|
||||||
if path.find('kernel-wrapper/wrapper.a') == -1:
|
|
||||||
to_remove.add(path)
|
|
||||||
elif fnmatch.fnmatch(path, 'lib*.la'):
|
|
||||||
if path.find('usr/' + self.conf.libdir + '/gtk-2.0') == -1:
|
|
||||||
to_remove.add(path)
|
|
||||||
elif fnmatch.fnmatch(path, '*.py'):
|
|
||||||
to_remove.add(path + 'o')
|
|
||||||
|
|
||||||
rm(path + 'c')
|
|
||||||
os.symlink('/dev/null', path + 'c')
|
|
||||||
|
|
||||||
for file in to_remove:
|
|
||||||
rm(file)
|
|
||||||
|
|
||||||
# nuke some python stuff we don't need
|
|
||||||
for fname in ['idle', 'distutils', 'bsddb', 'lib-old', 'hotshot', 'doctest.py', 'pydoc.py',
|
|
||||||
'site-packages/japanese', 'site-packages/japanese.pth']:
|
|
||||||
rm(os.path.join(self.conf.treedir, fname))
|
|
||||||
|
|
||||||
for fname in ['distutils', 'lib-dynload/japanese', 'encodings', 'compiler', 'email/test',
|
|
||||||
'curses', 'pydoc.py']:
|
|
||||||
rm(os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'python?.?', 'site-packages',
|
|
||||||
fname))
|
|
@ -1,31 +1,66 @@
|
|||||||
#
|
import stat
|
||||||
# images.py
|
import commands
|
||||||
# lorax images manipulation
|
import pwd
|
||||||
#
|
import grp
|
||||||
# Copyright (C) 2009 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# Red Hat Author(s): Martin Gracik <mgracik@redhat.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
class Install(object):
|
class Install(object):
|
||||||
def __init__(self, config):
|
|
||||||
self.conf = config
|
|
||||||
|
|
||||||
def scrub(self):
|
def scrub(self):
|
||||||
|
# change tree permissions
|
||||||
|
root_uid = pwd.getpwnam('root')[2]
|
||||||
|
root_gid = grp.getgrnam('root')[2]
|
||||||
|
|
||||||
|
for root, files, dirs in os.walk(self.conf.treedir):
|
||||||
|
os.chown(root, root_uid, root_gid)
|
||||||
|
os.chmod(root, 0755)
|
||||||
|
|
||||||
|
for file in files:
|
||||||
|
path = os.path.join(root, file)
|
||||||
|
os.chown(path, root_uid, root_gid)
|
||||||
|
|
||||||
|
mode = os.stat(path).st_mode
|
||||||
|
if (mode & stat.S_IXUSR) or (mode & stat.S_IXGRP) or (mode & stat.S_IXOTH):
|
||||||
|
os.chmod(path, 0555)
|
||||||
|
else:
|
||||||
|
os.chmod(path, 0444)
|
||||||
|
|
||||||
|
# create ld.so.conf
|
||||||
|
ldsoconf = os.path.join(self.conf.treedir, 'etc', 'ld.so.conf')
|
||||||
|
touch(ldsoconf)
|
||||||
|
|
||||||
|
procdir = os.path.join(self.conf.treedir, 'proc')
|
||||||
|
if not os.path.isdir(procdir):
|
||||||
|
os.makedirs(procdir)
|
||||||
|
os.system('mount -t proc proc %s' % procdir)
|
||||||
|
|
||||||
|
f = open(ldsoconf, 'w')
|
||||||
|
f.write('/usr/kerberos/%s\n' % self.conf.libdir)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
cwd = os.getcwd()
|
||||||
|
os.chdir(self.conf.treedir)
|
||||||
|
os.system('/usr/sbin/chroot %s /sbin/ldconfig' % self.conf.treedir)
|
||||||
|
os.chdir(cwd)
|
||||||
|
|
||||||
|
if self.conf.buildarch not in ('s390', 's390x'):
|
||||||
|
# XXX this is not in usr
|
||||||
|
rm(os.path.join(self.conf.treedir, 'usr', 'sbin', 'ldconfig'))
|
||||||
|
|
||||||
|
# XXX why are we removing this?
|
||||||
|
#rm(os.path.join(self.conf.treedir, 'etc', 'ld.so.conf'))
|
||||||
|
os.system('umount %s' % procdir)
|
||||||
|
|
||||||
|
# make bash link
|
||||||
|
# XXX already exists
|
||||||
|
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'bash')):
|
||||||
|
# rm(os.path.join(self.conf.treedir, 'bin', 'ash'))
|
||||||
|
# os.symlink('bash', os.path.join(self.conf.treedir, 'bin', 'sh'))
|
||||||
|
|
||||||
|
# make awk link
|
||||||
|
# XXX already exists
|
||||||
|
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'gawk')):
|
||||||
|
# os.symlink('awk', os.path.join(self.conf.treedir, 'bin', 'gawk'))
|
||||||
|
|
||||||
# move bin to usr/bin
|
# move bin to usr/bin
|
||||||
cp(src_root=self.conf.treedir,
|
cp(src_root=self.conf.treedir,
|
||||||
src_path=os.path.join('bin', '*'),
|
src_path=os.path.join('bin', '*'),
|
@ -754,16 +754,3 @@ class EFI(object):
|
|||||||
# copy the efi image to the output directory
|
# copy the efi image to the output directory
|
||||||
dst = os.path.join(self.conf.imagesdir, "efiboot.img")
|
dst = os.path.join(self.conf.imagesdir, "efiboot.img")
|
||||||
shutil.copy2(efiimage, dst)
|
shutil.copy2(efiimage, dst)
|
||||||
|
|
||||||
|
|
||||||
class Install(object):
|
|
||||||
|
|
||||||
def __init__(self, config):
|
|
||||||
self.conf = config
|
|
||||||
|
|
||||||
def scrub(self):
|
|
||||||
# XXX all the install tree modification stuff goes here
|
|
||||||
pass
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.scrub()
|
|
||||||
|
@ -22,8 +22,10 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import glob
|
import glob
|
||||||
|
import fnmatch
|
||||||
|
import shutil
|
||||||
|
|
||||||
from utils.fileutils import copy
|
from utils.fileutils import copy, move, remove, replace, touch
|
||||||
|
|
||||||
|
|
||||||
class InstallTree(object):
|
class InstallTree(object):
|
||||||
@ -147,3 +149,343 @@ class InstallTree(object):
|
|||||||
self.remove_modules_broken_links()
|
self.remove_modules_broken_links()
|
||||||
|
|
||||||
return self.get_kernelfiles()
|
return self.get_kernelfiles()
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
### tree scrubs
|
||||||
|
|
||||||
|
def copy_stubs(self):
|
||||||
|
for file in ("raidstart", "raidstop", "losetup", "list-harddrives",
|
||||||
|
"loadkeys", "mknod", "syslogd"):
|
||||||
|
|
||||||
|
src = os.path.join(self.conf.treedir, "usr", "lib", "anaconda",
|
||||||
|
"%s-stub" % (file,))
|
||||||
|
dst = os.path.join(self.conf.treedir, "usr", "bin", file)
|
||||||
|
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
|
||||||
|
def create_dogtail_conf(self):
|
||||||
|
dogtailconf = os.path.join(self.conf.datadir, "dogtail", "%gconf.xml")
|
||||||
|
|
||||||
|
if os.path.isfile(dogtailconf):
|
||||||
|
dst = os.path.join(self.conf.treedir, ".gconf", "desktop", "gnome",
|
||||||
|
"interface")
|
||||||
|
|
||||||
|
os.makedirs(dst)
|
||||||
|
shutil.copy2(dogtailconf, dst)
|
||||||
|
|
||||||
|
touch(os.path.join(self.conf.treedir, ".gconf", "desktop",
|
||||||
|
"%gconf.xml"))
|
||||||
|
touch(os.path.join(self.conf.treedir, ".gconf", "desktop", "gnome",
|
||||||
|
"%gconf.xml"))
|
||||||
|
|
||||||
|
def create_libuser_conf(self):
|
||||||
|
src = os.path.join(self.conf.datadir, "libuser", "libuser.conf")
|
||||||
|
dst = os.path.join(self.conf.treedir, "etc", "libuser.conf")
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
|
||||||
|
def create_selinux_conf(self):
|
||||||
|
if os.path.exists(os.path.join(self.conf.treedir, "etc", "selinux",
|
||||||
|
"targeted")):
|
||||||
|
|
||||||
|
src = os.path.join(self.conf.datadir, "selinux", "config")
|
||||||
|
dst = os.path.join(self.conf.treedir, "etc", "selinux", "config")
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
|
||||||
|
def configure_fedorakmod(self):
|
||||||
|
fedorakmodconf = os.path.join(self.conf.treedir, "etc", "yum",
|
||||||
|
"pluginconf.d", "fedorakmod.conf")
|
||||||
|
|
||||||
|
replace(fedorakmodconf, r"\(installforallkernels\) = 0", r"\1 = 1")
|
||||||
|
|
||||||
|
def copy_bootloaders(self):
|
||||||
|
bootpath = os.path.join(self.conf.treedir, "usr", "lib",
|
||||||
|
"anaconda-runtime", "boot")
|
||||||
|
|
||||||
|
if not os.path.isdir(bootpath):
|
||||||
|
os.makedirs(bootpath)
|
||||||
|
|
||||||
|
if self.conf.buildarch in ("i386", "i586", "x86_64"):
|
||||||
|
for file in os.listdir(os.path.join(self.conf.treedir, "boot")):
|
||||||
|
if file.startswith("memtest"):
|
||||||
|
src = os.path.join(self.conf.treedir, "boot", file)
|
||||||
|
dst = os.path.join(bootpath, file)
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
elif self.conf.buildarch == "sparc":
|
||||||
|
for file in os.listdir(os.path.join(self.conf.treedir, "boot")):
|
||||||
|
if file.endswith(".b"):
|
||||||
|
src = os.path.join(self.conf.treedir, "boot", file)
|
||||||
|
dst = os.path.join(bootpath, file)
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
elif self.conf.buildarch in ("ppc", "ppc64"):
|
||||||
|
src = os.path.join(self.conf.treedir, "boot", "efika.forth")
|
||||||
|
shutil.copy2(src, bootpath)
|
||||||
|
elif self.conf.buildarch == "alpha":
|
||||||
|
src = os.path.join(self.conf.treedir, "boot", "bootlx")
|
||||||
|
shutil.copy2(src, bootpath)
|
||||||
|
elif self.conf.buildarch == "ia64":
|
||||||
|
srcdir = os.path.join(self.conf.treedir, "boot", "efi", "EFI", "redhat")
|
||||||
|
copy(src_root=srcdir, src_path="*",
|
||||||
|
dst_root=bootpath, dst_dir="")
|
||||||
|
|
||||||
|
def move_repos(self):
|
||||||
|
src = os.path.join(self.conf.treedir, "etc", "yum.repos.d")
|
||||||
|
dst = os.path.join(self.conf.treedir, "etc", "anaconda.repos.d")
|
||||||
|
shutil.move(src, dst)
|
||||||
|
|
||||||
|
def move_anaconda_files(self):
|
||||||
|
# move anaconda executable
|
||||||
|
src = os.path.join(self.conf.treedir, "usr", "sbin", "anaconda")
|
||||||
|
dst = os.path.join(self.conf.treedir, "usr", "bin", "anaconda")
|
||||||
|
shutil.move(src, dst)
|
||||||
|
|
||||||
|
# move anaconda libraries
|
||||||
|
srcdir = os.path.join(self.conf.treedir, "usr", "lib", "anaconda-runtime")
|
||||||
|
dst = os.path.join(self.conf.treedir, "usr", self.conf.libdir)
|
||||||
|
move(src_root=srcdir, src_path="lib*",
|
||||||
|
dst_root=dst, dst_path="")
|
||||||
|
|
||||||
|
def create_debug_directories(self):
|
||||||
|
os.makedirs(os.path.join(self.conf.treedir, "usr", "lib", "debug"))
|
||||||
|
os.makedirs(os.path.join(self.conf.treedir, "usr", "src", "debug"))
|
||||||
|
|
||||||
|
def create_modules_symlinks(self):
|
||||||
|
os.makedirs(os.path.join(self.conf.treedir, "modules"))
|
||||||
|
os.makedirs(os.path.join(self.conf.treedir, "firmware"))
|
||||||
|
|
||||||
|
# XXX are we sure we want to do this?
|
||||||
|
remove(os.path.join(self.conf.treedir, "lib", "modules"))
|
||||||
|
remove(os.path.join(self.conf.treedir, "lib", "firmware"))
|
||||||
|
os.symlink("/modules", os.path.join(self.conf.treedir, "lib", "modules"))
|
||||||
|
os.symlink("/firmware", os.path.join(self.conf.treedir, "lib", "firmware"))
|
||||||
|
|
||||||
|
def fix_joe_links(self):
|
||||||
|
joedir = os.path.join(self.conf.treedir, "etc", "joe")
|
||||||
|
|
||||||
|
if os.path.isdir(joedir):
|
||||||
|
os.symlink("jpicorc", os.path.join(joedir, "picorc"))
|
||||||
|
os.symlink("jpicorc", os.path.join(joedir, "jnanorc"))
|
||||||
|
os.symlink("jpicorc", os.path.join(joedir, "nanorc"))
|
||||||
|
os.symlink("jmacsrc", os.path.join(joedir, "emacsrc"))
|
||||||
|
os.symlink("jmacs", os.path.join(self.conf.treedir, "usr", "bin",
|
||||||
|
"emacs"))
|
||||||
|
os.symlink("jpico", os.path.join(self.conf.treedir, "usr", "bin",
|
||||||
|
"pico"))
|
||||||
|
os.symlink("jpico", os.path.join(self.conf.treedir, "usr", "bin",
|
||||||
|
"nano"))
|
||||||
|
|
||||||
|
def fix_man_pages(self):
|
||||||
|
# fix up some links for man page related stuff
|
||||||
|
for file in ["nroff", "groff", "iconv", "geqn", "gtbl", "gpic", "grefer"]:
|
||||||
|
src = os.path.join("mnt", "sysimage", "usr", "bin", file)
|
||||||
|
dst = os.path.join(self.conf.treedir, "usr", "bin", file)
|
||||||
|
if not os.path.isfile(dst):
|
||||||
|
os.symlink(src, dst)
|
||||||
|
|
||||||
|
# fix /etc/man.config to point into /mnt/sysimage
|
||||||
|
manconfig = os.path.join(self.conf.treedir, "etc", "man.config")
|
||||||
|
|
||||||
|
# don't change MANPATH_MAP lines now
|
||||||
|
replace(manconfig, r"^MANPATH[^_MAP][ \t]*", r"&/mnt/sysimage")
|
||||||
|
# change MANPATH_MAP lines now
|
||||||
|
replace(manconfig, r"^MANPATH_MAP[ \t]*[a-zA-Z0-9/]*[ \t]*",
|
||||||
|
r"&/mnt/sysimage")
|
||||||
|
|
||||||
|
def remove_gtk_stuff(self):
|
||||||
|
# figure out the gtk+ theme to keep
|
||||||
|
gtkrc = os.path.join(self.conf.treedir, "etc", "gtk-2.0", "gtkrc")
|
||||||
|
|
||||||
|
gtk_theme_name = None
|
||||||
|
gtk_engine = None
|
||||||
|
gtk_icon_themes = []
|
||||||
|
|
||||||
|
if os.path.isfile(gtkrc):
|
||||||
|
f = open(gtkrc, "r")
|
||||||
|
lines = f.readlines()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith("gtk-theme-name"):
|
||||||
|
gtk_theme_name = line[line.find("=") + 1:]
|
||||||
|
gtk_theme_name = gtk_theme_name.replace('"', "").strip()
|
||||||
|
|
||||||
|
# find the engine for this theme
|
||||||
|
gtkrc = os.path.join(self.conf.treedir, "usr", "share",
|
||||||
|
"themes", gtk_theme_name, "gtk-2.0", "gtkrc")
|
||||||
|
if os.path.isfile(gtkrc):
|
||||||
|
f = open(gtkrc, "r")
|
||||||
|
engine_lines = f.readlines()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
for engine_line in engine_lines:
|
||||||
|
engine_line = engine_line.strip()
|
||||||
|
if engine_line.find("engine") != -1:
|
||||||
|
gtk_engine = engine_line[engine_line.find('"') + 1:]
|
||||||
|
gtk_engine = gtk_engine.replace('"', "").strip()
|
||||||
|
break
|
||||||
|
|
||||||
|
elif line.startswith("gtk-icon-theme-name"):
|
||||||
|
icon_theme = line[line.find("=") + 1:]
|
||||||
|
icon_theme = icon_theme.replace('"', "").strip()
|
||||||
|
gtk_icon_themes.append(icon_theme)
|
||||||
|
|
||||||
|
# bring in all inherited themes
|
||||||
|
while True:
|
||||||
|
icon_theme_index = os.path.join(self.conf.treedir, "usr",
|
||||||
|
"share", "icons", icon_theme, "index.theme")
|
||||||
|
if os.path.isfile(icon_theme_index):
|
||||||
|
inherits = False
|
||||||
|
f = open(icon_theme_index, "r")
|
||||||
|
icon_lines = f.readlines()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
for icon_line in icon_lines:
|
||||||
|
icon_line = icon_line.strip()
|
||||||
|
if icon_line.startswith("Inherits="):
|
||||||
|
inherits = True
|
||||||
|
icon_theme = icon_line[icon_line.find("=") + 1:]
|
||||||
|
icon_theme = icon_theme.replace('"', "").strip()
|
||||||
|
gtk_icon_themes.append(icon_theme)
|
||||||
|
break
|
||||||
|
|
||||||
|
if not inherits:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
# remove themes we don't need
|
||||||
|
theme_path = os.path.join(self.conf.treedir, "usr", "share", "themes")
|
||||||
|
if os.path.isdir(theme_path):
|
||||||
|
for theme in filter(lambda theme: theme != gtk_theme_name,
|
||||||
|
os.listdir(theme_path)):
|
||||||
|
|
||||||
|
theme = os.path.join(theme_path, theme)
|
||||||
|
shutil.rmtree(theme, ignore_errors=True)
|
||||||
|
|
||||||
|
# remove icons we don't need
|
||||||
|
icon_path = os.path.join(self.conf.treedir, "usr", "share", "icons")
|
||||||
|
if os.path.isdir(icon_path):
|
||||||
|
for icon in filter(lambda icon: icon not in gtk_icon_themes,
|
||||||
|
os.listdir(icon_path)):
|
||||||
|
|
||||||
|
icon = os.path.join(icon_path, icon)
|
||||||
|
shutil.rmtree(icon, ignore_errors=True)
|
||||||
|
|
||||||
|
# remove engines we don't need
|
||||||
|
tmp_path = os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||||
|
"gtk-2.0")
|
||||||
|
if os.path.isdir(tmp_path):
|
||||||
|
fnames = map(lambda fname: os.path.join(tmp_path, fname, "engines"),
|
||||||
|
os.listdir(tmp_path))
|
||||||
|
dnames = filter(lambda fname: os.path.isdir(fname), fnames)
|
||||||
|
for dir in dnames:
|
||||||
|
engines = filter(lambda engine: engine.find(gtk_engine) == -1,
|
||||||
|
os.listdir(dir))
|
||||||
|
for engine in engines:
|
||||||
|
engine = os.path.join(dir, engine)
|
||||||
|
os.unlink(engine)
|
||||||
|
|
||||||
|
def remove_locales(self):
|
||||||
|
langtable = os.path.join(self.conf.treedir, "usr", "lib", "anaconda",
|
||||||
|
"lang-table")
|
||||||
|
localepath = os.path.join(self.conf.treedir, "usr", "share", "locale")
|
||||||
|
|
||||||
|
if os.path.isfile(langtable):
|
||||||
|
locales = set()
|
||||||
|
all_locales = set()
|
||||||
|
|
||||||
|
f = open(langtable, "r")
|
||||||
|
lines = f.readlines()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if not line or line.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
fields = line.split("\t")
|
||||||
|
|
||||||
|
if os.path.isdir(os.path.join(localepath, fields[1])):
|
||||||
|
locales.add(fields[1])
|
||||||
|
|
||||||
|
locale = fields[3].split(".")[0]
|
||||||
|
if os.path.isdir(os.path.join(localepath, locale)):
|
||||||
|
locales.add(locale)
|
||||||
|
|
||||||
|
for locale in os.listdir(localepath):
|
||||||
|
all_locales.add(locale)
|
||||||
|
|
||||||
|
locales_to_remove = list(all_locales.difference(locales))
|
||||||
|
for locale in locales_to_remove:
|
||||||
|
rmpath = os.path.join(localepath, locale)
|
||||||
|
shutil.rmtree(rmpath, ignore_errors=True)
|
||||||
|
|
||||||
|
def remove_unnecessary_files(self):
|
||||||
|
to_remove = set()
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(self.conf.treedir):
|
||||||
|
for file in files:
|
||||||
|
path = os.path.join(root, file)
|
||||||
|
|
||||||
|
if fnmatch.fnmatch(path, "*.a"):
|
||||||
|
if path.find("kernel-wrapper/wrapper.a") == -1:
|
||||||
|
to_remove.add(path)
|
||||||
|
elif fnmatch.fnmatch(path, "lib*.la"):
|
||||||
|
if path.find("usr/" + self.conf.libdir + "/gtk-2.0") == -1:
|
||||||
|
to_remove.add(path)
|
||||||
|
elif fnmatch.fnmatch(path, "*.py"):
|
||||||
|
to_remove.add(path + "o")
|
||||||
|
|
||||||
|
try:
|
||||||
|
os.unlink(path + "c")
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
os.symlink("/dev/null", path + "c")
|
||||||
|
|
||||||
|
for file in to_remove:
|
||||||
|
try:
|
||||||
|
os.unlink(file)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# remove libunicode-lite
|
||||||
|
remove(os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||||
|
"libunicode-lite*"))
|
||||||
|
|
||||||
|
def remove_python_stuff(self):
|
||||||
|
for fname in ["bsddb", "compiler", "curses", "distutils", "email",
|
||||||
|
"encodings", "hotshot", "idlelib", "test",
|
||||||
|
"doctest.py", "pydoc.py"]:
|
||||||
|
|
||||||
|
remove(os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||||
|
"python?.?", fname))
|
||||||
|
|
||||||
|
def remove_unnecessary_directories(self):
|
||||||
|
for dir in ["boot", "home", "root", "tmp"]:
|
||||||
|
remove(os.path.join(self.conf.treedir, dir))
|
||||||
|
|
||||||
|
def scrub(self):
|
||||||
|
self.copy_stubs()
|
||||||
|
self.create_dogtail_conf()
|
||||||
|
self.create_libuser_conf()
|
||||||
|
self.create_selinux_conf()
|
||||||
|
self.configure_fedorakmod()
|
||||||
|
|
||||||
|
self.copy_bootloaders()
|
||||||
|
self.move_repos()
|
||||||
|
self.move_anaconda_files()
|
||||||
|
|
||||||
|
self.create_debug_directories()
|
||||||
|
self.create_modules_symlinks()
|
||||||
|
|
||||||
|
self.fix_joe_links()
|
||||||
|
self.fix_man_pages()
|
||||||
|
|
||||||
|
self.remove_gtk_stuff()
|
||||||
|
self.remove_locales()
|
||||||
|
self.remove_unnecessary_files()
|
||||||
|
self.remove_python_stuff()
|
||||||
|
|
||||||
|
self.remove_unnecessary_directories()
|
||||||
|
@ -97,22 +97,22 @@ class Output(object):
|
|||||||
def newline(self):
|
def newline(self):
|
||||||
self.output.write("\n")
|
self.output.write("\n")
|
||||||
|
|
||||||
def banner(self, s, indent_level=0):
|
def banner(self, s):
|
||||||
self.writeline(s, color=C_GREEN, type=BOLD)
|
self.writeline(s, color=C_GREEN, type=BOLD)
|
||||||
|
|
||||||
def header(self, s, indent_level=0):
|
def header(self, s):
|
||||||
self.writeline(s, type=BOLD)
|
self.writeline(s, type=BOLD)
|
||||||
|
|
||||||
def info(self, s, indent_level=0):
|
def info(self, s):
|
||||||
self.writeline(s)
|
self.writeline(s)
|
||||||
|
|
||||||
def error(self, s, indent_level=0):
|
def error(self, s):
|
||||||
self.writeline(s, color=C_RED, type=BOLD)
|
self.writeline(s, color=C_RED, type=BOLD)
|
||||||
|
|
||||||
def warning(self, s, indent_level=0):
|
def warning(self, s):
|
||||||
self.writeline(s, color=C_RED)
|
self.writeline(s, color=C_RED)
|
||||||
|
|
||||||
def debug(self, s, indent_level=0):
|
def debug(self, s):
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
self.writeline(s)
|
self.writeline(s)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user