summaryrefslogtreecommitdiff
path: root/node/NetworkConfigMaster.hpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-01-06 13:45:10 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-01-06 13:45:10 -0800
commita369c690910d014ca79b55d07603af45343b37f5 (patch)
tree038ccec3a6287f94f7e1344934167184af6c0aae /node/NetworkConfigMaster.hpp
parentf043321281e24e0d27edfc62421e6fcb1101fb3b (diff)
downloadinfinitytier-a369c690910d014ca79b55d07603af45343b37f5.tar.gz
infinitytier-a369c690910d014ca79b55d07603af45343b37f5.zip
C++ netconf master Redis plumbing.
Diffstat (limited to 'node/NetworkConfigMaster.hpp')
-rw-r--r--node/NetworkConfigMaster.hpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/node/NetworkConfigMaster.hpp b/node/NetworkConfigMaster.hpp
new file mode 100644
index 00000000..636b197e
--- /dev/null
+++ b/node/NetworkConfigMaster.hpp
@@ -0,0 +1,121 @@
+/*
+ * ZeroTier One - Global Peer to Peer Ethernet
+ * Copyright (C) 2011-2015 ZeroTier Networks
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * --
+ *
+ * ZeroTier may be used and distributed under the terms of the GPLv3, which
+ * are available at: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * If you would like to embed ZeroTier into a commercial application or
+ * redistribute it in a modified binary form, please contact ZeroTier Networks
+ * LLC. Start here: http://www.zerotier.com/
+ */
+
+#ifndef ZT_NETWORKCONFIGMASTER_HPP
+#define ZT_NETWORKCONFIGMASTER_HPP
+
+#include "Constants.hpp"
+
+#define ZT_ENABLE_NETCONF_MASTER
+
+#ifdef ZT_ENABLE_NETCONF_MASTER
+
+#include <stdint.h>
+#include <string>
+#include <map>
+
+#include "Address.hpp"
+#include "Dictionary.hpp"
+#include "Mutex.hpp"
+
+#include <hiredis/hiredis.h>
+
+namespace ZeroTier {
+
+class RuntimeEnvironment;
+
+/**
+ * Network configuration master -- responds to NETCONF requests
+ *
+ * This requires the 'hiredis' C library to build.
+ */
+class NetworkConfigMaster
+{
+public:
+ /**
+ * Create netconf master
+ *
+ * This doesn't connect to Redis until the first request is received.
+ *
+ * @param renv Runtime environment
+ * @param redisHost Hostname or IP of Redis server
+ * @param redisPort Redis IP port number
+ * @param redisPassword Redis AUTH password or NULL if none
+ * @param redisDatabaseNumber Redis database number (usually 0)
+ */
+ NetworkConfigMaster(
+ const RuntimeEnvironment *renv,
+ const char *redisHost,
+ unsigned int redisPort,
+ const char *redisPassword,
+ unsigned int redisDatabaseNumber);
+
+ ~NetworkConfigMaster();
+
+ /**
+ * Handle a network config request, sending replies if necessary
+ *
+ * This is a blocking call, so rate is limited by Redis. It will fail
+ * and log its failure if the Redis server is not available or times out.
+ *
+ * @param packetId 64-bit packet ID
+ * @param from Originating peer ZeroTier address
+ * @param nwid 64-bit network ID
+ * @param metaData Meta-data bundled with request (empty if none)
+ * @param haveTimestamp Timestamp requesting peer has or 0 if none or not included
+ */
+ void doNetworkConfigRequest(
+ uint64_t packetId,
+ const Address &from,
+ uint64_t nwid,
+ const Dictionary &metaData,
+ uint64_t haveTimestamp);
+
+private:
+ // These assume _lock is locked
+ bool _reconnect();
+ bool _hgetall(const char *key,std::map<std::string,std::string> &hdata);
+ bool _hmset(const char *key,const std::map<std::string,std::string> &hdata);
+ bool _hget(const char *key,const char *hashKey,std::string &value);
+ bool _hset(const char *key,const char *hashKey,const char *value);
+
+ Mutex _lock;
+
+ std::string _redisHost;
+ std::string _redisPassword;
+ unsigned int _redisPort;
+ unsigned int _redisDatabaseNumber;
+
+ const RuntimeEnvironment *RR;
+ redisContext *_rc;
+};
+
+} // namespace ZeroTier
+
+#endif // ZT_ENABLE_NETCONF_MASTER
+
+#endif