From ef08be4a7a0f9864d59843be68ce267bb94aa150 Mon Sep 17 00:00:00 2001 From: ege Date: Wed, 27 Oct 2021 00:42:35 +0300 Subject: [PATCH] Improved scan results regex pattern. Closes #1 --- .gitignore | 3 +++ CHANGELOG.md | 10 ++++++++++ airport/_constants.py | 3 +++ airport/_utils.py | 34 +++++++++++++++++++--------------- setup.py | 2 +- 5 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 airport/_constants.py diff --git a/.gitignore b/.gitignore index 527c846..e68b3f2 100755 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ var/ # Others .DS_Store + +# Generated +.idea \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e6e795b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +## [0.1.1] - 2021-10-27 +### Added +- CHANGELOG file. + +### Changed +- Improved scan result pattern matching. + +[0.0.1]: https://github.com/egemenyildiz/airport-py/releases/tag/v0.1.1 diff --git a/airport/_constants.py b/airport/_constants.py new file mode 100644 index 0000000..d4cf8c7 --- /dev/null +++ b/airport/_constants.py @@ -0,0 +1,3 @@ +SCAN_RESULTS_GROUPED_PATTERN = (r'(?P.+)\s+(?P([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2}))\s+(?P[0-9+\- ' + r']{1,4})\s+(?P[0-9,\-+]{1,6})\s+(?P[YN])\s+(' + r'?P[A-Z\-]{2,3})\s+(?P.+)$') diff --git a/airport/_utils.py b/airport/_utils.py index 65e6157..5fcc607 100644 --- a/airport/_utils.py +++ b/airport/_utils.py @@ -1,7 +1,10 @@ +import logging import subprocess import re import _datatypes as datatypes -import os +import os + +from airport._constants import SCAN_RESULTS_GROUPED_PATTERN AIRPORT_PATH = [os.environ.get( 'AIRPORT_PATH', @@ -16,24 +19,24 @@ def call_cmd(*args): return out -def split_lines(lines, start=0): - return lines.split('\n')[start:] +def split_lines(lines, start=0, remove_empty_lines=True): + split = lines.split('\n')[start:] + if remove_empty_lines: + return filter(None, split) + return split def reformat_scan_results(results): - def reformat_scan_result_line(result): - try: - result = re.split('\s+', result) - node_args = (result[1:5] + [True if result[5] == 'Y' else False, ] + - [result[6] if result[6] != '--' else None] + - [' '.join(result[7:]).strip()]) - except IndexError: - pass - else: - return datatypes.NodeResult(*node_args) + def clean_line(result): + matches = re.match(re.compile(SCAN_RESULTS_GROUPED_PATTERN, re.IGNORECASE), result) + if matches: + cleaned_node = {k: v.strip() for k, v in matches.groupdict().items()} + return datatypes.NodeResult(**cleaned_node) + logging.error('Parse error: {}'.format(result)) - results_in_lines = split_lines(results, start=1) - return filter(None, map(reformat_scan_result_line, results_in_lines)) + lines = split_lines(results, start=1) + cleaned = filter(None, map(clean_line, lines)) + return cleaned def reformat_info_result(result): @@ -45,5 +48,6 @@ def reformat_info_result_line(line): info_args = map(reformat_info_result_line, results_in_lines) return datatypes.InfoResult(*info_args) + def build_airport_cmd(params): return AIRPORT_PATH + params diff --git a/setup.py b/setup.py index af0e82d..432a7bf 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ setup( name='airport-py', - version='0.1.0', + version='0.1.1', description='Mac OS X airport command result parser', long_description=readme, author='Egemen Yildiz',