diff --git a/.flattened-pom.xml b/.flattened-pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd972b4df2382159b456bd83e7d7d09ff9a4d7c3 --- /dev/null +++ b/.flattened-pom.xml @@ -0,0 +1,178 @@ + + + 4.0.0 + + org.noear + solon-parent + 1.10.2 + + com.cym + nginxWebUI + 3.4.0 + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + 1.8 + UTF-8 + UTF-8 + + + + org.noear + solon-web + + + org.noear + solon.boot.undertow + + + org.noear + logback-solon-plugin + + + org.noear + solon.schedule + + + org.noear + solon-test + test + + + org.apache.commons + commons-compress + 1.21 + + + com.github.odiszapc + nginxparser + 0.9.6 + + + com.h2database + h2 + 2.1.210 + + + mysql + mysql-connector-java + 8.0.28 + + + com.warrenstrange + googleauth + 1.5.0 + + + cn.hutool + hutool-all + 5.8.3 + + + javax.mail + mail + 1.4.7 + + + com.google.zxing + javase + 3.3.0 + + + com.github.oshi + oshi-core + 5.3.0 + + + com.zaxxer + HikariCP + 4.0.3 + + + com.github.whvcse + easy-captcha + 1.6.2 + + + com.fasterxml.jackson.core + jackson-annotations + 2.13.1 + + + org.apache.maven + maven-model + 3.0 + + + net.jodah + expiringmap + 0.5.10 + + + + + + maven-surefire-plugin + + true + + + + maven-compiler-plugin + 3.8.1 + + -parameters + 1.8 + 1.8 + UTF-8 + + + + com.github.shalousun + smart-doc-maven-plugin + 2.3.9 + + + + html + + + + + ./src/main/resources/smart-doc.json + nginxWebUI + + + + maven-assembly-plugin + 3.3.0 + + + make-assembly + package + + single + + + + + ${project.name}-${project.version} + false + + jar-with-dependencies + + + + com.cym.NginxWebUI + + + + + + + diff --git a/Dockerfile b/Dockerfile index e23fd07047a2640cce2c88a0c5b38c62689790f1..c4c8c420b0b91137f86efa8f6c290793646868ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,27 @@ -FROM cym1102/nginxwebui-base:latest +FROM alpine:3.17 ENV LANG=zh_CN.UTF-8 \ TZ=Asia/Shanghai \ PS1="\u@\h:\w \$ " +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ + && apk add --update --no-cache \ + nginx \ + nginx-mod-stream \ + nginx-mod-http-headers-more \ + openjdk8-jre \ + net-tools \ + curl \ + wget \ + ttf-dejavu \ + fontconfig \ + tzdata \ + tini \ + acme.sh \ + && fc-cache -f -v \ + && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ + && echo "${TZ}" > /etc/timezone \ + && rm -rf /var/cache/apk/* /tmp/* COPY target/nginxWebUI-*.jar /home/nginxWebUI.jar COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN ["chmod", "+x", "/usr/local/bin/entrypoint.sh"] VOLUME ["/home/nginxWebUI"] ENTRYPOINT ["tini", "entrypoint.sh"] \ No newline at end of file diff --git a/README.md b/README.md index 807d3a64b1ff76be2ce497b8cb2559512fdf3fc7..95962024ef57f62babb3d811333ae83660376896 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ nginx网页配置工具 QQ技术交流群1: 1106758598 + QQ技术交流群2: 560797506 邮箱: cym1102@qq.com @@ -29,15 +30,16 @@ nginx本身功能复杂, nginxWebUI并不能涵盖nginx所有功能, 但能覆 部署此项目后, 配置nginx再也不用上网各种搜索配置代码, 再也不用手动申请和配置ssl证书, 只需要在本项目中进行增删改查就可方便的配置和启动nginx。 ``` -演示地址: http://test.nginxwebui.cn:8080 +视频教程: https://www.bilibili.com/video/BV18A4y1D7GZ +演示地址: http://test.nginxwebui.cn:7070 用户名: admin -密码: Admin123 +密码: admin ``` #### 技术说明 -本项目是基于springBoot的web系统, 数据库使用sqlite, 因此服务器上不需要安装任何数据库 +本项目是基于solon的web系统, 数据库使用h2, 因此服务器上不需要安装任何数据库 本系统通过Let's encrypt申请证书, 使用acme.sh脚本进行自动化申请和续签, 开启续签的证书将在每天凌晨2点进行续签, 只有超过60天的证书才会进行续签. 只支持在linux下签发证书. @@ -80,9 +82,10 @@ Path : JDK安装目录\bin 2.下载最新版发行包jar ``` -Linux: wget -O /home/nginxWebUI/nginxWebUI.jar http://file.nginxwebui.cn/nginxWebUI-2.9.4.jar +Linux: mkdir /home/nginxWebUI/ + wget -O /home/nginxWebUI/nginxWebUI.jar http://file.nginxwebui.cn/nginxWebUI-3.5.8.jar -Windows: 直接使用浏览器下载 http://file.nginxwebui.cn/nginxWebUI-2.9.4.jar +Windows: 直接使用浏览器下载 http://file.nginxwebui.cn/nginxWebUI-3.5.8.jar 到 D:/home/nginxWebUI/nginxWebUI.jar ``` 有新版本只需要修改路径中的版本即可 @@ -90,20 +93,18 @@ Windows: 直接使用浏览器下载 http://file.nginxwebui.cn/nginxWebUI-2.9.4. 3.启动程序 ``` -Linux: nohup java -jar -Xmx64m /home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=/home/nginxWebUI/ > /dev/null & +Linux: nohup java -jar -Dfile.encoding=UTF-8 /home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=/home/nginxWebUI/ > /dev/null & -Windows: java -jar -Xmx64m D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=D:/home/nginxWebUI/ +Windows: java -jar -Dfile.encoding=UTF-8 D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=D:/home/nginxWebUI/ ``` 参数说明(都是非必填) --Xmx64m 最大分配内存数 - --server.port 占用端口, 默认以8080端口启动 --project.home 项目配置文件目录,存放数据库文件,证书文件,日志等, 默认为/home/nginxWebUI/ ---spring.database.type=mysql 使用其他数据库,不填为使用本地sqlite,选项包括mysql和postgresql +--spring.database.type=mysql 使用其他数据库,不填为使用本地h2数据库,可选mysql --spring.datasource.url=jdbc:mysql://ip:port/nginxwebui 数据库url @@ -111,9 +112,7 @@ Windows: java -jar -Xmx64m D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --spring.datasource.password=pass 数据库密码 ---knife4j.production=false false:打开接口调试页面 true:关闭接口调试页面 - -注意命令最后加一个&号, 表示项目后台运行 +注意Linux命令最后加一个&号, 表示项目后台运行 #### docker安装说明 @@ -142,7 +141,12 @@ docker pull cym1102/nginxwebui:latest 3.启动容器: ``` -docker run -itd -v /home/nginxWebUI:/home/nginxWebUI -e BOOT_OPTIONS="--server.port=8080" --privileged=true --net=host cym1102/nginxwebui:latest +docker run -itd \ + -v /home/nginxWebUI:/home/nginxWebUI \ + -e BOOT_OPTIONS="--server.port=8080" \ + --privileged=true \ + --net=host \ + cym1102/nginxwebui:latest ``` 注意: @@ -175,6 +179,7 @@ services: ``` + #### 编译说明 使用maven编译打包 @@ -209,7 +214,7 @@ Type=simple User=root Group=root WorkingDirectory=/home/nginxWebUI -ExecStart=/usr/bin/java -jar /home/nginxWebUI/nginxWebUI.jar +ExecStart=/usr/bin/java -jar -Dfile.encoding=UTF-8 /home/nginxWebUI/nginxWebUI.jar Restart=always [Install] @@ -276,38 +281,27 @@ systemctl start nginxwebui.service #### 接口开发 -本系统提供http接口调用, 只要在启动参数添加 --knife4j.production=false, 再打开 http://xxx.xxx.xxx.xxx:8080/doc.html 即可查看knife4j接口页面. - -接口调用需要在header中添加token, 其中token的获取需要在管理员管理中, 打开用户的接口调用权限, 然后通过用户名密码调用获取token接口, 才能得到token, 然后在knife4j的文档管理中设置全局token. +本系统提供http接口调用, 打开 http://xxx.xxx.xxx.xxx:8080/doc.html 即可查看smart-doc接口页面. -注意: 参数说明中, 带*前缀的均是必填项 +接口调用需要在http请求header中添加token, 其中token的获取需要先在管理员管理中, 打开用户的接口调用权限, 然后通过用户名密码调用获取token接口, 才能得到token -![输入图片说明](http://www.nginxwebui.cn/img/knife4j.png "knife4j.png") +![输入图片说明](http://www.nginxwebui.cn/img/smart-doc.png "smart-doc.png") #### 找回密码 -如果忘记了登录密码,可按如下教程找回密码 - -1. 安装sqlite3命令(Docker镜像已经安装好了) +如果忘记了登录密码或没有保存两步验证二维码,可按如下教程重置密码和关闭两步验证. -``` -apt install sqlite3 -``` +1.停止nginxWebUI进程或停止docker容器运行 -2. 读取sqlite.db文件 +2.使用找回密码参数运行nginxWebUI.jar, docker用户需单独下载nginxWebUI.jar运行此命令 ``` -sqlite3 /home/nginxWebUI/sqlite.db +java -jar nginxWebUI.jar --project.home=/home/nginxWebUI/ --project.findPass=true ``` -3. 查找admin表 +--project.home 为项目文件所在目录, 使用docker容器时为映射目录 -``` -select * from admin; -``` +--project.findPass 为是否打印用户名密码 -4. 退出sqlite3 +运行成功后即可重置并打印出全部用户名密码并关闭两步验证 -``` -.quit -``` diff --git a/README_EN.md b/README_EN.md index c8e3cc6b8a0c920ce0bfea0877b6c7cdaeefdd54..0e39cbe14e9d896b7cfd2ca4d5fbb024b9d21345 100644 --- a/README_EN.md +++ b/README_EN.md @@ -25,14 +25,15 @@ The nginx web user interface (webui) does not cover all nginx functions, but cov After the deployment of this project, the configuration of nginx no longer need to search the web configuration code, no longer need to manually apply for and configure SSL certificates, just need to add, delete, change and check in this project can easily configure and start nginx. ``` -Demo address: http://test.nginxwebui.cn:8080 +Video course: https://www.bilibili.com/video/BV18A4y1D7GZ +Demo address: http://test.nginxwebui.cn:7070 User: admin -password: Admin123 +password: admin ``` #### Technical note -This project is a Web system based on springBoot. The database use SQLite, so there is no need to install any database on the server. +This project is a Web system based on solon. The database use h2, so there is no need to install any database on the server. This system applies for the certificate through Let's ENCRYPT and USES acme.sh script to automatically apply for and renew the certificate. Once the certificate is renewed, it will be renewed at 2 am every day, and only certificates exceeding 60 days will be renewed. @@ -73,9 +74,10 @@ reboot 2.Download the latest release of the distribution jar ``` -Linux: wget -O /home/nginxWebUI/nginxWebUI.jar http://file.nginxwebui.cn/nginxWebUI-2.9.4.jar +Linux: mkdir /home/nginxWebUI/ + wget -O /home/nginxWebUI/nginxWebUI.jar http://file.nginxwebui.cn/nginxWebUI-3.5.8.jar -Windows: Download directly from your browser http://file.nginxwebui.cn/nginxWebUI-2.9.4.jar +Windows: Download directly from your browser http://file.nginxwebui.cn/nginxWebUI-3.5.8.jar into D:/home/nginxWebUI/ ``` With a new version, you just need to change the version in the path @@ -83,20 +85,18 @@ With a new version, you just need to change the version in the path 3.Start program ``` -Linux: nohup java -jar -Xmx64m /home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=/home/nginxWebUI/ > /dev/null & +Linux: nohup java -jar -Dfile.encoding=UTF-8 /home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=/home/nginxWebUI/ > /dev/null & -Windows: java -jar -Xmx64m D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=D:/home/nginxWebUI/ +Windows: java -jar -Dfile.encoding=UTF-8 D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=D:/home/nginxWebUI/ ``` Parameter description (both non-required) --Xmx64m Maximum number of memory allocated - --server.port Occupied port, default starts at port 8080 --project.home Project profile directory for database files, certificate files, logs, etc. Default is /home/nginxwebui/ ---spring.database.type=mysql Use other databases, not filled with native SQLite, options include mysql and postgresql +--spring.database.type=mysql Use other databases, not filled with native h2, options include mysql --spring.datasource.url=jdbc:mysql://ip:port/nginxwebui Databases url @@ -104,9 +104,7 @@ Parameter description (both non-required) --spring.datasource.password=pass Databases password ---knife4j.production=false false:Open interface debugging page. true:Close interface debugging page. - -Note that the command ends with an & to indicate that the project is running in the background +Note that the Linux command ends with an & to indicate that the project is running in the background #### docker installation instructions @@ -168,6 +166,7 @@ services: ``` + #### Compile Compile the package with Maven @@ -202,7 +201,7 @@ Type=simple User=root Group=root WorkingDirectory=/home/nginxWebUI -ExecStart=/usr/bin/java -jar /home/nginxWebUI/nginxWebUI.jar +ExecStart=/usr/bin/java -jar -Dfile.encoding=UTF-8 /home/nginxWebUI/nginxWebUI.jar Restart=always [Install] @@ -269,41 +268,28 @@ Provides one-click synchronization to synchronize data configuration and certifi #### Interface development -This system provides the HTTP interface to invoke, as long as the boot parameters added --knife4j.production=false, then open the page http://xxx.xxx.xxx.xxx:8080/doc.html to view the knife4j interface. - -Interface invocation needs to add a token in the header. To obtain the token, you need to open the interface invocation permission of the user in the administrator management, and then invoke the token interface through the user name and password to get the token. Then set the global token in the document management of Knife4j. +This system provides the HTTP interface to invoke. Open the page http://xxx.xxx.xxx.xxx:8080/doc.html to view the smart-doc interface. -Note: In the parameter description, all fields with * prefix are required. +The interface invocation requires adding a token to the HTTP request header. To obtain the token, you need to enable the interface invocation permission of the user in the administrator management system, and then invoke the interface to obtain the token using the user name and password. - -![输入图片说明](http://www.nginxwebui.cn/img/knife4j.png "knife4j.png") +![输入图片说明](http://www.nginxwebui.cn/img/smart-doc.png "smart-doc.png") #### Forgot Password -If you forget your login password, follow the following tutorial to retrieve it +If you forget your login password or don't save the two-step verification QR code, you can reset your password and turn off two-step verification by following the tutorial below. -1. install sqlite3 (docker image has already included) +1.Stop the nginxWebUI process or stop the docker container. -``` -apt install sqlite3 -``` - -2. read sqlite.db +2.Run the nginxWebUI.jar using the retrieve password parameter. docker users need to download the nginxWebUI.jar separately to run this command ``` -sqlite3 /home/nginxWebUI/sqlite.db +java -jar nginxWebUI.jar --project.home=/home/nginxWebUI/ --project.findPass=true ``` -3. search admin table - -``` -select * from admin; -``` +--project.home Project profile directory or docker mapping directory -4. exit sqlite3 +--project.findPass Whether to print the user name and password -``` -.quit -``` +After the operation is successful, all user names and passwords can be reset printed and two steps verify will disabled. diff --git a/buildx.sh b/buildx.sh index 4a4a04de67641b776d3888d084884f647cf736c6..bbac9189bcfbd49cd46c98ae13da36a6ac9e0b48 100755 --- a/buildx.sh +++ b/buildx.sh @@ -10,7 +10,7 @@ set -o pipefail ## 基本信息 repo="cym1102/nginxwebui" -arch="linux/amd64,linux/arm64,linux/arm/v7" +arch="linux/386,linux/amd64,linux/arm64,linux/arm/v7" ver=$(cat pom.xml | grep -A1 nginxWebUI | grep version | grep -oP "\d+\.\d+\.\d+") echo "构建镜像:$repo" echo "构建架构:$arch" diff --git a/entrypoint.sh b/entrypoint.sh index b2d79e2de88e8a0a72a1a622dc877197e64ca0a6..7a7367c63def61b89ce950ce642a271fee4051b0 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,4 +1,4 @@ #!/bin/sh cd /home -exec java -jar -Xmx64m nginxWebUI.jar ${BOOT_OPTIONS} > /dev/null +exec java -jar -Dfile.encoding=UTF-8 -Xmx64m nginxWebUI.jar ${BOOT_OPTIONS} > /dev/null diff --git a/pom.xml b/pom.xml index 8b37346b775af2cb6f309218ddebc5643592ac6c..55e6cc7189796cb9ae65b5615abd4d3fa8addf5c 100644 --- a/pom.xml +++ b/pom.xml @@ -2,29 +2,46 @@ 4.0.0 com.cym nginxWebUI - 2.9.4 - - - org.springframework.boot - spring-boot-starter-parent - 2.5.8 - - - - + 3.5.8 + UTF-8 + UTF-8 1.8 - + + org.noear + solon-parent + 2.2.20 + - org.springframework.boot - spring-boot-starter-freemarker + org.noear + solon-web - org.springframework.boot - spring-boot-starter-web + org.noear + solon.boot.undertow + + + + org.noear + solon.logging.logback + + + org.noear + solon.scheduling.simple + + + + org.noear + solon-test + test + + + org.apache.commons + commons-compress + 1.21 @@ -33,11 +50,19 @@ 0.9.6 + + + com.h2database + h2 + 2.1.214 + + - cn.craccd - sqlHelper - 0.4.3 + mysql + mysql-connector-java + 8.0.28 + com.warrenstrange googleauth @@ -46,7 +71,7 @@ cn.hutool hutool-all - 5.7.14 + 5.8.18 @@ -54,7 +79,6 @@ mail 1.4.7 - com.google.zxing javase @@ -65,64 +89,105 @@ oshi-core 5.3.0 - - commons-io - commons-io - 2.7 - - com.github.xiaoymin - knife4j-spring-boot-starter - 3.0.3 + com.zaxxer + HikariCP + 4.0.3 - com.github.whvcse easy-captcha 1.6.2 - - org.springframework.boot - spring-boot-starter-websocket + com.fasterxml.jackson.core + jackson-annotations + 2.13.1 - + + + org.apache.maven + maven-model + 3.0 - + + + net.jodah + expiringmap + 0.5.10 + - org.springframework.boot - spring-boot-maven-plugin + com.github.shalousun + smart-doc-maven-plugin + 2.3.9 - - true - + + ./src/main/resources/smart-doc.json + + nginxWebUI + + + + + + html + + + + org.apache.maven.plugins - maven-surefire-plugin + maven-compiler-plugin + 3.8.1 - true + -parameters + 1.8 + 1.8 + UTF-8 + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + ${project.name}-${project.version} + false + + jar-with-dependencies + + + + com.cym.NginxWebUI + + + + + + make-assembly + package + + single + + + + diff --git a/src/main/java/com/cym/NginxWebUI.java b/src/main/java/com/cym/NginxWebUI.java index 8b99968a7e8b6b4bd1a8ec17168f0976825a5e9e..cff5837b2444e62bce040a76088bb9213e05eb4e 100644 --- a/src/main/java/com/cym/NginxWebUI.java +++ b/src/main/java/com/cym/NginxWebUI.java @@ -6,90 +6,86 @@ import java.lang.management.RuntimeMXBean; import java.util.ArrayList; import java.util.List; +import org.noear.solon.Solon; +import org.noear.solon.annotation.SolonMain; +import org.noear.solon.core.util.LogUtil; +import org.noear.solon.logging.utils.LogUtilToSlf4j; +import org.noear.solon.scheduling.annotation.EnableScheduling; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.system.ApplicationHome; -import org.springframework.transaction.annotation.EnableTransactionManagement; +import com.cym.utils.JarUtil; import com.cym.utils.SystemTool; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.RuntimeUtil; -@EnableTransactionManagement -@SpringBootApplication +@EnableScheduling +@SolonMain public class NginxWebUI { static Logger logger = LoggerFactory.getLogger(NginxWebUI.class); public static void main(String[] args) { try { // 尝试杀掉旧版本 - killSelf(); + killSelf(args); // 删掉多余的jar removeJar(); } catch (Exception e) { logger.error(e.getMessage(), e); } - - // 启动springboot - SpringApplication.run(NginxWebUI.class, args); + + Solon.start(NginxWebUI.class, args, app -> { + LogUtil.globalSet(new LogUtilToSlf4j()); + + app.onError(e -> logger.error(e.getMessage(), e)); + + app.before(c -> { + String path = c.path(); + while (path.contains("//")) { + path = path.replace("//", "/"); + } + c.pathNew(path); + }); + + app.onEvent(freemarker.template.Configuration.class, cfg -> { + cfg.setSetting("classic_compatible", "true"); + cfg.setSetting("number_format", "0.##"); + }); + + app.router().caseSensitive(true); + }); } - public static void killSelf() { + public static void killSelf(String[] args) { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); String myPid = runtimeMXBean.getName().split("@")[0]; List list = new ArrayList(); - List pids = new ArrayList(); - if (SystemTool.isWindows()) { - list = RuntimeUtil.execForLines("wmic process get commandline,ProcessId /value"); - pids = new ArrayList(); - - for (int i = 0; i < list.size(); i++) { - if (list.get(i).contains("java") && list.get(i).contains("nginxWebUI") && list.get(i).contains(".jar")) { - String pid = list.get(i + 2).split("=")[1]; - if (!pid.equals(myPid)) { - pids.add(pid); + list = RuntimeUtil.execForLines("jps"); + for (String line : list) { + if (line.contains("nginxWebUI") && line.contains(".jar")) { + String pid = line.split("\\s+")[0].trim(); + if (!pid.equals(myPid)) { + logger.info("杀掉旧进程:" + pid); + if (SystemTool.isWindows()) { + RuntimeUtil.exec("taskkill /im " + pid + " /f"); + } else if (SystemTool.isLinux()) { + RuntimeUtil.exec("kill -9 " + pid); } } } - } else if (SystemTool.isLinux()) { - list = RuntimeUtil.execForLines("ps -ef"); - for (String line : list) { - if (line.contains("java") && line.contains("nginxWebUI") && line.contains(".jar")) { - String[] strs = line.split("\\s+"); - String pid = strs[1]; - - if (!pid.equals(myPid)) { - logger.info("找到进程:" + line); - pids.add(pid); - } - } - } - } - - for (String pid : pids) { - logger.info("杀掉进程:" + pid); - if (SystemTool.isWindows()) { - RuntimeUtil.exec("taskkill /im " + pid + " /f"); - } else if (SystemTool.isLinux()) { - RuntimeUtil.exec("kill -9 " + pid); - } } } - private static void removeJar() { - ApplicationHome home = new ApplicationHome(NginxWebUI.class); - File jar = home.getSource(); - File[] list = jar.getParentFile().listFiles(); + private static void removeJar() { + File[] list = new File(JarUtil.getCurrentFilePath()).getParentFile().listFiles(); for (File file : list) { - if (file.getName().startsWith("nginxWebUI") && file.getName().endsWith(".jar") && !file.getName().equals(jar.getName())) { + if (file.getName().startsWith("nginxWebUI") && file.getName().endsWith(".jar") && !file.getPath().equals(JarUtil.getCurrentFilePath())) { FileUtil.del(file); logger.info("删除文件:" + file); } diff --git a/src/main/java/com/cym/config/ApiInterceptor.java b/src/main/java/com/cym/config/ApiInterceptor.java deleted file mode 100644 index 71421e386038d12e9c1aadb63a74f8e815e0ba03..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/ApiInterceptor.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.cym.config; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; - -import com.cym.model.Admin; -import com.cym.service.AdminService; -import com.cym.utils.JsonResult; -import com.cym.utils.MessageUtils; - -import cn.hutool.json.JSONUtil; - -@Component -public class ApiInterceptor implements HandlerInterceptor { - - @Autowired - MessageUtils m; - @Autowired - AdminService adminService; - - /* - * 视图渲染之后的操作 - */ - @Override - public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { - - } - - /* - * 处理请求完成后视图渲染之前的处理操作 - */ - @Override - public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { - - } - - /* - * 进入controller层之前拦截请求 - */ - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { - String token = request.getHeader("token"); - Admin admin = adminService.getByToken(token); - - if (admin != null && admin.getApi()) { - return true; - } else { - - JsonResult result = new JsonResult(); - result.setSuccess(false); - result.setStatus("401"); - result.setMsg(m.get("apiStr.wrongToken")); - - response.setCharacterEncoding("UTF-8"); - PrintWriter out = response.getWriter(); - out.append(JSONUtil.toJsonPrettyStr(result)); - - return false; - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/cym/config/AdminInterceptor.java b/src/main/java/com/cym/config/AppFilter.java similarity index 31% rename from src/main/java/com/cym/config/AdminInterceptor.java rename to src/main/java/com/cym/config/AppFilter.java index b433d3dca350b6d8baf88137b76363e67b1a88ae..d26601fb590268c7d49262250cf37b7a3f796fd8 100644 --- a/src/main/java/com/cym/config/AdminInterceptor.java +++ b/src/main/java/com/cym/config/AppFilter.java @@ -4,36 +4,38 @@ import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.OutputStream; -import java.io.PrintWriter; import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import java.util.Properties; +import java.util.Set; + +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Filter; +import org.noear.solon.core.handle.FilterChain; +import org.noear.solon.core.handle.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.MultipartHttpServletRequest; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; import com.cym.model.Admin; +import com.cym.model.Message; import com.cym.model.Remote; +import com.cym.service.AdminService; import com.cym.service.CreditService; +import com.cym.service.SettingService; import com.cym.utils.BaseController; +import com.cym.utils.JsonResult; import com.cym.utils.MessageUtils; +import com.cym.utils.PropertiesUtils; import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DateUtil; @@ -43,63 +45,116 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; @Component -public class AdminInterceptor implements HandlerInterceptor { +public class AppFilter implements Filter { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired - CreditService creditService; - @Autowired + @Inject + AdminService adminService; + @Inject MessageUtils m; + @Inject + CreditService creditService; + @Inject("${solon.app.name}") + String projectName; - /* - * 视图渲染之后的操作 - */ - @Override - public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { + @Inject + VersionConfig versionConfig; - } + @Inject + PropertiesUtils propertiesUtils; + @Inject + SettingService settingService; - /* - * 处理请求完成后视图渲染之前的处理操作 - */ @Override - public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { + public void doFilter(Context ctx, FilterChain chain) throws Throwable { + + String path = ctx.path().toLowerCase(); + + // 全局过滤器 + if (!path.contains("/lib/") // + && !path.toLowerCase().contains("/js/") // + && !path.toLowerCase().contains("/doc/") // + && !path.toLowerCase().contains("/img/") // + && !path.toLowerCase().contains("/css/")) { + frontInterceptor(ctx); + } + + // 登录过滤器 + if (path.toLowerCase().contains("/adminPage/".toLowerCase()) // + && !path.contains("/lib/") // + && !path.contains("/doc/") // + && !path.contains("/js/") // + && !path.contains("/img/") // + && !path.contains("/css/")) { + if (!adminInterceptor(ctx)) { + // 设置为已处理 + ctx.setHandled(true); + return; + } + } + + // api过滤器 + if (path.toLowerCase().contains("/api/") // + && !path.contains("/lib/") // + && !path.contains("/doc/") // + && !path.contains("/js/") // + && !path.contains("/img/") // + && !path.contains("/css/")) { + if (!apiInterceptor(ctx)) { + // 设置为已处理 + ctx.setHandled(true); + return; + } + } + + chain.doFilter(ctx); } - /* - * 进入controller层之前拦截请求 - */ - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { - String httpHost = request.getHeader("X-Forwarded-Host"); - String realPort = request.getHeader("X-Forwarded-Port"); - String host = request.getHeader("Host"); + private boolean apiInterceptor(Context ctx) { + String token = ctx.header("token"); + Admin admin = adminService.getByToken(token); - String ctx = getCtx(httpHost, host, realPort); + if (admin != null && admin.getApi()) { + return true; + } else { + + JsonResult result = new JsonResult(); + result.setSuccess(false); + result.setStatus("401"); + result.setMsg(m.get("apiStr.wrongToken")); + + ctx.output(JSONUtil.toJsonPrettyStr(result)); + return false; + } + + } - if (request.getRequestURL().toString().contains("adminPage/login")) { + private boolean adminInterceptor(Context ctx) { + String ctxStr = getCtxStr(ctx); + + if (ctx.path().toLowerCase().contains("adminPage/login".toLowerCase())) { return true; } - String creditKey = request.getParameter("creditKey"); + String creditKey = ctx.param("creditKey"); Boolean isCredit = creditService.check(creditKey); - Boolean isLogin = (Boolean) request.getSession().getAttribute("isLogin"); + Boolean isLogin = (Boolean) ctx.session("isLogin"); if (!((isLogin != null && isLogin) || isCredit)) { - response.sendRedirect(ctx + "/adminPage/login"); + ctx.redirect("/adminPage/login"); return false; } - String localType = (String) request.getSession().getAttribute("localType"); + String localType = (String) ctx.session("localType"); if (localType != null // && localType.equals("remote") // - && !request.getRequestURL().toString().contains("adminPage/remote") // - && !request.getRequestURL().toString().contains("adminPage/admin") // - && !request.getRequestURL().toString().contains("adminPage/abort") // + && !ctx.path().toLowerCase().contains("adminPage/remote".toLowerCase()) // + && !ctx.path().toLowerCase().contains("adminPage/admin".toLowerCase()) // + && !ctx.path().toLowerCase().contains("adminPage/about".toLowerCase()) // ) { // 转发到远程服务器 - Remote remote = (Remote) request.getSession().getAttribute("remote"); - String url = buildUrl(ctx, request, remote); + Remote remote = (Remote) ctx.session("remote"); + String url = buildUrl(ctxStr, ctx, remote); try { String rs = null; @@ -107,53 +162,124 @@ public class AdminInterceptor implements HandlerInterceptor { // 上传文件 Map map = new HashMap<>(); map.put("creditKey", remote.getCreditKey()); - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - MultipartFile multipartFile = multipartRequest.getFile("file"); - File temp = new File(FileUtil.getTmpDir() + "/" + multipartFile.getOriginalFilename()); - multipartFile.transferTo(temp); + + UploadedFile uploadedFile = ctx.file("file"); + + File temp = new File(FileUtil.getTmpDir() + "/" + uploadedFile.getName()); + uploadedFile.transferTo(temp); map.put("file", temp); rs = HttpUtil.post(url, map); } else { // 普通请求 - Admin admin = new BaseController().getAdmin(request); - String body = buldBody(request.getParameterMap(), remote, admin); + Admin admin = new BaseController().getAdmin(); + String body = buldBody(ctx.paramsMap(), remote, admin); rs = HttpUtil.post(url, body); } - response.setCharacterEncoding("utf-8"); - response.setContentType("text/html;charset=utf-8"); + ctx.charset("utf-8"); + ctx.contentType("text/html;charset=utf-8"); - if (JSONUtil.isJson(rs)) { + if (JSONUtil.isTypeJSON(rs)) { String date = DateUtil.format(new Date(), "yyyy-MM-dd_HH-mm-ss"); - response.addHeader("Content-Type", "application/octet-stream"); - response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(date + ".json", "UTF-8")); // 设置文件名 + ctx.header("Content-Type", "application/octet-stream"); + ctx.header("content-disposition", "attachment;filename=" + URLEncoder.encode(date + ".json", "UTF-8")); // 设置文件名 byte[] buffer = new byte[1024]; BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(rs.getBytes(Charset.forName("UTF-8")))); - OutputStream os = response.getOutputStream(); + OutputStream os = ctx.outputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } } else { - PrintWriter out = response.getWriter(); - out.append(rs); + ctx.output(rs); } } catch (Exception e) { logger.error(e.getMessage(), e); - response.sendRedirect(ctx + "/adminPage/login/noServer"); + ctx.redirect("/adminPage/login/noServer"); } + return false; } return true; } - private String buldBody(Map parameterMap, Remote remote, Admin admin) throws UnsupportedEncodingException { + private void frontInterceptor(Context ctx) { + String ctxStr = getCtxStr(ctx); + if (StrUtil.isNotEmpty(ctx.param("ctx"))) { + ctxStr = Base64.decodeStr(ctx.param("ctx")); + } + + ctx.attrSet("ctx", ctxStr); + + ctx.attrSet("jsrandom", versionConfig.currentVersion); + ctx.attrSet("currentVersion", versionConfig.currentVersion); + ctx.attrSet("projectName", projectName); + + ctx.attrSet("showAdmin", ctx.param("showAdmin")); + ctx.attrSet("admin", ctx.session("admin")); + + // 显示版本更新 + if (versionConfig.newVersion != null) { + ctx.attrSet("newVersion", versionConfig.newVersion); + + if (Integer.parseInt(versionConfig.currentVersion.replace(".", "").replace("v", "")) < Integer.parseInt(versionConfig.newVersion.getVersion().replace(".", "").replace("v", ""))) { + ctx.attrSet("hasNewVersion", 1); + } + } + + // 读取配置文件 + Properties properties = null; + String l = ctx.param("l"); + if (StrUtil.isNotEmpty(l) && l.equals("en_US") || settingService.get("lang") != null && settingService.get("lang").equals("en_US")) { + settingService.set("lang", "en_US"); + properties = m.getPropertiesEN(); + } else { + settingService.set("lang", ""); + properties = m.getProperties(); + } + + // js国际化 + Set messageHeaders = new HashSet<>(); + List messages = new ArrayList<>(); + for (String key : properties.stringPropertyNames()) { + Message message = new Message(); + message.setKey(key); + message.setValue(properties.getProperty(key)); + messages.add(message); + + messageHeaders.add(key.split("\\.")[0]); + } + + ctx.attrSet("messageHeaders", messageHeaders); + ctx.attrSet("messages", messages); + + // html国际化 + for (String key : messageHeaders) { + Map map = new HashMap<>(); + for (Message message : messages) { + if (message.getKey().split("\\.")[0].equals(key)) { + map.put(message.getKey().split("\\.")[1], message.getValue()); + } + } + + ctx.attrSet(key, map); + } + + if (settingService.get("lang") != null && settingService.get("lang").equals("en_US")) { + ctx.attrSet("langType", "切换到中文"); + } else { + ctx.attrSet("langType", "Switch to English"); + } + + } + + private String buldBody(Map> parameterMap, Remote remote, Admin admin) throws UnsupportedEncodingException { List body = new ArrayList<>(); body.add("creditKey=" + remote.getCreditKey()); if (admin != null) { @@ -163,7 +289,7 @@ public class AdminInterceptor implements HandlerInterceptor { for (Iterator itr = parameterMap.entrySet().iterator(); itr.hasNext();) { Map.Entry me = (Map.Entry) itr.next(); - for (String value : (String[]) me.getValue()) { + for (String value : (List) me.getValue()) { body.add(me.getKey() + "=" + URLEncoder.encode(value, "UTF-8")); } @@ -172,8 +298,8 @@ public class AdminInterceptor implements HandlerInterceptor { return StrUtil.join("&", body); } - private String buildUrl(String ctx, HttpServletRequest request, Remote remote) { - String url = request.getRequestURL().toString().replace(ctx, "//" + remote.getIp() + ":" + remote.getPort() + "/"); + private String buildUrl(String ctxStr, Context ctx, Remote remote) { + String url = ctx.url().replace(ctxStr, "//" + remote.getIp() + ":" + remote.getPort() + "/"); if (url.startsWith("http")) { url = url.replace("http:", "").replace("https:", ""); @@ -181,7 +307,7 @@ public class AdminInterceptor implements HandlerInterceptor { } url = remote.getProtocol() + ":" + url; - Admin admin = (Admin) request.getSession().getAttribute("admin"); + Admin admin = (Admin) ctx.session("admin"); String showAdmin = "false"; if (admin != null && admin.getType() == 0) { showAdmin = "true"; @@ -189,20 +315,31 @@ public class AdminInterceptor implements HandlerInterceptor { return url + "?jsrandom=" + System.currentTimeMillis() + // "&protocol=" + remote.getProtocol() + // "&showAdmin=" + showAdmin + // - "&ctx=" + Base64.encode(ctx); + "&ctx=" + Base64.encode(ctxStr); } - public static String getCtx(String httpHost, String host, String realPort) { + public String getCtxStr(Context context) { + String httpHost = context.header("X-Forwarded-Host"); + String realPort = context.header("X-Forwarded-Port"); + String host = context.header("Host"); + String ctx = "//"; if (StrUtil.isNotEmpty(httpHost)) { ctx += httpHost; + } else if (StrUtil.isNotEmpty(host)) { + ctx += host; + if (!host.contains(":") && StrUtil.isNotEmpty(realPort)) { + ctx += ":" + realPort; + } } else { + host = context.url().split("/")[2]; ctx += host; if (!host.contains(":") && StrUtil.isNotEmpty(realPort)) { ctx += ":" + realPort; } } return ctx; + } } \ No newline at end of file diff --git a/src/main/java/com/cym/config/FreeMarkerConfig.java b/src/main/java/com/cym/config/FreeMarkerConfig.java deleted file mode 100644 index 5c2d96a582f59f9eae952efc761da4f5475e48ff..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/FreeMarkerConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.cym.config; - -import java.io.IOException; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; -import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; - -import freemarker.template.TemplateException; - -@Configuration -public class FreeMarkerConfig { - - @Bean - public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException { - FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); - freeMarkerConfigurer.setTemplateLoaderPath("classpath:templates/"); - - freemarker.template.Configuration configuration = freeMarkerConfigurer.createConfiguration(); - configuration.setDefaultEncoding("UTF-8"); - configuration.setSetting("classic_compatible", "true");// 使用经典语法 - configuration.setSetting("number_format", "0.##"); - - freeMarkerConfigurer.setConfiguration(configuration); - return freeMarkerConfigurer; - } - - @Bean - public FreeMarkerViewResolver freeMarkerViewResolver() { - FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); - resolver.setPrefix(""); - resolver.setSuffix(".html"); - resolver.setContentType("text/html; charset=UTF-8"); - resolver.setRequestContextAttribute("request"); // 将上下文路径注入request变量 - - return resolver; - - } -} diff --git a/src/main/java/com/cym/config/FrontInterceptor.java b/src/main/java/com/cym/config/FrontInterceptor.java deleted file mode 100644 index fbe496e6953d1d3e2eb3798c18c824d64e0a19d7..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/FrontInterceptor.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.cym.config; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; - -import com.cym.model.Message; -import com.cym.service.SettingService; -import com.cym.utils.MessageUtils; -import com.cym.utils.PropertiesUtils; - -import cn.hutool.core.codec.Base64; -import cn.hutool.core.util.StrUtil; - -@Component -public class FrontInterceptor implements HandlerInterceptor { - - @Value("${spring.application.name}") - String projectName; - - @Autowired - VersionConfig versionConfig; - - @Value("${project.version}") - String currentVersion; - - @Autowired - PropertiesUtils propertiesUtils; - - @Autowired - SettingService settingService; - @Autowired - MessageUtils m; - - /* - * 视图渲染之后的操作 - */ - @Override - public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { - - } - - /* - * 处理请求完成后视图渲染之前的处理操作 - */ - @Override - public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { - - } - - /* - * 进入controller层之前拦截请求 - */ - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { - String httpHost = request.getHeader("X-Forwarded-Host"); - String realPort = request.getHeader("X-Forwarded-Port"); - String host = request.getHeader("Host"); - - String ctx = AdminInterceptor.getCtx(httpHost, host, realPort); - if (StrUtil.isNotEmpty(request.getParameter("ctx"))) { - ctx = Base64.decodeStr(request.getParameter("ctx")); - } - - request.setAttribute("ctx", ctx); - - request.setAttribute("jsrandom", currentVersion); - request.setAttribute("currentVersion", currentVersion); - request.setAttribute("projectName", projectName); - - request.setAttribute("showAdmin", request.getParameter("showAdmin")); - - // 显示版本更新 - if (versionConfig.getVersion() != null) { - request.setAttribute("newVersion", versionConfig.getVersion()); - - if (Integer.parseInt(currentVersion.replace(".", "").replace("v", "")) < Integer.parseInt(versionConfig.getVersion().getVersion().replace(".", "").replace("v", ""))) { - request.setAttribute("hasNewVersion", 1); - } - } - - // 读取配置文件 - Properties properties = null; - String l = request.getParameter("l"); - if (StrUtil.isNotEmpty(l) && l.equals("en_US") || settingService.get("lang") != null && settingService.get("lang").equals("en_US")) { - settingService.set("lang", "en_US"); - properties = m.getPropertiesEN(); - } else { - settingService.set("lang", ""); - properties = m.getProperties(); - } - - // js国际化 - Set messageHeaders = new HashSet<>(); - List messages = new ArrayList<>(); - for (String key : properties.stringPropertyNames()) { - Message message = new Message(); - message.setKey(key); - message.setValue(properties.getProperty(key)); - messages.add(message); - - messageHeaders.add(key.split("\\.")[0]); - } - - request.setAttribute("messageHeaders", messageHeaders); - request.setAttribute("messages", messages); - - // html国际化 - for (String key : messageHeaders) { - Map map = new HashMap<>(); - for (Message message : messages) { - if (message.getKey().split("\\.")[0].equals(key)) { - map.put(message.getKey().split("\\.")[1], message.getValue()); - } - } - - request.setAttribute(key, map); - } - - if (settingService.get("lang") != null && settingService.get("lang").equals("en_US")) { - request.setAttribute("langType", "切换到中文"); - } else { - request.setAttribute("langType", "Switch to English"); - } - - return true; - } - -} \ No newline at end of file diff --git a/src/main/java/com/cym/config/HomeConfig.java b/src/main/java/com/cym/config/HomeConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..32290649c9e96594990b32e11154616778c1393f --- /dev/null +++ b/src/main/java/com/cym/config/HomeConfig.java @@ -0,0 +1,63 @@ +package com.cym.config; + +import java.io.File; + +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Init; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.bean.InitializingBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.cym.utils.FilePermissionUtil; +import com.cym.utils.JarUtil; +import com.cym.utils.SystemTool; +import com.cym.utils.ToolUtils; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; + +@Component +public class HomeConfig { + @Inject("${project.home}") + public String home; + public String acmeShDir; + public String acmeSh; + + Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Init + public void afterInjection() { + if (StrUtil.isEmpty(home)) { + // 获取jar位置 + File file = new File(JarUtil.getCurrentFilePath()); + + if (file.getPath().contains("target") && file.getPath().contains("classes")) { + home = FileUtil.getUserHomePath() + File.separator + "svnWebUI"; + } else { + home = file.getParent(); + } + } + + // windows 加上盘符 + if (SystemTool.isWindows() && !home.contains(":")) { + home = JarUtil.getCurrentFilePath().split(":")[0] + ":" + home; + } + + // 如果最后没有/, 加上/ + home = ToolUtils.endDir(ToolUtils.handlePath(home)); + + // 检查路home权限 + if (!FilePermissionUtil.canWrite(new File(home))) { + logger.error(home + " " + "directory does not have writable permission. Please specify it again."); + logger.error(home + " " + "目录没有可写权限,请重新指定."); + System.exit(1); + } + + // acme路径 + acmeShDir = home + ".acme.sh/"; + acmeSh = home + ".acme.sh/acme.sh"; + } + + +} diff --git a/src/main/java/com/cym/config/InitConfig.java b/src/main/java/com/cym/config/InitConfig.java index 5691f94fc2c3f152cc745c7067e5e440dcb5bce7..e07105211586cd937aab7336d5ba70ca275e4d56 100644 --- a/src/main/java/com/cym/config/InitConfig.java +++ b/src/main/java/com/cym/config/InitConfig.java @@ -1,78 +1,76 @@ package com.cym.config; -import java.io.File; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; -import javax.annotation.PostConstruct; - +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Init; +import org.noear.solon.annotation.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.system.ApplicationHome; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.ClassPathResource; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; +import com.cym.model.Admin; import com.cym.model.Basic; +import com.cym.model.Cert; import com.cym.model.Http; import com.cym.service.BasicService; +import com.cym.service.ConfService; import com.cym.service.SettingService; -import com.cym.utils.FilePermissionUtil; +import com.cym.sqlhelper.utils.ConditionAndWrapper; +import com.cym.sqlhelper.utils.SqlHelper; +import com.cym.utils.EncodePassUtils; import com.cym.utils.MessageUtils; import com.cym.utils.NginxUtils; import com.cym.utils.SystemTool; -import com.cym.utils.ToolUtils; -import cn.craccd.sqlHelper.utils.SqlHelper; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; +import cn.hutool.crypto.SecureUtil; @Component public class InitConfig { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired - protected MessageUtils m; - @Autowired - private ApplicationContext applicationContext; + @Inject + MessageUtils m; + + @Inject + HomeConfig homeConfig; - public static String acmeSh; - public static String acmeShDir; - public static String home; + @Inject + VersionConfig versionConfig; - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject BasicService basicService; - @Autowired - ScheduleTask scheduleTask; - @Autowired + @Inject SqlHelper sqlHelper; - @Autowired - JdbcTemplate jdbcTemplate; - - @Value("${project.home}") - public void setHome(String home) { - - InitConfig.home = ToolUtils.endDir(home); - InitConfig.acmeShDir = home + ".acme.sh/"; - InitConfig.acmeSh = home + ".acme.sh/acme.sh"; - } - - @PostConstruct - public void init() throws IOException { - if (!FilePermissionUtil.canWrite(new File(home))) { - logger.error(home + " " + "directory does not have writable permission. Please specify it again."); - logger.error(home + " " + "目录没有可写权限,请重新指定."); - SpringApplication.exit(applicationContext); + @Inject + ConfService confService; + + @Inject("${project.findPass}") + Boolean findPass; + + @Init + public void start() throws Throwable { + // 找回密码 + if (findPass) { + List admins = sqlHelper.findAll(Admin.class); + for (Admin admin : admins) { + System.out.println(m.get("adminStr.name") + ":" + admin.getName() + " " + m.get("adminStr.pass") + ":" + EncodePassUtils.defaultPass); + admin.setAuth(false); // 关闭二次验证 + admin.setPass(EncodePassUtils.encodeDefaultPass()); + sqlHelper.updateById(admin); + } + System.exit(1); } // 初始化base值 @@ -80,7 +78,7 @@ public class InitConfig { if (count == 0) { List basics = new ArrayList(); basics.add(new Basic("worker_processes", "auto", 1l)); - basics.add(new Basic("events", "{\r\n" + " worker_connections 1024;\r\n accept_mutex on;\r\n" + "}", 2l)); + basics.add(new Basic("events", "{\r\n worker_connections 1024;\r\n accept_mutex on;\r\n" + "}", 2l)); sqlHelper.insertAll(basics); } @@ -94,58 +92,63 @@ public class InitConfig { } // 释放nginx.conf,mime.types - if (!FileUtil.exist(home + "nginx.conf")) { + if (!FileUtil.exist(homeConfig.home + "nginx.conf")) { ClassPathResource resource = new ClassPathResource("nginx.conf"); - FileUtil.writeFromStream(resource.getInputStream(), home + "nginx.conf"); + FileUtil.writeFromStream(resource.getStream(), homeConfig.home + "nginx.conf"); } - if (!FileUtil.exist(home + "mime.types")) { + if (!FileUtil.exist(homeConfig.home + "mime.types")) { ClassPathResource resource = new ClassPathResource("mime.types"); - FileUtil.writeFromStream(resource.getInputStream(), home + "mime.types"); + FileUtil.writeFromStream(resource.getStream(), homeConfig.home + "mime.types"); } // 设置nginx配置文件 String nginxPath = settingService.get("nginxPath"); if (StrUtil.isEmpty(nginxPath)) { - nginxPath = home + "nginx.conf"; + nginxPath = homeConfig.home + "nginx.conf"; // 设置nginx.conf路径 settingService.set("nginxPath", nginxPath); } - if (SystemTool.isLinux()) { - // 释放acme全新包 - ClassPathResource resource = new ClassPathResource("acme.zip"); - InputStream inputStream = resource.getInputStream(); - FileUtil.writeFromStream(inputStream, InitConfig.home + "acme.zip"); - FileUtil.mkdir(acmeShDir); - ZipUtil.unzip(home + "acme.zip", acmeShDir); - FileUtil.del(home + "acme.zip"); - - // 修改acme.sh文件 - List res = FileUtil.readUtf8Lines(acmeSh); - for (int i = 0; i < res.size(); i++) { - if (res.get(i).contains("DEFAULT_INSTALL_HOME=\"$HOME/.$PROJECT_NAME\"")) { - res.set(i, "DEFAULT_INSTALL_HOME=\"" + acmeShDir + "\""); - } + // 释放acme全新包 + ClassPathResource resource = new ClassPathResource("acme.zip"); + InputStream inputStream = resource.getStream(); + FileUtil.writeFromStream(inputStream, homeConfig.home + "acme.zip"); + FileUtil.mkdir(homeConfig.acmeShDir); + ZipUtil.unzip(homeConfig.home + "acme.zip", homeConfig.acmeShDir); + FileUtil.del(homeConfig.home + "acme.zip"); + + // 修改acme.sh文件 + List res = FileUtil.readUtf8Lines(homeConfig.acmeSh); + for (int i = 0; i < res.size(); i++) { + if (res.get(i).contains("DEFAULT_INSTALL_HOME=\"$HOME/.$PROJECT_NAME\"")) { + res.set(i, "DEFAULT_INSTALL_HOME=\"" + homeConfig.acmeShDir + "\""); } + } + FileUtil.writeUtf8Lines(res, homeConfig.acmeSh); - FileUtil.writeUtf8Lines(res, acmeSh); - RuntimeUtil.exec("chmod a+x " + acmeSh); + if (SystemTool.isLinux()) { + RuntimeUtil.exec("chmod a+x " + homeConfig.acmeSh); // 查找ngx_stream_module模块 if (!basicService.contain("ngx_stream_module.so")) { - logger.info(m.get("commonStr.ngxStream")); - List list = RuntimeUtil.execForLines(CharsetUtil.systemCharset(), "find / -name ngx_stream_module.so"); - for (String path : list) { - if (path.contains("ngx_stream_module.so") && path.length() < 80) { - Basic basic = new Basic("load_module", path, -10l); - sqlHelper.insert(basic); - break; + if (FileUtil.exist("/usr/lib/nginx/modules/ngx_stream_module.so")) { + Basic basic = new Basic("load_module", "/usr/lib/nginx/modules/ngx_stream_module.so", -10l); + sqlHelper.insert(basic); + } else { + logger.info(m.get("commonStr.ngxStream")); + List list = RuntimeUtil.execForLines(CharsetUtil.systemCharset(), "find / -name ngx_stream_module.so"); + for (String path : list) { + if (path.contains("ngx_stream_module.so") && path.length() < 80) { + Basic basic = new Basic("load_module", path, -10l); + sqlHelper.insert(basic); + break; + } } } } - // 判断是否是容器中 - if (inDocker()) { + // 判断是否存在nginx命令 + if (hasNginx() && StrUtil.isEmpty(settingService.get("nginxExe"))) { // 设置nginx执行文件 settingService.set("nginxExe", "nginx"); } @@ -166,28 +169,68 @@ public class InitConfig { } } - } + // 将复制的证书文件还原到acme文件夹里面 + List certs = confService.getApplyCerts(); + for (Cert cert : certs) { + boolean update = false; + if (cert.getPem() != null && cert.getPem().equals(homeConfig.home + "cert/" + cert.getDomain() + ".fullchain.cer")) { + cert.setPem(homeConfig.acmeShDir + cert.getDomain() + "/fullchain.cer"); + update = true; + } + if (cert.getKey() != null && cert.getKey().equals(homeConfig.home + "cert/" + cert.getDomain() + ".key")) { + cert.setKey(homeConfig.acmeShDir + cert.getDomain() + "/" + cert.getDomain() + ".key"); + update = true; + } - /** - * 是否在docker中 - * - * @return - */ - private Boolean inDocker() { - List rs = RuntimeUtil.execForLines("cat /proc/1/cgroup"); - for (String str : rs) { -// logger.info(str); - if (str.contains("docker")) { - logger.info("I am in docker"); - return true; + if (update) { + sqlHelper.updateById(cert); } - if (str.contains("kubepods")) { - logger.info("I am in k8s"); - return true; + } + + // 证书加密方式RAS改为RSA + certs = sqlHelper.findListByQuery(new ConditionAndWrapper().eq(Cert::getEncryption, "RAS"), Cert.class); + for (Cert cert : certs) { + cert.setEncryption("RSA"); + sqlHelper.updateById(cert); + } + + // 将密码加密 + List admins = sqlHelper.findAll(Admin.class); + for (Admin admin : admins) { + if (!StrUtil.endWith(admin.getPass(), SecureUtil.md5(EncodePassUtils.defaultPass))) { + admin.setPass(EncodePassUtils.encode(admin.getPass())); + sqlHelper.updateById(admin); } } - logger.info("I am not in docker"); + + // 展示logo + showLogo(); + } + + private boolean hasNginx() { + String rs = RuntimeUtil.execForStr("which nginx"); + if (StrUtil.isNotEmpty(rs)) { + return true; + } + return false; } + private void showLogo() throws IOException { + ClassPathResource resource = new ClassPathResource("banner.txt"); + BufferedReader reader = resource.getReader(Charset.forName("utf-8")); + String str = null; + StringBuilder stringBuilder = new StringBuilder(); + // 使用readLine() 比较方便的读取一行 + while (null != (str = reader.readLine())) { + stringBuilder.append(str + "\n"); + } + reader.close();// 关闭流 + + stringBuilder.append("nginxWebUI " + versionConfig.currentVersion + "\n"); + + logger.info(stringBuilder.toString()); + + } + } diff --git a/src/main/java/com/cym/config/Knife4jConfiguration.java b/src/main/java/com/cym/config/Knife4jConfiguration.java deleted file mode 100644 index 18c801738a0f1cce054311c6618f343a76173a32..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/Knife4jConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.cym.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; - -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -/** - * Knife4j 配置 - * - * @author Cym - * - */ -@Configuration -@EnableKnife4j -public class Knife4jConfiguration { - - @Bean(value = "api") - public Docket api() { - return buildDocket("外部调用接口", "com.cym.controller.api"); - } - - /** - * - * @param groupName 分组名 - * @param basePackage 扫描包路径 - * @return - */ - private Docket buildDocket(String groupName, String basePackage) { - Docket docket = new Docket(DocumentationType.SWAGGER_2)// - .apiInfo(new ApiInfoBuilder()// - .title("nginxWebUI")// - .description("RESTful APIs")// - .version("1.0")// - .build())// - .groupName(groupName) // - .select()// - .apis(RequestHandlerSelectors.basePackage(basePackage))// - .paths(PathSelectors.any())// - .build(); - - return docket; - } -} \ No newline at end of file diff --git a/src/main/java/com/cym/config/MultipartConfig.java b/src/main/java/com/cym/config/MultipartConfig.java deleted file mode 100644 index 6e892153d83876d29e873acf8d45bd7bff1530fe..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/MultipartConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.cym.config; - -import javax.servlet.MultipartConfigElement; - -import org.springframework.boot.web.servlet.MultipartConfigFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.unit.DataSize; - -@Configuration -public class MultipartConfig { - - @Bean - public MultipartConfigElement multipartConfigElement() { - MultipartConfigFactory factory = new MultipartConfigFactory(); - - // 置文件大小限制 ,超出此大小页面会抛出异常信息 - factory.setMaxFileSize(DataSize.ofGigabytes(5)); // KB,MB - // 设置总上传数据总大小 - factory.setMaxRequestSize(DataSize.ofGigabytes(5)); - // 设置文件临时文件夹路径 - factory.setLocation(System.getProperty("java.io.tmpdir")); - // 如果文件大于这个值,将以文件的形式存储,如果小/于这个值文件将存储在内存中,默认为0 - // factory.setMaxRequestSize(0); - return factory.createMultipartConfig(); - } -} \ No newline at end of file diff --git a/src/main/java/com/cym/config/ScheduledConfig.java b/src/main/java/com/cym/config/ScheduledConfig.java deleted file mode 100644 index f2a83def9d16f5d581e5bedb3af5e8e5dba1852f..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/ScheduledConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.cym.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.TaskScheduler; -import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; - -@Configuration -public class ScheduledConfig { - // 不能同时使用websocket和spring的定时注解 - // 此时需要创建一个bean,这样就不会和websocket注解有冲突 - @Bean - public TaskScheduler taskScheduler(){ - ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); - taskScheduler.setPoolSize(10); - taskScheduler.initialize(); - return taskScheduler; - } -} \ No newline at end of file diff --git a/src/main/java/com/cym/config/SqlConfig.java b/src/main/java/com/cym/config/SqlConfig.java deleted file mode 100644 index 187f00ac445c6d7f6320549c76a09bd139ce45e7..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/SqlConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.cym.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import cn.craccd.sqlHelper.utils.SqlHelper; - -@Configuration -@ComponentScan(basePackages = { "cn.craccd" }) -public class SqlConfig { - @Autowired - SqlHelper sqlHelper; - -} diff --git a/src/main/java/com/cym/config/VersionConfig.java b/src/main/java/com/cym/config/VersionConfig.java index fa60ef8bfafac9d95c0d288cf53f59d0a18d9b81..cc7174cb001c3ae7be8f9ae69325546deb59b96c 100644 --- a/src/main/java/com/cym/config/VersionConfig.java +++ b/src/main/java/com/cym/config/VersionConfig.java @@ -1,41 +1,88 @@ package com.cym.config; -import javax.annotation.PostConstruct; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Properties; -import org.springframework.context.annotation.Configuration; +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Init; +import org.noear.solon.core.bean.InitializingBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.cym.model.Version; +import com.cym.utils.SystemTool; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; -@Configuration -public class VersionConfig { +@Component +public class VersionConfig { + Logger logger = LoggerFactory.getLogger(VersionConfig.class); - Version version; + public Version newVersion; - @PostConstruct - public void getNewVersion() { - + public String currentVersion; + + @Init + public void afterInjection() { + checkVersion(); + } + + public void checkVersion(){ + // 获取版本号 + try { + currentVersion = getFromPom(); + } catch (Exception e) { + logger.info(e.getMessage(), e); + } + + // 获取服务器最新版本 try { String json = HttpUtil.get("https://www.nginxwebui.cn/download/version.json", 1000); if (StrUtil.isNotEmpty(json)) { - version = JSONUtil.toBean(json, Version.class); + newVersion = JSONUtil.toBean(json, Version.class); } } catch (Exception e) { - System.err.println(e.getMessage()); + logger.error("更新服务器不可访问"); + } - } - - public Version getVersion() { - return version; - } + public String getFromPom() throws FileNotFoundException, IOException, XmlPullParserException { - public void setVersion(Version version) { - this.version = version; - } + // 查看jar包里面pom.properties版本号 + String jarPath = VersionConfig.class.getProtectionDomain().getCodeSource().getLocation().getFile(); + jarPath = java.net.URLDecoder.decode(jarPath, "UTF-8"); + try { + URL url = new URL("jar:file:" + jarPath + "!/META-INF/maven/com.cym/nginxWebUI/pom.properties"); + InputStream inputStream = url.openStream(); + Properties properties = new Properties(); + properties.load(inputStream); + String version = properties.getProperty("version"); + return version; + } catch (Exception e) { + // 开发过程中查看pom.xml版本号 + MavenXpp3Reader reader = new MavenXpp3Reader(); + String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + if (SystemTool.isWindows() && basePath.startsWith("/")) { + basePath = basePath.substring(1); + } + if (basePath.indexOf("/target/") != -1) { + basePath = basePath.substring(0, basePath.indexOf("/target/")); + } + Model model = reader.read(new FileReader(new File(basePath, "pom.xml"))); + String version = model.getVersion(); + return version; + } + } } diff --git a/src/main/java/com/cym/config/WebConfig.java b/src/main/java/com/cym/config/WebConfig.java deleted file mode 100644 index 711f7997ec8541f3d67684fd566c681ca0b113cb..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/WebConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.cym.config; - -import javax.annotation.Resource; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.LocaleResolver; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - @Resource - private AdminInterceptor adminInterceptor; - @Resource - private FrontInterceptor frontInterceptor; - @Resource - private ApiInterceptor apiInterceptor; - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 自定义拦截器,添加拦截路径和排除拦截路径 - registry.addInterceptor(adminInterceptor)// - .addPathPatterns("/adminPage/**") // - .excludePathPatterns("/lib/**") // - .excludePathPatterns("/js/**")// - .excludePathPatterns("/img/**")// - .excludePathPatterns("/css/**"); - - registry.addInterceptor(apiInterceptor)// - .addPathPatterns("/api/**") // - .excludePathPatterns("/lib/**") // - .excludePathPatterns("/js/**")// - .excludePathPatterns("/img/**")// - .excludePathPatterns("/css/**"); - - registry.addInterceptor(frontInterceptor)// - .addPathPatterns("/**")// - .excludePathPatterns("/lib/**") // - .excludePathPatterns("/js/**")// - .excludePathPatterns("/img/**")// - .excludePathPatterns("/css/**"); - -// registry.addInterceptor(new LocaleInterceptor()).addPathPatterns("/**"); - } - -// @Bean -// public LocaleResolver localeResolver(MyLocaleResolver myLocaleResolver) { -// return myLocaleResolver; -// } -} diff --git a/src/main/java/com/cym/config/WebSocketConfig.java b/src/main/java/com/cym/config/WebSocketConfig.java deleted file mode 100644 index a20ac08469ecaacef189693b2e7d724604f987c6..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/config/WebSocketConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.cym.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -@Configuration -public class WebSocketConfig { - - /** - * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint - */ - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } - -} \ No newline at end of file diff --git a/src/main/java/com/cym/controller/adminPage/AbortController.java b/src/main/java/com/cym/controller/adminPage/AbortController.java deleted file mode 100644 index 9b5df4986a3ea909dfa65160364939588a4a5fc1..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/controller/adminPage/AbortController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.cym.controller.adminPage; - -import javax.servlet.http.HttpSession; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import com.cym.utils.BaseController; - -@RequestMapping("/adminPage/abort") -@Controller -public class AbortController extends BaseController { - - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { - - modelAndView.setViewName("/adminPage/abort/index"); - return modelAndView; - } - -} diff --git a/src/main/java/com/cym/controller/adminPage/AboutController.java b/src/main/java/com/cym/controller/adminPage/AboutController.java new file mode 100644 index 0000000000000000000000000000000000000000..73b1fb8c6e66706e86fe96ea7b162028de4826b2 --- /dev/null +++ b/src/main/java/com/cym/controller/adminPage/AboutController.java @@ -0,0 +1,20 @@ +package com.cym.controller.adminPage; + +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; + +import com.cym.utils.BaseController; + +@Mapping("/adminPage/about") +@Controller +public class AboutController extends BaseController { + + @Mapping("") + public ModelAndView index( ModelAndView modelAndView) { + + modelAndView.view("/adminPage/about/index.html"); + return modelAndView; + } + +} diff --git a/src/main/java/com/cym/controller/adminPage/AdminController.java b/src/main/java/com/cym/controller/adminPage/AdminController.java index e27affd886c40fb563662c40e96b38c0b5549c98..38b90480287484763b3ee2326b412afd2d4a85e1 100644 --- a/src/main/java/com/cym/controller/adminPage/AdminController.java +++ b/src/main/java/com/cym/controller/adminPage/AdminController.java @@ -7,17 +7,13 @@ import java.util.Hashtable; import java.util.List; import java.util.Map; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; import com.cym.ext.AdminExt; import com.cym.ext.Tree; @@ -26,8 +22,10 @@ import com.cym.model.Group; import com.cym.service.AdminService; import com.cym.service.GroupService; import com.cym.service.SettingService; +import com.cym.sqlhelper.bean.Page; import com.cym.utils.AuthUtils; import com.cym.utils.BaseController; +import com.cym.utils.EncodePassUtils; import com.cym.utils.JsonResult; import com.cym.utils.SendMailUtils; import com.google.zxing.BarcodeFormat; @@ -37,37 +35,34 @@ import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; -import cn.craccd.sqlHelper.bean.Page; import cn.hutool.core.util.StrUtil; @Controller -@RequestMapping("/adminPage/admin") +@Mapping("/adminPage/admin") public class AdminController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject AdminService adminService; - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject SendMailUtils sendCloudUtils; - @Autowired + @Inject AuthUtils authUtils; - @Autowired + @Inject GroupService groupService; - @Autowired + @Inject RemoteController remoteController; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView, Page page) { page = adminService.search(page); - - modelAndView.addObject("page", page); - modelAndView.setViewName("/adminPage/admin/index"); + modelAndView.put("page", page); + modelAndView.view("/adminPage/admin/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Admin admin, String[] parentId) { if (StrUtil.isEmpty(admin.getId())) { Long count = adminService.getCountByName(admin.getName()); @@ -86,32 +81,29 @@ public class AdminController extends BaseController { } else { admin.setKey(""); } - + adminService.addOver(admin, parentId); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { AdminExt adminExt = new AdminExt(); adminExt.setAdmin(sqlHelper.findById(id, Admin.class)); adminExt.setGroupIds(adminService.getGroupIds(adminExt.getAdmin().getId())); - + adminExt.getAdmin().setPass(""); return renderSuccess(adminExt); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Admin.class); return renderSuccess(); } - @RequestMapping("getMailSetting") - @ResponseBody + @Mapping("getMailSetting") public JsonResult getMailSetting() { Map map = new HashMap<>(); @@ -122,13 +114,12 @@ public class AdminController extends BaseController { map.put("mail_pass", settingService.get("mail_pass")); map.put("mail_ssl", settingService.get("mail_ssl")); map.put("mail_interval", settingService.get("mail_interval")); - + return renderSuccess(map); } - @RequestMapping("updateMailSetting") - @ResponseBody - public JsonResult updateMailSetting(String mailType, String mail_user, String mail_host, String mail_port, String mail_from, String mail_pass, String mail_ssl,String mail_interval) { + @Mapping("updateMailSetting") + public JsonResult updateMailSetting(String mailType, String mail_user, String mail_host, String mail_port, String mail_from, String mail_pass, String mail_ssl, String mail_interval) { settingService.set("mail_host", mail_host); settingService.set("mail_port", mail_port); settingService.set("mail_user", mail_user); @@ -136,12 +127,11 @@ public class AdminController extends BaseController { settingService.set("mail_pass", mail_pass); settingService.set("mail_ssl", mail_ssl); settingService.set("mail_interval", mail_interval); - + return renderSuccess(); } - @RequestMapping("testMail") - @ResponseBody + @Mapping("testMail") public JsonResult testMail(String mail) { if (StrUtil.isEmpty(mail)) { return renderError(m.get("adminStr.emailEmpty")); @@ -154,20 +144,17 @@ public class AdminController extends BaseController { return renderError(m.get("commonStr.error") + ": " + e.getMessage()); } } - - - @RequestMapping("testAuth") - @ResponseBody + + @Mapping("testAuth") public JsonResult testAuth(String key, String code) { - + Boolean rs = authUtils.testKey(key, code); return renderSuccess(rs); } - @RequestMapping(value = "qr") - public void getqcode(HttpServletResponse resp, String url, Integer w, Integer h) throws IOException { + @Mapping(value = "qr") + public void getqcode(String url, Integer w, Integer h) throws IOException { if (url != null && !"".equals(url)) { - ServletOutputStream stream = null; if (w == null) { w = 300; @@ -176,28 +163,19 @@ public class AdminController extends BaseController { h = 300; } try { - stream = resp.getOutputStream(); - Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.MARGIN, 0); BitMatrix matrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, w, h, hints); - MatrixToImageWriter.writeToStream(matrix, "png", stream); + MatrixToImageWriter.writeToStream(matrix, "png", Context.current().outputStream()); } catch (WriterException e) { logger.error(e.getMessage(), e); - } finally { - if (stream != null) { - stream.flush(); - stream.close(); - } } } } - - @RequestMapping("getGroupTree") - @ResponseBody + @Mapping("getGroupTree") public JsonResult getGroupTree() { List groups = groupService.getListByParent(null); diff --git a/src/main/java/com/cym/controller/adminPage/BakController.java b/src/main/java/com/cym/controller/adminPage/BakController.java index 99d507855f697bff2d293cc8868b4ed8f02e74bf..37aac0151af7dd526cf1d43837ed230a3ccbef88 100644 --- a/src/main/java/com/cym/controller/adminPage/BakController.java +++ b/src/main/java/com/cym/controller/adminPage/BakController.java @@ -6,45 +6,40 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.model.Bak; import com.cym.model.BakSub; import com.cym.service.BakService; import com.cym.service.SettingService; +import com.cym.sqlhelper.bean.Page; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; -import cn.craccd.sqlHelper.bean.Page; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; @Controller -@RequestMapping("/adminPage/bak") +@Mapping("/adminPage/bak") public class BakController extends BaseController { - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject BakService bakService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page) { + @Mapping("") + public ModelAndView index( ModelAndView modelAndView, Page page) { page = bakService.getList(page); - modelAndView.addObject("page", page); - modelAndView.setViewName("/adminPage/bak/index"); + modelAndView.put("page", page); + modelAndView.view("/adminPage/bak/index.html"); return modelAndView; } - @RequestMapping("getCompare") - @ResponseBody + @Mapping("getCompare") public JsonResult getCompare(String id) { Bak bak = sqlHelper.findById(id, Bak.class); @@ -60,15 +55,13 @@ public class BakController extends BaseController { return renderSuccess(map); } - @RequestMapping("content") - @ResponseBody + @Mapping("content") public JsonResult content(String id) { Bak bak = sqlHelper.findById(id, Bak.class); return renderSuccess(bak); } - @RequestMapping("replace") - @ResponseBody + @Mapping("replace") public JsonResult replace(String id) { Bak bak = sqlHelper.findById(id, Bak.class); @@ -95,16 +88,14 @@ public class BakController extends BaseController { } - @Transactional - @RequestMapping("del") - @ResponseBody + + @Mapping("del") public JsonResult del(String id) { bakService.del(id); return renderSuccess(); } - @RequestMapping("delAll") - @ResponseBody + @Mapping("delAll") public JsonResult delAll() { bakService.delAll(); diff --git a/src/main/java/com/cym/controller/adminPage/BasicController.java b/src/main/java/com/cym/controller/adminPage/BasicController.java index c786e4f20cc07f9949b0a056c15abd9feef19c29..8b7ba3bc649fdfdd93e7bb1c8de704da6ba538a0 100644 --- a/src/main/java/com/cym/controller/adminPage/BasicController.java +++ b/src/main/java/com/cym/controller/adminPage/BasicController.java @@ -2,40 +2,35 @@ package com.cym.controller.adminPage; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.model.Basic; import com.cym.service.BasicService; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; -import com.cym.utils.MessageUtils; import com.cym.utils.SnowFlakeUtils; -import cn.craccd.sqlHelper.bean.Sort; -import cn.craccd.sqlHelper.bean.Sort.Direction; import cn.hutool.core.util.StrUtil; @Controller -@RequestMapping("/adminPage/basic") +@Mapping("/adminPage/basic") public class BasicController extends BaseController { - @Autowired + @Inject BasicService basicService; - @RequestMapping("") + @Mapping("") public ModelAndView index(ModelAndView modelAndView) { List basicList = basicService.findAll(); - modelAndView.addObject("basicList", basicList); - modelAndView.setViewName("/adminPage/basic/index"); + modelAndView.put("basicList", basicList); + modelAndView.view("/adminPage/basic/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Basic basic) { if (StrUtil.isEmpty(basic.getId())) { basic.setSeq( SnowFlakeUtils.getId()); @@ -45,22 +40,19 @@ public class BasicController extends BaseController { return renderSuccess(); } - @RequestMapping("setOrder") - @ResponseBody + @Mapping("setOrder") public JsonResult setOrder(String id, Integer count) { basicService.setSeq(id, count); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Basic.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Basic.class); diff --git a/src/main/java/com/cym/controller/adminPage/CertController.java b/src/main/java/com/cym/controller/adminPage/CertController.java index 5ac7497cdd16bf4e268f8b12b03c217673dead7a..0e81f952ce63c3c2961bd45562c5368e016a4768 100644 --- a/src/main/java/com/cym/controller/adminPage/CertController.java +++ b/src/main/java/com/cym/controller/adminPage/CertController.java @@ -1,72 +1,93 @@ package com.cym.controller.adminPage; -import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.io.OutputStream; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Arrays; import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.DownloadedFile; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; - -import com.cym.config.InitConfig; -import com.cym.ext.CertExt; + import com.cym.model.Cert; import com.cym.model.CertCode; import com.cym.service.CertService; import com.cym.service.SettingService; +import com.cym.sqlhelper.bean.Page; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; import com.cym.utils.SystemTool; import com.cym.utils.TimeExeUtils; -import cn.craccd.sqlHelper.bean.Page; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; @Controller -@RequestMapping("/adminPage/cert") +@Mapping("/adminPage/cert") public class CertController extends BaseController { - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject CertService certService; - @Autowired + @Inject TimeExeUtils timeExeUtils; + @Inject + ConfController confController; Logger logger = LoggerFactory.getLogger(this.getClass()); Boolean isInApply = false; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page, String keywords) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView, Page page, String keywords) { page = certService.getPage(keywords, page); - modelAndView.addObject("keywords", keywords); - modelAndView.addObject("page", page); - modelAndView.setViewName("/adminPage/cert/index"); + for (Cert cert : (List) page.getRecords()) { + if (cert.getType() == 0 || cert.getType() == 2) { + cert.setDomain(cert.getDomain() + "(" + cert.getEncryption() + ")"); + } + + if (cert.getMakeTime() != null) { + cert.setEndTime(cert.getMakeTime() + 90 * 24 * 60 * 60 * 1000l); + } + } + + modelAndView.put("keywords", keywords); + modelAndView.put("page", page); + modelAndView.view("/adminPage/cert/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Cert cert, String[] domains, String[] types, String[] values) { - if (certService.hasSame(cert)) { - return renderError(m.get("certStr.same")); + Integer type = cert.getType(); + if (type == null && StrUtil.isNotEmpty(cert.getId())) { + Cert certOrg = sqlHelper.findById(cert.getId(), Cert.class); + type = certOrg.getType(); + } + + if (type != null && type == 1) { + // 手动上传 + String dir = homeConfig.home + "cert/" + cert.getDomain() + "/"; + + if (cert.getKey().contains(FileUtil.getTmpDir().toString().replace("\\", "/"))) { + String keyName = new File(cert.getKey()).getName(); + FileUtil.move(new File(cert.getKey()), new File(dir + keyName), true); + cert.setKey(dir + keyName); + } + + if (cert.getPem().contains(FileUtil.getTmpDir().toString().replace("\\", "/"))) { + String pemName = new File(cert.getPem()).getName(); + FileUtil.move(new File(cert.getPem()), new File(dir + pemName), true); + cert.setPem(dir + pemName); + } } certService.insertOrUpdate(cert, domains, types, values); @@ -74,39 +95,54 @@ public class CertController extends BaseController { return renderSuccess(cert); } - @RequestMapping("setAutoRenew") - @ResponseBody + @Mapping("setAutoRenew") public JsonResult setAutoRenew(Cert cert) { sqlHelper.updateById(cert); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Cert.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { Cert cert = sqlHelper.findById(id, Cert.class); - String path = InitConfig.acmeShDir + cert.getDomain(); - if (FileUtil.exist(path)) { - FileUtil.del(path); + + if (cert.getType() == 1) { + // 手动上传 + if (cert.getPem().contains(homeConfig.home + "cert/")) { + FileUtil.del(cert.getPem()); + } + if (cert.getKey().contains(homeConfig.home + "cert/")) { + FileUtil.del(cert.getKey()); + } + } else { + // 申请获得 + String domain = cert.getDomain().split(",")[0]; + String path = homeConfig.acmeShDir + domain; + + if ("ECC".equals(cert.getEncryption())) { + path += "_ecc"; + } + if (FileUtil.exist(path)) { + FileUtil.del(path); + } } + sqlHelper.deleteById(id, Cert.class); return renderSuccess(); } - @RequestMapping("apply") - @ResponseBody + @Mapping("apply") public JsonResult apply(String id, String type) { if (!SystemTool.isLinux()) { return renderError(m.get("certStr.error2")); } Cert cert = sqlHelper.findById(id, Cert.class); + if (cert.getDnsType() == null) { return renderError(m.get("certStr.error3")); } @@ -116,13 +152,23 @@ public class CertController extends BaseController { } isInApply = true; + String keylength = ""; + String ecc = ""; + if ("ECC".equals(cert.getEncryption())) { + keylength = " --keylength ec-256 "; + ecc = " --ecc"; + } + String rs = ""; String cmd = ""; // 设置dns账号 String[] env = getEnv(cert); if (type.equals("issue")) { - + String[] split = cert.getDomain().split(","); + StringBuffer sb = new StringBuffer(); + Arrays.stream(split).forEach(s -> sb.append(" -d ").append(s)); + String domain = sb.toString(); // 申请 if (cert.getType() == 0) { String dnsType = ""; @@ -137,23 +183,23 @@ public class CertController extends BaseController { } else if (cert.getDnsType().equals("hw")) { dnsType = "dns_huaweicloud"; } - - cmd = InitConfig.acmeSh + " --issue --force --dns " + dnsType + " -d " + cert.getDomain() + " --server letsencrypt"; + cmd = homeConfig.acmeSh + " --issue --force --dns " + dnsType + domain + keylength + " --server letsencrypt"; } else if (cert.getType() == 2) { if (certService.hasCode(cert.getId())) { - cmd = InitConfig.acmeSh + " --renew --force --dns -d " + cert.getDomain() + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; + cmd = homeConfig.acmeSh + " --renew --force --dns" + domain + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; } else { - cmd = InitConfig.acmeSh + " --issue --force --dns -d " + cert.getDomain() + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; + cmd = homeConfig.acmeSh + " --issue --force --dns" + domain + keylength + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; } } } else if (type.equals("renew")) { // 续签,以第一个域名为证书名 + String domain = cert.getDomain().split(",")[0]; + if (cert.getType() == 0) { - String domain = cert.getDomain().split(",")[0]; - cmd = InitConfig.acmeSh + " --renew --force -d " + domain; + cmd = homeConfig.acmeSh + " --renew --force " + ecc + " -d " + domain; } else if (cert.getType() == 2) { - cmd = InitConfig.acmeSh + " --renew --force -d " + cert.getDomain() + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; + cmd = homeConfig.acmeSh + " --renew --force " + ecc + " -d " + domain + " --server letsencrypt --yes-I-know-dns-manual-mode-enough-go-ahead-please"; } } logger.info(cmd); @@ -162,20 +208,25 @@ public class CertController extends BaseController { logger.info(rs); if (rs.contains("Your cert is in")) { - // 申请成功, 将证书复制到/home/nginxWebUI + // 申请成功, 定位证书 String domain = cert.getDomain().split(",")[0]; - String certDir = InitConfig.acmeShDir + domain + "/"; - - String dest = InitConfig.home + "cert/" + domain + ".fullchain.cer"; - FileUtil.copy(new File(certDir + "fullchain.cer"), new File(dest), true); - cert.setPem(dest); + String certDir = homeConfig.acmeShDir + domain; + if ("ECC".equals(cert.getEncryption())) { + certDir += "_ecc"; + } + certDir += "/"; - dest = InitConfig.home + "cert/" + domain + ".key"; - FileUtil.copy(new File(certDir + domain + ".key"), new File(dest), true); - cert.setKey(dest); + cert.setPem(certDir + "fullchain.cer"); + cert.setKey(certDir + domain + ".key"); cert.setMakeTime(System.currentTimeMillis()); sqlHelper.updateById(cert); + + // 续签,重载nginx使证书生效 + if (type.equals("renew")) { + confController.reload(null, null, null); + } + isInApply = false; return renderSuccess(); } else if (rs.contains("TXT value")) { @@ -234,25 +285,25 @@ public class CertController extends BaseController { if (cert.getDnsType().equals("hw")) { list.add("HUAWEICLOUD_Username=" + cert.getHwUsername()); list.add("HUAWEICLOUD_Password=" + cert.getHwPassword()); - list.add("HUAWEICLOUD_ProjectID=" + cert.getHwProjectID()); + list.add("HUAWEICLOUD_ProjectID=" + cert.getHwProjectId()); + list.add("HUAWEICLOUD_DomainName=" + cert.getHwDomainName()); } return list.toArray(new String[] {}); } - @RequestMapping("getTxtValue") - @ResponseBody + @Mapping("getTxtValue") public JsonResult getTxtValue(String id) { List certCodes = certService.getCertCodes(id); return renderSuccess(certCodes); } - @RequestMapping("download") - public void download(String id, HttpServletResponse response) throws IOException { + @Mapping("download") + public DownloadedFile download(String id) throws IOException { Cert cert = sqlHelper.findById(id, Cert.class); if (StrUtil.isNotEmpty(cert.getPem()) && StrUtil.isNotEmpty(cert.getKey())) { - String dir = InitConfig.home + "/temp/cert"; + String dir = homeConfig.home + "/temp/cert"; FileUtil.del(dir); FileUtil.del(dir + ".zip"); FileUtil.mkdir(dir); @@ -265,43 +316,10 @@ public class CertController extends BaseController { ZipUtil.zip(dir); FileUtil.del(dir); - handleStream(response, dir + ".zip"); + DownloadedFile downloadedFile = new DownloadedFile("application/octet-stream", new FileInputStream(dir + ".zip"), "cert.zip"); + return downloadedFile; } - } - private void handleStream(HttpServletResponse response, String path) throws IOException { - - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); - response.setHeader("Content-Disposition", "attachment;filename=cert.zip"); - byte[] buffer = new byte[1024]; - FileInputStream fis = null; - BufferedInputStream bis = null; - try { - fis = new FileInputStream(path); - bis = new BufferedInputStream(fis); - OutputStream os = response.getOutputStream(); - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } - } catch (Exception e) { - logger.error(e.getMessage(), e); - } finally { - if (bis != null) { - try { - bis.close(); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - } + return null; } } diff --git a/src/main/java/com/cym/controller/adminPage/ConfController.java b/src/main/java/com/cym/controller/adminPage/ConfController.java index 7f463486cf2b6559fe7dcc2683f76e5ca086f612..fb1510c99e7d43308f79784740eb7891b71d5a8d 100644 --- a/src/main/java/com/cym/controller/adminPage/ConfController.java +++ b/src/main/java/com/cym/controller/adminPage/ConfController.java @@ -4,17 +4,12 @@ import java.io.File; import java.nio.charset.StandardCharsets; import java.util.List; -import javax.servlet.http.HttpServletRequest; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.ClassPathResource; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; import com.cym.config.InitConfig; import com.cym.config.VersionConfig; @@ -33,8 +28,9 @@ import com.cym.utils.ToolUtils; import cn.hutool.core.codec.Base64; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.net.URLDecoder; -import cn.hutool.core.net.URLEncoder; +import cn.hutool.core.net.URLEncodeUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; @@ -43,49 +39,45 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/conf") +@Mapping("/adminPage/conf") public class ConfController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject UpstreamService upstreamService; - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject ServerService serverService; - @Autowired + @Inject ConfService confService; - @Autowired + @Inject MainController mainController; - @Autowired + @Inject VersionConfig versionConfig; - @Value("${project.version}") - String currentVersion; - - @RequestMapping("") + @Mapping("") public ModelAndView index(ModelAndView modelAndView) { String nginxPath = settingService.get("nginxPath"); - modelAndView.addObject("nginxPath", nginxPath); + modelAndView.put("nginxPath", nginxPath); String nginxExe = settingService.get("nginxExe"); - modelAndView.addObject("nginxExe", nginxExe); + modelAndView.put("nginxExe", nginxExe); String nginxDir = settingService.get("nginxDir"); - modelAndView.addObject("nginxDir", nginxDir); + modelAndView.put("nginxDir", nginxDir); String decompose = settingService.get("decompose"); - modelAndView.addObject("decompose", decompose); + modelAndView.put("decompose", decompose); - modelAndView.addObject("tmp", InitConfig.home + "temp/nginx.conf"); + modelAndView.put("tmp", homeConfig.home + "temp/nginx.conf"); - modelAndView.setViewName("/adminPage/conf/index"); + modelAndView.view("/adminPage/conf/index.html"); return modelAndView; } - @RequestMapping(value = "nginxStatus") - @ResponseBody + @Mapping(value = "nginxStatus") public JsonResult nginxStatus() { if (NginxUtils.isRun()) { return renderSuccess(m.get("confStr.nginxStatus") + ":" + m.get("confStr.running") + ""); @@ -95,9 +87,8 @@ public class ConfController extends BaseController { } - @RequestMapping(value = "replace") - @ResponseBody - public JsonResult replace(String json, HttpServletRequest request, String adminName) { + @Mapping(value = "replace") + public JsonResult replace(String json, String adminName) { if (StrUtil.isEmpty(json)) { json = getReplaceJson(); @@ -128,7 +119,7 @@ public class ConfController extends BaseController { try { if (StrUtil.isEmpty(adminName)) { - Admin admin = getAdmin(request); + Admin admin = getAdmin(); adminName = admin.getName(); } @@ -145,14 +136,13 @@ public class ConfController extends BaseController { String decompose = settingService.get("decompose"); ConfExt confExt = confService.buildConf(StrUtil.isNotEmpty(decompose) && decompose.equals("true"), false); - URLEncoder urlEncoder = new URLEncoder(); JSONObject jsonObject = new JSONObject(); - jsonObject.set("nginxContent", Base64.encode(urlEncoder.encode(confExt.getConf(), CharsetUtil.CHARSET_UTF_8))); + jsonObject.set("nginxContent", Base64.encode(URLEncodeUtil.encode(confExt.getConf(), CharsetUtil.CHARSET_UTF_8))); jsonObject.set("subContent", new JSONArray()); jsonObject.set("subName", new JSONArray()); for (ConfFile confFile : confExt.getFileList()) { - jsonObject.getJSONArray("subContent").add(Base64.encode(urlEncoder.encode(confFile.getConf(), CharsetUtil.CHARSET_UTF_8))); + jsonObject.getJSONArray("subContent").add(Base64.encode(URLEncodeUtil.encode(confFile.getConf(), CharsetUtil.CHARSET_UTF_8))); jsonObject.getJSONArray("subName").add(confFile.getName()); } return jsonObject.toStringPretty(); @@ -166,8 +156,7 @@ public class ConfController extends BaseController { * @param nginxDir * @return */ - @RequestMapping(value = "checkBase") - @ResponseBody + @Mapping(value = "checkBase") public JsonResult checkBase() { String nginxExe = settingService.get("nginxExe"); String nginxDir = settingService.get("nginxDir"); @@ -175,15 +164,15 @@ public class ConfController extends BaseController { String rs = null; String cmd = null; - FileUtil.del(InitConfig.home + "temp"); - String fileTemp = InitConfig.home + "temp/nginx.conf"; + FileUtil.del(homeConfig.home + "temp"); + String fileTemp = homeConfig.home + "temp/nginx.conf"; try { ConfExt confExt = confService.buildConf(false, true); FileUtil.writeString(confExt.getConf(), fileTemp, CharsetUtil.CHARSET_UTF_8); ClassPathResource resource = new ClassPathResource("mime.types"); - FileUtil.writeFromStream(resource.getInputStream(), InitConfig.home + "temp/mime.types"); + FileUtil.writeFromStream(resource.getStream(), homeConfig.home + "temp/mime.types"); cmd = nginxExe + " -t -c " + fileTemp; if (StrUtil.isNotEmpty(nginxDir)) { @@ -213,8 +202,7 @@ public class ConfController extends BaseController { * @param json * @return */ - @RequestMapping(value = "check") - @ResponseBody + @Mapping(value = "check") public JsonResult check(String nginxPath, String nginxExe, String nginxDir, String json) { if (nginxExe == null) { nginxExe = settingService.get("nginxExe"); @@ -235,16 +223,16 @@ public class ConfController extends BaseController { } // 替换分解域名include路径中的目标conf.d为temp/conf.d - String confDir = ToolUtils.endDir(ToolUtils.handlePath(new File(nginxPath).getParent())) + "conf.d/"; - String tempDir = ToolUtils.endDir(InitConfig.home + "temp") + "conf.d/"; + String confDir = ToolUtils.handlePath(new File(nginxPath).getParent()) + "/conf.d/"; + String tempDir = homeConfig.home + "temp" + "/conf.d/"; List subName = jsonObject.getJSONArray("subName").toList(String.class); for (String sn : subName) { nginxContent = nginxContent.replace("include " + confDir + sn, // "include " + tempDir + sn); } - FileUtil.del(InitConfig.home + "temp"); - String fileTemp = InitConfig.home + "temp/nginx.conf"; + FileUtil.del(homeConfig.home + "temp"); + String fileTemp = homeConfig.home + "temp/nginx.conf"; confService.replace(fileTemp, nginxContent, subContent, subName, false, null); @@ -253,7 +241,7 @@ public class ConfController extends BaseController { try { ClassPathResource resource = new ClassPathResource("mime.types"); - FileUtil.writeFromStream(resource.getInputStream(), InitConfig.home + "temp/mime.types"); + FileUtil.writeFromStream(resource.getStream(), homeConfig.home + "temp/mime.types"); cmd = nginxExe + " -t -c " + fileTemp; if (StrUtil.isNotEmpty(nginxDir)) { @@ -274,8 +262,7 @@ public class ConfController extends BaseController { } - @RequestMapping(value = "saveCmd") - @ResponseBody + @Mapping(value = "saveCmd") public JsonResult saveCmd(String nginxPath, String nginxExe, String nginxDir) { nginxPath = ToolUtils.handlePath(nginxPath); settingService.set("nginxPath", nginxPath); @@ -289,8 +276,7 @@ public class ConfController extends BaseController { return renderSuccess(); } - @RequestMapping(value = "reload") - @ResponseBody + @Mapping(value = "reload") public synchronized JsonResult reload(String nginxPath, String nginxExe, String nginxDir) { if (nginxPath == null) { nginxPath = settingService.get("nginxPath"); @@ -325,8 +311,7 @@ public class ConfController extends BaseController { } } - @RequestMapping(value = "runCmd") - @ResponseBody + @Mapping(value = "runCmd") public JsonResult runCmd(String cmd, String type) { if (StrUtil.isNotEmpty(type)) { settingService.set(type, cmd); @@ -334,6 +319,16 @@ public class ConfController extends BaseController { try { String rs = ""; + // 过滤特殊字符,防止命令拼接 + cmd = cmd.replaceAll(";","\\\\;"); + cmd = cmd.replaceAll("`","\\\\`"); + cmd = cmd.replaceAll("\\|","\\\\|"); + cmd = cmd.replaceAll("\\{","\\\\{"); + cmd = cmd.replaceAll("\\}","\\\\}"); + //仅执行nginx相关的命令,而不是其他的恶意命令 + if(!cmd.contains("nginx")){ + cmd = "nginx restart"; + } if (SystemTool.isWindows()) { RuntimeUtil.exec("cmd /c start " + cmd); } else { @@ -356,14 +351,12 @@ public class ConfController extends BaseController { } } - @RequestMapping(value = "getLastCmd") - @ResponseBody + @Mapping(value = "getLastCmd") public JsonResult getLastCmd(String type) { return renderSuccess(settingService.get(type)); } - @RequestMapping(value = "loadConf") - @ResponseBody + @Mapping(value = "loadConf") public JsonResult loadConf() { String decompose = settingService.get("decompose"); @@ -371,8 +364,7 @@ public class ConfController extends BaseController { return renderSuccess(confExt); } - @RequestMapping(value = "loadOrg") - @ResponseBody + @Mapping(value = "loadOrg") public JsonResult loadOrg(String nginxPath) { String decompose = settingService.get("decompose"); ConfExt confExt = confService.buildConf(StrUtil.isNotEmpty(decompose) && decompose.equals("true"), false); @@ -401,33 +393,29 @@ public class ConfController extends BaseController { } - @RequestMapping(value = "decompose") - @ResponseBody + @Mapping(value = "decompose") public JsonResult decompose(String decompose) { settingService.set("decompose", decompose); return renderSuccess(); } - @RequestMapping(value = "update") - @ResponseBody + @Mapping(value = "update") public JsonResult update() { - versionConfig.getNewVersion(); - if (Integer.parseInt(currentVersion.replace(".", "").replace("v", "")) < Integer.parseInt(versionConfig.getVersion().getVersion().replace(".", "").replace("v", ""))) { - mainController.autoUpdate(versionConfig.getVersion().getUrl()); + versionConfig.checkVersion(); + if (Integer.parseInt(versionConfig.currentVersion.replace(".", "").replace("v", "")) < Integer.parseInt(versionConfig.newVersion.getVersion().replace(".", "").replace("v", ""))) { + mainController.autoUpdate(versionConfig.newVersion.getUrl()); return renderSuccess(m.get("confStr.updateSuccess")); } else { return renderSuccess(m.get("confStr.noNeedUpdate")); } } - @RequestMapping(value = "getKey") - @ResponseBody + @Mapping(value = "getKey") public JsonResult getKey(String key) { return renderSuccess(settingService.get(key)); } - @RequestMapping(value = "setKey") - @ResponseBody + @Mapping(value = "setKey") public JsonResult setKey(String key, String val) { settingService.set(key, val); return renderSuccess(); diff --git a/src/main/java/com/cym/controller/adminPage/ExportController.java b/src/main/java/com/cym/controller/adminPage/ExportController.java index 9d2530f87dfe4be932f6f1f066c8aa5aca97d72c..c2ffa77fb91be47587c1d0fff7eecb9783e6fb7b 100644 --- a/src/main/java/com/cym/controller/adminPage/ExportController.java +++ b/src/main/java/com/cym/controller/adminPage/ExportController.java @@ -1,128 +1,103 @@ package com.cym.controller.adminPage; -import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.Date; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.DownloadedFile; +import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.core.handle.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; -import com.cym.config.InitConfig; import com.cym.ext.AsycPack; -import com.cym.model.Admin; +import com.cym.model.Cert; +import com.cym.model.CertCode; +import com.cym.model.Stream; +import com.cym.service.CertService; import com.cym.service.ConfService; +import com.cym.sqlhelper.utils.ConditionAndWrapper; import com.cym.utils.BaseController; -import com.cym.utils.JsonResult; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/export") +@Mapping("/adminPage/export") public class ExportController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject ConfService confService; + @Inject + CertService certService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView) { - modelAndView.setViewName("/adminPage/export/index"); + modelAndView.view("/adminPage/export/index.html"); return modelAndView; } - @RequestMapping("dataExport") - public void dataExport(HttpServletRequest request, HttpServletResponse response) throws IOException { - String date = DateUtil.format(new Date(), "yyyy-MM-dd_HH-mm-ss"); - - AsycPack asycPack = confService.getAsycPack(new String[] {"all"}); + @Mapping("dataExport") + public DownloadedFile dataExport(Context context) throws IOException { + AsycPack asycPack = confService.getAsycPack(new String[] { "all" }); + // 导出证书 + asycPack.setCertList(sqlHelper.findAll(Cert.class)); + asycPack.setCertCodeList(sqlHelper.findAll(CertCode.class)); + asycPack.setAcmeZip(certService.getAcmeZipBase64()); + String json = JSONUtil.toJsonPrettyStr(asycPack); - response.addHeader("Content-Type", "application/octet-stream"); - response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(date + ".json", "UTF-8")); // 设置文件名 - - byte[] buffer = new byte[1024]; - BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(json.getBytes(Charset.forName("UTF-8")))); - OutputStream os = response.getOutputStream(); - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } + String date = DateUtil.format(new Date(), "yyyy-MM-dd_HH-mm-ss"); + DownloadedFile downloadedFile = new DownloadedFile("application/octet-stream", new ByteArrayInputStream(json.getBytes(Charset.forName("UTF-8"))), date + ".json"); + return downloadedFile; } - @RequestMapping(value = "dataImport") - @ResponseBody - public JsonResult dataImport(String json, HttpServletRequest request, String adminName) { - AsycPack asycPack = JSONUtil.toBean(json, AsycPack.class); - if(StrUtil.isEmpty(adminName)) { - Admin admin = getAdmin(request); - adminName = admin.getName(); + @Mapping(value = "dataImport") + public void dataImport(UploadedFile file, Context context) throws IOException { + if (file != null) { + File tempFile = new File(homeConfig.home + "temp" + File.separator + file.getName()); + FileUtil.mkdir(tempFile.getParentFile()); + file.transferTo(tempFile); + String json = FileUtil.readString(tempFile, Charset.forName("UTF-8")); + tempFile.delete(); + + AsycPack asycPack = JSONUtil.toBean(json, AsycPack.class); + confService.setAsycPack(asycPack); + + // 导入证书 + if (asycPack.getCertList() != null) { + sqlHelper.deleteByQuery(new ConditionAndWrapper(), Cert.class); + sqlHelper.insertAll(asycPack.getCertList()); + } + if (asycPack.getCertCodeList() != null) { + sqlHelper.deleteByQuery(new ConditionAndWrapper(), CertCode.class); + sqlHelper.insertAll(asycPack.getCertList()); + } + + certService.writeAcmeZipBase64(asycPack.getAcmeZip()); } - confService.setAsycPack(asycPack, adminName); - - return renderSuccess(); + context.redirect("/adminPage/export?over=true"); } - @RequestMapping("logExport") - public void logExport(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { - File file = new File(InitConfig.home + "log/nginxWebUI.log"); + @Mapping("logExport") + public DownloadedFile logExport(Context context) throws FileNotFoundException { + File file = new File(homeConfig.home + "log/nginxWebUI.log"); if (file.exists()) { - // 配置文件下载 - response.setHeader("content-type", "application/octet-stream"); - response.setContentType("application/octet-stream"); - // 下载文件能正常显示中文 - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8")); - // 实现文件下载 - byte[] buffer = new byte[1024]; - FileInputStream fis = null; - BufferedInputStream bis = null; - try { - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis); - OutputStream os = response.getOutputStream(); - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } - } catch (Exception e) { - logger.error(e.getMessage(), e); - } finally { - if (bis != null) { - try { - bis.close(); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - } - + DownloadedFile downloadedFile = new DownloadedFile("application/octet-stream", new FileInputStream(file), file.getName()); + return downloadedFile; } + + return null; } } diff --git a/src/main/java/com/cym/controller/adminPage/HttpController.java b/src/main/java/com/cym/controller/adminPage/HttpController.java index 6620e6597ebcba9025bfc59013471129f6223e09..50a0c8960168d298140ec308f63429db5f8e9fd7 100644 --- a/src/main/java/com/cym/controller/adminPage/HttpController.java +++ b/src/main/java/com/cym/controller/adminPage/HttpController.java @@ -2,16 +2,14 @@ package com.cym.controller.adminPage; import java.util.List; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.config.InitConfig; import com.cym.model.Http; +import com.cym.model.Server; import com.cym.service.HttpService; import com.cym.service.SettingService; import com.cym.utils.BaseController; @@ -22,24 +20,23 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/http") +@Mapping("/adminPage/http") public class HttpController extends BaseController { - @Autowired + @Inject HttpService httpService; - @Autowired + @Inject SettingService settingService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView) { List httpList = httpService.findAll(); - modelAndView.addObject("httpList", httpList); - modelAndView.setViewName("/adminPage/http/index"); + modelAndView.put("httpList", httpList); + modelAndView.view("/adminPage/http/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Http http) { if (StrUtil.isEmpty(http.getId())) { http.setSeq(SnowFlakeUtils.getId()); @@ -49,30 +46,26 @@ public class HttpController extends BaseController { return renderSuccess(); } - @RequestMapping("addTemplate") - @ResponseBody + @Mapping("addTemplate") public JsonResult addTemplate(String templateId) { httpService.addTemplate(templateId); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Http.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Http.class); return renderSuccess(); } - @RequestMapping("addGiudeOver") - @ResponseBody + @Mapping("addGiudeOver") public JsonResult addGiudeOver(String json, Boolean logStatus, Boolean webSocket) { List https = JSONUtil.toList(JSONUtil.parseArray(json), Http.class); @@ -80,13 +73,13 @@ public class HttpController extends BaseController { Http http = new Http(); http.setName("access_log"); - http.setValue(InitConfig.home + "log/access.log"); + http.setValue(homeConfig.home + "log/access.log"); http.setUnit(""); https.add(http); http = new Http(); http.setName("error_log"); - http.setValue(InitConfig.home + "log/error.log"); + http.setValue(homeConfig.home + "log/error.log"); http.setUnit(""); https.add(http); @@ -107,12 +100,15 @@ public class HttpController extends BaseController { return renderSuccess(); } - - - @RequestMapping("setOrder") - @ResponseBody + @Mapping("setOrder") public JsonResult setOrder(String id, Integer count) { httpService.setSeq(id, count); return renderSuccess(); } + + @Mapping("setEnable") + public JsonResult setEnable(Http http) { + sqlHelper.updateById(http); + return renderSuccess(); + } } diff --git a/src/main/java/com/cym/controller/adminPage/LogController.java b/src/main/java/com/cym/controller/adminPage/LogController.java index 4cbbdf4da3929ff9beca59340079695a03b0308d..28fa6a595afd456c1d188c2a7930e9a9696dd1ef 100644 --- a/src/main/java/com/cym/controller/adminPage/LogController.java +++ b/src/main/java/com/cym/controller/adminPage/LogController.java @@ -2,60 +2,56 @@ package com.cym.controller.adminPage; import java.io.File; import java.io.FileInputStream; -import java.io.IOException; +import java.io.FileNotFoundException; import java.io.InputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.commons.io.IOUtils; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; - -import com.cym.config.AdminInterceptor; -import com.cym.config.ScheduleTask; + +import com.cym.config.AppFilter; import com.cym.model.Log; import com.cym.service.LogService; import com.cym.service.SettingService; +import com.cym.sqlhelper.bean.Page; +import com.cym.sqlhelper.utils.ConditionAndWrapper; +import com.cym.utils.BLogFileTailer; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; import com.cym.utils.SystemTool; -import cn.craccd.sqlHelper.bean.Page; -import cn.hutool.core.codec.Base64; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; @Controller -@RequestMapping("/adminPage/log") +@Mapping("/adminPage/log") public class LogController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject LogService logService; - @Autowired - ScheduleTask scheduleTask; + @Inject + AppFilter appFilter; + @Inject + BLogFileTailer bLogFileTailer; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView, Page page) { page = logService.search(page); - modelAndView.addObject("page", page); + modelAndView.put("page", page); - modelAndView.addObject("isLinux", SystemTool.isLinux()); - modelAndView.setViewName("/adminPage/log/index"); + modelAndView.put("isLinux", SystemTool.isLinux()); + modelAndView.view("/adminPage/log/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Log log) { if (logService.hasDir(log.getPath(), log.getId())) { return renderError(m.get("logStr.sameDir")); @@ -69,63 +65,53 @@ public class LogController extends BaseController { return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Log.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Log.class); return renderSuccess(); } - @RequestMapping("tail") - public ModelAndView tail(ModelAndView modelAndView, String id, String protocol, HttpServletRequest request) { - modelAndView.addObject("id", id); - // 获取远程机器的协议 - if (StrUtil.isNotEmpty(protocol)) { - if (protocol.equals("https")) { - modelAndView.addObject("protocol", "wss:"); - } - if (protocol.equals("http")) { - modelAndView.addObject("protocol", "ws:"); - } - } - - String httpHost = request.getHeader("X-Forwarded-Host"); - String realPort = request.getHeader("X-Forwarded-Port"); - String host = request.getHeader("Host"); + @Mapping("clean") + public JsonResult clean() { + sqlHelper.deleteByQuery(new ConditionAndWrapper(), Log.class); + return renderSuccess(); + } - String ctxWs = AdminInterceptor.getCtx(httpHost, host, realPort); - modelAndView.addObject("ctxWs", ctxWs); - - modelAndView.setViewName("/adminPage/log/tail"); + @Mapping("tail") + public ModelAndView tail(ModelAndView modelAndView, String id, String protocol) { + modelAndView.put("id", id); + modelAndView.view("/adminPage/log/tail.html"); return modelAndView; } - @ResponseBody - @RequestMapping("down") - public void down(ModelAndView modelAndView, String id, HttpServletResponse response) { + @Mapping("down") + public void down(ModelAndView modelAndView, String id) throws FileNotFoundException { Log log = sqlHelper.findById(id, Log.class); - outputStream(new File(log.getPath()), response); + File file = new File(log.getPath()); + + Context.current().contentType("application/octet-stream"); + String headerKey = "Content-Disposition"; + String headerValue = "attachment; filename=" + URLUtil.encode(file.getName()); + Context.current().header(headerKey, headerValue); + + InputStream inputStream = new FileInputStream(file); + Context.current().output(inputStream); } - private void outputStream(File file, HttpServletResponse response) { - try { - response.setContentType("application/octet-stream"); - String headerKey = "Content-Disposition"; - String headerValue = "attachment; filename=" + URLUtil.encode(file.getName()); - response.setHeader(headerKey, headerValue); - - InputStream inputStream = new FileInputStream(file); - IOUtils.copy(inputStream, response.getOutputStream()); - response.flushBuffer(); - } catch (IOException e) { - logger.error(e.getMessage(), e); + @Mapping("tailCmd") + public JsonResult tailCmd(String id, String guid) throws Exception { + Log log = sqlHelper.findById(id, Log.class); + if (!FileUtil.exist(log.getPath())) { + return renderSuccess(""); } + String rs = bLogFileTailer.run(guid, log.getPath()); + return renderSuccess(rs); } + } diff --git a/src/main/java/com/cym/controller/adminPage/LogTailController.java b/src/main/java/com/cym/controller/adminPage/LogTailController.java deleted file mode 100644 index e46bd36b4ad46b4020c5958e44919586422dfbe2..0000000000000000000000000000000000000000 --- a/src/main/java/com/cym/controller/adminPage/LogTailController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.cym.controller.adminPage; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import javax.websocket.OnClose; -import javax.websocket.OnError; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Controller; - -import com.cym.model.Log; -import com.cym.utils.ApplicationContextRegister; -import com.cym.utils.SystemTool; -import com.cym.utils.TailLogThread; - -import cn.craccd.sqlHelper.utils.SqlHelper; - -@ServerEndpoint("/adminPage/logTail/{id}/{guid}") -@Controller -public class LogTailController { - Logger logger = LoggerFactory.getLogger(this.getClass()); - Map processMap = new HashMap<>(); - Map inputStreamMap = new HashMap<>(); - - /** - * 新的WebSocket请求开启 - */ - @OnOpen - public void onOpen(Session session, @PathParam("id") String id, @PathParam("guid") String guid) { - - ApplicationContext act = ApplicationContextRegister.getApplicationContext(); - SqlHelper sqlHelper = act.getBean(SqlHelper.class); - - try { - // 执行tail -f命令 - Log log = sqlHelper.findById(id, Log.class); - if (log == null) { - return; - } - - Process process = null; - InputStream inputStream = null; - - if (SystemTool.isWindows()) { - process = Runtime.getRuntime().exec("powershell Get-Content " + log.getPath() + " -Tail 20"); - } else { - process = Runtime.getRuntime().exec("tail -f " + log.getPath() + " -n 20"); - } - inputStream = process.getInputStream(); - - processMap.put(guid, process); - inputStreamMap.put(guid, inputStream); - - // 一定要启动新的线程,防止InputStream阻塞处理WebSocket的线程 - TailLogThread thread = new TailLogThread(inputStream, session); - thread.start(); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - - /** - * WebSocket请求关闭 - */ - @OnClose - public void onClose(@PathParam("guid") String guid) { - try { - InputStream inputStream = inputStreamMap.get(guid); - Process process = processMap.get(guid); - - if (inputStream != null) { - inputStream.close(); - } - - if (process != null) { - process.destroy(); - } - - inputStreamMap.remove(guid); - processMap.remove(guid); - - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - } - - @OnError - public void onError(Throwable thr) { - logger.error(thr.getMessage(), thr); - } -} diff --git a/src/main/java/com/cym/controller/adminPage/LoginController.java b/src/main/java/com/cym/controller/adminPage/LoginController.java index 6cc4a39ffddeb36fee354190b7712a2ae3381901..f2014938252645c2a1161ec7b5396a3271659e4b 100644 --- a/src/main/java/com/cym/controller/adminPage/LoginController.java +++ b/src/main/java/com/cym/controller/adminPage/LoginController.java @@ -3,16 +3,11 @@ package com.cym.controller.adminPage; import java.util.HashMap; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; import com.cym.config.VersionConfig; import com.cym.model.Admin; @@ -22,12 +17,12 @@ import com.cym.service.CreditService; import com.cym.service.SettingService; import com.cym.utils.AuthUtils; import com.cym.utils.BaseController; +import com.cym.utils.EncodePassUtils; import com.cym.utils.JsonResult; import com.cym.utils.PwdCheckUtil; import com.cym.utils.SystemTool; import com.wf.captcha.SpecCaptcha; import com.wf.captcha.base.Captcha; -import com.wf.captcha.utils.CaptchaUtil; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; @@ -38,47 +33,61 @@ import cn.hutool.core.util.StrUtil; * @author Administrator * */ -@RequestMapping("/adminPage/login") +@Mapping("/adminPage/login") @Controller public class LoginController extends BaseController { - @Autowired + @Inject AdminService adminService; - @Autowired + @Inject CreditService creditService; - @Autowired + @Inject VersionConfig versionConfig; - @Autowired + @Inject AuthUtils authUtils; - @Value("${project.version}") - String currentVersion; - - @Autowired + @Inject SettingService settingService; - @RequestMapping("") - public ModelAndView admin(ModelAndView modelAndView, HttpServletRequest request, HttpSession httpSession, String adminId) { - modelAndView.addObject("adminCount", sqlHelper.findAllCount(Admin.class)); - modelAndView.setViewName("/adminPage/login/index"); + @Mapping("") + public ModelAndView admin(ModelAndView modelAndView, String adminId) { + modelAndView.put("adminCount", sqlHelper.findAllCount(Admin.class)); + modelAndView.view("/adminPage/login/index.html"); return modelAndView; } - @RequestMapping("loginOut") - public ModelAndView loginOut(ModelAndView modelAndView, HttpSession httpSession, HttpServletRequest request) { + @Mapping("loginOut") + public ModelAndView loginOut(ModelAndView modelAndView) { - httpSession.removeAttribute("isLogin"); - modelAndView.setViewName("/adminPage/index"); + Context.current().sessionRemove(("isLogin")); + ; + modelAndView.view("/adminPage/index.html"); return modelAndView; } - @RequestMapping("noServer") + @Mapping("noServer") public ModelAndView noServer(ModelAndView modelAndView) { - modelAndView.setViewName("/adminPage/login/noServer"); + modelAndView.view("/adminPage/login/noServer.html"); return modelAndView; } - @RequestMapping("login") - @ResponseBody - public JsonResult submitLogin(String name, String pass, String code, String authCode, String remember, HttpSession httpSession, HttpServletRequest httpServletRequest) { + /** + * 判断参数长度是否大于1000 + * + * @param param + * @return + */ + private boolean testLenth(String param) { + if (StrUtil.isNotEmpty(param) && param.length() > 1000) { + return true; + } + return false; + } + + @Mapping("login") + public JsonResult submitLogin(String name, String pass, String code, String authCode) { + if (testLenth(name) || testLenth(pass) || testLenth(code) || testLenth(authCode)) { + return renderError(m.get("loginStr.backError7")); + } + // 解码 if (StrUtil.isNotEmpty(name)) { name = Base64.decodeStr(Base64.decodeStr(name)); @@ -92,14 +101,14 @@ public class LoginController extends BaseController { if (StrUtil.isNotEmpty(authCode)) { authCode = Base64.decodeStr(Base64.decodeStr(authCode)); } - - + // 验证码 - if (!CaptchaUtil.ver(code, httpServletRequest)) { - CaptchaUtil.clear(httpServletRequest); // 销毁验证码 + String captcha = (String) Context.current().session("captcha"); + if (!code.equals(captcha)) { + Context.current().sessionRemove("captcha"); // 销毁验证码 return renderError(m.get("loginStr.backError1")); // 验证码不正确 } - CaptchaUtil.clear(httpServletRequest); // 销毁验证码 + Context.current().sessionRemove("captcha"); // 销毁验证码 // 用户名密码 Admin admin = adminService.login(name, pass); @@ -113,32 +122,31 @@ public class LoginController extends BaseController { } // 登录成功 - httpSession.setAttribute("localType", "local"); - httpSession.setAttribute("isLogin", true); - httpSession.setAttribute("admin", admin); - httpSession.removeAttribute("imgCode"); // 立刻销毁验证码 + Context.current().sessionSet("localType", "local"); + Context.current().sessionSet("isLogin", true); + Context.current().sessionSet("admin", admin); + Context.current().sessionRemove("imgCode"); // 立刻销毁验证码 // 检查更新 - versionConfig.getNewVersion(); + versionConfig.checkVersion(); return renderSuccess(admin); } - @RequestMapping("autoLogin") - @ResponseBody - public JsonResult autoLogin(String adminId, HttpSession httpSession) { + @Mapping("autoLogin") + public JsonResult autoLogin(String adminId) { // 用户名密码 Admin admin = sqlHelper.findById(adminId, Admin.class); if (admin != null) { // 登录成功 - httpSession.setAttribute("localType", "local"); - httpSession.setAttribute("isLogin", true); - httpSession.setAttribute("admin", admin); - httpSession.removeAttribute("imgCode"); // 立刻销毁验证码 + Context.current().sessionSet("localType", "local"); + Context.current().sessionSet("isLogin", true); + Context.current().sessionSet("admin", admin); + Context.current().sessionRemove("imgCode"); // 立刻销毁验证码 // 检查更新 - versionConfig.getNewVersion(); + versionConfig.checkVersion(); return renderSuccess(admin); } else { @@ -147,9 +155,11 @@ public class LoginController extends BaseController { } - @ResponseBody - @RequestMapping("getAuth") - public JsonResult getAuth(String name, String pass, String code, Integer remote, HttpSession httpSession, HttpServletRequest httpServletRequest) { + @Mapping("getAuth") + public JsonResult getAuth(String name, String pass, String code, Integer remote) { + if (testLenth(name) || testLenth(pass) || testLenth(code)) { + return renderError(m.get("loginStr.backError7")); + } // 解码 if (StrUtil.isNotEmpty(name)) { @@ -164,8 +174,9 @@ public class LoginController extends BaseController { // 验证码 if (remote == null) { - if (!CaptchaUtil.ver(code, httpServletRequest)) { - CaptchaUtil.clear(httpServletRequest); // 销毁验证码 + String captcha = (String) Context.current().session("captcha"); + if (!code.equals(captcha)) { + Context.current().sessionRemove("captcha"); // 销毁验证码 return renderError(m.get("loginStr.backError1")); // 验证码不正确 } } @@ -182,9 +193,12 @@ public class LoginController extends BaseController { return renderSuccess(ad); } - @ResponseBody - @RequestMapping("getCredit") + @Mapping("getCredit") public JsonResult getCredit(String name, String pass, String code, String auth) { + if (testLenth(name) || testLenth(pass) || testLenth(code)) { + return renderError(m.get("loginStr.backError7")); + } + // 解码 if (StrUtil.isNotEmpty(name)) { name = Base64.decodeStr(Base64.decodeStr(name)); @@ -222,15 +236,14 @@ public class LoginController extends BaseController { } - @ResponseBody - @RequestMapping("getLocalType") - public JsonResult getLocalType(HttpSession httpSession) { - String localType = (String) httpSession.getAttribute("localType"); + @Mapping("getLocalType") + public JsonResult getLocalType() { + String localType = (String) Context.current().session("localType"); if (StrUtil.isNotEmpty(localType)) { if ("local".equals(localType)) { return renderSuccess(m.get("remoteStr.local")); } else { - Remote remote = (Remote) httpSession.getAttribute("remote"); + Remote remote = (Remote) Context.current().session("remote"); if (StrUtil.isNotEmpty(remote.getDescr())) { return renderSuccess(remote.getDescr()); } @@ -242,8 +255,7 @@ public class LoginController extends BaseController { return renderSuccess(""); } - @RequestMapping("addAdmin") - @ResponseBody + @Mapping("addAdmin") public JsonResult addAdmin(String name, String pass) { Long adminCount = sqlHelper.findAllCount(Admin.class); @@ -257,7 +269,7 @@ public class LoginController extends BaseController { Admin admin = new Admin(); admin.setName(name); - admin.setPass(pass); + admin.setPass(EncodePassUtils.encode(pass)); admin.setAuth(false); admin.setType(0); @@ -266,23 +278,33 @@ public class LoginController extends BaseController { return renderSuccess(); } - @RequestMapping("/getCode") - public void getCode(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { + @Mapping("/getCode") + public void getCode() throws Exception { + Context.current().headerAdd("Pragma", "No-cache"); + Context.current().headerAdd("Cache-Control", "no-cache"); + Context.current().headerAdd("Expires", "0"); + Context.current().contentType("image/gif"); + SpecCaptcha specCaptcha = new SpecCaptcha(100, 40, 4); specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER); - CaptchaUtil.out(specCaptcha, httpServletRequest, httpServletResponse); + Context.current().sessionSet("captcha", specCaptcha.text().toLowerCase()); + specCaptcha.out(Context.current().outputStream()); } - @RequestMapping("/getRemoteCode") - public void getRemoteCode(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { + @Mapping("/getRemoteCode") + public void getRemoteCode() throws Exception { + Context.current().headerAdd("Pragma", "No-cache"); + Context.current().headerAdd("Cache-Control", "no-cache"); + Context.current().headerAdd("Expires", "0"); + Context.current().contentType("image/gif"); + SpecCaptcha specCaptcha = new SpecCaptcha(100, 40, 4); specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER); settingService.set("remoteCode", specCaptcha.text()); - specCaptcha.out(httpServletResponse.getOutputStream()); + specCaptcha.out(Context.current().outputStream()); } - @ResponseBody - @RequestMapping("/changeLang") + @Mapping("/changeLang") public JsonResult changeLang() { Long adminCount = sqlHelper.findAllCount(Admin.class); if (adminCount == 0) { @@ -296,5 +318,5 @@ public class LoginController extends BaseController { return renderSuccess(); } - + } diff --git a/src/main/java/com/cym/controller/adminPage/MainController.java b/src/main/java/com/cym/controller/adminPage/MainController.java index 1ccca8536f9a797d4d2e51dbd7a35f038b35e419..d918b7a3aae3ac3f6808d694dd1caeafa25f2355 100644 --- a/src/main/java/com/cym/controller/adminPage/MainController.java +++ b/src/main/java/com/cym/controller/adminPage/MainController.java @@ -4,23 +4,21 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; -import javax.servlet.http.HttpSession; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.DownloadedFile; +import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.core.handle.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.system.ApplicationHome; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; import com.cym.config.InitConfig; import com.cym.model.Remote; import com.cym.service.SettingService; import com.cym.utils.BaseController; +import com.cym.utils.JarUtil; import com.cym.utils.JsonResult; import com.cym.utils.SystemTool; import com.cym.utils.UpdateUtils; @@ -29,48 +27,36 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; -@RequestMapping("") +@Mapping("") @Controller public class MainController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject UpdateUtils updateUtils; - @Autowired + @Inject SettingService settingService; private static final Logger LOG = LoggerFactory.getLogger(MainController.class); - @RequestMapping("") + @Mapping("") public ModelAndView index(ModelAndView modelAndView, String keywords) { - modelAndView.setViewName("/adminPage/index"); + modelAndView.view("/adminPage/index.html"); return modelAndView; } + + @Mapping("doc.html") + public void doc(Context context) { + context.redirect("doc/api.html"); + } - @ResponseBody - @RequestMapping("/adminPage/main/upload") - public JsonResult upload(@RequestParam("file") MultipartFile file, HttpSession httpSession) { + + @Mapping("/adminPage/main/upload") + public JsonResult upload(Context context, UploadedFile file) { try { - File temp = new File(FileUtil.getTmpDir() + "/" + file.getOriginalFilename()); + File temp = new File(FileUtil.getTmpDir() + "/" + file.getName()); file.transferTo(temp); - // 移动文件 - File dest = new File(InitConfig.home + "cert/" + file.getOriginalFilename()); - FileUtil.move(temp, dest, true); - - String localType = (String) httpSession.getAttribute("localType"); - if ("remote".equals(localType)) { - Remote remote = (Remote) httpSession.getAttribute("remote"); - - HashMap paramMap = new HashMap<>(); - paramMap.put("file", dest); - - String rs = HttpUtil.post(remote.getProtocol() + "://" + remote.getIp() + ":" + remote.getPort() + "/upload", paramMap); - JsonResult jsonResult = JSONUtil.toBean(rs, JsonResult.class); - FileUtil.del(dest); - return jsonResult; - } - - return renderSuccess(dest.getPath().replace("\\", "/")); + return renderSuccess(temp.getPath().replace("\\", "/")); } catch (IllegalStateException | IOException e) { logger.error(e.getMessage(), e); } @@ -78,25 +64,17 @@ public class MainController extends BaseController { return renderError(); } - @ResponseBody - @RequestMapping("/adminPage/main/autoUpdate") + @Mapping("/adminPage/main/autoUpdate") public JsonResult autoUpdate(String url) { - if (!SystemTool.isLinux()) { - return renderError(m.get("commonStr.updateTips")); - } - - ApplicationHome home = new ApplicationHome(getClass()); - File jar = home.getSource(); + File jar = JarUtil.getCurrentFile(); String path = jar.getParent() + "/nginxWebUI.jar.update"; LOG.info("download:" + path); HttpUtil.downloadFile(url, path); updateUtils.run(path); return renderSuccess(); } - - - @ResponseBody - @RequestMapping("/adminPage/main/changeLang") + + @Mapping("/adminPage/main/changeLang") public JsonResult changeLang() { if (settingService.get("lang") != null && settingService.get("lang").equals("en_US")) { settingService.set("lang", ""); diff --git a/src/main/java/com/cym/controller/adminPage/MonitorController.java b/src/main/java/com/cym/controller/adminPage/MonitorController.java index f18183582baf526dac73bd7d925afa8d3e570251..4df814c51cf5c53024edf4f20c827190193baba5 100644 --- a/src/main/java/com/cym/controller/adminPage/MonitorController.java +++ b/src/main/java/com/cym/controller/adminPage/MonitorController.java @@ -1,17 +1,13 @@ package com.cym.controller.adminPage; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpSession; +import java.util.Date; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; import com.cym.ext.MonitorInfo; import com.cym.ext.NetworkInfo; @@ -20,58 +16,75 @@ import com.cym.service.SettingService; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; import com.cym.utils.NetWorkUtil; +import com.cym.utils.SystemTool; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -@RequestMapping("/adminPage/monitor") +@Mapping("/adminPage/monitor") @Controller public class MonitorController extends BaseController { - @Autowired + @Inject MonitorService monitorService; - @Autowired + @Inject SettingService settingService; Logger logger = LoggerFactory.getLogger(this.getClass()); - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView) { - modelAndView.addObject("list", monitorService.getDiskInfo()); + modelAndView.put("list", monitorService.getDiskInfo()); String nginxPath = settingService.get("nginxPath"); String nginxExe = settingService.get("nginxExe"); String nginxDir = settingService.get("nginxDir"); - modelAndView.addObject("nginxDir", nginxDir); - modelAndView.addObject("nginxExe", nginxExe); - modelAndView.addObject("nginxPath", nginxPath); + modelAndView.put("nginxDir", nginxDir); + modelAndView.put("nginxExe", nginxExe); + modelAndView.put("nginxPath", nginxPath); Boolean isInit = StrUtil.isNotEmpty(nginxExe); - modelAndView.addObject("isInit", isInit.toString()); + modelAndView.put("isInit", isInit.toString()); - modelAndView.setViewName("/adminPage/monitor/index"); + modelAndView.view("/adminPage/monitor/index.html"); return modelAndView; } - @RequestMapping("check") - @ResponseBody + @Mapping("check") public JsonResult check() { MonitorInfo monitorInfo = monitorService.getMonitorInfoOshi(); return renderSuccess(monitorInfo); } - - @RequestMapping("network") - @ResponseBody - public JsonResult network() { + + @Mapping("network") + public JsonResult network() throws InterruptedException { + if (SystemTool.isLinux() && !hasIfconfig()) { + Thread.sleep(2000); + NetworkInfo networkInfo = new NetworkInfo(); + networkInfo.setTime(DateUtil.format(new Date(), "HH:mm:ss")); + networkInfo.setSend(0d); + networkInfo.setReceive(0d); + + return renderSuccess(networkInfo); + } + NetworkInfo networkInfo = NetWorkUtil.getNetworkDownUp(); - //System.err.println(JSONUtil.toJsonStr(networkInfo)); return renderSuccess(networkInfo); } - @RequestMapping("addNginxGiudeOver") - @ResponseBody + private boolean hasIfconfig() { + String rs = RuntimeUtil.execForStr("which ifconfig"); + if (StrUtil.isNotEmpty(rs)) { + return true; + } + + return false; + } + + @Mapping("addNginxGiudeOver") public JsonResult addNginxGiudeOver(String nginxDir, String nginxExe) { settingService.set("nginxDir", nginxDir); diff --git a/src/main/java/com/cym/controller/adminPage/OperateLogController.java b/src/main/java/com/cym/controller/adminPage/OperateLogController.java index a764ed5da14a1b579a7fb60973ef5db9920f695d..8659320ce1b71b9e1d26bbfa0404669bc7f1760c 100644 --- a/src/main/java/com/cym/controller/adminPage/OperateLogController.java +++ b/src/main/java/com/cym/controller/adminPage/OperateLogController.java @@ -1,39 +1,34 @@ package com.cym.controller.adminPage; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.model.OperateLog; import com.cym.service.OperateLogService; +import com.cym.sqlhelper.bean.Page; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; -import cn.craccd.sqlHelper.bean.Page; - @Controller -@RequestMapping("/adminPage/operateLog") +@Mapping("/adminPage/operateLog") public class OperateLogController extends BaseController{ - @Autowired + @Inject OperateLogService operateLogService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page) { + @Mapping("") + public ModelAndView index( ModelAndView modelAndView, Page page) { page = operateLogService.search(page); - modelAndView.addObject("page", page); + modelAndView.put("page", page); - modelAndView.setViewName("/adminPage/operatelog/index"); + modelAndView.view("/adminPage/operatelog/index.html"); return modelAndView; } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, OperateLog.class)); } diff --git a/src/main/java/com/cym/controller/adminPage/PasswordController.java b/src/main/java/com/cym/controller/adminPage/PasswordController.java index a46f08d8ccad334e9e785cd775bce755e4ee9e7a..e542053d4f0d8d01c1027a694f4934845d41a58f 100644 --- a/src/main/java/com/cym/controller/adminPage/PasswordController.java +++ b/src/main/java/com/cym/controller/adminPage/PasswordController.java @@ -2,43 +2,39 @@ package com.cym.controller.adminPage; import java.io.IOException; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.config.InitConfig; import com.cym.model.Password; import com.cym.service.PasswordService; +import com.cym.sqlhelper.bean.Page; import com.cym.utils.BaseController; import com.cym.utils.Crypt; import com.cym.utils.JsonResult; import com.cym.utils.SystemTool; -import cn.craccd.sqlHelper.bean.Page; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; -@RequestMapping("/adminPage/password") +@Mapping("/adminPage/password") @Controller public class PasswordController extends BaseController { - @Autowired + @Inject PasswordService passwordService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView, Page page) { page = passwordService.search(page); - modelAndView.addObject("page", page); - modelAndView.setViewName("/adminPage/password/index"); + modelAndView.put("page", page); + modelAndView.view("/adminPage/password/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Password password) throws IOException { if (StrUtil.isEmpty(password.getId())) { @@ -56,7 +52,7 @@ public class PasswordController extends BaseController { FileUtil.del(passwordOrg.getPath()); } - password.setPath(InitConfig.home + "password/" + password.getName()); + password.setPath(homeConfig.home + "password/" + password.getName()); String value = ""; if (SystemTool.isWindows()) { @@ -73,8 +69,7 @@ public class PasswordController extends BaseController { return renderSuccess(); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { Password password = sqlHelper.findById(id, Password.class); sqlHelper.deleteById(id, Password.class); @@ -83,8 +78,7 @@ public class PasswordController extends BaseController { return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Password.class)); } diff --git a/src/main/java/com/cym/controller/adminPage/RemoteController.java b/src/main/java/com/cym/controller/adminPage/RemoteController.java index 276c5aa144c5c76411b6c111929bbbdcad0654fb..3d1cda551fd05eb0485147953319b9d3c6ded62f 100644 --- a/src/main/java/com/cym/controller/adminPage/RemoteController.java +++ b/src/main/java/com/cym/controller/adminPage/RemoteController.java @@ -11,19 +11,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import com.cym.config.VersionConfig; import com.cym.controller.api.NginxApiController; import com.cym.ext.AsycPack; import com.cym.ext.Tree; @@ -47,34 +43,32 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/remote") +@Mapping("/adminPage/remote") public class RemoteController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject RemoteService remoteService; - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject ConfService confService; - @Autowired + @Inject GroupService groupService; - @Autowired + @Inject ConfController confController; - @Autowired + @Inject MainController mainController; - @Autowired + @Inject NginxApiController nginxApiController; - - @Value("${project.version}") - String projectVersion; - @Value("${server.port}") + @Inject + VersionConfig versionConfig; + @Inject("${server.port}") Integer port; - @RequestMapping("version") - @ResponseBody + @Mapping("version") public Map version() { Map map = new HashMap<>(); - map.put("version", projectVersion); + map.put("version", versionConfig.currentVersion); if (NginxUtils.isRun()) { map.put("nginx", 1); @@ -85,25 +79,24 @@ public class RemoteController extends BaseController { return map; } - @RequestMapping("") - public ModelAndView index(ModelAndView modelAndView, HttpSession httpSession) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView) { JsonResult> jsonResult = nginxApiController.getNginxStartCmd(); - modelAndView.addObject("startCmds", jsonResult.getObj()); + modelAndView.put("startCmds", jsonResult.getObj()); jsonResult = nginxApiController.getNginxStopCmd(); - modelAndView.addObject("stopCmds", jsonResult.getObj()); + modelAndView.put("stopCmds", jsonResult.getObj()); - modelAndView.addObject("projectVersion", projectVersion); - modelAndView.setViewName("/adminPage/remote/index"); + modelAndView.put("projectVersion", versionConfig.currentVersion); + modelAndView.view("/adminPage/remote/index.html"); return modelAndView; } - @RequestMapping("allTable") - @ResponseBody - public List allTable(HttpServletRequest request) { - Admin admin = getAdmin(request); + @Mapping("allTable") + public List allTable() { + Admin admin = getAdmin(); List remoteList = sqlHelper.findAll(Remote.class); for (Remote remote : remoteList) { @@ -179,8 +172,7 @@ public class RemoteController extends BaseController { return ""; } - @RequestMapping("addGroupOver") - @ResponseBody + @Mapping("addGroupOver") public JsonResult addGroupOver(Group group) { if (StrUtil.isNotEmpty(group.getParentId()) && StrUtil.isNotEmpty(group.getId()) && group.getId().equals(group.getParentId())) { return renderError(m.get("remoteStr.parentGroupMsg")); @@ -190,24 +182,21 @@ public class RemoteController extends BaseController { return renderSuccess(); } - @RequestMapping("groupDetail") - @ResponseBody + @Mapping("groupDetail") public JsonResult groupDetail(String id) { return renderSuccess(sqlHelper.findById(id, Group.class)); } - @RequestMapping("delGroup") - @ResponseBody + @Mapping("delGroup") public JsonResult delGroup(String id) { groupService.delete(id); return renderSuccess(); } - @RequestMapping("getGroupTree") - @ResponseBody - public JsonResult getGroupTree(HttpServletRequest request) { - Admin admin = getAdmin(request); + @Mapping("getGroupTree") + public JsonResult getGroupTree() { + Admin admin = getAdmin(); List treeList = new ArrayList<>(); Tree tree = new Tree(); @@ -247,10 +236,9 @@ public class RemoteController extends BaseController { return false; } - @RequestMapping("getCmdRemote") - @ResponseBody - public JsonResult getCmdRemote(HttpServletRequest request) { - Admin admin = getAdmin(request); + @Mapping("getCmdRemote") + public JsonResult getCmdRemote() { + Admin admin = getAdmin(); List groups = remoteService.getGroupByAdmin(admin); List remotes = remoteService.getListByParent(null); @@ -294,9 +282,8 @@ public class RemoteController extends BaseController { } - @RequestMapping("cmdOver") - @ResponseBody - public JsonResult cmdOver(String[] remoteId, String cmd, Integer interval, HttpServletRequest request) { + @Mapping("cmdOver") + public JsonResult cmdOver(String[] remoteId, String cmd, Integer interval) { if (remoteId == null || remoteId.length == 0) { return renderSuccess(m.get("remoteStr.noSelect")); } @@ -312,10 +299,10 @@ public class RemoteController extends BaseController { jsonResult = confController.reload(null, null, null); } if (cmd.contentEquals("replace")) { - jsonResult = confController.replace(confController.getReplaceJson(), request, null); + jsonResult = confController.replace(confController.getReplaceJson(), null); } - if (cmd.startsWith("start") || cmd.startsWith("stop")) { - jsonResult = confController.runCmd(cmd.replace("start ", "").replace("stop ", ""), null); + if (cmd.startsWith("startNginx") || cmd.startsWith("stopNginx")) { + jsonResult = confController.runCmd(cmd.replaceFirst("startNginx ", "").replaceFirst("stopNginx ", ""), null); } if (cmd.contentEquals("update")) { jsonResult = renderError(m.get("remoteStr.notAllow")); @@ -331,15 +318,15 @@ public class RemoteController extends BaseController { try { String action = cmd; - if (cmd.startsWith("start") || cmd.startsWith("stop")) { + if (cmd.startsWith("startNginx") || cmd.startsWith("stopNginx")) { action = "runCmd"; } String url = remote.getProtocol() + "://" + remote.getIp() + ":" + remote.getPort() + "/adminPage/conf/" + action + "?creditKey=" + remote.getCreditKey(); Map map = new HashMap<>(); - if (cmd.startsWith("start") || cmd.startsWith("stop")) { - map.put("cmd", cmd.replace("start ", "").replace("stop ", "")); + if (cmd.startsWith("startNginx") || cmd.startsWith("stopNginx")) { + map.put("cmd", cmd.replaceFirst("startNginx ", "").replaceFirst("stopNginx ", "")); } String json = HttpUtil.post(url, map); @@ -370,9 +357,8 @@ public class RemoteController extends BaseController { return renderSuccess(rs.toString()); } - @RequestMapping("asyc") - @ResponseBody - public JsonResult asyc(String fromId, String[] remoteId, String[] asycData, HttpServletRequest request) { + @Mapping("asyc") + public JsonResult asyc(String fromId, String[] remoteId, String[] asycData) { if (StrUtil.isEmpty(fromId) || remoteId == null || remoteId.length == 0) { return renderError(m.get("remoteStr.noChoice")); } @@ -388,11 +374,11 @@ public class RemoteController extends BaseController { + "&asycData=" + StrUtil.join(",", Arrays.asList(asycData)), 1000); } - String adminName = getAdmin(request).getName(); + String adminName = getAdmin().getName(); for (String remoteToId : remoteId) { if (remoteToId.equals("local") || remoteToId.equals("本地")) { - setAsycPack(json, request, adminName); + setAsycPack(json, adminName); } else { Remote remoteTo = sqlHelper.findById(remoteToId, Remote.class); try { @@ -414,29 +400,23 @@ public class RemoteController extends BaseController { return renderSuccess(); } - @RequestMapping("getAsycPack") - @ResponseBody + @Mapping("getAsycPack") public String getAsycPack(String[] asycData) { AsycPack asycPack = confService.getAsycPack(asycData); return JSONUtil.toJsonPrettyStr(asycPack); } - @RequestMapping("setAsycPack") - @ResponseBody - public JsonResult setAsycPack(String json, HttpServletRequest request, String adminName) { + @Mapping("setAsycPack") + public JsonResult setAsycPack(String json, String adminName) { AsycPack asycPack = JSONUtil.toBean(json, AsycPack.class); - if (StrUtil.isEmpty(adminName)) { - Admin admin = getAdmin(request); - adminName = admin.getName(); - } - confService.setAsycPack(asycPack, adminName); + + confService.setAsycPack(asycPack); return renderSuccess(); } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Remote remote, String code, String auth) { remote.setIp(remote.getIp().trim()); @@ -455,8 +435,7 @@ public class RemoteController extends BaseController { } - @RequestMapping("getAuth") - @ResponseBody + @Mapping("getAuth") public JsonResult getAuth(Remote remote) { try { Map map = new HashMap<>(); @@ -482,22 +461,19 @@ public class RemoteController extends BaseController { } } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Remote.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Remote.class); return renderSuccess(); } - @RequestMapping("content") - @ResponseBody + @Mapping("content") public JsonResult content(String id) { Remote remote = sqlHelper.findById(id, Remote.class); @@ -507,8 +483,7 @@ public class RemoteController extends BaseController { return renderSuccess(rs); } - @RequestMapping("readContent") - @ResponseBody + @Mapping("readContent") public String readContent() { String nginxPath = settingService.get("nginxPath"); @@ -521,25 +496,23 @@ public class RemoteController extends BaseController { } - @RequestMapping("change") - @ResponseBody - public JsonResult change(String id, HttpSession httpSession) { + @Mapping("change") + public JsonResult change(String id,Context context) { Remote remote = sqlHelper.findById(id, Remote.class); if (remote == null) { - httpSession.setAttribute("localType", "local"); - httpSession.removeAttribute("remote"); + context.sessionSet("localType", "local"); + context.sessionRemove("remote"); } else { - httpSession.setAttribute("localType", "remote"); - httpSession.setAttribute("remote", remote); + context.sessionSet("localType", "remote"); + context.sessionSet("remote", remote); } return renderSuccess(); } - @RequestMapping("nginxStatus") - @ResponseBody - public JsonResult nginxStatus(HttpSession httpSession) { + @Mapping("nginxStatus") + public JsonResult nginxStatus() { Map map = new HashMap<>(); map.put("mail", settingService.get("mail")); @@ -549,8 +522,7 @@ public class RemoteController extends BaseController { return renderSuccess(map); } - @RequestMapping("nginxOver") - @ResponseBody + @Mapping("nginxOver") public JsonResult nginxOver(String mail, String nginxMonitor) { settingService.set("mail", mail); settingService.set("nginxMonitor", nginxMonitor); @@ -558,8 +530,7 @@ public class RemoteController extends BaseController { return renderSuccess(); } - @RequestMapping("setMonitor") - @ResponseBody + @Mapping("setMonitor") public JsonResult setMonitor(String id, Integer monitor) { if (!"local".equals(id)) { Remote remote = new Remote(); @@ -573,8 +544,8 @@ public class RemoteController extends BaseController { return renderSuccess(); } - @RequestMapping("/src") - public void src(HttpServletRequest httpServletRequest, HttpServletResponse response, String url) throws Exception { + @Mapping("/src") + public void src(String url) throws Exception { // response.addHeader("Content-Type", "image/jpeg"); // response.setHeader("content-disposition", "attachment;filename=code.jpg"); // 设置文件名 @@ -584,7 +555,7 @@ public class RemoteController extends BaseController { BufferedInputStream bis = null; try { bis = new BufferedInputStream(downUrl.openConnection().getInputStream()); - OutputStream os = response.getOutputStream(); + OutputStream os = Context.current().outputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); diff --git a/src/main/java/com/cym/controller/adminPage/RootController.java b/src/main/java/com/cym/controller/adminPage/RootController.java index 4b59915cd9a52c51f6e54aca6e780274268341a8..bf0a6ab72ee2b9f9d9b0bac23f6a118764ab674a 100644 --- a/src/main/java/com/cym/controller/adminPage/RootController.java +++ b/src/main/java/com/cym/controller/adminPage/RootController.java @@ -5,9 +5,8 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Mapping; import com.cym.ext.TreeNode; import com.cym.utils.BaseController; @@ -18,11 +17,11 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; @Controller -@RequestMapping("/adminPage/root") +@Mapping("/adminPage/root") public class RootController extends BaseController { - @ResponseBody - @RequestMapping("getList") + + @Mapping("getList") public List getList(String id) { if (StrUtil.isEmpty(id)) { id = "/"; @@ -81,8 +80,8 @@ public class RootController extends BaseController { return list; } - @ResponseBody - @RequestMapping("mkdir") + + @Mapping("mkdir") public JsonResult mkdir(String dir, String name) { FileUtil.mkdir(dir + name); diff --git a/src/main/java/com/cym/controller/adminPage/ServerController.java b/src/main/java/com/cym/controller/adminPage/ServerController.java index 2d3c0de2eadea431a5a8c0b8adea17330127d44b..d3adf357a90f6d94628c312353cc8ac2cca551de 100644 --- a/src/main/java/com/cym/controller/adminPage/ServerController.java +++ b/src/main/java/com/cym/controller/adminPage/ServerController.java @@ -1,23 +1,26 @@ package com.cym.controller.adminPage; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import javax.servlet.http.HttpSession; - +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.core.handle.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; import com.cym.ext.ServerExt; import com.cym.model.Cert; import com.cym.model.Http; import com.cym.model.Location; import com.cym.model.Password; +import com.cym.model.Remote; import com.cym.model.Server; import com.cym.model.Stream; import com.cym.model.Upstream; @@ -27,6 +30,9 @@ import com.cym.service.ParamService; import com.cym.service.ServerService; import com.cym.service.SettingService; import com.cym.service.UpstreamService; +import com.cym.sqlhelper.bean.Page; +import com.cym.sqlhelper.bean.Sort; +import com.cym.sqlhelper.bean.Sort.Direction; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; import com.cym.utils.SnowFlakeUtils; @@ -37,30 +43,28 @@ import com.github.odiszapc.nginxparser.NgxConfig; import com.github.odiszapc.nginxparser.NgxDumper; import com.github.odiszapc.nginxparser.NgxParam; -import cn.craccd.sqlHelper.bean.Page; -import cn.craccd.sqlHelper.bean.Sort; -import cn.craccd.sqlHelper.bean.Sort.Direction; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/server") +@Mapping("/adminPage/server") public class ServerController extends BaseController { Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Inject ServerService serverService; - @Autowired + @Inject UpstreamService upstreamService; - @Autowired + @Inject ParamService paramService; - @Autowired + @Inject SettingService settingService; - @Autowired + @Inject ConfService confService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView, Page page, String keywords) { + @Mapping("") + public ModelAndView index(ModelAndView modelAndView, Page page, String keywords) { page = serverService.search(page, keywords); List exts = new ArrayList(); @@ -69,12 +73,12 @@ public class ServerController extends BaseController { if (server.getEnable() == null) { server.setEnable(false); } - + // 描述回车转
- if(StrUtil.isNotEmpty(server.getDescr())) { - server.setDescr(server.getDescr().replace("\n", "
")); + if (StrUtil.isNotEmpty(server.getDescr())) { + server.setDescr(server.getDescr().replace("\n", "
").replace(" ", " ")); } - + serverExt.setServer(server); if (server.getProxyType() == 0) { serverExt.setLocationStr(buildLocationStr(server.getId())); @@ -83,55 +87,76 @@ public class ServerController extends BaseController { serverExt.setLocationStr(m.get("serverStr.server") + ": " + (upstream != null ? upstream.getName() : "")); } - + serverExt.setHref((server.getSsl() == 1 ? "https" : "http") + ("://" + server.getServerName() + ":" + server.getListen())); exts.add(serverExt); } page.setRecords(exts); - modelAndView.addObject("page", page); + modelAndView.put("page", page); List upstreamList = upstreamService.getListByProxyType(0); - modelAndView.addObject("upstreamList", upstreamList); - modelAndView.addObject("upstreamSize", upstreamList.size()); + modelAndView.put("upstreamList", upstreamList); + modelAndView.put("upstreamSize", upstreamList.size()); List upstreamTcpList = upstreamService.getListByProxyType(1); - modelAndView.addObject("upstreamTcpList", upstreamTcpList); - modelAndView.addObject("upstreamTcpSize", upstreamTcpList.size()); + modelAndView.put("upstreamTcpList", upstreamTcpList); + modelAndView.put("upstreamTcpSize", upstreamTcpList.size()); - modelAndView.addObject("certList", sqlHelper.findAll(Cert.class)); - modelAndView.addObject("wwwList", sqlHelper.findAll(Www.class)); + List certs = sqlHelper.findAll(Cert.class); + for (Cert cert : certs) { + if (cert.getType() == 0 || cert.getType() == 2) { + cert.setDomain(cert.getDomain() + "(" + cert.getEncryption() + ")"); + } + } + modelAndView.put("certList", certs); + modelAndView.put("wwwList", sqlHelper.findAll(Www.class)); - modelAndView.addObject("passwordList", sqlHelper.findAll(Password.class)); + modelAndView.put("passwordList", sqlHelper.findAll(Password.class)); - modelAndView.addObject("keywords", keywords); - modelAndView.setViewName("/adminPage/server/index"); + modelAndView.put("keywords", keywords); + modelAndView.view("/adminPage/server/index.html"); return modelAndView; } private String buildLocationStr(String id) { List str = new ArrayList(); List locations = serverService.getLocationByServerId(id); + for (Location location : locations) { + String descr = m.get("commonStr.descr"); + if (StrUtil.isNotEmpty(location.getDescr())) { + descr = location.getDescr(); + } + if (location.getType() == 0) { - str.add("" + location.getPath() + "
" + location.getValue() + ""); + str.add("" + location.getPath() + ""// + + "" + descr + ""// + + "
"// + + "" + location.getValue() + ""); } else if (location.getType() == 1) { - str.add("" + location.getPath() + "
" + location.getRootPath() + ""); + str.add("" + location.getPath() + ""// + + "" + descr + ""// + + "
"// + + ""// + + location.getRootPath() + ""); } else if (location.getType() == 2) { Upstream upstream = sqlHelper.findById(location.getUpstreamId(), Upstream.class); if (upstream != null) { - str.add("" + location.getPath() + "
http://" + upstream.getName() - + (location.getUpstreamPath() != null ? location.getUpstreamPath() : "") + ""); + str.add("" + location.getPath() + ""// + + "" + descr + ""// + + "
"// + + "http://" + upstream.getName() + (location.getUpstreamPath() != null ? location.getUpstreamPath() : "") + ""); } } else if (location.getType() == 3) { - str.add("" + location.getPath() + ""); + str.add("" + location.getPath() + "" // + + "" + descr + ""); } } return StrUtil.join("
", str); } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(String serverJson, String serverParamJson, String locationJson) { Server server = JSONUtil.toBean(serverJson, Server.class); List locations = JSONUtil.toList(JSONUtil.parseArray(locationJson), Location.class); @@ -153,15 +178,13 @@ public class ServerController extends BaseController { return renderSuccess(); } - @RequestMapping("setEnable") - @ResponseBody + @Mapping("setEnable") public JsonResult setEnable(Server server) { sqlHelper.updateById(server); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { Server server = sqlHelper.findById(id, Server.class); @@ -179,24 +202,22 @@ public class ServerController extends BaseController { return renderSuccess(serverExt); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { serverService.deleteById(id); return renderSuccess(); } -// @RequestMapping("clone") -// @ResponseBody +// @Mapping("clone") +// // public JsonResult clone(String id) { // serverService.clone(id); // // return renderSuccess(); // } - @RequestMapping("importServer") - @ResponseBody + @Mapping("importServer") public JsonResult importServer(String nginxPath) { if (StrUtil.isEmpty(nginxPath) || !FileUtil.exist(nginxPath)) { @@ -212,8 +233,7 @@ public class ServerController extends BaseController { } } - @RequestMapping("testPort") - @ResponseBody + @Mapping("testPort") public JsonResult testPort() { List servers = sqlHelper.findAll(Server.class); @@ -222,8 +242,10 @@ public class ServerController extends BaseController { String ip = ""; String port = ""; if (server.getListen().contains(":")) { - ip = server.getListen().split(":")[0]; - port = server.getListen().split(":")[1]; + String[] strArray = server.getListen().split(":"); + + port = strArray[strArray.length - 1]; + ip = server.getListen().replace(":" + port, ""); } else { ip = "127.0.0.1"; port = server.getListen(); @@ -242,8 +264,7 @@ public class ServerController extends BaseController { } - @RequestMapping("editDescr") - @ResponseBody + @Mapping("editDescr") public JsonResult editDescr(String id, String descr) { Server server = new Server(); server.setId(id); @@ -253,8 +274,7 @@ public class ServerController extends BaseController { return renderSuccess(); } - @RequestMapping("preview") - @ResponseBody + @Mapping("preview") public JsonResult preview(String id, String type) { NgxBlock ngxBlock = null; if (type.equals("server")) { @@ -268,6 +288,10 @@ public class ServerController extends BaseController { ngxBlock = new NgxBlock(); ngxBlock.addValue("http"); for (Http http : httpList) { + if (http.getEnable() == null || !http.getEnable()) { + continue; + } + NgxParam ngxParam = new NgxParam(); ngxParam.addValue(http.getName().trim() + " " + http.getValue().trim()); ngxBlock.addEntry(ngxParam); @@ -290,18 +314,65 @@ public class ServerController extends BaseController { return renderSuccess(conf); } - @RequestMapping("setOrder") - @ResponseBody + @Mapping("setOrder") public JsonResult setOrder(String id, Integer count) { serverService.setSeq(id, count); return renderSuccess(); } - - @RequestMapping("getDescr") - @ResponseBody + + @Mapping("getDescr") public JsonResult getDescr(String id) { Server server = sqlHelper.findById(id, Server.class); - return renderSuccess(server.getDescr()); } + + @Mapping("getLocationDescr") + public JsonResult getLocationDescr(String id) { + Location location = sqlHelper.findById(id, Location.class); + return renderSuccess(location.getDescr()); + } + + @Mapping("setLocationDescr") + public JsonResult setLocationDescr(String id, String descr) { + Location location = new Location(); + location.setId(id); + location.setDescr(descr); + sqlHelper.updateById(location); + + return renderSuccess(); + } + + @Mapping("upload") + public JsonResult upload(Context context, UploadedFile file) { + try { + File temp = new File(FileUtil.getTmpDir() + "/" + file.getName()); + file.transferTo(temp); + + // 移动文件 + File dest = new File(homeConfig.home + "cert/" + file.getName()); + while (FileUtil.exist(dest)) { + dest = new File(dest.getPath() + "_1"); + } + FileUtil.move(temp, dest, true); + + String localType = (String) context.session("localType"); + if ("remote".equals(localType)) { + Remote remote = (Remote) context.session("remote"); + + HashMap paramMap = new HashMap<>(); + paramMap.put("file", temp); + + String rs = HttpUtil.post(remote.getProtocol() + "://" + remote.getIp() + ":" + remote.getPort() + "/upload", paramMap); + JsonResult jsonResult = JSONUtil.toBean(rs, JsonResult.class); + FileUtil.del(temp); + return jsonResult; + } + + return renderSuccess(dest.getPath().replace("\\", "/")); + } catch (IllegalStateException | IOException e) { + logger.error(e.getMessage(), e); + } + + return renderError(); + } } diff --git a/src/main/java/com/cym/controller/adminPage/StreamController.java b/src/main/java/com/cym/controller/adminPage/StreamController.java index 788a4cd7cac19c679923f4c1cfa874d403af15cb..f6647a3aca8486a86b5bf1810ee82dd02505c6b3 100644 --- a/src/main/java/com/cym/controller/adminPage/StreamController.java +++ b/src/main/java/com/cym/controller/adminPage/StreamController.java @@ -1,42 +1,39 @@ package com.cym.controller.adminPage; +import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; +import com.cym.model.Stream; import com.cym.model.Stream; import com.cym.service.StreamService; import com.cym.utils.BaseController; import com.cym.utils.JsonResult; import com.cym.utils.SnowFlakeUtils; -import cn.craccd.sqlHelper.bean.Sort; -import cn.craccd.sqlHelper.bean.Sort.Direction; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/stream") +@Mapping("/adminPage/stream") public class StreamController extends BaseController { - @Autowired + @Inject StreamService streamService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { + @Mapping("") + public ModelAndView index( ModelAndView modelAndView) { List streamList = streamService.findAll(); - modelAndView.addObject("streamList", streamList); - modelAndView.setViewName("/adminPage/stream/index"); + modelAndView.put("streamList", streamList); + modelAndView.view("/adminPage/stream/index.html"); return modelAndView; } - @RequestMapping("addOver") - @ResponseBody + @Mapping("addOver") public JsonResult addOver(Stream stream) { if (StrUtil.isEmpty(stream.getId())) { stream.setSeq( SnowFlakeUtils.getId()); @@ -47,33 +44,56 @@ public class StreamController extends BaseController { } - @RequestMapping("addTemplate") - @ResponseBody + @Mapping("addTemplate") public JsonResult addTemplate(String templateId) { streamService.addTemplate(templateId); return renderSuccess(); } - @RequestMapping("detail") - @ResponseBody + @Mapping("detail") public JsonResult detail(String id) { return renderSuccess(sqlHelper.findById(id, Stream.class)); } - @RequestMapping("del") - @ResponseBody + @Mapping("del") public JsonResult del(String id) { sqlHelper.deleteById(id, Stream.class); return renderSuccess(); } - @RequestMapping("setOrder") - @ResponseBody + @Mapping("setOrder") public JsonResult setOrder(String id, Integer count) { streamService.setSeq(id, count); return renderSuccess(); } + + @Mapping("addGiudeOver") + public JsonResult addGiudeOver(Boolean logStatus) { + List streams = new ArrayList(); + if (logStatus) { + + Stream stream = new Stream(); + stream.setName("log_format basic"); + stream.setValue("'$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time \"$upstream_addr\" \"$upstream_bytes_sent\" \"$upstream_bytes_received\" \"$upstream_connect_time\"'"); + streams.add(stream); + + stream = new Stream(); + stream.setName("access_log"); + stream.setValue(homeConfig.home + "log/stream_access.log basic"); + streams.add(stream); + + stream = new Stream(); + stream.setName("open_log_file_cache"); + stream.setValue("off"); + streams.add(stream); + } + + streamService.setAll(streams); + + return renderSuccess(); + } + } diff --git a/src/main/java/com/cym/controller/adminPage/TemplateController.java b/src/main/java/com/cym/controller/adminPage/TemplateController.java index 51d8fbf0dfc7303c6aec31a35cd19ba6f05ebb25..5bc43705c6eded03e378056b107f6e927999ae2b 100644 --- a/src/main/java/com/cym/controller/adminPage/TemplateController.java +++ b/src/main/java/com/cym/controller/adminPage/TemplateController.java @@ -3,16 +3,12 @@ package com.cym.controller.adminPage; import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpSession; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; import com.cym.ext.TemplateExt; -import com.cym.model.Location; import com.cym.model.Param; import com.cym.model.Template; import com.cym.service.TemplateService; @@ -23,13 +19,13 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @Controller -@RequestMapping("/adminPage/template") +@Mapping("/adminPage/template") public class TemplateController extends BaseController { - @Autowired + @Inject TemplateService templateService; - @RequestMapping("") - public ModelAndView index(HttpSession httpSession, ModelAndView modelAndView) { + @Mapping("") + public ModelAndView index( ModelAndView modelAndView) { List