/* * CommandManager.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "CommandManager.h" #include #include #include #include #include #include namespace Mad { namespace Client { void CommandManager::printHostStatus(const Net::Packets::HostStatusPacket &packet) { if(packet.getUptime()) { unsigned long days = packet.getUptime()/86400; unsigned long hours = (packet.getUptime()%86400)/3600; unsigned long minutes = (packet.getUptime()%3600)/60; std::printf("\tUptime:\t\t"); if(days) std::printf("%lu days ", days); std::printf("%lu:%02lu", hours, minutes); std::printf(" (load average: %.2f %.2f %.2f, %lu processes)", packet.getLoadAverage1(), packet.getLoadAverage5(), packet.getLoadAverage15(), (unsigned long)packet.getProcessNumber()); std::printf("\n\n"); } if(packet.getTotalMem() && packet.getFreeMem()) { const std::string units[] = { "kB", "MB", "GB", "TB", "" }; unsigned unit = 0; float totalMem = packet.getTotalMem(), usedMem = packet.getTotalMem()-packet.getFreeMem(); while(totalMem >= 1024 && !units[unit+1].empty()) { ++unit; totalMem /= 1024; usedMem /= 1024; } std::printf("\tMemory usage:\t%.*f/%.*f %s", (usedMem < 10) ? 2 : 1, usedMem, (totalMem < 10) ? 2 : 1, totalMem, units[unit].c_str()); std::printf(" (%.1f%%)\n", usedMem*100.0f/totalMem); if(packet.getTotalSwap() && packet.getFreeSwap()) { unit = 0; totalMem = packet.getTotalSwap(); usedMem = packet.getTotalSwap()-packet.getFreeSwap(); while(totalMem >= 1024 && !units[unit+1].empty()) { ++unit; totalMem /= 1024; usedMem /= 1024; } std::printf("\tSwap usage:\t%.*f/%.*f %s", (usedMem < 10) ? 2 : 1, usedMem, (totalMem < 10) ? 2 : 1, totalMem, units[unit].c_str()); std::printf(" (%.1f%%)\n", usedMem*100.0f/totalMem); } std::printf("\n"); } } void CommandManager::coreStatusRequestFinished(const Common::Request &request) { try { const Net::Packets::HostStatusPacket &packet = request.getResult(); std::cout << "Server status:" << std::endl; printHostStatus(packet); } catch(Common::Exception &exception) { Common::Logger::logf(Common::Logger::ERROR, "An error occurred during your request: %s.", exception.strerror().c_str()); } requestFinished(); } void CommandManager::daemonCommandRequestFinished(const Common::Request<> &request) { try { request.getResult(); } catch(Common::Exception &exception) { Common::Logger::logf(Common::Logger::ERROR, "An error occurred during your request: %s.", exception.strerror().c_str()); } requestFinished(); } void CommandManager::daemonStatusRequestFinished(const Common::Request &request) { try { const Net::Packets::HostStatusPacket &packet = request.getResult(); std::cout << "Host status:" << std::endl; printHostStatus(packet); } catch(Common::Exception &exception) { Common::Logger::logf(Common::Logger::ERROR, "An error occurred during your request: %s.", exception.strerror().c_str()); } requestFinished(); } void CommandManager::disconnectRequestFinished(const Common::Request<> &request) { try { request.getResult(); disconnect = true; } catch(Common::Exception &exception) { Common::Logger::logf(Common::Logger::ERROR, "An error occurred during your request: %s.", exception.strerror().c_str()); } requestFinished(); } } }