CVE-2013-6795 (published 2013-12-24T18:55Z)

The Updater in Rackspace Openstack Windows Guest Agent for XenServer before 1.2.6.0 allows remote attackers to execute arbitrary code via a crafted serialized .NET object to TCP port 1984, which triggers the download and extraction of a ZIP file that overwrites the Agent service binary.

Severity: HIGH
CVSS v2 base score: 9.3 (AV:N/AC:M/Au:N/C:C/I:C/A:C)

Weakness information:
cwe_id: CWE-94
cwe_name: Improper Control of Generation of Code ('Code Injection')
description: The product constructs all or part of a code segment using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the syntax or behavior of the intended code segment.
extended_description: 
            When a product allows a user's input to contain code syntax, it might be possible for an attacker to craft the code in such a way that it will alter the intended control flow of the product. Such an alteration could lead to arbitrary code execution.
            Injection problems encompass a wide variety of issues -- all mitigated in very different ways. For this reason, the most effective way to discuss these weaknesses is to note the distinct features which classify them as injection weaknesses. The most important issue to note is that all injection problems share one thing in common -- i.e., they allow for the injection of control plane data into the user-controlled data plane. This means that the execution of the process may be altered by sending code in through legitimate data channels, using no other mechanism. While buffer overflows, and many other flaws, involve the use of some further issue to gain execution, injection problems need only for the data to be parsed. The most classic instantiations of this category of weakness are SQL injection and format string vulnerabilities.
         
         

Fix information:
repo_url: https://github.com/rackerlabs/openstack-guest-agents-windows-xenserver
commit_details: repo_url: https://github.com/rackerlabs/openstack-guest-agents-windows-xenserver
author: Chris Hansen
author_date: 2013-10-17 11:00:52-05:00
msg: Updated the agent and updater to use IPC communications rather than TCP.  Altered the updater update command to make it more resilient and updated the version number for a new build.
repository: repo_url: https://github.com/rackerlabs/openstack-guest-agents-windows-xenserver
repo_name: rackerlabs/openstack-guest-agents-windows-xenserver
description: Openstack Windows Guest Agent for XenServer
repo_language: C#
owner: rackerlabs
file_changes: filename: Properties.rb
change_type: ModificationType.MODIFY
diff: @@ -6,7 +6,7 @@ COPYRIGHT = "Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved
 COMPANY = "Rackspace Cloud"
 DESCRIPTION = "C#.NET Agent for Windows Virtual Machines"
 CLR_VERSION = 'v3.5'
-RELEASE_BUILD_NUMBER = "1.2.5.0"
+RELEASE_BUILD_NUMBER = "1.2.6.0"
 
 #Paths
 SLN_FILE = File.join(ABSOLUTE_PATH,'src','WindowsConfigurationAgent.sln')

programming_language: Ruby
filename: README.txt
change_type: ModificationType.MODIFY
diff: @@ -6,4 +6,6 @@ C#.NET Agent for Windows Virtual Machines
 Gems needed to run rake:
 
 rake (version 0.8.6+)
-albacore (version 0.2.2)
\ No newline at end of file
+albacore (version 0.2.2)
+fileutils
+rubyzip (version 0.9.8)
\ No newline at end of file

programming_language: Markdown
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: Rackspace.Cloud.Server.Agent.Service.csproj
change_type: ModificationType.MODIFY
diff: @@ -42,6 +42,7 @@
     <WarningLevel>4</WarningLevel>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -52,6 +53,7 @@
     <WarningLevel>4</WarningLevel>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="StructureMap, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">

programming_language: C#
filename: ServerClass.cs
change_type: ModificationType.MODIFY
diff: @@ -14,8 +14,10 @@
 //    under the License.
 
 using System;
-using System.Reflection;
-using System.Timers;
+using System.Reflection;
+using System.Text;
+using System.Timers;
+using Rackspace.Cloud.Server.Agent.Commands;
 using Rackspace.Cloud.Server.Agent.Interfaces;
 using Rackspace.Cloud.Server.Common.Logging;
 using StructureMap;
@@ -38,11 +40,15 @@ namespace Rackspace.Cloud.Server.Agent.Service {
 
             _timer = new ProdTimer { Interval = TIMER_INTERVAL_IS_SIX_SECONDS };
             _timer.Elapsed(TimerElapsed);
-            _timer.Enabled = true;
+            
 
             StructureMapConfiguration.UseDefaultStructureMapConfigFile = false;
             StructureMapConfiguration.BuildInstancesOf<ITimer>().TheDefaultIs(Registry.Object(_timer));
-            IoC.Register();
+            IoC.Register();
+
+            CheckAgentUpdater();
+
+            _timer.Enabled = true;
         }
 
         public void Onstop() {
@@ -57,6 +63,32 @@ namespace Rackspace.Cloud.Server.Agent.Service {
             } catch (Exception ex) {
                 _logger.Log("Exception was : " + ex.Message + "\nStackTrace Was: " + ex.StackTrace);
             }
-        }
+        }
+
+        private void CheckAgentUpdater()
+        {
+            try
+            {
+                var minAgentUpdater = new CommandFactory().CreateCommand(Utilities.Commands.ensureminagentupdater.ToString());
+                var result = minAgentUpdater.Execute(string.Empty);
+                if (result.ExitCode == "1")
+                {
+                    var sb = new StringBuilder();
+                    if (result.Error != null)
+                    {
+                        foreach (var error in result.Error)
+                        {
+                            sb.AppendLine(error);
+                        }
+                    }
+                    
+                    throw new Exception(sb.ToString());
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.Log(string.Format("Error checking the min version of the updater and updating: {0}", ex));
+            }
+        }
     }
 }
