]>
Commit | Line | Data |
---|---|---|
a10ce0b8 SS |
1 | #!/usr/bin/python |
2 | # | |
3 | ############################################################################### | |
4 | # # | |
5 | # pyPDNS - A PDNS administration tool, written in pure python. # | |
9deb9e05 | 6 | # Copyright (C) 2012 IPFire development team # |
a10ce0b8 SS |
7 | # # |
8 | # This program is free software: you can redistribute it and/or modify # | |
9 | # it under the terms of the GNU General Public License as published by # | |
10 | # the Free Software Foundation, either version 3 of the License, or # | |
11 | # (at your option) any later version. # | |
12 | # # | |
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. # | |
17 | # # | |
18 | # You should have received a copy of the GNU General Public License # | |
19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. # | |
20 | # # | |
21 | ############################################################################### | |
22 | ||
23 | import backend | |
24 | import argparse | |
25 | ||
26 | from i18n import _ | |
6d2cabc5 | 27 | from backend import * |
a10ce0b8 SS |
28 | |
29 | # Create main class for the CLI. | |
30 | class Cli(object): | |
31 | def __init__(self): | |
32 | self.parser = argparse.ArgumentParser( | |
209345ca SS |
33 | description = _("CLI tool to adminstrate authoritative \ |
34 | PowerDNS servers.")) | |
a10ce0b8 SS |
35 | |
36 | # Add entry for version displaying. | |
209345ca SS |
37 | self.parser.add_argument('--version', action='version', |
38 | version='pyPDNS 0.1.1') | |
a10ce0b8 SS |
39 | |
40 | # Add sub-commands. | |
41 | self.sub_commands = self.parser.add_subparsers() | |
42 | ||
43 | self.parse_command_show() | |
44 | #self.parse_command_add() | |
45 | #self.parse_command_remove() | |
46 | ||
209345ca SS |
47 | # Finally parse all arguments from the command line and save |
48 | # them. | |
a10ce0b8 SS |
49 | self.args = self.parser.parse_args() |
50 | ||
51 | # Map return values from action to functions to proceed. | |
52 | self.action2func = { | |
53 | "show_all" : self.handle_show_all, | |
54 | "show_domains" : self.handle_show_domains, | |
55 | "show_records" : self.handle_show_records, | |
56 | } | |
57 | ||
58 | def parse_command_show(self): | |
59 | # Initialize the "show" command. | |
60 | sub_show = self.sub_commands.add_parser("show", | |
61 | help=_("Show domains and records.")) | |
62 | ||
63 | # Initialize subcommands for show. | |
64 | sub_show_subcommands = sub_show.add_subparsers() | |
65 | ||
66 | # Impement "show all". | |
67 | sub_show_records = sub_show_subcommands.add_parser("all", | |
68 | help="Show all domains and records.") | |
209345ca SS |
69 | sub_show_records.add_argument("action", action="store_const", |
70 | const="show_all") | |
a10ce0b8 SS |
71 | |
72 | # Implement "show records" and pick up given domain. | |
73 | sub_show_records = sub_show_subcommands.add_parser("records", | |
74 | help="Show records from a given domain.") | |
75 | sub_show_records.add_argument("domain", nargs="?", | |
76 | help="Show records from a given domain.") | |
209345ca SS |
77 | sub_show_records.add_argument("action", action="store_const", |
78 | const="show_records") | |
a10ce0b8 SS |
79 | |
80 | # Implement "show domains". | |
81 | sub_show_domains = sub_show_subcommands.add_parser("domains", | |
82 | help="Show all configured domains.") | |
209345ca SS |
83 | sub_show_domains.add_argument("action", action="store_const", |
84 | const="show_domains") | |
a10ce0b8 SS |
85 | |
86 | def run(self): | |
87 | action = self.args.action | |
88 | ||
89 | try: | |
90 | func = self.action2func[action] | |
6d2cabc5 | 91 | |
a10ce0b8 SS |
92 | except KeyError: |
93 | raise Exception, "Unhandled action: %s" % action | |
94 | ||
6d2cabc5 SS |
95 | else: |
96 | # Initialize DNS module. | |
97 | self.dns = DNS(DB) | |
98 | ||
a10ce0b8 SS |
99 | return func() |
100 | ||
101 | def handle_show_domains(self): | |
209345ca SS |
102 | """ |
103 | Get all domains and print them. | |
104 | """ | |
6d2cabc5 | 105 | domains = self.dns.get_domains() |
209345ca SS |
106 | |
107 | # Print the domains, if there are any configured. | |
108 | if not domains: | |
109 | print "No domain configured, yet." | |
110 | ||
111 | else: | |
112 | print "Currently configured domains:" | |
a10ce0b8 | 113 | for domain in domains: |
209345ca | 114 | print " - %s" % domain.name |
a10ce0b8 | 115 | |
a10ce0b8 SS |
116 | |
117 | def handle_show_records(self): | |
209345ca SS |
118 | # Print message if domain doens't exist. |
119 | if not self.args.domain: | |
120 | print " No domain name specified to show \ | |
121 | records." | |
122 | print " Use 'pdns show domains' to get a list \ | |
123 | from all available domains." | |
124 | ||
125 | return | |
126 | ||
127 | # Print message if domain doens't exist. | |
6d2cabc5 | 128 | domain = self.dns.get_domain(self.args.domain) |
a10ce0b8 | 129 | |
209345ca SS |
130 | if not domain: |
131 | print " No such domain, use 'pdns show \ | |
132 | domains' to get a list of all \ | |
133 | available domains." | |
134 | ||
135 | return | |
136 | ||
137 | # Print message if no records have been configured yet. | |
138 | if not domain.has_records(): | |
139 | print " Domain has no records yet." | |
140 | ||
141 | else: | |
142 | print " Showing records \ | |
143 | for: %s \n" % self.args.domain | |
144 | ||
145 | soa = domain.SOA | |
146 | ||
147 | # Check if the domain has a SOA record. | |
148 | if not soa: | |
149 | print " No Start of Authority \ | |
150 | (SOA record) created yet. \ | |
151 | Your domain will not work \ | |
152 | correctly. \n" | |
153 | ||
154 | else: | |
155 | # Define table layout for SOA table.. | |
156 | FORMAT = " %-8s: %s" | |
157 | print FORMAT % ("MName", soa.mname) | |
158 | print FORMAT % ("E-Mail",soa.email) | |
159 | print FORMAT % ("Serial", soa.serial) | |
160 | print FORMAT % ("Refresh", soa.refresh) | |
161 | print FORMAT % ("Retry", soa.retry) | |
162 | print FORMAT % ("Expire", soa.expire) | |
163 | print FORMAT % ("Minimum", soa.minimum) | |
164 | ||
165 | print "" #Just an emtpy line. | |
166 | ||
a10ce0b8 SS |
167 | # Define layout for records table. |
168 | FORMAT = " %-24s %-8s %-34s %-10s" | |
169 | ||
209345ca SS |
170 | # Define tables headline for records |
171 | # and print it. | |
a10ce0b8 SS |
172 | title = FORMAT % (_("Name"), _("Type"), _("Content"), _("TTL")) |
173 | print title | |
174 | print "=" * len(title) # spacing line | |
175 | ||
209345ca SS |
176 | # Display all remaining records, |
177 | # except SOA records. | |
a10ce0b8 SS |
178 | for record in domain.records: |
179 | if not record.type == "SOA": | |
180 | print FORMAT % (record.dnsname, record.type, record.content, record.ttl) | |
181 | ||
a10ce0b8 | 182 | |
a10ce0b8 SS |
183 | def handle_show_all(self): |
184 | # Get all domains and print them | |
6d2cabc5 | 185 | domains = self.dns.get_domains() |
a10ce0b8 | 186 | |
209345ca SS |
187 | # Print message if no domain has been configured. |
188 | if not domains: | |
189 | print "No domain configured, yet." | |
190 | ||
191 | return | |
192 | ||
193 | for domain in domains: | |
194 | print domain.name | |
195 | ||
196 | # Spacing line. | |
197 | print "=" * 80 | |
198 | ||
199 | # Print a message if domain has no records. | |
200 | if not domain.has_records(): | |
201 | print "Domain has no records yet." | |
202 | ||
203 | # Print records. | |
204 | for record in domain.records: | |
205 | if record.type == "SOA": | |
206 | FORMAT = ("%-30s %s") | |
207 | print FORMAT % (record.dnsname, record.type) | |
208 | else: | |
209 | FORMAT = ("%-30s %-6s %s") | |
210 | print FORMAT % (record.dnsname, record.type, record.content) | |
a10ce0b8 | 211 | |
209345ca SS |
212 | # Just an emty line. |
213 | print "" | |
a10ce0b8 SS |
214 | |
215 | ||
216 | ||
217 | cli = Cli() | |
218 | cli.run() |