Ok, dann werde ich mich mal etwas genauer ausdrücken.
Die meisten Server (überhaupt Linux) werden aus Sicherheitsgründen mit SSH2 per Konsole gesteuert und oft wird wegen der Performance auf eine GUI verzichtet.
Per SSH kann man so den Server steuern und einrichten wie man will. Für die Benuter, die aber wenig Ahnung von Unix-Befehlen, dem Verzeichnissaufbau usw. haben, bleiben nur wenige Möglichkeiten, wie zB eine WebGUI wie Plesk, Confixx oder Webmin. Da aber gerade Linux wegen dem Kostenfaktor genommen wird, will man möglichst billig kommen und nimmt Webmin. Diese Software wird aber nicht mehr offiziell von Cannonical unterstützt und die Alternativen wie SysCP usw. sind nicht so mächtig und greifen (wie. webmin) zu tief ins system ein, daher will ich eine kleine Alternative erstellen.
Die Software stellt eine Verbindung per SSH2 her und soll quasi eine art Grafische Oberfläche für die Konsole sein, aber da die Ausgabe nicht leicht zum parsen ist wollte ich mal fragen, ob wer Tipps hat, oder Tricks kennt.
Unter "nicht leicht" meine ich, dass zwischen Werten oft viele Leerzeichen sind, die Zeilen oft unterschiedlich ausgenutz werden und von Befehl und OS variieren.
Eine konkrete Frage hätte ich dann noch - Kann man einen String zeilenweise parsen ? Ich meine Wie eine Textdatei.
Weiters stellt sich noch die Frage, wie man am besten (oder sichersten) die Zugengsdaten für die SSH Verbindung am PC speichern könnte.
lg
chris
Ich speichere die Ausgabe einer SSH2 Verbindung in einem String und möchte diesen nun parsen, doch die Ausgaben sind relativ willkürlich und nicht gerade von einheitlichem Erscheinen geprägt.
Bsp:
free -mt |grep Mem
Mem: 7880 454 7426 0 138 181
root@server:~#
Da ich in vielen Fällen an Zahlen kommen will/muss und mir jeder Buchstabe der falsch gefunden wurde eine Konvertiertung vereitelt, stehe ich vor dem Problem, dass ich nicht genau weiß wie man es am besten umsetzen kann. Das ganze soll am Ende nur ein kleines Tool sein, dass die Adminarbeiten an einem Linux Server erleichtern soll - also es soll am Ende mit so ziemlich jedem Befehl von "sudo shutdown -r now" bis "sudo /etc/init.d/apache2 start" auskommen...
hat irgendwer einer Idee, oder einen Vorschlag ?
mfg
chris
Ich habe nun 81 Textboxen (TextBox1, TextBox2,...) und will jetzt jede Füllen. Die Werte sollen aus einem 2D-Array kommen. WIe kann ich jetzt die Textboxen mit einer Schleife füllen, damit ich nicht bei jedem Lesen, oder Zuweisen 81 Mal die beinache selbe Codefolge schreiben muss?
sudoku[0, 0] = Convert.ToByte(textBox1.Text);
sudoku[0, 1] = Convert.ToByte(textBox2.Text);
sudoku[0, 2] = Convert.ToByte(textBox3.Text);
sudoku[0, 3] = Convert.ToByte(textBox4.Text);
sudoku[0, 4] = Convert.ToByte(textBox5.Text);
//....
mfg
donchris
Danke für die Antworten ! Ich habe es jetzt mit einer List geschafft.
Danke!
ICh habe ein Array(mWerte) und möchte aus diesem alle Werte, welche in 3 weiteren Arrays(zWerte,sWerte,bWerte) vorkommen, löschen. wie könnte ich das hingekommen ?
for (byte mw = 1; mw <= 9; mw++)
{
if(zWerte.Contains(mw)){
mWerte.
}
else if (sWerte.Contains(mw))
{
}else if(bWerte.Contains(mw)){
}
}
nun habe ich aber das Problem, wie ich diese jetzt löschen könnte. Ich finde immer nur die Clear Methode, dafür bräuchte ich aber immer die exakte Position.
Da es sich um eine Art Sudokulöser handelt, gibt es immer nur max. 9 Werte in jedem Array und sWerte sind die Spaltenwerte, zWerte die der Zeile und bWerte, jene des Blockes.
mfg
donchris
die Animation funktioniert zwar, doch nur in eine Richtung, ich kann ihn nicht zurück sliden lassen. Du hast recht, ich habe es nicht ganz verstanden. Ich habe zwar ein relativ neues C# Buch, aber ich finde nichts über Animationen in WPF und dein paar tutorials brachten mich auch nicht wirklich weiter.
So weit funktioniert es einmal ohne Probleme, doch eine Frage hätte ich noch: Wie kann man die Aktuellen Koordinaten des Panels abfragen, damit ich während einer animation keine animation auslösen kann und zwischen ein und rausfahren unterscheiden kann.
mfg
donchris
danke !
ich habe es im moment so:
private void HMenu_MouseEnter(object sender, MouseEventArgs e)
{
DoubleAnimation ausfahren = new DoubleAnimation();
ausfahren.From = 300;
ausfahren.To = 100;
HMenu.BeginAnimation(TranslateTransform.XProperty, ausfahren);
}
Aber es funktioniert nicht. also es findes keine animation statt. ist mouseenter das richtige event ? also ich will, einen hover-effekt wie bei css.
Ich will ein animiertes Menu erzeugen, das auf der linken Seite verankert is und wenn man per Maus darüber fährt, herausfährt. Daher habe ich zuerst ein DockPanel erzeugt und darin ein paar Buttons mit einem StackPanel sortiert.
Wie kann ich jetzt das DockPanel beim MouseEnter Event animieren ?
In einem Tutorial wurde ein Button mit einer DoubleAnimation animiert. Ich kann dies aber nicht auf das Dockpanel übertragen, da es die EIgenschaft WidthProperty für BeginAnimation-MEthode nicht existiert.
Wie könnte ich ein Panel animieren ???
mfg
donchris
Das Problem ist, dass ich dann später vielleicht auch eine "Live"-Funktion wie in Woopra implementieren möchte, weiters habe ich dann das Problem, dass auch die verschiedenen Logformate von Apache und IIS schwer zu parsen sind, da sie selbst immer unterschiedliche werte loggen. Wenn ich aber selbst ein plugin schreibe komme ich immer bei jeder Installation auf alle Werte. AUßerdem glaube ich, dass es schneller ist, wenn ich den Datenverkehr direkt zu einem Statistikserver weiterleite und dann in eine Datenbank schreibe, als dass ich immer die Logdateien, die teilweise mehrere MB haben parse.
Also ich will ja so viele Funktionen wie möglich (aber trotzdem optisch gut aufbereiten) sodass ich eine Mischung zwischen google Analytics und awstats mache und dann noch die einzelnen User selbst besser aufbereite als in Awstats.
Weiters wäre es vielleicht interessant, wenn man die Fehlerloggs (404,..) auch besser einbringen könnte wie zB Fehlerloggs von php - und so wären parser sicherlich nicht so schnell. Also da können schon mehrere 100 MB Daten vorliegen.
Es ist sicherlich nicht leicht, aber ich habe ja genug Zeit und vielleicht hilft mir jemand. Wenn ihr Interesse habt, dann schickt einfach eine PN!
Ich habe vor eine umfangreiche Zugriffsstatistik zu programmieren, also um den Traffik, die Zugriffe usw. eines Webservers aufzuzeichnen und auszuwerten.
Ich bin mir noch nicht ganz klar, wie der beste Weg aussehen würde, aber ich habe mir gedacht, dass es wie folgt funktionieren könnte:
Es gibt einen Zentralen "Server" der die Zugriffsdaten bereitstellt und auf den die Clients zugreifen können (Also wie ein Webserver nur auf einem anderen Port für die Zugriffe) als Client wird man auch ein kleines Programm zur verfügung haben und später wird es vielleicht auch eine php Version als "online Client" geben.
DIe Daten werden via plug in von den Webservern (IIS, Apache) direkt zum Statistikserver weitergeleitet und dort gespeichert.
Also:
IIS oder Apache ---plugin--> StatistikServer ---> Client(per Software oder PHP Weboberfläche)
Gibt es vielleicht sogar einen besseren Weg um die Zugriffsdaten zu kommen, als den Server "abzusapfen" . könnte man vielleicht direkt am 80er Port mitlauschen ?
Ich weiß nun nicht, wie ich den Server am BEsten programmieren sollte. Als Datenbank dachte ich wäre eine SQL Server Compact DB geeignet, da sie klein ist und ich für jede Domain eine neue erstellen könnte. Wie kann ich jetzt per plug in innerhalb eines COmputers Daten zu dem Program übertragen. ALso ich bräuchte eine Art API, oder soll ich einfach den Server als Konsolenanwendung laufen lassen und die Daten per Parameter übergeben ?
Habt ihr vorschläge ? Das Programm soll schließlich eine Open SOurce Alternative zu Awstats sein (mit mehr Funktionen und neueren Technologien)
mfg
donchris
Also ich müsste für ein Beispiel imperativer Programmierung voll auf "moderne" Schleifen und Fallutnerscheidungen verzichten und sollte nur auf Bedingte Ausdrücke (xx > yy)?+1:-1 ... und goto setzen. Also mein Problem besteht darin die goto Anweidung mit dem Bedigten Ausdruck zu verbinden, sodass eine Variable schrittweise bis zu einem bestimmten Wert erhöht wird. NUn habe ich das Problem die goto ANweisung einzubauen:
ERHOEHE:
xxx = +1;
xxx = (xxx<10)?+0: +1 goto ERHOEHE;
Ich weiß jetzt nicht genau, warum das goto nicht funktioniert, aber ich glaube, dass es einfach nur an Zeileinbeginn stehen muss, so denke ich, würde einfach ein Zeichen Fehlen, dass statt dem ; Zeichen die Zeile nicht abschließt, sondern auf die nächste "weiterführt" ... oder weiß irgendwer, wie man eine Variable ganz banal erhöht und rein imperativ programmiert wird ?
Ich habe es schon probiert, aber es funktioniert nicht - ich habe den oberen Ausschnitt wieder aktualisiert. Ich bekomme immer eine MEldung, dass die Methode überladen sein usw..
Ich werde mit einmal den Apache-parser anschauen, aber der ist doch in C geschrieben. WIe könnte ich den in C# importieren ? - als dll ??
Jetzt habe ich aus Apache folgendes gemacht:
public Dictionary<string, string> Apache =
new Dictionary<string, string>();
Aber wie und wo soll ich am besten Virtual Hosts (also generell weiter Verschachtelungen bzw. Tags) speichern ?
Vorher habe ich einfach :
Apache[Convert.ToString(tagname)] = new Hashtable();
geschrieben, doch dies geht ja jetzt nicht mehr, da der Wert zwingend vom Typ String sein muss...
unter StringBuilder kann ich mir im Moment wenig vorstellen, aber ich werde gleich danach googln und schauen, was ich da verpasst habe.
lg
chris
Danke für die Antworten. Also webmin ist mir ein Begriff, doch soweit ich weiß ist dies nur unter Linux eine Hilfe. Unter Windows ist die Installation um einiges schwerer und nicht alles funktioniert. Daher will ich einfach ein kleines Programm mit C# mit dem man dan Apache steuern kann, aber vorerst nur für WIndows und später vielleicht per Mono auch auf Linux lauffähig machen.
ALso ich weiß jetzt auch nicht genau, wo der Fehler war, aber ich werde gleiche eine neue Version oben posten, die soweit funktioniert.
Ein Fehelr war, dass ich gedacht habe, dass die Werte wie bei einer ini (Name = Wert) gespeichert sind, doch es ist kein "=" vorhanden, sondern nur ein Leerzeichen.
Eine Frage habe ich jetzt noch schnell auf Lager: ICh habe teilweise das Problem, dass ich eine Fehlermeldung bekomme, dass ein Array mit einem Namen schon existiert und daher xx.Add nicht angewandt werden kann... wie kann ich es schaffen, dass wenn ein Array mit diesem NAmen schon existiert, einfach überschrieben wird ? - ich verwende assoziative Arrays, also Hashtables...
Das mit dem " if xxx ... throw new" ist eigentlich eine gute Idee, doch ich will alle Fehler usw. zuerst in einem Array speichern um einfach eine bessere Übersicht zu haben... (vorerst)
Danke
chris
Ich möchte für den Apache eine openSource Managemantoberfläche programmieren, da es soetwas noch nicht, beziehungsweise nur per Bezahlung gibt. Im Moment habe ich aber bereits beim Parser Probleme. Dieser arbeitet ewig und kommt einfach nicht zum Ende. Es scheint, als wäre es eine Endlosschleife, doch ich kann den Fehler einfach nicht finden...
Falls ihr auch noch andere Fehler findet, oder Vorschläge hat, dann lasst es mich bitte wissen - bzw. ich wäre froh, wenn ihr mir helfen könnt !
class confParser
{
public Dictionary<string, string> Apache =
new Dictionary<string, string>();
public Dictionary<string,Dictionary<string, string>> VHosts =
new Dictionary<string,Dictionary<string, string>>();
public Dictionary<string, string> items = new Dictionary<string, string>();
public string[] Protocoll = new string[50];
public void parse(String confFile)
{
Protocoll[Protocoll.Length - 1] = "starte Parser";
if (!(confFile == ""))
{
if (File.Exists(confFile))
{
Protocoll[Protocoll.Length - 1] = "übergebene Datei" + Convert.ToString(confFile) + " existiert !";
if (confFile.EndsWith(".conf"))
{
Protocoll[Protocoll.Length - 1] = "Beginn mit dem Parsen der ersten Zeile !";
try
{
StreamReader sr = File.OpenText(confFile);
string lineInput;
int zeile=0;
bool block = false;
String tagtype = null;
String tagname = null;
while ((lineInput = sr.ReadLine()) != null)
{
zeile++;
Protocoll[Protocoll.Length - 1] = zeile + lineInput;
if (lineInput.StartsWith("#") || lineInput.StartsWith(" "))
{
continue;
}
else if (lineInput.StartsWith("</"))
{
tagname = null;
block = false;
}
else if (lineInput.StartsWith("<"))
{
tagtype = Convert.ToString(lineInput.Split(' ')[0]).TrimStart('<');
tagname = Convert.ToString(lineInput.Split(' ')[1]).TrimEnd('>').Remove(' ');
block = true;
}
else if(lineInput.Split(' ').Length==1){
Protocoll[Protocoll.Length - 1] = "--nur ein Wort";
}
else if (lineInput.StartsWith("LogFormat"))
{
//...
}
else if (lineInput.StartsWith("LoadModule")){
//...
}
else if (lineInput.StartsWith("AddModule"))
{
//...
}
else if (block == true)
{
if (tagtype == "VirtualHost")
{
String v1 = Convert.ToString(lineInput.Split(' ')[0]);
String v2 = Convert.ToString(lineInput.Split(' ')[1]);
VHosts.Add(tagname,items.Add(v1, v2));
}
}
else if (block == false)
{
String v1 = Convert.ToString(lineInput.Split(' ')[0]);
String v2 = Convert.ToString(lineInput.Split(' ')[1]);
Apache.Add(v1, v2);
}
else
{
//unerwartetes Problem - report usw.
Protocoll[Protocoll.Length - 1] = "unerwartetes Zeichen wurde dem Parser übergeben -- abbruch";
}
}
}
catch (FileNotFoundException e)
{
// Datei existiert nicht !
Protocoll[Protocoll.Length - 1] = "Datei existiert nicht ! :" + Convert.ToString(e.Message);
}
catch (IOException e)
{
// Eine unbehandelte Ausnahme ist aufgetreten
Protocoll[Protocoll.Length - 1] = "Eine unbehandelte Ausnahme ist aufgetreten " + Convert.ToString(e.Message);
}
}
else
{
//Falsche Endung !
Protocoll[Protocoll.Length - 1] = "Falsche Endung !";
}
}
else
{
// return "Datei nicht gefunden !";
Protocoll[Protocoll.Length - 1] = "Datei nicht gefunden !";
}
}
else
{
Protocoll[Protocoll.Length - 1] = "Kene Datei angegeben !";
}
}
}
mfg
donchris
Danke für die vielen Antworten. Ihr konntet mein Problem lösen !
thx
donchris
Das Problem ist ja, dass ich ja nicht einmal aus der Klasse selber auf das Label-Feld zugreifen kann.
Angenommen es gibt eine Klasse und man zieht auf die Standardform Form1 per Drag&Drop ein Label:
static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form Form1 = new Form1();
Application.Run();
Form1.label1.Text = "";
}
}
Dann bekomme ich folgende Fehlermeldung:
Fehler 1 "System.Windows.Forms.Form" enthält keine Definition für "label1", und es konnte keine Erweiterungsmethode "label1" gefunden werden, die ein erstes Argument vom Typ "System.Windows.Forms.Form" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\chris\Documents\Visual Studio 2008\Projects...........\Program.cs 24 19 openApatcheadmin
Mit zugreifen meine ich einfach den Text ändern.
Wenn man unter VB ein Label Feld hat, kann ich einfach mit dessen Namen.Text den Text ändern. Unter C# funktioniert dies aber nicht wirklich.
Ich habe mich bis jetzt nur mit VB und in C# mit COnsolenanwendungen beschäftigt. Nun wollte ich aber auch eine Grafische Oberfläche erstellen und habe dazu einmal eine TextBox auf die Form1 gezogen und unter Eigenschaften den Modefizier auf public gesetzt. Abe ich kann noch immer nicht daraf zugreifen. Ich habe schon das openbook dazu durchstöbert, finde aber nicht wirklich eine Beschreibung, wie man auf die Objekte zugreifen kann.
Mein Beispielprogramm besteht im Momebt aus zwei Klassen (beispiel123 und confParser) welche sich im selben Namespace befinden. In beispiel123 wird eine Form instanziiert ("Form1") und im confParser möchte ich jetzt auf (zum Beispiel) ein Label Feld in Form1 zugreifen.... wie kann ich dies machen ?!
mfg
donchris
Ich schreibe gerade einen Parser für eine .conf Datei und will die Einstellungen in ein Array laden. Da weder feststeht wie viel noch welche EInstellungen vorkommen, will ich einfach ein dynamisches assoziatives mehrdimensionales Array verwenden. Nun wollte ich eigentlich fragen, welches Objekt ich unter C# nehmen soll, wenn es sich bei allen Werten um den Typ 'String' handelt.
Ich habe bis jetzt nur Hashtable verwendet, doch jetzt soll alles mehrdimensional werden und so stehe ich im Moment an.
Kann mir irgendwer weiterhelfen, oder ein Stichwort verraten ?!
thx
donchris
Danke für die Antwort, aber ich habe jetzt einfach die "alten" Spalten auf visible false gesetzt.
Ist zwar nicht wirklich elegant aber es funktioniert.
mfg
donchris
Ich habe es jetzt fast geschafft, doch irgendwie weiß ich nicht, wie ich zu meinem DataGridTableStyle komme. Aber irgendwie muss es doch leichter und schneller gehen eine Spalte als Combobox dazustellen.
private void addComboBoxcolumn(string pname,string hname){
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
{
column.FalseValue = 0;
column.TrueValue = 1;
column.DataPropertyName = pname;
column.HeaderText = hname;
column.ValueType = typeof(byte);
column.Width = 25;
}
fimeDataGridView.Columns.Add(column);
}
public int getDataGridColumnNumber(DataGridTableStyle dataGridStyle, string columnName)
{
int columnNumber = -1;
foreach (DataGridColumnStyle colStyle in dataGridStyle.GridColumnStyles)
{
columnNumber = columnNumber + 1;
if (colStyle.HeaderText.CompareTo(columnName) == 0)
return columnNumber;
}
columnNumber = -1;
return columnNumber;
}
private void ChangeToComboBox(string name,string hname)
{
int cbindex = getDataGridColumnNumber(DataGridTableStyle, name);
addComboBoxcolumn(name, hname);
fimeDataGridView.Columns.Remove(name);
}
mfg
donchris
Das hatte ich auch schon probiert, hat aber nichts geändert.
Wo sollte man den Code einfügen, damit es am effizentesten funktioniert ? Ich habe, wie ich schon sagte, nur eine Methode, die beim Laden der Form aufgerufen wird.
EDIT: Jetzt wird eine neue Combobox Spalte eingefügt (und die richtigen Werte wurden verwendet), aber es wurde eine neue Spalte erstellt, anstatt die Alte zu ersetzen.
Ich habe eine Methode gemacht, die beim Laden der Form aufgerufen wird. Bei den Eigenschaften für gebundenene Spalten steht bei der gewünschten Spalte unter DataPropertyName "Chris" und es ist auch so gewollt.
Ich habe es so probiert, doch es funktioniert nicht und ich bekomme auch keine Fehlermeldung oder Warnung.
private void AddComboBox()
{
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
{
column.FalseValue = 0;
column.TrueValue = 1;
column.DataPropertyName = "Chris";
}
fimeDataGridView.Columns.Insert(0, column);
}
verwendetes Datenbanksystem: MySQL
Ich habe eine MySQL Datenbank und ein paar tinyint(1) Felder, welche ich per DataGridView darstelle. Im Moment werden die Werte als 0 &1, also System.Byte dargestellt. Ich möchte aber, dass sie als Checkboxen dargestellt werden. Wie kann ich dies erreichen ?
mfg
donchris