]>
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.
36 #include <sys/types.h>
40 #include "pdnsexception.hh"
42 #include "dynmessenger.hh"
43 #include "arguments.hh"
46 #include "namespaces.hh"
47 #include "namespaces.hh"
57 int main(int argc
, char **argv
)
59 string s_programname
="pdns";
61 ::arg().set("config-dir","Location of configuration directory (pdns.conf)")=SYSCONFDIR
;
62 ::arg().set("socket-dir",string("Where the controlsocket will live, ")+LOCALSTATEDIR
+" when unset and not chrooted" )="";
63 ::arg().set("remote-address","Remote address to query");
64 ::arg().set("remote-port","Remote port to query")="53000";
65 ::arg().set("secret","Secret needed to connect to remote PowerDNS");
67 ::arg().set("config-name","Name of this virtual configuration - will rename the binary image")="";
68 ::arg().setCmd("no-config","Don't parse configuration file");
69 ::arg().set("chroot","")="";
70 ::arg().setCmd("help","Provide a helpful message");
71 ::arg().laxParse(argc
,argv
);
73 if(::arg().mustDo("help")) {
74 cout
<<"syntax:"<<endl
<<endl
;
75 cout
<<::arg().helpstring(::arg()["help"])<<endl
;
76 cout
<<"In addition, 'pdns_control help' can be used to retrieve a list\nof available commands from PowerDNS"<<endl
;
80 const vector
<string
>commands
=::arg().getCommands();
82 if(commands
.empty()) {
83 cerr
<<"No command passed"<<endl
;
87 if(::arg()["config-name"]!="")
88 s_programname
+="-"+::arg()["config-name"];
90 string configname
=::arg()["config-dir"]+"/"+s_programname
+".conf";
91 cleanSlashes(configname
);
93 if(!::arg().mustDo("no-config")) {
94 ::arg().laxFile(configname
.c_str());
95 ::arg().laxParse(argc
,argv
); // reparse so the commandline still wins
98 string socketname
=::arg()["socket-dir"];
99 if (::arg()["socket-dir"].empty()) {
100 if (::arg()["chroot"].empty())
101 socketname
= LOCALSTATEDIR
;
103 socketname
= ::arg()["chroot"] + "/";
104 } else if (!::arg()["socket-dir"].empty() && !::arg()["chroot"].empty()) {
105 socketname
= ::arg()["chroot"] + ::arg()["socket-dir"];
108 socketname
+= "/" + s_programname
+ ".controlsocket";
109 cleanSlashes(socketname
);
112 string command
=commands
[0];
113 shared_ptr
<DynMessenger
> D
;
114 if(::arg()["remote-address"].empty())
115 D
=shared_ptr
<DynMessenger
>(new DynMessenger(socketname
));
119 port
= static_cast<uint16_t>(pdns_stou(::arg()["remote-port"]));
122 cerr
<<"Unable to convert '"<<::arg()["remote-port"]<<"' to a port number for connecting to remote PowerDNS\n";
126 D
=shared_ptr
<DynMessenger
>(new DynMessenger(ComboAddress(::arg()["remote-address"], port
), ::arg()["secret"]));
130 for(vector
<string
>::const_iterator i
=commands
.begin();i
!=commands
.end();++i
) {
131 if(i
!=commands
.begin())
136 if(command
=="show") {
138 for(unsigned int n
=1;n
<commands
.size();n
++) {
139 message
+=commands
[n
];
143 else if(command
=="list") {
147 else if(command
=="quit" || command
=="QUIT") {
150 else if(command
=="status" || command
=="STATUS") {
153 else if(command
=="version" || command
=="VERSION") {
158 if(D
->send(message
)<0) {
159 cerr
<<"Error sending command"<<endl
;
163 string resp
=D
->receive();
164 if(resp
.compare(0, 7, "Unknown") == 0) {
171 catch(TimeoutException
&ae
) {
172 cerr
<<"Timeout error: "<<ae
.reason
<<endl
;
175 catch(PDNSException
&ae
) {
176 cerr
<<"Fatal error: "<<ae
.reason
<<endl
;
179 catch(const std::runtime_error
& e
) {
180 cerr
<<"Runtime error: "<<e
.what()<<endl
;