Browse Source

begin pgsql backend

develop
Robin Thoni 8 years ago
parent
commit
f8d68b9128

+ 2
- 0
conf/pdns-slave.json.default View File

4
 
4
 
5
   "hosts-file":       "/etc/pdns-slave/hosts.json",
5
   "hosts-file":       "/etc/pdns-slave/hosts.json",
6
 
6
 
7
+  "db-type":          "pgsql",
8
+
7
   "master-host":      "ns.example.com",
9
   "master-host":      "ns.example.com",
8
   "master-user":      "master-user",
10
   "master-user":      "master-user",
9
   "master-password":  "master-password",
11
   "master-password":  "master-password",

+ 17
- 4
src/Business/PdnsSlave.cpp View File

4
 
4
 
5
 #include <fstream>
5
 #include <fstream>
6
 #include <DataAccess/MySql.h>
6
 #include <DataAccess/MySql.h>
7
+#include <DataAccess/PgSql.h>
7
 #include "DataAccess/PdnsSlaveConfig.h"
8
 #include "DataAccess/PdnsSlaveConfig.h"
8
 #include "DataAccess/HostsConfig.h"
9
 #include "DataAccess/HostsConfig.h"
9
 #include "PdnsSlave.h"
10
 #include "PdnsSlave.h"
31
     _dhcpdFilePath = conf.getDhcpdFilePath();
32
     _dhcpdFilePath = conf.getDhcpdFilePath();
32
     _dhcpdTemplatePath = conf.getDhcpdTemplatePath();
33
     _dhcpdTemplatePath = conf.getDhcpdTemplatePath();
33
     _hostsPath = conf.getHostsPath();
34
     _hostsPath = conf.getHostsPath();
35
+    _dbType = conf.getDbType();
34
     _masterConfig = conf.getMasterConfig();
36
     _masterConfig = conf.getMasterConfig();
35
     _slaveConfig = conf.getSlaveConfig();
37
     _slaveConfig = conf.getSlaveConfig();
36
 
38
 
64
 
66
 
65
 BResult PdnsSlave::overridePdns()
67
 BResult PdnsSlave::overridePdns()
66
 {
68
 {
67
-    MySql mysql(_masterConfig, _slaveConfig);
68
-    auto res = mysql.dump();
69
+    AbstractSql* sqlDb = 0;
70
+    if (_dbType == "mysql") {
71
+        sqlDb = new MySql(_masterConfig, _slaveConfig);
72
+    }
73
+    else if (_dbType == "pgsql") {
74
+        sqlDb = new PgSql(_masterConfig, _slaveConfig);
75
+    }
76
+    else {
77
+        return BResult().error("Invalid database type " + _dbType);
78
+    }
79
+    auto res = sqlDb->dump();
69
     if (!res)
80
     if (!res)
70
         return res;
81
         return res;
71
-    if (!(res = mysql.insert()))
82
+    if (!(res = sqlDb->insert()))
72
         return res;
83
         return res;
73
     std::string sql;
84
     std::string sql;
74
     for (auto a : _actions)
85
     for (auto a : _actions)
75
         sql += a->getSqlQuery();
86
         sql += a->getSqlQuery();
76
-    return mysql.override(sql);
87
+    res = sqlDb->override(sql);
88
+    delete sqlDb;
89
+    return res;
77
 }
90
 }
78
 
91
 
79
 BResult PdnsSlave::overrideDhcp()
92
 BResult PdnsSlave::overrideDhcp()

+ 2
- 0
src/Business/PdnsSlave.h View File

34
 
34
 
35
     std::string _hostsPath;
35
     std::string _hostsPath;
36
 
36
 
37
+    std::string _dbType;
38
+
37
     SqlConfiguration _masterConfig;
39
     SqlConfiguration _masterConfig;
38
 
40
 
39
     SqlConfiguration _slaveConfig;
41
     SqlConfiguration _slaveConfig;

+ 1
- 1
src/CMakeLists.txt View File

30
   DBO/Actions/ActionDelDomain.h
30
   DBO/Actions/ActionDelDomain.h
31
   DBO/Actions/ActionAddDomain.cpp
31
   DBO/Actions/ActionAddDomain.cpp
32
   DBO/Actions/ActionAddDomain.h
32
   DBO/Actions/ActionAddDomain.h
33
-        DataAccess/AbstractSql.cpp DataAccess/AbstractSql.h)
33
+        DataAccess/AbstractSql.cpp DataAccess/AbstractSql.h DataAccess/PgSql.cpp DataAccess/PgSql.h)
34
 set(LIBS ${LIBS} jsoncpp)