\ No newline at end of file

programming_language: C#
filename: app.config
change_type: ModificationType.MODIFY
diff: @@ -8,6 +8,8 @@
 		<add key="RemotingUri" value="AgentUpdater"/>
 		<add key="RemotingPort" value="1984"/>
 		<add key="AgentVersionUpdatesPath" value="C:\Program Files\Rackspace\Cloud Servers\Updates\"/>
+    <add key="IpcUriHost" value="RackspaceAgentUpdaterService"/>
+    <add key="IpcUriName" value="RackspaceAgentUpdater"/>
     <!-- | separated values -->
     <add key="FirewallRoleNames" value="rax_managed|rack_connect"/>
 	</appSettings>

programming_language: CoffeeScript
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: UpdaterUpdateSpec.cs
change_type: ModificationType.MODIFY
diff: @@ -4,6 +4,7 @@ using NUnit.Framework.SyntaxHelpers;
 using Rackspace.Cloud.Server.Agent.Actions;
 using Rackspace.Cloud.Server.Agent.Commands;
 using Rackspace.Cloud.Server.Agent.Configuration;
+using Rackspace.Cloud.Server.Common.Configuration;
 using Rackspace.Cloud.Server.Common.Logging;
 using Rhino.Mocks;
 
@@ -25,6 +26,7 @@ namespace Rackspace.Cloud.Server.Agent.Specs
         private IServiceStopper _serviceStopper;
         private IServiceStarter _serviceStarter;
         private ILogger _logger;
+        private IBackupUpdater _backupUpdater;
 
         [SetUp]
         public void Setup()
@@ -41,11 +43,12 @@ namespace Rackspace.Cloud.Server.Agent.Specs
             _logger = MockRepository.GenerateMock<ILogger>();
             _serviceStopper = MockRepository.GenerateMock<IServiceStopper>();
             _serviceStarter = MockRepository.GenerateMock<IServiceStarter>();
+            _backupUpdater = MockRepository.GenerateMock<IBackupUpdater>();
             _agentUpdateMessageHandler = new AgentUpdateMessageHandler();
 
             _logger.Stub(x => x.Log(Arg<string>.Is.Anything));
 
-            _updaterUpdate = new UpdaterUpdate(_sleeper, _downloader, _checksumValidator, _unzipper, _fileCopier, _finalizer, _serviceStopper, _serviceStarter, _connectionChecker, _agentUpdateMessageHandler, _logger);
+            _updaterUpdate = new UpdaterUpdate(_sleeper, _downloader, _checksumValidator, _unzipper, _fileCopier, _finalizer, _serviceStopper, _serviceStarter, _connectionChecker, _agentUpdateMessageHandler, _logger, _backupUpdater);
 
         }
 
@@ -70,15 +73,29 @@ namespace Rackspace.Cloud.Server.Agent.Specs
             _updaterUpdate.Execute(_agentUpdateInfo);
         }
 
-        [Test]
-        public void should_throw_UnsuccessfulCommandExecutionException_if_connection_to_updater_service_fails()
-        {
-            _sleeper.Expect(x => x.Sleep(Arg<int>.Is.Anything));
-            _connectionChecker.Stub(x => x.Check())
-                .Throw(new UnsuccessfulCommandExecutionException("error message", new ExecutableResult { ExitCode = "1" }));
-            var result = _updaterUpdate.Execute(_agentUpdateInfo);
-            Assert.That(result.ExitCode, Is.EqualTo("1"));
-            Assert.That(result.Error[0], Is.EqualTo("Update failed"));
-        }
+        //[Test]
+        //public void should_throw_UnsuccessfulCommandExecutionException_if_connection_to_updater_service_fails()
+        //{
+        //    _sleeper.Expect(x => x.Sleep(Arg<int>.Is.Anything));
+        //    _connectionChecker.Stub(x => x.Check())
+        //        .Throw(new UnsuccessfulCommandExecutionException("error message", new ExecutableResult { ExitCode = "1" }));
+        //    var result = _updaterUpdate.Execute(_agentUpdateInfo);
+        //    Assert.That(result.ExitCode, Is.EqualTo("1"));
+        //    Assert.That(result.Error[0], Is.EqualTo("Update failed"));
+        //}
+
+        //[Test]
+        //public void GetChecksum()
+        //{
+        //    ChecksumValidator val = new ChecksumValidator(_logger);
+        //    val.Validate("", @"C:\Agent Services\Single Deploy 1.2.6.0\AgentService.zip");
+        //}
+
+        //[Test]
+        //public void ExtractFile()
+        //{
+        //    new ExtractEmbededResource().Extract(@"C:\Agent Services\Testing\", Constants.UpdaterEmbeddedReleasePackagePath, Constants.UpdaterReleasePackageName);
+        //    new Unzipper(_logger).Unzip( @"C:\Agent Services\Testing\" + Constants.UpdaterReleasePackageName, @"C:\Agent Services\Testing\updater", "");
+        //}
     }
 }

programming_language: C#
filename: XentoolsUpdateSpec.cs
change_type: ModificationType.MODIFY
diff: @@ -90,15 +90,15 @@ namespace Rackspace.Cloud.Server.Agent.Specs
             _mockRepo.VerifyAll();
         }
 
