]> git.sur5r.net Git - gsconf/blob - shell.c
eceb152184c93961feefddc1128a9671fb8de511
[gsconf] / shell.c
1 #include "shell.h"
2
3
4 unsigned int countTokens(char * data, char * deli) {
5         unsigned int n = 0;
6         char * lp;
7         
8         char * da = malloc(sizeof(char) * strlen(data));
9         strcpy(da, data);
10         
11         lp = strtok(da, deli);
12         while (lp != NULL) {
13                 lp = strtok(NULL, deli);
14                 n++;
15         }
16         
17         return n;
18 }
19
20 unsigned int split(char *** _data, char * text, char * deli) {
21
22         
23         
24         unsigned int elements = countTokens(text, deli);
25         
26         *_data = malloc( sizeof(char *) * (elements + 1));
27         
28         char ** data = (char **)*_data;
29         
30         char * lp = strtok(text, deli);
31         
32         unsigned int n = 0;
33         
34         data[elements - 1] = NULL;
35         
36         while (lp != NULL) {
37                 data[n] = (char*)malloc( sizeof(char *) * (strlen(lp) + 1));
38                 strcpy(data[n], lp);
39                 data[n][strlen(lp)] = 0;
40                 lp = strtok(NULL, deli);
41                 n++;
42         }
43         return elements;
44 }
45
46 void printIp(char * data) {
47         printf("\033[92m%u.%u.%u.%u\033[0m\n",data[0]&0xff, data[1]&0xff, data[2]&0xff, data[3]&0xff);
48 }
49 void printError(int errCode) {
50         switch (errCode) {
51                 case 0x00:;
52                         printf("\033[92mSuccess!\033[0m\n");
53                         gs105e_queryAll();
54                         break;
55                 case -1:;
56                         printf("\033[91mSwitch does not answer!\033[0m\n");
57                         break;
58                 case 0x07:;
59                         printf("\033[91mWrong Password, try again!\033[0m\n");
60                         settings.password = NULL;
61                         break;
62                 default:;
63                         printf("\033[91mUups, unknown Error!?\033[0m\n");
64                         break;
65         }
66 }
67
68 void shell_set(char ** argv, int elem) {
69
70         int n;
71         if (strncmp(argv[1], "name", 4) == 0) {
72                 if (elem != 3) {
73                         printf("set name [name]\n");
74                         return;
75                 }
76                 printError(gs105e_setName(argv[2]));
77         }
78 }
79
80 void password(void) {
81         if (settings.password == NULL) {
82                printf("\033[91mWarning: As the protocol of the switch wants it that way, all configuration packets are send as broadcasts, meaning everyone on this net can sniff your password!\033[0m\n");
83                 settings.password = getpass("Password: ");
84         }
85 }
86
87
88
89
90 int shell (void) {
91
92         char cmd[300];
93         int elem = 0;
94         char **argv;
95         int n;
96         
97         struct gs105e_discovered * ddev;
98         
99         char * dev = "nodev";
100         
101         n = gs105e_discover();
102         printf("Discovered \033[92m%i\033[0m devices\n", n);
103
104         ddev = gs105e_devs;
105
106         printf("ID\tName\t\tMAC\t\tIP\n");
107
108         while (ddev != NULL) {
109                 printf("%i\t%s\t\t%X:%X:%X:%X:%X:%X\t%u.%u.%u.%u\n", ddev->id, ddev->name, ddev->mac[0]&0xff, ddev->mac[1]&0xff, ddev->mac[2]&0xff, ddev->mac[3]&0xff, ddev->mac[4]&0xff, ddev->mac[5]&0xff, ddev->ip[0]&0xff, ddev->ip[1]&0xff, ddev->ip[2]&0xff, ddev->ip[3]&0xff);
110                 ddev = ddev->next;
111         }
112
113         if (n == 1) {
114                 printf("only one switch, selecting 1\n");
115
116                 memcpy(settings.mac, gs105e_devs->mac, 6);
117                 gs105e_queryAll();
118                 dev = gs105e_devs->name;
119         }
120         
121         while (1) {
122                 printf("\033[96mgs (\033[93m%s\033[96m)# \033[0m", dev);
123                 cmd[0] = 0;
124                 fflush(0);
125                 if (fgets(cmd, 300, stdin) == NULL) {   //STRG + D
126                                 printf("\nExiting ...\n");
127                                 return 0;
128                         
129                 }
130                 
131                 
132                 
133                 cmd[strlen(cmd) - 1] = 0;
134                 
135                 //Check for an empty command line
136                 if (strlen(cmd) == 0) {
137                         continue;
138                 }
139                 
140                 
141                 //Check for the exit Command
142                 if (strncmp(cmd, "exit", 4) == 0 && strlen(cmd) == 4)
143                         return 0;
144                 
145                 elem = split(&argv, cmd, " ");
146                 
147
148                 
149                 if (strncmp(argv[0], "discover", 8) == 0) {
150                         n = gs105e_discover();
151                         printf("Discovered \033[92m%i\033[0m devices\n", n);
152                         
153                         ddev = gs105e_devs;
154                         
155                         printf("ID\tName\t\tMAC\t\tIP\n");
156                         
157                         while (ddev != NULL) {
158                                 printf("%i\t%s\t\t%X:%X:%X:%X:%X:%X\t%u.%u.%u.%u\n", ddev->id, ddev->name, ddev->mac[0]&0xff, ddev->mac[1]&0xff, ddev->mac[2]&0xff, ddev->mac[3]&0xff, ddev->mac[4]&0xff, ddev->mac[5]&0xff, ddev->ip[0]&0xff, ddev->ip[1]&0xff, ddev->ip[2]&0xff, ddev->ip[3]&0xff);
159                                 ddev = ddev->next;
160                         }
161                         
162                         if (n == 1) {
163                                 printf("only one switch, selecting 1\n");
164                                 
165                                 memcpy(settings.mac, gs105e_devs->mac, 6);
166                                 gs105e_queryAll();
167                                 dev = gs105e_devs->name;
168                         }
169                 }
170                 
171
172                 
173                 if (strncmp(argv[0], "select", 6) == 0 && elem == 2) {
174                         n = atoi(argv[1]);
175                         if (n == 0){
176                                 printf("Please select a valid ID\n");
177                                 continue;
178                         }
179                         ddev = gs105e_devs;
180                         while (ddev != NULL) {
181                                 if (n == ddev->id)
182                                         break;
183                                 ddev = ddev->next;
184                         }
185                         
186                         if (ddev == NULL){
187                                 printf("Please select a valid ID\n");
188                                 continue;
189                         }
190                         
191                         memcpy(settings.mac, ddev->mac, 6);
192                         gs105e_queryAll();
193                         dev = ddev->name;
194                         
195                 }
196
197                 if (strncmp(dev, "nodev", 6) == 0){
198                         printf("Discover and select device first!\n");
199                         continue;
200                 }
201                                 
202                 if (strncmp(argv[0], "ip", 2) == 0) {
203                         shell_ip(argv, elem);
204                 }
205                 if (strncmp(argv[0], "vlan", 4) == 0) {
206                         shell_vlan(argv, elem);
207                 }
208                 if (strncmp(argv[0], "port", 4) == 0) {
209                         shell_port(argv, elem);
210                 }
211                 
212
213                 
214                 
215         }
216 }
217