Make dbus connections allow multiple connections

Fix static dependencies
diff --git a/docs/profile.md b/docs/profile.md
index b3ceff0..e4c14a7 100644
--- a/docs/profile.md
+++ b/docs/profile.md
@@ -15,4 +15,4 @@
 kill -12 1480
 
 
-dbus-monitor --system "type='signal',path_namespace='/xyz/openbmc_project/sensors'"
\ No newline at end of file
+dbus-monitor --system "type='signal',path_namespace='/xyz/openbmc_project/sensors/tach'"
\ No newline at end of file
diff --git a/src/webserver_main.cpp b/src/webserver_main.cpp
index d20b8d5..ec21f6d 100644
--- a/src/webserver_main.cpp
+++ b/src/webserver_main.cpp
@@ -54,7 +54,7 @@
   s.unpack(object_name).unpack(values);
   crow::json::wvalue j;
   for (auto& value : values) {
-    //std::cout << "Got sensor value for " << s.get_path() << "\n";
+    // std::cout << "Got sensor value for " << s.get_path() << "\n";
     boost::apply_visitor([&](auto val) { j[s.get_path()] = val; },
                          value.second);
   }
@@ -107,39 +107,25 @@
   CROW_ROUTE(app, "/sensorws")
       .websocket()
       .onopen([&](crow::websocket::connection& conn) {
-        system_bus = std::make_shared<dbus::connection>(conn.get_io_service(),
-                                                        dbus::bus::system);
-        sensor_match = std::make_shared<dbus::match>(
-            *system_bus,
-            "type='signal',path_namespace='/xyz/openbmc_project/sensors'");
+        if (!system_bus) {
+          system_bus = std::make_shared<dbus::connection>(conn.get_io_service(),
+                                                          dbus::bus::system);
+        }
+        if (!sensor_match) {
+          sensor_match = std::make_shared<dbus::match>(
+              *system_bus,
+              "type='signal',path_namespace='/xyz/openbmc_project/sensors'");
+        }
+        if (!sensor_filter) {
+          sensor_filter =
+              std::make_shared<dbus::filter>(*system_bus, [](dbus::message& m) {
+                auto member = m.get_member();
+                return member == "PropertiesChanged";
+              });
+          sensor_filter->async_dispatch(on_sensor_update);
+        }
 
-        sensor_filter =
-            std::make_shared<dbus::filter>(*system_bus, [](dbus::message& m) {
-              auto member = m.get_member();
-              return member == "PropertiesChanged";
-            });
-        /*
-        std::function<void(boost::system::error_code, dbus::message)>
-            sensor_callback = [&conn, sensor_callback](
-                boost::system::error_code ec, dbus::message s) {
-              std::string object_name;
-              std::vector<std::pair<std::string, dbus::dbus_variant>> values;
-              s.unpack(object_name).unpack(values);
-              crow::json::wvalue j;
-              for (auto& value : values) {
-                std::cout << "Got sensor value for " << s.get_path() << "\n";
-                boost::apply_visitor([&](auto val) { j[s.get_path()] = val; },
-                                     value.second);
-              }
-              for (auto conn : users) {
-                conn.send_text(crow::json::dump(j));
-              }
-              sensor_filter->async_dispatch(sensor_callback);
-            };
-            */
-        sensor_filter->async_dispatch(on_sensor_update);
         users.insert(&conn);
-        ;
       })
       .onclose(
           [&](crow::websocket::connection& conn, const std::string& reason) {
diff --git a/static/CMakeLists.txt b/static/CMakeLists.txt
index b5a53ec..4e6831c 100644
--- a/static/CMakeLists.txt
+++ b/static/CMakeLists.txt
@@ -79,15 +79,17 @@
     get_filename_component(FOLDERNAME ${MINIFIED_FILENAME} DIRECTORY)
     # string(REGEX REPLACE "(\\.[^.]*$)" ".min\\1" OUTPUT_FILENAME ${OUTPUT_FILENAME})
     file(MAKE_DIRECTORY "${FOLDERNAME}")
-    add_custom_command(OUTPUT ${MINIFIED_FILENAME} 
-        COMMAND uglifyjs --compress --mangle  
-        --output "${MINIFIED_FILENAME}"
-        "${CMAKE_CURRENT_SOURCE_DIR}/${JAVASCRIPT_ASSET}"
-        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${JAVASCRIPT_ASSET}"
-        COMMENT "Minifying ${JAVASCRIPT_ASSET}"
-    )
-
-    list(APPEND MINIFIED_ASSETS_OUT ${MINIFIED_FILENAME})
+    if(UGLIFY_MINIFIER)
+        add_custom_command(OUTPUT ${MINIFIED_FILENAME} 
+            COMMAND uglifyjs --compress --mangle  
+            --output "${MINIFIED_FILENAME}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/${JAVASCRIPT_ASSET}"
+            DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${JAVASCRIPT_ASSET}"
+            COMMENT "Minifying ${JAVASCRIPT_ASSET}"
+        )
+        list(APPEND MINIFIED_ASSETS_OUT ${MINIFIED_FILENAME})
+    endif(UGLIFY_MINIFIER)
+    
     # if it's a debug build, use the unminified version
     if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT UGLIFY_MINIFIER)
         list(APPEND STATIC_ASSETS_OUT ${CMAKE_CURRENT_SOURCE_DIR}/${JAVASCRIPT_ASSET})
diff --git a/static/css/intel.css b/static/css/intel.css
index 6915f8a..2596d1e 100644
--- a/static/css/intel.css
+++ b/static/css/intel.css
@@ -2880,5 +2880,115 @@
     color: #fff!important
 }
 
