*** empty log message ***
[citadel.git] / webcit / netconf.c
1 /* 
2  * netconf.c
3  *
4  * Functions which handle network and sharing configuration.
5  *
6  * $Id$
7  */
8
9 #include <ctype.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <stdio.h>
13 #include <fcntl.h>
14 #include <signal.h>
15 #include <sys/types.h>
16 #include <sys/wait.h>
17 #include <sys/socket.h>
18 #include <sys/time.h>
19 #include <limits.h>
20 #include <netinet/in.h>
21 #include <netdb.h>
22 #include <string.h>
23 #include <pwd.h>
24 #include <errno.h>
25 #include <stdarg.h>
26 #include <pthread.h>
27 #include <signal.h>
28 #include "webcit.h"
29
30
31
32 void edit_node(void) {
33         char buf[SIZ];
34         char node[SIZ];
35         char cnode[SIZ];
36         FILE *fp;
37
38         if (!strcmp(bstr("sc"), "OK")) {
39                 strcpy(node, bstr("node") );
40                 fp = tmpfile();
41                 if (fp != NULL) {
42                         serv_puts("CONF getsys|application/x-citadel-ignet-config");
43                         serv_gets(buf);
44                         if (buf[0] == '1') {
45                                 while (serv_gets(buf), strcmp(buf, "000")) {
46                                         extract(cnode, buf, 0);
47                                         if (strcasecmp(node, cnode)) {
48                                                 fprintf(fp, "%s\n", buf);
49                                         }
50                                 }
51                         fprintf(fp, "%s|%s|%s|%s\n", 
52                                 bstr("node"),
53                                 bstr("secret"),
54                                 bstr("host"),
55                                 bstr("port") );
56                         }
57                         rewind(fp);
58
59                         serv_puts("CONF putsys|application/x-citadel-ignet-config");
60                         serv_gets(buf);
61                         if (buf[0] == '4') {
62                                 while (fgets(buf, sizeof buf, fp) != NULL) {
63                                         buf[strlen(buf)-1] = 0;
64                                         serv_puts(buf);
65                                 }
66                                 serv_puts("000");
67                         }
68                         fclose(fp);
69                 }
70         }
71
72         display_netconf();
73 }
74
75
76
77 void display_add_node(void)
78 {
79         output_headers(1, 1, 2, 0, 0, 0, 0);
80         wprintf("<div id=\"banner\">\n");
81         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
82         wprintf("<SPAN CLASS=\"titlebar\">Add new node</SPAN>");
83         wprintf("</TD></TR></TABLE>\n");
84         wprintf("</div>\n<div id=\"content\">\n");
85
86         wprintf("<FORM METHOD=\"POST\" ACTION=\"/edit_node\">\n");
87         wprintf("<CENTER><TABLE border=0>\n");
88         wprintf("<TR><TD>Node name</TD>");
89         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"16\"></TD></TR>\n");
90         wprintf("<TR><TD>Shared secret</TD>");
91         wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"16\"></TD></TR>\n");
92         wprintf("<TR><TD>Host or IP</TD>");
93         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"64\"></TD></TR>\n");
94         wprintf("<TR><TD>Port</TD>");
95         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"port\" MAXLENGTH=\"8\"></TD></TR>\n");
96         wprintf("</TABLE><br />");
97         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
98         wprintf("&nbsp;");
99         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
100         wprintf("</CENTER></FORM>\n");
101
102         wDumpContent(1);
103 }
104
105 void display_edit_node(void)
106 {
107         char buf[SIZ];
108         char node[SIZ];
109         char cnode[SIZ];
110         char csecret[SIZ];
111         char chost[SIZ];
112         char cport[SIZ];
113
114         strcpy(node, bstr("node"));
115
116         output_headers(1, 1, 2, 0, 0, 0, 0);
117         wprintf("<div id=\"banner\">\n");
118         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
119         wprintf("<SPAN CLASS=\"titlebar\">Edit node configuration for ");
120         escputs(node);
121         wprintf("</SPAN>\n");
122         wprintf("</TD></TR></TABLE>\n");
123         wprintf("</div>\n<div id=\"content\">\n");
124
125         serv_puts("CONF getsys|application/x-citadel-ignet-config");
126         serv_gets(buf);
127         if (buf[0] == '1') {
128                 while (serv_gets(buf), strcmp(buf, "000")) {
129                         extract(cnode, buf, 0);
130                         extract(csecret, buf, 1);
131                         extract(chost, buf, 2);
132                         extract(cport, buf, 3);
133
134                         if (!strcasecmp(node, cnode)) {
135                                 wprintf("<FORM METHOD=\"POST\" ACTION=\"/edit_node\">\n");
136                                 wprintf("<CENTER><TABLE border=0>\n");
137                                 wprintf("<TR><TD>Node name</TD>");
138                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"16\" VALUE=\"%s\"></TD></TR>\n", cnode);
139                                 wprintf("<TR><TD>Shared secret</TD>");
140                                 wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"16\" VALUE=\"%s\"></TD></TR>\n", csecret);
141                                 wprintf("<TR><TD>Host or IP</TD>");
142                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"64\" VALUE=\"%s\"></TD></TR>\n", chost);
143                                 wprintf("<TR><TD>Port</TD>");
144                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"port\" MAXLENGTH=\"8\" VALUE=\"%s\"></TD></TR>\n", cport);
145                                 wprintf("</TABLE><br />");
146                                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
147                                 wprintf("&nbsp;");
148                                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
149                                 wprintf("</CENTER></FORM>\n");
150                         }
151
152                 }
153         }
154
155         else {          /* command error getting configuration */
156                 wprintf("%s<br />\n", &buf[4]);
157         }
158
159         wDumpContent(1);
160 }
161
162
163
164 void display_netconf(void)
165 {
166         char buf[SIZ];
167         char node[SIZ];
168
169         output_headers(1, 1, 2, 0, 0, 0, 0);
170         wprintf("<div id=\"banner\">\n");
171         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
172         wprintf("<SPAN CLASS=\"titlebar\">Network configuration</SPAN>\n");
173         wprintf("</TD></TR></TABLE>\n");
174         wprintf("</div>\n<div id=\"content\">\n");
175
176         wprintf("<CENTER>");
177         wprintf("<A HREF=\"/display_add_node\">");
178         wprintf("Add a new node</A><br />\n");
179         wprintf("</CENTER>");
180
181         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
182         wprintf("<SPAN CLASS=\"titlebar\">Currently configured nodes</SPAN>\n");
183         wprintf("</TD></TR></TABLE>\n");
184         serv_puts("CONF getsys|application/x-citadel-ignet-config");
185         serv_gets(buf);
186         if (buf[0] == '1') {
187                 wprintf("<CENTER><TABLE border=0>\n");
188                 while (serv_gets(buf), strcmp(buf, "000")) {
189                         extract(node, buf, 0);
190                         wprintf("<TR><TD><FONT SIZE=+1>");
191                         escputs(node);
192                         wprintf("</FONT></TD>");
193                         wprintf("<TD><A HREF=\"/display_edit_node&node=");
194                         urlescputs(node);
195                         wprintf("\">(Edit)</A></TD>");
196                         wprintf("<TD><A HREF=\"/display_confirm_delete_node&node=");
197                         urlescputs(node);
198                         wprintf("\">(Delete)</A></TD>");
199                         wprintf("</TR>\n");
200                 }
201                 wprintf("</TABLE></CENTER>\n");
202         }
203         wDumpContent(1);
204 }
205
206
207 void display_confirm_delete_node(void)
208 {
209         char node[SIZ];
210
211         output_headers(1, 1, 2, 0, 0, 0, 0);
212         wprintf("<div id=\"banner\">\n");
213         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
214         wprintf("<SPAN CLASS=\"titlebar\">Confirm delete</SPAN>\n");
215         wprintf("</TD></TR></TABLE>\n");
216         wprintf("</div>\n<div id=\"content\">\n");
217
218         strcpy(node, bstr("node"));
219         wprintf("<CENTER>Are you sure you want to delete <FONT SIZE=+1>");
220         escputs(node);
221         wprintf("</FONT>?<br />\n");
222         wprintf("<A HREF=\"/delete_node&node=");
223         urlescputs(node);
224         wprintf("\">Yes</A>&nbsp;&nbsp;&nbsp;");
225         wprintf("<A HREF=\"/display_netconf\">No</A><br />\n");
226         wDumpContent(1);
227 }
228
229
230 void delete_node(void)
231 {
232         char buf[SIZ];
233         char node[SIZ];
234         char cnode[SIZ];
235         FILE *fp;
236
237         strcpy(node, bstr("node") );
238         fp = tmpfile();
239         if (fp != NULL) {
240                 serv_puts("CONF getsys|application/x-citadel-ignet-config");
241                 serv_gets(buf);
242                 if (buf[0] == '1') {
243                         while (serv_gets(buf), strcmp(buf, "000")) {
244                                 extract(cnode, buf, 0);
245                                 if (strcasecmp(node, cnode)) {
246                                         fprintf(fp, "%s\n", buf);
247                                 }
248                         }
249                 }
250                 rewind(fp);
251
252                 serv_puts("CONF putsys|application/x-citadel-ignet-config");
253                 serv_gets(buf);
254                 if (buf[0] == '4') {
255                         while (fgets(buf, sizeof buf, fp) != NULL) {
256                                 buf[strlen(buf)-1] = 0;
257                                 serv_puts(buf);
258                         }
259                         serv_puts("000");
260                 }
261                 fclose(fp);
262         }
263
264         display_netconf();
265 }
266
267
268 void add_node(void)
269 {
270         char node[SIZ];
271         char buf[SIZ];
272         char sc[SIZ];
273
274         strcpy(node, bstr("node"));
275         strcpy(sc, bstr("sc"));
276
277         if (!strcmp(sc, "Add")) {
278                 sprintf(buf, "NSET addnode|%s", node);
279                 serv_puts(buf);
280                 serv_gets(buf);
281                 if (buf[0] == '1') {
282                         output_headers(1, 1, 0, 0, 0, 0, 0);
283                         server_to_text();
284                         wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
285                         wDumpContent(1);
286                 } else {
287                         strcpy(WC->ImportantMessage, &buf[4]);
288                         display_netconf();
289                 }
290         }
291 }
292
293