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