CP-35632: Support for new alerts.

Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
This commit is contained in:
Konstantina Chremmou 2020-12-16 23:59:38 +00:00
parent f4e17109c8
commit f2eb3fa973
8 changed files with 676 additions and 49 deletions

View File

@ -30,7 +30,6 @@
*/
using System;
using System.Linq;
using System.Xml;
using XenAdmin.Commands;
using XenAdmin.Core;
@ -41,14 +40,11 @@ namespace XenAdmin.Alerts
{
public class CertificateAlert : MessageAlert
{
private readonly Host _host;
private readonly DateTime? _certificateExpiryDate;
public CertificateAlert(Message m)
: base(m)
{
_host = m.Connection.Cache.Hosts.FirstOrDefault(h => h.uuid == m.obj_uuid);
try
{
var doc = new XmlDocument();
@ -70,8 +66,57 @@ namespace XenAdmin.Alerts
{
switch (Message.Type)
{
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRED_TITLE, XenObject.Name());
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_07:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_14:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_30:
if (_certificateExpiryDate.HasValue && _certificateExpiryDate.Value > Timestamp)
{
var eta = _certificateExpiryDate.Value - Timestamp;
if (eta.TotalDays >= 1)
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRING_TITLE_DAYS, XenObject.Name(),
Math.Round(eta.TotalDays, MidpointRounding.AwayFromZero));
if (eta.TotalHours >= 1)
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRING_TITLE_HOURS, XenObject.Name(),
Math.Round(eta.TotalHours, MidpointRounding.AwayFromZero));
if (eta.TotalMinutes >= 1)
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRING_TITLE_MINUTES, XenObject.Name(),
Math.Round(eta.TotalMinutes, MidpointRounding.AwayFromZero));
}
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRED_TITLE, XenObject.Name());
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_TITLE, XenObject.Name());
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_30:
if (_certificateExpiryDate.HasValue && _certificateExpiryDate.Value > Timestamp)
{
var eta = _certificateExpiryDate.Value - Timestamp;
if (eta.TotalDays >= 1)
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_DAYS, XenObject.Name(),
Math.Round(eta.TotalDays, MidpointRounding.AwayFromZero));
if (eta.TotalHours >= 1)
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_HOURS, XenObject.Name(),
Math.Round(eta.TotalHours, MidpointRounding.AwayFromZero));
if (eta.TotalMinutes >= 1)
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_MINUTES, XenObject.Name(),
Math.Round(eta.TotalMinutes, MidpointRounding.AwayFromZero));
}
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_TITLE, XenObject.Name());
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRED_TITLE, _host.Name());
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRED_TITLE, XenObject.Name());
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_30:
@ -80,19 +125,19 @@ namespace XenAdmin.Alerts
var eta = _certificateExpiryDate.Value - Timestamp;
if (eta.TotalDays >= 1)
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRING_TITLE_DAYS, _host.Name(),
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_DAYS, XenObject.Name(),
Math.Round(eta.TotalDays, MidpointRounding.AwayFromZero));
if (eta.TotalHours >= 1)
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRING_TITLE_HOURS, _host.Name(),
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_HOURS, XenObject.Name(),
Math.Round(eta.TotalHours, MidpointRounding.AwayFromZero));
if (eta.TotalMinutes >= 1)
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRING_TITLE_MINUTES, _host.Name(),
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_MINUTES, XenObject.Name(),
Math.Round(eta.TotalMinutes, MidpointRounding.AwayFromZero));
}
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRED_TITLE, XenObject.Name());
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRED_TITLE, _host.Name());
default:
return base.Title;
}
@ -104,18 +149,38 @@ namespace XenAdmin.Alerts
{
get
{
if (_host == null)
if (XenObject == null)
return base.Title;
switch (Message.Type)
{
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRED_DESCIRPTION, XenObject.Name(), GetExpiryDate());
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_07:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_14:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_30:
return string.Format(Messages.CERTIFICATE_CA_ALERT_EXPIRING_DESCRIPTION,
XenObject.Name(), GetExpiryDate());
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_DESCIRPTION, XenObject.Name(), GetExpiryDate());
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_30:
return string.Format(Messages.CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_DESCRIPTION,
XenObject.Name(), GetExpiryDate());
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRED:
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRED_DESCIRPTION, _host.Name(), GetExpiryDate());
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRED_DESCIRPTION, XenObject.Name(), GetExpiryDate());
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_30:
return string.Format(Messages.CERTIFICATE_ALERT_EXPIRING_DESCRIPTION,
_host.Name(), GetExpiryDate());
return string.Format(Messages.CERTIFICATE_HOST_ALERT_EXPIRING_DESCRIPTION,
XenObject.Name(), GetExpiryDate());
default:
return base.Title;
}
@ -126,14 +191,44 @@ namespace XenAdmin.Alerts
{
get
{
var cmd = new InstallCertificateCommand(Program.MainWindow, XenObject as Host);
if (cmd.CanExecute())
return () => cmd.Execute();
return null;
if (!(XenObject is Host host))
return null;
switch (Message.Type)
{
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRED:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_30:
var cmd = new InstallCertificateCommand(Program.MainWindow, host);
if (cmd.CanExecute())
return () => cmd.Execute();
return null;
default:
return null;
}
}
}
public override string FixLinkText => Messages.INSTALL_SERVER_CERTIFICATE_ACTION_LINK;
public override string FixLinkText
{
get
{
if (!(XenObject is Host))
return null;
switch (Message.Type)
{
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRED:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_30:
return Messages.INSTALL_SERVER_CERTIFICATE_ACTION_LINK;
default:
return null;
}
}
}
public override string HelpID => "CertificateAlert";

