diff --git a/xCAT-web-exp/functions.php b/xCAT-web-exp/functions.php
new file mode 100644
index 000000000..b1bddd0d5
--- /dev/null
+++ b/xCAT-web-exp/functions.php
@@ -0,0 +1,316 @@
+>certchain.pem
+$version = "0.1";
+#$cert = ".xcat/client-cred.pem";
+$msg;
+$xcathost = "localhost";
+$port = "3001";
+
+#if(! file_exists($cert)){
+# echo "$cert does not exist. Please run xcatwebsetup first";
+#}
+
+
+$xcatcmds = array(
+ "rpower" => array("on","off","reset","stat","state","boot","off","cycle"),
+ "rvitals" => array("all","temp","wattage","voltage","fanspeed","power","leds","state"),
+ "reventlog" => array("all", "clear"),
+ "rinv" => array("all", "model", "serial", "vpd", "mprom", "deviceid", "uuid", "guid", "firm", "bios", "diag", "mprom", "sprom", "mparom", "mac", "mtm"),
+ "resetboot" => array("net", "hd", "cd", "def", "stat")
+);
+
+#function to enable password storage to split between cookie and session variable
+function xorcrypt($data,$key) {
+ $datalen=strlen($data);
+ $keylen=strlen($key);
+ for ($i=0;$i<$datalen;$i++) {
+ $data[$i]=chr(ord($data[$i])^ord($key[$i]));
+ }
+ return $data;
+}
+
+function getpassword() {
+ if (isset($GLOBALS['xcatauthsecret'])) {
+ $cryptext=$GLOBALS['xcatauthsecret'];
+ } else if (isset($_COOKIE["xcatauthsecret"])) {
+ $cryptext = $_COOKIE["xcatauthsecret"];
+ } else {
+ return false;
+ }
+ return xorcrypt($_SESSION["secretkey"],base64_decode($cryptext));
+}
+
+#remembers the password, splitting knowledge between server and client side
+#persistant storage
+#Caller should regenerate session id when contemplating a new user/password,
+#to preclude session fixation, though fixation is limited without the secret.
+function setpassword($password) {
+ $randlen=strlen($password);
+ $key=getrandchars($randlen);
+ $cryptext=xorcrypt($password,$key);
+ $cryptext=base64_encode($cryptext); #non-ascii chars, base64 it
+#Not bothering with explicit expiration, as time sync would be too hairy
+#should go away when browser closes. Any timeout will be handled server
+#side. If the session id invalidates and the one-time key discarded,
+#the cookie contents are worthless anyway
+#nevertheless, when logout happens, cookie should be reaped
+ setcookie("xcatauthsecret",$cryptext);
+ $GLOBALS["xcatauthsecret"]=$cryptext; #May need it sooner, prefer globals
+ $_SESSION["secretkey"]=$key;
+}
+
+function getrandchars($length) {
+ $charset='0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*';
+ $charsize=strlen($charset);
+ srand();
+ $chars='';
+ for ($i=0;$i<$length;$i++) {
+ $num=rand()%$charsize;
+ $chars=$chars.substr($charset,$num,1);
+ }
+ return $chars;
+}
+
+
+
+
+
+#functions for editing tables
+function savexCATchanges($file, $tab){
+ $request = simplexml_load_string('');
+ $request->addChild('command','tabrestore');
+ $fh = fopen($file, 'r') or die("can't open $file");
+ while(!feof($fh)){
+ $line = fgets($fh,4096);
+ if(empty($line)){
+ continue;
+ }
+ $line = str_replace("\"\"", "",$line);
+ $line = str_replace("\"", """,$line);
+ $request->addChild('data', $line);
+ }
+ fclose($fh);
+ $request->addChild('table',$tab);
+ $resp = submit_request($request, 1);
+ # 0 means it didn't work
+ return($resp);
+}
+
+function splitTableFields($arr){
+ $fields = array();
+ $fields = explode(',', $arr);
+ $rf = array();
+
+ # now we have to do damage control for fields that look like this:
+ # "idplx15","idplx,ipmi,compute,all",,,
+ $inc = '';
+ foreach($fields as $f){
+ #if(ereg("\"[a-zA-Z0-9\-\.\:\!\| ]+\"", $f)){
+ if(ereg("\"[^\"]+\"", $f)){
+ $rf[] = $f;
+ continue;
+ }
+ #if(ereg("^[a-zA-Z0-9\-\. ]+\"", $f)){
+ if(ereg("[^\"]+\"", $f)){
+ $inc .= ",$f";
+ $rf[] = $inc;
+ $inc = '';
+ continue;
+ }
+ #if(ereg("\"[a-zA-Z0-9\-\. ]+", $f)){
+ if(ereg("\"[^\"]+", $f)){
+ $inc .= $f;
+ continue;
+ }
+ #if(ereg("[a-zA-Z0-9\-\. ]+", $f)){
+ if(ereg("[a-zA-Z0-9\-\. ]+", $f)){
+ $inc .= ",$f";
+ continue;
+ }
+ $rf[] = "";
+ }
+ return $rf;
+}
+
+
+function getTabNames() {
+ $xml = docmd('tabdump','','');
+ $tabs = $xml->xcatresponse->children();
+ return $tabs;
+}
+
+function getTabHeaders($tab){
+ $arr = $tab->xcatresponse->children();
+ $line = $arr[0];
+ $headers = array();
+ $headers = explode(',', $line);
+ return $headers;
+
+}
+
+
+# get the keys of the hash table.
+function keysByNodeName($ht) {
+ $nh = array();
+ foreach($ht->xcatresponse as $v){
+ $node = (string) $v->node->name;
+ if(!array_key_exists($node, $nh)){
+ $nh[$node] = array();
+ }
+ $desc = (string) $v->node->data->desc;
+ $cont = (string) $v->node->data->contents;
+ $nh[$node][$desc] = $cont;
+ }
+ return($nh);
+}
+
+function attributesOfNodes($ht) {
+ $arr = array();
+ foreach($ht->xcatresponse as $v){
+ foreach($v->node as $va){
+ $val = (string) $va->data->desc;
+ if($val == ""){
+ $val = (string) $va->data->contents;
+ }
+ $arr[] = $val;
+ }
+ }
+ $arr = array_unique($arr);
+ return($arr);
+}
+
+function parseNodeGroups ($groups){
+ # groups is an array that may have duplicate commas in them.
+ $arr = array();
+ foreach($groups as $gline){
+ $newg = explode(',', $gline);
+ foreach($newg as $g){
+ if(empty($g)){ continue; }
+ if(!array_key_exists($g, $arr)){
+ $arr[] = $g;
+ }
+ }
+ }
+ return array_unique($arr);
+}
+
+# this is a kluge... should make better data structures.
+# but too lazy right now...
+function addNodesToGroups($groups, $node){
+ $arr = array();
+ foreach($groups as $g){
+ $arr[$g] = array();
+ foreach($node->xcatresponse as $v){
+ foreach($v->node as $n){
+ $na = (string) $n->data->contents;
+ $nag = explode(',', $na);
+ foreach($nag as $foo){
+ if(strcmp($foo,$g) == 0){
+ $name = (string) $n->name;
+ $arr[$g][] = $name;
+ continue;
+ }
+ }
+ }
+ }
+ }
+ return $arr;
+}
+
+function is_logged() {
+ if (isset($_SESSION["username"]) and !is_bool(getpassword())) {
+ return true;
+ } else {
+ return false;
+ }
+}
+function logout() {
+ #clear the secret cookie from browser.
+ #expire cookie a week ago, server time, may not work if client clock way off, but the value will be cleared at least.
+ if (isset($_COOKIE["xcatauthsecret"])) {
+ setcookie("xcatauthsecret",'',time()-86400*7); #NOTE: though firefox doesn't seem to zap it dynamically from cookie store in
+ #the client side dialog, firefox does stop submitting the value. The sensitivity of the 'stale' cookie even if compromised
+ #is negligible, as the session id will be invalidated and the one-time-key needed to decrypt the password is destroyed on the server
+ }
+ #expire the sesion cookie
+ if (isset($_COOKIE[session_name()])) {
+ setcookie(session_name(),"",time()-86400*7,"/");
+ }
+ #clear server store of data
+ $_SESSION=array();
+ session_destroy();
+}
+function docmd($cmd, $nr, $arg){
+ $request = simplexml_load_string('');
+ $usernode=$request->addChild('becomeuser');
+ $usernode->addChild('username',$_SESSION["username"]);
+ $usernode->addChild('password',getpassword());
+ $request->addChild('command',$cmd);
+ if(!empty($arg)){
+ $request->addChild('arg',$arg);
+ }
+ #$request->addChild('noderange', 'all');
+ if(!empty($nr)){
+ $request->addChild('noderange',$nr);
+ }
+ #echo $request->asXML();
+ $nodes = submit_request($request,0);
+ return($nodes);
+}
+
+function submit_request($req, $skipVerify){
+ global $cert,$port,$xcathost;
+ $fp;
+ $rsp = '';
+ $pos;
+ $response = '';
+ $cleanexit=0;
+ $moreresponses=1;
+ $context = stream_context_create(); #array('ssl'=>array('local_cert' => $cert)));
+ if($fp = stream_socket_client('ssl://'.$xcathost.':'.$port,$errno,$errstr,30,
+ STREAM_CLIENT_CONNECT,$context)){
+ fwrite($fp,$req->asXML());
+ while($moreresponses and $fp and !feof($fp)){
+ $currline=fgets($fp);
+ $response .= $currline;
+ $response = preg_replace('/\n/','', $response);
+ #$pattern = "";
+ $pattern = "";
+ $pos = strpos($response,$pattern);
+ if($pos){
+ $cleanexit = 1;
+ }
+ if ($cleanexit) {
+ $pattern = "";
+ $pos = strpos($currline,$pattern);
+ }
+ if (is_numeric($pos)) {
+ #$response = substr($response, 0, $pos);
+ #var_dump($response);
+ $response = "$response";
+ #$response = preg_replace('/\s+<\/xcat>/','', $response);
+ #$response .= "";
+ #echo htmlentities($response);
+ $rsp = simplexml_load_string($response,'SimpleXMLElement', LIBXML_NOCDATA);
+ $moreresponses=0;
+ break;
+ }
+ }
+ fclose($fp);
+ }else{
+ echo "xCAT Submit request ERROR: $errno - $errstr
\n";
+ }
+ if(! $cleanexit){
+ if(!$skipVerify){
+ echo "Error in xCAT response
";
+ $rsp = 0;
+ }
+ }
+ return $rsp;
+}
+
+
+
+
+
+?>
diff --git a/xCAT-web-exp/login.php b/xCAT-web-exp/login.php
new file mode 100644
index 000000000..e4ca5b3f8
--- /dev/null
+++ b/xCAT-web-exp/login.php
@@ -0,0 +1,79 @@
+{xcatresponse}->{data})) {
+ $result="".$testcred->{xcatresponse}->{data};
+ if (is_numeric(strpos("Authenticated",$result))) {
+ $successfullogin=1;
+ }
+ }
+ }
+?>
+
+
+
+xCAT WebUI
+
+
+
+
+
+ if ($successfullogin != 1) {
+ if ($attemptedlogin) {
+ ?>Login Failed
+ }
+ ?>
+
+
+ } else {
+ echo "Login Success Logout";
+ }
+
+?>
+
+
diff --git a/xCAT-web-exp/noderangesource.php b/xCAT-web-exp/noderangesource.php
new file mode 100644
index 000000000..1a6663f83
--- /dev/null
+++ b/xCAT-web-exp/noderangesource.php
@@ -0,0 +1,47 @@
+xcatresponse->serverdone[0]);
+ $numsubgroups=count($rvals->xcatresponse->intersectinggroups);
+ $numnodes=count($rvals->xcatresponse->node);
+ $jdata=array();
+ if ($numnodes >= $numsubgroups) { #If there are few enough subgroups to be helpful filters, add them in
+ foreach ($rvals->xcatresponse->intersectinggroups as $group) {
+ if (! in_array("$group",$parents)) {
+ $jdata[]= array("data"=>"$group",
+ "attributes"=>array("id"=>"$id$group",
+ "rel"=>'group'),
+ "state"=>'closed');
+ }
+
+ }
+ } #If there were more groups than nodes, leave the signal to noise ratio down
+ if ($root==0) {
+ foreach ($rvals->xcatresponse->node as $node) {
+ $jdata[] = array("data"=>"$node",
+ "attributes"=>array("id"=>",$node",
+ "rel"=>'node'));
+ }
+ }
+# header('Content-type: text/html');
+ echo json_encode($jdata);
+?>
+
diff --git a/xCAT-web-exp/test.html b/xCAT-web-exp/test.html
new file mode 100644
index 000000000..3ee047088
--- /dev/null
+++ b/xCAT-web-exp/test.html
@@ -0,0 +1,68 @@
+
+
+xCAT web UI experiments
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+