+.animate-enter {
+    -webkit-animation: enter 600ms cubic-bezier(0.390, 0.575, 0.565, 1.000);
+    animation: enter 600ms cubic-bezier(0.390, 0.575, 0.565, 1.000);
+    display: block;
+    position: relative;
+}
+
+@-webkit-keyframes enter {
+    from {
+        opacity: 0;
+        height: 0px;
+    }
+    20% {
+        opacity: .5;
+    }
+    40% {
+        opacity: .15;
+        color: red;
+    }
+    60% {
+        opacity: .75;
+    }
+    80% {
+        opacity: .3;
+    }
+    to {
+        opacity: 1;
+        height: 30px;
+    }
+}
+
+@keyframes enter {
+    from {
+        opacity: 0;
+        height: 0px;
+    }
+    20% {
+        opacity: .5;
+    }
+    40% {
+        opacity: .15;
+        color: red;
+    }
+    60% {
+        opacity: .75;
+    }
+    80% {
+        opacity: .3;
+    }
+    to {
+        opacity: 1;
+        height: 30px;
+    }
+}
+
+.animate-leave {
+    -webkit-animation: leave 600ms cubic-bezier(0.390, 0.575, 0.565, 1.000);
+    animation: leave 600ms cubic-bezier(0.390, 0.575, 0.565, 1.000);
+    display: block;
+    position: relative;
+}
+
+@-webkit-keyframes leave {
+    to {
+        opacity: 0;
+        height: 0px;
+    }
+    80% {
+        opacity: .25;
+    }
+    60% {
+        opacity: .10;
+        color: red;
+    }
+    40% {
+        opacity: .5;
+    }
+    20% {
+        opacity: .30;
+    }
+    from {
+        opacity: 1;
+        height: 30px;
+    }
+}
+
+@keyframes leave {
+    to {
+        opacity: 0;
+        height: 0px;
+    }
+    80% {
+        opacity: .25;
+    }
+    60% {
+        opacity: .10;
+        color: red;
+    }
+    40% {
+        opacity: .5;
+    }
+    20% {
+        opacity: .30;
+    }
+    from {
+        opacity: 1;
+        height: 30px;
+    }
+}
+
 
 /*# sourceMappingURL=../maps/styles/auth-a200a050c1.css.map */
\ No newline at end of file
diff --git a/static/partial-sensor.html b/static/partial-sensor.html
index 09f1cad..3486a63 100644
--- a/static/partial-sensor.html
+++ b/static/partial-sensor.html
@@ -15,7 +15,7 @@
                             </tr>
                         </thead>
                         <tbody>
-                            <tr ng-repeat="(sensor_name, value) in sensor_values">
+                            <tr ng-animate="'animate'" ng-repeat="(sensor_name, value) in sensor_values">
                                 <td class="fit">{{ sensor_name }}</td>
                                 <td class="fit">{{ value }}</td>
                             </tr>