View File

@ -0,0 +1,218 @@
/* Copyright (c) Citrix Systems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using XenAdmin.Core;
using XenAPI;
namespace XenAdmin.Alerts
{
public class FailedLoginAttemptAlert : MessageAlert
{
private readonly Pool _pool;
private readonly int _total;
private readonly int _unknown;
private readonly List<Offender> _topOffenders = new List<Offender>();
public FailedLoginAttemptAlert(Message m)
: base(m)
{
_pool = m.Connection.Cache.Pools.FirstOrDefault(p => p.uuid == m.obj_uuid);
try
{
/* - Total and unknown are optional (unknown being absent implies that all the failed
logins came from known sources, and conversely total being absent implies that all
the failed logins came from unknown sources).
- There may be 0 or more known tags.
- Each known tag must contain date and number, but the other tags (ip, originator,
username, useragent) are all optional (though we expect at least one) */
var doc = new XmlDocument();
doc.LoadXml(m.body);
var totalNodes = doc.GetElementsByTagName("total");
if (totalNodes.Count > 0)
int.TryParse(totalNodes[0].InnerText, out _total);
var unknownNodes = doc.GetElementsByTagName("unknown");
if (unknownNodes.Count > 0)
int.TryParse(unknownNodes[0].InnerText, out _unknown);
var knownNodes = doc.GetElementsByTagName("known");
foreach (XmlNode node in knownNodes)
{
var offender = new Offender();
foreach (XmlNode child in node.ChildNodes)
{
switch (child.Name)
{
case "number":
if (int.TryParse(child.InnerText, out var number))
offender.Number = number;
break;
case "date":
if (Util.TryParseIso8601DateTime(child.InnerText, out var date))
offender.Date = date;
break;
case "ip":
offender.Ip = child.InnerText;
break;
case "originator":
offender.Originator = child.InnerText;
break;
case "username":
offender.Username = child.InnerText;
break;
case "useragent":
offender.Useragent = child.InnerText;
break;
}
}
_topOffenders.Add(offender);
}
}
catch
{
//ignore
}
}
public override string Title => _pool == null
? base.Title
: string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_TITLE, _pool.Name());
public override string Description
{
get
{
if (_total == 0 && _unknown > 0)
return string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_ALL_UNKNOWN, _unknown);
var sb = new StringBuilder();
if (_total > 0)
sb.AppendLine(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_TOTAL, _total));
if (_unknown > 0)
sb.AppendLine(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_UNKNOWN, _unknown));
if (_topOffenders.Count > 0)
{
sb.AppendLine(Messages.ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_COMMON);
foreach (var offender in _topOffenders)
sb.AppendLine(offender.ToString());
}
return sb.Length > 0 ? sb.ToString() : base.Title;
}
}
public override Action FixLinkAction => null;
public override string FixLinkText => null;
public override string HelpID => "FailedLoginAttemptAlert";
public override string HelpLinkText => Messages.ALERT_GENERIC_HELP;
private class Offender
{
/// <summary>
/// Number of failed login attempts from this offender
/// </summary>
public int Number { get; set; }
/// <summary>
/// DateTime of last failed login attempt from this offender
/// </summary>
public DateTime? Date { private get; set;}
/// <summary>
/// Offender IP address
/// </summary>
public string Ip { get; set;}
public string Originator { get; set;}
public string Username { get; set;}
public string Useragent { get; set;}
private string GetFriendlyDate()
{
string date = string.Empty;
Program.Invoke(Program.MainWindow,
() =>
{
if (Date.HasValue)
date = HelpersGUI.DateTimeToString(Date.Value.ToLocalTime(), Messages.DATEFORMAT_DMY_HM, true);
});
return date;
}
public override string ToString()
{
var entries = new List<string>();
if (!string.IsNullOrEmpty(Ip))
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_IP, Ip));
if (Number > 0)
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_NUMBER, Number));
var friendlyDate = GetFriendlyDate();
if (!string.IsNullOrEmpty(friendlyDate))
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_DATE, friendlyDate));
if (!string.IsNullOrEmpty(Username))
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERNAME, Username));
if (!string.IsNullOrEmpty(Originator))
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_ORIGINATOR, Originator));
if (!string.IsNullOrEmpty(Useragent))
entries.Add(string.Format(Messages.ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERAGENT, Useragent));
return $"- {string.Join(", ", entries)}";
}
}
}
}

