?? ipvsadm.c
字號:
int n; unsigned long temp1, temp2, temp3; char *cname, *vname, *dname; unsigned int minutes, seconds; char expire_str[12]; if ((n = sscanf(buf, "%s %lX %hX %lX %hX %lX %hX %s %d", protocol, &temp1, &cport, &temp2, &vport, &temp3, &dport, state, &expires)) == -1) exit(1); if (strcmp(protocol, "TCP") == 0) proto = IPPROTO_TCP; else if (strcmp(protocol, "UDP") == 0) proto = IPPROTO_UDP; else proto = 0; caddr.s_addr = (__u32) htonl(temp1); vaddr.s_addr = (__u32) htonl(temp2); daddr.s_addr = (__u32) htonl(temp3); if (!(cname=addrport_to_anyname(&caddr, cport, proto, format))) exit(1); if (!(vname=addrport_to_anyname(&vaddr, vport, proto, format))) exit(1); if (!(dname=addrport_to_anyname(&daddr, dport, proto, format))) exit(1); seconds = expires % 60; minutes = expires / 60; sprintf(expire_str, "%02d:%02d", minutes, seconds); printf("%-3s %-6s %-11s %-18s %-18s %s\n", protocol, expire_str, state, cname, vname, dname); free(cname); free(vname); free(dname);}void list_conn(unsigned int format){ static char buffer[256]; FILE *handle; handle = fopen(CONN_PROC_FILE, "r"); if (!handle) { fprintf(stderr, "cannot open file %s\n", CONN_PROC_FILE); exit(1); } /* read the first line */ if (fgets(buffer, sizeof(buffer), handle) == NULL) { fprintf(stderr, "unexpected input from %s\n", CONN_PROC_FILE); exit(1); } printf("IPVS connection entries\n"); printf("pro expire %-11s %-18s %-18s %s\n", "state", "source", "virtual", "destination"); /* * Print the VS information according to the format */ while (!feof(handle)) { if (fgets(buffer, sizeof(buffer), handle)) print_conn(buffer, format); } fclose(handle);}static inline char *fwd_name(unsigned flags){ char *fwd = NULL; switch (flags & IP_VS_CONN_F_FWD_MASK) { case IP_VS_CONN_F_MASQ: fwd = "Masq"; break; case IP_VS_CONN_F_LOCALNODE: fwd = "Local"; break; case IP_VS_CONN_F_TUNNEL: fwd = "Tunnel"; break; case IP_VS_CONN_F_DROUTE: fwd = "Route"; break; } return fwd;}static inline char *fwd_switch(unsigned flags){ char *swt = NULL; switch (flags & IP_VS_CONN_F_FWD_MASK) { case IP_VS_CONN_F_MASQ: swt = "-m"; break; case IP_VS_CONN_F_TUNNEL: swt = "-i"; break; case IP_VS_CONN_F_LOCALNODE: case IP_VS_CONN_F_DROUTE: swt = "-g"; break; } return swt;}static void print_largenum(unsigned long long i, unsigned int format){ char mytmp[32]; size_t len; if (format & FMT_EXACT) { len = snprintf(mytmp, 32, "%llu", i); printf("%*llu", len <= 8 ? 9 : len + 1, i); return; } if (i < 100000000) /* less than 100 million */ printf("%9llu", i); else if (i < 1000000000) /* less than 1 billion */ printf("%8lluK", i / 1000); else if (i < 100000000000ULL) /* less than 100 billion */ printf("%8lluM", i / 1000000); else if (i < 100000000000000ULL) /* less than 100 trillion */ printf("%8lluG", i / 1000000000ULL); else printf("%8lluT", i / 1000000000000ULL);}static void print_title(unsigned int format){ if (format & FMT_STATS) printf("%-33s %8s %8s %8s %8s %8s\n" " -> RemoteAddress:Port\n", "Prot LocalAddress:Port", "Conns", "InPkts", "OutPkts", "InBytes", "OutBytes"); else if (format & FMT_RATE) printf("%-33s %8s %8s %8s %8s %8s\n" " -> RemoteAddress:Port\n", "Prot LocalAddress:Port", "CPS", "InPPS", "OutPPS", "InBPS", "OutBPS"); else if (format & FMT_THRESHOLDS) printf("%-33s %-10s %-10s %-10s %-10s\n" " -> RemoteAddress:Port\n", "Prot LocalAddress:Port", "Uthreshold", "Lthreshold", "ActiveConn", "InActConn"); else if (format & FMT_PERSISTENTCONN) printf("%-33s %-9s %-11s %-10s %-10s\n" " -> RemoteAddress:Port\n", "Prot LocalAddress:Port", "Weight", "PersistConn", "ActiveConn", "InActConn"); else if (!(format & FMT_RULE)) printf("Prot LocalAddress:Port Scheduler Flags\n" " -> RemoteAddress:Port Forward Weight ActiveConn InActConn\n");}static voidprint_service_entry(ipvs_service_entry_t *se, unsigned int format){ struct ip_vs_get_dests *d; char svc_name[64]; int i; if (!(d = ipvs_get_dests(se))) exit(1); if (se->fwmark) { if (format & FMT_RULE) sprintf(svc_name, "-f %d", se->fwmark); else sprintf(svc_name, "FWM %d", se->fwmark); } else { struct in_addr vaddr; char *vname; vaddr.s_addr = se->addr; if (!(vname = addrport_to_anyname(&vaddr, ntohs(se->port), se->protocol, format))) fail(2, "addrport_to_anyname: %s", strerror(errno)); if (format & FMT_RULE) sprintf(svc_name, "%s %s", se->protocol==IPPROTO_TCP?"-t":"-u", vname); else { sprintf(svc_name, "%s %s", se->protocol==IPPROTO_TCP?"TCP":"UDP", vname); svc_name[33] = '\0'; } free(vname); } /* print virtual service info */ if (format & FMT_RULE) { printf("-A %s -s %s", svc_name, se->sched_name); if (se->flags & IP_VS_SVC_F_PERSISTENT) { printf(" -p %u", se->timeout); if (se->netmask != (unsigned long int) 0xffffffff) { struct in_addr mask; mask.s_addr = se->netmask; printf(" -M %s", inet_ntoa(mask)); } } } else if (format & FMT_STATS) { printf("%-33s", svc_name); print_largenum(se->stats.conns, format); print_largenum(se->stats.inpkts, format); print_largenum(se->stats.outpkts, format); print_largenum(se->stats.inbytes, format); print_largenum(se->stats.outbytes, format); } else if (format & FMT_RATE) { printf("%-33s", svc_name); print_largenum(se->stats.cps, format); print_largenum(se->stats.inpps, format); print_largenum(se->stats.outpps, format); print_largenum(se->stats.inbps, format); print_largenum(se->stats.outbps, format); } else { printf("%s %s", svc_name, se->sched_name); if (se->flags & IP_VS_SVC_F_PERSISTENT) { printf(" persistent %u", se->timeout); if (se->netmask != (unsigned long int) 0xffffffff) { struct in_addr mask; mask.s_addr = se->netmask; printf(" mask %s", inet_ntoa(mask)); } } } printf("\n"); /* print all the destination entries */ if (format & FMT_SORT) ipvs_sort_dests(d, ipvs_cmp_dests); for (i = 0; i < d->num_dests; i++) { struct in_addr daddr; char *dname; ipvs_dest_entry_t *e = &d->entrytable[i]; daddr.s_addr = e->addr; if (!(dname = addrport_to_anyname(&daddr, ntohs(e->port), se->protocol, format))) exit(1); if (!(format & FMT_RULE)) dname[28] = '\0'; if (format & FMT_RULE) { printf("-a %s -r %s %s -w %d\n", svc_name, dname, fwd_switch(e->conn_flags), e->weight); } else if (format & FMT_STATS) { printf(" -> %-28s", dname); print_largenum(e->stats.conns, format); print_largenum(e->stats.inpkts, format); print_largenum(e->stats.outpkts, format); print_largenum(e->stats.inbytes, format); print_largenum(e->stats.outbytes, format); printf("\n"); } else if (format & FMT_RATE) { printf(" -> %-28s %8u %8u %8u", dname, e->stats.cps, e->stats.inpps, e->stats.outpps); print_largenum(e->stats.inbps, format); print_largenum(e->stats.outbps, format); printf("\n"); } else if (format & FMT_THRESHOLDS) { printf(" -> %-28s %-10u %-10u %-10u %-10u\n", dname, e->u_threshold, e->l_threshold, e->activeconns, e->inactconns); } else if (format & FMT_PERSISTENTCONN) { printf(" -> %-28s %-9u %-11u %-10u %-10u\n", dname, e->weight, e->persistconns, e->activeconns, e->inactconns); } else printf(" -> %-28s %-7s %-6d %-10u %-10u\n", dname, fwd_name(e->conn_flags), e->weight, e->activeconns, e->inactconns); free(dname); } free(d);}static void list_service(ipvs_service_t *svc, unsigned int format){ ipvs_service_entry_t *entry; if (!(entry = ipvs_get_service(svc->fwmark, svc->protocol, svc->addr, svc->port))) { fprintf(stderr, "%s\n", ipvs_strerror(errno)); exit(1); } print_title(format); print_service_entry(entry, format); free(entry);}static void list_all(unsigned int format){ struct ip_vs_get_services *get; int i; if (!(format & FMT_RULE)) printf("IP Virtual Server version %d.%d.%d (size=%d)\n", NVERSION(ipvs_info.version), ipvs_info.size); if (!(get = ipvs_get_services())) { fprintf(stderr, "%s\n", ipvs_strerror(errno)); exit(1); } if (format & FMT_SORT) ipvs_sort_services(get, ipvs_cmp_services); print_title(format); for (i = 0; i < get->num_services; i++) print_service_entry(&get->entrytable[i], format); free(get);}void list_timeout(void){ ipvs_timeout_t *u; if (!(u = ipvs_get_timeout())) exit(1); printf("Timeout (tcp tcpfin udp): %d %d %d\n", u->tcp_timeout, u->tcp_fin_timeout, u->udp_timeout); free(u);}static void list_daemon(void){ ipvs_daemon_t *u; if (!(u = ipvs_get_daemon())) exit(1); if (u[0].state & IP_VS_STATE_MASTER) printf("master sync daemon (mcast=%s, syncid=%d)\n", u[0].mcast_ifn, u[0].syncid); if (u[1].state & IP_VS_STATE_BACKUP) printf("backup sync daemon (mcast=%s, syncid=%d)\n", u[1].mcast_ifn, u[1].syncid); free(u);}int host_to_addr(const char *name, struct in_addr *addr){ struct hostent *host; if ((host = gethostbyname(name)) != NULL) { if (host->h_addrtype != AF_INET || host->h_length != sizeof(struct in_addr)) return -1; /* warning: we just handle h_addr_list[0] here */ memcpy(addr, host->h_addr_list[0], sizeof(struct in_addr)); return 0; } return -1;}static char * addr_to_host(struct in_addr *addr){ struct hostent *host; if ((host = gethostbyaddr((char *) addr, sizeof(struct in_addr), AF_INET)) != NULL) return (char *) host->h_name; else return (char *) NULL;}static char * addr_to_anyname(struct in_addr *addr){ char *name; if ((name = addr_to_host(addr)) != NULL) return name; else return inet_ntoa(*addr);}int service_to_port(const char *name, unsigned short proto){ struct servent *service; if (proto == IPPROTO_TCP && (service = getservbyname(name, "tcp")) != NULL) return ntohs((unsigned short) service->s_port); else if (proto == IPPROTO_UDP && (service = getservbyname(name, "udp")) != NULL) return ntohs((unsigned short) service->s_port); else return -1;}static char * port_to_service(unsigned short port, unsigned short proto){ struct servent *service; if (proto == IPPROTO_TCP && (service = getservbyport(htons(port), "tcp")) != NULL) return service->s_name; else if (proto == IPPROTO_UDP && (service = getservbyport(htons(port), "udp")) != NULL) return service->s_name; else return (char *) NULL;}static char * port_to_anyname(unsigned short port, unsigned short proto){ char *name; static char buf[10]; if ((name = port_to_service(port, proto)) != NULL) return name; else { sprintf(buf, "%u", port); return buf; }}static char *addrport_to_anyname(struct in_addr *addr, unsigned short port, unsigned short proto, unsigned int format){ char *buf; if (!(buf=malloc(60))) return NULL; if (format & FMT_NUMERIC) { snprintf(buf, 60, "%s:%u", inet_ntoa(*addr), port); } else { snprintf(buf, 60, "%s:%s", addr_to_anyname(addr), port_to_anyname(port, proto)); } return buf;}static int str_is_digit(const char *str){ size_t offset; size_t top; top = strlen(str); for (offset=0; offset<top; offset++) { if (!isdigit((int)*(str+offset))) { break; } } return (offset<top)?0:1;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -