From: Thierry Parmentelat Date: Fri, 10 Jan 2014 13:25:29 +0000 (+0100) Subject: support for libvirt—1.1 naming scheme X-Git-Tag: lxc-userspace-1.0-9~18 X-Git-Url: http://git.onelab.eu/?p=lxc-userspace.git;a=commitdiff_plain;h=5763b462e08ea50f99b281ced3a5cc95bc64bae4 support for libvirt—1.1 naming scheme --- diff --git a/lxcsu b/lxcsu index 3c63f74..078d275 100755 --- a/lxcsu +++ b/lxcsu @@ -11,6 +11,129 @@ drop_capabilities='cap_sys_admin,cap_sys_boot,cap_sys_module' # can set to True here, but also use the -d option debug = False +#################### should go into a separate libvirtsystemd.py +# but we want to keep packaging simple for now + +# reproducing libvirt's systemd-oriented escaping mechanism +# http://code.metager.de/source/xref/lib/virt/src/util/virsystemd.c +# (see original code at the end of this file) + +def virSystemdEscapeName (name): + result='' + def ESCAPE(c,s): + # replace hex's output '0x..' into '\x..' + return s+hex(ord(c)).replace('0','\\',1) + VALID_CHARS = \ + "0123456789" + \ + "abcdefghijklmnopqrstuvwxyz" + \ + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + \ + ":-_.\\" + for c in name: + if c=='/': + result += '-' + elif c in '-\\' or c not in VALID_CHARS: + result=ESCAPE(c,result) + else: + result += c + return result + +#35static void virSystemdEscapeName(virBufferPtr buf, +#36 const char *name) +#37{ +#38 static const char hextable[16] = "0123456789abcdef"; +#39 +#40#define ESCAPE(c) \ +#41 do { \ +#42 virBufferAddChar(buf, '\\'); \ +#43 virBufferAddChar(buf, 'x'); \ +#44 virBufferAddChar(buf, hextable[(c >> 4) & 15]); \ +#45 virBufferAddChar(buf, hextable[c & 15]); \ +#46 } while (0) +#47 +#48#define VALID_CHARS \ +#49 "0123456789" \ +#50 "abcdefghijklmnopqrstuvwxyz" \ +#51 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ +#52 ":-_.\\" +#53 +#54 if (*name == '.') { +#55 ESCAPE(*name); +#56 name++; +#57 } +#58 +#59 while (*name) { +#60 if (*name == '/') +#61 virBufferAddChar(buf, '-'); +#62 else if (*name == '-' || +#63 *name == '\\' || +#64 !strchr(VALID_CHARS, *name)) +#65 ESCAPE(*name); +#66 else +#67 virBufferAddChar(buf, *name); +#68 name++; +#69 } +#70 +#71#undef ESCAPE +#72#undef VALID_CHARS +#73} + +def virSystemdMakeScopeName (name, drivername, partition): + result='' + result += virSystemdEscapeName (partition) + result += '-' + result += virSystemdEscapeName (drivername) + result += '\\x2d' + result += virSystemdEscapeName (name) + result += '.scope' + return result + +#76char *virSystemdMakeScopeName(const char *name, +#77 const char *drivername, +#78 const char *partition) +#79{ +#80 virBuffer buf = VIR_BUFFER_INITIALIZER; +#81 +#82 if (*partition == '/') +#83 partition++; +#84 +#85 virSystemdEscapeName(&buf, partition); +#86 virBufferAddChar(&buf, '-'); +#87 virSystemdEscapeName(&buf, drivername); +#88 virBufferAddLit(&buf, "\\x2d"); +#89 virSystemdEscapeName(&buf, name); +#90 virBufferAddLit(&buf, ".scope"); +#91 +#92 if (virBufferError(&buf)) { +#93 virReportOOMError(); +#94 return NULL; +#95 } +#96 +#97 return virBufferContentAndReset(&buf); +#98} + +### our own additions +import os.path +def find_first_dir (candidates): + for candidate in candidates: + if os.path.isdir(candidate): return candidate + raise Exception,"Cannot find valid dir among %s"%'\n'.join(candidates) + +def find_sysfs_scope (subsystem, slice_name): + subsystem1=subsystem + subsystem2=subsystem + if subsystem=='cpuacct': + subsystem2='cpu,cpuacct' + candidates = [ + # for f16 and our locally brewed libvirt 1.0.4 + "/sys/fs/cgroup/%s/libvirt/lxc/%s"%(subsystem1, slice_name), + # f20 and libvirt 1.1.3 + "/sys/fs/cgroup/%s/machine.slice/%s"%(subsystem2, + virSystemdMakeScopeName(slice_name,'lxc','machine')), + ] + return find_first_dir (candidates) + +#################### end of libvirtsystemd.py + def getarch(f): output = os.popen('readelf -h %s 2>&1'%f).readlines() classlines = [x for x in output if ('Class' in x.split(':')[0])] @@ -118,7 +241,7 @@ def main (): # Enter cgroups try: for subsystem in ['cpuset','memory','blkio']: - open('/sys/fs/cgroup/%s/libvirt/lxc/%s/tasks'%(subsystem,slice_name),'w').write(str(os.getpid())) + open( find_sysfs_scope (subsystem, slice_name)+"/tasks", 'w').write(str(os.getpid())) except Exception,e: if debug: print e @@ -126,7 +249,7 @@ def main (): exit(1) try: - open('/sys/fs/cgroup/cpuacct/system/libvirtd.service/libvirt/lxc/%s/tasks'%slice_name,'w').write(str(os.getpid())) + open ( find_sysfs_scope ('cpuacct', slice_name)+"/tasks", 'w').write(str(os.getpid())) except Exception,e: if debug: print e print "Error assigning cpuacct: %s" % slice_name @@ -137,7 +260,7 @@ def main (): # in this case to error out the shell. (an alternative would be to un-freeze it, # add the task, and re-freeze it) try: - f=open('/sys/fs/cgroup/freezer/libvirt/lxc/%s/tasks'%(slice_name),'w') + f=open( find_sysfs_scope ('freezer', slice_name)+"/tasks", 'w') f.write(str(os.getpid())) # note: we need to call f.close() explicitly, or we'll get an exception in # the object destructor, which will not be caught