diff options
Diffstat (limited to 'src/addInfo.cpp')
-rw-r--r-- | src/addInfo.cpp | 346 |
1 files changed, 0 insertions, 346 deletions
diff --git a/src/addInfo.cpp b/src/addInfo.cpp deleted file mode 100644 index 1eb2213..0000000 --- a/src/addInfo.cpp +++ /dev/null @@ -1,346 +0,0 @@ -#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) ); - - -} - |