| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server |
| | | { |
| | | listen 80; |
| | | server_name _; |
| | | index index.html; |
| | | root /www/server/nginx/html; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | {"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-05T17:11:43.023884377Z"} |
| | | {"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-05T17:11:43.023953693Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.027132386Z"} |
| | | {"log":"10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2022-07-05T17:11:43.053161519Z"} |
| | | {"log":"10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2022-07-05T17:11:43.065952329Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.066287049Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.0714795Z"} |
| | | {"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-05T17:11:43.074755632Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-05T17:11:43.085978711Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-05T17:11:43.086008851Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-05T17:11:43.086016264Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-05T17:11:43.086022197Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-05T17:11:43.086027701Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-05T17:11:43.086033201Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-05T17:11:43.086185158Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-05T17:11:43.086298454Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-05T17:11:43.086508701Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-05T17:11:43.086645748Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-05T17:11:43.086846015Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-05T17:11:43.087038398Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-05T17:11:43.087223435Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-05T17:11:43.088882515Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-05T17:11:43.088898883Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 40\n","stream":"stderr","time":"2022-07-05T17:11:43.088901981Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 41\n","stream":"stderr","time":"2022-07-05T17:11:43.088904384Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 42\n","stream":"stderr","time":"2022-07-05T17:11:43.088906786Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 43\n","stream":"stderr","time":"2022-07-05T17:11:43.088909311Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 44\n","stream":"stderr","time":"2022-07-05T17:11:43.088911564Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 45\n","stream":"stderr","time":"2022-07-05T17:11:43.088969256Z"} |
| | | {"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 46\n","stream":"stderr","time":"2022-07-05T17:11:43.089228027Z"} |
| | | {"log":"192.168.1.21 - - [05/Jul/2022:17:11:56 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-05T17:11:56.614265095Z"} |
| | | {"log":"192.168.1.21 - - [05/Jul/2022:17:11:56 +0000] \"GET /favicon.ico HTTP/1.1\" 404 555 \"http://192.168.1.233:8080/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-05T17:11:56.698158889Z"} |
| | | {"log":"2022/07/05 17:11:56 [error] 32#32: *2 open() \"/usr/share/nginx/html/favicon.ico\" failed (2: No such file or directory), client: 192.168.1.21, server: localhost, request: \"GET /favicon.ico HTTP/1.1\", host: \"192.168.1.233:8080\", referrer: \"http://192.168.1.233:8080/\"\n","stream":"stderr","time":"2022-07-05T17:11:56.698244049Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.784883933Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 32#32: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785033304Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 32#32: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785043587Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 37#37: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.7850468Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 33#33: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785050024Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 33#33: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78505328Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 37#37: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78505666Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 33#33: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785059675Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 32#32: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785062615Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 37#37: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785065819Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 44#44: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785118012Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 42#42: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785124897Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 38#38: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785128102Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 35#35: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785281534Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 39#39: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785310007Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 44#44: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785316867Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 42#42: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78532278Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 38#38: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785328734Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 40#40: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.78533466Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 35#35: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785340464Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 36#36: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785346727Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 39#39: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785352504Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 40#40: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785486697Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 31#31: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785497671Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 36#36: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785503664Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 35#35: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785509191Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 44#44: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785529984Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 42#42: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785536784Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 38#38: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785542237Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 31#31: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785547857Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 36#36: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785553251Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 39#39: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785558431Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 40#40: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785563757Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 31#31: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785569204Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 45#45: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785660804Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 45#45: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785670791Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 45#45: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785758197Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 34#34: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785874241Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 34#34: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785885124Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 43#43: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785976184Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 34#34: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785985534Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 43#43: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785991021Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 43#43: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.786072678Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 41#41: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.786081931Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 41#41: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.786171004Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 41#41: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.786180041Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 46#46: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.786849618Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 46#46: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78699349Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 46#46: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.787007725Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 40\n","stream":"stderr","time":"2022-07-05T17:27:31.792423349Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 40 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792444142Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 39 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792448464Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.792853331Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 39\n","stream":"stderr","time":"2022-07-05T17:27:31.792868194Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 33 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792901385Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 36 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792906033Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 37 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792952488Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 38 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792959076Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 44\n","stream":"stderr","time":"2022-07-05T17:27:31.793303196Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 44 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.79331285Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793352688Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793446618Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 42\n","stream":"stderr","time":"2022-07-05T17:27:31.79345632Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 32 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.793525097Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 42 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.79354997Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793665833Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 35\n","stream":"stderr","time":"2022-07-05T17:27:31.794379787Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 35 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.794404941Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 34 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.794411194Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.794543027Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 34\n","stream":"stderr","time":"2022-07-05T17:27:31.794555131Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 31\n","stream":"stderr","time":"2022-07-05T17:27:31.796654336Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 31 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796685429Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 43 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796692869Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.796698899Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 43\n","stream":"stderr","time":"2022-07-05T17:27:31.796704589Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 45 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796710306Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 41 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796724102Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.796729789Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 41\n","stream":"stderr","time":"2022-07-05T17:27:31.796736776Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 46\n","stream":"stderr","time":"2022-07-05T17:27:31.796897943Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 46 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796924143Z"} |
| | | {"log":"2022/07/05 17:27:31 [notice] 1#1: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.797136969Z"} |
| | | {"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-05T17:29:27.356495697Z"} |
| | | {"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-05T17:29:27.356539534Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.359725623Z"} |
| | | {"log":"10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled\n","stream":"stdout","time":"2022-07-05T17:29:27.366524468Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.366913132Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.37328057Z"} |
| | | {"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-05T17:29:27.376860026Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-05T17:29:27.387190285Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-05T17:29:27.387208187Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-05T17:29:27.387212772Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-05T17:29:27.387215297Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-05T17:29:27.387217901Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-05T17:29:27.387220406Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 24\n","stream":"stderr","time":"2022-07-05T17:29:27.387385128Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 25\n","stream":"stderr","time":"2022-07-05T17:29:27.387507241Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 26\n","stream":"stderr","time":"2022-07-05T17:29:27.38766927Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 27\n","stream":"stderr","time":"2022-07-05T17:29:27.387852483Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 28\n","stream":"stderr","time":"2022-07-05T17:29:27.388800028Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 29\n","stream":"stderr","time":"2022-07-05T17:29:27.388815818Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 30\n","stream":"stderr","time":"2022-07-05T17:29:27.388819192Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-05T17:29:27.388821416Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-05T17:29:27.388823911Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-05T17:29:27.38905136Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-05T17:29:27.389254357Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-05T17:29:27.389529243Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-05T17:29:27.390566303Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-05T17:29:27.390579337Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-05T17:29:27.390582228Z"} |
| | | {"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-05T17:29:27.390584482Z"} |
| | | {"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-06T09:20:42.621797321Z"} |
| | | {"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-06T09:20:42.630989561Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.671377719Z"} |
| | | {"log":"10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled\n","stream":"stdout","time":"2022-07-06T09:20:42.743092643Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.743456494Z"} |
| | | {"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.760016Z"} |
| | | {"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-06T09:20:42.763675892Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-06T09:20:42.942126479Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-06T09:20:42.942157735Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-06T09:20:42.942165355Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-06T09:20:42.942171169Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-06T09:20:42.942177075Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-06T09:20:42.942376859Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 24\n","stream":"stderr","time":"2022-07-06T09:20:42.942603109Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 25\n","stream":"stderr","time":"2022-07-06T09:20:42.942880286Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 26\n","stream":"stderr","time":"2022-07-06T09:20:42.943177023Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 27\n","stream":"stderr","time":"2022-07-06T09:20:42.943465683Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 28\n","stream":"stderr","time":"2022-07-06T09:20:42.943775436Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 29\n","stream":"stderr","time":"2022-07-06T09:20:42.944104823Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 30\n","stream":"stderr","time":"2022-07-06T09:20:42.94444174Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-06T09:20:42.944786871Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-06T09:20:42.945142594Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-06T09:20:42.945523908Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-06T09:20:42.945921218Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-06T09:20:42.946303805Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-06T09:20:42.946722425Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-06T09:20:42.947126812Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-06T09:20:42.947589949Z"} |
| | | {"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-06T09:20:42.94806926Z"} |
| | | {"log":"192.168.1.21 - - [06/Jul/2022:09:20:54 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-06T09:20:54.337362109Z"} |
| | | {"log":"192.168.1.21 - - [06/Jul/2022:09:20:54 +0000] \"GET /favicon.ico HTTP/1.1\" 404 555 \"http://192.168.1.233:8080/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-06T09:20:54.414529771Z"} |
| | | {"log":"2022/07/06 09:20:54 [error] 25#25: *1 open() \"/usr/share/nginx/html/favicon.ico\" failed (2: No such file or directory), client: 192.168.1.21, server: localhost, request: \"GET /favicon.ico HTTP/1.1\", host: \"192.168.1.233:8080\", referrer: \"http://192.168.1.233:8080/\"\n","stream":"stderr","time":"2022-07-06T09:20:54.414547748Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.354390973Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 25#25: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355691939Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 28#28: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355729569Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 30#30: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355749506Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 24#24: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355753507Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 26#26: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355756232Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 28#28: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355759072Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 30#30: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355761634Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 26#26: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355764229Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 24#24: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355767152Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 39#39: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355769914Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 27#27: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355772554Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 28#28: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355775181Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 30#30: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355777776Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 26#26: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355780457Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 39#39: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355783031Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 27#27: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355785594Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 24#24: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355788269Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 33#33: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355790997Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 34#34: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355793597Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 39#39: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355796192Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 33#33: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355798749Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 27#27: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355801406Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 32#32: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355803911Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 29#29: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355806502Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 33#33: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355809192Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 36#36: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355811891Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 32#32: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355814477Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 29#29: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355817047Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 34#34: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355819574Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 36#36: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355822201Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 32#32: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355824736Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 34#34: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355827277Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 29#29: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355829912Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 36#36: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355832454Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 35#35: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355835554Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 35#35: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355838291Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 35#35: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355843702Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 37#37: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355956091Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 31#31: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355978114Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 37#37: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355985071Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 31#31: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355990341Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 37#37: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355995661Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 31#31: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.356001041Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 38#38: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.356326528Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 38#38: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.356412983Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 38#38: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.356521935Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 34\n","stream":"stderr","time":"2022-07-06T09:21:17.362293119Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 34 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362310967Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 26 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362314188Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.362422059Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 26\n","stream":"stderr","time":"2022-07-06T09:21:17.36243076Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 28 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362433169Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 24 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362534199Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 29 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362557946Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 30 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362564769Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 27 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362570333Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 33 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362575993Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 36 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362581683Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 39 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362587236Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.362965863Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 39\n","stream":"stderr","time":"2022-07-06T09:21:17.36299692Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 32\n","stream":"stderr","time":"2022-07-06T09:21:17.363087306Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 32 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.363104773Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.36313471Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 37\n","stream":"stderr","time":"2022-07-06T09:21:17.365167351Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 31 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365185651Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 35 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365191591Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 37 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365211448Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.365322291Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 31\n","stream":"stderr","time":"2022-07-06T09:21:17.365340408Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 38\n","stream":"stderr","time":"2022-07-06T09:21:17.366217352Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 38 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.366235909Z"} |
| | | {"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.366306542Z"} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | {"StreamConfig":{},"State":{"Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"RemovalInProgress":false,"Dead":false,"Pid":0,"ExitCode":137,"Error":"","StartedAt":"2022-07-06T09:20:42.477658398Z","FinishedAt":"2022-07-06T09:21:27.449539552Z","Health":null},"ID":"49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da","Created":"2022-07-05T17:08:58.650960754Z","Managed":false,"Path":"/docker-entrypoint.sh","Args":["nginx","-g","daemon off;"],"Config":{"Hostname":"49c6b2e842c4","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"80/tcp":{}},"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NGINX_VERSION=1.23.0","NJS_VERSION=0.7.5","PKG_RELEASE=1~bullseye"],"Cmd":["nginx","-g","daemon off;"],"Image":"nginx","Volumes":null,"WorkingDir":"","Entrypoint":["/docker-entrypoint.sh"],"OnBuild":null,"Labels":{"maintainer":"NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"},"StopSignal":"SIGQUIT"},"Image":"sha256:55f4b40fe486a5b734b46bb7bf28f52fa31426bf23be068c8e7b19e58d9b8deb","NetworkSettings":{"Bridge":"","SandboxID":"b946b0337d5c27a04f486818f98ef5a23c7e198776c380a261e50cdfc50b1af3","HairpinMode":false,"LinkLocalIPv6Address":"","LinkLocalIPv6PrefixLen":0,"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"d8847f36e01af680c74244f0b44c635f80f7dbd6ec7a6f03ee499cb73d0360ed","EndpointID":"","Gateway":"","IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"","DriverOpts":null,"IPAMOperational":false}},"Service":null,"Ports":null,"SandboxKey":"/var/run/docker/netns/b946b0337d5c","SecondaryIPAddresses":null,"SecondaryIPv6Addresses":null,"IsAnonymousEndpoint":false,"HasSwarmEndpoint":false},"LogPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log","Name":"/hahan","Driver":"overlay2","OS":"linux","MountLabel":"","ProcessLabel":"","RestartCount":0,"HasBeenStartedBefore":true,"HasBeenManuallyStopped":true,"MountPoints":{},"SecretReferences":null,"ConfigReferences":null,"AppArmorProfile":"","HostnamePath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname","HostsPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts","ShmPath":"","ResolvConfPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf","SeccompProfile":"","NoNewPrivileges":false,"LocalLogCacheMeta":{"HaveNotifyEnabled":false}} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "Binds": null, |
| | | "ContainerIDFile": "", |
| | | "LogConfig": { |
| | | "Type": "json-file", |
| | | "Config": {} |
| | | }, |
| | | "NetworkMode": "default", |
| | | "PortBindings": { |
| | | "80/tcp": [ |
| | | { |
| | | "HostIp": "", |
| | | "HostPort": "8080" |
| | | } |
| | | ] |
| | | }, |
| | | "RestartPolicy": { |
| | | "Name": "no", |
| | | "MaximumRetryCount": 0 |
| | | }, |
| | | "AutoRemove": false, |
| | | "VolumeDriver": "", |
| | | "VolumesFrom": null, |
| | | "CapAdd": null, |
| | | "CapDrop": null, |
| | | "CgroupnsMode": "host", |
| | | "Dns": [], |
| | | "DnsOptions": [], |
| | | "DnsSearch": [], |
| | | "ExtraHosts": null, |
| | | "GroupAdd": null, |
| | | "IpcMode": "private", |
| | | "Cgroup": "", |
| | | "Links": null, |
| | | "OomScoreAdj": 0, |
| | | "PidMode": "", |
| | | "Privileged": false, |
| | | "PublishAllPorts": false, |
| | | "ReadonlyRootfs": false, |
| | | "SecurityOpt": null, |
| | | "UTSMode": "", |
| | | "UsernsMode": "", |
| | | "ShmSize": 67108864, |
| | | "Runtime": "runc", |
| | | "ConsoleSize": [ |
| | | 0, |
| | | 0 |
| | | ], |
| | | "Isolation": "", |
| | | "CpuShares": 0, |
| | | "Memory": 0, |
| | | "NanoCpus": 0, |
| | | "CgroupParent": "", |
| | | "BlkioWeight": 0, |
| | | "BlkioWeightDevice": [], |
| | | "BlkioDeviceReadBps": null, |
| | | "BlkioDeviceWriteBps": null, |
| | | "BlkioDeviceReadIOps": null, |
| | | "BlkioDeviceWriteIOps": null, |
| | | "CpuPeriod": 0, |
| | | "CpuQuota": 0, |
| | | "CpuRealtimePeriod": 0, |
| | | "CpuRealtimeRuntime": 0, |
| | | "CpusetCpus": "", |
| | | "CpusetMems": "", |
| | | "Devices": [], |
| | | "DeviceCgroupRules": null, |
| | | "DeviceRequests": null, |
| | | "KernelMemory": 0, |
| | | "KernelMemoryTCP": 0, |
| | | "MemoryReservation": 0, |
| | | "MemorySwap": 0, |
| | | "MemorySwappiness": null, |
| | | "OomKillDisable": false, |
| | | "PidsLimit": null, |
| | | "Ulimits": null, |
| | | "CpuCount": 0, |
| | | "CpuPercent": 0, |
| | | "IOMaximumIOps": 0, |
| | | "IOMaximumBandwidth": 0, |
| | | "MaskedPaths": [ |
| | | "/proc/asound", |
| | | "/proc/acpi", |
| | | "/proc/kcore", |
| | | "/proc/keys", |
| | | "/proc/latency_stats", |
| | | "/proc/timer_list", |
| | | "/proc/timer_stats", |
| | | "/proc/sched_debug", |
| | | "/proc/scsi", |
| | | "/sys/firmware" |
| | | ], |
| | | "ReadonlyPaths": [ |
| | | "/proc/bus", |
| | | "/proc/fs", |
| | | "/proc/irq", |
| | | "/proc/sys", |
| | | "/proc/sysrq-trigger" |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 127.0.0.1 localhost |
| | | ::1 localhost ip6-localhost ip6-loopback |
| | | fe00::0 ip6-localnet |
| | | ff00::0 ip6-mcastprefix |
| | | ff02::1 ip6-allnodes |
| | | ff02::2 ip6-allrouters |
| | | 172.17.0.2 49c6b2e842c4 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Generated by NetworkManager |
| | | nameserver 202.96.209.133 |
| | | nameserver 114.114.114.114 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | sha256:a5f0b8686d307e34722405f285ba7230bf9c08653699822f0dd54a95d379d5ed |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # FUStaSDKæ¥å£ææ¡£ |
| | | æ¬ SDK éæäº FaceUnity çè¯é³é©±å¨å½¢è±¡å¼æ(Speeach to Animation) ï¼è½å¤å¿«éæå»ºå¹¶é©±å¨èæå½¢è±¡è¯´è¯ï¼è¥é æ´å çå®èªç¶ç人æºäº¤äºåºæ¯ã |
| | | |
| | | ## çæ¬ä¿¡æ¯ |
| | | çæ¬å·:2.1 |
| | | |
| | | æ´æ°æ¥æ:2022-01-21 |
| | | |
| | | æ´æ°å
容: |
| | | - ä¼åCPUæ§è½ä»¥åæ¥è¯¢æç |
| | | - æ°å¢å¨ç»ææ¾é度æ§å¶æ¥å£ |
| | | - æ´æ°BSç³»æ°57-47 |
| | | - ä¿®å¤éé³å¸§é®é¢ |
| | | - â½æ°å¢è®¾ç½®æè½¬è§åº¦ |
| | | - ä¼åé´å½±é¯é½¿ç®æ³ |
| | | - å¢å è¯¦ç»æ¥å¿æ¥å£ |
| | | |
| | | ## APIs |
| | | SDKæ¥å£æ ¹æ®ä½ç¨é»è¾å½ä¸ºäºç±» |
| | | - <a href="#1">é
ç½®åå§åæ°æ®</a> |
| | | - <a href="#2">åå§å</a> |
| | | - <a href="#3">Avatar忢</a> |
| | | - <a href="#4">æ¸²ææ§å¶</a> |
| | | - <a href="#5">å£åæ¥è¯¢å驱å¨</a> |
| | | - <a href="#6">Avatarå¨ç»å表æ
忢</a> |
| | | - <a href="#7">鿝</a> |
| | | - <a href="#8">å
¶ä»</a> |
| | | |
| | | ------ |
| | | |
| | | |
| | | > ### <a name="1">é
ç½®åå§åæ°æ®</a> |
| | | |
| | | ###### FUSta SDKé
ç½®åå§åæ°æ®(å¨çº¿é´ææ°æ®) |
| | | |
| | | |
| | | FUStaKit.Builder builder = new FUStaKit |
| | | .Builder(mContext) |
| | | .setAuth(authpack.A()) |
| | | .setAlignData(bytesAlign) |
| | | //.setAsrData(bytesAsr) |
| | | .setFUTtsType(FUTtsType.ALIGNMENT) |
| | | .setCharacterDecoder(bytesDecoder); |
| | | mFUStaKit = builder.build(); |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | åå§åFUStaï¼ä¼ å
¥ä¸ä¸æï¼å¿
è¦ï¼ï¼ |
| | | å è½½ç½ç»é´ææ°æ®ï¼å¿
è¦ï¼ï¼ |
| | | 设置è¯é³èªå¨æ ¡åå·¥å
·å
ï¼Align模å¼éè¦è®¾ç½®ï¼ï¼ |
| | | 设置è¯é³è¯å«å·¥å
·å
ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼æ¤å¤æ¯Alignæ¨¡å¼æ
注éè¯¥æ¹æ³ï¼ï¼ |
| | | 设置ttsæ¥è¯¢æ¹å¼ï¼å¿
è¦ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ASRï¼Alignæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ALIGNMENTï¼æ¤å¤æ¯Alignæ¨¡å¼æ
设置为FUTtsType.ALIGNMENTï¼ |
| | | 设置æåç¼ç åè½æ°æ®æä»¶(ALIGNæ¹å¼åææ¬æ¶é´æ³éè¦è®¾ç½®)ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` context ```ï¼ä¸ä¸æ |
| | | |
| | | ``` setAuth(byte[]) ```ï¼ç½ç»é´ææ°æ® |
| | | |
| | | ``` setAlignData(byte[]) ```ï¼è¯é³èªå¨æ ¡åå·¥å
·å
æ°æ® |
| | | |
| | | ``` setAsrData(byte[]) ```ï¼è¯é³è¯å«å·¥å
·å
æ°æ® |
| | | |
| | | ``` setFUTtsType(TtsTypeEnum type) ```ï¼ttsæ¥è¯¢æ¹å¼ |
| | | |
| | | ``` setCharacterDecoder(byte[]) ```ï¼æåç¼ç åè½æ°æ® |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | App å¯å¨ååªéè¦ SDKé
ç½®åå§åæ°æ® 䏿¬¡å³å¯ï¼å
¶ä¸ authpack.A() é´ææ°æ®å£°æå¨ authpack.java ä¸ãå¿
é¡»é
置好ææçè¯ä¹¦ï¼SDK æè½æ£å¸¸å·¥ä½ã |
| | | å¨çº¿é´æåªéè¦è®¾ç½®authpack.A() é´ææ°æ®å³å¯ãFUSta SDK é
ç½®åå§åæ°æ®è¯¦è§"Android FUStaKit éæææ¡£"ã |
| | | |
| | | |
| | | ###### FUSta SDKé
ç½®åå§åæ°æ®(ç¦»çº¿é´ææ°æ®) |
| | | |
| | | |
| | | FUStaKit.Builder builder = new FUStaKit |
| | | .Builder(mContext) |
| | | .setAuth(authpack.A()) |
| | | .setAlignData(bytesAlign) |
| | | //.setAsrData(bytesAsr) |
| | | .setFUTtsType(FUTtsType.ALIGNMENT) |
| | | .setCharacterDecoder(bytesDecoder); |
| | | .setOffLineData(offLineAuth); |
| | | mFUStaKit = builder.build(); |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | åå§åFUStaï¼ä¼ å
¥ä¸ä¸æï¼å¿
è¦ï¼ï¼ |
| | | å è½½ç½ç»é´ææ°æ®ï¼å¿
è¦ï¼ï¼ |
| | | 设置è¯é³èªå¨æ ¡åå·¥å
·å
ï¼Align模å¼éè¦è®¾ç½®ï¼ï¼ |
| | | 设置è¯é³è¯å«å·¥å
·å
ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼æ¤å¤æ¯Alignæ¨¡å¼æ
注éè¯¥æ¹æ³ï¼ï¼ |
| | | 设置ttsæ¥è¯¢æ¹å¼ï¼å¿
è¦ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ASRï¼Alignæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ALIGNMENTï¼æ¤å¤æ¯Alignæ¨¡å¼æ
设置为FUTtsType.ALIGNMENTï¼ |
| | | 设置æåç¼ç åè½æ°æ®æä»¶(ALIGNæ¹å¼åææ¬æ¶é´æ³éè¦è®¾ç½®)ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` context ```ï¼ä¸ä¸æ |
| | | |
| | | ``` setAuth(byte[]) ```ï¼ç½ç»é´ææ°æ® |
| | | |
| | | ``` setAlignData(byte[]) ```ï¼è¯é³èªå¨æ ¡åå·¥å
·å
æ°æ® |
| | | |
| | | ``` setAsrData(byte[]) ```ï¼è¯é³è¯å«å·¥å
·å
æ°æ® |
| | | |
| | | ``` setFUTtsType(TtsTypeEnum type) ```ï¼ttsæ¥è¯¢æ¹å¼ |
| | | |
| | | ``` setCharacterDecoder(byte[]) ```ï¼æåç¼ç åè½æ°æ® |
| | | |
| | | ``` setOffLineData(byte[]) ```ï¼ç¦»çº¿é´ææ°æ® |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | App å¯å¨ååªéè¦ SDKé
ç½®åå§åæ°æ® 䏿¬¡å³å¯ï¼å
¶ä¸ authpack.A() é´ææ°æ®å£°æå¨ authpack.java ä¸ãå¿
é¡»é
置好ææçè¯ä¹¦ï¼SDK æè½æ£å¸¸å·¥ä½ã |
| | | ç¦»çº¿é´æé¤äºè®¾ç½®authpack.A() é´ææ°æ®ï¼è¿éè¦è®¾ç½®ç¦»çº¿é´ææ°æ®å
è·¯å¾ï¼setOffLineAuth(byte[])ã |
| | | 注æï¼ækey.bundle就使ç¨key.bundleï¼è¿æ ·ä¼èµ°ç¦»çº¿ï¼ä½¿ç¨æªé´æçbundleï¼ä¼èç½é´æã |
| | | æ ¹æ®åºç¨éæ±ï¼é´ææ°æ®ä¹å¯ä»¥è¿è¡æ¶æä¾ï¼å¦ç½ç»ä¸è½½ï¼ï¼ä¸è¿è¦æ³¨æè¯ä¹¦æ³é²é£é©ï¼é²æ¢è¯ä¹¦è¢«æ»¥ç¨ãFUSta SDK é
ç½®åå§åæ°æ®è¯¦è§"Android FUStaKit éæææ¡£"ã |
| | | |
| | | --- |
| | | |
| | | |
| | | > ### <a name="2">åå§å</a> |
| | | |
| | | ###### FUSta SDKåå§åï¼å¨çº¿é´æï¼ |
| | | |
| | | ``` |
| | | void init(FUAuthType.ONLINE, StaKitInitCallback listener); |
| | | ``` |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | è°ç¨FUSta SDKåå§åæ¹æ³ï¼å¿
é¡»æ¾å¨ FUStaKit SDKé
ç½®åå§åæ°æ®ä¹å |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` FUAuthType.ONLINE ```ï¼å¨çº¿é´æ |
| | | ``` FUStaKit.StaKitInitCallback ```ï¼SDKåå§åç¶æçåè°ï¼åæ°ä½ç©ºå³æ²¡æåå§å宿åè°çæ¹å¼ï¼å¦æè°ç¨è¯¥æ¹æ³ä¹åç´§æ¥çè°ç¨å£å驱卿¹æ³ï¼å£å驱å¨ä»»å¡ä¼çå¾
åå§åä»»å¡å®ææå¼å§ãå¼åè
坿 ¹æ®åå§ååè°è¿è¡ç¸å
³é»è¾å¤çã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | init åå§åæ¹æ³ï¼å¡å¿
å¨åç»æä½åè°ç¨ï¼å¦åæ æ³é©±å¨å£åã |
| | | FUSta SDK åå§å详è§"Android FUStaKit éæææ¡£âã |
| | | |
| | | ###### FUSta SDKåå§åï¼ç¦»çº¿é´æï¼ |
| | | |
| | | ``` |
| | | void init(FUAuthType.OFFLINE_BUNDLE, StaKitInitCallback listener); |
| | | ``` |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | è°ç¨FUSta SDKåå§åæ¹æ³ï¼å¿
é¡»æ¾å¨ FUStaKit SDKé
ç½®åå§åæ°æ®ä¹å |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` FUAuthType.OFFLINE_BUNDLE ```ï¼ç¦»çº¿é´æ |
| | | ``` FUStaKit.StaKitInitCallback ```ï¼SDKåå§åç¶æçåè°ï¼åæ°ä½ç©ºå³æ²¡æåå§å宿åè°çæ¹å¼ï¼å¦æè°ç¨è¯¥æ¹æ³ä¹åç´§æ¥çè°ç¨å£å驱卿¹æ³ï¼å£å驱å¨ä»»å¡ä¼çå¾
åå§åä»»å¡å®ææå¼å§ãå¼åè
坿 ¹æ®åå§ååè°è¿è¡ç¸å
³é»è¾å¤çã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | init åå§åæ¹æ³ï¼å¡å¿
å¨åç»æä½åè°ç¨ï¼å¦åæ æ³é©±å¨å£åã |
| | | FUSta SDK åå§å详è§"Android FUStaKit éæææ¡£âã |
| | | |
| | | --- |
| | | |
| | | |
| | | > ### <a name="3">Avatar忢</a> |
| | | |
| | | ###### FUSta SDK设置Avatar |
| | | |
| | | ``` |
| | | void setAvatar(FUAvatar avatar, FUAvatarType avatarType); |
| | | æ |
| | | void setAvatar(FUAvatar avatar, FUAvatarType avatarType, OnAvatarStateListener listener); |
| | | ``` |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 忢Avataræ¹æ³ï¼è®¾ç½®å卿¸²ææ¶ä¼åæ¢å¯¹åºAvatarã |
| | | |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` avatar ```ï¼FUAvatarå®ä¾ |
| | | |
| | | ``` avatarType ```ï¼Avatarç±»åçæä¸¾ï¼ç¨æ¥è¡¨ç¤ºAvatarç±»åï¼ç¨æ¥åºå«å
置表æ
æ°æ®æºï¼é»è®¤ï¼`FUAvatarType.CARTOON` |
| | | |
| | | ``` listener ```ï¼Avataræ§è¡ç¶ææ¥å£ï¼å®ç°æ¥å£ï¼Avatarå è½½å®æåè°onAvatarComplete() |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置Avatarä½ç½® |
| | | ``` |
| | | void setPosition(double positionX, double positionY, double positionZ); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置Avatarå¨åæ ç³»çä½ç½®ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` positionX ```ï¼Xè½´åæ èå´`-200, 200` |
| | | |
| | | ``` positionY ```ï¼Yè½´åæ èå´`-600, 800` |
| | | |
| | | ``` positionZ ```ï¼Zè½´åæ èå´`-3000, 600` |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置Avatarèæ¯ |
| | | ``` |
| | | void setBackground(String background); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置Avatarèæ¯ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` background ```ï¼èæ¯éå
·è·¯å¾ï¼background为空åèæ¯éæ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置Avatarå
ç
§ |
| | | ``` |
| | | void setLight(String light); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置Avatarå
ç
§ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` light ```ï¼ç¯å
éå
·è·¯å¾ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置Avatarç¸æºä½ |
| | | ``` |
| | | void setCamera(String camera); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置Avatarç¸æºä½ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` camera ```ï¼ç¸æºéå
·è·¯å¾ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDKå¼å¯é´å½± |
| | | ``` |
| | | void enableShadow(Boolean enableShadow); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置æ¯å¦å¼å¯é´å½±ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` enableShadow ```ï¼æ¯å¦å¼å¯é´å½± |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | --- |
| | | |
| | | > ### <a name="4">æ¸²ææ§å¶</a> |
| | | |
| | | ###### FUSta SDKå¼å§æ¸²æ |
| | | ``` |
| | | void requestRender(GLTextureView glTextureView); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | å¼å§æ¸²æã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` glTextureView ```ï¼GLTextureViewï¼SDKæä¾ç渲æView |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK渲æç¶æåæ¥ |
| | | ``` |
| | | void onResume(); |
| | | void onPause(); |
| | | void onDestroy(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | onResume() 对åºActivity onResume(), |
| | | onPause() 对åºActivity onPause(), |
| | | onDestroy() 对åºActivity onDestroy()ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | onResume()ä¸onPause()æå¯¹åºç°ï¼å¨ActivityçonPause()è°ç¨æ¶åæ¢åå°æ¸²æåå°æ¶èï¼å¹¶ä¸å¨ActivityçonResume()è°ç¨æ¶éæ°å è½½ã |
| | | |
| | | onResume()ä¸onPause()å¯ä¸ç¨è°ç¨ï¼å¨ActivityçonPause()è°ç¨æ¶åå°ä¼ç»§ç»æ¸²æï¼ |
| | | |
| | | onDestroy()å¿
é¡»è°ç¨ã |
| | | |
| | | ###### FUSta SDK设置渲æå辨ç |
| | | ``` |
| | | void setCustomRenderResolution(int renderWidth, int renderHeight); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置渲æå辨ç尺寸ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` renderWidth ```ï¼çº¹ç宽度 |
| | | |
| | | ``` renderHeight ```ï¼çº¹ç宽度 |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置渲æå¸§ç |
| | | ``` |
| | | void setRenderFPS(int renderFPS); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置渲æå¸§çï¼é»è®¤30帧/sã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` renderFPS ```ï¼æ¸²æå¸§ç |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | 妿ä½ç«¯è®¾å¤æå¤§å¸§çå°äºè®¾ç½®ç帧çï¼å®é
帧ç为该设å¤çæå¤§å¸§çã |
| | | |
| | | ###### FUSta SDK设置æé¯é½¿ |
| | | ``` |
| | | void setMultiSamples(int samples); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 3Dæé¯é½¿é
ç½® |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` samples ```ï¼æé¯é½¿çº§å«ï¼é»è®¤4ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置é´å½±æé¯é½¿ |
| | | ``` |
| | | void setShadowPCFLevel(int level); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置é´å½±æé¯é½¿çº§å« |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` level ```ï¼æé¯é½¿çº§å«ï¼é»è®¤2ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置渲æä¿¡æ¯åè°æ¥å£ |
| | | ``` |
| | | void setEnableDebug(boolean enableDebug) |
| | | void setStaRenderDebugListener(OnRenderDebugListener renderDebugListener); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置渲ædebugæ°æ®çåè° |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` enableDebug ```ï¼è°è¯å¼å
³ä¸ºtrueï¼ç¸å
³debugæ°æ®æä¼è¿è¡ç»è®¡ã |
| | | ``` renderDebugListener ```ï¼æ¸²ædebugæ°æ®æ¥å£ï¼onBenchmarkFPSChanged(int width, int height, double fps, double renderTime)ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDKæ¥å¿ä¿åå°æ¬å° |
| | | ``` |
| | | void setLogOutputDir(String dir); |
| | | void enableLogOutput(boolean enableDebug) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKæ¥å¿ä¿åå°æ¬å° |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` dir ```ï¼è®¾ç½®ä¿åå°æ¬å°çæå®ç®å½ã |
| | | ``` enableDebug ```ï¼æ¯å¦ä¿åæ¥å¿ä¿¡æ¯å°æå®çç®å½ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | --- |
| | | |
| | | > ### <a name="5">å£åæ¥è¯¢å驱å¨</a> |
| | | |
| | | ###### FUSta SDKåå§åææ¾å¨ |
| | | |
| | | ``` |
| | | void initStaPlayer(FUPlayerConfig playerConfig); |
| | | ``` |
| | | |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | åå§åææ¾å¨ |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` playerConfig ```ï¼ææ¾å¨ç¸å
³é
ç½®ï¼ä¸»è¦æ¯éæ ·çã声éå使·±ï¼SDKæ ¹æ®ææ¾å¨çé
ç½®å
é¨ä¼åå§åå¯¹åºææ¾å¨ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | è¯¥ææ¾å¨ç¨äºå
鍿æ¾ï¼å¦éç¨å¤é¨ææ¾å¨ææ¾å¯ä¸è®¾ç½®ã |
| | | |
| | | ###### FUSta SDKå£å驱å¨å¹¶ä¸ææ¾é³é¢ |
| | | |
| | | ``` |
| | | void staProcess(FUStaParams staParams); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | FUSta SDKæ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºå£åã |
| | | |
| | | 使ç¨åºæ¯ï¼ |
| | | 1ãæµå¼é³é¢ï¼ææ¶é´æ³ï¼åªæ¯æpcm |
| | | 2ãæµå¼é³é¢ï¼æ æ¶é´æ³ï¼åªæ¯æpcm |
| | | 3ãæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æAlignææ¬ï¼åªæ¯æpcm |
| | | 4ãéæµå¼é³é¢ï¼ææ¶é´æ³ï¼æ¯æpcmä¸wav |
| | | 5ãéæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æ¯æpcmä¸wav |
| | | 6ãéæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æAlignææ¬ï¼æ¯æpcmä¸wav |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` params ```ï¼FUStaParams为é
置类ï¼åæ°åºæ¬è®¾ç½®ï¼ 设置STAæä½ä¸ºéæµå¼ã设置é³é¢æ°æ®ã设置é³é¢æ°æ®ç±»åã设置é³é¢æ°æ®å¯¹åºæ¶é´æ³çï¼ç®åæ¯æ pcm ä¸ wav |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ææ¶é´æ³ï¼æ¥è¯¢å£åç³»æ°æ ¹æ®æ¶é´æ³æ¥è¯¢ï¼éåº¦ä¼æ´å¿«ã |
| | | æ æ¶é´æ³ï¼æ¥è¯¢å£åç³»æ°æ ¹æ®é³é¢æ°æ®æ¥è¯¢ï¼æ ¹æ®æºåé
ç½®ä¸åèæ¶ä¹æå·®å«ï¼æ¥è¯¢é度ç¨èæ¶ãä¸è¬æ æ¶é´æ³æ¥è¯¢å£åç³»æ°æ¹å¼æASRæ¹å¼åALIGNæ¹å¼ï¼ALIGNæ¹å¼è¾å¿«ï¼ASRæ¹å¼è¾æ
¢ã |
| | | FUStaParamsåæ°è¯¦æ
ä¸è¯¥å£å驱卿¨¡å¼è°ç¨è§```Android FUStaKit éæææ¡£``` |
| | | |
| | | ###### FUSta SDKæµå¼æ¥è¯¢ç¶æåæ¥ |
| | | |
| | | ``` |
| | | void notifyStaProcessStart(); |
| | | void notifyStaProcessFinish(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | æµå¼å£å驱卿¨¡å¼ä¸ï¼éè¦ç»SDK忥æ¥è¯¢ç¶æã |
| | | notifyStaProcessStart()对åºäºæµå¼æ¥è¯¢å¼å§è°ç¨ï¼notifyStaProcessFinish()对åºäºæµå¼æ¥è¯¢ç»æè°ç¨ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | æµå¼æ¥è¯¢å¿
é¡»è¦ç»SDKè®¾ç½®åæ¥ç¶æã详æ
è§```Android FUStaKit éæææ¡£``` |
| | | |
| | | ###### FUSta SDK设置å
鍿æ¾å¨ç¶ææ¥å£ |
| | | |
| | | ``` |
| | | void setStaPlayerListener(OnStaPlayerListener staPlayerListener); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKéç¨å
鍿æ¾å¨ææ¾ï¼ææ¾å¨ç¶ææ¥å£ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```OnStaPlayerListener```ï¼å®ç°è¯¥æ¥å£ï¼ç¸å
³æ¹æ³å®ä¹ï¼ |
| | | |
| | | ```onPrepared()```ï¼ææ¾å¼å§ |
| | | |
| | | ```onCompleted()```ï¼ææ¾ç»æ |
| | | |
| | | ```onCancel()```ï¼ææ¾åæ¶ |
| | | |
| | | ```onError(String message)```ï¼ææ¾åºé |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDKå£å驱å¨ï¼å¤é¨ææ¾åºæ¯ï¼ |
| | | |
| | | ``` |
| | | void staProcessNoPlayer(FUStaParams staParams); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | FUSta SDKæ¥è¯¢å£åç³»æ°ï¼å¤é¨ææ¾å¨ææ¾é³é¢ï¼éè¦ä¸¤è
é
å驱å¨å¯¹åºå£åã |
| | | |
| | | 使ç¨åºæ¯ï¼ |
| | | 1ãæµå¼é³é¢ï¼ææ¶é´æ³ï¼åªæ¯æpcm |
| | | 2ãæµå¼é³é¢ï¼æ æ¶é´æ³ï¼åªæ¯æpcm |
| | | 3ãæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æAlignææ¬ï¼åªæ¯æpcm |
| | | 4ãéæµå¼é³é¢ï¼ææ¶é´æ³ï¼æ¯æpcmä¸wav |
| | | 5ãéæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æ¯æpcmä¸wav |
| | | 6ãéæµå¼é³é¢ï¼æ æ¶é´æ³ï¼æAlignææ¬ï¼æ¯æpcmä¸wav |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ``` params ```ï¼FUStaParams为é
置类ï¼åæ°åºæ¬è®¾ç½®ï¼ 设置STAæä½ä¸ºéæµå¼ã设置é³é¢æ°æ®ã设置é³é¢æ°æ®ç±»åã设置é³é¢æ°æ®å¯¹åºæ¶é´æ³çï¼ç®åæ¯æ pcm ä¸ wav |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ææ¶é´æ³ï¼æ¥è¯¢å£åç³»æ°æ ¹æ®æ¶é´æ³æ¥è¯¢ï¼éåº¦ä¼æ´å¿«ã |
| | | æ æ¶é´æ³ï¼æ¥è¯¢å£åç³»æ°æ ¹æ®é³é¢æ°æ®æ¥è¯¢ï¼æ ¹æ®æºåé
ç½®ä¸åèæ¶ä¹æå·®å«ï¼æ¥è¯¢é度ç¨èæ¶ãä¸è¬æ æ¶é´æ³æ¥è¯¢å£åç³»æ°æ¹å¼æASRæ¹å¼åALIGNæ¹å¼ï¼ALIGNæ¹å¼è¾å¿«ï¼ASRæ¹å¼è¾æ
¢ã |
| | | FUStaParamsåæ°è¯¦æ
ä¸è¯¥å£å驱卿¨¡å¼è°ç¨è§```Android FUStaKit éæææ¡£``` |
| | | |
| | | ###### FUSta SDKå¤é¨ææ¾åºæ¯ç¶æåæ¥ |
| | | |
| | | ``` |
| | | void onExternalPlayerStart(); |
| | | void onExternalPlayerStop(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKå
é¨å£åç³»æ°æ¥è¯¢ï¼å¤é¨ææ¾å¨ææ¾ï¼ä¸¤è
é
å驱å¨å£åï¼éè¦ç»SDKåæ¥ææ¾å¨ç¶æï¼è®¾ç½®å£å驱å¨çå¼å
³ã |
| | | onExternalPlayerStart()对åºäºå¤é¨ææ¾å¨ææ¾å¼å§ï¼onExternalPlayerStop()对åºäºå¤é¨ææ¾å¨ææ¾æåæç»æã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | å¤é¨ææ¾åºæ¯å¿
é¡»è¦ç»SDKè®¾ç½®åæ¥ç¶æã详æ
è§```Android FUStaKit éæææ¡£``` |
| | | |
| | | ###### FUSta SDK设置å¤é¨ææ¾å¨æ¥å£ |
| | | |
| | | ``` |
| | | void setExternalPlayerListener(OnExternalPlayerListener externalPlayerListener); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKå
é¨å£åç³»æ°æ¥è¯¢ï¼å¤é¨ææ¾å¨ææ¾ï¼ä¸¤è
é
å驱å¨å£åï¼éè¦ç»SDKåæ¥ææ¾å¨è¿åº¦ï¼sdkæ¿å°ææ¾è¿åº¦é©±å¨å¯¹åºçå£åã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```OnExternalPlayerListener```ï¼å®ç°è¯¥æ¥å£ï¼ç¸å
³æ¹æ³å®ä¹ï¼ |
| | | |
| | | ```updateCurrentPosition()```ï¼è·åå¤é¨ææ¾å¨é³é¢ææ¾è¿åº¦ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### FUSta SDK设置é³é¢æ°æ®æ¥è¯¢ç¶æçæ¥å£ |
| | | |
| | | ``` |
| | | void setStaProcessListener(OnStaProcessListener onStaProcessListener); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKå
é¨å£åç³»æ°æ¥è¯¢ï¼è¯¥æ¥å£ä¼åè°æ¯ä¸æ®µæ¥è¯¢é³é¢æ°æ®çæ°æ®ï¼`FUAudioProgressType`åå
é¨å¤çè¿åçé³é¢ï¼è¯¥ç¶ææ¥å£ä¸»è¦ç¨äºå¤é¨ææ¾å¨åºæ¯ä¸ï¼ä¸ºäºè§é¿å£åç³»æ°æ¥è¯¢èæ¶çå½±åï¼éç¥å¼åè
SDKå·²ç»æå£åæ¥è¯¢å®æï¼å¯ä»¥æ§è¡å¤é¨ææ¾å¨ææ¾é»è¾ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```OnStaProcessListener```ï¼å®ç°è¯¥æ¥å£ï¼ç¸å
³æ¹æ³å®ä¹ï¼ |
| | | |
| | | ```onStaProcess(FUAudioProgressType audioProgressType, byte[] data)```ï¼åè°æ¯ä¸æ®µæ¥è¯¢é³é¢æ°æ®çæ°æ® |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ```FUAudioProgressType```æ¯`å¼å§`ã`ä¸é´`ã`ç»æ`ã`æ´æ®µ`çæä¸¾ã`date`æ¯æ¯ä¸æ®µçé³é¢ï¼æ³¨æè¯¥é³é¢ä¸ä¸å®çäºç¨æ·ä¼ å
¥çé³é¢æ ¼å¼å大å°ã |
| | | |
| | | |
| | | ###### FUSta SDK忢å£åæ¥è¯¢åé©±å¨ |
| | | |
| | | ``` |
| | | void stopStaProcess(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | ææSDKå
é¨å£åç³»æ°æ¥è¯¢ä»»å¡ï¼è¯¥æ¥å£ä¼æ¸
æå·²ç»æ¥è¯¢çå£åæ°æ®çç¼åï¼åæ¢å
鍿æ¾å¨çææ¾ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | å¤é¨ææ¾åºæ¯éè¦é
åå¤é¨ææ¾å¨åæ¢æ¹æ³åè°ç¨SDKå¤é¨ææ¾å¨ææ¾æåæç»æéç¥æ¹æ³ï¼`onExternalPlayerStop()`ã |
| | | |
| | | |
| | | ###### FUSta SDK设置è±è¯å£åå¼ å¼å¹
度 |
| | | |
| | | ``` |
| | | void setENIntensity(float intensity); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置è±è¯å£åå¼ å¼å¹
度ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```intensity```ï¼è±è¯å£åå¼ å¼å¹
度ï¼åå¼èå´`1.0, 1.5`ï¼ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | |
| | | --- |
| | | |
| | | > ### <a name="6">Avatarå¨ç»å表æ
忢</a> |
| | | |
| | | ###### å¨ç»å¾ªç¯ææ¾ |
| | | |
| | | ``` |
| | | void playAnimation(String anim); |
| | | æ |
| | | void playAnimation(String anim, String[] prop, String[] propAnimation); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | å¾ªç¯ææ¾Avatarå¨ç»ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```anim```ï¼Stringï¼Avatarå¨ç»éå
·è·¯å¾ |
| | | ```prop```ï¼String[], éå
·è·¯å¾æ°ç» |
| | | ```propAnimation```ï¼String[], éå
·å¨ç»è·¯å¾æ°ç» |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### å¨ç»åæ¬¡ææ¾ |
| | | |
| | | ``` |
| | | void playAnimationOnce(String anim); |
| | | æ |
| | | void playAnimationOnce(String anim, String[] prop, String[] propAnimation); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 忬¡ææ¾Avatarå¨ç»ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```anim```ï¼Stringï¼Avatarå¨ç»éå
·è·¯å¾ |
| | | ```prop```ï¼String[], éå
·è·¯å¾æ°ç» |
| | | ```propAnimation```ï¼String[], éå
·å¨ç»è·¯å¾æ°ç» |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### ç»§ç»ææ¾å½åå¨ç» |
| | | |
| | | ``` |
| | | void startCurrentAnimation(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | ç»§ç»ææ¾å½åå¨ç»ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### æåææ¾å½åå¨ç» |
| | | |
| | | ``` |
| | | void pauseCurrentAnimation(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | ç»§ç»ææ¾å½åå¨ç»ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### ç§»é¤å¨ç» |
| | | |
| | | ``` |
| | | void removeAnimation(String anim); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | ç§»é¤å¨ç»ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```anim```ï¼Stringï¼è¦ç§»é¤çAvatarå¨ç»éå
·è·¯å¾ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### 设置å¨ç»çè¿æ¸¡æ¶é´ |
| | | |
| | | ``` |
| | | void setAnimationTransitionTime(float time); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置å¨ç»çè¿æ¸¡æ¶é´ï¼åä½ä¸ºç§ï¼é»è®¤0.5ç§ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```time```ï¼floatï¼å¨ç»çè¿æ¸¡æ¶é´ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### 设置å¨ç»çææ¾é度 |
| | | |
| | | ``` |
| | | void setAnimationSpeed(float speed); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置å¨ç»çææ¾é度系æ°ï¼é»è®¤ä¸º1ï¼èå´`0.2, 5.2`ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```speed```ï¼floatï¼ææ¾éåº¦ç³»æ° |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### å
置表æ
忢 |
| | | |
| | | ``` |
| | | void updateEmotion(FUEmotionType emotionType); |
| | | æ |
| | | void updateEmotion(FUEmotionType emotionType, int fpsNum); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | SDKå
置表æ
忢ï¼å¨`fpsNum`帧å
è¿æ¸¡å°ç®æ 表æ
ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```emotionType```ï¼FUEmotionTypeï¼å
置表æ
çæä¸¾ï¼ç®ååªæ¯æç¹å®çAvatarç±»åï¼`FUAvatarType.CARTOON`å`FUAvatarType.REAL`ï¼ã |
| | | ```fpsNum```ï¼intï¼å¨`fpsNum`帧å
è¿æ¸¡å°ç®æ 表æ
ï¼é»è®¤ä¸º0ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### èªå®ä¹è¡¨æ
忢 |
| | | |
| | | ``` |
| | | void updateCustomEmotion(String path); |
| | | æ |
| | | void updateCustomEmotion(String path, int fpsNum); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | èªå®ä¹è¡¨æ
忢ï¼éè¿ä¼ å
¥èªå®ä¹bsæä»¶ï¼å
é¨è§£æå¹¶ä¸é©±å¨è¡¨æ
ï¼å¨`fpsNum`帧å
è¿æ¸¡å°ç®æ 表æ
ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```path```ï¼Stringï¼èªå®ä¹è¡¨æ
çæä»¶ã |
| | | ```fpsNum```ï¼intï¼å¨`fpsNum`帧å
è¿æ¸¡å°ç®æ 表æ
ï¼é»è®¤ä¸º0ã |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### 设置æ ç¾é
置表 |
| | | |
| | | ``` |
| | | void setAlignTagConfig(String tagConfig, String defaultAnimation); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置æ ç¾é
置表ï¼é
åAlign模å¼ä½¿ç¨å¯å®å¶å¨ä½è¡¨æ
忢çå®é
ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```tagConfig```ï¼Stringï¼æ ç¾é
置表 |
| | | ```defaultAnimation```ï¼Stringï¼æ ç¾é
置表å¨ä½æ§è¡å®æåæ§è¡çé»è®¤å¨ä½éå
·è·¯å¾ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | æ ç¾é
置表è°ç¨è§```Android FUStaKit éæææ¡£``` |
| | | |
| | | --- |
| | | |
| | | > ### <a name="7">鿝</a> |
| | | |
| | | ###### 鿝 FUSta SDK |
| | | |
| | | ``` |
| | | void release(); |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 鿝SDKï¼éæ¾å
åèµæºã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | --- |
| | | |
| | | > ### <a name="8">å
¶ä»</a> |
| | | |
| | | ###### æè½¬Avatar |
| | | |
| | | ``` |
| | | setRotDelta(float delta) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | æè½¬è§è²ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```delta```ï¼è¡¨ç¤ºæè½¬å¢éï¼åå¼èå´`-1.0, 1.0` |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | |
| | | ###### 缩æ¾Avatar |
| | | |
| | | ``` |
| | | setScaleDelta(float delta) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 缩æ¾è§è²ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```delta```ï¼è¡¨ç¤ºç¼©æ¾å¢éï¼åå¼èå´`-1.0, 1.0` |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | |
| | | ###### ä¸ä¸ç§»å¨Avatar |
| | | |
| | | ``` |
| | | setTranslateDelta(float delta) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | ä¸ä¸ç§»å¨è§è²ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```delta```ï¼è¡¨ç¤ºä¸ä¸å¢éï¼åå¼èå´`-1.0, 1.0` |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### 设置Avataræè½¬è§åº¦ |
| | | |
| | | ``` |
| | | setRotate(float rotate) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置Avataræè½¬è§åº¦ã |
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```rotate```ï¼è¡¨ç¤ºæè½¬è§åº¦ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | ###### 设置bs表æ
ç³»æ°æ°æ® |
| | | |
| | | ``` |
| | | setBSConfigData(String configPath) |
| | | ``` |
| | | ###### æ¥å£è¯´æ |
| | | |
| | | 设置å½åAvatarbs表æ
ç³»æ°æ°æ®å
è·¯å¾ï¼å¯ä¸è®¾ç½®ï¼ä¸è®¾ç½®å使ç¨é»è®¤æ°æ®å
|
| | | |
| | | ###### åæ°è¯´æ |
| | | |
| | | ```configPath```ï¼Stringï¼bs表æ
ç³»æ°æ°æ®å
è·¯å¾ |
| | | |
| | | ###### 夿³¨ï¼ |
| | | |
| | | --- |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | ### FUStaSDKéæææ¡£ |
| | | |
| | | æ¬ SDK éæäº FaceUnity çè¯é³é©±å¨å½¢è±¡å¼æ(Speeach to Animation) ï¼è½å¤å¿«éæå»ºå¹¶é©±å¨èæå½¢è±¡è¯´è¯ï¼è¥é æ´å çå®èªç¶ç人æºäº¤äºåºæ¯ã |
| | | |
| | | |
| | | ## çæ¬ä¿¡æ¯ |
| | | |
| | | * **çæ¬å·**:2.1 |
| | | |
| | | * **æ´æ°æ¥æ**:2022-01-21 |
| | | |
| | | * **æ´æ°å
容**: |
| | | 1. ä¼åCPUæ§è½ä»¥åæ¥è¯¢æç |
| | | 2. æ°å¢å¨ç»ææ¾é度æ§å¶æ¥å£ |
| | | 3. æ´æ°BSç³»æ°57-47 |
| | | 4. ä¿®å¤éé³å¸§é®é¢ |
| | | 5. æ°å¢è®¾ç½®æè½¬è§åº¦ |
| | | 6. ä¼åé´å½±é¯é½¿ç®æ³ |
| | | 7. å¢å è¯¦ç»æ¥å¿æ¥å£ |
| | | |
| | | * **å¢é大å°**: |
| | | SDK ä½ç§¯ä»¥åapkå¢éæ°æ®ï¼åä½ï¼Mï¼ï¼ |
| | | * v7a + v8a 22.8M app å¢éï¼32.6M |
| | | |
| | | SDK å
é¨å
ç½®èµæºå
±è®¡6.57Mï¼å
¶ä¸å
å«ï¼ |
| | | 1. `controller_cpp.bundle` å
±1.46Mï¼graphicsç¸å
³ã |
| | | 2. `new_BSConfig` å
±4.11Mï¼bs表æ
ç³»æ°æ°æ®å
ã |
| | | 3. å
¶ä»èµæº 约1M |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | ç®åSDKåªæ¯æå½åä¸¤ä¸ªæ¶æï¼å¦æç¹æ®éæ±å¯æå
å¯¹åºæ¶æçSDKã |
| | | |
| | | |
| | | ## é
ç½®è¦æ± |
| | | |
| | | * **SDKæ¯æå®åçæ¬ï¼`API 21` å以ä¸ï¼å¿
é¡»å¨ç¡¬ä»¶å éççªå£ä¸ä½¿ç¨** |
| | | |
| | | |
| | | ## å¿«ééæ |
| | | |
| | | 1. é¦å
è¦è·åè¯ä¹¦ `authpack.java`ï¼æ¾å° `faceunity` 模å `com.faceunity.fustademo` å
ä¸ï¼è¯é³æ ¡åå·¥å
·å
`data_ali.bin`æ¾å°`assets`ç®å½ä¸ï¼ALIGNæ¹å¼æ¥è¯¢å£åï¼å¯ä¸è®¾ç½®ï¼ï¼è¯é³è¯å«å·¥å
·å
`data_asr.bin`æ¾å°`assets`ç®å½ä¸ï¼ASRæ¹å¼æ¥è¯¢å£åï¼å¯ä¸è®¾ç½®ï¼ï¼ä»¥ä¸å·¥å
·å
é½ä¸è®¾ç½®é»è®¤åªæ¯æé³é¢æ¶é´æ³æ¥è¯¢å£åç³»æ°ã |
| | | 2. æå»ºå·¥ç¨ï¼è¿è¡å°ææºä¸ï¼å³å¯ä½éª demo åè½ã |
| | | 3. æ³è¦ä½éª`æµå¼é³é¢ææ¥`åè½ï¼å¯ç³è¯·`æ è´`TTSç`client_id`å`client_secret`æè
对æ¥å
¶ä»ä¸æ¹çTTSæå¡ã |
| | | |
| | | |
| | | ## 使ç¨è¯´æ |
| | | |
| | | * **FUè¯é³å©æ** |
| | | |
| | | **åè½æ¨¡å**: |
| | | |
| | | 1. éæµå¼é³é¢ææ¥ |
| | | |
| | | ææ¥ä¸æ´æ®µé³é¢æä»¶ï¼æ¥è¯¢é³é¢å¯¹åºçå£åç³»æ°ï¼å¹¶ææ¾é³é¢ã |
| | | |
| | | 2. æµå¼é³é¢ææ¥ |
| | | |
| | | ææ¬è¾å
¥éè¿è¯é³åæï¼TTSï¼ï¼ç±ç¬¬ä¸æ¹æå¡åå®ç°ï¼çæé³é¢ä¼ å
¥SDKï¼æ¥è¯¢é³é¢å¯¹åºçå£åç³»æ°ï¼å¹¶ææ¾é³é¢ã |
| | | |
| | | 3. ææ²æ¼å± |
| | | |
| | | ææ¾ææ²é©±å¨å½¢è±¡ï¼æè¯æ¯å¸¦æé³ç´ çææ¬ï¼æ¥è¯¢é³é¢å¯¹åºçå£åç³»æ°ï¼å¹¶ææ¾é³é¢ã |
| | | |
| | | |
| | | **Demoèµæºéæ**: |
| | | |
| | | 以䏿¯å½åDemoçAvatarèµæºç¸å
³åSTAç¸å
³æ°æ®å
çéæçè§£æï¼ä¾¿äºå¼åè
çè§£DemoåSDKè°ç¨ãä½ä¸ä»
ä»
éäºå½åéææ¹å¼ï¼å¼åè
坿 ¹æ®é¡¹ç®éæ±èªè¡å®ä¹éææ¹å¼ã |
| | | |
| | | 1. assets ç®å½ |
| | | |
| | | 该ç®å½åæ¾ææçå½¢è±¡èµæºä»¥åSTAç¸å
³æ°æ®å
èµæºï¼ä¸åèµæºé½åæ¾å¨å¯¹åºçåæä»¶å¤¹ä¸ã |
| | | |
| | | - fusta_demo/src/main/assets/sta:该ç®å½ä¸ºææAvatarèµæºçåæ¾ç®å½ |
| | | |
| | | - fusta_demo/src/main/assets/sta/animation:该ç®å½ä¸ºææAvatarçå¨ç»èµæºçåæ¾ç®å½ |
| | | |
| | | - fusta_demo/src/main/assets/sta/body:该ç®å½ä¸ºææAvatarçbodyèµæºçåæ¾ç®å½ |
| | | |
| | | - fusta_demo/src/main/assets/sta/builtin:该ç®å½ç»æä¸æä¸ä¸ª avatar_list.json æä»¶ï¼ä¸»è¦ç¨æ¥é
ç½® avatar å表ï¼å
¶æ ¼å¼å¦ä¸ï¼ |
| | | ``` |
| | | [ |
| | | { |
| | | "name": "3D·å¡é女",// avatar åç§°ï¼å¯ä»¥ä¸é
ç½®ã |
| | | "dirName": "cartoon_female_moren"// avatar æä»¶å¤¹åç§°ï¼è¯¥æä»¶å¤¹ä½äº avatar ç®å½çæ ¹ç®å½ã |
| | | }, |
| | | { |
| | | "name": "3D·å¡éç·", |
| | | "dirName": "cartoon_male_moren" |
| | | } |
| | | ] |
| | | ``` |
| | | å¦ avatar_list.json é
ç½®ï¼æ¯ä¸ªå
ç´ å¯¹åºä¸ä¸ªavataræä»¶å¤¹ï¼å¨æä»¶å¤¹ä¸ä¿åç形象ç avatar.json é
ç½®æä»¶ãç´ ææä»¶ä»¥å徿 çç¸å
³æä»¶ï¼avatar.json çæ ¼å¼å¦ä¸ï¼ |
| | | ``` |
| | | { |
| | | "gender": 0,// æ§å«ï¼0ç·ã1女ã2éç¨ï¼å¿
é¡»é
ç½® |
| | | "components": [// 身ä½å个é¨ä»¶ï¼éè¦é
ç½®é¨ä»¶åç§°å è·¯å¾ |
| | | { |
| | | "name": "body", |
| | | "path": "@assets/body/STA_avatar_kt_def_female_moren.bundle" |
| | | } |
| | | ], |
| | | "animations": [// 形象å¨ç»ï¼éè¦é
ç½®å¨ç»åç§°å è·¯å¾ |
| | | { |
| | | "name": "é»è®¤å¼å¸", |
| | | "path": "@assets/animation/STA_anim_kt_def_female_weixiao.bundle" |
| | | } |
| | | ], |
| | | "position": {// 形象é»è®¤çåæ |
| | | "x": 10.0, |
| | | "y": 50.0, |
| | | "z": -600.0 |
| | | }, |
| | | "scene": {// åºæ¯é
ç½®ï¼å
æ¬èæ¯ï¼backgroundï¼ãç¸æºï¼cameraï¼ãç¯å
ï¼lightï¼ï¼éè¦é
ç½®åç§°å è·¯å¾ |
| | | "background": { |
| | | "name": "background", |
| | | "path": "@assets/STA_default_bg.bundle" |
| | | }, |
| | | "light": { |
| | | "name": "light", |
| | | "path": "@assets/STA_default_light.bundle" |
| | | } |
| | | }, |
| | | "custom": ""//Demoä¸å¡é»è¾ç¸å
³çé
ç½®ï¼ä¸»è¦æ¯Avataråç§°ãå¨ä½åè¡¨åæ ç¾å表çå®ä¹ |
| | | } |
| | | ``` |
| | | 夿³¨ï¼è·¯å¾æå®çåç¼@assetsè¡¨ç¤ºèµæºåå¨çassetsä¸ã |
| | | |
| | | - fusta_demo/src/main/assets/sta_kit:该ç®å½åæ¾ææSTAç¸å
³æ°æ®å
èµæºï¼è¯¥æä»¶çSTAç¸å
³èµæºå
æ°æ®ï¼ |
| | | |
| | | `data_ali.bin`è¯é³èªå¨æ ¡åå·¥å
·å
ï¼Align模å¼éè¦è®¾ç½®ï¼ |
| | | |
| | | `data_asr.bin`设置æåç¼ç åè½æ°æ®æä»¶ï¼Align模å¼åææ¬æ¶é´æ³éè¦è®¾ç½®ï¼ |
| | | |
| | | `data_decoder.bin`设置è¯é³è¯å«å·¥å
·å
ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼ |
| | | |
| | | å¨`fusta_demo/src/main/java/com/faceunity/fustademo/util/StaKitUtils.java`ç`init`æ¹æ³ä¸æéå è½½ã |
| | | |
| | | - fusta_demo/src/main/assets/sta_kit/emotion:该ç®å½åæ¾èªå®ä¹è¡¨æ
bsæä»¶ã |
| | | |
| | | - fusta_demo/src/main/assets/sta_kit/song:该ç®å½åæ¾ææ²ç¸å
³æä»¶ï¼ç¨äºææ²ææ¾è½åå±ç¤ºã |
| | | |
| | | 2. 形象å±ç¤º |
| | | |
| | | `com.faceunity.fu_data.data.FUDataCenter`伿 ¹æ®é
ç½®ç avatar ç®å½è·¯å¾ï¼è¯»å avatar_list.json 以éåææå½¢è±¡æä»¶å¤¹ä¸ç avatar.json ï¼çæ avatar 模åå表ï¼ä¸å±ä¸å¡è°ç¨è
åªéè¦ä¼ å
¥ä¸æ 便å¯è½»æ¾éæ©è¦å±ç¤ºç形象ãå
·ä½è°ç¨ç¤ºä¾å¦ä¸ï¼ |
| | | |
| | | ``` |
| | | FUDataCenter fuDataCenter = new FUDataCenter(mContext); |
| | | fuDataCenter.initWithAvatarDirAndAssetsPath(null, FUConstant.STA_ASSENTS_PATH); |
| | | ArrayList<FUAvatarModel> avatarModels = fuDataCenter.loadAvatarLists(); |
| | | ``` |
| | | `com.faceunity.fustademo.data.AvatarDataFactory`ææ`avatarModels`åè¡¨æ°æ®ï¼è°ç¨`setAvatar(int index)`æ¿å°å¯¹åºç`FUAvatarModel`è¿èå®ç°Avatarå è½½æåæ¢ã |
| | | |
| | | * **è¯ä¹¦** |
| | | |
| | | demoä¸ç`authpack.java`æ¯æå¸åå¸çSDKè¯ä¹¦ï¼FUStaSDKéè¦éè¿`authpack`é´æå¹¶åå§åãæ æ³ç¬ç«äºè¯ä¹¦è¿è¡ï¼å æ¤éè¦å°`authpack.java`æ¿æ¢å°ä½ çå·¥ç¨ä¸ã |
| | | |
| | | |
| | | * **æªé´æçbundle** |
| | | |
| | | ï¼ç¦»çº¿é´æå
容ï¼å¨çº¿é´ææ¨¡å¼è¯·å¿½ç¥ï¼assetsç®å½ä¸ç`fustaengine\offline\***.bundle`æ°æ®æ¯æªé´æçbundleæ°æ®ï¼ç¦»çº¿é´æè¿ç¨é¦å
éè¦ä½¿ç¨æªé´æçbundleæ°æ®èç½è¿è¡ä¸æ¬¡å¨çº¿é´æï¼é´ææååçæ`key.bundle`ï¼ |
| | | |
| | | |
| | | * **key.bundle** |
| | | |
| | | ï¼ç¦»çº¿é´æå
容ï¼å¨çº¿é´ææ¨¡å¼è¯·å¿½ç¥ï¼`key.bundle`æ¯SDKå
é¨èªå¨çæçbundleï¼æäºè¯¥bundleåç»å¼åè
å¯ä½¿ç¨è¯¥æä»¶è¿è¡ç¦»çº¿æéï¼ä¸åéè¦èç½æä½ã`key.bundle`æ¯ç¬¬ä¸æ¬¡èç½é´ææååçæçï¼ä¿åå¨SDå¡ç®å½ä¸ç\FaceUnity\FUStaKit\key.bundle |
| | | |
| | | |
| | | * **FUStaKit** |
| | | |
| | | `FUStaKit`æ¯SDK对å¤çé¨é¢ç±»ãéè¿`FUStaKit`对象è°ç¨SDKç¸å
³åè½ã |
| | | |
| | | |
| | | * **éå
·èµæº** |
| | | |
| | | é¤äºSDKåè¯ä¹¦ï¼æä»¬è¿éè¦éå
·èµæºä¾SDKå è½½ï¼Demoä¸ç`assets`æä»¶å¤¹å
å«äºä¸äºé¢ç½®çèµæºæä»¶(èæ¯ã形象ãå¨ä½ãæ©å±åè½æ°æ®å
ç)ãç±äºé¨åéå
·èµæºæä»¶è¾å¤§ï¼å®é
å¼åè¿ç¨ä¸å¯ä»¥éæ©éè¿ç½ç»ä¸è½½çæ¹å¼éæå°ä½ ç项ç®ä¸ãä½ å¯ä»¥æå
å°Demoä¸ç`assets`æä»¶å¤¹æå
¥å°ä½ çå·¥ç¨ä¸ä½¿ç¨å
è´¹éå
· |
| | | |
| | | ## éæ SDK |
| | | |
| | | ### 1. æ·»å ä¾èµ |
| | | |
| | | å¨å·¥ç¨ç®å½ä¸`build.gradle`->`repositories`䏿·»å ` maven { url 'http://maven.faceunity.com/repository/maven-public/' }`ã |
| | | |
| | | å¨é¡¹ç®ç®å½ä¸ç`build.gradle`䏿·»å ä¾èµåº`api 'com.faceunity:sta-full-featured:2.1.0-RELEASES'` |
| | | |
| | | ### 2. FUStaKit SDK é
ç½®åå§åæ°æ® |
| | | |
| | | å¨FUStaKit SDKåå§åä¹åï¼ä¸è¬æ¾å¨`Application`ä¸é
ç½®ãé´ææ¹å¼å为å¨çº¿é´æåç¦»çº¿é´æï¼å¯æ ¹æ®ä¸å¡éæ±èªè¡éæ©ï¼ |
| | | |
| | | #### é
ç½®å¨çº¿é´æåå§åæ°æ® |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | ``` |
| | | public void initOnline(@NonNull Context context) { |
| | | mContext = context.getApplicationContext(); |
| | | FUStaKit.Builder builder = new FUStaKit |
| | | //ä¼ å
¥ä¸ä¸æï¼å¿
è¦ |
| | | .Builder(mContext) |
| | | //éªè¯è¯ä¹¦ï¼å¿
è¦ |
| | | .setAuth(authpack.A()) |
| | | //设置ttsæ¥è¯¢æ¹å¼ï¼å¿
è¦ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ASRï¼Alignæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ALIGNMENTï¼ |
| | | .setFUTtsType(FUTtsType.ALIGNMENT) |
| | | //设置è¯é³è¯å«å·¥å
·å
ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼ |
| | | // .setAsrData(bytesAsr) |
| | | //设置è¯é³èªå¨æ ¡åå·¥å
·å
ï¼Align模å¼éè¦è®¾ç½®ï¼ |
| | | .setAlignData(bytesAlign) |
| | | //设置æåç¼ç åè½æ°æ®æä»¶ï¼Align模å¼åææ¬æ¶é´æ³éè¦è®¾ç½®ï¼ |
| | | .setCharacterDecoder(bytesDecoder); |
| | | mFUStaKit = builder.build(); |
| | | } |
| | | ``` |
| | | 夿³¨ï¼ |
| | | |
| | | #### é
ç½®ç¦»çº¿é´æåå§åæ°æ® |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | ``` |
| | | public void initOffline(@NonNull Context context) { |
| | | mContext = context.getApplicationContext(); |
| | | FUStaKit.Builder builder = new FUStaKit |
| | | //ä¼ å
¥ä¸ä¸æï¼å¿
è¦ |
| | | .Builder(mContext) |
| | | //éªè¯è¯ä¹¦ï¼å¿
è¦ |
| | | .setAuth(authpack.A()) |
| | | //设置ttsæ¥è¯¢æ¹å¼ï¼å¿
è¦ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ASRï¼Alignæ¹å¼éè¦è®¾ç½®ï¼FUTtsType.ALIGNMENTï¼ |
| | | .setFUTtsType(FUTtsType.ALIGNMENT) |
| | | //设置è¯é³è¯å«å·¥å
·å
ï¼ASRæ¹å¼éè¦è®¾ç½®ï¼ |
| | | // .setAsrData(bytesAsr) |
| | | //设置è¯é³èªå¨æ ¡åå·¥å
·å
ï¼Align模å¼éè¦è®¾ç½®ï¼ |
| | | .setAlignData(bytesAlign) |
| | | //设置æåç¼ç åè½æ°æ®æä»¶ï¼Align模å¼åææ¬æ¶é´æ³éè¦è®¾ç½®ï¼ |
| | | .setCharacterDecoder(bytesDecoder) |
| | | //è®¾ç½®ç¦»çº¿é´ææ°æ® |
| | | .setOffLineData(offLineAuth); |
| | | mFUStaKit = builder.build(); |
| | | } |
| | | ``` |
| | | 夿³¨ï¼ |
| | | |
| | | ç¦»çº¿é´æé¤äºè®¾ç½®`authpack.A()` é´ææ°æ®ï¼è¿éè¦è®¾ç½®ç¦»çº¿é´ææ°æ®å
æ°æ®ï¼`setOffLineAuth(offLineAuth)`ï¼è¯¥é»è¾å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[StaKitUtils.java: Lines 82-150](../app/src/main/java/com/faceunity/fustademo/util/StaKitUtils.java#L82-L150)ã |
| | | 注æç¦»çº¿é´æè¿éè¦æWRITE_EXTERNAL_STORAGEæéã |
| | | |
| | | |
| | | ### 3. FUStaKit SDK é´æ |
| | | |
| | | FUStaKit SDKåå§åï¼å¿
é¡»æ¾å¨ FUStaKit SDKé
ç½®åå§åæ°æ®ä¹åï¼é´ææ¹å¼å为å¨çº¿é´æåç¦»çº¿é´æï¼å¯æ ¹æ®ä¸å¡éæ±èªè¡éæ©ï¼ |
| | | |
| | | #### é
ç½®å¨çº¿é´æåå§åæ°æ® |
| | | |
| | | æ¹æ³ï¼`init(FUAuthType.ONLINE, StaKitInitCallback listener)` |
| | | `init(FUAuthType.ONLINE, null)` |
| | | |
| | | åæ°ï¼`FUAuthType.ONLINE`ï¼å¨çº¿é´æï¼ |
| | | `FUStaKit.StaKitInitCallback`ï¼SDKåå§åç¶æçåè°ãåæ°å¯ä¸ºç©ºã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | 1.æåå§å宿åè°çæ¹å¼ï¼SDKåå§å宿çåè°ï¼è¿å
¥åè½é¡µé¢ |
| | | // åå§ç¶æçå¬å¨ï¼çå¬initæ¯å¦æåï¼åè°å¨éUIçº¿ç¨ |
| | | private FUStaKit.StaKitInitCallback mInitListener = new FUStaKit.StaKitInitCallback() { |
| | | |
| | | @Override |
| | | public void onInitComplete(int code, @NotNull String msg) { |
| | | } |
| | | |
| | | @Override |
| | | public void onError(int errCode, @Nullable String errMsg) { |
| | | } |
| | | }; |
| | | // SDK åå§å |
| | | mFUStaKit.init(FUAuthType.ONLINE, mInitListener); |
| | | |
| | | 2.没æåå§å宿åè°çæ¹å¼ï¼å¦æè°ç¨è¯¥æ¹æ³ä¹åç´§æ¥çè°ç¨å£å驱卿¹æ³ï¼å£å驱å¨ä»»å¡ä¼çå¾
åå§åä»»å¡å®ææå¼å§ |
| | | // SDK åå§å |
| | | mFUStaKit.init(null); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | init åå§åæ¹æ³ï¼å¡å¿
å¨åç»æä½åè°ç¨ï¼å¦åæ æ³é©±å¨å£åã |
| | | SDKåå§åæ¹æ³æ¯èæ¶çï¼SDKå
é¨å·²å°ä»»å¡æ·»å å°å¼æ¥çº¿ç¨å¤çã妿SDKåå§åä»»å¡å°æªå¤ç宿¯ï¼åç»å£å驱å¨ä»»å¡åè°å å°ä»»å¡éåçå¾
è¯¥æ¹æ³å¤ç宿¯åæç
§é¡ºåºæä½ï¼ç¨æ·ç«¯è¡¨ç°ä¸ºç¬¬ä¸æ¬¡å£å驱å¨èæ¶æ¶é´é¿ã |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[SplashActivity.java: Lines 72-117](../app/src/main/java/com/faceunity/fustademo/ui/SplashActivity.java#L72-L117) |
| | | |
| | | #### é
ç½®ç¦»çº¿é´æåå§åæ°æ® |
| | | |
| | | æ¹æ³ï¼`init(FUAuthType.OFFLINE_BUNDLE, StaKitInitCallback listener)` |
| | | `init(FUAuthType.OFFLINE_BUNDLE, null)` |
| | | |
| | | åæ°ï¼`FUAuthType.OFFLINE_BUNDLE`ï¼ç¦»çº¿é´æï¼ |
| | | `FUStaKit.StaKitInitCallback`ï¼SDKåå§åç¶æçåè°ãåæ°å¯ä¸ºç©ºã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | 1.æåå§å宿åè°çæ¹å¼ï¼SDKåå§å宿çåè°ï¼è¿å
¥åè½é¡µé¢ |
| | | // SDK åå§å |
| | | mFUStaKit.init(FUAuthType.OFFLINE_BUNDLE, mInitListener); |
| | | |
| | | 2.没æåå§å宿åè°çæ¹å¼ï¼å¦æè°ç¨è¯¥æ¹æ³ä¹åç´§æ¥çè°ç¨å£å驱卿¹æ³ï¼å£å驱å¨ä»»å¡ä¼çå¾
åå§åä»»å¡å®ææå¼å§ |
| | | // SDK åå§å |
| | | mFUStaKit.init(null); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | ### 4. FUStaKit SDK 设置é»è®¤FUAvatar |
| | | |
| | | 设置é»è®¤çFUAvatarï¼æ¨èå¨å¼å§æ¸²æå设置é»è®¤FUAvatarã |
| | | |
| | | æ¹æ³ï¼`setAvatar(FUAvatar avatar, FUAvatarType avatarType, OnAvatarStateListener listener)` |
| | | |
| | | æ¹æ³ä¼ å
¥åæ°ä¸»è¦æ¯ï¼ |
| | | `FUAvatar`ï¼FUStaKit SDK Avataräººç©æ°æ®æ¨¡å; |
| | | `FUAvatarType`ï¼Avatarç±»åçæä¸¾ï¼`FUAvatarType.CARTOON`ã`FUAvatarType.REAL`ï¼é»è®¤æ¯`FUAvatarType.CARTOON`ï¼è¯¥åæ°ä¸»è¦ç¨æ¥åºå«SDKå
置表æ
ã缺çåæ°ã |
| | | `OnAvatarStateListener`ï¼Avataræ§è¡ç¶ææ¥å£ï¼æ¹æ³`onAvatarComplete()`表示Avatarå è½½å®æã缺çåæ°ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | ``` |
| | | FUAvatar fuAvatar = new FUAvatar.Builder() |
| | | .setAvatar(avatar)// åæ¢å½¢è±¡ |
| | | .setCoordinate(x, y, z)// 设置形象ä½ç½® |
| | | .setBackground(backGround)// è®¾ç½®èæ¯ |
| | | .setCamera(camera)// è®¾ç½®ç¸æºä½ |
| | | .setLight(light)// 设置å
ç
§ |
| | | .enableShadow(enable)// 设置é´å½± |
| | | .build(); |
| | | |
| | | // 忢Avatar |
| | | mFUStaKit.setAvatar(fuAvatar); |
| | | æ |
| | | mFUStaKit.setAvatar(fuAvatar, FUAvatarType.CARTOON); |
| | | æ |
| | | mFUStaKit.setAvatar(fuAvatar, FUAvatarType.CARTOON, onAvatarStateListener); |
| | | ``` |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 设置é»è®¤çAvataråAvatar忢è°ç¨æ¹å¼ä¸è´ï¼è°ç¨æ¶æºå¯ä»¥å¨å¼å§æ¸²æå设置ä¹å¯ä»¥å¨æ¸²æå设置ï¼Avatar忢å
¶å¯¹åºçç¹å¾ä¹ä¼æååï¼ä¾å¦åæ¢Avatarä¹ä¼åæ¢å¯¹åºçèæ¯ãå
ç
§ãä½ç½®ççã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 250-278](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L250-L278) |
| | | |
| | | |
| | | ### 5. FUStaKit SDK å¼å§æ¸²æ |
| | | |
| | | SDKé
置渲æç¸å
³åæ°å¹¶å¼å§æ¸²æã |
| | | |
| | | æ¹æ³ï¼`requestRender(GLTextureView glTextureView)` |
| | | åæ°: `GLTextureView` SDKæä¾ç渲æçç»ä»¶ |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.requestRender(glTextureView);// è¯·æ±æ¸²æ |
| | | mFUStaKit.setCustomRenderResolution(renderWidth, renderHeight);// 设置渲æå辨çï¼renderWidthï¼å®½åº¦ï¼é»è®¤1280ï¼renderHeightï¼é«åº¦ï¼é»è®¤720 |
| | | |
| | | // Activity onDestroy è°ç¨ |
| | | Activity.onDestroy() { |
| | | super.onDestroy(); |
| | | mFUStaKit.onDestroy(); |
| | | } |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 149-155](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L149-L155) |
| | | |
| | | ### 6. 形象å£åæ¥è¯¢åé©±å¨ |
| | | |
| | | æ ¹æ®ä¼ å
¥çé³é¢æ°æ®æè
æ¯æ¶é´æ³æ°æ®æ¥è¯¢å£å并驱å¨å£åï¼å¼åè
坿 ¹æ®ä¸å¡åºæ¯å鿱鿩åéç驱卿¹å¼ï¼ |
| | | æ ¹æ®é³é¢æ°æ®æè
æ¶é´æ³æ°æ®çè¿åæ¹å¼å¯å为`æµå¼é³é¢é©±å¨`å`éæµå¼é³é¢é©±å¨`ï¼ |
| | | æ ¹æ®è½å¤æä¾çæ°æ®èµæºå¯å为`æ¶é´æ³é©±å¨`ã`Align驱å¨`ã`ASR驱å¨`ï¼ |
| | | æ ¹æ®æ¯å¦ç±SDKææ¾å¨ææ¥é³é¢å¯å为`SDKå
ç½®ææ¾å¨ææ¥`ã`èªå®ä¹ææ¾å¨ææ¥`ã |
| | | ææ¡£ä»¥`SDKå
ç½®ææ¾å¨ææ¥`ã`èªå®ä¹ææ¾å¨ææ¥`ä¸¤ç§æ¨¡å¼å类讲解ã |
| | | |
| | | #### SDK å
ç½®ææ¾å¨ææ¥ |
| | | |
| | | å
ç½®ææ¾å¨ææ¥ï¼éè¦å¨å£åæ¥è¯¢ä¹ååå§åå
鍿æ¾å¨ã |
| | | |
| | | æ¹æ³ï¼`initStaPlayer(new FUPlayerConfig.Builder().setAudioSampleRate(sampleRate).build())` |
| | | åæ°: `FUPlayerConfig`ï¼å
鍿æ¾å¨çåæ°é
置类ï¼ä¸»è¦é
ç½®éæ ·çã声鿰å使·±ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.initStaPlayer(new FUPlayerConfig.Builder().setAudioSampleRate(16000).build());// è®¾ç½®éæ ·ç为16k |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | å
ç½®ææ¾å¨ææ¥,å¿
é¡»è¦å
åå§åææ¾å¨ï¼æ¥ä¸æ¥æè½å¼å§å£åçæ¥è¯¢å驱å¨ã |
| | | |
| | | |
| | | * **æµå¼é³é¢ï¼æ æ¶é´æ³** |
| | | |
| | | é对æµå¼è¿åçé³é¢æ°æ®ä¸æ æ¶é´æ³çåºæ¯`ï¼ææ¶é´æ³è¯å®è¦éç¨æ¶é´æ³æ¹å¼ï¼å 为æ¶é´æ³æ¥è¯¢æçé«ï¼å£åæ´ç²¾åï¼`ï¼æ¯æé³é¢ç±»åï¼`pcm`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | æ ¹æ®è½ä¸è½æä¾é³é¢æ°æ®å¯¹åºçææ¬`ï¼åæç»ä¸ç§°ä¹ä¸ºAlignTextï¼`å为ï¼`Align`æ¹å¼ ä¸ `ASR` æ¹å¼ã |
| | | |
| | | 1ã`ALIGN` æ¹å¼ |
| | | |
| | | `Align`æ¹å¼æ¥è¯¢å£åç³»æ°æ¯é é³é¢æ°æ®åä¸ä¹å¯¹åºçAlignTextï¼å¨æµå¼çæ¥è¯¢ä¸ï¼é³é¢æ°æ®æ¯ä¸æ®µæ®µè¿åï¼ä½æ¯AlignTextæ¯å®æ´ç䏿®µææ¬ï¼`Align`æ¹å¼æ¥è¯¢é度è¾`ASR`æ¹å¼æ´å¿«ï¼ä¹å¯ä»¥æ¯æé«çº§çå¨ä½è¡¨æ
çå®å¶åï¼ä½æ¯ä¹æéå¶ï¼ä¾å¦AlignText䏿¯æç¹ä½ä¸æã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æµå¼å¤çå¼å§ |
| | | mFUStaKit.notifyStaProcessStart(); 1ã`ALIGN` æ¹å¼ |
| | | |
| | | `Align`æ¹å¼æ¥è¯¢å£åç³»æ°æ¯é é³é¢æ°æ®åä¸ä¹å¯¹åºçAlignTextï¼å¨æµå¼çæ¥è¯¢ä¸ï¼é³é¢æ°æ®æ¯ä¸æ®µæ®µè¿åï¼ä½æ¯AlignTextæ¯å®æ´ç䏿®µææ¬ï¼`Align`æ¹å¼æ¥è¯¢é度è¾`ASR`æ¹å¼æ´å¿«ï¼ä¹å¯ä»¥æ¯æé«çº§çå¨ä½è¡¨æ
çå®å¶åï¼ä½æ¯ä¹æéå¶ï¼ä¾å¦AlignText䏿¯æç¹ä½ä¸æã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æµå¼å¤çå¼å§ |
| | | mFUStaKit.notifyStaProcessStart(); |
| | | |
| | | ... |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å¤æ¬¡è°ç¨çï¼å³æ¯æ¬¡ææµå¼é³é¢è¿åé½ä¼éæ°è®¾ç½®`FUStaParams`å¹¶è°ç¨`staProcess(params)` |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setStreamMode(1)// 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤éæµå¼ |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼æµå¼æ¥è¯¢è¦æ±åªè½æ¯PCM |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setAlignText(align)// AlignText æ³¨ææ¤å¤è®¾ç½®çæ¯æ´æ®µçææ¬è䏿¯ä¸è¯¥æ®µé³é¢å¯¹åºçææ¬ |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ALIGN` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | ... |
| | | |
| | | // æµå¼å¤çç»æ |
| | | mFUStaKit.notifyStaProcessFinish(); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | æµå¼æ æ¶é´æ³éç¨`ALIGN`æ¹å¼æ¥è¯¢å£åç³»æ°ï¼sdkå
é¨ä¼æ ¹æ®é³é¢æ°æ®åçææ´æ®µé³é¢çææ¬è®¡ç®åºé³ç´ æ¶é´æ³ï¼æ
`setTimestampType(FUTimestampType.PHONE)`å¿
须设置ã |
| | | |
| | | å
³äºæµå¼`ALIGN`æ¹å¼ï¼æ¯æµå¼`ASR`æ¹å¼éè¦å¤è®¾ç½®çæé³é¢æ°æ®çææ¬ï¼æ³¨ææ¤å¤è®¾ç½®çæ¯æ´æ®µçææ¬è䏿¯ä¸è¯¥æ®µé³é¢å¯¹åºçææ¬ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallbackã |
| | | |
| | | |
| | | 2ã`ASR`æ¹å¼ |
| | | |
| | | `ASR`æ¹å¼æ¥è¯¢å£åç³»æ°æ¯é é³é¢æ°æ®ï¼`ASR`æ¹å¼æ¥è¯¢éåº¦è¾æ
¢ï¼åä½é³é¢å¤çé度ç¨èæ¶ï¼ä½æµå¼æ¥è¯¢åºæ¯ä¸ï¼SDKåºå±åºæ¥è¯¢å¤çnç§çé³é¢é度è¿è¿å¤§äºnç§é³é¢ææ¾æ¶é¿ï¼å æ¤å¯å¿½ç¥æ§è½å·®å¼ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æµå¼å¤çå¼å§ |
| | | mFUStaKit.notifyStaProcessStart(); |
| | | |
| | | ... |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å¤æ¬¡è°ç¨çï¼å³æ¯æ¬¡ææµå¼é³é¢è¿åé½ä¼éæ°è®¾ç½®`FUStaParams`å¹¶è°ç¨`staProcess(params)` |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setStreamMode(1)// 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤éæµå¼ |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼æµå¼æ¥è¯¢è¦æ±åªè½æ¯PCM |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ASR` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | ... |
| | | |
| | | // æµå¼å¤çç»æ |
| | | mFUStaKit.notifyStaProcessFinish(); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | æµå¼æ æ¶é´æ³éç¨`ASR`æ¹å¼æ¥è¯¢å£åç³»æ°ï¼sdkå
é¨ä¼æ ¹æ®é³é¢æ°æ®è®¡ç®åºé³ç´ æ¶é´æ³ï¼æ
`setTimestampType(FUTimestampType.PHONE)`å¿
须设置ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallbackã |
| | | |
| | | |
| | | * **æµå¼é³é¢ï¼ææ¶é´æ³** |
| | | |
| | | é对æµå¼è¿åçé³é¢æ°æ®ä¸ææ¶é´æ³çåºæ¯ï¼æ¥è¯¢èæ¶æå°ï¼ææ¶é´æ³æ°æ®ä¼å
éç¨æ¶é´æ³æ¹å¼ãæ¯æé³é¢ç±»åï¼`pcm`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æµå¼å¤çå¼å§ |
| | | mFUStaKit.notifyStaProcessStart(); |
| | | |
| | | ... |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å¤æ¬¡è°ç¨çï¼å³æ¯æ¬¡ææµå¼é³é¢è¿åé½ä¼éæ°è®¾ç½®`FUStaParams`å¹¶è°ç¨`staProcess(params)` |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setStreamMode(1)// 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤éæµå¼ |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼æµå¼æ¥è¯¢è¦æ±åªè½æ¯PCM |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setTimestamp(timestamp)// æ¶é´æ³æ°æ® |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼å
·ä½ç±»åè¦æ ¹æ®æ¶é´æ³çç±»åæ¥å® |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | ... |
| | | |
| | | // æµå¼å¤çç»æ |
| | | mFUStaKit.notifyStaProcessFinish(); |
| | | |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallbackã |
| | | |
| | | |
| | | * **éæµå¼é³é¢ï¼æ æ¶é´æ³** |
| | | |
| | | é坹鿵å¼è¿åçé³é¢æ°æ®ä¸æ æ¶é´æ³çåºæ¯`ï¼ææ¶é´æ³è¯å®è¦éç¨æ¶é´æ³æ¹å¼ï¼å 为æ¶é´æ³æ¥è¯¢æçé«ï¼å£åæ´ç²¾åï¼`ï¼æ¯æé³é¢ç±»åï¼`pcm\wav`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | æ ¹æ®è½ä¸è½æä¾é³é¢æ°æ®å¯¹åºçææ¬`ï¼åæç»ä¸ç§°ä¹ä¸ºAlignTextï¼`å为ï¼`Align`æ¹å¼ ä¸ `ASR` æ¹å¼ã |
| | | |
| | | 1ã`ALIGN` æ¹å¼ |
| | | |
| | | `Align`æ¹å¼æ¥è¯¢å£åç³»æ°æ¯é é³é¢æ°æ®åä¸ä¹å¯¹åºçAlignTextï¼å¨éæµå¼çæ¥è¯¢ä¸ï¼é³é¢æ°æ®æ¯ä¸æ´æ®µè¿åï¼AlignTextæ¯é³é¢å¯¹åºçææ¬ï¼`Align`æ¹å¼æ¥è¯¢é度è¾`ASR`æ¹å¼æ´å¿«ï¼ä¹å¯ä»¥æ¯æé«çº§çå¨ä½è¡¨æ
çå®å¶åï¼ä½æ¯ä¹æéå¶ï¼ä¾å¦AlignText䏿¯æç¹ä½ä¸æã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å次è°ç¨ç |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼éæµå¼æ¥è¯¢æ¯æPCMåWAV |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å 鿵弿¥è¯¢æ¯æpcmãwav é»è®¤pcm |
| | | .setAlignText(align)// AlignText æ³¨ææ¤å¤è®¾ç½®çæ¯æ´æ®µçææ¬è䏿¯ä¸è¯¥æ®µé³é¢å¯¹åºçææ¬ |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ALIGN` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | `setTimestampType(FUTimestampType.PHONE)`ï¼éæµå¼æ æ¶é´æ³éç¨`ALIGN`æ¹å¼æ¥è¯¢å£åç³»æ°ï¼sdkå
é¨ä¼æ ¹æ®é³é¢æ°æ®åçææ´æ®µé³é¢çææ¬è®¡ç®åºé³ç´ æ¶é´æ³ï¼æ
`setTimestampType(FUTimestampType.PHONE)`å¿
须设置ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.SimpleActivity#sendTextã |
| | | |
| | | 2ã`ASR` æ¹å¼ |
| | | |
| | | `ASR`æ¹å¼æ¥è¯¢å£åç³»æ°æ¯é é³é¢æ°æ®ï¼`ASR`æ¹å¼æ¥è¯¢éåº¦è¾æ
¢ï¼åä½é³é¢å¤çé度ç¨èæ¶ï¼ åä½é³é¢å¤çé度ä¸å¦`ALIGN`æ¹å¼ï¼ä½å
é¨å®ç°äºé³é¢å岿髿çã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å次è°ç¨ç |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼éæµå¼æ¥è¯¢æ¯æPCMåWAV |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å 鿵弿¥è¯¢æ¯æpcmãwav é»è®¤pcm |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ASR` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | 鿵弿 æ¶é´æ³éç¨`ASR`æ¹å¼æ¥è¯¢å£åç³»æ°ï¼sdkå
é¨ä¼æ ¹æ®é³é¢æ°æ®è®¡ç®åºé³ç´ æ¶é´æ³ï¼æ
`setTimestampType(FUTimestampType.PHONE)`å¿
须设置ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.SimpleActivity#sendTextã |
| | | |
| | | * **éæµå¼é³é¢ï¼ææ¶é´æ³** |
| | | |
| | | é坹鿵å¼è¿åçé³é¢æ°æ®ä¸ææ¶é´æ³çåºæ¯ï¼æ¥è¯¢èæ¶æå°ï¼ææ¶é´æ³æ°æ®ä¼å
éç¨æ¶é´æ³æ¹å¼ãæ¯æé³é¢ç±»åï¼`pcm\wav`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£å |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼éæµå¼æ¥è¯¢æ¯æPCMåWAV |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å 鿵弿¥è¯¢æ¯æpcmãwav é»è®¤pcm |
| | | .setTimestamp(timestamp)// æ¶é´æ³æ°æ® |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ASR` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç com.faceunity.fustademo.ui.SimpleActivity#sendTextã |
| | | |
| | | |
| | | * **设置å
鍿æ¾å¨ææ¾ç¶ææ¥å£** |
| | | |
| | | 以䏿¹å¼åéç¨å
鍿æ¾å¨ææ¾é³é¢ï¼SDKå
鍿æ¾ç¶æçæ¥å£ä¸º`OnStaPlayerListener`; |
| | | |
| | | æ¹æ³ï¼`setStaPlayerListener(OnStaPlayerListener listener)`ï¼æ¹æ³ä¼ å
¥åæ°ä¸»è¦æ¯`OnStaPlayerListener`ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setStaPlayerListener(new OnStaPlayerListener() { |
| | | @Override |
| | | public void onPrepared() { |
| | | // ææ¾å¼å§ |
| | | } |
| | | |
| | | @Override |
| | | public void onCompleted() { |
| | | // ææ¾ç»æ |
| | | } |
| | | |
| | | @Override |
| | | public void onCancel() { |
| | | // ææ¾åæ¶ |
| | | } |
| | | |
| | | @Override |
| | | public void onError(@Nullable String message) { |
| | | // ææ¾åºé |
| | | } |
| | | }); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç [AvatarDataFactory.java: Lines 98-105](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L98-L105) |
| | | |
| | | |
| | | #### èªå®ä¹ææ¾å¨ææ¥ |
| | | |
| | | ç¨æ·èªå®ä¹ææ¾å¨ææ¥ï¼å
æ¥è¯¢å£åç³»æ°ï¼æ¥è¯¢å®ææè
馿®µæ¥è¯¢å®æå³å¯ä»¥å¼å§èªå®ä¹çææ¾å¨ææ¾ï¼ç¶åéè¿`OnExternalPlayerListener`æ¥å£ç`updateCurrentPosition()`è¿åææ¾è¿åº¦ç»SDK, |
| | | SDKæ¿å°ææ¾è¿åº¦é©±å¨å¯¹åºçå£åï¼å
·ä½æ¥éª¤ä¸ºï¼ |
| | | |
| | | #### 1ãèªå®ä¹ææ¾å¨æ¥è¯¢ |
| | | |
| | | `èªå®ä¹ææ¾å¨ææ¥`æ¥è¯¢æ¹æ³ä¸`å
ç½®ææ¾å¨ææ¥`ä¸åï¼ä¸è¿`FUStaParams`åæ°è®¾ç½®æ¹å¼é½ä¸è´ãè¿éç®åå举`æµå¼æ¶é´æ³æ¥è¯¢`å`鿵弿¶é´æ³æ¥è¯¢`ä¸¤ç§æ¹å¼ã |
| | | |
| | | ###### æµå¼æ¶é´æ³æ¥è¯¢ |
| | | |
| | | é对æµå¼è¿åçé³é¢æ°æ®ä¸ææ¶é´æ³çåºæ¯ï¼æ¥è¯¢èæ¶æå°ï¼ææ¶é´æ³æ°æ®ä¼å
éç¨æ¶é´æ³æ¹å¼ãæ¯æé³é¢ç±»åï¼`pcm`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æµå¼å¤çå¼å§ |
| | | mFUStaKit.notifyStaProcessStart(); |
| | | |
| | | ... |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å¤æ¬¡è°ç¨çï¼å³æ¯æ¬¡ææµå¼é³é¢è¿åé½ä¼éæ°è®¾ç½®`FUStaParams`å¹¶è°ç¨`staProcess(params)` |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setStreamMode(1)// 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤éæµå¼ |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setTimestamp(timestamp)// æ¶é´æ³æ°æ® |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼å
·ä½ç±»åè¦æ ¹æ®æ¶é´æ³çç±»åæ¥å® |
| | | .build(); |
| | | mFUStaKit.staProcessNoPlayer(params); |
| | | ... |
| | | |
| | | // æµå¼å¤çç»æ |
| | | mFUStaKit.notifyStaProcessFinish(); |
| | | |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | |
| | | |
| | | ###### 鿵弿¶é´æ³æ¥è¯¢ |
| | | |
| | | é坹鿵å¼è¿åçé³é¢æ°æ®ä¸ææ¶é´æ³çåºæ¯ï¼æ¥è¯¢èæ¶æå°ï¼ææ¶é´æ³æ°æ®ä¼å
éç¨æ¶é´æ³æ¹å¼ãæ¯æé³é¢ç±»åï¼`pcm\wav`ï¼æ ¹æ®é³é¢æ°æ®ä¿¡æ¯æ¥è¯¢å£åç³»æ°ï¼ææ¾é³é¢å¹¶é©±å¨å¯¹åºçå£åã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // å£åæ¥è¯¢ãé³é¢ææ¾å¹¶é©±å¨å¯¹åºå£åï¼è¿æ®µæ¯å¤æ¬¡è°ç¨çï¼å³æ¯æ¬¡ææµå¼é³é¢è¿åé½ä¼éæ°è®¾ç½®`FUStaParams`å¹¶è°ç¨`staProcess(params)` |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setTimestamp(timestamp)// æ¶é´æ³æ°æ® |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼å
·ä½ç±»åè¦æ ¹æ®æ¶é´æ³çç±»åæ¥å® |
| | | .build(); |
| | | mFUStaKit.staProcessNoPlayer(params); |
| | | |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | é³é¢æ¶é´æ³æä¸¤ç§ç±»åï¼é³ç´ æ¶é´æ³åæåæ¶é´æ³ï¼åå«å¯¹åº `FUTimestampType.PHONE` å `FUTimestampType.CHARACTER`ï¼æå
³é³ç´ æ¶é´æ³åææ¬æ¶é´æ³çåºå«å¯åè`12. FUStaParams åæ°é
置类`éé¢å¯¹æ¶é´æ³ç示ä¾ã |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼com.faceunity.fustademo.ui.SongActivity.SongSelectedListener#playã |
| | | |
| | | |
| | | #### 2ã设置SDKå£åæ¥è¯¢ç¶ææ¥å£ |
| | | |
| | | å¨`1ãèªå®ä¹ææ¾å¨æ¥è¯¢`䏿¥è¯¢å£åç³»æ°æ°æ®ï¼æ 论æµå¼æ¥è¯¢è¿æ¯éæµå¼æ¥è¯¢ï¼æä»¬é½è½å¤éè¿`OnStaProcessListener`æ¥å£è·å¾æ¥è¯¢ä¸æ¬¡å£åç³»æ°æ°æ®çåè°ï¼ |
| | | æä¸ªè¿ä¸ªåè°ï¼æä»¬å¯ä»¥è®¤ä¸ºç°å¨SDKå
é¨å·²ç»æå£åç³»æ°çç¼åäºï¼è¿æ¶åå°±å¯ä»¥å¼å§èªå®ä¹ææ¾å¨çææ¾ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setStaProcessListener(new OnStaProcessListener() { |
| | | @Override |
| | | public void onStaProcess(FUAudioProgressType audioProgressType, byte[] date) { |
| | | // 伪代ç |
| | | CustomPlayer.startPlay(); |
| | | } |
| | | }); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | å¯¹äºæµå¼æ¥è¯¢ï¼æä»¬å¯ä»¥å¨è¯¥æ¬¡æ¥è¯¢é¦æ¬¡`onStaProcess()`æ¹æ³åè°æ¶è°ç¨å¤é¨ææ¾å¨çææ¾æ¹æ³ï¼å¯¹äºéæµå¼æ¥è¯¢ï¼æä»¬å¯ä»¥å¨`onStaProcess()`æ¹æ³åè°æ¶è°ç¨å¤é¨ææ¾å¨çææ¾æ¹æ³ã |
| | | `onStaProcess()`æ¹æ³åè°å¨éUI线ç¨ã |
| | | |
| | | |
| | | #### 3ãå¤é¨ææ¾å¨ææ¾ç¶æåæ¥ |
| | | |
| | | å¨`2ã设置SDKå£åæ¥è¯¢ç¶ææ¥å£`æä»¬éè¿`OnStaProcessListener`æ¥å£ç¥éäºèªå®ä¹ææ¾å¨çææ¾æ¶æºï¼æ¥ä¸æ¥è¿è¡å¤é¨ææ¾å¨åSDKçç¶æåæ¥æè½é©±å¨å£åã |
| | | |
| | | * **èªå®ä¹ææ¾å¨ææ¥ç¶æåæ¥** |
| | | |
| | | å¤é¨ææ¾å¨ææ¾çç¶æ`is playing`éè¦åSDK忥ï¼SDKåªææ¥æ¶å°`playing`ä¿¡å·æè®¤ä¸ºå¤é¨ææ¾å¨å¼å§ææ¾ï¼è¿èæ ¹æ®ææ¾è¿åº¦é©±å¨å£åã |
| | | |
| | | CustomPlayer.startPlay() // å¤é¨ææ¾å¨ææ¾ï¼ä¼ªä»£ç ï¼ |
| | | mFUStaKit.onExternalPlayerStart(); // ææ¾å¨ææ¾ï¼éç¥SDKææ¾å¨ç¶æï¼playing |
| | | |
| | | CustomPlayer.pause(); // å¤é¨ææ¾å¨æåï¼ä¼ªä»£ç ï¼ |
| | | mFUStaKit.onExternalPlayerStop(); // ææ¾å¨æåï¼éç¥SDKææ¾å¨ç¶æï¼no playing |
| | | |
| | | CustomPlayer.resume(); // å¤é¨ææ¾å¨æ¢å¤ææ¾ï¼ä¼ªä»£ç ï¼ |
| | | mFUStaKit.onExternalPlayerStart(); // ææ¾å¨å¤ææ¾ï¼éç¥SDKææ¾å¨ç¶æï¼playing |
| | | |
| | | CustomPlayer.stop(); // å¤é¨ææ¾å¨åæ¢ææ¾ï¼ä¼ªä»£ç ï¼ |
| | | mFUStaKit.onExternalPlayerStop(); // ææ¾å¨åæ¢ææ¾ï¼éç¥SDKææ¾å¨ç¶æï¼no playing |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | * **èªå®ä¹ææ¾å¨ææ¥è¿åº¦åæ¥** |
| | | |
| | | å¤é¨ææ¾å¨ææ¾çè¿åº¦éè¿`OnExternalPlayerListener`ç`updateCurrentPosition()`åæ¥ææ¾è¿åº¦ç»SDKï¼SDKæ¥æ¶å°`playing`ä¿¡å·æ ¹æ®ææ¾è¿åº¦é©±å¨å£åã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setExternalPlayerListener(new OnExternalPlayerListener() { |
| | | @Override |
| | | public long updateCurrentPosition() { |
| | | return position; |
| | | } |
| | | }); |
| | | |
| | | 夿³¨ï¼è¯¥æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 195-202](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L195-L202)ã |
| | | |
| | | |
| | | ### 7. Alignæ¹å¼TAGæ ç¾åè½ |
| | | |
| | | é«çº§ç¨æ³ï¼éè¿é
ç½®`æ ç¾æ å°è¡¨`åå¨AlignTextä¸è®¾ç½®åºå®æ è®°ä½ï¼ææ¾è¿ç¨ä¸ç¨æ¥ç²¾ç¡®æ§å¶å½¢è±¡å¨ä½è¡ä¸ºçè½åï¼æ¯ææµå¼åéæµå¼ã |
| | | |
| | | ä¸»è¦æ¥éª¤å¦ä¸ï¼ |
| | | |
| | | #### 1ãé
ç½®æ ç¾æ å°è¡¨ |
| | | |
| | | `æ ç¾æ å°è¡¨`ï¼ä»¥JSON表示ï¼JSONä¸å段ä¸å¯éææ´æ¹ |
| | | |
| | | æ¹æ³ï¼`setAlignTagConfig(String tagConfig, String defaultAnimation)`ï¼ |
| | | æ¹æ³ä¼ å
¥åæ°ä¸»è¦æ¯`tagConfig`ï¼æ ç¾æ å°è¡¨ï¼`defaultAnimation`ï¼æ ç¾å¨ä½ææ¾å®æ¯ä¼åæ¢å°çå¨ä½è·¯å¾ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | JSON: |
| | | { |
| | | "tag": "#%欢è¿#%",// å¯¹åºæ ç¾ï¼å¯¹åºå¼ä¸ºåºå®æ ¼å¼çåæ®µï¼æä»¬è§å®çæ ç¾æ ¼å¼ï¼`#%å符#%`ï¼ |
| | | "emotion": "welcome emotion path",// 对åºè¡¨æ
bsè·¯å¾ï¼å¨æåæ¢è¡¨æ
|
| | | "animation": "sta/animation/STA_anim_real_def_chuchu_v3_huanying.bundle"// 对åºå¨ä½è·¯å¾ï¼å¯¹åºå¼ä¸ºå¨ä½çç»å¯¹è·¯å¾ã |
| | | }, |
| | | { |
| | | "tag": "#%åæå¼ºè°#%", |
| | | "animation": "sta/animation/STA_anim_real_def_chuchu_v3_danshouqiangdiao.bundle" |
| | | }, |
| | | { |
| | | "tag": "#%æå¼èµ°#%", |
| | | "animation": "sta/animation/STA_anim_real_def_chuchu_v3_zhiyinzou.bundle" |
| | | }, |
| | | { |
| | | "tag": "#%æ¯å¿#%", |
| | | "emotion": "default emotion path", |
| | | "animation": "sta/animation/STA_anim_real_def_chuchu_v3_bixin.bundle" |
| | | } |
| | | |
| | | // æ´æ°æ ç¾é
置表 |
| | | mFUStaKit.setAlignTagConfig(JSON, defaultAnimation); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | `setAlignTagConfig`å¿
é¡»è¦ä¼ å
¥`defaultAnimation`é»è®¤å¨ç»ï¼æ§è¡å®æ ç¾å¨ä½åä¼å¾ªç¯æ§è¡`defaultAnimation`å¨ç»ã |
| | | |
| | | |
| | | #### 2ã设置AlignText |
| | | |
| | | éè¿è¯¥ææ¬æå
¥`æ ç¾æ å°è¡¨`ä¸é
ç½®çæ ç¾ï¼åç»é³é¢é©±å¨æ¶é³é¢ææ¾å°æå
¥æ ç¾å
³é®åæ¶å°±ä¼åæ¢è¯¥æ ç¾å¹é
çå¨ä½å表æ
ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | é³é¢ææ¾å
容ï¼"大家好~ææ¯å°çãä¸é¢ç±ææ¥ä»ç»ä¸ä¸å
¬å¸ï¼æä»¬ä¸æ³¨äºæºè½å¾å½¢çåæ°ä¸åºç¨ï¼ä¸ºç§»å¨äºèç½æä¾3Då
容çæä¸äºå¨çè¡ä¸è§£å³æ¹æ¡ãè´åäºå°å¥½è±åçµå½±çº§çç¹æææ¯å¨æ¶è´¹çº§åºç¨ä¸çæ®åã"; |
| | | AlignTextï¼"大家好~ææ¯å°çãä¸é¢ç±ææ¥#%欢è¿#%ä»ç»ä¸ä¸å
¬å¸ï¼#%åæå¼ºè°#%æä»¬ä¸æ³¨äºæºè½å¾å½¢çåæ°ä¸åºç¨ï¼#%æå¼èµ°#%为移å¨äºèç½æä¾3Då
容çæä¸äºå¨çè¡ä¸è§£å³æ¹æ¡ã#%æ¯å¿#%è´åäºå°å¥½è±åçµå½±çº§çç¹æææ¯å¨æ¶è´¹çº§åºç¨ä¸çæ®åã"; |
| | | |
| | | FUStaParams params = new FUStaParams.Builder() |
| | | .setStreamMode(1)// 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤éæµå¼ |
| | | .setAudioData(data)// é³é¢æ°æ®ï¼æµå¼æ¥è¯¢è¦æ±åªè½æ¯PCM |
| | | .setAudioType(FUAudioType.PCM)// é³é¢ç±»å æµå¼æ¥è¯¢åªæ¯æpcm é»è®¤pcm |
| | | .setAlignText(align)// AlignText æ³¨ææ¤å¤è®¾ç½®çæ¯æ´æ®µçææ¬è䏿¯ä¸è¯¥æ®µé³é¢å¯¹åºçææ¬ |
| | | .setTimestampType(FUTimestampType.PHONE)// æ¶é´æ³ç±»åï¼`ALIGN` æ¹å¼è®¾ç½®ä¸º`FUTimestampType.PHONE` |
| | | .build(); |
| | | mFUStaKit.staProcess(params); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | ä¸è¿°ç¤ºä¾ä¸ï¼ææ¾å
容æ¶ï¼ä¼å¨âæ¥âå
³é®å忢#%欢è¿#%对åºçâSTA_anim_real_def_chuchu_v3_huanying.bundleâå¨ä½å对åºè¡¨æ
ã |
| | | âç¸âå
³é®å忢#%åæå¼ºè°#%对åºçâSTA_anim_real_def_chuchu_v3_danshouqiangdiao.bundleâå¨ä½å对åºè¡¨æ
ãåç»ç°è±¡åä¸ºè¯»å°ææå
¥æ ç¾å
³é®åæ¶åæ¢å¯¹åºå¨ä½å对åºè¡¨æ
ã |
| | | æåææ¾âè´åäºâå
³é®åä¹å忢#%æ¯å¿#%对åºçå¨ä½å表æ
ï¼æ¤æ¶é³é¢ææ¾å®æå¨ä½è¿æ²¡ææ¾å®æçè¯ä¹ä¼ç»§ç»ææ¾å¨ä½ï¼çå¨ä½ææ¾å®æ¯ä¼åæ¢å°é»è®¤å¨ä½ã |
| | | |
| | | |
| | | ### 8. Avatarå¨ç»åæ¢åè½ |
| | | |
| | | Avataråæ¢å¹¶ææ¾å
¶æ¯æçå¨ç»ï¼æ¯æåæ¬¡ææ¾åå¾ªç¯ææ¾ï¼æ¯æå¤éå
·åå¤éå
·å¨ä½åAvatarå¨ç»åæ¶æ§è¡ã |
| | | |
| | | * **å¾ªç¯ææ¾å¨ç»** |
| | | |
| | | æ¹æ³ï¼`playAnimation(String path, String[] prop, String[] propAnimation)` |
| | | |
| | | æ¹æ³ä¼ å
¥åæ°ï¼ |
| | | `path`ï¼Avatarè¦åæ¢çç®æ å¨ç»çè·¯å¾ã |
| | | `prop`ï¼Avatarè¦å è½½çéå
·çè·¯å¾æ°ç»ï¼ç¼ºçåæ°ã |
| | | `propAnimation`ï¼Avatarè¦å è½½çéå
·å¨ä½çè·¯å¾æ°ç»ï¼ç¼ºçåæ°ï¼ç¼ºçåæ°ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 忢å¨ä½ |
| | | mFUStaKit.playAnimation(animPath, prop, propAnimation); |
| | | æ |
| | | mFUStaKit.playAnimation(animPath); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 290-305](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L290-L305)ã |
| | | |
| | | |
| | | * **ææ¾åæ¬¡å¨ç»** |
| | | |
| | | æ¹æ³ï¼`playAnimationOnce(String path, String[] prop, String[] propAnimation)` |
| | | |
| | | æ¹æ³ä¼ å
¥åæ°ï¼ |
| | | `path`ï¼Avatarè¦åæ¢çç®æ å¨ç»çè·¯å¾ã |
| | | `prop`ï¼Avatarè¦å è½½çéå
·çè·¯å¾æ°ç»ï¼ç¼ºçåæ°ã |
| | | `propAnimation`ï¼Avatarè¦å è½½çéå
·å¨ä½çè·¯å¾æ°ç»ï¼ç¼ºçåæ°ï¼ç¼ºçåæ°ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 忢å¨ä½ |
| | | mFUStaKit.playAnimationOnce(animPath, prop, propAnimation); |
| | | æ |
| | | mFUStaKit.playAnimationOnce(animPath); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 290-305](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L290-L305)ã |
| | | |
| | | |
| | | ### 9. Avatar表æ
忢åè½ |
| | | |
| | | Avataråæ¢è¡¨æ
ï¼æ¯æSDKå
置表æ
åèªå®ä¹è¡¨æ
ã |
| | | |
| | | * **忢SDKå
置表æ
** |
| | | |
| | | æ¹æ³ï¼`updateEmotion(FUEmotionType emotionType, int fpsNum)` |
| | | |
| | | æ¹æ³ä¼ å
¥åæ°ï¼ |
| | | `FUEmotionType`ï¼SDKæ¯æçå
置表æ
çæä¸¾ã |
| | | `fpsNum`ï¼è¿æ¸¡å¸§ï¼å½å表æ
忢å°ç®æ 表æ
ç帧æ°ï¼é»è®¤ä¸º0ï¼ç¼ºçåæ°ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 忢å¨ä½ |
| | | mFUStaKit.updateEmotion(emotionType, 5); |
| | | æ |
| | | mFUStaKit.updateEmotion(emotionType); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | `FUEmotionType`详ç»ä»ç»è¯·åè`13. FUEmotionType SDKæ¯æçå
置表æ
çæä¸¾`ã |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 392-400](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L392-L400)ã |
| | | |
| | | * **忢SDKèªå®ä¹è¡¨æ
** |
| | | |
| | | æ¹æ³ï¼`updateCustomEmotion(String path, int fpsNum)` |
| | | |
| | | æ¹æ³ä¼ å
¥åæ°ï¼ |
| | | `path`ï¼èªå®ä¹è¡¨æ
bsæä»¶è·¯å¾ã |
| | | `fpsNum`ï¼è¿æ¸¡å¸§ï¼å½å表æ
忢å°ç®æ 表æ
ç帧æ°ï¼é»è®¤ä¸º0ï¼ç¼ºçåæ°ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 忢å¨ä½ |
| | | mFUStaKit.updateCustomEmotion(animPath, 5); |
| | | æ |
| | | mFUStaKit.updateCustomEmotion(animPath); |
| | | |
| | | 夿³¨ï¼ |
| | | |
| | | 该æ¥éª¤å¯åèéæDemoä¸ç示ä¾ä»£ç ï¼[AvatarDataFactory.java: Lines 392-400](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L392-L400)ã |
| | | |
| | | |
| | | ### 10. å¸¸ç¨æ¹æ³ |
| | | |
| | | * **设置3Dæé¯é½¿é
ç½®** |
| | | |
| | | 设置æé¯é½¿ï¼åå°æ¸²æçé¯é½¿æã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setMultiSamples(int samples);// samplesé»è®¤ä¸º4 |
| | | |
| | | |
| | | * **设置渲æå¸§ç** |
| | | |
| | | 设置渲æå¸§çã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setRenderFPS(int renderFPS);// renderFPSé»è®¤30 |
| | | |
| | | |
| | | * **SDK onResume()** |
| | | |
| | | ä¸sdk onPause()æå¯¹åºç°ï¼å¯¹åºActivity onResume()åå°ä¸å¿
è¦ç渲æä»èæé«æ§è½ï¼éå¿
éè°ç¨ï¼å¯ä¸è®¾ç½®è¯¥æ¹æ³ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.onResume(); |
| | | |
| | | |
| | | * **SDK onPause()** |
| | | |
| | | ä¸sdk onResume()æå¯¹åºç°ï¼å¯¹åºActivity onPause()åå°ä¸å¿
è¦ç渲æä»èæé«æ§è½ï¼éå¿
éè°ç¨ï¼å¯ä¸è®¾ç½®è¯¥æ¹æ³ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.onPause(); |
| | | |
| | | |
| | | * **SDK onDestroy()** |
| | | |
| | | Activity onDestroy()è°ç¨ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.onDestroy(); |
| | | |
| | | |
| | | * **Avataræ´æ°èæ¯** |
| | | |
| | | æ¯æèæ¯éå
·æ´æ°ãåæ°: èæ¯éå
·çç»å¯¹è·¯å¾ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setBackground(String background);// èæ¯åæ¢ï¼åæ°ä¸ºèæ¯éå
·è·¯å¾ |
| | | |
| | | |
| | | * **Avatarå
ç
§æ´æ°** |
| | | |
| | | æ¯æå
ç
§éå
·æ´æ°ãåæ°: ç¯å
éå
·çç»å¯¹è·¯å¾ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setLight(String light);// æ´æ°å
ç
§ï¼åæ°ä¸ºç¯å
éå
·è·¯å¾ |
| | | |
| | | |
| | | * **Avatarç¸æºä½æ´æ°** |
| | | |
| | | æ¯æç¸æºä½éå
·æ´æ°ãåæ°: ç¸æºä½éå
·çç»å¯¹è·¯å¾ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setCamera(String camera);// æ´æ°ç¸æºä½ï¼åæ°ä¸ºç¸æºéå
·è·¯å¾ |
| | | |
| | | |
| | | * **Avatarå¼å¯é´å½±** |
| | | |
| | | æ¯æå¼å¯é´å½±ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.enableShadow(String enableShadow);// æ¯å¦å¼å¯é´å½± |
| | | |
| | | |
| | | * **Avatarå¼å¯é´å½±æé¯é½¿** |
| | | |
| | | å¼å¯é´å½±æé¯é½¿ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setShadowPCFLevel(int level);// é´å½±é¯é½¿ç®æ³çº§å« |
| | | |
| | | |
| | | * **设置Avatarä½ç½®** |
| | | |
| | | 设置è§è²å¨ä¸ç»´ç©ºé´çä½ç½®ï¼åæ°: |
| | | xï¼double Xè½´åæ ä¸è¬è°æ´èå´ -200.0~200.0 |
| | | yï¼double Yè½´åæ ä¸è¬è°æ´èå´ -600.0~800.0 |
| | | zï¼double Zè½´åæ ä¸è¬è°æ´èå´ -3000.0~600.0 |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setPosition(xï¼y, z); |
| | | |
| | | |
| | | * **æè½¬å½¢è±¡** |
| | | |
| | | æè½¬è§è²ï¼åæ°:double 表示æè½¬å¢éï¼ä¸è¬è°æ´èå´ -1.0~1.0ï¼ææä¸ºæè½¬ |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setRotDelta(val) // æè½¬è§è² |
| | | |
| | | |
| | | * **缩æ¾å½¢è±¡** |
| | | |
| | | 缩æ¾è§è²ï¼åæ°:double 表示缩æ¾å¢éï¼ä¸è¬è°æ´èå´ -1.0~1.0ï¼ææä¸ºç¼©æ¾ |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setScaleDelta(val) // 缩æ¾è§è² |
| | | |
| | | |
| | | * **ä¸ä¸ç§»å¨å½¢è±¡** |
| | | |
| | | ä¸ä¸ç§»å¨è§è²ï¼åæ°:double 表示ä¸ä¸å¢éï¼ä¸è¬è°æ´èå´ -1.0~1.0ï¼ææä¸ºä¸ä¸ç§»å¨ |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setTranslateDelta(val) // ä¸ä¸ç§»å¨è§è² |
| | | |
| | | |
| | | * **设置æè½¬è§åº¦** |
| | | |
| | | 设置æè½¬è§åº¦ï¼åæ°:float 表示æè½¬è§åº¦ï¼ææä¸ºæè½¬ |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | mFUStaKit.setRotate(val) // 设置æè½¬è§åº¦ |
| | | |
| | | |
| | | * **Avatarå¨ç»æ¢å¤ææ¾** |
| | | |
| | | æ¢å¤ææ¾å½åå¨ç» |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // ç»§ç»ææ¾å½åå¨ç» |
| | | mFUStaKit.startCurrentAnimation(); |
| | | |
| | | |
| | | * **Avatarå¨ç»æåææ¾** |
| | | |
| | | æåææ¾å½åå¨ç» |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // æåææ¾å½åå¨ç» |
| | | mFUStaKit.pauseCurrentAnimation(); |
| | | |
| | | |
| | | * **设置Avatarå¨ç»çè¿æ¸¡æ¶é´** |
| | | |
| | | å¨ç»åæ¢æä¸ä¸ªè¿æ¸¡ï¼æ¤æ¹æ³è®¾ç½®å¨ä½åæ¢æ¶ï¼åå¨ä½å忢å¨ä½çè¿æ¸¡æ¶é´ã |
| | | åæ°ï¼è¿æ¸¡æ¶é´ï¼åä½ä¸ºç§ï¼é»è®¤ä¸º0.5 |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 设置å¨ä½çè¿æ¸¡æ¶é´ |
| | | mFUStaKit.setAnimationTransitionTime(time); |
| | | |
| | | |
| | | * **设置Avatarå¨ç»çææ¾é度** |
| | | |
| | | å¨ç»åæ¢æä¸ä¸ªè¿æ¸¡ï¼æ¤æ¹æ³è®¾ç½®å¨ä½ææ¾çé度ã |
| | | åæ°ï¼ææ¾é度æ¡ä½ï¼èå´0.2-5.0ï¼é»è®¤ä¸º1.0 |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | // 设置å¨ä½çææ¾é度 |
| | | mFUStaKit.setAnimationSpeed(speed); |
| | | |
| | | |
| | | * **设置æ¥å¿æ¯å¦è¾åºå°æä»¶** |
| | | |
| | | 设置SDKè¾åºå°æå®æ¬å°ç®å½ã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | // 设置æ¥å¿è¾åºçç®å½è·¯å¾ |
| | | mFUStaKit.setLogOutputDir(logcatDir) |
| | | // 设置æ¥å¿æ¯å¦è¾åºå°æä»¶ |
| | | mFUStaKit.enableLogOutput(enable); |
| | | |
| | | |
| | | ### 11. 鿝 FUStaKit å®ä¾ |
| | | |
| | | å¨éè¦éæ¯FUStaKitæ¶ï¼éæ¯SDKï¼éæ¾å
åèµæºã |
| | | |
| | | **示ä¾ä»£ç ï¼** |
| | | |
| | | ``` |
| | | mFUStaKit().release(); |
| | | ``` |
| | | |
| | | ### 12. FUStaParams åæ°é
置类 |
| | | |
| | | `streamMode` : 1 æµå¼æ¨¡å¼ï¼ 0 鿵弿¨¡å¼ é»è®¤ï¼0 |
| | | |
| | | `splitSegmentSeconds` : æµå¼å岿¯æ®µé´éï¼åä½ç§ é»è®¤ï¼2 |
| | | |
| | | `audioData` : é³é¢æ°æ® ç±»åï¼åèæ°ç» |
| | | |
| | | `audioType` : é³é¢ç±»å `FUAudioType.WAV`ï¼`FUAudioType.PCM`ï¼é»è®¤:`FUAudioType.PCM` |
| | | |
| | | `audioSampleRate` : éæ ·ç é»è®¤ï¼16Kï¼å¿
é¡»ä¸å
鍿æ¾å¨è®¾ç½®çéæ ·çä¸è´ |
| | | |
| | | `audioEncoding` : éæ ·ç²¾åº¦ é»è®¤ï¼16 |
| | | |
| | | `audioChannel` : 声鿰 é»è®¤ï¼ 1 |
| | | |
| | | `alignText` : é³é¢å¯¹åºçææ¬ |
| | | |
| | | `timestamp` : æ¶é´æ³ ç±»åï¼String ç¨äºå卿¶é´æ³çæ
åµ |
| | | ``` |
| | | æ¶é´æ³æ ¼å¼ç¤ºä¾: |
| | | 0.000000 0.070000 sil |
| | | 0.070000 0.105000 n |
| | | 0.105000 0.165000 i |
| | | 0.165000 0.275000 h |
| | | 0.275000 0.452000 ao |
| | | 0.452000 0.802000 sil |
| | | ``` |
| | | æ¯ä¸ªé³ç´ 以æ¢è¡ç¬¦\nåè¡ï¼æ¯è¡å
容åå«ä¸º:å¼å§æ¶é´ï¼ç»ææ¶é´ï¼é³ç´ |
| | | |
| | | `timestampType` ï¼ æ¶é´æ³ç±»å é³é¢æ°æ®ç±»å对åºçé³èæ¶é´æ³ï¼æä¸¤ç§ç±»åï¼é³ç´ ãæåæ¶é´æ³æ ¼å¼ï¼åå«å¯¹åº `FUTimestampType.PHONE` ã `FUTimestampType.CHARACTER` é»è®¤ï¼FUTimestampType.CHARACTER |
| | | ``` |
| | | é³ç´ ç±»åï¼æ¯å¦ï¼ |
| | | 0.0 0.075 SIL |
| | | 0.075 0.185 c |
| | | 0.185 0.315 ong |
| | | 0.315 0.41 m |
| | | 0.41 0.509 ing |
| | | 0.509 0.594 t |
| | | 0.594 0.779 ian |
| | | 0.779 0.98399997 q |
| | | 0.98399997 1.189 i |
| | | 1.189 1.511 SIL |
| | | |
| | | |
| | | ææ¬ç±»åï¼æ¯å¦ï¼ |
| | | 0.000000 1.871000 SIL |
| | | 1.872000 2.056000 æ |
| | | 2.057000 2.248000 ç |
| | | 2.249000 2.444000 ç¼ |
| | | 2.445000 2.993000 ç |
| | | 2.994000 3.313000 æ |
| | | 3.314000 3.680000 å |
| | | 3.681000 4.130000 çª |
| | | 4.131000 4.767000 å¤ |
| | | 4.767000 4.967000 SIL |
| | | ``` |
| | | |
| | | ### 13. FUEmotionType SDKæ¯æçå
置表æ
çæä¸¾ |
| | | |
| | | ``` |
| | | NONE : æ 表æ
ï¼ç¨ç¼ï¼è¡¨æ
è·éå¨ç»è¡¨æ
|
| | | DYNAMIC_NORMAL : æ£å¸¸è¡¨æ
|
| | | DYNAMIC_JOY : 卿å¼å¿ |
| | | DYNAMIC_ANGER : å¨æçæ° |
| | | DYNAMIC_DISGUST : 卿忶 |
| | | DYNAMIC_SURPRISE : 卿æè®¶ |
| | | DYNAMIC_FEAR : å¨æææ§ |
| | | DYNAMIC_TRUST : å¨æä¿¡ä»» |
| | | DYNAMIC_SADNESS : 卿æ²ä¼¤ |
| | | DYNAMIC_DOUBT : 卿çé® |
| | | ``` |
| | | |
| | | ### 14. 常è§é®é¢ |
| | | |
| | | * **å¦ä½è®©è·åæ¥å¿** |
| | | |
| | | è§£ç: |
| | | 1. å¨åå§åå设置`FUStaKit.setStaKitDebug(FUStaLogger.LogLevel.TRACE)`ã |
| | | 2. å£åé®é¢å¯ä»¥ç¨`FUSTA_LOG`è¿æ»¤ï¼æ¸²æé®é¢å¯ä»¥ç¨`KIT_SDKController`è¿æ»¤ã |
| | | |
| | | * **形象å 载失败\å è½½ä¸åºæ¥** |
| | | |
| | | è§£ç: |
| | | 1. æ£æ¥è¯ä¹¦æ¯å¦è¿æã |
| | | 2. æ£æ¥èµæºæä»¶ï¼bundleï¼è·¯å¾ï¼ç»å¯¹è·¯å¾ï¼æ¯å¦è®¾ç½®æ£ç¡®ã |
| | | 3. æ£æ¥å¹¶è°æ´å½¢è±¡ä½ç½®å¤§å°ã |
| | | 4. æ£æ¥FUStaSDKçæ¬ä¸è¦å è½½çèµæºæä»¶çæ¬æ¯å¦å¯¹åºã |
| | | |
| | | * **å½¢è±¡æ æ³é©±å¨å£å** |
| | | |
| | | è§£çï¼ |
| | | 1. æ£æ¥è¯ä¹¦æ¯å¦è¿æã |
| | | 2. æ£æ¥SDKåå§å设置ã |
| | | 3. æ£æ¥å½¢è±¡é©±å¨å£åæ¹æ³åæ°é
ç½®ã |
| | | 4. å¤é¨ææ¾å¨æ¯å¦è®¾ç½®äºå¼å§ææ¾æ¹æ³æè
ææ²¡æè®¾ç½®ææ¾è¿åº¦ã |
| | | 5. å¦æä½¿ç¨äºasræè
alignæ¹å¼ï¼æ£æ¥æ¯å¦å è½½äºæ©å±æ°æ®å
ã |
| | | 6. æ£æ¥ç®æ æ¶æåSDKææ¯ææ¶ææ¯å¦ä¸è´ã |
| | | 7. æ£æ¥æ¯å¦æç¬¬ä¸æ¹åºä¸SDKå²çªä¸å¼ååäºä»¥ä¸æä½ï¼æå
æ¶ç§»é¤é¡¹ç®ä¸çåºæä»¶æè®¾ç½®å¹é
å°ç¬¬ä¸ä¸ªåºæä»¶ã |
| | | |
| | | |
| | | * **å£åä¸åç¡®** |
| | | |
| | | è§£çï¼ |
| | | 1. æ£æ¥å½¢è±¡é©±å¨å£åæ¹æ³åæ°é
ç½®ã |
| | | 2. å¤é¨ææ¾å¨åæ¥å°SDKçææ¾è¿åº¦ä¸åç¡®ã |
| | | |
| | | * **èæ¯éæ** |
| | | |
| | | æäºéæ±åºæ¯å¸æå¯ä»¥å®ç°èæ¯éæçéæ±ï¼å¯åè以䏿¹å¼ã |
| | | |
| | | è§£çï¼ |
| | | 1. GLTextureView.setOpaque(false); |
| | | 2. mFUStaKit.setBackground(null); |
| | | |
| | | * **横ç«å±åæ¢** |
| | | |
| | | è§£çï¼ |
| | | 1. å¨AndroidManifest.xmlä¸é
ç½®Activity android:configChanges="orientation|screenSize"ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #### 2019.11.08 |
| | | |
| | | **1.1.1** |
| | | |
| | | - æ·»å é´ææ¹å¼ï¼ç®åæ¯æå¨çº¿é´æãtype1ãç¦»çº¿é´ætype2 |
| | | - ä¼åsdkåå§åæ°æ®å
æ¹æ³ |
| | | - æé«åºå±æ¥è¯¢é度ï¼éé
å¤è®¾å¤å½¢è±¡å±ç¤º |
| | | - æ´æ°å½¢è±¡å¨ä½èµæº |
| | | |
| | | #### 2019.11.26 |
| | | |
| | | **2.1.1** |
| | | |
| | | - æ´æ°æ·»å 形象å¨ä½èµæº |
| | | - å 餿§Alignåºå±åº |
| | | - æ·»å å½¢è±¡æ¯æç¹å®å
ç
§bundleãbsconfigdataï¼bsç³»æ°ï¼ |
| | | - æ´æ°staãsta_liteåºå±åº,æä½æ¯æå®å4.2çæ¬ |
| | | |
| | | #### 2019.12.25 |
| | | |
| | | **1.0** |
| | | |
| | | - åºäº2.1.1æ´æ°ç稳å®çæ¬ |
| | | - ä¿®å¤æµå¼ææ¾å¨bug |
| | | - æ´æ¢controllerãnamaãé»è®¤å
ç
§ï¼å级å¨ç»ç³»ç»ï¼controllerå¯å¤ç¨ï¼æ¯æèµæºæ°ç»åç¬ç«avatarèµæºå è½½ |
| | | - æ´æ°bsç³»æ°ï¼æ·»å bsèå |
| | | - æ¯æèµæºè·¯å¾å è½½æ¹å¼ï¼assets\sdcard |
| | | |
| | | #### 2020.01.15 |
| | | |
| | | **1.1** |
| | | |
| | | - ä¿®å¤ææ¾å¨bug |
| | | - æ´æ°åºå±åºï¼staåºæ¯ææµå¼æ¥è¯¢ï¼Alignæ¹å¼æ¯ææµå¼æ¥è¯¢ |
| | | - æ¿æ¢äºæµå¼æ¶é´æ³åæµå¼é³é¢é©±å¨å£åç®æ³ |
| | | - æ¯æé¿é³é¢æç
§éé³å¸§åå² |
| | | - ä¼å驱å¨é»è¾ |
| | | |
| | | #### 2020.04.1 |
| | | |
| | | **1.2** |
| | | |
| | | - å¢å sdkåå§ååè° |
| | | - æ´æ¹GLSurfaceView为GLTextureView,å®å
¨æ¯æèæ¯éææ¹æ¡ |
| | | - æ´æ°namaåcontroller,æ¯æç©ç卿 |
| | | - æ´æ°staå£ååºåç¸å
³é
ç½®æä»¶ |
| | | - ææ¾å¨æ°å¢cancle()åè° |
| | | - æ°å¢å¨ç»æåãæ¢å¤ææ¾æ¹æ³ |
| | | |
| | | #### 2020.06.9 |
| | | |
| | | **1.2.1** |
| | | |
| | | - å
é¨é»è¾ä¼å |
| | | - æ¯æå¨æåæ¢èæ¯bundleåèªå®ä¹èæ¯ |
| | | |
| | | #### 2020.07.6 |
| | | |
| | | **1.3** |
| | | |
| | | - æ¯æäºAlign模å¼çæ ç¾åè½ |
| | | - æ¯æç»åéå
·åæ¢ |
| | | - æ¯æå¨æé´å½±éå
· |
| | | - æ¯æè®¾ç½®å¨ç»è¿æ¸¡æ¶é´ |
| | | |
| | | #### 2020.01.20 |
| | | |
| | | **1.4** |
| | | |
| | | - æ´æ°staå£ååºï¼ä¼åå£å |
| | | - æ´æ°CNamaåºï¼ä¿®å¤æ¸²æç¸å
³bug |
| | | - æ°å¢å¨æé´å½±å¼å
³ |
| | | - æ°å¢æ¨¡åæè½¬ã缩æ¾ãä¸ä¸ç§»å¨çæ¹æ³ |
| | | - æ°å¢è¡¨æ
è¿æ¸¡å¼å
³ï¼æ´æ°è¡¨æ
bsæä»¶ |
| | | - ä¼åæ¥å¿å级æå°åè½ |
| | | - ä¼åèæ¯éæåèæ¯åæ¢ææ |
| | | - ä¼å代ç é»è¾ |
| | | |
| | | #### 2021.02.24 |
| | | |
| | | **1.4.1** |
| | | |
| | | - ä¼å表æ
忢å表æ
è¿æ¸¡åè½ |
| | | - ä¼åå£åææ¥ææ |
| | | - ä¿®å¤å
¶ä»å·²ç¥é®é¢ |
| | | |
| | | #### 2021.04.23 |
| | | |
| | | **1.5** |
| | | |
| | | - â½æâ¾å®ä¹å¸§ç |
| | | - â½æâ¾å®ä¹å辨ç |
| | | - â½æè¿â¾æ¶ä¿®æ¹æ ç¾é
置表 |
| | | - â½æè¾åºRGBABufferæ°æ® |
| | | - ä¼åéæèæ¯æé¯â»®ææ |
| | | - ä¼åå¤éå
·ç»åæ¥â¼ |
| | | - ä¿®å¤â¾å®ä¹èæ¯å¤±æçé®é¢ |
| | | |
| | | #### 2021.09.30 |
| | | |
| | | **2.0** |
| | | |
| | | - æ´æ°staå£ååº |
| | | - åºäºRender-Kitç»ä»¶æ¸²æ |
| | | - æ´æ°é¨åæ¹æ³å®ä¹ |
| | | - â½æå¨ææ´æ°æºä½ |
| | | - â½æå¨ææ´æ°å
ç
§ |
| | | |
| | | #### 2022.01.21 |
| | | |
| | | **2.1** |
| | | |
| | | - ä¼åCPUæ§è½ä»¥åæ¥è¯¢æç |
| | | - æ°å¢å¨ç»ææ¾é度æ§å¶æ¥å£ |
| | | - æ´æ°BSç³»æ°57-47 |
| | | - ä¿®å¤éé³å¸§é®é¢ |
| | | - â½æ°å¢è®¾ç½®æè½¬è§åº¦ |
| | | - ä¼åé´å½±é¯é½¿ç®æ³ |
| | | - å¢å è¯¦ç»æ¥å¿æ¥å£ |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | å¼å
³æºçåæµè¯æ¥å |
| | | æµè¯ç´ æï¼ |
| | | |
| | | æ |
| | | |
| | | æµè¯ç®çï¼ |
| | | |
| | | 确认18个å¼å
³æºç忝妿£å¸¸å¼å
³æº |
| | | |
| | | æµè¯æ¶é´ï¼ |
| | | |
| | | ç¬¬ä¸æ¹ï¼å¼å§æ¶é´2021-12-24 |
| | | ç»ææ¶é´2021-12-30 |
| | | |
| | | ç»ç«¯MACå°åï¼ |
| | | |
| | | 01ï¼0025E1033D53 |
| | | 02ï¼0025E1033CF6 |
| | | 03ï¼0025E1033D00 |
| | | 04ï¼0025E1033D02 |
| | | 05ï¼0025E1033CF3 |
| | | 06ï¼0025E1033D72 |
| | | 07ï¼0025E1033D66 |
| | | 08ï¼0025E1033A8B |
| | | 09ï¼0025E1033CF2 |
| | | 10ï¼0025E1033D5B |
| | | 11ï¼0025E1033D6F |
| | | 12ï¼0025E1033A61 |
| | | 13ï¼0025E1033D4A |
| | | 14ï¼0025E1033D68 |
| | | 15ï¼0025E1033D67 |
| | | 16ï¼0025E1033CE4 |
| | | 17ï¼0025E1033D47 |
| | | 18ï¼0025E1033DA1 |
| | | |
| | | æµè¯è¿ç¨ï¼ |
| | | |
| | | 1ã å°18å°å¼å
³æºçåæ¶é´è®¾ç½®ç»ä¸ï¼ç»ä¸å¾éå
³æºæ¶æ®µå
ä¸çµä¿æå¼æº |
| | | å¨ä¸è³å¨äºï¼08:15 â 09:00 |
| | | 09:10 â 10:00 |
| | | 10:10 â 12:00 |
| | | 12:10 â 13:00 |
| | | 13:10 â 18:00 |
| | | å¨å
å
¨å¤©å¼ |
| | | 卿¥å
¨å¤©å
³ |
| | | |
| | | ç»æï¼18å°å¼å
³æºçåå¨è§å®çæ¶é´æ£å¸¸å¼å
³æº |
| | | |
| | | |
| | | |
| | | æ»ç» |
| | | Macå°å为0025E1033CF2 线æ¥éäºï¼ä»¥ä¸æ¯å¾çï¼ |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #!/bin/bash |
| | | |
| | | #æ£æ¥æ¯å¦ä¸ºrootè´¦å· |
| | | if [ $(whoami) != "root" ];then |
| | | echo "请使ç¨rootæéæ§è¡" |
| | | exit 1; |
| | | fi |
| | | |
| | | #æ£æ¥æ¯å¦ä¸º64ä½ç³»ç» |
| | | is64bit=$(getconf LONG_BIT) |
| | | if [ "${is64bit}" != '64' ];then |
| | | Red_Error "请使ç¨64ä½ç³»ç»"; |
| | | fi |
| | | |
| | | #设å®è½¯ä»¶å®è£
ç®å½ä¸º/server |
| | | cd / |
| | | mkdir server |
| | | install_path="/server" |
| | | |
| | | #å®è£
JDK并设置ç¯å¢åé |
| | | mkdir $install_path/JDK |
| | | rm -rf $install_path/JDK/jdk-18.0.2.1/ |
| | | tar -xvf /Tools/jdk-18_linux-x64_bin.tar.gz -C $install_path/JDK |
| | | JAVA_HOME=$install_path/JDK/jdk-18.0.2.1 |
| | | echo export JAVA_HOME=$install_path/JDK/jdk-18.0.2.1 >> /etc/profile |
| | | echo export PATH=$JAVA_HOME/bin:$PATH >> /etc/profile |
| | | echo export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar >> /etc/profile |
| | | source /etc/profile |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #!/bin/bash |
| | | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
| | | export PATH |
| | | LANG=en_US.UTF-8 |
| | | |
| | | if [ $(whoami) != "root" ];then |
| | | echo "请使ç¨rootæéæ§è¡å®å¡å®è£
å½ä»¤ï¼" |
| | | exit 1; |
| | | fi |
| | | |
| | | is64bit=$(getconf LONG_BIT) |
| | | if [ "${is64bit}" != '64' ];then |
| | | Red_Error "æ±æ, å½å颿¿çæ¬ä¸æ¯æ32ä½ç³»ç», 请使ç¨64ä½ç³»ç»æå®è£
å®å¡5.9!"; |
| | | fi |
| | | |
| | | cd ~ |
| | | setup_path="/www" |
| | | python_bin=$setup_path/server/panel/pyenv/bin/python |
| | | cpu_cpunt=$(cat /proc/cpuinfo|grep processor|wc -l) |
| | | |
| | | if [ "$1" ];then |
| | | IDC_CODE=$1 |
| | | fi |
| | | |
| | | GetSysInfo(){ |
| | | if [ -s "/etc/redhat-release" ];then |
| | | SYS_VERSION=$(cat /etc/redhat-release) |
| | | elif [ -s "/etc/issue" ]; then |
| | | SYS_VERSION=$(cat /etc/issue) |
| | | fi |
| | | SYS_INFO=$(uname -a) |
| | | SYS_BIT=$(getconf LONG_BIT) |
| | | MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}') |
| | | CPU_INFO=$(getconf _NPROCESSORS_ONLN) |
| | | |
| | | echo -e ${SYS_VERSION} |
| | | echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO} |
| | | echo -e ${SYS_INFO} |
| | | echo -e "请æªå¾ä»¥ä¸æ¥éä¿¡æ¯åå¸è³è®ºåv7.hostcli.com/bbsæ±å©" |
| | | } |
| | | Red_Error(){ |
| | | echo '================================================='; |
| | | printf '\033[1;31;40m%b\033[0m\n' "$1"; |
| | | GetSysInfo |
| | | exit 1; |
| | | } |
| | | Lock_Clear(){ |
| | | if [ -f "/etc/bt_crack.pl" ];then |
| | | chattr -R -ia /www |
| | | chattr -ia /etc/init.d/bt |
| | | \cp -rpa /www/backup/panel/vhost/* /www/server/panel/vhost/ |
| | | mv /www/server/panel/BTPanel/__init__.bak /www/server/panel/BTPanel/__init__.py |
| | | rm -f /etc/bt_crack.pl |
| | | fi |
| | | } |
| | | Install_Check(){ |
| | | if [ "${INSTALL_FORCE}" ];then |
| | | return |
| | | fi |
| | | echo -e "----------------------------------------------------" |
| | | echo -e "æ£æ¥å·²æå
¶ä»Web/mysqlç¯å¢ï¼å®è£
å®å¡å¯è½å½±åç°æç«ç¹åæ°æ®" |
| | | echo -e "Web/mysql service is alreday installed,Can't install panel" |
| | | echo -e "----------------------------------------------------" |
| | | echo -e "å·²ç¥é£é©/Enter yes to force installation" |
| | | read -p "è¾å
¥yes强å¶å®è£
: " yes; |
| | | if [ "$yes" != "yes" ];then |
| | | echo -e "------------" |
| | | echo "åæ¶å®è£
" |
| | | exit; |
| | | fi |
| | | INSTALL_FORCE="true" |
| | | } |
| | | System_Check(){ |
| | | MYSQLD_CHECK=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql) |
| | | PHP_CHECK=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php) |
| | | NGINX_CHECK=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx) |
| | | HTTPD_CHECK=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep) |
| | | if [ "${PHP_CHECK}" ] || [ "${MYSQLD_CHECK}" ] || [ "${NGINX_CHECK}" ] || [ "${HTTPD_CHECK}" ];then |
| | | Install_Check |
| | | fi |
| | | } |
| | | Get_Pack_Manager(){ |
| | | if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then |
| | | PM="yum" |
| | | elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then |
| | | PM="apt-get" |
| | | fi |
| | | } |
| | | Auto_Swap() |
| | | { |
| | | swap=$(free |grep Swap|awk '{print $2}') |
| | | if [ "${swap}" -gt 1 ];then |
| | | echo "Swap total sizse: $swap"; |
| | | return; |
| | | fi |
| | | if [ ! -d /www ];then |
| | | mkdir /www |
| | | fi |
| | | swapFile="/www/swap" |
| | | dd if=/dev/zero of=$swapFile bs=1M count=1025 |
| | | mkswap -f $swapFile |
| | | swapon $swapFile |
| | | echo "$swapFile swap swap defaults 0 0" >> /etc/fstab |
| | | swap=`free |grep Swap|awk '{print $2}'` |
| | | if [ $swap -gt 1 ];then |
| | | echo "Swap total sizse: $swap"; |
| | | return; |
| | | fi |
| | | |
| | | sed -i "/\/www\/swap/d" /etc/fstab |
| | | rm -f $swapFile |
| | | } |
| | | Service_Add(){ |
| | | if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then |
| | | chkconfig --add bt |
| | | chkconfig --level 2345 bt on |
| | | elif [ "${PM}" == "apt-get" ]; then |
| | | update-rc.d bt defaults |
| | | fi |
| | | } |
| | | |
| | | get_node_url(){ |
| | | if [ ! -f /bin/curl ];then |
| | | if [ "${PM}" = "yum" ]; then |
| | | yum install curl -y |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | apt-get install curl -y |
| | | fi |
| | | fi |
| | | |
| | | echo '---------------------------------------------'; |
| | | echo "Selected download node..."; |
| | | download_Url='http://v7.hostcli.com'; |
| | | echo "Download node: $download_Url"; |
| | | echo '---------------------------------------------'; |
| | | } |
| | | Remove_Package(){ |
| | | local PackageNmae=$1 |
| | | if [ "${PM}" == "yum" ];then |
| | | isPackage=$(rpm -q ${PackageNmae}|grep "not installed") |
| | | if [ -z "${isPackage}" ];then |
| | | yum remove ${PackageNmae} -y |
| | | fi |
| | | elif [ "${PM}" == "apt-get" ];then |
| | | isPackage=$(dpkg -l|grep ${PackageNmae}) |
| | | if [ "${PackageNmae}" ];then |
| | | apt-get remove ${PackageNmae} -y |
| | | fi |
| | | fi |
| | | } |
| | | Install_RPM_Pack(){ |
| | | yumPath=/etc/yum.conf |
| | | Centos8Check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat') |
| | | isExc=$(cat $yumPath|grep httpd) |
| | | if [ "$isExc" = "" ];then |
| | | echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yumPath |
| | | fi |
| | | |
| | | #yumBaseUrl=$(cat /etc/yum.repos.d/CentOS-Base.repo|grep baseurl=http|cut -d '=' -f 2|cut -d '$' -f 1|head -n 1) |
| | | #[ "${yumBaseUrl}" ] && checkYumRepo=$(curl --connect-timeout 5 --head -s -o /dev/null -w %{http_code} ${yumBaseUrl}) |
| | | #if [ "${checkYumRepo}" != "200" ];then |
| | | # curl -Ss --connect-timeout 3 -m 60 http://download.bt.cn/install/yumRepo_select.sh|bash |
| | | #fi |
| | | |
| | | #å°è¯åæ¥æ¶é´(ä»bt.cn) |
| | | echo 'Synchronizing system time...' |
| | | getBtTime=$(curl -sS --connect-timeout 3 -m 60 http://v7.hostcli.com/api/index/get_time) |
| | | if [ "${getBtTime}" ];then |
| | | date -s "$(date -d @$getBtTime +"%Y-%m-%d %H:%M:%S")" |
| | | fi |
| | | |
| | | if [ -z "${Centos8Check}" ]; then |
| | | yum install ntp -y |
| | | rm -rf /etc/localtime |
| | | ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
| | | |
| | | #å°è¯åæ¥å½é
æ¶é´(ä»ntpæå¡å¨) |
| | | ntpdate 0.asia.pool.ntp.org |
| | | setenforce 0 |
| | | fi |
| | | |
| | | startTime=`date +%s` |
| | | |
| | | sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config |
| | | #yum remove -y python-requests python3-requests python-greenlet python3-greenlet |
| | | yumPacks="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel gcc libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel" |
| | | yum install -y ${yumPacks} |
| | | |
| | | for yumPack in ${yumPacks} |
| | | do |
| | | rpmPack=$(rpm -q ${yumPack}) |
| | | packCheck=$(echo ${rpmPack}|grep not) |
| | | if [ "${packCheck}" ]; then |
| | | yum install ${yumPack} -y |
| | | fi |
| | | done |
| | | if [ -f "/usr/bin/dnf" ]; then |
| | | dnf install -y redhat-rpm-config |
| | | fi |
| | | |
| | | ALI_OS=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3") |
| | | if [ -z "${ALI_OS}" ];then |
| | | yum install epel-release -y |
| | | fi |
| | | } |
| | | Install_Deb_Pack(){ |
| | | ln -sf bash /bin/sh |
| | | apt-get update -y |
| | | apt-get install ruby -y |
| | | apt-get install lsb-release -y |
| | | #apt-get install ntp ntpdate -y |
| | | #/etc/init.d/ntp stop |
| | | #update-rc.d ntp remove |
| | | #cat >>~/.profile<<EOF |
| | | #TZ='Asia/Shanghai'; export TZ |
| | | #EOF |
| | | #rm -rf /etc/localtime |
| | | #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
| | | #echo 'Synchronizing system time...' |
| | | #ntpdate 0.asia.pool.ntp.org |
| | | #apt-get upgrade -y |
| | | debPacks="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev gcc libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git"; |
| | | apt-get install -y $debPacks --force-yes |
| | | |
| | | for debPack in ${debPacks} |
| | | do |
| | | packCheck=$(dpkg -l ${debPack}) |
| | | if [ "$?" -ne "0" ] ;then |
| | | apt-get install -y debPack |
| | | fi |
| | | done |
| | | |
| | | if [ ! -d '/etc/letsencrypt' ];then |
| | | mkdir -p /etc/letsencryp |
| | | mkdir -p /var/spool/cron |
| | | if [ ! -f '/var/spool/cron/crontabs/root' ];then |
| | | echo '' > /var/spool/cron/crontabs/root |
| | | chmod 600 /var/spool/cron/crontabs/root |
| | | fi |
| | | fi |
| | | } |
| | | Install_Bt(){ |
| | | panelPort="8888" |
| | | if [ -f ${setup_path}/server/panel/data/port.pl ];then |
| | | panelPort=$(cat ${setup_path}/server/panel/data/port.pl) |
| | | fi |
| | | mkdir -p ${setup_path}/server/panel/logs |
| | | mkdir -p ${setup_path}/server/panel/vhost/apache |
| | | mkdir -p ${setup_path}/server/panel/vhost/nginx |
| | | mkdir -p ${setup_path}/server/panel/vhost/rewrite |
| | | mkdir -p ${setup_path}/server/panel/install |
| | | mkdir -p /www/server |
| | | mkdir -p /www/wwwroot |
| | | mkdir -p /www/wwwlogs |
| | | mkdir -p /www/backup/database |
| | | mkdir -p /www/backup/site |
| | | |
| | | if [ ! -f "/usr/bin/unzip" ]; then |
| | | if [ "${PM}" = "yum" ]; then |
| | | yum install unzip -y |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | apt-get install unzip -y |
| | | fi |
| | | fi |
| | | |
| | | if [ -f "/etc/init.d/bt" ]; then |
| | | /etc/init.d/bt stop |
| | | sleep 1 |
| | | fi |
| | | |
| | | wget -O panel.zip ${download_Url}/install/src/panel_new.zip -T 10 |
| | | wget -O /etc/init.d/bt ${download_Url}/install/src/bt6.init -T 10 |
| | | wget -O /www/server/panel/install/public.sh ${download_Url}/install/public.sh -T 10 |
| | | |
| | | if [ -f "${setup_path}/server/panel/data/default.db" ];then |
| | | if [ -d "/${setup_path}/server/panel/old_data" ];then |
| | | rm -rf ${setup_path}/server/panel/old_data |
| | | fi |
| | | mkdir -p ${setup_path}/server/panel/old_data |
| | | d_format=$(date +"%Y%m%d_%H%M%S") |
| | | \cp -arf ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/data/default_backup_${d_format}.db |
| | | mv -f ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/old_data/default.db |
| | | mv -f ${setup_path}/server/panel/data/system.db ${setup_path}/server/panel/old_data/system.db |
| | | mv -f ${setup_path}/server/panel/data/port.pl ${setup_path}/server/panel/old_data/port.pl |
| | | mv -f ${setup_path}/server/panel/data/admin_path.pl ${setup_path}/server/panel/old_data/admin_path.pl |
| | | fi |
| | | |
| | | unzip -o panel.zip -d ${setup_path}/server/ > /dev/null |
| | | |
| | | if [ -d "${setup_path}/server/panel/old_data" ];then |
| | | mv -f ${setup_path}/server/panel/old_data/default.db ${setup_path}/server/panel/data/default.db |
| | | mv -f ${setup_path}/server/panel/old_data/system.db ${setup_path}/server/panel/data/system.db |
| | | mv -f ${setup_path}/server/panel/old_data/port.pl ${setup_path}/server/panel/data/port.pl |
| | | mv -f ${setup_path}/server/panel/old_data/admin_path.pl ${setup_path}/server/panel/data/admin_path.pl |
| | | if [ -d "/${setup_path}/server/panel/old_data" ];then |
| | | rm -rf ${setup_path}/server/panel/old_data |
| | | fi |
| | | fi |
| | | |
| | | rm -f panel.zip |
| | | |
| | | if [ ! -f ${setup_path}/server/panel/tools.py ];then |
| | | Red_Error "ERROR: Failed to download, please try install again!" |
| | | fi |
| | | |
| | | rm -f ${setup_path}/server/panel/class/*.pyc |
| | | rm -f ${setup_path}/server/panel/*.pyc |
| | | |
| | | chmod +x /etc/init.d/bt |
| | | chmod -R 600 ${setup_path}/server/panel |
| | | chmod -R +x ${setup_path}/server/panel/script |
| | | ln -sf /etc/init.d/bt /usr/bin/bt |
| | | echo "${panelPort}" > ${setup_path}/server/panel/data/port.pl |
| | | wget -O /etc/init.d/bt ${download_Url}/install/src/bt7.init -T 10 |
| | | wget -O /www/server/panel/init.sh ${download_Url}/install/src/bt7.init -T 10 |
| | | } |
| | | Install_Python_Lib(){ |
| | | curl -Ss --connect-timeout 3 -m 60 $download_Url/install/pip_select.sh|bash |
| | | pyenv_path="/www/server/panel" |
| | | if [ -f $pyenv_path/pyenv/bin/python ];then |
| | | is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform') |
| | | if [ "$is_err" = "" ];then |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | is_package=$($python_bin -m psutil 2>&1|grep package) |
| | | if [ "$is_package" = "" ];then |
| | | wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip.txt -T 5 |
| | | $pyenv_path/pyenv/bin/pip install -U pip |
| | | $pyenv_path/pyenv/bin/pip install -U setuptools |
| | | $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt |
| | | fi |
| | | source $pyenv_path/pyenv/bin/activate |
| | | return |
| | | else |
| | | rm -rf $pyenv_path/pyenv |
| | | fi |
| | | fi |
| | | py_version="3.7.8" |
| | | mkdir -p $pyenv_path |
| | | os_type='el' |
| | | os_version='7' |
| | | is_export_openssl=0 |
| | | Get_Versions |
| | | Centos6_Openssl |
| | | Other_Openssl |
| | | echo "OS: $os_type - $os_version" |
| | | is_aarch64=$(uname -a|grep aarch64) |
| | | if [ "$is_aarch64" != "" ];then |
| | | os_version="aarch64" |
| | | fi |
| | | |
| | | if [ -f "/www/server/panel/pymake.pl" ];then |
| | | os_version="" |
| | | rm -f /www/server/panel/pymake.pl |
| | | fi |
| | | |
| | | if [ "${os_version}" != "" ];then |
| | | pyenv_file="/www/pyenv.tar.gz" |
| | | wget -O $pyenv_file $download_Url/install/pyenv/pyenv-${os_type}${os_version}-x${is64bit}.tar.gz -T 10 |
| | | tmp_size=$(du -b $pyenv_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $pyenv_file |
| | | echo "ERROR: Download python env fielded." |
| | | else |
| | | echo "Install python env..." |
| | | tar zxvf $pyenv_file -C $pyenv_path/ > /dev/null |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | if [ ! -f $pyenv_path/pyenv/bin/python ];then |
| | | rm -f $pyenv_file |
| | | Red_Error "ERROR: Install python env fielded." |
| | | fi |
| | | is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform') |
| | | if [ "$is_err" = "" ];then |
| | | rm -f $pyenv_file |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython |
| | | source $pyenv_path/pyenv/bin/activate |
| | | return |
| | | else |
| | | rm -f $pyenv_file |
| | | rm -rf $pyenv_path/pyenv |
| | | fi |
| | | fi |
| | | |
| | | fi |
| | | if [ -f /usr/local/openssl/lib/libssl.so ];then |
| | | export LDFLAGS="-L/usr/local/openssl/lib" |
| | | export CPPFLAGS="-I/usr/local/openssl/include" |
| | | export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig" |
| | | echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib" >> /etc/profile |
| | | source /etc/profile |
| | | fi |
| | | cd /www |
| | | python_src='/www/python_src.tar.xz' |
| | | python_src_path="/www/Python-${py_version}" |
| | | wget -O $python_src $download_Url/src/Python-${py_version}.tar.xz -T 5 |
| | | tmp_size=$(du -b $python_src|awk '{print $1}') |
| | | if [ $tmp_size -lt 10703460 ];then |
| | | rm -f $python_src |
| | | Red_Error "ERROR: Download python source code fielded." |
| | | fi |
| | | tar xvf $python_src |
| | | rm -f $python_src |
| | | cd $python_src_path |
| | | ./configure --prefix=$pyenv_path/pyenv |
| | | make -j$cpu_cpunt |
| | | make install |
| | | if [ ! -f $pyenv_path/pyenv/bin/python3.7 ];then |
| | | rm -rf $python_src_path |
| | | Red_Error "ERROR: Make python env fielded." |
| | | fi |
| | | cd ~ |
| | | rm -rf $python_src_path |
| | | wget -O $pyenv_path/pyenv/bin/activate $download_Url/install/pyenv/activate.panel -T 5 |
| | | wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip-3.7.8.txt -T 5 |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 $pyenv_path/pyenv/bin/pip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 $pyenv_path/pyenv/bin/python |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | $pyenv_path/pyenv/bin/pip install -U pip |
| | | $pyenv_path/pyenv/bin/pip install -U setuptools |
| | | $pyenv_path/pyenv/bin/pip install -U wheel==0.34.2 |
| | | $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt |
| | | source $pyenv_path/pyenv/bin/activate |
| | | } |
| | | Other_Openssl(){ |
| | | openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]') |
| | | if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then |
| | | opensslVersion="1.0.2r" |
| | | if [ ! -f "/usr/local/openssl/lib/libssl.so" ];then |
| | | cd /www |
| | | openssl_src_file=/www/openssl.tar.gz |
| | | wget -O $openssl_src_file ${download_Url}/src/openssl-${opensslVersion}.tar.gz |
| | | tmp_size=$(du -b $openssl_src_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $openssl_src_file |
| | | Red_Error "ERROR: Download openssl-1.0.2 source code fielded." |
| | | fi |
| | | tar -zxf $openssl_src_file |
| | | rm -f $openssl_src_file |
| | | cd openssl-${opensslVersion} |
| | | #zlib-dynamic shared |
| | | ./config --openssldir=/usr/local/openssl zlib-dynamic shared |
| | | make -j${cpuCore} |
| | | make install |
| | | echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/zopenssl.conf |
| | | ldconfig |
| | | cd .. |
| | | rm -rf openssl-${opensslVersion} |
| | | is_export_openssl=1 |
| | | cd ~ |
| | | fi |
| | | fi |
| | | } |
| | | Insatll_Libressl(){ |
| | | openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]') |
| | | if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then |
| | | opensslVersion="3.0.2" |
| | | cd /www |
| | | openssl_src_file=/www/openssl.tar.gz |
| | | wget -O $openssl_src_file ${download_Url}/install/pyenv/libressl-${opensslVersion}.tar.gz |
| | | tmp_size=$(du -b $openssl_src_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $openssl_src_file |
| | | Red_Error "ERROR: Download libressl-$opensslVersion source code fielded." |
| | | fi |
| | | tar -zxf $openssl_src_file |
| | | rm -f $openssl_src_file |
| | | cd libressl-${opensslVersion} |
| | | ./config âprefix=/usr/local/lib |
| | | make -j${cpuCore} |
| | | make install |
| | | ldconfig |
| | | ldconfig -v |
| | | cd .. |
| | | rm -rf libressl-${opensslVersion} |
| | | is_export_openssl=1 |
| | | cd ~ |
| | | fi |
| | | } |
| | | Centos6_Openssl(){ |
| | | if [ "$os_type" != 'el' ];then |
| | | return |
| | | fi |
| | | if [ "$os_version" != '6' ];then |
| | | return |
| | | fi |
| | | echo 'Centos6 install openssl-1.0.2...' |
| | | openssl_rpm_file="/www/openssl.rpm" |
| | | wget -O $openssl_rpm_file $download_Url/rpm/centos6/${is64bit}/bt-openssl102.rpm -T 10 |
| | | tmp_size=$(du -b $openssl_rpm_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 102400 ];then |
| | | rm -f $openssl_rpm_file |
| | | Red_Error "ERROR: Download python env fielded." |
| | | fi |
| | | rpm -ivh $openssl_rpm_file |
| | | rm -f $openssl_rpm_file |
| | | is_export_openssl=1 |
| | | } |
| | | Get_Versions(){ |
| | | redhat_version_file="/etc/redhat-release" |
| | | deb_version_file="/etc/issue" |
| | | if [ -f $redhat_version_file ];then |
| | | os_type='el' |
| | | is_aliyunos=$(cat $redhat_version_file|grep Aliyun) |
| | | if [ "$is_aliyunos" != "" ];then |
| | | return |
| | | fi |
| | | os_version=$(cat $redhat_version_file|grep CentOS|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]') |
| | | if [ "${os_version}" = "5" ];then |
| | | os_version="" |
| | | fi |
| | | else |
| | | os_type='ubuntu' |
| | | os_version=$(cat $deb_version_file|grep Ubuntu|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]+') |
| | | if [ "${os_version}" = "" ];then |
| | | os_type='debian' |
| | | os_version=$(cat $deb_version_file|grep Debian|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '[0-9]+') |
| | | if [ "${os_version}" = "" ];then |
| | | os_version=$(cat $deb_version_file|grep Debian|grep -Eo '[0-9]+') |
| | | fi |
| | | if [ "${os_version}" = "8" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "${is64bit}" = '32' ];then |
| | | os_version="" |
| | | fi |
| | | else |
| | | if [ "$os_version" = "14" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "$os_version" = "12" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "$os_version" = "19" ];then |
| | | os_version="" |
| | | fi |
| | | |
| | | fi |
| | | fi |
| | | } |
| | | Set_Bt_Panel(){ |
| | | password=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8) |
| | | sleep 1 |
| | | admin_auth="/www/server/panel/data/admin_path.pl" |
| | | if [ ! -f ${admin_auth} ];then |
| | | auth_path=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8) |
| | | echo "/${auth_path}" > ${admin_auth} |
| | | fi |
| | | auth_path=$(cat ${admin_auth}) |
| | | cd ${setup_path}/server/panel/ |
| | | /etc/init.d/bt start |
| | | $python_bin -m py_compile tools.py |
| | | $python_bin tools.py username |
| | | username=$($python_bin tools.py panel ${password}) |
| | | cd ~ |
| | | echo "${password}" > ${setup_path}/server/panel/default.pl |
| | | chmod 600 ${setup_path}/server/panel/default.pl |
| | | sleep 3 |
| | | /etc/init.d/bt restart |
| | | sleep 3 |
| | | isStart=$(ps aux |grep 'BT-Panel'|grep -v grep|awk '{print $2}') |
| | | LOCAL_CURL=$(curl 127.0.0.1:8888/login 2>&1 |grep -i html) |
| | | if [ -z "${isStart}" ] && [ -z "${LOCAL_CURL}" ];then |
| | | /etc/init.d/bt 22 |
| | | cd /www/server/panel/pyenv/bin |
| | | touch t.pl |
| | | ls -al python3.7 python |
| | | lsattr python3.7 python |
| | | Red_Error "ERROR: The BT-Panel service startup failed." |
| | | fi |
| | | } |
| | | Set_Firewall(){ |
| | | sshPort=$(cat /etc/ssh/sshd_config | grep 'Port '|awk '{print $2}') |
| | | if [ "${PM}" = "apt-get" ]; then |
| | | apt-get install -y ufw |
| | | if [ -f "/usr/sbin/ufw" ];then |
| | | ufw allow 20/tcp |
| | | ufw allow 21/tcp |
| | | ufw allow 22/tcp |
| | | ufw allow 80/tcp |
| | | ufw allow 888/tcp |
| | | ufw allow ${panelPort}/tcp |
| | | ufw allow ${sshPort}/tcp |
| | | ufw allow 39000:40000/tcp |
| | | ufw_status=`ufw status` |
| | | echo y|ufw enable |
| | | ufw default deny |
| | | ufw reload |
| | | fi |
| | | else |
| | | if [ -f "/etc/init.d/iptables" ];then |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${panelPort} -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${sshPort} -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 39000:40000 -j ACCEPT |
| | | #iptables -I INPUT -p tcp -m state --state NEW -m udp --dport 39000:40000 -j ACCEPT |
| | | iptables -A INPUT -p icmp --icmp-type any -j ACCEPT |
| | | iptables -A INPUT -s localhost -d localhost -j ACCEPT |
| | | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
| | | iptables -P INPUT DROP |
| | | service iptables save |
| | | sed -i "s#IPTABLES_MODULES=\"\"#IPTABLES_MODULES=\"ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp\"#" /etc/sysconfig/iptables-config |
| | | iptables_status=$(service iptables status | grep 'not running') |
| | | if [ "${iptables_status}" == '' ];then |
| | | service iptables restart |
| | | fi |
| | | else |
| | | AliyunCheck=$(cat /etc/redhat-release|grep "Aliyun Linux") |
| | | [ "${AliyunCheck}" ] && return |
| | | yum install firewalld -y |
| | | [ "${Centos8Check}" ] && yum reinstall python3-six -y |
| | | systemctl enable firewalld |
| | | systemctl start firewalld |
| | | firewall-cmd --set-default-zone=public > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=20/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=21/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=22/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=80/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=${panelPort}/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=${sshPort}/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=39000-40000/tcp > /dev/null 2>&1 |
| | | #firewall-cmd --permanent --zone=public --add-port=39000-40000/udp > /dev/null 2>&1 |
| | | firewall-cmd --reload |
| | | fi |
| | | fi |
| | | } |
| | | Get_Ip_Address(){ |
| | | getIpAddress="" |
| | | getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress) |
| | | if [ -z "${getIpAddress}" ] || [ "${getIpAddress}" = "0.0.0.0" ]; then |
| | | isHosts=$(cat /etc/hosts|grep 'v7.hostcli.com') |
| | | if [ -z "${isHosts}" ];then |
| | | #echo "" >> /etc/hosts |
| | | #echo "103.224.251.67 v7.hostcli.com" >> /etc/hosts |
| | | getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress) |
| | | if [ -z "${getIpAddress}" ];then |
| | | sed -i "/v7.hostcli.com/d" /etc/hosts |
| | | fi |
| | | fi |
| | | fi |
| | | |
| | | ipv4Check=$($python_bin -c "import re; print(re.match('^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$','${getIpAddress}'))") |
| | | if [ "${ipv4Check}" == "None" ];then |
| | | ipv6Address=$(echo ${getIpAddress}|tr -d "[]") |
| | | ipv6Check=$($python_bin -c "import re; print(re.match('^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$','${ipv6Address}'))") |
| | | if [ "${ipv6Check}" == "None" ]; then |
| | | getIpAddress="SERVER_IP" |
| | | else |
| | | echo "True" > ${setup_path}/server/panel/data/ipv6.pl |
| | | sleep 1 |
| | | /etc/init.d/bt restart |
| | | fi |
| | | fi |
| | | |
| | | if [ "${getIpAddress}" != "SERVER_IP" ];then |
| | | echo "${getIpAddress}" > ${setup_path}/server/panel/data/iplist.txt |
| | | fi |
| | | LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1) |
| | | } |
| | | Setup_Count(){ |
| | | curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/SetupCount?type=Linux\&o=$1 > /dev/null 2>&1 |
| | | if [ "$1" != "" ];then |
| | | echo $1 > /www/server/panel/data/o.pl |
| | | cd /www/server/panel |
| | | $python_bin tools.py o |
| | | fi |
| | | echo /www > /var/bt_setupPath.conf |
| | | } |
| | | Install_Main(){ |
| | | startTime=`date +%s` |
| | | Lock_Clear |
| | | System_Check |
| | | Get_Pack_Manager |
| | | get_node_url |
| | | |
| | | MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}') |
| | | if [ "${MEM_TOTAL}" -le "1" ];then |
| | | Auto_Swap |
| | | fi |
| | | |
| | | if [ "${PM}" = "yum" ]; then |
| | | Install_RPM_Pack |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | Install_Deb_Pack |
| | | fi |
| | | |
| | | Install_Python_Lib |
| | | Install_Bt |
| | | |
| | | |
| | | Set_Bt_Panel |
| | | Service_Add |
| | | Set_Firewall |
| | | |
| | | Get_Ip_Address |
| | | Setup_Count ${IDC_CODE} |
| | | } |
| | | |
| | | echo " |
| | | +---------------------------------------------------------------------- |
| | | | hostcli.com FOR CentOS/Ubuntu/Debian |
| | | +---------------------------------------------------------------------- |
| | | | Copyright © 2015-2099 HostCli(http://v7.hostcli.com) All rights reserved. |
| | | +---------------------------------------------------------------------- |
| | | | The WebPanel URL will be http://SERVER_IP:8888 when installed. |
| | | +---------------------------------------------------------------------- |
| | | " |
| | | while [ "$go" != 'y' ] && [ "$go" != 'n' ] |
| | | do |
| | | read -p "Do you want to install Bt-Panel to the $setup_path directory now?(y/n): " go; |
| | | done |
| | | |
| | | if [ "$go" == 'n' ];then |
| | | exit; |
| | | fi |
| | | |
| | | Install_Main |
| | | echo > /www/server/panel/data/bind.pl |
| | | echo -e "==================================================================" |
| | | echo -e "\033[32mCongratulations! Installed successfully!\033[0m" |
| | | echo -e "==================================================================" |
| | | echo "å¤ç½é¢æ¿å°å: http://${getIpAddress}:${panelPort}${auth_path}" |
| | | echo "å
ç½é¢æ¿å°å: http://${LOCAL_IP}:${panelPort}${auth_path}" |
| | | echo -e "username: $username" |
| | | echo -e "password: $password" |
| | | echo -e "\033[33mIf you cannot access the panel,\033[0m" |
| | | echo -e "\033[33mrelease the following panel port [${panelPort}] in the security group\033[0m" |
| | | echo -e "\033[33mè¥æ æ³è®¿é®é¢æ¿ï¼è¯·æ£æ¥é²ç«å¢/å®å
¨ç»æ¯å¦ææ¾è¡é¢æ¿[${panelPort}]端å£\033[0m" |
| | | echo -e "==================================================================" |
| | | |
| | | endTime=`date +%s` |
| | | ((outTime=($endTime-$startTime)/60)) |
| | | echo -e "Time consumed:\033[32m $outTime \033[0mMinute!" |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server |
| | | { |
| | | listen 80; |
| | | server_name gaga.com aa.com bb.com; |
| | | index index.html index.htm default.htm default.html; |
| | | root /www/wwwroot/gaga.com; |
| | | |
| | | #SSL-START SSLç¸å
³é
ç½® |
| | | #error_page 404/404.html; |
| | | |
| | | #SSL-END |
| | | |
| | | #ERROR-PAGE-START é误页ç¸å
³é
ç½® |
| | | #error_page 404 /404.html; |
| | | #error_page 502 /502.html; |
| | | #ERROR-PAGE-END |
| | | |
| | | |
| | | #REWRITE-START 伪éæç¸å
³é
ç½® |
| | | include /www/server/panel/vhost/rewrite/java_gaga.com.conf; |
| | | #REWRITE-END |
| | | |
| | | #ç¦æ¢è®¿é®çæä»¶æç®å½ |
| | | location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env|node_modules) { |
| | | return 404; |
| | | } |
| | | |
| | | #ä¸é®ç³è¯·SSLè¯ä¹¦éªè¯ç®å½ç¸å
³è®¾ç½® |
| | | location /.well-known/ { |
| | | root /www/wwwroot/java_node_ssl; |
| | | } |
| | | |
| | | # HTTPåå代çç¸å
³é
ç½®å¼å§ >>> |
| | | location ~ /purge(/.*) { |
| | | proxy_cache_purge cache_one gaga.com$request_uri$is_args$args; |
| | | } |
| | | |
| | | location / { |
| | | proxy_pass http://127.0.0.1:8231; |
| | | proxy_set_header Host gaga.com:$server_port; |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | proxy_set_header REMOTE-HOST $remote_addr; |
| | | add_header X-Cache $upstream_cache_status; |
| | | |
| | | proxy_connect_timeout 30s; |
| | | proxy_read_timeout 86400s; |
| | | proxy_send_timeout 30s; |
| | | proxy_http_version 1.1; |
| | | proxy_set_header Upgrade $http_upgrade; |
| | | proxy_set_header Connection "upgrade"; |
| | | } |
| | | # HTTPåå代çç¸å
³é
ç½®ç»æ <<< |
| | | |
| | | access_log /www/wwwlogs/gaga.com.log; |
| | | error_log /www/wwwlogs/gaga.com.error.log; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server |
| | | { |
| | | listen 80; |
| | | server_name wa.cn; |
| | | index index.html index.htm default.htm default.html; |
| | | root /www/wwwroot/wa.cn; |
| | | |
| | | #SSL-START SSLç¸å
³é
ç½® |
| | | #error_page 404/404.html; |
| | | |
| | | #SSL-END |
| | | |
| | | #ERROR-PAGE-START é误页ç¸å
³é
ç½® |
| | | #error_page 404 /404.html; |
| | | #error_page 502 /502.html; |
| | | #ERROR-PAGE-END |
| | | |
| | | |
| | | #REWRITE-START 伪éæç¸å
³é
ç½® |
| | | include /www/server/panel/vhost/rewrite/java_wa.cn.conf; |
| | | #REWRITE-END |
| | | |
| | | #ç¦æ¢è®¿é®çæä»¶æç®å½ |
| | | location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env|node_modules) { |
| | | return 404; |
| | | } |
| | | |
| | | #ä¸é®ç³è¯·SSLè¯ä¹¦éªè¯ç®å½ç¸å
³è®¾ç½® |
| | | location /.well-known/ { |
| | | root /www/wwwroot/java_node_ssl; |
| | | } |
| | | |
| | | # HTTPåå代çç¸å
³é
ç½®å¼å§ >>> |
| | | location ~ /purge(/.*) { |
| | | proxy_cache_purge cache_one wa.cn$request_uri$is_args$args; |
| | | } |
| | | |
| | | location / { |
| | | proxy_pass http://127.0.0.1:99; |
| | | proxy_set_header Host wa.cn:$server_port; |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | proxy_set_header REMOTE-HOST $remote_addr; |
| | | add_header X-Cache $upstream_cache_status; |
| | | |
| | | proxy_connect_timeout 30s; |
| | | proxy_read_timeout 86400s; |
| | | proxy_send_timeout 30s; |
| | | proxy_http_version 1.1; |
| | | proxy_set_header Upgrade $http_upgrade; |
| | | proxy_set_header Connection "upgrade"; |
| | | } |
| | | # HTTPåå代çç¸å
³é
ç½®ç»æ <<< |
| | | |
| | | access_log /www/wwwlogs/wa.cn.log; |
| | | error_log /www/wwwlogs/wa.cn.error.log; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!-- |
| | | Licensed to the Apache Software Foundation (ASF) under one or more |
| | | contributor license agreements. See the NOTICE file distributed with |
| | | this work for additional information regarding copyright ownership. |
| | | The ASF licenses this file to You under the Apache License, Version 2.0 |
| | | (the "License"); you may not use this file except in compliance with |
| | | the License. You may obtain a copy of the License at |
| | | |
| | | http://www.apache.org/licenses/LICENSE-2.0 |
| | | |
| | | Unless required by applicable law or agreed to in writing, software |
| | | distributed under the License is distributed on an "AS IS" BASIS, |
| | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| | | See the License for the specific language governing permissions and |
| | | limitations under the License. |
| | | --> |
| | | <!-- |
| | | |
| | | Context configuration file for the Tomcat Manager Web App |
| | | |
| | | --> |
| | | <Context docBase="${catalina.home}/webapps/manager" |
| | | privileged="true" antiResourceLocking="false" antiJARLocking="false"> |
| | | <Valve className="org.apache.catalina.valves.RemoteAddrValve" |
| | | allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> |
| | | <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> |
| | | </Context> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | #user nobody; |
| | | worker_processes 1; |
| | | |
| | | #error_log logs/error.log; |
| | | #error_log logs/error.log notice; |
| | | #error_log logs/error.log info; |
| | | |
| | | #pid logs/nginx.pid; |
| | | |
| | | |
| | | events { |
| | | worker_connections 1024; |
| | | } |
| | | |
| | | |
| | | http { |
| | | include mime.types; |
| | | default_type application/octet-stream; |
| | | |
| | | server_tokens off; |
| | | sendfile on; |
| | | #tcp_nopush on; |
| | | client_max_body_size 5m; |
| | | |
| | | #keepalive_timeout 0; |
| | | keepalive_timeout 65; |
| | | |
| | | #gzip on; |
| | | |
| | | server { |
| | | listen 80 default_server; |
| | | listen 8888 default_server; |
| | | server_name _; |
| | | return 444; |
| | | } |
| | | |
| | | server { |
| | | listen 8888; |
| | | server_name oa.shiyi.tv oa.brawin.cn; |
| | | #强å¶è½¬HTTPS |
| | | #rewrite ^(.*)$ https://$host$1 permanent; |
| | | |
| | | #强å¶ååè®¿é® |
| | | # if ($host != oa.shiyi.tv) { |
| | | # return 403; |
| | | # } |
| | | |
| | | #charset koi8-r; |
| | | |
| | | #access_log logs/host.access.log main; |
| | | |
| | | #ç¦æ¢Scrapyçç¬è«å·¥å
·çæå,妿ç¨å°ç¾åº¦æ¶å½ï¼è¿éå°±è¦æ³¨éæ |
| | | if ($http_user_agent ~* "Scrapy|Sogou web spider|Baiduspider") { |
| | | return 403; |
| | | } |
| | | |
| | | #ç¦æ¢æå®UAåUA为空çè®¿é® |
| | | if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$"){ |
| | | return 403; |
| | | } |
| | | |
| | | #ç¦æ¢éGET|HEAD|POSTæ¹å¼çæå,æ¤å¤å¯è½ä¼å¯¼è´ç½é¡µæä¸å¼ |
| | | #if ($request_method !~ A(GET|HEAD|POST)$) { |
| | | # return 403; |
| | | # } |
| | | |
| | | #éå¯¹ç¹æ®çuser_agentçè®¿é® |
| | | if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") { |
| | | return 404; |
| | | } |
| | | |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | #proxy_set_header Host $host; |
| | | proxy_set_header Upgrade-Insecure-Requests 1; |
| | | proxy_set_header X-Forwarded-Proto https; |
| | | proxy_read_timeout 300; |
| | | |
| | | location / { |
| | | root html; |
| | | index index.html index.htm; |
| | | proxy_pass http://192.168.1.91:80; |
| | | proxy_redirect off; |
| | | proxy_set_header Host $host; |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | proxy_http_version 1.1; |
| | | proxy_set_header Upgrade $http_upgrade; |
| | | proxy_set_header Connection "upgrade"; |
| | | |
| | | } |
| | | |
| | | error_page 500 502 503 504 /50x.html; |
| | | location = /50x.html { |
| | | root html; |
| | | } |
| | | |
| | | } |
| | | |
| | | server { |
| | | listen 80; |
| | | server_name oa.shiyi.tv oa.brawin.cn; |
| | | #强å¶è½¬HTTPS |
| | | #rewrite ^(.*)$ https://$host$1 permanent; |
| | | |
| | | #强å¶ååè®¿é® |
| | | # if ($host != oa.shiyi.tv) { |
| | | # return 403; |
| | | # } |
| | | |
| | | #charset koi8-r; |
| | | |
| | | #access_log logs/host.access.log main; |
| | | |
| | | #ç¦æ¢Scrapyçç¬è«å·¥å
·çæå,妿ç¨å°ç¾åº¦æ¶å½ï¼è¿éå°±è¦æ³¨éæ |
| | | if ($http_user_agent ~* "Scrapy|Sogou web spider|Baiduspider") { |
| | | return 403; |
| | | } |
| | | |
| | | #ç¦æ¢æå®UAåUA为空çè®¿é® |
| | | if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$"){ |
| | | return 403; |
| | | } |
| | | |
| | | #ç¦æ¢éGET|HEAD|POSTæ¹å¼çæå,æ¤å¤å¯è½ä¼å¯¼è´ç½é¡µæä¸å¼ |
| | | #if ($request_method !~ A(GET|HEAD|POST)$) { |
| | | # return 403; |
| | | # } |
| | | |
| | | #éå¯¹ç¹æ®çuser_agentçè®¿é® |
| | | if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") { |
| | | return 404; |
| | | } |
| | | |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | #proxy_set_header Host $host; |
| | | proxy_set_header Upgrade-Insecure-Requests 1; |
| | | proxy_set_header X-Forwarded-Proto https; |
| | | proxy_read_timeout 300; |
| | | |
| | | location / { |
| | | root html; |
| | | index index.html index.htm; |
| | | proxy_pass http://192.168.1.91:80; |
| | | proxy_redirect off; |
| | | proxy_set_header Host $host; |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | proxy_http_version 1.1; |
| | | proxy_set_header Upgrade $http_upgrade; |
| | | proxy_set_header Connection "upgrade"; |
| | | |
| | | } |
| | | |
| | | error_page 500 502 503 504 /50x.html; |
| | | location = /50x.html { |
| | | root html; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server |
| | | { |
| | | listen 80; |
| | | server_name nn.cn 192.168.1.233; |
| | | index index.php index.html index.htm default.php default.htm default.html; |
| | | root /www/wwwroot/nn.cn; |
| | | |
| | | #SSL-START SSLç¸å
³é
ç½®ï¼è¯·å¿å é¤æä¿®æ¹ä¸ä¸è¡å¸¦æ³¨éç404è§å |
| | | #error_page 404/404.html; |
| | | #SSL-END |
| | | |
| | | #ERROR-PAGE-START é误页é
ç½®ï¼å¯ä»¥æ³¨éãå é¤æä¿®æ¹ |
| | | #error_page 404 /404.html; |
| | | #error_page 502 /502.html; |
| | | #ERROR-PAGE-END |
| | | |
| | | #PHP-INFO-START PHPå¼ç¨é
ç½®ï¼å¯ä»¥æ³¨éæä¿®æ¹ |
| | | include enable-php-00.conf; |
| | | #PHP-INFO-END |
| | | |
| | | #REWRITE-START URLéåè§åå¼ç¨,ä¿®æ¹åå°å¯¼è´é¢æ¿è®¾ç½®ç伪éæè§å失æ |
| | | include /www/server/panel/vhost/rewrite/nn.cn.conf; |
| | | #REWRITE-END |
| | | |
| | | #ç¦æ¢è®¿é®çæä»¶æç®å½ |
| | | location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) |
| | | { |
| | | return 404; |
| | | } |
| | | |
| | | #ä¸é®ç³è¯·SSLè¯ä¹¦éªè¯ç®å½ç¸å
³è®¾ç½® |
| | | location ~ \.well-known{ |
| | | allow all; |
| | | } |
| | | |
| | | location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ |
| | | { |
| | | expires 30d; |
| | | error_log /dev/null; |
| | | access_log /dev/null; |
| | | } |
| | | |
| | | location ~ .*\.(js|css)?$ |
| | | { |
| | | expires 12h; |
| | | error_log /dev/null; |
| | | access_log /dev/null; |
| | | } |
| | | access_log /www/wwwlogs/nn.cn.log; |
| | | error_log /www/wwwlogs/nn.cn.error.log; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server { |
| | | listen 80; |
| | | server_name 127.0.0.1; |
| | | allow 127.0.0.1; |
| | | location /nginx_status { |
| | | stub_status on; |
| | | access_log off; |
| | | } |
| | | location /phpfpm_52_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-52.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_53_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-53.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_54_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-54.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_55_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-55.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_56_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-56.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_70_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-70.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_71_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-71.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_72_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-72.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_73_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-73.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_74_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-74.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_80_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-80.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | location /phpfpm_81_status { |
| | | fastcgi_pass unix:/tmp/php-cgi-81.sock; |
| | | include fastcgi_params; |
| | | fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Server port="5712" shutdown="SHUTDOWN"> |
| | | <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> |
| | | <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener" /> |
| | | <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> |
| | | <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> |
| | | <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> |
| | | <GlobalNamingResources> |
| | | <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" /> |
| | | </GlobalNamingResources> |
| | | <Service name="Catalina"> |
| | | <Connector connectionTimeout="20000" port="99" protocol="HTTP/1.1" redirectPort="8490" /> |
| | | <Engine defaultHost="localhost" name="Catalina"> |
| | | <Realm className="org.apache.catalina.realm.LockOutRealm"> |
| | | <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> |
| | | </Realm> |
| | | <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> |
| | | <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt" /> |
| | | </Host> |
| | | <Host autoDeploy="true" name="wa.cn" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"> |
| | | <Context crossContext="true" docBase="/www/wwwroot/wa.cn" path="" reloadable="true" /> |
| | | </Host> |
| | | </Engine> |
| | | </Service> |
| | | </Server> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="ISO-8859-1"?> |
| | | <!-- |
| | | Licensed to the Apache Software Foundation (ASF) under one or more |
| | | contributor license agreements. See the NOTICE file distributed with |
| | | this work for additional information regarding copyright ownership. |
| | | The ASF licenses this file to You under the Apache License, Version 2.0 |
| | | (the "License"); you may not use this file except in compliance with |
| | | the License. You may obtain a copy of the License at |
| | | |
| | | http://www.apache.org/licenses/LICENSE-2.0 |
| | | |
| | | Unless required by applicable law or agreed to in writing, software |
| | | distributed under the License is distributed on an "AS IS" BASIS, |
| | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| | | See the License for the specific language governing permissions and |
| | | limitations under the License. |
| | | --> |
| | | |
| | | <web-app xmlns="http://java.sun.com/xml/ns/javaee" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://java.sun.com/xml/ns/javaee |
| | | http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" |
| | | version="3.0" |
| | | metadata-complete="true"> |
| | | |
| | | <display-name>Tomcat Host Manager Application</display-name> |
| | | <description> |
| | | A scriptable host management web application for the Tomcat Web Server; |
| | | Manager lets you view, create and remove virtual hosts. |
| | | </description> |
| | | |
| | | <servlet> |
| | | <servlet-name>HostManager</servlet-name> |
| | | <servlet-class>org.apache.catalina.manager.host.HostManagerServlet</servlet-class> |
| | | <init-param> |
| | | <param-name>debug</param-name> |
| | | <param-value>2</param-value> |
| | | </init-param> |
| | | </servlet> |
| | | <servlet> |
| | | <servlet-name>HTMLHostManager</servlet-name> |
| | | <servlet-class>org.apache.catalina.manager.host.HTMLHostManagerServlet</servlet-class> |
| | | <init-param> |
| | | <param-name>debug</param-name> |
| | | <param-value>2</param-value> |
| | | </init-param> |
| | | </servlet> |
| | | |
| | | <filter> |
| | | <filter-name>SetCharacterEncoding</filter-name> |
| | | <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> |
| | | <init-param> |
| | | <param-name>encoding</param-name> |
| | | <param-value>UTF-8</param-value> |
| | | </init-param> |
| | | </filter> |
| | | |
| | | <filter-mapping> |
| | | <filter-name>SetCharacterEncoding</filter-name> |
| | | <url-pattern>/*</url-pattern> |
| | | </filter-mapping> |
| | | |
| | | <filter> |
| | | <filter-name>CSRF</filter-name> |
| | | <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class> |
| | | <init-param> |
| | | <param-name>entryPoints</param-name> |
| | | <param-value>/html,/html/,/html/list,/index.jsp</param-value> |
| | | </init-param> |
| | | </filter> |
| | | |
| | | <!-- Configured to set X-FRAME-OPTIONS. Disable HSTS in case it interferes --> |
| | | <!-- with an existing setting. Keep X-Content-Type-Options and --> |
| | | <!-- X-XSS-Protection as they are page specific. --> |
| | | <filter> |
| | | <filter-name>HTTP header security filter</filter-name> |
| | | <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> |
| | | <init-param> |
| | | <param-name>hstsEnabled</param-name> |
| | | <param-value>false</param-value> |
| | | </init-param> |
| | | </filter> |
| | | |
| | | <filter-mapping> |
| | | <filter-name>CSRF</filter-name> |
| | | <servlet-name>HTMLHostManager</servlet-name> |
| | | </filter-mapping> |
| | | |
| | | <filter-mapping> |
| | | <filter-name>HTTP header security filter</filter-name> |
| | | <url-pattern>/*</url-pattern> |
| | | </filter-mapping> |
| | | |
| | | <!-- Define the Manager Servlet Mapping --> |
| | | <servlet-mapping> |
| | | <servlet-name>HostManager</servlet-name> |
| | | <url-pattern>/text/*</url-pattern> |
| | | </servlet-mapping> |
| | | <servlet-mapping> |
| | | <servlet-name>HTMLHostManager</servlet-name> |
| | | <url-pattern>/html/*</url-pattern> |
| | | </servlet-mapping> |
| | | |
| | | <!-- Define a Security Constraint on this Application --> |
| | | <security-constraint> |
| | | <web-resource-collection> |
| | | <web-resource-name>HostManager commands</web-resource-name> |
| | | <url-pattern>/text/*</url-pattern> |
| | | </web-resource-collection> |
| | | <auth-constraint> |
| | | <!-- NOTE: This role is not present in the default users file --> |
| | | <role-name>admin-script</role-name> |
| | | </auth-constraint> |
| | | </security-constraint> |
| | | <security-constraint> |
| | | <web-resource-collection> |
| | | <web-resource-name>HTMLHostManager commands</web-resource-name> |
| | | <url-pattern>/html/*</url-pattern> |
| | | </web-resource-collection> |
| | | <auth-constraint> |
| | | <!-- NOTE: This role is not present in the default users file --> |
| | | <role-name>admin-gui</role-name> |
| | | </auth-constraint> |
| | | </security-constraint> |
| | | |
| | | <!-- Define the Login Configuration for this Application --> |
| | | <login-config> |
| | | <auth-method>BASIC</auth-method> |
| | | <realm-name>Tomcat Host Manager Application</realm-name> |
| | | </login-config> |
| | | |
| | | <!-- Security roles referenced by this web application --> |
| | | <security-role> |
| | | <description> |
| | | The role that is required to log in to the Host Manager Application HTML |
| | | interface |
| | | </description> |
| | | <role-name>admin-gui</role-name> |
| | | </security-role> |
| | | <security-role> |
| | | <description> |
| | | The role that is required to log in to the Host Manager Application text |
| | | interface |
| | | </description> |
| | | <role-name>admin-script</role-name> |
| | | </security-role> |
| | | |
| | | <error-page> |
| | | <error-code>401</error-code> |
| | | <location>/WEB-INF/jsp/401.jsp</location> |
| | | </error-page> |
| | | <error-page> |
| | | <error-code>403</error-code> |
| | | <location>/WEB-INF/jsp/403.jsp</location> |
| | | </error-page> |
| | | <error-page> |
| | | <error-code>404</error-code> |
| | | <location>/WEB-INF/jsp/404.jsp</location> |
| | | </error-page> |
| | | |
| | | </web-app> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å¼å
³æºçåæµè¯æ¥å |
| | | ## æµè¯ç´ æ |
| | | æ |
| | | |
| | | ## æµè¯ç®ç |
| | | 确认18个å¼å
³æºç忝妿£å¸¸å¼å
³æº |
| | | |
| | | ## æµè¯æ¶é´ |
| | | ç¬¬ä¸æ¹ï¼2021.12.24 - 2021.12.30 |
| | | |
| | | ## ç»ç«¯MACå°å |
| | | 01ï¼0025E1033D53 |
| | | 02ï¼0025E1033CF6 |
| | | 03ï¼0025E1033D00 |
| | | 04ï¼0025E1033D02 |
| | | 05ï¼0025E1033CF3 |
| | | 06ï¼0025E1033D72 |
| | | 07ï¼0025E1033D66 |
| | | 08ï¼0025E1033A8B |
| | | 09ï¼0025E1033CF2 |
| | | 10ï¼0025E1033D5B |
| | | 11ï¼0025E1033D6F |
| | | 12ï¼0025E1033A61 |
| | | 13ï¼0025E1033D4A |
| | | 14ï¼0025E1033D68 |
| | | 15ï¼0025E1033D67 |
| | | 16ï¼0025E1033CE4 |
| | | 17ï¼0025E1033D47 |
| | | 18ï¼0025E1033DA1 |
| | | |
| | | ## æµè¯ä¾ |
| | | å°18å°å¼å
³æºçåæ¶é´è®¾ç½®ç»ä¸ï¼ç»ä¸å¾éå
³æºæ¶æ®µå
ä¸çµä¿æå¼æº |
| | | å¨ä¸è³å¨äºï¼ |
| | | 08:15 â 09:00 |
| | | 09:10 â 10:00 |
| | | 10:10 â 12:00 |
| | | 12:10 â 13:00 |
| | | 13:10 â 18:00 |
| | | å¨å
ï¼å
¨å¤©å¼ |
| | | 卿¥ï¼å
¨å¤©å
³ |
| | | |
| | | ## æµè¯ç»æ |
| | | 17å°å¼å
³æºçåå¨è§å®çæ¶é´æ£å¸¸å¼å
³æº |
| | | 1å°ä¸è¯ |
| | | |
| | | ## ä¸è¯åå åæ |
| | | Macå°å为0025E1033CF2 线æ¥éäºï¼ä»¥ä¸æ¯å¾çï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #!/bin/bash |
| | | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
| | | export PATH |
| | | LANG=en_US.UTF-8 |
| | | |
| | | if [ $(whoami) != "root" ];then |
| | | echo "请使ç¨rootæéæ§è¡å®å¡å®è£
å½ä»¤ï¼" |
| | | exit 1; |
| | | fi |
| | | |
| | | is64bit=$(getconf LONG_BIT) |
| | | if [ "${is64bit}" != '64' ];then |
| | | Red_Error "æ±æ, å½å颿¿çæ¬ä¸æ¯æ32ä½ç³»ç», 请使ç¨64ä½ç³»ç»æå®è£
å®å¡5.9!"; |
| | | fi |
| | | |
| | | cd ~ |
| | | setup_path="/www" |
| | | python_bin=$setup_path/server/panel/pyenv/bin/python |
| | | cpu_cpunt=$(cat /proc/cpuinfo|grep processor|wc -l) |
| | | |
| | | if [ "$1" ];then |
| | | IDC_CODE=$1 |
| | | fi |
| | | |
| | | GetSysInfo(){ |
| | | if [ -s "/etc/redhat-release" ];then |
| | | SYS_VERSION=$(cat /etc/redhat-release) |
| | | elif [ -s "/etc/issue" ]; then |
| | | SYS_VERSION=$(cat /etc/issue) |
| | | fi |
| | | SYS_INFO=$(uname -a) |
| | | SYS_BIT=$(getconf LONG_BIT) |
| | | MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}') |
| | | CPU_INFO=$(getconf _NPROCESSORS_ONLN) |
| | | |
| | | echo -e ${SYS_VERSION} |
| | | echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO} |
| | | echo -e ${SYS_INFO} |
| | | echo -e "请æªå¾ä»¥ä¸æ¥éä¿¡æ¯åå¸è³è®ºåv7.hostcli.com/bbsæ±å©" |
| | | } |
| | | Red_Error(){ |
| | | echo '================================================='; |
| | | printf '\033[1;31;40m%b\033[0m\n' "$1"; |
| | | GetSysInfo |
| | | exit 1; |
| | | } |
| | | Lock_Clear(){ |
| | | if [ -f "/etc/bt_crack.pl" ];then |
| | | chattr -R -ia /www |
| | | chattr -ia /etc/init.d/bt |
| | | \cp -rpa /www/backup/panel/vhost/* /www/server/panel/vhost/ |
| | | mv /www/server/panel/BTPanel/__init__.bak /www/server/panel/BTPanel/__init__.py |
| | | rm -f /etc/bt_crack.pl |
| | | fi |
| | | } |
| | | Install_Check(){ |
| | | if [ "${INSTALL_FORCE}" ];then |
| | | return |
| | | fi |
| | | echo -e "----------------------------------------------------" |
| | | echo -e "æ£æ¥å·²æå
¶ä»Web/mysqlç¯å¢ï¼å®è£
å®å¡å¯è½å½±åç°æç«ç¹åæ°æ®" |
| | | echo -e "Web/mysql service is alreday installed,Can't install panel" |
| | | echo -e "----------------------------------------------------" |
| | | echo -e "å·²ç¥é£é©/Enter yes to force installation" |
| | | read -p "è¾å
¥yes强å¶å®è£
: " yes; |
| | | if [ "$yes" != "yes" ];then |
| | | echo -e "------------" |
| | | echo "åæ¶å®è£
" |
| | | exit; |
| | | fi |
| | | INSTALL_FORCE="true" |
| | | } |
| | | System_Check(){ |
| | | MYSQLD_CHECK=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql) |
| | | PHP_CHECK=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php) |
| | | NGINX_CHECK=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx) |
| | | HTTPD_CHECK=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep) |
| | | if [ "${PHP_CHECK}" ] || [ "${MYSQLD_CHECK}" ] || [ "${NGINX_CHECK}" ] || [ "${HTTPD_CHECK}" ];then |
| | | Install_Check |
| | | fi |
| | | } |
| | | Get_Pack_Manager(){ |
| | | if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then |
| | | PM="yum" |
| | | elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then |
| | | PM="apt-get" |
| | | fi |
| | | } |
| | | Auto_Swap() |
| | | { |
| | | swap=$(free |grep Swap|awk '{print $2}') |
| | | if [ "${swap}" -gt 1 ];then |
| | | echo "Swap total sizse: $swap"; |
| | | return; |
| | | fi |
| | | if [ ! -d /www ];then |
| | | mkdir /www |
| | | fi |
| | | swapFile="/www/swap" |
| | | dd if=/dev/zero of=$swapFile bs=1M count=1025 |
| | | mkswap -f $swapFile |
| | | swapon $swapFile |
| | | echo "$swapFile swap swap defaults 0 0" >> /etc/fstab |
| | | swap=`free |grep Swap|awk '{print $2}'` |
| | | if [ $swap -gt 1 ];then |
| | | echo "Swap total sizse: $swap"; |
| | | return; |
| | | fi |
| | | |
| | | sed -i "/\/www\/swap/d" /etc/fstab |
| | | rm -f $swapFile |
| | | } |
| | | Service_Add(){ |
| | | if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then |
| | | chkconfig --add bt |
| | | chkconfig --level 2345 bt on |
| | | elif [ "${PM}" == "apt-get" ]; then |
| | | update-rc.d bt defaults |
| | | fi |
| | | } |
| | | |
| | | get_node_url(){ |
| | | if [ ! -f /bin/curl ];then |
| | | if [ "${PM}" = "yum" ]; then |
| | | yum install curl -y |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | apt-get install curl -y |
| | | fi |
| | | fi |
| | | |
| | | echo '---------------------------------------------'; |
| | | echo "Selected download node..."; |
| | | download_Url='http://v7.hostcli.com'; |
| | | echo "Download node: $download_Url"; |
| | | echo '---------------------------------------------'; |
| | | } |
| | | Remove_Package(){ |
| | | local PackageNmae=$1 |
| | | if [ "${PM}" == "yum" ];then |
| | | isPackage=$(rpm -q ${PackageNmae}|grep "not installed") |
| | | if [ -z "${isPackage}" ];then |
| | | yum remove ${PackageNmae} -y |
| | | fi |
| | | elif [ "${PM}" == "apt-get" ];then |
| | | isPackage=$(dpkg -l|grep ${PackageNmae}) |
| | | if [ "${PackageNmae}" ];then |
| | | apt-get remove ${PackageNmae} -y |
| | | fi |
| | | fi |
| | | } |
| | | Install_RPM_Pack(){ |
| | | yumPath=/etc/yum.conf |
| | | Centos8Check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat') |
| | | isExc=$(cat $yumPath|grep httpd) |
| | | if [ "$isExc" = "" ];then |
| | | echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yumPath |
| | | fi |
| | | |
| | | #yumBaseUrl=$(cat /etc/yum.repos.d/CentOS-Base.repo|grep baseurl=http|cut -d '=' -f 2|cut -d '$' -f 1|head -n 1) |
| | | #[ "${yumBaseUrl}" ] && checkYumRepo=$(curl --connect-timeout 5 --head -s -o /dev/null -w %{http_code} ${yumBaseUrl}) |
| | | #if [ "${checkYumRepo}" != "200" ];then |
| | | # curl -Ss --connect-timeout 3 -m 60 http://download.bt.cn/install/yumRepo_select.sh|bash |
| | | #fi |
| | | |
| | | #å°è¯åæ¥æ¶é´(ä»bt.cn) |
| | | echo 'Synchronizing system time...' |
| | | getBtTime=$(curl -sS --connect-timeout 3 -m 60 http://v7.hostcli.com/api/index/get_time) |
| | | if [ "${getBtTime}" ];then |
| | | date -s "$(date -d @$getBtTime +"%Y-%m-%d %H:%M:%S")" |
| | | fi |
| | | |
| | | if [ -z "${Centos8Check}" ]; then |
| | | yum install ntp -y |
| | | rm -rf /etc/localtime |
| | | ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
| | | |
| | | #å°è¯åæ¥å½é
æ¶é´(ä»ntpæå¡å¨) |
| | | ntpdate 0.asia.pool.ntp.org |
| | | setenforce 0 |
| | | fi |
| | | |
| | | startTime=`date +%s` |
| | | |
| | | sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config |
| | | #yum remove -y python-requests python3-requests python-greenlet python3-greenlet |
| | | yumPacks="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel gcc libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel" |
| | | yum install -y ${yumPacks} |
| | | |
| | | for yumPack in ${yumPacks} |
| | | do |
| | | rpmPack=$(rpm -q ${yumPack}) |
| | | packCheck=$(echo ${rpmPack}|grep not) |
| | | if [ "${packCheck}" ]; then |
| | | yum install ${yumPack} -y |
| | | fi |
| | | done |
| | | if [ -f "/usr/bin/dnf" ]; then |
| | | dnf install -y redhat-rpm-config |
| | | fi |
| | | |
| | | ALI_OS=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3") |
| | | if [ -z "${ALI_OS}" ];then |
| | | yum install epel-release -y |
| | | fi |
| | | } |
| | | Install_Deb_Pack(){ |
| | | ln -sf bash /bin/sh |
| | | apt-get update -y |
| | | apt-get install ruby -y |
| | | apt-get install lsb-release -y |
| | | #apt-get install ntp ntpdate -y |
| | | #/etc/init.d/ntp stop |
| | | #update-rc.d ntp remove |
| | | #cat >>~/.profile<<EOF |
| | | #TZ='Asia/Shanghai'; export TZ |
| | | #EOF |
| | | #rm -rf /etc/localtime |
| | | #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
| | | #echo 'Synchronizing system time...' |
| | | #ntpdate 0.asia.pool.ntp.org |
| | | #apt-get upgrade -y |
| | | debPacks="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev gcc libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git"; |
| | | apt-get install -y $debPacks --force-yes |
| | | |
| | | for debPack in ${debPacks} |
| | | do |
| | | packCheck=$(dpkg -l ${debPack}) |
| | | if [ "$?" -ne "0" ] ;then |
| | | apt-get install -y debPack |
| | | fi |
| | | done |
| | | |
| | | if [ ! -d '/etc/letsencrypt' ];then |
| | | mkdir -p /etc/letsencryp |
| | | mkdir -p /var/spool/cron |
| | | if [ ! -f '/var/spool/cron/crontabs/root' ];then |
| | | echo '' > /var/spool/cron/crontabs/root |
| | | chmod 600 /var/spool/cron/crontabs/root |
| | | fi |
| | | fi |
| | | } |
| | | Install_Bt(){ |
| | | panelPort="8888" |
| | | if [ -f ${setup_path}/server/panel/data/port.pl ];then |
| | | panelPort=$(cat ${setup_path}/server/panel/data/port.pl) |
| | | fi |
| | | mkdir -p ${setup_path}/server/panel/logs |
| | | mkdir -p ${setup_path}/server/panel/vhost/apache |
| | | mkdir -p ${setup_path}/server/panel/vhost/nginx |
| | | mkdir -p ${setup_path}/server/panel/vhost/rewrite |
| | | mkdir -p ${setup_path}/server/panel/install |
| | | mkdir -p /www/server |
| | | mkdir -p /www/wwwroot |
| | | mkdir -p /www/wwwlogs |
| | | mkdir -p /www/backup/database |
| | | mkdir -p /www/backup/site |
| | | |
| | | if [ ! -f "/usr/bin/unzip" ]; then |
| | | if [ "${PM}" = "yum" ]; then |
| | | yum install unzip -y |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | apt-get install unzip -y |
| | | fi |
| | | fi |
| | | |
| | | if [ -f "/etc/init.d/bt" ]; then |
| | | /etc/init.d/bt stop |
| | | sleep 1 |
| | | fi |
| | | |
| | | wget -O panel.zip ${download_Url}/install/src/panel_new.zip -T 10 |
| | | wget -O /etc/init.d/bt ${download_Url}/install/src/bt6.init -T 10 |
| | | wget -O /www/server/panel/install/public.sh ${download_Url}/install/public.sh -T 10 |
| | | |
| | | if [ -f "${setup_path}/server/panel/data/default.db" ];then |
| | | if [ -d "/${setup_path}/server/panel/old_data" ];then |
| | | rm -rf ${setup_path}/server/panel/old_data |
| | | fi |
| | | mkdir -p ${setup_path}/server/panel/old_data |
| | | d_format=$(date +"%Y%m%d_%H%M%S") |
| | | \cp -arf ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/data/default_backup_${d_format}.db |
| | | mv -f ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/old_data/default.db |
| | | mv -f ${setup_path}/server/panel/data/system.db ${setup_path}/server/panel/old_data/system.db |
| | | mv -f ${setup_path}/server/panel/data/port.pl ${setup_path}/server/panel/old_data/port.pl |
| | | mv -f ${setup_path}/server/panel/data/admin_path.pl ${setup_path}/server/panel/old_data/admin_path.pl |
| | | fi |
| | | |
| | | unzip -o panel.zip -d ${setup_path}/server/ > /dev/null |
| | | |
| | | if [ -d "${setup_path}/server/panel/old_data" ];then |
| | | mv -f ${setup_path}/server/panel/old_data/default.db ${setup_path}/server/panel/data/default.db |
| | | mv -f ${setup_path}/server/panel/old_data/system.db ${setup_path}/server/panel/data/system.db |
| | | mv -f ${setup_path}/server/panel/old_data/port.pl ${setup_path}/server/panel/data/port.pl |
| | | mv -f ${setup_path}/server/panel/old_data/admin_path.pl ${setup_path}/server/panel/data/admin_path.pl |
| | | if [ -d "/${setup_path}/server/panel/old_data" ];then |
| | | rm -rf ${setup_path}/server/panel/old_data |
| | | fi |
| | | fi |
| | | |
| | | rm -f panel.zip |
| | | |
| | | if [ ! -f ${setup_path}/server/panel/tools.py ];then |
| | | Red_Error "ERROR: Failed to download, please try install again!" |
| | | fi |
| | | |
| | | rm -f ${setup_path}/server/panel/class/*.pyc |
| | | rm -f ${setup_path}/server/panel/*.pyc |
| | | |
| | | chmod +x /etc/init.d/bt |
| | | chmod -R 600 ${setup_path}/server/panel |
| | | chmod -R +x ${setup_path}/server/panel/script |
| | | ln -sf /etc/init.d/bt /usr/bin/bt |
| | | echo "${panelPort}" > ${setup_path}/server/panel/data/port.pl |
| | | wget -O /etc/init.d/bt ${download_Url}/install/src/bt7.init -T 10 |
| | | wget -O /www/server/panel/init.sh ${download_Url}/install/src/bt7.init -T 10 |
| | | } |
| | | Install_Python_Lib(){ |
| | | curl -Ss --connect-timeout 3 -m 60 $download_Url/install/pip_select.sh|bash |
| | | pyenv_path="/www/server/panel" |
| | | if [ -f $pyenv_path/pyenv/bin/python ];then |
| | | is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform') |
| | | if [ "$is_err" = "" ];then |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | is_package=$($python_bin -m psutil 2>&1|grep package) |
| | | if [ "$is_package" = "" ];then |
| | | wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip.txt -T 5 |
| | | $pyenv_path/pyenv/bin/pip install -U pip |
| | | $pyenv_path/pyenv/bin/pip install -U setuptools |
| | | $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt |
| | | fi |
| | | source $pyenv_path/pyenv/bin/activate |
| | | return |
| | | else |
| | | rm -rf $pyenv_path/pyenv |
| | | fi |
| | | fi |
| | | py_version="3.7.8" |
| | | mkdir -p $pyenv_path |
| | | os_type='el' |
| | | os_version='7' |
| | | is_export_openssl=0 |
| | | Get_Versions |
| | | Centos6_Openssl |
| | | Other_Openssl |
| | | echo "OS: $os_type - $os_version" |
| | | is_aarch64=$(uname -a|grep aarch64) |
| | | if [ "$is_aarch64" != "" ];then |
| | | os_version="aarch64" |
| | | fi |
| | | |
| | | if [ -f "/www/server/panel/pymake.pl" ];then |
| | | os_version="" |
| | | rm -f /www/server/panel/pymake.pl |
| | | fi |
| | | |
| | | if [ "${os_version}" != "" ];then |
| | | pyenv_file="/www/pyenv.tar.gz" |
| | | wget -O $pyenv_file $download_Url/install/pyenv/pyenv-${os_type}${os_version}-x${is64bit}.tar.gz -T 10 |
| | | tmp_size=$(du -b $pyenv_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $pyenv_file |
| | | echo "ERROR: Download python env fielded." |
| | | else |
| | | echo "Install python env..." |
| | | tar zxvf $pyenv_file -C $pyenv_path/ > /dev/null |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | if [ ! -f $pyenv_path/pyenv/bin/python ];then |
| | | rm -f $pyenv_file |
| | | Red_Error "ERROR: Install python env fielded." |
| | | fi |
| | | is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform') |
| | | if [ "$is_err" = "" ];then |
| | | rm -f $pyenv_file |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython |
| | | source $pyenv_path/pyenv/bin/activate |
| | | return |
| | | else |
| | | rm -f $pyenv_file |
| | | rm -rf $pyenv_path/pyenv |
| | | fi |
| | | fi |
| | | |
| | | fi |
| | | if [ -f /usr/local/openssl/lib/libssl.so ];then |
| | | export LDFLAGS="-L/usr/local/openssl/lib" |
| | | export CPPFLAGS="-I/usr/local/openssl/include" |
| | | export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig" |
| | | echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib" >> /etc/profile |
| | | source /etc/profile |
| | | fi |
| | | cd /www |
| | | python_src='/www/python_src.tar.xz' |
| | | python_src_path="/www/Python-${py_version}" |
| | | wget -O $python_src $download_Url/src/Python-${py_version}.tar.xz -T 5 |
| | | tmp_size=$(du -b $python_src|awk '{print $1}') |
| | | if [ $tmp_size -lt 10703460 ];then |
| | | rm -f $python_src |
| | | Red_Error "ERROR: Download python source code fielded." |
| | | fi |
| | | tar xvf $python_src |
| | | rm -f $python_src |
| | | cd $python_src_path |
| | | ./configure --prefix=$pyenv_path/pyenv |
| | | make -j$cpu_cpunt |
| | | make install |
| | | if [ ! -f $pyenv_path/pyenv/bin/python3.7 ];then |
| | | rm -rf $python_src_path |
| | | Red_Error "ERROR: Make python env fielded." |
| | | fi |
| | | cd ~ |
| | | rm -rf $python_src_path |
| | | wget -O $pyenv_path/pyenv/bin/activate $download_Url/install/pyenv/activate.panel -T 5 |
| | | wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip-3.7.8.txt -T 5 |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 $pyenv_path/pyenv/bin/pip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 $pyenv_path/pyenv/bin/python |
| | | ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip |
| | | ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython |
| | | chmod -R 700 $pyenv_path/pyenv/bin |
| | | $pyenv_path/pyenv/bin/pip install -U pip |
| | | $pyenv_path/pyenv/bin/pip install -U setuptools |
| | | $pyenv_path/pyenv/bin/pip install -U wheel==0.34.2 |
| | | $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt |
| | | source $pyenv_path/pyenv/bin/activate |
| | | } |
| | | Other_Openssl(){ |
| | | openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]') |
| | | if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then |
| | | opensslVersion="1.0.2r" |
| | | if [ ! -f "/usr/local/openssl/lib/libssl.so" ];then |
| | | cd /www |
| | | openssl_src_file=/www/openssl.tar.gz |
| | | wget -O $openssl_src_file ${download_Url}/src/openssl-${opensslVersion}.tar.gz |
| | | tmp_size=$(du -b $openssl_src_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $openssl_src_file |
| | | Red_Error "ERROR: Download openssl-1.0.2 source code fielded." |
| | | fi |
| | | tar -zxf $openssl_src_file |
| | | rm -f $openssl_src_file |
| | | cd openssl-${opensslVersion} |
| | | #zlib-dynamic shared |
| | | ./config --openssldir=/usr/local/openssl zlib-dynamic shared |
| | | make -j${cpuCore} |
| | | make install |
| | | echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/zopenssl.conf |
| | | ldconfig |
| | | cd .. |
| | | rm -rf openssl-${opensslVersion} |
| | | is_export_openssl=1 |
| | | cd ~ |
| | | fi |
| | | fi |
| | | } |
| | | Insatll_Libressl(){ |
| | | openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]') |
| | | if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then |
| | | opensslVersion="3.0.2" |
| | | cd /www |
| | | openssl_src_file=/www/openssl.tar.gz |
| | | wget -O $openssl_src_file ${download_Url}/install/pyenv/libressl-${opensslVersion}.tar.gz |
| | | tmp_size=$(du -b $openssl_src_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 703460 ];then |
| | | rm -f $openssl_src_file |
| | | Red_Error "ERROR: Download libressl-$opensslVersion source code fielded." |
| | | fi |
| | | tar -zxf $openssl_src_file |
| | | rm -f $openssl_src_file |
| | | cd libressl-${opensslVersion} |
| | | ./config âprefix=/usr/local/lib |
| | | make -j${cpuCore} |
| | | make install |
| | | ldconfig |
| | | ldconfig -v |
| | | cd .. |
| | | rm -rf libressl-${opensslVersion} |
| | | is_export_openssl=1 |
| | | cd ~ |
| | | fi |
| | | } |
| | | Centos6_Openssl(){ |
| | | if [ "$os_type" != 'el' ];then |
| | | return |
| | | fi |
| | | if [ "$os_version" != '6' ];then |
| | | return |
| | | fi |
| | | echo 'Centos6 install openssl-1.0.2...' |
| | | openssl_rpm_file="/www/openssl.rpm" |
| | | wget -O $openssl_rpm_file $download_Url/rpm/centos6/${is64bit}/bt-openssl102.rpm -T 10 |
| | | tmp_size=$(du -b $openssl_rpm_file|awk '{print $1}') |
| | | if [ $tmp_size -lt 102400 ];then |
| | | rm -f $openssl_rpm_file |
| | | Red_Error "ERROR: Download python env fielded." |
| | | fi |
| | | rpm -ivh $openssl_rpm_file |
| | | rm -f $openssl_rpm_file |
| | | is_export_openssl=1 |
| | | } |
| | | Get_Versions(){ |
| | | redhat_version_file="/etc/redhat-release" |
| | | deb_version_file="/etc/issue" |
| | | if [ -f $redhat_version_file ];then |
| | | os_type='el' |
| | | is_aliyunos=$(cat $redhat_version_file|grep Aliyun) |
| | | if [ "$is_aliyunos" != "" ];then |
| | | return |
| | | fi |
| | | os_version=$(cat $redhat_version_file|grep CentOS|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]') |
| | | if [ "${os_version}" = "5" ];then |
| | | os_version="" |
| | | fi |
| | | else |
| | | os_type='ubuntu' |
| | | os_version=$(cat $deb_version_file|grep Ubuntu|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]+') |
| | | if [ "${os_version}" = "" ];then |
| | | os_type='debian' |
| | | os_version=$(cat $deb_version_file|grep Debian|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '[0-9]+') |
| | | if [ "${os_version}" = "" ];then |
| | | os_version=$(cat $deb_version_file|grep Debian|grep -Eo '[0-9]+') |
| | | fi |
| | | if [ "${os_version}" = "8" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "${is64bit}" = '32' ];then |
| | | os_version="" |
| | | fi |
| | | else |
| | | if [ "$os_version" = "14" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "$os_version" = "12" ];then |
| | | os_version="" |
| | | fi |
| | | if [ "$os_version" = "19" ];then |
| | | os_version="" |
| | | fi |
| | | |
| | | fi |
| | | fi |
| | | } |
| | | Set_Bt_Panel(){ |
| | | password=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8) |
| | | sleep 1 |
| | | admin_auth="/www/server/panel/data/admin_path.pl" |
| | | if [ ! -f ${admin_auth} ];then |
| | | auth_path=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8) |
| | | echo "/${auth_path}" > ${admin_auth} |
| | | fi |
| | | auth_path=$(cat ${admin_auth}) |
| | | cd ${setup_path}/server/panel/ |
| | | /etc/init.d/bt start |
| | | $python_bin -m py_compile tools.py |
| | | $python_bin tools.py username |
| | | username=$($python_bin tools.py panel ${password}) |
| | | cd ~ |
| | | echo "${password}" > ${setup_path}/server/panel/default.pl |
| | | chmod 600 ${setup_path}/server/panel/default.pl |
| | | sleep 3 |
| | | /etc/init.d/bt restart |
| | | sleep 3 |
| | | isStart=$(ps aux |grep 'BT-Panel'|grep -v grep|awk '{print $2}') |
| | | LOCAL_CURL=$(curl 127.0.0.1:8888/login 2>&1 |grep -i html) |
| | | if [ -z "${isStart}" ] && [ -z "${LOCAL_CURL}" ];then |
| | | /etc/init.d/bt 22 |
| | | cd /www/server/panel/pyenv/bin |
| | | touch t.pl |
| | | ls -al python3.7 python |
| | | lsattr python3.7 python |
| | | Red_Error "ERROR: The BT-Panel service startup failed." |
| | | fi |
| | | } |
| | | Set_Firewall(){ |
| | | sshPort=$(cat /etc/ssh/sshd_config | grep 'Port '|awk '{print $2}') |
| | | if [ "${PM}" = "apt-get" ]; then |
| | | apt-get install -y ufw |
| | | if [ -f "/usr/sbin/ufw" ];then |
| | | ufw allow 20/tcp |
| | | ufw allow 21/tcp |
| | | ufw allow 22/tcp |
| | | ufw allow 80/tcp |
| | | ufw allow 888/tcp |
| | | ufw allow ${panelPort}/tcp |
| | | ufw allow ${sshPort}/tcp |
| | | ufw allow 39000:40000/tcp |
| | | ufw_status=`ufw status` |
| | | echo y|ufw enable |
| | | ufw default deny |
| | | ufw reload |
| | | fi |
| | | else |
| | | if [ -f "/etc/init.d/iptables" ];then |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${panelPort} -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${sshPort} -j ACCEPT |
| | | iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 39000:40000 -j ACCEPT |
| | | #iptables -I INPUT -p tcp -m state --state NEW -m udp --dport 39000:40000 -j ACCEPT |
| | | iptables -A INPUT -p icmp --icmp-type any -j ACCEPT |
| | | iptables -A INPUT -s localhost -d localhost -j ACCEPT |
| | | iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
| | | iptables -P INPUT DROP |
| | | service iptables save |
| | | sed -i "s#IPTABLES_MODULES=\"\"#IPTABLES_MODULES=\"ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp\"#" /etc/sysconfig/iptables-config |
| | | iptables_status=$(service iptables status | grep 'not running') |
| | | if [ "${iptables_status}" == '' ];then |
| | | service iptables restart |
| | | fi |
| | | else |
| | | AliyunCheck=$(cat /etc/redhat-release|grep "Aliyun Linux") |
| | | [ "${AliyunCheck}" ] && return |
| | | yum install firewalld -y |
| | | [ "${Centos8Check}" ] && yum reinstall python3-six -y |
| | | systemctl enable firewalld |
| | | systemctl start firewalld |
| | | firewall-cmd --set-default-zone=public > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=20/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=21/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=22/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=80/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=${panelPort}/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=${sshPort}/tcp > /dev/null 2>&1 |
| | | firewall-cmd --permanent --zone=public --add-port=39000-40000/tcp > /dev/null 2>&1 |
| | | #firewall-cmd --permanent --zone=public --add-port=39000-40000/udp > /dev/null 2>&1 |
| | | firewall-cmd --reload |
| | | fi |
| | | fi |
| | | } |
| | | Get_Ip_Address(){ |
| | | getIpAddress="" |
| | | getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress) |
| | | if [ -z "${getIpAddress}" ] || [ "${getIpAddress}" = "0.0.0.0" ]; then |
| | | isHosts=$(cat /etc/hosts|grep 'v7.hostcli.com') |
| | | if [ -z "${isHosts}" ];then |
| | | #echo "" >> /etc/hosts |
| | | #echo "103.224.251.67 v7.hostcli.com" >> /etc/hosts |
| | | getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress) |
| | | if [ -z "${getIpAddress}" ];then |
| | | sed -i "/v7.hostcli.com/d" /etc/hosts |
| | | fi |
| | | fi |
| | | fi |
| | | |
| | | ipv4Check=$($python_bin -c "import re; print(re.match('^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$','${getIpAddress}'))") |
| | | if [ "${ipv4Check}" == "None" ];then |
| | | ipv6Address=$(echo ${getIpAddress}|tr -d "[]") |
| | | ipv6Check=$($python_bin -c "import re; print(re.match('^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$','${ipv6Address}'))") |
| | | if [ "${ipv6Check}" == "None" ]; then |
| | | getIpAddress="SERVER_IP" |
| | | else |
| | | echo "True" > ${setup_path}/server/panel/data/ipv6.pl |
| | | sleep 1 |
| | | /etc/init.d/bt restart |
| | | fi |
| | | fi |
| | | |
| | | if [ "${getIpAddress}" != "SERVER_IP" ];then |
| | | echo "${getIpAddress}" > ${setup_path}/server/panel/data/iplist.txt |
| | | fi |
| | | LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1) |
| | | } |
| | | Setup_Count(){ |
| | | curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/SetupCount?type=Linux\&o=$1 > /dev/null 2>&1 |
| | | if [ "$1" != "" ];then |
| | | echo $1 > /www/server/panel/data/o.pl |
| | | cd /www/server/panel |
| | | $python_bin tools.py o |
| | | fi |
| | | echo /www > /var/bt_setupPath.conf |
| | | } |
| | | Install_Main(){ |
| | | startTime=`date +%s` |
| | | Lock_Clear |
| | | System_Check |
| | | Get_Pack_Manager |
| | | get_node_url |
| | | |
| | | MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}') |
| | | if [ "${MEM_TOTAL}" -le "1" ];then |
| | | Auto_Swap |
| | | fi |
| | | |
| | | if [ "${PM}" = "yum" ]; then |
| | | Install_RPM_Pack |
| | | elif [ "${PM}" = "apt-get" ]; then |
| | | Install_Deb_Pack |
| | | fi |
| | | |
| | | Install_Python_Lib |
| | | Install_Bt |
| | | |
| | | |
| | | Set_Bt_Panel |
| | | Service_Add |
| | | Set_Firewall |
| | | |
| | | Get_Ip_Address |
| | | Setup_Count ${IDC_CODE} |
| | | } |
| | | |
| | | echo " |
| | | +---------------------------------------------------------------------- |
| | | | hostcli.com FOR CentOS/Ubuntu/Debian |
| | | +---------------------------------------------------------------------- |
| | | | Copyright © 2015-2099 HostCli(http://v7.hostcli.com) All rights reserved. |
| | | +---------------------------------------------------------------------- |
| | | | The WebPanel URL will be http://SERVER_IP:8888 when installed. |
| | | +---------------------------------------------------------------------- |
| | | " |
| | | while [ "$go" != 'y' ] && [ "$go" != 'n' ] |
| | | do |
| | | read -p "Do you want to install Bt-Panel to the $setup_path directory now?(y/n): " go; |
| | | done |
| | | |
| | | if [ "$go" == 'n' ];then |
| | | exit; |
| | | fi |
| | | |
| | | Install_Main |
| | | echo > /www/server/panel/data/bind.pl |
| | | echo -e "==================================================================" |
| | | echo -e "\033[32mCongratulations! Installed successfully!\033[0m" |
| | | echo -e "==================================================================" |
| | | echo "å¤ç½é¢æ¿å°å: http://${getIpAddress}:${panelPort}${auth_path}" |
| | | echo "å
ç½é¢æ¿å°å: http://${LOCAL_IP}:${panelPort}${auth_path}" |
| | | echo -e "username: $username" |
| | | echo -e "password: $password" |
| | | echo -e "\033[33mIf you cannot access the panel,\033[0m" |
| | | echo -e "\033[33mrelease the following panel port [${panelPort}] in the security group\033[0m" |
| | | echo -e "\033[33mè¥æ æ³è®¿é®é¢æ¿ï¼è¯·æ£æ¥é²ç«å¢/å®å
¨ç»æ¯å¦ææ¾è¡é¢æ¿[${panelPort}]端å£\033[0m" |
| | | echo -e "==================================================================" |
| | | |
| | | endTime=`date +%s` |
| | | ((outTime=($endTime-$startTime)/60)) |
| | | echo -e "Time consumed:\033[32m $outTime \033[0mMinute!" |
| | | |