diff --git a/Branding/branding.sh b/Branding/branding.sh index 74b5de977..379a99718 100755 --- a/Branding/branding.sh +++ b/Branding/branding.sh @@ -23,7 +23,7 @@ BRANDING_SERVER=XenServer BRANDING_BRAND_CONSOLE=$(cat ${SCRATCH_DIR}/globals | grep -w BRAND_CONSOLE | sed -e 's/BRAND_CONSOLE=//g' -e 's/"//g') # Check for the micro version override from declarations.sh and use it if present otherwise use the one from branding if [ -n "${PRODUCT_MICRO_VERSION_OVERRIDE+x}" ]; then - BRANDING_PRODUCT_MICRO_VERSION=$BRANDING_PRODUCT_MICRO_VERSION_OVERRIDE + BRANDING_PRODUCT_MICRO_VERSION=$PRODUCT_MICRO_VERSION_OVERRIDE echo Using override for micro product number of: $BRANDING_PRODUCT_MICRO_VERSION else BRANDING_PRODUCT_MICRO_VERSION=$(cat ${SCRATCH_DIR}/globals | grep -w PRODUCT_MICRO_VERSION | sed -e 's/PRODUCT_MICRO_VERSION=//g' -e 's/"//g') diff --git a/WixInstaller/XenCenter.l10n.diff b/WixInstaller/XenCenter.l10n.diff index 2ad5f4ddf..5a2503f49 100644 --- a/WixInstaller/XenCenter.l10n.diff +++ b/WixInstaller/XenCenter.l10n.diff @@ -28,8 +28,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. ---- XenCenter.wxs Fri Apr 8 15:15:52 2016 -+++ XenCenter.l10n.wxs Fri Apr 8 15:29:38 2016 +--- XenCenter.wxs Mon May 23 11:07:59 2016 ++++ XenCenter.l10n.wxs Mon May 23 11:09:01 2016 @@ -40,7 +40,7 @@ @@ -135,7 +135,7 @@ -@@ -172,13 +174,37 @@ +@@ -172,12 +174,34 @@ @@ -146,11 +146,8 @@ - + -+ -+ -+ ++ + + + @@ -174,7 +171,7 @@ -@@ -223,7 +249,7 @@ +@@ -222,7 +246,7 @@ Vital="no" Name="XenServerHealthCheck" DisplayName="[Citrix] [XenServer] Health Check Service" @@ -183,7 +180,7 @@ Start="auto" Account="LocalSystem" ErrorControl="normal" -@@ -278,13 +304,15 @@ +@@ -277,13 +301,15 @@ @@ -200,7 +197,7 @@ -@@ -292,7 +320,7 @@ +@@ -291,7 +317,7 @@ @@ -209,7 +206,7 @@ -@@ -311,7 +339,7 @@ +@@ -310,7 +336,7 @@ diff --git a/WixInstaller/XenCenter.wxs b/WixInstaller/XenCenter.wxs index 8ee98d297..e41e8d3a0 100644 --- a/WixInstaller/XenCenter.wxs +++ b/WixInstaller/XenCenter.wxs @@ -178,7 +178,6 @@ - diff --git a/XenAdmin/Controls/ComboBoxes/VgpuComboBox.cs b/XenAdmin/Controls/ComboBoxes/VgpuComboBox.cs index d5bce66e6..99410ef0d 100644 --- a/XenAdmin/Controls/ComboBoxes/VgpuComboBox.cs +++ b/XenAdmin/Controls/ComboBoxes/VgpuComboBox.cs @@ -170,6 +170,9 @@ namespace XenAdmin.Controls public bool Equals(GpuTuple other) { + if (other == null) + return false; + if (GpuGroup == null && other.GpuGroup == null) return true; if (GpuGroup == null || other.GpuGroup == null) @@ -195,6 +198,10 @@ namespace XenAdmin.Controls if (!VgpuTypes[i].Equals(other.VgpuTypes[i])) return false; } + + if ((IsGpuHeaderItem && other.IsVgpuSubitem) || + (IsVgpuSubitem && other.IsGpuHeaderItem)) + return false; } return result; diff --git a/XenAdmin/Dialogs/AttachDiskDialog.Designer.cs b/XenAdmin/Dialogs/AttachDiskDialog.Designer.cs index 1658d6ecb..dd9c96a46 100644 --- a/XenAdmin/Dialogs/AttachDiskDialog.Designer.cs +++ b/XenAdmin/Dialogs/AttachDiskDialog.Designer.cs @@ -97,6 +97,7 @@ namespace XenAdmin.Dialogs this.Controls.Add(this.DiskListTreeView); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; this.Name = "AttachDiskDialog"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AttachDiskDialog_FormClosing); this.readonlyCheckboxToolTipContainer.ResumeLayout(false); this.readonlyCheckboxToolTipContainer.PerformLayout(); this.ResumeLayout(false); diff --git a/XenAdmin/Dialogs/AttachDiskDialog.cs b/XenAdmin/Dialogs/AttachDiskDialog.cs index fe0f65d79..449641c2b 100644 --- a/XenAdmin/Dialogs/AttachDiskDialog.cs +++ b/XenAdmin/Dialogs/AttachDiskDialog.cs @@ -46,6 +46,7 @@ namespace XenAdmin.Dialogs private DiskListVdiItem oldSelected = null; private bool oldROState = false; + private Pool poolofone; private readonly CollectionChangeEventHandler SR_CollectionChangedWithInvoke; public AttachDiskDialog(VM vm) : base(vm.Connection) { @@ -60,7 +61,7 @@ namespace XenAdmin.Dialogs SR_CollectionChangedWithInvoke = Program.ProgramInvokeHandler(SR_CollectionChanged); connection.Cache.RegisterCollectionChanged(SR_CollectionChangedWithInvoke); - Pool poolofone = Helpers.GetPoolOfOne(connection); + poolofone = Helpers.GetPoolOfOne(connection); if (poolofone != null) poolofone.PropertyChanged += Server_Changed; @@ -252,6 +253,26 @@ namespace XenAdmin.Dialogs { Close(); } + + private void AttachDiskDialog_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) + { + // unsubscribe to events + foreach (SR sr in connection.Cache.SRs) + { + sr.PropertyChanged -= new PropertyChangedEventHandler(Server_Changed); + foreach (VDI TheVDI in sr.Connection.ResolveAllShownXenModelObjects(sr.VDIs, Properties.Settings.Default.ShowHiddenVMs)) + { + TheVDI.PropertyChanged -= new PropertyChangedEventHandler(Server_Changed); + } + } + + DiskListTreeView.SelectedIndexChanged -= DiskListTreeView_SelectedIndexChanged; + + if (poolofone != null) + poolofone.PropertyChanged -= Server_Changed; + + connection.Cache.DeregisterCollectionChanged(SR_CollectionChangedWithInvoke); + } } public class DiskListSrItem : CustomTreeNode @@ -363,7 +384,7 @@ namespace XenAdmin.Dialogs Description = string.Format(Messages.ATTACHDISK_SIZE_DESCRIPTION, TheVDI.Description, Util.DiskSizeString(TheVDI.virtual_size)); else Description = Util.DiskSizeString(TheVDI.virtual_size); - Image = Properties.Resources._000_VirtualStorage_h32bit_16; + Image = Images.GetImage16For(Icons.VDI); } } else @@ -375,7 +396,7 @@ namespace XenAdmin.Dialogs Description = string.Format(Messages.ATTACHDISK_SIZE_DESCRIPTION, TheVDI.Description, Util.DiskSizeString(TheVDI.virtual_size)); else Description = Util.DiskSizeString(TheVDI.virtual_size); - Image = Properties.Resources._000_VirtualStorage_h32bit_16; + Image = Images.GetImage16For(Icons.VDI); } } diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckOverviewDialog.cs b/XenAdmin/Dialogs/HealthCheck/HealthCheckOverviewDialog.cs index 7f464f8e9..22ebc2d13 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckOverviewDialog.cs +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckOverviewDialog.cs @@ -102,7 +102,7 @@ namespace XenAdmin.Dialogs.HealthCheck void Pool_BatchCollectionChanged(object sender, EventArgs e) { - LoadPools(); + Program.Invoke(Program.MainWindow, LoadPools); } #region PoolRow diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.ja.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.ja.resx index c9e5a2630..ffc031f46 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.ja.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.ja.resx @@ -129,12 +129,12 @@ NoControl - 353, 94 + 353, 127 79, 23 - + 8 @@ -166,7 +166,7 @@ None - 424, 93 + 424, 113 7 @@ -186,14 +186,14 @@ 1 - + True - + 96, 96 - 444, 129 + 444, 162 Segoe UI, 9pt diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.resx index 3fec302e5..11861a583 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.resx @@ -129,7 +129,7 @@ NoControl - 353, 94 + 353, 127 79, 23 @@ -166,7 +166,7 @@ None - 424, 80 + 424, 113 7 @@ -193,7 +193,7 @@ 96, 96 - 444, 129 + 444, 162 Segoe UI, 9pt @@ -210,4 +210,4 @@ XenAdmin.Dialogs.XenDialogBase, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + \ No newline at end of file diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.zh-CN.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.zh-CN.resx index 807f6a2ee..d47f69e20 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.zh-CN.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckPolicyStatementDialog.zh-CN.resx @@ -129,12 +129,12 @@ NoControl - 353, 94 + 353, 127 79, 23 - + 8 @@ -166,7 +166,7 @@ None - 424, 90 + 424, 113 7 @@ -186,14 +186,14 @@ 1 - + True - + 96, 96 - 444, 129 + 444, 162 Segoe UI, 9pt diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.Designer.cs b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.Designer.cs index add1fb0b7..259050f88 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.Designer.cs +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.Designer.cs @@ -211,6 +211,7 @@ namespace XenAdmin.Dialogs.HealthCheck this.tableLayoutPanel2.SetColumnSpan(this.authenticationRubricTextBox, 2); this.authenticationRubricTextBox.Cursor = System.Windows.Forms.Cursors.Default; this.authenticationRubricTextBox.Name = "authenticationRubricTextBox"; + this.authenticationRubricTextBox.ReadOnly = true; this.authenticationRubricTextBox.ShortcutsEnabled = false; this.authenticationRubricTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.authenticationRubricTextBox_LinkClicked); // diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.ja.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.ja.resx index 1da23e99f..35c38e934 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.ja.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.ja.resx @@ -59,46 +59,46 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - - - + + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -117,15 +117,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Bottom, Right - + True - + Segoe UI, 9pt @@ -487,7 +487,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="frequencyLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="frequencyNumericBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="weeksLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="dayOfweekLabel" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayComboBox" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="dayOfWeekComboBox" Row="2" RowSpan="1" Column="1" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="frequencyLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="frequencyNumericBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="weeksLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="dayOfweekLabel" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayComboBox" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="dayOfWeekComboBox" Row="2" RowSpan="1" Column="1" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -553,7 +553,7 @@ None - 589, 46 + 589, 72 24 @@ -586,13 +586,13 @@ NoControl - 20, 106 + 20, 132 20, 0, 3, 0 - 66, 29 + 63, 29 33 @@ -628,13 +628,13 @@ NoControl - 20, 135 + 20, 161 20, 0, 3, 0 - 66, 29 + 63, 29 35 @@ -661,7 +661,7 @@ Segoe UI, 9pt - 92, 138 + 89, 164 300, 23 @@ -685,7 +685,7 @@ Segoe UI, 9pt - 92, 109 + 89, 135 300, 23 @@ -715,7 +715,7 @@ NoControl - 3, 59 + 3, 85 167, 19 @@ -748,7 +748,7 @@ NoControl - 3, 84 + 3, 110 232, 19 @@ -787,7 +787,7 @@ 5 - 591, 167 + 591, 193 14 @@ -805,7 +805,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="authenticationRubricTextBox" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="label1" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBoxMyCitrixPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="textBoxMyCitrixUsername" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="existingAuthenticationRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="newAuthenticationRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,Percent,100,Absolute,20" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="authenticationRubricTextBox" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="label1" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBoxMyCitrixPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="textBoxMyCitrixUsername" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="existingAuthenticationRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="newAuthenticationRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,Percent,100,Absolute,20" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -814,7 +814,7 @@ 11, 402 - 597, 188 + 597, 218 4 @@ -910,7 +910,7 @@ 3 - Top, Bottom, Left, Right + Top, Left, Right True @@ -919,19 +919,19 @@ GrowAndShrink - + Segoe UI, 9pt - 11, 593 + 11, 623 3, 0, 3, 0 - 434, 42 + 434, 22 27 @@ -952,7 +952,7 @@ 4 - Top, Bottom, Left, Right + Bottom, Left, Right GrowAndShrink @@ -964,13 +964,13 @@ Segoe UI, 9pt - 448, 593 + 421, 627 0, 0, 0, 0 - 163, 42 + 190, 36 5 @@ -1054,13 +1054,13 @@ NoControl - 216, 138 + 213, 138 0, 5, 0, 0 - 375, 20 + 378, 20 120 @@ -1087,7 +1087,7 @@ NoControl - 197, 138 + 194, 138 3, 5, 3, 3 @@ -1174,7 +1174,7 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 23 @@ -1216,7 +1216,7 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 25 @@ -1243,7 +1243,7 @@ Segoe UI, 9pt - 92, 107 + 89, 107 300, 23 @@ -1267,7 +1267,7 @@ Segoe UI, 9pt - 92, 78 + 89, 78 300, 23 @@ -1366,7 +1366,7 @@ NoControl - 92, 133 + 89, 133 3, 0, 3, 0 @@ -1426,7 +1426,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="errorLabel" Row="5" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="testCredentialsStatusImage" Row="5" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="label4" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label5" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textboxXSPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="textboxXSUserName" Row="3" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="currentXsCredentialsRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="newXsCredentialsRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="testCredentialsButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,100,AutoSize,50,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,25" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="errorLabel" Row="5" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="testCredentialsStatusImage" Row="5" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="label4" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label5" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textboxXSPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="textboxXSUserName" Row="3" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="currentXsCredentialsRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="newXsCredentialsRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="testCredentialsButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,100,AutoSize,50,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,25" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -1471,7 +1471,7 @@ 11 - 619, 632 + 619, 671 9 @@ -1489,16 +1489,16 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="decentGroupBox2" Row="3" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBox1" Row="8" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="rubricLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="PolicyStatementLinkLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="m_ctrlError" Row="10" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="flowLayoutPanel1" Row="10" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="enrollmentCheckBox" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBoxXSCredentials" Row="7" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="Percent,100,AutoSize,0" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="decentGroupBox2" Row="3" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBox1" Row="8" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="rubricLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="PolicyStatementLinkLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="m_ctrlError" Row="10" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="flowLayoutPanel1" Row="10" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="enrollmentCheckBox" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBoxXSCredentials" Row="7" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="Percent,100,AutoSize,0" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> - + True - + 96, 96 - 619, 632 + 619, 671 Segoe UI, 9pt @@ -1515,4 +1515,4 @@ XenAdmin.Dialogs.XenDialogBase, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + \ No newline at end of file diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.resx index f0751934d..479f78361 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.resx @@ -133,7 +133,7 @@ NoControl - 4, 3 + 31, 3 75, 25 @@ -166,7 +166,7 @@ NoControl - 85, 3 + 112, 3 75, 25 @@ -553,7 +553,7 @@ None - 589, 46 + 589, 72 24 @@ -586,19 +586,19 @@ NoControl - 20, 106 + 20, 132 20, 0, 3, 0 - 66, 29 + 63, 29 33 - U&ser name: + U&sername: MiddleLeft @@ -628,13 +628,13 @@ NoControl - 20, 135 + 20, 161 20, 0, 3, 0 - 66, 29 + 63, 29 35 @@ -661,7 +661,7 @@ Segoe UI, 9pt - 92, 138 + 89, 164 300, 23 @@ -685,7 +685,7 @@ Segoe UI, 9pt - 92, 109 + 89, 135 300, 23 @@ -715,7 +715,7 @@ NoControl - 3, 59 + 3, 85 167, 19 @@ -748,7 +748,7 @@ NoControl - 3, 84 + 3, 110 232, 19 @@ -787,7 +787,7 @@ 5 - 591, 167 + 591, 193 14 @@ -814,7 +814,7 @@ 11, 402 - 597, 188 + 597, 218 4 @@ -910,7 +910,7 @@ 3 - Top, Bottom, Left, Right + Top, Left, Right True @@ -925,13 +925,13 @@ Segoe UI, 9pt - 11, 593 + 11, 623 3, 0, 3, 0 - 434, 42 + 407, 22 27 @@ -952,7 +952,7 @@ 4 - Top, Bottom, Left, Right + Bottom, Left, Right GrowAndShrink @@ -964,13 +964,13 @@ Segoe UI, 9pt - 448, 593 + 421, 627 0, 0, 0, 0 - 163, 42 + 190, 36 5 @@ -1054,13 +1054,13 @@ NoControl - 216, 138 + 213, 138 0, 5, 0, 0 - 375, 20 + 378, 20 120 @@ -1087,7 +1087,7 @@ NoControl - 197, 138 + 194, 138 3, 5, 3, 3 @@ -1174,13 +1174,13 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 23 - &User name: + &Username: MiddleLeft @@ -1216,7 +1216,7 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 25 @@ -1243,7 +1243,7 @@ Segoe UI, 9pt - 92, 107 + 89, 107 300, 23 @@ -1267,7 +1267,7 @@ Segoe UI, 9pt - 92, 78 + 89, 78 300, 23 @@ -1303,7 +1303,7 @@ 3, 28 - 351, 19 + 231, 19 21 @@ -1366,7 +1366,7 @@ NoControl - 92, 133 + 89, 133 3, 0, 3, 0 @@ -1471,7 +1471,7 @@ 11 - 619, 632 + 619, 671 9 @@ -1498,7 +1498,7 @@ 96, 96 - 619, 632 + 619, 671 Segoe UI, 9pt @@ -1515,4 +1515,4 @@ XenAdmin.Dialogs.XenDialogBase, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + \ No newline at end of file diff --git a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.zh-CN.resx b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.zh-CN.resx index 034ea038e..cc51661ed 100644 --- a/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.zh-CN.resx +++ b/XenAdmin/Dialogs/HealthCheck/HealthCheckSettingsDialog.zh-CN.resx @@ -59,46 +59,46 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - - - + + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -117,15 +117,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Bottom, Right - + True - + Segoe UI, 9pt @@ -487,7 +487,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="frequencyLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="frequencyNumericBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="weeksLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="dayOfweekLabel" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayComboBox" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="dayOfWeekComboBox" Row="2" RowSpan="1" Column="1" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="frequencyLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="frequencyNumericBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="weeksLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="dayOfweekLabel" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="timeOfDayComboBox" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="dayOfWeekComboBox" Row="2" RowSpan="1" Column="1" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -553,7 +553,7 @@ None - 589, 46 + 589, 72 24 @@ -586,13 +586,13 @@ NoControl - 20, 106 + 20, 132 20, 0, 3, 0 - 66, 29 + 63, 29 33 @@ -628,13 +628,13 @@ NoControl - 20, 135 + 20, 161 20, 0, 3, 0 - 66, 29 + 63, 29 35 @@ -661,7 +661,7 @@ Segoe UI, 9pt - 92, 138 + 89, 164 300, 23 @@ -685,7 +685,7 @@ Segoe UI, 9pt - 92, 109 + 89, 135 300, 23 @@ -715,7 +715,7 @@ NoControl - 3, 59 + 3, 85 167, 19 @@ -748,7 +748,7 @@ NoControl - 3, 84 + 3, 110 232, 19 @@ -787,7 +787,7 @@ 5 - 591, 167 + 591, 193 14 @@ -805,7 +805,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="authenticationRubricTextBox" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="label1" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBoxMyCitrixPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="textBoxMyCitrixUsername" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="existingAuthenticationRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="newAuthenticationRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,Percent,100,Absolute,20" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="authenticationRubricTextBox" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="label1" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBoxMyCitrixPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="textBoxMyCitrixUsername" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="existingAuthenticationRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="newAuthenticationRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="AutoSize,0,Percent,100,Absolute,20" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -814,7 +814,7 @@ 11, 402 - 597, 188 + 597, 218 4 @@ -910,7 +910,7 @@ 3 - Top, Bottom, Left, Right + Top, Left, Right True @@ -919,19 +919,19 @@ GrowAndShrink - + Segoe UI, 9pt - 11, 593 + 11, 623 3, 0, 3, 0 - 434, 42 + 434, 22 27 @@ -952,7 +952,7 @@ 4 - Top, Bottom, Left, Right + Bottom, Left, Right GrowAndShrink @@ -964,13 +964,13 @@ Segoe UI, 9pt - 448, 593 + 421, 627 0, 0, 0, 0 - 163, 42 + 190, 36 5 @@ -1054,13 +1054,13 @@ NoControl - 216, 138 + 213, 138 0, 5, 0, 0 - 375, 20 + 378, 20 120 @@ -1087,7 +1087,7 @@ NoControl - 197, 138 + 194, 138 3, 5, 3, 3 @@ -1174,7 +1174,7 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 23 @@ -1216,7 +1216,7 @@ 20, 0, 3, 0 - 66, 29 + 63, 29 25 @@ -1243,7 +1243,7 @@ Segoe UI, 9pt - 92, 107 + 89, 107 300, 23 @@ -1267,7 +1267,7 @@ Segoe UI, 9pt - 92, 78 + 89, 78 300, 23 @@ -1366,7 +1366,7 @@ NoControl - 92, 133 + 89, 133 3, 0, 3, 0 @@ -1426,7 +1426,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="errorLabel" Row="5" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="testCredentialsStatusImage" Row="5" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="label4" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label5" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textboxXSPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="textboxXSUserName" Row="3" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="currentXsCredentialsRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="newXsCredentialsRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="testCredentialsButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,100,AutoSize,50,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,25" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="errorLabel" Row="5" RowSpan="1" Column="3" ColumnSpan="1" /><Control Name="testCredentialsStatusImage" Row="5" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="label4" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label5" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textboxXSPassword" Row="4" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="textboxXSUserName" Row="3" RowSpan="1" Column="1" ColumnSpan="3" /><Control Name="currentXsCredentialsRadioButton" Row="1" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="newXsCredentialsRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="4" /><Control Name="testCredentialsButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,100,AutoSize,50,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,25" /></TableLayoutSettings> Segoe UI, 9pt, style=Bold @@ -1471,7 +1471,7 @@ 11 - 619, 632 + 619, 671 9 @@ -1489,16 +1489,16 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="decentGroupBox2" Row="3" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBox1" Row="8" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="rubricLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="PolicyStatementLinkLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="m_ctrlError" Row="10" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="flowLayoutPanel1" Row="10" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="enrollmentCheckBox" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBoxXSCredentials" Row="7" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="Percent,100,AutoSize,0" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="decentGroupBox2" Row="3" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBox1" Row="8" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="rubricLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="PolicyStatementLinkLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="m_ctrlError" Row="10" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="flowLayoutPanel1" Row="10" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="enrollmentCheckBox" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /><Control Name="decentGroupBoxXSCredentials" Row="7" RowSpan="1" Column="0" ColumnSpan="2" /></Controls><Columns Styles="Percent,100,AutoSize,0" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings> - + True - + 96, 96 - 619, 632 + 619, 671 Segoe UI, 9pt @@ -1515,4 +1515,4 @@ XenAdmin.Dialogs.XenDialogBase, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + \ No newline at end of file diff --git a/XenAdmin/Help/HelpManager.ja.resx b/XenAdmin/Help/HelpManager.ja.resx index 6cdb9d2e6..c32903ed3 100644 --- a/XenAdmin/Help/HelpManager.ja.resx +++ b/XenAdmin/Help/HelpManager.ja.resx @@ -1104,4 +1104,7 @@ 9000 - + + 1301 + + \ No newline at end of file diff --git a/XenAdmin/Help/HelpManager.resx b/XenAdmin/Help/HelpManager.resx index 7e55fd77f..adc506ddd 100644 --- a/XenAdmin/Help/HelpManager.resx +++ b/XenAdmin/Help/HelpManager.resx @@ -1104,4 +1104,7 @@ 9000 + + 1301 + \ No newline at end of file diff --git a/XenAdmin/Help/HelpManager.zh-CN.resx b/XenAdmin/Help/HelpManager.zh-CN.resx index 6cdb9d2e6..c32903ed3 100644 --- a/XenAdmin/Help/HelpManager.zh-CN.resx +++ b/XenAdmin/Help/HelpManager.zh-CN.resx @@ -1104,4 +1104,7 @@ 9000 - + + 1301 + + \ No newline at end of file diff --git a/XenAdmin/Help/WLB.chm b/XenAdmin/Help/WLB.chm deleted file mode 100644 index 12aeeac89..000000000 Binary files a/XenAdmin/Help/WLB.chm and /dev/null differ diff --git a/XenAdmin/Help/WLB.ja.chm b/XenAdmin/Help/WLB.ja.chm deleted file mode 100644 index 7745ad044..000000000 Binary files a/XenAdmin/Help/WLB.ja.chm and /dev/null differ diff --git a/XenAdmin/Help/WLB.zh-CN.chm b/XenAdmin/Help/WLB.zh-CN.chm deleted file mode 100644 index bc0ad73f6..000000000 Binary files a/XenAdmin/Help/WLB.zh-CN.chm and /dev/null differ diff --git a/XenAdmin/Help/XenCenter.ja.chm b/XenAdmin/Help/XenCenter.ja.chm index 2c28c61b9..6992ea787 100644 Binary files a/XenAdmin/Help/XenCenter.ja.chm and b/XenAdmin/Help/XenCenter.ja.chm differ diff --git a/XenAdmin/Help/XenCenter.zh-CN.chm b/XenAdmin/Help/XenCenter.zh-CN.chm index bd96a89f1..06e18b603 100644 Binary files a/XenAdmin/Help/XenCenter.zh-CN.chm and b/XenAdmin/Help/XenCenter.zh-CN.chm differ diff --git a/XenAdmin/MainWindow.Designer.cs b/XenAdmin/MainWindow.Designer.cs index 7b3a08bb1..321bf8050 100644 --- a/XenAdmin/MainWindow.Designer.cs +++ b/XenAdmin/MainWindow.Designer.cs @@ -280,6 +280,7 @@ namespace XenAdmin this.StatusStrip = new System.Windows.Forms.StatusStrip(); this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.statusProgressBar = new System.Windows.Forms.ToolStripProgressBar(); + this.TabPageADUpsell = new System.Windows.Forms.TabPage(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); @@ -353,6 +354,7 @@ namespace XenAdmin this.TheTabControl.Controls.Add(this.TabPageWLB); this.TheTabControl.Controls.Add(this.TabPageWLBUpsell); this.TheTabControl.Controls.Add(this.TabPageAD); + this.TheTabControl.Controls.Add(this.TabPageADUpsell); this.TheTabControl.Controls.Add(this.TabPageGPU); this.TheTabControl.Controls.Add(this.TabPageSearch); this.TheTabControl.Controls.Add(this.TabPageDockerProcess); @@ -1837,6 +1839,12 @@ namespace XenAdmin this.statusProgressBar.Name = "statusProgressBar"; this.statusProgressBar.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; // + // TabPageADUpsell + // + resources.ApplyResources(this.TabPageADUpsell, "TabPageADUpsell"); + this.TabPageADUpsell.Name = "TabPageADUpsell"; + this.TabPageADUpsell.UseVisualStyleBackColor = true; + // // MainWindow // resources.ApplyResources(this, "$this"); @@ -2098,6 +2106,7 @@ namespace XenAdmin private CommandToolStripButton resumeContainerToolStripButton; private CommandToolStripButton restartContainerToolStripButton; private CommandToolStripMenuItem healthCheckToolStripMenuItem1; + private TabPage TabPageADUpsell; } } diff --git a/XenAdmin/MainWindow.cs b/XenAdmin/MainWindow.cs index 351d29571..65d1ca803 100644 --- a/XenAdmin/MainWindow.cs +++ b/XenAdmin/MainWindow.cs @@ -97,6 +97,7 @@ namespace XenAdmin internal readonly PhysicalStoragePage PhysicalStoragePage = new PhysicalStoragePage(); internal readonly VMStoragePage VMStoragePage = new VMStoragePage(); internal readonly AdPage AdPage = new AdPage(); + internal readonly ADUpsellPage AdUpsellPage = new ADUpsellPage(); internal readonly GpuPage GpuPage = new GpuPage(); internal readonly DockerProcessPage DockerProcessPage = new DockerProcessPage(); internal readonly DockerDetailsPage DockerDetailsPage = new DockerDetailsPage(); @@ -178,6 +179,7 @@ namespace XenAdmin AddTabContents(WLBUpsellPage, TabPageWLBUpsell); AddTabContents(PhysicalStoragePage, TabPagePhysicalStorage); AddTabContents(AdPage, TabPageAD); + AddTabContents(AdUpsellPage, TabPageADUpsell); AddTabContents(GpuPage, TabPageGPU); AddTabContents(SearchPage, TabPageSearch); AddTabContents(DockerProcessPage, TabPageDockerProcess); @@ -1359,6 +1361,7 @@ namespace XenAdmin bool dmc_upsell = Helpers.FeatureForbidden(SelectionManager.Selection.FirstAsXenObject, Host.RestrictDMC); bool ha_upsell = Helpers.FeatureForbidden(SelectionManager.Selection.FirstAsXenObject, Host.RestrictHA); bool wlb_upsell = Helpers.FeatureForbidden(SelectionManager.Selection.FirstAsXenObject, Host.RestrictWLB); + bool ad_upsell = Helpers.FeatureForbidden(SelectionManager.Selection.FirstAsXenObject, Host.RestrictAD); bool is_connected = selectionConnection != null && selectionConnection.IsConnected; bool multi = SelectionManager.Selection.Count > 1; @@ -1408,7 +1411,7 @@ namespace XenAdmin if(!(SelectionManager.Selection.All(s => Helpers.IsClearwater(s.Connection)) || wlb_upsell )) ShowTab(TabPageWLB, !multi && !SearchMode && isPoolSelected); - ShowTab(TabPageAD, !multi && !SearchMode && (isPoolSelected || isHostSelected && isHostLive)); + ShowTab(ad_upsell ? TabPageADUpsell : TabPageAD, !multi && !SearchMode && (isPoolSelected || isHostSelected && isHostLive)); foreach (TabPageFeature f in pluginManager.GetAllFeatures(f => !f.IsConsoleReplacement && !multi && f.ShowTab)) ShowTab(f.TabPage, true); @@ -2387,6 +2390,8 @@ namespace XenAdmin return "TabPageBallooning" + modelObj; if (TheTabControl.SelectedTab == TabPageAD) return "TabPageAD" + modelObj; + if (TheTabControl.SelectedTab == TabPageADUpsell) + return "TabPageADUpsell" + modelObj; if (TheTabControl.SelectedTab == TabPageBallooningUpsell) return "TabPageBallooningUpsell"; if (TheTabControl.SelectedTab == TabPageWLBUpsell) diff --git a/XenAdmin/MainWindow.resx b/XenAdmin/MainWindow.resx index 5942f7c19..b981e1cf4 100644 --- a/XenAdmin/MainWindow.resx +++ b/XenAdmin/MainWindow.resx @@ -684,6 +684,33 @@ 16 + + 4, 22 + + + 3, 3, 3, 3 + + + 753, 592 + + + 21 + + + Users + + + TabPageADUpsell + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + TheTabControl + + + 17 + 4, 22 @@ -706,7 +733,7 @@ TheTabControl - 17 + 18 Fill @@ -736,7 +763,7 @@ TheTabControl - 18 + 19 4, 22 @@ -766,7 +793,7 @@ TheTabControl - 19 + 20 Fill @@ -796,7 +823,7 @@ TheTabControl - 20 + 21 Verdana, 8.25pt @@ -1699,13 +1726,13 @@ 163, 5 - 147, 22 + 146, 22 Show &Toolbar - 148, 26 + 147, 26 ToolBarContextMenu @@ -2523,7 +2550,7 @@ False - 195, 22 + 228, 22 Help &Contents @@ -2532,46 +2559,46 @@ F1 - 195, 22 + 228, 22 Conte&xt Help - 192, 6 + 225, 6 - 195, 22 + 228, 22 View [XenCenter] &Log Files - 192, 6 + 225, 6 - 195, 22 + 228, 22 [XenServer product] on the &Web - 195, 22 + 228, 22 [XenCenter] &Plugins online - 192, 6 + 225, 6 - 195, 22 + 228, 22 PluginItemsPlaceHolder - 195, 22 + 228, 22 &About [XenCenter] @@ -3794,4 +3821,4 @@ System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + \ No newline at end of file diff --git a/XenAdmin/Network/XenConnectionUI.cs b/XenAdmin/Network/XenConnectionUI.cs index 4a99856b1..e36ffb105 100644 --- a/XenAdmin/Network/XenConnectionUI.cs +++ b/XenAdmin/Network/XenConnectionUI.cs @@ -206,6 +206,9 @@ namespace XenAdmin.Network case WebExceptionStatus.SendFailure: AddError(owner, connection, string.Format(Messages.ERROR_NO_XENSERVER, ((XenConnection)connection).Hostname), string.Format(Messages.SOLUTION_CHECK_XENSERVER, ((XenConnection)connection).Hostname)); break; + case WebExceptionStatus.SecureChannelFailure: + AddError(owner, connection, string.Format(Messages.ERROR_SECURE_CHANNEL_FAILURE, ((XenConnection)connection).Hostname), Messages.SOLUTION_UNKNOWN); + break; default: AddError(owner, connection, Messages.ERROR_UNKNOWN, Messages.SOLUTION_UNKNOWN); break; diff --git a/XenAdmin/TabPages/GeneralTabPage.cs b/XenAdmin/TabPages/GeneralTabPage.cs index be96c28ce..d1909b084 100644 --- a/XenAdmin/TabPages/GeneralTabPage.cs +++ b/XenAdmin/TabPages/GeneralTabPage.cs @@ -1347,7 +1347,7 @@ namespace XenAdmin.TabPages { if (vm.virtualisation_status.HasFlag(XenAPI.VM.VirtualisationStatus.UNKNOWN)) { - s.AddEntry(FriendlyName("VM.VirtualizationState"), vm.VirtualisationStatusString); + sb.AppendLine(vm.VirtualisationStatusString); } else { diff --git a/XenAdmin/TabPages/UpsellTabPage.cs b/XenAdmin/TabPages/UpsellTabPage.cs index d588761d0..cb191a528 100644 --- a/XenAdmin/TabPages/UpsellTabPage.cs +++ b/XenAdmin/TabPages/UpsellTabPage.cs @@ -52,26 +52,35 @@ namespace XenAdmin.TabPages } } + public class ADUpsellPage : UpsellTabPage + { + public ADUpsellPage() + : base(Messages.ACTIVE_DIRECTORY_TAB_TITLE, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_AD : + Messages.UPSELL_BLURB_AD + Messages.UPSELL_BLURB_AD_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_AD) + { } + } + public class BallooningUpsellPage : UpsellTabPage { public BallooningUpsellPage() - : base(Messages.DYNAMIC_MEMORY_CONTROL, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_DMC : Messages.UPSELL_BLURB_DMC + Messages.UPSELL_BLURB_DMC_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_DMC) + : base(Messages.DYNAMIC_MEMORY_CONTROL, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_DMC : + Messages.UPSELL_BLURB_DMC + Messages.UPSELL_BLURB_DMC_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_DMC) { } } public class HAUpsellPage : UpsellTabPage { public HAUpsellPage() - : base(Messages.HIGH_AVAILABILITY, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_HA : Messages.UPSELL_BLURB_HA + Messages.UPSELL_BLURB_HA_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_HA) + : base(Messages.HIGH_AVAILABILITY, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_HA : + Messages.UPSELL_BLURB_HA + Messages.UPSELL_BLURB_HA_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_HA) { } } public class WLBUpsellPage : UpsellTabPage { public WLBUpsellPage() - : base(Messages.WORKLOAD_BALANCING, - HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_WLB : Messages.UPSELL_BLURB_WLB + Messages.UPSELL_BLURB_WLB_MORE, - InvisibleMessages.UPSELL_LEARNMOREURL_WLB) + : base(Messages.WORKLOAD_BALANCING, HiddenFeatures.LinkLabelHidden ? Messages.UPSELL_BLURB_WLB : + Messages.UPSELL_BLURB_WLB + Messages.UPSELL_BLURB_WLB_MORE, InvisibleMessages.UPSELL_LEARNMOREURL_WLB) { } } } diff --git a/XenAdmin/TestResources/credits.xml b/XenAdmin/TestResources/credits.xml index 49ef48fb9..c363b6809 100755 --- a/XenAdmin/TestResources/credits.xml +++ b/XenAdmin/TestResources/credits.xml @@ -36,6 +36,7 @@ + diff --git a/XenAdmin/Wizards/PatchingWizard/PatchingWizard_AutoUpdatingPage.cs b/XenAdmin/Wizards/PatchingWizard/PatchingWizard_AutoUpdatingPage.cs index 93de8901d..45bf739b2 100644 --- a/XenAdmin/Wizards/PatchingWizard/PatchingWizard_AutoUpdatingPage.cs +++ b/XenAdmin/Wizards/PatchingWizard/PatchingWizard_AutoUpdatingPage.cs @@ -66,9 +66,6 @@ namespace XenAdmin.Wizards.PatchingWizard private List backgroundWorkers = new List(); - private List upgradeProgressDescriptors = new List(); - - public PatchingWizard_AutoUpdatingPage() { InitializeComponent(); @@ -117,8 +114,10 @@ namespace XenAdmin.Wizards.PatchingWizard base.PageLoaded(direction); if (_thisPageHasBeenCompleted) - { - actionsWorker = null; + { + backgroundWorkers.ForEach(bgw => bgw.CancelAsync()); + backgroundWorkers.Clear(); + return; } @@ -128,6 +127,7 @@ namespace XenAdmin.Wizards.PatchingWizard { Dictionary> planActionsByHost = new Dictionary>(); Dictionary> delayedActionsByHost = new Dictionary>(); + planActionsPerPool.Add(master, new List()); foreach (var host in master.Connection.Cache.Hosts) { @@ -135,7 +135,6 @@ namespace XenAdmin.Wizards.PatchingWizard delayedActionsByHost.Add(host, new List()); } - //var master = Helpers.GetMaster(pool.Connection); var hosts = master.Connection.Cache.Hosts; var us = Updates.GetUpgradeSequence(master.Connection); @@ -163,15 +162,10 @@ namespace XenAdmin.Wizards.PatchingWizard UpdateDelayedAfterPatchGuidanceActionListForHost(delayedActionsByHost[host], host, patch); } - // now add all non-delayed actions to the pool action list + // now add all non-delayed actions to the pool action list foreach (var kvp in planActionsByHost) { - if (!planActionsPerPool.ContainsKey(master)) - { - planActionsPerPool.Add(master, new List()); - } - planActionsPerPool[master].AddRange(kvp.Value); kvp.Value.Clear(); } @@ -188,149 +182,158 @@ namespace XenAdmin.Wizards.PatchingWizard delayedActions.AddRange(kvp.Value); } - var upd = new UpgradeProgressDescriptor(master, planActionsPerPool[master], delayedActions); - upgradeProgressDescriptors.Add(upd); + if (planActionsPerPool.ContainsKey(master) && planActionsPerPool[master].Count > 0) + { + var bgw = new UpdateProgressBackgroundWorker(master, planActionsPerPool[master], delayedActions); + backgroundWorkers.Add(bgw); + } } //foreach in SelectedMasters - - //var planActions = new List(); - - //actions list for serial execution - foreach (var desc in upgradeProgressDescriptors) + foreach (var bgw in backgroundWorkers) { - //planActions.AddRange(actionListPerPool.Value); - - var bgw = new BackgroundWorker(); - backgroundWorkers.Add(bgw); - - bgw.DoWork += new DoWorkEventHandler(PatchingWizardAutomaticPatchWork); + bgw.DoWork += new DoWorkEventHandler(WorkerDoWork); bgw.WorkerReportsProgress = true; - bgw.ProgressChanged += new ProgressChangedEventHandler(actionsWorker_ProgressChanged); - bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(actionsWorker_RunWorkerCompleted); + bgw.ProgressChanged += new ProgressChangedEventHandler(WorkerProgressChanged); + bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); bgw.WorkerSupportsCancellation = true; - bgw.RunWorkerAsync(desc); + bgw.RunWorkerAsync(); } - //planActions.Add(new UnwindProblemsAction(ProblemsResolvedPreCheck)); + if (backgroundWorkers.Count == 0) + { + _thisPageHasBeenCompleted = true; + _nextEnabled = true; - //actionsWorker = new BackgroundWorker(); - //actionsWorker.DoWork += new DoWorkEventHandler(PatchingWizardAutomaticPatchWork); - //actionsWorker.WorkerReportsProgress = true; - //actionsWorker.ProgressChanged += new ProgressChangedEventHandler(actionsWorker_ProgressChanged); - //actionsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(actionsWorker_RunWorkerCompleted); - //actionsWorker.WorkerSupportsCancellation = true; - //actionsWorker.RunWorkerAsync(planActions); + OnPageUpdated(); + } } #region automatic_mode private List doneActions = new List(); private List inProgressActions = new List(); + private List errorActions = new List(); - private void actionsWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) + private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e) { var actionsWorker = sender as BackgroundWorker; - if (!actionsWorker.CancellationPending) - { - PlanAction action = (PlanAction)e.UserState; - if (e.ProgressPercentage == 0) + Program.Invoke(Program.MainWindow, () => { - inProgressActions.Add(action); - } - else - { - doneActions.Add(action); - inProgressActions.Remove(action); + if (!actionsWorker.CancellationPending) + { + PlanAction action = (PlanAction)e.UserState; + if (e.ProgressPercentage == 0) + { + inProgressActions.Add(action); + } + else + { + doneActions.Add(action); + inProgressActions.Remove(action); - progressBar.Value += (int)((float)e.ProgressPercentage / (float)backgroundWorkers.Count); //extend with error handling related numbers - } + progressBar.Value += (int)((float)e.ProgressPercentage / (float)backgroundWorkers.Count); //extend with error handling related numbers + } - var sb = new StringBuilder(); - - foreach (var pa in doneActions) - { - sb.Append(pa); - sb.AppendLine(Messages.DONE); - } - - foreach (var pa in inProgressActions) - { - sb.Append(pa); - sb.AppendLine(); - } - - textBoxLog.Text = sb.ToString(); - } + UpdateStatusTextBox(); + } + }); } - private void PatchingWizardAutomaticPatchWork(object sender, DoWorkEventArgs doWorkEventArgs) + private void UpdateStatusTextBox() { - var actionsWorker = sender as BackgroundWorker; + var sb = new StringBuilder(); - UpgradeProgressDescriptor descriptor = (UpgradeProgressDescriptor)doWorkEventArgs.Argument; + foreach (var pa in doneActions) + { + sb.Append(pa); + sb.AppendLine(Messages.DONE); + } - var actionList = descriptor.planActions.Concat(descriptor.delayedActions).ToList(); + foreach (var pa in errorActions) + { + sb.Append(pa); + sb.AppendLine(Messages.ERROR); + } - foreach (PlanAction action in actionList) + foreach (var pa in inProgressActions) + { + sb.Append(pa); + sb.AppendLine(); + } + + textBoxLog.Text = sb.ToString(); + } + + private void WorkerDoWork(object sender, DoWorkEventArgs doWorkEventArgs) + { + var bgw = sender as UpdateProgressBackgroundWorker; + + foreach (PlanAction action in bgw.AllActions) { try { - if (actionsWorker.CancellationPending) + if (bgw.CancellationPending) { - //descriptor.InProgressAction = null; doWorkEventArgs.Cancel = true; return; } - //descriptor.InProgressAction = action; - - actionsWorker.ReportProgress(0, action); + + bgw.ReportProgress(0, action); action.Run(); Thread.Sleep(1000); - //descriptor.doneActions.Add(action); + bgw.doneActions.Add(action); - actionsWorker.ReportProgress((int)((1.0 / (double)actionList.Count) * 100), action); + bgw.ReportProgress((int)((1.0 / (double)bgw.AllActions.Count) * 100), action); } catch (Exception e) { - //descriptor.FailedWithExceptionAction = action; + bgw.FailedWithExceptionAction = action; + errorActions.Add(action); + inProgressActions.Remove(action); log.Error("Failed to carry out plan.", e); - log.Debug(actionList); + log.Debug(action.Title); + doWorkEventArgs.Result = new Exception(action.Title, e); + + bgw.ReportProgress(0); break; } - finally - { - //descriptor.InProgressAction = null; - } } } - private void actionsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { - if (!e.Cancelled) - { - Exception exception = e.Result as Exception; - if (exception != null) - { - FinishedWithErrors(exception); - - } - else - { - FinishedSuccessfully(); - } + var bgw = (UpdateProgressBackgroundWorker)sender; + + Program.Invoke(Program.MainWindow, () => + { + if (!e.Cancelled) + { + Exception exception = e.Result as Exception; + if (exception != null) + { + //not showing exceptions in the meantime + } + + //if all finished + if (backgroundWorkers.All(w => !w.IsBusy)) + { + AllWorkersFinished(); + ShowErrors(); + + _thisPageHasBeenCompleted = true; + } + + _cancelEnabled = false; + _nextEnabled = true; + } + }); - progressBar.Value = 100; - _cancelEnabled = false; - _nextEnabled = true; - } OnPageUpdated(); - - _thisPageHasBeenCompleted = true; } private void UpdateDelayedAfterPatchGuidanceActionListForHost(List delayedGuidances, Host host, XenServerPatch patch) @@ -447,37 +450,67 @@ namespace XenAdmin.Wizards.PatchingWizard #endregion - private void FinishedWithErrors(Exception exception) + private void ShowErrors() { - //labelTitle.Text = string.Format(Messages.UPDATE_WAS_NOT_COMPLETED, GetUpdateName()); - - string errorMessage = null; - - if (exception != null && exception.InnerException != null && exception.InnerException is Failure) + if (ErrorMessages != null) { - var innerEx = exception.InnerException as Failure; - errorMessage = innerEx.Message; + labelTitle.Text = Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED; + labelError.Text = Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR; - if (innerEx.ErrorDescription != null && innerEx.ErrorDescription.Count > 0) - log.Error(string.Concat(innerEx.ErrorDescription.ToArray())); + textBoxLog.Text += ErrorMessages; + + log.ErrorFormat("Error message displayed: {0}", labelError.Text); + pictureBox1.Image = SystemIcons.Error.ToBitmap(); + panel1.Visible = true; } - - labelError.Text = errorMessage ?? string.Format(Messages.PATCHING_WIZARD_ERROR, exception.Message); - - log.ErrorFormat("Error message displayed: {0}", labelError.Text); - - pictureBox1.Image = SystemIcons.Error.ToBitmap(); - if (exception.InnerException is SupplementalPackInstallFailedException) - { - errorLinkLabel.Visible = true; - errorLinkLabel.Tag = exception.InnerException; - } - panel1.Visible = true; } - private void FinishedSuccessfully() + private string ErrorMessages + { + get + { + if (errorActions.Count == 0) + return null; + + var sb = new StringBuilder(); + + sb.AppendLine(); + sb.AppendLine(errorActions.Count > 1 ? Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURED : Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURED); + + foreach (var action in errorActions) + { + var exception = action.Error; + if (exception == null) + { + log.ErrorFormat("An action has failed with an empty exception. Action: {0}", action.ToString()); + continue; + } + + if (exception != null && exception.InnerException != null && exception.InnerException is Failure) + { + var innerEx = exception.InnerException as Failure; + sb.AppendLine(innerEx.Message); + + if (innerEx.ErrorDescription != null && innerEx.ErrorDescription.Count > 0) + sb.AppendLine(string.Concat(innerEx.ErrorDescription.ToArray())); + } + else + { + if (exception is Failure && ((Failure)exception).ErrorDescription != null) + sb.AppendLine(string.Concat(((Failure)exception).ErrorDescription.ToArray())); + else + sb.AppendLine(exception.Message); + } + } + + return sb.ToString(); + } + } + + private void AllWorkersFinished() { labelTitle.Text = Messages.PATCHINGWIZARD_UPDATES_DONE_AUTOMATIC_MODE; + progressBar.Value = 100; pictureBox1.Image = null; labelError.Text = Messages.CLOSE_WIZARD_CLICK_FINISH; } diff --git a/XenAdmin/Wizards/PatchingWizard/PlanActions/DownloadPatchPlanAction.cs b/XenAdmin/Wizards/PatchingWizard/PlanActions/DownloadPatchPlanAction.cs index 41589fd7f..f28608363 100644 --- a/XenAdmin/Wizards/PatchingWizard/PlanActions/DownloadPatchPlanAction.cs +++ b/XenAdmin/Wizards/PatchingWizard/PlanActions/DownloadPatchPlanAction.cs @@ -48,7 +48,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions private string tempFileName = null; public DownloadPatchPlanAction(IXenConnection connection, XenServerPatch patch, List mappings, Dictionary allDownloadedPatches) - : base(connection, string.Format("Downloading update {0}...", patch.Name)) + : base(connection, string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING, patch.Name)) { this.patch = patch; this.mappings = mappings; @@ -59,6 +59,8 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions { lock (patch) { + this._title = string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING, patch.Name); + //if it has not been already downloaded if (!AllDownloadedPatches.Any(dp => dp.Key == patch && !string.IsNullOrEmpty(dp.Value)) || !File.Exists(AllDownloadedPatches[patch])) @@ -67,7 +69,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions } else { - //already downloaded + this._title = string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING, patch.Name); } } diff --git a/XenAdmin/Wizards/PatchingWizard/PlanActions/PatchPrechecksOnMultipleHostsAction.cs b/XenAdmin/Wizards/PatchingWizard/PlanActions/PatchPrechecksOnMultipleHostsAction.cs index 1e4924b24..692200b9b 100644 --- a/XenAdmin/Wizards/PatchingWizard/PlanActions/PatchPrechecksOnMultipleHostsAction.cs +++ b/XenAdmin/Wizards/PatchingWizard/PlanActions/PatchPrechecksOnMultipleHostsAction.cs @@ -70,7 +70,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions if (problem != null) { - throw new Exception(problem.Title); + throw new Exception(string.Format("{0}: {1}. {2}", host, problem.Title, problem.Description)); } } catch (Exception ex) diff --git a/XenAdmin/Wizards/PatchingWizard/PlanActions/PlanAction.cs b/XenAdmin/Wizards/PatchingWizard/PlanActions/PlanAction.cs index c1b1c6b70..8b5a98eaf 100644 --- a/XenAdmin/Wizards/PatchingWizard/PlanActions/PlanAction.cs +++ b/XenAdmin/Wizards/PatchingWizard/PlanActions/PlanAction.cs @@ -81,7 +81,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions } } - private string _title; + protected string _title; public string Title { diff --git a/XenAdmin/Wizards/PatchingWizard/UpdateProgressBackgroundWorker.cs b/XenAdmin/Wizards/PatchingWizard/UpdateProgressBackgroundWorker.cs new file mode 100644 index 000000000..1696a86a8 --- /dev/null +++ b/XenAdmin/Wizards/PatchingWizard/UpdateProgressBackgroundWorker.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XenAdmin.Wizards.PatchingWizard.PlanActions; +using XenAPI; + +namespace XenAdmin.Wizards.PatchingWizard +{ + class UpdateProgressBackgroundWorker : BackgroundWorker + { + public List PlanActions { get; private set; } + public List DelayedActions { get; private set; } + private Host master; + + public List FinsihedActions = new List(); + public PlanAction FailedWithExceptionAction = null; + public List doneActions = new List(); + + public UpdateProgressBackgroundWorker(Host master, List planActions, List delayedActions) + { + this.master = master; + this.PlanActions = planActions; + this.DelayedActions = delayedActions; + } + + public List AllActions + { + get + { + return PlanActions.Concat(DelayedActions).ToList(); + } + } + + public int TotalNumberOfActions + { + get + { + return PlanActions.Count + DelayedActions.Count; + } + } + + public int ProgressPercent + { + get + { + return (int)(1.0 / (double)TotalNumberOfActions * (double)(FinsihedActions.Count)); + } + } + } +} diff --git a/XenAdmin/XenAdmin.csproj b/XenAdmin/XenAdmin.csproj index 88da44632..974c4a743 100644 --- a/XenAdmin/XenAdmin.csproj +++ b/XenAdmin/XenAdmin.csproj @@ -869,6 +869,9 @@ + + Component + @@ -3968,15 +3971,6 @@ Always - - Always - - - Always - - - Always - diff --git a/XenModel/Actions/AD/EnableAdAction.cs b/XenModel/Actions/AD/EnableAdAction.cs index 7c3933acf..7812c76eb 100644 --- a/XenModel/Actions/AD/EnableAdAction.cs +++ b/XenModel/Actions/AD/EnableAdAction.cs @@ -91,8 +91,16 @@ namespace XenAdmin.Actions config["pass"] = password; try { - //CA-48122: Call disable just in case it was not disabled properly - Pool.disable_external_auth(Session, Pool.opaque_ref, new Dictionary()); + try + { + //CA-48122: Call disable just in case it was not disabled properly + Pool.disable_external_auth(Session, Pool.opaque_ref, new Dictionary()); + } + catch (Exception ex) + { + log.Debug("Tried to disable AD before enabling it, but it has failed. Ignoring it, because in this case we are executing disable on best effort basis only.", ex); + } + XenAPI.Pool.enable_external_auth(Session, Pool.opaque_ref, config, domain, Auth.AUTH_TYPE_AD); } catch (Failure f) diff --git a/XenModel/FriendlyNames.resx b/XenModel/FriendlyNames.resx index b5f756864..92b0aa556 100644 --- a/XenModel/FriendlyNames.resx +++ b/XenModel/FriendlyNames.resx @@ -1215,7 +1215,7 @@ Unable to log in to XAPI session. - Pool '{0}' failed to retrieve placement recommendations from WLB for VM '{1}'. + Pool '{0}' failed to retrieve placement recommendations from WLB for '{1}'. WLB reports that the pool '{0}' is in need of optimization. The pool optimization mode is set to '{1}' and the severity of the alert is '{2}'. diff --git a/XenModel/InvisibleMessages.Designer.cs b/XenModel/InvisibleMessages.Designer.cs index 27c2a112f..2cd11945e 100644 --- a/XenModel/InvisibleMessages.Designer.cs +++ b/XenModel/InvisibleMessages.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34209 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -258,6 +258,15 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to http://www.citrix.com/xenserver/le/features/ad. + /// + public static string UPSELL_LEARNMOREURL_AD { + get { + return ResourceManager.GetString("UPSELL_LEARNMOREURL_AD", resourceCulture); + } + } + /// /// Looks up a localized string similar to http://www.citrix.com/xenserver/le/features/alerts. /// diff --git a/XenModel/InvisibleMessages.ja.resx b/XenModel/InvisibleMessages.ja.resx index ad17ffdef..13476e8c6 100644 --- a/XenModel/InvisibleMessages.ja.resx +++ b/XenModel/InvisibleMessages.ja.resx @@ -246,4 +246,7 @@ http://updates.xensource.com/XenServer/updates.xml + + http://www.citrix.com/xenserver/le/features/ad + \ No newline at end of file diff --git a/XenModel/InvisibleMessages.resx b/XenModel/InvisibleMessages.resx index 442e463d4..2081b8576 100644 --- a/XenModel/InvisibleMessages.resx +++ b/XenModel/InvisibleMessages.resx @@ -246,4 +246,7 @@ http://updates.xensource.com/XenServer/updates.xml + + http://www.citrix.com/xenserver/le/features/ad + \ No newline at end of file diff --git a/XenModel/InvisibleMessages.zh-CN.resx b/XenModel/InvisibleMessages.zh-CN.resx index 35dbb5a5c..3d2818480 100644 --- a/XenModel/InvisibleMessages.zh-CN.resx +++ b/XenModel/InvisibleMessages.zh-CN.resx @@ -246,4 +246,7 @@ http://updates.xensource.com/XenServer/updates.xml + + http://www.citrix.com/xenserver/le/features/ad + \ No newline at end of file diff --git a/XenModel/Messages.Designer.cs b/XenModel/Messages.Designer.cs index 0aaeb6e50..bddba2cbc 100755 --- a/XenModel/Messages.Designer.cs +++ b/XenModel/Messages.Designer.cs @@ -13706,6 +13706,15 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Could not create SSL/TLS secure channel.. + /// + public static string ERROR_SECURE_CHANNEL_FAILURE { + get { + return ResourceManager.GetString("ERROR_SECURE_CHANNEL_FAILURE", resourceCulture); + } + } + /// /// Looks up a localized string similar to An unknown error occurred.. /// @@ -25594,6 +25603,42 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Update process was not completed successfully. Check . + /// + public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR { + get { + return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Following error occured while automatic upgrade was in progress: . + /// + public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURED { + get { + return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURED", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Following errors occured while automatic upgrade was in progress:. + /// + public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURED { + get { + return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURED", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Update was not completed successfully. + /// + public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED { + get { + return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED", resourceCulture); + } + } + /// /// Looks up a localized string similar to Upload and Install. /// @@ -25621,6 +25666,33 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Downloading update {0}.... + /// + public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING { + get { + return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skipping download: Already downloaded update {0}.... + /// + public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING { + get { + return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waiting to download update {0}.... + /// + public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING { + get { + return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING", resourceCulture); + } + } + /// /// Looks up a localized string similar to No action required. /// @@ -25964,7 +26036,7 @@ namespace XenAdmin { } /// - /// Looks up a localized string similar to a. + /// Looks up a localized string similar to This server is not licensed for automatic updating. /// public static string PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED_FOR_BATCH_UPDATING { get { @@ -33219,6 +33291,26 @@ namespace XenAdmin { } } + /// + /// Looks up a localized string similar to Upgrade your [XenServer] license to enable Active Directory. Active Directory allows you to configure [XenServer] access control by adding named user accounts.. + /// + public static string UPSELL_BLURB_AD { + get { + return ResourceManager.GetString("UPSELL_BLURB_AD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to + /// + ///To learn more about the [XenServer] Active Directory feature or to start a [XenServer] trial, click the button below.. + /// + public static string UPSELL_BLURB_AD_MORE { + get { + return ResourceManager.GetString("UPSELL_BLURB_AD_MORE", resourceCulture); + } + } + /// /// Looks up a localized string similar to Upgrade your [XenServer] license to enable Alerting and Reporting capabilities. Email based performance and error alerting will proactively notify administrators of error conditions or performance problems before they affect critical services.. /// diff --git a/XenModel/Messages.ja.resx b/XenModel/Messages.ja.resx index b1e9aa499..994158b59 100644 --- a/XenModel/Messages.ja.resx +++ b/XenModel/Messages.ja.resx @@ -11488,6 +11488,14 @@ VM が再起動したら、[[XenServer product] Tools のインストール] を アップロード済み + + Upgrade your [XenServer] license to enable Active Directory. Active Directory allows you to configure [XenServer] access control by adding named user accounts. + + + + +To learn more about the [XenServer] Active Directory feature or to start a [XenServer] trial, click the button below. + アラートとレポート機能を使用するには、[XenServer] ライセンスをアップグレードしてください。パフォーマンス上の問題やエラー状態に関するメール アラートにより、管理者は、基幹サービスが影響を受ける前に潜在的な問題に対処することができます。 diff --git a/XenModel/Messages.resx b/XenModel/Messages.resx index 4bed4ff7e..574daf220 100755 --- a/XenModel/Messages.resx +++ b/XenModel/Messages.resx @@ -4828,6 +4828,9 @@ Would you like to eject these ISOs before continuing? [XenCenter] has encountered a problem launching PuTTY. + + Could not create SSL/TLS secure channel. + An unknown error occurred. @@ -8853,6 +8856,18 @@ However, there is not enough space to perform the repartitioning, so the current Paste + + Update process was not completed successfully. Check + + + Following errors occured while automatic upgrade was in progress: + + + Following error occured while automatic upgrade was in progress: + + + Update was not completed successfully + Upload and Install @@ -8862,6 +8877,15 @@ However, there is not enough space to perform the repartitioning, so the current Clean up... + + Downloading update {0}... + + + Skipping download: Already downloaded update {0}... + + + Waiting to download update {0}... + No action required @@ -11515,6 +11539,14 @@ Note that if RBAC is enabled, only updates which you have privileges to dismiss Uploaded + + Upgrade your [XenServer] license to enable Active Directory. Active Directory allows you to configure [XenServer] access control by adding named user accounts. + + + + +To learn more about the [XenServer] Active Directory feature or to start a [XenServer] trial, click the button below. + Upgrade your [XenServer] license to enable Alerting and Reporting capabilities. Email based performance and error alerting will proactively notify administrators of error conditions or performance problems before they affect critical services. diff --git a/XenModel/Messages.zh-CN.resx b/XenModel/Messages.zh-CN.resx index d28818dc1..21aa536d7 100644 --- a/XenModel/Messages.zh-CN.resx +++ b/XenModel/Messages.zh-CN.resx @@ -11487,6 +11487,14 @@ VM 克隆使用文件管理器的快照和克隆功能来实现高性能,并 已上载 + + 升级你的 [XenServer] 许可来激活 Active Directory 功能。Active Directory 功能允许你通过增加命名用户帐号来配置 [XenServer] 实现访问控制。 + + + + +要了解更多 [XenServer] 的 Active Directory 功能,或 获取一个 [XenServer]试用许可,请点击以下按钮。 + 升级您的 [XenServer] 许可证以启用警报和报告功能。基于电子邮件的性能和错误警报将在错误情况或性能问题对关键服务产生影响之前,抢先将这些情况或问题通知给管理员。 diff --git a/XenModel/Network/XenConnection.cs b/XenModel/Network/XenConnection.cs index 87a34e8b9..780447142 100644 --- a/XenModel/Network/XenConnection.cs +++ b/XenModel/Network/XenConnection.cs @@ -921,6 +921,10 @@ namespace XenAdmin.Network { return string.Format(Messages.CONNECT_NO_XAPI_FAILURE, this.Hostname); } + else if (w.Status == WebExceptionStatus.SecureChannelFailure) + { + return string.Format(Messages.ERROR_SECURE_CHANNEL_FAILURE, this.Hostname); + } else { return w.Message; diff --git a/XenModel/XenAPI-Extensions/Host.cs b/XenModel/XenAPI-Extensions/Host.cs index 7eaa3a26a..3382010be 100644 --- a/XenModel/XenAPI-Extensions/Host.cs +++ b/XenModel/XenAPI-Extensions/Host.cs @@ -466,6 +466,19 @@ namespace XenAPI return h._RestrictIntraPoolMigrate; } + /// + /// Active directory is restricted only if the "restrict_ad" key exists and it is true + /// + private bool _RestrictAD + { + get { return BoolKey(license_params, "restrict_ad"); } + } + + public static bool RestrictAD(Host h) + { + return h._RestrictAD; + } + private bool _RestrictReadCaching { get { return BoolKeyPreferTrue(license_params, "restrict_read_caching"); } diff --git a/mk/declarations.sh b/mk/declarations.sh index daf56d68a..949ef2c16 100644 --- a/mk/declarations.sh +++ b/mk/declarations.sh @@ -180,8 +180,8 @@ STORE_FILES=${BUILD_TOOLS}/scripts/storefiles.py # this is where the build will find the RPU hotfixes WEB_HOTFIXES_ROOT=https://repo.citrite.net/builds/xs/hotfixes -WEB_HOTFIXES=${WEB_HOTFIXES_ROOT}/${XS_BRANCH} -WEB_HOTFIXES_TRUNK=${WEB_HOTFIXES_ROOT}/trunk +WEB_HOTFIXES=${WEB_HOTFIXES_ROOT}/${XS_BRANCH}/ +WEB_HOTFIXES_TRUNK=${WEB_HOTFIXES_ROOT}/trunk/ WGET_OPT="-T 10 -N -q" WGET () { wget ${WGET_OPT} "${@}"; } diff --git a/mk/re-branding.sh b/mk/re-branding.sh index 39f795b6d..2b7047cd6 100755 --- a/mk/re-branding.sh +++ b/mk/re-branding.sh @@ -59,7 +59,7 @@ rebranding_global() -e "s#\"\[BRANDING_COPYRIGHT\]\"#${BRANDING_COPYRIGHT}#g" \ -e "s#\"\[BRANDING_COPYRIGHT_2\]\"#${BRANDING_COPYRIGHT_2}#g" \ -e "s#\[XenServer product\]#${BRANDING_PRODUCT_BRAND}#g" \ - -e "s#\[BRANDING_PRODUCT_VERSION\]#${BRANDING_PRODUCT_VERSION}#g" \ + -e "s#\[BRANDING_PRODUCT_VERSION\]#${BRANDING_XC_PRODUCT_VERSION}#g" \ -e "s#\[BRANDING_PRODUCT_VERSION_TEXT\]#${BRANDING_PRODUCT_VERSION_TEXT}#g" \ -e "s#\[xensearch\]#${BRANDING_SEARCH}#g" \ -e "s#\[xsupdate\]#${BRANDING_UPDATE}#g" \ diff --git a/mk/xenadmin-build.sh b/mk/xenadmin-build.sh index 84f039098..a24ee5487 100755 --- a/mk/xenadmin-build.sh +++ b/mk/xenadmin-build.sh @@ -131,19 +131,25 @@ source ${REPO}/Branding/branding.sh source ${REPO}/mk/re-branding.sh -function get_hotfix () +function get_hotfixes () { - local -r hotfix="$1" - local -r p=${REPO}/Branding/Hotfixes - _WGET -P ${p} ${WEB_HOTFIXES}/${hotfix} || _WGET -P ${p} ${WEB_HOTFIXES_TRUNK}/${hotfix} + local -r p="$1" + _WGET -L -np -nH -r --cut-dirs 4 -R index.html -P ${p} ${WEB_HOTFIXES} || _WGET -L -np -nH -r --cut-dirs 4 -R index.html -P ${p} ${WEB_HOTFIXES_TRUNK} } #bring RPU hotfixes if [ "${BRANDING_UPDATE}" = "xsupdate" ] then - get_hotfix RPU001/1.0/RPU001.xsupdate - get_hotfix RPU001/1.0/RPU001-src-pkgs.tar && cd ${REPO}/Branding/Hotfixes && rm -f RPU001-src-pkgs.tar.gz && gzip RPU001-src-pkgs.tar - get_hotfix RPU002/1.0/RPU002.xsupdate + echo "INFO: Bring RPU hotfixes..." + get_hotfixes ${REPO}/Branding/Hotfixes + cd ${REPO}/Branding/Hotfixes + latest=$(ls RPU001 | /usr/bin/sort -n | tail -n 1) + echo "INFO: Latest version of RPU001 hotfix is $latest" + cp RPU001/$latest/RPU001.xsupdate RPU001.xsupdate + cp RPU001/$latest/RPU001-src-pkgs.tar RPU001-src-pkgs.tar && rm -f RPU001-src-pkgs.tar.gz && gzip RPU001-src-pkgs.tar + latest=$(ls RPU002 | /usr/bin/sort -n | tail -n 1) + echo "INFO: Latest version of RPU002 hotfix is $latest" + cp RPU002/$latest/RPU002.xsupdate RPU002.xsupdate fi #build