Minor fixes and improvements 20/187820/2
authorDariusz Michaluk <d.michaluk@samsung.com>
Tue, 28 Aug 2018 14:07:13 +0000 (16:07 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Tue, 23 Oct 2018 15:41:15 +0000 (17:41 +0200)
- start device-certificate-manager service on demand,
- stop device-certificate-manager when no requests,
- cleanup security manifests,
- unify socket path,
- remove unused build variables,
- add boost-test dependency,
- unify service/socket names,
- restart/stop service/socket together,
- remove device-certificate-manager target.

Change-Id: Iade35e34a143300ba07c5958003dad53758f7f8e

13 files changed:
CMakeLists.txt
dcm-daemon/dcmserver.cpp
dcm-daemon/dcmserver.h
dcm-daemon/dcmsession.cpp
dcm-daemon/dcmsession.h
packaging/device-certificate-manager-devel.manifest [deleted file]
packaging/device-certificate-manager-tests.manifest.in [deleted file]
packaging/device-certificate-manager.spec
systemd/CMakeLists.txt
systemd/device-certificate-manager-control.socket.in [deleted file]
systemd/device-certificate-manager.service.in
systemd/device-certificate-manager.socket.in [new file with mode: 0644]
systemd/device-certificate-manager.target [deleted file]

index 0c99cc0..e566b9d 100644 (file)
@@ -45,18 +45,10 @@ ENDIF()
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/dcm_build_config.h.in
        ${CMAKE_CURRENT_BINARY_DIR}/dcm_build_config.h)
 
-configure_file(packaging/device-certificate-manager-tests.manifest.in
-       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager-tests.manifest)
-
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 include_directories(shared)
 
-IF(ENABLE_SYSTEMD_SUPPORT)
-       SET(DCM_UNIX_SOCKET_PATH                "/run/device-certificate-manager.socket")
-ELSE()
-       SET(DCM_UNIX_SOCKET_PATH                "/tmp/device-certificate-manager.socket")
-ENDIF()
-
+SET(DCM_UNIX_SOCKET_PATH               "/run/device-certificate-manager.socket")
 add_definitions(-DDCM_UNIX_SOCKET_PATH="${DCM_UNIX_SOCKET_PATH}")
 
 add_subdirectory(dcm-daemon)
index ba7a6dd..acdb8d8 100644 (file)
@@ -24,6 +24,7 @@
 
 dcm_server::dcm_server(boost::asio::io_service& io_service, boost::asio::local::stream_protocol::acceptor&& acceptor) :
        fService(io_service),
+       fTimer(io_service),
        fAcceptor(std::move(acceptor))
 {
        BOOST_LOG_FUNCTION();
@@ -49,7 +50,7 @@ void dcm_server::do_accept()
        std::shared_ptr<dcm_session> session;
 
        try {
-               session = std::make_shared<dcm_session>(fService, shared_from_this());
+               session = std::make_shared<dcm_session>(fService, fTimer, shared_from_this());
        } catch(std::bad_alloc& ex) {
                BOOST_LOG_SEV(dcm_logger::get(), log_severity::error) << "Out of memory when trying to allocate new session";
                return;
@@ -59,6 +60,7 @@ void dcm_server::do_accept()
        }
 
        BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Start accepting connections";
+       session->start_timer();
 
        fAcceptor.async_accept(session->socket(),
                [session, self](boost::system::error_code error_code)
@@ -74,7 +76,8 @@ void dcm_server::do_accept()
                });
 }
 
-std::shared_ptr<asbtract_crypto_backend> dcm_server::crypto_backend() {
+std::shared_ptr<asbtract_crypto_backend> dcm_server::crypto_backend()
+{
        std::unique_lock<std::mutex> locker(this->fLock);
        return fCryptoBackend;
 }
index 2835619..cda72bb 100644 (file)
@@ -42,6 +42,7 @@ private:
 
 private:
        boost::asio::io_service&                                                fService;
+       boost::asio::deadline_timer                                             fTimer;
        boost::asio::local::stream_protocol::acceptor   fAcceptor;
        std::mutex                                                                              fLock;
        std::shared_ptr<asbtract_crypto_backend>                fCryptoBackend;
index 8fad0a8..edb9af1 100644 (file)
@@ -51,12 +51,16 @@ static inline std::string cynara_error_to_string(int error) {
 }
 #endif
 
-dcm_session::dcm_session(boost::asio::io_service& io_service, const std::shared_ptr<dcm_server>& server) :
+unsigned int globalSessionCounter = 0;
+
+dcm_session::dcm_session(boost::asio::io_service& io_service, boost::asio::deadline_timer& timer, const std::shared_ptr<dcm_server>& server) :
        fService(io_service),
+       fTimer(timer),
        fSocket(io_service),
        fServer(server)
 {
        BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Create new session object " << this;
+       globalSessionCounter++;
 }
 
 dcm_session::~dcm_session()
@@ -149,14 +153,42 @@ void dcm_session::start()
        int handle = fSocket.native_handle();
        BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Accepted connection with socket " << fSocket.native_handle();
 
-       std::string label;
        if(verify_privileges(handle)) {
+               stop_timer();
                do_receive();
        } else {
                BOOST_LOG_SEV(dcm_logger::get(), log_severity::error) << "Client privilege check failure. Disconnect";
+               start_timer();
+       }
+}
+
+void dcm_session::start_timer()
+{
+       globalSessionCounter--;
+       BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Number of active connections: " << globalSessionCounter;
+
+       if(globalSessionCounter == 0) {
+               BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "No active connections, server will be closed after few seconds";
+               fTimer.expires_from_now(boost::posix_time::seconds(10));
+               /* operation_aborted error is returned whenever we cancel the timer or we reset the timer using expires_from_now function */
+               fTimer.async_wait([this](const boost::system::error_code &error) {
+                       if(error != boost::asio::error::operation_aborted) {
+                               BOOST_LOG_SEV(dcm_logger::get(), log_severity::normal) << "No active connections, server will be closed";
+                               fService.stop();
+                       }
+               });
        }
 }
 
