00001
00002 using namespace std;
00003
00004 #include <QString>
00005 #include <QStringList>
00006
00007 #include "mythsystemevent.h"
00008 #include "mythsocket.h"
00009 #include "mythsocketmanager.h"
00010 #include "socketrequesthandler.h"
00011 #include "sockethandler.h"
00012 #include "mythmiscutil.h"
00013 #include "mythlogging.h"
00014 #include "mythcorecontext.h"
00015
00016 #include "requesthandler/basehandler.h"
00017
00018 bool BaseRequestHandler::HandleAnnounce(MythSocket *socket,
00019 QStringList &commands, QStringList &slist)
00020 {
00021 if (commands.size() != 4)
00022 return false;
00023
00024 bool blockShutdown;
00025 if (commands[1] == "Playback")
00026 blockShutdown = true;
00027 else if (commands[1] == "Monitor")
00028 blockShutdown = false;
00029 else
00030 return false;
00031
00032 QString hostname = commands[2];
00033
00034 int eventlevel = commands[3].toInt();
00035 bool systemevents = ( (eventlevel == 1) || (eventlevel == 3));
00036 bool normalevents = ( (eventlevel == 1) || (eventlevel == 2));
00037
00038 SocketHandler *handler = new SocketHandler(socket, m_parent, hostname);
00039 socket->setAnnounce(slist);
00040
00041 handler->BlockShutdown(blockShutdown);
00042 handler->AllowStandardEvents(normalevents);
00043 handler->AllowSystemEvents(systemevents);
00044
00045 m_parent->AddSocketHandler(handler);
00046
00047 QStringList sl; sl << "OK";
00048 handler->SendStringList(sl);
00049 handler->DownRef();
00050 handler = NULL;
00051
00052 LOG(VB_GENERAL, LOG_DEBUG, QString("MainServer::ANN %1")
00053 .arg(commands[1]));
00054 LOG(VB_GENERAL, LOG_NOTICE, QString("adding: %1 as a client (events: %2)")
00055 .arg(commands[2]).arg(eventlevel));
00056 gCoreContext->SendSystemEvent(QString("CLIENT_CONNECTED HOSTNAME %1")
00057 .arg(commands[2]));
00058
00059 return true;
00060 }
00061
00062 bool BaseRequestHandler::HandleQuery(SocketHandler *sock,
00063 QStringList &commands, QStringList &slist)
00064 {
00065 QString command = commands[0];
00066 bool res = false;
00067
00068 if (command == "QUERY_LOAD")
00069 res = HandleQueryLoad(sock);
00070 else if (command == "QUERY_UPTIME")
00071 res = HandleQueryUptime(sock);
00072 else if (command == "QUERY_HOSTNAME")
00073 res = HandleQueryHostname(sock);
00074 else if (command == "QUERY_MEMSTATS")
00075 res = HandleQueryMemStats(sock);
00076 else if (command == "QUERY_TIME_ZONE")
00077 res = HandleQueryTimeZone(sock);
00078
00079 return res;
00080 }
00081
00088 bool BaseRequestHandler::HandleQueryLoad(SocketHandler *sock)
00089 {
00090 QStringList strlist;
00091
00092 double loads[3];
00093 if (getloadavg(loads,3) == -1)
00094 {
00095 strlist << "ERROR";
00096 strlist << "getloadavg() failed";
00097 }
00098 else
00099 strlist << QString::number(loads[0])
00100 << QString::number(loads[1])
00101 << QString::number(loads[2]);
00102
00103 sock->SendStringList(strlist);
00104 return true;
00105 }
00106
00112 bool BaseRequestHandler::HandleQueryUptime(SocketHandler *sock)
00113 {
00114 QStringList strlist;
00115 time_t uptime;
00116
00117 if (getUptime(uptime))
00118 strlist << QString::number(uptime);
00119 else
00120 {
00121 strlist << "ERROR";
00122 strlist << "Could not determine uptime.";
00123 }
00124
00125 sock->SendStringList(strlist);
00126 return true;
00127 }
00128
00134 bool BaseRequestHandler::HandleQueryHostname(SocketHandler *sock)
00135 {
00136 QStringList strlist;
00137
00138 strlist << gCoreContext->GetHostName();
00139
00140 sock->SendStringList(strlist);
00141 return true;
00142 }
00143
00149 bool BaseRequestHandler::HandleQueryMemStats(SocketHandler *sock)
00150 {
00151 QStringList strlist;
00152 int totalMB, freeMB, totalVM, freeVM;
00153
00154 if (getMemStats(totalMB, freeMB, totalVM, freeVM))
00155 {
00156 strlist << QString::number(totalMB) << QString::number(freeMB)
00157 << QString::number(totalVM) << QString::number(freeVM);
00158 }
00159 else
00160 {
00161 strlist << "ERROR"
00162 << "Could not determine memory stats.";
00163 }
00164
00165 sock->SendStringList(strlist);
00166 return true;
00167 }
00168
00174 bool BaseRequestHandler::HandleQueryTimeZone(SocketHandler *sock)
00175 {
00176 QStringList strlist;
00177 strlist << getTimeZoneID() << QString::number(calc_utc_offset())
00178 << mythCurrentDateTime().toString(Qt::ISODate);
00179
00180 sock->SendStringList(strlist);
00181 return true;
00182 }
00183