34
 set(LIBS ${LIBS} jsoncpp)
35
 add_executable(pdns-slave ${SOURCE_FILES})
35
 add_executable(pdns-slave ${SOURCE_FILES})
36
 target_link_libraries(pdns-slave ${LIBS})
36
 target_link_libraries(pdns-slave ${LIBS})

+ 1
- 1
src/DBO/Actions/ActionAddDomain.cpp View File

78
     _ttl = ttl;
78
     _ttl = ttl;
79
 }
79
 }
80
 
80
 
81
-const std::string ActionAddDomain::getSql() const //ns.rthoni.com rthoni.hotmail.fr 2015080600 28800 7200 604800 86400
81
+const std::string ActionAddDomain::getSql() const
82
 {
82
 {
83
     auto soa = _soaNs + " " + _soaMail + " " + std::to_string(time(nullptr)) + " " + std::to_string(_soaRefresh)
83
     auto soa = _soaNs + " " + _soaMail + " " + std::to_string(time(nullptr)) + " " + std::to_string(_soaRefresh)
84
              + " " + std::to_string(_soaRetry)+ " " + std::to_string(_soaExpire) + " " + std::to_string(_soaTtl);
84
              + " " + std::to_string(_soaRetry)+ " " + std::to_string(_soaExpire) + " " + std::to_string(_soaTtl);

+ 15
- 0
src/DataAccess/AbstractSql.cpp View File

1
+//
2
+// Created by robin on 4/6/16.
3
+//
4
+
5
+#include "AbstractSql.h"
6
+
7
+AbstractSql::~AbstractSql()
8
+{
9
+}
10
+
11
+AbstractSql::AbstractSql(const SqlConfiguration &masterConfig, const SqlConfiguration &slaveConfig)
12
+        : _masterConfig(masterConfig)
13
+        , _slaveConfig(slaveConfig)
14
+{
15
+}

+ 31
- 0
src/DataAccess/AbstractSql.h View File

1
+//
2
+// Created by robin on 4/6/16.
3
+//
4
+
5
+#ifndef PDNS_SLAVE_ABSTRACTSQL_H
6
+#define PDNS_SLAVE_ABSTRACTSQL_H
7
+
8
+#include <DBO/Result.h>
9
+#include <DBO/SqlConfiguration.h>
10
+#include "DBO/Result.h"
11
+
12
+class AbstractSql
13
+{
14
+public:
15
+    AbstractSql(const SqlConfiguration& masterConfig, const SqlConfiguration& slaveConfig);
16
+    virtual ~AbstractSql();
17
+
18
+    virtual BResult dump() = 0;
19
+
20
+    virtual BResult insert() = 0;
21
+
22
+    virtual BResult override(const std::string& sql) = 0;
23
+
24
+protected:
25
+    SqlConfiguration _masterConfig;
26
+
27
+    SqlConfiguration _slaveConfig;
28
+};
29
+
30
+
31
+#endif //PDNS_SLAVE_ABSTRACTSQL_H

+ 11
- 17
src/DataAccess/MySql.cpp View File

11
 #define tmpTemplate "/tmp/pdns-slave.XXXXXX"
11
 #define tmpTemplate "/tmp/pdns-slave.XXXXXX"
12
 
12
 
13
 MySql::MySql(const SqlConfiguration &masterConfig, const SqlConfiguration &slaveConfig)
13
 MySql::MySql(const SqlConfiguration &masterConfig, const SqlConfiguration &slaveConfig)
14
-    : _masterConfig(masterConfig)
15
-    , _slaveConfig(slaveConfig)
14
+    : AbstractSql(masterConfig, slaveConfig)
16
 {
15
 {
17
 }
16
 }
18
 
17
 
19
 MySql::~MySql()
18
 MySql::~MySql()
20
 {
19
 {
21
-    clean();
20
+    if (!_dumpFilePath.empty())
21
+    {
22
+        unlink(_dumpFilePath.c_str());
23
+        _dumpFilePath = "";
24
+    }
25
+    if (!_overrideFilePath.empty())
26
+    {
27
+        unlink(_overrideFilePath.c_str());
28
+        _overrideFilePath = "";
29
+    }
22
 }
30
 }
23
 
31
 
24
 BResult MySql::dump()
32
 BResult MySql::dump()
43
     return std::string(tmp);
51
     return std::string(tmp);
44
 }
52
 }
