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
... ... @@ -0,0 +1,102 @@
  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 +?>
0 103 \ No newline at end of file
... ...
... ... @@ -0,0 +1,515 @@
  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 +}
0 516 \ No newline at end of file
... ...