summaryrefslogtreecommitdiffstats
path: root/vmchooser/addInfo.cxx
blob: 144e061a57f13f2d70ecdcd51d27b206c975427c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "inc/functions.h"

#include <iostream>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>

/******************************************
 * Adds user info and hostname to xml
 *
 * usernode: <username param="user" />
 * hostnamenode: <hostname param="host" />
 * computername: needed for bootpgm <computername .../>
 ******************************************/
void addInfo(xmlNode* node) {
  
  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 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;
  }

  return;
}