]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dynloader.cc
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
35 #include <sys/types.h>
39 #include "pdnsexception.hh"
41 #include "dynmessenger.hh"
42 #include "arguments.hh"
45 #include "namespaces.hh"
55 int main(int argc
, char **argv
)
57 string programname
="pdns";
59 ::arg().set("config-dir","Location of configuration directory (pdns.conf)")=SYSCONFDIR
;
60 ::arg().set("socket-dir",string("Where the controlsocket will live, ")+LOCALSTATEDIR
+"/pdns when unset and not chrooted" )="";
61 ::arg().set("remote-address","Remote address to query");
62 ::arg().set("remote-port","Remote port to query")="53000";
63 ::arg().set("secret","Secret needed to connect to remote PowerDNS");
65 ::arg().set("config-name","Name of this virtual configuration - will rename the binary image")="";
66 ::arg().setCmd("no-config","Don't parse configuration file");
67 ::arg().set("chroot","")="";
68 ::arg().setCmd("help","Provide a helpful message");
69 ::arg().laxParse(argc
,argv
);
71 if(::arg().mustDo("help")) {
72 cout
<<"syntax:"<<endl
<<endl
;
73 cout
<<::arg().helpstring(::arg()["help"])<<endl
;
74 cout
<<"In addition, 'pdns_control help' can be used to retrieve a list\nof available commands from PowerDNS"<<endl
;
78 const vector
<string
>commands
=::arg().getCommands();
80 if(commands
.empty()) {
81 cerr
<<"No command passed"<<endl
;
85 if(::arg()["config-name"]!="")
86 programname
+="-"+::arg()["config-name"];
88 string configname
=::arg()["config-dir"]+"/"+programname
+".conf";
89 cleanSlashes(configname
);
91 if(!::arg().mustDo("no-config")) {
92 ::arg().laxFile(configname
.c_str());
93 ::arg().laxParse(argc
,argv
); // reparse so the commandline still wins
96 string socketname
=::arg()["socket-dir"];
97 if (::arg()["socket-dir"].empty()) {
98 if (::arg()["chroot"].empty())
99 socketname
= std::string(LOCALSTATEDIR
) + "/pdns";
101 socketname
= ::arg()["chroot"] + "/";
102 } else if (!::arg()["socket-dir"].empty() && !::arg()["chroot"].empty()) {
103 socketname
= ::arg()["chroot"] + ::arg()["socket-dir"];
106 socketname
+= "/" + programname
+ ".controlsocket";
107 cleanSlashes(socketname
);
110 string command
= commands
[0];
111 shared_ptr
<DynMessenger
> D
;
112 if(::arg()["remote-address"].empty())
113 D
= std::make_shared
<DynMessenger
>(socketname
);
117 pdns::checked_stoi_into(port
, ::arg()["remote-port"]);
120 cerr
<< "Unable to convert '" << ::arg()["remote-port"] << "' to a port number for connecting to remote PowerDNS\n";
124 D
= std::make_shared
<DynMessenger
>(ComboAddress(::arg()["remote-address"], port
), ::arg()["secret"]);
128 for(vector
<string
>::const_iterator i
=commands
.begin();i
!=commands
.end();++i
) {
129 if(i
!=commands
.begin())
134 if(command
=="show") {
136 for(unsigned int n
=1;n
<commands
.size();n
++) {
137 message
+=commands
[n
];
141 else if(command
=="list") {
145 else if(command
=="quit" || command
=="QUIT") {
148 else if(command
=="status" || command
=="STATUS") {
151 else if(command
=="version" || command
=="VERSION") {
156 if(D
->send(message
)<0) {
157 cerr
<<"Error sending command"<<endl
;
161 string resp
=D
->receive();
162 if(resp
.compare(0, 7, "Unknown") == 0) {
169 catch(TimeoutException
&ae
) {
170 cerr
<<"Timeout error: "<<ae
.reason
<<endl
;
173 catch(PDNSException
&ae
) {
174 cerr
<<"Fatal error: "<<ae
.reason
<<endl
;
177 catch(const std::runtime_error
& e
) {
178 cerr
<<"Runtime error: "<<e
.what()<<endl
;