2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
23 $Date: 2010/03/15 12:58:17 $
31 #include "stg/common.h"
36 extern IA_CLIENT_PROT * clnp;
38 #define LISTEN_PORT (5580)
42 //---------------------------------------------------------------------------
46 unsigned long WINAPI RunWeb(void *)
53 //---------------------------------------------------------------------------
62 res = WSAStartup(MAKEWORD(2,0), &wsaData);
65 for (int i = 0; i < DIR_NUM; i++)
70 memset(&ls, 0, sizeof(ls));
72 //---------------------------------------------------------------------------
78 NULL, // pointer to thread security attributes
79 16384, // initial thread stack size, in bytes
80 RunWeb, // pointer to thread function
81 NULL, // argument for new thread
82 0, // CREATE_SUSPENDED, // creation flags
83 &pt // pointer to returned thread identifier
86 pthread_create(&thread, NULL, RunWeb, NULL);
89 //---------------------------------------------------------------------------
90 void WEB::PrepareNet()
92 listenSocket = socket(PF_INET, SOCK_STREAM, 0);
94 struct sockaddr_in listenAddr;
95 listenAddr.sin_family = AF_INET;
96 listenAddr.sin_port = htons(LISTEN_PORT);
97 listenAddr.sin_addr.s_addr = listenWebAddr;
101 if (0 != setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &lng, 4))
103 printf("Setsockopt Fail\n");
104 printf(">>> Error %s\n", strerror(errno));
111 res = bind(listenSocket, (struct sockaddr*)&listenAddr, sizeof(listenAddr));
115 printf("Bind failed.\n");
119 res = listen(listenSocket, 0);
122 printf("Listen failed.\n");
126 //---------------------------------------------------------------------------
127 void WEB::SetRefreshPagePeriod(int p)
130 if (refreshPeriod <= 0 || refreshPeriod > 24*3600)
133 //---------------------------------------------------------------------------
134 void WEB::SetListenAddr(uint32_t ip)
138 //---------------------------------------------------------------------------
142 char recvBuffer[4096];
145 struct sockaddr_in outerAddr;
148 socklen_t outerAddrLen = sizeof(outerAddr);
150 int outerAddrLen = sizeof(outerAddr);
153 outerSocket = accept(listenSocket, (struct sockaddr*)&outerAddr, &outerAddrLen);
154 if (outerSocket == -1)
156 printf(">>> Error %s\n", strerror(errno));
159 recv(outerSocket, recvBuffer, sizeof(recvBuffer), 0);
161 if (strncmp(recvBuffer, "GET /sgauth.css", strlen("GET /sgauth.css")) == 0)
164 //printf("(1) recvBuffer=%s\n", recvBuffer);
166 else if (strncmp(recvBuffer, "GET /disconnect", strlen("GET /disconnect")) == 0)
170 //printf("(2) recvBuffer=%s\n", recvBuffer);
172 else if (strncmp(recvBuffer, "GET /connect", strlen("GET /connect")) == 0)
176 //printf("(3) recvBuffer=%s\n", recvBuffer);
178 else if (strncmp(recvBuffer, "GET /exit", strlen("GET /exit")) == 0)
185 struct timespec ts = {1, 0};
186 nanosleep(&ts, NULL);
193 //printf("(4) recvBuffer=%s\n", recvBuffer);
197 closesocket(outerSocket);
203 //---------------------------------------------------------------------------
204 int WEB::Redirect(const char * url)
206 const char * redirect =
208 "Content-Type: text/html\n"
213 "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;%s\">\n"
216 "</body></html>\n\n";
219 sprintf(buff, redirect, url);
220 send(outerSocket, buff, strlen(buff), 0);
224 //---------------------------------------------------------------------------
229 const char * replyHeader =
231 "Content-Type: text/html\n"
236 "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"%d\">\n"
237 "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n"
238 "<title>sgauth</title>\n"
239 "<link rel=\"Stylesheet\" href=\"sgauth.css\">"
242 "<H3>Stargazer</H3><p>\n";
244 const char * replyFooter = "</body></html>\n\n";
246 char replyHeaderBuffer[2000];
247 sprintf(replyHeaderBuffer, replyHeader, refreshPeriod);
249 send(outerSocket, replyHeaderBuffer, strlen(replyHeaderBuffer), 0);
253 int st = clnp->GetAuthorized();
255 sprintf(str, "<a href=\"connect\">%s</a><p>\n", gettext("Connect"));
256 res = send(outerSocket, str, strlen(str), 0);
258 sprintf(str, "<a href=\"disconnect\">%s</a><p>\n", gettext("Disconnect"));
259 res = send(outerSocket, str, strlen(str), 0);
261 sprintf(str, "<a href=\"/\">%s</a><p>\n", gettext("Refresh"));
262 res = send(outerSocket, str, strlen(str), 0);
264 sprintf(str, "<a href=\"exit\">%s</a><p>\n", gettext("Exit"));
265 res = send(outerSocket, str, strlen(str), 0);
267 sprintf(str, "<div id=\"%s\">%s</div><p>\n" , st ? "ConnectionStateOnline":"ConnectionStateOffline", st ? "Online":"Offline");
268 res = send(outerSocket, str, strlen(str), 0);
270 sprintf(str, "<div id=\"Cash\">%s: %.3f</div><p>\n" , gettext("Cash"), ls.cash / 1000.0);
271 res = send(outerSocket, str, strlen(str), 0);
273 sprintf(str, "<div id=\"Prepaid Traffic\">%s: %s</div><p>\n" ,
274 gettext("PrepaidTraffic"),
275 ls.freeMb[0] == 'C' ? ls.freeMb + 1 : ls.freeMb);
276 res = send(outerSocket, str, strlen(str), 0);
278 sprintf(str, "<TABLE id=\"TraffTable\">\n");
279 res = send(outerSocket, str, strlen(str), 0);
280 sprintf(str, " <TR id=\"TraffTableCaptionRow\">\n");
281 res = send(outerSocket, str, strlen(str), 0);
282 sprintf(str, " <TD id=\"TraffTableCaptionCellC\"> </TD>\n");
283 res = send(outerSocket, str, strlen(str), 0);
286 for (j = 0; j < DIR_NUM; j++)
288 if (dirName[j][0] == 0)
291 KOIToWin(dirName[j], &s);// +++++++++ sigsegv ========== TODO too long dir name crashes sgauth
292 sprintf(str, " <TD id=\"TraffTableCaptionCell%d\">%s</TD>\n", rowNum++, s.c_str());
293 send(outerSocket, str, strlen(str), 0);
296 sprintf(str," </TR>\n");
297 send(outerSocket, str, strlen(str), 0);
299 sprintf(str," <TR id=\"TraffTableUMRow\">\n");
300 send(outerSocket, str, strlen(str), 0);
302 sprintf(str," <TD id=\"TraffTableUMCellC\">%s</TD>\n", gettext("Month Upload"));
303 send(outerSocket, str, strlen(str), 0);
306 for (j = 0; j < DIR_NUM; j++)
308 if (dirName[j][0] == 0)
310 sprintf(str," <TD id=\"TraffTableUMCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.mu[j], ST_F));
311 res = send(outerSocket, str, strlen(str), 0);
314 sprintf(str," </TR>\n");
315 res = send(outerSocket, str, strlen(str), 0);
316 sprintf(str," <TR id=\"TraffTableDMRow\">\n");
317 res = send(outerSocket, str, strlen(str), 0);
318 sprintf(str," <TD id=\"TraffTableDMCellC\">%s</TD>\n", gettext("Month Download"));
319 res = send(outerSocket, str, strlen(str), 0);
322 for (j = 0; j < DIR_NUM; j++)
324 if (dirName[j][0] == 0)
326 sprintf(str," <TD id=\"TraffTableDMCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.md[j], ST_F));
327 res = send(outerSocket, str, strlen(str), 0);
329 sprintf(str," </TR>\n");
330 res = send(outerSocket, str, strlen(str), 0);
333 sprintf(str," <TR id=\"TraffTableUSRow\">\n");
334 res = send(outerSocket, str, strlen(str), 0);
335 sprintf(str," <TD id=\"TraffTableUSCellC\">%s</TD>\n", gettext("Session Upload"));
336 res = send(outerSocket, str, strlen(str), 0);
339 for (j = 0; j < DIR_NUM; j++)
341 if (dirName[j][0] == 0)
343 sprintf(str," <TD id=\"TraffTableUSCell%d\">%s</TD>\n", rowNum++, IntToKMG(ls.su[j], ST_F));
344 res = send(outerSocket, str, strlen(str), 0);
347 sprintf(str," </TR>\n");
348 res = send(outerSocket, str, strlen(str), 0);
349 sprintf(str," <TR id=\"TraffTableDSRow\">\n");
350 res = send(outerSocket, str, strlen(str), 0);
351 sprintf(str," <TD id=\"TraffTableDSCellC\">%s</TD>\n", gettext("Session Download"));
352 res = send(outerSocket, str, strlen(str), 0);
355 for (j = 0; j < DIR_NUM; j++)
357 if (dirName[j][0] == 0)
359 sprintf(str," <TD id=\"TraffTableDSCell%d\">%s</TD>\n", j, IntToKMG(ls.sd[j], ST_F));
360 res = send(outerSocket, str, strlen(str), 0);
363 sprintf(str," </TR>\n");
364 res = send(outerSocket, str, strlen(str), 0);
366 sprintf(str,"</TABLE>\n");
367 res = send(outerSocket, str, strlen(str), 0);
370 if (!messages.empty())
372 sprintf(str," <TABLE id=\"MessagesTable\">\n");
373 res = send(outerSocket, str, strlen(str), 0);
375 sprintf(str," <TR id=\"MessagesTableRowC\">\n");
376 send(outerSocket, str, strlen(str), 0);
377 sprintf(str," <TD>Date</TD>\n");
378 send(outerSocket, str, strlen(str), 0);
379 sprintf(str," <TD>Text</TD>\n");
380 send(outerSocket, str, strlen(str), 0);
381 sprintf(str," </TR>\n");
382 send(outerSocket, str, strlen(str), 0);
384 list<STG_MESSAGE>::reverse_iterator it;
385 it = messages.rbegin();
386 while (it != messages.rend())
388 sprintf(str," <TR id=\"MessagesTableRow%d\">\n", rowNum);
389 send(outerSocket, str, strlen(str), 0);
390 sprintf(str," <TD>%s</TD>\n", it->recvTime.c_str());
391 send(outerSocket, str, strlen(str), 0);
392 sprintf(str," <TD>%s</TD>\n", it->msg.c_str());
393 send(outerSocket, str, strlen(str), 0);
394 sprintf(str," </TR>\n");
395 send(outerSocket, str, strlen(str), 0);
400 sprintf(str," </TABLE>\n");
401 res = send(outerSocket, str, strlen(str), 0);
404 time_t t = time(NULL);
405 sprintf(str,"Îáíîâëåíî: %s</b>" , ctime(&t));
406 res = send(outerSocket, str, strlen(str), 0);
408 send(outerSocket, replyFooter, strlen(replyFooter), 0);
412 //---------------------------------------------------------------------------
415 const char * replyHeader =
417 "Content-Type: text/css\n"
418 "Connection: close\n\n";
420 const char * replyFooter= "\n\n";
422 send(outerSocket, replyHeader, strlen(replyHeader), 0);
423 send(outerSocket, css, strlen(css), 0);
424 send(outerSocket, replyFooter, strlen(replyFooter), 0);
428 //---------------------------------------------------------------------------
429 void WEB::SetDirName(const string & dn, int n)
431 web->dirName[n] = dn;
433 //---------------------------------------------------------------------------
434 void WEB::AddMessage(const string & message, int type)
436 time_t t = time(NULL);
441 m.recvTime = ctime(&t);
443 messages.push_back(m);
445 if (messages.size() > MAX_MESSAGES)
446 messages.pop_front();
449 //---------------------------------------------------------------------------
450 void WEB::UpdateStat(const LOADSTAT & ls)
452 memcpy((void*)&(WEB::ls), &ls, sizeof(LOADSTAT));
454 //---------------------------------------------------------------------------