heartbeat

Simple server monitor system using encrypted messages over udp
git clone https://noulin.net/git/heartbeat.git
Log | Files | Refs | README

mika.c (9470B)


      1 #! /usr/bin/env sheepy
      2 /* or direct path to sheepy: #! /usr/local/bin/sheepy */
      3 
      4 /* Libsheepy documentation: https://spartatek.se/libsheepy/ */
      5 #include "libsheepyObject.h"
      6 #include "termbox.h"
      7 #include <stdarg.h>
      8 
      9 int argc; char **argv;
     10 
     11 /* enable/disable logging */
     12 /* #undef pLog */
     13 /* #define pLog(...) */
     14 
     15 typ struct {
     16   bool quit;
     17   u32 onCount;
     18 } contextt;
     19 
     20 typ struct {
     21   u32 x;
     22   u32 y;
     23   u32 width;
     24   u32 height;
     25   u32 color;
     26   char line[2048];
     27 } bubblet;
     28 
     29 bubblet bub[300] = init0Var;
     30 
     31 void print_tb(const char *str, int x, int y, uint16_t fg, uint16_t bg)
     32 {
     33   while (*str) {
     34     uint32_t uni;
     35     str += tb_utf8_char_to_unicode(&uni, str);
     36     tb_change_cell(x, y, uni, fg, bg);
     37     x++;
     38   }
     39 }
     40 
     41 void printf_tb(int x, int y, uint16_t fg, uint16_t bg, const char *fmt, ...)
     42 {
     43   char buf[4096];
     44   va_list vl;
     45   va_start(vl, fmt);
     46   vsnprintf(buf, sizeof(buf), fmt, vl);
     47   va_end(vl);
     48   print_tb(buf, x, y, fg, bg);
     49 }
     50 
     51 // tb_width(void);
     52 // tb_height(void);
     53 void showStuff(void *ct) {
     54  cast(contextt*,ctx,ct);
     55 
     56  u32 idx         = 0;
     57  // one bubble
     58  bub[idx].x      = 0;
     59  bub[idx].y      = tb_height()-1;
     60  bub[idx].width  = 20;
     61  bub[idx].height = 10;
     62  bub[idx].color  = 0xFFFFFF;
     63  range(i, bub[idx].width) {
     64    bub[idx].line[i] = 'd';
     65  }
     66  bub[idx].line[bub[idx].width] = 0;
     67  // end bubble
     68  // one bubble
     69  inc idx;
     70  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
     71  bub[idx].y      = tb_height()-1;
     72  bub[idx].width  = 30;
     73  bub[idx].height = 10;
     74  bub[idx].color  = 0xFFAAAA;
     75  range(i, bub[idx].width) {
     76    bub[idx].line[i] = 'd';
     77  }
     78  bub[idx].line[bub[idx].width] = 0;
     79  // end bubble
     80  // one bubble
     81  inc idx;
     82  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
     83  bub[idx].y      = tb_height()-1;
     84  bub[idx].width  = 10;
     85  bub[idx].height = 10;
     86  bub[idx].color  = 0xAAFFAA;
     87  range(i, bub[idx].width) {
     88    bub[idx].line[i] = 'd';
     89  }
     90  bub[idx].line[bub[idx].width] = 0;
     91  // end bubble
     92  // one bubble
     93  inc idx;
     94  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
     95  bub[idx].y      = tb_height()-1;
     96  bub[idx].width  = 5;
     97  bub[idx].height = 10;
     98  bub[idx].color  = 0xAAAAFF;
     99  range(i, bub[idx].width) {
    100    bub[idx].line[i] = 'd';
    101  }
    102  bub[idx].line[bub[idx].width] = 0;
    103  // end bubble
    104  // one bubble
    105  inc idx;
    106  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    107  bub[idx].y      = tb_height()-1;
    108  bub[idx].width  = 15;
    109  bub[idx].height = 10;
    110  bub[idx].color  = 0x8888FF;
    111  range(i, bub[idx].width) {
    112    bub[idx].line[i] = 'd';
    113  }
    114  bub[idx].line[bub[idx].width] = 0;
    115  // end bubble
    116  // one bubble
    117  inc idx;
    118  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    119  bub[idx].y      = tb_height()-1;
    120  bub[idx].width  = 15;
    121  bub[idx].height = 10;
    122  bub[idx].color  = 0xFFFFFF;
    123  range(i, bub[idx].width) {
    124    bub[idx].line[i] = 'd';
    125  }
    126  bub[idx].line[bub[idx].width] = 0;
    127  // end bubble
    128  // one bubble
    129  inc idx;
    130  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    131  bub[idx].y      = tb_height()-1;
    132  bub[idx].width  = 15;
    133  bub[idx].height = 10;
    134  bub[idx].color  = 0xFF8888;
    135  range(i, bub[idx].width) {
    136    bub[idx].line[i] = 'd';
    137  }
    138  bub[idx].line[bub[idx].width] = 0;
    139  // end bubble
    140  // one bubble
    141  inc idx;
    142  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    143  bub[idx].y      = tb_height()-1;
    144  bub[idx].width  = 15;
    145  bub[idx].height = 10;
    146  bub[idx].color  = 0x8888FF;
    147  range(i, bub[idx].width) {
    148    bub[idx].line[i] = 'd';
    149  }
    150  bub[idx].line[bub[idx].width] = 0;
    151  // end bubble
    152  // one bubble
    153  inc idx;
    154  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    155  bub[idx].y      = tb_height()-1;
    156  bub[idx].width  = 10;
    157  bub[idx].height = 10;
    158  bub[idx].color  = 0xFFFF88;
    159  range(i, bub[idx].width) {
    160    bub[idx].line[i] = 'd';
    161  }
    162  bub[idx].line[bub[idx].width] = 0;
    163  // end bubble
    164  // one bubble
    165  inc idx;
    166  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    167  bub[idx].y      = tb_height()-1;
    168  bub[idx].width  = 10;
    169  bub[idx].height = 10;
    170  bub[idx].color  = 0xFF88FF;
    171  range(i, bub[idx].width) {
    172    bub[idx].line[i] = 'd';
    173  }
    174  bub[idx].line[bub[idx].width] = 0;
    175  // end bubble
    176  // one bubble
    177  inc idx;
    178  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    179  bub[idx].y      = tb_height()-1;
    180  bub[idx].width  = 10;
    181  bub[idx].height = 10;
    182  bub[idx].color  = 0x88FFFF;
    183  range(i, bub[idx].width) {
    184    bub[idx].line[i] = 'd';
    185  }
    186  bub[idx].line[bub[idx].width] = 0;
    187  // end bubble
    188  // one bubble
    189  inc idx;
    190  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    191  bub[idx].y      = tb_height()-1;
    192  bub[idx].width  = 10;
    193  bub[idx].height = 10;
    194  bub[idx].color  = 0xFFAA55;
    195  range(i, bub[idx].width) {
    196    bub[idx].line[i] = 'd';
    197  }
    198  bub[idx].line[bub[idx].width] = 0;
    199  // end bubble
    200  // one bubble
    201  inc idx;
    202  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    203  bub[idx].y      = tb_height()-1;
    204  bub[idx].width  = 10;
    205  bub[idx].height = 10;
    206  bub[idx].color  = 0x55AAFF;
    207  range(i, bub[idx].width) {
    208    bub[idx].line[i] = 'd';
    209  }
    210  bub[idx].line[bub[idx].width] = 0;
    211  // end bubble
    212  // one bubble
    213  inc idx;
    214  bub[idx].x      = 4;
    215  bub[idx].y      = tb_height()-1;
    216  bub[idx].width  = 10;
    217  bub[idx].height = 20;
    218  bub[idx].color  = 0x55FFAA;
    219  range(i, bub[idx].width) {
    220    bub[idx].line[i] = 'd';
    221  }
    222  bub[idx].line[bub[idx].width] = 0;
    223  // end bubble
    224  // one bubble
    225  inc idx;
    226  bub[idx].x      = bub[idx-1].width + bub[idx-1].x + 10;
    227  bub[idx].y      = tb_height()-1;
    228  bub[idx].width  = 10;
    229  bub[idx].height = 20;
    230  bub[idx].color  = 0xFFCCAA;
    231  range(i, bub[idx].width) {
    232    bub[idx].line[i] = 'd';
    233  }
    234  bub[idx].line[bub[idx].width] = 0;
    235  // end bubble
    236  // one bubble
    237  inc idx;
    238  bub[idx].x      = bub[idx-1].width + bub[idx-1].x + 15;
    239  bub[idx].y      = tb_height()-1;
    240  bub[idx].width  = 10;
    241  bub[idx].height = 20;
    242  bub[idx].color  = 0xFF99AA;
    243  range(i, bub[idx].width) {
    244    bub[idx].line[i] = 'd';
    245  }
    246  bub[idx].line[bub[idx].width] = 0;
    247  // end bubble
    248  // one bubble
    249  inc idx;
    250  bub[idx].x      = bub[idx-1].width + bub[idx-1].x + 5;
    251  bub[idx].y      = tb_height()-1;
    252  bub[idx].width  = 10;
    253  bub[idx].height = 20;
    254  bub[idx].color  = 0x44EEAA;
    255  range(i, bub[idx].width) {
    256    bub[idx].line[i] = 'd';
    257  }
    258  bub[idx].line[bub[idx].width] = 0;
    259  // end bubble
    260  // one bubble
    261  inc idx;
    262  bub[idx].x      = bub[idx-1].width + bub[idx-1].x + 5;
    263  bub[idx].y      = tb_height()-1;
    264  bub[idx].width  = 40;
    265  bub[idx].height = 20;
    266  bub[idx].color  = 0x661100;
    267  range(i, bub[idx].width) {
    268    bub[idx].line[i] = 'd';
    269  }
    270  bub[idx].line[bub[idx].width] = 0;
    271  // end bubble
    272  // one bubble
    273  inc idx;
    274  bub[idx].x      = bub[idx-1].width + bub[idx-1].x + 5;
    275  bub[idx].y      = tb_height()-1;
    276  bub[idx].width  = 40;
    277  bub[idx].height = 20;
    278  bub[idx].color  = 0x002211;
    279  range(i, bub[idx].width) {
    280    bub[idx].line[i] = 'd';
    281  }
    282  bub[idx].line[bub[idx].width] = 0;
    283  // end bubble
    284  // one bubble
    285  inc idx;
    286  bub[idx].x      = 0;
    287  bub[idx].y      = tb_height()-1;
    288  bub[idx].width  = 80;
    289  bub[idx].height = 40;
    290  bub[idx].color  = 0x000000;
    291  range(i, bub[idx].width) {
    292    bub[idx].line[i] = 'd';
    293  }
    294  bub[idx].line[bub[idx].width] = 0;
    295  // end bubble
    296  // one bubble
    297  inc idx;
    298  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    299  bub[idx].y      = tb_height()-1;
    300  bub[idx].width  = 80;
    301  bub[idx].height = 40;
    302  bub[idx].color  = 0x000011;
    303  range(i, bub[idx].width) {
    304    bub[idx].line[i] = 'd';
    305  }
    306  bub[idx].line[bub[idx].width] = 0;
    307  // end bubble
    308  // one bubble
    309  inc idx;
    310  bub[idx].x      = bub[idx-1].width + bub[idx-1].x;
    311  bub[idx].y      = tb_height()-1;
    312  bub[idx].width  = 20;
    313  bub[idx].height = 40;
    314  bub[idx].color  = 0x000000;
    315  range(i, bub[idx].width) {
    316    bub[idx].line[i] = 'd';
    317  }
    318  bub[idx].line[bub[idx].width] = 0;
    319  // end bubble
    320 
    321  forever {
    322    if (ctx->onCount > idx+1) {
    323      tb_clear();
    324      //tb_present();
    325      ctx->onCount = 0;
    326    }
    327    range(i, ctx->onCount) {
    328      u32 delta = bub[i].color / (bub[i].height-1);
    329      range(h, bub[i].height) {
    330        if (bub[i].y+h >= tb_height()) break;
    331        //tb_stringf(bub[i].x, bub[i].y+h, bub[i].color, bub[i].color, bub[i].line);
    332        tb_stringf(bub[i].x, bub[i].y+h, bub[i].color/(h+1), bub[i].color/(h+1), bub[i].line);
    333        //tb_stringf(bub[i].x, bub[i].y+h, bub[i].color + delta*h, bub[i].color + delta*h, bub[i].line);
    334      }
    335      tb_present();
    336      dec bub[i].y;
    337      if (bub[i].y == 0) {
    338        bub[i].y = tb_height()-1;
    339      }
    340    }
    341    msSleep(500);
    342    if (ctx->quit) break;
    343  }
    344 }
    345 
    346 int main(int ARGC, char** ARGV) {
    347 
    348   argc = ARGC; argv = ARGV;
    349 
    350   initLibsheepy(ARGV[0]);
    351   setLogMode(LOG_FUNC);
    352   //openProgLogFile();
    353   //setLogSymbols(LOG_UTF8);
    354   //disableLibsheepyErrorLogs;
    355 
    356   int r = tb_init();
    357   if (r) {
    358     logE("tb_init() failed with error code %d\n", r);
    359     XFailure;
    360   }
    361 
    362   tb_select_output_mode(TB_OUTPUT_TRUECOLOR);
    363 
    364   //tb_set_cursor(0,0);
    365 
    366   void draw_all(void) {
    367     tb_clear();
    368     //tb_change_cell(/*x*/ 2, /*y*/ 2, '@', TB_GREEN, TB_WHITE | TB_BOLD);
    369     tb_present();
    370   }
    371 
    372   draw_all();
    373 
    374   contextt ctx = init0Var;
    375 
    376   tpoolAdd(showStuff, &ctx);
    377   struct tb_event ev;
    378   while (tb_poll_event(&ev)) {
    379     switch (ev.type) {
    380       case TB_EVENT_KEY:
    381         switch (ev.key) {
    382           /* case TB_KEY_ESC: */
    383           /*   ctx.quit = yes; */
    384           /*   goto done; */
    385           /*   break; */
    386           case TB_KEY_SPACE:
    387             ctx.onCount++;
    388             break;
    389         }
    390         if (ev.ch == 'q') {
    391           ctx.quit = yes;
    392           goto done;
    393         }
    394 
    395         //tb_stringf(2, 30, TB_WHITE, TB_DEFAULT, "key code: %5d, char: %5d, mod: %5d", ev.key, ev.ch, ev.mod);
    396         break;
    397       case TB_EVENT_RESIZE:
    398         draw_all();
    399         break;
    400     }
    401     tb_present();
    402   }
    403 
    404   done:
    405   tpoolWait;
    406   tb_shutdown();
    407   XSuccess;
    408 }
    409 // vim: set expandtab ts=2 sw=2: