#
# base.py
#
# 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 .
#
# Red Hat Author(s): Martin Gracik
#
from abc import ABCMeta, abstractmethod
import sys
import os
import shlex
import shutil
import config
import constants
import output
import ltmpl
from sysutils import *
class BaseLoraxClass(object):
__metaclass__ = ABCMeta
@abstractmethod
def __init__(self):
self.conf = config.LoraxConfig()
self.const = constants.LoraxConstants()
self.cmd = constants.LoraxCommands()
self.output = output.LoraxOutput()
def pcritical(self, msg, file=sys.stdout):
self.output.critical(msg, file)
def perror(self, msg, file=sys.stdout):
self.output.error(msg, file)
def pwarning(self, msg, file=sys.stdout):
self.output.warning(msg, file)
def pinfo(self, msg, file=sys.stdout):
self.output.info(msg, file)
def pdebug(self, msg, file=sys.stdout):
self.output.debug(msg, file)
class BaseImageClass(BaseLoraxClass):
__metaclass__ = ABCMeta
@abstractmethod
def __init__(self):
BaseLoraxClass.__init__(self)
self.srctree, self.dsttree = None, None
def parse_template(self, template_file, variables={}):
template = ltmpl.Template()
for lineno, line in template.parse(template_file, variables):
fields = shlex.split(line)
func, args = fields[0], fields[1:]
func = getattr(self, func, None)
if not func:
err = "invalid command: {0}"
err = err.format(line)
self.perror(err)
else:
try:
msg = "{0}({1})".format(func.__name__, ", ".join(args))
self.pdebug(msg)
func(*args)
except TypeError:
err = "invalid command syntax: {0}"
err = err.format(line)
self.perror(err)
def makedirs(self, *dirs):
for dir in dirs:
dir = os.path.join(self.dsttree, dir)
makedirs_(dir)
def remove(self, *fnames):
for fname in fnames:
fname = os.path.join(self.dsttree, fname)
remove_(fname)
def symlink(self, link_target, link_name):
link_name = os.path.join(self.dsttree, link_name)
symlink_(link_target, link_name)
def touch(self, fname):
fname = os.path.join(self.dsttree, fname)
touch_(fname)
def chown(self):
# TODO
raise NotImplementedError
def chmod(self):
# TODO
raise NotImplementedError
def replace(self):
# TODO
raise NotImplementedError
def copy(self, fname, target=None):
dstdir = os.path.dirname(fname)
if target:
dstdir = target
if dstdir:
makedirs_(os.path.join(self.dsttree, dstdir))
dcopy_(fname, dstdir, self.srctree, self.dsttree)
def rename(self, fname, target):
fname = os.path.join(self.dsttree, fname)
target = os.path.join(self.dsttree, target)
shutil.move(fname, target)
def edit(self, fname, text):
fname = os.path.join(self.dsttree, fname)
with open(fname, "w") as f:
f.write(text)