Commit 97cc6953ec86efb667bf8c788dcdc8864265e3e0

Authored by Ting Chan
0 parents
Exists in master

first commit

Showing 2 changed files with 617 additions and 0 deletions   Show diff stats
File was created 1 <?php
2 date_default_timezone_set("Asia/Taipei");
3 $date = date_create();
4 $time = date_format($date, 'Y-m-d H:i:s');
5
6 $link = mysqli_connect("10.10.10.237", "root", "SANlien<03051501>", "practice");
7
8 if (mysqli_connect_errno()) {
9 //printf("Connect failed: %s\n", mysqli_connect_error());
10 exit();
11 }
12
13 //printf("#connect successfully<br><br>\n");
14
15 if(isset($_GET["inst"]))
16 {
17 $serial = "\"".$_GET["inst"]."\"";
18 if( !(isset($_GET["code"])))
19 {
20 //echo "not API<br>";
21 $query = "SELECT OpCode FROM status WHERE SerialNo = $serial";
22 //echo "#query <br> => <br> $query<br><br>";
23
24 if ($result = mysqli_query($link, $query))
25 {
26 if ($row = mysqli_fetch_row($result))
27 {
28 $service_code = "\"$row[0]\"";
29 echo "service_code:$row[0]";
30
31 //echo "<br><br>insert service_code to log<br>";
32 $query = "INSERT INTO log(Time,SerialNo,OpCode) VALUES (\"$time\", $serial, $service_code)";
33 //echo "#query <br> => <br> $query<br><br>";
34 mysqli_query($link, $query);
35 //printf("Insert New Record sucessfully<br>");
36 }
37 else
38 {
39 //echo "<br><br>insert wrong service_code to log<br>";
40 $query = "INSERT INTO log(Time,SerialNo,OpCode,msg) VALUES (\"$time\", $serial, \"\",\"wrong serial\")";
41 mysqli_query($link, $query);
42
43 //printf("Insert New wrong record sucessfully<br><br>");
44 }
45 mysqli_free_result($result);
46 mysqli_free_result($row);
47 }
48 }
49 else
50 {
51 //echo "is API<br>";
52 $service_code = "\"".$_GET["code"]."\"";
53
54 if($service_code == "\"666\"")
55 {
56 //echo "<br>insert API's service code to log<br>";
57 $query = "INSERT INTO log(Time,SerialNo,OpCode) VALUES (\"$time\", $serial, $service_code)";
58 mysqli_query($link, $query);
59 //printf("Insert into log sucessfully<br><br>");
60
61 //printf("update status to 666<br>");
62 $query="UPDATE status SET OpCode = $service_code WHERE SerialNo = $serial";
63 mysqli_query($link, $query);
64 //printf("update successfully.<br>Affected rows (UPDATE): %d<br>", mysqli_affected_rows($link));
65 }
66 else if($service_code == "\"400\"")
67 {
68 if(isset($_GET["msg"]))
69 {
70 $msg="\"".$_GET["msg"]."\"";
71 $query = "INSERT INTO log(Time,SerialNo,OpCode,msg) VALUES (\"$time\", $serial, $service_code,$msg)";
72 mysqli_query($link, $query);
73 //printf("Insert 400 sucessfully<br><br>");
74
75 //printf("update status to 000<br>");
76 $query="UPDATE status SET OpCode = \"000\" WHERE SerialNo = $serial";
77 mysqli_query($link, $query);
78 //printf("update successfully.<br>Affected rows (UPDATE): %d<br>", mysqli_affected_rows($link));
79 }
80 }
81 else if($service_code == "\"777\"")
82 {
83 //echo "<br>insert API's service code to log<br>";
84 $query = "INSERT INTO log(Time,SerialNo,OpCode) VALUES (\"$time\", $serial, $service_code)";
85 mysqli_query($link, $query);
86 //printf("Insert into log sucessfully<br><br>");
87
88 //printf("update status to 000<br>");
89 $query="UPDATE status SET OpCode = \"000\" WHERE SerialNo = $serial";
90 mysqli_query($link, $query);
91 //printf("update successfully.<br>Affected rows (UPDATE): %d<br>", mysqli_affected_rows($link));
92 }
93
94 }
95 }
96 else
97 {
98 //printf("no serial");
99 }
100
101 mysqli_close($link);
102 ?>
File was created 1 #include <stdio.h>
2 #include <string.h> //memcmp 要 include 的 header
3 #include <stdlib.h>
4 #include <unistd.h> //getpid()
5 #include <errno.h>
6 #include <netdb.h>
7 #include <sys/types.h>
8 #include <netinet/in.h> //sockaddr_in
9 #include <sys/socket.h> //socket()
10
11 #define PORT 80 // Client 所要連線的 port
12 #define MAXDATASIZE 500 //最大可收的 bytes 大小
13
14 char ip[50];
15 char port[50];
16 char user[50];
17 char password[50];
18 char folder[50];
19 char command[500];
20 char serial[50];
21 int checkT = 0, checkR = 0; //0為complete; -1回傳開檔失敗; -2回傳 傳檔/收檔失敗 的錯誤 Message
22 int errorCountR = 0, errorCountT = 0;
23
24 void readConfig() //用來存取 ip, port, password 等等變數的 function
25 {
26 FILE *fp;
27 fp = fopen("service.cfg", "r"); //開檔,讀取service.cfg的檔案
28 if(fp == NULL)
29 printf("open failure\n");
30 else
31 {
32 while(1)
33 {
34 fgets(command, 500, fp); //從fp中一次讀取一行指令(500字元)到common中
35
36 if(feof(fp)) //如讀到底則 Break
37 {
38 break;
39 }
40 else
41 {
42 char check[500];
43 sscanf(command, "%s %*s", check); //從command中讀取前面的字元存到 check 中,後面的字元省略
44
45 if(memcmp(check, "IP", 2) == 0) //如 (check == "IP") 則從 command 中讀取後面的字元存到 ip 變數中,前面的字元省略
46 {
47 sscanf(command, "%*s %s", ip);
48 }
49 else if(memcmp(check, "PORT", 4) == 0)
50 {
51 sscanf(command, "%*s %s", port);
52 }
53 else if(memcmp(check, "PASSWORD", 8) == 0)
54 {
55 sscanf(command, "%*s %s", password);
56 }
57 else if(memcmp(check, "USER", 4) == 0)
58 {
59 sscanf(command, "%*s %s", user);
60 }
61 else if(memcmp(check, "FOLDER", 6) == 0)
62 {
63 sscanf(command, "%*s %s", folder);
64 }
65 }
66 }
67 fclose(fp);
68 }
69 }
70
71 /*void readSerialNo() //用來讀取序號用的 function
72 {
73 FILE *fp2;
74 fp2 = fopen("/proc/cpuinfo", "r");
75
76 if(fp2 == NULL)
77 {
78 printf("open failure\n");
79 }
80 else
81 {
82 while(1)
83 {
84 fgets(command, 500, fp2);
85 if(feof(fp2))
86 {
87 break;
88 }
89 else
90 {
91 char check[500];
92 sscanf(command, "%s %*[]", check);
93 if(memcmp(check, "Serial", 6) == 0)
94 {
95 sscanf(command, "%*[^:] %*s %s", serial); //從command中,前面到:為止都省略掉,再省略一個空格,讀取最後一個字元存到serial
96 //printf("%s\n", serial);
97 sprintf(serial, "%s", serial); //把serial存成指定格式(%s)
98 //printf("%d\n", strlen(serial)); //測試serial有幾個字元
99 }
100 }
101 }
102 fclose(fp2); //記得關檔
103 }
104 }*/
105
106 void FileRevOk() //查看是否成功下載檔案,如成功跳出"file recv successfully"
107 { //如失敗跳出 "file not recv"
108 char buf[500];
109 FILE *pp;
110
111 printf("Befor receive, 以上正常\n");
112
113 if((pp = popen(command, "r")) == NULL)
114 {
115 printf("popen() error!\n");
116 checkR = -1;
117 return; //回傳 not found
118 }
119 else
120 {
121 while(fgets(buf, sizeof(buf), pp))
122 {
123 //printf("%s", buf);
124 if(memcmp(buf, "file recv ok", 12) == 0)
125 {
126 printf("file recv successfully\n");
127 pclose(pp);
128 checkR = 0;
129 return;
130 }
131 }
132
133 pclose(pp);
134 printf("file not recv\n");
135 checkR = -2;
136 return;
137 }
138 }
139
140 void FileTransferOk()
141 {
142 char buf[500];
143 FILE *pp;
144
145 puts("Befor transfer, 以上正常\n");
146
147 if((pp = popen(command, "r")) == NULL)
148 {
149 printf("popen() error!\n");
150 checkT = -1;
151 return;
152 }
153 else
154 {
155 while(fgets(buf, sizeof(buf), pp))
156 {
157 if(memcmp(buf, "Transfer OK.", 12) == 0)
158 {
159 printf("file transfer successfully\n");
160 pclose(pp);
161 checkT = 0;
162 return;
163 }
164 }
165
166 pclose(pp);
167 printf("file not transfer\n");
168 checkT = -2;
169 return;
170 }
171 }
172
173 ////////////////////////////////////////////////////////////////////////////////
174 // //
175 // tcpConnect //
176 // //
177 ////////////////////////////////////////////////////////////////////////////////
178
179 int tcpConnect(int return_code, char msg[50])
180 {
181 int sockfd; //socket的描述
182 int i;
183 int numbytes;
184 int service_code;
185 char buf[MAXDATASIZE];
186 struct hostent *host;
187 struct sockaddr_in info;
188 struct timeval tv;
189
190 sprintf(buf, "GET /index.php?inst=%s&&code=%d&&msg=%s HTTP/1.1\r\n", serial, return_code, msg);
191 i = strlen(buf);
192
193 if(return_code == 400)
194 {
195 //printf("Failure, Error message : %s\n", message);
196 sprintf(&buf[i], "Host: %s\r\nConnection: Failure\r\n\r\n\r\n\0\0\0\0\0\0\0", ip);
197 }
198 else if(return_code == 777)
199 {
200 //printf("complete\n");
201 sprintf(&buf[i], "Host: %s\r\nConnection: Complete\r\n\r\n\r\n\0\0\0\0\0\0\0", ip);
202 }
203 else if(return_code == 666)
204 {
205 //printf("under processing\n");
206 sprintf(&buf[i], "Host: %s\r\nConnection: Keep-Alive\r\n\r\n\r\n\0\0\0\0\0\0\0", ip);
207 }
208 else
209 {
210 puts("your return_code is wrong.\n");
211 }
212
213 sockfd = socket(AF_INET, SOCK_STREAM, 0); //socket的描述浮
214 if(sockfd == -1)
215 {
216 perror("socket");
217 exit(1);
218 }
219
220
221 bzero(&info, sizeof(info)); //初始化,將struct涵蓋的bits設為0
222 info.sin_family = AF_INET; //使用IPv4協定的地址
223 info.sin_addr.s_addr = inet_addr(ip); //IP address, inet_addr()可將字串IP變成 binary's IP
224 //info.sin_addr.s_addr = inet_addr("10.0.0.49");//先指向自己的 IP 練習, 可以把防火牆打開測試connected的timeout
225 info.sin_port = htons(PORT); //埠號,Host TO Network Short integer的縮寫,它將本機端的字節序(endian)轉換成了網路端的字節序
226 //printf("test %x\n", info.sin_addr.s_addr);
227
228 //socket的連線
229 //沒有timeout版本的connect
230 if((connect(sockfd, (struct sockaddr *)&info, sizeof(info))) == -1)
231 {
232 perror("connect");
233 exit(1);
234 }
235 printf("connect successfully\n");
236 //沒有timeout版本的connect
237
238
239 //有timeout 版本的connect
240 /*int res = connect(sockfd, (struct sockaddr *)&info, sizeof(info));
241 if(res < 0)
242 {
243 if(errno == EINPROGRESS) //connect 還在進行中
244 {
245 perror("EINPROGRESS in connect");
246
247 fd_set myset;
248 do
249 {
250 tv.tv_sec = 10;
251 tv.tv_usec = 0;
252 FD_ZERO(&myset);
253 FD_SET(sockfd, &myset);
254 res = select(sockfd+1, NULL, &myset, NULL, &tv);
255 if(res < 0 && errno != EINTR)
256 {
257 perror("connect error");
258 exit(1);
259 }
260 else if(res >0)
261 {
262 socklen_t len;
263 int valopt;
264
265 len = sizeof(int);
266 if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &len) < 0) //getsockopt can determine if the socket is connected (=0, connected)
267 {
268 perror("Error in getsockopt()");
269 exit(1);
270 }
271
272 if(valopt)
273 {
274 perror("Error in delay");
275 exit(1);
276 }
277 break;
278 }
279 else
280 {
281 perror("Timeout");
282 exit(1);
283 }
284 }while(1);
285 }
286 else
287 {
288 perror("connect error");
289 exit(1);
290 }
291 }//有timeout版的connect
292 */
293
294 //傳送資料(send a message on a socket),如正確 send 會回傳實際送出的 Byte 數
295 if((send(sockfd, buf, sizeof(buf), 0)) == -1)
296 {
297 perror("send");
298 exit(1);
299 }
300 //printf("send:\n%s\n", buf);
301 printf("After the send function \n\n");
302
303
304 //接收資料,如正確 recv 會回傳實際讀到並寫入到 buffer 的 Byte 數
305 numbytes = recv(sockfd, buf, sizeof(buf), 0);
306 //printf("numbytes = %d\n", numbytes);
307 if(numbytes == -1)
308 {
309 perror("recv");
310 exit(1);
311 }
312
313 close(sockfd);
314
315 buf[numbytes] = '\0';
316 printf("Received in pid = %d, text = %s \n", getpid(), buf);
317
318 return 0;
319 }
320
321 int updateFirmware()
322 {
323 int sockfd; //socket的描述
324 int i;
325 int numbytes;
326 int service_code;
327 char buf[12] = {1,2,0,0,0,6,1,6,0,0x70,1,0x81};
328 struct hostent *host;
329 struct sockaddr_in info;
330
331 i = strlen(buf);
332
333 sockfd = socket(AF_INET, SOCK_STREAM, 0); //socket的描述浮
334 if(sockfd == -1)
335 {
336 perror("socket");
337 exit(1);
338 }
339
340 bzero(&info, sizeof(info)); //初始化,將struct涵蓋的bits設為0
341 info.sin_family = AF_INET; //使用IPv4協定的地址
342 //info.sin_addr.s_addr = inet_addr(ip); //IP address, inet_addr()可將字串IP變成 binary's IP
343 info.sin_addr.s_addr = inet_addr("127.0.0.1");//先指向自己的 IP 練習, 可以把防火牆打開測試connected的timeout
344 info.sin_port = htons(502); //埠號,Host TO Network Short integer的縮寫,它將本機端的字節序(endian)轉換成了網路端的字節序
345
346 //socket的連線
347 //沒有timeout版本的connect
348 if((connect(sockfd, (struct sockaddr *)&info, sizeof(info))) == -1)
349 {
350 perror("connect");
351 exit(1);
352 }
353
354 //傳送資料(send a message on a socket),如正確 send 會回傳實際送出的 Byte 數
355 if((send(sockfd, buf, sizeof(buf), 0)) == -1)
356 {
357 perror("send");
358 exit(1);
359 }
360 printf("After the send function \n\n");
361
362 //接收資料,如正確 recv 會回傳實際讀到並寫入到 buffer 的 Byte 數
363 numbytes = recv(sockfd, buf, sizeof(buf), 0);
364 if(numbytes == -1)
365 {
366 perror("recv");
367 exit(1);
368 }
369
370 close(sockfd);
371
372 buf[numbytes] = '\0';
373
374 return 0;
375
376 }
377 ///////////////////// main ///////////////////////////////////////////
378
379 int main(int argc, char *argv[])
380 {
381 int return_code;
382 int version;
383 int date;
384
385 return_code = atoi(argv[4]);
386 version = atoi(argv[6]);
387 date = atoi(argv[8]);
388 sprintf(serial, "%s", argv[9]);
389
390 readConfig(); //呼叫存取ip,password等等變數的function
391 if(return_code == 0) //如return_code為0,則輸出0且結束
392 printf("0\n"); //do nothing
393 else if(return_code == 400)
394 puts("工作失敗\n");
395 else if(return_code == 666)
396 puts("上一個程式還在執行中\n");
397 else if(return_code == 777)
398 puts("已完成\n");
399 else if(return_code == 10|| return_code == 110 || return_code == 20 || return_code == 120 ||
400 return_code == 1 || return_code == 101 || return_code == 200 || return_code == 300)
401 {
402 tcpConnect(666, ""); //呼叫tcp function會回處理中(參數666)
403 errorCountPlus: //如errorCountR or errorCountT <3會用goto回到這裡再執行一次
404 switch(return_code)
405 {
406 case 10: //如return_code為 010 則上傳 vAlert8.cfg
407 sprintf(command, "./ftpUpload.exe %s %s %s %s %s vAlert8.cfg STOR", ip, port, user, password, folder);
408 //printf("test command %s\n", command); //sprintf 為,把這些格式的值寫到command中
409 system(command); //叫 system 去執行command(自己設的變數)
410 FileTransferOk();
411 break;
412 case 110: //如return_code為 110 則下載 vAlert8.cfg
413 sprintf(command, "./ftpClient.exe %s %s %s %s vAlert8.cfg reset\n", ip, port, user, password);
414 //printf("%s\n", command);
415 system(command);
416 FileRevOk();
417 break;
418 case 20: //如return_code為 020 則上傳 vAlert8Common.cfg
419 sprintf(command, "./ftpUpload.exe %s %s %s %s %s vAlert8Common.cfg STOR", ip, port, user, password, folder);
420 //printf("%s\n", command);
421 system(command);
422 FileTransferOk();
423 break;
424 case 120: //如return_code為 120 則下載 vAlert8Common.cfg
425 sprintf(command, "./ftpClient.exe %s %s %s %s vAlert8Common.cfg reset", ip, port, user, password);
426 //printf("%s\n",command);
427 system(command);
428 FileRevOk();
429 break;
430 case 1: //如return_code為 001 則上傳清單上的檔案,需先下載再上傳檔案清單
431 sprintf(command, "./ftpClient.exe %s %s %s %s uploadFileList_%s reset", ip, port, user, password, serial);
432 system(command); //先下載檔案
433 FileRevOk();
434
435 FILE *fp3;
436 fp3 = fopen("uploadFileList.txt","r");
437 if(fp3 == NULL)
438 {
439 printf("open failure\n");
440 }
441 else //再上傳檔案清單
442 {
443 char temp[500];
444 fgets(temp, 500, fp3);
445 sprintf(command,"./ftpUpload.exe %s %s %s %s %s/%s uploadFileList_%s STOR", ip, port, user, password, folder, temp, serial);
446 //printf("%s\n", command);
447 system(command);
448 FileTransferOk();
449 }
450 fclose(fp3);
451 break;
452 case 101: //如return_code為 101 則單純下載檔案清單
453 sprintf(command, "./ftpClients.exe %s %s %s %s uploadFileList_%s reset", ip, port, user, password, serial);
454 //printf("%s\n", command);
455 system(command);
456 FileRevOk();
457 break;
458 case 200:
459 puts("更新韌體\n");
460 updateFirmware();
461 break;
462 case 300: //如return_code為 300 則先下載 run_serial.sh,並執行排程
463 sprintf(command, "./ftpClient.exe %s %s %s %s run_%s.sh reset", ip, port, user, password, serial);
464 //printf("%s\n", command);
465 system(command);
466 FileRevOk();
467
468 sprintf(command, "sudo chmod +x run_%s.sh", serial);//改成可執行檔
469 //printf("first %s\n", command);
470 system(command);
471
472 sprintf(command, "sudo ./run_%s.sh", serial); //執行排程
473 //printf("second %s\n", command);
474 system(command);
475 break;
476 }//end switch
477 }//end else if
478 else
479 {
480 puts("wrong code\n");
481 }
482 if(checkR == 0 && checkT == 0) //FileRevOk && FileTransferOk 的結果都收到OK回傳777
483 {
484 tcpConnect(777, "");
485 }
486 else //Received 沒收到三次會回傳400
487 {
488 if(checkR != 0 && errorCountR < 3)
489 {
490 errorCountR++;
491 printf("Received fail %d time\n", errorCountR);
492 checkR = 0;
493 goto errorCountPlus;
494 }
495 else if(checkR == -1)
496 tcpConnect(400, "popen()_error");
497 else if(checkR == -2)
498 tcpConnect(400, "file_not_recv");
499
500
501 if(checkT != 0 && errorCountT < 3) //Transfer 沒收到三次會回傳400
502 {
503 errorCountT++;
504 printf("Transfer fail %d time\n", errorCountT);
505 checkT = 0;
506 goto errorCountPlus;
507 }
508 else if(checkT == -1)
509 tcpConnect(400, "popen()_error");
510 else if(checkT == -2)
511 tcpConnect(400, "file_not_transfer");
512 }
513
514 return 0;
515 }