19 |
19 |
#include "Nebula.h"
|
20 |
20 |
#include <sstream>
|
21 |
21 |
#include <fstream>
|
|
22 |
#include <string>
|
22 |
23 |
#include <libgen.h>
|
23 |
24 |
#include <math.h>
|
24 |
25 |
|
|
26 |
namespace patch
|
|
27 |
{
|
|
28 |
template < typename T > std::string to_string( const T& n )
|
|
29 |
{
|
|
30 |
std::ostringstream stm ;
|
|
31 |
stm << n ;
|
|
32 |
return stm.str() ;
|
|
33 |
}
|
|
34 |
}
|
|
35 |
|
25 |
36 |
const float LibVirtDriver::CGROUP_BASE_CPU_SHARES = 1024;
|
26 |
37 |
|
27 |
38 |
const int LibVirtDriver::CEPH_DEFAULT_PORT = 6789;
|
28 |
39 |
|
29 |
40 |
const int LibVirtDriver::GLUSTER_DEFAULT_PORT = 24007;
|
30 |
41 |
|
|
42 |
/*
|
|
43 |
* Wrap input in a CDATA section
|
|
44 |
*/
|
|
45 |
static string wrapper_contents(string input) {
|
|
46 |
if (input.find("]]>") != std::string::npos) {
|
|
47 |
return("");
|
|
48 |
}
|
|
49 |
|
|
50 |
return("<![CDATA[" + input + "]]>");
|
|
51 |
}
|
|
52 |
|
|
53 |
static string wrapper_attribute(string input) {
|
|
54 |
if (input.find("'") != std::string::npos) {
|
|
55 |
return("''");
|
|
56 |
}
|
|
57 |
|
|
58 |
return("'" + input + "'");
|
|
59 |
}
|
|
60 |
|
31 |
61 |
/**
|
32 |
62 |
* This function generates the <host> element for network disks
|
33 |
63 |
*/
|
... | ... | |
38 |
68 |
{
|
39 |
69 |
if (cg_host.empty())
|
40 |
70 |
{
|
41 |
|
file << "'/>" << endl;
|
|
71 |
file << "/>" << endl;
|
42 |
72 |
return;
|
43 |
73 |
}
|
44 |
74 |
|
... | ... | |
47 |
77 |
|
48 |
78 |
hosts = one_util::split(cg_host, ' ');
|
49 |
79 |
|
50 |
|
file << "'>" << endl;
|
|
80 |
file << ">" << endl;
|
51 |
81 |
|
52 |
82 |
for (it = hosts.begin(); it != hosts.end(); it++)
|
53 |
83 |
{
|
... | ... | |
58 |
88 |
continue;
|
59 |
89 |
}
|
60 |
90 |
|
61 |
|
file << "\t\t\t\t<host name='" << parts[0];
|
|
91 |
file << "\t\t\t\t<host name=" << wrapper_attribute(parts[0]);
|
62 |
92 |
|
63 |
93 |
if (parts.size() > 1)
|
64 |
94 |
{
|
65 |
|
file << "' port='" << parts[1];
|
|
95 |
file << " port=" << wrapper_attribute(parts[1]);
|
66 |
96 |
}
|
67 |
97 |
else if ( default_port != -1 )
|
68 |
98 |
{
|
69 |
|
file << "' port='" << default_port;
|
|
99 |
file << " port=" << wrapper_attribute(patch::to_string(default_port));
|
70 |
100 |
}
|
71 |
101 |
|
72 |
102 |
if (!transport.empty())
|
73 |
103 |
{
|
74 |
|
file << "' transport='" << transport;
|
|
104 |
file << " transport=" << wrapper_attribute(transport);
|
75 |
105 |
}
|
76 |
106 |
|
77 |
|
file << "'/>" << endl;
|
|
107 |
file << "/>" << endl;
|
78 |
108 |
}
|
79 |
109 |
|
80 |
110 |
file << "\t\t\t</source>" << endl;
|
... | ... | |
204 |
234 |
// Starting XML document
|
205 |
235 |
// ------------------------------------------------------------------------
|
206 |
236 |
|
207 |
|
file << "<domain type='"
|
208 |
|
<< emulator
|
209 |
|
<< "' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>"
|
|
237 |
file << "<domain type="
|
|
238 |
<< wrapper_attribute(emulator)
|
|
239 |
<< " xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>"
|
210 |
240 |
<< endl;
|
211 |
241 |
|
212 |
242 |
// ------------------------------------------------------------------------
|
... | ... | |
228 |
258 |
|
229 |
259 |
if (!vcpu.empty())
|
230 |
260 |
{
|
231 |
|
file << "\t<vcpu>" << vcpu << "</vcpu>" << endl;
|
|
261 |
file << "\t<vcpu>" << wrapper_contents(vcpu) << "</vcpu>" << endl;
|
232 |
262 |
}
|
233 |
263 |
|
234 |
264 |
//Every process gets 1024 shares by default (cgroups), scale this with CPU
|
... | ... | |
294 |
324 |
get_default("OS", "MACHINE", machine);
|
295 |
325 |
}
|
296 |
326 |
|
297 |
|
file << "\t\t<type arch='" << arch << "'";
|
|
327 |
file << "\t\t<type arch=" << wrapper_attribute(arch);
|
298 |
328 |
|
299 |
329 |
if ( !machine.empty() )
|
300 |
330 |
{
|
301 |
|
file << " machine='" << machine << "'";
|
|
331 |
file << " machine=" << wrapper_attribute(machine);
|
302 |
332 |
}
|
303 |
333 |
|
304 |
334 |
file << ">hvm</type>" << endl;
|
... | ... | |
342 |
372 |
|
343 |
373 |
if ( !kernel.empty() )
|
344 |
374 |
{
|
345 |
|
file << "\t\t<kernel>" << kernel << "</kernel>" << endl;
|
|
375 |
file << "\t\t<kernel>" << wrapper_contents(kernel) << "</kernel>" << endl;
|
346 |
376 |
|
347 |
377 |
if ( !initrd.empty() )
|
348 |
378 |
{
|
349 |
|
file << "\t\t<initrd>" << initrd << "</initrd>" << endl;
|
|
379 |
file << "\t\t<initrd>" << wrapper_contents(initrd) << "</initrd>" << endl;
|
350 |
380 |
}
|
351 |
381 |
|
352 |
382 |
if ( !root.empty() )
|
... | ... | |
356 |
386 |
|
357 |
387 |
if (!kernel_cmd.empty())
|
358 |
388 |
{
|
359 |
|
file << "\t\t<cmdline>" << kernel_cmd << "</cmdline>" << endl;
|
|
389 |
file << "\t\t<cmdline>" << wrapper_contents(kernel_cmd) << "</cmdline>" << endl;
|
360 |
390 |
}
|
361 |
391 |
}
|
362 |
392 |
else if ( !bootloader.empty() )
|
363 |
393 |
{
|
364 |
|
file << "\t\t<bootloader>" << bootloader << "</bootloader>" << endl;
|
|
394 |
file << "\t\t<bootloader>" << wrapper_contents(bootloader) << "</bootloader>" << endl;
|
365 |
395 |
}
|
366 |
396 |
|
367 |
397 |
boots = one_util::split(boot, ',');
|
368 |
398 |
|
369 |
399 |
for (vector<string>::const_iterator it=boots.begin(); it!=boots.end(); it++)
|
370 |
400 |
{
|
371 |
|
file << "\t\t<boot dev='" << *it << "'/>" << endl;
|
|
401 |
file << "\t\t<boot dev=" << wrapper_attribute(*it) << "/>" << endl;
|
372 |
402 |
}
|
373 |
403 |
|
374 |
404 |
file << "\t</os>" << endl;
|
... | ... | |
387 |
417 |
emulator_path = "/usr/bin/kvm";
|
388 |
418 |
}
|
389 |
419 |
|
390 |
|
file << "\t\t<emulator>" << emulator_path << "</emulator>" << endl;
|
|
420 |
file << "\t\t<emulator>" << wrapper_contents(emulator_path) << "</emulator>" << endl;
|
391 |
421 |
|
392 |
422 |
// ------------------------------------------------------------------------
|
393 |
423 |
// Disks
|
... | ... | |
508 |
538 |
if ( type == "BLOCK" )
|
509 |
539 |
{
|
510 |
540 |
file << "\t\t<disk type='block' device='disk'>" << endl
|
511 |
|
<< "\t\t\t<source dev='" << vm->get_remote_system_dir()
|
512 |
|
<< "/disk." << disk_id << "'/>" << endl;
|
|
541 |
<< "\t\t\t<source dev=" << wrapper_attribute(vm->get_remote_system_dir() + "/disk." + patch::to_string(disk_id))
|
|
542 |
<< "/>" << endl;
|
513 |
543 |
}
|
514 |
544 |
else if ( type == "RBD" || type == "RBD_CDROM" )
|
515 |
545 |
{
|
... | ... | |
522 |
552 |
file << "\t\t<disk type='network' device='cdrom'>" << endl;
|
523 |
553 |
}
|
524 |
554 |
|
525 |
|
file << "\t\t\t<source protocol='rbd' name='" << source;
|
|
555 |
file << "\t\t\t<source protocol='rbd' name=";
|
526 |
556 |
|
527 |
557 |
if ( clone == "YES" )
|
528 |
558 |
{
|
529 |
|
file << "-" << vm->get_oid() << "-" << disk_id;
|
|
559 |
file << wrapper_attribute(source + "-" + patch::to_string(vm->get_oid()) + "-" + patch::to_string(disk_id));
|
|
560 |
} else {
|
|
561 |
file << wrapper_attribute(source);
|
530 |
562 |
}
|
531 |
563 |
|
532 |
564 |
do_network_hosts(file, ceph_host, "", CEPH_DEFAULT_PORT);
|
533 |
565 |
|
534 |
566 |
if ( !ceph_secret.empty() && !ceph_user.empty())
|
535 |
567 |
{
|
536 |
|
file << "\t\t\t<auth username='"<< ceph_user <<"'>" << endl
|
537 |
|
<< "\t\t\t\t<secret type='ceph' uuid='"
|
538 |
|
<< ceph_secret <<"'/>" << endl
|
|
568 |
file << "\t\t\t<auth username=" << wrapper_attribute(ceph_user) << ">" << endl
|
|
569 |
<< "\t\t\t\t<secret type='ceph' uuid="
|
|
570 |
<< wrapper_attribute(ceph_secret) <<"/>" << endl
|
539 |
571 |
<< "\t\t\t</auth>" << endl;
|
540 |
572 |
}
|
541 |
573 |
}
|
... | ... | |
550 |
582 |
file << "\t\t<disk type='network' device='cdrom'>" << endl;
|
551 |
583 |
}
|
552 |
584 |
|
553 |
|
file << "\t\t\t<source protocol='sheepdog' name='" << source;
|
|
585 |
file << "\t\t\t<source protocol='sheepdog' name=";
|
554 |
586 |
|
555 |
587 |
if ( clone == "YES" )
|
556 |
588 |
{
|
557 |
|
file << "-" << vm->get_oid() << "-" << disk_id;
|
|
589 |
file << wrapper_attribute(source + "-" + patch::to_string(vm->get_oid()) + "-" + patch::to_string(disk_id));
|
|
590 |
} else {
|
|
591 |
file << wrapper_attribute(source);
|
558 |
592 |
}
|
559 |
593 |
|
560 |
594 |
do_network_hosts(file, sheepdog_host, "tcp", -1);
|
... | ... | |
570 |
604 |
file << "\t\t<disk type='network' device='cdrom'>" << endl;
|
571 |
605 |
}
|
572 |
606 |
|
573 |
|
file << "\t\t\t<source protocol='gluster' name='" << gluster_volume
|
574 |
|
<< "/";
|
|
607 |
file << "\t\t\t<source protocol='gluster' name=";
|
575 |
608 |
|
576 |
609 |
if ( clone == "YES" )
|
577 |
610 |
{
|
578 |
|
file << vm->get_oid() << "/disk." << disk_id;
|
|
611 |
file << wrapper_attribute(gluster_volume + "/" + patch::to_string(vm->get_oid()) + "/disk." + patch::to_string(disk_id));
|
579 |
612 |
}
|
580 |
613 |
else
|
581 |
614 |
{
|
582 |
|
file << one_util::split(source, '/').back();
|
|
615 |
file << wrapper_attribute(gluster_volume + "/" + one_util::split(source, '/').back());
|
583 |
616 |
}
|
584 |
617 |
|
585 |
618 |
do_network_hosts(file, gluster_host, "tcp", GLUSTER_DEFAULT_PORT);
|
... | ... | |
587 |
620 |
else if ( type == "CDROM" )
|
588 |
621 |
{
|
589 |
622 |
file << "\t\t<disk type='file' device='cdrom'>" << endl
|
590 |
|
<< "\t\t\t<source file='" << vm->get_remote_system_dir()
|
591 |
|
<< "/disk." << disk_id << "'/>" << endl;
|
|
623 |
<< "\t\t\t<source file=" << wrapper_attribute(vm->get_remote_system_dir() + "/disk." + patch::to_string(disk_id))
|
|
624 |
<< "/>" << endl;
|
592 |
625 |
}
|
593 |
626 |
else
|
594 |
627 |
{
|
595 |
628 |
file << "\t\t<disk type='file' device='disk'>" << endl
|
596 |
|
<< "\t\t\t<source file='" << vm->get_remote_system_dir()
|
597 |
|
<< "/disk." << disk_id << "'/>" << endl;
|
|
629 |
<< "\t\t\t<source file=" << wrapper_attribute(vm->get_remote_system_dir() + "/disk." + patch::to_string(disk_id))
|
|
630 |
<< "/>" << endl;
|
598 |
631 |
}
|
599 |
632 |
|
600 |
633 |
// ---- target device to map the disk ----
|
601 |
634 |
|
602 |
|
file << "\t\t\t<target dev='" << target << "'/>" << endl;
|
|
635 |
file << "\t\t\t<target dev=" << wrapper_attribute(target) << "/>" << endl;
|
603 |
636 |
|
604 |
637 |
// ---- readonly attribute for the disk ----
|
605 |
638 |
|
... | ... | |
610 |
643 |
|
611 |
644 |
// ---- Image Format using qemu driver ----
|
612 |
645 |
|
613 |
|
file << "\t\t\t<driver name='qemu' type='";
|
|
646 |
file << "\t\t\t<driver name='qemu' type=";
|
614 |
647 |
|
615 |
648 |
if ( type == "CDROM" ) // Use driver raw for CD's
|
616 |
649 |
{
|
617 |
|
file << "raw";
|
|
650 |
file << "'raw'";
|
618 |
651 |
}
|
619 |
652 |
else if ( !driver.empty() )
|
620 |
653 |
{
|
621 |
|
file << driver;
|
|
654 |
file << wrapper_attribute(driver);
|
622 |
655 |
}
|
623 |
656 |
else
|
624 |
657 |
{
|
625 |
|
file << default_driver;
|
|
658 |
file << wrapper_attribute(default_driver);
|
626 |
659 |
}
|
627 |
660 |
|
628 |
|
file << "' cache='";
|
|
661 |
file << " cache=";
|
629 |
662 |
|
630 |
663 |
if ( !cache.empty() )
|
631 |
664 |
{
|
632 |
|
file << cache << "'";
|
|
665 |
file << wrapper_attribute(cache);
|
633 |
666 |
}
|
634 |
667 |
else
|
635 |
668 |
{
|
636 |
|
file << default_driver_cache << "'";
|
|
669 |
file << wrapper_attribute(default_driver_cache);
|
637 |
670 |
}
|
638 |
671 |
|
639 |
672 |
if ( !disk_io.empty() )
|
640 |
673 |
{
|
641 |
|
file << " io='" << disk_io << "'";
|
|
674 |
file << " io=" << wrapper_attribute(disk_io);
|
642 |
675 |
}
|
643 |
676 |
else if ( !default_driver_disk_io.empty() )
|
644 |
677 |
{
|
645 |
|
file << " io='" << default_driver_disk_io << "'";
|
|
678 |
file << " io=" << wrapper_attribute(default_driver_disk_io);
|
646 |
679 |
}
|
647 |
680 |
|
648 |
681 |
file << "/>" << endl;
|
... | ... | |
657 |
690 |
|
658 |
691 |
if ( !total_bytes_sec.empty() )
|
659 |
692 |
{
|
660 |
|
file << "\t\t\t\t<total_bytes_sec>" << total_bytes_sec
|
|
693 |
file << "\t\t\t\t<total_bytes_sec>" << wrapper_contents(total_bytes_sec)
|
661 |
694 |
<< "</total_bytes_sec>" << endl;
|
662 |
695 |
}
|
663 |
696 |
|
664 |
697 |
if ( !read_bytes_sec.empty() )
|
665 |
698 |
{
|
666 |
|
file << "\t\t\t\t<read_bytes_sec>" << read_bytes_sec
|
|
699 |
file << "\t\t\t\t<read_bytes_sec>" << wrapper_contents(read_bytes_sec)
|
667 |
700 |
<< "</read_bytes_sec>" << endl;
|
668 |
701 |
}
|
669 |
702 |
|
670 |
703 |
if ( !write_bytes_sec.empty() )
|
671 |
704 |
{
|
672 |
|
file << "\t\t\t\t<write_bytes_sec>" << write_bytes_sec
|
|
705 |
file << "\t\t\t\t<write_bytes_sec>" << wrapper_contents(write_bytes_sec)
|
673 |
706 |
<< "</write_bytes_sec>" << endl;
|
674 |
707 |
}
|
675 |
708 |
|
676 |
709 |
if ( !total_iops_sec.empty() )
|
677 |
710 |
{
|
678 |
|
file << "\t\t\t\t<total_iops_sec>" << total_iops_sec
|
|
711 |
file << "\t\t\t\t<total_iops_sec>" << wrapper_contents(total_iops_sec)
|
679 |
712 |
<< "</total_iops_sec>" << endl;
|
680 |
713 |
}
|
681 |
714 |
|
682 |
715 |
if ( !read_iops_sec.empty() )
|
683 |
716 |
{
|
684 |
|
file << "\t\t\t\t<read_iops_sec>" << read_iops_sec
|
|
717 |
file << "\t\t\t\t<read_iops_sec>" << wrapper_contents(read_iops_sec)
|
685 |
718 |
<< "</read_iops_sec>" << endl;
|
686 |
719 |
}
|
687 |
720 |
|
688 |
721 |
if ( !write_iops_sec.empty() )
|
689 |
722 |
{
|
690 |
|
file << "\t\t\t\t<write_iops_sec>" << write_iops_sec
|
|
723 |
file << "\t\t\t\t<write_iops_sec>" << wrapper_contents(write_iops_sec)
|
691 |
724 |
<< "</write_iops_sec>" << endl;
|
692 |
725 |
}
|
693 |
726 |
|
... | ... | |
715 |
748 |
{
|
716 |
749 |
file << "\t\t<disk type='file' device='cdrom'>" << endl;
|
717 |
750 |
|
718 |
|
file << "\t\t\t<source file='" << vm->get_remote_system_dir()
|
719 |
|
<< "/disk." << disk_id << "'/>" << endl;
|
|
751 |
file << "\t\t\t<source file=" << wrapper_attribute(vm->get_remote_system_dir() + "/disk." + patch::to_string(disk_id))
|
|
752 |
<< "/>" << endl;
|
720 |
753 |
|
721 |
|
file << "\t\t\t<target dev='" << target << "'/>" << endl;
|
|
754 |
file << "\t\t\t<target dev=" << wrapper_attribute(target) << "/>" << endl;
|
722 |
755 |
file << "\t\t\t<readonly/>" << endl;
|
723 |
756 |
|
724 |
757 |
file << "\t\t\t<driver name='qemu' type='raw'/>" << endl;
|
... | ... | |
783 |
816 |
file << "\t\t\t<virtualport type='openvswitch'/>" << endl;
|
784 |
817 |
}
|
785 |
818 |
|
786 |
|
file << "\t\t\t<source bridge='" << *the_bridge << "'/>" << endl;
|
|
819 |
file << "\t\t\t<source bridge=" << wrapper_attribute(*the_bridge) << "/>" << endl;
|
787 |
820 |
}
|
788 |
821 |
|
789 |
822 |
if( !mac.empty() )
|
790 |
823 |
{
|
791 |
|
file << "\t\t\t<mac address='" << mac << "'/>" << endl;
|
|
824 |
file << "\t\t\t<mac address=" << wrapper_attribute(mac) << "/>" << endl;
|
792 |
825 |
}
|
793 |
826 |
|
794 |
827 |
if( !target.empty() )
|
795 |
828 |
{
|
796 |
|
file << "\t\t\t<target dev='" << target << "'/>" << endl;
|
|
829 |
file << "\t\t\t<target dev=" << wrapper_attribute(target) << "/>" << endl;
|
797 |
830 |
}
|
798 |
831 |
|
799 |
832 |
if( !script.empty() )
|
800 |
833 |
{
|
801 |
|
file << "\t\t\t<script path='" << script << "'/>" << endl;
|
|
834 |
#if 0
|
|
835 |
/*
|
|
836 |
* Do not allow the user to specify a script
|
|
837 |
* We do not want them running arbitrary scripts on our hosts.
|
|
838 |
*/
|
|
839 |
file << "\t\t\t<script path=" << wrapper_attribute(script) << "/>" << endl;
|
|
840 |
#endif
|
802 |
841 |
}
|
803 |
842 |
|
804 |
843 |
string * the_model = 0;
|
... | ... | |
814 |
853 |
|
815 |
854 |
if (the_model != 0)
|
816 |
855 |
{
|
817 |
|
file << "\t\t\t<model type='" << *the_model << "'/>" << endl;
|
|
856 |
file << "\t\t\t<model type=" << wrapper_attribute(*the_model) << "/>" << endl;
|
818 |
857 |
}
|
819 |
858 |
|
820 |
859 |
if (!ip.empty() )
|
... | ... | |
832 |
871 |
|
833 |
872 |
if ( the_filter != 0 )
|
834 |
873 |
{
|
835 |
|
file <<"\t\t\t<filterref filter='"<< *the_filter <<"'>"<<endl;
|
836 |
|
file << "\t\t\t\t<parameter name='IP' value='"
|
837 |
|
<< ip << "'/>" << endl;
|
|
874 |
file <<"\t\t\t<filterref filter="<< wrapper_attribute(*the_filter) <<">"<<endl;
|
|
875 |
file << "\t\t\t\t<parameter name='IP' value="
|
|
876 |
<< wrapper_attribute(ip) << "/>" << endl;
|
838 |
877 |
file << "\t\t\t</filterref>" << endl;
|
839 |
878 |
}
|
840 |
879 |
}
|
... | ... | |
864 |
903 |
|
865 |
904 |
if ( type == "vnc" || type == "spice" )
|
866 |
905 |
{
|
867 |
|
file << "\t\t<graphics type='" << type << "'";
|
|
906 |
file << "\t\t<graphics type=" << wrapper_attribute(type);
|
868 |
907 |
|
869 |
908 |
if ( !listen.empty() )
|
870 |
909 |
{
|
871 |
|
file << " listen='" << listen << "'";
|
|
910 |
file << " listen=" << wrapper_attribute(listen);
|
872 |
911 |
}
|
873 |
912 |
|
874 |
913 |
if ( !port.empty() )
|
875 |
914 |
{
|
876 |
|
file << " port='" << port << "'";
|
|
915 |
file << " port=" << wrapper_attribute(port);
|
877 |
916 |
}
|
878 |
917 |
|
879 |
918 |
if ( !passwd.empty() )
|
880 |
919 |
{
|
881 |
|
file << " passwd='" << passwd << "'";
|
|
920 |
file << " passwd=" << wrapper_attribute(passwd);
|
882 |
921 |
}
|
883 |
922 |
|
884 |
923 |
if ( !keymap.empty() )
|
885 |
924 |
{
|
886 |
|
file << " keymap='" << keymap << "'";
|
|
925 |
file << " keymap=" << wrapper_attribute(keymap);
|
887 |
926 |
}
|
888 |
927 |
|
889 |
928 |
file << "/>" << endl;
|
... | ... | |
923 |
962 |
|
924 |
963 |
if ( !type.empty() )
|
925 |
964 |
{
|
926 |
|
file << "\t\t<input type='" << type << "'";
|
|
965 |
file << "\t\t<input type=" << wrapper_attribute(type);
|
927 |
966 |
|
928 |
967 |
if ( !bus.empty() )
|
929 |
968 |
{
|
930 |
|
file << " bus='" << bus << "'";
|
|
969 |
file << " bus=" << wrapper_attribute(bus);
|
931 |
970 |
}
|
932 |
971 |
|
933 |
972 |
file << "/>" << endl;
|
... | ... | |
1044 |
1083 |
if ( type == "KVM" )
|
1045 |
1084 |
{
|
1046 |
1085 |
data = raw->vector_value("DATA");
|
|
1086 |
#if 0
|
|
1087 |
/*
|
|
1088 |
* Do not allow unverified XML in the libvirt document
|
|
1089 |
*/
|
1047 |
1090 |
file << "\t" << data << endl;
|
|
1091 |
#endif
|
1048 |
1092 |
}
|
1049 |
1093 |
}
|
1050 |
1094 |
|