X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=admin_client.c;h=982b8369eedf931abf60939b38b72385c530d354;hp=82b21e92621b2d8b23d68c1696dd29cd9da4f814;hb=3754d8f73ff7cb55e204f7ede6569028407a00e5;hpb=e9daaa4ef7ee895e6a8610ebb2166cc99c891a4e diff --git a/admin_client.c b/admin_client.c index 82b21e9..982b836 100644 --- a/admin_client.c +++ b/admin_client.c @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** LCR ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** @@ -26,9 +26,9 @@ #include "admin.h" #include "cause.h" -#define LTEE {addch(/*ACS_LTEE*/'t');addch(/*ACS_HLINE*/'q');addch(/*ACS_HLINE*/'q');} -#define LLCORNER {addch(/*ACS_LLCORNER*/'m');addch(/*ACS_HLINE*/'q');addch(/*ACS_HLINE*/'q');} -#define VLINE {addch(/*ACS_VLINE*/'x');addstr(" ");} +#define LTEE {addch(ACS_LTEE);addch(ACS_HLINE);addch(ACS_HLINE);} +#define LLCORNER {addch(ACS_LLCORNER);addch(ACS_HLINE);addch(ACS_HLINE);} +#define VLINE {addch(ACS_VLINE);addstr(" ");} #define EMPTY {addstr(" ");} //char rotator[] = {'-', '\\', '|', '/'}; int lastlines, lastcols; @@ -42,6 +42,9 @@ enum { MODE_ROUTE, MODE_DIAL, MODE_RELEASE, + MODE_UNBLOCK, + MODE_BLOCK, + MODE_UNLOAD, MODE_TESTCALL, MODE_TRACE, }; @@ -459,7 +462,7 @@ char *admin_state(int sock) /* send reload command */ memset(&msg, 0, sizeof(msg)); msg.message = ADMIN_REQUEST_STATE; -// printf("sizeof=%d\n",sizeof(msg)); +// printf("sizeof=%d\n",sizeof(msg));fflush(stdout); if (write(sock, &msg, sizeof(msg)) != sizeof(msg)) { cleanup_curses(); @@ -472,6 +475,7 @@ char *admin_state(int sock) cleanup_curses(); return("Broken pipe while receiving response."); } + if (msg.message != ADMIN_RESPONSE_STATE) { cleanup_curses(); @@ -484,19 +488,22 @@ char *admin_state(int sock) return("Not enough memory for messages."); } off=0; -readagain: - if ((len = read(sock, ((unsigned char *)(m))+off, num*sizeof(struct admin_message)-off)) != num*(int)sizeof(struct admin_message)-off) + if (num) { - if (len <= 0) { - free(m); -// fprintf(stderr, "got=%d expected=%d\n", i, num*sizeof(struct admin_message)); - cleanup_curses(); - return("Broken pipe while receiving state infos."); - } - if (len < num*(int)sizeof(struct admin_message)) + readagain: + if ((len = read(sock, ((unsigned char *)(m))+off, num*sizeof(struct admin_message)-off)) != num*(int)sizeof(struct admin_message)-off) { - off+=len; - goto readagain; + if (len <= 0) { + free(m); + // fprintf(stderr, "got=%d expected=%d\n", i, num*sizeof(struct admin_message)); + cleanup_curses(); + return("Broken pipe while receiving state infos."); + } + if (len < num*(int)sizeof(struct admin_message)) + { + off+=len; + goto readagain; + } } } j = 0; @@ -633,112 +640,125 @@ readagain: /* show interface summary */ move(++line>1?line:1, 0); color(white); - - SPRINT(buffer, "%s(%d) '%s' %s use:%d ", (m[i].u.i.ntmode)?"NT":"TE", m[i].u.i.portnum, m[i].u.i.interface_name, (m[i].u.i.ptp)?"ptp ":"ptmp", m[i].u.i.use); - addstr(buffer); - if (m[i].u.i.ptp || !m[i].u.i.ntmode) + if (m[i].u.i.block >= 2) { - color((m[i].u.i.l2link)?green:red); - addstr((m[i].u.i.l2link)?" L2 UP":" L2 down"); - } - color((m[i].u.i.l1link)?green:blue); - addstr((m[i].u.i.l1link)?" L1 ACTIVE":" L1 inactive"); - if (line+2 >= LINES) goto end; - /* show channels */ - if (show_interfaces > 1) + SPRINT(buffer, "%s (%d)%s", m[i].u.i.interface_name, m[i].u.i.portnum, (m[i].u.i.extension)?" (extension)":""); + addstr(buffer); + color(red); + addstr(" not loaded"); + } else { - ltee = 0; - j = k =0; - jj = m[i].u.i.channels; - while(j < jj) + SPRINT(buffer, "%s (%d) %s %s%s use:%d", m[i].u.i.interface_name, m[i].u.i.portnum, (m[i].u.i.ntmode)?"NT-mode":"TE-mode", (m[i].u.i.ptp)?"ptp ":"ptmp", (m[i].u.i.extension)?" extension":"", m[i].u.i.use); + addstr(buffer); + if (m[i].u.i.ptp || !m[i].u.i.ntmode) + { + color((m[i].u.i.l2link)?green:red); + addstr((m[i].u.i.l2link)?" L2 UP":" L2 down"); + } + color((m[i].u.i.l1link)?green:blue); + addstr((m[i].u.i.l1link)?" L1 ACTIVE":" L1 inactive"); + if (m[i].u.i.block) { - /* show all channels */ - if (show_interfaces>2 || m[i].u.i.busy[j]>0) + color(red); + addstr(" blocked"); + } + if (line+2 >= LINES) goto end; + /* show channels */ + if (show_interfaces > 1) + { + ltee = 0; + j = k =0; + jj = m[i].u.i.channels; + while(j < jj) { - color(cyan); - /* show left side / right side */ - if ((k & 1) && (COLS > 70)) + /* show all channels */ + if (show_interfaces>2 || m[i].u.i.busy[j]>0) { - move(line>1?line:1,4+((COLS-4)/2)); - } else - { - move(++line>1?line:1, 1); - LTEE - ltee = 1; - } - k++; - color(white); - if (m[i].u.i.pri) - SPRINT(buffer,"S%2d: ", j+1+(j>=15)); - else - SPRINT(buffer,"B%2d: ", j+1); - addstr(buffer); - if (!m[i].u.i.ptp) - goto ptmp; - if (m[i].u.i.l2link) - { - ptmp: - color((m[i].u.i.busy[j])?yellow:blue); - addstr((m[i].u.i.busy[j])?"busy":"idle"); - } else - { - color(red); - addstr("blk "); - } - if (m[i].u.i.port[j]) - { - /* search for port */ - l = msg.u.s.interfaces+msg.u.s.calls+msg.u.s.epoints; - ll = l+msg.u.s.ports; - while(l < ll) + color(cyan); + /* show left side / right side */ + if ((k & 1) && (COLS > 70)) { - if (m[l].u.p.serial == m[i].u.i.port[j]) + move(line>1?line:1,4+((COLS-4)/2)); + } else + { + move(++line>1?line:1, 1); + LTEE + ltee = 1; + } + k++; + color(white); + if (m[i].u.i.pri) + SPRINT(buffer,"S%2d: ", j+1+(j>=15)); + else + SPRINT(buffer,"B%2d: ", j+1); + addstr(buffer); + if (!m[i].u.i.ptp) + goto ptmp; + if (m[i].u.i.l2link && m[i].u.i.block==0) + { + ptmp: + color((m[i].u.i.busy[j])?yellow:blue); + addstr((m[i].u.i.busy[j])?"busy":"idle"); + } else + { + color(red); + addstr("blk "); + } + if (m[i].u.i.port[j]) + { + /* search for port */ + l = msg.u.s.interfaces+msg.u.s.calls+msg.u.s.epoints; + ll = l+msg.u.s.ports; + while(l < ll) { - SPRINT(buffer, " %s(%ld)", m[l].u.p.name, m[l].u.p.serial); - addstr(buffer); + if (m[l].u.p.serial == m[i].u.i.port[j]) + { + SPRINT(buffer, " %s(%ld)", m[l].u.p.name, m[l].u.p.serial); + addstr(buffer); + } + l++; } - l++; } - } - if (line+2 >= LINES) - { - if (ltee) + if (line+2 >= LINES) { - color(cyan); - move(line>1?line:1, 1); - LLCORNER + if (ltee) + { + color(cyan); + move(line>1?line:1, 1); + LLCORNER + } + goto end; } - goto end; } + j++; } - j++; - } - if (ltee) - { - color(cyan); - move(line>1?line:1, 1); - LLCORNER - } - if (line+2 >= LINES) goto end; - /* show summary if no channels were shown */ - if (show_interfaces<2 && ltee==0) - { - color(cyan); - move(++line>1?line:1, 1); - LLCORNER - - if (m[i].u.i.l2link) + if (ltee) { - color(green); - SPRINT(buffer,"all %d channels free", m[i].u.i.channels); - } else + color(cyan); + move(line>1?line:1, 1); + LLCORNER + } + if (line+2 >= LINES) goto end; + /* show summary if no channels were shown */ + if (show_interfaces<2 && ltee==0) { - color(red); - SPRINT(buffer,"all %d channels blocked", m[i].u.i.channels); + color(cyan); + move(++line>1?line:1, 1); + LLCORNER + + if (m[i].u.i.l2link && m[i].u.i.block==0) + { + color(green); + SPRINT(buffer,"all %d channels free", m[i].u.i.channels); + } else + { + color(red); + SPRINT(buffer,"all %d channels blocked", m[i].u.i.channels); + } + addstr(buffer); } - addstr(buffer); + if (line+2 >= LINES) goto end; } - if (line+2 >= LINES) goto end; } i++; anything = 1; @@ -905,7 +925,7 @@ readagain: { move(line++>1?line-1:1, 0); color(blue); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); color(white); l = logcur-(LINES-line-2); @@ -933,7 +953,7 @@ readagain: move(0, 0); color(white); msg.u.s.version_string[sizeof(msg.u.s.version_string)-1] = '\0'; - SPRINT(buffer, "PBX4Linux %s", msg.u.s.version_string); + SPRINT(buffer, "LCR %s", msg.u.s.version_string); addstr(buffer); if (COLS>50) { @@ -946,7 +966,7 @@ readagain: /* displeay head line */ move(1, 0); color(blue); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); if (offset) { move(1, 1); @@ -957,7 +977,7 @@ readagain: /* display end */ move(LINES-2, 0); color(white); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); move(LINES-1, 0); color(white); SPRINT(buffer, "i = interfaces '%s' c = calls '%s' l = log q = quit +/- = scroll", text_interfaces[show_interfaces], text_calls[show_calls]); @@ -1052,6 +1072,21 @@ char *admin_cmd(int sock, int mode, char *extension, char *number) msg.message = ADMIN_REQUEST_CMD_RELEASE; SCPY(msg.u.x.message, number); break; + case MODE_UNBLOCK: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 0; + break; + case MODE_BLOCK: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 1; + break; + case MODE_UNLOAD: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 2; + break; } if (write(sock, &msg, sizeof(msg)) != sizeof(msg)) @@ -1078,6 +1113,12 @@ char *admin_cmd(int sock, int mode, char *extension, char *number) if (msg.message != ADMIN_RESPONSE_CMD_RELEASE) return("Response not valid."); break; + case MODE_UNBLOCK: + case MODE_BLOCK: + case MODE_UNLOAD: + if (msg.message != ADMIN_RESPONSE_CMD_BLOCK) + return("Response not valid."); + break; } /* process response */ @@ -1293,10 +1334,13 @@ int main(int argc, char *argv[]) printf("\n"); printf("Usage: %s state | interface | route | dial ...\n", argv[0]); printf("state - View current states using graphical console output.\n"); - printf("interface - Tell PBX to reload \"interface.conf\".\n"); - printf("route - Tell PBX to reload \"route.conf\".\n"); - printf("dial - Tell PBX the next number to dial for extension.\n"); - printf("release - Tell PBX to release endpoint with given number.\n"); + printf("interface - Tell LCR to reload \"interface.conf\".\n"); + printf("route - Tell LCR to reload \"route.conf\".\n"); + printf("dial - Tell LCR the next number to dial for extension.\n"); + printf("release - Tell LCR to release endpoint with given number.\n"); + printf("block - Block given port.\n"); + printf("unblock - Unblock given port.\n"); + printf("unload - Unload port. To load port use 'block' or 'unblock'.\n"); printf("testcall [present|restrict []] - Testcall\n"); printf(" -> capability = (Values must be numbers, -1 to omit.)\n"); printf("trace [brief|short] [ [...]] - Shows call trace. Use filter to reduce output.\n"); @@ -1330,6 +1374,24 @@ int main(int argc, char *argv[]) goto usage; mode = MODE_RELEASE; } else + if (!(strcasecmp(argv[1],"unblock"))) + { + if (argc <= 2) + goto usage; + mode = MODE_UNBLOCK; + } else + if (!(strcasecmp(argv[1],"block"))) + { + if (argc <= 2) + goto usage; + mode = MODE_BLOCK; + } else + if (!(strcasecmp(argv[1],"unload"))) + { + if (argc <= 2) + goto usage; + mode = MODE_UNLOAD; + } else if (!(strcasecmp(argv[1],"testcall"))) { if (argc <= 4) @@ -1357,7 +1419,7 @@ int main(int argc, char *argv[]) if ((conn = connect(sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0) { close(sock); - fprintf(stderr, "Failed to connect to socket \"%s\".\nIs PBX4Linux running?\n", sock_address.sun_path); + fprintf(stderr, "Failed to connect to socket \"%s\".\nIs LCR running?\n", sock_address.sun_path); exit(EXIT_FAILURE); } @@ -1378,6 +1440,9 @@ int main(int argc, char *argv[]) break; case MODE_RELEASE: + case MODE_UNBLOCK: + case MODE_BLOCK: + case MODE_UNLOAD: ret = admin_cmd(sock, mode, NULL, argv[2]); break;