public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 64;
            ServicePointManager.Expect100Continue      = false;
            ServicePointManager.UseNagleAlgorithm      = false;


            var proxyHost = new RestartingProcessHost(CreateProxyProcess(), cts,
                                                      RestartingProcessHost.RestartPolicy.IgnoreCrashes());

            this.proxyTask = proxyHost.StartRunTask();


            this.agentTask = this.agent.Start(cts);

            return(base.OnStart());
        }
Ejemplo n.º 2
0
        public Task Start(CancellationTokenSource cts)
        {
            Trace.TraceInformation("Launching message pump");
            var agentTask = Task.Factory.StartNew(
                async() => await RunAsync(cts.Token),
                cts.Token,
                TaskCreationOptions.LongRunning,
                TaskScheduler.Current).Unwrap();

            Trace.TraceInformation("Launching game server process from agent");
            var innerGameServerPort = 4002;
            var host = new RestartingProcessHost(CreateGameServerRecipy(innerGameServerPort), cts,
                                                 RestartingProcessHost.RestartPolicy.MaximumLaunchTimes(1));
            var runningHostTask = host.StartRunTask();

            runningHosts.Add(runningHostTask);

            return(agentTask);
        }
Ejemplo n.º 3
0
        public override bool OnStart()
        {
            info("Onstart() called");

            #region Download and install apps

            #region some helpers

            Func<string, string> setting = RoleEnvironment.GetConfigurationSettingValue;

            Action<string, string> extract = (localfilename, folder) =>
            {
                #region extract

                localfilename = new FileInfo(localfilename).FullName;

                info(string.Format("INFO: Requested to extract file \"{0}\" to folder \"{1}\"", localfilename, folder));

                if (!File.Exists(localfilename))
                {
                    error(string.Format("FATAL: Cannot find file {0}", localfilename));
                    throw new FileNotFoundException(string.Format("Missing file {0}", localfilename));
                }

                using (var zip = Ionic.Zip.ZipFile.Read(localfilename))
                {
                    zip.ExtractAll(folder, ExtractExistingFileAction.OverwriteSilently);
                }

                info(string.Format("INFO: Extracted file \"{0}\" to folder \"{1}\"", localfilename, folder));

                #endregion
            };

            #region downloadPublic

            //Action<string,string> downloadPublic = (filename, localfilename) =>
            //{
            //    // if (File.Exists(filename)) return;
            //    var address = string.Format("https://{0}.blob.core.windows.net/{1}/{2}",
            //                    setting(SettingsNames.TMG_Blob_Account),
            //                    setting(SettingsNames.TMG_Blob_Container), filename);
            //    Trace.TraceInformation(string.Format("Downloading {0} to {1}", address, filename));
            //    new WebClient().DownloadFile(address, localfilename);
            //};

            #endregion

            Action<string, string> downloadPrivate = (filename, localfilename) =>
            {
                #region downloadPrivate

                if (File.Exists(localfilename))
                {
                    warning(string.Format("INFO: File \"{0}\" alrady exists, skipping download", localfilename));
                    return;
                }

                var connectionString = setting(SettingsNames.TMG_Storage_ConnectionString);
                var containerName = setting(SettingsNames.TMG_Storage_PrivateBlobContainer);

                var account = CloudStorageAccount.Parse(connectionString);
                var blobClient = account.CreateCloudBlobClient();
                var privateContainer = blobClient.GetContainerReference(containerName);
                var blob = privateContainer.GetBlobReference(filename);

                info(string.Format("Try to download blob {0}", blob.Uri.AbsoluteUri));

                try
                {
                    blob.FetchAttributes();
                    blob.DownloadToFile(localfilename);
                    info(string.Format("Successfully downloaded blob {0}", blob.Uri.AbsoluteUri));
                }
                catch
                {
                    error(string.Format("Failed to download blob {0}", blob.Uri.AbsoluteUri));
                }

                #endregion
            };

            Action<string, string, string, Action<string, string>> downloadAndExtract = (filename, localfilename, folder, download) =>
            {
                download(filename, localfilename);
                extract(localfilename, folder);

                info(string.Format("Installed {0}", filename));
            };

            #endregion

            bool installSuccessful = false;
            while (!installSuccessful)
            {
                try
                {
                    SettingsNames.Files
                        .AsParallel()
                        .ForAll(filename => downloadAndExtract(
                            filename, Path.Combine(SettingsNames.TomcatFolder, filename), 
                            SettingsNames.TomcatFolder, downloadPrivate));
                    installSuccessful = true;
                }
                catch (Exception ex)
                {
                    error("Problem during installation, trying again: " + ex.Message);
                }
            }

            #endregion

            #region patch app configuration

            #region patch app.ini

            File.Delete(relToTomcat(tomcatFolder, @"webapps\tmg\WEB-INF\app.ini"));
            var content = File.ReadAllText(@"tomcat_5.0.28\webapps\tmg\WEB-INF\app.ini");
            content = content.Replace("THE_BASE_FOLDER", SettingsNames.TomcatFolder);
            File.WriteAllText(relToTomcat(tomcatFolder, @"webapps\tmg\WEB-INF\app.ini"), content);

            info(string.Format("Patched {0}", relToTomcat(tomcatFolder, @"webapps\tmg\WEB-INF\app.ini")));

            #endregion

            #region patch IP address and port

            Action<XDocument, string,string,string> setAttr = (doc, xpath, attributeName, attributeValue) =>
            {
                XElement o = doc.XPathSelectElement(xpath);
                var attr = o.Attribute(attributeName);
                if (attr == null)
                {
                    attr = new XAttribute(attributeName, attributeValue);
                    o.Add(attr);
                }
                else
                {
                    attr.Value = attributeValue;
                }
            };

            var server_xml_filename = relToTomcat(tomcatFolder, @"conf\server.xml");
            var server_xml = XDocument.Parse(File.ReadAllText(server_xml_filename));

            #region shutdown port. This unfortunately binds globally, so we cannot specify an IPListenAddress. That's why each Tomcat instance in the development fabric needs it's own port..

            var s = RoleEnvironment.CurrentRoleInstance.Id;
            s = s.Substring(s.LastIndexOf("_") + 1);
            int shutdownPortOffset = int.Parse(s);
            int shutdownPort = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tomcatShutdownPort"].IPEndpoint.Port + shutdownPortOffset;
            setAttr(server_xml, "/Server", "port", shutdownPort.ToString());

            #endregion

            setAttr(server_xml, "/Server/Service[@name='Catalina']/Connector[1]", "port", 
                RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tomcat"].IPEndpoint.Port.ToString());
            setAttr(server_xml, "/Server/Service[@name='Catalina']/Connector[1]", "address",
                    RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tomcat"].IPEndpoint.Address.ToString());
            setAttr(server_xml, "/Server/Service[@name='Catalina']/Connector[2]", "address",
                    RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tomcat"].IPEndpoint.Address.ToString());

            File.WriteAllText(server_xml_filename, server_xml.ToString());

            #endregion

            #endregion

            // Set the maximum number of concurrent connections 
            ServicePointManager.DefaultConnectionLimit = 12;

            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

            #region Log files

            ServicePointManager.DefaultConnectionLimit = 12;

            var scheduledTransferPeriod = TimeSpan.FromMinutes(1);
            var diagConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
            diagConfig.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Information;
            diagConfig.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = scheduledTransferPeriod;
            diagConfig.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Warning;
            diagConfig.WindowsEventLog.ScheduledTransferPeriod = scheduledTransferPeriod;
            diagConfig.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
            diagConfig.Logs.ScheduledTransferPeriod = scheduledTransferPeriod;

            #region Add custom folders to log

            new string[][]
            {
                new string[] {@"sis\reports", "sisreports"},
                new string[] {@"sis\docs", "sisdocs"},
                new string[] {@"sis\oppdocs", "sisoppdocs"}
            }
            .Select(entry => new DirectoryConfiguration
            {
                Path = new DirectoryInfo(Path.Combine(SettingsNames.TomcatFolder, entry[0])).FullName,
                Container = entry[1],
                DirectoryQuotaInMB = 100
            }).ToList()
            .ForEach(diagConfig.Directories.DataSources.Add);

            diagConfig.Directories.ScheduledTransferPeriod = scheduledTransferPeriod;

            #endregion

            diagConfig.ConfigurationChangePollInterval = TimeSpan.FromMinutes(1);
            DiagnosticMonitor.Start(DiagnosticsConnectionString, diagConfig);

            #endregion

            RoleEnvironment.Stopping += (sender, args) => cancellationTokenSource.Cancel();

            restartingProcessHost = new RestartingProcessHost(
                CreateTomcatProcessFactory(CatalinaAction.start), 
                cancellationTokenSource)
            {
                error = error,
                info = info,
                warn = warning
            };

            #region Setup ARR

            Action<ServerManager> configureApplicationRequestRouting = sm => { info("Here I would call server manager..."); Thread.Sleep(TimeSpan.FromSeconds(1)); };
            ServerManagerBarrier.ApplyServerManagerActions(configureApplicationRequestRouting);

            #endregion

            info("OnStart() finished");
            return base.OnStart();
        }