├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── __init__.py
├── configaudit.py
├── conftodict.py
└── tests
├── __init__.py
├── test.txt
└── test_conftodict.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | *.egg-info/
24 | .installed.cfg
25 | *.egg
26 |
27 | # PyInstaller
28 | # Usually these files are written by a python script from a template
29 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
30 | *.manifest
31 | *.spec
32 |
33 | # Installer logs
34 | pip-log.txt
35 | pip-delete-this-directory.txt
36 |
37 | # Unit test / coverage reports
38 | htmlcov/
39 | .tox/
40 | .coverage
41 | .coverage.*
42 | .cache
43 | nosetests.xml
44 | coverage.xml
45 | *,cover
46 | .hypothesis/
47 |
48 | # Translations
49 | *.mo
50 | *.pot
51 |
52 | # Django stuff:
53 | *.log
54 |
55 | # Sphinx documentation
56 | docs/_build/
57 |
58 | # PyBuilder
59 | target/
60 |
61 | #Ipython Notebook
62 | .ipynb_checkpoints
63 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # CI build file
2 | language: python
3 | python:
4 | - "3.4"
5 | # command to run tests
6 | script: nosetests
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 | {one line to give the program's name and a brief idea of what it does.}
635 | Copyright (C) {year} {name of author}
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | {project} Copyright (C) {year} {fullname}
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #conftodict
2 | Python module to convert Cisco IOS config to a python dictionary.
3 | I built this module to help with auditing device configurations.
4 | Since a dictionary is a hash of key/value pairs its efficient for auditing
5 | large sets of configurations.
6 |
7 | Built and tested with Python 3. Python 2 not tested at this time.
8 |
9 |
10 | ###Overview
11 | Cisco IOS config is a series of parent and child relationships, IE;
12 | ```
13 | !
14 | interface Loopback0 # Parent
15 | ip address 10.10.10.10 255.255.255.255 # Child
16 | ip flow ingress # Child
17 | h323-gateway voip interface # Child
18 | h323-gateway voip bind srcaddr 10.10.10.10 # Child
19 | !
20 | ```
21 |
22 | This will be converted into a dictionary with the parent as the key and children a list of values
23 | ```python
24 | {'interface Loopback0': [
25 | 'ip address 10.10.10.10 255.255.255.255',
26 | 'ip flow ingress',
27 | 'h323-gateway voip interface',
28 | 'h323-gateway voip bind srcaddr 10.10.10.10',
29 | ]}
30 | ```
31 |
32 | Parents with no children will have an empty list for a value
33 | ```python
34 | {'logging trap debugging': []}
35 | ```
36 |
37 | Note: It is assumed that the config will be in the same format as show run output.
38 |
39 | ###Installation
40 | ```bash
41 | mkdir path/to/ise
42 | cd path/to/ise
43 | git clone https://github.com/bobthebutcher/conftodict.git
44 | ```
45 |
46 | ###Add to path
47 | ```python
48 | import sys
49 | sys.path.append('/path/to/conftodict/')
50 | ```
51 |
52 | ###Example Usage
53 | ```python
54 | from conftodict import ConfToDict
55 | from configaudit import search_keys, search_values
56 |
57 | # Create a config dictionary
58 | c = ConfToDict('tests/test.txt', from_file=True)
59 | config = c.to_dict()
60 |
61 | # List of commands to check exist
62 | commands = ['voice rtp send-recv', 'sccp local Loopback0', 'voice service voip']
63 |
64 | # configaudit has some helper functions for auditing config
65 | # helper functions return an AuditResult object
66 | # There are helper functions for auditing a list of keys/values or single key/value
67 | result = search_keys(config, commands)
68 |
69 | result.ok
70 | False
71 |
72 | result.error
73 | 'extra key(s) found'
74 |
75 | result.extra
76 | ['interface GigabitEthernet1/0',
77 | 'mgcp profile default',
78 | 'line vty 5 15',
79 | 'voice class codec 1',
80 | 'service password-encryption',
81 | 'ip cef',
82 | 'dspfarm profile 2 conference',
83 | 'interface Vlan1',
84 | ...]
85 |
86 | commands = ['no ip address', 'shutdown', 'duplex auto', 'speed auto']
87 | result = search_values(config['interface GigabitEthernet0/1'], commands)
88 |
89 | result.ok
90 | True
91 | ```
--------------------------------------------------------------------------------
/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bwks/conftodict/ea960caf70b694766d4efb7b7d079f6d57bba7b9/__init__.py
--------------------------------------------------------------------------------
/configaudit.py:
--------------------------------------------------------------------------------
1 | """
2 | Functions for performing config audit
3 | - Currently no tests
4 | """
5 |
6 |
7 | class AuditResult(object):
8 | def __init__(self, ok=False, missing=None, extra=None, error=None):
9 | """
10 | Helper class to return result object
11 | :param ok: True/False
12 | :param missing: Missing entries
13 | :param extra: Extra entries
14 | :param error: Error string
15 | """
16 | self.ok = ok
17 | self.missing = missing
18 | self.extra = extra
19 | self.error = error
20 |
21 |
22 | def search_keys(conf_dict, conf_list):
23 | """
24 | Search dict keys for a list of commands
25 | :param conf_dict: DICTIONARY of config
26 | :param conf_list: LIST of keys to search for
27 | :return: AuditResult object
28 | """
29 | found = [i for i in conf_dict if i not in conf_list]
30 | not_found = [i for i in conf_list if i not in conf_dict]
31 |
32 | if not_found and not found:
33 | return AuditResult(ok=False, missing=not_found, error='key(s) not found')
34 | elif found and not not_found:
35 | return AuditResult(ok=False, extra=found, error='extra key(s) found')
36 | elif found and not_found:
37 | return AuditResult(ok=False, extra=found, missing=not_found,
38 | error='extra key(s) and key(s) not found')
39 | else:
40 | return AuditResult(ok=True)
41 |
42 |
43 | def search_key(conf_dict, key):
44 | """
45 | Search dict for a single key
46 | :param conf_dict: DICTIONARY of config
47 | :param key: STRING to search for
48 | :return: AuditResult object
49 | """
50 | if key in conf_dict:
51 | return AuditResult(ok=True)
52 | else:
53 | return AuditResult(ok=False, missing=key, error='key not found')
54 |
55 |
56 | def search_values(dict_key, conf_list):
57 | """
58 | Search a dict_key's values for a list of commands
59 | # Examples:
60 | # level 0 < dict_key
61 | # level 1 < [search for these values,
62 | # level 1 < search for these values]
63 |
64 | # level 0
65 | # level 1 < dict_key
66 | # level 2 < [search for these values,
67 | # level 2 < search for these values]
68 |
69 | :param dict_key: LIST from dictionary key
70 | :param conf_list: LIST of commands to search for
71 | :return: AuditResult object
72 | """
73 | found = [i for i in dict_key if i not in conf_list]
74 | not_found = [i for i in conf_list if i not in dict_key]
75 |
76 | if not_found and not found:
77 | return AuditResult(ok=False, missing=not_found, error='value(s) not found')
78 | elif found and not not_found:
79 | return AuditResult(ok=False, extra=found, error='extra value(s) found')
80 | elif found and not_found:
81 | return AuditResult(ok=False, extra=found, missing=not_found,
82 | error='extra value(s) and value(s) not found')
83 | else:
84 | return AuditResult(ok=True)
85 |
86 |
87 | def search_value(dict_key, value):
88 | """
89 | Search dict_key's values for a single value
90 | :param dict_key: List of config
91 | :param value: STRING to search for
92 | :return: AuditResult object
93 | """
94 | if value in dict_key:
95 | return AuditResult(ok=True)
96 | else:
97 | return AuditResult(ok=False, missing=value, error='value not found')
98 |
--------------------------------------------------------------------------------
/conftodict.py:
--------------------------------------------------------------------------------
1 | """
2 | Convert Cisco ISO config to a python dictionary
3 | The idea is that a dictionary has hashes of key/value pairs
4 | which will be very fast to perform config auditing against.
5 |
6 | Note: Config must be in the same format as it is from a show run
7 |
8 | version: 0.1.6
9 | TO-DO: - Building test suite and work on edge cases
10 | - Update to work with config with more than one space
11 | between parent/child elements # Done need tests
12 | - Change banner so that banner X is the key and banner text is the value
13 |
14 | Example Usage:
15 | >>> from conftodict import ConfToDict
16 | >>> from configaudit import search_keys, search_values
17 | >>>
18 | >>> c = ConfToDict('tests/test.txt', from_file=True)
19 | >>> config = c.to_dict()
20 | >>>
21 | >>> commands = ['voice rtp send-recv', 'sccp local Loopback0', 'voice service voip']
22 | >>> result = search_keys(config, commands)
23 | >>>
24 | >>> result.ok
25 | >>> False
26 | >>>
27 | >>> result.error
28 | >>> 'extra key(s) found'
29 | >>>
30 | >>> result.extra
31 | >>> ['interface GigabitEthernet1/0',
32 | >>> 'mgcp profile default',
33 | >>> 'line vty 5 15',
34 | >>> 'voice class codec 1',
35 | >>> 'service password-encryption',
36 | >>> 'ip cef',
37 | >>> 'dspfarm profile 2 conference',
38 | >>> 'interface Vlan1',
39 | >>> ...]
40 | >>>
41 | >>> commands = ['no ip address', 'shutdown', 'duplex auto', 'speed auto']
42 | >>> result = search_values(config['interface GigabitEthernet0/1'], commands)
43 | >>>
44 | >>> result.ok
45 | >>> True
46 | """
47 |
48 |
49 | class ConfToDict(object):
50 | """
51 | Convert Cisco IOS config to a python dictionary
52 | """
53 |
54 | def __init__(self, full_config, delimiter='\n', from_file=False, spaces=1):
55 | """
56 | Initialization method
57 | :param full_config: Either a multi-line string or a path to a file
58 | :param delimiter: Delimiter used to split the lines
59 | :param from_file: Set to true if config is coming from a file
60 | :param spaces: Number of spaces for child indent
61 | # IOS = 1
62 | # NXOS = 2
63 | """
64 | self.full_config = full_config
65 | self.delimiter = delimiter
66 | self.from_file = from_file
67 | self.spaces = spaces
68 |
69 | # Clean config with a file as the input
70 | if self.from_file:
71 | with open(self.full_config, 'r') as f:
72 | full_config = f.readlines()
73 | # Just config, remove trailing new lines and '!'
74 | config = []
75 | for i in full_config:
76 | if not (i.startswith('!') or
77 | i.startswith(' !{0}'.format(self.delimiter)) or
78 | i.startswith(self.delimiter)):
79 | config.append(i.replace(self.delimiter, '').rstrip())
80 |
81 | self.config = config
82 |
83 | # Clean config with a multi-line string as the input
84 | else:
85 | conf_list = self.full_config.split(self.delimiter)
86 | config = []
87 | for i in conf_list:
88 | if not (i.startswith('!') or i == ' !' or i == ''):
89 | config.append(i.rstrip())
90 |
91 | self.config = config
92 |
93 | @staticmethod
94 | def find_children(child_list, parent_index, next_parent_index):
95 | """
96 | Get the slice of config between parent elements
97 | :param child_list: A child list
98 | :param parent_index: Index of current parent
99 | :param next_parent_index: Index of next parent
100 | :return: A list of children between current and next parent elements
101 | """
102 | children = []
103 | for i in child_list:
104 | if parent_index < i[0] < next_parent_index:
105 | children.append(i)
106 | return children
107 |
108 | def to_dict(self):
109 | """
110 | Convert a list of IOS config to a dictionary.
111 | :return: A dictionary of config elements
112 | """
113 | conf_dict = {}
114 |
115 | # Banners might have spaces at the beginning of lines.
116 | # So.. find banners and add them to the conf_dict.
117 | banners = []
118 |
119 | # Find start of banner
120 | for i in self.config:
121 | if i.startswith('banner'):
122 | banner_start = self.config.index(i)
123 | # Sometimes an extra terminator is added to eol eg: ^CC instead of ^C
124 | # Why? Who fucking knows but adding [:2] below to compensate
125 | terminator = i.split()[-1][:2]
126 |
127 | # Find end of banner
128 | sentinel = banner_start + 1
129 | while not self.config[sentinel] == terminator:
130 | sentinel += 1
131 |
132 | # Add start/finish of banner to banners list
133 | banners.append((banner_start, sentinel))
134 |
135 | # Add banners to conf_dict
136 | for i in banners:
137 | conf_dict.update({'\n'.join([j for j in self.config[i[0]:i[1] + 1]]): []})
138 |
139 | # List holds a range of banner line numbers
140 | banner_list = [i for j in [range(k[0], k[1] + 1) for k in banners] for i in j]
141 |
142 | numbered_config = [i for i in enumerate(self.config)]
143 |
144 | zero_level = []
145 | first_level = []
146 | second_level = []
147 | third_level = []
148 |
149 | for i in numbered_config:
150 | if i[0] in banner_list:
151 | pass
152 | else:
153 | # The number of spaces at the start of the line indicates the child level
154 | child_level = len(i[1]) - len(i[1].lstrip(' '))
155 | if not i[1].startswith(' '):
156 | zero_level.append(i)
157 | elif child_level == 1 * self.spaces:
158 | first_level.append((i[0], i[1].lstrip(' ')))
159 | elif child_level == 2 * self.spaces:
160 | second_level.append((i[0], i[1].lstrip(' ')))
161 | elif child_level == 3 * self.spaces:
162 | third_level.append((i[0], i[1].lstrip(' ')))
163 | elif child_level > 3 * self.spaces:
164 | print('More than 3 levels of nesting')
165 | print(i)
166 |
167 | for i in zero_level:
168 | next_element = zero_level.index(i) + 1
169 | if next_element == len(zero_level):
170 | # end of top level parents
171 | if first_level and second_level:
172 | if i[0] > first_level[-1][0] and i[0] > second_level[-1][0]:
173 | conf_dict.update({i[1]: []})
174 | elif first_level:
175 | if i[0] > first_level[-1][0]:
176 | conf_dict.update({i[1]: []})
177 | else:
178 | print('last zero level parent has children')
179 |
180 | elif zero_level[next_element][0] - zero_level[zero_level.index(i)][0] == 1:
181 | # element has no children
182 | conf_dict.update({i[1]: []})
183 | else:
184 | parent_index = zero_level[zero_level.index(i)][0]
185 | next_parent_index = zero_level[next_element][0]
186 |
187 | # find child elements between parent elements
188 | first_level_children = self.find_children(first_level, parent_index,
189 | next_parent_index)
190 | second_level_children = self.find_children(second_level, parent_index,
191 | next_parent_index)
192 | third_level_children = self.find_children(third_level, parent_index,
193 | next_parent_index)
194 |
195 | # Parent only has first level children
196 | if not second_level_children:
197 | # level 0
198 | # level 1
199 | # level 1
200 | #
201 | # output : {level 0: [level 1, level 1]}
202 | children = [j[1] for j in first_level_children]
203 | conf_dict.update({i[1]: children})
204 |
205 | elif second_level_children and third_level_children:
206 | # multiple children at different levels 1 child per level
207 | # level 0
208 | # level 1
209 | # level 2
210 | # level 3
211 | #
212 | # output: {level 0: {level 1: {level 2: [level 3]}}}
213 | if (len(first_level_children) and len(second_level_children) and
214 | len(third_level_children)) == 1:
215 | conf_dict.update({
216 | i[1]: {
217 | first_level_children[0][1]: {
218 | second_level_children[0][1]: [third_level_children[0][1]]
219 | }
220 | }
221 | })
222 |
223 | elif second_level_children:
224 | if (len(first_level_children) and len(second_level_children)) == 1:
225 | # multiple children at different levels 1 child per level
226 | # level 0
227 | # level 1
228 | # level 2
229 | #
230 | # output: {level 0: {level 1: [level 2]}}
231 | conf_dict.update({
232 | i[1]: {
233 | first_level_children[0][1]: [second_level_children[0][1]]
234 | }
235 | })
236 |
237 | else:
238 | # multiple children at different levels 2 child levels
239 | # level 0
240 | # level 1
241 | # level 2
242 | # level 2
243 | # level 1
244 | # level 2
245 | # level 2
246 | #
247 | # output: {level 0:
248 | # {level 1: [level 2, level 2]},
249 | # {level 1: [level 2, level 2]}
250 | # }
251 | all_children = []
252 | for j in first_level_children:
253 | next_element = first_level_children.index(j) + 1
254 | children = []
255 | # last element in list
256 | if next_element == len(first_level_children):
257 | for k in second_level_children:
258 | if j[0] < k[0]:
259 | children.append(k[1])
260 | else:
261 | for k in second_level_children:
262 | if j[0] < k[0] < first_level_children[next_element][0]:
263 | children.append(k[1])
264 | all_children.append({j[1]: children})
265 |
266 | conf_dict.update({i[1]: {}})
267 | for j in all_children:
268 | conf_dict[i[1]].update(j)
269 |
270 | return conf_dict
271 |
--------------------------------------------------------------------------------
/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bwks/conftodict/ea960caf70b694766d4efb7b7d079f6d57bba7b9/tests/__init__.py
--------------------------------------------------------------------------------
/tests/test.txt:
--------------------------------------------------------------------------------
1 | Building configuration...
2 |
3 |
4 | Current configuration : 13881 bytes
5 | !
6 | ! Last configuration change at 00:17:54 AEST Wed Dec 9 2015 by jimbo
7 | ! NVRAM config last updated at 00:17:56 AEST Wed Dec 9 2015 by jimbo
8 | ! NVRAM config last updated at 00:17:56 AEST Wed Dec 9 2015 by jimbo
9 | version 15.2
10 | no service pad
11 | service tcp-keepalives-in
12 | service tcp-keepalives-out
13 | service timestamps debug datetime msec localtime show-timezone
14 | service timestamps log datetime msec localtime show-timezone
15 | service password-encryption
16 | !
17 | hostname TESTR01
18 | !
19 | boot-start-marker
20 | boot-end-marker
21 | !
22 | !
23 | logging buffered 16384
24 | enable secret 4 4ascfbkKldsojnac
25 | !
26 | aaa new-model
27 | !
28 | !
29 | aaa authentication login TACACS group tacacs+ local
30 | aaa authentication login CONSOLE local
31 | aaa authentication enable default none
32 | aaa authorization config-commands
33 | aaa authorization commands 0 default group tacacs+ local
34 | aaa authorization commands 1 default group tacacs+ none
35 | aaa authorization commands 15 default group tacacs+ none
36 | aaa accounting exec default start-stop group tacacs+
37 | aaa accounting commands 0 default start-stop group tacacs+
38 | aaa accounting commands 1 default start-stop group tacacs+
39 | aaa accounting commands 15 default start-stop group tacacs+
40 | aaa accounting network default start-stop group tacacs+
41 | aaa accounting connection default start-stop group tacacs+
42 | aaa accounting system default start-stop group tacacs+
43 | !
44 | !
45 | !
46 | !
47 | !
48 | aaa session-id common
49 | clock timezone AEDT 10 0
50 | clock summer-time AEST recurring 1 Sun Oct 2:00 1 Sun Apr 3:00
51 | network-clock-participate wic 0
52 | network-clock-participate wic 1
53 | network-clock-select 1 BRI0/0/0
54 | network-clock-select 2 BRI0/1/0
55 | !
56 | ip cef
57 | !
58 | !
59 | !
60 | !
61 | !
62 | !
63 | ip flow-cache timeout active 1
64 | ip domain name hearing.net
65 | ip wccp source-interface Loopback0
66 | ip wccp 100 redirect-list WCCP_REDIRECT_ACL
67 | no ipv6 cef
68 | multilink bundle-name authenticated
69 | !
70 | !
71 | !
72 | !
73 | isdn switch-type basic-net3
74 | !
75 | !
76 | !
77 | voice-card 0
78 | codec complexity medium
79 | dspfarm
80 | dsp services dspfarm
81 | !
82 | !
83 | voice call send-alert
84 | voice rtp send-recv
85 | !
86 | voice service pots
87 | !
88 | voice service voip
89 | fax protocol t38 version 0 ls-redundancy 0 hs-redundancy 0 fallback none
90 | !
91 | voice class codec 1
92 | codec preference 1 g711ulaw
93 | codec preference 2 g711alaw
94 | codec preference 3 g729r8
95 | !
96 | voice class h323 1
97 | h225 timeout tcp establish 3
98 | !
99 | !
100 | !
101 | !
102 | voice translation-rule 110
103 | rule 1 /8448/ /2/
104 | !
105 | voice translation-rule 120
106 | rule 1 /^\([2-6]\)\(........\)$/ /00\1\2/
107 | rule 2 /^\([7-8]\)\(........\)$/ /00\1\2/
108 | rule 3 /\(.*\)/ /0\1/
109 | !
110 | voice translation-rule 130
111 | rule 1 /^\(55[7-9]\)\(..\)$/ /0029555\1\2/
112 | rule 2 /^29999$/ /01800555555/
113 | !
114 | !
115 | voice translation-profile SRST_IN
116 | translate calling 110
117 | translate called 130
118 | !
119 | voice translation-profile SRST_OUT
120 | translate calling 120
121 | !
122 | !
123 | !
124 | license udi pid CISCO2951/K9 sn XXXXXXXXX
125 | license accept end user agreement
126 | license boot module c2951 technology-package uck9
127 | hw-module pvdm 0/0
128 | !
129 | hw-module pvdm 0/1
130 | !
131 | hw-module sm 1
132 | !
133 | hw-module sm 2
134 | !
135 | !
136 | !
137 | vtp mode transparent
138 | username SWEETLING privilege 15 secret 4 4ascfbPzSYldsojnac
139 | !
140 | redundancy
141 | !
142 | !
143 | vlan 100
144 | name INWARDS
145 | !
146 | !
147 | class-map match-any QOS_SIGNALLING
148 | match protocol sip
149 | match protocol mgcp
150 | match protocol capwap
151 | match access-group name QOS_UCCX
152 | match ip dscp af31
153 | class-map match-any QOS_MGMT
154 | match protocol ssh
155 | class-map match-any QOS_VIDEO_RTP
156 | match protocol rtp video
157 | match ip dscp af41
158 | class-map match-any QOS_VOICE_RTP
159 | match protocol rtp audio
160 | match ip dscp ef
161 | class-map match-any QOS_ROUTING
162 | match protocol eigrp
163 | match ip dscp cs6
164 | class-map match-any QOS_APPS
165 | match protocol citrix
166 | !
167 | policy-map QOS_CATEGORIES
168 | class QOS_VOICE_RTP
169 | priority percent 20
170 | set ip dscp ef
171 | class QOS_ROUTING
172 | bandwidth percent 1
173 | set ip dscp cs6
174 | class QOS_MGMT
175 | bandwidth percent 1
176 | set ip dscp cs5
177 | class QOS_APPS
178 | bandwidth percent 40
179 | set ip dscp af41
180 | class QOS_VIDEO_RTP
181 | bandwidth percent 25
182 | set ip dscp af31
183 | class QOS_SIGNALLING
184 | bandwidth percent 5
185 | set ip dscp af31
186 | class class-default
187 | set ip dscp default
188 | fair-queue
189 | random-detect
190 | !
191 | policy-map QOS_SCHEDULER_OUT
192 | class class-default
193 | shape average percent 100
194 | service-policy QOS_CATEGORIES
195 | !
196 | !
197 | !
198 | !
199 | !
200 | interface Loopback0
201 | ip address 10.10.10.10 255.255.255.255
202 | ip flow ingress
203 | h323-gateway voip interface
204 | h323-gateway voip bind srcaddr 10.10.10.10
205 | !
206 | interface Embedded-Service-Engine0/0
207 | no ip address
208 | service-module enable
209 | !
210 | interface GigabitEthernet0/0
211 | description ** WAN Link **
212 | bandwidth 10000
213 | ip address 172.16.200.2 255.255.255.252
214 | ip accounting output-packets
215 | ip wccp 100 redirect in
216 | ip nbar protocol-discovery ipv4
217 | ip flow ingress
218 | ip flow egress
219 | load-interval 30
220 | duplex full
221 | speed 100
222 | service-policy output QOS_SCHEDULER_OUT
223 | !
224 | interface GigabitEthernet0/1
225 | no ip address
226 | shutdown
227 | duplex auto
228 | speed auto
229 | !
230 | interface GigabitEthernet0/2
231 | no ip address
232 | duplex auto
233 | speed auto
234 | !
235 | interface BRI0/0/0
236 | no ip address
237 | no logging event link-status
238 | no snmp trap link-status
239 | isdn switch-type basic-net3
240 | isdn overlap-receiving
241 | isdn point-to-point-setup
242 | isdn incoming-voice voice
243 | isdn sending-complete
244 | isdn static-tei 0
245 | !
246 | interface BRI0/0/1
247 | no ip address
248 | no logging event link-status
249 | no snmp trap link-status
250 | isdn switch-type basic-net3
251 | isdn overlap-receiving
252 | isdn point-to-point-setup
253 | isdn incoming-voice voice
254 | isdn sending-complete
255 | isdn static-tei 0
256 | !
257 | interface GigabitEthernet1/0
258 | ip address 1.1.1.1 255.255.255.252
259 | !
260 | interface GigabitEthernet1/1
261 | description to TESTSW01
262 | switchport access vlan 100
263 | no ip address
264 | !
265 | interface SM2/0
266 | ip address 10.10.100.1 255.255.255.0
267 | ip wccp redirect exclude in
268 | service-module heartbeat-reset disable
269 | service-module ip address 10.10.100. 255.255.255.0
270 | !Application: VMware ESXi 5.1.0 build-1065491 running on SRE
271 | service-module ip default-gateway 10.10.100.1
272 | !
273 | interface SM2/1
274 | description Internal switch interface connected to Service Module
275 | switchport mode trunk
276 | no ip address
277 | !
278 | interface Vlan1
279 | no ip address
280 | shutdown
281 | !
282 | interface Vlan100
283 | ip address 10.10.50.17 255.255.255.248
284 | ip wccp 100 redirect in
285 | !
286 | router bgp 65534
287 | bgp router-id 10.10.10.10
288 | bgp log-neighbor-changes
289 | network 10.10.100.0 mask 255.255.255.255
290 | network 10.10.200.0 mask 255.255.255.0
291 | network 10.10.50.16 mask 255.255.255.248
292 | network 10.10.10.10 mask 255.255.255.255
293 | redistribute static
294 | neighbor 172.16.200.1 remote-as 65419
295 | neighbor 172.16.200.1 soft-reconfiguration inbound
296 | !
297 | ip forward-protocol nd
298 | !
299 | no ip http server
300 | no ip http secure-server
301 | ip flow-export source Loopback0
302 | ip flow-export version 9 origin-as
303 | ip flow-export destination 192.168.1.1 2055
304 | !
305 | ip route 10.20.30.0 255.255.255.0 10.255.1.1
306 | ip tacacs source-interface Loopback0
307 | !
308 | ip access-list extended WCCP_REDIRECT_ACL
309 | deny tcp 10.50.10.0 0.0.0.255 any
310 | deny tcp any 10.50.10.0 0.0.0.255
311 | deny tcp 10.10.50.0 0.0.0.7 any
312 | deny tcp any 10.10.50.0 0.0.0.7
313 | permit tcp 10.50.60.0 0.0.0.255 any
314 | permit tcp any 10.50.60.0 0.0.0.255
315 | !
316 | logging trap debugging
317 | logging source-interface Loopback0
318 | logging host 192.168.1.1
319 | access-list 999 permit 192.168.1.1
320 | access-list 999 permit 10.1.14.80
321 | !
322 | nls resp-timeout 1
323 | cpd cr-id 1
324 | !
325 | snmp-server community COMMUNIST RO 999
326 | snmp-server ifindex persist
327 | snmp-server trap-source Loopback0
328 | snmp-server queue-limit notification-host 25
329 | snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
330 | snmp-server enable traps tty
331 | snmp-server enable traps entity-sensor threshold
332 | snmp-server enable traps config-copy
333 | snmp-server enable traps config
334 | snmp-server enable traps frame-relay multilink bundle-mismatch
335 | snmp-server enable traps cpu threshold
336 | snmp-server host 192.168.2.2 c1sc0w0rks snmp
337 | tacacs-server host 192.168.3.3
338 | tacacs-server host 192.168.4.4
339 | tacacs-server key BACKDOOR
340 | !
341 | !
342 | !
343 | control-plane
344 | !
345 | !
346 | voice-port 0/0/0
347 | disc_pi_off
348 | compand-type a-law
349 | cptone AU
350 | !
351 | voice-port 0/0/1
352 | disc_pi_off
353 | compand-type a-law
354 | cptone AU
355 | !
356 | voice-port 0/1/0
357 | disc_pi_off
358 | compand-type a-law
359 | cptone AU
360 | !
361 | voice-port 0/1/1
362 | disc_pi_off
363 | compand-type a-law
364 | cptone AU
365 | !
366 | voice-port 0/2/0
367 | disc_pi_off
368 | no vad
369 | compand-type a-law
370 | cptone AU
371 | station-id number 88888888
372 | caller-id enable
373 | !
374 | voice-port 0/2/1
375 | !
376 | !
377 | !
378 | !
379 | !
380 | !
381 | mgcp profile default
382 | !
383 | sccp local Loopback0
384 | sccp ccm 192.168.5.5 identifier 1 version 7.0
385 | sccp ccm 192.168.5.6 identifier 2 version 7.0
386 | sccp
387 | !
388 | sccp ccm group 1
389 | bind interface Loopback0
390 | associate ccm 1 priority 1
391 | associate ccm 2 priority 2
392 | associate profile 1 register TST-XCODE
393 | associate profile 2 register TST-CFB
394 | keepalive retries 8
395 | switchover method immediate
396 | switchback method immediate
397 | switchback interval 15
398 | !
399 | dspfarm profile 1 transcode
400 | codec g711ulaw
401 | codec g711alaw
402 | codec g729ar8
403 | codec g729abr8
404 | maximum sessions 50
405 | associate application SCCP
406 | !
407 | dspfarm profile 2 conference
408 | codec g711ulaw
409 | codec g711alaw
410 | codec g729ar8
411 | codec g729abr8
412 | maximum sessions 17
413 | associate application SCCP
414 | !
415 | dial-peer voice 100 voip
416 | description CallManager
417 | preference 1
418 | destination-pattern 999999..
419 | session target ipv4:192.168.5.5
420 | incoming called-number .
421 | voice-class codec 1
422 | voice-class h323 1
423 | dtmf-relay h245-alphanumeric
424 | fax-relay ecm disable
425 | fax rate disable
426 | no vad
427 | !
428 | dial-peer voice 101 voip
429 | description CallManager
430 | preference 2
431 | destination-pattern 999999..
432 | session target ipv4:192.168.5.6
433 | incoming called-number .
434 | voice-class codec 1
435 | voice-class h323 1
436 | dtmf-relay h245-alphanumeric
437 | fax-relay ecm disable
438 | fax rate disable
439 | no vad
440 | !
441 | dial-peer voice 10 pots
442 | description PSTN
443 | destination-pattern 0.T
444 | progress_ind setup enable 3
445 | progress_ind alert enable 8
446 | incoming called-number .
447 | direct-inward-dial
448 | port 0/0/0
449 | !
450 | dial-peer voice 11 pots
451 | description PSTN
452 | destination-pattern 0.T
453 | progress_ind setup enable 3
454 | progress_ind alert enable 8
455 | incoming called-number .
456 | direct-inward-dial
457 | port 0/1/0
458 | !
459 | dial-peer voice 88888888 pots
460 | destination-pattern 88888888
461 | port 0/2/0
462 | !
463 | !
464 | !
465 | !
466 | gatekeeper
467 | shutdown
468 | !
469 | !
470 | call-manager-fallback
471 | secondary-dialtone 0
472 | max-conferences 4 gain -6
473 | transfer-system full-consult
474 | ip source-address 10.10.10.10 port 2000
475 | max-ephones 12
476 | max-dn 48 dual-line
477 | system message primary Call 01800555555
478 | system message secondary Call 01800555555
479 | dialplan-pattern 1 8448882.. extension-length 5 extension-pattern 999..
480 | transfer-pattern 0.T
481 | no huntstop
482 | translation-profile incoming SRST_IN
483 | translation-profile outgoing SRST_OUT
484 | time-zone 24
485 | date-format dd-mm-yy
486 | !
487 | !
488 | banner login ^C
489 | In no event shall the author(s) be liable for any found errors contained herein or for any
490 | direct, indirect, special, incidental or consequential damages (including lost profit or lost
491 | data) whether based on warranty, contract, tort, or any other legal theory in connection with
492 | the furnishing, performance, or use of this material.
493 | ^C
494 | !
495 | !
496 | banner motd ^C
497 | Documentation pertaining to any security-related technical or proprietary information, its
498 | data and all information provided and contained within this document is considered
499 | proprietary in nature and subject to copyright protection and is intended solely for use by its
500 | owner. Additionally, this documentation is solely for the purpose of discussing a possible,
501 | and/or proposed IT security issue, and is not dependent upon any specified infrastructure,
502 | architectural condition or its issue(s).
503 | ^C
504 | !
505 | !
506 | banner incoming ^C
507 | All other product names mentioned herein are trademarks or registered trademarks of their
508 | respective owners. NOTE: Any names not outlined or mentioned above are fictional in
509 | nature; as such, any relation to any name or trademark (if any) is purely coincidental.
510 | ^C
511 | !
512 | !
513 | line con 0
514 | location Test Network
515 | privilege level 15
516 | logging synchronous
517 | login authentication CONSOLE
518 | line aux 0
519 | exec-timeout 0 0
520 | privilege level 15
521 | transport input telnet ssh
522 | line 2
523 | no activation-character
524 | no exec
525 | transport preferred none
526 | transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
527 | stopbits 1
528 | line 67
529 | no activation-character
530 | no exec
531 | transport preferred none
532 | transport input all
533 | transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
534 | stopbits 1
535 | flowcontrol software
536 | line 131
537 | no activation-character
538 | no exec
539 | transport preferred none
540 | transport input all
541 | transport output pad telnet rlogin lapb-ta mop udptn v120 ssh
542 | stopbits 1
543 | line vty 0 4
544 | location Test Network
545 | privilege level 15
546 | logging synchronous
547 | login authentication TACACS
548 | transport input ssh
549 | transport output telnet ssh
550 | line vty 5 15
551 | location Test Network
552 | privilege level 15
553 | logging synchronous
554 | login authentication TACACS
555 | transport input ssh
556 | transport output ssh
557 | !
558 | scheduler allocate 20000 1000
559 | ntp source Loopback0
560 | ntp server ntp.mcfly.com
561 | ntp server ntp.time.com prefer
562 | !
563 | end
564 |
--------------------------------------------------------------------------------
/tests/test_conftodict.py:
--------------------------------------------------------------------------------
1 | """
2 | Test for conf_to_dict
3 | """
4 | import unittest
5 |
6 | config = '''!
7 | hostname TSTR01
8 | !
9 | boot-start-marker
10 | boot-end-marker
11 | !
12 | !
13 | logging buffered 16384
14 | !
15 | end
16 | !'''
17 |
18 | three_level = '''!
19 | policy-map QOS_CATEGORIES
20 | class QOS_VOICE_RTP
21 | priority percent 20
22 | set ip dscp ef
23 | class QOS_ROUTING
24 | bandwidth percent 1
25 | set ip dscp cs6
26 | class QOS_MGMT
27 | bandwidth percent 1
28 | set ip dscp cs5
29 | class QOS_APPS
30 | bandwidth percent 40
31 | set ip dscp af41
32 | class QOS_VIDEO_RTP
33 | bandwidth percent 25
34 | set ip dscp af31
35 | class QOS_SIGNALLING
36 | bandwidth percent 5
37 | set ip dscp af31
38 | class class-default
39 | set ip dscp default
40 | fair-queue
41 | random-detect
42 | !
43 | end
44 | !'''
45 |
46 |
47 | class TestConfToDict(unittest.TestCase):
48 |
49 | def setUp(self):
50 | from ..conftodict import ConfToDict
51 | self.c = ConfToDict('tests/test.txt', from_file=True)
52 |
53 | def test_constructor_with_config_as_string_builds_a_list_of_config(self):
54 | from ..conftodict import ConfToDict
55 | self.sc = ConfToDict(config)
56 | self.assertIsInstance(self.sc.config, list)
57 |
58 | def test_initialization_with_correct_file_builds_a_list_of_config(self):
59 | self.assertIsInstance(self.c.config, list)
60 |
61 | def test_initialization_with_non_existent_file_raises_file_not_found_error(self):
62 | from ..conftodict import ConfToDict
63 | self.assertRaises(FileNotFoundError, ConfToDict, 'tests/no_file.txt', from_file=True)
64 |
65 | def test_no_elements_in_config_list_from_file_startswith_comments_or_new_line_chars(self):
66 | for i in self.c.config:
67 | self.assertIsNot(i, (i.startswith('!') or i.startswith(' !\n') or i.startswith('\n')))
68 |
69 | def test_no_elements_in_config_list_from_string_startswith_comments_or_new_line_chars(self):
70 | from ..conftodict import ConfToDict
71 | self.sc = ConfToDict(config)
72 | for i in self.sc.config:
73 | self.assertIsNot(i, (i.startswith('!') or i == ' !' or i == ''))
74 |
75 | def test_three_level_hierarchy_contains_dict_for_second_level(self):
76 | from ..conftodict import ConfToDict
77 | self.three_level = ConfToDict(three_level)
78 | conf_dict = self.three_level.to_dict()
79 |
80 | self.assertIsInstance(conf_dict['policy-map QOS_CATEGORIES'], dict)
81 |
82 |
--------------------------------------------------------------------------------