BasisAgent (basis运维监控工具)
SAP BASIS运维需要监控服务器主机的运行状态,多年以来,
我都是手工到系统去检查和统计操作系统层的信息,
这次,我准备自己来做一个,因为我面对了10个aix和50个suse。
我给自己提出了工具的需求:
1、telnet登录主机收集shell命令数据,AIX主机需要收集的指标数据是df -g和errpt
2、SSH登录主机收集shell命令数据,suse主机需要收集的指标数据是df -h和/var/message
3、数据存储在SQLlite文件数据库中,主机密码有加密
4、工具定时统计主机信息,检测异常给管理员邮箱发邮件
5、主机shell数据用模板库来管理
6、完成后放在github上
工具还是用C# WINFORM来搞,最简单。
首先,为了实现telnet登录,我找到了 https://download.csdn.net/download/qianlicao412/9670090
需要在项目中引用入 Dart.Telnet.dll,Dart.Telnet.xml
程序取到了完整的df -g文件系统数据,接下了需要把这个结构化的字符串,
按模版识别分解后放到关系型的Sqllite数据库里。
实现telnet shell完整的代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Dart.Telnet; namespace telnet23 { public partial class Form1 : Form { static Telnet telnet1 = new Telnet(); static TelnetModel telnetModel = new TelnetModel(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Wire-up events telnet1.Data += new EventHandler<DataEventArgs>(telnet1_Data); telnet1.Error += new EventHandler<ErrorEventArgs>(telnet1_Error); telnetModel = new TelnetModel(); telnetModel.Telnet = telnet1; try { telnetModel.Session.RemoteEndPoint.HostNameOrAddress = "主机IP"; telnetModel.Session.RemoteEndPoint.Port = 23; telnetModel.Credentials.Username = "用户名"; telnetModel.Credentials.Password = "密码"; telnetModel.Credentials.CommandPrompt = "#"; telnetModel.CommandString = "df -g"; telnetModel.Execute(null); } catch (Exception ex) { Console.Write(ex.Message); } } void telnet1_Error(object sender, ErrorEventArgs e) { string expText = e.GetException().ToString(); if (e.GetException() is NotImplementedException) expText = "NOTE: A NotImplementedException may be thrown when running under Mono.\r\n\r\n" + expText; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(expText); Console.ForegroundColor = ConsoleColor.Gray; } void telnet1_Data(object sender, DataEventArgs e) { textBox1.Text = textBox1.Text + Encoding.ASCII.GetString(e.Data.Buffer, e.Data.Offset, e.Data.Count); } } }
关于模板库:
prd2:root[/]#df -g Filesystem GB blocks Free %Used Iused %Iused Mounted on /dev/hd4 5.00 4.52 10% 13651 2% / /dev/hd2 10.00 5.36 47% 80728 7% /usr /dev/hd9var 2.00 1.30 35% 10899 4% /var /dev/hd3 10.00 8.55 15% 2555 1% /tmp /dev/hd1 2.00 1.99 1% 117 1% /home /dev/hd11admin 0.50 0.50 1% 9 1% /admin /proc - - - - - /proc /dev/hd10opt 0.50 0.28 45% 7114 10% /opt /dev/livedump 0.50 0.50 1% 9 1% /var/adm/ras/livedump /dev/lvsaphome 10.00 8.99 11% 1087 1% /usr/sap /dev/lvsapaas 10.00 2.56 75% 28777 5% /usr/sap/EP2 /dev/vol_nbu 15.00 11.17 26% 2142 1% /usr/openv prd:/export/usr/sap/trans 50.00 33.71 33% 17418 1% /usr/sap/trans prd:/export/sapmnt/EP2 20.00 17.17 15% 16359 1% /sapmnt/EP2
今天终于找到分解df -g的方法,
Filesystem GB blocks Free %Used Iused %Iused Mounted on
/dev/hd4 5.00 4.40 12% 13646 2% /
Filesystem GB blocks Free %Used Iused %Iused Mounted on
/dev/hd4 5.00 4.40 12% 13646 2% /
把telnet命令得到的大文本,按头“/dev/hd4”和尾“/”查找,可以得到中间5个字段。
按每一个文件系统建立一个关键字模版,程序每次完整的得到5个字段串,然后转成5个字段。
按模块来设计我的监控工具,大致有这几个模块: