Update the server power state dynamically in GUI

This uses websocket mechanism to retrieve the server power state and
update the same.

Resolves openbmc/openbmc#3102

Tested: Running GUI locally and verified the following scenarios:
- Power on operation from GUI and host command line
- Power off operation from host command line
- Warm reboot operation from GUI
- Cold reboot operation from GUI
- Immediate shutdown operation from GUI
- Orderly shutdown operation from GUI
In all of the above scenarios state change is notified to GUI at right time.

Change-Id: I1c97ae10419078dfe16a1d097082580c29827fb7
Signed-off-by: Jayashankar Padath <jayashankar.padath@in.ibm.com>
diff --git a/app/common/directives/app-header.js b/app/common/directives/app-header.js
index d9fc54c..6be458a 100644
--- a/app/common/directives/app-header.js
+++ b/app/common/directives/app-header.js
@@ -15,6 +15,49 @@
               $rootScope, $scope, dataService, userModel, $location, $route) {
             $scope.dataService = dataService;
 
+            // Create a secure websocket with URL as /subscribe
+            // TODO: Need to put in a generic APIUtils to avoid duplicate
+            // controller
+            var ws =
+                new WebSocket('wss://' + dataService.server_id + '/subscribe');
+
+            // Specify the required event details as JSON dictionary
+            var data = JSON.stringify({
+              'paths': ['/xyz/openbmc_project/state/host0'],
+              'interfaces': ['xyz.openbmc_project.State.Host']
+            });
+
+            // Send the JSON dictionary data to host
+            ws.onopen = function() {
+              ws.send(data);
+              console.log('host0 ws opened');
+            };
+
+            // Close the web socket
+            ws.onclose = function() {
+              console.log('host0 ws closed');
+            };
+
+            // Websocket event handling function which catches the
+            // current host state
+            ws.onmessage = function(evt) {
+              // Parse the response (JSON dictionary data)
+              var content = JSON.parse(evt.data);
+
+              // Fetch the current server power state
+              if (content.hasOwnProperty('properties') &&
+                  content['properties'].hasOwnProperty('CurrentHostState')) {
+                // Refresh the host state and status
+                // TODO: As of now not using the current host state
+                // value for updating the data Service state rather
+                // using it to detect the command line state change.
+                // Tried different methods like creating a separate
+                // function, addding ws under $scope etc.. but auto
+                // refresh is not happening.
+                $scope.loadServerStatus();
+              }
+            };
+
             $scope.loadServerHealth = function() {
               APIUtils.getLogs().then(function(result) {
                 dataService.updateServerHealth(result.data);