nmdaemon refactoring
authori.metelytsia <i.metelytsia@samsung.com>
Tue, 23 May 2017 10:07:33 +0000 (13:07 +0300)
committeri.metelytsia <i.metelytsia@samsung.com>
Tue, 23 May 2017 10:08:01 +0000 (13:08 +0300)
14 files changed:
device_core/nmdaemon/daemon.cpp [deleted file]
device_core/nmdaemon/daemon.h [deleted file]
device_core/nmdaemon/main.cpp
device_core/nmdaemon/main_def.h [deleted file]
device_core/nmdaemon/main_thread.cpp
device_core/nmdaemon/main_thread.h
device_core/nmdaemon/monitor.cpp [deleted file]
device_core/nmdaemon/monitor.h [deleted file]
device_core/nmdaemon/rmi_thread.cpp
device_core/nmdaemon/socket_base.cpp [deleted file]
device_core/nmdaemon/socket_base.h [deleted file]
device_core/nmdaemon/utils.cpp
device_core/nmdaemon/utils.h
device_core/utest/test_IoT.cpp

diff --git a/device_core/nmdaemon/daemon.cpp b/device_core/nmdaemon/daemon.cpp
deleted file mode 100644 (file)
index e3beca2..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-#include <stdlib.h>\r
-#include <stdio.h>\r
-#include <signal.h>\r
-#include <unistd.h>\r
-#include <execinfo.h>\r
-#include <wait.h>\r
-#include <string.h>\r
-#include <errno.h>\r
-\r
-#include "main_def.h"\r
-\r
-#include "daemon.h"\r
-\r
-#include "utils.h"\r
-\r
-using namespace NMD;\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-int daemon::run()\r
-{\r
-    sigset_t sigset;\r
-    int signo;\r
-\r
-    write_log("[DAEMON] started\n");\r
-\r
-    m_sigact.sa_flags = SA_SIGINFO;\r
-    m_sigact.sa_sigaction = daemon::err_signal_handler;\r
-    sigemptyset(&m_sigact.sa_mask);\r
-    sigaction(SIGFPE, &m_sigact, 0);\r
-    sigaction(SIGILL, &m_sigact, 0);\r
-    sigaction(SIGSEGV, &m_sigact, 0);\r
-    sigaction(SIGBUS, &m_sigact, 0);\r
-\r
-    sigemptyset(&sigset);\r
-    sigaddset(&sigset, SIGQUIT);\r
-    sigaddset(&sigset, SIGINT);\r
-    sigaddset(&sigset, SIGTERM);\r
-    sigaddset(&sigset, SIGUSR1);\r
-    sigprocmask(SIG_BLOCK, &sigset, NULL);\r
-\r
-    if(threads_init())\r
-    {\r
-        while(true)\r
-        {\r
-            sigwait(&sigset, &signo);\r
-            write_log("[DAEMON] signal %s\n", strsignal(signo));\r
-            break;\r
-        }\r
-\r
-        threads_done();\r
-    }\r
-    else\r
-    {\r
-        write_log("[DAEMON] can't create threads\n");\r
-    }\r
-\r
-    write_log("[DAEMON] stopped\n");\r
-\r
-    return NMD_NEED_TERMINATE;\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-bool daemon::threads_init()\r
-{\r
-    return m_main_thread.start();\r
-}\r
-void daemon::threads_done()\r
-{\r
-    m_main_thread.stop();\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*static*/ void daemon::err_signal_handler(int _signo, siginfo_t* _signal_info, void* _ptr)\r
-{\r
-#if 0\r
-    void* error_addr;\r
-    void* trace[16];\r
-    int trace_size;\r
-    char** messages;\r
-\r
-    write_log("[DAEMON] signal: %s, addr: 0x%0.16X\n", strsignal(_signo), _signal_info->si_addr);\r
-\r
-#if(__WORDSIZE == 64)\r
-    error_addr = (void*)((ucontext_t*)_ptr)->uc_mcontext.gregs[REG_RIP];\r
-#else\r
-    error_addr = (void*)((ucontext_t*)_ptr)->uc_mcontext.gregs[REG_EIP];\r
-#endif\r
-\r
-    trace_size = backtrace(trace, 16);\r
-    trace[1] = error_addr;\r
-\r
-    messages = backtrace_symbols(trace, trace_size);\r
-\r
-    if(messages)\r
-    {\r
-        write_log("=== backtrace begin ===\n");\r
-\r
-        for(int i = 1; i < trace_size; i++)\r
-            write_log("%s\n", messages[i]);\r
-\r
-        write_log("=== backtrace end ===\n");\r
-\r
-        free(messages);\r
-    }\r
-#endif\r
-\r
-    daemon* pd = reinterpret_cast<daemon*>(_signal_info->si_value.sival_ptr);\r
-    pd->threads_done();\r
-\r
-    write_log("[DAEMON] stopped\n");\r
-\r
-    exit(NMD_NEED_RESTART);\r
-}\r
diff --git a/device_core/nmdaemon/daemon.h b/device_core/nmdaemon/daemon.h
deleted file mode 100644 (file)
index 2ba8f98..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __DAEMON_H__\r
-#define __DAEMON_H__\r
-\r
-#include "main_thread.h"\r
-\r
-namespace NMD\r
-{\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-class daemon final\r
-{\r
-public:\r
-    daemon() = default;\r
-    daemon(const daemon&) = delete;\r
-\r
-    ~daemon() = default;\r
-\r
-    daemon& operator=(const daemon&) = delete;\r
-\r
-    int run();\r
-\r
-private:\r
-    bool threads_init();\r
-    void threads_done();\r
-\r
-    static void err_signal_handler(int _signo, siginfo_t* _signal_info, void* _ptr);\r
-\r
-    struct sigaction m_sigact;\r
-\r
-    main_thread m_main_thread;\r
-};\r
-\r
-}\r
-\r
-#endif /* __DAEMON_H__ */\r
index 2e8f4cc..d9e59ca 100644 (file)
@@ -7,15 +7,14 @@
 #include <sys/file.h>
 #include <sys/prctl.h>
 #include <signal.h>
-#include <string.h>
+#include <string>
 #include <unistd.h>
 #include <execinfo.h>
 #include <wait.h>
 #include <errno.h>
 #include <systemd/sd-journal.h>
 #include <systemd/sd-daemon.h>
-
-#include "main_def.h"
+#include <iostream>
 
 #include "main_thread.h"
 #include "utils.h"
@@ -24,10 +23,13 @@ using namespace NMD;
 
 /*******************************************************/
 /*******************************************************/
-static bool volatile g_running = true;
+static std::string g_device_name = "";
+static std::string g_device_model = "";
 
 static main_thread g_main_thread;
 
+static bool volatile g_running = true;
+
 /*******************************************************/
 /*******************************************************/
 static void kill_handler(int _sig);
@@ -37,11 +39,39 @@ static void threads_done(void);
 
 /*******************************************************/
 /*******************************************************/
-int main(int /*argc*/, char** /*argv*/)
+int main(int argc, char** argv)
 {
     struct sigaction act;
     int ret;
 
+    if(argc < 3)
+    {
+        std::cout << "[NMDAEMON] please specify device name and model" << std::endl;
+        std::cout << "[NMDAEMON] stopped" << std::endl;
+        return 1;
+    }
+
+    g_device_name = std::string({argv[1]});
+    g_device_model = std::string({argv[2]});
+
+    if(argc != 4)
+    {
+        std::string curr_path = current_path();
+
+        std::cout << "[NMDAEMON] storage path not specified. default path is used - " << curr_path.c_str() << std::endl;
+
+        dat_file_path_name = curr_path + "/nmdaemon.dat";
+        cfg_file_path_name = curr_path + "/nmdaemon.cfg";
+        log_file_path_name = curr_path + "/nmdaemon.log";
+    }
+    else
+    {
+        std::string path{argv[3]};
+        dat_file_path_name = path + "/nmdaemon.dat";
+        cfg_file_path_name = path + "/nmdaemon.cfg";
+        log_file_path_name = path + "/nmdaemon.log";
+    }
+
 //    sd_journal_print(LOG_INFO, "[NMDAEMON] started");
     write_log("[NMDAEMON] started\n");
 
@@ -102,6 +132,8 @@ void kill_handler(int _sig)
 /*******************************************************/
 bool threads_init(void)
 {
+    g_main_thread.set_device_name(g_device_name);
+    g_main_thread.set_device_model(g_device_model);
     return g_main_thread.start();
 }
 void threads_done()
diff --git a/device_core/nmdaemon/main_def.h b/device_core/nmdaemon/main_def.h
deleted file mode 100644 (file)
index 41bd3a4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef __MAIN_DEF_H__
-#define __MAIN_DEF_H__
-
-/*******************************************************/
-/*******************************************************/
-#define PID_FILE_NAME                               "/var/run/nmdaemon.pid"
-#define DAT_FILE_NAME                               "/var/run/nmdaemon.dat"
-#define LOG_FILE_NAME                               "/var/log/nmdaemon.log"
-
-/*******************************************************/
-/*******************************************************/
-#define NMD_NEED_RESTART                            1
-#define NMD_NEED_TERMINATE                          2
-
-/*******************************************************/
-/*******************************************************/
-#define MAIN_THREAD_SLEEP_US                        1000
-
-/*******************************************************/
-/*******************************************************/
-#define MAIN_THREAD_SOCKET_HOST                     "localhost"
-#define MAIN_THREAD_SOCKET_PORT                     12345
-#define MAIN_THREAD_SOCKET_TIMEOUT_MS               100
-
-#endif /* __MAIN_DEF_H__ */
index e7693f1..2c907f6 100644 (file)
@@ -2,18 +2,17 @@
 #include <fstream>
 #include <string>
 #include <memory>
-
-#include "main_def.h"
+#include <string.h>
 
 #include "main_thread.h"
 #include "rmi_thread.h"
 
-//#include "socket_base.h"
 #include "utils.h"
 
 #include "easysetup.h"
 #include "ocpayload.h"
 
+#include "IOT_Device.h"
 #include "IOT_Enrollee.h"
 #include "IOT_Resource.h"
 #include "IOT_AirconResource.h"
@@ -28,41 +27,21 @@ using namespace NMD;
 /*******************************************************/
 /*******************************************************/
 static const char* s_device_type = "oic.d.airconditioner";
-static const char* s_device_name = "IoTivity Simple Aircon";
-static const char* s_device_model = "Model ZZZ";
+//static const char* s_device_name = "IoTivity Simple Aircon";
+//static const char* s_device_model = "Model ZZZ";
 
 /*******************************************************/
 /*******************************************************/
-static FILE* server_fopen(const char *path, const char *mode)
+static FILE* server_fopen(const char* _path, const char* _mode)
 {
-    static const char CRED_FILE[] = "/var/run/oic_nmdaemon_db.dat";
-    (void) path;
-    return fopen(CRED_FILE, mode);
+    (void)_path;
+    return fopen(dat_file_path_name.c_str(), _mode);
 }
 
 /*******************************************************/
 /*******************************************************/
-static std::string getDeviceID()
-{
-    OCUUIdentity deviceId;
-    OCStackResult res = OC::OCPlatform::getDeviceId(&deviceId);
-    if (res != OC_STACK_OK)
-        return std::string("");
-
-    char s[128];
-    unsigned char *id = deviceId.id;
-    snprintf(s, sizeof(s), "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-            id[0],                     id[1],                  id[2],                  id[3],
-            id[4],                     id[5],                  id[6],                  id[7],
-            id[8],                     id[9],                  id[10],                 id[11],
-            id[12],                    id[13],                 id[14],                 id[15]);
-
-    return std::string(s);
-}
-
-/*******************************************************/
-/*******************************************************/
-main_thread::main_thread() : thread_base()
+main_thread::main_thread(std::string _device_name, std::string _device_model) :
+    thread_base(), m_device_name(_device_name), m_device_model(_device_model)
 {
 }
 /*virtual*/ main_thread::~main_thread()
@@ -84,8 +63,10 @@ main_thread::main_thread() : thread_base()
         OCStringLL dt;
         OCStringLL dm;
         dt.value = (char*)s_device_type; dt.next = NULL;
-        dm.value = (char*)s_device_model; dm.next = NULL;
-        di.deviceName = (char*)s_device_name;
+//        dm.value = (char*)s_device_model; dm.next = NULL;
+//        di.deviceName = (char*)s_device_name;
+        dm.value = (char*)m_device_model.c_str(); dm.next = NULL;
+        di.deviceName = (char*)m_device_name.c_str();
         di.types = &dt;
         di.specVersion = NULL;
         di.dataModelVersions = &dm;
@@ -98,39 +79,64 @@ main_thread::main_thread() : thread_base()
         if(OCPlatform::registerDeviceInfo(di) != OC_STACK_OK)
             throw std::runtime_error("registerDeviceInfo failed");
 
-        IOT_Enrollee* enr = nullptr;
+        IOT_Enrollee* enrollee = nullptr;
 
-        std::string host, auth_provider, auth_code, uid, access_token;
-        if(!rdat(host, auth_provider, auth_code, uid, access_token))
+        nmdaemon_config config;
+        if(!read_config(config))
         {
-            ESDeviceProperty dp = {{{WIFI_11G, WIFI_11N, WIFI_11AC, WiFi_EOF}, WIFI_5G}, {"IoTivity Simple Aircon", "Model ZZZ"}};
-            enr = IOT_Enrollee::Create(dp, CT_ADAPTER_TCP);
-            wdat(enr->host(), enr->auth_provider(), enr->auth_code(), enr->uid(), enr->access_token());
+//            ESDeviceProperty dp = {{{WIFI_11G, WIFI_11N, WIFI_11AC, WiFi_EOF}, WIFI_5G}, {"IoTivity Simple Aircon", "Model ZZZ"}};
+            ESDeviceProperty dp = {{{WIFI_11G, WIFI_11N, WIFI_11AC, WiFi_EOF}, WIFI_5G}, {"", ""}};
+            if(m_device_name.size() < OIC_STRING_MAX_VALUE)
+                strcpy(dp.DevConf.deviceName, m_device_name.c_str());
+            if(m_device_model.size() < OIC_STRING_MAX_VALUE)
+                strcpy(dp.DevConf.modelNumber, m_device_model.c_str());
+            enrollee = IOT_Enrollee::Create(dp, CT_ADAPTER_TCP);
+            write_config({enrollee->host(), enrollee->auth_provider(), enrollee->auth_code(), enrollee->uid(), enrollee->access_token()});
         }
         else
         {
-            enr = IOT_Enrollee::Create(CT_ADAPTER_TCP, host, auth_provider, auth_code, uid, access_token);
+            enrollee = IOT_Enrollee::Create(CT_ADAPTER_TCP, config.host, config.auth_provider, config.auth_code, config.uid, config.access_token);
         }
 
-        std::string device_id = getDeviceID();
+        std::string device_id = IOT_Device::getDeviceId();
 
         write_log(  "[MAIN_THREADS] enrollee : \n\thost[%s] \n\tauth_provider[%s] \n\tauth_code[%s] \n\tuid[%s] \n\taccess_token[%s] \n\tdevice_id[%s]\n",
-                    enr->host().c_str(),
-                    enr->auth_provider().c_str(),
-                    enr->auth_code().c_str(),
-                    enr->uid().c_str(),
-                    enr->access_token().c_str(),
+                    enrollee->host().c_str(),
+                    enrollee->auth_provider().c_str(),
+                    enrollee->auth_code().c_str(),
+                    enrollee->uid().c_str(),
+                    enrollee->access_token().c_str(),
                     device_id.c_str()   );
 
+
+        std::string uri;
+        std::string rt;
+        std::string ri;
+
+        IOT_AirconResource aircon("/sec/aircon/0", {"x.com.samsung.da.device"}, {DEFAULT_INTERFACE, BATCH_INTERFACE, LINK_INTERFACE});
+        uri = aircon.getUri(); rt = aircon.getTypes()[0]; ri = aircon.getInterfaces()[0];
+        if(aircon.registerResource(uri, rt, ri, OC_DISCOVERABLE) != OC_STACK_OK)
+            throw std::runtime_error("registerResource failed");
+        ri = aircon.getInterfaces()[1]; aircon.bindInterface(ri);
+        ri = aircon.getInterfaces()[2]; aircon.bindInterface(ri);
+
+        IOT_PowerResource power("/power/0", {"oic.r.power"}, {DEFAULT_INTERFACE});
+        uri = power.getUri(); rt = power.getTypes()[0]; ri = power.getInterfaces()[0];
+        if(power.registerResource(uri, rt, ri, OC_OBSERVABLE) != OC_STACK_OK)
+            throw std::runtime_error("registerResource failed");
+
+        aircon.addChildResource(&power);
+
+        ResourceHandles rhandles;
+        if(aircon.publishResource(rhandles, enrollee->host(), CT_ADAPTER_TCP) != OC_STACK_OK)
+            throw std::runtime_error("publishResource failed");
+
+
         std::shared_ptr<OC::OCResource> report_res = nullptr;
         static const std::string report_name[] = {"name 1", "name 2", "name 3"};
         static const std::string report_data[] = {"data 1", "data 2", "data 3"};
 
-        //        std::shared_ptr<OC::OCResource> policy_res = nullptr;
-        //        static const IOT_PolicyGroup policy_group[] = { {"tv-extension", {{"usb", "off", {}}, {"screen-capture", "on", {}}}},
-        //                                                        {"tv-extension", {{"bluetooth", "on", {}}, {"iptables", "off", {"127.0.0.0/24|UDP|10-1024","1.1.1.1|TCP|80,443","8.8.8.8"}}}}  };
-
-        rmi_thread rmithread(enr->host(), device_id);
+        rmi_thread rmithread(enrollee->host(), device_id);
         if(!rmithread.start())
             throw std::runtime_error("publishResource failed");
 
@@ -141,7 +147,7 @@ main_thread::main_thread() : thread_base()
             std::this_thread::sleep_for(std::chrono::milliseconds(10000));
 
             if(!report_res)
-                report_res = IOT_Resource::findResource(enr->host(), {OC_RSRVD_WELL_KNOWN_URI}, static_cast<OCConnectivityType>(CT_DEFAULT), 1, "core.security");
+                report_res = IOT_Resource::findResource(enrollee->host(), {OC_RSRVD_WELL_KNOWN_URI}, static_cast<OCConnectivityType>(CT_DEFAULT), 1, "core.security");
 
             if(report_res)
             {
@@ -150,25 +156,11 @@ main_thread::main_thread() : thread_base()
                 if(IOT_Resource::post(report_res, {"core.security"}, {DEFAULT_INTERFACE}, rpr, QueryParamsMap()) != OC_STACK_OK)
                     report_res = nullptr;
             }
-
-
-//            if(!policy_res)
-//                policy_res = IOT_Resource::findResource(enr->host(), {OC_RSRVD_WELL_KNOWN_URI}, static_cast<OCConnectivityType>(CT_DEFAULT), 1, "core.policy");
-//            if(policy_res)
-//            {
-//                int idx = std::rand() % 2;
-//                OCRepresentation rpr;
-//                rpr.setValue("policy", IOT_Policy::makePolicy({policy_group[idx]}));
-//                QueryParamsMap qry{{"did", device_id}, {"agent", "AGENT_NUMBER_42"}};
-//                if(IOT_Resource::post(policy_res, {"core.policy"}, {DEFAULT_INTERFACE}, rpr, qry) != OC_STACK_OK)
-//                    policy_res = nullptr;
-//            }
-
         }
 
         rmithread.stop();
 
-        delete enr;
+        delete enrollee;
     }
     catch(const std::exception& _e)
     {
@@ -176,29 +168,3 @@ main_thread::main_thread() : thread_base()
     }
     write_log("[MAIN_THREADS] stopped\n");
 }
