]> git.sur5r.net Git - gsconf/blob - shell.c
fixed typo
[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 char * copyString(char * data) {
81         char * ret = (char * )malloc(strlen(data) + 1);
82         memcpy(ret, data, strlen(data) + 1);
83         ret[strlen(data)] = 0;
84         return ret;
85 }
86
87 void password(void) {
88         if (settings.password == NULL) {
89                printf("\033[91mWarning: As the protocol of the switch wants it that way, all configuration packets are send as broadcasts. Even though Netgear is 'encrypting' the password it, the encryption used, is one step away from plaintext.\033[0m\n");
90                 settings.password = copyString((char *)getpass("Password: "));
91         }
92 }
93
94
95
96
97 int shell (void) {
98
99         char cmd[300];
100         int elem = 0;
101         char **argv;
102         int n;
103         
104         struct gs105e_discovered * ddev;
105         
106         char * dev = "nodev";
107         
108         n = gs105e_discover();
109         printf("Discovered \033[92m%i\033[0m devices\n", n);
110
111         ddev = gs105e_devs;
112
113         printf("ID\tName\t\tMAC\t\tIP\n");
114
115         while (ddev != NULL) {
116                 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);
117                 ddev = ddev->next;
118         }
119
120         if (n == 1) {
121                 printf("only one switch, selecting 1\n");
122
123                 memcpy(settings.mac, gs105e_devs->mac, 6);
124                 gs105e_queryAll();
125                 dev = gs105e_devs->name;
126         }
127         
128         while (1) {
129                 printf("\033[96mgs (\033[93m%s\033[96m)# \033[0m", dev);
130                 cmd[0] = 0;
131                 fflush(0);
132                 if (fgets(cmd, 300, stdin) == NULL) {   //STRG + D
133                                 printf("\nExiting ...\n");
134                                 return 0;
135                         
136                 }
137                 
138                 
139                 
140                 cmd[strlen(cmd) - 1] = 0;
141                 
142                 //Check for an empty command line
143                 if (strlen(cmd) == 0) {
144                         continue;
145                 }
146                 
147                 
148                 //Check for the exit Command
149                 if (strncmp(cmd, "exit", 4) == 0 && strlen(cmd) == 4)
150                         return 0;
151                 
152                 elem = split(&argv, cmd, " ");
153                 
154
155                 
156                 if (strncmp(argv[0], "discover", 8) == 0) {
157                         n = gs105e_discover();
158                         printf("Discovered \033[92m%i\033[0m devices\n", n);
159                         
160                         ddev = gs105e_devs;
161                         
162                         printf("ID\tName\t\tMAC\t\tIP\n");
163                         
164                         while (ddev != NULL) {
165                                 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);
166                                 ddev = ddev->next;
167                         }
168                         
169                         if (n == 1) {
170                                 printf("only one switch, selecting 1\n");
171                                 
172                                 memcpy(settings.mac, gs105e_devs->mac, 6);
173                                 gs105e_queryAll();
174                                 dev = gs105e_devs->name;
175                         }
176                 }
177                 
178
179                 
180                 if (strncmp(argv[0], "select", 6) == 0 && elem == 2) {
181                         n = atoi(argv[1]);
182                         if (n == 0){
183                                 printf("Please select a valid ID\n");
184                                 continue;
185                         }
186                         ddev = gs105e_devs;
187                         while (ddev != NULL) {
188                                 if (n == ddev->id)
189                                         break;
190                                 ddev = ddev->next;
191                         }
192                         
193                         if (ddev == NULL){
194                                 printf("Please select a valid ID\n");
195                                 continue;
196                         }
197                         
198                         memcpy(settings.mac, ddev->mac, 6);
199                         gs105e_queryAll();
200                         dev = ddev->name;
201                         
202                 }
203
204                 if (strncmp(dev, "nodev", 6) == 0){
205                         printf("Discover and select device first!\n");
206                         continue;
207                 }
208                                 
209                 if (strncmp(argv[0], "ip", 2) == 0) {
210                         shell_ip(argv, elem);
211                 }
212                 if (strncmp(argv[0], "vlan", 4) == 0) {
213                         shell_vlan(argv, elem);
214                 }
215                 if (strncmp(argv[0], "port", 4) == 0) {
216                         shell_port(argv, elem);
217                 }
218                 
219                 if (strncmp(argv[0], "sys", 3) == 0) {
220                         shell_sys(argv, elem);
221                 }
222                 
223                 if (strncmp(argv[0], "help", 4) == 0) {
224                         printf("Available commands: \n");
225                         printf("[discover|select|nodev|ip|vlan|port|sys] \n");
226                 }
227
228                 
229                 
230         }
231 }
232