From bb70cdefb7a1c884a4b197288cc5e24f539135a2 Mon Sep 17 00:00:00 2001 From: bilalekrem Date: Fri, 30 Oct 2020 16:19:52 +0300 Subject: [PATCH] module name changed to windowsdnsserver-py - package name renamed to windowsdnsserver-py - more pythonic naming style - fix is_dns_server_module_installed --- CHANGELOG.md | 10 +++ Makefile | 12 +++- README.md | 10 +-- microsoftdnsserver/dns/base.py | 25 -------- setup.py | 8 +-- tests/test_dns_server.py | 16 ++--- tests/test_dns_server_utils.py | 54 ++++++++-------- tests/test_records.py | 14 ++--- .../__init__.py | 0 .../command_runner/__init__.py | 0 .../command_runner/powershell_runner.py | 28 ++++----- .../command_runner/runner.py | 4 +- .../dns/__init__.py | 0 windowsdnsserver/dns/base.py | 25 ++++++++ .../dns/dnsserver.py | 53 ++++++++-------- .../dns/record.py | 4 +- .../exception/__init__.py | 0 .../exception/exception_common.py | 0 .../util/__init__.py | 0 .../util/dns_server_utils.py | 61 ++++++++++--------- .../util/logger.py | 4 +- 21 files changed, 179 insertions(+), 149 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 microsoftdnsserver/dns/base.py rename {microsoftdnsserver => windowsdnsserver}/__init__.py (100%) rename {microsoftdnsserver => windowsdnsserver}/command_runner/__init__.py (100%) rename {microsoftdnsserver => windowsdnsserver}/command_runner/powershell_runner.py (67%) rename {microsoftdnsserver => windowsdnsserver}/command_runner/runner.py (76%) rename {microsoftdnsserver => windowsdnsserver}/dns/__init__.py (100%) create mode 100644 windowsdnsserver/dns/base.py rename {microsoftdnsserver => windowsdnsserver}/dns/dnsserver.py (63%) rename {microsoftdnsserver => windowsdnsserver}/dns/record.py (79%) rename {microsoftdnsserver => windowsdnsserver}/exception/__init__.py (100%) rename {microsoftdnsserver => windowsdnsserver}/exception/exception_common.py (100%) rename {microsoftdnsserver => windowsdnsserver}/util/__init__.py (100%) rename {microsoftdnsserver => windowsdnsserver}/util/dns_server_utils.py (52%) rename {microsoftdnsserver => windowsdnsserver}/util/logger.py (78%) diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dea11fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +## windowsdnsserver-py changelog + +### version 0.0.1 + +- DnsService implementation with PowerShell DNSServerModule +- DnsService supports only TXT and A records for now +- wrapper class to execute PowerShell commands on server -- PowerShellRunner +- this version of module can be used as python library +- implemented with pythonic naming style (underscores, lowercase words and etc.)`` +- unit tests are written for current implementation \ No newline at end of file diff --git a/Makefile b/Makefile index 589ece1..98daa08 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,19 @@ endif twine = ${python} -m twine pip = ${python} -m pip -upload: build +install-local: build-module + ${pip} uninstall windowsdnsserver-py + ${pip} install windowsdnsserver-py --no-index --find-links dist/ + +upload: build-module @${twine} upload dist/* -r testpypi -build: +upload-prod: build-module + @${twine} upload dist/* -r pypi + +build-module: rm -rf build rm -rf dist ${python} setup.py sdist ${python} setup.py bdist_wheel + - \ No newline at end of file diff --git a/README.md b/README.md index 38b332c..18d4bb7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## microsoftdnsserver-py +## windowsdnsserver-py -microsoftdnsserver-py is a wrapper Python library for [DnsServer](https://docs.microsoft.com/en-us/powershell/module/dnsserver/?view=win10-ps) module. +windowsdnsserver-py is a wrapper Python library for [DnsServer](https://docs.microsoft.com/en-us/powershell/module/dnsserver/?view=win10-ps) module. Subprocess module is used to perform process calls to interact with DnsServer module. @@ -12,9 +12,11 @@ Subprocess module is used to perform process calls to interact with DnsServer mo ## Installation ```shell +pip install windowsdnserver-py ``` ## Limitations - - Libray is not able to work remotely, currently, it is able to call DnsServer module on localhost. + - Python 3 supported, but Python 2 is not tested + - This library is not able to work remotely, currently, it is merely able to call DnsServer module on localhost. Since, the remote session feature is not on the table, the software that uses this module - must be installed on windows server where Microsoft Dns Server is located. + must be installed on windows server where Windows Server/Dns Server is located. diff --git a/microsoftdnsserver/dns/base.py b/microsoftdnsserver/dns/base.py deleted file mode 100644 index 54ceb18..0000000 --- a/microsoftdnsserver/dns/base.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import List - -from microsoftdnsserver.dns.record import Record, RecordType -from microsoftdnsserver.exception.exception_common import MethodNotImplementedError - - -class DNSService(object): - - def __init__(self): - pass - - def getDNSRecords(self, zone: str, name: str, recordType: RecordType) -> List[Record]: - raise MethodNotImplementedError() - - def addARecord(self, zone: str, name: str, ip: str, ttl: str) -> bool: - raise MethodNotImplementedError() - - def removeARecord(self, zone: str, name: str) -> bool: - raise MethodNotImplementedError() - - def addTxtRecord(self, zone: str, name: str, content, ttl: str) -> bool: - raise MethodNotImplementedError() - - def removeTxtRecord(self, zone: str, name: str) -> bool: - raise MethodNotImplementedError() \ No newline at end of file diff --git a/setup.py b/setup.py index 7d0b5aa..5bd5fee 100644 --- a/setup.py +++ b/setup.py @@ -4,14 +4,14 @@ long_description = fd.read() setuptools.setup( - name="microsoftdnsserver-py", - version="0.0.1", + name="windowsdnsserver-py", + version="0.0.1-dev1", author="Bilal Ekrem Harmansa", author_email="bilalekremharmansa@gmail.com", - description="wrapper Python library for DnsServer module", + description="wrapper Python library for Windows Server DnsServer module", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/bilalekremharmansa/microsoftdnsserver-py", + url="https://github.com/bilalekremharmansa/windowsdnsserver-py", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", diff --git a/tests/test_dns_server.py b/tests/test_dns_server.py index e9768b1..130c402 100644 --- a/tests/test_dns_server.py +++ b/tests/test_dns_server.py @@ -1,8 +1,8 @@ import unittest -from microsoftdnsserver.dns.dnsserver import DnsServerModule -from microsoftdnsserver.dns.record import RecordType +from windowsdnsserver.dns.dnsserver import DnsServerModule +from windowsdnsserver.dns.record import RecordType class TestDnsServer(unittest.TestCase): @@ -14,29 +14,29 @@ def setUp(self): self.test_dns_name = "www" def test_get_dns_records(self): - success = self.dns.addARecord(self.test_dns_zone, self.test_dns_name, "100.100.100.100") + success = self.dns.add_a_record(self.test_dns_zone, self.test_dns_name, "100.100.100.100") self.assertTrue(success, "failed while adding test record") - records = self.dns.getDNSRecords(self.test_dns_zone, self.test_dns_name, RecordType.A) + records = self.dns.get_dns_records(self.test_dns_zone, self.test_dns_name, RecordType.A) self.assertGreater(len(records), 0) for record in records: self.assertEqual(record.type, RecordType.A) - self.dns.removeARecord(self.test_dns_zone, self.test_dns_name) + self.dns.remove_a_record(self.test_dns_zone, self.test_dns_name) def test_add_record_a(self): ip_addr = "10.0.0.99" - success = self.dns.addARecord(self.test_dns_zone, self.test_dns_name, ip_addr) + success = self.dns.add_a_record(self.test_dns_zone, self.test_dns_name, ip_addr) self.assertTrue(success) def test_add_record_txt(self): txt = "my test record" - success = self.dns.addTxtRecord(self.test_dns_zone, self.test_dns_name, txt) + success = self.dns.add_txt_record(self.test_dns_zone, self.test_dns_name, txt) self.assertTrue(success) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/tests/test_dns_server_utils.py b/tests/test_dns_server_utils.py index 138004e..3eacbcd 100644 --- a/tests/test_dns_server_utils.py +++ b/tests/test_dns_server_utils.py @@ -3,10 +3,10 @@ from unittest.mock import patch -from microsoftdnsserver.command_runner.runner import Result -from microsoftdnsserver.dns.dnsserver import DnsServerModule -from microsoftdnsserver.dns.record import RecordType -from microsoftdnsserver.util.dns_server_utils import parseTtl, formatTtl +from windowsdnsserver.command_runner.runner import Result +from windowsdnsserver.dns.dnsserver import DnsServerModule +from windowsdnsserver.dns.record import RecordType +from windowsdnsserver.util.dns_server_utils import parse_ttl, format_ttl class TestDnsServerUtils(unittest.TestCase): @@ -14,11 +14,11 @@ class TestDnsServerUtils(unittest.TestCase): def test_convert_dns_server(self): mock_data = self.load_mock_data() - with patch('microsoftdnsserver.dns.dnsserver.DnsServerModule.run') as mock: + with patch('windowsdnsserver.dns.dnsserver.DnsServerModule.run') as mock: mock.return_value = Result(True, 0, mock_data['GetDnsServerResponse1'], '') dns = DnsServerModule() - results = dns.getDNSRecords("zone") + results = dns.get_dns_records("zone") print(results) self.assertEqual(len(results), 1) @@ -39,48 +39,48 @@ def mock_time_to_live(h, m, s): mock['Seconds'] = s return mock - self.assertEqual(parseTtl(mock_time_to_live(1, 23, 50)), '1h 23m 50s') + self.assertEqual(parse_ttl(mock_time_to_live(1, 23, 50)), '1h 23m 50s') - self.assertEqual(parseTtl(mock_time_to_live(0, 23, 50)), '23m 50s') - self.assertEqual(parseTtl(mock_time_to_live(1, 0, 50)), '1h 50s') - self.assertEqual(parseTtl(mock_time_to_live(1, 23, 0)), '1h 23m') - self.assertEqual(parseTtl(mock_time_to_live(1, 50, 2)), '1h 50m 2s') + self.assertEqual(parse_ttl(mock_time_to_live(0, 23, 50)), '23m 50s') + self.assertEqual(parse_ttl(mock_time_to_live(1, 0, 50)), '1h 50s') + self.assertEqual(parse_ttl(mock_time_to_live(1, 23, 0)), '1h 23m') + self.assertEqual(parse_ttl(mock_time_to_live(1, 50, 2)), '1h 50m 2s') def test_format_ttl(self): - self.assertEqual(formatTtl('10h 20m 30s'), '10:20:30') - self.assertEqual(formatTtl('10h 30s'), '10:00:30') - self.assertEqual(formatTtl('30s'), '00:00:30') - self.assertEqual(formatTtl('20m 10h 30s'), '10:20:30') - self.assertEqual(formatTtl('0s 10h 20m'), '10:20:00') + self.assertEqual(format_ttl('10h 20m 30s'), '10:20:30') + self.assertEqual(format_ttl('10h 30s'), '10:00:30') + self.assertEqual(format_ttl('30s'), '00:00:30') + self.assertEqual(format_ttl('20m 10h 30s'), '10:20:30') + self.assertEqual(format_ttl('0s 10h 20m'), '10:20:00') with self.assertRaisesRegex(Exception, 'time unit could not be determined'): - formatTtl('10n') + format_ttl('10n') with self.assertRaisesRegex(AssertionError, "empty ttl value"): - formatTtl('') + format_ttl('') with self.assertRaises(AssertionError): - formatTtl(111) + format_ttl(111) with self.assertRaises(Exception): - formatTtl('10h 20m 30') + format_ttl('10h 20m 30') with self.assertRaises(Exception): - formatTtl('10h 20') + format_ttl('10h 20') with self.assertRaises(Exception): - formatTtl('0h 0m 0s') + format_ttl('0h 0m 0s') - self.assertEqual(formatTtl('0h 0m 1s'), '00:00:01') + self.assertEqual(format_ttl('0h 0m 1s'), '00:00:01') with self.assertRaisesRegex(AssertionError, 'hour can not be more than'): - formatTtl('25h') + format_ttl('25h') with self.assertRaisesRegex(AssertionError, 'minute can not be more than'): - formatTtl('90m') + format_ttl('90m') with self.assertRaisesRegex(AssertionError, 'seconds can not be more than'): - formatTtl('100s') + format_ttl('100s') def load_mock_data(self): fd = open('/tests/mock_data.json') @@ -90,4 +90,4 @@ def load_mock_data(self): if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/tests/test_records.py b/tests/test_records.py index 5136b0e..8e78c98 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -1,17 +1,17 @@ import unittest -from microsoftdnsserver.dns.record import RecordType -from microsoftdnsserver.util import dns_server_utils +from windowsdnsserver.dns.record import RecordType +from windowsdnsserver.util import dns_server_utils class TestRecords(unittest.TestCase): def test_supported_record_types(self): - self.assertTrue(dns_server_utils.isRecordTypeSupported('A')) - self.assertTrue(dns_server_utils.isRecordTypeSupported('Txt')) + self.assertTrue(dns_server_utils.is_record_type_supported('A')) + self.assertTrue(dns_server_utils.is_record_type_supported('Txt')) - self.assertFalse(dns_server_utils.isRecordTypeSupported('SOA')) - self.assertFalse(dns_server_utils.isRecordTypeSupported('TXT')) + self.assertFalse(dns_server_utils.is_record_type_supported('SOA')) + self.assertFalse(dns_server_utils.is_record_type_supported('TXT')) def test_record_type_value_of(self): record_type_a = RecordType.value_of('A') @@ -24,4 +24,4 @@ def test_record_type_value_of(self): if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/microsoftdnsserver/__init__.py b/windowsdnsserver/__init__.py similarity index 100% rename from microsoftdnsserver/__init__.py rename to windowsdnsserver/__init__.py diff --git a/microsoftdnsserver/command_runner/__init__.py b/windowsdnsserver/command_runner/__init__.py similarity index 100% rename from microsoftdnsserver/command_runner/__init__.py rename to windowsdnsserver/command_runner/__init__.py diff --git a/microsoftdnsserver/command_runner/powershell_runner.py b/windowsdnsserver/command_runner/powershell_runner.py similarity index 67% rename from microsoftdnsserver/command_runner/powershell_runner.py rename to windowsdnsserver/command_runner/powershell_runner.py index bd9c2b7..bb933ab 100644 --- a/microsoftdnsserver/command_runner/powershell_runner.py +++ b/windowsdnsserver/command_runner/powershell_runner.py @@ -1,10 +1,11 @@ import subprocess +import sys from .runner import Command, CommandRunner, Result from ..util import logger -DEFAULT_POWERSHELL_EXE_PATH = "C:\Windows\syswow64\WindowsPowerShell\\v1.0\powershell.exe" +DEFAULT_POWER_SHELL_EXE_PATH = "C:\Windows\syswow64\WindowsPowerShell\\v1.0\powershell.exe" class PowerShellCommand(Command): @@ -16,7 +17,7 @@ def __init__(self, cmdlet: str, *flags, **args): self.flags = flags self.args = args - def prepareCommand(self): + def build(self): cmd = [self.cmdlet] # add flags, ie -Force @@ -33,24 +34,21 @@ def prepareCommand(self): return cmd - def _postProcessResult(self): - pass - class PowerShellRunner(CommandRunner): - def __init__(self, powerShellPath: str = None): - self.logger = logger.createLogger("PowerShellRunner") + def __init__(self, power_shell_path: str = None): + self.logger = logger.create_logger("PowerShellRunner") - self.powerShellPath = powerShellPath - if powerShellPath is None: - self.powerShellPath = DEFAULT_POWERSHELL_EXE_PATH + self.power_shell_path = power_shell_path + if power_shell_path is None: + self.power_shell_path = DEFAULT_POWER_SHELL_EXE_PATH def run(self, command: PowerShellCommand) -> Result: assert isinstance(command, PowerShellCommand) - cmd = command.prepareCommand() - cmd.insert(0, self.powerShellPath) + cmd = command.build() + cmd.insert(0, self.power_shell_path) self.logger.debug("Running: [%s]" % ' '.join(cmd)) @@ -63,8 +61,10 @@ def run(self, command: PowerShellCommand) -> Result: finally: pass - out = out.decode('utf-8') - err = err.decode('utf-8') + self.logger.debug('using default encoding: [%s]' % sys.stdout.encoding) + + out = out.decode(sys.stdout.encoding, 'replace') + err = err.decode(sys.stdout.encoding, 'replace') self.logger.debug("Returned: \n\tout:[%s], \n\terr:[%s]" % (out, err)) diff --git a/microsoftdnsserver/command_runner/runner.py b/windowsdnsserver/command_runner/runner.py similarity index 76% rename from microsoftdnsserver/command_runner/runner.py rename to windowsdnsserver/command_runner/runner.py index b4e6c96..eaa595a 100644 --- a/microsoftdnsserver/command_runner/runner.py +++ b/windowsdnsserver/command_runner/runner.py @@ -1,9 +1,9 @@ -from microsoftdnsserver.exception.exception_common import MethodNotImplementedError +from windowsdnsserver.exception.exception_common import MethodNotImplementedError class Command(object): - def prepareCommand(self): + def build(self): raise MethodNotImplementedError() diff --git a/microsoftdnsserver/dns/__init__.py b/windowsdnsserver/dns/__init__.py similarity index 100% rename from microsoftdnsserver/dns/__init__.py rename to windowsdnsserver/dns/__init__.py diff --git a/windowsdnsserver/dns/base.py b/windowsdnsserver/dns/base.py new file mode 100644 index 0000000..3be91b1 --- /dev/null +++ b/windowsdnsserver/dns/base.py @@ -0,0 +1,25 @@ +from typing import List + +from windowsdnsserver.dns.record import Record, RecordType +from windowsdnsserver.exception.exception_common import MethodNotImplementedError + + +class DNSService(object): + + def __init__(self): + pass + + def get_dns_records(self, zone: str, name: str, record_type: RecordType) -> List[Record]: + raise MethodNotImplementedError() + + def add_a_record(self, zone: str, name: str, ip: str, ttl: str) -> bool: + raise MethodNotImplementedError() + + def remove_a_record(self, zone: str, name: str) -> bool: + raise MethodNotImplementedError() + + def add_txt_record(self, zone: str, name: str, content, ttl: str) -> bool: + raise MethodNotImplementedError() + + def remove_txt_record(self, zone: str, name: str) -> bool: + raise MethodNotImplementedError() diff --git a/microsoftdnsserver/dns/dnsserver.py b/windowsdnsserver/dns/dnsserver.py similarity index 63% rename from microsoftdnsserver/dns/dnsserver.py rename to windowsdnsserver/dns/dnsserver.py index b73ab4c..e3bf917 100644 --- a/microsoftdnsserver/dns/dnsserver.py +++ b/windowsdnsserver/dns/dnsserver.py @@ -1,9 +1,11 @@ import json +import platform +from typing import List -from microsoftdnsserver.command_runner.runner import Command, CommandRunner -from microsoftdnsserver.command_runner.powershell_runner import PowerShellCommand, PowerShellRunner +from windowsdnsserver.command_runner.runner import Command, CommandRunner +from windowsdnsserver.command_runner.powershell_runner import PowerShellCommand, PowerShellRunner from .base import DNSService -from .record import RecordType +from .record import RecordType, Record from ..util import dns_server_utils, logger @@ -16,13 +18,16 @@ class DnsServerModule(DNSService): def __init__(self, runner: CommandRunner = None): super().__init__() + + assert platform.system() == 'Windows', "DnsServerModule can run only on a Windows Server" + self.runner = runner if runner is None: self.runner = PowerShellRunner() - self.logger = logger.createLogger("DnsServer") + self.logger = logger.create_logger("DnsServer") - def getDNSRecords(self, zone: str, name: str = None, recordType: RecordType = None): + def get_dns_records(self, zone: str, name: str = None, record_type: RecordType = None) -> List[Record]: """ uses Get-DnsServerResourceRecord cmdlet to get records in a zone """ args = { @@ -31,16 +36,16 @@ def getDNSRecords(self, zone: str, name: str = None, recordType: RecordType = No if name: args['Name'] = name - if recordType: - args['RRType'] = recordType.value + if record_type: + args['RRType'] = record_type.value command = PowerShellCommand('Get-DnsServerResourceRecord', **args) result = self.run(command) - jsonResult = json.loads(result.out) - return dns_server_utils.formatDnsServerResult(zone, jsonResult) + json_result = json.loads(result.out) + return dns_server_utils.transform_dns_server_result(zone, json_result) - def addARecord(self, zone: str, name: str, ip: str, ttl: str = '1h'): + def add_a_record(self, zone: str, name: str, ip: str, ttl: str = '1h') -> bool: """ uses Add-DnsServerResourceRecordA cmdlet to add a resource in a zone """ command = PowerShellCommand( @@ -49,13 +54,13 @@ def addARecord(self, zone: str, name: str, ip: str, ttl: str = '1h'): ZoneName=zone, Name=name, IPv4Address=ip, - TimeToLive=dns_server_utils.formatTtl(ttl) + TimeToLive=dns_server_utils.format_ttl(ttl) ) result = self.run(command) return result.success - def removeARecord(self, zone: str, name: str): + def remove_a_record(self, zone: str, name: str) -> bool: """ uses Remove-DnsServerResourceRecord cmdlet to remove a record in a zone """ args = { @@ -70,28 +75,28 @@ def removeARecord(self, zone: str, name: str): command = PowerShellCommand('Remove-DnsServerResourceRecord', *flags, **args) result = self.run(command) - return result + return result.success # --- - def addTxtRecord(self, zone: str, name: str, content: str, ttl: str = '1h'): + def add_txt_record(self, zone: str, name: str, content, ttl: str = '1h') -> bool: """ uses Add-DnsServerResourceRecord cmdlet to add txt resource in a zone """ command = PowerShellCommand( 'Add-DnsServerResourceRecord', 'AllowUpdateAny', - 'Txt', + 'Txt', ZoneName=zone, Name=name, DescriptiveText=content, - TimeToLive=dns_server_utils.formatTtl(ttl) + TimeToLive=dns_server_utils.format_ttl(ttl) ) result = self.run(command) return result.success - def removeTxtRecord(self, zone: str, name: str): + def remove_txt_record(self, zone: str, name: str) -> bool: """ uses Remove-DnsServerResourceRecord cmdlet to remove txt record in a zone """ args = { @@ -110,16 +115,16 @@ def removeTxtRecord(self, zone: str, name: str): # -- + def is_dns_server_module_installed(self): + command = PowerShellCommand('Get-Module DNSServer', 'ListAvailable') + result = self.run(command) + + return result.success and len(result.out) > 0 + def run(self, command: Command): result = self.runner.run(command) if not result.success: - self.logger.error("Command failed [%s]" % command.prepareCommand()) + self.logger.error("Command failed [%s]" % command.build()) return result - - def isDnsServerModuleInstalled(self): - cmdlet = "Get-Module DNSServer -ListAvailable" - result = self.runner.run(cmdlet) - - return result.success and len(result.out) > 0 diff --git a/microsoftdnsserver/dns/record.py b/windowsdnsserver/dns/record.py similarity index 79% rename from microsoftdnsserver/dns/record.py rename to windowsdnsserver/dns/record.py index 03fdda6..2d2795b 100644 --- a/microsoftdnsserver/dns/record.py +++ b/windowsdnsserver/dns/record.py @@ -16,10 +16,10 @@ def value_of(value): class Record(object): - def __init__(self, zone: str, name: str, recordType: RecordType, content: str, ttl: str = '1h'): + def __init__(self, zone: str, name: str, record_type: RecordType, content: str, ttl: str = '1h'): self.zone = zone self.name = name - self.type = recordType + self.type = record_type self.content = content self.ttl = ttl diff --git a/microsoftdnsserver/exception/__init__.py b/windowsdnsserver/exception/__init__.py similarity index 100% rename from microsoftdnsserver/exception/__init__.py rename to windowsdnsserver/exception/__init__.py diff --git a/microsoftdnsserver/exception/exception_common.py b/windowsdnsserver/exception/exception_common.py similarity index 100% rename from microsoftdnsserver/exception/exception_common.py rename to windowsdnsserver/exception/exception_common.py diff --git a/microsoftdnsserver/util/__init__.py b/windowsdnsserver/util/__init__.py similarity index 100% rename from microsoftdnsserver/util/__init__.py rename to windowsdnsserver/util/__init__.py diff --git a/microsoftdnsserver/util/dns_server_utils.py b/windowsdnsserver/util/dns_server_utils.py similarity index 52% rename from microsoftdnsserver/util/dns_server_utils.py rename to windowsdnsserver/util/dns_server_utils.py index e70bccd..e57c38f 100644 --- a/microsoftdnsserver/util/dns_server_utils.py +++ b/windowsdnsserver/util/dns_server_utils.py @@ -3,9 +3,9 @@ from ..dns.record import Record, RecordType -def formatTtl(ttl): +def format_ttl(ttl): """ - formatTtl converts given ttl string to Windows-DnsServer module's + format_ttl converts given ttl string to Windows-DnsServer module's time to live format. "1h" -> 01:00:00 # a hour @@ -19,7 +19,7 @@ def formatTtl(ttl): At least one time unit must be provided :param ttl: time to live - :return: formatted time to live string for Windows-DnsServer module + :return: formatted time to live for Windows-DnsServer module """ assert isinstance(ttl, str) assert len(ttl) > 0, "empty ttl value" @@ -52,10 +52,15 @@ def formatTtl(ttl): return '%02d:%02d:%02d' % (hour, minute, seconds) -def parseTtl(timeToLive): - hours = timeToLive['Hours'] - minutes = timeToLive['Minutes'] - seconds = timeToLive['Seconds'] +def parse_ttl(time_to_live): + """ + + :param time_to_live: DnsServer module's TimeToLive object + :return: Windows DNS Server ttl format + """ + hours = time_to_live['Hours'] + minutes = time_to_live['Minutes'] + seconds = time_to_live['Seconds'] ttl_str = '' if hours: @@ -70,39 +75,39 @@ def parseTtl(timeToLive): return ttl_str[:-1] -def isRecordTypeSupported(recordType): +def is_record_type_supported(recordType): return recordType in RecordType.list() -def formatDnsServerResult(zone, cmdletResults): - if not isinstance(cmdletResults, list): - cmdletResults = [cmdletResults] +def transform_dns_server_result(zone, cmdlet_results): + if not isinstance(cmdlet_results, list): + cmdlet_results = [cmdlet_results] - recordResults = [] - for result in cmdletResults: + record_results = [] + for result in cmdlet_results: name = result['HostName'] - recordType = result['RecordType'] + record_type = result['RecordType'] - if not isRecordTypeSupported(recordType): + if not is_record_type_supported(record_type): continue - recordDataProperties = result['RecordData']['CimInstanceProperties'] + record_data_props = result['RecordData']['CimInstanceProperties'] - recordData = dict() - if isinstance(recordDataProperties, str): - key, value = recordDataProperties.split('=') - # value's has at begin and end, remove it - recordData[key.strip()] = value[1:-1] + record_data = dict() + if isinstance(record_data_props, str): + key, value = record_data_props.split('=') + # value's has quotes at beginning and end of value -- remove it + record_data[key.strip()] = value[1:-1] else: - for props in recordDataProperties: + for props in record_data_props: key, value = props.split('=') - recordData[key.strip()] = value + record_data[key.strip()] = value - assert len(recordData) < 2, "Unexpected data, expected only one record data property, actual: [%s]" % recordData + assert len(record_data) < 2, "Unexpected data record, expected only one property, actual: [%s]" % record_data - content = next(iter(recordData.values())) - ttl = parseTtl(result['TimeToLive']) + content = next(iter(record_data.values())) + ttl = parse_ttl(result['TimeToLive']) - recordResults.append(Record(zone, name, RecordType.value_of(recordType), content, ttl)) + record_results.append(Record(zone, name, RecordType.value_of(record_type), content, ttl)) - return recordResults + return record_results diff --git a/microsoftdnsserver/util/logger.py b/windowsdnsserver/util/logger.py similarity index 78% rename from microsoftdnsserver/util/logger.py rename to windowsdnsserver/util/logger.py index 3592b68..45c8090 100644 --- a/microsoftdnsserver/util/logger.py +++ b/windowsdnsserver/util/logger.py @@ -1,13 +1,13 @@ import logging -def createLogger(name): +def create_logger(name, level=logging.INFO): handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger = logging.getLogger(name) logger.addHandler(handler) - logger.setLevel(logging.DEBUG) + logger.setLevel(level) return logger