-
-/*******************************************************/
-/*******************************************************/
-bool main_thread::rdat(std::string& _host, std::string& _auth_provider, std::string& _auth_code, std::string& _uid, std::string& _access_token)
-{
-    std::ifstream in(DAT_FILE_NAME);
-    std::vector<std::string> v;
-    std::string s;
-    while(std::getline(in, s))
-        v.push_back(s);
-    in.close();
-
-    if(v.size() == 5)
-    {
-        _host = v[0]; _auth_provider = v[1]; _auth_code = v[2]; _uid = v[3]; _access_token = v[4];
-        return true;
-    }
-
-    return false;
-}
-void main_thread::wdat(const std::string& _host, const std::string& _auth_provider, const std::string& _auth_code, const std::string& _uid, const std::string& _access_token)
-{
-    std::ofstream out(DAT_FILE_NAME, std::ofstream::out|std::ofstream::trunc);
-    out << _host << std::endl << _auth_provider << std::endl << _auth_code << std::endl << _uid << std::endl << _access_token;
-    out.close();
-}
index f5677ae..8676cdc 100644 (file)
@@ -15,15 +15,24 @@ namespace NMD
 class main_thread : public thread_base\r
 {\r
 public:\r
-    main_thread();\r
+    main_thread(std::string _device_name = "", std::string _device_model = "");\r
+\r
+    void set_device_name(std::string _device_name)\r
+    {\r
+        m_device_name = _device_name;\r
+    }\r
+    void set_device_model(std::string _device_model)\r
+    {\r
+        m_device_model = _device_model;\r
+    }\r
 \r
     virtual ~main_thread();\r
 \r
     virtual void routine();\r
 \r
 private:\r
-    bool rdat(std::string& _host, std::string& _auth_provider, std::string& _auth_code, std::string& _uid, std::string& _access_token);\r
-    void wdat(const std::string& _host, const std::string& _auth_provider, const std::string& _auth_code, const std::string& _uid, const std::string& _access_token);\r
+    std::string m_device_name;\r
+    std::string m_device_model;\r
 };\r
 \r
 }\r
