Commit e5780d0f41dc8dfcab631895dad3ab5fe8cdb85c

Authored by Schwirg László
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));
... ...