diff --git a/client/administration/UdsAdmin/Properties/Settings.Designer.cs b/client/administration/UdsAdmin/Properties/Settings.Designer.cs index 8a67fa8c..cb37f139 100644 --- a/client/administration/UdsAdmin/Properties/Settings.Designer.cs +++ b/client/administration/UdsAdmin/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // Este código fue generado por una herramienta. -// Versión de runtime:4.0.30319.261 +// Versión de runtime:4.0.30319.18034 // // Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si // se vuelve a generar el código. @@ -118,5 +118,14 @@ namespace UdsAdmin.Properties { this["MaxControlWidth"] = value; } } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("200")] + public int StatsItems { + get { + return ((int)(this["StatsItems"])); + } + } } } diff --git a/client/administration/UdsAdmin/Properties/Settings.settings b/client/administration/UdsAdmin/Properties/Settings.settings index 3296cf72..6442bb46 100644 --- a/client/administration/UdsAdmin/Properties/Settings.settings +++ b/client/administration/UdsAdmin/Properties/Settings.settings @@ -26,5 +26,8 @@ 320 + + 200 + \ No newline at end of file diff --git a/client/administration/UdsAdmin/Strings.Designer.cs b/client/administration/UdsAdmin/Strings.Designer.cs index 68a0e000..c9c42f64 100644 --- a/client/administration/UdsAdmin/Strings.Designer.cs +++ b/client/administration/UdsAdmin/Strings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // Este código fue generado por una herramienta. -// Versión de runtime:4.0.30319.17929 +// Versión de runtime:4.0.30319.18034 // // Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si // se vuelve a generar el código. @@ -492,6 +492,15 @@ namespace UdsAdmin { } } + /// + /// Busca una cadena traducida similar a Legend. + /// + internal static string legend { + get { + return ResourceManager.GetString("legend", resourceCulture); + } + } + /// /// Busca una cadena traducida similar a Manage groups for this authenticator. /// diff --git a/client/administration/UdsAdmin/Strings.de.resx b/client/administration/UdsAdmin/Strings.de.resx index 4a2630ed..06144e4c 100644 --- a/client/administration/UdsAdmin/Strings.de.resx +++ b/client/administration/UdsAdmin/Strings.de.resx @@ -344,7 +344,7 @@ Transporte - Neworks + Aufstrebende Ungültige IP-Adresse @@ -472,4 +472,22 @@ Konfiguration + + Diese Authentifikator nicht ermöglicht die Erstellung von neuen Gruppen im Administrations-Oberfläche + + + Diese Authentifikator nicht ermöglicht die Erstellung von auf der Administrations-Oberfläche + + + Diese Authentifikator nicht erlaubt die Änderung der Benutzer bei Administrations-Oberfläche + + + Src-Host + + + Quell-IP- + + + Legende + \ No newline at end of file diff --git a/client/administration/UdsAdmin/Strings.es.resx b/client/administration/UdsAdmin/Strings.es.resx index 9788daba..55346611 100644 --- a/client/administration/UdsAdmin/Strings.es.resx +++ b/client/administration/UdsAdmin/Strings.es.resx @@ -492,4 +492,22 @@ Configuración + + Este autenticador no permite la creación de nuevos grupos en la interfaz de administración + + + Este autenticador no permite la creación de nuevos usuarios en la interfaz de administración + + + Este autenticador no permite la modificación de los usuarios en la interfaz de administración + + + Src Host + + + Src IP + + + Leyenda + \ No newline at end of file diff --git a/client/administration/UdsAdmin/Strings.fr.resx b/client/administration/UdsAdmin/Strings.fr.resx index 8dc1fc11..8e3d1281 100644 --- a/client/administration/UdsAdmin/Strings.fr.resx +++ b/client/administration/UdsAdmin/Strings.fr.resx @@ -472,4 +472,22 @@ Configuration + + Cet authentificateur ne pas permet la création de nouveaux groupes à l'interface d'administration + + + Cet authentificateur ne pas permet la création de nouveaux utilisateurs à l'interface d'administration + + + Cet authentificateur permet pas la modification des utilisateurs à l'interface d'administration + + + Hôte de la SRC + + + SRC IP + + + Légende + \ No newline at end of file diff --git a/client/administration/UdsAdmin/Strings.resx b/client/administration/UdsAdmin/Strings.resx index c5750d8f..27408874 100644 --- a/client/administration/UdsAdmin/Strings.resx +++ b/client/administration/UdsAdmin/Strings.resx @@ -507,4 +507,7 @@ Src IP + + Legend + \ No newline at end of file diff --git a/client/administration/UdsAdmin/UdsAdmin.csproj b/client/administration/UdsAdmin/UdsAdmin.csproj index 8f5ca404..29cd41ad 100644 --- a/client/administration/UdsAdmin/UdsAdmin.csproj +++ b/client/administration/UdsAdmin/UdsAdmin.csproj @@ -75,6 +75,7 @@ + @@ -89,12 +90,18 @@ ListEditor.cs + + Component + UserControl AuthsPanel.cs + + UserControl + UserControl diff --git a/client/administration/UdsAdmin/app.config b/client/administration/UdsAdmin/app.config index bcded628..19f947c9 100644 --- a/client/administration/UdsAdmin/app.config +++ b/client/administration/UdsAdmin/app.config @@ -4,6 +4,9 @@
+ +
+ @@ -33,4 +36,11 @@ + + + + 200 + + + diff --git a/client/administration/UdsAdmin/controls/ListEditor.de.resx b/client/administration/UdsAdmin/controls/ListEditor.de.resx index de450cc6..a8586d8d 100644 --- a/client/administration/UdsAdmin/controls/ListEditor.de.resx +++ b/client/administration/UdsAdmin/controls/ListEditor.de.resx @@ -112,54 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - - 0, 0 - - - 185, 23 - - - - 0 - - Öffnen Sie den editor - - - bntOpen - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 13 - - - 185, 23 - - - ListEditor - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Öffnen Sie den Editor \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/ListEditor.es.resx b/client/administration/UdsAdmin/controls/ListEditor.es.resx index 1e2384be..1ba398f1 100644 --- a/client/administration/UdsAdmin/controls/ListEditor.es.resx +++ b/client/administration/UdsAdmin/controls/ListEditor.es.resx @@ -112,54 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - - 0, 0 - - - 185, 23 - - - - 0 - - Abrir el editor - - - bntOpen - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 13 - - - 185, 23 - - - ListEditor - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Abra el editor \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/ListEditor.fr.resx b/client/administration/UdsAdmin/controls/ListEditor.fr.resx index af199859..093cf467 100644 --- a/client/administration/UdsAdmin/controls/ListEditor.fr.resx +++ b/client/administration/UdsAdmin/controls/ListEditor.fr.resx @@ -112,54 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - - 0, 0 - - - 185, 23 - - - - 0 - - Ouvrez l'éditeur - - - bntOpen - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 13 - - - 185, 23 - - - ListEditor - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Ouvrez l&#39;éditeur \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/SplitContainerEx.cs b/client/administration/UdsAdmin/controls/SplitContainerEx.cs new file mode 100644 index 00000000..fd7de887 --- /dev/null +++ b/client/administration/UdsAdmin/controls/SplitContainerEx.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace UdsAdmin.controls +{ + public class SplitContainerEx : SplitContainer + { + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + HandlePaint(e); + } + + private void HandlePaint(PaintEventArgs e) + { + //paint the three dots' + Point[] points = new Point[3]; + var w = Width; + var h = Height; + var d = SplitterDistance; + var sW = SplitterWidth; + + //calculate the position of the points' + if (Orientation == Orientation.Horizontal) + { + points[0] = new Point((w / 2), d + (sW / 2)); + points[1] = new Point(points[0].X - 10, points[0].Y); + points[2] = new Point(points[0].X + 10, points[0].Y); + } + else + { + points[0] = new Point(d + (sW / 2), (h / 2)); + points[1] = new Point(points[0].X, points[0].Y - 10); + points[2] = new Point(points[0].X, points[0].Y + 10); + } + + foreach (Point p in points) + { + p.Offset(-2, -2); + e.Graphics.FillEllipse(SystemBrushes.ControlDark, + new Rectangle(p, new Size(3, 3))); + + p.Offset(1, 1); + e.Graphics.FillEllipse(SystemBrushes.ControlLight, + new Rectangle(p, new Size(3, 3))); + } + } + + } +} diff --git a/client/administration/UdsAdmin/controls/forms/ListEditorForm.de.resx b/client/administration/UdsAdmin/controls/forms/ListEditorForm.de.resx index 10b18f87..ea596748 100644 --- a/client/administration/UdsAdmin/controls/forms/ListEditorForm.de.resx +++ b/client/administration/UdsAdmin/controls/forms/ListEditorForm.de.resx @@ -112,13 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ListEditorFormfr + + Import-Datei Entfernen @@ -126,10 +126,10 @@ Hinzufügen - - Datei importieren - Editor schließen + + Editor + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/forms/ListEditorForm.es.resx b/client/administration/UdsAdmin/controls/forms/ListEditorForm.es.resx index 61624489..85da8ba7 100644 --- a/client/administration/UdsAdmin/controls/forms/ListEditorForm.es.resx +++ b/client/administration/UdsAdmin/controls/forms/ListEditorForm.es.resx @@ -112,21 +112,24 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Añadir + + Importar archivo Quitar - - Archivo de importación + + Añadir Cerrar editor + + Editor + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/forms/ListEditorForm.fr.resx b/client/administration/UdsAdmin/controls/forms/ListEditorForm.fr.resx index 6ebc089d..3e6e6d64 100644 --- a/client/administration/UdsAdmin/controls/forms/ListEditorForm.fr.resx +++ b/client/administration/UdsAdmin/controls/forms/ListEditorForm.fr.resx @@ -112,24 +112,24 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ListEditorFormfr + + Importer un fichier - Supprimer + Enlever Ajouter - - Fichier d'importation - - Éditeur étroite + Fermer éditeur + + + Éditeur \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.Designer.cs b/client/administration/UdsAdmin/controls/panel/AuthsPanel.Designer.cs index 77b89911..c0309c72 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.Designer.cs +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.Designer.cs @@ -29,18 +29,31 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AuthsPanel)); + this.splitContainer1 = new UdsAdmin.controls.SplitContainerEx(); this.listView = new System.Windows.Forms.ListView(); this.name = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.typeName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.comments = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.priority = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.logViewer1 = new UdsAdmin.controls.panel.LogViewer(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); this.SuspendLayout(); // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.listView); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.logViewer1); + // // listView // this.listView.AutoArrange = false; @@ -77,19 +90,6 @@ // resources.ApplyResources(this.priority, "priority"); // - // splitContainer1 - // - resources.ApplyResources(this.splitContainer1, "splitContainer1"); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.listView); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.logViewer1); - // // logViewer1 // resources.ApplyResources(this.logViewer1, "logViewer1"); @@ -102,6 +102,7 @@ this.Controls.Add(this.splitContainer1); this.Name = "AuthsPanel"; this.VisibleChanged += new System.EventHandler(this.UsersPanel_VisibleChanged); + this.Resize += new System.EventHandler(this.AuthsPanel_Resize); this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.ResumeLayout(false); @@ -116,7 +117,7 @@ private System.Windows.Forms.ColumnHeader comments; private System.Windows.Forms.ColumnHeader typeName; private System.Windows.Forms.ColumnHeader priority; - private System.Windows.Forms.SplitContainer splitContainer1; + private SplitContainerEx splitContainer1; private LogViewer logViewer1; } } diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.cs b/client/administration/UdsAdmin/controls/panel/AuthsPanel.cs index af8e1672..7df6c22d 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.cs +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.cs @@ -60,9 +60,6 @@ namespace UdsAdmin.controls.panel private void updateList() { - int[] selected = new int[listView.SelectedIndices.Count]; - listView.SelectedIndices.CopyTo(selected, 0); - try { xmlrpc.Authenticator[] auths = xmlrpc.UdsAdminService.GetAuthenticators(); @@ -82,14 +79,10 @@ namespace UdsAdmin.controls.panel gui.UserNotifier.notifyRpcException(ex); } - foreach (int i in selected) + if (listView.Items.Count > 0) { - try - { - listView.SelectedIndices.Add(i); - } - catch (Exception) - { } + listView.Items[0].Selected = listView.Items[0].Focused = true; + listView.Focus(); } } @@ -99,6 +92,7 @@ namespace UdsAdmin.controls.panel { case Keys.F5: updateList(); + updateLogs(); break; case Keys.E: if (e.Modifiers == Keys.Control) @@ -114,6 +108,11 @@ namespace UdsAdmin.controls.panel } private void listView_SelectedIndexChanged(object sender, EventArgs e) + { + updateLogs(); + } + + private void updateLogs() { List data = new List(); foreach (ListViewItem i in listView.SelectedItems) @@ -132,5 +131,11 @@ namespace UdsAdmin.controls.panel logViewer1.setLogs(data.ToArray()); } + private void AuthsPanel_Resize(object sender, EventArgs e) + { + // Workaround to "dock" not fitting the content correctly + splitContainer1.Size = this.Size; + } + } } diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.de.resx b/client/administration/UdsAdmin/controls/panel/AuthsPanel.de.resx index fcf0d125..d6e5fc9b 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.de.resx +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.de.resx @@ -112,20 +112,20 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Name - - Kommentare - Typ + + Kommentare + Priorität diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.es.resx b/client/administration/UdsAdmin/controls/panel/AuthsPanel.es.resx index f128d3fb..f175c699 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.es.resx +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.es.resx @@ -112,20 +112,20 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nombre - - Comentarios - Tipo + + Comentarios + Prioridad diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.fr.resx b/client/administration/UdsAdmin/controls/panel/AuthsPanel.fr.resx index ba36abc6..07d1d7b7 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.fr.resx +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.fr.resx @@ -112,20 +112,20 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nom - - Commentaires - Type + + Commentaires + Priorité diff --git a/client/administration/UdsAdmin/controls/panel/AuthsPanel.resx b/client/administration/UdsAdmin/controls/panel/AuthsPanel.resx index 0086d79d..5dc000c6 100644 --- a/client/administration/UdsAdmin/controls/panel/AuthsPanel.resx +++ b/client/administration/UdsAdmin/controls/panel/AuthsPanel.resx @@ -117,6 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top, Bottom, Left, Right + + + + 0, 0 + + + Horizontal + Name @@ -136,19 +147,17 @@ 73 - Fill False - 0, 0 - 699, 216 + 737, 400 0 @@ -165,15 +174,6 @@ 0 - - Fill - - - 0, 0 - - - Horizontal - splitContainer1.Panel1 @@ -192,8 +192,11 @@ 0, 0 + + 0, 0, 0, 0 + - 699, 59 + 737, 101 0 @@ -223,10 +226,13 @@ 1 - 699, 279 + 737, 509 - 216 + 400 + + + 8 1 @@ -235,7 +241,7 @@ splitContainer1 - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + UdsAdmin.controls.SplitContainerEx, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null $this @@ -250,7 +256,7 @@ 6, 13 - 699, 279 + 737, 509 name diff --git a/client/administration/UdsAdmin/controls/panel/ChartPanel.cs b/client/administration/UdsAdmin/controls/panel/ChartPanel.cs new file mode 100644 index 00000000..6e8f8f87 --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/ChartPanel.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace UdsAdmin.controls.panel +{ + public class ChartPanel : UserControl + { + private System.ComponentModel.IContainer components = null; + System.Windows.Forms.DataVisualization.Charting.Chart chart; + + public ChartPanel() + { + InitializeComponent(); + ResizeRedraw = true; + } + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + + chart = new System.Windows.Forms.DataVisualization.Charting.Chart(); + ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit(); + SuspendLayout(); + chartArea1.Name = "ChartArea1"; + chart.ChartAreas.Add(chartArea1); + + legend1.Name = "Legend1"; + legend1.LegendStyle = LegendStyle.Column; + legend1.Title = Strings.legend; + chart.Legends.Add(legend1); + + chart.Dock = DockStyle.Fill; + chart.Name = "Chart"; + chart.TabIndex = 0; + chart.Text = "chart1"; + chart.Palette = ChartColorPalette.Pastel; + + Controls.Add(chart); + Load += new System.EventHandler(this.ChartPanel_Load); + ((System.ComponentModel.ISupportInitialize)(chart)).EndInit(); + ResumeLayout(false); + + // For testing how chart looks like + /*System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + series1.ChartArea = "ChartArea1"; + series1.Legend = "Legend1"; + series1.XValueType = ChartValueType.DateTime; + series1.YValueType = ChartValueType.Double; + series1.Name = "Series1"; + series1.ChartType = SeriesChartType.SplineArea; + + DateTime a = DateTime.Now; + a = a.AddDays(-360); + + + for (int i = 0; i < 360; i++) + { + series1.Points.AddXY(a, 100+100*Math.Sin(i*Math.PI/180)); + a = a.AddDays(1); + } + + + this.chart.Series.Add(series1); + + chart.Invalidate();*/ + + } + + private void ChartPanel_Load(object sender, EventArgs e) + { + } + + public void clearSeries() + { + chart.Series.Clear(); + } + + public void addSerie(xmlrpc.StatCounter counter) + { + SuspendLayout(); + string n = (1+chart.Series.Count).ToString(); + + /*Legend legend = new Legend(); + legend.Name = "Legend" + n; + legend.LegendStyle = LegendStyle.Column; + legend.Title = counter.title; + this.chart.Legends.Add(legend);*/ + + Series serie = new Series(); + serie.ChartArea = "ChartArea1"; + serie.Legend = "Legend1"; + serie.XValueType = ChartValueType.DateTime; + serie.YValueType = ChartValueType.Double; + serie.Name = counter.title; + + serie.ChartType = SeriesChartType.SplineArea; + + foreach( xmlrpc.StatCounterData i in counter.data ) + { + serie.Points.AddXY(i.stamp, i.value); + } + + this.chart.Series.Add(serie); + this.chart.Invalidate(); + ResumeLayout(); + } + + } +} diff --git a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.de.resx b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.de.resx index d597a1b5..9032f101 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.de.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.de.resx @@ -112,21 +112,21 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Authenticator + Name - Staat + Zustand Kommentare - - Authentifikator - \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.es.resx b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.es.resx index f1c9704a..3d330d6e 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.es.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.es.resx @@ -112,11 +112,14 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Autenticador + Nombre @@ -126,7 +129,4 @@ Comentarios - - Autenticador - \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.fr.resx b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.fr.resx index ff49e44c..58604aaa 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.fr.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedGroupsPanel.fr.resx @@ -112,11 +112,14 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Authenticator + Nom @@ -126,7 +129,4 @@ Commentaires - - Authentificateur - \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedPanel.Designer.cs b/client/administration/UdsAdmin/controls/panel/DeployedPanel.Designer.cs index 41b8aa62..10aab3e7 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedPanel.Designer.cs +++ b/client/administration/UdsAdmin/controls/panel/DeployedPanel.Designer.cs @@ -29,8 +29,7 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DeployedPanel)); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.panel1 = new System.Windows.Forms.Panel(); + this.splitContainer1 = new SplitContainerEx(); this.listView = new System.Windows.Forms.ListView(); this.Id = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.friendlyName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -42,7 +41,6 @@ this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); - this.panel1.SuspendLayout(); this.SuspendLayout(); // // splitContainer1 @@ -52,18 +50,12 @@ // // splitContainer1.Panel1 // - this.splitContainer1.Panel1.Controls.Add(this.panel1); + this.splitContainer1.Panel1.Controls.Add(this.listView); // // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.logViewer1); // - // panel1 - // - this.panel1.Controls.Add(this.listView); - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // // listView // this.listView.AutoArrange = false; @@ -123,16 +115,14 @@ this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.ResumeLayout(false); - this.panel1.ResumeLayout(false); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.SplitContainer splitContainer1; + private SplitContainerEx splitContainer1; private LogViewer logViewer1; - private System.Windows.Forms.Panel panel1; private System.Windows.Forms.ListView listView; private System.Windows.Forms.ColumnHeader Id; private System.Windows.Forms.ColumnHeader friendlyName; diff --git a/client/administration/UdsAdmin/controls/panel/DeployedPanel.de.resx b/client/administration/UdsAdmin/controls/panel/DeployedPanel.de.resx index 4f6eef40..c3d30f04 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedPanel.de.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedPanel.de.resx @@ -112,81 +112,27 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ID + Identifikation + + + Friendly Name + + + Revision Erstellungsdatum - Staat + Zustand - Statusdatum - - - Angezeigter Name - - - Ãœberarbeitung - - - listView - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - Id - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - CreationDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - State - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - StatusDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - friendlyName - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Revision - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - DeployedPanel - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Status Datum \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedPanel.es.resx b/client/administration/UdsAdmin/controls/panel/DeployedPanel.es.resx index 67c7f484..9163e924 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedPanel.es.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedPanel.es.resx @@ -112,22 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ID - - - Fecha de creación - - - Estado - - - Fecha de Estado + Identificación Nombre descriptivo @@ -135,58 +126,13 @@ Revisión - - listView + + Fecha de creación de - - System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Estado - - $this - - - 0 - - - Id - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - CreationDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - State - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - StatusDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - friendlyName - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Revision - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - DeployedPanel - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Etapa Fecha \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedPanel.fr.resx b/client/administration/UdsAdmin/controls/panel/DeployedPanel.fr.resx index 0ebabed5..0b83b48f 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedPanel.fr.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedPanel.fr.resx @@ -112,13 +112,19 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ID + Id + + + Nom convivial + + + Révision Date de création @@ -127,66 +133,6 @@ État - Date d'État - - - Nom convivial - - - Révision - - - listView - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - Id - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - CreationDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - State - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - StatusDate - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - friendlyName - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Revision - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - DeployedPanel - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Date de statut \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedPanel.resx b/client/administration/UdsAdmin/controls/panel/DeployedPanel.resx index e83bf040..2d5dd87f 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedPanel.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedPanel.resx @@ -172,10 +172,10 @@ False - 4, 0 + 0, 0 - 776, 212 + 737, 400 2 @@ -187,36 +187,9 @@ System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - panel1 - - - 0 - - - Fill - - - 0, 0 - - - 4, 0, 4, 4 - - - 784, 216 - - - 2 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - splitContainer1.Panel1 - + 0 @@ -237,8 +210,11 @@ 0, 0 + + 0, 0, 0, 0 + - 784, 59 + 737, 101 0 @@ -268,10 +244,13 @@ 1 - 784, 279 + 737, 509 - 216 + 400 + + + 8 1 @@ -295,7 +274,7 @@ 6, 13 - 784, 279 + 737, 509 Id diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.Designer.cs b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.Designer.cs index 23cef6d6..3150e386 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.Designer.cs +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.Designer.cs @@ -29,6 +29,11 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DeployedServicePanel)); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.splitContainer1 = new UdsAdmin.controls.SplitContainerEx(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label4 = new System.Windows.Forms.Label(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.groupLabel = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); @@ -38,20 +43,77 @@ this.lBaseService = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.lOsManager = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); this.lInitial = new System.Windows.Forms.Label(); this.cacheLabel = new System.Windows.Forms.Label(); this.lCache = new System.Windows.Forms.Label(); this.cacheL2Label = new System.Windows.Forms.Label(); this.lL2Cache = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); this.lMax = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.lState = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.logViewer1 = new UdsAdmin.controls.panel.LogViewer(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.inUseChart = new UdsAdmin.controls.panel.ChartPanel(); + this.assignedChart = new UdsAdmin.controls.panel.ChartPanel(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.panel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // + // tabControl1 + // + resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + this.tabControl1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.tabControl1_KeyUp); + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.splitContainer1); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.panel1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.logViewer1); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.label4); + this.panel1.Controls.Add(this.tableLayoutPanel1); + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + this.label4.UseMnemonic = false; + // // tableLayoutPanel1 // resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); @@ -96,19 +158,19 @@ // lName // resources.ApplyResources(this.lName, "lName"); - this.lName.BackColor = System.Drawing.SystemColors.Window; + this.lName.BackColor = System.Drawing.Color.Transparent; this.lName.Name = "lName"; // // lComments // resources.ApplyResources(this.lComments, "lComments"); - this.lComments.BackColor = System.Drawing.SystemColors.Window; + this.lComments.BackColor = System.Drawing.Color.Transparent; this.lComments.Name = "lComments"; // // lBaseService // resources.ApplyResources(this.lBaseService, "lBaseService"); - this.lBaseService.BackColor = System.Drawing.SystemColors.Window; + this.lBaseService.BackColor = System.Drawing.Color.Transparent; this.lBaseService.Name = "lBaseService"; // // label3 @@ -120,19 +182,13 @@ // lOsManager // resources.ApplyResources(this.lOsManager, "lOsManager"); - this.lOsManager.BackColor = System.Drawing.SystemColors.Window; + this.lOsManager.BackColor = System.Drawing.Color.Transparent; this.lOsManager.Name = "lOsManager"; // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.CausesValidation = false; - this.label10.Name = "label10"; - // // lInitial // resources.ApplyResources(this.lInitial, "lInitial"); - this.lInitial.BackColor = System.Drawing.SystemColors.Window; + this.lInitial.BackColor = System.Drawing.Color.Transparent; this.lInitial.Name = "lInitial"; // // cacheLabel @@ -144,7 +200,7 @@ // lCache // resources.ApplyResources(this.lCache, "lCache"); - this.lCache.BackColor = System.Drawing.SystemColors.Window; + this.lCache.BackColor = System.Drawing.Color.Transparent; this.lCache.Name = "lCache"; // // cacheL2Label @@ -156,19 +212,13 @@ // lL2Cache // resources.ApplyResources(this.lL2Cache, "lL2Cache"); - this.lL2Cache.BackColor = System.Drawing.SystemColors.Window; + this.lL2Cache.BackColor = System.Drawing.Color.Transparent; this.lL2Cache.Name = "lL2Cache"; // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.CausesValidation = false; - this.label7.Name = "label7"; - // // lMax // resources.ApplyResources(this.lMax, "lMax"); - this.lMax.BackColor = System.Drawing.SystemColors.Window; + this.lMax.BackColor = System.Drawing.Color.Transparent; this.lMax.Name = "lMax"; // // label6 @@ -180,53 +230,105 @@ // lState // resources.ApplyResources(this.lState, "lState"); - this.lState.BackColor = System.Drawing.SystemColors.Window; + this.lState.BackColor = System.Drawing.Color.Transparent; this.lState.Name = "lState"; // - // label4 + // label10 // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - this.label4.UseMnemonic = false; + resources.ApplyResources(this.label10, "label10"); + this.label10.CausesValidation = false; + this.label10.Name = "label10"; + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.CausesValidation = false; + this.label7.Name = "label7"; + // + // logViewer1 + // + resources.ApplyResources(this.logViewer1, "logViewer1"); + this.logViewer1.Name = "logViewer1"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.tableLayoutPanel2); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // tableLayoutPanel2 + // + resources.ApplyResources(this.tableLayoutPanel2, "tableLayoutPanel2"); + this.tableLayoutPanel2.Controls.Add(this.inUseChart, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.assignedChart, 0, 0); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + // + // inUseChart + // + resources.ApplyResources(this.inUseChart, "inUseChart"); + this.inUseChart.Name = "inUseChart"; + // + // assignedChart + // + resources.ApplyResources(this.assignedChart, "assignedChart"); + this.assignedChart.Name = "assignedChart"; // // DeployedServicePanel // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.SystemColors.Window; - this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.Controls.Add(this.label4); - this.Controls.Add(this.tableLayoutPanel1); + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.tabControl1); this.Name = "DeployedServicePanel"; this.VisibleChanged += new System.EventHandler(this.DeployedServicePanel_VisibleChanged); + this.Resize += new System.EventHandler(this.DeployedServicePanel_Resize); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } #endregion + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private SplitContainerEx splitContainer1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Label label4; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Label groupLabel; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label cacheLabel; - private System.Windows.Forms.Label cacheL2Label; - private System.Windows.Forms.Label label7; private System.Windows.Forms.Label lName; private System.Windows.Forms.Label lComments; - private System.Windows.Forms.Label label6; private System.Windows.Forms.Label lBaseService; + private System.Windows.Forms.Label label3; private System.Windows.Forms.Label lOsManager; private System.Windows.Forms.Label lInitial; + private System.Windows.Forms.Label cacheLabel; private System.Windows.Forms.Label lCache; + private System.Windows.Forms.Label cacheL2Label; private System.Windows.Forms.Label lL2Cache; - private System.Windows.Forms.Label lState; private System.Windows.Forms.Label lMax; - private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label lState; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label7; + private LogViewer logViewer1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private ChartPanel assignedChart; + private ChartPanel inUseChart; + private System.Windows.Forms.Panel panel1; + } } diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.cs b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.cs index b05ee18c..fa902151 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.cs +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.cs @@ -41,6 +41,8 @@ namespace UdsAdmin.controls.panel public partial class DeployedServicePanel : UserControl { private string _dsId; + private DateTime shownToCharts = new DateTime(); + public DeployedServicePanel(xmlrpc.DeployedService ds) { _dsId = ds.id; @@ -52,11 +54,15 @@ namespace UdsAdmin.controls.panel private void DeployedServicePanel_VisibleChanged(object sender, EventArgs e) { if (Visible == true) - updateData(); + if (tabControl1.SelectedTab == tabPage2) + updateCharts(); + else + updateData(); } private void updateData() { + SuspendLayout(); xmlrpc.DeployedService ds = xmlrpc.UdsAdminService.GetDeployedService(_dsId); lName.Text = ds.name; lComments.Text = ds.comments; @@ -67,6 +73,88 @@ namespace UdsAdmin.controls.panel lState.Text = ds.state; lBaseService.Text = ds.serviceName; lOsManager.Text = ds.osManagerName; + + updateLogs(); + + ResumeLayout(); } + + private void updateCharts() + { + SuspendLayout(); + DateTime now = DateTime.Now; + DateTime to = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0); + DateTime since = to.AddDays(-7); + + if (to == shownToCharts) + return; + + try + { + xmlrpc.StatCounter assigned = xmlrpc.UdsAdminService.GetDeployedServiceCounters(_dsId, + xmlrpc.Constants.COUNTER_ASSIGNED, since, to, Properties.Settings.Default.StatsItems, true); + xmlrpc.StatCounter inUse = xmlrpc.UdsAdminService.GetDeployedServiceCounters(_dsId, + xmlrpc.Constants.COUNTER_INUSE, since, to, Properties.Settings.Default.StatsItems, true); + + assignedChart.clearSeries(); + assignedChart.addSerie(assigned); + inUseChart.clearSeries(); + inUseChart.addSerie(inUse); + + shownToCharts = to; + } + catch (CookComputing.XmlRpc.XmlRpcFaultException e) + { + gui.UserNotifier.notifyRpcException(e); + } + + ResumeLayout(); + } + + private void updateLogs() + { + List data = new List(); + try + { + xmlrpc.LogEntry[] logs = xmlrpc.UdsAdminService.GetDeployedServiceLogs(_dsId); + data.AddRange(logs); + } + catch (CookComputing.XmlRpc.XmlRpcFaultException ex) + { + gui.UserNotifier.notifyRpcException(ex); + } + logViewer1.setLogs(data.ToArray()); + } + + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabControl1.SelectedTab == tabPage2) + { + if (sender == null) + shownToCharts = new DateTime(); + updateCharts(); + } + else + updateData(); + } + + private void tabControl1_KeyUp(object sender, KeyEventArgs e) + { + switch (e.KeyCode) + { + case Keys.F5: + tabControl1_SelectedIndexChanged(null, null); + break; + + } + + } + + private void DeployedServicePanel_Resize(object sender, EventArgs e) + { + // Workaround to "dock" not fitting the content correctly + tabControl1.Size = this.Size; + } + } } diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.de.resx b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.de.resx index c74b7001..54f8b0f4 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.de.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.de.resx @@ -780,4 +780,7 @@ System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.es.resx b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.es.resx index 2ac131a8..574bcea4 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.es.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.es.resx @@ -780,4 +780,7 @@ System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.fr.resx b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.fr.resx index 69bc3439..46a46801 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.fr.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.fr.resx @@ -780,4 +780,7 @@ System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.resx b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.resx index ac4ed506..a8065c2c 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicePanel.resx @@ -117,21 +117,72 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top, Bottom, Left, Right + + + Fill + + + + 3, 3 + + + Horizontal + + + True + + + Microsoft Sans Serif, 8.25pt + + + NoControl + + + 194, 16 + + + 3, 6, 3, 0 + + + 59, 13 + + + 6 + + + Information + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + 2 True - Microsoft Sans Serif, 8.25pt + + NoControl + 3, 6 - 3, 6, 3, 0 @@ -162,8 +213,11 @@ Microsoft Sans Serif, 8.25pt + + NoControl + - 3, 27 + 3, 28 3, 6, 3, 0 @@ -195,8 +249,11 @@ Microsoft Sans Serif, 8.25pt + + NoControl + - 3, 48 + 3, 50 3, 6, 3, 0 @@ -235,7 +292,7 @@ NoControl - 155, 4 + 233, 4 11, 13 @@ -271,7 +328,7 @@ NoControl - 155, 25 + 233, 26 11, 13 @@ -307,7 +364,7 @@ NoControl - 155, 46 + 233, 48 11, 13 @@ -336,8 +393,11 @@ Microsoft Sans Serif, 8.25pt + + NoControl + - 3, 69 + 3, 72 3, 6, 3, 0 @@ -376,7 +436,7 @@ NoControl - 155, 67 + 233, 70 11, 13 @@ -412,7 +472,7 @@ NoControl - 155, 88 + 233, 92 11, 13 @@ -448,7 +508,7 @@ NoControl - 3, 112 + 3, 117 3, 6, 3, 0 @@ -487,7 +547,7 @@ NoControl - 155, 109 + 233, 114 11, 13 @@ -523,7 +583,7 @@ NoControl - 3, 133 + 3, 139 3, 6, 3, 0 @@ -562,7 +622,7 @@ NoControl - 155, 130 + 233, 136 11, 13 @@ -598,7 +658,7 @@ NoControl - 155, 151 + 233, 158 11, 13 @@ -634,7 +694,7 @@ NoControl - 3, 175 + 3, 183 3, 6, 3, 0 @@ -673,7 +733,7 @@ NoControl - 155, 172 + 233, 180 11, 13 @@ -709,7 +769,7 @@ NoControl - 3, 91 + 3, 95 3, 6, 3, 0 @@ -748,7 +808,7 @@ NoControl - 3, 154 + 3, 161 3, 6, 3, 0 @@ -775,16 +835,16 @@ 17 - 17, 25 + 25, 35 10 - 367, 215 + 460, 223 - 0 + 5 tableLayoutPanel1 @@ -793,45 +853,267 @@ System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + panel1 1 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="groupLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lName" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lComments" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lBaseService" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label3" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lOsManager" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lInitial" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="cacheLabel" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lCache" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="cacheL2Label" Row="6" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lL2Cache" Row="6" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lMax" Row="7" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label6" Row="8" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lState" Row="8" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label10" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label7" Row="7" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,0" /><Rows Styles="Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="groupLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lName" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lComments" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lBaseService" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label3" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lOsManager" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lInitial" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="cacheLabel" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lCache" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="cacheL2Label" Row="6" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lL2Cache" Row="6" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="lMax" Row="7" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label6" Row="8" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lState" Row="8" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label10" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label7" Row="7" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,50,Percent,50" /><Rows Styles="Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10,Percent,10" /></TableLayoutSettings> - - True + + Fill - - Microsoft Sans Serif, 8.25pt + + 0, 0 - - 186, 6 + + 721, 397 - - 3, 6, 3, 0 + + 7 - - 59, 13 + + panel1 - + + System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + Fill + + + 0, 0 + + + 0, 0, 0, 0 + + + 721, 69 + + + 0 + + + logViewer1 + + + UdsAdmin.controls.panel.LogViewer, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + 1 - - Information + + 721, 474 - - label4 + + 397 - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 8 - + + 0 + + + splitContainer1 + + + UdsAdmin.controls.SplitContainerEx, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tabPage1 + + + 0 + + + 4, 23 + + + 3, 3, 3, 3 + + + 727, 480 + + + 0 + + + General + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + 1 + + + Fill + + + 3, 240 + + + 715, 231 + + + 8 + + + inUseChart + + + UdsAdmin.controls.panel.ChartPanel, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tableLayoutPanel2 + + + 0 + + + Fill + + + 3, 3 + + + 715, 231 + + + 7 + + + assignedChart + + + UdsAdmin.controls.panel.ChartPanel, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tableLayoutPanel2 + + + 1 + + + Fill + + + 3, 3 + + + 2 + + + 721, 474 + + + 7 + + + tableLayoutPanel2 + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="inUseChart" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="assignedChart" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> + + + 4, 23 + + + 3, 3, 3, 3 + + + 727, 480 + + + 1 + + + Statistics + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + 0, 0 + + + 735, 507 + + + 0 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - + 0 @@ -841,7 +1123,7 @@ 6, 13 - 442, 272 + 731, 503 DeployedServicePanel diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.Designer.cs b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.Designer.cs index 61f3a41d..2ed91749 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.Designer.cs +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.Designer.cs @@ -34,6 +34,21 @@ this.kind = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.state = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.comments = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.splitContainer1 = new UdsAdmin.controls.SplitContainerEx(); + this.logViewer1 = new UdsAdmin.controls.panel.LogViewer(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.assignedChart = new UdsAdmin.controls.panel.ChartPanel(); + this.inUseChart = new UdsAdmin.controls.panel.ChartPanel(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // // listView @@ -51,6 +66,7 @@ this.listView.UseCompatibleStateImageBehavior = false; this.listView.View = System.Windows.Forms.View.Details; this.listView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView_ColumnClick); + this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged); this.listView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.listView_KeyUp); // // name @@ -72,13 +88,82 @@ resources.ApplyResources(this.comments, "comments"); this.comments.Width = global::UdsAdmin.Properties.Settings.Default.wCommentsCol; // + // tabControl1 + // + resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.splitContainer1); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.listView); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.logViewer1); + // + // logViewer1 + // + resources.ApplyResources(this.logViewer1, "logViewer1"); + this.logViewer1.Name = "logViewer1"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.tableLayoutPanel1); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // tableLayoutPanel1 + // + resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); + this.tableLayoutPanel1.Controls.Add(this.assignedChart, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.inUseChart, 0, 1); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + // + // assignedChart + // + resources.ApplyResources(this.assignedChart, "assignedChart"); + this.assignedChart.Name = "assignedChart"; + // + // inUseChart + // + resources.ApplyResources(this.inUseChart, "inUseChart"); + this.inUseChart.Name = "inUseChart"; + // // DeployedServicesPanel // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.listView); + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.tabControl1); + this.DoubleBuffered = true; this.Name = "DeployedServicesPanel"; this.VisibleChanged += new System.EventHandler(this.UsersPanel_VisibleChanged); + this.Resize += new System.EventHandler(this.DeployedServicesPanel_Resize); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); this.ResumeLayout(false); } @@ -90,5 +175,13 @@ private System.Windows.Forms.ColumnHeader state; private System.Windows.Forms.ColumnHeader comments; private System.Windows.Forms.ColumnHeader kind; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private SplitContainerEx splitContainer1; + private LogViewer logViewer1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private ChartPanel assignedChart; + private ChartPanel inUseChart; } } diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.cs b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.cs index ef9fad9a..86133050 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.cs +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.cs @@ -41,6 +41,7 @@ namespace UdsAdmin.controls.panel public partial class DeployedServicesPanel : UserControl { gui.ListViewSorter _listSorter; + private DateTime shownToCharts = new DateTime(); public DeployedServicesPanel() { @@ -53,9 +54,10 @@ namespace UdsAdmin.controls.panel private void UsersPanel_VisibleChanged(object sender, EventArgs e) { if (Visible == true) - { - updateList(); - } + if (tabControl1.SelectedTab == tabPage2) + updateCharts(); + else + updateList(); } private void updateList() @@ -81,6 +83,62 @@ namespace UdsAdmin.controls.panel gui.UserNotifier.notifyRpcException(ex); } + if (listView.Items.Count > 0) + { + listView.Items[0].Selected = listView.Items[0].Focused = true; + listView.Focus(); + } + } + + private void updateCharts() + { + SuspendLayout(); + DateTime now = DateTime.Now; + DateTime to = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0); + DateTime since = to.AddDays(-7); + + if (to == shownToCharts) + return; + + try + { + xmlrpc.StatCounter assigned = xmlrpc.UdsAdminService.GetDeployedServiceCounters(xmlrpc.Constants.ALL, + xmlrpc.Constants.COUNTER_ASSIGNED, since, to, Properties.Settings.Default.StatsItems, true); + xmlrpc.StatCounter inUse = xmlrpc.UdsAdminService.GetDeployedServiceCounters(xmlrpc.Constants.ALL, + xmlrpc.Constants.COUNTER_INUSE, since, to, Properties.Settings.Default.StatsItems, true); + + assignedChart.clearSeries(); + assignedChart.addSerie(assigned); + inUseChart.clearSeries(); + inUseChart.addSerie(inUse); + + shownToCharts = to; + } + catch (CookComputing.XmlRpc.XmlRpcFaultException e) + { + gui.UserNotifier.notifyRpcException(e); + } + + ResumeLayout(); + } + + private void updateLogs() + { + List data = new List(); + foreach (ListViewItem i in listView.SelectedItems) + { + try + { + xmlrpc.LogEntry[] logs = xmlrpc.UdsAdminService.GetDeployedServiceLogs((string)i.Tag); + data.AddRange(logs); + } + catch (CookComputing.XmlRpc.XmlRpcFaultException ex) + { + gui.UserNotifier.notifyRpcException(ex); + } + + } + logViewer1.setLogs(data.ToArray()); } private void listView_KeyUp(object sender, KeyEventArgs e) @@ -88,10 +146,10 @@ namespace UdsAdmin.controls.panel switch (e.KeyCode) { case Keys.F5: - updateList(); + tabControl1_SelectedIndexChanged(null, null); break; case Keys.E: - if (e.Modifiers == Keys.Control) + if (e.Modifiers == Keys.Control && tabControl1.SelectedTab == tabPage1) foreach (ListViewItem i in listView.Items) i.Selected = true; break; @@ -103,5 +161,28 @@ namespace UdsAdmin.controls.panel _listSorter.ColumnClick(sender, e); } + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabControl1.SelectedTab == tabPage2) + { + if (sender == null) + shownToCharts = new DateTime(); + updateCharts(); + } + else + updateList(); + } + + private void listView_SelectedIndexChanged(object sender, EventArgs e) + { + updateLogs(); + } + + private void DeployedServicesPanel_Resize(object sender, EventArgs e) + { + // Workaround to "dock" not fitting the content correctly + tabControl1.Size = this.Size; + } + } } diff --git a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.resx b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.resx index dbff7c4c..95d19d83 100644 --- a/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.resx +++ b/client/administration/UdsAdmin/controls/panel/DeployedServicesPanel.resx @@ -145,7 +145,7 @@ 0, 0 - 660, 279 + 723, 375 0 @@ -157,11 +157,254 @@ System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + splitContainer1.Panel1 0 + + Top, Bottom, Left, Right + + + Fill + + + 3, 3 + + + Horizontal + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + Fill + + + 0, 0 + + + 0, 0, 0, 0 + + + 723, 93 + + + 0 + + + logViewer1 + + + UdsAdmin.controls.panel.LogViewer, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 723, 476 + + + 375 + + + 8 + + + 1 + + + splitContainer1 + + + UdsAdmin.controls.SplitContainerEx, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tabPage1 + + + 0 + + + 4, 23 + + + 3, 3, 3, 3 + + + 729, 482 + + + 0 + + + General + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + 1 + + + Fill + + + 3, 3 + + + 717, 232 + + + 0 + + + assignedChart + + + UdsAdmin.controls.panel.ChartPanel, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tableLayoutPanel1 + + + 0 + + + Fill + + + 3, 241 + + + 717, 232 + + + 1 + + + inUseChart + + + UdsAdmin.controls.panel.ChartPanel, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null + + + tableLayoutPanel1 + + + 1 + + + Fill + + + 3, 3 + + + 2 + + + 723, 476 + + + 0 + + + tableLayoutPanel1 + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="assignedChart" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="inUseChart" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100,Absolute,20" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> + + + 4, 23 + + + 3, 3, 3, 3 + + + 729, 482 + + + 1 + + + Statistics + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + 0, 0 + + + 737, 509 + + + 1 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + True @@ -169,7 +412,7 @@ 6, 13 - 660, 279 + 737, 509 name diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.Designer.cs b/client/administration/UdsAdmin/controls/panel/LogViewer.Designer.cs new file mode 100644 index 00000000..c0ce7612 --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.Designer.cs @@ -0,0 +1,139 @@ +namespace UdsAdmin.controls.panel +{ + partial class LogViewer + { + /// + /// Variable del diseñador requerida. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Limpiar los recursos que se estén utilizando. + /// + /// true si los recursos administrados se deben eliminar; false en caso contrario, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Código generado por el Diseñador de componentes + + /// + /// Método necesario para admitir el Diseñador. No se puede modificar + /// el contenido del método con el editor de código. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LogViewer)); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.listView = new System.Windows.Forms.ListView(); + this.date = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.level = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.source = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.message = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.levelFilterCombo = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.tableLayoutPanel1.SuspendLayout(); + this.flowLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); + this.tableLayoutPanel1.Controls.Add(this.listView, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 1); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + // + // listView + // + this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.date, + this.level, + this.source, + this.message}); + resources.ApplyResources(this.listView, "listView"); + this.listView.FullRowSelect = true; + this.listView.GridLines = true; + this.listView.MultiSelect = false; + this.listView.Name = "listView"; + this.listView.UseCompatibleStateImageBehavior = false; + this.listView.View = System.Windows.Forms.View.Details; + this.listView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView_ColumnClick); + this.listView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.listView_KeyUp); + // + // date + // + resources.ApplyResources(this.date, "date"); + // + // level + // + resources.ApplyResources(this.level, "level"); + // + // source + // + resources.ApplyResources(this.source, "source"); + // + // message + // + resources.ApplyResources(this.message, "message"); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.Controls.Add(this.levelFilterCombo); + this.flowLayoutPanel1.Controls.Add(this.label2); + this.flowLayoutPanel1.Controls.Add(this.label1); + resources.ApplyResources(this.flowLayoutPanel1, "flowLayoutPanel1"); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + // + // levelFilterCombo + // + this.levelFilterCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.levelFilterCombo.FormattingEnabled = true; + resources.ApplyResources(this.levelFilterCombo, "levelFilterCombo"); + this.levelFilterCombo.Name = "levelFilterCombo"; + this.levelFilterCombo.SelectedIndexChanged += new System.EventHandler(this.levelFilterCombo_SelectedIndexChanged); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // LogViewer + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "LogViewer"; + this.tableLayoutPanel1.ResumeLayout(false); + this.flowLayoutPanel1.ResumeLayout(false); + this.flowLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.ListView listView; + private System.Windows.Forms.ColumnHeader date; + private System.Windows.Forms.ColumnHeader level; + private System.Windows.Forms.ColumnHeader source; + private System.Windows.Forms.ColumnHeader message; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox levelFilterCombo; + private System.Windows.Forms.Label label2; + + } +} diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.cs b/client/administration/UdsAdmin/controls/panel/LogViewer.cs new file mode 100644 index 00000000..78ed8aea --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UdsAdmin.controls.panel +{ + public partial class LogViewer : UserControl + { + gui.ListViewSorter _listSorter; + private readonly int[] levelIndex = new int[] { xmlrpc.Constants.LEVEL_DEBUG_I, xmlrpc.Constants.LEVEL_INFO_I, + xmlrpc.Constants.LEVEL_WARN_I, xmlrpc.Constants.LEVEL_ERROR_I, xmlrpc.Constants.LEVEL_FATAL_I }; + + xmlrpc.LogEntry[] logs = null; + + public LogViewer() + { + InitializeComponent(); + + ResizeRedraw = true; + + listView.ListViewItemSorter = _listSorter = new gui.ListViewSorter(listView, new int[] { 3, 5 }); + + levelFilterCombo.Items.AddRange(new string[] { xmlrpc.Constants.LEVEL_DEBUG, xmlrpc.Constants.LEVEL_INFO, + xmlrpc.Constants.LEVEL_WARN, xmlrpc.Constants.LEVEL_ERROR, xmlrpc.Constants.LEVEL_FATAL }); + levelFilterCombo.SelectedIndex = 2; + } + + public void setLogs(xmlrpc.LogEntry[] logs) + { + this.logs = logs; + updateList(); + } + + private void updateList() + { + if( logs == null ) + return; + + List lst = new List(); + int minLevel = levelIndex[levelFilterCombo.SelectedIndex]; + + foreach (xmlrpc.LogEntry l in logs) + { + if (l.level < minLevel) + continue; + + ListViewItem itm = new ListViewItem(new string[] { l.date.ToString(), xmlrpc.Constants.stringFromLevel(l.level), l.source, l.message }); + // Color is got from ranges + itm.ForeColor = gui.Colors.getColorForLogLevel(l.level); + lst.Add(itm); + } + listView.Items.Clear(); + listView.Items.AddRange(lst.ToArray()); + } + + + private void listView_ColumnClick(object sender, ColumnClickEventArgs e) + { + _listSorter.ColumnClick(sender, e); + } + + private void levelFilterCombo_SelectedIndexChanged(object sender, EventArgs e) + { + updateList(); + } + + private void listView_KeyUp(object sender, KeyEventArgs e) + { + /*switch (e.KeyCode) + { + case Keys.F5: + updateList(); + break; + }*/ + } + } +} diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.de.resx b/client/administration/UdsAdmin/controls/panel/LogViewer.de.resx new file mode 100644 index 00000000..160de8b1 --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Filter: + + + Ebene + + + Ebene + + + Nachricht + + + Quelle + + + Datum + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.es.resx b/client/administration/UdsAdmin/controls/panel/LogViewer.es.resx new file mode 100644 index 00000000..88d37dff --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.es.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Filtrar: + + + Nivel + + + nivel + + + mensaje + + + fuente + + + fecha + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.fr.resx b/client/administration/UdsAdmin/controls/panel/LogViewer.fr.resx new file mode 100644 index 00000000..2aa83905 --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.fr.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Filtre: + + + Niveau + + + niveau + + + message + + + source + + + date + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/LogViewer.resx b/client/administration/UdsAdmin/controls/panel/LogViewer.resx new file mode 100644 index 00000000..c03d7945 --- /dev/null +++ b/client/administration/UdsAdmin/controls/panel/LogViewer.resx @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 1 + + + date + + + 100 + + + level + + + 109 + + + source + + + 92 + + + message + + + 389 + + + + Fill + + + + 0, 0 + + + 0, 0, 0, 0 + + + 715, 178 + + + 1 + + + listView + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 0 + + + 591, 3 + + + 121, 21 + + + 1 + + + levelFilterCombo + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + flowLayoutPanel1 + + + 0 + + + True + + + 552, 0 + + + 0, 4, 0, 0 + + + 33, 17 + + + 2 + + + Level + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + flowLayoutPanel1 + + + 1 + + + True + + + Microsoft Sans Serif, 8.25pt, style=Bold + + + 503, 0 + + + 0, 4, 0, 0 + + + 43, 17 + + + 0 + + + Filter: + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + flowLayoutPanel1 + + + 2 + + + Fill + + + RightToLeft + + + 0, 178 + + + 0, 0, 0, 0 + + + 715, 32 + + + 2 + + + flowLayoutPanel1 + + + System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 1 + + + Fill + + + 0, 0 + + + 0, 0, 0, 0 + + + 2 + + + 715, 210 + + + 1 + + + tableLayoutPanel1 + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listView" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="flowLayoutPanel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,32" /></TableLayoutSettings> + + + True + + + 6, 13 + + + 0, 0, 0, 0 + + + 715, 210 + + + date + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + level + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + source + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + message + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + LogViewer + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/client/administration/UdsAdmin/controls/panel/UsersPanel.Designer.cs b/client/administration/UdsAdmin/controls/panel/UsersPanel.Designer.cs index 6e86ad66..3703ecf3 100644 --- a/client/administration/UdsAdmin/controls/panel/UsersPanel.Designer.cs +++ b/client/administration/UdsAdmin/controls/panel/UsersPanel.Designer.cs @@ -35,7 +35,7 @@ this.state = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.lastAccess = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.comments = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer1 = new SplitContainerEx(); this.logViewer1 = new UdsAdmin.controls.panel.LogViewer(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); @@ -126,7 +126,7 @@ private System.Windows.Forms.ColumnHeader state; private System.Windows.Forms.ColumnHeader lastAccess; private System.Windows.Forms.ColumnHeader comments; - private System.Windows.Forms.SplitContainer splitContainer1; + private SplitContainerEx splitContainer1; private LogViewer logViewer1; } } diff --git a/client/administration/UdsAdmin/controls/panel/UsersPanel.resx b/client/administration/UdsAdmin/controls/panel/UsersPanel.resx index 24026aa8..b6beb228 100644 --- a/client/administration/UdsAdmin/controls/panel/UsersPanel.resx +++ b/client/administration/UdsAdmin/controls/panel/UsersPanel.resx @@ -117,6 +117,21 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Username + + + Name + + + State + + + Last Access + + + Comments + Fill @@ -130,7 +145,7 @@ 0, 0 - 597, 216 + 737, 400 0 @@ -147,21 +162,6 @@ 0 - - Username - - - Name - - - State - - - Last Access - - - Comments - Fill @@ -189,8 +189,11 @@ 0, 0 + + 0, 0, 0, 0 + - 597, 58 + 737, 101 0 @@ -220,10 +223,13 @@ 1 - 597, 278 + 737, 509 - 216 + 400 + + + 8 1 @@ -247,7 +253,7 @@ 6, 13 - 597, 278 + 737, 509 username diff --git a/client/administration/UdsAdmin/forms/DeployedGroupForm.de.resx b/client/administration/UdsAdmin/forms/DeployedGroupForm.de.resx index ea10f3c8..043fd57c 100644 --- a/client/administration/UdsAdmin/forms/DeployedGroupForm.de.resx +++ b/client/administration/UdsAdmin/forms/DeployedGroupForm.de.resx @@ -207,4 +207,7 @@ System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Authentifikator + \ No newline at end of file diff --git a/client/administration/UdsAdmin/forms/DeployedGroupForm.es.resx b/client/administration/UdsAdmin/forms/DeployedGroupForm.es.resx index 67c6b67f..b3046604 100644 --- a/client/administration/UdsAdmin/forms/DeployedGroupForm.es.resx +++ b/client/administration/UdsAdmin/forms/DeployedGroupForm.es.resx @@ -207,4 +207,7 @@ System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Autenticador + \ No newline at end of file diff --git a/client/administration/UdsAdmin/forms/DeployedGroupForm.fr.resx b/client/administration/UdsAdmin/forms/DeployedGroupForm.fr.resx index b3e4a4ef..b853c22b 100644 --- a/client/administration/UdsAdmin/forms/DeployedGroupForm.fr.resx +++ b/client/administration/UdsAdmin/forms/DeployedGroupForm.fr.resx @@ -207,4 +207,7 @@ System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Authentificateur + \ No newline at end of file diff --git a/client/administration/UdsAdmin/forms/MainForm.Designer.cs b/client/administration/UdsAdmin/forms/MainForm.Designer.cs index 163e5fba..5cca2682 100644 --- a/client/administration/UdsAdmin/forms/MainForm.Designer.cs +++ b/client/administration/UdsAdmin/forms/MainForm.Designer.cs @@ -29,7 +29,7 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer1 = new UdsAdmin.controls.SplitContainerEx(); this.treeActions = new System.Windows.Forms.TreeView(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); @@ -158,6 +158,7 @@ // this.aboutToolStripMenuItem1.Name = "aboutToolStripMenuItem1"; resources.ApplyResources(this.aboutToolStripMenuItem1, "aboutToolStripMenuItem1"); + this.aboutToolStripMenuItem1.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); // // serviceProviderToolStripMenuItem // @@ -253,7 +254,7 @@ private System.Windows.Forms.ToolStripMenuItem serviceProviderToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem newServiceProviderMenu; private System.Windows.Forms.ToolStrip toolStrip1; - private System.Windows.Forms.SplitContainer splitContainer1; + private UdsAdmin.controls.SplitContainerEx splitContainer1; private System.Windows.Forms.TreeView treeActions; private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem languageToolStripMenuItem; diff --git a/client/administration/UdsAdmin/forms/MainForm.cs b/client/administration/UdsAdmin/forms/MainForm.cs index 3a674046..d98cc871 100644 --- a/client/administration/UdsAdmin/forms/MainForm.cs +++ b/client/administration/UdsAdmin/forms/MainForm.cs @@ -200,6 +200,10 @@ namespace UdsAdmin.forms { gui.ActionTree.showAssociatedPanel(splitContainer1.Panel2, treeActions, this); } + catch (CookComputing.XmlRpc.XmlRpcFaultException ex) + { + gui.UserNotifier.notifyRpcException(ex); + } catch (Exception) { // Nothing done right now @@ -691,5 +695,10 @@ namespace UdsAdmin.forms return new Point(form.Location.X + form.Width / 2 - f.Width / 2, form.Location.Y + form.Height / 2 - f.Height / 2); } + private void aboutToolStripMenuItem1_Click(object sender, EventArgs e) + { + (new AboutBoxForm()).ShowDialog(); + } + } } diff --git a/client/administration/UdsAdmin/forms/MainForm.resx b/client/administration/UdsAdmin/forms/MainForm.resx index 35555034..a1cb5273 100644 --- a/client/administration/UdsAdmin/forms/MainForm.resx +++ b/client/administration/UdsAdmin/forms/MainForm.resx @@ -189,6 +189,9 @@ 146 + + 8 + 3 @@ -196,7 +199,7 @@ splitContainer1 - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + UdsAdmin.controls.SplitContainerEx, UdsAdmin, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null $this @@ -234,53 +237,17 @@ 133, 17 - - 0, 0 - - - 610, 25 - - - 1 - - - topMenu - - - menuStrip1 - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 42, 21 - - - File - 102, 22 Exit - - 52, 21 + + 42, 21 - - Tools - - - 165, 22 - - - Language + + File 127, 22 @@ -306,6 +273,12 @@ German + + 165, 22 + + + Language + 165, 22 @@ -318,11 +291,35 @@ About - - 103, 20 + + 52, 21 - - Service Provider + + Tools + + + 0, 0 + + + 610, 25 + + + 1 + + + topMenu + + + menuStrip1 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 106, 22 @@ -333,15 +330,15 @@ 106, 22 + + 103, 20 + + + Service Provider + 32, 19 - - 126, 22 - - - Language - 126, 22 @@ -354,6 +351,12 @@ English + + 126, 22 + + + Language + 126, 22 @@ -363,6 +366,18 @@ 248, 17 + + Magenta + + + 23, 22 + + + Flush Cache + + + Clears the cache + 0, 25 @@ -387,18 +402,6 @@ 1 - - Magenta - - - 23, 22 - - - Flush Cache - - - Clears the cache - True diff --git a/client/administration/UdsAdmin/gui/ActionTree.cs b/client/administration/UdsAdmin/gui/ActionTree.cs index 0cccdde2..3de92038 100644 --- a/client/administration/UdsAdmin/gui/ActionTree.cs +++ b/client/administration/UdsAdmin/gui/ActionTree.cs @@ -463,14 +463,17 @@ namespace UdsAdmin.gui // Hides all visible controls foreach (Control ctrl in panel.Controls) ctrl.Hide(); + //panel.Controls.Clear(); string key = getKey(selected); if (panel.Controls.ContainsKey(key)) + { panel.Controls[key].Show(); + } else // Don't exists, creates a new panel associated with the tree view and initializes it { Control ctrl; - switch( selected.Name ) + switch (selected.Name) { case USERS: { diff --git a/client/administration/UdsAdmin/xmlrpc/Constants.cs b/client/administration/UdsAdmin/xmlrpc/Constants.cs index 7e6c81f5..9f3a4821 100644 --- a/client/administration/UdsAdmin/xmlrpc/Constants.cs +++ b/client/administration/UdsAdmin/xmlrpc/Constants.cs @@ -61,6 +61,13 @@ namespace UdsAdmin.xmlrpc public const string STATE_CANCELED = "C"; public const string STATE_CANCELING = "K"; + public const int COUNTER_LOAD_TYPE = 0; + public const int COUNTER_STORAGE = 1; + public const int COUNTER_ASSIGNED = 2; + public const int COUNTER_INUSE = 3; + + public const string ALL = "-1"; + public const string LEVEL_OTHER = "OTHER"; public const int LEVEL_OTHER_I = 10000; public const string LEVEL_DEBUG = "DEBUG"; diff --git a/client/administration/UdsAdmin/xmlrpc/IUDSAdmin.cs b/client/administration/UdsAdmin/xmlrpc/IUDSAdmin.cs index 5cdc2ab4..c9b41673 100644 --- a/client/administration/UdsAdmin/xmlrpc/IUDSAdmin.cs +++ b/client/administration/UdsAdmin/xmlrpc/IUDSAdmin.cs @@ -338,6 +338,14 @@ namespace UdsAdmin.xmlrpc [XmlRpcMethod("getAuthLogs")] LogEntry[] GetAuthLogs(string credentials, string id); + [XmlRpcMethod("getDeployedServiceLogs")] + LogEntry[] GetDeployedServiceLogs(string credentials, string id); + + // Statistics stuff + [XmlRpcMethod("getDeployedServiceCounters")] + StatCounter GetDeployedServiceCounters(string credentials, string id, int counter_type, DateTime since, DateTime to, int points, bool use_max); + + // Callbacks invoker [XmlRpcMethod("chooseCallback")] GuiFieldValue[] InvokeChooseCallback(string credentials, string name, GuiFieldValue[] parameters); diff --git a/client/administration/UdsAdmin/xmlrpc/UDSAdminService.cs b/client/administration/UdsAdmin/xmlrpc/UDSAdminService.cs index b8ef49e7..419959c7 100644 --- a/client/administration/UdsAdmin/xmlrpc/UDSAdminService.cs +++ b/client/administration/UdsAdmin/xmlrpc/UDSAdminService.cs @@ -725,6 +725,17 @@ namespace UdsAdmin.xmlrpc return s.GetAuthLogs(credentials, id); } + public static LogEntry[] GetDeployedServiceLogs(string id) + { + return s.GetDeployedServiceLogs(credentials, id); + } + + // Stats methods + public static StatCounter GetDeployedServiceCounters(string id, int counter_type, DateTime since, DateTime to, int points, bool use_max = false) + { + return s.GetDeployedServiceCounters(credentials, id, counter_type, since, to, points, use_max); + } + // Calbacks public static GuiFieldValue[] InvokeChooseCallback(string name, GuiFieldValue[] parameters) diff --git a/client/administration/UdsAdmin/xmlrpc/structs.cs b/client/administration/UdsAdmin/xmlrpc/structs.cs index 803fac49..90443263 100644 --- a/client/administration/UdsAdmin/xmlrpc/structs.cs +++ b/client/administration/UdsAdmin/xmlrpc/structs.cs @@ -399,7 +399,7 @@ namespace UdsAdmin.xmlrpc { this.section = section; this.key = key; this.value = value; this.crypt = crypt; this.longText = longText; } - }; + } public class LogEntry { @@ -409,6 +409,19 @@ namespace UdsAdmin.xmlrpc public string source; } + // Stats structures + public class StatCounterData + { + public DateTime stamp; + public int value; + } + + public class StatCounter + { + public string title; + public StatCounterData[] data; + } + public struct ChoiceCallback { public string callbackName; diff --git a/client/administration/installer/UDSAdminInstaller/MSChart.exe b/client/administration/installer/UDSAdminInstaller/MSChart.exe new file mode 100644 index 00000000..5ca98b85 Binary files /dev/null and b/client/administration/installer/UDSAdminInstaller/MSChart.exe differ diff --git a/client/administration/installer/UDSAdminInstaller/RedistLicenseMSChart.docx b/client/administration/installer/UDSAdminInstaller/RedistLicenseMSChart.docx new file mode 100644 index 00000000..bb2798c7 Binary files /dev/null and b/client/administration/installer/UDSAdminInstaller/RedistLicenseMSChart.docx differ diff --git a/client/administration/installer/UDSAdminInstaller/udsadmin.nsi b/client/administration/installer/UDSAdminInstaller/udsadmin.nsi index 411fed92..2378ceca 100644 --- a/client/administration/installer/UDSAdminInstaller/udsadmin.nsi +++ b/client/administration/installer/UDSAdminInstaller/udsadmin.nsi @@ -10,7 +10,7 @@ Name "UDS Administration" !define URL http://www.virtualcable.es # MultiUser Symbol Definitions -!define MULTIUSER_EXECUTIONLEVEL Standard +!define MULTIUSER_EXECUTIONLEVEL Admin !define MULTIUSER_INSTALLMODE_COMMANDLINE !define MULTIUSER_INSTALLMODE_INSTDIR "UDS Administration Client" !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "${REGKEY}" @@ -57,7 +57,7 @@ InstallDir "UDS Administration Client" CRCCheck on XPStyle on ShowInstDetails show -VIProductVersion 1.0.0.0 +VIProductVersion 1.1.0.0 VIAddVersionKey /LANG=${LANG_ENGLISH} ProductName "UDS Administration Client" VIAddVersionKey /LANG=${LANG_ENGLISH} ProductVersion "${VERSION}" VIAddVersionKey /LANG=${LANG_ENGLISH} CompanyName "${COMPANY}" @@ -83,6 +83,13 @@ Section -Main SEC0000 File ..\..\UdsAdmin\bin\Release\es\UdsAdmin.resources.dll SetOutPath $INSTDIR\fr File ..\..\UdsAdmin\bin\Release\fr\UdsAdmin.resources.dll + + SetOutPath $TEMP + File MSChart.exe + System::Call "kernel32::CreateMutexA(i 0, i 0, t 'ChartInstall') i .r0 ?e" + ExecWait "$TEMP\MSChart.exe /q /log %temp%\msclog.htm /norestart" $0 + Delete "$TEMP\MSChart.exe" + WriteRegStr HKLM "${REGKEY}\Components" Main 1 SectionEnd @@ -142,6 +149,14 @@ SectionEnd Function .onInit InitPluginsDir StrCpy $StartMenuGroup "Virtual Cable\UDS Administration Client" + + ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" SP + ${if} $0 != 1 + MessageBox MB_OK "$(^NoDotNet)" + Abort + ${EndIf} + + !insertmacro MUI_LANGDLL_DISPLAY !insertmacro MULTIUSER_INIT FunctionEnd @@ -155,9 +170,14 @@ Function un.onInit FunctionEnd # Installer Language Strings -# TODO Update the Language Strings with the appropriate translations. + +LangString ^NoDotNet ${LANG_ENGLISH} ".NET 3.5 sp1 Required.$\nPlease, install it to proceed" +LangString ^NoDotNet ${LANG_SPANISH} "Se requiere .NET 3.5 sp1.$\nPor favor, instalelo para proceder" +LangString ^NoDotNet ${LANG_FRENCH} ".NET Framework 3.5 SP1 requis.$\nVeuillez, installez-le de procéder" +LangString ^NoDotNet ${LANG_GERMAN} "Erforderlich ist. NET 3.5 sp1.$\nPor Bitte installieren Sie es, um fortzufahren" + LangString ^UninstallLink ${LANG_ENGLISH} "Uninstall $(^Name)" -LangString ^UninstallLink ${LANG_SPANISH} "Uninstall $(^Name)" -LangString ^UninstallLink ${LANG_FRENCH} "Uninstall $(^Name)" -LangString ^UninstallLink ${LANG_GERMAN} "Uninstall $(^Name)" +LangString ^UninstallLink ${LANG_SPANISH} "Desinstalar $(^Name)" +LangString ^UninstallLink ${LANG_FRENCH} "Désinstaller $(^Name)" +LangString ^UninstallLink ${LANG_GERMAN} "Deinstallieren $(^Name)" diff --git a/server/.settings/org.eclipse.core.resources.prefs b/server/.settings/org.eclipse.core.resources.prefs index 7394e283..46e83e65 100644 --- a/server/.settings/org.eclipse.core.resources.prefs +++ b/server/.settings/org.eclipse.core.resources.prefs @@ -44,6 +44,7 @@ encoding//src/uds/core/auths/GroupsManager.py=utf-8 encoding//src/uds/core/auths/User.py=utf-8 encoding//src/uds/core/auths/__init__.py=utf-8 encoding//src/uds/core/auths/auth.py=utf-8 +encoding//src/uds/core/db/__init__.py=utf-8 encoding//src/uds/core/jobs/DelayedTask.py=utf-8 encoding//src/uds/core/jobs/DelayedTaskRunner.py=utf-8 encoding//src/uds/core/jobs/Job.py=utf-8 @@ -54,6 +55,7 @@ encoding//src/uds/core/managers/CryptoManager.py=utf-8 encoding//src/uds/core/managers/DownloadsManager.py=utf-8 encoding//src/uds/core/managers/LogManager.py=utf-8 encoding//src/uds/core/managers/PublicationManager.py=utf-8 +encoding//src/uds/core/managers/StatsManager.py=utf-8 encoding//src/uds/core/managers/TaskManager.py=utf-8 encoding//src/uds/core/managers/UserPrefsManager.py=utf-8 encoding//src/uds/core/managers/UserServiceManager.py=utf-8 @@ -86,11 +88,15 @@ encoding//src/uds/core/util/UniqueNameGenerator.py=utf-8 encoding//src/uds/core/util/connection.py=utf-8 encoding//src/uds/core/util/log.py=utf-8 encoding//src/uds/core/util/modfinder.py=utf-8 +encoding//src/uds/core/util/stats/__init__.py=utf-8 +encoding//src/uds/core/util/stats/charts.py=utf-8 +encoding//src/uds/core/util/stats/counters.py=utf-8 encoding//src/uds/core/workers/AssignedAndUnused.py=utf-8 encoding//src/uds/core/workers/CacheCleaner.py=utf-8 encoding//src/uds/core/workers/DeployedServiceCleaner.py=utf-8 encoding//src/uds/core/workers/PublicationCleaner.py=utf-8 encoding//src/uds/core/workers/ServiceCacheUpdater.py=utf-8 +encoding//src/uds/core/workers/StatsCollector.py=utf-8 encoding//src/uds/core/workers/UserServiceCleaner.py=utf-8 encoding//src/uds/dispatchers/__init__.py=utf-8 encoding//src/uds/dispatchers/pam/urls.py=utf-8 @@ -110,6 +116,7 @@ encoding//src/uds/migrations/0005_auto__add_field_config_crypt.py=utf-8 encoding//src/uds/migrations/0008_auto__add_userservicelog__add_field_userservice_src_hostname__add_fiel.py=utf-8 encoding//src/uds/migrations/0009_auto__del_userservicelog__add_log.py=utf-8 encoding//src/uds/migrations/0010_auto__add_field_log_owner_type.py=utf-8 +encoding//src/uds/migrations/0011_auto__add_statscounters__add_statsevents__chg_field_log_created__chg_f.py=utf-8 encoding//src/uds/models.py=utf-8 encoding//src/uds/osmanagers/LinuxOsManager/LinuxOsManager.py=utf-8 encoding//src/uds/osmanagers/LinuxOsManager/__init__.py=utf-8 @@ -194,6 +201,8 @@ encoding//src/uds/xmlrpc/services/Publications.py=utf-8 encoding//src/uds/xmlrpc/services/ServiceProviders.py=utf-8 encoding//src/uds/xmlrpc/services/Services.py=utf-8 encoding//src/uds/xmlrpc/services/UserDeployedServices.py=utf-8 +encoding//src/uds/xmlrpc/stats/__init__.py=utf-8 +encoding//src/uds/xmlrpc/stats/stats.py=utf-8 encoding//src/uds/xmlrpc/tools/Cache.py=utf-8 encoding//src/uds/xmlrpc/tools/Config.py=utf-8 encoding//src/uds/xmlrpc/transports/Networks.py=utf-8 diff --git a/server/src/uds/core/util/db/LockingManager.py b/server/src/uds/core/db/LockingManager.py similarity index 100% rename from server/src/uds/core/util/db/LockingManager.py rename to server/src/uds/core/db/LockingManager.py diff --git a/server/src/uds/core/db/__init__.py b/server/src/uds/core/db/__init__.py new file mode 100644 index 00000000..46ba7af2 --- /dev/null +++ b/server/src/uds/core/db/__init__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' + diff --git a/server/src/uds/core/managers/StatsManager.py b/server/src/uds/core/managers/StatsManager.py new file mode 100644 index 00000000..b99238a8 --- /dev/null +++ b/server/src/uds/core/managers/StatsManager.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' + +from uds.models import Provider +from uds.models import Service + +import logging + +logger = logging.getLogger(__name__) + + + + + +class StatsManager(object): + ''' + Manager for loggins statistics, so we can provide usefull info about platform usage + + Right now, we are going to provide an interface to "counter stats", that is, statistics + that has counters (such as how many users is at a time active at platform, how many services + are assigned, are in use, in cache, etc... + ''' + _manager = None + + def __init__(self): + pass + + @staticmethod + def manager(): + if StatsManager._manager == None: + StatsManager._manager = StatsManager() + return StatsManager._manager + + + # Counter stats + def addCounter(self, owner_type, owner_id, counterType, counterValue, stamp = None): + ''' + Adds a new counter stats to database. + + Args: + + toWhat: if of the counter + counterType: The type of counter that will receive the value (i.e. STORAGE_COUNTER_TYPE, LOAD_COUNTER_TYPE + counterValue: Counter to store. Right now, this must be an integer value (-2G ~ 2G) + stamp: if not None, this will be used as date for cuounter, else current date/time will be get + (this has a granurality of seconds) + + Returns: + + Nothing + ''' + from uds.models import getSqlDatetime, StatsCounters + import time + + if stamp is None: + stamp = getSqlDatetime() + + # To Unix epoch + stamp = int(time.mktime(stamp.timetuple())) + + try: + StatsCounters.objects.create(owner_type=owner_type, owner_id=owner_id, counter_type=counterType, value=counterValue, stamp=stamp) + return True + except: + logger.error('Exception handling stats saving (maybe database is full?)') + return False + + + def removeCounters(self, fromWat): + ''' + Removes counters from item + + Args: + + fromWhat: if of the counter + counter: Counter to store. Right now, this must be an integer value (-2G ~ 2G) + stamp: if not None, this will be used as date for cuounter, else current date/time will be get + (this has a granurality of seconds) + + Returns: + + Nothing + ''' + pass + + def getCounters(self, ownerType, counterType, ownerIds, since, to, limit, use_max = False): + ''' + Retrieves counters from item + + Args: + + counterTye: Type of counter to get values + counterId: (optional), if specified, limit counter to only this id, all ids for specidied type if not + maxElements: (optional) Maximum number of elements to retrieve, all if nothing specified + from: date from what to obtain counters. Unlimited if not specified + to: date until obtain counters. Unlimited if not specified + + Returns: + + Iterator, containing (date, counter) each element + ''' + from uds.models import StatsCounters + import time + + # To Unix epoch + since = int(time.mktime(since.timetuple())) + to = int(time.mktime(to.timetuple())) + + return StatsCounters.get_grouped(ownerType, counterType, owner_id = ownerIds, since = since, to = to, limit = limit, use_max = use_max) + + + def cleanupCounter(self): + ''' + Removes all counters previous to configured max keep time for stat information from database. + ''' + pass + + # Event stats + # Counter stats + def addEvent(self, toWhat, stamp = None): + ''' + Adds a new counter stat to database. + + Args: + + toWhat: if of the counter + counter: Counter to store. Right now, this must be an integer value (-2G ~ 2G) + stamp: if not None, this will be used as date for cuounter, else current date/time will be get + (this has a granurality of seconds) + + Returns: + + Nothing + + + ''' + pass + + def removeEvents(self, fromWhat): + ''' + Removes counters from item + + Args: + + toWhat: if of the counter + counter: Counter to store. Right now, this must be an integer value (-2G ~ 2G) + stamp: if not None, this will be used as date for cuounter, else current date/time will be get + (this has a granurality of seconds) + + Returns: + + Nothing + ''' + pass + + + def getEvents(self, fromWhat, **kwargs): + ''' + Retrieves counters from item + + Args: + + fromWhat: From what object to get counters + maxElements: (optional) Maximum number of elements to retrieve + + Returns: + + Array of lists, containing (date, counter) + + ''' + + def cleanupEvents(self): + ''' + Removes all counters previous to configured max keep time for stat information from database. + ''' + pass + + \ No newline at end of file diff --git a/server/src/uds/core/managers/TaskManager.py b/server/src/uds/core/managers/TaskManager.py index 20495d35..8eb16dbe 100644 --- a/server/src/uds/core/managers/TaskManager.py +++ b/server/src/uds/core/managers/TaskManager.py @@ -82,6 +82,7 @@ class TaskManager(object): from uds.core.workers.PublicationCleaner import PublicationInfoItemsCleaner, PublicationCleaner from uds.core.workers.CacheCleaner import CacheCleaner from uds.core.workers.DeployedServiceCleaner import DeployedServiceInfoItemsCleaner, DeployedServiceRemover + from uds.core.workers.StatsCollector import DeployedServiceStatsCollector logger.info("Registering sheduled tasks") TaskManager.registerJob('Service Cache Updater', ServiceCacheUpdater) @@ -92,7 +93,7 @@ class TaskManager(object): TaskManager.registerJob('Utility Cache Cleaner', CacheCleaner) TaskManager.registerJob('Deployed Service Info Cleaner', DeployedServiceInfoItemsCleaner) TaskManager.registerJob('Deployed Service Cleaner', DeployedServiceRemover) - + TaskManager.registerJob('Deployed Service Stats', DeployedServiceStatsCollector) @staticmethod diff --git a/server/src/uds/core/managers/UserServiceManager.py b/server/src/uds/core/managers/UserServiceManager.py index 6f1dc14c..35828a9b 100644 --- a/server/src/uds/core/managers/UserServiceManager.py +++ b/server/src/uds/core/managers/UserServiceManager.py @@ -102,6 +102,7 @@ class UserServiceOpChecker(DelayedTask): else: # Canceled, userService.setState(State.CANCELED) + userServiceInstance.osmanager().release(userService) userService.updateData(userServiceInstance) elif State.isErrored(state): checkLater = False @@ -228,12 +229,12 @@ class UserServiceManager(object): @transaction.commit_on_success - def createCacheFor(self, deployedService, cacheLevel): + def createCacheFor(self, deployedServicePublication, cacheLevel): ''' Creates a new cache for the deployed service publication at level indicated ''' - logger.debug('Creating a new cache element at level {0} for publication {1}'.format(cacheLevel, deployedService)) - cache = self.__createCacheAtDb(deployedService, cacheLevel) + logger.debug('Creating a new cache element at level {0} for publication {1}'.format(cacheLevel, deployedServicePublication)) + cache = self.__createCacheAtDb(deployedServicePublication, cacheLevel) ci = cache.getInstance() state = ci.deployForCache(cacheLevel) diff --git a/server/src/uds/core/managers/__init__.py b/server/src/uds/core/managers/__init__.py index 18566a1f..da03bf9b 100644 --- a/server/src/uds/core/managers/__init__.py +++ b/server/src/uds/core/managers/__init__.py @@ -50,3 +50,7 @@ def downloadsManager(): def logManager(): from LogManager import LogManager return LogManager.manager() + +def statsManager(): + from StatsManager import StatsManager + return StatsManager.manager() \ No newline at end of file diff --git a/server/src/uds/core/util/Config.py b/server/src/uds/core/util/Config.py index 8ec8d7b6..627c068b 100644 --- a/server/src/uds/core/util/Config.py +++ b/server/src/uds/core/util/Config.py @@ -168,25 +168,25 @@ class GlobalConfig: ''' SESSION_EXPIRE_TIME = Config.section(GLOBAL_SECTION).value('sessionExpireTime', '24') # Max session duration (in use) after a new publishment has been made # Delay between cache checks. reducing this number will increase cache generation speed but also will load service providers - CACHE_CHECK_DELAY = Config.section(GLOBAL_SECTION).value('cacheCheckDelay', '20') + CACHE_CHECK_DELAY = Config.section(GLOBAL_SECTION).value('cacheCheckDelay', '19') # Delayed task number of threads PER SERVER, with higher number of threads, deplayed task will complete sooner, but it will give more load to overall system DELAYED_TASKS_THREADS = Config.section(GLOBAL_SECTION).value('delayedTasksThreads', '2') # Number of scheduler threads running PER SERVER, with higher number of threads, deplayed task will complete sooner, but it will give more load to overall system SCHEDULER_THREADS = Config.section(GLOBAL_SECTION).value('schedulerThreads', '2') # Waiting time before removing "errored" and "removed" publications, cache, and user assigned machines. Time is in seconds - CLEANUP_CHECK = Config.section(GLOBAL_SECTION).value('cleanupCheck', '3600') + CLEANUP_CHECK = Config.section(GLOBAL_SECTION).value('cleanupCheck', '3607') # Time to maintaing "info state" items before removing it, in seconds - KEEP_INFO_TIME = Config.section(GLOBAL_SECTION).value('keepInfoTime', '14400') # Defaults to 2 days 172800?? better 4 hours xd + KEEP_INFO_TIME = Config.section(GLOBAL_SECTION).value('keepInfoTime', '14401') # Defaults to 2 days 172800?? better 4 hours xd # Max number of services to be "preparing" at same time MAX_PREPARING_SERVICES = Config.section(GLOBAL_SECTION).value('maxPreparingServices', '15') # Defaults to 15 services at once (per service provider) # Max number of service to be at "removal" state at same time - MAX_REMOVING_SERVICES = Config.section(GLOBAL_SECTION).value('maxRemovinggServices', '15') # Defaults to 15 services at once (per service provider) + MAX_REMOVING_SERVICES = Config.section(GLOBAL_SECTION).value('maxRemovingServices', '15') # Defaults to 15 services at once (per service provider) # If we ignore limits (max....) IGNORE_LIMITS = Config.section(GLOBAL_SECTION).value('ignoreLimits', '0') # Number of services to initiate removal per run of CacheCleaner USER_SERVICE_CLEAN_NUMBER = Config.section(GLOBAL_SECTION).value('userServiceCleanNumber', '3') # Defaults to 3 per wun # Removal Check time for cache, publications and deployed services - REMOVAL_CHECK = Config.section(GLOBAL_SECTION).value('removalCheck', '30') # Defaults to 30 seconds + REMOVAL_CHECK = Config.section(GLOBAL_SECTION).value('removalCheck', '31') # Defaults to 30 seconds # Login URL LOGIN_URL = Config.section(GLOBAL_SECTION).value('loginUrl', '/login') # Defaults to /login # Session duration @@ -199,7 +199,7 @@ class GlobalConfig: ADMIN_IDLE_TIME = Config.section(GLOBAL_SECTION).value('adminIdleTime', '14400') # Defaults to 4 hous # Time betwen checks of unused services by os managers # Unused services will be invoked for every machine assigned but not in use AND that has been assigned at least 1/2 of this time - CHECK_UNUSED_TIME = Config.section(GLOBAL_SECTION).value('checkUnusedTime', '600') # Defaults to 10 minutes + CHECK_UNUSED_TIME = Config.section(GLOBAL_SECTION).value('checkUnusedTime', '631') # Defaults to 10 minutes # Default CSS Used CSS = Config.section(GLOBAL_SECTION).value('css', settings.STATIC_URL + 'css/uds.css') # Max logins before blocking an account @@ -220,6 +220,9 @@ class GlobalConfig: # Maximum logs per user service MAX_LOGS_PER_ELEMENT = Config.section(GLOBAL_SECTION).value('maxLogPerElement', '100') + # Time to restrain a deployed service in case it gives some error at some point + RESTRAINT_TIME = Config.section(GLOBAL_SECTION).value('restrainTime', '600') + initDone = False @staticmethod @@ -250,6 +253,7 @@ class GlobalConfig: GlobalConfig.MAX_INITIALIZING_TIME.get() GlobalConfig.CUSTOM_HTML_LOGIN.get() GlobalConfig.MAX_LOGS_PER_ELEMENT.get() + GlobalConfig.RESTRAINT_TIME.get() except: logger.debug('Config table do not exists!!!, maybe we are installing? :-)') diff --git a/server/src/uds/core/util/UniqueIDGenerator.py b/server/src/uds/core/util/UniqueIDGenerator.py index 139669d5..7d066d76 100644 --- a/server/src/uds/core/util/UniqueIDGenerator.py +++ b/server/src/uds/core/util/UniqueIDGenerator.py @@ -36,6 +36,8 @@ import logging logger = logging.getLogger(__name__) +MAX_SEQ = 1000000000000000 + class UniqueIDGenerator(object): def __init__(self, typeName, owner, baseName = 'uds'): @@ -45,10 +47,10 @@ class UniqueIDGenerator(object): def setBaseName(self, newBaseName): self._baseName = newBaseName - def __filter(self, rangeStart): - return dbUniqueId.objects.filter( basename = self._baseName, seq__gte=rangeStart ) + def __filter(self, rangeStart, rangeEnd=MAX_SEQ): + return dbUniqueId.objects.filter( basename = self._baseName, seq__gte=rangeStart, seq__lte=rangeEnd ) - def get(self, rangeStart=0, rangeEnd=1000000000): + def get(self, rangeStart=0, rangeEnd=MAX_SEQ): ''' Tries to generate a new unique id in the range provided. This unique id is global to "unique ids' database @@ -56,7 +58,7 @@ class UniqueIDGenerator(object): # First look for a name in the range defined try: dbUniqueId.objects.lock() - flt = self.__filter(rangeStart) + flt = self.__filter(rangeStart, rangeEnd) try: item = flt.filter(assigned=False)[0] dbUniqueId.objects.filter(id=item.id).update( owner = self._owner, assigned = True ) @@ -69,7 +71,7 @@ class UniqueIDGenerator(object): seq = rangeStart logger.debug('Found seq {0}'.format(seq)) if seq > rangeEnd: - return None # No ids free in range + return -1 # No ids free in range dbUniqueId.objects.create( owner = self._owner, basename = self._baseName, seq = seq, assigned = True) return seq except Exception: diff --git a/server/src/uds/core/util/stats/__init__.py b/server/src/uds/core/util/stats/__init__.py new file mode 100644 index 00000000..8cfced8f --- /dev/null +++ b/server/src/uds/core/util/stats/__init__.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' +import counters + + +counters._initializeData() + + diff --git a/server/src/uds/core/util/stats/charts.py b/server/src/uds/core/util/stats/charts.py new file mode 100644 index 00000000..cf3ec50a --- /dev/null +++ b/server/src/uds/core/util/stats/charts.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' + +import datetime +import cairo +import pycha.line +import StringIO +import time + +from uds.models import getSqlDatetime + +import counters + +# Chart types +CHART_TYPE_LINE, CHART_TYPE_AREA, CHART_TYPE_BAR = xrange(3) + +__typeTitles = None + +def make(obj, counterType, **kwargs): + + width, height = (kwargs.get('width', 800), kwargs.get('height', 600)) + + since = kwargs.get('since', None) + to = kwargs.get('to', None) + if since is None and to is None: + interval = kwargs.get('interval', None) + if interval is not None: + to = getSqlDatetime() + since = to - datetime.timedelta(days=interval) + + limit = width + + dataset1 = tuple((int(time.mktime(x[0].timetuple())), x[1]) for x in counters.getCounters(obj, counterType, since=since, to=to, limit=limit, use_max = kwargs.get('use_max', False))) + + if len(dataset1) == 0: + dataset1 = ( (getSqlDatetime(True)-3600, 0), (getSqlDatetime(True), 0) ) + + firstLast = (dataset1[0][0], getSqlDatetime(True)) + + xLabelFormat = '%y-%m-%d' + diffInterval = firstLast[1] - firstLast[0] + if diffInterval <= 60*60*24: # Less than one day + xLabelFormat = '%H:%M' + elif diffInterval <= 60*60*24*7: + xLabelFormat = '%A' + + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) + + dataset = ( ( counters.getCounterTitle(counterType).encode('iso-8859-1', errors='ignore'), dataset1 ),) + + options = { + 'axis': { + 'x': { + 'ticks': [dict(v=i, label=datetime.datetime.fromtimestamp(i).strftime(xLabelFormat)) for i in firstLast], + 'range': (firstLast[0], firstLast[1]) + }, + 'y': { + 'tickCount': 4, + } + }, + 'legend': {'hide': True}, + 'background': { + 'chartColor': '#ffeeff', + 'baseColor': '#ffffff', + 'lineColor': '#444444' + }, + 'colorScheme': { + 'name': 'gradient', + 'args': { + 'initialColor': 'red', + }, + }, + 'legend': { + 'hide': True, + }, + 'padding': { + 'left': 0, + 'bottom': 0, + }, + 'title': 'Sample Chart' + } + + chart = pycha.line.LineChart(surface, options) + chart.addDataset(dataset) + chart.render() + + output = StringIO.StringIO() + + surface.write_to_png(output) + + return output.getvalue() + diff --git a/server/src/uds/core/util/stats/counters.py b/server/src/uds/core/util/stats/counters.py new file mode 100644 index 00000000..3617cade --- /dev/null +++ b/server/src/uds/core/util/stats/counters.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. +from uds.models import NEVER + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' +from django.utils.translation import ugettext_lazy as _ +from uds.core.managers import statsManager +import datetime + +import logging + +logger = logging.getLogger(__name__) + +# Posible counters, note that not all are used by every posible type +# FIRST_COUNTER_TYPE, LAST_COUNTER_TYPE are just a placeholder for sanity checks +( + CT_LOAD, CT_STORAGE, CT_ASSIGNED, CT_INUSE, +) = xrange(4) + +__caRead = None +__caWrite = None +__transDict = None +__typeTitles = None + + +def addCounter(obj, counterType, counterValue, stamp = None): + ''' + Adds a counter stat to specified object + + Although any counter type can be added to any object, there is a relation that must be observed + or, otherway, the stats will not be recoverable at all: + + + note: Runtime checks are done so if we try to insert an unssuported stat, this won't be inserted and it will be logged + ''' + if type(obj) not in __caWrite.get(counterType, ()): + logger.error('Type {0} does not accepts counter of type {1}',format(type(obj), counterValue)) + return False + + return statsManager().addCounter(__transDict[type(obj)], obj.id, counterType, counterValue, stamp) + + +def getCounters(obj, counterType, **kwargs): + ''' + Get counters + + Args: + obj: Obj for which to recover stats counters + counterType: type of counter to recover + since: (optional, defaults to 'Since beginning') Start date for counters to recover + to: (optional, defaults to 'Until end') En date for counter to recover + limit: (optional, defaults to 1000) Number of counter to recover. This is an 'At most' advice. The returned number of value + can be lower, or even 1 more than requested due to a division for retrieving object at database + all: (optinal), indicates that get all counters for the type of obj passed in, not only for that obj. + + Returns: + A generator, that contains pairs of (stamp, value) tuples + ''' + + since = kwargs.get('since', NEVER) + to = kwargs.get('to', datetime.datetime.now()) + limit = kwargs.get('limit', 1000) + use_max = kwargs.get('use_max', False) + + readFncTbl = __caRead.get(type(obj), None) + + + if readFncTbl is None: + logger.error('Type {0} has no registered stats'.format(type(obj))) + return + + fnc = readFncTbl.get(counterType, None) + + if fnc is None: + logger.error('Type {0} has no registerd stats of type {1}'.format(type(obj), counterType)) + return + + if kwargs.get('all', None) is not True: + owner_ids = fnc(obj) + else: + owner_ids = None + + + for i in statsManager().getCounters(__transDict[type(obj)], counterType, owner_ids, since, to, limit, use_max): + val = (datetime.datetime.fromtimestamp(i.stamp), i.value) + yield val + +def getCounterTitle(counterType): + return __typeTitles.get(counterType, '').title() + +# Data initialization +def _initializeData(): + ''' + Initializes dictionaries. + + Hides data from global var space + ''' + from uds.models import Provider, Service, DeployedService + + global __caWrite + global __caRead + global __transDict + global __typeTitles + + __caWrite = { + CT_LOAD: (Provider,), + CT_STORAGE: (Service,), + CT_ASSIGNED: (DeployedService,), + CT_INUSE: (DeployedService,), + } + + + # OBtain ids from variups type of object to retrieve stats + def get_Id(obj): + return obj.id + + def get_P_S_Ids(provider): + return (i.id for i in provider.services.all()) + + def get_S_DS_Ids(service): + return (i.id for i in service.deployedServices.all()) + + def get_P_S_DS_Ids(provider): + res = () + for i in provider.services.all(): + res += get_S_DS_Ids(i) + return res + + __caRead = { + Provider: { + CT_LOAD: get_Id, + CT_STORAGE: get_P_S_Ids, + CT_ASSIGNED: get_P_S_DS_Ids, + CT_INUSE: get_P_S_DS_Ids + }, + Service: { + CT_STORAGE: get_Id, + CT_ASSIGNED: get_S_DS_Ids, + CT_INUSE: get_S_DS_Ids + }, + DeployedService: { + CT_ASSIGNED: get_Id, + CT_INUSE: get_Id + } + } + + + def _getIds(obj): + to = type(obj) + + if to is DeployedService: + return to.id; + + if to is Service: + return (i.id for i in obj.userServices.all()) + + res = () + if to is Provider: + for i in obj.services.all(): + res += _getIds(i) + return res + return () + + OT_PROVIDER, OT_SERVICE, OT_DEPLOYED = xrange(3) + + # Dict to convert objects to owner types + # Dict for translations + __transDict = { + DeployedService : OT_DEPLOYED, + Service : OT_SERVICE, + Provider : OT_PROVIDER + } + + # Titles of types + __typeTitles = { + CT_ASSIGNED: _('Assigned'), + CT_INUSE: _('In use'), + CT_LOAD: _('Load'), + CT_STORAGE: _('Storage') + } + diff --git a/server/src/uds/core/workers/ServiceCacheUpdater.py b/server/src/uds/core/workers/ServiceCacheUpdater.py index b35394c8..22a40ce2 100644 --- a/server/src/uds/core/workers/ServiceCacheUpdater.py +++ b/server/src/uds/core/workers/ServiceCacheUpdater.py @@ -52,7 +52,8 @@ class ServiceCacheUpdater(Job): if cache is not needed. This is included as a scheduled task that will run every X seconds, and scheduler will keep it so it will be only executed by one backend at a time ''' - frecuency = GlobalConfig.CACHE_CHECK_DELAY.getInt() # Request run cache manager every configured seconds. If config value is changed, it will be used at next reload + frecuency = GlobalConfig.CACHE_CHECK_DELAY.getInt() # Request run cache manager every configured seconds (defaults to 20 seconds). + # If config value is changed, it will be used at next reload def __init__(self, environment): super(ServiceCacheUpdater,self).__init__(environment) @@ -84,6 +85,10 @@ class ServiceCacheUpdater(Job): logger.debug('Stopped cache generation for deployed service with publication running: {0}'.format(ds)) continue + if ds.isRestrained(): + logger.info('Deployed service {0} is restrained, will check this later'.format(ds.name)) + continue + # Get data related to actual state of cache inCacheL1 = ds.cachedUserServices().filter(UserServiceManager.getCacheStateFilter(services.UserDeployment.L1_CACHE)).count() inCacheL2 = ds.cachedUserServices().filter(UserServiceManager.getCacheStateFilter(services.UserDeployment.L2_CACHE)).count() @@ -174,6 +179,8 @@ class ServiceCacheUpdater(Job): except MaxServicesReachedException as e: logger.error(str(e)) # TODO: When alerts are ready, notify this + except: + logger.exception('Exception') @transaction.autocommit def growL2Cache(self, ds, cacheL1, cacheL2, assigned): diff --git a/server/src/uds/core/workers/StatsCollector.py b/server/src/uds/core/workers/StatsCollector.py new file mode 100644 index 00000000..eb0838be --- /dev/null +++ b/server/src/uds/core/workers/StatsCollector.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' + +from uds.models import DeployedService +from uds.core.util.State import State +from uds.core.util.stats import counters +from uds.core.jobs.Job import Job + +import logging + +logger = logging.getLogger(__name__) + + +class DeployedServiceStatsCollector(Job): + + frecuency = 599 # Once every ten minutes, 601 is prime + + def __init__(self, environment): + super(DeployedServiceStatsCollector,self).__init__(environment) + + def run(self): + logger.debug('Starting Deployed service stats collector') + + for ds in DeployedService.objects.filter(state = State.ACTIVE): + try: + fltr = ds.assignedUserServices().exclude(state__in=State.INFO_STATES) + assigned = fltr.count() + inUse = fltr.filter(in_use=True).count() + counters.addCounter(ds, counters.CT_ASSIGNED, assigned) + counters.addCounter(ds, counters.CT_INUSE, inUse) + except: + logger.exception('Getting counters for deployed service {0}'.format(ds)) + + + logger.debug('Done Deployed service stats collector') + + + \ No newline at end of file diff --git a/server/src/uds/locale/de/LC_MESSAGES/django.mo b/server/src/uds/locale/de/LC_MESSAGES/django.mo index 2b55f942..8defd3c5 100644 Binary files a/server/src/uds/locale/de/LC_MESSAGES/django.mo and b/server/src/uds/locale/de/LC_MESSAGES/django.mo differ diff --git a/server/src/uds/locale/de/LC_MESSAGES/django.po b/server/src/uds/locale/de/LC_MESSAGES/django.po index 22b65996..c834f9d7 100644 --- a/server/src/uds/locale/de/LC_MESSAGES/django.po +++ b/server/src/uds/locale/de/LC_MESSAGES/django.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-28 10:17+0100\n" +"POT-Creation-Date: 2013-02-12 15:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,240 +42,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/OVirt/OVirtProvider.py:91 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "Host" -msgstr "Host" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "VMWare VC Server IP or Hostname" -msgstr "VMWare VC Server IP oder Hostname" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "Use SSL" -msgstr "Verwendung SSL" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -msgid "If checked, will use a ssl connection to Active Directory" -msgstr "" -"Wenn diese Option aktiviert ist, verwendet eine Ssl-Verbindung zum Ldap " -"(Wenn Port 389 ist, wird in Tatsache Port 636)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 -msgid "Ldap User" -msgstr "LDAP-Benutzer" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -msgid "" -"Username with read privileges on the base selected (use USER@DOMAIN.DOM form " -"for this)" -msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/ActiveDirectory_enterprise/Authenticator.py:50 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 -#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 -#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 -#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 -#: services/OVirt/OVirtProvider.py:93 -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -#: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 -msgid "Password" -msgstr "Passwort" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 -msgid "Password of the ldap user" -msgstr "Kennwort für den Ldap-Benutzer" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -#: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 -msgid "Timeout" -msgstr "Timeout" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -msgid "Timeout in seconds of connection to LDAP" -msgstr "Timeout in Sekunden über LDAP-Verbindung" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:35 -msgid "Active Directory Authenticator" -msgstr "Active Directory-Authenticator" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:37 -#, fuzzy -msgid "Authenticate against Active Directory" -msgstr "Authentifikator mit Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:46 -#: auths/EDirectory_enterprise/Authenticator.py:77 -#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 -#: services/OVirt/OVirtProvider.py:92 -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 -msgid "Username" -msgstr "Benutzername" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:48 -#: auths/EDirectory_enterprise/Authenticator.py:79 -#: auths/RegexLdap/Authenticator.py:74 auths/SAML_enterprise/SAML.py:113 -#: auths/SimpleLDAP/Authenticator.py:75 -msgid "Group" -msgstr "Gruppe" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:61 -#: auths/ActiveDirectory_enterprise/Authenticator.py:395 -msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" -msgstr "Müssen den Benutzernamen in der Form Benutzername@Domäne angeben.DOM" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:127 -#: auths/EDirectory_enterprise/Authenticator.py:123 -#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 -msgid "Ldap connection error: " -msgstr "LDAP-Verbindungsfehler: " - -#: auths/ActiveDirectory_enterprise/Authenticator.py:299 -#: auths/ActiveDirectory_enterprise/Authenticator.py:345 -#: auths/EDirectory_enterprise/Authenticator.py:243 -#: auths/EDirectory_enterprise/Authenticator.py:286 -#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 -#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 -msgid "Username not found" -msgstr "Benutzername wurde nicht gefunden" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:332 -#: auths/SimpleLDAP/Authenticator.py:302 -msgid "Group not found" -msgstr "Gruppe nicht gefunden" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:364 -#: auths/ActiveDirectory_enterprise/Authenticator.py:381 -#: auths/EDirectory_enterprise/Authenticator.py:303 -#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 -#: auths/SimpleLDAP/Authenticator.py:342 -msgid "Too many results, be more specific" -msgstr "Zu viele Ergebnisse, sein mehr spezifisch" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:404 -msgid "Domain seems to be incorrect, please check it" -msgstr "Domäne scheint falsch sein, bitte überprüfen es" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:409 -msgid "Ldap does not seem an Active Directory (do not have user objects)" -msgstr "LDAP scheint nicht Active Directory (keine Benutzerobjekte)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:417 -msgid "Ldap does not seem an Active Directory (no not have group objects)" -msgstr "LDAP scheint nicht Active Directory (Nein, nicht haben Gruppenobjekte)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:425 -msgid "" -"Ldap does not seem an Active Directory (do not have any user nor groups)" -msgstr "" -"LDAP scheint nicht Active Directory (nicht haben keine Benutzer oder Gruppen)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:430 -#: auths/EDirectory_enterprise/Authenticator.py:358 -#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 -msgid "Connection params seem correct, test was succesfully executed" -msgstr "Verbindung Params scheinen korrekt, Test wurde erfolgreich ausgeführt" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "Port" -msgstr "Port" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -msgid "Ldap port (389 for non ssl, 636 for ssl normally" -msgstr "LDAP-Port (389 für nicht Ssl, 636 für Ssl normalerweise" - -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "" -"If checked, will use a ssl connection to ldap (if port is 389, will use in " -"fact port 636)" -msgstr "" -"Wenn diese Option aktiviert ist, verwendet eine Ssl-Verbindung zum Ldap " -"(Wenn Port 389 ist, wird in Tatsache Port 636)" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -#, fuzzy -msgid "Admin user" -msgstr "Admin" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -#, fuzzy -msgid "Username with read privileges on the eDirectory" -msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" - -#: auths/EDirectory_enterprise/Authenticator.py:67 -#, fuzzy -msgid "eDirectory Authenticator" -msgstr "Active Directory-Authenticator" - -#: auths/EDirectory_enterprise/Authenticator.py:69 -#, fuzzy -msgid "Authenticate against eDirectory" -msgstr "Authentifikator mit Active Directory" - -#: auths/EDirectory_enterprise/Authenticator.py:323 -#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 -msgid "Ldap search base is incorrect" -msgstr "LDAP-Suche base ist falsch" - -#: auths/EDirectory_enterprise/Authenticator.py:328 -#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 -msgid "Ldap user class seems to be incorrect (no user found by that class)" -msgstr "" -"LDAP-Benutzerklasse scheint nicht korrekt (kein Benutzer gefunden durch " -"diese Klasse)" - -#: auths/EDirectory_enterprise/Authenticator.py:336 -#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 -msgid "" -"Ldap user id attribute seems to be incorrect (no user found by that " -"attribute)" -msgstr "" -"LDAP-Benutzer-Id-Attribut scheint falsch (kein Benutzer gefunden damit -" -"Attribut)" - -#: auths/EDirectory_enterprise/Authenticator.py:344 -msgid "Expected group attribute " -msgstr "Erwartete Group-Attribut " - -#: auths/EDirectory_enterprise/Authenticator.py:353 -#, fuzzy -msgid "" -"Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" -msgstr "" -"LDAP Benutzer Klasse oder Benutzer-Id Attr ist wahrscheinlich falsch (keiner " -"Benutzer mit finden beide Bedingungen)" - #: auths/IP/Authenticator.py:45 auths/IP/Authenticator.py:47 msgid "IP Authenticator" msgstr "IP-Authenticator" @@ -288,7 +54,7 @@ msgstr "IP " msgid "IP Range" msgstr "IP-Bereich" -#: auths/IP/Authenticator.py:99 auths/InternalDB/Authenticator.py:102 +#: auths/IP/Authenticator.py:106 auths/InternalDB/Authenticator.py:102 msgid "All seems fine in the authenticator." msgstr "Alles scheint in Ordnung in der Authentifikator." @@ -304,10 +70,66 @@ msgstr "Interne Dabasase Authentifikator. Keine verwendet externe Quellen" msgid "Internal structures seems ok" msgstr "Interne Strukturen scheint in Ordnung" +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +#: services/OVirt/OVirtProvider.py:91 +msgid "Host" +msgstr "Host" + +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +msgid "VMWare VC Server IP or Hostname" +msgstr "VMWare VC Server IP oder Hostname" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Port" +msgstr "Port" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Ldap port (389 for non ssl, 636 for ssl normally" +msgstr "LDAP-Port (389 für nicht Ssl, 636 für Ssl normalerweise" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "Use SSL" +msgstr "Verwendung SSL" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "" +"If checked, will use a ssl connection to ldap (if port is 389, will use in " +"fact port 636)" +msgstr "" +"Wenn diese Option aktiviert ist, verwendet eine Ssl-Verbindung zum Ldap " +"(Wenn Port 389 ist, wird in Tatsache Port 636)" + +#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 +msgid "Ldap User" +msgstr "LDAP-Benutzer" + #: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 msgid "Username with read privileges on the base selected" msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" +#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 +#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 +#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 +#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 +#: services/OVirt/OVirtProvider.py:93 transports/NX/NXTransport.py:62 +#: transports/RDP/RDPTransport.py:38 transports/RDP/TSRDPTransport.py:42 +#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 +msgid "Password" +msgstr "Passwort" + +#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 +msgid "Password of the ldap user" +msgstr "Kennwort für den Ldap-Benutzer" + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +#: services/OVirt/OVirtProvider.py:94 +msgid "Timeout" +msgstr "Timeout" + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +msgid "Timeout in seconds of connection to LDAP" +msgstr "Timeout in Sekunden über LDAP-Verbindung" + #: auths/RegexLdap/Authenticator.py:55 auths/SimpleLDAP/Authenticator.py:55 msgid "Base" msgstr "Base" @@ -365,9 +187,44 @@ msgstr "Regex LDAP-Authenticator" msgid "Regular Expressions LDAP authenticator" msgstr "Reguläre Ausdrücke LDAP-Authentifizierungsserver" +#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 +#: services/OVirt/OVirtProvider.py:92 transports/NX/NXTransport.py:61 +#: transports/RDP/RDPTransport.py:37 transports/RDP/TSRDPTransport.py:41 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 +msgid "Username" +msgstr "Benutzername" + +#: auths/RegexLdap/Authenticator.py:74 auths/SimpleLDAP/Authenticator.py:75 +msgid "Group" +msgstr "Gruppe" + #: auths/RegexLdap/Authenticator.py:96 msgid "Invalid regular expression" +msgstr "Ungültiger regulärer Ausdruck" + +#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 +msgid "Ldap connection error: " +msgstr "LDAP-Verbindungsfehler: " + +#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 +#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 +msgid "Username not found" +msgstr "Benutzername wurde nicht gefunden" + +#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 +#: auths/SimpleLDAP/Authenticator.py:342 +msgid "Too many results, be more specific" +msgstr "Zu viele Ergebnisse, sein mehr spezifisch" + +#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 +msgid "Ldap search base is incorrect" +msgstr "LDAP-Suche base ist falsch" + +#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 +msgid "Ldap user class seems to be incorrect (no user found by that class)" msgstr "" +"LDAP-Benutzerklasse scheint nicht korrekt (kein Benutzer gefunden durch " +"diese Klasse)" #: auths/RegexLdap/Authenticator.py:342 auths/SimpleLDAP/Authenticator.py:376 msgid "Ldap group class seems to be incorrect (no group found by that class)" @@ -375,6 +232,14 @@ msgstr "" "LDAP Gruppe Klasse scheint nicht korrekt (keine Gruppe gefunden durch diese " "Klasse)" +#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 +msgid "" +"Ldap user id attribute seems to be incorrect (no user found by that " +"attribute)" +msgstr "" +"LDAP-Benutzer-Id-Attribut scheint falsch (kein Benutzer gefunden damit -" +"Attribut)" + #: auths/RegexLdap/Authenticator.py:360 auths/SimpleLDAP/Authenticator.py:392 msgid "" "Ldap group id attribute seems to be incorrect (no group found by that " @@ -391,116 +256,9 @@ msgstr "" "LDAP Benutzer Klasse oder Benutzer-Id Attr ist wahrscheinlich falsch (keiner " "Benutzer mit finden beide Bedingungen)" -#: auths/SAML_enterprise/SAML.py:79 -#, fuzzy -msgid "SAML Authenticator" -msgstr "Authentifikator" - -#: auths/SAML_enterprise/SAML.py:91 -#, fuzzy -msgid "SAML (v2.0) Authenticator" -msgstr "Authentifikator" - -#: auths/SAML_enterprise/SAML.py:110 templates/uds/internal_page.html:28 -msgid "User" -msgstr "Benutzer" - -#: auths/SAML_enterprise/SAML.py:119 -msgid "Private key" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:120 -msgid "" -"Private key used for sign and encription, as generated in base 64 from " -"openssl" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:121 -msgid "Certificate" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:122 -msgid "Server certificate (public), , as generated in base 64 from openssl" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:123 -msgid "IDP Metadata" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:124 -msgid "" -"You can enter here the URL or the IDP metadata or the metadata itself (xml)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:126 -msgid "Entity ID" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:127 -msgid "ID of the SP. If left blank, this will be autogenerated from server URL" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:129 -#, fuzzy -msgid "User name attrs" -msgstr "Benutzer Name Attr" - -#: auths/SAML_enterprise/SAML.py:130 -#, fuzzy -msgid "Fields from where to extract user name" -msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" - -#: auths/SAML_enterprise/SAML.py:132 -#, fuzzy -msgid "Group name attrs" -msgstr "Gruppe Name Attr" - -#: auths/SAML_enterprise/SAML.py:133 -#, fuzzy -msgid "Fields from where to extract the groups" -msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" - -#: auths/SAML_enterprise/SAML.py:135 -#, fuzzy -msgid "Real name attrs" -msgstr "Benutzer Name Attr" - -#: auths/SAML_enterprise/SAML.py:136 -#, fuzzy -msgid "Fields from where to extract the real name" -msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" - -#: auths/SAML_enterprise/SAML.py:159 -msgid "" -"Server certificate should be a valid PEM (PEM certificates starts with -----" -"BEGIN CERTIFICATE-----)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:164 -msgid "Invalid server certificate. " -msgstr "" - -#: auths/SAML_enterprise/SAML.py:167 -msgid "" -"Private key should be a valid PEM (PEM private keys starts with -----BEGIN " -"RSA PRIVATE KEY-----" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:196 -msgid "Can't fetch url {0}: {1}" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:207 -msgid " (obtained from URL)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:208 -msgid "XML do not seems valid for IDP Metadata " -msgstr "" - -#: auths/SAML_enterprise/SAML.py:224 -msgid "Can't access idp metadata" -msgstr "" +#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 +msgid "Connection params seem correct, test was succesfully executed" +msgstr "Verbindung Params scheinen korrekt, Test wurde erfolgreich ausgeführt" #: auths/SimpleLDAP/Authenticator.py:59 msgid "Group class" @@ -534,6 +292,10 @@ msgstr "SimpleLDAP Authenticator" msgid "Simple LDAP authenticator" msgstr "Einfache LDAP-Authentifizierungsserver" +#: auths/SimpleLDAP/Authenticator.py:302 +msgid "Group not found" +msgstr "Gruppe nicht gefunden" + #: auths/SimpleLDAP/Authenticator.py:410 msgid "" "Ldap group class or group id attr is probably wrong (can't find any group " @@ -605,15 +367,15 @@ msgstr "24 Bit" msgid "32 bits" msgstr "32 bits" -#: core/managers/UserServiceManager.py:303 +#: core/managers/UserServiceManager.py:307 msgid "Can't cancel non running operation" msgstr "Kann nicht nicht ausgeführten Vorgang abbrechen" -#: core/managers/UserServiceManager.py:322 +#: core/managers/UserServiceManager.py:326 msgid "Can't remove a non active element" msgstr "Ein nicht aktive Element kann nicht entfernt werden." -#: core/managers/UserServiceManager.py:335 +#: core/managers/UserServiceManager.py:339 msgid "Can't remove nor cancel {0} cause its states doesn't allows it" msgstr "" "Kann weder entfernen noch Abbrechen {0} Ursache ihrer Staaten nicht erlaubt " @@ -627,7 +389,7 @@ msgstr "Base OS Manager" msgid "Base Manager" msgstr "Base Manager" -#: core/transports/BaseTransport.py:113 +#: core/transports/BaseTransport.py:147 msgid "Transport empty" msgstr "Transport leer" @@ -692,6 +454,23 @@ msgstr "Fertig" msgid "Waiting execution" msgstr "Personen, die auf Ausführung" +#: core/util/stats/counters.py:197 +msgid "Assigned" +msgstr "Zugewiesen" + +#: core/util/stats/counters.py:198 +#, fuzzy +msgid "In use" +msgstr "Admin" + +#: core/util/stats/counters.py:199 +msgid "Load" +msgstr "Belastung" + +#: core/util/stats/counters.py:200 +msgid "Storage" +msgstr "Speicher" + #: osmanagers/LinuxOsManager/LinuxOsManager.py:45 msgid "Linux OS Manager" msgstr "Linux OS Manager" @@ -705,22 +484,22 @@ msgstr "" "benennt Maschine und Benachrichtigen Sie Zustand)" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "On Logout" msgstr "Beim Abmelden" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "What to do when user logout from service" msgstr "Was tun, wenn Benutzer abmelden vom Dienst" #: osmanagers/LinuxOsManager/LinuxOsManager.py:51 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 msgid "Keep service assigned" msgstr "Halten Sie Dienst zugewiesen" #: osmanagers/LinuxOsManager/LinuxOsManager.py:52 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:44 msgid "Remove service" msgstr "Basisdienst" @@ -743,8 +522,6 @@ msgstr "" #: osmanagers/WindowsOsManager/WinDomainOsManager.py:29 #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "Domain" msgstr "Domäne" @@ -805,7 +582,7 @@ msgstr "" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:29 msgid "User account to change password" -msgstr "" +msgstr "Benutzerkonto Passwort ändern" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #, fuzzy @@ -817,11 +594,11 @@ msgstr "Muss ein Kennwort für das Konto angeben!" msgid "Must provide an user account!!!" msgstr "Muss ein Kennwort für das Konto angeben!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:36 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:37 msgid "Windows Basic OS Manager" msgstr "Grundlegende Windows-OS-Manager" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:38 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:39 msgid "" "Os Manager to control windows machines without domain. (Basically renames " "machine)" @@ -829,11 +606,11 @@ msgstr "" "OS-Manager, um Windows-Rechner ohne Domäne steuern. (Im Grunde benennt " "Maschine)" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:52 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:53 msgid "Length must be numeric!!" msgstr "Länge muss numerisch sein!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:54 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:55 msgid "Length must be betwen 1 and six" msgstr "Länge muss zwischen 1 und 6" @@ -847,28 +624,25 @@ msgstr "" #: services/OVirt/OVirtLinkedService.py:56 #, fuzzy -msgid "oVirt Linked Clone" +msgid "oVirt Linked Clone (Experimental)" msgstr "VMWare Linked Clone-base" #: services/OVirt/OVirtLinkedService.py:60 -msgid "oVirt Services based on templates and COW" -msgstr "" +msgid "oVirt Services based on templates and COW (experimental)" +msgstr "oVirt-basierten Services auf Vorlagen und Kuh (experimentell)" #: services/OVirt/OVirtLinkedService.py:77 -#: services/Vmware_enterprise/VCLinkedCloneService.py:70 msgid "Number of desired machines to keep running waiting for a user" msgstr "" "Anzahl der gewünschten Maschinen warten für einen Benutzer ausgeführt wird" #: services/OVirt/OVirtLinkedService.py:83 -#: services/Vmware_enterprise/VCLinkedCloneService.py:72 msgid "Number of desired machines to keep suspended waiting for use" msgstr "" "Anzahl der gewünschten Maschinen zu ausgesetzten Personen, die für die " "Verwendung auf" #: services/OVirt/OVirtLinkedService.py:99 -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 #, fuzzy msgid "Base Machine" msgstr "Base Manager" @@ -880,11 +654,11 @@ msgstr "Grundmaschine" #: services/OVirt/OVirtLinkedService.py:100 msgid "Cluster" -msgstr "" +msgstr "Cluster" #: services/OVirt/OVirtLinkedService.py:106 msgid "Cluster to contain services" -msgstr "" +msgstr "Cluster-Dienste enthalten" #: services/OVirt/OVirtLinkedService.py:109 #, fuzzy @@ -897,13 +671,12 @@ msgid "Datastore domain where to publish and put incrementals" msgstr "Datastores wo inkrementelle Backups" #: services/OVirt/OVirtLinkedService.py:112 -#: services/Vmware_enterprise/VCLinkedCloneService.py:49 msgid "Memory (Mb)" msgstr "Speicher (Mb)" #: services/OVirt/OVirtLinkedService.py:113 msgid "Memory assigned to machines" -msgstr "" +msgstr "Speicher zugewiesen Maschinen" #: services/OVirt/OVirtLinkedService.py:115 #, fuzzy @@ -912,39 +685,34 @@ msgstr "Speicher (Mb)" #: services/OVirt/OVirtLinkedService.py:116 msgid "Physical memory guaranteed to machines" -msgstr "" +msgstr "Arbeitsspeicher garantiert Maschinen" #: services/OVirt/OVirtLinkedService.py:118 -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 msgid "Machine Names" msgstr "Computernamen" #: services/OVirt/OVirtLinkedService.py:119 -#: services/Vmware_enterprise/VCLinkedCloneService.py:54 msgid "Name Length" msgstr "Länge des Dateinamens" #: services/OVirt/OVirtLinkedService.py:120 -#: services/Vmware_enterprise/VCLinkedCloneService.py:55 msgid "Length of numeric part for the names of this machines (betwen 3 and 6" msgstr "" "Länge der numerische Teil für die Namen dieser Maschinen (zwischen 3 und 6" #: services/OVirt/OVirtLinkedService.py:122 msgid "Display" -msgstr "" +msgstr "Display" #: services/OVirt/OVirtLinkedService.py:123 msgid "Display type (only for administration pourposses)" -msgstr "" +msgstr "Displaytyp (nur für Verwaltung Pourposses)" #: services/OVirt/OVirtLinkedService.py:143 -#: services/Vmware_enterprise/VCLinkedCloneService.py:93 msgid "The length of basename plus length must not be greater than 15" msgstr "Die Länge der Basename plus Länge darf nicht größer als 15 sein." #: services/OVirt/OVirtLinkedService.py:145 -#: services/Vmware_enterprise/VCLinkedCloneService.py:95 msgid "The machine name can't be only numbers" msgstr "Der Computername kann nicht nur Zahlen sein." @@ -974,26 +742,22 @@ msgid "Password of the user of oVirt" msgstr "Kennwort des Benutzers des VC" #: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 msgid "Timeout in seconds of connection to VC" msgstr "Timeout in Sekunden der Verbindung zum VC" #: services/OVirt/OVirtProvider.py:95 -#: services/Vmware_enterprise/ServiceProviderVC.py:33 msgid "Macs range" msgstr "Mac-Bereich" #: services/OVirt/OVirtProvider.py:96 -#: services/Vmware_enterprise/ServiceProviderVC.py:34 msgid "Range of valids macs for created machines" msgstr "Bereich von gilt Macs für erstellte Maschinen" -#: services/OVirt/OVirtProvider.py:395 +#: services/OVirt/OVirtProvider.py:398 msgid "Connection test successful" -msgstr "" +msgstr "Verbindungstest erfolgreich" -#: services/OVirt/OVirtProvider.py:396 -#: services/Vmware_enterprise/ServiceProviderVC.py:120 +#: services/OVirt/OVirtProvider.py:399 msgid "Connection failed. Check connection params" msgstr "Verbindung ist fehlgeschlagen. Kontrollkästchen Verbindung params" @@ -1032,135 +796,6 @@ msgstr "Nichts getestet, aber alles ging gut..." msgid "Random integer was 9!!! :-)" msgstr "Zufällige ganze war 9!!! :-)" -#: services/Vmware_enterprise/Helpers.py:72 -msgid "Local" -msgstr "Lokale" - -#: services/Vmware_enterprise/Helpers.py:74 -msgid "Remote" -msgstr "Entfernte" - -#: services/Vmware_enterprise/PublicationVC.py:37 -msgid "Publication" -msgstr "Veröffentlichung" - -#: services/Vmware_enterprise/PublicationVC.py:38 -#, fuzzy -msgid "UDS Publication for {0} created at {1}" -msgstr "UDS-Veröffentlichung erstellt am {1} {0}" - -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "VMWare VC Server Port (usually 443)" -msgstr "VMWare VC Server Port (in der Regel 443)" - -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -#, fuzzy -msgid "User with valid privileges on VC" -msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" - -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -#, fuzzy -msgid "Password of the user of the VC" -msgstr "Kennwort des Benutzers des VC" - -#: services/Vmware_enterprise/ServiceProviderVC.py:39 -#, fuzzy -msgid "VMWare Virtual Center Provider" -msgstr "VmwareVC Provider: " - -#: services/Vmware_enterprise/ServiceProviderVC.py:41 -msgid "Provides connection to Virtual Center Services" -msgstr "Stellt Verbindung zu Virtual Center Services" - -#: services/Vmware_enterprise/ServiceProviderVC.py:110 -msgid "Error testing connection" -msgstr "Fehler testen Verbindung" - -#: services/Vmware_enterprise/ServiceProviderVC.py:113 -msgid "VmwareVC Provider: " -msgstr "VmwareVC Provider: " - -#: services/Vmware_enterprise/ServiceProviderVC.py:119 -msgid "Connection params ok" -msgstr "Verbindung Params ok" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:28 -msgid "Datacenter" -msgstr "Datacenter" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:34 -msgid "Datacenter containing base machine" -msgstr "Datacenter mit Basismaschine" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:36 -msgid "Network" -msgstr "Netzwerk" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:37 -msgid "" -"If more than 1 interface is found in machine, use one on this network as main" -msgstr "" -"Wenn mehr als 1 Schnittstelle in Maschine gefunden wird, verwenden Sie eine " -"in diesem Netzwerk als wichtigsten" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Pub. Resource Pool" -msgstr "Kneipe. Ressourcenpool" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Resource Pool where deploy clones" -msgstr "Ressourcen-Pool in der Klone bereitgestellt" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Clones Folder" -msgstr "Klone Ordner" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Folder where deploy clones" -msgstr "Ordner wo bereitstellen Klone" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:40 -msgid "Resource Pool" -msgstr "Ressourcenpool" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:46 -msgid "Resource Pool containing base machine" -msgstr "Ressource Pool mit Basismaschine" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 -msgid "Base machine for this service" -msgstr "Grundmaschine für diesen Dienst" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:50 -msgid "Memory for machines deployed from this service" -msgstr "Speicher für Maschinen, die von diesem Dienst bereitgestellt" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:51 -#, fuzzy -msgid "Datastores" -msgstr "Datastores" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:52 -#, fuzzy -msgid "Datastores where to put incrementals" -msgstr "Datastores wo inkrementelle Backups" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 -msgid "Base name for clones from this machine" -msgstr "Basisname für Clones von diesem Computer" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:62 -#, fuzzy -msgid "VMWare Linked clone base" -msgstr "VMWare Linked Clone-base" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:64 -msgid "" -"This service provides access to Linked Clones machines on a Virtual Center" -msgstr "" -"Dieser Service ermöglicht den Zugriff auf verknüpfte Clones Maschinen auf " -"einen Virtual Center" - #: templates/404.html:4 templates/404.html.py:7 msgid "Page not found" msgstr "Seite nicht gefunden" @@ -1176,11 +811,11 @@ msgstr "UDS" #: templates/uds/detectJava.html:6 msgid "Login redirection" -msgstr "" +msgstr "Anmeldung-Umleitung" #: templates/uds/detectJava.html:38 msgid "Go to main page" -msgstr "" +msgstr "Gehen Sie zur Hauptseite" #: templates/uds/downloads.html:8 templates/uds/snippets/admin_user.html:7 msgid "Downloads" @@ -1232,6 +867,10 @@ msgstr "Netzwerke" msgid "Transports" msgstr "Transporte" +#: templates/uds/internal_page.html:28 +msgid "User" +msgstr "Benutzer" + #: templates/uds/internal_page.html:34 templates/uds/prefs.html:12 msgid "Preferences" msgstr "Einstellungen" @@ -1295,38 +934,26 @@ msgid "NX Transport for direct connection" msgstr "NX-Transport für den direkten Anschluss" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Leere creds" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Wenn diese Option aktiviert, werden die Anmeldeinformationen zum Herstellen " "einer leer sein." #: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/RDP/TSRDPTransport.py:41 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Wenn nicht leer ist, dieser Benutzername wird immer als verwendet " "Anmeldeinformationen" #: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/RDP/TSRDPTransport.py:42 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "" "Wenn nicht leer ist, dieses Kennwort immer verwendet werden als " @@ -1380,7 +1007,7 @@ msgstr "NX-Protokoll" msgid "UDS Actor connector for NX (requires nomachine packages)" msgstr "UDS Schauspieler Connector für NX (erfordert Nomachine Pakete)" -#: transports/NX/web.py:74 +#: transports/NX/web.py:75 msgid "" "In order to use this transport, you need to install first Nomachine Nx " "Client version 3.5.x" @@ -1388,11 +1015,11 @@ msgstr "" "Um diesen Transport verwenden, müssen Sie installieren ersten Nomachine Nx " "Client Version 3.5.x" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "you can obtain it for your platform from" msgstr "Sie können es für Ihre Plattform von abrufen" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "nochamine web site" msgstr "Nochamine-Website" @@ -1405,8 +1032,6 @@ msgid "RDP Transport for direct connection" msgstr "RDP-Transport für den direkten Anschluss" #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "" "If not empty, this domain will be always used as credential (used as DOMAIN" "\\user)" @@ -1462,15 +1087,11 @@ msgstr "RDP-Verkehr (Tunneling)" msgid "RDP Transport for tunneled connection" msgstr "RDP-Verkehr für getunnelte Verbindung" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "Tunnel server" msgstr "Tunnel-server" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "" "IP or Hostname of tunnel server send to client device (\"public\" ip) and " "port. (use HOST:PORT format)" @@ -1478,15 +1099,11 @@ msgstr "" "IP-Adresse oder Hostname des Tunnel-Server senden an Client-Gerät " "(\"öffentliche\" IP-Adresse) und Port. (verwenden Sie HOST: PORT-Format)" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "Tunnel host check" msgstr "Tunnel Host-Prüfung" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "" "If not empty, this server will be used to check if service is running before " "assigning it to user. (use HOST:PORT format)" @@ -1499,144 +1116,18 @@ msgstr "" msgid "Remote Desktop Protocol" msgstr "Remote Desktop-Protokoll" -#: transports/RDP/web.py:83 +#: transports/RDP/web.py:84 msgid "In order to use this service, you should first install CoRD." msgstr "Um diesen Dienst zu nutzen, sollten Sie zunächst Kabel installieren." -#: transports/RDP/web.py:84 transports/RGS-enterprise/web.py:82 +#: transports/RDP/web.py:85 msgid "You can obtain it from" msgstr "Erhalten Sie es aus" -#: transports/RDP/web.py:84 +#: transports/RDP/web.py:85 msgid "CoRD Website" msgstr "CoRD-Website" -#: transports/RGS-enterprise/RGSTransport.py:34 -#, fuzzy -msgid "RGS Transport (direct)" -msgstr "RDP Transport (direkt)" - -#: transports/RGS-enterprise/RGSTransport.py:36 -#, fuzzy -msgid "RGS Transport for direct connection" -msgstr "RDP-Transport für den direkten Anschluss" - -#: transports/RGS-enterprise/RGSTransport.py:45 -#: transports/RGS-enterprise/TRGSTransport.py:50 -msgid "Image quality" -msgstr "Bildqualität" - -#: transports/RGS-enterprise/RGSTransport.py:46 -#: transports/RGS-enterprise/TRGSTransport.py:51 -msgid "Quality of image codec (0-100)" -msgstr "Qualität der Image-Codec (0-100)" - -#: transports/RGS-enterprise/RGSTransport.py:47 -#: transports/RGS-enterprise/TRGSTransport.py:52 -msgid "Adjustable Quality" -msgstr "Einstellbare Qualität" - -#: transports/RGS-enterprise/RGSTransport.py:48 -#: transports/RGS-enterprise/TRGSTransport.py:53 -msgid "If checked, the image quality will be adjustable with bandwidth" -msgstr "" -"Wenn diese Option aktiviert, wird die Bildqualität mit Bandbreite " -"einstellbar sein" - -#: transports/RGS-enterprise/RGSTransport.py:49 -#: transports/RGS-enterprise/TRGSTransport.py:54 -msgid "Min. Adjustable Quality" -msgstr "Min. einstellbare Qualität" - -#: transports/RGS-enterprise/RGSTransport.py:50 -#: transports/RGS-enterprise/TRGSTransport.py:55 -msgid "" -"The lowest image quality applied to images to maintain the minimum update " -"rate." -msgstr "" -"Die niedrigsten Bildqualität auf Bilder beibehalten das minimale Update " -"angewendet Preise." - -#: transports/RGS-enterprise/RGSTransport.py:51 -#: transports/RGS-enterprise/TRGSTransport.py:56 -msgid "Adjustable Frame Rate" -msgstr "Einstellbare Framerate" - -#: transports/RGS-enterprise/RGSTransport.py:52 -#: transports/RGS-enterprise/TRGSTransport.py:57 -msgid "Update rate threshold to begin adjusting image quality" -msgstr "Update-Rate Schwellenwert beginnen, Anpassen der Bildqualität" - -#: transports/RGS-enterprise/RGSTransport.py:53 -#: transports/RGS-enterprise/TRGSTransport.py:58 -msgid "Match Local Resolution" -msgstr "Spiel Ortsauflösung" - -#: transports/RGS-enterprise/RGSTransport.py:54 -#: transports/RGS-enterprise/TRGSTransport.py:59 -msgid "" -"Change the Sender's resolution to match the Receiver's resolution when " -"connecting" -msgstr "" -"Ändern des Absenders Auflösung Auflösung des Empfängers übereinstimmen wenn " -"verbinden" - -#: transports/RGS-enterprise/RGSTransport.py:55 -#: transports/RGS-enterprise/TRGSTransport.py:60 -msgid "Redirect USB" -msgstr "Umleitung USB" - -#: transports/RGS-enterprise/RGSTransport.py:56 -#: transports/RGS-enterprise/TRGSTransport.py:61 -msgid "If checked, the USB will be redirected." -msgstr "Wenn diese Option aktiviert, wird die USB umgeleitet werden." - -#: transports/RGS-enterprise/RGSTransport.py:57 -#: transports/RGS-enterprise/TRGSTransport.py:62 -msgid "Redirect Audio" -msgstr "Audio umleiten" - -#: transports/RGS-enterprise/RGSTransport.py:58 -#: transports/RGS-enterprise/TRGSTransport.py:63 -#, fuzzy -msgid "If checked, the Audio will be redirected." -msgstr "" -"Wenn diese Option aktiviert, werden die Anmeldeinformationen zum Herstellen " -"einer leer sein." - -#: transports/RGS-enterprise/RGSTransport.py:59 -#: transports/RGS-enterprise/TRGSTransport.py:64 -msgid "Redirect Mic" -msgstr "Umleitung Mic" - -#: transports/RGS-enterprise/RGSTransport.py:60 -#: transports/RGS-enterprise/TRGSTransport.py:65 -#, fuzzy -msgid "If checked, the Mic will be redirected." -msgstr "" -"Wenn diese Option aktiviert, werden die Anmeldeinformationen zum Herstellen " -"einer leer sein." - -#: transports/RGS-enterprise/TRGSTransport.py:36 -#, fuzzy -msgid "RGS Transport (tunneled)" -msgstr "RDP-Verkehr (Tunneling)" - -#: transports/RGS-enterprise/TRGSTransport.py:38 -#, fuzzy -msgid "RGS Transport for tunneled connection" -msgstr "RDP-Verkehr für getunnelte Verbindung" - -#: transports/RGS-enterprise/web.py:81 -#, fuzzy -msgid "In order to use this service, you should first install RGS Receiver." -msgstr "Um diesen Dienst zu nutzen, sollten Sie zunächst Kabel installieren." - -#: transports/RGS-enterprise/web.py:82 -#, fuzzy -msgid "HP Website" -msgstr "CoRD-Website" - #: transports/TSNX/TSNXTransport.py:55 msgid "NX Transport (tunneled)" msgstr "NX-Transport (Tunneling)" @@ -1657,7 +1148,8 @@ msgstr "Verkehr nicht gefunden" msgid "Service not found" msgstr "-Dienst nicht gefunden" -#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:171 +#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:183 +#: xmlrpc/auths/AdminAuth.py:189 msgid "Access denied" msgstr "Zugriff verweigert" @@ -1686,11 +1178,11 @@ msgstr "Benutzer-Dienst nicht gefunden" msgid "Authenticator not found" msgstr "Authentifikator" -#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:169 +#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:174 msgid "Invalid authenticator" msgstr "Ungültige Echtheitsbestätigung" -#: web/views.py:334 +#: web/views.py:359 #, fuzzy msgid "Authenticator do not provides information" msgstr "Authentifikator ist nicht vorhanden" @@ -1699,15 +1191,15 @@ msgstr "Authentifikator ist nicht vorhanden" msgid "Authenticator" msgstr "Authentifikator" -#: xmlrpc/auths/AdminAuth.py:113 +#: xmlrpc/auths/AdminAuth.py:116 msgid "Credentials no longer valid" msgstr "Anmeldeinformationen nicht mehr gültig" -#: xmlrpc/auths/AdminAuth.py:149 +#: xmlrpc/auths/AdminAuth.py:152 msgid "Administration" msgstr "Verwaltung" -#: xmlrpc/auths/AdminAuth.py:164 +#: xmlrpc/auths/AdminAuth.py:169 msgid "Invalid credentials" msgstr "Ungültiger Anmeldeinformationen" @@ -1715,7 +1207,7 @@ msgstr "Ungültiger Anmeldeinformationen" msgid "Authenticator does not exists" msgstr "Authentifikator ist nicht vorhanden" -#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:115 +#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:116 #: xmlrpc/services/ServiceProviders.py:115 #: xmlrpc/services/ServiceProviders.py:139 xmlrpc/services/Services.py:160 #: xmlrpc/services/Services.py:184 xmlrpc/transports/Networks.py:86 @@ -1737,15 +1229,20 @@ msgstr "" msgid "BUG: Reached a point that should never have been reached!!!" msgstr "BUG: Erreicht einen Punkt, der nie zustande gekommen sind, sollten!!!" -#: xmlrpc/osmanagers/OSManagers.py:129 +#: xmlrpc/log/logs.py:53 xmlrpc/stats/stats.py:70 +#, fuzzy +msgid "Service does not exists" +msgstr "Bereitgestellten Diensts ist nicht vorhanden" + +#: xmlrpc/osmanagers/OSManagers.py:130 msgid "This os mnager is being used by deployed services" msgstr "Diese os Mnager ist von bereitgestellten Dienste verwendet wird" -#: xmlrpc/osmanagers/OSManagers.py:145 +#: xmlrpc/osmanagers/OSManagers.py:146 msgid "There is deployed services using this os manager" msgstr "Es gibt bereitgestellten Dienste mit dieser os-manager" -#: xmlrpc/osmanagers/OSManagers.py:147 +#: xmlrpc/osmanagers/OSManagers.py:148 msgid "Can't find os manager" msgstr "Nicht os Manager gefunden" @@ -1803,30 +1300,30 @@ msgstr "" msgid "Can't locate the service" msgstr "Der Dienst kann nicht gesucht werden." -#: xmlrpc/services/UserDeployedServices.py:94 -#: xmlrpc/services/UserDeployedServices.py:110 +#: xmlrpc/services/UserDeployedServices.py:100 +#: xmlrpc/services/UserDeployedServices.py:116 msgid "The deployed service is not active" msgstr "Der bereitgestellte Dienst ist nicht aktiv" -#: xmlrpc/services/UserDeployedServices.py:97 -#: xmlrpc/services/UserDeployedServices.py:113 +#: xmlrpc/services/UserDeployedServices.py:103 +#: xmlrpc/services/UserDeployedServices.py:119 msgid "This service don't allows assignations" msgstr "Dieser Dienst nicht ermöglicht Forderungsabtretungen" -#: xmlrpc/services/UserDeployedServices.py:102 -#: xmlrpc/services/UserDeployedServices.py:120 +#: xmlrpc/services/UserDeployedServices.py:108 +#: xmlrpc/services/UserDeployedServices.py:126 msgid "Deployed service not found!!! (refresh interface)" msgstr "Bereitgestellte Dienst nicht gefunden!!! (Aktualisieren Schnittstelle)" -#: xmlrpc/services/UserDeployedServices.py:122 +#: xmlrpc/services/UserDeployedServices.py:128 msgid "User not found!!! (refresh interface)" msgstr "Benutzer nicht gefunden!!! (Aktualisieren Schnittstelle)" -#: xmlrpc/services/UserDeployedServices.py:141 +#: xmlrpc/services/UserDeployedServices.py:147 msgid "No error" msgstr "Unbekannter Fehler" -#: xmlrpc/services/UserDeployedServices.py:147 +#: xmlrpc/services/UserDeployedServices.py:153 msgid "User deployed service not found!!!" msgstr "Benutzer-Dienst nicht gefunden" @@ -1838,6 +1335,287 @@ msgstr "Den Transport kann nicht gefunden werden." msgid "Can't locate the network" msgstr "Das Netzwerk kann nicht gefunden werden." +#~ msgid "If checked, will use a ssl connection to Active Directory" +#~ msgstr "" +#~ "Wenn diese Option aktiviert ist, verwendet eine Ssl-Verbindung zum Ldap " +#~ "(Wenn Port 389 ist, wird in Tatsache Port 636)" + +#~ msgid "" +#~ "Username with read privileges on the base selected (use USER@DOMAIN.DOM " +#~ "form for this)" +#~ msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" + +#~ msgid "Active Directory Authenticator" +#~ msgstr "Active Directory-Authenticator" + +#, fuzzy +#~ msgid "Authenticate against Active Directory" +#~ msgstr "Authentifikator mit Active Directory" + +#~ msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" +#~ msgstr "" +#~ "Müssen den Benutzernamen in der Form Benutzername@Domäne angeben.DOM" + +#~ msgid "Domain seems to be incorrect, please check it" +#~ msgstr "Domäne scheint falsch sein, bitte überprüfen es" + +#~ msgid "Ldap does not seem an Active Directory (do not have user objects)" +#~ msgstr "LDAP scheint nicht Active Directory (keine Benutzerobjekte)" + +#~ msgid "Ldap does not seem an Active Directory (no not have group objects)" +#~ msgstr "" +#~ "LDAP scheint nicht Active Directory (Nein, nicht haben Gruppenobjekte)" + +#~ msgid "" +#~ "Ldap does not seem an Active Directory (do not have any user nor groups)" +#~ msgstr "" +#~ "LDAP scheint nicht Active Directory (nicht haben keine Benutzer oder " +#~ "Gruppen)" + +#, fuzzy +#~ msgid "Username with read privileges on the eDirectory" +#~ msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" + +#, fuzzy +#~ msgid "eDirectory Authenticator" +#~ msgstr "Active Directory-Authenticator" + +#, fuzzy +#~ msgid "Authenticate against eDirectory" +#~ msgstr "Authentifikator mit Active Directory" + +#~ msgid "Expected group attribute " +#~ msgstr "Erwartete Group-Attribut " + +#, fuzzy +#~ msgid "" +#~ "Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" +#~ msgstr "" +#~ "LDAP Benutzer Klasse oder Benutzer-Id Attr ist wahrscheinlich falsch " +#~ "(keiner Benutzer mit finden beide Bedingungen)" + +#, fuzzy +#~ msgid "SAML Authenticator" +#~ msgstr "Authentifikator" + +#, fuzzy +#~ msgid "SAML (v2.0) Authenticator" +#~ msgstr "Authentifikator" + +#, fuzzy +#~ msgid "User name attrs" +#~ msgstr "Benutzer Name Attr" + +#, fuzzy +#~ msgid "Fields from where to extract user name" +#~ msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" + +#, fuzzy +#~ msgid "Group name attrs" +#~ msgstr "Gruppe Name Attr" + +#, fuzzy +#~ msgid "Fields from where to extract the groups" +#~ msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" + +#, fuzzy +#~ msgid "Real name attrs" +#~ msgstr "Benutzer Name Attr" + +#, fuzzy +#~ msgid "Fields from where to extract the real name" +#~ msgstr "Reguläre Ausdruck, der den Namen den Gruppe zu extrahieren" + +#~ msgid "Local" +#~ msgstr "Lokale" + +#~ msgid "Remote" +#~ msgstr "Entfernte" + +#~ msgid "Publication" +#~ msgstr "Veröffentlichung" + +#, fuzzy +#~ msgid "UDS Publication for {0} created at {1}" +#~ msgstr "UDS-Veröffentlichung erstellt am {1} {0}" + +#~ msgid "VMWare VC Server Port (usually 443)" +#~ msgstr "VMWare VC Server Port (in der Regel 443)" + +#, fuzzy +#~ msgid "User with valid privileges on VC" +#~ msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" + +#, fuzzy +#~ msgid "Password of the user of the VC" +#~ msgstr "Kennwort des Benutzers des VC" + +#, fuzzy +#~ msgid "VMWare Virtual Center Provider" +#~ msgstr "VmwareVC Provider: " + +#~ msgid "Provides connection to Virtual Center Services" +#~ msgstr "Stellt Verbindung zu Virtual Center Services" + +#~ msgid "Error testing connection" +#~ msgstr "Fehler testen Verbindung" + +#~ msgid "VmwareVC Provider: " +#~ msgstr "VmwareVC Provider: " + +#~ msgid "Connection params ok" +#~ msgstr "Verbindung Params ok" + +#~ msgid "Datacenter" +#~ msgstr "Datacenter" + +#~ msgid "Datacenter containing base machine" +#~ msgstr "Datacenter mit Basismaschine" + +#~ msgid "Network" +#~ msgstr "Netzwerk" + +#~ msgid "" +#~ "If more than 1 interface is found in machine, use one on this network as " +#~ "main" +#~ msgstr "" +#~ "Wenn mehr als 1 Schnittstelle in Maschine gefunden wird, verwenden Sie " +#~ "eine in diesem Netzwerk als wichtigsten" + +#~ msgid "Pub. Resource Pool" +#~ msgstr "Kneipe. Ressourcenpool" + +#~ msgid "Resource Pool where deploy clones" +#~ msgstr "Ressourcen-Pool in der Klone bereitgestellt" + +#~ msgid "Clones Folder" +#~ msgstr "Klone Ordner" + +#~ msgid "Folder where deploy clones" +#~ msgstr "Ordner wo bereitstellen Klone" + +#~ msgid "Resource Pool" +#~ msgstr "Ressourcenpool" + +#~ msgid "Resource Pool containing base machine" +#~ msgstr "Ressource Pool mit Basismaschine" + +#~ msgid "Base machine for this service" +#~ msgstr "Grundmaschine für diesen Dienst" + +#~ msgid "Memory for machines deployed from this service" +#~ msgstr "Speicher für Maschinen, die von diesem Dienst bereitgestellt" + +#, fuzzy +#~ msgid "Datastores" +#~ msgstr "Datastores" + +#, fuzzy +#~ msgid "Datastores where to put incrementals" +#~ msgstr "Datastores wo inkrementelle Backups" + +#~ msgid "Base name for clones from this machine" +#~ msgstr "Basisname für Clones von diesem Computer" + +#, fuzzy +#~ msgid "VMWare Linked clone base" +#~ msgstr "VMWare Linked Clone-base" + +#~ msgid "" +#~ "This service provides access to Linked Clones machines on a Virtual Center" +#~ msgstr "" +#~ "Dieser Service ermöglicht den Zugriff auf verknüpfte Clones Maschinen auf " +#~ "einen Virtual Center" + +#, fuzzy +#~ msgid "RGS Transport (direct)" +#~ msgstr "RDP Transport (direkt)" + +#, fuzzy +#~ msgid "RGS Transport for direct connection" +#~ msgstr "RDP-Transport für den direkten Anschluss" + +#~ msgid "Image quality" +#~ msgstr "Bildqualität" + +#~ msgid "Quality of image codec (0-100)" +#~ msgstr "Qualität der Image-Codec (0-100)" + +#~ msgid "Adjustable Quality" +#~ msgstr "Einstellbare Qualität" + +#~ msgid "If checked, the image quality will be adjustable with bandwidth" +#~ msgstr "" +#~ "Wenn diese Option aktiviert, wird die Bildqualität mit Bandbreite " +#~ "einstellbar sein" + +#~ msgid "Min. Adjustable Quality" +#~ msgstr "Min. einstellbare Qualität" + +#~ msgid "" +#~ "The lowest image quality applied to images to maintain the minimum update " +#~ "rate." +#~ msgstr "" +#~ "Die niedrigsten Bildqualität auf Bilder beibehalten das minimale Update " +#~ "angewendet Preise." + +#~ msgid "Adjustable Frame Rate" +#~ msgstr "Einstellbare Framerate" + +#~ msgid "Update rate threshold to begin adjusting image quality" +#~ msgstr "Update-Rate Schwellenwert beginnen, Anpassen der Bildqualität" + +#~ msgid "Match Local Resolution" +#~ msgstr "Spiel Ortsauflösung" + +#~ msgid "" +#~ "Change the Sender's resolution to match the Receiver's resolution when " +#~ "connecting" +#~ msgstr "" +#~ "Ändern des Absenders Auflösung Auflösung des Empfängers übereinstimmen " +#~ "wenn verbinden" + +#~ msgid "Redirect USB" +#~ msgstr "Umleitung USB" + +#~ msgid "If checked, the USB will be redirected." +#~ msgstr "Wenn diese Option aktiviert, wird die USB umgeleitet werden." + +#~ msgid "Redirect Audio" +#~ msgstr "Audio umleiten" + +#, fuzzy +#~ msgid "If checked, the Audio will be redirected." +#~ msgstr "" +#~ "Wenn diese Option aktiviert, werden die Anmeldeinformationen zum " +#~ "Herstellen einer leer sein." + +#~ msgid "Redirect Mic" +#~ msgstr "Umleitung Mic" + +#, fuzzy +#~ msgid "If checked, the Mic will be redirected." +#~ msgstr "" +#~ "Wenn diese Option aktiviert, werden die Anmeldeinformationen zum " +#~ "Herstellen einer leer sein." + +#, fuzzy +#~ msgid "RGS Transport (tunneled)" +#~ msgstr "RDP-Verkehr (Tunneling)" + +#, fuzzy +#~ msgid "RGS Transport for tunneled connection" +#~ msgstr "RDP-Verkehr für getunnelte Verbindung" + +#, fuzzy +#~ msgid "In order to use this service, you should first install RGS Receiver." +#~ msgstr "" +#~ "Um diesen Dienst zu nutzen, sollten Sie zunächst Kabel installieren." + +#, fuzzy +#~ msgid "HP Website" +#~ msgstr "CoRD-Website" + #~ msgid "None OS Manager" #~ msgstr "Keine OS Manager" diff --git a/server/src/uds/locale/es/LC_MESSAGES/django.mo b/server/src/uds/locale/es/LC_MESSAGES/django.mo index c22d800d..f0162f3c 100644 Binary files a/server/src/uds/locale/es/LC_MESSAGES/django.mo and b/server/src/uds/locale/es/LC_MESSAGES/django.mo differ diff --git a/server/src/uds/locale/es/LC_MESSAGES/django.po b/server/src/uds/locale/es/LC_MESSAGES/django.po index 50f46bfb..68d607c3 100644 --- a/server/src/uds/locale/es/LC_MESSAGES/django.po +++ b/server/src/uds/locale/es/LC_MESSAGES/django.po @@ -31,7 +31,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-28 10:17+0100\n" +"POT-Creation-Date: 2013-02-12 15:59+0100\n" "PO-Revision-Date: 2012-11-28 10:28+0100\n" "Last-Translator: \n" "Language-Team: Spanish \n" @@ -42,241 +42,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Lokalize 1.4\n" -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/OVirt/OVirtProvider.py:91 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "Host" -msgstr "Servidor " - -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "VMWare VC Server IP or Hostname" -msgstr "IP o nombre DNS del servidor VMWare VC" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "Use SSL" -msgstr "Usar SSL" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -msgid "If checked, will use a ssl connection to Active Directory" -msgstr "Si está activada, utilizará una conexión ssl con Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 -msgid "Ldap User" -msgstr "Usuario LDAP" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -msgid "" -"Username with read privileges on the base selected (use USER@DOMAIN.DOM form " -"for this)" -msgstr "" -"Usuario con derechos de lectura en la base seleccionada (utilice la forma " -"USUARIO@DOMINIO.DOM para este elemento)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/ActiveDirectory_enterprise/Authenticator.py:50 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 -#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 -#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 -#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 -#: services/OVirt/OVirtProvider.py:93 -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -#: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 -msgid "Password" -msgstr "Contraseña" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 -msgid "Password of the ldap user" -msgstr "Contraseña del usuario del ldap" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -#: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 -msgid "Timeout" -msgstr "Espera " - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -msgid "Timeout in seconds of connection to LDAP" -msgstr "Tiempo de espera en segundos" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:35 -msgid "Active Directory Authenticator" -msgstr "Autenticador Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:37 -msgid "Authenticate against Active Directory" -msgstr "Autenticador contra Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:46 -#: auths/EDirectory_enterprise/Authenticator.py:77 -#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 -#: services/OVirt/OVirtProvider.py:92 -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 -msgid "Username" -msgstr "Usuario" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:48 -#: auths/EDirectory_enterprise/Authenticator.py:79 -#: auths/RegexLdap/Authenticator.py:74 auths/SAML_enterprise/SAML.py:113 -#: auths/SimpleLDAP/Authenticator.py:75 -msgid "Group" -msgstr "Grupo" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:61 -#: auths/ActiveDirectory_enterprise/Authenticator.py:395 -msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" -msgstr "" -"Debe especificar el nombre de usuario en la forma NOMBREUSUARIO@DOMINIO.DOM" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:127 -#: auths/EDirectory_enterprise/Authenticator.py:123 -#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 -msgid "Ldap connection error: " -msgstr "Error de conexión al ldap: " - -#: auths/ActiveDirectory_enterprise/Authenticator.py:299 -#: auths/ActiveDirectory_enterprise/Authenticator.py:345 -#: auths/EDirectory_enterprise/Authenticator.py:243 -#: auths/EDirectory_enterprise/Authenticator.py:286 -#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 -#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 -msgid "Username not found" -msgstr "Nombre de usuario no hallado" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:332 -#: auths/SimpleLDAP/Authenticator.py:302 -msgid "Group not found" -msgstr "Grupo no hallado" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:364 -#: auths/ActiveDirectory_enterprise/Authenticator.py:381 -#: auths/EDirectory_enterprise/Authenticator.py:303 -#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 -#: auths/SimpleLDAP/Authenticator.py:342 -msgid "Too many results, be more specific" -msgstr "Demasiados resultados, sea más específico" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:404 -msgid "Domain seems to be incorrect, please check it" -msgstr "El dominio parece ser incorrecto, por favor, compruebelo" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:409 -msgid "Ldap does not seem an Active Directory (do not have user objects)" -msgstr "" -"El ldap indicado no parece un Active Directory (no tiene objetos de usuario)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:417 -msgid "Ldap does not seem an Active Directory (no not have group objects)" -msgstr "" -"El ldap indicado no parece un Active Directory (no no tienen objetos de " -"grupo)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:425 -msgid "" -"Ldap does not seem an Active Directory (do not have any user nor groups)" -msgstr "" -"El ldap indicado no parece un Active Directory (no tiene ningún usuario ni " -"grupo)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:430 -#: auths/EDirectory_enterprise/Authenticator.py:358 -#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 -msgid "Connection params seem correct, test was succesfully executed" -msgstr "" -"Los parámetros de conexión parecen correctos, la prueba fue ejecutado con " -"exito" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "Port" -msgstr "Puerto" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -msgid "Ldap port (389 for non ssl, 636 for ssl normally" -msgstr "Puerto LDAP (389 para no SSL, 636 para ssl normalmente)" - -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "" -"If checked, will use a ssl connection to ldap (if port is 389, will use in " -"fact port 636)" -msgstr "" -"Si está activada, utilizará una conexión ssl con ldap (si el puerto es 389, " -"utilizará de hecho el Puerto 636)" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -msgid "Admin user" -msgstr "Usuario Administrador" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -msgid "Username with read privileges on the eDirectory" -msgstr "Usuario con privilegios de lectura sobre eDirectory" - -#: auths/EDirectory_enterprise/Authenticator.py:67 -msgid "eDirectory Authenticator" -msgstr "Autenticador eDirectory" - -#: auths/EDirectory_enterprise/Authenticator.py:69 -msgid "Authenticate against eDirectory" -msgstr "Autenticador contra eDirectory" - -#: auths/EDirectory_enterprise/Authenticator.py:323 -#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 -msgid "Ldap search base is incorrect" -msgstr "La base de búsqueda ldap es incorrecta" - -#: auths/EDirectory_enterprise/Authenticator.py:328 -#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 -msgid "Ldap user class seems to be incorrect (no user found by that class)" -msgstr "" -"La clase de usuario de LDAP parece ser incorrecta (ningún usuario encontrado " -"por esa clase)" - -#: auths/EDirectory_enterprise/Authenticator.py:336 -#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 -msgid "" -"Ldap user id attribute seems to be incorrect (no user found by that " -"attribute)" -msgstr "" -"El atributo de id de usuario de ldap parece ser incorrecto (ningún usuario " -"encontrado por atributo)" - -#: auths/EDirectory_enterprise/Authenticator.py:344 -msgid "Expected group attribute " -msgstr "Atributo de grupo esperado " - -#: auths/EDirectory_enterprise/Authenticator.py:353 -msgid "" -"Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" -msgstr "" -"El atributo del id de usuario o la clase de usuario LDAP son probablemente " -"incorrectos(¿el LDAP indicado es realmente un eDirectory?)" - #: auths/IP/Authenticator.py:45 auths/IP/Authenticator.py:47 msgid "IP Authenticator" msgstr "Autenticador por IP" @@ -289,7 +54,7 @@ msgstr "IP " msgid "IP Range" msgstr "Intervalo IP" -#: auths/IP/Authenticator.py:99 auths/InternalDB/Authenticator.py:102 +#: auths/IP/Authenticator.py:106 auths/InternalDB/Authenticator.py:102 msgid "All seems fine in the authenticator." msgstr "Parace que todo funciona correctamente en el autenticador. " @@ -305,10 +70,66 @@ msgstr "Dabasase interna autenticador. No utiliza fuentes externas" msgid "Internal structures seems ok" msgstr "Las estructuras internas parecen correctas" +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +#: services/OVirt/OVirtProvider.py:91 +msgid "Host" +msgstr "Servidor " + +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +msgid "VMWare VC Server IP or Hostname" +msgstr "IP o nombre DNS del servidor VMWare VC" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Port" +msgstr "Puerto" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Ldap port (389 for non ssl, 636 for ssl normally" +msgstr "Puerto LDAP (389 para no SSL, 636 para ssl normalmente)" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "Use SSL" +msgstr "Usar SSL" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "" +"If checked, will use a ssl connection to ldap (if port is 389, will use in " +"fact port 636)" +msgstr "" +"Si está activada, utilizará una conexión ssl con ldap (si el puerto es 389, " +"utilizará de hecho el Puerto 636)" + +#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 +msgid "Ldap User" +msgstr "Usuario LDAP" + #: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 msgid "Username with read privileges on the base selected" msgstr "Usuario con privilegios de lectura en la base elegida" +#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 +#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 +#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 +#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 +#: services/OVirt/OVirtProvider.py:93 transports/NX/NXTransport.py:62 +#: transports/RDP/RDPTransport.py:38 transports/RDP/TSRDPTransport.py:42 +#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 +msgid "Password" +msgstr "Contraseña" + +#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 +msgid "Password of the ldap user" +msgstr "Contraseña del usuario del ldap" + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +#: services/OVirt/OVirtProvider.py:94 +msgid "Timeout" +msgstr "Espera " + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +msgid "Timeout in seconds of connection to LDAP" +msgstr "Tiempo de espera en segundos" + #: auths/RegexLdap/Authenticator.py:55 auths/SimpleLDAP/Authenticator.py:55 msgid "Base" msgstr "Base" @@ -367,16 +188,59 @@ msgstr "Autenticador Regex LDAP" msgid "Regular Expressions LDAP authenticator" msgstr "Autenticador LDAP de expresiones regulares" +#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 +#: services/OVirt/OVirtProvider.py:92 transports/NX/NXTransport.py:61 +#: transports/RDP/RDPTransport.py:37 transports/RDP/TSRDPTransport.py:41 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 +msgid "Username" +msgstr "Usuario" + +#: auths/RegexLdap/Authenticator.py:74 auths/SimpleLDAP/Authenticator.py:75 +msgid "Group" +msgstr "Grupo" + #: auths/RegexLdap/Authenticator.py:96 msgid "Invalid regular expression" msgstr "Expresión regular inválida" +#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 +msgid "Ldap connection error: " +msgstr "Error de conexión al ldap: " + +#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 +#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 +msgid "Username not found" +msgstr "Nombre de usuario no hallado" + +#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 +#: auths/SimpleLDAP/Authenticator.py:342 +msgid "Too many results, be more specific" +msgstr "Demasiados resultados, sea más específico" + +#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 +msgid "Ldap search base is incorrect" +msgstr "La base de búsqueda ldap es incorrecta" + +#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 +msgid "Ldap user class seems to be incorrect (no user found by that class)" +msgstr "" +"La clase de usuario de LDAP parece ser incorrecta (ningún usuario encontrado " +"por esa clase)" + #: auths/RegexLdap/Authenticator.py:342 auths/SimpleLDAP/Authenticator.py:376 msgid "Ldap group class seems to be incorrect (no group found by that class)" msgstr "" "La clase de grupo LDAP parece ser incorrecta (ningún grupo encontrado por " "esa clase)" +#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 +msgid "" +"Ldap user id attribute seems to be incorrect (no user found by that " +"attribute)" +msgstr "" +"El atributo de id de usuario de ldap parece ser incorrecto (ningún usuario " +"encontrado por atributo)" + #: auths/RegexLdap/Authenticator.py:360 auths/SimpleLDAP/Authenticator.py:392 msgid "" "Ldap group id attribute seems to be incorrect (no group found by that " @@ -393,120 +257,11 @@ msgstr "" "El atributo del id de usuario o la clase de usuario LDAP son probablemente " "incorrectos(no se puede encontrar ningún usuario con ambas condiciones)" -#: auths/SAML_enterprise/SAML.py:79 -msgid "SAML Authenticator" -msgstr "Autenticador SAML" - -#: auths/SAML_enterprise/SAML.py:91 -msgid "SAML (v2.0) Authenticator" -msgstr "Autenticador SAML (versión 2.0)" - -#: auths/SAML_enterprise/SAML.py:110 templates/uds/internal_page.html:28 -msgid "User" -msgstr "Usuario" - -#: auths/SAML_enterprise/SAML.py:119 -msgid "Private key" -msgstr "Clave privada" - -#: auths/SAML_enterprise/SAML.py:120 -msgid "" -"Private key used for sign and encription, as generated in base 64 from " -"openssl" +#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 +msgid "Connection params seem correct, test was succesfully executed" msgstr "" -"Clave privada usada para la firma y la encriptación, en el formato que se " -"genera en base64 por openssl" - -#: auths/SAML_enterprise/SAML.py:121 -msgid "Certificate" -msgstr "Certificado" - -#: auths/SAML_enterprise/SAML.py:122 -msgid "Server certificate (public), , as generated in base 64 from openssl" -msgstr "" -"Certificado del servidor (público). Como se genera en base 62 desde openssl" - -#: auths/SAML_enterprise/SAML.py:123 -msgid "IDP Metadata" -msgstr "Metadata del IDP" - -#: auths/SAML_enterprise/SAML.py:124 -msgid "" -"You can enter here the URL or the IDP metadata or the metadata itself (xml)" -msgstr "" -"Puede insertar aqui la URL de los metadatos del IDP, o bien los metadatos " -"mismos (en xml) " - -#: auths/SAML_enterprise/SAML.py:126 -msgid "Entity ID" -msgstr "Entity ID" - -#: auths/SAML_enterprise/SAML.py:127 -msgid "ID of the SP. If left blank, this will be autogenerated from server URL" -msgstr "" -"ID del SP. Si se deja en blanco, será generado automáticamente usando el " -"nombre de servidor utilizado para hacer login en la administración." - -#: auths/SAML_enterprise/SAML.py:129 -msgid "User name attrs" -msgstr "Attrs. de nombre usu." - -#: auths/SAML_enterprise/SAML.py:130 -msgid "Fields from where to extract user name" -msgstr "Expresión regular para extraer el nombre de usuario" - -#: auths/SAML_enterprise/SAML.py:132 -msgid "Group name attrs" -msgstr "Atrs. de nombres de Grupos" - -#: auths/SAML_enterprise/SAML.py:133 -#, fuzzy -msgid "Fields from where to extract the groups" -msgstr "Expresión regular para extraer el nombre del grupo" - -#: auths/SAML_enterprise/SAML.py:135 -msgid "Real name attrs" -msgstr "Attr. de nombre real" - -#: auths/SAML_enterprise/SAML.py:136 -msgid "Fields from where to extract the real name" -msgstr "Expresión regular para extraer el nombre real del usuario" - -#: auths/SAML_enterprise/SAML.py:159 -msgid "" -"Server certificate should be a valid PEM (PEM certificates starts with -----" -"BEGIN CERTIFICATE-----)" -msgstr "" -"El certificado del servidor debe estarn en formato PEM (Los certificados en " -"formato PEM empiezan por ---BEGIN CERTIFICATE---)" - -#: auths/SAML_enterprise/SAML.py:164 -msgid "Invalid server certificate. " -msgstr "Certificado de servidor inválido" - -#: auths/SAML_enterprise/SAML.py:167 -msgid "" -"Private key should be a valid PEM (PEM private keys starts with -----BEGIN " -"RSA PRIVATE KEY-----" -msgstr "" -"La clave privada debe estar en formato PEM (los claves privadas en formato " -"PEM comienzan por ---BEGIN RSA PRIVATE KEY---)" - -#: auths/SAML_enterprise/SAML.py:196 -msgid "Can't fetch url {0}: {1}" -msgstr "No puedo obtener la url {0}: {1}" - -#: auths/SAML_enterprise/SAML.py:207 -msgid " (obtained from URL)" -msgstr "(obtenido de la URL)" - -#: auths/SAML_enterprise/SAML.py:208 -msgid "XML do not seems valid for IDP Metadata " -msgstr "El XML no parece ser válido para Metdatos de un IDP" - -#: auths/SAML_enterprise/SAML.py:224 -msgid "Can't access idp metadata" -msgstr "No se puee acceder a los metadatos del IDP" +"Los parámetros de conexión parecen correctos, la prueba fue ejecutado con " +"exito" #: auths/SimpleLDAP/Authenticator.py:59 msgid "Group class" @@ -540,6 +295,10 @@ msgstr "Autenticador LDAP Simple" msgid "Simple LDAP authenticator" msgstr "Autenticador LDAP Simple" +#: auths/SimpleLDAP/Authenticator.py:302 +msgid "Group not found" +msgstr "Grupo no hallado" + #: auths/SimpleLDAP/Authenticator.py:410 msgid "" "Ldap group class or group id attr is probably wrong (can't find any group " @@ -609,15 +368,15 @@ msgstr "24 bits" msgid "32 bits" msgstr "32 bits" -#: core/managers/UserServiceManager.py:303 +#: core/managers/UserServiceManager.py:307 msgid "Can't cancel non running operation" msgstr "No se puede cancelar una operación que no está en curso" -#: core/managers/UserServiceManager.py:322 +#: core/managers/UserServiceManager.py:326 msgid "Can't remove a non active element" msgstr "No se puede eliminar un elemento que no está activo" -#: core/managers/UserServiceManager.py:335 +#: core/managers/UserServiceManager.py:339 msgid "Can't remove nor cancel {0} cause its states doesn't allows it" msgstr "No se puede eliminar o cancelar {0} porque sus estados no lo permiten" @@ -629,7 +388,7 @@ msgstr "Gestor de OS Base" msgid "Base Manager" msgstr "Gestor Base" -#: core/transports/BaseTransport.py:113 +#: core/transports/BaseTransport.py:147 msgid "Transport empty" msgstr "Transporte Vacio" @@ -694,6 +453,23 @@ msgstr "Finalizado" msgid "Waiting execution" msgstr "En espera de ejecución" +#: core/util/stats/counters.py:197 +msgid "Assigned" +msgstr "Asignado" + +#: core/util/stats/counters.py:198 +#, fuzzy +msgid "In use" +msgstr "Usuario Administrador" + +#: core/util/stats/counters.py:199 +msgid "Load" +msgstr "Carga" + +#: core/util/stats/counters.py:200 +msgid "Storage" +msgstr "Almacenamiento de información" + #: osmanagers/LinuxOsManager/LinuxOsManager.py:45 msgid "Linux OS Manager" msgstr "Gestor de S.O. Linux" @@ -707,22 +483,22 @@ msgstr "" "renombra las máquinas y notifica los estados)" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "On Logout" msgstr "Al salir" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "What to do when user logout from service" msgstr "Que acción realizar cuando el usuario abandone el servicio" #: osmanagers/LinuxOsManager/LinuxOsManager.py:51 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 msgid "Keep service assigned" msgstr "Mantener el servicio asignado" #: osmanagers/LinuxOsManager/LinuxOsManager.py:52 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:44 msgid "Remove service" msgstr "Eliminar servicio" @@ -742,8 +518,6 @@ msgstr "Gestor de s.o. para controlar maquinas windows con dominio." #: osmanagers/WindowsOsManager/WinDomainOsManager.py:29 #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "Domain" msgstr "Dominio" @@ -813,11 +587,11 @@ msgstr "Contraseña (la fijada en la plantilla) del usuario" msgid "Must provide an user account!!!" msgstr "Debe indicar una cuenta de usuario!!!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:36 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:37 msgid "Windows Basic OS Manager" msgstr "Gestor de SO Windows Básico" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:38 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:39 msgid "" "Os Manager to control windows machines without domain. (Basically renames " "machine)" @@ -825,11 +599,11 @@ msgstr "" "Gestor de SO para controlar máquinas windows sin dominio. (Basicamente, " "renombra las máquinas)" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:52 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:53 msgid "Length must be numeric!!" msgstr "La longitud debe ser numerica!!!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:54 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:55 msgid "Length must be betwen 1 and six" msgstr "La longitud debe estar entre 1 y seis" @@ -842,25 +616,24 @@ msgstr "" "framework 3.5 sp1)" #: services/OVirt/OVirtLinkedService.py:56 -msgid "oVirt Linked Clone" +#, fuzzy +msgid "oVirt Linked Clone (Experimental)" msgstr "Servicio basado en oVirt Clones COW" #: services/OVirt/OVirtLinkedService.py:60 -msgid "oVirt Services based on templates and COW" +#, fuzzy +msgid "oVirt Services based on templates and COW (experimental)" msgstr "Servicioes oVirt basadoes en plantillas y COW" #: services/OVirt/OVirtLinkedService.py:77 -#: services/Vmware_enterprise/VCLinkedCloneService.py:70 msgid "Number of desired machines to keep running waiting for a user" msgstr "Número de máquinas a manatener en ejecución esperando a un usuario" #: services/OVirt/OVirtLinkedService.py:83 -#: services/Vmware_enterprise/VCLinkedCloneService.py:72 msgid "Number of desired machines to keep suspended waiting for use" msgstr "Número de maquinas a mantener suspendidas esperando asignación" #: services/OVirt/OVirtLinkedService.py:99 -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 msgid "Base Machine" msgstr "Máquina de base" @@ -885,7 +658,6 @@ msgid "Datastore domain where to publish and put incrementals" msgstr "Almacenamiento donde colocar los incrementales y las publicaciones" #: services/OVirt/OVirtLinkedService.py:112 -#: services/Vmware_enterprise/VCLinkedCloneService.py:49 msgid "Memory (Mb)" msgstr "Memoria (Mb)" @@ -902,17 +674,14 @@ msgid "Physical memory guaranteed to machines" msgstr "Memoria física garantizada a las máquinas" #: services/OVirt/OVirtLinkedService.py:118 -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 msgid "Machine Names" msgstr "Nombres de máquinas" #: services/OVirt/OVirtLinkedService.py:119 -#: services/Vmware_enterprise/VCLinkedCloneService.py:54 msgid "Name Length" msgstr "Longitud del nombre" #: services/OVirt/OVirtLinkedService.py:120 -#: services/Vmware_enterprise/VCLinkedCloneService.py:55 msgid "Length of numeric part for the names of this machines (betwen 3 and 6" msgstr "" "Longitud de la parte numérica de los nombres de esta maquinaria (entre 3 y 6" @@ -926,12 +695,10 @@ msgid "Display type (only for administration pourposses)" msgstr "Tipo de pantalla (solo para la administración)" #: services/OVirt/OVirtLinkedService.py:143 -#: services/Vmware_enterprise/VCLinkedCloneService.py:93 msgid "The length of basename plus length must not be greater than 15" msgstr "La longitud de basename más longitud no debe ser superior a 15" #: services/OVirt/OVirtLinkedService.py:145 -#: services/Vmware_enterprise/VCLinkedCloneService.py:95 msgid "The machine name can't be only numbers" msgstr "El nombre del equipo no puede ser sólo números" @@ -956,26 +723,22 @@ msgid "Password of the user of oVirt" msgstr "Contraseña del usuario de oVirt" #: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 msgid "Timeout in seconds of connection to VC" msgstr "Timeout en segundos" #: services/OVirt/OVirtProvider.py:95 -#: services/Vmware_enterprise/ServiceProviderVC.py:33 msgid "Macs range" msgstr "Rango de Macs" #: services/OVirt/OVirtProvider.py:96 -#: services/Vmware_enterprise/ServiceProviderVC.py:34 msgid "Range of valids macs for created machines" msgstr "Rango válido de macs para las máquinas creadas" -#: services/OVirt/OVirtProvider.py:395 +#: services/OVirt/OVirtProvider.py:398 msgid "Connection test successful" msgstr "Test de conexión correcto" -#: services/OVirt/OVirtProvider.py:396 -#: services/Vmware_enterprise/ServiceProviderVC.py:120 +#: services/OVirt/OVirtProvider.py:399 msgid "Connection failed. Check connection params" msgstr "La conexión ha fallado. Compruebe los parámetros." @@ -1011,126 +774,6 @@ msgstr "Nada probado, pero todo salió bien..." msgid "Random integer was 9!!! :-)" msgstr "Entero aleatorio fue 9!!!!!! :-)" -#: services/Vmware_enterprise/Helpers.py:72 -msgid "Local" -msgstr "Local" - -#: services/Vmware_enterprise/Helpers.py:74 -msgid "Remote" -msgstr "Remoto" - -#: services/Vmware_enterprise/PublicationVC.py:37 -msgid "Publication" -msgstr "Publicación" - -#: services/Vmware_enterprise/PublicationVC.py:38 -msgid "UDS Publication for {0} created at {1}" -msgstr "Publicación de UDS para {0} creada el {1}" - -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "VMWare VC Server Port (usually 443)" -msgstr "Puerto del servidor VMWare VC (normalmente 443)" - -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -msgid "User with valid privileges on VC" -msgstr "Usuario con privilegios validos sobre VC" - -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -msgid "Password of the user of the VC" -msgstr "Contraseña del usuario de VC" - -#: services/Vmware_enterprise/ServiceProviderVC.py:39 -msgid "VMWare Virtual Center Provider" -msgstr "Proveedor de VMWare Virtual Center" - -#: services/Vmware_enterprise/ServiceProviderVC.py:41 -msgid "Provides connection to Virtual Center Services" -msgstr "Provee conexión a servicios basados en VMWare Virtual Center" - -#: services/Vmware_enterprise/ServiceProviderVC.py:110 -msgid "Error testing connection" -msgstr "Error comprobando la conexión" - -#: services/Vmware_enterprise/ServiceProviderVC.py:113 -msgid "VmwareVC Provider: " -msgstr "Proveedor VmwareVC:" - -#: services/Vmware_enterprise/ServiceProviderVC.py:119 -msgid "Connection params ok" -msgstr "Parametros de conexión correctos" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:28 -msgid "Datacenter" -msgstr "Datacenter " - -#: services/Vmware_enterprise/VCLinkedCloneService.py:34 -msgid "Datacenter containing base machine" -msgstr "Datacenter que contiene la máquina de base" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:36 -msgid "Network" -msgstr "Red" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:37 -msgid "" -"If more than 1 interface is found in machine, use one on this network as main" -msgstr "" -"Si hay mas de un interfaz en la máquina virtual, use el que esté en esta red " -"como principal." - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Pub. Resource Pool" -msgstr "Pool de despliegue" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Resource Pool where deploy clones" -msgstr "Pool de recursos donde desplegar los clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Clones Folder" -msgstr "Carpeta de clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Folder where deploy clones" -msgstr "Carpeta donde desplegar los clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:40 -msgid "Resource Pool" -msgstr "Pool de recursos" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:46 -msgid "Resource Pool containing base machine" -msgstr "Pool de recursos que contiene la máquina de base" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 -msgid "Base machine for this service" -msgstr "Máquina de base para este servicio" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:50 -msgid "Memory for machines deployed from this service" -msgstr "Memoria para maquinas desplegadas desde este servicio" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:51 -msgid "Datastores" -msgstr "Almacenamientos" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:52 -msgid "Datastores where to put incrementals" -msgstr "Almacenamiento donde colocar los incrementales" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 -msgid "Base name for clones from this machine" -msgstr "Nombre base para los clones de la máquina base" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:62 -msgid "VMWare Linked clone base" -msgstr "Servicio basado en VMWare Linked clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:64 -msgid "" -"This service provides access to Linked Clones machines on a Virtual Center" -msgstr "Este servicio provee acceso a linked clones sobre Virtual Center" - #: templates/404.html:4 templates/404.html.py:7 msgid "Page not found" msgstr "Página no encontrada" @@ -1201,6 +844,10 @@ msgstr "Redes" msgid "Transports" msgstr "Transportes" +#: templates/uds/internal_page.html:28 +msgid "User" +msgstr "Usuario" + #: templates/uds/internal_page.html:34 templates/uds/prefs.html:12 msgid "Preferences" msgstr "Preferencias" @@ -1264,36 +911,24 @@ msgid "NX Transport for direct connection" msgstr "Transporte NX para conexión directa" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Sin credenciales" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Si está activada, las credenciales utilizadas para conectar estarán vacías" #: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/RDP/TSRDPTransport.py:41 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Si no está vacio, este nombre de usuario será utilizado como credencial fija" #: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/RDP/TSRDPTransport.py:42 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "Si no está vacio, este password será utiizado como credencial fija" @@ -1345,7 +980,7 @@ msgstr "Protocolo NX" msgid "UDS Actor connector for NX (requires nomachine packages)" msgstr "Conector de UDS Actor para NX (requiere nomachine paquetes)" -#: transports/NX/web.py:74 +#: transports/NX/web.py:75 msgid "" "In order to use this transport, you need to install first Nomachine Nx " "Client version 3.5.x" @@ -1353,11 +988,11 @@ msgstr "" "Para poder utilizar este transporte, necesita instalar primera Nomachine Nx " "Cliente versión 3.5" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "you can obtain it for your platform from" msgstr "Usted puede obtener para su plataforma de" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "nochamine web site" msgstr "Sitio Web de Nomachine" @@ -1370,8 +1005,6 @@ msgid "RDP Transport for direct connection" msgstr "Transporte RDP para conexión directa" #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "" "If not empty, this domain will be always used as credential (used as DOMAIN" "\\user)" @@ -1424,15 +1057,11 @@ msgstr "Transporte RDP (vía túnel)" msgid "RDP Transport for tunneled connection" msgstr "Transporte RDP para conexión vía túnel" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "Tunnel server" msgstr "Servidor de túnel" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "" "IP or Hostname of tunnel server send to client device (\"public\" ip) and " "port. (use HOST:PORT format)" @@ -1440,15 +1069,11 @@ msgstr "" "IP o nombre de host del servidor de túnel enviar a dispositivo de cliente " "(ip \"pública\") y puerto. (utilice el formato HOST: puerto)" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "Tunnel host check" msgstr "Verificación de host de túnel" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "" "If not empty, this server will be used to check if service is running before " "assigning it to user. (use HOST:PORT format)" @@ -1460,134 +1085,18 @@ msgstr "" msgid "Remote Desktop Protocol" msgstr "Protocolo de Escritorio remoto (RDP)" -#: transports/RDP/web.py:83 +#: transports/RDP/web.py:84 msgid "In order to use this service, you should first install CoRD." msgstr "Para poder utilizar este servicio, primero debe instalar CoRD." -#: transports/RDP/web.py:84 transports/RGS-enterprise/web.py:82 +#: transports/RDP/web.py:85 msgid "You can obtain it from" msgstr "Puede obtenerlo de" -#: transports/RDP/web.py:84 +#: transports/RDP/web.py:85 msgid "CoRD Website" msgstr "Sitio Web de CoRD" -#: transports/RGS-enterprise/RGSTransport.py:34 -msgid "RGS Transport (direct)" -msgstr "Transporte RGS (directo)" - -#: transports/RGS-enterprise/RGSTransport.py:36 -msgid "RGS Transport for direct connection" -msgstr "Transporte RGS para conexión directa" - -#: transports/RGS-enterprise/RGSTransport.py:45 -#: transports/RGS-enterprise/TRGSTransport.py:50 -msgid "Image quality" -msgstr "Calidad de imagen" - -#: transports/RGS-enterprise/RGSTransport.py:46 -#: transports/RGS-enterprise/TRGSTransport.py:51 -msgid "Quality of image codec (0-100)" -msgstr "Calidad del códec de imagen (0-100)" - -#: transports/RGS-enterprise/RGSTransport.py:47 -#: transports/RGS-enterprise/TRGSTransport.py:52 -msgid "Adjustable Quality" -msgstr "Calidad ajustable" - -#: transports/RGS-enterprise/RGSTransport.py:48 -#: transports/RGS-enterprise/TRGSTransport.py:53 -msgid "If checked, the image quality will be adjustable with bandwidth" -msgstr "" -"Si está activada, la calidad de imagen será ajustable con ancho de banda" - -#: transports/RGS-enterprise/RGSTransport.py:49 -#: transports/RGS-enterprise/TRGSTransport.py:54 -msgid "Min. Adjustable Quality" -msgstr "Mín. calidad ajustable" - -#: transports/RGS-enterprise/RGSTransport.py:50 -#: transports/RGS-enterprise/TRGSTransport.py:55 -msgid "" -"The lowest image quality applied to images to maintain the minimum update " -"rate." -msgstr "" -"La menor calidad de imagen aplicada a las imágenes para mantener la " -"actualización mínima tasa." - -#: transports/RGS-enterprise/RGSTransport.py:51 -#: transports/RGS-enterprise/TRGSTransport.py:56 -msgid "Adjustable Frame Rate" -msgstr "Ajustable velocidad de fotogramas" - -#: transports/RGS-enterprise/RGSTransport.py:52 -#: transports/RGS-enterprise/TRGSTransport.py:57 -msgid "Update rate threshold to begin adjusting image quality" -msgstr "" -"Umbral de velocidad de actualización para comenzar el ajuste de calidad de " -"imagen" - -#: transports/RGS-enterprise/RGSTransport.py:53 -#: transports/RGS-enterprise/TRGSTransport.py:58 -msgid "Match Local Resolution" -msgstr "Resolución Local de partido" - -#: transports/RGS-enterprise/RGSTransport.py:54 -#: transports/RGS-enterprise/TRGSTransport.py:59 -msgid "" -"Change the Sender's resolution to match the Receiver's resolution when " -"connecting" -msgstr "" -"Cambiar la resolución del remitente para que coincida con la resolución del " -"receptor cuando conexión" - -#: transports/RGS-enterprise/RGSTransport.py:55 -#: transports/RGS-enterprise/TRGSTransport.py:60 -msgid "Redirect USB" -msgstr "Redirección USB" - -#: transports/RGS-enterprise/RGSTransport.py:56 -#: transports/RGS-enterprise/TRGSTransport.py:61 -msgid "If checked, the USB will be redirected." -msgstr "Si está activada, se redirigirá el USB." - -#: transports/RGS-enterprise/RGSTransport.py:57 -#: transports/RGS-enterprise/TRGSTransport.py:62 -msgid "Redirect Audio" -msgstr "Redirección de Audio" - -#: transports/RGS-enterprise/RGSTransport.py:58 -#: transports/RGS-enterprise/TRGSTransport.py:63 -msgid "If checked, the Audio will be redirected." -msgstr "Si está activado, el audio será redirigido al cliente" - -#: transports/RGS-enterprise/RGSTransport.py:59 -#: transports/RGS-enterprise/TRGSTransport.py:64 -msgid "Redirect Mic" -msgstr "Redirigir Mic" - -#: transports/RGS-enterprise/RGSTransport.py:60 -#: transports/RGS-enterprise/TRGSTransport.py:65 -msgid "If checked, the Mic will be redirected." -msgstr "Si está activado. el micro será redirigido al cliente" - -#: transports/RGS-enterprise/TRGSTransport.py:36 -msgid "RGS Transport (tunneled)" -msgstr "Transporte RGS (vía túnel)" - -#: transports/RGS-enterprise/TRGSTransport.py:38 -msgid "RGS Transport for tunneled connection" -msgstr "Transporte RGS para conexión vía túnel" - -#: transports/RGS-enterprise/web.py:81 -msgid "In order to use this service, you should first install RGS Receiver." -msgstr "" -"Para poder utilizar este servicio, primero debe instalar el Receiver de RGS" - -#: transports/RGS-enterprise/web.py:82 -msgid "HP Website" -msgstr "Sitio Web de HP" - #: transports/TSNX/TSNXTransport.py:55 msgid "NX Transport (tunneled)" msgstr "Transporte NX (vía túnel)" @@ -1608,7 +1117,8 @@ msgstr "Transporte no hallado" msgid "Service not found" msgstr "Servicio no hallado" -#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:171 +#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:183 +#: xmlrpc/auths/AdminAuth.py:189 msgid "Access denied" msgstr "Acceso denegado" @@ -1638,11 +1148,11 @@ msgstr "Servicio de usuario no hallado" msgid "Authenticator not found" msgstr "Autenticador no hallado" -#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:169 +#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:174 msgid "Invalid authenticator" msgstr "Autenticador Invalido" -#: web/views.py:334 +#: web/views.py:359 msgid "Authenticator do not provides information" msgstr "El autenticador no proporciona información alguna" @@ -1650,15 +1160,15 @@ msgstr "El autenticador no proporciona información alguna" msgid "Authenticator" msgstr "Autenticador" -#: xmlrpc/auths/AdminAuth.py:113 +#: xmlrpc/auths/AdminAuth.py:116 msgid "Credentials no longer valid" msgstr "Las credenciales ya no son válidas" -#: xmlrpc/auths/AdminAuth.py:149 +#: xmlrpc/auths/AdminAuth.py:152 msgid "Administration" msgstr "Administración" -#: xmlrpc/auths/AdminAuth.py:164 +#: xmlrpc/auths/AdminAuth.py:169 msgid "Invalid credentials" msgstr "Credenciales Invalidas" @@ -1666,7 +1176,7 @@ msgstr "Credenciales Invalidas" msgid "Authenticator does not exists" msgstr "El autenticador no existe" -#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:115 +#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:116 #: xmlrpc/services/ServiceProviders.py:115 #: xmlrpc/services/ServiceProviders.py:139 xmlrpc/services/Services.py:160 #: xmlrpc/services/Services.py:184 xmlrpc/transports/Networks.py:86 @@ -1689,15 +1199,20 @@ msgstr "" msgid "BUG: Reached a point that should never have been reached!!!" msgstr "BUG: Llegado a un punto que no debe nunca han alcanzado!!!" -#: xmlrpc/osmanagers/OSManagers.py:129 +#: xmlrpc/log/logs.py:53 xmlrpc/stats/stats.py:70 +#, fuzzy +msgid "Service does not exists" +msgstr "El servicio desplegado no existe" + +#: xmlrpc/osmanagers/OSManagers.py:130 msgid "This os mnager is being used by deployed services" msgstr "Este OS Manager está siendo utilizado por servicios desplegados" -#: xmlrpc/osmanagers/OSManagers.py:145 +#: xmlrpc/osmanagers/OSManagers.py:146 msgid "There is deployed services using this os manager" msgstr "Existen servicios desplegados que utilizan este gestor de SO" -#: xmlrpc/osmanagers/OSManagers.py:147 +#: xmlrpc/osmanagers/OSManagers.py:148 msgid "Can't find os manager" msgstr "No se puede hallar el gestor de SO" @@ -1753,30 +1268,30 @@ msgstr "No se puede borrar un servicio con servicios desplegados asociados" msgid "Can't locate the service" msgstr "No puedo hallar el servicio" -#: xmlrpc/services/UserDeployedServices.py:94 -#: xmlrpc/services/UserDeployedServices.py:110 +#: xmlrpc/services/UserDeployedServices.py:100 +#: xmlrpc/services/UserDeployedServices.py:116 msgid "The deployed service is not active" msgstr "El servicio desplegado no está activo" -#: xmlrpc/services/UserDeployedServices.py:97 -#: xmlrpc/services/UserDeployedServices.py:113 +#: xmlrpc/services/UserDeployedServices.py:103 +#: xmlrpc/services/UserDeployedServices.py:119 msgid "This service don't allows assignations" msgstr "El servicio no admite asignaciones" -#: xmlrpc/services/UserDeployedServices.py:102 -#: xmlrpc/services/UserDeployedServices.py:120 +#: xmlrpc/services/UserDeployedServices.py:108 +#: xmlrpc/services/UserDeployedServices.py:126 msgid "Deployed service not found!!! (refresh interface)" msgstr "Servicio desplegado no hallado!!! (refresque la interfaz)" -#: xmlrpc/services/UserDeployedServices.py:122 +#: xmlrpc/services/UserDeployedServices.py:128 msgid "User not found!!! (refresh interface)" msgstr "Usuario no hallado (refresque la interfaz)" -#: xmlrpc/services/UserDeployedServices.py:141 +#: xmlrpc/services/UserDeployedServices.py:147 msgid "No error" msgstr "Sin errores" -#: xmlrpc/services/UserDeployedServices.py:147 +#: xmlrpc/services/UserDeployedServices.py:153 msgid "User deployed service not found!!!" msgstr "Servicio de usuario no hallado!!!" @@ -1788,6 +1303,326 @@ msgstr "No puedo hallar el transporte" msgid "Can't locate the network" msgstr "No puedo hallar la red" +#~ msgid "If checked, will use a ssl connection to Active Directory" +#~ msgstr "Si está activada, utilizará una conexión ssl con Active Directory" + +#~ msgid "" +#~ "Username with read privileges on the base selected (use USER@DOMAIN.DOM " +#~ "form for this)" +#~ msgstr "" +#~ "Usuario con derechos de lectura en la base seleccionada (utilice la forma " +#~ "USUARIO@DOMINIO.DOM para este elemento)" + +#~ msgid "Active Directory Authenticator" +#~ msgstr "Autenticador Active Directory" + +#~ msgid "Authenticate against Active Directory" +#~ msgstr "Autenticador contra Active Directory" + +#~ msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" +#~ msgstr "" +#~ "Debe especificar el nombre de usuario en la forma NOMBREUSUARIO@DOMINIO." +#~ "DOM" + +#~ msgid "Domain seems to be incorrect, please check it" +#~ msgstr "El dominio parece ser incorrecto, por favor, compruebelo" + +#~ msgid "Ldap does not seem an Active Directory (do not have user objects)" +#~ msgstr "" +#~ "El ldap indicado no parece un Active Directory (no tiene objetos de " +#~ "usuario)" + +#~ msgid "Ldap does not seem an Active Directory (no not have group objects)" +#~ msgstr "" +#~ "El ldap indicado no parece un Active Directory (no no tienen objetos de " +#~ "grupo)" + +#~ msgid "" +#~ "Ldap does not seem an Active Directory (do not have any user nor groups)" +#~ msgstr "" +#~ "El ldap indicado no parece un Active Directory (no tiene ningún usuario " +#~ "ni grupo)" + +#~ msgid "Username with read privileges on the eDirectory" +#~ msgstr "Usuario con privilegios de lectura sobre eDirectory" + +#~ msgid "eDirectory Authenticator" +#~ msgstr "Autenticador eDirectory" + +#~ msgid "Authenticate against eDirectory" +#~ msgstr "Autenticador contra eDirectory" + +#~ msgid "Expected group attribute " +#~ msgstr "Atributo de grupo esperado " + +#~ msgid "" +#~ "Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" +#~ msgstr "" +#~ "El atributo del id de usuario o la clase de usuario LDAP son " +#~ "probablemente incorrectos(¿el LDAP indicado es realmente un eDirectory?)" + +#~ msgid "SAML Authenticator" +#~ msgstr "Autenticador SAML" + +#~ msgid "SAML (v2.0) Authenticator" +#~ msgstr "Autenticador SAML (versión 2.0)" + +#~ msgid "Private key" +#~ msgstr "Clave privada" + +#~ msgid "" +#~ "Private key used for sign and encription, as generated in base 64 from " +#~ "openssl" +#~ msgstr "" +#~ "Clave privada usada para la firma y la encriptación, en el formato que se " +#~ "genera en base64 por openssl" + +#~ msgid "Certificate" +#~ msgstr "Certificado" + +#~ msgid "Server certificate (public), , as generated in base 64 from openssl" +#~ msgstr "" +#~ "Certificado del servidor (público). Como se genera en base 62 desde " +#~ "openssl" + +#~ msgid "IDP Metadata" +#~ msgstr "Metadata del IDP" + +#~ msgid "" +#~ "You can enter here the URL or the IDP metadata or the metadata itself " +#~ "(xml)" +#~ msgstr "" +#~ "Puede insertar aqui la URL de los metadatos del IDP, o bien los metadatos " +#~ "mismos (en xml) " + +#~ msgid "Entity ID" +#~ msgstr "Entity ID" + +#~ msgid "" +#~ "ID of the SP. If left blank, this will be autogenerated from server URL" +#~ msgstr "" +#~ "ID del SP. Si se deja en blanco, será generado automáticamente usando el " +#~ "nombre de servidor utilizado para hacer login en la administración." + +#~ msgid "User name attrs" +#~ msgstr "Attrs. de nombre usu." + +#~ msgid "Fields from where to extract user name" +#~ msgstr "Expresión regular para extraer el nombre de usuario" + +#~ msgid "Group name attrs" +#~ msgstr "Atrs. de nombres de Grupos" + +#, fuzzy +#~ msgid "Fields from where to extract the groups" +#~ msgstr "Expresión regular para extraer el nombre del grupo" + +#~ msgid "Real name attrs" +#~ msgstr "Attr. de nombre real" + +#~ msgid "Fields from where to extract the real name" +#~ msgstr "Expresión regular para extraer el nombre real del usuario" + +#~ msgid "" +#~ "Server certificate should be a valid PEM (PEM certificates starts with " +#~ "-----BEGIN CERTIFICATE-----)" +#~ msgstr "" +#~ "El certificado del servidor debe estarn en formato PEM (Los certificados " +#~ "en formato PEM empiezan por ---BEGIN CERTIFICATE---)" + +#~ msgid "Invalid server certificate. " +#~ msgstr "Certificado de servidor inválido" + +#~ msgid "" +#~ "Private key should be a valid PEM (PEM private keys starts with -----" +#~ "BEGIN RSA PRIVATE KEY-----" +#~ msgstr "" +#~ "La clave privada debe estar en formato PEM (los claves privadas en " +#~ "formato PEM comienzan por ---BEGIN RSA PRIVATE KEY---)" + +#~ msgid "Can't fetch url {0}: {1}" +#~ msgstr "No puedo obtener la url {0}: {1}" + +#~ msgid " (obtained from URL)" +#~ msgstr "(obtenido de la URL)" + +#~ msgid "XML do not seems valid for IDP Metadata " +#~ msgstr "El XML no parece ser válido para Metdatos de un IDP" + +#~ msgid "Can't access idp metadata" +#~ msgstr "No se puee acceder a los metadatos del IDP" + +#~ msgid "Local" +#~ msgstr "Local" + +#~ msgid "Remote" +#~ msgstr "Remoto" + +#~ msgid "Publication" +#~ msgstr "Publicación" + +#~ msgid "UDS Publication for {0} created at {1}" +#~ msgstr "Publicación de UDS para {0} creada el {1}" + +#~ msgid "VMWare VC Server Port (usually 443)" +#~ msgstr "Puerto del servidor VMWare VC (normalmente 443)" + +#~ msgid "User with valid privileges on VC" +#~ msgstr "Usuario con privilegios validos sobre VC" + +#~ msgid "Password of the user of the VC" +#~ msgstr "Contraseña del usuario de VC" + +#~ msgid "VMWare Virtual Center Provider" +#~ msgstr "Proveedor de VMWare Virtual Center" + +#~ msgid "Provides connection to Virtual Center Services" +#~ msgstr "Provee conexión a servicios basados en VMWare Virtual Center" + +#~ msgid "Error testing connection" +#~ msgstr "Error comprobando la conexión" + +#~ msgid "VmwareVC Provider: " +#~ msgstr "Proveedor VmwareVC:" + +#~ msgid "Connection params ok" +#~ msgstr "Parametros de conexión correctos" + +#~ msgid "Datacenter" +#~ msgstr "Datacenter " + +#~ msgid "Datacenter containing base machine" +#~ msgstr "Datacenter que contiene la máquina de base" + +#~ msgid "Network" +#~ msgstr "Red" + +#~ msgid "" +#~ "If more than 1 interface is found in machine, use one on this network as " +#~ "main" +#~ msgstr "" +#~ "Si hay mas de un interfaz en la máquina virtual, use el que esté en esta " +#~ "red como principal." + +#~ msgid "Pub. Resource Pool" +#~ msgstr "Pool de despliegue" + +#~ msgid "Resource Pool where deploy clones" +#~ msgstr "Pool de recursos donde desplegar los clones" + +#~ msgid "Clones Folder" +#~ msgstr "Carpeta de clones" + +#~ msgid "Folder where deploy clones" +#~ msgstr "Carpeta donde desplegar los clones" + +#~ msgid "Resource Pool" +#~ msgstr "Pool de recursos" + +#~ msgid "Resource Pool containing base machine" +#~ msgstr "Pool de recursos que contiene la máquina de base" + +#~ msgid "Base machine for this service" +#~ msgstr "Máquina de base para este servicio" + +#~ msgid "Memory for machines deployed from this service" +#~ msgstr "Memoria para maquinas desplegadas desde este servicio" + +#~ msgid "Datastores" +#~ msgstr "Almacenamientos" + +#~ msgid "Datastores where to put incrementals" +#~ msgstr "Almacenamiento donde colocar los incrementales" + +#~ msgid "Base name for clones from this machine" +#~ msgstr "Nombre base para los clones de la máquina base" + +#~ msgid "VMWare Linked clone base" +#~ msgstr "Servicio basado en VMWare Linked clones" + +#~ msgid "" +#~ "This service provides access to Linked Clones machines on a Virtual Center" +#~ msgstr "Este servicio provee acceso a linked clones sobre Virtual Center" + +#~ msgid "RGS Transport (direct)" +#~ msgstr "Transporte RGS (directo)" + +#~ msgid "RGS Transport for direct connection" +#~ msgstr "Transporte RGS para conexión directa" + +#~ msgid "Image quality" +#~ msgstr "Calidad de imagen" + +#~ msgid "Quality of image codec (0-100)" +#~ msgstr "Calidad del códec de imagen (0-100)" + +#~ msgid "Adjustable Quality" +#~ msgstr "Calidad ajustable" + +#~ msgid "If checked, the image quality will be adjustable with bandwidth" +#~ msgstr "" +#~ "Si está activada, la calidad de imagen será ajustable con ancho de banda" + +#~ msgid "Min. Adjustable Quality" +#~ msgstr "Mín. calidad ajustable" + +#~ msgid "" +#~ "The lowest image quality applied to images to maintain the minimum update " +#~ "rate." +#~ msgstr "" +#~ "La menor calidad de imagen aplicada a las imágenes para mantener la " +#~ "actualización mínima tasa." + +#~ msgid "Adjustable Frame Rate" +#~ msgstr "Ajustable velocidad de fotogramas" + +#~ msgid "Update rate threshold to begin adjusting image quality" +#~ msgstr "" +#~ "Umbral de velocidad de actualización para comenzar el ajuste de calidad " +#~ "de imagen" + +#~ msgid "Match Local Resolution" +#~ msgstr "Resolución Local de partido" + +#~ msgid "" +#~ "Change the Sender's resolution to match the Receiver's resolution when " +#~ "connecting" +#~ msgstr "" +#~ "Cambiar la resolución del remitente para que coincida con la resolución " +#~ "del receptor cuando conexión" + +#~ msgid "Redirect USB" +#~ msgstr "Redirección USB" + +#~ msgid "If checked, the USB will be redirected." +#~ msgstr "Si está activada, se redirigirá el USB." + +#~ msgid "Redirect Audio" +#~ msgstr "Redirección de Audio" + +#~ msgid "If checked, the Audio will be redirected." +#~ msgstr "Si está activado, el audio será redirigido al cliente" + +#~ msgid "Redirect Mic" +#~ msgstr "Redirigir Mic" + +#~ msgid "If checked, the Mic will be redirected." +#~ msgstr "Si está activado. el micro será redirigido al cliente" + +#~ msgid "RGS Transport (tunneled)" +#~ msgstr "Transporte RGS (vía túnel)" + +#~ msgid "RGS Transport for tunneled connection" +#~ msgstr "Transporte RGS para conexión vía túnel" + +#~ msgid "In order to use this service, you should first install RGS Receiver." +#~ msgstr "" +#~ "Para poder utilizar este servicio, primero debe instalar el Receiver de " +#~ "RGS" + +#~ msgid "HP Website" +#~ msgstr "Sitio Web de HP" + #~ msgid "None OS Manager" #~ msgstr "Ningún gestor de OS" diff --git a/server/src/uds/locale/fr/LC_MESSAGES/django.mo b/server/src/uds/locale/fr/LC_MESSAGES/django.mo index eea0332b..a3fedf30 100644 Binary files a/server/src/uds/locale/fr/LC_MESSAGES/django.mo and b/server/src/uds/locale/fr/LC_MESSAGES/django.mo differ diff --git a/server/src/uds/locale/fr/LC_MESSAGES/django.po b/server/src/uds/locale/fr/LC_MESSAGES/django.po index f68c67b7..830036a0 100644 --- a/server/src/uds/locale/fr/LC_MESSAGES/django.po +++ b/server/src/uds/locale/fr/LC_MESSAGES/django.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-28 10:17+0100\n" +"POT-Creation-Date: 2013-02-12 15:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,248 +42,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/OVirt/OVirtProvider.py:91 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "Host" -msgstr "Serveur" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:29 -#: auths/EDirectory_enterprise/Authenticator.py:60 -#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 -#: services/Vmware_enterprise/ServiceProviderVC.py:28 -msgid "VMWare VC Server IP or Hostname" -msgstr "Le nom DNS ou l'adresse IP VC VMWare Server" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "Use SSL" -msgstr "Utiliser SSL" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:30 -msgid "If checked, will use a ssl connection to Active Directory" -msgstr "Si elle est cochée, va utiliser une connexion SSL à Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 -msgid "Ldap User" -msgstr "Utilisateur LDAP" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:31 -msgid "" -"Username with read privileges on the base selected (use USER@DOMAIN.DOM form " -"for this)" -msgstr "" -"Nom d'utilisateur avec des privilèges lire sur la base choisie (utiliser le " -"format USER@DOMAIN.DOMpour cela)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/ActiveDirectory_enterprise/Authenticator.py:50 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 -#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 -#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 -#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 -#: services/OVirt/OVirtProvider.py:93 -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -#: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 -msgid "Password" -msgstr "Mot de passe" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:32 -#: auths/EDirectory_enterprise/Authenticator.py:64 -#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 -msgid "Password of the ldap user" -msgstr "Mot de passe de l'utilisateur ldap" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -#: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 -msgid "Timeout" -msgstr "Temporisation" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:33 -#: auths/EDirectory_enterprise/Authenticator.py:65 -#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 -msgid "Timeout in seconds of connection to LDAP" -msgstr "Délai en secondes de la connexion à LDAP" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:35 -msgid "Active Directory Authenticator" -msgstr "Active Directory authentificateur" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:37 -#, fuzzy -msgid "Authenticate against Active Directory" -msgstr "Authentificateur sur Active Directory" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:46 -#: auths/EDirectory_enterprise/Authenticator.py:77 -#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 -#: services/OVirt/OVirtProvider.py:92 -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 -msgid "Username" -msgstr "Nom d'utilisateur" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:48 -#: auths/EDirectory_enterprise/Authenticator.py:79 -#: auths/RegexLdap/Authenticator.py:74 auths/SAML_enterprise/SAML.py:113 -#: auths/SimpleLDAP/Authenticator.py:75 -msgid "Group" -msgstr "Groupe" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:61 -#: auths/ActiveDirectory_enterprise/Authenticator.py:395 -msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" -msgstr "" -"Doit spécifier le nom d'utilisateur sous la forme NOMDEUTILISEUR@DOMAINE.DOM" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:127 -#: auths/EDirectory_enterprise/Authenticator.py:123 -#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 -msgid "Ldap connection error: " -msgstr "Erreur de connexion LDAP : " - -#: auths/ActiveDirectory_enterprise/Authenticator.py:299 -#: auths/ActiveDirectory_enterprise/Authenticator.py:345 -#: auths/EDirectory_enterprise/Authenticator.py:243 -#: auths/EDirectory_enterprise/Authenticator.py:286 -#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 -#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 -msgid "Username not found" -msgstr "Nom d'utilisateur introuvable" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:332 -#: auths/SimpleLDAP/Authenticator.py:302 -msgid "Group not found" -msgstr "Groupe introuvable" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:364 -#: auths/ActiveDirectory_enterprise/Authenticator.py:381 -#: auths/EDirectory_enterprise/Authenticator.py:303 -#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 -#: auths/SimpleLDAP/Authenticator.py:342 -msgid "Too many results, be more specific" -msgstr "Trop de résultats, être plus spécifique" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:404 -msgid "Domain seems to be incorrect, please check it" -msgstr "Domaine semble incorrect, veuillez vérifier" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:409 -msgid "Ldap does not seem an Active Directory (do not have user objects)" -msgstr "" -"LDAP ne semble pas un serveur Active Directory (n'ont pas les objets " -"utilisateur)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:417 -msgid "Ldap does not seem an Active Directory (no not have group objects)" -msgstr "" -"LDAP ne semble pas un serveur Active Directory (ne pas ont les objets de " -"groupe)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:425 -msgid "" -"Ldap does not seem an Active Directory (do not have any user nor groups)" -msgstr "" -"LDAP ne semble pas un serveur Active Directory (n'ont pas tout utilisateur " -"ni les groupes)" - -#: auths/ActiveDirectory_enterprise/Authenticator.py:430 -#: auths/EDirectory_enterprise/Authenticator.py:358 -#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 -msgid "Connection params seem correct, test was succesfully executed" -msgstr "" -"Connexion params semblent correctes, le test a été correctement exécutée" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "Port" -msgstr "Port" - -#: auths/EDirectory_enterprise/Authenticator.py:61 -#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 -msgid "Ldap port (389 for non ssl, 636 for ssl normally" -msgstr "Port LDAP (389 non SSL, 636 pour ssl normalement" - -#: auths/EDirectory_enterprise/Authenticator.py:62 -#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 -msgid "" -"If checked, will use a ssl connection to ldap (if port is 389, will use in " -"fact port 636)" -msgstr "" -"Si cochée, utilise une connexion ssl à ldap (si le port est 389, utilisera " -"dans port de fait 636)" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -#, fuzzy -msgid "Admin user" -msgstr "Admin" - -#: auths/EDirectory_enterprise/Authenticator.py:63 -#, fuzzy -msgid "Username with read privileges on the eDirectory" -msgstr "" -"Nom d'utilisateur avec des privilèges de lecture sur la base sélectionnée" - -#: auths/EDirectory_enterprise/Authenticator.py:67 -#, fuzzy -msgid "eDirectory Authenticator" -msgstr "Active Directory authentificateur" - -#: auths/EDirectory_enterprise/Authenticator.py:69 -#, fuzzy -msgid "Authenticate against eDirectory" -msgstr "Authentificateur sur Active Directory" - -#: auths/EDirectory_enterprise/Authenticator.py:323 -#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 -msgid "Ldap search base is incorrect" -msgstr "Base de recherche LDAP est incorrect" - -#: auths/EDirectory_enterprise/Authenticator.py:328 -#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 -msgid "Ldap user class seems to be incorrect (no user found by that class)" -msgstr "" -"Classe d'utilisateur LDAP semble incorrect (aucun utilisateur ne trouvé par " -"cette classe)" - -#: auths/EDirectory_enterprise/Authenticator.py:336 -#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 -msgid "" -"Ldap user id attribute seems to be incorrect (no user found by that " -"attribute)" -msgstr "" -"Attribut d'id utilisateur LDAP semble incorrect (aucun utilisateur ne " -"trouvée par qui attribut)" - -#: auths/EDirectory_enterprise/Authenticator.py:344 -msgid "Expected group attribute " -msgstr "Attribut du groupe prévu " - -#: auths/EDirectory_enterprise/Authenticator.py:353 -#, fuzzy -msgid "" -"Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" -msgstr "" -"LDAP user utilisateur ou la classe id attr est probablement erroné (ne peut " -"pas trouver n'importe quel utilisateur avec les deux conditions)" - #: auths/IP/Authenticator.py:45 auths/IP/Authenticator.py:47 msgid "IP Authenticator" msgstr "Authentificateur IP" @@ -296,7 +54,7 @@ msgstr "IP " msgid "IP Range" msgstr "Plage d'adresses IP" -#: auths/IP/Authenticator.py:99 auths/InternalDB/Authenticator.py:102 +#: auths/IP/Authenticator.py:106 auths/InternalDB/Authenticator.py:102 msgid "All seems fine in the authenticator." msgstr "Tout semble fine dans l'authentificateur." @@ -312,11 +70,67 @@ msgstr "Dabasase interne authentificateur. N'utilise des sources externes" msgid "Internal structures seems ok" msgstr "Les structures internes semble ok" +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +#: services/OVirt/OVirtProvider.py:91 +msgid "Host" +msgstr "Serveur" + +#: auths/RegexLdap/Authenticator.py:49 auths/SimpleLDAP/Authenticator.py:49 +msgid "VMWare VC Server IP or Hostname" +msgstr "Le nom DNS ou l'adresse IP VC VMWare Server" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Port" +msgstr "Port" + +#: auths/RegexLdap/Authenticator.py:50 auths/SimpleLDAP/Authenticator.py:50 +msgid "Ldap port (389 for non ssl, 636 for ssl normally" +msgstr "Port LDAP (389 non SSL, 636 pour ssl normalement" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "Use SSL" +msgstr "Utiliser SSL" + +#: auths/RegexLdap/Authenticator.py:51 auths/SimpleLDAP/Authenticator.py:51 +msgid "" +"If checked, will use a ssl connection to ldap (if port is 389, will use in " +"fact port 636)" +msgstr "" +"Si cochée, utilise une connexion ssl à ldap (si le port est 389, utilisera " +"dans port de fait 636)" + +#: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 +msgid "Ldap User" +msgstr "Utilisateur LDAP" + #: auths/RegexLdap/Authenticator.py:52 auths/SimpleLDAP/Authenticator.py:52 msgid "Username with read privileges on the base selected" msgstr "" "Nom d'utilisateur avec des privilèges de lecture sur la base sélectionnée" +#: auths/RegexLdap/Authenticator.py:53 auths/RegexLdap/Authenticator.py:76 +#: auths/SimpleLDAP/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:77 +#: osmanagers/WindowsOsManager/WinDomainOsManager.py:31 +#: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 +#: services/OVirt/OVirtProvider.py:93 transports/NX/NXTransport.py:62 +#: transports/RDP/RDPTransport.py:38 transports/RDP/TSRDPTransport.py:42 +#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:58 +msgid "Password" +msgstr "Mot de passe" + +#: auths/RegexLdap/Authenticator.py:53 auths/SimpleLDAP/Authenticator.py:53 +msgid "Password of the ldap user" +msgstr "Mot de passe de l'utilisateur ldap" + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +#: services/OVirt/OVirtProvider.py:94 +msgid "Timeout" +msgstr "Temporisation" + +#: auths/RegexLdap/Authenticator.py:54 auths/SimpleLDAP/Authenticator.py:54 +msgid "Timeout in seconds of connection to LDAP" +msgstr "Délai en secondes de la connexion à LDAP" + #: auths/RegexLdap/Authenticator.py:55 auths/SimpleLDAP/Authenticator.py:55 msgid "Base" msgstr "Base" @@ -376,9 +190,44 @@ msgstr "Authentificateur LDAP Regex" msgid "Regular Expressions LDAP authenticator" msgstr "Authentificateur de LDAP d'Expressions régulière" +#: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 +#: services/OVirt/OVirtProvider.py:92 transports/NX/NXTransport.py:61 +#: transports/RDP/RDPTransport.py:37 transports/RDP/TSRDPTransport.py:41 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:57 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: auths/RegexLdap/Authenticator.py:74 auths/SimpleLDAP/Authenticator.py:75 +msgid "Group" +msgstr "Groupe" + #: auths/RegexLdap/Authenticator.py:96 msgid "Invalid regular expression" +msgstr "Expression régulière valide" + +#: auths/RegexLdap/Authenticator.py:159 auths/SimpleLDAP/Authenticator.py:158 +msgid "Ldap connection error: " +msgstr "Erreur de connexion LDAP : " + +#: auths/RegexLdap/Authenticator.py:249 auths/RegexLdap/Authenticator.py:292 +#: auths/SimpleLDAP/Authenticator.py:269 auths/SimpleLDAP/Authenticator.py:313 +msgid "Username not found" +msgstr "Nom d'utilisateur introuvable" + +#: auths/RegexLdap/Authenticator.py:309 auths/SimpleLDAP/Authenticator.py:328 +#: auths/SimpleLDAP/Authenticator.py:342 +msgid "Too many results, be more specific" +msgstr "Trop de résultats, être plus spécifique" + +#: auths/RegexLdap/Authenticator.py:329 auths/SimpleLDAP/Authenticator.py:363 +msgid "Ldap search base is incorrect" +msgstr "Base de recherche LDAP est incorrect" + +#: auths/RegexLdap/Authenticator.py:334 auths/SimpleLDAP/Authenticator.py:368 +msgid "Ldap user class seems to be incorrect (no user found by that class)" msgstr "" +"Classe d'utilisateur LDAP semble incorrect (aucun utilisateur ne trouvé par " +"cette classe)" #: auths/RegexLdap/Authenticator.py:342 auths/SimpleLDAP/Authenticator.py:376 msgid "Ldap group class seems to be incorrect (no group found by that class)" @@ -386,6 +235,14 @@ msgstr "" "Classe de groupe LDAP semble incorrect (aucun groupe ne trouvée par cette " "classe)" +#: auths/RegexLdap/Authenticator.py:350 auths/SimpleLDAP/Authenticator.py:384 +msgid "" +"Ldap user id attribute seems to be incorrect (no user found by that " +"attribute)" +msgstr "" +"Attribut d'id utilisateur LDAP semble incorrect (aucun utilisateur ne " +"trouvée par qui attribut)" + #: auths/RegexLdap/Authenticator.py:360 auths/SimpleLDAP/Authenticator.py:392 msgid "" "Ldap group id attribute seems to be incorrect (no group found by that " @@ -402,116 +259,10 @@ msgstr "" "LDAP user utilisateur ou la classe id attr est probablement erroné (ne peut " "pas trouver n'importe quel utilisateur avec les deux conditions)" -#: auths/SAML_enterprise/SAML.py:79 -#, fuzzy -msgid "SAML Authenticator" -msgstr "Authentificateur" - -#: auths/SAML_enterprise/SAML.py:91 -#, fuzzy -msgid "SAML (v2.0) Authenticator" -msgstr "Authentificateur" - -#: auths/SAML_enterprise/SAML.py:110 templates/uds/internal_page.html:28 -msgid "User" -msgstr "Utilisateur" - -#: auths/SAML_enterprise/SAML.py:119 -msgid "Private key" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:120 -msgid "" -"Private key used for sign and encription, as generated in base 64 from " -"openssl" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:121 -msgid "Certificate" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:122 -msgid "Server certificate (public), , as generated in base 64 from openssl" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:123 -msgid "IDP Metadata" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:124 -msgid "" -"You can enter here the URL or the IDP metadata or the metadata itself (xml)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:126 -msgid "Entity ID" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:127 -msgid "ID of the SP. If left blank, this will be autogenerated from server URL" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:129 -#, fuzzy -msgid "User name attrs" -msgstr "Utilisateur nom Attr" - -#: auths/SAML_enterprise/SAML.py:130 -#, fuzzy -msgid "Fields from where to extract user name" -msgstr "Expression régulière pour extraire le nom du groupe" - -#: auths/SAML_enterprise/SAML.py:132 -#, fuzzy -msgid "Group name attrs" -msgstr "Groupe nom Attr" - -#: auths/SAML_enterprise/SAML.py:133 -#, fuzzy -msgid "Fields from where to extract the groups" -msgstr "Expression régulière pour extraire le nom du groupe" - -#: auths/SAML_enterprise/SAML.py:135 -#, fuzzy -msgid "Real name attrs" -msgstr "Utilisateur nom Attr" - -#: auths/SAML_enterprise/SAML.py:136 -#, fuzzy -msgid "Fields from where to extract the real name" -msgstr "Expression régulière pour extraire le nom du groupe" - -#: auths/SAML_enterprise/SAML.py:159 -msgid "" -"Server certificate should be a valid PEM (PEM certificates starts with -----" -"BEGIN CERTIFICATE-----)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:164 -msgid "Invalid server certificate. " -msgstr "" - -#: auths/SAML_enterprise/SAML.py:167 -msgid "" -"Private key should be a valid PEM (PEM private keys starts with -----BEGIN " -"RSA PRIVATE KEY-----" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:196 -msgid "Can't fetch url {0}: {1}" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:207 -msgid " (obtained from URL)" -msgstr "" - -#: auths/SAML_enterprise/SAML.py:208 -msgid "XML do not seems valid for IDP Metadata " -msgstr "" - -#: auths/SAML_enterprise/SAML.py:224 -msgid "Can't access idp metadata" +#: auths/RegexLdap/Authenticator.py:384 auths/SimpleLDAP/Authenticator.py:423 +msgid "Connection params seem correct, test was succesfully executed" msgstr "" +"Connexion params semblent correctes, le test a été correctement exécutée" #: auths/SimpleLDAP/Authenticator.py:59 msgid "Group class" @@ -545,6 +296,10 @@ msgstr "Authentificateur SimpleLDAP" msgid "Simple LDAP authenticator" msgstr "Simple authentificateur LDAP" +#: auths/SimpleLDAP/Authenticator.py:302 +msgid "Group not found" +msgstr "Groupe introuvable" + #: auths/SimpleLDAP/Authenticator.py:410 msgid "" "Ldap group class or group id attr is probably wrong (can't find any group " @@ -615,15 +370,15 @@ msgstr "24 bits" msgid "32 bits" msgstr "32 bits" -#: core/managers/UserServiceManager.py:303 +#: core/managers/UserServiceManager.py:307 msgid "Can't cancel non running operation" msgstr "Ne peut annuler une opération non courante" -#: core/managers/UserServiceManager.py:322 +#: core/managers/UserServiceManager.py:326 msgid "Can't remove a non active element" msgstr "Impossible de supprimer un élément non actif" -#: core/managers/UserServiceManager.py:335 +#: core/managers/UserServiceManager.py:339 msgid "Can't remove nor cancel {0} cause its states doesn't allows it" msgstr "Ne peut pas supprimer ni annuler {0} cause ses États ne lui permet pas" @@ -635,7 +390,7 @@ msgstr "Gestionnaire d'OS de base" msgid "Base Manager" msgstr "Gestionnaire de base de" -#: core/transports/BaseTransport.py:113 +#: core/transports/BaseTransport.py:147 msgid "Transport empty" msgstr "Transport vide" @@ -700,6 +455,23 @@ msgstr "Fini" msgid "Waiting execution" msgstr "Exécution en attente" +#: core/util/stats/counters.py:197 +msgid "Assigned" +msgstr "Assignés" + +#: core/util/stats/counters.py:198 +#, fuzzy +msgid "In use" +msgstr "Admin" + +#: core/util/stats/counters.py:199 +msgid "Load" +msgstr "Charge" + +#: core/util/stats/counters.py:200 +msgid "Storage" +msgstr "Stockage" + #: osmanagers/LinuxOsManager/LinuxOsManager.py:45 msgid "Linux OS Manager" msgstr "Gestionnaire de système d'exploitation Linux" @@ -713,22 +485,22 @@ msgstr "" "(essentiellement renomme machine et notifier l'État)" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "On Logout" msgstr "Sur Logout" #: osmanagers/LinuxOsManager/LinuxOsManager.py:50 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:41 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 msgid "What to do when user logout from service" msgstr "Que faire quand déconnexion de l'utilisateur du service" #: osmanagers/LinuxOsManager/LinuxOsManager.py:51 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:42 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 msgid "Keep service assigned" msgstr "Garder les services affectés" #: osmanagers/LinuxOsManager/LinuxOsManager.py:52 -#: osmanagers/WindowsOsManager/WindowsOsManager.py:43 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:44 msgid "Remove service" msgstr "Retirer du service" @@ -751,8 +523,6 @@ msgstr "" #: osmanagers/WindowsOsManager/WinDomainOsManager.py:29 #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "Domain" msgstr "Domaine" @@ -815,7 +585,7 @@ msgstr "" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:29 msgid "User account to change password" -msgstr "" +msgstr "Compte d'utilisateur pour modifier le mot de passe" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #, fuzzy @@ -827,11 +597,11 @@ msgstr "Doit fournir un mot de passe du compte!!!" msgid "Must provide an user account!!!" msgstr "Doit fournir un mot de passe du compte!!!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:36 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:37 msgid "Windows Basic OS Manager" msgstr "Gestionnaire de base de Windows OS" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:38 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:39 msgid "" "Os Manager to control windows machines without domain. (Basically renames " "machine)" @@ -839,11 +609,11 @@ msgstr "" "Os Manager pour contrôler les machines windows sans domaine. " "(Essentiellement renomme machine)" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:52 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:53 msgid "Length must be numeric!!" msgstr "La longueur doit être numérique!!" -#: osmanagers/WindowsOsManager/WindowsOsManager.py:54 +#: osmanagers/WindowsOsManager/WindowsOsManager.py:55 msgid "Length must be betwen 1 and six" msgstr "La longueur doit être images 1 et six" @@ -857,26 +627,23 @@ msgstr "" #: services/OVirt/OVirtLinkedService.py:56 #, fuzzy -msgid "oVirt Linked Clone" +msgid "oVirt Linked Clone (Experimental)" msgstr "Base de clone lié VMWare" #: services/OVirt/OVirtLinkedService.py:60 -msgid "oVirt Services based on templates and COW" -msgstr "" +msgid "oVirt Services based on templates and COW (experimental)" +msgstr "oVirt Services basés sur les modèles et la vache (expérimentale)" #: services/OVirt/OVirtLinkedService.py:77 -#: services/Vmware_enterprise/VCLinkedCloneService.py:70 msgid "Number of desired machines to keep running waiting for a user" msgstr "Nombre de machines désirés de courir d'attente pour un utilisateur." #: services/OVirt/OVirtLinkedService.py:83 -#: services/Vmware_enterprise/VCLinkedCloneService.py:72 msgid "Number of desired machines to keep suspended waiting for use" msgstr "" "Nombre de machines désirés pour garder suspendu en attente pour utilisation" #: services/OVirt/OVirtLinkedService.py:99 -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 #, fuzzy msgid "Base Machine" msgstr "Gestionnaire de base de" @@ -888,11 +655,11 @@ msgstr "Machine de base" #: services/OVirt/OVirtLinkedService.py:100 msgid "Cluster" -msgstr "" +msgstr "Cluster" #: services/OVirt/OVirtLinkedService.py:106 msgid "Cluster to contain services" -msgstr "" +msgstr "Cluster pour contenir les services" #: services/OVirt/OVirtLinkedService.py:109 #, fuzzy @@ -905,13 +672,12 @@ msgid "Datastore domain where to publish and put incrementals" msgstr "Magasins de données où mettre des sauvegardes incrémentielles" #: services/OVirt/OVirtLinkedService.py:112 -#: services/Vmware_enterprise/VCLinkedCloneService.py:49 msgid "Memory (Mb)" msgstr "Mémoire (Mb)" #: services/OVirt/OVirtLinkedService.py:113 msgid "Memory assigned to machines" -msgstr "" +msgstr "Mémoire attribuée aux machines" #: services/OVirt/OVirtLinkedService.py:115 #, fuzzy @@ -920,40 +686,35 @@ msgstr "Mémoire (Mb)" #: services/OVirt/OVirtLinkedService.py:116 msgid "Physical memory guaranteed to machines" -msgstr "" +msgstr "Mémoire physique garantie aux machines" #: services/OVirt/OVirtLinkedService.py:118 -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 msgid "Machine Names" msgstr "Noms de machine" #: services/OVirt/OVirtLinkedService.py:119 -#: services/Vmware_enterprise/VCLinkedCloneService.py:54 msgid "Name Length" msgstr "Longueur du nom" #: services/OVirt/OVirtLinkedService.py:120 -#: services/Vmware_enterprise/VCLinkedCloneService.py:55 msgid "Length of numeric part for the names of this machines (betwen 3 and 6" msgstr "" "Longueur de la partie numérique pour les noms de ces machines (images 3 et 6" #: services/OVirt/OVirtLinkedService.py:122 msgid "Display" -msgstr "" +msgstr "Affichage" #: services/OVirt/OVirtLinkedService.py:123 msgid "Display type (only for administration pourposses)" -msgstr "" +msgstr "Type d'affichage (uniquement pour l'administration pourposses)" #: services/OVirt/OVirtLinkedService.py:143 -#: services/Vmware_enterprise/VCLinkedCloneService.py:93 msgid "The length of basename plus length must not be greater than 15" msgstr "" "La longueur du nom de base plus la longueur ne doit pas être supérieure à 15" #: services/OVirt/OVirtLinkedService.py:145 -#: services/Vmware_enterprise/VCLinkedCloneService.py:95 msgid "The machine name can't be only numbers" msgstr "Nom de l'ordinateur ne peut pas être uniquement des nombres" @@ -983,26 +744,22 @@ msgid "Password of the user of oVirt" msgstr "Mot de passe de l'utilisateur de la Croix de Victoria" #: services/OVirt/OVirtProvider.py:94 -#: services/Vmware_enterprise/ServiceProviderVC.py:32 msgid "Timeout in seconds of connection to VC" msgstr "Délai en secondes de connexion à VC" #: services/OVirt/OVirtProvider.py:95 -#: services/Vmware_enterprise/ServiceProviderVC.py:33 msgid "Macs range" msgstr "Gamme Mac" #: services/OVirt/OVirtProvider.py:96 -#: services/Vmware_enterprise/ServiceProviderVC.py:34 msgid "Range of valids macs for created machines" msgstr "Gamme de Mac valides pour les machines créés" -#: services/OVirt/OVirtProvider.py:395 +#: services/OVirt/OVirtProvider.py:398 msgid "Connection test successful" -msgstr "" +msgstr "Test de connexion réussie" -#: services/OVirt/OVirtProvider.py:396 -#: services/Vmware_enterprise/ServiceProviderVC.py:120 +#: services/OVirt/OVirtProvider.py:399 msgid "Connection failed. Check connection params" msgstr "Échec de la connexion. Vérifiez la connexion params" @@ -1039,135 +796,6 @@ msgstr "Rien à l'épreuve, mais tout s'est bien passé..." msgid "Random integer was 9!!! :-)" msgstr "Nombre entier aléatoire était 9!!! :-)" -#: services/Vmware_enterprise/Helpers.py:72 -msgid "Local" -msgstr "Local" - -#: services/Vmware_enterprise/Helpers.py:74 -msgid "Remote" -msgstr "Distant" - -#: services/Vmware_enterprise/PublicationVC.py:37 -msgid "Publication" -msgstr "Publication" - -#: services/Vmware_enterprise/PublicationVC.py:38 -#, fuzzy -msgid "UDS Publication for {0} created at {1}" -msgstr "Publication de l'UDS pour {0} créé à {1}" - -#: services/Vmware_enterprise/ServiceProviderVC.py:29 -msgid "VMWare VC Server Port (usually 443)" -msgstr "Port du serveur VMWare VC (habituellement 443)" - -#: services/Vmware_enterprise/ServiceProviderVC.py:30 -#, fuzzy -msgid "User with valid privileges on VC" -msgstr "" -"Nom d'utilisateur avec des privilèges de lecture sur la base sélectionnée" - -#: services/Vmware_enterprise/ServiceProviderVC.py:31 -#, fuzzy -msgid "Password of the user of the VC" -msgstr "Mot de passe de l'utilisateur de la Croix de Victoria" - -#: services/Vmware_enterprise/ServiceProviderVC.py:39 -#, fuzzy -msgid "VMWare Virtual Center Provider" -msgstr "VmwareVC fournisseur : " - -#: services/Vmware_enterprise/ServiceProviderVC.py:41 -msgid "Provides connection to Virtual Center Services" -msgstr "Fournit la connexion aux Services du Centre virtuel" - -#: services/Vmware_enterprise/ServiceProviderVC.py:110 -msgid "Error testing connection" -msgstr "Connexion essai erreur" - -#: services/Vmware_enterprise/ServiceProviderVC.py:113 -msgid "VmwareVC Provider: " -msgstr "VmwareVC fournisseur : " - -#: services/Vmware_enterprise/ServiceProviderVC.py:119 -msgid "Connection params ok" -msgstr "Connexion params ok" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:28 -msgid "Datacenter" -msgstr "Datacenter" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:34 -msgid "Datacenter containing base machine" -msgstr "Machine de base contenant Datacenter" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:36 -msgid "Network" -msgstr "Réseau" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:37 -msgid "" -"If more than 1 interface is found in machine, use one on this network as main" -msgstr "" -"Si plus de 1 interface est trouvé dans la machine, utilisez l'une sur ce " -"réseau comme principal" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Pub. Resource Pool" -msgstr "Pub. Ressource Pool" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:38 -msgid "Resource Pool where deploy clones" -msgstr "Ressource Pool déployer où les clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Clones Folder" -msgstr "Dossier de clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:39 -msgid "Folder where deploy clones" -msgstr "Dossier où déployer clones" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:40 -msgid "Resource Pool" -msgstr "Ressource Pool" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:46 -msgid "Resource Pool containing base machine" -msgstr "Machine base contenant de ressource Pool" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:48 -msgid "Base machine for this service" -msgstr "Machine de base pour ce service." - -#: services/Vmware_enterprise/VCLinkedCloneService.py:50 -msgid "Memory for machines deployed from this service" -msgstr "Mémoire pour les machines déployés à partir de ce service" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:51 -#, fuzzy -msgid "Datastores" -msgstr "Magasins de données" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:52 -#, fuzzy -msgid "Datastores where to put incrementals" -msgstr "Magasins de données où mettre des sauvegardes incrémentielles" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:53 -msgid "Base name for clones from this machine" -msgstr "Nom de base des clones de cette machine." - -#: services/Vmware_enterprise/VCLinkedCloneService.py:62 -#, fuzzy -msgid "VMWare Linked clone base" -msgstr "Base de clone lié VMWare" - -#: services/Vmware_enterprise/VCLinkedCloneService.py:64 -msgid "" -"This service provides access to Linked Clones machines on a Virtual Center" -msgstr "" -"Ce service donne accès aux machines de Clones liés sur un centre virtuel" - #: templates/404.html:4 templates/404.html.py:7 msgid "Page not found" msgstr "Page non trouvée" @@ -1182,11 +810,11 @@ msgstr "UDS" #: templates/uds/detectJava.html:6 msgid "Login redirection" -msgstr "" +msgstr "Redirection de connexion" #: templates/uds/detectJava.html:38 msgid "Go to main page" -msgstr "" +msgstr "Aller à la page d'accueil" #: templates/uds/downloads.html:8 templates/uds/snippets/admin_user.html:7 msgid "Downloads" @@ -1238,6 +866,10 @@ msgstr "Réseaux" msgid "Transports" msgstr "Transports" +#: templates/uds/internal_page.html:28 +msgid "User" +msgstr "Utilisateur" + #: templates/uds/internal_page.html:34 templates/uds/prefs.html:12 msgid "Preferences" msgstr "Préférences" @@ -1301,38 +933,26 @@ msgid "NX Transport for direct connection" msgstr "NX Transport pour une connexion directe" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Références vide" #: transports/NX/NXTransport.py:60 transports/RDP/RDPTransport.py:36 -#: transports/RDP/TSRDPTransport.py:40 -#: transports/RGS-enterprise/RGSTransport.py:41 -#: transports/RGS-enterprise/TRGSTransport.py:46 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/RDP/TSRDPTransport.py:40 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Si coché, les informations d'identification utilisées pour se connecter sera " "vide" #: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:37 -#: transports/RDP/TSRDPTransport.py:41 -#: transports/RGS-enterprise/RGSTransport.py:42 -#: transports/RGS-enterprise/TRGSTransport.py:47 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/RDP/TSRDPTransport.py:41 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Si ce n'est vide, ce nom d'utilisateur sera toujours utilisé comme des " "titres de compétences" #: transports/NX/NXTransport.py:62 transports/RDP/RDPTransport.py:38 -#: transports/RDP/TSRDPTransport.py:42 -#: transports/RGS-enterprise/RGSTransport.py:43 -#: transports/RGS-enterprise/TRGSTransport.py:48 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/RDP/TSRDPTransport.py:42 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "" "Si ce n'est vide, ce mot de passe sera toujours utilisé comme des titres de " @@ -1386,7 +1006,7 @@ msgstr "Protocole de NX" msgid "UDS Actor connector for NX (requires nomachine packages)" msgstr "Connecteur UDS acteur pour NX (nécessite nomachine packages)" -#: transports/NX/web.py:74 +#: transports/NX/web.py:75 msgid "" "In order to use this transport, you need to install first Nomachine Nx " "Client version 3.5.x" @@ -1394,11 +1014,11 @@ msgstr "" "Afin d'utiliser ce transport, vous devez installer le premier Nomachine Nx " "Client version 3.5.x" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "you can obtain it for your platform from" msgstr "vous pouvez l'obtenir pour votre plate-forme de" -#: transports/NX/web.py:75 +#: transports/NX/web.py:76 msgid "nochamine web site" msgstr "site web de nochamine" @@ -1411,8 +1031,6 @@ msgid "RDP Transport for direct connection" msgstr "Transport de RDP pour une connexion directe" #: transports/RDP/RDPTransport.py:39 transports/RDP/TSRDPTransport.py:43 -#: transports/RGS-enterprise/RGSTransport.py:44 -#: transports/RGS-enterprise/TRGSTransport.py:49 msgid "" "If not empty, this domain will be always used as credential (used as DOMAIN" "\\user)" @@ -1463,15 +1081,11 @@ msgstr "Transport de RDP (tunnel)" msgid "RDP Transport for tunneled connection" msgstr "Transport de RDP de connexion tunnelée" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "Tunnel server" msgstr "Serveur de tunnel" -#: transports/RDP/TSRDPTransport.py:37 -#: transports/RGS-enterprise/TRGSTransport.py:43 -#: transports/TSNX/TSNXTransport.py:62 +#: transports/RDP/TSRDPTransport.py:37 transports/TSNX/TSNXTransport.py:62 msgid "" "IP or Hostname of tunnel server send to client device (\"public\" ip) and " "port. (use HOST:PORT format)" @@ -1479,15 +1093,11 @@ msgstr "" "IP ou nom d'hôte du serveur de tunnel envoyer à la machine cliente (« public " "» ip) et port. (utilisez le format de l'hôte : PORT)" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "Tunnel host check" msgstr "Tunnel hôte cocher" -#: transports/RDP/TSRDPTransport.py:38 -#: transports/RGS-enterprise/TRGSTransport.py:44 -#: transports/TSNX/TSNXTransport.py:63 +#: transports/RDP/TSRDPTransport.py:38 transports/TSNX/TSNXTransport.py:63 msgid "" "If not empty, this server will be used to check if service is running before " "assigning it to user. (use HOST:PORT format)" @@ -1500,144 +1110,18 @@ msgstr "" msgid "Remote Desktop Protocol" msgstr "Protocole Bureau distant" -#: transports/RDP/web.py:83 +#: transports/RDP/web.py:84 msgid "In order to use this service, you should first install CoRD." msgstr "Afin d'utiliser ce service, vous devez d'abord installer cordon." -#: transports/RDP/web.py:84 transports/RGS-enterprise/web.py:82 +#: transports/RDP/web.py:85 msgid "You can obtain it from" msgstr "Vous pouvez l'obtenir de" -#: transports/RDP/web.py:84 +#: transports/RDP/web.py:85 msgid "CoRD Website" msgstr "Site Web du cordon" -#: transports/RGS-enterprise/RGSTransport.py:34 -#, fuzzy -msgid "RGS Transport (direct)" -msgstr "Transport de RDP (direct)" - -#: transports/RGS-enterprise/RGSTransport.py:36 -#, fuzzy -msgid "RGS Transport for direct connection" -msgstr "Transport de RDP pour une connexion directe" - -#: transports/RGS-enterprise/RGSTransport.py:45 -#: transports/RGS-enterprise/TRGSTransport.py:50 -msgid "Image quality" -msgstr "Qualité de l'image" - -#: transports/RGS-enterprise/RGSTransport.py:46 -#: transports/RGS-enterprise/TRGSTransport.py:51 -msgid "Quality of image codec (0-100)" -msgstr "Qualité du codec d'image (0-100)" - -#: transports/RGS-enterprise/RGSTransport.py:47 -#: transports/RGS-enterprise/TRGSTransport.py:52 -msgid "Adjustable Quality" -msgstr "Qualité réglable" - -#: transports/RGS-enterprise/RGSTransport.py:48 -#: transports/RGS-enterprise/TRGSTransport.py:53 -msgid "If checked, the image quality will be adjustable with bandwidth" -msgstr "Si cochée, la qualité de l'image sera réglable avec bande passante" - -#: transports/RGS-enterprise/RGSTransport.py:49 -#: transports/RGS-enterprise/TRGSTransport.py:54 -msgid "Min. Adjustable Quality" -msgstr "Min. qualité réglable" - -#: transports/RGS-enterprise/RGSTransport.py:50 -#: transports/RGS-enterprise/TRGSTransport.py:55 -msgid "" -"The lowest image quality applied to images to maintain the minimum update " -"rate." -msgstr "" -"La qualité de l'image plus bas appliquée aux images afin de maintenir la " -"mise à jour minimum taux." - -#: transports/RGS-enterprise/RGSTransport.py:51 -#: transports/RGS-enterprise/TRGSTransport.py:56 -msgid "Adjustable Frame Rate" -msgstr "Cadence réglable" - -#: transports/RGS-enterprise/RGSTransport.py:52 -#: transports/RGS-enterprise/TRGSTransport.py:57 -msgid "Update rate threshold to begin adjusting image quality" -msgstr "" -"Seuil de vitesse de mise à jour pour commencer à ajuster la qualité de " -"l'image" - -#: transports/RGS-enterprise/RGSTransport.py:53 -#: transports/RGS-enterprise/TRGSTransport.py:58 -msgid "Match Local Resolution" -msgstr "Résolution locale de match" - -#: transports/RGS-enterprise/RGSTransport.py:54 -#: transports/RGS-enterprise/TRGSTransport.py:59 -msgid "" -"Change the Sender's resolution to match the Receiver's resolution when " -"connecting" -msgstr "" -"Modifier la résolution de l'expéditeur pour faire correspondre la résolution " -"du séquestre lors de la connexion" - -#: transports/RGS-enterprise/RGSTransport.py:55 -#: transports/RGS-enterprise/TRGSTransport.py:60 -msgid "Redirect USB" -msgstr "Redirection USB" - -#: transports/RGS-enterprise/RGSTransport.py:56 -#: transports/RGS-enterprise/TRGSTransport.py:61 -msgid "If checked, the USB will be redirected." -msgstr "Si cochée, la clé USB est redirigée." - -#: transports/RGS-enterprise/RGSTransport.py:57 -#: transports/RGS-enterprise/TRGSTransport.py:62 -msgid "Redirect Audio" -msgstr "Redirection Audio" - -#: transports/RGS-enterprise/RGSTransport.py:58 -#: transports/RGS-enterprise/TRGSTransport.py:63 -#, fuzzy -msgid "If checked, the Audio will be redirected." -msgstr "" -"Si coché, les informations d'identification utilisées pour se connecter sera " -"vide" - -#: transports/RGS-enterprise/RGSTransport.py:59 -#: transports/RGS-enterprise/TRGSTransport.py:64 -msgid "Redirect Mic" -msgstr "Redirection Mic" - -#: transports/RGS-enterprise/RGSTransport.py:60 -#: transports/RGS-enterprise/TRGSTransport.py:65 -#, fuzzy -msgid "If checked, the Mic will be redirected." -msgstr "" -"Si coché, les informations d'identification utilisées pour se connecter sera " -"vide" - -#: transports/RGS-enterprise/TRGSTransport.py:36 -#, fuzzy -msgid "RGS Transport (tunneled)" -msgstr "Transport de RDP (tunnel)" - -#: transports/RGS-enterprise/TRGSTransport.py:38 -#, fuzzy -msgid "RGS Transport for tunneled connection" -msgstr "Transport de RDP de connexion tunnelée" - -#: transports/RGS-enterprise/web.py:81 -#, fuzzy -msgid "In order to use this service, you should first install RGS Receiver." -msgstr "Afin d'utiliser ce service, vous devez d'abord installer cordon." - -#: transports/RGS-enterprise/web.py:82 -#, fuzzy -msgid "HP Website" -msgstr "Site Web du cordon" - #: transports/TSNX/TSNXTransport.py:55 msgid "NX Transport (tunneled)" msgstr "Transport NX (tunnel)" @@ -1658,7 +1142,8 @@ msgstr "Transport introuvable" msgid "Service not found" msgstr "Service introuvable" -#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:171 +#: web/errors.py:61 xmlrpc/auths/AdminAuth.py:183 +#: xmlrpc/auths/AdminAuth.py:189 msgid "Access denied" msgstr "Accès refusé" @@ -1688,11 +1173,11 @@ msgstr "Service utilisateur introuvable" msgid "Authenticator not found" msgstr "Authentificateur" -#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:169 +#: web/errors.py:67 xmlrpc/auths/AdminAuth.py:174 msgid "Invalid authenticator" msgstr "Authentificateur non valide" -#: web/views.py:334 +#: web/views.py:359 #, fuzzy msgid "Authenticator do not provides information" msgstr "Authentificateur n'existe pas" @@ -1701,15 +1186,15 @@ msgstr "Authentificateur n'existe pas" msgid "Authenticator" msgstr "Authentificateur" -#: xmlrpc/auths/AdminAuth.py:113 +#: xmlrpc/auths/AdminAuth.py:116 msgid "Credentials no longer valid" msgstr "Informations d'identification n'est plus valides" -#: xmlrpc/auths/AdminAuth.py:149 +#: xmlrpc/auths/AdminAuth.py:152 msgid "Administration" msgstr "Administration" -#: xmlrpc/auths/AdminAuth.py:164 +#: xmlrpc/auths/AdminAuth.py:169 msgid "Invalid credentials" msgstr "Informations d'identification non valides" @@ -1717,7 +1202,7 @@ msgstr "Informations d'identification non valides" msgid "Authenticator does not exists" msgstr "Authentificateur n'existe pas" -#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:115 +#: xmlrpc/auths/Authenticators.py:161 xmlrpc/osmanagers/OSManagers.py:116 #: xmlrpc/services/ServiceProviders.py:115 #: xmlrpc/services/ServiceProviders.py:139 xmlrpc/services/Services.py:160 #: xmlrpc/services/Services.py:184 xmlrpc/transports/Networks.py:86 @@ -1738,19 +1223,24 @@ msgstr "Authentificateur spécifiée n'existe pas plus. Veuillez recharger gui" msgid "BUG: Reached a point that should never have been reached!!!" msgstr "BOGUE : Atteint un point qui devrait jamais été atteint!!!" -#: xmlrpc/osmanagers/OSManagers.py:129 +#: xmlrpc/log/logs.py:53 xmlrpc/stats/stats.py:70 +#, fuzzy +msgid "Service does not exists" +msgstr "Service déployée n'existe pas" + +#: xmlrpc/osmanagers/OSManagers.py:130 msgid "This os mnager is being used by deployed services" msgstr "" "Ce gestionnaire de système d'exploitation est utilisé par les services de " "déploiements" -#: xmlrpc/osmanagers/OSManagers.py:145 +#: xmlrpc/osmanagers/OSManagers.py:146 msgid "There is deployed services using this os manager" msgstr "" "Il y a des services déployées à l'aide de ce gestionnaire de système " "d'exploitation" -#: xmlrpc/osmanagers/OSManagers.py:147 +#: xmlrpc/osmanagers/OSManagers.py:148 msgid "Can't find os manager" msgstr "Impossible de trouver os gestionnaire" @@ -1807,30 +1297,30 @@ msgstr "Impossible de supprimer les services avec des services déployés liés" msgid "Can't locate the service" msgstr "Impossible de localiser le service" -#: xmlrpc/services/UserDeployedServices.py:94 -#: xmlrpc/services/UserDeployedServices.py:110 +#: xmlrpc/services/UserDeployedServices.py:100 +#: xmlrpc/services/UserDeployedServices.py:116 msgid "The deployed service is not active" msgstr "Le service de déploiement n'est pas actif" -#: xmlrpc/services/UserDeployedServices.py:97 -#: xmlrpc/services/UserDeployedServices.py:113 +#: xmlrpc/services/UserDeployedServices.py:103 +#: xmlrpc/services/UserDeployedServices.py:119 msgid "This service don't allows assignations" msgstr "Ce service ne permet l'assignation" -#: xmlrpc/services/UserDeployedServices.py:102 -#: xmlrpc/services/UserDeployedServices.py:120 +#: xmlrpc/services/UserDeployedServices.py:108 +#: xmlrpc/services/UserDeployedServices.py:126 msgid "Deployed service not found!!! (refresh interface)" msgstr "Déployées service introuvable!!! (actualisation interface)" -#: xmlrpc/services/UserDeployedServices.py:122 +#: xmlrpc/services/UserDeployedServices.py:128 msgid "User not found!!! (refresh interface)" msgstr "Utilisateur introuvable!!! (actualisation interface)" -#: xmlrpc/services/UserDeployedServices.py:141 +#: xmlrpc/services/UserDeployedServices.py:147 msgid "No error" msgstr "Pas d'erreur" -#: xmlrpc/services/UserDeployedServices.py:147 +#: xmlrpc/services/UserDeployedServices.py:153 msgid "User deployed service not found!!!" msgstr "Service de l'utilisateur ne se trouve pas déployée!!!" @@ -1842,6 +1332,292 @@ msgstr "Impossible de localiser le transport" msgid "Can't locate the network" msgstr "Impossible de localiser le réseau" +#~ msgid "If checked, will use a ssl connection to Active Directory" +#~ msgstr "" +#~ "Si elle est cochée, va utiliser une connexion SSL à Active Directory" + +#~ msgid "" +#~ "Username with read privileges on the base selected (use USER@DOMAIN.DOM " +#~ "form for this)" +#~ msgstr "" +#~ "Nom d'utilisateur avec des privilèges lire sur la base choisie (utiliser " +#~ "le format USER@DOMAIN.DOMpour cela)" + +#~ msgid "Active Directory Authenticator" +#~ msgstr "Active Directory authentificateur" + +#, fuzzy +#~ msgid "Authenticate against Active Directory" +#~ msgstr "Authentificateur sur Active Directory" + +#~ msgid "Must specify the username in the form USERNAME@DOMAIN.DOM" +#~ msgstr "" +#~ "Doit spécifier le nom d'utilisateur sous la forme NOMDEUTILISEUR@DOMAINE." +#~ "DOM" + +#~ msgid "Domain seems to be incorrect, please check it" +#~ msgstr "Domaine semble incorrect, veuillez vérifier" + +#~ msgid "Ldap does not seem an Active Directory (do not have user objects)" +#~ msgstr "" +#~ "LDAP ne semble pas un serveur Active Directory (n'ont pas les objets " +#~ "utilisateur)" + +#~ msgid "Ldap does not seem an Active Directory (no not have group objects)" +#~ msgstr "" +#~ "LDAP ne semble pas un serveur Active Directory (ne pas ont les objets de " +#~ "groupe)" + +#~ msgid "" +#~ "Ldap does not seem an Active Directory (do not have any user nor groups)" +#~ msgstr "" +#~ "LDAP ne semble pas un serveur Active Directory (n'ont pas tout " +#~ "utilisateur ni les groupes)" + +#, fuzzy +#~ msgid "Username with read privileges on the eDirectory" +#~ msgstr "" +#~ "Nom d'utilisateur avec des privilèges de lecture sur la base sélectionnée" + +#, fuzzy +#~ msgid "eDirectory Authenticator" +#~ msgstr "Active Directory authentificateur" + +#, fuzzy +#~ msgid "Authenticate against eDirectory" +#~ msgstr "Authentificateur sur Active Directory" + +#~ msgid "Expected group attribute " +#~ msgstr "Attribut du groupe prévu " + +#, fuzzy +#~ msgid "" +#~ "Ldap user class or user id attr is probably wrong (Ldap is an eDirectory?)" +#~ msgstr "" +#~ "LDAP user utilisateur ou la classe id attr est probablement erroné (ne " +#~ "peut pas trouver n'importe quel utilisateur avec les deux conditions)" + +#, fuzzy +#~ msgid "SAML Authenticator" +#~ msgstr "Authentificateur" + +#, fuzzy +#~ msgid "SAML (v2.0) Authenticator" +#~ msgstr "Authentificateur" + +#, fuzzy +#~ msgid "User name attrs" +#~ msgstr "Utilisateur nom Attr" + +#, fuzzy +#~ msgid "Fields from where to extract user name" +#~ msgstr "Expression régulière pour extraire le nom du groupe" + +#, fuzzy +#~ msgid "Group name attrs" +#~ msgstr "Groupe nom Attr" + +#, fuzzy +#~ msgid "Fields from where to extract the groups" +#~ msgstr "Expression régulière pour extraire le nom du groupe" + +#, fuzzy +#~ msgid "Real name attrs" +#~ msgstr "Utilisateur nom Attr" + +#, fuzzy +#~ msgid "Fields from where to extract the real name" +#~ msgstr "Expression régulière pour extraire le nom du groupe" + +#~ msgid "Local" +#~ msgstr "Local" + +#~ msgid "Remote" +#~ msgstr "Distant" + +#~ msgid "Publication" +#~ msgstr "Publication" + +#, fuzzy +#~ msgid "UDS Publication for {0} created at {1}" +#~ msgstr "Publication de l'UDS pour {0} créé à {1}" + +#~ msgid "VMWare VC Server Port (usually 443)" +#~ msgstr "Port du serveur VMWare VC (habituellement 443)" + +#, fuzzy +#~ msgid "User with valid privileges on VC" +#~ msgstr "" +#~ "Nom d'utilisateur avec des privilèges de lecture sur la base sélectionnée" + +#, fuzzy +#~ msgid "Password of the user of the VC" +#~ msgstr "Mot de passe de l'utilisateur de la Croix de Victoria" + +#, fuzzy +#~ msgid "VMWare Virtual Center Provider" +#~ msgstr "VmwareVC fournisseur : " + +#~ msgid "Provides connection to Virtual Center Services" +#~ msgstr "Fournit la connexion aux Services du Centre virtuel" + +#~ msgid "Error testing connection" +#~ msgstr "Connexion essai erreur" + +#~ msgid "VmwareVC Provider: " +#~ msgstr "VmwareVC fournisseur : " + +#~ msgid "Connection params ok" +#~ msgstr "Connexion params ok" + +#~ msgid "Datacenter" +#~ msgstr "Datacenter" + +#~ msgid "Datacenter containing base machine" +#~ msgstr "Machine de base contenant Datacenter" + +#~ msgid "Network" +#~ msgstr "Réseau" + +#~ msgid "" +#~ "If more than 1 interface is found in machine, use one on this network as " +#~ "main" +#~ msgstr "" +#~ "Si plus de 1 interface est trouvé dans la machine, utilisez l'une sur ce " +#~ "réseau comme principal" + +#~ msgid "Pub. Resource Pool" +#~ msgstr "Pub. Ressource Pool" + +#~ msgid "Resource Pool where deploy clones" +#~ msgstr "Ressource Pool déployer où les clones" + +#~ msgid "Clones Folder" +#~ msgstr "Dossier de clones" + +#~ msgid "Folder where deploy clones" +#~ msgstr "Dossier où déployer clones" + +#~ msgid "Resource Pool" +#~ msgstr "Ressource Pool" + +#~ msgid "Resource Pool containing base machine" +#~ msgstr "Machine base contenant de ressource Pool" + +#~ msgid "Base machine for this service" +#~ msgstr "Machine de base pour ce service." + +#~ msgid "Memory for machines deployed from this service" +#~ msgstr "Mémoire pour les machines déployés à partir de ce service" + +#, fuzzy +#~ msgid "Datastores" +#~ msgstr "Magasins de données" + +#, fuzzy +#~ msgid "Datastores where to put incrementals" +#~ msgstr "Magasins de données où mettre des sauvegardes incrémentielles" + +#~ msgid "Base name for clones from this machine" +#~ msgstr "Nom de base des clones de cette machine." + +#, fuzzy +#~ msgid "VMWare Linked clone base" +#~ msgstr "Base de clone lié VMWare" + +#~ msgid "" +#~ "This service provides access to Linked Clones machines on a Virtual Center" +#~ msgstr "" +#~ "Ce service donne accès aux machines de Clones liés sur un centre virtuel" + +#, fuzzy +#~ msgid "RGS Transport (direct)" +#~ msgstr "Transport de RDP (direct)" + +#, fuzzy +#~ msgid "RGS Transport for direct connection" +#~ msgstr "Transport de RDP pour une connexion directe" + +#~ msgid "Image quality" +#~ msgstr "Qualité de l'image" + +#~ msgid "Quality of image codec (0-100)" +#~ msgstr "Qualité du codec d'image (0-100)" + +#~ msgid "Adjustable Quality" +#~ msgstr "Qualité réglable" + +#~ msgid "If checked, the image quality will be adjustable with bandwidth" +#~ msgstr "Si cochée, la qualité de l'image sera réglable avec bande passante" + +#~ msgid "Min. Adjustable Quality" +#~ msgstr "Min. qualité réglable" + +#~ msgid "" +#~ "The lowest image quality applied to images to maintain the minimum update " +#~ "rate." +#~ msgstr "" +#~ "La qualité de l'image plus bas appliquée aux images afin de maintenir la " +#~ "mise à jour minimum taux." + +#~ msgid "Adjustable Frame Rate" +#~ msgstr "Cadence réglable" + +#~ msgid "Update rate threshold to begin adjusting image quality" +#~ msgstr "" +#~ "Seuil de vitesse de mise à jour pour commencer à ajuster la qualité de " +#~ "l'image" + +#~ msgid "Match Local Resolution" +#~ msgstr "Résolution locale de match" + +#~ msgid "" +#~ "Change the Sender's resolution to match the Receiver's resolution when " +#~ "connecting" +#~ msgstr "" +#~ "Modifier la résolution de l'expéditeur pour faire correspondre la " +#~ "résolution du séquestre lors de la connexion" + +#~ msgid "Redirect USB" +#~ msgstr "Redirection USB" + +#~ msgid "If checked, the USB will be redirected." +#~ msgstr "Si cochée, la clé USB est redirigée." + +#~ msgid "Redirect Audio" +#~ msgstr "Redirection Audio" + +#, fuzzy +#~ msgid "If checked, the Audio will be redirected." +#~ msgstr "" +#~ "Si coché, les informations d'identification utilisées pour se connecter " +#~ "sera vide" + +#~ msgid "Redirect Mic" +#~ msgstr "Redirection Mic" + +#, fuzzy +#~ msgid "If checked, the Mic will be redirected." +#~ msgstr "" +#~ "Si coché, les informations d'identification utilisées pour se connecter " +#~ "sera vide" + +#, fuzzy +#~ msgid "RGS Transport (tunneled)" +#~ msgstr "Transport de RDP (tunnel)" + +#, fuzzy +#~ msgid "RGS Transport for tunneled connection" +#~ msgstr "Transport de RDP de connexion tunnelée" + +#, fuzzy +#~ msgid "In order to use this service, you should first install RGS Receiver." +#~ msgstr "Afin d'utiliser ce service, vous devez d'abord installer cordon." + +#, fuzzy +#~ msgid "HP Website" +#~ msgstr "Site Web du cordon" + #~ msgid "None OS Manager" #~ msgstr "Aucun gestionnaire de l'OS" diff --git a/server/src/uds/migrations/0011_auto__add_statscounters__add_statsevents__chg_field_log_created__chg_f.py b/server/src/uds/migrations/0011_auto__add_statscounters__add_statsevents__chg_field_log_created__chg_f.py new file mode 100644 index 00000000..7821f6c5 --- /dev/null +++ b/server/src/uds/migrations/0011_auto__add_statscounters__add_statsevents__chg_field_log_created__chg_f.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'StatsCounters' + db.create_table('uds_stats_c', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('owner_id', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)), + ('owner_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0, db_index=True)), + ('counter_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0, db_index=True)), + ('stamp', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)), + ('value', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)), + )) + db.send_create_signal('uds', ['StatsCounters']) + + # Adding model 'StatsEvents' + db.create_table('uds_stats_e', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('owner_id', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)), + ('owner_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0, db_index=True)), + ('event_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0, db_index=True)), + ('stamp', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)), + )) + db.send_create_signal('uds', ['StatsEvents']) + + # Adding index on 'UserService', fields ['state_date'] + db.create_index('uds__user_service', ['state_date']) + + + # Changing field 'Log.created' + db.alter_column('uds_log', 'created', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Log.owner_type' + db.alter_column('uds_log', 'owner_type', self.gf('django.db.models.fields.SmallIntegerField')()) + # Adding index on 'Config', fields ['section'] + db.create_index('uds_configuration', ['section']) + + # Adding index on 'Config', fields ['key'] + db.create_index('uds_configuration', ['key']) + + from uds.models import Config + try: + Config.objects.get(section='UDS', key='maxRemovinggServices').delete() + except: + pass + + + def backwards(self, orm): + # Removing index on 'Config', fields ['key'] + db.delete_index('uds_configuration', ['key']) + + # Removing index on 'Config', fields ['section'] + db.delete_index('uds_configuration', ['section']) + + # Removing index on 'UserService', fields ['state_date'] + db.delete_index('uds__user_service', ['state_date']) + + # Deleting model 'StatsCounters' + db.delete_table('uds_stats_c') + + # Deleting model 'StatsEvents' + db.delete_table('uds_stats_e') + + + # Changing field 'Log.created' + db.alter_column('uds_log', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True)) + + # Changing field 'Log.owner_type' + db.alter_column('uds_log', 'owner_type', self.gf('django.db.models.fields.IntegerField')()) + + models = { + 'uds.authenticator': { + 'Meta': {'ordering': "('name',)", 'object_name': 'Authenticator'}, + 'comments': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + 'uds.cache': { + 'Meta': {'object_name': 'Cache', 'db_table': "'uds_utility_cache'"}, + 'created': ('django.db.models.fields.DateTimeField', [], {}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'validity': ('django.db.models.fields.IntegerField', [], {'default': '60'}), + 'value': ('django.db.models.fields.TextField', [], {'default': "''"}) + }, + 'uds.config': { + 'Meta': {'unique_together': "(('section', 'key'),)", 'object_name': 'Config', 'db_table': "'uds_configuration'"}, + 'crypt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'long': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'value': ('django.db.models.fields.TextField', [], {'default': "''"}) + }, + 'uds.delayedtask': { + 'Meta': {'object_name': 'DelayedTask'}, + 'execution_delay': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'execution_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'insert_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'instance': ('django.db.models.fields.TextField', [], {}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'uds.deployedservice': { + 'Meta': {'object_name': 'DeployedService', 'db_table': "'uds__deployed_service'"}, + 'assignedGroups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'deployedServices'", 'symmetrical': 'False', 'db_table': "'uds__ds_grps'", 'to': "orm['uds.Group']"}), + 'cache_l1_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cache_l2_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'comments': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), + 'current_pub_revision': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'initial_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'max_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}), + 'osmanager': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deployedServices'", 'null': 'True', 'to': "orm['uds.OSManager']"}), + 'service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deployedServices'", 'null': 'True', 'to': "orm['uds.Service']"}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'transports': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'deployedServices'", 'symmetrical': 'False', 'db_table': "'uds__ds_trans'", 'to': "orm['uds.Transport']"}) + }, + 'uds.deployedservicepublication': { + 'Meta': {'ordering': "('publish_date',)", 'object_name': 'DeployedServicePublication', 'db_table': "'uds__deployed_service_pub'"}, + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'deployed_service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'publications'", 'to': "orm['uds.DeployedService']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'publish_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'P'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {}) + }, + 'uds.group': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('manager', 'name'),)", 'object_name': 'Group'}, + 'comments': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'manager': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'groups'", 'to': "orm['uds.Authenticator']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length': '1', 'db_index': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'groups'", 'symmetrical': 'False', 'to': "orm['uds.User']"}) + }, + 'uds.log': { + 'Meta': {'object_name': 'Log'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'data': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "'internal'", 'max_length': '16', 'db_index': 'True'}) + }, + 'uds.network': { + 'Meta': {'object_name': 'Network'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), + 'net_end': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}), + 'net_start': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}), + 'transports': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'networks'", 'symmetrical': 'False', 'db_table': "'uds_net_trans'", 'to': "orm['uds.Transport']"}) + }, + 'uds.osmanager': { + 'Meta': {'ordering': "('name',)", 'object_name': 'OSManager'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}) + }, + 'uds.provider': { + 'Meta': {'ordering': "('name',)", 'object_name': 'Provider'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}) + }, + 'uds.scheduler': { + 'Meta': {'object_name': 'Scheduler'}, + 'frecuency': ('django.db.models.fields.PositiveIntegerField', [], {'default': '86400'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_execution': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), + 'next_execution': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)', 'db_index': 'True'}), + 'owner_server': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64', 'db_index': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'X'", 'max_length': '1', 'db_index': 'True'}) + }, + 'uds.service': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('provider', 'name'),)", 'object_name': 'Service'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'provider': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'services'", 'to': "orm['uds.Provider']"}) + }, + 'uds.statscounters': { + 'Meta': {'object_name': 'StatsCounters', 'db_table': "'uds_stats_c'"}, + 'counter_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'stamp': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'value': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + 'uds.statsevents': { + 'Meta': {'object_name': 'StatsEvents', 'db_table': "'uds_stats_e'"}, + 'event_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'stamp': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + 'uds.storage': { + 'Meta': {'object_name': 'Storage'}, + 'attr1': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}) + }, + 'uds.transport': { + 'Meta': {'ordering': "('name',)", 'object_name': 'Transport'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}), + 'nets_positive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + 'uds.uniqueid': { + 'Meta': {'ordering': "('-seq',)", 'unique_together': "(('basename', 'seq'),)", 'object_name': 'UniqueId'}, + 'assigned': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'basename': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'db_index': 'True'}), + 'seq': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}) + }, + 'uds.user': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('manager', 'name'),)", 'object_name': 'User'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_access': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'manager': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'users'", 'to': "orm['uds.Authenticator']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'staff_member': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '1', 'db_index': 'True'}) + }, + 'uds.userpreference': { + 'Meta': {'object_name': 'UserPreference'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'module': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'preferences'", 'to': "orm['uds.User']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}) + }, + 'uds.userservice': { + 'Meta': {'ordering': "('creation_date',)", 'object_name': 'UserService', 'db_table': "'uds__user_service'"}, + 'cache_level': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'deployed_service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'userServices'", 'to': "orm['uds.DeployedService']"}), + 'friendly_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'in_use': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'in_use_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'os_state': ('django.db.models.fields.CharField', [], {'default': "'P'", 'max_length': '1'}), + 'publication': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'userServices'", 'null': 'True', 'to': "orm['uds.DeployedServicePublication']"}), + 'src_hostname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}), + 'src_ip': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '15'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'P'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'unique_id': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'userServices'", 'null': 'True', 'blank': 'True', 'to': "orm['uds.User']"}) + } + } + + complete_apps = ['uds'] \ No newline at end of file diff --git a/server/src/uds/models.py b/server/src/uds/models.py index fab2fe15..17b1048e 100644 --- a/server/src/uds/models.py +++ b/server/src/uds/models.py @@ -35,20 +35,22 @@ from django.db import models from django.db.models import signals from uds.core.jobs.JobsFactory import JobsFactory from uds.core.Environment import Environment -from uds.core.util.db.LockingManager import LockingManager +from uds.core.db.LockingManager import LockingManager from uds.core.util.State import State from uds.core.util import log from uds.core.services.Exceptions import InvalidServiceException from datetime import datetime, timedelta +from time import mktime import logging logger = logging.getLogger(__name__) NEVER = datetime(1972, 7, 1) +NEVER_UNIX = int(mktime(NEVER.timetuple())) -def getSqlDatetime(): +def getSqlDatetime(unix=False): ''' Returns the current date/time of the database server. @@ -63,9 +65,14 @@ def getSqlDatetime(): cursor = con.cursor() if con.vendor == 'mysql': cursor.execute('SELECT NOW()') - return cursor.fetchone()[0] - return datetime.now() # If not know how to get database datetime, returns local datetime (this is fine for sqlite, which is local) + date = cursor.fetchone()[0] + else: + date = datetime.now() # If not know how to get database datetime, returns local datetime (this is fine for sqlite, which is local) + if unix: + return int(mktime(date.timetuple())) + else: + return date # Services @@ -860,7 +867,34 @@ class DeployedService(models.Model): getConnectionInfo without knowing if it is requested by a DeployedService or an UserService ''' return [username, password] + + def isRestrained(self): + ''' + Maybe this deployed service is having problems, and that may block some task in some + situations. + To avoid this, we will use a "restrain" policy, where we restrain a deployed service for, + for example, create new cache elements is reduced. + + The policy to check is that if a Deployed Service has 3 errors in the last 20 Minutes (by default), it is + considered restrained. + + The time that a service is in restrain mode is 20 minutes by default (1200 secs), but it can be modified + at globalconfig variables + ''' + from uds.core.util.Config import GlobalConfig + + if GlobalConfig.RESTRAINT_TIME.getInt() <= 0: + return False # Do not perform any restraint check if we set the globalconfig to 0 (or less) + + date = getSqlDatetime() - timedelta(seconds=GlobalConfig.RESTRAINT_TIME.getInt()) + + if self.userServices.filter(state=State.ERROR, state_date__gt=date).count() >= 3: + return True + + return False + + def setState(self, state, save = True): ''' Updates the state of this object and, optionally, saves it @@ -1190,7 +1224,7 @@ class UserService(models.Model): # We need to keep separated two differents os states so service operations (move beween caches, recover service) do not affects os manager state state = models.CharField(max_length=1, default=State.PREPARING, db_index = True) # We set index so filters at cache level executes faster os_state = models.CharField(max_length=1, default=State.PREPARING) # The valid values for this field are PREPARE and USABLE - state_date = models.DateTimeField(auto_now_add=True) + state_date = models.DateTimeField(auto_now_add=True, db_index = True) creation_date = models.DateTimeField(db_index = True) data = models.TextField(default='') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name = 'userServices', null=True, blank=True, default = None) @@ -1376,7 +1410,7 @@ class UserService(models.Model): return [username, password] return ds.osmanager.getInstance().processUserPassword(self, username, password) - + def setState(self, state): ''' Updates the state of this object and, optionally, saves it @@ -1533,17 +1567,16 @@ signals.pre_delete.connect(UserService.beforeDelete, sender = UserService) # Especific loggin information for an user service class Log(models.Model): ''' - This class represents the log associated with an user service. + Log model associated with an object. - This log is mainly used to keep track of log infor relative to the service - (such as when a user access a machine, - of information related to + This log is mainly used to keep track of log relative to objects + (such as when a user access a machine, or information related to user logins/logout, errors, ...) ''' owner_id = models.IntegerField(db_index=True, default=0) - owner_type = models.IntegerField(db_index=True, default=0) + owner_type = models.SmallIntegerField(db_index=True, default=0) - created = models.DateTimeField(auto_now_add=True, db_index=True) + created = models.DateTimeField(db_index=True) source = models.CharField(max_length=16, default='internal', db_index=True) level = models.PositiveSmallIntegerField(default=0, db_index=True) data = models.CharField(max_length=255, default='') @@ -1557,7 +1590,124 @@ class Log(models.Model): def __unicode__(self): - return "Log of {0}({1}): {2} - {3} - {4} - {5}".format(self.owner_type, self.owner_id, self.created, self.source, self.level, self.data) + return u"Log of {0}({1}): {2} - {3} - {4} - {5}".format(self.owner_type, self.owner_id, self.created, self.source, self.level, self.data) + + +class StatsCounters(models.Model): + ''' + Counter statistocs mpdes the counter statistics + ''' + + owner_id = models.IntegerField(db_index=True, default=0) + owner_type = models.SmallIntegerField(db_index=True, default=0) + counter_type = models.SmallIntegerField(db_index=True, default=0) + stamp = models.IntegerField(db_index=True, default=0) + value = models.IntegerField(db_index=True, default=0) + + class Meta: + ''' + Meta class to declare db table + ''' + db_table = 'uds_stats_c' + + + @staticmethod + def get_grouped(owner_type, counter_type, **kwargs): + ''' + Returns the average stats grouped by interval for owner_type and owner_id (optional) + + Note: if someone cant get this more optimized, please, contribute it! + ''' + + filt = 'owner_type' + if type(owner_type) in (list, tuple): + filt += ' in (' + ','.join((str(x) for x in owner_type)) + ')' + else: + filt += '='+str(owner_type) + + owner_id = None + if kwargs.get('owner_id', None) is not None: + filt += ' AND OWNER_ID' + oid = kwargs['owner_id'] + if type(oid) in (list, tuple): + filt += ' in (' + ','.join(str(x) for x in oid) + ')' + else: + filt += '='+str(oid) + + filt += ' AND counter_type='+str(counter_type) + + since = kwargs.get('since', None) + to = kwargs.get('to', None) + + since = since and int(since) or NEVER_UNIX + to = to and int(to) or getSqlDatetime(True) + + interval = 600 # By default, group items in ten minutes interval (600 seconds) + + limit = kwargs.get('limit', None) + + + if limit is not None: + limit = int(limit) + elements = kwargs['limit'] + + # Protect for division a few lines below... :-) + if elements < 2: + elements = 2 + + if owner_id is None: + q = StatsCounters.objects.filter(stamp__gte=since, stamp__lte=to) + else: + q = StatsCounters.objects.filter(owner_id=owner_id, stamp__gte=since, stamp__lte=to) + + if type(owner_type) in (list, tuple): + q = q.filter(owner_type__in=owner_type) + else: + q = q.filter(owner_type=owner_type) + + if q.count() > elements: + first = q.order_by('stamp')[0].stamp + last = q.order_by('stamp').reverse()[0].stamp + interval = int((last-first)/(elements-1)) + + filt += ' AND stamp>={0} AND stamp<={1} GROUP BY CEIL(stamp/{2}) ORDER BY stamp'.format( + since, to, interval) + + fnc = kwargs.get('use_max', False) and 'MAX' or 'AVG' + + query = ('SELECT -1 as id,-1 as owner_id,-1 as owner_type,-1 as counter_type,stamp,' + 'CEIL({0}(value)) AS value ' + 'FROM {1} WHERE {2}').format(fnc, StatsCounters._meta.db_table, filt) + + logger.debug('Stats query: {0}'.format(query)) + + # We use result as an iterator + return StatsCounters.objects.raw(query) + + def __unicode__(self): + return u"Log of {0}({1}): {2} - {3} - {4}".format(self.owner_type, self.owner_id, self.stamp, self.counter_type, self.value) + + +class StatsEvents(models.Model): + ''' + Counter statistocs mpdes the counter statistics + ''' + + owner_id = models.IntegerField(db_index=True, default=0) + owner_type = models.SmallIntegerField(db_index=True, default=0) + event_type = models.SmallIntegerField(db_index=True, default=0) + stamp = models.IntegerField(db_index=True, default=0) + + class Meta: + ''' + Meta class to declare db table + ''' + db_table = 'uds_stats_e' + + + def __unicode__(self): + return u"Log of {0}({1}): {2} - {3} - {4} - {5}".format(self.owner_type, self.owner_id, self.created, self.source, self.level, self.data) + # General utility models, such as a database cache (for caching remote content of slow connections to external services providers for example) @@ -1597,15 +1747,15 @@ class Cache(models.Model): expired = "Expired" else: expired = "Active" - return "{0} {1} = {2} ({3})".format(self.owner, self.key, self.value, expired) + return u"{0} {1} = {2} ({3})".format(self.owner, self.key, self.value, expired) class Config(models.Model): ''' General configuration values model. Used to store global and specific modules configuration values. This model is managed via uds.core.util.Config.Config class ''' - section = models.CharField(max_length=128) - key = models.CharField(max_length=64) + section = models.CharField(max_length=128, db_index=True) + key = models.CharField(max_length=64, db_index=True) value = models.TextField(default = '') crypt = models.BooleanField(default = False) long = models.BooleanField(default = False) @@ -1618,7 +1768,7 @@ class Config(models.Model): unique_together = (('section', 'key'),) def __unicode__(self): - return "Config {0} = {1}".format(self.key, self.value) + return u"Config {0} = {1}".format(self.key, self.value) class Storage(models.Model): ''' @@ -1633,7 +1783,7 @@ class Storage(models.Model): objects = LockingManager() def __unicode__(self): - return "{0} {1} = {2}, {3}".format(self.owner, self.key, self.data, str.join( '/', [self.attr1])) + return u"{0} {1} = {2}, {3}".format(self.owner, self.key, self.data, str.join( '/', [self.attr1])) class UniqueId(models.Model): ''' @@ -1656,7 +1806,7 @@ class UniqueId(models.Model): def __unicode__(self): - return "{0} {1}.{2}, assigned is {3}".format(self.owner, self.basename, self.seq, self.assigned) + return u"{0} {1}.{2}, assigned is {3}".format(self.owner, self.basename, self.seq, self.assigned) class Scheduler(models.Model): @@ -1716,7 +1866,7 @@ class Scheduler(models.Model): def __unicode__(self): - return "Scheduled task {0}, every {1}, last execution at {2}, state = {3}".format(self.name, self.frecuency, self.last_execution, self.state) + return u"Scheduled task {0}, every {1}, last execution at {2}, state = {3}".format(self.name, self.frecuency, self.last_execution, self.state) # Connects a pre deletion signal to Scheduler signals.pre_delete.connect(Scheduler.beforeDelete, sender = Scheduler) @@ -1742,7 +1892,7 @@ class DelayedTask(models.Model): #objects = LockingManager() def __unicode__(self): - return "Run Queue task {0} owned by {3},inserted at {1} and with {2} seconds delay".format(self.type, self.insert_date, self.execution_delay, self.owner_server) + return u"Run Queue task {0} owned by {3},inserted at {1} and with {2} seconds delay".format(self.type, self.insert_date, self.execution_delay, self.owner_server) class Network(models.Model): @@ -1839,5 +1989,5 @@ class Network(models.Model): self.save() def __unicode__(self): - return 'Network {0} from {1} to {2}'.format(self.name, Network.longToIp(self.net_start), Network.longToIp(self.net_end)) + return u'Network {0} from {1} to {2}'.format(self.name, Network.longToIp(self.net_start), Network.longToIp(self.net_end)) diff --git a/server/src/uds/osmanagers/WindowsOsManager/WinDomainOsManager.py b/server/src/uds/osmanagers/WindowsOsManager/WinDomainOsManager.py index 6f82775e..fe0463f3 100644 --- a/server/src/uds/osmanagers/WindowsOsManager/WinDomainOsManager.py +++ b/server/src/uds/osmanagers/WindowsOsManager/WinDomainOsManager.py @@ -14,6 +14,9 @@ from uds.core.ui.UserInterface import gui from uds.core.managers.CryptoManager import CryptoManager from uds.core import osmanagers from WindowsOsManager import WindowsOsManager, scrambleMsg +from uds.core.util import log +import dns.resolver +import ldap import logging @@ -26,7 +29,7 @@ class WinDomainOsManager(WindowsOsManager): iconFile = 'wosmanager.png' # Apart form data from windows os manager, we need also domain and credentials - domain = gui.TextField(length=64, label = _('Domain'), order = 1, tooltip = _('Domain to join machines to (better use dns form of domain)'), required = True) + domain = gui.TextField(length=64, label = _('Domain'), order = 1, tooltip = _('Domain to join machines to (use FQDN form, netbios name not allowed)'), required = True) account = gui.TextField(length=64, label = _('Account'), order = 2, tooltip = _('Account with rights to add machines to domain'), required = True) password = gui.PasswordField(length=64, label = _('Password'), order = 3, tooltip = _('Password of the account'), required = True) ou = gui.TextField(length=64, label = _('OU'), order = 4, tooltip = _('Organizational unit where to add machines in domain (check it before using it)')) @@ -37,11 +40,15 @@ class WinDomainOsManager(WindowsOsManager): super(WinDomainOsManager, self).__init__(environment, values) if values != None: if values['domain'] == '': - raise osmanagers.OSManager.ValidationException(_('Must provide a domain!!!')) + raise osmanagers.OSManager.ValidationException(_('Must provide a domain!')) + if values['domain'].find('.') == -1: + raise osmanagers.OSManager.ValidationException(_('Must provide domain in FQDN')) if values['account'] == '': - raise osmanagers.OSManager.ValidationException(_('Must provide an account to add machines to domain!!!')) + raise osmanagers.OSManager.ValidationException(_('Must provide an account to add machines to domain!')) + if values['account'].find('\\') != -1: + raise osmanagers.OSManager.ValidationException(_('DOM\\USER form is not allowed!')) if values['password'] == '': - raise osmanagers.OSManager.ValidationException(_('Must provide a password for the account!!!')) + raise osmanagers.OSManager.ValidationException(_('Must provide a password for the account!')) self._domain = values['domain'] self._ou = values['ou'] self._account = values['account'] @@ -51,10 +58,134 @@ class WinDomainOsManager(WindowsOsManager): self._ou = "" self._account = "" self._password = "" + + self._ou = self._ou.replace(' ', '') + if self._domain != '' and self._ou != '': + lpath = 'dc=' + ',dc='.join(self._domain.split('.')) + if self._ou.find(lpath) == -1: + self._ou += ',' + lpath + + def __getLdapError(self, e): + logger.debug('Ldap Error: {0} {1}'.format(e, e.message)) + _str = '' + if type(e.message) == dict: + #_str += e.message.has_key('info') and e.message['info'] + ',' or '' + _str += e.message.has_key('desc') and e.message['desc'] or '' + else : + _str += str(e) + return _str + + def __connectLdap(self): + ''' + Tries to connect to LDAP + Raises an exception if not found: + dns.resolver.NXDOMAIN + ldap.LDAPError + ''' + servers = reversed(sorted(dns.resolver.query('_ldap._tcp.'+self._domain, 'SRV'), key=lambda i: i.priority * 10000 + i.weight)) + + for server in servers: + + _str = '' + + try: + uri = "%s://%s:%d" % ('ldap', str(server.target)[:-1], server.port) + logger.debug('URI: {0}'.format(uri)) + + ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) # Disable certificate check + l = ldap.initialize(uri=uri) + l.set_option(ldap.OPT_REFERRALS, 0) + l.network_timeout = l.timeout = 5 + l.protocol_version = ldap.VERSION3 + + account = self._account + if account.find('@') is False: + account += '@' + self._domain + + l.simple_bind_s(who = account, cred = self._password) + + return l + except ldap.LDAPError as e: + _str = self.__getLdapError(e) + + raise ldap.LDAPError(_str) + def release(self, service): + ''' + service is a db user service object + ''' super(WinDomainOsManager,self).release(service) - # TODO: remove machine from active directory os, under ou or default location if not specified + + try: + l = self.__connectLdap() + except dns.resolver.NXDOMAIN: # No domain found, log it and pass + logger.warn('Could not find _ldap._tcp.'+self._domain) + log.doLog(service, log.WARN, "Could not remove machine from domain (_ldap._tcp.{0} not found)".format(self._domain), log.OSMANAGER); + except ldap.LDAPError as e: + log.doLog(service, log.WARN, "Could not remove machine from domain (invalid credentials for {0})".format(self._account), log.OSMANAGER); + + #_filter = '(&(objectClass=computer)(sAMAccountName=%s$))' % service.friendly_name + + try: + # res = l.search_ext_s(base = self._ou, scope = ldap.SCOPE_SUBTREE, + # filterstr = _filter)[0] + l.delete('cn={0},{1}'.format(service.friendly_name, self._ou)) + except: + logger.exception('Not found: ') + + + def check(self): + try: + l = self.__connectLdap() + except ldap.LDAPError as e: + return _('Check error: {0}').format(self.__getLdapError(e)) + except dns.resolver.NXDOMAIN: + return [True, _('Could not find server parameters (_ldap._tcp.{0} can\'r be resolved)').format(self._domain)] + except Exception as e: + logger.exception('Exception ') + return [False, str(e)] + try: + r = l.search_st(self._ou, ldap.SCOPE_BASE) + except ldap.LDAPError as e: + return _('Check error: {0}').format(self.__getLdapError(e)) + + + return _('Server check was successful') + + + @staticmethod + def test(env, data): + logger.debug('Test invoked') + try: + wd = WinDomainOsManager(env, data) + logger.debug(wd) + try: + l = wd.__connectLdap() + except ldap.LDAPError as e: + return [False, _('Could not access AD using LDAP ({0})').format(wd.__getLdapError(e))] + + ou = wd._ou + if ou == '': + ou = 'cn=Computers,dc='+',dc='.join(wd._domain.split('.')) + + logger.debug('Checking {0} with ou {1}'.format(wd._domain,ou)) + r = l.search_st(ou, ldap.SCOPE_BASE) + logger.debug('Result of search: {0}'.format(r)) + + except ldap.LDAPError: + if wd._ou == '': + return [False, _('The default path {0} for computers was not found!!!').format(ou)] + else: + return [False, _('The ou path {0} was not found!!!').format(ou)] + except dns.resolver.NXDOMAIN: + return [True, _('Could not check parameters (_ldap._tcp.{0} can\'r be resolved)').format(wd._domain)] + except Exception as e: + logger.exception('Exception ') + return [False, str(e)] + + return [True, _("All parameters seems to work fine.")] + def infoVal(self, service): return 'domain:{0}\t{1}\t{2}\t{3}\t{4}'.format( self.getName(service), self._domain, self._ou, self._account, self._password) diff --git a/server/src/uds/services/OVirt/client/oVirtClient.py b/server/src/uds/services/OVirt/client/oVirtClient.py index 6162b3a4..cb44b6b7 100644 --- a/server/src/uds/services/OVirt/client/oVirtClient.py +++ b/server/src/uds/services/OVirt/client/oVirtClient.py @@ -67,6 +67,7 @@ class Client(object): except: cached_api_key = None raise Exception("Can't connet to server at {0}".format(self._host)) + return None def __init__(self, host, username, password, timeout, cache): diff --git a/server/src/uds/xmlrpc/log/logs.py b/server/src/uds/xmlrpc/log/logs.py index 87555d03..5e310f64 100644 --- a/server/src/uds/xmlrpc/log/logs.py +++ b/server/src/uds/xmlrpc/log/logs.py @@ -36,6 +36,7 @@ from ..auths.AdminAuth import needs_credentials from ..util.Exceptions import FindException from uds.core.util import log +from uds.models import DeployedService from uds.models import UserService from uds.models import User from uds.models import Authenticator @@ -44,13 +45,23 @@ import logging logger = logging.getLogger(__name__) +@needs_credentials +def getDeployedServiceLogs(credentials, id): + try: + ds = DeployedService.objects.get(pk=id) + return log.getLogs(ds) + except: + logger.exception('Exception') + raise FindException(_('Deployed service does not exists')) + + @needs_credentials def getUserServiceLogs(credentials, id): try: us = UserService.objects.get(pk=id) return log.getLogs(us) except: - raise FindException(_('Service does not exists')) + raise FindException(_('User service does not exists')) @needs_credentials def getUserLogs(credentials, id): @@ -71,6 +82,7 @@ def getAuthLogs(credentials, id): # Registers XML RPC Methods def registerLogFunctions(dispatcher): + dispatcher.register_function(getDeployedServiceLogs, 'getDeployedServiceLogs') dispatcher.register_function(getUserServiceLogs, 'getUserServiceLogs') dispatcher.register_function(getUserLogs, 'getUserLogs') dispatcher.register_function(getAuthLogs, 'getAuthLogs') diff --git a/server/src/uds/core/util/db/__init__.py b/server/src/uds/xmlrpc/stats/__init__.py similarity index 100% rename from server/src/uds/core/util/db/__init__.py rename to server/src/uds/xmlrpc/stats/__init__.py diff --git a/server/src/uds/xmlrpc/stats/stats.py b/server/src/uds/xmlrpc/stats/stats.py new file mode 100644 index 00000000..b1fb63b1 --- /dev/null +++ b/server/src/uds/xmlrpc/stats/stats.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2013 Virtual Cable S.L. +# 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. +# * Neither the name of Virtual Cable S.L. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. + +''' +@author: Adolfo Gómez, dkmaster at dkmon dot com +''' + +from django.utils.translation import ugettext as _ +from uds.models import DeployedService +from ..auths.AdminAuth import needs_credentials +from ..util.Exceptions import FindException +from uds.core.util.stats import counters +from uds.core.util.Cache import Cache +import cPickle +import time + +import logging + +logger = logging.getLogger(__name__) + +cache = Cache('StatsDispatcher') + +@needs_credentials +def getDeployedServiceCounters(credentials, id, counter_type, since, to, points, use_max): + try: + cacheKey = id + str(counter_type)+str(since)+str(to)+str(points)+str(use_max) + val = cache.get(cacheKey) + if val is None: + + if id == '-1': + us = DeployedService() + all = True + else: + us = DeployedService.objects.get(pk=id) + all = False + val = [] + for x in counters.getCounters(us, counter_type, since=since, to=to, limit=points, use_max=use_max, all=all): + val.append({ 'stamp': x[0], 'value': int(x[1]) }) + if len(val) > 2: + cache.put(cacheKey, cPickle.dumps(val).encode('zip'), 3600) + else: + val = [{'stamp':since, 'value':0 }, {'stamp':to, 'value':0}] + else: + val = cPickle.loads(val.decode('zip')) + + return { 'title': counters.getCounterTitle(counter_type), 'data': val } + except: + logger.exception('exception') + raise FindException(_('Service does not exists')) + +# Registers XML RPC Methods +def registerStatsFunctions(dispatcher): + dispatcher.register_function(getDeployedServiceCounters, 'getDeployedServiceCounters') diff --git a/server/src/uds/xmlrpc/util/Exceptions.py b/server/src/uds/xmlrpc/util/Exceptions.py index b4ef9768..0b4e037b 100644 --- a/server/src/uds/xmlrpc/util/Exceptions.py +++ b/server/src/uds/xmlrpc/util/Exceptions.py @@ -58,10 +58,10 @@ def DuplicateEntryException(msg): return Fault(DUPLICATE_FAIL, msg) def InsertException(msg): - return Fault(FIND_FAIL, msg) + return Fault(INSERT_FAIL, msg) def FindException(msg): - return Fault() + return Fault(FIND_FAIL, msg) def DeleteException(msg): return Fault(DELETE_FAIL, msg) diff --git a/server/src/uds/xmlrpc/views.py b/server/src/uds/xmlrpc/views.py index ecc2e0b1..aaa41a40 100644 --- a/server/src/uds/xmlrpc/views.py +++ b/server/src/uds/xmlrpc/views.py @@ -53,6 +53,7 @@ from auths.UserPreferences import registerPreferencesFunctions from tools.Cache import registerCacheFunctions from tools.Config import registerConfigurationFunctions from log.logs import registerLogFunctions +from stats.stats import registerStatsFunctions import logging @@ -144,3 +145,4 @@ registerPreferencesFunctions(dispatcher) registerCacheFunctions(dispatcher) registerConfigurationFunctions(dispatcher) registerLogFunctions(dispatcher) +registerStatsFunctions(dispatcher)