As told in comic 224, God mostly hacked together the universe
using perl. If it is good enough for God, it is good enough
for libvirt. So this extends the XML parser so that it feeds
all XML through a perl script allowing arbitrary modifications.
For example, if you think your guest domain names are not
christmasy enough you can use this script to add snowmen
to their names
$ cat > hack.pl <<EOF
#!/usr/bin/perl
while (<>) {
s,<name>(.*)</name>,<name>☃$1☃</name>,;
print;
}
EOF
LIBVIRT_XKCD=221,224:/home/berrange/hack.pl /usr/sbin/libvirtd
$ virsh list --all
Id Name State
----------------------------------------------------
- ☃demo-spec☃ shut off
- ☃demo☃ shut off
- ☃nodisplay☃ shut off
- ☃ppcdemo☃ shut off
- ☃QEMUGuest1☃ shut off
- ☃secret☃ shut off
- ☃serial☃ shut off
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/util/virxml.c | 35 +++++++++++++++++++++++++++++------
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 489bad8..7e94ead 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -37,6 +37,8 @@
#include "viralloc.h"
#include "virfile.h"
#include "virstring.h"
+#include "virxkcd.h"
+#include "vircommand.h"
#define VIR_FROM_THIS VIR_FROM_XML
@@ -738,14 +740,35 @@ virXMLParseHelper(int domcode,
pctxt->_private = &private;
pctxt->sax->error = catchXMLError;
- if (filename) {
- xml = xmlCtxtReadFile(pctxt, filename, NULL,
- XML_PARSE_NONET |
- XML_PARSE_NOWARNING);
- } else {
- xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL,
+ if (virXKCDIsEnabled(224)) {
+ const char *script = virXKCDGetData(224);
+ virCommandPtr cmd = virCommandNewArgList("perl", script, filename,
NULL);
+ char *newXML = NULL;
+
+ if (!filename) {
+ virCommandSetInputBuffer(cmd, xmlStr);
+ }
+ virCommandSetOutputBuffer(cmd, &newXML);
+
+ if (virCommandRun(cmd, NULL) < 0) {
+ virCommandFree(cmd);
+ goto error;
+ }
+ virCommandFree(cmd);
+ xml = xmlCtxtReadDoc(pctxt, BAD_CAST newXML, url, NULL,
XML_PARSE_NONET |
XML_PARSE_NOWARNING);
+ VIR_FREE(newXML);
+ } else {
+ if (filename) {
+ xml = xmlCtxtReadFile(pctxt, filename, NULL,
+ XML_PARSE_NONET |
+ XML_PARSE_NOWARNING);
+ } else {
+ xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL,
+ XML_PARSE_NONET |
+ XML_PARSE_NOWARNING);
+ }
}
if (!xml)
goto error;
--
2.5.5