Commit e5780d0f41dc8dfcab631895dad3ab5fe8cdb85c
1 parent
8f0de605
- egy log bejegyzés javítása
Showing
1 changed file
with
95 additions
and
58 deletions
Show diff stats
Vrh.Web.Reporting/HangfireBootstrapper.cs
... | ... | @@ -117,7 +117,7 @@ namespace Vrh.Web.HangfireBootstrapperNS |
117 | 117 | foreach (var ei in externalinitializerList) |
118 | 118 | { |
119 | 119 | var externalinitializername = $"External initializer: {ei.Method.DeclaringType.FullName}.{ei.Method.Name}()"; |
120 | - try { ei.Invoke(HangfireBootstrapper.Instance._backgroundJobServer); le.AddDataField($"{externalinitializername} SUCCESS",$"{counter}of{numofall})"); } | |
120 | + try { ei.Invoke(HangfireBootstrapper.Instance._backgroundJobServer); le.AddDataField($"{externalinitializername} SUCCESS",$"{counter}of{numofall}"); } | |
121 | 121 | catch (Exception ex) { le.AddDataField($"{externalinitializername} EXCEPTION", ex.Message); } |
122 | 122 | counter++; |
123 | 123 | } |
... | ... | @@ -210,23 +210,6 @@ namespace Vrh.Web.HangfireBootstrapperNS |
210 | 210 | const string CONFIGFILENAME = @"applicationHost.config"; |
211 | 211 | //const string FILEPATH = @"C:\temp\applicationHost.config"; |
212 | 212 | |
213 | - const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost"; | |
214 | - const string APPLICATIONPOOLS_ELEMENT = "applicationPools"; | |
215 | - const string SITES_ELEMENT = "sites"; | |
216 | - const string SERVICEAUTOSTARTPROVIDERS_ELEMENT = "serviceAutoStartProviders"; | |
217 | - const string SITE_ELEMENT = "site"; | |
218 | - const string APPLICATION_ELEMENT = "application"; | |
219 | - const string ADD_ELEMENT = "add"; | |
220 | - const string NAME_ATTRIBUTE = "name"; | |
221 | - const string TYPE_ATTRIBUTE = "type"; | |
222 | - const string SERVICEAUTOSTARTENABLED_ATTRIBUTE = "serviceAutoStartEnabled"; | |
223 | - const string SERVICEAUTOSTARTPROVIDER_ATTRIBUTE = "serviceAutoStartProvider"; | |
224 | - const string APPLICATIONPOOL_ATTRIBUTE = "applicationPool"; | |
225 | - const string PATH_ATTRIBUTE = "path"; | |
226 | - const string AUTOSTART_ATTRIBUTE = "autoStart"; | |
227 | - const string STARTMODE_ATTRIBUTE = "startMode"; | |
228 | - const string PRELOADENABLED_ATTRIBUTE = "preloadEnabled"; | |
229 | - | |
230 | 213 | bool writele = le == null; |
231 | 214 | if (le == null) { le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); }; |
232 | 215 | try |
... | ... | @@ -238,9 +221,6 @@ namespace Vrh.Web.HangfireBootstrapperNS |
238 | 221 | string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName; |
239 | 222 | string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name; |
240 | 223 | string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME); |
241 | - var filecontent = System.IO.File.ReadAllText(configfilepath); | |
242 | - XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath); | |
243 | - XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT)); | |
244 | 224 | |
245 | 225 | le.AddDataField("SetupAutoStart configfilepath", configfilepath); |
246 | 226 | le.AddDataField("SetupAutoStart applicationpoolname", applicationpoolname); |
... | ... | @@ -251,50 +231,107 @@ namespace Vrh.Web.HangfireBootstrapperNS |
251 | 231 | le.AddDataField("SetupAutoStart serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); |
252 | 232 | le.AddDataField("SetupAutoStart serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName); |
253 | 233 | |
254 | - XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))? | |
255 | - .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname); | |
256 | - XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))? | |
257 | - .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename) | |
258 | - .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname); | |
259 | - if (myapplicationpooladdelement == null) return; | |
260 | - if (mysiteapplicationelement == null) return; | |
261 | - | |
262 | - bool configchanged=false; | |
263 | - if (disablemode) | |
264 | - { | |
265 | - configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.FalseString.ToLower()) || configchanged; | |
266 | - configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.OnDemand.ToString()) || configchanged; | |
267 | - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | |
268 | - configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | |
269 | - configchanged = RemoveAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement) || configchanged; | |
270 | - | |
271 | - XElement myautostartproviderselement = myconfigrootxml.Element(XName.Get(SERVICEAUTOSTARTPROVIDERS_ELEMENT)); | |
272 | - configchanged = RemoveElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername,removecontainerifnochild:true) || configchanged; | |
273 | - } | |
274 | - else | |
234 | + string filecontent; | |
235 | + bool configchanged; | |
236 | + lock (lockerFile) | |
275 | 237 | { |
276 | - configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.TrueString.ToLower()) || configchanged; | |
277 | - configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.AlwaysRunning.ToString()) || configchanged; | |
278 | - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | |
279 | - configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | |
280 | - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged; | |
238 | + bool usefilestream = false; | |
239 | + if (usefilestream) | |
240 | + { | |
241 | + FileStream file=null; StreamReader reader = null; StreamWriter writer = null; | |
242 | + try | |
243 | + { | |
244 | + int opentriescounter = 0; | |
245 | + while (true) | |
246 | + { | |
247 | + try { file = new FileStream(configfilepath, FileMode.Open, FileAccess.ReadWrite, FileShare.None); break; } | |
248 | + catch | |
249 | + { | |
250 | + if (opentriescounter++ > 5) throw new Exception("ERROR! in accessing config file. Maybe it is open in other application!"); | |
251 | + Thread.Sleep(20); | |
252 | + } | |
253 | + } | |
281 | 254 | |
282 | - configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out XElement myautostartproviderselement) || configchanged; | |
283 | - configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out XElement myautostartprovideraddelement) || configchanged; | |
284 | - configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged; | |
285 | - } | |
286 | - | |
287 | - if (configchanged) | |
288 | - { | |
289 | - //configxml.Save(configfilepath); | |
290 | - System.IO.File.WriteAllText(configfilepath, configxml.ToString()); | |
255 | + reader = new StreamReader(file, Encoding.ASCII); | |
256 | + filecontent = ProcessFileContent(le, reader.ReadToEnd(), applicationpoolname, websitename, webapplicationname, autostartprovidername, serviceAutoStartProviderAssassemblyName, serviceAutoStartProviderTypeFullName, disablemode); | |
257 | + configchanged = filecontent != null; | |
258 | + if (configchanged) | |
259 | + { | |
260 | + writer = new StreamWriter(file, Encoding.ASCII); | |
261 | + writer.Write(filecontent); | |
262 | + } | |
263 | + } | |
264 | + finally { try { writer?.Dispose(); } catch { } try { reader?.Dispose();} catch { } try { file?.Dispose(); } catch { } } | |
265 | + } | |
266 | + else | |
267 | + { | |
268 | + filecontent = ProcessFileContent(le, System.IO.File.ReadAllText(configfilepath), applicationpoolname, websitename, webapplicationname, autostartprovidername, serviceAutoStartProviderAssassemblyName, serviceAutoStartProviderTypeFullName, disablemode); | |
269 | + configchanged = filecontent != null; | |
270 | + if (configchanged) System.IO.File.WriteAllText(configfilepath, filecontent); | |
271 | + } | |
291 | 272 | } |
292 | 273 | string modetxt = disablemode ? "DISABLED" : "ENABLED"; |
293 | - le.AddSuccessResult("SetupAutoStart " + (configchanged ? $"SUCCESSFULLY {modetxt}" : $"NO CHANGE, ALREADY {modetxt}")); | |
274 | + le.AddDataField("SetupAutoStart SUCCESS RESULT",configchanged ? modetxt : $"NO CHANGE, ALREADY {modetxt}"); | |
294 | 275 | } |
295 | - catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return; } | |
276 | + catch (Exception ex) { le.AddDataField("SetupAutoStart EXCEPTION",ex.Message); le.SetLogLevel(LogLevel.Error); return; } | |
296 | 277 | finally { if (writele) le.Write(); } |
297 | 278 | } |
279 | + private static string ProcessFileContent(DCLogEntry le, string filecontent,string applicationpoolname,string websitename,string webapplicationname,string autostartprovidername,string serviceAutoStartProviderAssassemblyName, string serviceAutoStartProviderTypeFullName,bool disablemode) | |
280 | + { | |
281 | + const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost"; | |
282 | + const string APPLICATIONPOOLS_ELEMENT = "applicationPools"; | |
283 | + const string SITES_ELEMENT = "sites"; | |
284 | + const string SERVICEAUTOSTARTPROVIDERS_ELEMENT = "serviceAutoStartProviders"; | |
285 | + const string SITE_ELEMENT = "site"; | |
286 | + const string APPLICATION_ELEMENT = "application"; | |
287 | + const string ADD_ELEMENT = "add"; | |
288 | + const string NAME_ATTRIBUTE = "name"; | |
289 | + const string TYPE_ATTRIBUTE = "type"; | |
290 | + const string SERVICEAUTOSTARTENABLED_ATTRIBUTE = "serviceAutoStartEnabled"; | |
291 | + const string SERVICEAUTOSTARTPROVIDER_ATTRIBUTE = "serviceAutoStartProvider"; | |
292 | + const string APPLICATIONPOOL_ATTRIBUTE = "applicationPool"; | |
293 | + const string PATH_ATTRIBUTE = "path"; | |
294 | + const string AUTOSTART_ATTRIBUTE = "autoStart"; | |
295 | + const string STARTMODE_ATTRIBUTE = "startMode"; | |
296 | + const string PRELOADENABLED_ATTRIBUTE = "preloadEnabled"; | |
297 | + | |
298 | + XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); | |
299 | + XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT)); | |
300 | + | |
301 | + XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))? | |
302 | + .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname); | |
303 | + XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))? | |
304 | + .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename) | |
305 | + .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname); | |
306 | + if (myapplicationpooladdelement == null || mysiteapplicationelement == null) return null; | |
307 | + | |
308 | + bool configchanged = false; | |
309 | + if (disablemode) | |
310 | + { | |
311 | + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.FalseString.ToLower()) || configchanged; | |
312 | + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.OnDemand.ToString()) || configchanged; | |
313 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | |
314 | + configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | |
315 | + configchanged = RemoveAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement) || configchanged; | |
316 | + | |
317 | + XElement myautostartproviderselement = myconfigrootxml.Element(XName.Get(SERVICEAUTOSTARTPROVIDERS_ELEMENT)); | |
318 | + configchanged = RemoveElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, removecontainerifnochild: true) || configchanged; | |
319 | + } | |
320 | + else | |
321 | + { | |
322 | + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.TrueString.ToLower()) || configchanged; | |
323 | + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.AlwaysRunning.ToString()) || configchanged; | |
324 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | |
325 | + configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | |
326 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged; | |
327 | + | |
328 | + configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out XElement myautostartproviderselement) || configchanged; | |
329 | + configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out XElement myautostartprovideraddelement) || configchanged; | |
330 | + configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged; | |
331 | + } | |
332 | + return configxml.ToString(); | |
333 | + } | |
334 | + private static object lockerFile = new Object(); | |
298 | 335 | private static bool RemoveAttribute(string attributetoremovename, XElement attrcontainer) |
299 | 336 | { |
300 | 337 | XAttribute attr = attrcontainer.Attribute(XName.Get(attributetoremovename)); | ... | ... |