diff --git a/device_core/nmdaemon/monitor.cpp b/device_core/nmdaemon/monitor.cpp
deleted file mode 100644 (file)
index 67cf9e1..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <unistd.h>
-#include <execinfo.h>
-#include <wait.h>
-#include <string.h>
-#include <errno.h>
-
-#include "main_def.h"
-
-#include "monitor.h"
-
-#include "daemon.h"
-#include "utils.h"
-
-using namespace  NMD;
-
-/*******************************************************/
-/*******************************************************/
-/*static*/ int monitor::run()
-{
-    bool start = true;
-    int pid = -1;
-    sigset_t sigset;
-    siginfo_t siginfo;
-    int status = 0;
-
-    write_log("[MONITOR] started\n");
-
-    sigemptyset(&sigset);
-    sigaddset(&sigset, SIGQUIT);
-    sigaddset(&sigset, SIGINT);
-    sigaddset(&sigset, SIGTERM);
-    sigaddset(&sigset, SIGCHLD);
-    sigaddset(&sigset, SIGUSR1);
-    sigprocmask(SIG_BLOCK, &sigset, NULL);
-
-    save_pid();
-
-    while(true)
-    {
-        if(start)
-        {
-            start = false;
-            pid = fork();
-        }
-
-        if(pid == -1)
-        {
-            start = true;
-            write_log("[MONITOR] fork() failed (%s)\n", strerror(errno));
-        }
-        else if(!pid)
-        {
-            daemon d;
-            exit(d.run());
-        }
-        else
-        {
-            sigwaitinfo(&sigset, &siginfo);
-
-            if(siginfo.si_signo == SIGCHLD)
-            {
-                wait(&status);
-                status = WEXITSTATUS(status);
-
-                if(status == NMD_NEED_RESTART)
-                {
-                    start = true;
-                    write_log("[MONITOR] child will be restarted\n");
-                }
-                else if(status == NMD_NEED_TERMINATE)
-                {
-                    write_log("[MONITOR] child stopped\n");
-                    break;
-                }
-            }
-            else if(siginfo.si_signo == SIGUSR1)
-            {
-                write_log("[MONITOR] signal %s\n", strsignal(siginfo.si_signo));
-                kill(pid, SIGUSR1);
-            }
-            else
-            {
-                status = 0;
-                write_log("[MONITOR] signal %s\n", strsignal(siginfo.si_signo));
-                kill(pid, SIGTERM);
-                break;
-            }
-        }
-    }
-
-    unlink(PID_FILE_NAME);
-
-    write_log("[MONITOR] stopped\n");
-
-    return status;
-}
-
-/*******************************************************/
-/*******************************************************/
-/*static*/ void monitor::save_pid()
-{
-    FILE* file = fopen(PID_FILE_NAME, "w+");
-    if(file)
-    {
-        fprintf(file, "%u", getpid());
-        fclose(file);
-    }
-}
diff --git a/device_core/nmdaemon/monitor.h b/device_core/nmdaemon/monitor.h
deleted file mode 100644 (file)
index c17616a..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef __MONITOR_H__
-#define __MONITOR_H__
-
-namespace NMD
-{
-
-/*******************************************************/
-/*******************************************************/
-class monitor final
-{
-public:
-    monitor() = default;
-    monitor(const monitor&) = delete;
-
-    ~monitor() = default;
-
-    monitor& operator=(const monitor&) = delete;
-
-    static int run();
-
-private:
-    static void save_pid();
-};
-
-}
-
-#endif /* __MONITOR_H__ */
index 5e06725..0fab821 100644 (file)
@@ -3,8 +3,6 @@
 #include <string>
 #include <memory>
 
