From 649a12472bdcdf1c8e2ed73380362948f042d9ba Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 21 Jul 2015 10:39:29 -0700 Subject: Report controllerInstanceId in all objects so that controller resets can be easily detected by whatever is using the service. --- controller/SqliteNetworkController.cpp | 33 ++++++++++++++++++--------------- controller/SqliteNetworkController.hpp | 1 + 2 files changed, 19 insertions(+), 15 deletions(-) (limited to 'controller') diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp index 19e3d920..0986f7b5 100644 --- a/controller/SqliteNetworkController.cpp +++ b/controller/SqliteNetworkController.cpp @@ -205,7 +205,7 @@ SqliteNetworkController::SqliteNetworkController(const char *dbPath) : /* Config */ ||(sqlite3_prepare_v2(_db,"SELECT \"v\" FROM \"Config\" WHERE \"k\" = ?",-1,&_sGetConfig,(const char **)0) != SQLITE_OK) - ||(sqlite3_prepare_v2(_db,"INSERT INTO \"Config\" (\"k\",\"v\") VALUES (?,?)",-1,&_sSetConfig,(const char **)0) != SQLITE_OK) + ||(sqlite3_prepare_v2(_db,"INSERT OR REPLACE INTO \"Config\" (\"k\",\"v\") VALUES (?,?)",-1,&_sSetConfig,(const char **)0) != SQLITE_OK) ) { //printf("!!! %s\n",sqlite3_errmsg(_db)); @@ -221,16 +221,19 @@ SqliteNetworkController::SqliteNetworkController(const char *dbPath) : if (sqlite3_step(_sGetConfig) != SQLITE_ROW) { unsigned char sr[32]; Utils::getSecureRandom(sr,32); - char instanceId[32]; for(unsigned int i=0;i<32;++i) - instanceId[i] = "0123456789abcdef"[(unsigned int)sr[i] & 0xf]; + _instanceId.push_back("0123456789abcdef"[(unsigned int)sr[i] & 0xf]); + sqlite3_reset(_sSetConfig); sqlite3_bind_text(_sSetConfig,1,"instanceId",10,SQLITE_STATIC); - sqlite3_bind_text(_sSetConfig,2,instanceId,32,SQLITE_STATIC); - if (sqlite3_step(_sSetConfig) != SQLITE_DONE) { - sqlite3_close(_db); + sqlite3_bind_text(_sSetConfig,2,_instanceId.c_str(),-1,SQLITE_STATIC); + if (sqlite3_step(_sSetConfig) != SQLITE_DONE) throw std::runtime_error("SqliteNetworkController unable to read or initialize instanceId"); - } + } else { + const char *iid = reinterpret_cast(sqlite3_column_text(_sGetConfig,0)); + if (!iid) + throw std::runtime_error("SqliteNetworkController unable to read instanceId (it's NULL)"); + _instanceId = iid; } } @@ -1286,6 +1289,7 @@ unsigned int SqliteNetworkController::_doCPGet( "{\n" "\t\"nwid\": \"%s\",\n" "\t\"address\": \"%s\",\n" + "\t\"controllerInstanceId\": \"%s\",\n" "\t\"authorized\": %s,\n" "\t\"activeBridge\": %s,\n" "\t\"memberRevision\": %llu,\n" @@ -1293,6 +1297,7 @@ unsigned int SqliteNetworkController::_doCPGet( "\t\"ipAssignments\": [", nwids, addrs, + _instanceId.c_str(), (sqlite3_column_int(_sGetMember2,0) > 0) ? "true" : "false", (sqlite3_column_int(_sGetMember2,1) > 0) ? "true" : "false", (unsigned long long)sqlite3_column_int64(_sGetMember2,2), @@ -1384,6 +1389,7 @@ unsigned int SqliteNetworkController::_doCPGet( Utils::snprintf(json,sizeof(json), "{\n" "\t\"nwid\": \"%s\",\n" + "\t\"controllerInstanceId\": \"%s\",\n" "\t\"name\": \"%s\",\n" "\t\"private\": %s,\n" "\t\"enableBroadcast\": %s,\n" @@ -1396,6 +1402,7 @@ unsigned int SqliteNetworkController::_doCPGet( "\t\"memberRevisionCounter\": %llu,\n" "\t\"members\": [", nwids, + _instanceId.c_str(), _jsonEscape((const char *)sqlite3_column_text(_sGetNetworkById,0)).c_str(), (sqlite3_column_int(_sGetNetworkById,1) > 0) ? "true" : "false", (sqlite3_column_int(_sGetNetworkById,2) > 0) ? "true" : "false", @@ -1657,14 +1664,10 @@ unsigned int SqliteNetworkController::_doCPGet( } else { // GET /controller returns status and API version if controller is supported - sqlite3_reset(_sGetConfig); - sqlite3_bind_text(_sGetConfig,1,"instanceId",10,SQLITE_STATIC); - if (sqlite3_step(_sGetConfig) == SQLITE_ROW) { - Utils::snprintf(json,sizeof(json),"{\n\t\"controller\": true,\n\t\"apiVersion\": %d,\n\t\"clock\": %llu,\n\t\"instanceId\": \"%s\"\n}\n",ZT_NETCONF_CONTROLLER_API_VERSION,(unsigned long long)OSUtils::now(),(const char *)sqlite3_column_text(_sGetConfig,0)); - responseBody = json; - responseContentType = "applicaiton/json"; - return 200; - } else return 500; + Utils::snprintf(json,sizeof(json),"{\n\t\"controller\": true,\n\t\"apiVersion\": %d,\n\t\"clock\": %llu,\n\t\"instanceId\": \"%s\"\n}\n",ZT_NETCONF_CONTROLLER_API_VERSION,(unsigned long long)OSUtils::now(),_instanceId.c_str()); + responseBody = json; + responseContentType = "applicaiton/json"; + return 200; } return 404; diff --git a/controller/SqliteNetworkController.hpp b/controller/SqliteNetworkController.hpp index 95905bd1..8b39f7d9 100644 --- a/controller/SqliteNetworkController.hpp +++ b/controller/SqliteNetworkController.hpp @@ -96,6 +96,7 @@ private: std::string &responseContentType); std::string _dbPath; + std::string _instanceId; sqlite3 *_db; sqlite3_stmt *_sGetNetworkById; -- cgit v1.2.3