45
 
53
 
46
-void MySql::clean()
47
-{
48
-    if (!_dumpFilePath.empty())
49
-    {
50
-        unlink(_dumpFilePath.c_str());
51
-        _dumpFilePath = "";
52
-    }
53
-    if (!_overrideFilePath.empty())
54
-    {
55
-        unlink(_overrideFilePath.c_str());
56
-        _overrideFilePath = "";
57
-    }
58
-}
59
-
60
 BResult MySql::insert()
54
 BResult MySql::insert()
61
 {
55
 {
62
     return insertSlave(_dumpFilePath);
56
     return insertSlave(_dumpFilePath);

+ 3
- 11
src/DataAccess/MySql.h View File

5
 #ifndef PDNS_SLAVE_MYSQL_H
5
 #ifndef PDNS_SLAVE_MYSQL_H
6
 #define PDNS_SLAVE_MYSQL_H
6
 #define PDNS_SLAVE_MYSQL_H
7
 
7
 
8
-#include <DBO/Result.h>
9
-#include <DBO/SqlConfiguration.h>
10
-# include "DBO/Result.h"
8
+#include "AbstractSql.h"
11
 
9
 
12
-class MySql
10
+class MySql : public AbstractSql
13
 {
11
 {
14
 public:
12
 public:
15
     MySql(const SqlConfiguration& masterConfig, const SqlConfiguration& slaveConfig);
13
     MySql(const SqlConfiguration& masterConfig, const SqlConfiguration& slaveConfig);
16
-    virtual ~MySql();
14
+    ~MySql();
17
 
15
 
18
     BResult dump();
16
     BResult dump();
19
 
17
 
21
 
19
 
22
     BResult override(const std::string& sql);
20
     BResult override(const std::string& sql);
23
 
21
 
24
-    void clean();
25
-
26
 private:
22
 private:
27
     const std::string getTempFile();
23
     const std::string getTempFile();
28
 
24
 
29
     BResult insertSlave(const std::string& file);
25
     BResult insertSlave(const std::string& file);
30
 
26
 
31
-    SqlConfiguration _masterConfig;
32
-
33
-    SqlConfiguration _slaveConfig;
34
-
35
     std::string _dumpFilePath;
27
     std::string _dumpFilePath;
36
 
28
 
37
     std::string _overrideFilePath;
29
     std::string _overrideFilePath;

+ 12
- 1
src/DataAccess/PdnsSlaveConfig.cpp View File

35
         return res;
35
         return res;
36
     if (!(res = readString(root, "hosts-file", _hostsPath)))
36
     if (!(res = readString(root, "hosts-file", _hostsPath)))
37
         return res;
37
         return res;
38
+    if (!(res = readString(root, "db-type", _dbType)))
39
+        return res;
40
+    if (_dbType != "mysql" && _dbType != "pgsql")
41
+    {
42
+        return BResult().error("Invalid database type " + _dbType);
43
+    }
38
     if (!(res = readSqlConfiguration(root, "master", _masterConfig)))
44
     if (!(res = readSqlConfiguration(root, "master", _masterConfig)))
39
         return res;
45
         return res;
40
     if (!(res = readSqlConfiguration(root, "slave", _slaveConfig)))
46
     if (!(res = readSqlConfiguration(root, "slave", _slaveConfig)))
97
 const SqlConfiguration &PdnsSlaveConfig::getSlaveConfig() const
103
 const SqlConfiguration &PdnsSlaveConfig::getSlaveConfig() const
98
 {
104
 {
99
     return _slaveConfig;
105
     return _slaveConfig;
100
-}
106
+}
107
+
108
+const std::string &PdnsSlaveConfig::getDbType() const
109
+{
110
+    return _dbType;
111
+}

+ 4
- 0
src/DataAccess/PdnsSlaveConfig.h View File

27
 
27
 
28
     const std::string &getHostsPath() const;
28
     const std::string &getHostsPath() const;
29
 
29
 
30
+    const std::string &getDbType() const;
31
+
30
     const SqlConfiguration &getMasterConfig() const;
32
     const SqlConfiguration &getMasterConfig() const;
31
 
33
 
32
     const SqlConfiguration &getSlaveConfig() const;
34
     const SqlConfiguration &getSlaveConfig() const;
45
 
47
 
46
     std::string _hostsPath;
48
     std::string _hostsPath;
47
 
49
 
50
+    std::string _dbType;
51
+
48
     SqlConfiguration _masterConfig;
52
     SqlConfiguration _masterConfig;
49
 
53
 
50
     SqlConfiguration _slaveConfig;
54
     SqlConfiguration _slaveConfig;

+ 83
- 0
src/DataAccess/PgSql.cpp View File

1
+//
2
+// Created by robin on 4/6/16.
3
+//
4
+
5
+#include <fstream>
6
+#include <string.h>
7
+#include <unistd.h>
8
+#include "PgSql.h"
9
+
10
+#define tmpTemplate "/tmp/pdns-slave.XXXXXX"
11
+
12
+PgSql::PgSql(const SqlConfiguration &masterConfig, const SqlConfiguration &slaveConfig)
13
+        : AbstractSql(masterConfig, slaveConfig)
14
+{
15
+}
16
+
17
+PgSql::~PgSql()
18
+{
19
+    if (!_dumpFilePath.empty())
20
+    {
21
+        unlink(_dumpFilePath.c_str());
22
+        _dumpFilePath = "";
23
+    }
24
+    if (!_overrideFilePath.empty())
25
+    {
26
+        unlink(_overrideFilePath.c_str());
27
+        _overrideFilePath = "";
28
+    }
29
+}
30
+
31
+BResult PgSql::dump()
32
+{
33
+    BResult res;
34
+    _dumpFilePath = getTempFile();
35
+    auto command = std::string("PGPASSWORD='" + _masterConfig.getPassword() + "' "
36
+                               + "pg_dump -h '" + _masterConfig.getHost() + "' "
37
+                               + "-U '" + _masterConfig.getUser() + "' "
38
+                               + "-w -c -x -O '" + _masterConfig.getDatabase() + "' "
39
+                               + "> '" + _dumpFilePath + "'");
40
+    std::cout << command << std::endl;
41
+    int status = system(command.c_str());
42
+    if (status == 0)
43
+        return res.ok(true);
44
+    return res.error("pg_dump exited with code " + std::to_string(status));
45
+}
46
+
47
+const std::string PgSql::getTempFile()
48
+{
49
+    char tmp[sizeof(tmpTemplate)];
50
+    strcpy(tmp, tmpTemplate);
51
+    mkstemp(tmp);
52
+    return std::string(tmp);
53
+}
54
+
55
+BResult PgSql::insert()
56
+{
57
+    return insertSlave(_dumpFilePath);
58
+}
59
+
60
+BResult PgSql::override(const std::string &sql)
61
+{
62
+    _overrideFilePath = getTempFile();
63
+    std::ofstream file(_overrideFilePath);
64
+    if (!file)
65
+        return BResult().error("Could not open temp file " + _overrideFilePath);
66
+    file << sql;
67
+    file.close();
68
+    return insertSlave(_overrideFilePath);
69
+}
70
+
71
+BResult PgSql::insertSlave(const std::string &file)
72
+{
73
+    BResult res;
74
+    auto command = std::string("cat '" + file + "' | PGPASSWORD='" + _slaveConfig.getPassword() + "' "
75
+                               + "psql -h '" + _slaveConfig.getHost() + "' "
76
+                               + "-U '" + _slaveConfig.getUser() + "' "
77
+                               + "-w -d '" + _slaveConfig.getDatabase() + "' > /dev/null");
78
+    std::cout << command << std::endl;
79
+    int status = system(command.c_str());
80
+    if (status == 0)
81
+        return res.ok(true);
82
+    return res.error("psql exited with code " + std::to_string(status));
83
+}

+ 33
- 0
src/DataAccess/PgSql.h View File

1
+//
2
+// Created by robin on 4/6/16.
3
+//
4
+
5
+#ifndef PDNS_SLAVE_PGSQL_H
6
+#define PDNS_SLAVE_PGSQL_H
7
+
8
+#include "AbstractSql.h"
9
+
10
+class PgSql : public AbstractSql
11
+{
12
+public:
13
+    PgSql(const SqlConfiguration& masterConfig, const SqlConfiguration& slaveConfig);
14
+    ~PgSql();
15
+
16
+    BResult dump();
17
+
18
+    BResult insert();
19
+
20
+    BResult override(const std::string& sql);
21
+
22
+private:
23
+    const std::string getTempFile();
24
+
25
+    BResult insertSlave(const std::string& file);
26
+
27
+    std::string _dumpFilePath;
28
+
29
+    std::string _overrideFilePath;
30
+};
31
+
32
+
33
+#endif //PDNS_SLAVE_PGSQL_H

Loading…
Cancel
Save