evo trivijalno male verzije template file systema koja koristi fuse i empy libraryje
{{{
import em
import os
import mmap
import sys
import thread
from fuse import Fuse
active_module='__main__' #hack!!
def transform(file):
tf = os.tmpfile()
i = em.Interpreter(output=tf)
i.include(file, sys.modules[active_module].__dict__)
tf.flush()
mm = mmap.mmap(tf.fileno(), os.fstat(tf.fileno()).st_size)
return mm
class TmpltFS(Fuse):
def __init__(self, *args, **kw):
Fuse.__init__(self, *args, **kw)
self.mountpoint = '/tmp/etc'
self.multithreaded = 1
self.template_dir='/tmp/template'
def getdir(self, path):
return map(lambda x: (x,0), os.listdir(self.template_dir + path))
def getattr(self, path):
return os.lstat(self.template_dir + path)
def open(self, path, flags):
os.close(os.open(self.template_dir + path, flags))
return 0
def read(self, path, len, offset):
f = transform(self.template_dir + path)
f.seek(offset)
return f.read(len)
def release(self, path, flags):
# print path + ' >> close\n'
return 0
#if __name__ == '__main__':
# t()
def t():
server = TmpltFS()
server.main()
def run():
thread.start_new_thread(t, ())
}}}
a koristi se ovako:
primjer Makefilea
{{{
import os
def gcc_mm(file):
i,o,e = os.popen3(cc + ' -MM ' + file)
ret = o.readline()
return ret
def mkf_entry(_file):
return gcc_mm(_file) + "\t" + cc + " -c " + _file + "\n\n"
def mk_head(flist):
ret = "all: "
for f in flist:
ret += f[:-1] + 'o '
return ret + "\n\t" + cc + " -o $@ $^\n\n"
def make_make(flist):
lst = mk_head(flist)
for f in flist:
lst += mkf_entry(f)
return lst
cc = 'gcc'
def get_cc():
return cc
l = 'f1.c', 'f2.c'
}}}
i
{{{
CC=@make.cc
@{print make.make_make(make.l)}
}}}
ili (konfiguracija proftpd-a)
{{{
class ProFtpd:
def __init__(self):
self.name = 'Konferencija open source 2006'
self.default_server = True
self.require_valid_shell = False
self.port = 8021
self.umask = '022'
self.max_instances = 10
self.user = 'aka'
self.group = 'users'
self.allow_overwrite = True
def on_off(arg):
if arg:
return 'on'
return 'off'
proftpd = ProFtpd()
}}}
i
{{{
- proftpd.conf template
-
ServerName "@proftpd.name"
ServerType standalone
DefaultServer @(on_off(proftpd.default_server))
RequireValidShell @(on_off(proftpd.require_valid_shell))
AuthPAM off
AuthPAMConfig ftp
Port @proftpd.port
Umask @proftpd.umask
MaxInstances @proftpd.max_instances
User @proftpd.user
Group @proftpd.group
<Directory />
AllowOverwrite @(on_off(proftpd.allow_overwrite))
</Directory>
<Anonymous ~ftp>
User ftp
Group ftp
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Limit the maximum number of anonymous logins
MaxClients 10
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayFirstChdir .message
# Limit WRITE everywhere in the anonymous chroot
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
}}}
... detalji o teoretskom djelu sljede uskoro ...