Library used to fetch counter(s) from Munin. Data later can be presented on LCD etc.

Dependents:   munin-display-board

Committer:
PrzemekWirkus
Date:
Tue Apr 15 09:33:10 2014 +0000
Revision:
2:f964e7c125a7
Parent:
1:57dfa167adf7
Added constant buffer size instead of magic values.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PrzemekWirkus 0:27ea815508ee 1 // MUNIN Client library library
PrzemekWirkus 0:27ea815508ee 2 // mbed Team - 15 April 2014
PrzemekWirkus 0:27ea815508ee 3 // Author: Przemyslaw Wirkus
PrzemekWirkus 0:27ea815508ee 4
PrzemekWirkus 0:27ea815508ee 5 #ifndef MUNIN_CIENT_LIBRARY_H
PrzemekWirkus 0:27ea815508ee 6 #define MUNIN_CIENT_LIBRARY_H
PrzemekWirkus 0:27ea815508ee 7
PrzemekWirkus 0:27ea815508ee 8 #include <string>
PrzemekWirkus 0:27ea815508ee 9 #include <vector>
PrzemekWirkus 0:27ea815508ee 10 #include <sstream>
PrzemekWirkus 0:27ea815508ee 11 #include "mbed.h"
PrzemekWirkus 0:27ea815508ee 12 #include "EthernetInterface.h"
PrzemekWirkus 0:27ea815508ee 13
PrzemekWirkus 0:27ea815508ee 14 namespace {
PrzemekWirkus 0:27ea815508ee 15 // Munin command(s):
PrzemekWirkus 2:f964e7c125a7 16 const int MUNIN_BUFFER_SIZE = 256;
PrzemekWirkus 0:27ea815508ee 17 }
PrzemekWirkus 0:27ea815508ee 18
PrzemekWirkus 0:27ea815508ee 19 /** MuninClient class, used to fetch counters from Munin
PrzemekWirkus 0:27ea815508ee 20 *
PrzemekWirkus 0:27ea815508ee 21 * Example:
PrzemekWirkus 0:27ea815508ee 22 * @code
PrzemekWirkus 0:27ea815508ee 23
PrzemekWirkus 0:27ea815508ee 24 #include "munincli.h"
PrzemekWirkus 0:27ea815508ee 25 #include "dispBoB.h"
PrzemekWirkus 0:27ea815508ee 26
PrzemekWirkus 0:27ea815508ee 27 namespace
PrzemekWirkus 0:27ea815508ee 28 {
PrzemekWirkus 0:27ea815508ee 29 const char* MUNIN_SERVER_ADDRESS = "172.28.22.45";
PrzemekWirkus 0:27ea815508ee 30 const int MUNIN_SERVER_PORT = 4949;
PrzemekWirkus 0:27ea815508ee 31 }
PrzemekWirkus 0:27ea815508ee 32
PrzemekWirkus 0:27ea815508ee 33 namespace {
PrzemekWirkus 0:27ea815508ee 34 // Munin command(s):
PrzemekWirkus 0:27ea815508ee 35 char CMD_FETCH_USERS[] = "fetch users\n";
PrzemekWirkus 0:27ea815508ee 36 }
PrzemekWirkus 0:27ea815508ee 37
PrzemekWirkus 0:27ea815508ee 38
PrzemekWirkus 0:27ea815508ee 39 int main()
PrzemekWirkus 0:27ea815508ee 40 {
PrzemekWirkus 0:27ea815508ee 41 MuninClient munin_lcd;
PrzemekWirkus 0:27ea815508ee 42 munin_lcd.dhcp_connection(); // DHCP connection
PrzemekWirkus 0:27ea815508ee 43 dispBoB bob_display(p28, p27, p26);
PrzemekWirkus 0:27ea815508ee 44
PrzemekWirkus 0:27ea815508ee 45 while(true) {
PrzemekWirkus 0:27ea815508ee 46 while (munin_lcd.socket_connection(MUNIN_SERVER_ADDRESS, MUNIN_SERVER_PORT) < 0) {
PrzemekWirkus 0:27ea815508ee 47 wait(1);
PrzemekWirkus 0:27ea815508ee 48 }
PrzemekWirkus 0:27ea815508ee 49
PrzemekWirkus 0:27ea815508ee 50 munin_lcd.socket_recv();
PrzemekWirkus 0:27ea815508ee 51 munin_lcd.socket_send(CMD_FETCH_USERS, sizeof(CMD_FETCH_USERS));
PrzemekWirkus 0:27ea815508ee 52 munin_lcd.socket_recv_all();
PrzemekWirkus 0:27ea815508ee 53 {
PrzemekWirkus 0:27ea815508ee 54 const char *param = "usercount.value";
PrzemekWirkus 0:27ea815508ee 55 const int counter_value = munin_lcd.get_param_value(param);
PrzemekWirkus 0:27ea815508ee 56 bob_display.cls();
PrzemekWirkus 0:27ea815508ee 57 bob_display.printf("% 6d\n", counter_value);
PrzemekWirkus 0:27ea815508ee 58 }
PrzemekWirkus 0:27ea815508ee 59
PrzemekWirkus 0:27ea815508ee 60 munin_lcd.socket_close();
PrzemekWirkus 0:27ea815508ee 61 wait(3);
PrzemekWirkus 0:27ea815508ee 62 }
PrzemekWirkus 0:27ea815508ee 63 }
PrzemekWirkus 0:27ea815508ee 64
PrzemekWirkus 0:27ea815508ee 65
PrzemekWirkus 0:27ea815508ee 66 * @endcode
PrzemekWirkus 0:27ea815508ee 67 */
PrzemekWirkus 0:27ea815508ee 68 class MuninClient
PrzemekWirkus 0:27ea815508ee 69 {
PrzemekWirkus 0:27ea815508ee 70 public:
PrzemekWirkus 0:27ea815508ee 71 /** Connect to DHCP
PrzemekWirkus 0:27ea815508ee 72 */
PrzemekWirkus 0:27ea815508ee 73 void dhcp_connection() {
PrzemekWirkus 0:27ea815508ee 74 printf("DHCP: Connecting ... ");
PrzemekWirkus 0:27ea815508ee 75 eth.init(); //Use DHCP
PrzemekWirkus 0:27ea815508ee 76 eth.connect();
PrzemekWirkus 0:27ea815508ee 77 printf("%s\r\n", eth.getIPAddress());
PrzemekWirkus 0:27ea815508ee 78 }
PrzemekWirkus 0:27ea815508ee 79
PrzemekWirkus 0:27ea815508ee 80 /** Create a dispBoB object defined on the I2C master bus
PrzemekWirkus 0:27ea815508ee 81 *
PrzemekWirkus 0:27ea815508ee 82 * @param server Munin server IP / name
PrzemekWirkus 0:27ea815508ee 83 * @param port Munin server port
PrzemekWirkus 0:27ea815508ee 84 */
PrzemekWirkus 0:27ea815508ee 85 int socket_connection(const char *server, const int port) {
PrzemekWirkus 0:27ea815508ee 86 printf("TCP: Connecting ... ");
PrzemekWirkus 0:27ea815508ee 87 int ret = socket.connect(server, port) < 0;
PrzemekWirkus 0:27ea815508ee 88 printf("[OK]\r\n");
PrzemekWirkus 0:27ea815508ee 89 return ret;
PrzemekWirkus 0:27ea815508ee 90 }
PrzemekWirkus 0:27ea815508ee 91
PrzemekWirkus 0:27ea815508ee 92 /** Closes socket conenction to Munin server
PrzemekWirkus 0:27ea815508ee 93 */
PrzemekWirkus 0:27ea815508ee 94 void socket_close() {
PrzemekWirkus 0:27ea815508ee 95 socket.close();
PrzemekWirkus 0:27ea815508ee 96 }
PrzemekWirkus 0:27ea815508ee 97
PrzemekWirkus 0:27ea815508ee 98 /** Recv data from Munin to buffer 'buf'
PrzemekWirkus 0:27ea815508ee 99 */
PrzemekWirkus 0:27ea815508ee 100 int socket_recv() {
PrzemekWirkus 0:27ea815508ee 101 const int n = socket.receive(buf, sizeof(buf) - 1);
PrzemekWirkus 0:27ea815508ee 102 if (n > 0) {
PrzemekWirkus 0:27ea815508ee 103 buf[n] = '\0';
PrzemekWirkus 0:27ea815508ee 104 }
PrzemekWirkus 0:27ea815508ee 105 return n;
PrzemekWirkus 0:27ea815508ee 106 }
PrzemekWirkus 0:27ea815508ee 107
PrzemekWirkus 0:27ea815508ee 108 /** Recv data from Munin to buffer 'buf'. Used to fetch reply for Munin command (given counter name)
PrzemekWirkus 0:27ea815508ee 109 */
PrzemekWirkus 0:27ea815508ee 110 int socket_recv_all() {
PrzemekWirkus 0:27ea815508ee 111 const int n = socket.receive_all(buf, sizeof(buf) - 1);
PrzemekWirkus 0:27ea815508ee 112 if (n > 0) {
PrzemekWirkus 0:27ea815508ee 113 buf[n] = '\0';
PrzemekWirkus 0:27ea815508ee 114 }
PrzemekWirkus 0:27ea815508ee 115 return n;
PrzemekWirkus 0:27ea815508ee 116 }
PrzemekWirkus 0:27ea815508ee 117
PrzemekWirkus 0:27ea815508ee 118 /** Send data using socket to Munin server. Used to send command to Munin server.
PrzemekWirkus 0:27ea815508ee 119 * @param cmd Munin command string, must end with \n
PrzemekWirkus 0:27ea815508ee 120 * @param cmd_size Munin command buffer size
PrzemekWirkus 0:27ea815508ee 121 */
PrzemekWirkus 0:27ea815508ee 122 int socket_send(char *cmd, const int cmd_size) {
PrzemekWirkus 0:27ea815508ee 123 const int n = socket.send(cmd, cmd_size - 1);
PrzemekWirkus 0:27ea815508ee 124 return n;
PrzemekWirkus 0:27ea815508ee 125 }
PrzemekWirkus 0:27ea815508ee 126
PrzemekWirkus 0:27ea815508ee 127 /** Explodes Munin command reply into individual counters divided by '\n'.
PrzemekWirkus 0:27ea815508ee 128 * Function extract counter value from conunter wirh name param_name.
PrzemekWirkus 0:27ea815508ee 129 * @param param_name counter name
PrzemekWirkus 0:27ea815508ee 130 */
PrzemekWirkus 0:27ea815508ee 131 int get_param_value(std::string param_name) {
PrzemekWirkus 0:27ea815508ee 132 // Explode Munin command and creaste separate strings with counters
PrzemekWirkus 0:27ea815508ee 133 std::vector<std::string> s = explode(std::string(buf), '\n');
PrzemekWirkus 0:27ea815508ee 134
PrzemekWirkus 0:27ea815508ee 135 // For each counter name get its name and if name matches param_name extract and return counter value
PrzemekWirkus 0:27ea815508ee 136 for (std::vector<std::string>::iterator it = s.begin(); it != s.end(); ++it) {
PrzemekWirkus 0:27ea815508ee 137 std::string &param = *it;
PrzemekWirkus 0:27ea815508ee 138 if (!param.compare(0, param_name.size(), param_name)) {
PrzemekWirkus 0:27ea815508ee 139 std::vector<std::string> name_value = explode(param, ' ');
PrzemekWirkus 0:27ea815508ee 140 if (name_value.size() == 2) {
PrzemekWirkus 0:27ea815508ee 141 const int val = atoi(name_value[1].c_str());
PrzemekWirkus 0:27ea815508ee 142 return val;
PrzemekWirkus 0:27ea815508ee 143 }
PrzemekWirkus 0:27ea815508ee 144 }
PrzemekWirkus 0:27ea815508ee 145 }
PrzemekWirkus 0:27ea815508ee 146 return 0;
PrzemekWirkus 0:27ea815508ee 147 }
PrzemekWirkus 0:27ea815508ee 148
PrzemekWirkus 0:27ea815508ee 149 protected:
PrzemekWirkus 0:27ea815508ee 150 EthernetInterface eth;
PrzemekWirkus 0:27ea815508ee 151 TCPSocketConnection socket;
PrzemekWirkus 2:f964e7c125a7 152 char buf[MUNIN_BUFFER_SIZE];
PrzemekWirkus 0:27ea815508ee 153
PrzemekWirkus 0:27ea815508ee 154 // String explode function
PrzemekWirkus 0:27ea815508ee 155 std::vector<std::string> explode(std::string const &s, char delim) {
PrzemekWirkus 0:27ea815508ee 156 std::vector<std::string> result;
PrzemekWirkus 0:27ea815508ee 157 std::istringstream iss(s);
PrzemekWirkus 0:27ea815508ee 158 for (std::string token; std::getline(iss, token, delim); ) {
PrzemekWirkus 0:27ea815508ee 159 result.push_back(token);
PrzemekWirkus 0:27ea815508ee 160 }
PrzemekWirkus 0:27ea815508ee 161 return result;
PrzemekWirkus 0:27ea815508ee 162 }
PrzemekWirkus 0:27ea815508ee 163 };
PrzemekWirkus 0:27ea815508ee 164
PrzemekWirkus 0:27ea815508ee 165 #endif