ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/Redgrave/EndoIGServerAnalyzer.py
Revision: 789
Committed: Fri Sep 2 15:43:05 2022 UTC (3 years, 6 months ago) by nino.borges
Content type: text/x-python
File size: 19066 byte(s)
Log Message:
Added support for the change requests numbers that were found on the original Windows servers with os 2008 and earlier report.

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 789 outputFileName = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\20220824-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 789 win2kChngReqToServersFile = r"C:\Users\eborges\Documents\Cases\Endo\20220715 - IG Projects\4 - Develop Identification Process to Inventory NCDS stored in Endo IT\_fromEndo\_csv\SN-FromWinFile-PreParsed.txt"
35 nino.borges 771
36     win2kServersFileMatrix = {}
37     appListServersFileMatrix = {}
38     sqlServersListFileMatrix = {}
39     prevSqlServersListFileMatrix = {}
40     aspectDatabasesToServersMatrix = {}
41 nino.borges 783 serviceNowToServersMatrix = {}
42 nino.borges 786 legacySnowToServersMatrix = {}
43 nino.borges 789 win2kChngReqToServersMatrix = {}
44 nino.borges 786
45 nino.borges 771
46     ## Start with ingesting the win2kservers file but be sure to save the headders on this one.
47     contents = open(win2kServersFile).readlines()
48     win2kServersFileHeadders = contents[0]
49     win2kServersFileHeadders = win2kServersFileHeadders.replace("\n","")
50     contents = contents[1:]
51     for line in contents:
52     line = line.replace("\n","")
53     parsedLine = line.split("|")
54     if parsedLine[0].upper() in list(win2kServersFileMatrix.keys()):
55     win2kServersFileMatrix[parsedLine[0].upper()].append(line)
56     else:
57     win2kServersFileMatrix[parsedLine[0].upper()] = [line,]
58     print("There are %s servers to start with."%len(list(win2kServersFileMatrix.keys())))
59    
60    
61     ## Next ingest the SQL servers list
62     contents = open(sqlServersListFile).readlines()
63     contents = contents[1:]
64     for line in contents:
65     line = line.replace("\n","")
66     parsedLine = line.split("|")
67     if parsedLine[0].upper() in list(sqlServersListFileMatrix.keys()):
68     sqlServersListFileMatrix[parsedLine[0].upper()].append(line)
69     else:
70     sqlServersListFileMatrix[parsedLine[0].upper()] = [line,]
71     print("There are %s servers on the SQL Servers file."%len(list(sqlServersListFileMatrix.keys())))
72    
73    
74     ## Next ingest the older SQL servers list
75     contents = open(prevSqlServersListFile).readlines()
76     contents = contents[1:]
77     for line in contents:
78     line = line.replace("\n","")
79     parsedLine = line.split("|")
80     if parsedLine[0].upper() in list(prevSqlServersListFileMatrix.keys()):
81     prevSqlServersListFileMatrix[parsedLine[0].upper()].append(line)
82     else:
83     prevSqlServersListFileMatrix[parsedLine[0].upper()] = [line,]
84     print("There are %s servers on the older SQL servers file."%len(list(prevSqlServersListFileMatrix.keys())))
85    
86    
87     ## Next ingest the databasename to server list from aspect
88     contents = open(aspectDatabasesToServersFile).readlines()
89     contents = contents[1:]
90     for line in contents:
91     line = line.replace("\n","")
92     parsedLine = line.split("|")
93     if parsedLine[0].upper() in list(aspectDatabasesToServersMatrix.keys()):
94     aspectDatabasesToServersMatrix[parsedLine[0].upper()].append(line)
95     else:
96     aspectDatabasesToServersMatrix[parsedLine[0].upper()] = [line,]
97     print("There are %s servers on the aspect databases to servers file."%len(list(aspectDatabasesToServersMatrix.keys())))
98    
99     ## Next is the app inventory which must first be parsed.
100     contents = open(appListServersFile).readlines()
101     contents = contents[1:]
102     for line in contents:
103     line = line.replace("\n","")
104     parsedLine = line.split("|")
105     parsedServerList = parsedLine[4].replace("#","")
106     parsedServerList = parsedServerList.split(";")
107     for s in parsedServerList:
108     if s.isnumeric():
109     pass
110     else:
111     if s.upper() in list(appListServersFileMatrix.keys()):
112     appListServersFileMatrix[s.upper()].append(line)
113     else:
114     appListServersFileMatrix[s.upper()] = [line,]
115     print("There are %s servers on the application list."%len(list(appListServersFileMatrix.keys())))
116    
117 nino.borges 783 ## Next ingest the ServiceNow Export to server list. check that there is a chg number at all.
118     contents = open(serviceNowToServersFile).readlines()
119     contents = contents[1:]
120     for line in contents:
121     line = line.replace("\n","")
122     parsedLine = line.split("|")
123     ## Dont add it to the matrix if there is no chg number.
124     if parsedLine[1]:
125     if parsedLine[0].upper() in list(serviceNowToServersMatrix.keys()):
126     serviceNowToServersMatrix[parsedLine[0].upper()].append(line)
127     else:
128     serviceNowToServersMatrix[parsedLine[0].upper()] = [line,]
129     print("There are %s servers on the ServiceNow Export to servers file."%len(list(serviceNowToServersMatrix.keys())))
130 nino.borges 771
131 nino.borges 787 ## Next ingest the Legacy SNOW Export to server list. check that there is a chg number at all.
132     contents = open(legacySnowToServersFile).readlines()
133     contents = contents[1:]
134     for line in contents:
135     line = line.replace("\n","")
136     parsedLine = line.split("|")
137     ## Dont add it to the matrix if there is no chg number.
138     if parsedLine[1]:
139     if parsedLine[0].upper() in list(legacySnowToServersMatrix.keys()):
140     legacySnowToServersMatrix[parsedLine[0].upper()].append(line)
141     else:
142     legacySnowToServersMatrix[parsedLine[0].upper()] = [line,]
143     print("There are %s servers on the Legacy SNOW Export to servers file."%len(list(legacySnowToServersMatrix.keys())))
144    
145    
146 nino.borges 789 ## Next ingest the SN Numbers from the original win2008 file Export to server list. check that there is a chg number at all.
147     contents = open(win2kChngReqToServersFile).readlines()
148     contents = contents[1:]
149     for line in contents:
150     line = line.replace("\n","")
151     parsedLine = line.split("|")
152     ## Dont add it to the matrix if there is no chg number.
153     if parsedLine[1]:
154     if parsedLine[0].upper() in list(win2kChngReqToServersMatrix.keys()):
155     win2kChngReqToServersMatrix[parsedLine[0].upper()].append(line)
156     else:
157     win2kChngReqToServersMatrix[parsedLine[0].upper()] = [line,]
158     print("There are %s servers on the SN Numbers from the original win2008 file Export to servers file."%len(list(win2kChngReqToServersMatrix.keys())))
159    
160    
161    
162 nino.borges 771 outputFile = open(outputFileName,'w')
163 nino.borges 789 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|Win2008 Report ChngRequest Found|Win2008 Report ChngRequestNumbers|Win2008 Report SN Business Owner|Win2008 Report SN Business/IT Approver|Win2008 Report SN Parent Change Req Numbers\n")
164 nino.borges 771 for i in list(win2kServersFileMatrix.keys()):
165     nl=outputFile.write(win2kServersFileMatrix[i][0])
166    
167     if i in list(sqlServersListFileMatrix.keys()):
168     nl=outputFile.write("|YES")
169     else:
170     nl=outputFile.write("|NO")
171     if i in list(prevSqlServersListFileMatrix.keys()):
172     nl=outputFile.write("|YES")
173     else:
174     nl=outputFile.write("|NO")
175     dbNamesList = ""
176     if i in list(aspectDatabasesToServersMatrix.keys()):
177     nl=outputFile.write("|YES")
178     for dbNameLine in aspectDatabasesToServersMatrix[i]:
179     dbNameLine = dbNameLine.replace("\n","")
180     dbNameLine = dbNameLine.split("|")
181     if dbNamesList:
182     dbNamesList = dbNamesList + "; " +dbNameLine[1]
183     else:
184     dbNamesList = dbNameLine[1]
185     else:
186     nl=outputFile.write("|NO")
187     if dbNamesList:
188     nl=outputFile.write("|" + dbNamesList)
189     else:
190     nl=outputFile.write("|")
191 nino.borges 772 appList = set()
192     itLeadershipOwnerList = set()
193     itSystemOwnerList = set()
194     executiveLeadershipOwnerList = set()
195     businessOwnerList = set()
196     tempOwnerList = ""
197 nino.borges 771 if i in list(appListServersFileMatrix.keys()):
198     nl=outputFile.write("|YES")
199     for appLine in appListServersFileMatrix[i]:
200     appLine = appLine.replace("\n","")
201     appLine = appLine.split("|")
202 nino.borges 772 appList.add(appLine[1]+' [AppID=%s]'%appLine[0])
203     tempOwnerList = appLine[5].replace("#","")
204     tempOwnerList = tempOwnerList.split(";")
205     for o in tempOwnerList:
206     if o.isnumeric():
207     pass
208     else:
209     itLeadershipOwnerList.add(o+' [AppID=%s]'%appLine[0])
210     tempOwnerList = appLine[6].replace("#","")
211     tempOwnerList = tempOwnerList.split(";")
212     for o in tempOwnerList:
213     if o.isnumeric():
214     pass
215     else:
216     itSystemOwnerList.add(o+' [AppID=%s]'%appLine[0])
217     tempOwnerList = appLine[7].replace("#","")
218     tempOwnerList = tempOwnerList.split(";")
219     for o in tempOwnerList:
220     if o.isnumeric():
221     pass
222     else:
223     executiveLeadershipOwnerList.add(o+' [AppID=%s]'%appLine[0])
224     tempOwnerList = appLine[8].replace("#","")
225     tempOwnerList = tempOwnerList.split(";")
226     for o in tempOwnerList:
227     if o.isnumeric():
228     pass
229     else:
230     businessOwnerList.add(o+' [AppID=%s]'%appLine[0])
231     ## if appList:
232     ## appList = appList + '; ' + appLine[1]+' [AppID=%s]'%appLine[0]
233     ## else:
234     ## appList = appLine[1]+' [AppID=%s]'%appLine[0]
235 nino.borges 771 else:
236     nl=outputFile.write("|NO")
237     if appList:
238 nino.borges 772 nl=outputFile.write("|" + "; ".join(appList))
239 nino.borges 771 else:
240     nl=outputFile.write("|")
241 nino.borges 772 if itLeadershipOwnerList:
242     nl=outputFile.write("|" + "; ".join(itLeadershipOwnerList))
243     else:
244     nl=outputFile.write("|")
245     if itSystemOwnerList:
246     nl=outputFile.write("|" + "; ".join(itSystemOwnerList))
247     else:
248     nl=outputFile.write("|")
249     if executiveLeadershipOwnerList:
250     nl=outputFile.write("|" + "; ".join(executiveLeadershipOwnerList))
251     else:
252     nl=outputFile.write("|")
253     if businessOwnerList:
254     nl=outputFile.write("|" + "; ".join(businessOwnerList))
255     else:
256     nl=outputFile.write("|")
257 nino.borges 783
258    
259    
260     chngReqList = ""
261 nino.borges 784 snBusinessOwnerList = set()
262 nino.borges 785 snApproverOwnerList = set()
263 nino.borges 786 snParentChgReqNumbList = set()
264    
265 nino.borges 783 if i in list(serviceNowToServersMatrix.keys()):
266     nl=outputFile.write("|YES")
267     for chngReqLine in serviceNowToServersMatrix[i]:
268     chngReqLine = chngReqLine.replace("\n","")
269     chngReqLine = chngReqLine.split("|")
270     chngReqDt = chngReqLine[2]
271     ## Grab just the date for now but can change to date and time if needed
272     chngReqDt = chngReqDt.split(" ")[0]
273     chngReqNumbWDate = "%s [%s]"%(chngReqLine[1],chngReqDt)
274     if chngReqList:
275     chngReqList = chngReqList + "; " +chngReqNumbWDate
276     else:
277     chngReqList = chngReqNumbWDate
278 nino.borges 784 if chngReqLine[3]:
279 nino.borges 785 if chngReqLine[3] == "None":
280     pass
281     else:
282     snBusinessOwnerList.add("%s [%s]"%(chngReqLine[3],chngReqLine[1]))
283     if chngReqLine[4]:
284     if chngReqLine[4] == "None":
285     pass
286     else:
287     snApproverOwnerList.add("%s [%s]"%(chngReqLine[4],chngReqLine[1]))
288 nino.borges 786 if chngReqLine[5]:
289     if chngReqLine[5] == "None":
290     pass
291     else:
292     snParentChgReqNumbList.add("%s [%s]"%(chngReqLine[5],chngReqLine[1]))
293 nino.borges 784
294 nino.borges 783 else:
295     nl=outputFile.write("|NO")
296     if chngReqList:
297     nl=outputFile.write("|" + chngReqList)
298     else:
299     nl=outputFile.write("|")
300 nino.borges 784 if snBusinessOwnerList:
301     nl=outputFile.write("|" + "; ".join(snBusinessOwnerList))
302     else:
303     nl=outputFile.write("|")
304 nino.borges 785 if snApproverOwnerList:
305     nl=outputFile.write("|" + "; ".join(snApproverOwnerList))
306     else:
307     nl=outputFile.write("|")
308 nino.borges 786 if snParentChgReqNumbList:
309     nl=outputFile.write("|" + "; ".join(snParentChgReqNumbList))
310     else:
311     nl=outputFile.write("|")
312 nino.borges 783
313    
314 nino.borges 787 snowChngReqList = ""
315     if i in list(legacySnowToServersMatrix.keys()):
316     nl=outputFile.write("|YES")
317     for snowChngReqLine in legacySnowToServersMatrix[i]:
318     snowChngReqLine = snowChngReqLine.replace("\n","")
319     snowChngReqLine = snowChngReqLine.split("|")
320     snowChngReqDt = snowChngReqLine[2]
321     ## Grab just the date for now but can change to date and time if needed
322     snowChngReqDt = snowChngReqDt.split(" ")[0]
323     snowChngReqNumbWDate = "%s [%s]"%(snowChngReqLine[1],snowChngReqDt)
324     if snowChngReqList:
325     snowChngReqList = snowChngReqList + "; " +snowChngReqNumbWDate
326     else:
327     snowChngReqList = snowChngReqNumbWDate
328     else:
329     nl=outputFile.write("|NO")
330    
331     if snowChngReqList:
332     nl=outputFile.write("|" + snowChngReqList)
333     else:
334     nl=outputFile.write("|")
335    
336    
337 nino.borges 789
338    
339     chngReqList = ""
340     snBusinessOwnerList = set()
341     snApproverOwnerList = set()
342     snParentChgReqNumbList = set()
343    
344     if i in list(win2kChngReqToServersMatrix.keys()):
345     nl=outputFile.write("|YES")
346     for chngReqLine in win2kChngReqToServersMatrix[i]:
347     chngReqLine = chngReqLine.replace("\n","")
348     chngReqLine = chngReqLine.split("|")
349     chngReqDt = chngReqLine[3]
350     ## Grab just the date for now but can change to date and time if needed
351     chngReqDt = chngReqDt.split(" ")[0]
352     chngReqNumbWDate = "%s [%s]"%(chngReqLine[1],chngReqDt)
353     if chngReqList:
354     chngReqList = chngReqList + "; " +chngReqNumbWDate
355     else:
356     chngReqList = chngReqNumbWDate
357     if chngReqLine[4]:
358     if chngReqLine[4] == "None":
359     pass
360     else:
361     snBusinessOwnerList.add("%s [%s]"%(chngReqLine[4],chngReqLine[1]))
362     if chngReqLine[5]:
363     if chngReqLine[5] == "None":
364     pass
365     else:
366     snApproverOwnerList.add("%s [%s]"%(chngReqLine[5],chngReqLine[1]))
367     if chngReqLine[6]:
368     if chngReqLine[6] == "None":
369     pass
370     else:
371     snParentChgReqNumbList.add("%s [%s]"%(chngReqLine[6],chngReqLine[1]))
372    
373     else:
374     nl=outputFile.write("|NO")
375     if chngReqList:
376     nl=outputFile.write("|" + chngReqList)
377     else:
378     nl=outputFile.write("|")
379     if snBusinessOwnerList:
380     nl=outputFile.write("|" + "; ".join(snBusinessOwnerList))
381     else:
382     nl=outputFile.write("|")
383     if snApproverOwnerList:
384     nl=outputFile.write("|" + "; ".join(snApproverOwnerList))
385     else:
386     nl=outputFile.write("|")
387     if snParentChgReqNumbList:
388     nl=outputFile.write("|" + "; ".join(snParentChgReqNumbList))
389     else:
390     nl=outputFile.write("|")
391    
392    
393 nino.borges 771 nl = outputFile.write("\n")
394     outputFile.close()