+void dcm_session::stop_timer()
+{
+       globalSessionCounter++;
+       BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Number of active connections: " << globalSessionCounter;
+
+       fTimer.cancel();
+       BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Timer cancelled";
+}
+
 void dcm_session::do_receive() noexcept
 {
        BOOST_LOG_FUNCTION();
@@ -175,6 +207,7 @@ void dcm_session::do_receive() noexcept
                                        } else {
                                                BOOST_LOG_SEV(dcm_logger::get(), log_severity::error) << "Client disconnected: " << error;
                                                // Connection object will be released by shared ptr
+                                               start_timer();
                                        }
                        });
        } catch(std::exception& ex) {
@@ -183,7 +216,7 @@ void dcm_session::do_receive() noexcept
        } catch(...) {
                BOOST_LOG_SEV(dcm_logger::get(), log_severity::error) << "Caught exception while trying to read message : " << "unknown";
                // Connection object will be released by shared ptr
-       }
+       }
 }
 
 void dcm_session::decode_message() noexcept
index 7124247..e6f72d3 100644 (file)
@@ -37,10 +37,12 @@ class dcm_session final : public std::enable_shared_from_this<dcm_session>,
        public boost::noncopyable
 {
 public:
-       dcm_session(boost::asio::io_service& io_service, const std::shared_ptr<dcm_server>& server);
+       dcm_session(boost::asio::io_service& io_service, boost::asio::deadline_timer& timer, const std::shared_ptr<dcm_server>& server);
        ~dcm_session();
 
        void start();
+       void start_timer();
+       void stop_timer();
 
        inline boost::asio::local::stream_protocol::socket& socket() {
                return fSocket;
@@ -59,6 +61,7 @@ private:
 
 private:
        boost::asio::io_service&                                                fService;
+       boost::asio::deadline_timer&                                    fTimer;
        boost::asio::local::stream_protocol::socket             fSocket;
        protobuf_async_message_serialization                    fSerializer;
        protobuf_async_message_deserialization                  fDeserializer;
diff --git a/packaging/device-certificate-manager-devel.manifest b/packaging/device-certificate-manager-devel.manifest
deleted file mode 100644 (file)
index 5530a2e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<manifest>
-       <request>
-               <domain name="_" />
-       </request>
-</manifest>
-
-
diff --git a/packaging/device-certificate-manager-tests.manifest.in b/packaging/device-certificate-manager-tests.manifest.in
deleted file mode 100644 (file)
index 9bd7968..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<manifest>
-       <define>
-               <domain name="device-certificate-managert-test" />
-               <permit>
-                       <smack permit="system::use_internet" type="w" />
-               </permit>
-               <request>
-                       <smack request="system::use_internet" type="w" />
-               </request>
-       </define>
-       <request>
-               <domain name="device-certificate-managert-test" />
-       </request>
-</manifest>
index 882d9db..1e5bd62 100644 (file)
@@ -6,7 +6,6 @@ Group: Security/Secure Storage
 License: Apache-2.0
 Source0: %{name}-%{version}.tar.gz
 Source1001: device-certificate-manager.manifest
-Source1002: device-certificate-manager-devel.manifest
 BuildRequires: cmake
 BuildRequires: pkgconfig(dlog)
 BuildRequires: pkgconfig(libsystemd-daemon)
@@ -31,12 +30,10 @@ Requires: boost-regex
 
 %global user_name              security_fw
 %global group_name             security_fw
-%global service_name           device-certificate-manager
 %global smack_domain_name      System
 
 %description
-Device Certificate Manager provides cryptography services
-for the Iotivity framework.
+Device Certificate Manager provides cryptography services for the Iotivity framework.
 
 %package -n device-certificate-manager-devel
 Summary:       Device Certificate Manager (development)
@@ -53,6 +50,7 @@ Group:                Security/Testing
 Requires:      device-certificate-manager = %{version}-%{release}
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
+Requires:      boost-test
 
 %description -n device-certificate-manager-tests
 Internal tests for Device Certificate Manager
@@ -60,14 +58,12 @@ Internal tests for Device Certificate Manager
 %prep
 %setup -q
 cp -a %{SOURCE1001} .
-cp -a %{SOURCE1002} .
 
 %build
 
 %cmake . -DVERSION=%{version} \
        -DCMAKE_BUILD_TYPE=%{?build_type:%build_type}%{!?build_type:Release} \
        -DSYSTEMD_UNIT_DIR=%{_unitdir} \
-       -DSERVICE_NAME=%{service_name} \
        -DUSER_NAME=%{user_name} \
        -DGROUP_NAME=%{group_name} \
        -DSMACK_DOMAIN_NAME=%{smack_domain_name}
@@ -76,19 +72,18 @@ make %{?jobs:-j%jobs}
 
 %install
 %make_install
-%install_service multi-user.target.wants device-certificate-manager.service
-%install_service sockets.target.wants device-certificate-manager-control.socket
+%install_service sockets.target.wants device-certificate-manager.socket
 
 %post
 /sbin/ldconfig
 systemctl daemon-reload
+systemctl restart device-certificate-manager.socket
 systemctl restart device-certificate-manager.service
 
 %preun
 if [ $1 = 0 ]; then
     # unistall
-    systemctl stop device-certificate-manager.service
-    systemctl stop device-certificate-manager-control.socket
+    systemctl stop device-certificate-manager.service device-certificate-manager.socket
 fi
 
 %postun
@@ -98,25 +93,23 @@ if [ $1 = 0 ]; then
 fi
 
 %files
-%manifest device-certificate-manager.manifest
+%manifest %{name}.manifest
 %license LICENSE
 %{_bindir}/device-certificate-managerd
 %{_libdir}/libdevice-certificate-manager.so.*
-%{_unitdir}/multi-user.target.wants/device-certificate-manager.service
 %{_unitdir}/device-certificate-manager.service
-%{_unitdir}/device-certificate-manager.target
-%{_unitdir}/sockets.target.wants/device-certificate-manager-control.socket
-%{_unitdir}/device-certificate-manager-control.socket
+%{_unitdir}/sockets.target.wants/device-certificate-manager.socket
+%{_unitdir}/device-certificate-manager.socket
 
-%files -n device-certificate-manager-devel
-%manifest device-certificate-manager-devel.manifest
+%files devel
+%manifest %{name}.manifest
 %license LICENSE
 %{_libdir}/libdevice-certificate-manager.so
 %{_includedir}/device-certificate-manager/*.h
 %{_libdir}/pkgconfig/*.pc
 
-%files -n device-certificate-manager-tests
-%manifest device-certificate-manager-tests.manifest
+%files tests
+%manifest %{name}.manifest
 %license LICENSE
 %{_bindir}/dcm_example_client
 %{_bindir}/dcm_example_capi
index 4c62027..78946f5 100644 (file)
@@ -2,15 +2,15 @@ configure_file(device-certificate-manager.service.in
        ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager.service
        @ONLY)
 
-configure_file(device-certificate-manager-control.socket.in
-       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager-control.socket
+configure_file(device-certificate-manager.socket.in
+       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager.socket
        @ONLY)
 
 IF(NOT ("${SYSTEMD_UNIT_DIR}" STREQUAL ""))
 
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager.service
-       device-certificate-manager.target
-       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager-control.socket
+install(FILES
+       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager.service
+       ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager.socket
        DESTINATION
        ${SYSTEMD_UNIT_DIR})
 
diff --git a/systemd/device-certificate-manager-control.socket.in b/systemd/device-certificate-manager-control.socket.in
deleted file mode 100644 (file)
index 7ae61d5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-[Socket]
-ListenStream=@DCM_UNIX_SOCKET_PATH@
-SocketMode=0777
-SmackLabelIPIn=*
-SmackLabelIPOut=@
-Service=device-certificate-manager.service
-
-[Unit]
-Wants=device-certificate-manager.target
-Before=device-certificate-manager.target
-
-[Install]
-WantedBy=sockets.target
index f36bc91..59a8a37 100644 (file)
@@ -8,9 +8,5 @@ SmackProcessLabel=@SMACK_DOMAIN_NAME@
 Type=notify
 KillMode=process
 TimeoutStopSec=3
-Restart=always
+Restart=on-abnormal
 ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/device-certificate-managerd
-Sockets=device-certificate-manager-control.socket
-
-[Install]
-WantedBy=multi-user.target
diff --git a/systemd/device-certificate-manager.socket.in b/systemd/device-certificate-manager.socket.in
new file mode 100644 (file)
index 0000000..4e32816
--- /dev/null
@@ -0,0 +1,8 @@
+[Socket]
+ListenStream=@DCM_UNIX_SOCKET_PATH@
+SocketMode=0777
+SmackLabelIPIn=*
+SmackLabelIPOut=@
+
+[Install]
+WantedBy=sockets.target
diff --git a/systemd/device-certificate-manager.target b/systemd/device-certificate-manager.target
deleted file mode 100644 (file)
index c51564b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[Unit]
-Description=Device Certificate Manager sockets
-DefaultDependencies=true