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,7 +117,7 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
117 | foreach (var ei in externalinitializerList) | 117 | foreach (var ei in externalinitializerList) |
118 | { | 118 | { |
119 | var externalinitializername = $"External initializer: {ei.Method.DeclaringType.FullName}.{ei.Method.Name}()"; | 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 | catch (Exception ex) { le.AddDataField($"{externalinitializername} EXCEPTION", ex.Message); } | 121 | catch (Exception ex) { le.AddDataField($"{externalinitializername} EXCEPTION", ex.Message); } |
122 | counter++; | 122 | counter++; |
123 | } | 123 | } |
@@ -210,23 +210,6 @@ namespace Vrh.Web.HangfireBootstrapperNS | @@ -210,23 +210,6 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
210 | const string CONFIGFILENAME = @"applicationHost.config"; | 210 | const string CONFIGFILENAME = @"applicationHost.config"; |
211 | //const string FILEPATH = @"C:\temp\applicationHost.config"; | 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 | bool writele = le == null; | 213 | bool writele = le == null; |
231 | if (le == null) { le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); }; | 214 | if (le == null) { le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); }; |
232 | try | 215 | try |
@@ -238,9 +221,6 @@ namespace Vrh.Web.HangfireBootstrapperNS | @@ -238,9 +221,6 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
238 | string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName; | 221 | string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName; |
239 | string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name; | 222 | string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name; |
240 | string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME); | 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 | le.AddDataField("SetupAutoStart configfilepath", configfilepath); | 225 | le.AddDataField("SetupAutoStart configfilepath", configfilepath); |
246 | le.AddDataField("SetupAutoStart applicationpoolname", applicationpoolname); | 226 | le.AddDataField("SetupAutoStart applicationpoolname", applicationpoolname); |
@@ -251,50 +231,107 @@ namespace Vrh.Web.HangfireBootstrapperNS | @@ -251,50 +231,107 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
251 | le.AddDataField("SetupAutoStart serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); | 231 | le.AddDataField("SetupAutoStart serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); |
252 | le.AddDataField("SetupAutoStart serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName); | 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 | string modetxt = disablemode ? "DISABLED" : "ENABLED"; | 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 | finally { if (writele) le.Write(); } | 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 | private static bool RemoveAttribute(string attributetoremovename, XElement attrcontainer) | 335 | private static bool RemoveAttribute(string attributetoremovename, XElement attrcontainer) |
299 | { | 336 | { |
300 | XAttribute attr = attrcontainer.Attribute(XName.Get(attributetoremovename)); | 337 | XAttribute attr = attrcontainer.Attribute(XName.Get(attributetoremovename)); |