from PyQt5.QtWidgets import QApplication, QDialog, QFileDialog from PyQt5.uic import loadUi import sys from pathlib import Path import pandas as pd from icecream import ic import re import numpy as np class MainUI(QDialog): # erbt von QDialog def __init__(self): # super (MainUI, self).__init__() #Aufrufen des Konstruktors von QDialog super().__init__() loadUi("Aufbaumaster2CSV.ui", self) self.filename = None self.path = None self.df_vte = None self.df_cmdb = None self.df_vte_gg = None self.df_vte_erw = None self.df_cmdb_gg = None self.df_cmdb_erw = None self.dfb_gg = None self.dfb_erw = None self.openBtn.clicked.connect(self.open_file_dialog) self.saveBtn.clicked.connect(self.save_file_dialog) self.filter = "Hostnamen" self.group = None self.typ = None def open_file_dialog(self): self.filename, _ = QFileDialog.getOpenFileName( self, "Aufbaumaster", "\\Volumes\\Daten01\\Documents\\toCSV", "Images (*.xls *.xlsx *.xlsb)" ) # self.filename_edit.setPixmap(QPixmap(self.filename)) self.lblCMDBPath.setText(self.filename) if self.filename: self.path = Path(self.filename) self.collect_cmdb_daten_gg() self.collect_cmdb_daten_erw() def collect_cmdb_daten_gg(self): # Einlesen der Sheets allgemein self.df_vte = pd.read_excel(self.filename, header=7, na_filter=False, sheet_name='VTE-Input', usecols=['Hostname', 'Gruppierung', 'CONFIG-ID', 'CMDB Status'], engine='pyxlsb') self.df_cmdb = pd.read_excel(self.filename, header=2, sheet_name="CMDB", engine='pyxlsb') # Nach relevanten Spalten filtern Grundgeraete # Sheet VTE self.df_vte_gg = self.df_vte[self.df_vte['Gruppierung'] == 'Grundgerät'] # Sheet CMDB self.df_cmdb_gg = self.df_cmdb[self.df_cmdb['Filter'] == 'Grundgerät'] # Teil Grundgeräte self.df_cmdb_gg = self.df_cmdb_gg.drop( columns=['WV-Start', 'WV-Ende', 'CMDB-Status', 'Aufgabe Schritt', 'Filter', 'Waermeabgabe [BTU/h]', 'kalk. Strom [A]']) # Einfügen von Spalten in die CMDB-Tabelle self.dfb_gg = self.df_vte_gg.merge(self.df_cmdb_gg, on=['Hostname'], how='left') # Spalte für Mandanten Kontaktzuweisung self.dfb_gg.insert(loc=7, column='Mandanten Kontaktzuweisung', value='Mandant') # Spalte für Segmente self.dfb_gg.insert(loc=8, column='Segment', value='') # Spalte für Domains self.dfb_gg.insert(loc=9, column='Domain', value='') # Spalte einfügen für HE self.dfb_gg.insert(loc=14, column='HE', value='') # Einschub self.dfb_gg.insert(loc=15, column='Einschub', value='') # Montage --> nur horizontal self.dfb_gg.insert(loc=16, column='Montage', value='horizontal') # Formfaktor self.dfb_gg.insert(loc=17, column='Formfaktor', value='19"') # Masseinheit self.dfb_gg.insert(loc=18, column='Masseinheit', value='Zoll') # Spaltenanmen mit Sonderzeichen anzeigen columns_with_special_chars = [col for col in self.dfb_gg.columns if self.has_special_characters(col)] print("Spaltenheader mit Sonderzeichen:", columns_with_special_chars) # Führende Leerzeichen in allen Spalten entfernen self.dfb_gg = self.dfb_gg.apply(lambda x: x.str.lstrip() if x.dtype == "object" else x) # Alle Floats in Strings umwandeln self.dfb_gg = self.dfb_gg.applymap(lambda x: str(x) if isinstance(x, float) else x) self.dfb_gg = self.dfb_gg.apply(self.suche_Einschub, axis=1) self.dfb_gg = self.dfb_gg.apply(self.montageort, axis=1) self.dfb_gg = self.dfb_gg.apply(self.pruefe_und_setze_wert, axis=1) # Setzen von int für HE und Anz. HE self.dfb_gg['HE'] = self.dfb_gg['HE'].apply(lambda x: x if pd.isnull(x) else str(int(x))) # self.dfb['belegte\nHE'] = self.dfb['belegte\nHE'].apply(lambda x: x if pd.isnull(x) else str(int(x))) ############################################################################################## #def collect_erweiterung(self): def has_special_characters(self, s): # Regex pattern für Sonderzeichen return bool(re.search(r'[^A-Za-z0-9]', s)) def suche_Einschub(self, einschub): if einschub['Montageort'][-1] in ('v','h'): if einschub['Montageort'][-1] == 'v': einschub['Einschub'] = 'Vorderseite' else: einschub['Einschub'] = 'Rückseite' return einschub def montageort(self, montage): # Fehlerbereinigung # ic("Montage: ", montage) if montage['ID\nStandort']not in ("Ber-PS", "Bon-BTW"): print("Kein Standort P40 oder BTW") sys.exit(0) else: if len((montage['Montageort'][8:13])) != 2: montage['HE'] = montage['Montageort'][8:10] montage['Montageort'] = montage['Montageort'][0:7] else: montage['HE'] = montage['Montageort'][8:10] montage['Montageort'] = montage['Montageort'][0:7] return montage def korrektur_hersteller(self, hersteller): if hersteller['Hersteller'].lower() == "cisco": hersteller['Hersteller'] = "Cisco Systems" elif hersteller['Hersteller'].lower() == "genua": hersteller['Hersteller'] = "genua GmbH" elif hersteller['Hersteller'].lower() == "digi": hersteller['Hersteller'] = "Digi International Inc." return hersteller def pruefe_und_setze_wert(self, zeile): #ic(zeile) ################################################################ if zeile['Hostname'][4:6] == "10": zeile['ID\nMandanten'] = 'm10 CMP Plattform / iM.0 / iM.4 / PAP sIMCP' if zeile['Hostname'][4:8] == "1011": zeile['Domain'] = 'im0.t-cmp.de' elif zeile['Hostname'][4:8] == "1015": zeile['Domain'] = 'im4.t-cmp.de' else: zeile['Domain'] = 'mgmt.t-cmp.de' elif zeile['Hostname'][4:6] == "19": zeile['ID\nMandanten'] = 'm19 Testumgebung' if zeile['Hostname'][4:8].isin("1920", "1921"): zeile['Domain'] = 'm19.t-cmp.de' else: zeile['Domain'] = 'm193.t-cmp.de' elif zeile['Hostname'][4:6] == "20": zeile['ID\nMandanten'] = 'm20 iM.1 Interner Mandant (Schutzbedarf sehr hoch)' zeile['Domain'] = 'im1.t-cmp.de' elif zeile['Hostname'][4:6] == "21": zeile['ID\nMandanten'] = 'm21 iM.2 Interner Mandant (Schutzbedarf normal)' zeile['Domain'] = 'im2.t-cmp.de' elif zeile['Hostname'][4:6] == "22": zeile['ID\nMandanten'] = 'm22 iM.3 Interner Mandant (Schutzbedarf hoch)' zeile['Domain'] = 'im3.t-cmp.de' elif zeile['Hostname'][4:6] == "50": zeile['ID\nMandanten'] = 'm50 sEMCP.Instanz-1 (CMP Zentral)' zeile['Domain'] = 'm50.t-cmp.de' elif zeile['Hostname'][4:6] == "51": zeile['ID\nMandanten'] = 'm51 Classified OPS' zeile['Domain'] = 'm51.t-cmp.de' elif zeile['Hostname'][4:6] == "73": zeile['ID\nMandanten'] = 'm73 FWP Lüftersteuerung' zeile['Domain'] = 'm73.t-cmp.de' elif zeile['Hostname'][4:6] == "75": zeile['ID\nMandanten'] = 'm75 Fawkes' zeile['Domain'] = 'm75.t-cmp.de' elif zeile['Hostname'][4:6] == "76": zeile['ID\nMandanten'] = 'm76 Demo' zeile['Domain'] = 'm76.t-cmp.de' elif zeile['Hostname'][4:6] == "77": zeile['ID\nMandanten'] = 'm77 Fritz54' zeile['Domain'] = 'm77.t-cmp.de' elif zeile['Hostname'][4:6] == "78": zeile['ID\nMandanten'] = 'm78 ITZBund mSBC' zeile['Domain'] = 'm78.t-cmp.de' elif zeile['Hostname'][4:6] == "79": zeile['ID\nMandanten'] = 'm79 BOS-Spur' zeile['Domain'] = 'm79.t-cmp.de' elif zeile['Hostname'][4:6] == "99": zeile['ID\nMandanten'] = 'm99 Releasemanagement' elif zeile['Hostname'][4:6] == "80": zeile['ID\nMandanten'] = 'm80 ACDC' zeile['Domain'] = 'm80.t-cmp.de' ################################################################ if zeile['Hostname'][6:8] == "00": zeile['Segment'] = 'm10 mgmt CMP Core' elif zeile['Hostname'][6:8] == "01": zeile['Segment'] = 'm10 mgmt Infrastructure' elif zeile['Hostname'][6:8] == "02": zeile['Segment'] = 'm10 mgmt Administration' elif zeile['Hostname'][6:8] == "03": zeile['Segment'] = 'm10 mgmt zLightsOut' elif zeile['Hostname'][6:8] == "04": zeile['Segment'] = 'm10 CTS' elif zeile['Hostname'][6:8] == "05": zeile['Segment'] = 'm10-OSS' elif zeile['Hostname'][6:8] == "10": zeile['Segment'] = 'm10 CMP2sIM' elif zeile['Hostname'][6:8] == "11": zeile['Segment'] = 'm10 Intern-CMP iM0' elif zeile['Hostname'][6:8] == "12": zeile['Segment'] = 'm20 iM.1 Interner Mandant 1 (SB sehr hoch)' elif zeile['Hostname'][6:8] == "13": zeile['Segment'] = 'm21 iM.2 Interner Mandant 2 (SB normal)' elif zeile['Hostname'][6:8] == "14": zeile['Segment'] = 'm22 iM.3 Interner Mandant 3 (SB hoch)' elif zeile['Hostname'][6:8] == "15": zeile['Segment'] = 'm10 iM.4 Interner Mandant 4 (CNMS2CMP)' elif zeile['Hostname'][6:8] == "20": zeile['Segment'] = 'VRD-Plattform (PAP-Anbindung)' elif zeile['Hostname'][6:8] == "21": zeile['Segment'] = 'VRD-Plattform (LightsOut + Basisinfrastruktur + Cache)' elif zeile['Hostname'][6:8] == "22": zeile['Segment'] = 'VRD-Plattform (Admin)' elif zeile['Hostname'][6:8] == "23": zeile['Segment'] = 'VRD-Plattform (Basisinfrastruktur Mandant zentral)' elif zeile['Hostname'][6:8] == "24": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "25": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "26": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "27": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "28": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "29": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "30": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "31": zeile['Segment'] = 'VRD-Mandant (Infrastruktur)' elif zeile['Hostname'][6:8] == "32": zeile['Segment'] = 'VRD-Mandant (Admin)' elif zeile['Hostname'][6:8] == "33": zeile['Segment'] = 'VRD-Mandant (Anbindung)' elif zeile['Hostname'][6:8] == "34": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "35": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "36": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "37": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "38": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "39": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "40": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "41": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "42": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "43": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "44": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "45": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "46": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "47": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "48": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "49": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "50": zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "51": zeile['Segment'] = 'VRD-Mandant (Kundensegment Infra)' elif zeile['Hostname'][6:8] == "52": zeile['Segment'] = 'VRD-Mandant (Kundensegment Admin)' elif zeile['Hostname'][6:8] == "53": zeile['Segment'] = 'VRD-Mandant (Kundensegment)' elif zeile['Hostname'][6:8] == "b0": zeile['Segment'] = 'mgmt BS Übergang zum CMP Core' elif zeile['Hostname'][6:8] == "ba": zeile['Segment'] = 'mgmt BS Bon BTW' elif zeile['Hostname'][6:8] == "bb": zeile['Segment'] = 'mgmt BS Bon LRS' elif zeile['Hostname'][6:8] == "bc": zeile['Segment'] = 'mgmt BS Ber W55' elif zeile['Hostname'][6:8] == "bd": zeile['Segment'] = 'mgmt BS Ber PS' elif zeile['Hostname'][6:8] == "be": zeile['Segment'] = 'mgmt BS Ber NDA' elif zeile['Hostname'][6:8] == "bf": zeile['Segment'] = 'mgmt BS HanTMX' elif zeile['Hostname'][6:8] == "bg": zeile['Segment'] = 'mgmt BS Ber DS' elif zeile['Hostname'][6:8] == "c0": zeile['Segment'] = 'mgmt CMP Übergang Internet' elif zeile['Hostname'][6:8] == "x1": zeile['Segment'] = 'm10 SecA2sIM' ################################################################ # Genucenter - # HW Appliance - # Kryptierer - # Medienkonverter # Paketfilter / ALG - # Router - C__OBJTYPE__ROUTER # Server -- # SFP - C__OBJTYPE__SD_SFP - # Speichersystem C__OBJTYPE__SAN - # Storage C__OBJTYPE__SAN - # Switch C__OBJTYPE__SWITCH - # virtuelle Maschine Objekttyp = C__OBJTYPE__VIRTUAL_SERVER # Terminalserver Objekttyp = C__OBJTYPE__TERMINALSERVER - # wenn vho dann Objekttyp = C__OBJTYPE__VIRTUAL_HOST - if zeile['Objekttyp (CMDB)'] == 'Genucenter': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'HW Appliance': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'Paketfilter / ALG': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'Kryptierer': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SD_KRYPTIERER' elif zeile['Objekttyp (CMDB)'] == 'Server': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SERVER' elif zeile['Objekttyp (CMDB)'] == 'Switch': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SWITCH' elif zeile['Objekttyp (CMDB)'] == 'virtuelle Maschine': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__VIRTUAL_SERVER' elif zeile['Objekttyp (CMDB)'] == 'Terminalserver': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__TERMINALSERVER' elif zeile['Objekttyp (CMDB)'] == 'Storage': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SAN' elif zeile['Objekttyp (CMDB)'] == 'SFP': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SD_SFP' elif zeile['Objekttyp (CMDB)'] == 'Speichersystem': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SAN' elif zeile['Objekttyp (CMDB)'] == 'Router': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__ROUTER' if zeile['Hostname'][1:3] == "vho": zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__VIRTUAL_HOST' return zeile def collect_cmdb_daten_erw(self): ############## Erweiterung ################################################################################ # Kopieren self.df_vte_erw = self.df_vte # Auffüllen der Spalte Hostname self.df_vte_erw['Hostname']= self.df_vte_erw['Hostname'].replace('', np.nan) self.df_vte_erw['Hostname'] = self.df_vte_erw['Hostname'].fillna(method='ffill') # Nach relevanten Spalten filtern Erweiterung self.df_vte_erw = self.df_vte_erw[self.df_vte_erw['Gruppierung'] == 'Erweiterung'] print("Self_ERW: ",self.df_vte_erw['Hostname']) self.df_cmdb_erw = self.df_cmdb self.df_cmdb_erw['Hostname']= self.df_cmdb_erw['Hostname'].replace('', np.nan) self.df_cmdb_erw['Hostname'] = self.df_cmdb_erw['Hostname'].fillna(method='ffill') self.df_cmdb_erw = self.df_cmdb_erw[self.df_cmdb_erw['Filter'] == 'Grundgerät'] # Zusammensetzen der Tabellen self.dfb_erw = self.df_vte_erw.merge(self.df_cmdb_erw, on=['Hostname'], how='left') ic(self.dfb_erw) ########################################################################################## def save_file_dialog(self): # ic(self.dfb_gg) options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog self.savefilename, _ = QFileDialog.getSaveFileName(self, "Save File", "", "CSV(*.csv);;CSV Files(*.csv)", options=options) self.dfb_gg.to_csv(self.savefilename+"_GG", index=None, header=True, encoding='utf-8') self.dfb_erw.to_csv(self.savefilename+"_ERW", index=None, header=True, encoding='utf-8') print("Datei wurde gespeichert:", self.savefilename) if __name__ == "__main__": app = QApplication(sys.argv) ui = MainUI() ui.show() app.exec_()