Library used to fetch counter(s) from Munin. Data later can be presented on LCD etc.
Dependents: munin-display-board
munincli.h@2:f964e7c125a7, 2014-04-15 (annotated)
- 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?
User | Revision | Line number | New 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 ¶m = *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 |