Som kind of shell - act
This commit is contained in:
parent
86956ff1ce
commit
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) {
|
} else if (el_parse(el, ac, av) == -1) {
|
||||||
char str[2000];
|
char str[2000];
|
||||||
|
int i;
|
||||||
|
char * sp ="";
|
||||||
str[0]=0;
|
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);
|
fflush(act_f);
|
||||||
do {
|
do {
|
||||||
int n;
|
int n;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#
|
#
|
||||||
#capwap/ac-name
|
#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-cipher: DHE-RSA:RSA:AES-256-CBC:AES-128-CBC:SHA1:PSK
|
||||||
capwap/ssl-psk-enable: false
|
capwap/ssl-psk-enable: false
|
||||||
@ -36,7 +36,7 @@ actube/ipv6: false
|
|||||||
#actube/mod.2: capwap80211
|
#actube/mod.2: capwap80211
|
||||||
#
|
#
|
||||||
|
|
||||||
#actube/mod.0: cisco
|
actube/mod.0: cisco
|
||||||
actube/mod.1: capwap
|
actube/mod.1: capwap
|
||||||
actube/mod.2: capwap80211
|
actube/mod.2: capwap80211
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ ac-descriptor/station-limit: 1000
|
|||||||
ac-descriptor/stations: 0
|
ac-descriptor/stations: 0
|
||||||
|
|
||||||
|
|
||||||
capwap-control-ip-address/address.0: 192.168.0.14
|
capwap-control-ip-address/address.0: 192.168.0.24
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
227
src/ac/rpc.c
227
src/ac/rpc.c
@ -104,7 +104,9 @@ static void finish_cmd(FILE *f)
|
|||||||
|
|
||||||
int prompt_cmd(struct rpcdata *sd, const char *cmd)
|
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);
|
finish_cmd(sd->out);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -123,11 +125,14 @@ int select_cmd(struct rpcdata *sd, const char *cmd)
|
|||||||
char ap [CAPWAP_MAX_WTP_NAME_LEN];
|
char ap [CAPWAP_MAX_WTP_NAME_LEN];
|
||||||
sscanf(cmd,"%s",ap);
|
sscanf(cmd,"%s",ap);
|
||||||
strcpy(sd->prompt,ap);
|
strcpy(sd->prompt,ap);
|
||||||
|
finish_cmd(sd->out);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int list_cmd(struct rpcdata *sd, const char *cmd)
|
int list_cmd(struct rpcdata *sd, const char *cmd)
|
||||||
{
|
{
|
||||||
show_aps(sd->out);
|
show_aps(sd->out);
|
||||||
|
finish_cmd(sd->out);
|
||||||
return 0;
|
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);
|
fprintf(sd->out,"WTP '%s' not found\n",sd->prompt);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
stop();
|
cw_cfg_fdump(sd->out,conn->remote_cfg);
|
||||||
// show_cfg(sd->out,conn->remote_cfg);
|
|
||||||
}
|
}
|
||||||
|
finish_cmd(sd->out);
|
||||||
wtplist_unlock();
|
wtplist_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -209,20 +214,24 @@ wlan0_cmd(struct rpcdata * sd, const char *cmd)
|
|||||||
|
|
||||||
int set_cmd(struct rpcdata *sd, const char *str)
|
int set_cmd(struct rpcdata *sd, const char *str)
|
||||||
{
|
{
|
||||||
/* struct cw_Conn * conn;
|
|
||||||
struct cw_Val_Reader r;
|
cw_Cfg_t *cfg;
|
||||||
char key[CW_CFG_MAX_KEY_LEN];
|
cfg = cw_cfg_create();
|
||||||
char type[CW_CFG_MAX_KEY_LEN];
|
|
||||||
char val[2048];
|
cw_cfg_read_from_string(str,cfg);
|
||||||
*/
|
|
||||||
stop();
|
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_init_str_reader(&r,str,strlen(str));
|
||||||
|
|
||||||
// cw_ktv_parse_string(&r,key,type,val);
|
// cw_ktv_parse_string(&r,key,type,val);
|
||||||
/*cw_ktv_parse_string(key,type,val, 2048);*/
|
/*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));
|
// cw_ktv_add(sd->update_cfg,key,CW_TYPE_STR,NULL,val,strlen(val));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -264,8 +273,7 @@ void show_cfg (FILE *out, mavl_t ktv)
|
|||||||
|
|
||||||
int show_aps (FILE *out)
|
int show_aps (FILE *out)
|
||||||
{
|
{
|
||||||
stop();
|
struct connlist * cl;
|
||||||
/* struct connlist * cl;
|
|
||||||
mavliter_t it;
|
mavliter_t it;
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
|
|
||||||
@ -275,29 +283,18 @@ int show_aps (FILE *out)
|
|||||||
mavliter_init (&it, cl->by_addr);
|
mavliter_init (&it, cl->by_addr);
|
||||||
fprintf (out, "IP\t\t\twtp-name\n");
|
fprintf (out, "IP\t\t\twtp-name\n");
|
||||||
mavliter_foreach (&it) {
|
mavliter_foreach (&it) {
|
||||||
cw_Val_t * result;
|
|
||||||
char addr[SOCK_ADDR_BUFSIZE];
|
char addr[SOCK_ADDR_BUFSIZE];
|
||||||
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
const char * wtp_name;
|
||||||
struct cw_Conn * conn;
|
struct cw_Conn * conn;
|
||||||
conn = mavliter_get_ptr (&it);
|
conn = mavliter_get_ptr (&it);
|
||||||
|
|
||||||
sock_addr2str_p (&conn->addr, addr);
|
sock_addr2str_p (&conn->addr, addr);
|
||||||
|
|
||||||
stop();
|
wtp_name = cw_cfg_get (conn->remote_cfg, "wtp-name", "unknown");
|
||||||
// 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);
|
fprintf (out, "%s\t\t%s\n", addr, wtp_name);
|
||||||
}
|
}
|
||||||
wtplist_unlock();
|
wtplist_unlock();
|
||||||
*/
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,40 +302,30 @@ int show_aps (FILE *out)
|
|||||||
|
|
||||||
struct cw_Conn * find_ap(const char *name)
|
struct cw_Conn * find_ap(const char *name)
|
||||||
{
|
{
|
||||||
stop();
|
|
||||||
/*
|
|
||||||
struct connlist * cl;
|
struct connlist * cl;
|
||||||
mavliter_t it;
|
mavliter_t it;
|
||||||
|
|
||||||
cl = wtplist_get_connlist();
|
cl = wtplist_get_connlist();
|
||||||
|
|
||||||
|
|
||||||
mavliter_init (&it, cl->by_addr);
|
mavliter_init (&it, cl->by_addr);
|
||||||
mavliter_foreach (&it) {
|
mavliter_foreach (&it) {
|
||||||
cw_Val_t * result;
|
const char *wtpname;
|
||||||
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
|
||||||
struct cw_Conn * conn;
|
struct cw_Conn * conn;
|
||||||
conn = mavliter_get_ptr (&it);
|
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) {
|
if (wtpname == NULL)
|
||||||
strcpy (wtp_name, "");
|
continue;
|
||||||
|
|
||||||
} else {
|
|
||||||
result->type->to_str (result, wtp_name, CAPWAP_MAX_WTP_NAME_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("cmp '%s' : '%s'\n",wtp_name,name);
|
|
||||||
|
|
||||||
if(strcmp(wtp_name,name)==0){
|
if(strcmp(wtpname,name)==0){
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
*/
|
|
||||||
/*wtplist_unlock();*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -506,147 +493,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)
|
void rpc_loop (FILE *file, cw_Cfg_t *global_cfg)
|
||||||
@ -666,7 +514,6 @@ void rpc_loop (FILE *file, cw_Cfg_t *global_cfg)
|
|||||||
sd.quit=0;
|
sd.quit=0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int c;
|
|
||||||
|
|
||||||
str[0]=0;
|
str[0]=0;
|
||||||
|
|
||||||
@ -722,13 +569,11 @@ void * run_rpc_server (void * arg)
|
|||||||
|
|
||||||
int create_tcp_fd(const char *name)
|
int create_tcp_fd(const char *name)
|
||||||
{
|
{
|
||||||
struct sockaddr_storage server, client;
|
struct sockaddr_storage server; //, client;
|
||||||
socklen_t client_size;
|
|
||||||
char sockstr[SOCK_ADDR_BUFSIZE];
|
|
||||||
|
|
||||||
int rc;
|
int rc;
|
||||||
const char * addr = name;
|
const char * addr = name;
|
||||||
int sockfd, clientsock;
|
int sockfd;
|
||||||
int yes;
|
int yes;
|
||||||
|
|
||||||
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
|
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
|
||||||
@ -756,8 +601,8 @@ int create_tcp_fd(const char *name)
|
|||||||
}
|
}
|
||||||
static int create_unix_fd(const char *name)
|
static int create_unix_fd(const char *name)
|
||||||
{
|
{
|
||||||
struct sockaddr_storage client;
|
//struct sockaddr_storage client;
|
||||||
socklen_t client_size;
|
//socklen_t client_size;
|
||||||
struct sockaddr_un addr;
|
struct sockaddr_un addr;
|
||||||
int rc,fd;
|
int rc,fd;
|
||||||
|
|
||||||
@ -771,7 +616,7 @@ static int create_unix_fd(const char *name)
|
|||||||
cw_log (LOG_ERR, "Can't bind socket 'unix:%s', %s", name, strerror (errno));
|
cw_log (LOG_ERR, "Can't bind socket 'unix:%s', %s", name, strerror (errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int clientsock = accept (fd, (struct sockaddr*) &client, &client_size);
|
//int clientsock = accept (fd, (struct sockaddr*) &client, &client_size);
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@ -780,7 +625,7 @@ int start_rpc(cw_Cfg_t *global_cfg)
|
|||||||
{
|
{
|
||||||
struct sockdata * sockdata;
|
struct sockdata * sockdata;
|
||||||
const char *sockname;
|
const char *sockname;
|
||||||
int rc, type;
|
int rc; //, type;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
rc = cw_cfg_get_bool(global_cfg,"actube/rpc/enable",1);
|
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,"------------- This was the config we ve got from WTP ---------------- ");
|
||||||
// cw_dbg(DBG_X,"Now copying:");
|
// cw_dbg(DBG_X,"Now copying:");
|
||||||
// cw_cfg_copy(params->cfg,conn->local_cfg,0,"");
|
// 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.");
|
// cw_dbg(DBG_X,"Copying done.");
|
||||||
}
|
}
|
||||||
|
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;
|
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)
|
int cw_cfg_write_to_file(FILE *f, cw_Cfg_t * cfg)
|
||||||
{
|
{
|
||||||
mavliter_t it;
|
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);
|
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);
|
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.conn=conn;
|
||||||
params.rawmsg = rawout;
|
params.rawmsg = rawout;
|
||||||
params.cfg_list[0]=conn->update_cfg;
|
params.cfg_list[0]=conn->update_cfg;
|
||||||
params.cfg_list[1]=conn->local_cfg;
|
params.cfg_list[1]=conn->remote_cfg;
|
||||||
params.cfg_list[2]=conn->global_cfg;
|
params.cfg_list[2]=conn->local_cfg;
|
||||||
params.cfg_list[3]=NULL;
|
params.cfg_list[3]=conn->global_cfg;
|
||||||
|
params.cfg_list[4]=NULL;
|
||||||
params.msgset=conn->msgset;
|
params.msgset=conn->msgset;
|
||||||
params.msgdata=msg;
|
params.msgdata=msg;
|
||||||
params.debug_details=details;
|
params.debug_details=details;
|
||||||
|
Loading…
Reference in New Issue
Block a user