View File

@ -151,6 +151,7 @@ namespace XenAdmin.Alerts
case Message.MessageType.CLUSTER_HOST_FENCING:
case Message.MessageType.CLUSTER_HOST_ENABLE_FAILED:
case Message.MessageType.VM_SECURE_BOOT_FAILED:
case Message.MessageType.TLS_VERIFICATION_EMERGENCY_DISABLED:
if (XenObject != null)
return string.Format(FriendlyFormat(), Helpers.GetName(XenObject));
break;
@ -368,6 +369,7 @@ namespace XenAdmin.Alerts
if (repairSrCommand.CanExecute())
return () => repairSrCommand.Execute();
return null;
default:
return null;
}
@ -476,11 +478,22 @@ namespace XenAdmin.Alerts
case Message.MessageType.VMSS_SNAPSHOT_LOCK_FAILED:
return new PolicyAlert(msg);
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRED:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_07:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_14:
case Message.MessageType.POOL_CA_CERTIFICATE_EXPIRING_30:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRED:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_SERVER_CERTIFICATE_EXPIRING_30:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRED:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_07:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_14:
case Message.MessageType.HOST_INTERNAL_CERTIFICATE_EXPIRING_30:
return new CertificateAlert(msg);
case Message.MessageType.FAILED_LOGIN_ATTEMPTS:
return new FailedLoginAttemptAlert(msg);
default:
// For all other kinds of alert
return new MessageAlert(msg);

View File

@ -99,6 +99,7 @@
<Compile Include="Actions\GUIActions\SaveDataSourceStateAction.cs" />
<Compile Include="Actions\GUIActions\SearchAction.cs" />
<Compile Include="Alerts\NewVersionPriorityAlertComparer.cs" />
<Compile Include="Alerts\Types\FailedLoginAttemptAlert.cs" />
<Compile Include="Alerts\Types\CertificateAlert.cs" />
<Compile Include="Alerts\Types\AlarmMessageAlert.cs" />
<Compile Include="Alerts\Types\HotfixEligibilityAlert.cs" />

