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