-        [Test]
-        public void should_throw_UnsuccessfulCommandExecutionException_if_connection_to_updater_service_fails()
-        {
-            _sleeper.Expect(x => x.Sleep(Arg<int>.Is.Anything));
-            _connectionChecker.Stub(x => x.Check())
-                .Throw(new UnsuccessfulCommandExecutionException("error message", new ExecutableResult { ExitCode = "1" }));
-            var result = _xentoolsUpdate.Execute(_agentUpdateInfo);
-            Assert.That(result.ExitCode, Is.EqualTo("1"));
-            Assert.That(result.Error[0], Is.EqualTo("Update failed"));
-        }
+        //[Test]
+        //public void should_throw_UnsuccessfulCommandExecutionException_if_connection_to_updater_service_fails()
+        //{
+        //    _sleeper.Expect(x => x.Sleep(Arg<int>.Is.Anything));
+        //    _connectionChecker.Stub(x => x.Check())
+        //        .Throw(new UnsuccessfulCommandExecutionException("error message", new ExecutableResult { ExitCode = "1" }));
+        //    var result = _xentoolsUpdate.Execute(_agentUpdateInfo);
+        //    Assert.That(result.ExitCode, Is.EqualTo("1"));
+        //    Assert.That(result.Error[0], Is.EqualTo("Update failed"));
+        //}
     }
 }
\ No newline at end of file

programming_language: C#
filename: AgentUpdater.cs
change_type: ModificationType.MODIFY
diff: @@ -35,7 +35,7 @@ namespace Rackspace.Cloud.Server.Agent.UpdaterService {
             _agentUpdateInfo = agentUpdateInfo;
             _logger.Log(String.Format("Received from Agent the following data:\r\nURL:{0}\r\nCHECKSUM:{1}, will resume in a minute", _agentUpdateInfo.url, _agentUpdateInfo.signature));
 
-            new Timer(TimerElapsed,null,60000,0);
+            new Timer(TimerElapsed,null,10000,0);
         }
 
         private void TimerElapsed(object sender) {

programming_language: C#
filename: App.config
change_type: ModificationType.MODIFY
diff: @@ -9,6 +9,8 @@
     <add key="AgentVersionUpdatesPath" value="C:\Program Files\Rackspace\Cloud Servers\Updates\"/>
     <add key="RemotingPort" value="1984"/>
     <add key="RemotingUri" value="AgentUpdater"/>
+    <add key="IpcUriHost" value="RackspaceAgentUpdaterService"/>
+    <add key="IpcUriName" value="RackspaceAgentUpdater"/>
   </appSettings>
   <log4net>
     <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">

programming_language: Ruby
filename: HostUpdater.cs
change_type: ModificationType.MODIFY
diff: @@ -13,10 +13,13 @@
 //    License for the specific language governing permissions and limitations
 //    under the License.
 
+using System.Collections;
 using System.Reflection;
 using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Ipc;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Security.Principal;
 using Rackspace.Cloud.Server.Common.Configuration;
 using Rackspace.Cloud.Server.Common.Logging;
 using StructureMap;
@@ -40,17 +43,30 @@ namespace Rackspace.Cloud.Server.Agent.UpdaterService {
         }
 
         private void ConfigureRemotingHost() {
-            SetTcpChannel();
+            SetIpcChannel();
             SetRemotingType();
         }
 
-        private void SetTcpChannel() {
-            ChannelServices.RegisterChannel(new TcpChannel(SvcConfiguration.RemotingPort), false);
+        private void SetIpcChannel() {
+            // Get SID code for the Built in Administrators group
+            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
+            // Get the NT account related to the SID
+            NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;
+
+            IDictionary sProperties = new Hashtable();
+            sProperties["portName"] = SvcConfiguration.IpcUriHost;
+            sProperties["authorizedGroup"] = account.Value;
+
+            BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
+
+            IpcServerChannel channel = new IpcServerChannel(sProperties, serverProvider);
+            ChannelServices.RegisterChannel(channel, true);
+
         }
 
         private void SetRemotingType() {
             RemotingConfiguration.RegisterWellKnownServiceType(
-                typeof(AgentUpdater), SvcConfiguration.RemotingUri, WellKnownObjectMode.SingleCall);
+                typeof(AgentUpdater), SvcConfiguration.IpcUriName, WellKnownObjectMode.SingleCall);
         }
 
         public void OnStop() {

programming_language: C#
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: Rackspace.Cloud.Server.Agent.UpdaterService.csproj
change_type: ModificationType.MODIFY
diff: @@ -42,6 +42,7 @@
     <WarningLevel>4</WarningLevel>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -52,6 +53,7 @@
     <WarningLevel>4</WarningLevel>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="ICSharpCode.SharpZipLib, Version=0.85.5.452, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">

programming_language: C#
filename: BackupUpdater.cs
change_type: ModificationType.ADD
diff: @@ -0,0 +1,60 @@
+﻿// Copyright 2011 OpenStack LLC.
+// All Rights Reserved.
+//
+//    Licensed under the Apache License, Version 2.0 (the "License"); you may
+//    not use this file except in compliance with the License. You may obtain
+//    a copy of the License at
+//
+//         http://www.apache.org/licenses/LICENSE-2.0
+//
+//    Unless required by applicable law or agreed to in writing, software
+//    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+//    License for the specific language governing permissions and limitations
+//    under the License.
+
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Rackspace.Cloud.Server.Common.AgentUpdate;
+using Rackspace.Cloud.Server.Common.Configuration;
+using Rackspace.Cloud.Server.Common.Logging;
+
+namespace Rackspace.Cloud.Server.Agent.Actions
+{
+    public interface IBackupUpdater
+    {
+        void Backup(string sourcePath, string backupPath);
+        void Restore(string targetPath, string backupPath);
+    }
+
+    public class BackupUpdater : IBackupUpdater
+    {
+        private readonly ILogger _logger;
+        private readonly IFileCopier _fileCopier;
+
+        public BackupUpdater(ILogger logger, IFileCopier fileCopier)
+        {
+            _logger = logger;
+            _fileCopier = fileCopier;
+        }
+
+        public void Backup(string sourcePath, string backupPath)
+        {
+            if (Directory.Exists(backupPath))
+            {
+                Directory.Delete(backupPath, true);
+            }
+            Directory.CreateDirectory(backupPath);
+
+            _fileCopier.CopyFiles(sourcePath, backupPath, _logger);
+        }
+
+        public void Restore(string targetPath, string backupPath)
+        {
+            _fileCopier.CopyFiles(backupPath, targetPath, _logger);
+        }
+    }
+}

programming_language: C#
filename: ExtractEmbededResource.cs
change_type: ModificationType.ADD
diff: @@ -0,0 +1,48 @@
+﻿// Copyright 2011 OpenStack LLC.
+// All Rights Reserved.
+//
+//    Licensed under the Apache License, Version 2.0 (the "License"); you may
+//    not use this file except in compliance with the License. You may obtain
+//    a copy of the License at
+//
+//         http://www.apache.org/licenses/LICENSE-2.0
+//
+//    Unless required by applicable law or agreed to in writing, software
+//    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+//    License for the specific language governing permissions and limitations
+//    under the License.
+
+
+using System.IO;
+
+namespace Rackspace.Cloud.Server.Agent.Actions
+{
+    public interface IExtractEmbededResource
+    {
+        void Extract(string outputDir, string resourceLocation, string fileName);
+    }
+
+    public class ExtractEmbededResource : IExtractEmbededResource
+    {
+        public void Extract(string outputDir, string resourceLocation, string fileName)
+        {
+            if (!Directory.Exists(outputDir))
+            {
+                Directory.CreateDirectory(outputDir);
+            }
+
+            using (System.IO.Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceLocation))
+            {
+                using (System.IO.FileStream fileStream = new System.IO.FileStream(System.IO.Path.Combine(outputDir, fileName), System.IO.FileMode.Create))
+                {
+                    for (int i = 0; i < stream.Length; i++)
+                    {
+                        fileStream.WriteByte((byte)stream.ReadByte());
+                    }
+                    fileStream.Close();
+                }
+            }
+        }
+    }
+}

programming_language: C#
filename: ServiceStarter.cs
change_type: ModificationType.MODIFY
diff: @@ -34,20 +34,27 @@ namespace Rackspace.Cloud.Server.Agent.Actions
         }
 
         public void Start(string serviceName)