-#include "main_def.h"
-
 #include "rmi_thread.h"
 
 #include "utils.h"
diff --git a/device_core/nmdaemon/socket_base.cpp b/device_core/nmdaemon/socket_base.cpp
deleted file mode 100644 (file)
index 3e7df1f..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-#include <stdlib.h>\r
-#include <unistd.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <netinet/in.h>\r
-#include <netinet/ip.h>\r
-#include <netdb.h>\r
-#include <sys/un.h>\r
-#include <sys/select.h>\r
-#include <fcntl.h>\r
-#include <sys/time.h>\r
-\r
-#include "socket_base.h"\r
-\r
-using namespace NMD;\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-socket_base::socket_base(bool _non_block /*= false*/) : m_socket_fd(0)\r
-{\r
-    m_socket_fd = socket(AF_INET, SOCK_STREAM, 0);\r
-    if(_non_block)\r
-        fcntl(m_socket_fd, F_SETFL, O_NONBLOCK);\r
-}\r
-socket_base::socket_base(const socket_base &_obj) : m_socket_fd(_obj.m_socket_fd)\r
-{\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*virtual*/ socket_base::~socket_base()\r
-{\r
-    close(m_socket_fd);\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*virtual*/ socket_base& socket_base::operator=(const socket_base& _obj)\r
-{\r
-    if(this != &_obj)\r
-    {\r
-        m_socket_fd = _obj.m_socket_fd;\r
-    }\r
-    return *this;\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*virtual*/ bool socket_base::bind(const char* _host, int _port)\r
-{\r
-    struct sockaddr_in info;\r
-    if(!socket_info(&info, _host, _port))\r
-        return false;\r
-    return (::bind(m_socket_fd, (struct sockaddr*)&info, sizeof(info)) < 0) ? false : true;\r
-}\r
-/*virtual*/ bool socket_base::listen()\r
-{\r
-    return (::listen(m_socket_fd, m_connections) < 0) ? false : true;\r
-}\r
-/*virtual*/ int socket_base::accept(int _wait_timeout_ms)\r
-{\r
-    fd_set rset;\r
-    struct timeval timeout;\r
-    int res = -1;\r
-\r
-    FD_ZERO(&rset);\r
-    FD_SET(m_socket_fd, &rset);\r
-\r
-    timeout.tv_sec = 0;\r
-    timeout.tv_usec = _wait_timeout_ms * 1000 + 1;\r
-\r
-    if(::select(m_socket_fd + 1, &rset, NULL, NULL, &timeout) > 0)\r
-    {\r
-        if( FD_ISSET(m_socket_fd, &rset) )\r
-        {\r
-            struct sockaddr_in info;\r
-            socklen_t ilen = sizeof(info);\r
-            res = ::accept(m_socket_fd, (struct sockaddr*)&info, &ilen);\r
-        }\r
-    }\r
-\r
-    return res;\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*virtual*/ bool socket_base::connect(const char* _host, int _port)\r
-{\r
-    struct sockaddr_in info;\r
-    if(!socket_info(&info, _host, _port))\r
-        return false;\r
-    return (::connect(m_socket_fd, (struct sockaddr*)&info, sizeof(info)) < 0) ? false : true;\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*virtual*/ bool socket_base::write(const void* _data, int _size)\r
-{\r
-    return write(m_socket_fd, _data, _size);\r
-}\r
-/*virtual*/ int socket_base::read(void* _buff, int _size)\r
-{\r
-    return read(m_socket_fd, _buff, _size);\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*static*/ bool socket_base::write(int _socket, const void* _data, int _size)\r
-{\r
-    return (::write(_socket, _data, _size) == _size);\r
-}\r
-/*static*/ int socket_base::read(int _socket, void* _buff, int _size)\r
-{\r
-    return (int)::read(_socket, _buff, _size);\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*static*/ void socket_base::close(int _socket)\r
-{\r
-    ::close(_socket);\r
-}\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-/*static*/ bool socket_base::socket_info(struct sockaddr_in* _info, const char* _host, int _port)\r
-{\r
-    struct in_addr addr;\r
-    int port;\r
-\r
-    {\r
-        struct hostent* lhi = (struct hostent*)gethostbyname(_host);\r
-        if( (lhi == NULL) || (lhi->h_length == 0) )\r
-            return false;\r
-\r
-        addr.s_addr = *( (int*)(lhi->h_addr_list[0]) );\r
-    }\r
-\r
-    port = (int)htons(_port);\r
-\r
-    memset(_info, 0, sizeof(struct sockaddr_in));\r
-    _info->sin_family = AF_INET;\r
-    _info->sin_addr = addr;\r
-    _info->sin_port = port;\r
-\r
-    return true;\r
-}\r
diff --git a/device_core/nmdaemon/socket_base.h b/device_core/nmdaemon/socket_base.h
deleted file mode 100644 (file)
index a3cd5a6..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef __SOCKET_BASE_H__\r
-#define __SOCKET_BASE_H__\r
-\r
-namespace NMD\r
-{\r
-\r
-/*******************************************************/\r
-/*******************************************************/\r
-class socket_base\r
-{\r
-public:\r
-    socket_base(bool _non_block = false);\r
-    socket_base(const socket_base& _obj);\r
-\r
-    virtual ~socket_base();\r
-\r
-    virtual socket_base& operator=(const socket_base& _obj);\r
-\r
-    virtual bool bind(const char* _host, int _port);\r
-    virtual bool listen();\r
-    virtual int accept(int _wait_timeout_ms);\r
-\r
-    virtual bool connect(const char* _host, int _port);\r
-\r
-    virtual bool write(const void* _data, int _size);\r
-    virtual int read(void* _buff, int _size);\r
-\r
-    static bool write(int _socket, const void* _data, int _size);\r
-    static int read(int _socket, void* _buff, int _size);\r
-\r
-    static void close(int _socket);\r
-\r
-    static bool socket_info(struct sockaddr_in* _info, const char* _host, int _port);\r
-\r
-protected:\r
-    int m_socket_fd;\r
-\r
-private:\r
-    static const int m_connections = 5;\r
-};\r
-\r
-}\r
-\r
-#endif /* __SOCKET_BASE_H__ */\r
index e41931a..e815f51 100644 (file)
@@ -1,8 +1,12 @@
 #include <stdlib.h>\r
 #include <stdarg.h>\r
 #include <stdio.h>\r
-\r
-#include "main_def.h"\r
+#include <limits.h>\r
+#include <string>\r
+#include <unistd.h>\r
+#include <iostream>\r
+#include <fstream>\r
+#include <vector>\r
 \r
 #include "utils.h"\r
 \r
@@ -11,10 +15,55 @@ namespace NMD
 \r
 /*******************************************************/\r
 /*******************************************************/\r
+std::string dat_file_path_name = "";\r
+std::string cfg_file_path_name = "";\r
+std::string log_file_path_name = "";\r
+\r
+/*******************************************************/\r
+/*******************************************************/\r
 static bool wl(const char* _msg, va_list _vl);\r
 \r
 /*******************************************************/\r
 /*******************************************************/\r
+std::string current_path(void)\r
+{\r
+    char buff[PATH_MAX];\r
+    ssize_t cnt = readlink("/proc/self/exe", buff, PATH_MAX);\r
+    if(cnt == 0)\r
+        return std::string();\r
+\r
+    std::string path{buff};\r
+    std::string::size_type pos = path.find_last_of("\\/");\r
+    return path.substr(0, pos);\r
+}\r
+\r
+/*******************************************************/\r
+/*******************************************************/\r
+bool read_config(nmdaemon_config& _config)\r
+{\r
+    std::ifstream in(cfg_file_path_name.c_str());\r
+    std::vector<std::string> v;\r
+    std::string s;\r
+    while(std::getline(in, s))\r
+        v.push_back(s);\r
+    in.close();\r
+\r
+    if(v.size() != 5)\r
+        return false;\r
+\r
+    _config.host = v[0]; _config.auth_provider = v[1]; _config.auth_code = v[2]; _config.uid = v[3]; _config.access_token = v[4];\r
+\r
+    return true;\r
+}\r
+void write_config(const nmdaemon_config& _config)\r
+{\r
+    std::ofstream out(cfg_file_path_name.c_str(), std::ofstream::out|std::ofstream::trunc);\r
+    out << _config.host << std::endl << _config.auth_provider << std::endl << _config.auth_code << std::endl << _config.uid << std::endl << _config.access_token;\r
+    out.close();\r
+}\r
+\r
+/*******************************************************/\r
+/*******************************************************/\r
 bool write_log(const char* _msg, ...)\r
 {\r
     bool res = false;\r
@@ -33,7 +82,7 @@ static bool wl(const char* _msg, va_list _vl)
 {\r
     bool res = false;\r
 \r
-    FILE* file = fopen(LOG_FILE_NAME, "a+");\r
+    FILE* file = fopen(log_file_path_name.c_str(), "a+");\r
     if(file)\r
     {\r
         res = (bool)vfprintf(file, _msg, _vl);\r
index 4db8000..628f6c6 100644 (file)
@@ -1,13 +1,33 @@
 #ifndef __UTILS_H__\r
 #define __UTILS_H__\r
 \r
+#include <string>\r
+\r
 namespace NMD\r
 {\r
+/*******************************************************/\r
+/*******************************************************/\r
+extern std::string dat_file_path_name;\r
+extern std::string cfg_file_path_name;\r
+extern std::string log_file_path_name;\r
 \r
 /*******************************************************/\r
 /*******************************************************/\r
-bool write_log(const char* _msg, ...);\r
+std::string current_path(void);\r
 \r
+typedef struct\r
+{\r
+    std::string host;\r
+    std::string auth_provider;\r
+    std::string auth_code;\r
+    std::string uid;\r
+    std::string access_token;\r
+} nmdaemon_config;\r
+\r
+bool read_config(nmdaemon_config& _config);\r
+void write_config(const nmdaemon_config& _config);\r
+\r
+bool write_log(const char* _msg, ...);\r
 }\r
 \r
 #endif /* __UTILS_H__ */\r
index 875771a..645855c 100644 (file)
@@ -165,7 +165,7 @@ TEST(test_IoT, test_IOT_PolicySender)
                 throw runtime_error("Failed to find policy resource");
 
             string device_id = IOT_Device::getDeviceId();
-            string agent_id = "AGENT_NUMBER_42";
+            string agent_id = /*"AGENT_NUMBER_42"*/"3574462a-7efa-9449-4d9f-488734c79c0a";
             IOT_PolicyItem item1("usb", "off", {});
             IOT_PolicyItem item2("screen-capture", "on", {});
             IOT_PolicyGroup group("tv-extension", {item1, item2});
@@ -191,7 +191,7 @@ TEST(test_IoT, test_IOT_PolicySender)
             if(IOT_Resource::post(policy_res, {"core.policy"}, {DEFAULT_INTERFACE}, rep, QueryParamsMap({{"did", device_id}, {"agent", agent_id}})) != OC_STACK_OK)
                     throw runtime_error("Failed to post policy");
 
-            cvar.wait_for(lck, chrono::seconds(1));
+            cvar.wait_for(lck, chrono::seconds(3));
         }   );
     ASSERT_TRUE(res);
 }