View File

@ -4040,6 +4040,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Certificate verification is enabled on the pool, but overriden on server &apos;{0}&apos;..
/// </summary>
public static string Message_body_tls_verification_emergency_disabled {
get {
return ResourceManager.GetString("Message.body-tls_verification_emergency_disabled", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Quality of Service settings for disk &apos;{0}&apos; on virtual machine &apos;{1}&apos; could not be obeyed..
/// </summary>
@ -4850,6 +4859,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Certificate verification is disabled..
/// </summary>
public static string Message_name_tls_verification_emergency_disabled {
get {
return ResourceManager.GetString("Message.name-tls_verification_emergency_disabled", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to An unknown error occurred when reclaiming freed space.
/// </summary>

View File

@ -1076,6 +1076,9 @@
<data name="Message.body-license_server_unreachable" xml:space="preserve">
<value>A license for {0} could not be checked-out because the license server could not be reached at the given address and port. Please check the connection details, and verify that the license server is running.</value>
</data>
<data name="Message.body-tls_verification_emergency_disabled" xml:space="preserve">
<value>Certificate verification is enabled on the pool, but overriden on server '{0}'.</value>
</data>
<data name="Message.body-metadata_lun_broken" xml:space="preserve">
<value>Pool '{0}' is unable to access the HA metadata disk. Until access is restored changes to the pool metadata may be lost in the event of an HA failover.</value>
</data>
@ -1304,6 +1307,9 @@
<data name="Message.name-license_server_unreachable" xml:space="preserve">
<value>The license server could not be reached.</value>
</data>
<data name="Message.name-tls_verification_emergency_disabled" xml:space="preserve">
<value>Certificate verification is disabled.</value>
</data>
<data name="Message.name-metadata_lun_broken" xml:space="preserve">
<value>Lost access to HA metadata disk</value>
</data>

View File

@ -5012,6 +5012,105 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to All {0} attempts originated from unknown sources..
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_ALL_UNKNOWN {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_ALL_UNKNOWN", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The most common attempts originated from the following sources:.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_COMMON {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_COMMON", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There has been a total of {0} failed login attempts..
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_TOTAL {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_TOTAL", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} attempts originated from unknown sources..
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_UNKNOWN {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_UNKNOWN", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Last attempt on: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_DATE {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_DATE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to IP address: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_IP {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_IP", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Number of attempts: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_NUMBER {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_NUMBER", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Originator: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_ORIGINATOR {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_ORIGINATOR", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to User agent: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERAGENT {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERAGENT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Username: {0}.
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERNAME {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERNAME", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There has been a number of failed attempts to login to &apos;{0}&apos; within the past hour..
/// </summary>
public static string ALERT_FAILED_LOGIN_ATTEMPT_TITLE {
get {
return ResourceManager.GetString("ALERT_FAILED_LOGIN_ATTEMPT_TITLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Help.
/// </summary>
@ -6961,56 +7060,56 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to The TLS certificate of server &apos;{0}&apos; expired on {1}..
/// Looks up a localized string similar to The trusted CA certificate of &apos;{0}&apos; expired on {1}..
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRED_DESCIRPTION {
public static string CERTIFICATE_CA_ALERT_EXPIRED_DESCIRPTION {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRED_DESCIRPTION", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRED_DESCIRPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Certificate on {0} expired.
/// Looks up a localized string similar to Trusted CA certificate on {0} expired.
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRED_TITLE {
public static string CERTIFICATE_CA_ALERT_EXPIRED_TITLE {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRED_TITLE", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRED_TITLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The TLS certificate of server &apos;{0}&apos; will expire on {1}..
/// Looks up a localized string similar to The trusted CA certificate of &apos;{0}&apos; will expire on {1}..
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRING_DESCRIPTION {
public static string CERTIFICATE_CA_ALERT_EXPIRING_DESCRIPTION {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRING_DESCRIPTION", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRING_DESCRIPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Certificate on {0} expiring in {1} day(s).
/// Looks up a localized string similar to Trusted CA certificate on {0} expiring in {1} day(s).
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRING_TITLE_DAYS {
public static string CERTIFICATE_CA_ALERT_EXPIRING_TITLE_DAYS {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRING_TITLE_DAYS", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRING_TITLE_DAYS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Certificate on {0} expiring in {1} hour(s).
/// Looks up a localized string similar to Trusted CA certificate on {0} expiring in {1} hour(s).
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRING_TITLE_HOURS {
public static string CERTIFICATE_CA_ALERT_EXPIRING_TITLE_HOURS {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRING_TITLE_HOURS", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRING_TITLE_HOURS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Certificate on {0} expiring in {1} minute(s).
/// Looks up a localized string similar to Trusted CA certificate on {0} expiring in {1} minute(s).
/// </summary>
public static string CERTIFICATE_ALERT_EXPIRING_TITLE_MINUTES {
public static string CERTIFICATE_CA_ALERT_EXPIRING_TITLE_MINUTES {
get {
return ResourceManager.GetString("CERTIFICATE_ALERT_EXPIRING_TITLE_MINUTES", resourceCulture);
return ResourceManager.GetString("CERTIFICATE_CA_ALERT_EXPIRING_TITLE_MINUTES", resourceCulture);
}
}
@ -7023,6 +7122,114 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to The identity certificate of server &apos;{0}&apos; expired on {1}..
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRED_DESCIRPTION {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRED_DESCIRPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server identity certificate on {0} expired.
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRED_TITLE {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRED_TITLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The identity certificate of server &apos;{0}&apos; will expire on {1}..
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRING_DESCRIPTION {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRING_DESCRIPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server identity certificate on {0} expiring in {1} day(s).
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_DAYS {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_DAYS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server identity certificate on {0} expiring in {1} hour(s).
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_HOURS {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_HOURS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server identity certificate on {0} expiring in {1} minute(s).
/// </summary>
public static string CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_MINUTES {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_MINUTES", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The internal identity certificate of server &apos;{0}&apos; expired on {1}..
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_DESCIRPTION {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_DESCIRPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server internal identity certificate on {0} expired.
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_TITLE {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_TITLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The internal identity certificate of server &apos;{0}&apos; will expire on {1}..
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_DESCRIPTION {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_DESCRIPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server internal identity certificate on {0} expiring in {1} day(s).
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_DAYS {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_DAYS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server internal identity certificate on {0} expiring in {1} hour(s).
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_HOURS {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_HOURS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server internal identity certificate on {0} expiring in {1} minute(s).
/// </summary>
public static string CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_MINUTES {
get {
return ResourceManager.GetString("CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_MINUTES", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The certificate installation failed..
/// </summary>

View File

@ -1849,6 +1849,39 @@ Note that if RBAC is enabled, only alerts which you have privileges to dismiss w
</data>
<data name="ALERT_EXPORT_ALL_OR_FILTERED" xml:space="preserve">
<value>You have applied filters to the list of alerts. Do you want to export all alerts from every connected server, or only the alerts you have chosen to view?</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_ALL_UNKNOWN" xml:space="preserve">
<value>All {0} attempts originated from unknown sources.</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_COMMON" xml:space="preserve">
<value>The most common attempts originated from the following sources:</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_TOTAL" xml:space="preserve">
<value>There has been a total of {0} failed login attempts.</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_DESCRIPTION_UNKNOWN" xml:space="preserve">
<value>{0} attempts originated from unknown sources.</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_DATE" xml:space="preserve">
<value>Last attempt on: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_IP" xml:space="preserve">
<value>IP address: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_NUMBER" xml:space="preserve">
<value>Number of attempts: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_ORIGINATOR" xml:space="preserve">
<value>Originator: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERAGENT" xml:space="preserve">
<value>User agent: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_OFFENDER_USERNAME" xml:space="preserve">
<value>Username: {0}</value>
</data>
<data name="ALERT_FAILED_LOGIN_ATTEMPT_TITLE" xml:space="preserve">
<value>There has been a number of failed attempts to login to '{0}' within the past hour.</value>
</data>
<data name="ALERT_GENERIC_HELP" xml:space="preserve">
<value>Help</value>
@ -2523,27 +2556,63 @@ This will cancel compilation of the status report.</value>
<data name="CD_DVD_DEVICE_ATTACHED" xml:space="preserve">
<value>Attached CD/DVD Drive.</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRED_DESCIRPTION" xml:space="preserve">
<value>The TLS certificate of server '{0}' expired on {1}.</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRED_DESCIRPTION" xml:space="preserve">
<value>The trusted CA certificate of '{0}' expired on {1}.</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRED_TITLE" xml:space="preserve">
<value>Certificate on {0} expired</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRED_TITLE" xml:space="preserve">
<value>Trusted CA certificate on {0} expired</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRING_DESCRIPTION" xml:space="preserve">
<value>The TLS certificate of server '{0}' will expire on {1}.</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRING_DESCRIPTION" xml:space="preserve">
<value>The trusted CA certificate of '{0}' will expire on {1}.</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRING_TITLE_DAYS" xml:space="preserve">
<value>Certificate on {0} expiring in {1} day(s)</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRING_TITLE_DAYS" xml:space="preserve">
<value>Trusted CA certificate on {0} expiring in {1} day(s)</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRING_TITLE_HOURS" xml:space="preserve">
<value>Certificate on {0} expiring in {1} hour(s)</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRING_TITLE_HOURS" xml:space="preserve">
<value>Trusted CA certificate on {0} expiring in {1} hour(s)</value>
</data>
<data name="CERTIFICATE_ALERT_EXPIRING_TITLE_MINUTES" xml:space="preserve">
<value>Certificate on {0} expiring in {1} minute(s)</value>
<data name="CERTIFICATE_CA_ALERT_EXPIRING_TITLE_MINUTES" xml:space="preserve">
<value>Trusted CA certificate on {0} expiring in {1} minute(s)</value>
</data>
<data name="CERTIFICATE_FILETYPES" xml:space="preserve">
<value>TLS certificate files (*.pem;*.crt;*.cer)|*.pem;*.crt;*.cer</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRED_DESCIRPTION" xml:space="preserve">
<value>The identity certificate of server '{0}' expired on {1}.</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRED_TITLE" xml:space="preserve">
<value>Server identity certificate on {0} expired</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRING_DESCRIPTION" xml:space="preserve">
<value>The identity certificate of server '{0}' will expire on {1}.</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_DAYS" xml:space="preserve">
<value>Server identity certificate on {0} expiring in {1} day(s)</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_HOURS" xml:space="preserve">
<value>Server identity certificate on {0} expiring in {1} hour(s)</value>
</data>
<data name="CERTIFICATE_HOST_ALERT_EXPIRING_TITLE_MINUTES" xml:space="preserve">
<value>Server identity certificate on {0} expiring in {1} minute(s)</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_DESCIRPTION" xml:space="preserve">
<value>The internal identity certificate of server '{0}' expired on {1}.</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRED_TITLE" xml:space="preserve">
<value>Server internal identity certificate on {0} expired</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_DESCRIPTION" xml:space="preserve">
<value>The internal identity certificate of server '{0}' will expire on {1}.</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_DAYS" xml:space="preserve">
<value>Server internal identity certificate on {0} expiring in {1} day(s)</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_HOURS" xml:space="preserve">
<value>Server internal identity certificate on {0} expiring in {1} hour(s)</value>
</data>
<data name="CERTIFICATE_HOST_INTERNAL_ALERT_EXPIRING_TITLE_MINUTES" xml:space="preserve">
<value>Server internal identity certificate on {0} expiring in {1} minute(s)</value>
</data>
<data name="CERTIFICATE_INSTALLATION_FAILURE" xml:space="preserve">
<value>The certificate installation failed.</value>
</data>
@ -14684,4 +14753,4 @@ Any disk in your VM's DVD drive will be ejected when installing [Citrix VM Tools
<data name="YOU_ARE_HERE" xml:space="preserve">
<value>You are here</value>
</data>
</root>
</root>