-        {
-            _logger.Log(String.Format("Starting '{0}' Service ...", serviceName));
-            var serviceController = new ServiceController(serviceName);
-            if (serviceController.Status == ServiceControllerStatus.Running)
-            {
-                _logger.Log(String.Format("'{0}' service already started.", serviceName));
-                return;
+        {
+            try
+            {
+                _logger.Log(String.Format("Starting '{0}' Service ...", serviceName));
+                var serviceController = new ServiceController(serviceName);
+                if (serviceController.Status == ServiceControllerStatus.Running)
+                {
+                    _logger.Log(String.Format("'{0}' service already started.", serviceName));
+                    return;
+                }
+
+                serviceController.Start();
+                serviceController.WaitForStatus(ServiceControllerStatus.Running);
+
+                serviceController.Close();
+                _logger.Log(String.Format("Service '{0}' started and now running ...", serviceName));
+            }
+            catch (Exception ex)
+            {
+                _logger.Log(string.Format("An error occured trying to start the {0} service: {1}", serviceName, ex));
             }
-
-            serviceController.Start();
-            serviceController.WaitForStatus(ServiceControllerStatus.Running);
-
-            serviceController.Close();
-            _logger.Log(String.Format("Service '{0}' started and now running ...", serviceName));
         }
     }
 }
\ No newline at end of file

programming_language: C#
filename: AgentUpdateMessageSender.cs
change_type: ModificationType.MODIFY
diff: @@ -13,38 +13,74 @@
 //    License for the specific language governing permissions and limitations
 //    under the License.
 
