/* * SIPB service monitor. * * Nickolai Zeldovich * February 2002 */ #ifndef _SIPBMON_H #define _SIPBMON_H #include struct tcpconn_t; struct httpreq_t; class checker; class service; typedef callback::ptr cb_service; typedef callback::ptr cbbsb; typedef callback::ptr cbsvb; typedef callback::ptr cbsb; typedef callback::ptr cbb; typedef callback::ptr cbnotify; class service { str _name; checker *chk; bool _ok; str _errmsg; vec notify; bool active; timecb_t *timecb; void timeout (); void done (bool ok); public: service (str n, checker *c); void up (); void down (str msg); bool ok () { return _ok; } str name () { return _name; } str errmsg () { return _errmsg; } str descr (); void start (); void add_notify (cbnotify cb) { notify.push_back (cb); } }; class checker { service *svc; public: checker () : svc (NULL) {} virtual ~checker () {} void up () { svc->up (); } void down (str m) { svc->down (m); } void set_service (service *s) { svc = s; } virtual str descr () { return ""; } virtual void start () { fatal << "Base checker start called\n"; } virtual void stop () { fatal << "Base checker stop called\n"; } }; class http_checker : public checker { str url; httpreq_t *httpreq; public: http_checker (str u) : url (u), httpreq (NULL) {} void start (); void stop (); void response (str s, bool ok); str descr () { return url; } }; class tcp_checker : public checker { str host; int port; tcpconn_t *conn; public: tcp_checker (str h, int p) : host (h), port (p) {} void start (); void stop (); void connected (int fd); str descr () { return host << ":" << port; } }; class pksd_checker : public checker { str host; int port; str key; httpreq_t *httpreq; public: pksd_checker (str h, int p, str k) : host (h), port (p), key (k), httpreq (NULL) {} void response2 (str s, bool ok); void response1 (str s, bool ok); void start (); void stop (); str descr () { return host << ":" << port; } }; class news_checker : public checker { str host; int port; str group; int fd; tcpconn_t *conn; public: news_checker (str h, int p, str g) : host (h), port (p), group (g), fd (-1), conn (NULL) {} void read2 (strbuf s); void write_cb (bool ok); void read1 (strbuf s); void connected (int afd); void start (); void stop (); str descr () { return host << ":" << port; } }; void net_write (int fd, suio *s, cbb cb); extern int check_timeout; void notify_cons (service *svc); void notify_zephyr (service *svc); void status_init (int port, vec svec); void web_status_init (int port, vec svec); httpreq_t *http_get (str url, cbsb cb); void httpreq_abort (httpreq_t *req); tcpconn_t *tcpconn (str host, u_int16_t port, cbi cb); void tcpconn_abort (tcpconn_t *tc); #endif /* _SIPBMON_H */