1 /*
2 * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3 */
4
5 #include "amp_boot_file_transfer.h"
6 #include "amp_platform.h"
7 #include "amp_task.h"
8 #include "aos/kernel.h"
9 #include "aos/vfs.h"
10 #include "aos_fs.h"
11 #include "aos_system.h"
12 #include "aos_tcp.h"
13 #include "app_upgrade.h"
14 #include "httpclient.h"
15 #include "mbedtls/md5.h"
16 #include "ota_agent.h"
17 #include "py_defines.h"
18 #include "app_mgr.h"
19
20 #define MOD_STR "APP_MGR"
21
22 static char app_version[32] = { 0 };
23 static char save_path[256] = { 0 };
24 static int32_t save_path_len = 0;
25
26 static PYAMP_SAVE_PATH_DEFULT pyamp_defult_save_path = PYAMP_SAVE_PATH_DEFULT_DATA;
27
pyamp_save_path_defult_set(PYAMP_SAVE_PATH_DEFULT mode)28 void pyamp_save_path_defult_set(PYAMP_SAVE_PATH_DEFULT mode)
29 {
30 pyamp_defult_save_path = mode;
31 }
32
pyamp_save_path_defult_get()33 int pyamp_save_path_defult_get()
34 {
35 return pyamp_defult_save_path;
36 }
37
pyamp_check_file_path(unsigned char * path,int32_t path_len)38 int pyamp_check_file_path(unsigned char *path, int32_t path_len)
39 {
40 int ret = 0;
41 // set path to test
42 char test_path[256] = { 0 };
43 char transferpath[256] = { 0 };
44
45 memset(transferpath, 0, path_len);
46 memcpy(transferpath, path, path_len);
47
48 strncat(test_path, transferpath, sizeof(test_path) - 1);
49 strncat(test_path, "_pathTest", sizeof(test_path) - 1);
50
51 ret = aos_mkdir(test_path);
52 if (ret == 0) {
53 ret = aos_rmdir_r(test_path);
54 }
55
56 return ret;
57 }
58
pyamp_save_file_path(unsigned char * path,int32_t path_len)59 void pyamp_save_file_path(unsigned char *path, int32_t path_len)
60 {
61 if (path_len != 0) {
62 save_path_len = path_len;
63 memset(save_path, 0, path_len);
64 memcpy(save_path, path, path_len);
65 } else {
66 save_path_len = path_len;
67 }
68 }
69
pyamp_get_file_path(unsigned char * path,int32_t path_len)70 int pyamp_get_file_path(unsigned char *path, int32_t path_len)
71 {
72 if (save_path_len != 0) {
73 memcpy(path, save_path, path_len);
74 return save_path_len;
75 }
76 return 0;
77 }
78
pyamp_apppack_init()79 void pyamp_apppack_init()
80 {
81 /* remove all js file */
82 char path[256] = { 0 };
83 int path_len = 0;
84 path_len = pyamp_get_file_path(path, 256);
85 if (path_len != 0) {
86 aos_rmdir_r(path);
87 aos_mkdir(path);
88 } else {
89 PYAMP_SAVE_PATH_DEFULT save_path = PYAMP_SAVE_PATH_DEFULT_DATA;
90 save_path = pyamp_save_path_defult_get();
91 if (save_path == PYAMP_SAVE_PATH_DEFULT_SDCARD) {
92 aos_rmdir_r(AMP_FS_EXT_ROOT_DIR);
93 aos_mkdir(AMP_FS_EXT_ROOT_DIR);
94 } else {
95 aos_rmdir_r(AMP_FS_ROOT_DIR);
96 aos_mkdir(AMP_FS_ROOT_DIR);
97 }
98 }
99 }
100
task_http_download_func(char * url,char * filepath)101 static int task_http_download_func(char *url, char *filepath)
102 {
103 httpclient_t client = { 0 };
104 httpclient_data_t client_data = { 0 };
105 int num = 0;
106 int ret;
107 char rsp_buf[2048];
108
109 char *req_url = url;
110 int fd = aos_open(filepath, O_CREAT | O_RDWR);
111
112 memset(rsp_buf, 0, sizeof(rsp_buf));
113 client_data.response_buf = rsp_buf;
114 client_data.response_buf_len = sizeof(rsp_buf);
115
116 ret = httpclient_conn(&client, req_url);
117
118 if (!ret) {
119 ret = httpclient_send(&client, req_url, HTTP_GET, &client_data);
120
121 do {
122 ret = httpclient_recv(&client, &client_data);
123 // printf("response_content_len=%d,
124 // retrieve_len=%d,content_block_len=%d\n",
125 // client_data.response_content_len,client_data.retrieve_len,client_data.content_block_len);
126 // printf("ismore=%d\n", client_data.is_more);
127 num = aos_write(fd, client_data.response_buf, client_data.content_block_len);
128 if (num > 0) {
129 // printf("aos_write num=%d\n", num);
130 }
131 } while (client_data.is_more);
132 }
133 ret = aos_sync(fd);
134 httpclient_clse(&client);
135 return ret;
136 }
137
138 // int apppack_download(char *url, download_js_cb_t func)
pyapp_download_and_upgrade(char * url)139 int pyapp_download_and_upgrade(char *url)
140 {
141 int ret = -1;
142 amp_warn(MOD_STR, "url = %s", url);
143 ret = task_http_download_func(url, AMP_PY_PKG_DEFAULE);
144 if (ret) {
145 amp_error(MOD_STR, "online debug download failed");
146 } else {
147 amp_warn(MOD_STR, "begin to install pyapp");
148 // ret = install_pyapp(AMP_PY_PKG_DEFAULE, AMP_PY_PKG_DIR);
149 // amp_debug(MOD_STR, "upgrade sub module\n");
150 if ((AMP_PY_PKG_DEFAULE != NULL) && (AMP_PY_PKG_DIR != NULL)) {
151 amp_debug(MOD_STR, "store_file:%s, install_file:%s\n", AMP_PY_PKG_DEFAULE, AMP_PY_PKG_DIR);
152 ret = miniUnzip(AMP_PY_PKG_DEFAULE, AMP_PY_PKG_DIR);
153 }
154 if (ret < 0) {
155 amp_error(MOD_STR, "py app install failed\n");
156 }
157 }
158 return ret;
159 }
160
161 static int32_t update_done = 1;
162 static int app_fp = -1;
163
pyamp_download_apppack(uint8_t * buf,int32_t buf_len)164 int pyamp_download_apppack(uint8_t *buf, int32_t buf_len)
165 {
166 int ret = -1;
167 amp_warn(MOD_STR, "download buf len = %d", buf_len);
168 int fp = aos_open("/data/pyamp/app.zip", O_CREAT | O_RDWR);
169 if (fp < 0) {
170 LOGE(MOD_STR, " open /data/pyamp/app.zip fail ");
171 return 0;
172 }
173 ret = aos_write(fp, buf, buf_len);
174 if (ret <= 0) {
175 LOGE(MOD_STR, " write /data/pyamp/app.zip fail\n");
176 aos_close(fp);
177 return 0;
178 }
179 aos_close(fp);
180 return 0;
181 }
182
183 extern void *task_mutex;
184 extern int pyamp_upgrading;
download_work(void * arg)185 static void download_work(void *arg)
186 {
187 int ret;
188 aos_task_t restart_task;
189
190 // amp_warn(MOD_STR, "download_work task name=%s", jse_osal_get_taskname());
191 amp_warn(MOD_STR, "url=%s", (char *)arg);
192
193 ret = pyapp_download_and_upgrade((char *)arg);
194 amp_debug(MOD_STR, "pyapp_download_and_upgrade done:%d", ret);
195 update_done = 1;
196
197 if (ret == 0) {
198 amp_warn(MOD_STR, "Upgrade app success");
199 aos_msleep(200);
200 }
201
202 pyamp_upgrading = 0;
203
204 aos_reboot();
205
206 aos_task_exit(0);
207 return;
208 }
209
pyamp_apppack_upgrade(char * url)210 int pyamp_apppack_upgrade(char *url)
211 {
212 pyamp_upgrading = 1;
213 aos_task_t upgrade_task;
214
215 amp_warn(MOD_STR, "pyamp_apppack_upgrade url=%s ", (char *)url);
216
217 if (update_done) {
218 update_done = 0;
219 pyamp_apppack_init();
220
221 amp_warn(MOD_STR, "create upgrade task ...");
222
223 if (aos_task_new_ext(&upgrade_task, "amp_upgrade", download_work, (void *)url, 1024 * 6, AOS_DEFAULT_APP_PRI) !=
224 0) {
225 update_done = 1;
226 amp_warn(MOD_STR, "jse_osal_task_new fail");
227
228 return -1;
229 }
230
231 } else {
232 aos_free(url);
233 amp_warn(MOD_STR, "apppack pyamp_upgrading...");
234 }
235
236 return 0;
237 }
238
pyamp_app_version_set(char * version)239 void pyamp_app_version_set(char *version)
240 {
241 if (!version)
242 return;
243 snprintf(app_version, sizeof(app_version), "%s", version);
244 }
245
pyamp_jsapp_version_get(void)246 const char *pyamp_jsapp_version_get(void)
247 {
248 return app_version;
249 }
250