-using System;
-using Rackspace.Cloud.Server.Agent.Configuration;
-using Rackspace.Cloud.Server.Agent.Interfaces;
-using Rackspace.Cloud.Server.Common.AgentUpdate;
-using Rackspace.Cloud.Server.Common.Communication;
-using Rackspace.Cloud.Server.Common.Configuration;
-
-namespace Rackspace.Cloud.Server.Agent {
-    public class AgentUpdateMessageSender : IAgentUpdateMessageSender {
-        public void Send(AgentUpdateInfo agentUpdateInfo) {
-            IAgentUpdater agentUpdater;
-            try {
-                ConnectToRemotingHost(out agentUpdater);
-                agentUpdater.DoUpdate(agentUpdateInfo);
-            }
-            catch (Exception ex) {
-                throw new UnsuccessfulCommandExecutionException(
-                    String.Format("UPDATE FAILED: {0}", ex.Message),
-                    new ExecutableResult { ExitCode = "1" });
-            }
-        }
-
-        private void ConnectToRemotingHost(out IAgentUpdater agentUpdater) {
-            agentUpdater = (IAgentUpdater)Activator.GetObject(typeof(IAgentUpdater), BuildRemotingUri());
-        }
-
-        private string BuildRemotingUri()
-        {
-            return String.Format("tcp://{0}:{1}/{2}",
-                                 SvcConfiguration.RemotingUriHost,
-                                 SvcConfiguration.RemotingPort,
-                                 SvcConfiguration.RemotingUri);
-        }
-    }
-}
+using System;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Ipc;
+using Rackspace.Cloud.Server.Agent.Configuration;
+using Rackspace.Cloud.Server.Agent.Interfaces;
+using Rackspace.Cloud.Server.Common.AgentUpdate;
+using Rackspace.Cloud.Server.Common.Communication;
+using Rackspace.Cloud.Server.Common.Configuration;
+using Rackspace.Cloud.Server.Common.Logging;
+
+namespace Rackspace.Cloud.Server.Agent
+{
+    public class AgentUpdateMessageSender : IAgentUpdateMessageSender
+    {
+        private readonly ILogger _logger;
+        public AgentUpdateMessageSender(ILogger logger)
+        {
+            _logger = logger;
+        }
+
+        public void Send(AgentUpdateInfo agentUpdateInfo)
+        {
+            IAgentUpdater agentUpdater;
+            try
+            {
+                ConnectToRemotingHost(out agentUpdater);
+                agentUpdater.DoUpdate(agentUpdateInfo);
+            }
+            catch (Exception ex)
+            {
+                _logger.Log(string.Format("Error connecting to the Updater service: {0}", ex));
+                throw new UnsuccessfulCommandExecutionException(
+                    String.Format("UPDATE FAILED: {0}", ex.Message),
+                    new ExecutableResult { ExitCode = "1" });
+            }
+        }
+
+        private void ConnectToRemotingHost(out IAgentUpdater agentUpdater)
+        {
+            try
+            {
+                //Try connecting to the IPC server
+                IpcClientChannel clientChannel = new IpcClientChannel();
+                clientChannel.IsSecured = true;
+                ChannelServices.RegisterChannel(clientChannel);
+
+                agentUpdater = (IAgentUpdater)Activator.GetObject(typeof(IAgentUpdater), BuildIpcRemotingUri());
+                agentUpdater.Equals(null);
+            }
+            catch (RemotingException rex)
+            {
+                _logger.Log(string.Format("Error connecting to the Updater service via IPC: {0}", rex));
+
+                //IPC Server connection failed, try connecting to the TCP server if it exists, allow the exception to bubble up if it fails.
+                agentUpdater = (IAgentUpdater)Activator.GetObject(typeof(IAgentUpdater), BuildTcpRemotingUri());
+                agentUpdater.Equals(null);
+            }
+        }
+
+        private string BuildIpcRemotingUri()
+        {
+            return String.Format("ipc://{0}/{1}", SvcConfiguration.IpcUriHost, SvcConfiguration.IpcUriName);
+        }
+
+        private string BuildTcpRemotingUri()
+        {
+            return string.Format("tcp://{0}:{1}/{2}", SvcConfiguration.RemotingUriHost, SvcConfiguration.RemotingPort, SvcConfiguration.RemotingUri);
+        }
+    }
+}

