summaryrefslogtreecommitdiffstats
path: root/src/addInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/addInfo.cpp')
-rw-r--r--src/addInfo.cpp346
1 files changed, 346 insertions, 0 deletions
diff --git a/src/addInfo.cpp b/src/addInfo.cpp
new file mode 100644
index 0000000..1eb2213
--- /dev/null
+++ b/src/addInfo.cpp
@@ -0,0 +1,346 @@
+#include "functions.h"
+#include "paths.h"
+
+#include <iostream>
+#include <fstream>
+#include <unistd.h>
+#include <pwd.h>
+#include <sys/types.h>
+
+#include "boost/filesystem.hpp"
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xpath.h>
+
+namespace bfs = boost::filesystem;
+
+extern string env;
+
+/******************************************
+ * Adds user info and hostname to xml
+ *
+ * usernode: <username param="user" />
+ * hostnamenode: <hostname param="host" />
+ * computername: needed for bootpgm <computername .../>
+ ******************************************/
+void addInfo(xmlNode* node, DataEntry* dat) {
+
+ if (node == NULL) {
+ return;
+ }
+
+ bool user = false;
+ bool host = false;
+
+ const int MAX_LENGTH = 200;
+ char hostname[MAX_LENGTH];
+ uid_t id;
+ passwd *pwd;
+
+ string strline;
+ xmlNodePtr cur = node->children;
+ xmlNodePtr usernode = NULL;
+ xmlNodePtr hostnamenode = NULL;
+ xmlNodePtr compnamenode = NULL;
+ xmlNodePtr filenamenode = NULL;
+ xmlNodePtr firstchild = node->children;
+
+ // just use some standard Linux functions here ...
+ id = geteuid(); // gets effective user id
+ pwd = getpwuid(id); // gets passwd struct (including username)
+ gethostname(hostname, MAX_LENGTH - 1); // gets hostname
+
+ // Get <username> node and add "username#param" attribute
+ while (cur != NULL) {
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "username")) {
+ user = true;
+ usernode = cur;
+ break;
+ }
+ cur = cur->next;
+ }
+ if (!user) {
+ usernode = xmlNewNode(NULL, (const xmlChar*) "username");
+ if (usernode != NULL) {
+ xmlNewProp(usernode, (const xmlChar*) "param",
+ (const xmlChar*) pwd->pw_name);
+ xmlAddChild(node, usernode);
+ } else {
+ cerr << "<username> node could not be created!" << endl;
+ }
+ } else {
+ // set param attribute in <username>
+ xmlSetProp(usernode, (const xmlChar*) "param",
+ (const xmlChar*) pwd->pw_name);
+ }
+
+ cur = node->children;
+
+ // Get <hostname> node and add "hostname#param" attribute
+ while (cur != NULL) {
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "hostname")) {
+ host = true;
+ hostnamenode = cur;
+ break;
+ }
+ cur = cur->next;
+ }
+ if (!host) {
+ hostnamenode = xmlNewNode(NULL, (const xmlChar*) "hostname");
+ if (hostnamenode != NULL) {
+ xmlNewProp(hostnamenode, (const xmlChar*) "param",
+ (const xmlChar*) hostname);
+ xmlAddChild(node, hostnamenode);
+ } else {
+ cerr << "<hostname> node could not be created!" << endl;
+ }
+ } else {
+ // add param value to existant hostname-node
+ xmlSetProp(hostnamenode, (const xmlChar*) "param", (xmlChar*) hostname);
+ }
+
+ // We need to add computername-node as the first node
+ compnamenode = xmlNewNode(NULL, (const xmlChar*) "computername");
+ if (compnamenode != NULL) {
+ xmlNewProp(compnamenode, (const xmlChar*) "param",
+ (const xmlChar*) hostname);
+ // Add this node to the beginning of available children
+ // -> that is because bootpgm only looks in the first 500 chars
+ if (firstchild != NULL) {
+ xmlAddPrevSibling(firstchild, compnamenode);
+ }
+ //xmlFreeNode(compnamenode);
+ } else {
+ cerr << "<computername> node could not be created!" << endl;
+ }
+
+ // We need to add the filename to the xml
+ if (dat->xml_name.empty())
+ return;
+ bfs::path path(dat->xml_name);
+ std::string folder = path.branch_path().string();
+ folder.append("/");
+
+ if (folder.empty())
+ return;
+ cur = node->children;
+
+ // Get <hostname> node and add "hostname#param" attribute
+ while (cur != NULL) {
+ if (!xmlStrcmp(cur->name, (const xmlChar *) "image_name")) {
+ filenamenode = cur;
+ break;
+ }
+ cur = cur->next;
+ }
+ if (!filenamenode) {
+ cerr << "There is no node called 'image_name'. " << endl;
+ } else {
+ // add param value to existant hostname-node
+ xmlChar* bla = xmlGetProp(filenamenode, (const xmlChar*) "param");
+ if (!bla) {
+ cerr << "Could not read Attribute 'param' in 'image_name' node."
+ << endl;
+ return;
+ } else {
+ xmlSetProp(filenamenode, (const xmlChar*) "param",
+ (const xmlChar*) folder.append((char*) bla).c_str());
+ }
+ }
+
+ return;
+}
+
+
+
+
+/**
+ * read specific xml files for a group from
+ *
+ * /etc/opt/openslx/vmchooser-[groupname].xml
+ *
+ * and add group specific informations like shared_folders,
+ * printers and scanners
+ *
+ * @param dat - this is the DataEntry struct pointer
+ * @param group - this is the group name to get informations from
+ */
+void readGroupXml(DataEntry* dat, string group) {
+
+ xmlNodePtr envnode = 0,
+ tnode = 0, tnode2=0, tnode3=0, // temporary nodes
+ shared=0, // Node for shared folders
+ printer=0, // Node for printers
+ scanner=0; // Node for scanners
+
+ xmlChar* xmlenv = 0;
+ string t;
+
+ // these variables are for xpath queries
+ xmlXPathObjectPtr xpp;
+ int size = 0;
+
+ string grpXmlPath;
+
+ grpXmlPath = string(VMCHOOSER_ETC_BASE_PATH)
+ .append("vmchooser-")
+ .append(group)
+ .append(".xml");
+
+ if (!bfs::is_regular(grpXmlPath)) {
+ return;
+ }
+
+ xmlDocPtr doc = xmlReadFile(
+ grpXmlPath.c_str(),
+ NULL,
+ XML_PARSE_RECOVER|XML_PARSE_NOERROR
+ );
+
+ if(! doc ) return;
+
+
+ envnode = xmlFirstElementChild(doc->children);
+ if(envnode == 0) {
+ return;
+ }
+
+ do {
+ xmlenv = xmlGetProp(envnode, (const xmlChar*)"param");
+ if(xmlStrlen(xmlenv) == 0
+ || string((const char*)envnode->name) != "environment")
+ {
+ continue;
+ }
+ if(group == (const char*)xmlenv) {
+ tnode = xmlFirstElementChild(envnode);
+ do {
+ if(tnode->type != XML_ELEMENT_NODE) continue;
+ t = (const char*)tnode->name;
+
+ // Here we are looking for shared_folders,printers and scanners
+ // respectively
+ if(t == "shared_folders") {
+ // There could be many shared folders in there
+ shared = xmlFirstElementChild(tnode);
+ do {
+ if(shared->type != XML_ELEMENT_NODE) continue;
+ xpp = evalXPath(dat->xml, "/settings/eintrag/shared_folders");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ if(size == 0) {
+ // shared_folders node not found - add it
+ tnode2 = xmlNewNode(NULL, (const xmlChar*) "shared_folders");
+ xmlAddChild(tnode2, shared);
+ xpp = evalXPath(dat->xml, "/settings/eintrag");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ for (int i= 0; i < size; i++) {
+ tnode3 = xpp->nodesetval->nodeTab[i];
+ if (tnode3->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode3, tnode2);
+ } else {
+ continue;
+ }
+ }
+ }
+ else
+ {
+ // found shared_folders node - add children
+ for (int i= 0; i < size; i++) {
+ tnode2 = xpp->nodesetval->nodeTab[i];
+ if (tnode2->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode2, shared);
+ } else {
+ continue;
+ }
+ }
+ }
+ } while ( (shared = shared->next) );
+ }
+ else if(t == "printers") {
+ // There could be many printer nodes in there
+ printer = xmlFirstElementChild(tnode);
+ do {
+ if(printer->type != XML_ELEMENT_NODE) continue;
+ xpp = evalXPath(dat->xml, "/settings/eintrag/printers");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ if(size == 0) {
+ // shared_folders node not found - add it
+ tnode2 = xmlNewNode(NULL, (const xmlChar*) "printers");
+ xmlAddChild(tnode2, printer);
+ xpp = evalXPath(dat->xml, "/settings/eintrag");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ for (int i= 0; i < size; i++) {
+ tnode3 = xpp->nodesetval->nodeTab[i];
+ if (tnode3->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode3, tnode2);
+ } else {
+ continue;
+ }
+ }
+ }
+ else
+ {
+ // found shared_folders node - add children
+ for (int i= 0; i < size; i++) {
+ tnode2 = xpp->nodesetval->nodeTab[i];
+ if (tnode2->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode2, printer);
+ } else {
+ continue;
+ }
+ }
+ }
+ } while ( (printer = printer->next) );
+ }
+ else if(t == "scanners") {
+ // There could be many printer nodes in there
+ scanner = xmlFirstElementChild(tnode);
+ do {
+ if(scanner->type != XML_ELEMENT_NODE) continue;
+ xpp = evalXPath(dat->xml, "/settings/eintrag/scanners");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ if(size == 0) {
+ // scanners node not found - add it
+ tnode2 = xmlNewNode(NULL, (const xmlChar*) "scanners");
+ xmlAddChild(tnode2, scanner);
+ xpp = evalXPath(dat->xml, "/settings/eintrag");
+ size = (xpp->nodesetval) ? xpp->nodesetval->nodeNr: 0;
+
+ for (int i= 0; i < size; i++) {
+ tnode3 = xpp->nodesetval->nodeTab[i];
+ if (tnode3->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode3, tnode2);
+ } else {
+ continue;
+ }
+ }
+ }
+ else
+ {
+ // found scanners node - add children
+ for (int i= 0; i < size; i++) {
+ tnode2 = xpp->nodesetval->nodeTab[i];
+ if (tnode2->type == XML_ELEMENT_NODE ) {
+ xmlAddChild(tnode2, scanner);
+ } else {
+ continue;
+ }
+ }
+ }
+ } while ( (scanner = scanner->next) );
+ }
+ }
+ while ( (tnode = tnode->next) );
+ }
+ }
+ while ( (envnode = envnode->next) );
+
+
+}
+