On Wed, Aug 23, 2006 at 05:15:26PM -0400, Daniel Veillard wrote: > On Wed, Aug 23, 2006 at 09:22:08PM +0100, Daniel P. Berrange wrote: > > On Wed, Aug 23, 2006 at 02:21:03PM -0400, Daniel Veillard wrote: > > > I was tempted to do an implementation just local to the library instance > > > in the case there is no support by the virtualization engine. If you think > > > you will use it then I should really implement it :-) > > > > Trouble is I think we really badly need an implementation that is > > persistent. Tools like the 'xeninst[1]' package are using libvirt for > > creating domains, but at the same time manually writing out config > > files into /etc/xen - this means they are loosing an important benefit > > of libvirt - namely isolation from Xen instability/changes. > > > > Now it would be pretty easy for libvirt to convert the XML file passed > > into virDefineDomain into a config file for xend & stuf it in /etc/xen > > The hard part is the reverse - enumerating the config files in the > > dir & turning them back into XML. I fear we may have to tackle that [...] > > * Write a tiny parser for a trivial subset - basically enough to > > handle the (key, string) pairs & (key, list of string) pairs. > > Certainly doable - depending on how general purpose we want to > > get - do we care about the 'if..else' conditional used in the > > sample /etc/xen/xmexample.vti config file ? We can certainly > > make a valid case saying we don't care about this because the > > libvirt XML -> xm config conversion would not generate config > > using that capability > > I'm not too concerned by handling only a subset, this should be data > and processed as such IMHO. > > > * Fork an unprivileged helper python program to exec the config > > file and re-write it as XML which can be read back in by libvirt > > > > The former is more work, but makes me feel better from a security > > point of view. > > Writing a parser doesn't frighten me too much :-) [...] > > Not a perfect solution, but would satisfy a great deal of common > > use cases pretty easily without being intrusive into existing code > > base & pretty secure. > > We are basically in agreement :-) > So I write that parser ? Okay, there is a a first version in CVS under libvirt/src/conf.[ch] It allows only variable assignments and comments, the types supported are the [] lists, integers and strings. Still that should be sufficient to handled most data oriented existing Python Xen configurations. It supports load/lookup/writes as defined in conf.h: ------------------------------------- typedef struct _virConf virConf; typedef virConf *virConfPtr; virConfPtr virConfReadFile (const char *filename); virConfPtr virConfReadMem (const char *memory, int len); int virConfFree (virConfPtr conf); virConfValuePtr virConfGetValue (virConfPtr conf, const char *setting); int virConfWriteFile (const char *filename, virConfPtr conf); int virConfWriteMem (char *memory, int *len, virConfPtr conf); ------------------------------------- Values are open structures: ------------------------------------- /** * virConfType: * one of the possible type for a value from the configuration file * * TODO: we probably need a float too. */ typedef enum { VIR_CONF_NONE = 0, /* undefined */ VIR_CONF_LONG = 1, /* a long int */ VIR_CONF_STRING = 2, /* a string */ VIR_CONF_LIST = 3 /* a list */ } virConfType; /** * virConfValue: * a value from the configuration file */ typedef struct _virConfValue virConfValue; typedef virConfValue *virConfValuePtr; struct _virConfValue { virConfType type; /* the virConfType */ virConfValuePtr next; /* next element if in a list */ long l; /* long integer */ char *str; /* pointer to 0 terminated string */ virConfValuePtr list; /* list of a list */ }; ------------------------------------- If needed it's possible to lookup a value, change the object and save back, I could extend the supported subset to handle expressions or reuse of variables in assignments, but I'm not sure it is really worth it. The parser is strict, if it meets a construct it doesn't recognize it fails and return NULL with an error. Daniel -- Red Hat Virtualization group http://redhat.com/virtualization/ Daniel Veillard | virtualization library http://libvirt.org/ veillard@xxxxxxxxxx | libxml GNOME XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/