programming_language: C#
filename: AgentUpdate.cs
change_type: ModificationType.MODIFY
diff: @@ -39,7 +39,6 @@ namespace Rackspace.Cloud.Server.Agent.Commands {
         }
 
         public ExecutableResult Execute(string value) {
-            _connectionChecker.Check();
             _logger.Log("Agent Update value: " + value);
             var agentUpdateInfo = _agentUpdateMessageHandler.Handle(value);
 

programming_language: C#
filename: EnsureMinAgentUpdater.cs
change_type: ModificationType.ADD
diff: @@ -0,0 +1,120 @@
+﻿// Copyright 2011 OpenStack LLC.
+// All Rights Reserved.
+//
+//    Licensed under the Apache License, Version 2.0 (the "License"); you may
+//    not use this file except in compliance with the License. You may obtain
+//    a copy of the License at
+//
+//         http://www.apache.org/licenses/LICENSE-2.0
+//
+//    Unless required by applicable law or agreed to in writing, software
+//    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+//    License for the specific language governing permissions and limitations
+//    under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Rackspace.Cloud.Server.Agent.Actions;
+using Rackspace.Cloud.Server.Agent.Configuration;
+using Rackspace.Cloud.Server.Agent.Interfaces;
+using Rackspace.Cloud.Server.Agent.Utilities;
+using Rackspace.Cloud.Server.Common.Configuration;
+using Rackspace.Cloud.Server.Common.Logging;
+
+namespace Rackspace.Cloud.Server.Agent.Commands
+{
+    public class EnsureMinAgentUpdater : IExecutableCommand
+    {
+        private readonly ISleeper _sleeper;
+        private readonly IUnzipper _unzipper;
+        private readonly IFileCopier _fileCopier;
+        private readonly IFinalizer _finalizer;
+        private readonly IServiceStopper _serviceStopper;
+        private readonly IServiceStarter _serviceStarter;
+        private readonly ILogger _logger;
+        private readonly IBackupUpdater _backupUpdater;
+        private readonly IExtractEmbededResource _extractEmbededResource;
+        private readonly IVersionChecker _versionChecker;
+
+        public EnsureMinAgentUpdater(ISleeper sleeper, IUnzipper unzipper, IFileCopier fileCopier, IFinalizer finalizer, IServiceStopper serviceStopper, IServiceStarter serviceStarter, ILogger logger, IBackupUpdater backupUpdater, IExtractEmbededResource extractEmbededResource, IVersionChecker versionChecker)
+        {
+            _sleeper = sleeper;
+            _unzipper = unzipper;
+            _fileCopier = fileCopier;
+            _finalizer = finalizer;
+            _serviceStopper = serviceStopper;
+            _serviceStarter = serviceStarter;
+            _logger = logger;
+            _backupUpdater = backupUpdater;
+            _extractEmbededResource = extractEmbededResource;
+            _versionChecker = versionChecker;
+        }
+
+        public ExecutableResult Execute(string value)
+        {
+            var backupCreated = false;
+            try
+            {
+                Statics.ShouldPollXenStore = false;
+                string versionNumber = _versionChecker.Check(Version.AGENT_UPDATER_PATH);
+                System.Version version;
+
+                try
+                {
+                    version = new System.Version(versionNumber);
+                }
+                catch (Exception ex)
+                {
+                    _logger.Log(string.Format("Version check failed, installing embedded updater.  Version Reported: {0}  Stack Trace: {1}", versionNumber, ex));
+                    version = new System.Version("0.0.0.0");
+                }
+
+                if (version < UpdaterFiles.Updater.MinimumVersion)
+                {
+                    _logger.Log(String.Format("Updating the Agent Updater... \r\nWill resume in 10 seconds..."));
+                    _sleeper.Sleep(10);
+                    _extractEmbededResource.Extract(SvcConfiguration.AgentVersionUpdatesPath, Constants.UpdaterEmbeddedReleasePackagePath, Constants.UpdaterReleasePackageName);
+                    _logger.Log("Waiting to unzip package.");
+                    _unzipper.Unzip(Constants.UpdaterReleasePackage, Constants.UpdaterUnzipPath, "");
+                    _serviceStopper.Stop("RackspaceCloudServersAgentUpdater");
+                    _backupUpdater.Backup(Constants.UpdaterPath, Constants.UpdaterBackupPath);
+                    backupCreated = true;
+                    _fileCopier.CopyFiles(Constants.UpdaterUnzipPath, Constants.UpdaterPath, _logger);
+                }
+                else
+                {
+                    _logger.Log(string.Format("Agent Updater Version: {0}  detected, not updating updater.", version));    
+                }
+
+                return new ExecutableResult();
+            }
+            catch (Exception ex)
+            {
+                try
+                {
+                    if (backupCreated)
+                    {
+                        _serviceStopper.Stop("RackspaceCloudServersAgentUpdater");
+                        _backupUpdater.Restore(Constants.UpdaterPath, Constants.UpdaterBackupPath);
+                    }
+                }
+                catch (Exception exRestore)
+                {
+                    _logger.Log(String.Format("Exception was : {0}\nStackTrace Was: {1}", exRestore.Message, exRestore.StackTrace));
+                }
+
+                _logger.Log(String.Format("Exception was : {0}\nStackTrace Was: {1}", ex.Message, ex.StackTrace));
+                return new ExecutableResult { Error = new List<string> { "Update failed" }, ExitCode = "1" };
+            }
+            finally
+            {
+                Statics.ShouldPollXenStore = true;
+                _serviceStarter.Start("RackspaceCloudServersAgentUpdater");
+                _finalizer.Finalize(new List<string> { Constants.UpdaterUnzipPath, Constants.UpdaterReleasePackage });
+            }
+        }
+
+    }
+}

programming_language: C#
filename: UpdaterUpdate.cs
change_type: ModificationType.MODIFY
diff: @@ -35,9 +35,10 @@ namespace Rackspace.Cloud.Server.Agent.Commands
         private readonly IServiceStarter _serviceStarter;
         private readonly IConnectionChecker _connectionChecker;
         private readonly IAgentUpdateMessageHandler _agentUpdateMessageHandler;
-        private readonly ILogger _logger;
-
-        public UpdaterUpdate(ISleeper sleeper, IDownloader downloader, IChecksumValidator checksumValidator, IUnzipper unzipper, IFileCopier fileCopier, IFinalizer finalizer, IServiceStopper serviceStopper, IServiceStarter serviceStarter, IConnectionChecker connectionChecker, IAgentUpdateMessageHandler agentUpdateMessageHandler, ILogger logger)
+        private readonly ILogger _logger;
+        private readonly IBackupUpdater _backupUpdater;
+
+        public UpdaterUpdate(ISleeper sleeper, IDownloader downloader, IChecksumValidator checksumValidator, IUnzipper unzipper, IFileCopier fileCopier, IFinalizer finalizer, IServiceStopper serviceStopper, IServiceStarter serviceStarter, IConnectionChecker connectionChecker, IAgentUpdateMessageHandler agentUpdateMessageHandler, ILogger logger, IBackupUpdater backupUpdater)
         {
             _sleeper = sleeper;
             _downloader = downloader;
@@ -49,36 +50,51 @@ namespace Rackspace.Cloud.Server.Agent.Commands
             _serviceStarter = serviceStarter;
             _connectionChecker = connectionChecker;
             _agentUpdateMessageHandler = agentUpdateMessageHandler;
-            _logger = logger;
+            _logger = logger;
+            _backupUpdater = backupUpdater;
         }
 
-        public ExecutableResult Execute(string value)
-        {
+        public ExecutableResult Execute(string value)
+        {
+            var backupCreated = false;
             try
             {
                 Statics.ShouldPollXenStore = false;
                 _logger.Log(String.Format("Updater Update value: {0}\r\nWill resume in 60 seconds", value));
                 _sleeper.Sleep(60);
-                _connectionChecker.Check();
                 var agentUpdateInfo = _agentUpdateMessageHandler.Handle(value);
                 _downloader.Download(agentUpdateInfo.url, Constants.UpdaterReleasePackage);
                 _checksumValidator.Validate(agentUpdateInfo.signature, Constants.UpdaterReleasePackage);
                 _unzipper.Unzip(Constants.UpdaterReleasePackage, Constants.UpdaterUnzipPath, "");
                 _serviceStopper.Stop("RackspaceCloudServersAgentUpdater");
-                _fileCopier.CopyFiles(Constants.UpdaterUnzipPath, Constants.UpdaterPath, _logger);
-                _serviceStarter.Start("RackspaceCloudServersAgentUpdater");
-                Statics.ShouldPollXenStore = true;
+                _backupUpdater.Backup(Constants.UpdaterPath, Constants.UpdaterBackupPath);
+                backupCreated = true;
+                _fileCopier.CopyFiles(Constants.UpdaterUnzipPath, Constants.UpdaterPath, _logger);
                 return new ExecutableResult();
             }
             catch (Exception ex)
-            {
+            {
+                try
+                {
+                    if (backupCreated)
+                    {
+                        _serviceStopper.Stop("RackspaceCloudServersAgentUpdater");
+                        _backupUpdater.Restore(Constants.UpdaterPath, Constants.UpdaterBackupPath);
+                    }
+                }
+                catch (Exception exRestore)
+                {
+                    _logger.Log(String.Format("Exception was : {0}\nStackTrace Was: {1}", exRestore.Message, exRestore.StackTrace));
+                }
 
                 _logger.Log(String.Format("Exception was : {0}\nStackTrace Was: {1}", ex.Message, ex.StackTrace));
                 return new ExecutableResult { Error = new List<string> { "Update failed" }, ExitCode = "1" };
             }
             finally
-            {
-                _finalizer.Finalize(new List<string> { Constants.UpdaterUnzipPath, Constants.UpdaterReleasePackage });
+            {
+                Statics.ShouldPollXenStore = true;
+                _serviceStarter.Start("RackspaceCloudServersAgentUpdater");
+                _finalizer.Finalize(new List<string> { Constants.UpdaterUnzipPath, Constants.UpdaterReleasePackage });
             }
         }
 

programming_language: C#
filename: XentoolsUpdate.cs
change_type: ModificationType.MODIFY
diff: @@ -59,7 +59,6 @@ namespace Rackspace.Cloud.Server.Agent.Commands
                 Statics.ShouldPollXenStore = false;
                 _logger.Log(String.Format("XenTools Update value: {0}\r\nWill resume in 60 seconds", value));
                 _sleeper.Sleep(60);
-                _connectionChecker.Check();
                 var agentUpdateInfo = _agentUpdateMessageHandler.Handle(value);
                 _downloader.Download(agentUpdateInfo.url, Constants.XenToolsReleasePackage);
                 _checksumValidator.Validate(agentUpdateInfo.signature, Constants.XenToolsReleasePackage);
@@ -72,7 +71,6 @@ namespace Rackspace.Cloud.Server.Agent.Commands
                 _serviceRestarter.Restart("xensvc");
                 if (_serviceRestarter.ServiceExists("XenServerVssProvider"))
                     _serviceRestarter.Restart("XenServerVssProvider");
-                Statics.ShouldPollXenStore = true;
                 return new ExecutableResult();
             }
             catch (Exception ex)
@@ -81,7 +79,8 @@ namespace Rackspace.Cloud.Server.Agent.Commands
                 return new ExecutableResult { Error = new List<string> { "Update failed" }, ExitCode = "1" };
             }
             finally
-            {
+            {
+                Statics.ShouldPollXenStore = true;
                 _finalizer.Finalize(new List<string>{Constants.XenToolsUnzipPath,Constants.XenToolsReleasePackage});
             }
         }

programming_language: C#
filename: Constants.cs
change_type: ModificationType.MODIFY
diff: @@ -52,10 +52,13 @@ namespace Rackspace.Cloud.Server.Agent {
 
         public static readonly string XenToolsReleasePackage = SvcConfiguration.AgentVersionUpdatesPath + "xensetup.exe.zip";
         public static readonly string XenToolsUnzipPath = SvcConfiguration.AgentVersionUpdatesPath + "xentools";
-        public static readonly string XenToolsSetupExecutablePath = XenToolsUnzipPath + @"\xensetup.exe";
-
-        public static readonly string UpdaterReleasePackage = SvcConfiguration.AgentVersionUpdatesPath + "UpdateService.zip";
+        public static readonly string XenToolsSetupExecutablePath = XenToolsUnzipPath + @"\xensetup.exe";
+
         public static readonly string UpdaterUnzipPath = SvcConfiguration.AgentVersionUpdatesPath + "updater";
-        public static readonly string UpdaterPath = @"C:\Program Files\Rackspace\Cloud Servers\AgentUpdater";
+        public static readonly string UpdaterBackupPath = SvcConfiguration.AgentVersionUpdatesPath + "current_updater";
+        public static readonly string UpdaterPath = @"C:\Program Files\Rackspace\Cloud Servers\AgentUpdater";
+        public static readonly string UpdaterReleasePackageName = "UpdateService.zip";
+        public static readonly string UpdaterEmbeddedReleasePackagePath = "Rackspace.Cloud.Server.Agent.UpdaterFiles.UpdateService.zip";
+        public static readonly string UpdaterReleasePackage = SvcConfiguration.AgentVersionUpdatesPath + UpdaterReleasePackageName;
     }
 }

programming_language: C#
filename: IoC.cs
change_type: ModificationType.MODIFY
diff: @@ -72,7 +72,9 @@ namespace Rackspace.Cloud.Server.Agent {
             StructureMapConfiguration.BuildInstancesOf<IVersionChecker>().TheDefaultIsConcreteType<VersionChecker>();
             StructureMapConfiguration.BuildInstancesOf<IUnzipper>().TheDefaultIsConcreteType<Unzipper>();
             StructureMapConfiguration.BuildInstancesOf<IFileCopier>().TheDefaultIsConcreteType<FileCopier>();
-            StructureMapConfiguration.BuildInstancesOf<IIPFinder>().TheDefaultIsConcreteType<IPFinder>();
+            StructureMapConfiguration.BuildInstancesOf<IIPFinder>().TheDefaultIsConcreteType<IPFinder>();
+            StructureMapConfiguration.BuildInstancesOf<IBackupUpdater>().TheDefaultIsConcreteType<BackupUpdater>();
+            StructureMapConfiguration.BuildInstancesOf<IExtractEmbededResource>().TheDefaultIsConcreteType<ExtractEmbededResource>();
 
 
             StructureMapConfiguration.BuildInstancesOf<IDiffieHellman>().TheDefaultIs(
@@ -97,7 +99,8 @@ namespace Rackspace.Cloud.Server.Agent {
             StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<Features>().WithName(Utilities.Commands.features.ToString());
             StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<Unrescue>().WithName(Utilities.Commands.unrescue.ToString());
             StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<UpdaterUpdate>().WithName(Utilities.Commands.updaterupdate.ToString());
-            StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<SetHostname>().WithName(Utilities.Commands.sethostname.ToString());
+            StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<SetHostname>().WithName(Utilities.Commands.sethostname.ToString());
+            StructureMapConfiguration.AddInstanceOf<IExecutableCommand>().UsingConcreteType<EnsureMinAgentUpdater>().WithName(Utilities.Commands.ensureminagentupdater.ToString());
         }
     }
 }

programming_language: C#
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: Rackspace.Cloud.Server.Agent.csproj
change_type: ModificationType.MODIFY
diff: @@ -73,6 +73,7 @@
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Management" />
+    <Reference Include="System.Runtime.Remoting" />
     <Reference Include="System.Security" />
     <Reference Include="System.Data" />
     <Reference Include="System.ServiceProcess" />
@@ -84,7 +85,9 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Actions\BackupUpdater.cs" />
     <Compile Include="Actions\ChecksumValidator.cs" />
+    <Compile Include="Actions\ExtractEmbededResource.cs" />
     <Compile Include="Actions\ISetHostnameAction.cs" />
     <Compile Include="Actions\SetHostnameAction.cs" />
     <Compile Include="Actions\SetProviderData.cs" />
@@ -99,6 +102,7 @@
     <Compile Include="Actions\Sleeper.cs" />
     <Compile Include="Actions\ServiceStarter.cs" />
     <Compile Include="Actions\ServiceStopper.cs" />
+    <Compile Include="Commands\EnsureMinAgentUpdater.cs" />
     <Compile Include="Commands\SetHostname.cs" />
     <Compile Include="Commands\Unrescue.cs" />
     <Compile Include="Actions\Unzipper.cs" />
@@ -114,6 +118,7 @@
     <Compile Include="Configuration\Ipv4Tuple.cs" />
     <Compile Include="Configuration\Ipv6Tuple.cs" />
     <Compile Include="Netsh\NetshFirewallRuleNameAvailable.cs" />
+    <Compile Include="UpdaterFiles\Updater.cs" />
     <Compile Include="XenProviderDataInformation.cs" />
     <Compile Include="DiffieHellmanPrerequisitesChecker.cs" />
     <Compile Include="Actions\SetNetworkRoutes.cs" />
@@ -175,6 +180,7 @@
     <None Include="app.config">
       <SubType>Designer</SubType>
     </None>
+    <EmbeddedResource Include="UpdaterFiles\UpdateService.zip" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Rackspace.Cloud.Server.Agent.DiffieHellman\Rackspace.Cloud.Server.DiffieHellman.csproj">
@@ -203,6 +209,7 @@
       <Install>true</Install>
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

programming_language: C++
filename: Updater.cs
change_type: ModificationType.ADD
diff: @@ -0,0 +1,25 @@
+﻿// Copyright 2011 OpenStack LLC.
+// All Rights Reserved.
+//
+//    Licensed under the Apache License, Version 2.0 (the "License"); you may
+//    not use this file except in compliance with the License. You may obtain
+//    a copy of the License at
+//
+//         http://www.apache.org/licenses/LICENSE-2.0
+//
+//    Unless required by applicable law or agreed to in writing, software
+//    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+//    License for the specific language governing permissions and limitations
+//    under the License.
+
+
+using System;
+
+namespace Rackspace.Cloud.Server.Agent.UpdaterFiles
+{
+    public class Updater
+    {
+        public static readonly Version MinimumVersion = new Version("1.2.6.0");
+    }
+}

programming_language: C#
filename: Commands.cs
change_type: ModificationType.MODIFY
diff: @@ -32,7 +32,8 @@ namespace Rackspace.Cloud.Server.Agent.Utilities
         features,
         unrescue,
         updaterupdate,
-        sethostname
+        sethostname,
+        ensureminagentupdater
     }
 
     public class NotUrlEncodedAttribute : Attribute

programming_language: C#
filename: SvcConfiguration.cs
change_type: ModificationType.MODIFY
diff: @@ -29,6 +29,14 @@ namespace Rackspace.Cloud.Server.Common.Configuration {
 
         public static int RemotingPort {
             get { return Convert.ToInt32(ConfigurationManager.AppSettings["RemotingPort"]); }
+        }
+
+        public static string IpcUriHost {
+            get { return ConfigurationManager.AppSettings["IpcUriHost"]; }
+        }
+
+        public static string IpcUriName {
+            get { return ConfigurationManager.AppSettings["IpcUriName"]; }
         }
 
         public static string AgentPath {

programming_language: C#
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#
filename: AssemblyInfo.cs
change_type: ModificationType.MODIFY
diff: @@ -4,4 +4,4 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyCompany("Rackspace Cloud")]
 [assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
 [assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud.  All Rights Reserved")]
-[assembly: AssemblyVersion("1.2.5.0")]
+[assembly: AssemblyVersion("1.2.6.0")]

programming_language: C#