ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/Redgrave/EndoIGServerAnalyzer.py
Revision: 787
Committed: Wed Aug 24 15:31:17 2022 UTC (3 years, 7 months ago) by nino.borges
Content type: text/x-python
File size: 15530 byte(s)
Log Message:
Updated to support SNOW list.

File Contents

# User Rev Content
1 nino.borges 771 """
2    
3     EndoIGServerAnalyzer
4    
5     Created by:
6     Emanuel Borges
7     07.28.2022
8    
9     This program will take two CSV files and do a row to row compare. For this to work both CSVs need to have the same colums.
10     Set colOmitList to FALSE if you dont want it to parse at all and remove any columns. for that to work though you have to normalize the date
11     and number fields.
12    
13     NOTE: the application List file HAS pipes in it, so carefully select which columns you use.
14    
15     """
16    
17     import os
18    
19    
20     if __name__ == '__main__':
21    
22 nino.borges 787 outputFileName = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\20220822-WindowsServer8_Matrix_Report.csv"
23 nino.borges 771
24     ## This should all be csvs with pre-selected fields that are verified didnt already contain pipes. Also a headder row.
25     #win2kServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\Win8Servers_filtered.csv"
26     win2kServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\Win8Servers_NOFilter.csv"
27    
28     appListServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\AppInventory_extraFields.csv"
29     sqlServersListFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\Endo SQL Servers List__As of July 2022.csv"
30     prevSqlServersListFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\SQL Server Report 07212021.csv"
31     aspectDatabasesToServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\All_endo_SQL_Server_databases.csv"
32 nino.borges 783 serviceNowToServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\ServiceNow-PreParsed.txt"
33 nino.borges 786 legacySnowToServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\LegacySNOW-PreParsed.txt"
34 nino.borges 771
35     win2kServersFileMatrix = {}
36     appListServersFileMatrix = {}
37     sqlServersListFileMatrix = {}
38     prevSqlServersListFileMatrix = {}
39     aspectDatabasesToServersMatrix = {}
40 nino.borges 783 serviceNowToServersMatrix = {}
41 nino.borges 786 legacySnowToServersMatrix = {}
42    
43 nino.borges 771
44     ## Start with ingesting the win2kservers file but be sure to save the headders on this one.
45     contents = open(win2kServersFile).readlines()
46     win2kServersFileHeadders = contents[0]
47     win2kServersFileHeadders = win2kServersFileHeadders.replace("\n","")
48     contents = contents[1:]
49     for line in contents:
50     line = line.replace("\n","")
51     parsedLine = line.split("|")
52     if parsedLine[0].upper() in list(win2kServersFileMatrix.keys()):
53     win2kServersFileMatrix[parsedLine[0].upper()].append(line)
54     else:
55     win2kServersFileMatrix[parsedLine[0].upper()] = [line,]
56     print("There are %s servers to start with."%len(list(win2kServersFileMatrix.keys())))
57    
58    
59     ## Next ingest the SQL servers list
60     contents = open(sqlServersListFile).readlines()
61     contents = contents[1:]
62     for line in contents:
63     line = line.replace("\n","")
64     parsedLine = line.split("|")
65     if parsedLine[0].upper() in list(sqlServersListFileMatrix.keys()):
66     sqlServersListFileMatrix[parsedLine[0].upper()].append(line)
67     else:
68     sqlServersListFileMatrix[parsedLine[0].upper()] = [line,]
69     print("There are %s servers on the SQL Servers file."%len(list(sqlServersListFileMatrix.keys())))
70    
71    
72     ## Next ingest the older SQL servers list
73     contents = open(prevSqlServersListFile).readlines()
74     contents = contents[1:]
75     for line in contents:
76     line = line.replace("\n","")
77     parsedLine = line.split("|")
78     if parsedLine[0].upper() in list(prevSqlServersListFileMatrix.keys()):
79     prevSqlServersListFileMatrix[parsedLine[0].upper()].append(line)
80     else:
81     prevSqlServersListFileMatrix[parsedLine[0].upper()] = [line,]
82     print("There are %s servers on the older SQL servers file."%len(list(prevSqlServersListFileMatrix.keys())))
83    
84    
85     ## Next ingest the databasename to server list from aspect
86     contents = open(aspectDatabasesToServersFile).readlines()
87     contents = contents[1:]
88     for line in contents:
89     line = line.replace("\n","")
90     parsedLine = line.split("|")
91     if parsedLine[0].upper() in list(aspectDatabasesToServersMatrix.keys()):
92     aspectDatabasesToServersMatrix[parsedLine[0].upper()].append(line)
93     else:
94     aspectDatabasesToServersMatrix[parsedLine[0].upper()] = [line,]
95     print("There are %s servers on the aspect databases to servers file."%len(list(aspectDatabasesToServersMatrix.keys())))
96    
97     ## Next is the app inventory which must first be parsed.
98     contents = open(appListServersFile).readlines()
99     contents = contents[1:]
100     for line in contents:
101     line = line.replace("\n","")
102     parsedLine = line.split("|")
103     parsedServerList = parsedLine[4].replace("#","")
104     parsedServerList = parsedServerList.split(";")
105     for s in parsedServerList:
106     if s.isnumeric():
107     pass
108     else:
109     if s.upper() in list(appListServersFileMatrix.keys()):
110     appListServersFileMatrix[s.upper()].append(line)
111     else:
112     appListServersFileMatrix[s.upper()] = [line,]
113     print("There are %s servers on the application list."%len(list(appListServersFileMatrix.keys())))
114    
115 nino.borges 783 ## Next ingest the ServiceNow Export to server list. check that there is a chg number at all.
116     contents = open(serviceNowToServersFile).readlines()
117     contents = contents[1:]
118     for line in contents:
119     line = line.replace("\n","")
120     parsedLine = line.split("|")
121     ## Dont add it to the matrix if there is no chg number.
122     if parsedLine[1]:
123     if parsedLine[0].upper() in list(serviceNowToServersMatrix.keys()):
124     serviceNowToServersMatrix[parsedLine[0].upper()].append(line)
125     else:
126     serviceNowToServersMatrix[parsedLine[0].upper()] = [line,]
127     print("There are %s servers on the ServiceNow Export to servers file."%len(list(serviceNowToServersMatrix.keys())))
128 nino.borges 771
129 nino.borges 787 ## Next ingest the Legacy SNOW Export to server list. check that there is a chg number at all.
130     contents = open(legacySnowToServersFile).readlines()
131     contents = contents[1:]
132     for line in contents:
133     line = line.replace("\n","")
134     parsedLine = line.split("|")
135     ## Dont add it to the matrix if there is no chg number.
136     if parsedLine[1]:
137     if parsedLine[0].upper() in list(legacySnowToServersMatrix.keys()):
138     legacySnowToServersMatrix[parsedLine[0].upper()].append(line)
139     else:
140     legacySnowToServersMatrix[parsedLine[0].upper()] = [line,]
141     print("There are %s servers on the Legacy SNOW Export to servers file."%len(list(legacySnowToServersMatrix.keys())))
142    
143    
144 nino.borges 771 outputFile = open(outputFileName,'w')
145 nino.borges 787 outputFile.write(win2kServersFileHeadders + "|Found on 2022 SQL Server Report?|Found on 2021 SQL Server Report?|Found DatabaseNames Server Report?|DB Names Found on AspectList|Found on Application Inventory?|Applications|App IT Leadership Owner|App IT System Owner|App Executive Leadership Owner|App Business Owner|Found on ServiceNow|ServiceNowChangeReqNumbers|ServiceNow Business Owner|ServiceNowChangeBusiness/IT Approver|ServiceNow Parent Change Req Numbers|Found on LegacySNOW|Legacy SNOW ChangeRequestNumbers\n")
146 nino.borges 771 for i in list(win2kServersFileMatrix.keys()):
147     nl=outputFile.write(win2kServersFileMatrix[i][0])
148    
149     if i in list(sqlServersListFileMatrix.keys()):
150     nl=outputFile.write("|YES")
151     else:
152     nl=outputFile.write("|NO")
153     if i in list(prevSqlServersListFileMatrix.keys()):
154     nl=outputFile.write("|YES")
155     else:
156     nl=outputFile.write("|NO")
157     dbNamesList = ""
158     if i in list(aspectDatabasesToServersMatrix.keys()):
159     nl=outputFile.write("|YES")
160     for dbNameLine in aspectDatabasesToServersMatrix[i]:
161     dbNameLine = dbNameLine.replace("\n","")
162     dbNameLine = dbNameLine.split("|")
163     if dbNamesList:
164     dbNamesList = dbNamesList + "; " +dbNameLine[1]
165     else:
166     dbNamesList = dbNameLine[1]
167     else:
168     nl=outputFile.write("|NO")
169     if dbNamesList:
170     nl=outputFile.write("|" + dbNamesList)
171     else:
172     nl=outputFile.write("|")
173 nino.borges 772 appList = set()
174     itLeadershipOwnerList = set()
175     itSystemOwnerList = set()
176     executiveLeadershipOwnerList = set()
177     businessOwnerList = set()
178     tempOwnerList = ""
179 nino.borges 771 if i in list(appListServersFileMatrix.keys()):
180     nl=outputFile.write("|YES")
181     for appLine in appListServersFileMatrix[i]:
182     appLine = appLine.replace("\n","")
183     appLine = appLine.split("|")
184 nino.borges 772 appList.add(appLine[1]+' [AppID=%s]'%appLine[0])
185     tempOwnerList = appLine[5].replace("#","")
186     tempOwnerList = tempOwnerList.split(";")
187     for o in tempOwnerList:
188     if o.isnumeric():
189     pass
190     else:
191     itLeadershipOwnerList.add(o+' [AppID=%s]'%appLine[0])
192     tempOwnerList = appLine[6].replace("#","")
193     tempOwnerList = tempOwnerList.split(";")
194     for o in tempOwnerList:
195     if o.isnumeric():
196     pass
197     else:
198     itSystemOwnerList.add(o+' [AppID=%s]'%appLine[0])
199     tempOwnerList = appLine[7].replace("#","")
200     tempOwnerList = tempOwnerList.split(";")
201     for o in tempOwnerList:
202     if o.isnumeric():
203     pass
204     else:
205     executiveLeadershipOwnerList.add(o+' [AppID=%s]'%appLine[0])
206     tempOwnerList = appLine[8].replace("#","")
207     tempOwnerList = tempOwnerList.split(";")
208     for o in tempOwnerList:
209     if o.isnumeric():
210     pass
211     else:
212     businessOwnerList.add(o+' [AppID=%s]'%appLine[0])
213     ## if appList:
214     ## appList = appList + '; ' + appLine[1]+' [AppID=%s]'%appLine[0]
215     ## else:
216     ## appList = appLine[1]+' [AppID=%s]'%appLine[0]
217 nino.borges 771 else:
218     nl=outputFile.write("|NO")
219     if appList:
220 nino.borges 772 nl=outputFile.write("|" + "; ".join(appList))
221 nino.borges 771 else:
222     nl=outputFile.write("|")
223 nino.borges 772 if itLeadershipOwnerList:
224     nl=outputFile.write("|" + "; ".join(itLeadershipOwnerList))
225     else:
226     nl=outputFile.write("|")
227     if itSystemOwnerList:
228     nl=outputFile.write("|" + "; ".join(itSystemOwnerList))
229     else:
230     nl=outputFile.write("|")
231     if executiveLeadershipOwnerList:
232     nl=outputFile.write("|" + "; ".join(executiveLeadershipOwnerList))
233     else:
234     nl=outputFile.write("|")
235     if businessOwnerList:
236     nl=outputFile.write("|" + "; ".join(businessOwnerList))
237     else:
238     nl=outputFile.write("|")
239 nino.borges 783
240    
241    
242     chngReqList = ""
243 nino.borges 784 snBusinessOwnerList = set()
244 nino.borges 785 snApproverOwnerList = set()
245 nino.borges 786 snParentChgReqNumbList = set()
246    
247 nino.borges 783 if i in list(serviceNowToServersMatrix.keys()):
248     nl=outputFile.write("|YES")
249     for chngReqLine in serviceNowToServersMatrix[i]:
250     chngReqLine = chngReqLine.replace("\n","")
251     chngReqLine = chngReqLine.split("|")
252     chngReqDt = chngReqLine[2]
253     ## Grab just the date for now but can change to date and time if needed
254     chngReqDt = chngReqDt.split(" ")[0]
255     chngReqNumbWDate = "%s [%s]"%(chngReqLine[1],chngReqDt)
256     if chngReqList:
257     chngReqList = chngReqList + "; " +chngReqNumbWDate
258     else:
259     chngReqList = chngReqNumbWDate
260 nino.borges 784 if chngReqLine[3]:
261 nino.borges 785 if chngReqLine[3] == "None":
262     pass
263     else:
264     snBusinessOwnerList.add("%s [%s]"%(chngReqLine[3],chngReqLine[1]))
265     if chngReqLine[4]:
266     if chngReqLine[4] == "None":
267     pass
268     else:
269     snApproverOwnerList.add("%s [%s]"%(chngReqLine[4],chngReqLine[1]))
270 nino.borges 786 if chngReqLine[5]:
271     if chngReqLine[5] == "None":
272     pass
273     else:
274     snParentChgReqNumbList.add("%s [%s]"%(chngReqLine[5],chngReqLine[1]))
275 nino.borges 784
276 nino.borges 783 else:
277     nl=outputFile.write("|NO")
278     if chngReqList:
279     nl=outputFile.write("|" + chngReqList)
280     else:
281     nl=outputFile.write("|")
282 nino.borges 784 if snBusinessOwnerList:
283     nl=outputFile.write("|" + "; ".join(snBusinessOwnerList))
284     else:
285     nl=outputFile.write("|")
286 nino.borges 785 if snApproverOwnerList:
287     nl=outputFile.write("|" + "; ".join(snApproverOwnerList))
288     else:
289     nl=outputFile.write("|")
290 nino.borges 786 if snParentChgReqNumbList:
291     nl=outputFile.write("|" + "; ".join(snParentChgReqNumbList))
292     else:
293     nl=outputFile.write("|")
294 nino.borges 783
295    
296 nino.borges 787 snowChngReqList = ""
297     if i in list(legacySnowToServersMatrix.keys()):
298     nl=outputFile.write("|YES")
299     for snowChngReqLine in legacySnowToServersMatrix[i]:
300     snowChngReqLine = snowChngReqLine.replace("\n","")
301     snowChngReqLine = snowChngReqLine.split("|")
302     snowChngReqDt = snowChngReqLine[2]
303     ## Grab just the date for now but can change to date and time if needed
304     snowChngReqDt = snowChngReqDt.split(" ")[0]
305     snowChngReqNumbWDate = "%s [%s]"%(snowChngReqLine[1],snowChngReqDt)
306     if snowChngReqList:
307     snowChngReqList = snowChngReqList + "; " +snowChngReqNumbWDate
308     else:
309     snowChngReqList = snowChngReqNumbWDate
310     else:
311     nl=outputFile.write("|NO")
312    
313     if snowChngReqList:
314     nl=outputFile.write("|" + snowChngReqList)
315     else:
316     nl=outputFile.write("|")
317    
318    
319 nino.borges 771 nl = outputFile.write("\n")
320     outputFile.close()