web_params_api.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. /********************************* (C) ROTEK ***********************************
  2. * @module web_params_api
  3. * @file web_params_api.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief web_params_api
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "common_config.h"
  13. #include "stm32f4xx.h"
  14. #include "web_params_api.h"
  15. #if defined HTTP_SERVER_ENABLE
  16. #include "http_server.h"
  17. #elif defined SSL_SERVER_ENABLE
  18. #include "my_ssl_server.h"
  19. #endif
  20. #include "parameters.h"
  21. #include "snmp_api.h"
  22. #include "trap_api.h"
  23. #include "settings_api.h"
  24. #include "snmp.h"
  25. #include "log.h"
  26. #include "hal.h"
  27. #include "cJSON.h"
  28. #include "FreeRTOS.h"
  29. #include "task.h"
  30. #ifdef PRINTF_STDLIB
  31. #include <stdio.h>
  32. #endif
  33. #ifdef PRINTF_CUSTOM
  34. #include "tinystdio.h"
  35. #endif
  36. #include <string.h>
  37. #include "syslog.h"
  38. typedef void (*pFunction)(void);
  39. pFunction Jump_To_Application;
  40. uint32_t JumpAddress;
  41. /**
  42. * @brief Возвращяет строку с настройками на первой странице
  43. * @retval None
  44. */
  45. char *HTTP_GetParamsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  46. {
  47. uint8_t len;
  48. (void)bufIn;
  49. (void)lenBufIn;
  50. (void)reqNum;
  51. cJSON *monitor_param = NULL;
  52. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  53. // Headers для поддержки saffari
  54. strcpy(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  55. monitor_param = cJSON_CreateObject();
  56. #define XJSON_PARAMS_TAG(tag, get_param) JSON_ADD_TAG(tag, get_param, monitor_param);
  57. WEB_PARAMS_TAGS_TABLE
  58. #undef XJSON_PARAMS_TAG
  59. if(cJSON_PrintPreallocated(monitor_param, &bufOut[strlen(bufOut)], SEND_BUF_MAX_LEN, 0)) {
  60. *lenBufOut = strlen(bufOut);
  61. } else {
  62. *lenBufOut = 0;
  63. }
  64. cJSON_Delete(monitor_param);
  65. return bufOut;
  66. }
  67. /**
  68. * @brief Возвращяет строку с настройками на второй странице
  69. * @retval None
  70. */
  71. char *HTTP_GetSettingsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  72. {
  73. uint8_t len;
  74. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  75. (void)bufIn;
  76. (void)lenBufIn;
  77. (void)reqNum;
  78. cJSON *settings_param = NULL;
  79. /* Headers для поддержки saffari */
  80. strcpy(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  81. settings_param = cJSON_CreateObject();
  82. #define XJSON_SETTINGS_TAG(tag, get_param, set_param) JSON_ADD_TAG(tag, get_param, settings_param);
  83. WEB_SETTINGS_TAGS_TABLE
  84. #undef XJSON_SETTINGS_TAG
  85. if(cJSON_PrintPreallocated(settings_param, &bufOut[strlen(bufOut)], SEND_BUF_MAX_LEN, 0)) {
  86. *lenBufOut = strlen(bufOut);
  87. } else {
  88. *lenBufOut = 0;
  89. }
  90. cJSON_Delete(settings_param);
  91. return bufOut;
  92. }
  93. uint8_t ConvertStringForJSON(char *inStr, char *paramValue, uint8_t inLen)
  94. {
  95. int len = 0, len2 = 0;
  96. char *strPtr = 0;
  97. uint8_t i = 0;
  98. while (i < inLen) {
  99. strPtr = strstr(inStr, "\"");
  100. if (strPtr != 0) {
  101. len = strPtr - inStr;
  102. if (len != 0) {
  103. strncat(paramValue, inStr, len);
  104. }
  105. strncat(paramValue, "\\", 1);
  106. strncat(paramValue, &inStr[len], 1);
  107. inStr = inStr + len + 1;
  108. i = i + len + 1;
  109. } else {
  110. if (paramValue != 0) {
  111. len2 = inLen - i;
  112. strncat(paramValue, inStr, len2);
  113. return 1;
  114. } else {
  115. return 0;
  116. }
  117. }
  118. }
  119. if (inLen == 0) {
  120. return 0;
  121. }
  122. return 1;
  123. }
  124. #ifdef NOTIFICATION_CONTROL_ENABLE
  125. /**
  126. * @brief Возвращяет строку с настройками уведомлений (есть/нет отправка)
  127. * @retval None
  128. */
  129. char *HTTP_GetTrapAccess(char *params, uint16_t len_params, char *buf, uint16_t *len_out)
  130. {
  131. char str[64];
  132. uint8_t len, i, first_item = 1;
  133. char value[20];
  134. (void)len_params;
  135. ClearParamString(params);
  136. memset(value, 0, 20);
  137. memset(str, 0, 64);
  138. /* Headers для поддержки saffari */
  139. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  140. /* Формирование списка уведомлений */
  141. strcat(buf, "{\"params\":[");
  142. for (i = 1; i < ALL_TRAPS; i++) {
  143. if (first_item) {
  144. first_item = 0;
  145. } else {
  146. strcat(buf, ",");
  147. }
  148. sprintf(str, "%d", i);
  149. len = strlen(str);
  150. strcat(buf, "{\"name\":\"");
  151. strncat(buf, str, len);
  152. GetTrapLongNameStr(str, &len, i);
  153. strcat(buf, "\",\"label\":\"");
  154. strncat(buf, str, len);
  155. GetNotificationTrapsStateStr(str, &len, i);
  156. strcat(buf, "\",\"snmp\":\"");
  157. strncat(buf, str, len);
  158. strcat(buf, "\"}");
  159. }
  160. strcat(buf, "]");
  161. /* Признак изменения сетевых настроек */
  162. GetWebReinitFlag(str, &len);
  163. strcat(buf, ",\"netsettings_changed\":\"");
  164. strncat(buf, str, len);
  165. strcat(buf, "\"}");
  166. *len_out = strlen(buf);
  167. return buf;
  168. }
  169. #endif
  170. /**
  171. * @brief Возвращяет строку с информацией об устройстве
  172. * @retval None
  173. */
  174. // TODO Согласовать максимальную длину строк
  175. char *HTTP_GetInfo(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  176. {
  177. char str[110];
  178. char tmp_str[220];
  179. uint8_t len;
  180. char tempStr[30];
  181. strncpy(tempStr, bufIn, 30);
  182. (void)lenBufIn;
  183. (void)reqNum;
  184. /* В запросе нет параметров, нужно формировать JSON ответ */
  185. if (strpbrk(tempStr, "?") == 0) {
  186. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  187. /* Headers для поддержки saffari */
  188. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  189. GetWorkTimeStr(str, &len);
  190. strcat(bufOut, "{\"uptime\":\"");
  191. strncat(bufOut, str, len);
  192. GetModelStr(str, &len);
  193. strcat(bufOut, "\",\"model\":\"");
  194. strncat(bufOut, str, len);
  195. GetProductionDataStr(str, &len);
  196. strcat(bufOut, "\",\"prodate\":\"");
  197. strncat(bufOut, str, len);
  198. GetVersionStr(str, &len);
  199. strcat(bufOut, "\",\"fwversion\":\"");
  200. strncat(bufOut, str, len);
  201. GetMacStr(str, &len);
  202. strcat(bufOut, "\",\"macaddr\":\"");
  203. strncat(bufOut, str, len);
  204. GetSerialNumberStr(str, &len);
  205. strcat(bufOut, "\",\"serno\":\"");
  206. strncat(bufOut, str, len);
  207. GetNameDeviceStr(str, &len);
  208. str[len] = 0;
  209. strcat(bufOut, "\",\"sysname\":\"");
  210. memset(tmp_str, 0, sizeof(tmp_str));
  211. if (ConvertStringForJSON(str, tmp_str, len)) {
  212. strncat(bufOut, tmp_str, strlen(tmp_str));
  213. } else {
  214. strncat(bufOut, str, len);
  215. }
  216. GetOwnerStr(str, &len);
  217. str[len] = 0;
  218. strcat(bufOut, "\",\"owner\":\"");
  219. memset(tmp_str, 0, sizeof(tmp_str));
  220. if (ConvertStringForJSON(str, tmp_str, len)) {
  221. strncat(bufOut, tmp_str, strlen(tmp_str));
  222. } else {
  223. strncat(bufOut, str, len);
  224. }
  225. GetLocationStr(str, &len);
  226. str[len] = 0;
  227. strcat(bufOut, "\",\"sysLocation\":\"");
  228. memset(tmp_str, 0, sizeof(tmp_str));
  229. if (ConvertStringForJSON(str, tmp_str, len)) {
  230. strncat(bufOut, tmp_str, strlen(tmp_str));
  231. } else {
  232. strncat(bufOut, str, len);
  233. }
  234. GetCommentsStr(str, &len);
  235. str[len] = 0;
  236. strcat(bufOut, "\",\"comment\":\"");
  237. memset(tmp_str, 0, sizeof(tmp_str));
  238. if (ConvertStringForJSON(str, tmp_str, len)) {
  239. strncat(bufOut, tmp_str, strlen(tmp_str));
  240. } else {
  241. strncat(bufOut, str, len);
  242. }
  243. GetUPSModelStr(str, &len);
  244. strcat(bufOut, "\",\"ups_model\":\"");
  245. strncat(bufOut, str, len);
  246. GetUPSSerialStr(str, &len);
  247. strcat(bufOut, "\",\"ups_sn\":\"");
  248. strncat(bufOut, str, len);
  249. GetUPSVersionStr(str, &len);
  250. strcat(bufOut, "\",\"ups_fwversion\":\"");
  251. strncat(bufOut, str, len);
  252. /* Признак изменения сетевых настроек */
  253. GetWebReinitFlag(str, &len);
  254. strcat(bufOut, "\",\"netsettings_changed\":\"");
  255. strncat(bufOut, str, len);
  256. strncat(bufOut, "\"}", 2);
  257. *lenBufOut = strlen(bufOut);
  258. return bufOut;
  259. }
  260. *lenBufOut = 0;
  261. return NULL;
  262. }
  263. void HTTP_GetHistoryPage(char *buf, uint32_t pageNumber)
  264. {
  265. char str[16];
  266. uint16_t len;
  267. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  268. strcat(buf, "{\"page\": [");
  269. History_GetPage(buf, pageNumber);
  270. len = strlen(buf);
  271. buf += len - 1;
  272. *buf = 0;
  273. buf -= len - 1;
  274. /* Количество страниц */
  275. memset(str, 0, 16);
  276. sprintf(str, "%i", History_GetPageCount());
  277. strcat(buf, "],\"pages\":\"");
  278. strcat(buf, str);
  279. /* Часовой пояс */
  280. GetSntpTimeZoneStr(str, (uint8_t *)&len);
  281. strcat(buf, "\",\"utc\":\"");
  282. strncat(buf, str, len);
  283. GetUnixTimeStr(str, (uint8_t *)&len);
  284. strcat(buf, "\",\"utm\":\"");
  285. strncat(buf, str, len);
  286. strcat(buf, "\"}");
  287. //printf(buf);
  288. }
  289. void HTTP_GetUpsHistoryPage(char *buf, uint32_t pageNumber)
  290. {
  291. char str[16];
  292. uint16_t len;
  293. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  294. strcat(buf, "{\"page\": [");
  295. LOG_GetPage(buf, pageNumber);
  296. len = strlen(buf);
  297. buf += len - 1;
  298. *buf = 0;
  299. buf -= len - 1;
  300. /* Количество страниц */
  301. memset(str, 0, 16);
  302. sprintf(str, "%i", LOG_GetPageCount());
  303. strcat(buf, "],\"pages\":\"");
  304. strcat(buf, str);
  305. /* Часовой пояс */
  306. GetSntpTimeZoneStr(str, (uint8_t *)&len);
  307. strcat(buf, "\",\"utc\":\"");
  308. strncat(buf, str, len);
  309. GetUnixTimeStr(str, (uint8_t *)&len);
  310. strcat(buf, "\",\"utm\":\"");
  311. strncat(buf, str, len);
  312. strcat(buf, "\"}");
  313. //printf(buf);
  314. }
  315. /**
  316. * @brief Возвращает uptime, freq, dutycicle
  317. */
  318. void HTTP_GetProgonParams(char *buf)
  319. {
  320. char str[20];
  321. u32_t tick;
  322. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  323. strcat(buf, "{\"uptime\":\"");
  324. // snmp_get_sysuptime(&tick);
  325. tick = tick / 100;
  326. memset(str, 0, 20);
  327. sprintf(str, "%d", tick);
  328. strncat(buf, str, strlen(str));
  329. strncat(buf, "\"}", 2);
  330. }
  331. /**
  332. * @brief Сброс настроек (всё кроме сетевых параметров)
  333. */
  334. void HTTP_ResetSettings(void)
  335. {
  336. //taskENTER_CRITICAL();
  337. SNMP_SendUserTrap(DEVICE_RESTORED);
  338. syslog_str(SYSLOG_INFORMATIONAL, "Сброс настроек (Администратор)");
  339. log_event_data(LOG_SYSTEM_DEFCONFIG, name_login);
  340. vTaskDelay(500);
  341. SETTINGS_SetPartDefault();
  342. SETTINGS_Save();
  343. //taskEXIT_CRITICAL();
  344. }
  345. /**
  346. * @brief Сохранение настроек
  347. */
  348. void HTTP_SaveSettings(void)
  349. {
  350. // taskENTER_CRITICAL();
  351. SETTINGS_Save();
  352. log_event_data(LOG_SETTING_SAVE, name_login);
  353. // taskEXIT_CRITICAL();
  354. }
  355. /**
  356. * @brief Перезагрузка контроллера
  357. */
  358. char *HTTP_Reboot(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  359. {
  360. (void)bufIn;
  361. (void)lenBufIn;
  362. (void)reqNum;
  363. strcpy(bufOut, "HTTP/1.1 200 OK\r\n");
  364. *lenBufOut = strlen(bufOut);
  365. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  366. * отправить ответ серверу об успешном выполнении команды */
  367. HTTP_StartResetTask(false);
  368. return bufOut;
  369. }
  370. /**
  371. * @brief Запускает задачу ресета контроллера
  372. * @param fBootMode:
  373. * true - перед перезагрузкой будет установлен флаг входа в режим
  374. * bootloader и перезаписаны настройки
  375. *
  376. * false - обычная перезагрузка
  377. */
  378. void HTTP_StartResetTask(bool fBootMode)
  379. {
  380. static bool temp;
  381. temp = fBootMode;
  382. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  383. (void *)&temp, tskIDLE_PRIORITY, NULL);
  384. }
  385. /**
  386. * @brief
  387. */
  388. void vTaskReboot(void *pvParameters)
  389. {
  390. bool mode = false; // тип перезагрузки (нужно ли устанавливать флаг bootloader)
  391. for (;;) {
  392. mode = *(bool *)pvParameters;
  393. if (mode) {
  394. SNMP_SendUserTrap(FW_VERSION_UPDATE);
  395. source_act_t src_act = get_act_source();
  396. syslog(SYSLOG_INFORMATIONAL, "Запуск обновления ПО (%s)", src_act == FTP_ACT ? "FTP" : "HTTP");
  397. #ifdef CLI_ENABLE
  398. if (src_act == CLI_ACT) {
  399. log_event_data(LOG_UPDATE_SOFT, "Администратор");
  400. } else
  401. #endif
  402. log_event_data(LOG_UPDATE_SOFT, name_login);
  403. SetLoadMode();
  404. #ifdef CLI_ENABLE
  405. if (src_act == CLI_ACT) {
  406. SETTINGS_Save();
  407. log_event_data(LOG_SETTING_SAVE, "Администратор");
  408. } else
  409. #endif
  410. HTTP_SaveSettings();
  411. vTaskDelay(2000);
  412. vTaskDelay(1010);
  413. Reboot(src_act);
  414. } else {
  415. vTaskDelay(1000);
  416. vTaskDelay(1010);
  417. Reboot(SNMP_ACT);
  418. }
  419. }
  420. }
  421. /********************************* (C) ROTEK **********************************/