Compare commits
	
		
			3 Commits
		
	
	
		
			86956ff1ce
			...
			e571a27c75
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e571a27c75 | |||
| a59a25baa5 | |||
| 57890907ae | 
							
								
								
									
										11
									
								
								src/ac/act.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/ac/act.c
									
									
									
									
									
								
							| @ -367,9 +367,16 @@ main(int argc , char *argv[]) | ||||
| 			} | ||||
| 		} else if (el_parse(el, ac, av) == -1) { | ||||
| 			char str[2000]; | ||||
|  | ||||
| 			int i; | ||||
| 			char * sp =""; | ||||
| 			str[0]=0; | ||||
| 			fprintf(act_f,"%s\n",av[0]); | ||||
|  | ||||
| 			for (i=0; i<ac; i++){ | ||||
| 				fprintf(act_f,"%s%s",sp,av[i]); | ||||
| 				sp=" "; | ||||
| 			} | ||||
| 			fprintf(act_f,"\n"); | ||||
|  | ||||
| 			fflush(act_f); | ||||
| 			do { | ||||
| 				int n; | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| # | ||||
| #capwap/ac-name | ||||
| # | ||||
| capwap/ac-name: actube | ||||
| capwap/ac-name: actube_X | ||||
|  | ||||
| capwap/ssl-cipher: DHE-RSA:RSA:AES-256-CBC:AES-128-CBC:SHA1:PSK | ||||
| capwap/ssl-psk-enable: false | ||||
| @ -36,7 +36,7 @@ actube/ipv6: false | ||||
| #actube/mod.2: capwap80211 | ||||
| # | ||||
|  | ||||
| #actube/mod.0: cisco | ||||
| actube/mod.0: cisco | ||||
| actube/mod.1: capwap | ||||
| actube/mod.2: capwap80211 | ||||
|  | ||||
| @ -59,7 +59,7 @@ ac-descriptor/station-limit: 1000 | ||||
| ac-descriptor/stations: 0 | ||||
|  | ||||
|  | ||||
| capwap-control-ip-address/address.0: 192.168.0.14 | ||||
| capwap-control-ip-address/address.0: 192.168.0.24 | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										275
									
								
								src/ac/rpc.c
									
									
									
									
									
								
							
							
						
						
									
										275
									
								
								src/ac/rpc.c
									
									
									
									
									
								
							| @ -104,7 +104,9 @@ static void finish_cmd(FILE *f) | ||||
|  | ||||
| int prompt_cmd(struct rpcdata *sd, const char *cmd) | ||||
| { | ||||
| 	fprintf(sd->out,"actube[%s]:>\n","*"); | ||||
| 	const char *acname = cw_cfg_get(sd->global_cfg,"capwap/ac-name","actube"); | ||||
|  | ||||
| 	fprintf(sd->out,"%s[%s]:>\n",acname,sd->prompt); | ||||
| 	finish_cmd(sd->out); | ||||
| 	return 0; | ||||
| } | ||||
| @ -123,11 +125,14 @@ int select_cmd(struct rpcdata *sd, const char *cmd) | ||||
| 	char ap [CAPWAP_MAX_WTP_NAME_LEN]; | ||||
| 	sscanf(cmd,"%s",ap); | ||||
| 	strcpy(sd->prompt,ap); | ||||
| 	finish_cmd(sd->out); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int list_cmd(struct rpcdata *sd, const char *cmd) | ||||
| { | ||||
| 	show_aps(sd->out); | ||||
| 	finish_cmd(sd->out); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -152,9 +157,9 @@ int cfg_cmd(struct rpcdata *sd, const char *cmd) | ||||
| 		fprintf(sd->out,"WTP '%s' not found\n",sd->prompt); | ||||
| 	} | ||||
| 	else { | ||||
| 		stop(); | ||||
| //		show_cfg(sd->out,conn->remote_cfg); | ||||
| 		cw_cfg_fdump(sd->out,conn->remote_cfg); | ||||
| 	} | ||||
| 	finish_cmd(sd->out); | ||||
| 	wtplist_unlock(); | ||||
| 	return 0; | ||||
| } | ||||
| @ -209,20 +214,24 @@ wlan0_cmd(struct rpcdata * sd, const char *cmd) | ||||
|  | ||||
| int set_cmd(struct rpcdata *sd, const char *str) | ||||
| { | ||||
| /*	struct cw_Conn * conn; | ||||
| 	struct cw_Val_Reader r; | ||||
| 	char key[CW_CFG_MAX_KEY_LEN]; | ||||
| 	char type[CW_CFG_MAX_KEY_LEN]; | ||||
| 	char val[2048]; | ||||
| */ | ||||
| 	stop(); | ||||
|  | ||||
| 	cw_Cfg_t *cfg; | ||||
| 	cfg = cw_cfg_create(); | ||||
|  | ||||
| 	cw_cfg_read_from_string(str,cfg); | ||||
|  | ||||
| 	cw_cfg_fdump(sd->out,cfg); | ||||
|  | ||||
| 	cw_cfg_destroy(cfg); | ||||
|  | ||||
| 	finish_cmd(sd->out); | ||||
|  | ||||
| //	cw_ktv_init_str_reader(&r,str,strlen(str)); | ||||
| 	 | ||||
| //	cw_ktv_parse_string(&r,key,type,val); | ||||
| 	/*cw_ktv_parse_string(key,type,val, 2048);*/ | ||||
| 	 | ||||
| //	fprintf(sd->out,"%s :%s: %s\n",key,type,val); | ||||
| //	fprintf(sd->out,"%s %s\n",key,val); | ||||
| //	cw_ktv_add(sd->update_cfg,key,CW_TYPE_STR,NULL,val,strlen(val)); | ||||
| 	return 0; | ||||
| } | ||||
| @ -262,10 +271,28 @@ void show_cfg (FILE *out, mavl_t ktv) | ||||
| } | ||||
| */ | ||||
|  | ||||
|  | ||||
| void print_mw(FILE *f, int w, const char * str) | ||||
| { | ||||
| 	int n,i; | ||||
| 	fprintf(f, "%.*s",w,str); | ||||
| 	n=strlen(str); | ||||
|  | ||||
| 	if ( n>w ){ | ||||
| 		fprintf(f,"> "); | ||||
| 		return; | ||||
| 	} | ||||
| 	n = w-n; | ||||
|  | ||||
| 	for(i=0;i<(n+2);i++){ | ||||
| 		fprintf(f,"%c",' '); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| int  show_aps (FILE *out) | ||||
| { | ||||
| 	stop(); | ||||
| /*	struct connlist * cl; | ||||
| 	struct connlist * cl; | ||||
| 	mavliter_t it; | ||||
| 	wtplist_lock(); | ||||
| 	 | ||||
| @ -273,31 +300,29 @@ int  show_aps (FILE *out) | ||||
| 	 | ||||
| 	 | ||||
| 	mavliter_init (&it, cl->by_addr); | ||||
| 	fprintf (out, "IP\t\t\twtp-name\n"); | ||||
| 	print_mw (out, 16, "AP Name"); | ||||
| 	print_mw (out, 16, "AP Model"); | ||||
| 	print_mw (out, 14, "Vendor"); | ||||
| 	print_mw (out, 16, "IP "); | ||||
| 	fprintf(out,"\n"); | ||||
|  | ||||
| 	mavliter_foreach (&it) { | ||||
| 		cw_Val_t * result; | ||||
| 		char addr[SOCK_ADDR_BUFSIZE]; | ||||
| 		char wtp_name[CAPWAP_MAX_WTP_NAME_LEN]; | ||||
| 		const char *vendor; | ||||
|  | ||||
| 		struct cw_Conn * conn; | ||||
| 		conn = mavliter_get_ptr (&it); | ||||
| 		 | ||||
| 		sock_addr2str_p (&conn->addr, addr); | ||||
|  | ||||
| 		stop();		 | ||||
| //		result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL); | ||||
| 		 | ||||
| 		if (result == NULL) { | ||||
| 			strcpy (wtp_name, ""); | ||||
| 			 | ||||
| 		} else { | ||||
| 			result->type->to_str (result, wtp_name, CAPWAP_MAX_WTP_NAME_LEN); | ||||
| 		} | ||||
| 		 | ||||
| 		 | ||||
| 		fprintf (out, "%s\t\t%s\n", addr, wtp_name); | ||||
| 		print_mw(out,16,cw_cfg_get(conn->remote_cfg, "wtp-name", "Unknown")); | ||||
| 		print_mw(out,16,cw_cfg_get(conn->remote_cfg, "wtp-board-data/model-no", "Unknown")); | ||||
| 		vendor = cw_cfg_get(conn->remote_cfg, "wtp-board-data/vendor", "0"); | ||||
| 		print_mw(out,14,vendor);	 | ||||
| 		sock_addr2str_p (&conn->addr, addr); | ||||
| 		print_mw(out,16,addr); | ||||
| 		fprintf(out,"\n"); | ||||
|  | ||||
| 	} | ||||
| 	wtplist_unlock(); | ||||
| 	*/ | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -305,40 +330,30 @@ int  show_aps (FILE *out) | ||||
|  | ||||
| struct cw_Conn * find_ap(const char *name) | ||||
| { | ||||
| stop(); | ||||
| /*	 | ||||
| 	 | ||||
| 	struct connlist * cl; | ||||
| 	mavliter_t it; | ||||
|  | ||||
| 	cl = wtplist_get_connlist(); | ||||
| 	 | ||||
| 	 | ||||
| 	mavliter_init (&it, cl->by_addr); | ||||
| 	mavliter_foreach (&it) { | ||||
| 		cw_Val_t * result; | ||||
| 		char wtp_name[CAPWAP_MAX_WTP_NAME_LEN]; | ||||
| 		const char *wtpname; | ||||
| 		struct cw_Conn * conn; | ||||
| 		conn = mavliter_get_ptr (&it); | ||||
| 		 | ||||
| 		result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL); | ||||
| 		wtpname = cw_cfg_get (conn->remote_cfg, "wtp-name", NULL); | ||||
| 		 | ||||
| 		if (result == NULL) { | ||||
| 			strcpy (wtp_name, ""); | ||||
| 			 | ||||
| 		} else { | ||||
| 			result->type->to_str (result, wtp_name, CAPWAP_MAX_WTP_NAME_LEN); | ||||
| 		} | ||||
| 	 | ||||
| 		printf("cmp '%s' : '%s'\n",wtp_name,name); | ||||
| 		if (wtpname == NULL) | ||||
| 			continue; | ||||
| 		 | ||||
| 		if(strcmp(wtp_name,name)==0){ | ||||
| 		if(strcmp(wtpname,name)==0){ | ||||
| 			return conn; | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	return NULL; | ||||
| 	*/ | ||||
| 	/*wtplist_unlock();*/ | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -400,16 +415,20 @@ void con (FILE *out) | ||||
|  | ||||
| struct command * find_cmd(const char *cmd) | ||||
| { | ||||
| 	struct command * search; | ||||
| 	struct command * search,*result; | ||||
| 	 | ||||
| 	result=NULL; | ||||
| 	search = cmdlist; | ||||
| 	while (search->cmd!=NULL){ | ||||
| 		if (strncmp(cmd,search->cmd,strlen(cmd))==0){ | ||||
| 			return search; | ||||
| 			if (result==NULL) | ||||
| 				result = search; | ||||
| 			else  | ||||
| 				return NULL; | ||||
| 		} | ||||
| 		search ++; | ||||
| 	} | ||||
| 	return NULL; | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -506,147 +525,8 @@ struct esc_strings estr[] = { | ||||
|  | ||||
| }; | ||||
|  | ||||
| static int cmpansi(char * str,char * ansistr) | ||||
| { | ||||
| 	int sl,al; | ||||
| 	sl = strlen(str); | ||||
| 	al = strlen(ansistr); | ||||
|  | ||||
|  | ||||
| 	if(sl>al){ | ||||
| 		return 0; | ||||
| 	} | ||||
| 	if (sl<al){ | ||||
| 		if (strncmp(str,ansistr,sl)==0) | ||||
| 			return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (strcmp(str,ansistr)==0) | ||||
| 		return 1; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| static void get_line_char_mode(FILE * file, struct rpcdata *sd) | ||||
| { | ||||
| 	int c; | ||||
| 	struct esc_strings * es; | ||||
|  | ||||
| 	es = NULL; | ||||
| 	sd->line[0]=0; | ||||
| 	sd->pos=0; | ||||
| 	sd->esc[0]=0; | ||||
| 	sd->escpos=0; | ||||
|  | ||||
| //	fprintf (file, "\xff\xfc\22"); | ||||
|  | ||||
| 	/* Put telnet into char mode */ | ||||
| 	fprintf (file,"%c%c%c",IAC,WILL,TELOPT_ECHO ); | ||||
| 	fprintf (file,"%c%c%c",IAC,WILL,TELOPT_SGA ); | ||||
| 	fprintf (file,"%c%c%c",IAC,DONT,TELOPT_LINEMODE ); | ||||
|  | ||||
|  | ||||
| 	fprintf (file, "actube[%s]:>", sd->prompt); | ||||
| 	fflush (file); | ||||
|  | ||||
| 	while ( (c=fgetc(file))!= EOF){ | ||||
| 		printf ("%02x\n",c); | ||||
| 		if (sd->escpos){ | ||||
| 			int i; | ||||
| 			int a=0; | ||||
|  | ||||
| 			sd->esc[sd->escpos++]=c; | ||||
| 			sd->esc[sd->escpos]=0; | ||||
|  | ||||
| 			for (i=0; estr[i].str != NULL; i++){ | ||||
| 				int rc; | ||||
| 				rc = cmpansi(sd->esc,estr[i].str); | ||||
| 				if (rc==1){ | ||||
| 					sd->esc[0]=0; | ||||
| 					sd->escpos=0; | ||||
| 					es = &estr[i]; | ||||
| 					break; | ||||
| 				} | ||||
| 				a |= rc; | ||||
| 					 | ||||
| 			} | ||||
| 			if (a==0){ | ||||
| 				sd->esc[0]=0; | ||||
| 				sd->escpos=0; | ||||
| 			}else{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
|  | ||||
| 		} | ||||
| 		if (c==0x1b){ | ||||
| 			sd->esc[sd->escpos++]=c; | ||||
| 			sd->esc[sd->escpos]=0; | ||||
| 			printf("ESC start\n"); | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		if (!es){ | ||||
| 			if (c=='\r'){ | ||||
| 				printf("CMD: %s\n",sd->line); | ||||
| 				fprintf (file, "\n\r"); | ||||
| 				fflush(file); | ||||
| 				//fprintf (file, "\n\ractube[%s]:>", sd->prompt); | ||||
| 				return; | ||||
| 				sd->pos=0; | ||||
| 				sd->line[0]=0; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (c=='\x7f'){ | ||||
| 				if (sd->pos==0) | ||||
| 					continue; | ||||
|  | ||||
| 				printf("Backspace\n"); | ||||
| 				fprintf(file,"%c %c",8,8); | ||||
| 				sd->line[--sd->pos]=0; | ||||
| 				continue; | ||||
|  | ||||
| 			} | ||||
| 			if (c>240 || c<30){ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
|  | ||||
| 			sd->line[sd->pos++]=c; | ||||
| 			sd->line[sd->pos]=0; | ||||
| 			printf("putout: %c %02X\n",c,c); | ||||
| 			fprintf(file,"\x1b[1@%c",c); | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		printf ("ES: %s\n",es->result); | ||||
|  | ||||
| 		if (strcmp(es->result,"left")==0){ | ||||
| 			if (sd->pos>0){ | ||||
| 				sd->pos--; | ||||
| 				fprintf(file,"%s",es->str); | ||||
| 			} | ||||
| 		} | ||||
| 		if (strcmp(es->result,"right")==0){ | ||||
| 			if (sd->line[sd->pos]!=0){ | ||||
| 				sd->pos++; | ||||
| 				fprintf(file,"%s",es->str); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| //		fprintf(file,es->str); | ||||
|  | ||||
| 		es = NULL; | ||||
| //		fflush(file); | ||||
|  | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| void rpc_loop (FILE *file, cw_Cfg_t *global_cfg) | ||||
| @ -666,7 +546,6 @@ void rpc_loop (FILE *file, cw_Cfg_t *global_cfg) | ||||
| 	sd.quit=0; | ||||
|  | ||||
| 	do { | ||||
| 		int c; | ||||
|  | ||||
| 		str[0]=0; | ||||
| 		 | ||||
| @ -722,13 +601,11 @@ void * run_rpc_server (void * arg) | ||||
|  | ||||
| int create_tcp_fd(const char *name) | ||||
| { | ||||
| 	struct sockaddr_storage server, client; | ||||
| 	socklen_t client_size; | ||||
| 	char sockstr[SOCK_ADDR_BUFSIZE]; | ||||
| 	struct sockaddr_storage server; //, client; | ||||
| 	 | ||||
| 	int rc; | ||||
| 	const char * addr = name; | ||||
| 	int sockfd, clientsock; | ||||
| 	int sockfd; | ||||
| 	int yes; | ||||
| 	 | ||||
| 	rc = sock_strtoaddr (addr, (struct sockaddr*) &server); | ||||
| @ -756,8 +633,8 @@ int create_tcp_fd(const char *name) | ||||
| } | ||||
| static int create_unix_fd(const char *name) | ||||
| { | ||||
|         struct sockaddr_storage client; | ||||
| 	socklen_t client_size; | ||||
|         //struct sockaddr_storage client; | ||||
| 	//socklen_t client_size; | ||||
| 	struct sockaddr_un addr; | ||||
| 	int rc,fd; | ||||
|  | ||||
| @ -771,7 +648,7 @@ static int create_unix_fd(const char *name) | ||||
| 		cw_log (LOG_ERR, "Can't bind socket 'unix:%s', %s", name, strerror (errno)); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	int clientsock = accept (fd, (struct sockaddr*) &client, &client_size); | ||||
| 	//int clientsock = accept (fd, (struct sockaddr*) &client, &client_size); | ||||
|  | ||||
| 	return fd; | ||||
| } | ||||
| @ -780,7 +657,7 @@ int start_rpc(cw_Cfg_t *global_cfg) | ||||
| { | ||||
| 	struct sockdata * sockdata; | ||||
| 	const char *sockname; | ||||
| 	int rc, type; | ||||
| 	int rc; //, type; | ||||
| 	int fd; | ||||
|  | ||||
| 	rc = cw_cfg_get_bool(global_cfg,"actube/rpc/enable",1); | ||||
|  | ||||
| @ -612,7 +612,7 @@ static void copy(struct cw_ElemHandlerParams * params) | ||||
| //	cw_dbg(DBG_X,"-------------  This was the config we ve got from WTP ---------------- "); | ||||
| //	cw_dbg(DBG_X,"Now copying:"); | ||||
| //	cw_cfg_copy(params->cfg,conn->local_cfg,0,""); | ||||
|         cw_cfg_copy(params->cfg, params->conn->local_cfg,DBG_CFG_UPDATES,"GlobalCfg"); | ||||
|         cw_cfg_copy(params->cfg, params->conn->remote_cfg,DBG_CFG_UPDATES,"GlobalCfg"); | ||||
|  | ||||
| //	cw_dbg(DBG_X,"Copying done."); | ||||
| } | ||||
| @ -730,7 +730,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, | ||||
|  | ||||
| 	wtpman->global_cfg = global_cfg; | ||||
|  | ||||
| 	wtpman->conn = cw_conn_create(sockfd, srcaddr, 5); | ||||
| 	wtpman->conn = cw_conn_create(sockfd, srcaddr, 100); | ||||
| 	if (!wtpman->conn) { | ||||
| 		wtpman_destroy(wtpman); | ||||
| 		return NULL; | ||||
|  | ||||
							
								
								
									
										15
									
								
								src/cw/cfg.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/cw/cfg.c
									
									
									
									
									
								
							| @ -495,6 +495,21 @@ int cw_cfg_load(const char *filename, cw_Cfg_t * cfg) | ||||
| 	return errno; | ||||
| } | ||||
|  | ||||
| int cw_cfg_read_from_string(const char *str, cw_Cfg_t *cfg) | ||||
| { | ||||
| 	int errs; | ||||
| 	FILE * f = fmemopen((void*)str,strlen(str),"rb"); | ||||
| 	if(!f) | ||||
| 		return errno; | ||||
| 	errs = cw_cfg_read_from_file(f, cfg); | ||||
| 	fclose(f); | ||||
|  | ||||
| 	if (errs) | ||||
| 		errno = EINVAL; | ||||
| 	return errno; | ||||
|  | ||||
| } | ||||
|  | ||||
| int cw_cfg_write_to_file(FILE *f, cw_Cfg_t * cfg) | ||||
| { | ||||
| 	mavliter_t it; | ||||
|  | ||||
| @ -57,6 +57,7 @@ int cw_cfg_save(const char *filename, cw_Cfg_t *cfg, const char *format, ...); | ||||
|  | ||||
| uint16_t cw_cfg_get_word_l(cw_Cfg_t ** cfg, char *key, uint16_t def); | ||||
| void cw_cfg_fdump(FILE *f, cw_Cfg_t * cfg); | ||||
| int cw_cfg_read_from_string(const char *str, cw_Cfg_t *cfg); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -101,9 +101,10 @@ int cw_compose_message(struct cw_Conn *conn, uint8_t * rawout) | ||||
| 	params.conn=conn; | ||||
| 	params.rawmsg = rawout; | ||||
| 	params.cfg_list[0]=conn->update_cfg; | ||||
| 	params.cfg_list[1]=conn->local_cfg; | ||||
| 	params.cfg_list[2]=conn->global_cfg; | ||||
| 	params.cfg_list[3]=NULL; | ||||
| 	params.cfg_list[1]=conn->remote_cfg; | ||||
| 	params.cfg_list[2]=conn->local_cfg; | ||||
| 	params.cfg_list[3]=conn->global_cfg; | ||||
| 	params.cfg_list[4]=NULL; | ||||
| 	params.msgset=conn->msgset; | ||||
| 	params.msgdata=msg; | ||||
| 	params.debug_details=details; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user