Work on shell

FossilOrigin-Name: d35a5a97ee9087fde859a9e0694d9eb7890d2834cd2df0712d81dfa47afc5323
This commit is contained in:
7u83@mail.ru
2018-05-14 21:30:48 +00:00
parent 127bad2fb5
commit f9da482f69
21 changed files with 719 additions and 36 deletions

View File

@ -16,7 +16,115 @@
#include "wtplist.h"
struct shelldata{
FILE *out;
char prompt[1024];
mavl_t update_cfg;
};
void select_cmd(struct shelldata *sd, const char *cmd);
void list_cmd(struct shelldata *sd, const char * cmd);
void cfg_cmd(struct shelldata *sd, const char * cmd);
void ucfg_cmd(struct shelldata *sd, const char * cmd);
void set_cmd(struct shelldata *sd, const char * cmd);
void del_cmd(struct shelldata *sd, const char * cmd);
void send_cmd(struct shelldata *sd, const char * cmd);
struct conn * find_ap(const char *name);
struct command{
char * cmd;
void (*fun)();
};
static struct command cmdlist[]={
{"cfg", cfg_cmd },
{"del", del_cmd },
{"ucfg", ucfg_cmd},
{"list", list_cmd },
{"select", select_cmd },
{"send", send_cmd},
{"set", set_cmd },
{NULL,NULL}
};
void select_cmd(struct shelldata *sd, const char *cmd)
{
char ap [CAPWAP_MAX_WTP_NAME_LEN];
sscanf(cmd,"%s",ap);
strcpy(sd->prompt,ap);
}
void list_cmd(struct shelldata *sd, const char *cmd)
{
show_aps(sd->out);
}
void cfg_cmd(struct shelldata *sd, const char *cmd)
{
struct conn * conn;
wtplist_lock();
conn = find_ap(sd->prompt);
if (conn==NULL){
fprintf(sd->out,"WTP '%s' not found\n",sd->prompt);
}
else {
show_cfg(sd->out,conn->remote_cfg);
}
wtplist_unlock();
}
void ucfg_cmd(struct shelldata *sd, const char *cmd)
{
struct conn * conn;
show_cfg(sd->out,sd->update_cfg);
}
#include "wtpman.h"
send_cmd(struct shelldata * sd, const char *cmd)
{
struct conn * conn;
wtplist_lock();
conn = find_ap(sd->prompt);
if (conn==NULL){
fprintf(sd->out,"WTP '%s' not found\n",sd->prompt);
}
else {
conn->update_cfg=sd->update_cfg;
}
wtplist_unlock();
}
void set_cmd(struct shelldata *sd, const char *str)
{
struct conn * conn;
struct cw_KTV_Reader r;
char key[CW_KTV_MAX_KEY_LEN];
char type[CW_KTV_MAX_KEY_LEN];
char val[2048];
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);
cw_ktv_add(sd->update_cfg,key,CW_TYPE_STR,NULL,val,strlen(val));
}
void del_cmd(struct shelldata *sd, const char *str)
{
char key[CW_KTV_MAX_KEY_LEN];
sscanf(str,"%s",key);
cw_ktv_del_sub(sd->update_cfg,key);
}
@ -46,9 +154,6 @@ void show_aps (FILE *out)
{
struct connlist * cl;
mavliter_t it;
wtplist_lock();
cl = wtplist_get_connlist();
@ -76,19 +181,49 @@ void show_aps (FILE *out)
fprintf (out, "%s\t\t%s\n", addr, wtp_name);
fprintf(out,"================= Local CFG: =================== \n");
show_cfg(out,conn->local_cfg);
fprintf(out,"================= Remote CFG: ================== \n");
show_cfg(out,conn->remote_cfg);
fprintf(out,"\n");
}
wtplist_unlock();
}
struct conn * find_ap(const char *name)
{
struct connlist * cl;
mavliter_t it;
/*wtplist_lock();*/
cl = wtplist_get_connlist();
mavliter_init (&it, cl->by_addr);
mavliter_foreach (&it) {
cw_KTV_t * result;
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
struct conn * conn;
conn = mavliter_get_ptr (&it);
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);
}
printf("cmp '%s' : '%s'\n",wtp_name,name);
if(strcmp(wtp_name,name)==0){
return conn;
}
}
return NULL;
/*wtplist_unlock();*/
}
void con (FILE *out)
{
struct connlist * cl;
@ -139,12 +274,75 @@ void con (FILE *out)
}
void execute_cmd (FILE * out, const char *str)
struct command * find_cmd(const char *cmd)
{
struct command * search;
search = cmdlist;
while (search->cmd!=NULL){
if (strncmp(cmd,search->cmd,strlen(cmd))==0){
return search;
}
search ++;
}
return NULL;
}
void execute_cmd (struct shelldata * sd, const char *str)
{
char cmd[1024];
char args[1024];
int n;
struct cw_KTV_Reader reader;
struct command * searchcmd;
args[0]=0;
n = sscanf (str, "%s", cmd);
if (n<=0)
return;
searchcmd = find_cmd(cmd);
if (searchcmd!=NULL){
if (searchcmd->fun != NULL){
fprintf(sd->out,"%s %s\n", searchcmd->cmd,str+strlen(cmd));
searchcmd->fun(sd, str+strlen(cmd));
}
}
else{
fprintf(sd->out,"Unknown command: '%s'\n",cmd);
}
return;
char key[CW_KTV_MAX_KEY_LEN];
char type[128];
char val[2048];
key[0]=0;
type[0]=0;
val[0]=0;
cw_ktv_init_str_reader(&reader,str, strlen(str));
n = cw_ktv_parse_string(&reader, key,type,val);
if (n==-1){
int i;
fprintf(sd->out,"Error on pos %d\n",reader.pos);
fprintf(sd->out,"%s",str);
for(i=0;i<reader.pos;i++){
fprintf(sd->out," ");
}
fprintf(sd->out,"^\n");
fprintf(sd->out,"%s\n",reader.error);
}
else{
fprintf(sd->out,"%s :%s: %s\n", key,type,val);
}
return;
n = sscanf (str, "%s%s", cmd, args);
@ -153,12 +351,12 @@ void execute_cmd (FILE * out, const char *str)
/*printf("CMD: %s, ARGS:\n",cmd);*/
if (strcmp (cmd, "s") == 0) {
show_aps (out);
show_aps (sd->out);
return;
}
if (strcmp (cmd, "con")==0){
con(out);
con(sd->out);
return;
}
@ -167,20 +365,26 @@ void execute_cmd (FILE * out, const char *str)
void shell_loop (FILE *file)
{
struct shelldata sd;
int c;
/* setvbuf(file,NULL,_IONBF,0);
fflush(file);
*/
char str[2048];
sd.update_cfg = cw_ktv_create();
sd.out = file;
sprintf(sd.prompt,"%s","*");
do {
fprintf (file, "actube[%d]:>", fileno (file));
fprintf (file, "actube[%s]:>", sd.prompt);
fflush (file);
str[0]=0;
fgets (str, sizeof (str), file);
execute_cmd (file, str);
execute_cmd (&sd, str);
} while (c != EOF);
@ -197,7 +401,9 @@ void * run_shell (void * arg)
const char * addr = "127.0.0.1:5000";
int sockfd, clientsock;
int yes;
while(1){
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
if (! rc) {
@ -231,14 +437,17 @@ void * run_shell (void * arg)
if (clientsock > 0) {
sock_addr2str_p (&client, sockstr);
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
printf("New shell lopp\n");
shell_loop (fdopen (clientsock, "a+"));
printf("end shell lopp\n");
close (clientsock);
printf("close clsock\n");
}
printf ("Accepting %i, %s", rc, strerror (errno));
cw_dbg (DBG_INFO,"Accepting shell session %i, %s", rc, strerror (errno));
}

View File

@ -448,6 +448,7 @@ static void * wtpman_main(void *arg)
tmp = conn->local_cfg;
conn->local_cfg=conn->update_cfg;
conn->default_cfg = conn->remote_cfg;
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));