* doc change
[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);
80         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=000077><TR><TD>");
81         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
82         wprintf("<B>Add new node</B>");
83         wprintf("</FONT></TD></TR></TABLE>\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=\"8\"></TD></TR>\n");
89         wprintf("<TR><TD>Shared secret</TD>");
90         wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"8\"></TD></TR>\n");
91         wprintf("<TR><TD>Host or IP</TD>");
92         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"32\"></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("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
98         wprintf("</CENTER></FORM>\n");
99
100         wDumpContent(1);
101 }
102
103 void display_edit_node(void)
104 {
105         char buf[SIZ];
106         char node[SIZ];
107         char cnode[SIZ];
108         char csecret[SIZ];
109         char chost[SIZ];
110         char cport[SIZ];
111
112         strcpy(node, bstr("node"));
113
114         output_headers(1);
115         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=000077><TR><TD>");
116         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
117         wprintf("<B>Edit node configuration for ");
118         escputs(node);
119         wprintf("</B>\n");
120         wprintf("</FONT></TD></TR></TABLE>\n");
121
122         serv_puts("CONF getsys|application/x-citadel-ignet-config");
123         serv_gets(buf);
124         if (buf[0] == '1') {
125                 while (serv_gets(buf), strcmp(buf, "000")) {
126                         extract(cnode, buf, 0);
127                         extract(csecret, buf, 1);
128                         extract(chost, buf, 2);
129                         extract(cport, buf, 3);
130
131                         if (!strcasecmp(node, cnode)) {
132                                 wprintf("<FORM METHOD=\"POST\" ACTION=\"/edit_node\">\n");
133                                 wprintf("<CENTER><TABLE border=0>\n");
134                                 wprintf("<TR><TD>Node name</TD>");
135                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"8\" VALUE=\"%s\"></TD></TR>\n", cnode);
136                                 wprintf("<TR><TD>Shared secret</TD>");
137                                 wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"8\" VALUE=\"%s\"></TD></TR>\n", csecret);
138                                 wprintf("<TR><TD>Host or IP</TD>");
139                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"32\" VALUE=\"%s\"></TD></TR>\n", chost);
140                                 wprintf("<TR><TD>Port</TD>");
141                                 wprintf("<TD><INPUT TYPE=\"text\" NAME=\"port\" MAXLENGTH=\"8\" VALUE=\"%s\"></TD></TR>\n", cport);
142                                 wprintf("</TABLE><BR>");
143                                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
144                                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
145                                 wprintf("</CENTER></FORM>\n");
146                         }
147
148                 }
149         }
150
151         else {          /* command error getting configuration */
152                 wprintf("%s<BR>\n", &buf[4]);
153         }
154
155         wDumpContent(1);
156 }
157
158
159
160 void display_netconf(void)
161 {
162         char buf[SIZ];
163         char node[SIZ];
164
165         output_headers(1);
166         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=770000><TR><TD>");
167         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
168         wprintf("<B>Network configuration</B>\n");
169         wprintf("</FONT></TD></TR></TABLE>\n");
170
171         wprintf("<CENTER>");
172         wprintf("<A HREF=\"/display_add_node\">");
173         wprintf("Add a new node</A><BR>\n");
174         wprintf("</CENTER>");
175
176         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=000077><TR><TD>");
177         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
178         wprintf("<B>Currently configured nodes</B>\n");
179         wprintf("</FONT></TD></TR></TABLE>\n");
180         serv_puts("CONF getsys|application/x-citadel-ignet-config");
181         serv_gets(buf);
182         if (buf[0] == '1') {
183                 wprintf("<CENTER><TABLE border=0>\n");
184                 while (serv_gets(buf), strcmp(buf, "000")) {
185                         extract(node, buf, 0);
186                         wprintf("<TR><TD><FONT SIZE=+1>");
187                         escputs(node);
188                         wprintf("</FONT></TD>");
189                         wprintf("<TD><A HREF=\"/display_edit_node&node=");
190                         urlescputs(node);
191                         wprintf("\">(Edit)</A></TD>");
192                         wprintf("<TD><A HREF=\"/display_confirm_delete_node&node=");
193                         urlescputs(node);
194                         wprintf("\">(Delete)</A></TD>");
195                         wprintf("</TR>\n");
196                 }
197                 wprintf("</TABLE></CENTER>\n");
198         }
199         wDumpContent(1);
200 }
201
202
203 void display_confirm_delete_node(void)
204 {
205         char node[SIZ];
206
207         output_headers(1);
208         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=770000><TR><TD>");
209         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
210         wprintf("<B>Confirm delete</B>\n");
211         wprintf("</FONT></TD></TR></TABLE>\n");
212
213         strcpy(node, bstr("node"));
214         wprintf("<CENTER>Are you sure you want to delete <FONT SIZE=+1>");
215         escputs(node);
216         wprintf("</FONT>?<BR>\n");
217         wprintf("<A HREF=\"/delete_node&node=");
218         urlescputs(node);
219         wprintf("\">Yes</A>&nbsp;&nbsp;&nbsp;");
220         wprintf("<A HREF=\"/display_netconf\">No</A><BR>\n");
221         wDumpContent(1);
222 }
223
224
225 void delete_node(void)
226 {
227         char buf[SIZ];
228         char node[SIZ];
229         char cnode[SIZ];
230         FILE *fp;
231
232         strcpy(node, bstr("node") );
233         fp = tmpfile();
234         if (fp != NULL) {
235                 serv_puts("CONF getsys|application/x-citadel-ignet-config");
236                 serv_gets(buf);
237                 if (buf[0] == '1') {
238                         while (serv_gets(buf), strcmp(buf, "000")) {
239                                 extract(cnode, buf, 0);
240                                 if (strcasecmp(node, cnode)) {
241                                         fprintf(fp, "%s\n", buf);
242                                 }
243                         }
244                 }
245                 rewind(fp);
246
247                 serv_puts("CONF putsys|application/x-citadel-ignet-config");
248                 serv_gets(buf);
249                 if (buf[0] == '4') {
250                         while (fgets(buf, sizeof buf, fp) != NULL) {
251                                 buf[strlen(buf)-1] = 0;
252                                 serv_puts(buf);
253                         }
254                         serv_puts("000");
255                 }
256                 fclose(fp);
257         }
258
259         display_netconf();
260 }
261
262
263 void add_node(void)
264 {
265         char node[SIZ];
266         char buf[SIZ];
267         char sc[SIZ];
268
269         strcpy(node, bstr("node"));
270         strcpy(sc, bstr("sc"));
271
272         if (!strcmp(sc, "Add")) {
273                 sprintf(buf, "NSET addnode|%s", node);
274                 serv_puts(buf);
275                 serv_gets(buf);
276                 if (buf[0] == '1') {
277                         output_headers(1);
278                         server_to_text();
279                         wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
280                         wDumpContent(1);
281                 } else {
282                         display_error(&buf[4]);
283                 }
284         }
285 }
286
287