远程网站监控

来源:互联网 发布:上海女人护肤品 知乎 编辑:程序博客网 时间:2024/05/21 09:49

    /// <summary>
    /// 网站监控后台
    /// </summary>
    public class WebsiteMonitoring : BackGroundBase     
    {
        #region 变量定义

        OAFLIBSystem oaflibSystem = new OAFLIBSystem ();
        ParmArray errArray = new ParmArray();
        string localHost = "", LongeMsg = "" , ShorteMsg = "" ;

        #endregion

        #region 线程启动

        public void ThreadRun( TabPageBase tabPageBase , ThreadProvider threadProvider)
        {
            tabPageBase.WriteInfo (" 正在开始运行网站监控程序 ");

            string strHostName = Dns .GetHostName ();                 //取得本机的主机名
            IPHostEntry ipEntry = Dns .GetHostByName (strHostName );   //取得本机 IP
            this. localHost = ipEntry. AddressList[0].ToString ();     //假设本地主机为单网卡,取得第一个 IP

            foreach ( IPAddress ipa in ipEntry. AddressList)          //局域网中本机 IP
            {
                if ( ipa. ToString(). StartsWith( "172.26"))
                {
                    this. localHost = ipa. ToString();
                    break;
                }
            }

            ParmArray parmArray = new ParmArray();
            parmArray. Add( "IPYN", "Y" );
            DataSet ipds = oaflibSystem.GetIPMONITORPFds (parmArray );
            if (! OperateUI. HaveData( ipds))
            {
                tabPageBase.WriteInfo (" 未设置需要进行检查的网站地址 ");
                return;
            }

            foreach ( DataRow ipdr in ipds. Tables[0]. Rows)
            {
                string url  = ipdr[ "IPADDRESS"].ToString ().Trim ();
                string ip   = ipdr[ "IPADDRESS"].ToString ().Trim () + ":" + ipdr["IPPORT" ].ToString ().Trim ();
                string type = ipdr["IPTYPE" ].ToString ().Trim ().ToUpper ();
                switch ( type)
                {
                    case "IP":
                        if ( ToIpServer( ipdr, tabPageBase))
                        {
                            tabPageBase.WriteInfo (ip + " 连接成功");
                        }
                        else
                        {
                            tabPageBase.WriteError (ip + " 连接失败");
                        }
                        break;
                    case "HTTP":
                    case "HTTPS":
                        if ( ToUrlServer(ipdr , tabPageBase ))
                        {
                            tabPageBase.WriteInfo (url + " 连接成功");
                        }
                        else
                        {
                            tabPageBase.WriteError (url + " 连接失败");
                        }
                        break;
                    default:
                        if ( ToUrlServer(ipdr , tabPageBase ))
                        {
                            tabPageBase.WriteInfo (url + " 连接成功");
                        }
                        else
                        {
                            tabPageBase.WriteError (url + " 连接失败");
                        }
                        break;
                }
            }
        }

        #endregion

        #region 网站 I P连接

        private bool ToIpServer( DataRow dr, TabPageBase tabPageBase )
        {
            string ip = dr[ "IPADDRESS"].ToString ().Trim ();
            int port = Convert. ToInt32( dr[ "IPPORT"].ToString ().Trim ());
            int timeout = Convert. ToInt32( dr[ "IPOT"].ToString ().Trim ());

            while ( true)
            {
                TcpClient tc = new TcpClient();
                tc. SendTimeout = timeout /2;
                tc. ReceiveTimeout = timeout /2;

                bool isAlive;
                try
                {
                    IPAddress HostNameOrIp = IPAddress .Parse (ip );
                    tc. Connect( HostNameOrIp, port );
                    isAlive = true;
                }
                catch( Exception e)
                {
                    LongeMsg = "原因:" + e ;
                    ShorteMsg =  原因:" + e .Message ;
                    isAlive = false;
                }
                finally
                {
                    tc. Close();
                }

                if ( errArray. IndexOf( ip) < 0)
                {
                    errArray. Add( ip, 0);
                }

                if ( isAlive)
                {
                    errArray. SetParmValue(ip, 0);
                    return true;
                }
                else
                {
                    string toMail = dr["IPMAIL" ].ToString ().Trim ().Replace (";" , "," ).Replace (" ", ",").Replace (" ", ",");
                    string toPhone = dr["IPPHONE" ].ToString ().Trim ().Replace (";" , "," ).Replace (" ", ",").Replace (" ", ",");
#if DEBUG
                    toMail = "111@penavicoxm.com";
                    toPhone = "111";
#endif
                    string sendText = "连接IP:" + ip + " 端口:" + port;
                    if ( dr[ "IPREMARK"].ToString ().Trim () != "" )
                    {
                        sendText += "(" + dr["IPREMARK" ].ToString ().Trim () + ")" ;
                    }
                    sendText += "超时, 来自(" + this. localHost + ")";

                    tabPageBase.WriteError (sendText + "\n" + LongeMsg );

                    //超时 +1
                    errArray. SetParmValue(ip, Convert.ToInt16 (errArray .GetParmValue (ip ).ToString ().Trim ()) + 1);

                    //发送邮件
                    if (Convert.ToInt16 (errArray .GetParmValue (ip ).ToString ().Trim ()) >= 1)
                    {
                        try
                        {
                            PENSendMail mail = new PENSendMail("111@penavicoxm.com" , toMail , "" , "" , sendText , LongeMsg);
                            mail. send();
                        }
                        catch ( Exception ex)
                        {
                            tabPageBase.WriteError (" 给邮箱:" + toMail + "发送邮件失败, 原因:" + ex);
                        }
                    }

                    //发送短信
                    if (Convert.ToInt16 (errArray .GetParmValue (ip ).ToString ().Trim ()) >= 3)
                    {
                        string strErrMsg = "";
                        PENSMSSystem pensmsSystem = new PENSMSSystem ();
                        if (! pensmsSystem.SendMessage ("" , "SVRMON" , toPhone, sendText + "\n" + ShorteMsg , "MonService" , out strErrMsg ))
                        {
                            tabPageBase.WriteError (" 给手机:" + toPhone + "发送短信失败, 原因:" + strErrMsg);
                        }

                        errArray. SetParmValue(ip, 0);
                        return false;
                    }
                }
            }
        }

        #endregion

        #region 网站 URL连接

        private bool ToUrlServer(DataRow dr , TabPageBase tabPageBase )
        {
            string url = dr[ "IPADDRESS"].ToString ().Trim ();
            int port = Convert. ToInt32( dr[ "IPPORT"].ToString ().Trim ());
            int timeout = Convert. ToInt32( dr[ "IPOT"].ToString ().Trim ());

            while ( true)
            {
                if ( errArray. IndexOf( url) < 0)
                {
                    errArray. Add( url, 0);
                }

                try
                {

                    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security .RemoteCertificateValidationCallback (CheckValidationResult );// 验证服务器证书回调自动验证

                    WebRequest myRequest = WebRequest. Create( url);
                    myRequest. Timeout = timeout;
                    WebResponse myResponse = myRequest .GetResponse ();

                    myResponse. Close();
                    errArray. SetParmValue(url, 0);
                    return true;
                }
                catch ( Exception e)
                {
                    LongeMsg = "原因:" + e ;
                    ShorteMsg =  原因:" + e .Message ;

                    string toMail = dr["IPMAIL" ].ToString ().Trim ().Replace (";" , "," ).Replace (" ", ",").Replace (" ", ",");
                    string toPhone = dr["IPPHONE" ].ToString ().Trim ().Replace (";" , "," ).Replace (" ", ",").Replace (" ", ",");
#if DEBUG
                    toMail = "111@penavicoxm.comaa" ;
                    toPhone = "111,aa";
#endif
                    string sendText = "连接URL:" + url ;
                    if ( dr[ "IPREMARK"].ToString ().Trim () != "" )
                    {
                        sendText += "(" + dr["IPREMARK" ].ToString ().Trim () + ")" ;
                    }
                    sendText += "超时, 来自(" + this. localHost + ")";

                    tabPageBase.WriteError (sendText + "\n" + LongeMsg );
                    //超时 +1
                    errArray. SetParmValue(url, Convert.ToInt16 (errArray .GetParmValue (url ).ToString ().Trim ()) + 1);

                    //发送邮件
                    if (Convert.ToInt16 (errArray .GetParmValue (url ).ToString ().Trim ()) >= 1)
                    {
                        try
                        {
                            PENSendMail mail = new PENSendMail("111@penavicoxm.com" , toMail , "" , "" , sendText , LongeMsg);
                            mail. send();
                        }
                        catch ( Exception ex)
                        {
                            tabPageBase.WriteError (" 给邮箱:" + toMail + "发送邮件失败, 原因:" + ex);
                        }
                    }

                    //发送短信
                    if (Convert.ToInt16 (errArray .GetParmValue (url ).ToString ().Trim ()) >= 3)
                    {
                        string strErrMsg = "";
                        PENSMSSystem pensmsSystem = new PENSMSSystem ();
                        if (! pensmsSystem.SendMessage ("" , "SVRMON" , toPhone, sendText + "\n" + ShorteMsg , "MonService" , out strErrMsg ))
                        {
                            tabPageBase.WriteError (" 给手机:" + toPhone + "发送短信失败, 原因:" + strErrMsg);
                        }
                        errArray. SetParmValue(url, 0);
                        return false;
                    }
                }
            }
        }
       
        #endregion

        #region 忽略证书校验

        protected bool CheckValidationResult(object sender , X509Certificate certificate , X509Chain chain , SslPolicyErrors errors )
        {   // 总是接受
            return true;
        }

        #endregion

        #region 写日志

        private void writeLog( string msg)
        {
            string logFolder = AppDomain.CurrentDomain .BaseDirectory .ToString ().Trim () + "\\Log\\" ;

            DateTime dateTime = DateTime. Now;
            string logFilePath = logFolder + dateTime.ToString ("yyyyMMdd" ) + ".txt" ;
            if (! Directory. Exists( logFolder))
            {
                Directory. CreateDirectory(logFolder );
            }

            StreamWriter sw = new StreamWriter (logFilePath , true );
            string currentTime = dateTime .ToString ("yyyy-MM-dd HH:mm:ss-") + dateTime. Millisecond.ToString ().Trim ().PadLeft (3, '0' );
            msg = "" + currentTime + "   " + msg;
            sw. WriteLine( msg);
            sw. Flush();
            sw. Close();
        }

        #endregion
    }
0 0
原创粉丝点击