2 Commity 9871ca8ad4 ... 26c910f972

Autor SHA1 Wiadomość Data
  Alex Sidorov 26c910f972 change format created file 1 rok temu
  AlexSidorov 9871ca8ad4 fix bug with argument 1 rok temu
3 zmienionych plików z 44 dodań i 103 usunięć
  1. 0 1
      compile.bat
  2. BIN
      favorite.ico
  3. 44 102
      main.py

+ 0 - 1
compile.bat

@@ -1 +0,0 @@
-nuitka --onefile --product-version=0.3 --product-name=InfromationCollector --company-name=KBSU --windows-icon-from-ico=favorite.ico --output-filename=InformationCollector main.py

BIN
favorite.ico


+ 44 - 102
main.py

@@ -1,25 +1,19 @@
-import csv
-import os
-import sys
-import argparse
+import csv, os, re, sys, argparse
 from logger import *
 from datetime import datetime
+import pandas as pd
 
-ARGS = None
 
+   
 parse = argparse.ArgumentParser(
-        description="Программа для сбора информации из csv файлов")
-    
+    description="Программа для сбора информации из csv файлов")
 parse.add_argument('-p', '--path', help='Указать в какой директории искать',
                    default=os.path.dirname(sys.argv[0]))
-parse.add_argument('-e', '--encoding',
-                   help='Указать в какой кодировке сохранять', default='ANSI')
-parse.add_argument('-s', '--open_encoding',
+parse.add_argument('-e', '--open_encoding',
                    help='Указать в какой кодировке открывать', default='utf-16')
-parse.add_argument('-d', '--delimiter', help='разделитель csv', default=',')
-
+args = parse.parse_args()
 
-    
+print(args)
 LIST_BAD_ADAPTER = ['Wireless', 'Bluetooth', 'Wireless', 'WiFi',
                     'Kaspersky', 'VirtualBox', 'TAP-Windows',
                     'Wintun', '802.11', 'VMware', 'VPN', 'Wi-Fi',
@@ -34,37 +28,16 @@ def check_correct_controller(name) -> bool:
 
 
 class ObjectReady:
-    frame: str = None
-    cabinet: str = None
-    os: str = None
-    cpu: str = None
-    ram: str = None
-    motherboard: str = None
-    count_interface: int = 0
-    path: str = None
-
     def get_len_dict(self) -> int:
         return len(self.__dict__)
 
-    def get_csv_row(self) -> str:
-        if self.get_len_dict() < 11:
-            return F"{ARGS.delimiter}".join((self.frame, self.cabinet))
-
-        try:
-            row_interface = F"{ARGS.delimiter}".join(
-                [ARGS.delimiter.join(
-                    (self.__dict__.get(F"ip{i}"), self.__dict__.get(F"mac{i}")
-                )
-            ) for i in range(self.count_interface)])
-
-            return ARGS.delimiter.join((self.frame, self.cabinet, self.os, self.motherboard, self.cpu, self.ram, row_interface))+'\n'
-        except AttributeError:
-            return None
+    def get_row(self) -> str:
+        return self.__dict__
 
 
 def get_paths() -> list:
     list_path = []
-    for root, _, files in os.walk(ARGS.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
@@ -75,19 +48,18 @@ def convert_mb_to_gb(val: str) -> str:
     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_ser_motherboard(row: list) -> str:
+    try:
+        return row if row not in ['To be filled by O.E.M.', 'Default string'] else None
+    except IndexError:
+        pass
 
 
 def get_data_from_file(path: str, obj: ObjectReady) -> None:
     global COUNT_INTERFACE
-    with open(path, 'r', encoding=ARGS.open_encoding) as file:
+    
+    with open(path, 'r', encoding=args.open_encoding) as file:
+        
         cs = csv.reader(file, delimiter=',')
 
         next(cs)
@@ -95,18 +67,18 @@ def get_data_from_file(path: str, obj: ObjectReady) -> None:
         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
-
+        obj.motherboard = None
+        obj.count_interface = 0
         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])
+        
+        for line in cs:
+            data = list(pd.Series(line))
+            if data[0] == '6200':
+                obj.motherboard = get_ser_motherboard(data[6])
+
+            if data[0] == '2600' and len(data) > 2 and check_correct_controller(data[3]):
+                setattr(obj, F'ip{count_interface+1}', data[6].split(' ')[0])
+                setattr(obj, F'mac{count_interface+1}', data[-3])
                 count_interface += 1
 
         # Увеличиваем значение если количестов интерфейсов больше в этой строке
@@ -120,66 +92,36 @@ def get_data_from_file(path: str, obj: ObjectReady) -> None:
 def get_ready_information() -> list[ObjectReady]:
     list_objects = []
     for path in get_paths():
-
+        
         obj = ObjectReady()
         obj.frame = os.path.basename(os.path.dirname(path))
-        obj.path = path
-
-        try:
-            obj.cabinet = str(os.path.basename(path)).split('.')[0]
-        except IndexError as er:
-            logger.error(F"index error path: {path}")
-            continue
+        obj.cabinet = re.findall(
+            r"\/([\w+?\ ?[а-яА-Я]+\ ?|\w+?\ ?[a-zA-Z]+\ ?|\d+])[\.|\,]", path)[-1]
 
         try:
             get_data_from_file(path, obj)
-            logger.info(F'Parse success file: {path}')
         except UnicodeDecodeError as ude:
-            logger.error(F"{path} --> {ude}")
+            logger.error(F"{path} --> {ude}\n")
         except UnicodeError as er:
-            logger.error(F"{path} --> {er}")
-        except StopIteration:
-            logger.error(F"{path} --> Пустой файл или тмпо того")
+            logger.error(F"{path} --> {er}\n")
+        except StopIteration as si:
+            logger.error(F"{path} --> Пустой файл или тмпо того\n")
 
         list_objects.append(obj)
     return list_objects
 
 
-def create_header_interface() -> str:
-    return ARGS.delimiter.join([
-        ARGS.delimiter.join((F"ip{i+1}", F"mac{i+1}"))
-        for i in range(COUNT_INTERFACE)
-    ])
-
-
 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_interface = create_header_interface()
-        header_csv = ARGS.delimiter.join(
-            ("frame", "cabinet", "os", "motherboard", "cpu", "ram", header_interface))
-
-        f.write(header_csv + "\n")
-
-        for obj in list_obj:
-            try:
-                f.write(obj.get_csv_row())
-            except TypeError as te:
-                logger.error(F'{obj.path} -> {te}')
-                continue
-
-
+    namefile = F"result-{datetime.today().strftime('%Y-%m-%d-%H.%M.%S')}.xlsx"
+    data = [row.get_row() for row in list_obj]
+    df = pd.DataFrame(data=data)
+    df.to_excel(namefile, index= False)
+    
 if __name__ == '__main__':
-    print('start program')
-    try:
-        ARGS = parse.parse_args(sys.argv[1:])
-    except argparse.ArgumentError:
-        parse.print_help()
-
     create_logger()
-
+    
     logger.info("Start programm")
-    logger.info(F"Base dir: {ARGS.path}")
+    logger.info(F"Base dir: {args.path}")
+    
     create_csv(get_ready_information())
     logger.info("Stop programm")