/* Socks Server 5 * Copyright (C) 2002 - 2011 by Matteo Ricchetti - * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "SS5Main.h" int Stat_Err( void ); int Stat_Menu( void ); int Stat_Conn( char *addr ); int Stat_Bind( char *addr ); int Stat_Udp( char *addr ); int Stat_Authen( char *addr ); int Stat_Author( char *addr ); int main( int argc, char *argv[] ) { if( argc > 1 ) { if( !strncmp(argv[1],"CONNECT",sizeof("CONNECT")) ) Stat_Conn( "127.0.0.1" ); else if( !strncmp(argv[1],"BIND",sizeof("BIND")) ) Stat_Bind( "127.0.0.1" ); else if( !strncmp(argv[1],"UDP",sizeof("UDP")) ) Stat_Udp( "127.0.0.1" ); else if( !strncmp(argv[1],"AUTHEN",sizeof("AUTHEN")) ) Stat_Authen( "127.0.0.1" ); else if( !strncmp(argv[1],"AUTHOR",sizeof("AUTHOR")) ) Stat_Author( "127.0.0.1" ); else Stat_Err(); } else Stat_Menu(); return 0; } int Stat_Err( void ) { printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf("
"); printf("

BAD parameter:


"); printf("\n"); return 0; } int Stat_Menu( void ) { printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager menu\n"); printf(""); printf("

Statistics Manager Menu:



"); printf("

  • CONNECT counters

    "); printf("

  • BIND counters

    "); printf("

  • UDP counters

    "); printf("

  • AUTHEN counters

    "); printf("

  • AUTHOR counters

    "); printf("\n"); return 0; } int Stat_Conn( char *addr ) { ULINT v5tc,v4tc,v5nc,v4nc,v5fc,v4fc,v5cc,v4cc; struct sockaddr_in da_sin; int s; char *buf="GET /counter=CONNECT HTTP/1.1"; char resp[32]; if ( (s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return 1; } memset((char *)&da_sin, 0, sizeof(struct sockaddr_in)); da_sin.sin_family = AF_INET; da_sin.sin_port = htons(1080); da_sin.sin_addr.s_addr = inet_addr(addr); if( connect(s,(struct sockaddr *)&da_sin,sizeof(struct sockaddr_in)) != -1 ) { if( send(s,buf,strlen(buf),SS5_SEND_OPT) == -1) { perror("Sending error: "); return -1; } if( (recv(s,resp,sizeof(resp),0)) <= 0 ) { perror("Receiving error: "); return -1; } } else perror("Connecting error: "); sscanf(resp,"%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n",&v5tc,&v4tc,&v5nc,&v4nc,&v5fc,&v4fc,&v5cc,&v4cc); printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf(""); printf("

    CONNECT command counters:



    "); printf("\n"); printf("\n"); printf("",v4tc,v5tc); printf("",v4nc,v5nc); printf("",v4fc,v5fc); printf("",v4cc,v5cc); printf("
    V4NumberV5Number
    total%lutotal%lu
    normal%lunormal%lu
    failed%lufailed%lu
    current%lucurrent%lu
    \n"); printf("\n"); return 0; } int Stat_Bind( char *addr ) { ULINT v5tb,v4tb,v5nb,v4nb,v5fb,v4fb,v5cb,v4cb; struct sockaddr_in da_sin; int s; char *buf="GET /counter=BIND HTTP/1.1"; char resp[32]; if ( (s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return 1; } memset((char *)&da_sin, 0, sizeof(struct sockaddr_in)); da_sin.sin_family = AF_INET; da_sin.sin_port = htons(1080); da_sin.sin_addr.s_addr = inet_addr(addr); if( connect(s,(struct sockaddr *)&da_sin,sizeof(struct sockaddr_in)) != -1 ) { if( send(s,buf,strlen(buf),SS5_SEND_OPT) == -1) { perror("Sending error: "); return -1; } if( (recv(s,resp,sizeof(resp),0)) <= 0 ) { perror("Receiving error: "); return -1; } } else perror("Connecting error: "); sscanf(resp,"%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n",&v5tb,&v4tb,&v5nb,&v4nb,&v5fb,&v4fb,&v5cb,&v4cb); printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf(""); printf("

    BIND command counters:



    "); printf("\n"); printf("\n"); printf("",v4tb,v5tb); printf("",v4nb,v5nb); printf("",v4fb,v5fb); printf("",v4cb,v5cb); printf("
    V4NumberV5Number
    total%lutotal%lu
    normal%lunormal%lu
    failed%lufailed%lu
    current%lucurrent%lu
    \n"); printf("\n"); return 0; } int Stat_Udp( char *addr ) { ULINT v5tu,v5nu,v5fu,v5cu; struct sockaddr_in da_sin; int s; char *buf="GET /counter=UDP HTTP/1.1"; char resp[32]; if ( (s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return 1; } memset((char *)&da_sin, 0, sizeof(struct sockaddr_in)); da_sin.sin_family = AF_INET; da_sin.sin_port = htons(1080); da_sin.sin_addr.s_addr = inet_addr(addr); if( connect(s,(struct sockaddr *)&da_sin,sizeof(struct sockaddr_in)) != -1 ) { if( send(s,buf,strlen(buf),SS5_SEND_OPT) == -1) { perror("Sending error: "); return -1; } if( (recv(s,resp,sizeof(resp),0)) <= 0 ) { perror("Receiving error: "); return -1; } } else perror("Connecting error: "); sscanf(resp,"%lu\n%lu\n%lu\n%lu\n",&v5tu,&v5nu,&v5fu,&v5cu); printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf(""); printf("

    UDP command counters:



    "); printf("\n"); printf("\n"); printf("",v5tu); printf("",v5nu); printf("",v5fu); printf("",v5cu); printf("
    V5Number
    total%lu
    normal%lu
    failed%lu
    current%lu
    \n"); printf("\n"); return 0; } int Stat_Authen( char *addr ) { ULINT taf,tae,tap,naf,nae,nap,faf,fae,fap,caf,cae,cap; struct sockaddr_in da_sin; int s; char *buf="GET /counter=AUTHEN HTTP/1.1"; char resp[32]; if ( (s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return 1; } memset((char *)&da_sin, 0, sizeof(struct sockaddr_in)); da_sin.sin_family = AF_INET; da_sin.sin_port = htons(1080); da_sin.sin_addr.s_addr = inet_addr(addr); if( connect(s,(struct sockaddr *)&da_sin,sizeof(struct sockaddr_in)) != -1 ) { if( send(s,buf,strlen(buf),SS5_SEND_OPT) == -1) { perror("Sending error: "); return -1; } if( (recv(s,resp,sizeof(resp),0)) <= 0 ) { perror("Receiving error: "); return -1; } } else perror("Connecting error: "); sscanf(resp,"%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n",&taf,&tae,&tap,&naf,&nae,&nap,&faf,&fae,&fap,&caf,&cae,&cap); printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf(""); printf("

    AUTHENTICATION counters:



    "); printf("\n"); printf("\n"); printf("",taf,tae,tap); printf("",naf,nae,nap); printf("",faf,fae,fap); printf("",caf,cae,cap); printf("
    FileNumberEAPNumberPAMNumber
    total%lutotal%lutotal%lu
    normal%lunormal%lunormal%lu
    failed%lufailed%lufailed%lu
    current%lucurrent%lucurrent%lu
    \n"); printf("\n"); return 0; } int Stat_Author( char *addr ) { ULINT taf,tal,naf,nal,faf,fal,caf,cal; struct sockaddr_in da_sin; int s; char *buf="GET /counter=AUTHOR HTTP/1.1"; char resp[32]; if ( (s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return 1; } memset((char *)&da_sin, 0, sizeof(struct sockaddr_in)); da_sin.sin_family = AF_INET; da_sin.sin_port = htons(1080); da_sin.sin_addr.s_addr = inet_addr(addr); if( connect(s,(struct sockaddr *)&da_sin,sizeof(struct sockaddr_in)) != -1 ) { if( send(s,buf,strlen(buf),SS5_SEND_OPT) == -1) { perror("Sending error: "); return -1; } if( (recv(s,resp,sizeof(resp),0)) <= 0 ) { perror("Receiving error: "); return -1; } } else perror("Connecting error: "); sscanf(resp,"%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n%lu\n", &taf,&tal,&naf,&nal,&faf,&fal,&caf,&cal); printf("Content-type: text/html\n\n"); printf(" SS5 statistics manager\n"); printf(""); printf("

    AUTHORIZATION counters:


    "); printf("\n"); printf("\n"); printf("",taf,tal); printf("",naf,nal); printf("",faf,fal); printf("",caf,cal); printf("
    FileNumberLdapNumber
    total%lutotal%lu
    normal%lunormal%lu
    failed%lufailed%lu
    current%lucurrent%lu
    \n"); printf("\n"); return 0; }