import csv import os import re import datetime import argparse from logger import * from datetime import datetime parse = argparse.ArgumentParser( description="Программа для сбора информации из csv файлов") parse.add_argument('-p', '--path', help='Указать в какой директории искать', default=os.path.dirname(__file__)) parse.add_argument('-e', '--encoding', help='Указать в какой кодировке сохранять', default='utf-8') parse.add_argument('-s', '--open_encoding', help='Указать в какой кодировке открывать', default='utf-16') args = parse.parse_args() print(args) # DIR_WORK = "./sbor" LIST_BAD_ADAPTER = ['Wireless', 'Bluetooth', 'Wireless', 'WiFi', 'Kaspersky', 'VirtualBox', 'TAP-Windows', 'Wintun', '802.11', 'VMware', 'VPN', 'Wi-Fi', '1394', 'Mobile'] # Количетсво интерфейсов по умолчанию COUNT_INTERFACE = 1 def check_correct_controller(name) -> bool: return any(ext not in name for ext in LIST_BAD_ADAPTER) class ObjectReady: def get_len_dict(self) -> int: return len(self.__dict__) def get_csv_row(self) -> str: if self.get_len_dict() < 11: return ';'.join((self.frame, self.cabinet)) dic = self.__dict__ try: row_interface = ';'.join( [';'.join((dic.get(F"ip{i}"), dic.get(F"mac{i}"))) for i in range(self.count_interface) ]) return ';'.join((str(dic.get("frame")), str(dic.get("cabinet")), str(dic.get("os")), str( dic.get("motherboard")), dic.get("cpu"), str(dic.get("ram")), row_interface))+'\n' except AttributeError: return ';'.join((self.frame, self.cabinet))+"\n" def get_paths() -> list: list_path = [] for root, _, files in os.walk(args.path): list_path += [ F"{root}/{file}" for file in files if file.split('.')[-1] == 'csv' and "result" not in file] return list_path def convert_mb_to_gb(val: str) -> str: numbers = int(''.join([x for x in val if x.isdigit()])) return str(round(numbers/1024, 1))+' GB' def get_ser_motherboard(row: str) -> str: if len(row) > 0: if row[6] not in ['To be filled by O.E.M.', 'Default string']: return row[6] else: return None else: return None def get_data_from_file(path: str, obj: ObjectReady) -> None: global COUNT_INTERFACE with open(path, 'r', encoding=args.open_encoding) as file: cs = csv.reader(file, delimiter=',') next(cs) line_info_computers = next(cs) obj.os = line_info_computers[7] obj.cpu = line_info_computers[13] obj.ram = convert_mb_to_gb(line_info_computers[14]) obj.ip1 = None obj.mac1 = None count_interface = 0 for x in cs: if x[0] == '6200': obj.motherboard = get_ser_motherboard(x) if x[0] == '2600' and len(x) > 2 and check_correct_controller(x[3]): setattr(obj, F'ip{count_interface}', x[6].split(' ')[0]) setattr(obj, F'mac{count_interface}', x[-3]) count_interface += 1 # Увеличиваем значение если количестов интерфейсов больше в этой строке obj.count_interface = count_interface if count_interface > COUNT_INTERFACE: COUNT_INTERFACE = count_interface file.close() def get_ready_information() -> list[ObjectReady]: list_objects = [] for path in get_paths(): obj = ObjectReady() obj.frame = path.split('/')[-2] obj.cabinet = re.findall( r"\/([\w+?\ ?[а-яА-Я]+\ ?|\w+?\ ?[a-zA-Z]+\ ?|\d+])[\.|\,]", path)[-1] try: get_data_from_file(path, obj) except UnicodeDecodeError as ude: logger.error(F"{path} --> {ude}\n") except UnicodeError as er: logger.error(F"{path} --> {er}\n") except StopIteration as si: logger.error(F"{path} --> Пустой файл или тмпо того\n") list_objects.append(obj) return list_objects def create_csv(list_obj: list[ObjectReady]) -> None: namefile = F"result-{datetime.today().strftime('%Y-%m-%d-%H.%M.%S')}" with open(F"{namefile}.csv", 'w', newline='', encoding=args.encoding) as f: header_csv = F"frame;cabinet;os;motherboard;cpu;ram{''.join([F';ip{i+1};mac{i+1}' for i in range(COUNT_INTERFACE)])}\n" f.write(header_csv) for obj in list_obj: f.write(obj.get_csv_row()) if __name__ == '__main__': create_logger() create_csv(get_ready_information())