diff --git a/app-dm/src/TeacherPages/TestManage/Test.tsx b/app-dm/src/TeacherPages/TestManage/Test.tsx index cb17197..5f7889d 100644 --- a/app-dm/src/TeacherPages/TestManage/Test.tsx +++ b/app-dm/src/TeacherPages/TestManage/Test.tsx @@ -4,31 +4,12 @@ import React, { useEffect, useState, useRef } from 'react'; import { useLocation } from 'react-router-dom'; import io, { Socket } from "socket.io-client"; -function base64Decode(encoded: string): string { - return atob(encoded); -} -export default function WebSSH() { +export default function WebSSH({ ip = "10.233.183.99", port = "22", password = "123456", user = "dmdba" }) { const location = useLocation(); const terminalObj = useRef(null); const [terminal, setTerminal] = useState(null); const [socket, setSocket] = useState(null); - const [ip, setIp] = useState(""); - const [port, setPort] = useState(""); - const [password, setPassword] = useState(""); - - useEffect(() => { - const params = new URLSearchParams(location.search); - const encodedIp = params.get("ip"); - const encodedPort = params.get("port"); - const encodedPassword = params.get("password"); - - if (encodedIp && encodedPort && encodedPassword) { - setIp(base64Decode(encodedIp)); - setPort(base64Decode(encodedPort)); - setPassword(base64Decode(encodedPassword)); - } - }, [location]); useEffect(() => { if (terminal === null) { @@ -69,9 +50,9 @@ export default function WebSSH() { useEffect(() => { if (socket && ip && port && password) { - socket.emit("connect_ssh", { ip, port, password }); + socket.emit("connect_ssh", { ip, port, password, user }); } - }, [socket, ip, port, password]); + }, [socket, ip, port, password, user]); function pasteContent(event: React.MouseEvent) { navigator.clipboard.readText().then((content) => { diff --git a/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx b/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx index 3ffb297..8d45431 100644 --- a/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx +++ b/app-dm/src/TeacherPages/Trainmanage/SendTrain.jsx @@ -83,7 +83,7 @@ function SendTrain(){ endDate }) alert('发布成功') - window.location.href='http://localhost:3000/teacher/trainmanage' + window.location.href='/teacher/trainmanage' }catch{ alert('SendTrainTest出错') diff --git a/app-dm/src/pages/Home/Home.jsx b/app-dm/src/pages/Home/Home.jsx index 3368983..d0b28a2 100644 --- a/app-dm/src/pages/Home/Home.jsx +++ b/app-dm/src/pages/Home/Home.jsx @@ -11,11 +11,23 @@ import { max, min } from 'lodash'; // 首页 function Home(){ - const student_ID=localStorage.getItem('islogin') - if(student_ID==null){ - window.location.href='http://localhost:3000/signin' - alert('未登录,请先前往登录') - } + const [isChecked,setisChecked]=useState(false) + //判断是否登录 + // useEffect(()=>{ + // if (!isChecked){ + // const is_login=localStorage.getItem('islogin') + // if(!is_login){ + // alert('未登录') + // window.location.href='/signin' + // }else{ + // console.log(is_login); + // console.log('已登录'); + // setisChecked(true) + // } + // //组件加载时自动调用login函数进行登录检测 + // } + // },[]);//在组件加载时只调用一次 + //课表数据 const [lesson, setLesson] = useState([]); const [firstlesson, setfirstlesson] = useState([]); @@ -36,7 +48,7 @@ function Home(){ setLesson(lesson_data) }catch(error){ if(student_ID.length===6){ - window.location.href='http://localhost:3000/teacher' + window.location.href='/teacher' return }else{ alert('提示出错') diff --git a/app-dm/src/pages/ListPages/Subject/Exam.jsx b/app-dm/src/pages/ListPages/Subject/Exam.jsx index 8058205..bf93ff3 100644 --- a/app-dm/src/pages/ListPages/Subject/Exam.jsx +++ b/app-dm/src/pages/ListPages/Subject/Exam.jsx @@ -81,7 +81,7 @@ function Exam() { clearInterval(interval); alert('考试时间到!'); correct() - window.location.href='http://localhost:3000/subject' + window.location.href='/subject' } }, 1000); return () => clearInterval(interval); @@ -183,7 +183,7 @@ function Exam() { setCountdown(0) localStorage.removeItem('time') alert('提交成功') - window.location.href='http://localhost:3000/subject' + window.location.href='/subject' } diff --git a/app-dm/src/pages/ListPages/Training/Operation2.jsx b/app-dm/src/pages/ListPages/Training/Operation2.jsx index bee25e5..1fb5dbc 100644 --- a/app-dm/src/pages/ListPages/Training/Operation2.jsx +++ b/app-dm/src/pages/ListPages/Training/Operation2.jsx @@ -154,7 +154,7 @@ function Operation2() { localStorage.removeItem('answeredJudge') localStorage.removeItem('RemainingTime') alert('提交成功') - window.location.href='http://localhost:3000/train' + window.location.href='/train' localStorage.removeItem('TrainData') } diff --git a/app-dm/src/router/index.jsx b/app-dm/src/router/index.jsx old mode 100755 new mode 100644 index bc10b90..f52c3f4 --- a/app-dm/src/router/index.jsx +++ b/app-dm/src/router/index.jsx @@ -23,7 +23,10 @@ import ClassID from '../TeacherPages/classlistpages/classId'; import ManageTest from '../TeacherPages/TestManage/ManageTest'; import SendTest from '../TeacherPages/TestManage/SendTest'; import Marking from '../TeacherPages/MarkingPages/Marking'; +import SendTrain from '../TeacherPages/Trainmanage/SendTrain' +import TrainManage from '../TeacherPages/Trainmanage/Trainmanage' import StudentLink from '../TeacherPages/MarkingPages/StudentLink'; +import Test from '../TeacherPages/TestManage/Test.tsx' import SendTrain from '../TeacherPages/Trainmanage/SendTrain'; @@ -69,6 +72,7 @@ function App() { }> } /> + }/> {/* 页面使用单独的布局,不包含HeaderNav和HeaderNavTeacher */} } />{/* 练习-考试页面 */} diff --git a/build.sh b/build.sh index 38c1c27..4fb5363 100644 --- a/build.sh +++ b/build.sh @@ -43,9 +43,11 @@ main() { build_image build-dmpython build_image build-frontend build_image flask-app + build_image code-server push_image flask-app push_image base-dm + push_image code-server echo "脚本结束" } diff --git a/docker-compose.yml b/docker-compose.yml index 4d5bc3e..2401c83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,3 +31,14 @@ services: - '8765:8765' command: gunicorn -w 3 -t 60 -b 0.0.0.0:8000 app:app + code-server: + build: ./docker/code-server + restart: always + image: code-server + depends_on: + - build-dmpython + ports: + - '8443:8443' + - '5000:5000' + - '3000:3000' + diff --git a/docker/base-dm/Dockerfile b/docker/base-dm/Dockerfile index 24689fc..8253d21 100644 --- a/docker/base-dm/Dockerfile +++ b/docker/base-dm/Dockerfile @@ -1,16 +1,24 @@ +# base-dm FROM base # 添加用户 RUN useradd -m -s /bin/bash dmdba \ -# 修改用户密码 -&& echo "dmdba:123456" | chpasswd + # 修改用户密码 + && echo "dmdba:123456" | chpasswd \ + && apt-get -y update \ + && apt-get install -y --no-install-recommends \ + p7zip-full unzip wget \ + && apt-get clean \ + && rm -rf /config/* /tmp/* /var/lib/apt/lists/* /var/tmp/* WORKDIR /home/dmdba -# 传入安装包并解压 -RUN wget https://download.dameng.com/eco/adapter/DM8/202405/dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip \ -&& unzip dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip \ -&& chown -R dmdba:dmdba /home/dmdba \ -&& rm -f dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip \ -&& 7z x dm8_20240408_x86_rh7_64.iso \ -&& rm -f dm8_20240408_x86_rh7_64.iso \ -&& chmod +x DMInstall.bin -USER dmdba \ No newline at end of file +# 下载安装包并解压 +RUN wget https://download.dameng.com/eco/adapter/DM8/202405/dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip --no-check-certificate \ + && unzip dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip \ + && chown -R dmdba:dmdba /home/dmdba \ + && rm -f dm8_20240408_x86_rh7_64_ent_8.1.3.140.zip \ + && 7z x dm8_20240408_x86_rh7_64.iso \ + && rm -f dm8_20240408_x86_rh7_64.iso \ + && chmod +x DMInstall.bin \ + && apt-get remove -y p7zip-full unzip wget +USER dmdba +CMD ["/bin/bash", "-e"] \ No newline at end of file diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index c03eea3..9cb2c8c 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -1,24 +1,20 @@ -FROM ubuntu +# base +FROM ubuntu:22.04 # apt安装时,防止卡死在交互界面 ENV DEBIAN_FRONTEND=noninteractive ENV LANG=zh_CN.UTF-8 ENV LC_ALL=zh_CN.UTF-8 # 基础软件安装 RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list \ -&& apt-get -y update && apt-get -y upgrade \ -&& apt-get install -y python3.10-venv libssl-dev sudo vim python3-pip ssh wget unzip p7zip* language-pack-zh-hans language-selector-common locales locales-all \ -# 设置中文环境 -&& apt install -y $(check-language-support) \ -&& sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \ -&& sudo sed -i 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config \ -&& echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen \ -&& sudo /usr/sbin/update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 \ -&& locale-gen \ -&& pip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple \ -&& echo "**** clean up ****" && \ -apt-get clean && \ -rm -rf \ - /config/* \ - /tmp/* \ - /var/lib/apt/lists/* \ - /var/tmp/* + && apt-get -y update && apt-get -y upgrade \ + && apt-get install -y --no-install-recommends \ + # && apt-get install -y python3.10-venv libssl-dev sudo vim python3-pip ssh wget unzip p7zip* language-pack-zh-hans language-selector-common locales locales-all \ + ssh locales language-pack-zh-hans-base \ + && sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \ + && sed -i 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config \ + && echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen \ + && /usr/sbin/update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 \ + && locale-gen \ + # && pip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple \ + && apt-get clean \ + && rm -rf /config/* /tmp/* /var/lib/apt/lists/* /var/tmp/* \ No newline at end of file diff --git a/docker/build-dmpython/Dockerfile b/docker/build-dmpython/Dockerfile index ccd5865..9baf7ac 100644 --- a/docker/build-dmpython/Dockerfile +++ b/docker/build-dmpython/Dockerfile @@ -1,7 +1,24 @@ +#build-dmpython FROM base-dm WORKDIR /home/dmdba COPY auto_install.xml . -RUN ./DMInstall.bin -q /home/dmdba/auto_install.xml +RUN ./DMInstall.bin -q /home/dmdba/auto_install.xml \ + && rm -rf ./DMInstall.bin +USER root +RUN apt-get -y update \ + && apt-get install -y --no-install-recommends \ + python3-dev python3-pip gcc \ + && apt-get clean \ + && rm -rf /config/* /tmp/* /var/lib/apt/lists/* /var/tmp/* \ + && pip3 install wheel + +USER dmdba # 编译 WORKDIR /home/dmdba/dmdbms/drivers/python/dmPython -RUN DM_HOME=/home/dmdba/dmdbms python3 setup.py bdist_wheel && mkdir /home/dmdba/build_artifacts && cp dist/dmPython-2.5.5-cp310-cp310-linux_x86_64.whl /home/dmdba/build_artifacts/ && cp /home/dmdba/dmdbms/bin/libdmdpi.so /home/dmdba/build_artifacts/ +RUN DM_HOME=/home/dmdba/dmdbms python3 setup.py bdist_wheel \ + && mkdir /home/dmdba/build_artifacts \ + && mv dist/dmPython-2.5.5-cp310-cp310-linux_x86_64.whl /home/dmdba/build_artifacts/ \ + && cp /home/dmdba/dmdbms/bin/libdmdpi.so /home/dmdba/build_artifacts/ +USER root +RUN apt-get remove -y python3-dev python3-pip gcc +USER dmdba diff --git a/docker/build-dmpython/auto_install.xml b/docker/build-dmpython/auto_install.xml index e6e6523..58bd61e 100644 --- a/docker/build-dmpython/auto_install.xml +++ b/docker/build-dmpython/auto_install.xml @@ -10,7 +10,7 @@ - 0 + 1 /home/dmdba/dmdbms diff --git a/docker/code-server/Dockerfile b/docker/code-server/Dockerfile index 8cd2e23..9507ded 100644 --- a/docker/code-server/Dockerfile +++ b/docker/code-server/Dockerfile @@ -1,57 +1,73 @@ -FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy +#code-server +FROM build-dmpython -# set version label -ARG BUILD_DATE -ARG VERSION -ARG CODE_RELEASE -LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" -LABEL maintainer="aptalca" +ENV DEBIAN_FRONTEND="noninteractive" +WORKDIR /home/dmdba +USER root -# environment settings -ARG DEBIAN_FRONTEND="noninteractive" -ENV HOME="/config" - -RUN \ - echo "**** install runtime dependencies ****" && \ - apt-get update && \ - apt-get install -y \ - git \ +RUN apt-get update && apt-get install -y --no-install-recommends \ + git jq libatomic1 nano net-tools netcat python3-pip nodejs npm curl sudo catatonit \ + cron \ + curl \ + gnupg \ jq \ - libatomic1 \ - nano \ - net-tools \ netcat \ - # 安装python nodejs - python3 \ - python3-pip \ - nodejs \ - npm \ - sudo && \ - echo "**** install code-server ****" && \ - if [ -z ${CODE_RELEASE+x} ]; then \ - CODE_RELEASE=$(curl -sX GET https://api.github.com/repos/coder/code-server/releases/latest \ - | awk '/tag_name/{print $4;exit}' FS='[""]' | sed 's|^v||'); \ - fi && \ - mkdir -p /app/code-server && \ - curl -o \ - /tmp/code-server.tar.gz -L \ - "https://github.com/coder/code-server/releases/download/v${CODE_RELEASE}/code-server-${CODE_RELEASE}-linux-amd64.tar.gz" && \ - tar xf /tmp/code-server.tar.gz -C \ - /app/code-server --strip-components=1 && \ - echo "**** clean up ****" && \ - apt-get clean && \ - rm -rf \ - /config/* \ - /tmp/* \ - /var/lib/apt/lists/* \ - /var/tmp/* + tzdata \ + xz-utils \ + && CODE_RELEASE=$(curl -sX GET https://api.github.com/repos/coder/code-server/releases/latest | awk '/tag_name/{print $4;exit}' FS='[""]' | sed 's|^v||') \ + && mkdir -p /app/code-server \ + && curl -o /tmp/code-server.tar.gz -L "https://github.com/coder/code-server/releases/download/v${CODE_RELEASE}/code-server-${CODE_RELEASE}-linux-amd64.tar.gz" \ + && tar xf /tmp/code-server.tar.gz -C /app/code-server --strip-components=1 \ + && apt-get clean \ + && rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* \ + && pip3 install /home/dmdba/build_artifacts/dmPython-2.5.5-cp310-cp310-linux_x86_64.whl \ + && rm /home/dmdba/build_artifacts/dmPython-2.5.5-cp310-cp310-linux_x86_64.whl + +# set environment variables +ENV HOME="/root" \ + LANGUAGE="en_US.UTF-8" \ + LANG="en_US.UTF-8" \ + TERM="xterm" \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME="0" \ + S6_VERBOSITY=1 \ + S6_STAGE2_HOOK=/docker-mods \ + VIRTUAL_ENV=/lsiopy \ + PATH="/lsiopy/bin:$PATH" \ + HOME="/config" + +# set version for s6 overlay +ARG S6_OVERLAY_VERSION="3.1.6.2" +ARG S6_OVERLAY_ARCH="x86_64" + +# add s6 overlay +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz + +# add s6 optional symlinks +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz && \ + useradd -u 911 -U -d /config -s /bin/false abc && \ + usermod -G users abc && \ + mkdir -p \ + /app \ + /config \ + /defaults \ + /lsiopy + +ARG MODS_VERSION="v3" +ARG PKG_INST_VERSION="v1" +ARG LSIOWN_VERSION="v1" +ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/docker-mods.${MODS_VERSION}" "/docker-mods" +ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/package-install.${PKG_INST_VERSION}" "/etc/s6-overlay/s6-rc.d/init-mods-package-install/run" +ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/lsiown.${LSIOWN_VERSION}" "/usr/bin/lsiown" -# 安装达梦数据库 -RUN mkdir -p /opt/dm8.zip && \ - wget -O root/opt/dm8.zip https://download.dameng.com/eco/adapter/DM8/202401END/dm8_20240408_x86_rh7_64.zip # add local files COPY /root / - # ports and volumes -EXPOSE 8443 +EXPOSE 5000 3000 8443 +ENTRYPOINT ["/init"] \ No newline at end of file diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/dependencies.d/legacy-services b/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/dependencies.d/legacy-services new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/up new file mode 100644 index 0000000..e0f9488 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/ci-service-check/up @@ -0,0 +1 @@ +echo "[ls.io-init] done." \ No newline at end of file diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/branding b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/branding new file mode 100644 index 0000000..99077a5 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/branding @@ -0,0 +1,12 @@ +─────────────────────────────────────── + _____ __ __ _____ _____ _____ _____ + | | | | __|_ _| | | + | --| | |__ | | | | | | | | | + |_____|_____|_____| |_| |_____|_|_|_| + _____ __ __ _ __ ____ + | __ | | | | | | \ + | __ -| | | | |__| | | + |_____|_____|_|_____|____/ + + Based on images from linuxserver.io +─────────────────────────────────────── diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/run new file mode 100644 index 0000000..a03a3e9 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/run @@ -0,0 +1,32 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +PUID=${PUID:-911} +PGID=${PGID:-911} + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc + +cat /etc/s6-overlay/s6-rc.d/init-adduser/branding + +if [[ -f /donate.txt ]]; then + echo ' +To support the app dev(s) visit:' + cat /donate.txt +fi +echo ' +To support LSIO projects visit: +https://www.linuxserver.io/donate/ + +─────────────────────────────────────── +GID/UID +───────────────────────────────────────' +echo " +User UID: $(id -u abc) +User GID: $(id -g abc) +─────────────────────────────────────── +" + +lsiown abc:abc /app +lsiown abc:abc /config +lsiown abc:abc /defaults diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/up new file mode 100644 index 0000000..b8522da --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-adduser/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-adduser/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/dependencies.d/init-config b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/dependencies.d/init-config new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/up new file mode 100644 index 0000000..c329423 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config-end/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the end of the downstream image init process diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/dependencies.d/init-os-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/dependencies.d/init-os-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/up new file mode 100644 index 0000000..e80acfe --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-config/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the start of the downstream image init process diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/dependencies.d/init-os-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/dependencies.d/init-os-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/run new file mode 100644 index 0000000..3b51d5a --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/run @@ -0,0 +1,31 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +for cron_user in abc root; do + if [[ -f "/etc/crontabs/${cron_user}" ]]; then + lsiown "${cron_user}":"${cron_user}" "/etc/crontabs/${cron_user}" + crontab -u "${cron_user}" "/etc/crontabs/${cron_user}" + fi + + if [[ -f "/defaults/crontabs/${cron_user}" ]]; then + # make folders + mkdir -p \ + /config/crontabs + + # if crontabs do not exist in config + if [[ ! -f "/config/crontabs/${cron_user}" ]]; then + # copy crontab from system + if crontab -l -u "${cron_user}" >/dev/null 2>&1; then + crontab -l -u "${cron_user}" >"/config/crontabs/${cron_user}" + fi + + # if crontabs still do not exist in config (were not copied from system) + # copy crontab from image defaults (using -n, do not overwrite an existing file) + cp -n "/defaults/crontabs/${cron_user}" /config/crontabs/ + fi + + # set permissions and import user crontabs + lsiown "${cron_user}":"${cron_user}" "/config/crontabs/${cron_user}" + crontab -u "${cron_user}" "/config/crontabs/${cron_user}" + fi +done diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/up new file mode 100644 index 0000000..d354111 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-crontab-config/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-crontab-config/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/dependencies.d/init-mods-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/dependencies.d/init-mods-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/run new file mode 100644 index 0000000..3d8a17e --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/run @@ -0,0 +1,22 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# Directories +SCRIPTS_DIR="/custom-cont-init.d" + +# Make sure custom init directory exists and has files in it +if [[ -e "${SCRIPTS_DIR}" ]] && [[ -n "$(/bin/ls -A ${SCRIPTS_DIR} 2>/dev/null)" ]]; then + echo "[custom-init] Files found, executing" + for SCRIPT in "${SCRIPTS_DIR}"/*; do + NAME="$(basename "${SCRIPT}")" + if [[ -f "${SCRIPT}" ]]; then + echo "[custom-init] ${NAME}: executing..." + /bin/bash "${SCRIPT}" + echo "[custom-init] ${NAME}: exited $?" + elif [[ ! -f "${SCRIPT}" ]]; then + echo "[custom-init] ${NAME}: is not a file" + fi + done +else + echo "[custom-init] No custom files found, skipping..." +fi diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/up new file mode 100644 index 0000000..28bf318 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-custom-files/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-custom-files/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/run new file mode 100644 index 0000000..592df52 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/run @@ -0,0 +1,19 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +if find /run/s6/container_environment/FILE__* -maxdepth 1 > /dev/null 2>&1; then + for FILENAME in /run/s6/container_environment/FILE__*; do + SECRETFILE=$(cat "${FILENAME}") + if [[ -f ${SECRETFILE} ]]; then + FILESTRIP=${FILENAME//FILE__/} + if [[ $(tail -n1 "${SECRETFILE}" | wc -l) != 0 ]]; then + echo "[env-init] Your secret: ${FILENAME##*/}" + echo " contains a trailing newline and may not work as expected" + fi + cat "${SECRETFILE}" >"${FILESTRIP}" + echo "[env-init] ${FILESTRIP##*/} set from ${FILENAME##*/}" + else + echo "[env-init] cannot find secret in ${FILENAME##*/}" + fi + done +fi diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/up new file mode 100644 index 0000000..b2b4fb8 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-envfile/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-envfile/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/run new file mode 100644 index 0000000..37f5b78 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/run @@ -0,0 +1,33 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +MIGRATIONS_DIR="/migrations" +MIGRATIONS_HISTORY="/config/.migrations" + +echo "[migrations] started" + +if [[ ! -d ${MIGRATIONS_DIR} ]]; then + echo "[migrations] no migrations found" + exit +fi + +for MIGRATION in $(find ${MIGRATIONS_DIR}/* | sort -n); do + NAME="$(basename "${MIGRATION}")" + if [[ -f ${MIGRATIONS_HISTORY} ]] && grep -Fxq "${NAME}" ${MIGRATIONS_HISTORY}; then + echo "[migrations] ${NAME}: skipped" + continue + fi + echo "[migrations] ${NAME}: executing..." + chmod +x "${MIGRATION}" + # Execute migration script in a subshell to prevent it from modifying the current environment + ("${MIGRATION}") + EXIT_CODE=$? + if [[ ${EXIT_CODE} -ne 0 ]]; then + echo "[migrations] ${NAME}: failed with exit code ${EXIT_CODE}, contact support" + exit "${EXIT_CODE}" + fi + echo "${NAME}" >>${MIGRATIONS_HISTORY} + echo "[migrations] ${NAME}: succeeded" +done + +echo "[migrations] done" diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/up new file mode 100644 index 0000000..7c4cbcf --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-migrations/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-migrations/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/dependencies.d/init-mods b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/dependencies.d/init-mods new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/dependencies.d/init-mods-package-install b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/dependencies.d/init-mods-package-install new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/up new file mode 100644 index 0000000..092149d --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-end/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the end of the mod init process diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/dependencies.d/init-mods b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/dependencies.d/init-mods new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/up new file mode 100644 index 0000000..fb63301 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods-package-install/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-mods-package-install/run diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/dependencies.d/base b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/dependencies.d/init-config-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/dependencies.d/init-config-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/up new file mode 100644 index 0000000..040d801 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-mods/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the start of the mod init process diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/base b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-adduser b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-adduser new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-envfile b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-envfile new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-migrations b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/dependencies.d/init-migrations new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/up new file mode 100644 index 0000000..092149d --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-os-end/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the end of the mod init process diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-custom-files b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-custom-files new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-mods-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-mods-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/up b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/up new file mode 100644 index 0000000..a7c3905 --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/init-services/up @@ -0,0 +1 @@ +# This file doesn't do anything, it just signals that services can start diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/dependencies.d/init-services b/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/dependencies.d/init-services new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/run b/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/run new file mode 100644 index 0000000..87e4fdb --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/run @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +if builtin command -v crontab >/dev/null 2>&1 && [[ -n "$(crontab -l -u abc 2>/dev/null || true)" || -n "$(crontab -l -u root 2>/dev/null || true)" ]]; then + if builtin command -v busybox >/dev/null 2>&1 && [[ $(busybox || true) =~ [[:space:]](crond)([,]|$) ]]; then + exec busybox crond -f -S -l 5 + elif [[ -f /usr/bin/apt ]] && [[ -f /usr/sbin/cron ]]; then + exec /usr/sbin/cron -f -L 5 + else + echo "**** cron not found ****" + sleep infinity + fi +else + sleep infinity +fi diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/type b/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/docker/code-server/root/etc/s6-overlay/s6-rc.d/svc-cron/type @@ -0,0 +1 @@ +longrun diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-adduser b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-adduser new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-config b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-config new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-config-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-config-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-crontab-config b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-crontab-config new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-custom-files b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-custom-files new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-envfile b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-envfile new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-migrations b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-migrations new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods-package-install b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-mods-package-install new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-os-end b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-os-end new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-services b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-services new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-cron b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-cron new file mode 100644 index 0000000..e69de29 diff --git a/docker/code-server/root/etc/s6-overlay/s6-rc.d/user2/contents.d/ci-service-check b/docker/code-server/root/etc/s6-overlay/s6-rc.d/user2/contents.d/ci-service-check new file mode 100644 index 0000000..e69de29 diff --git a/python/Dockerfile b/python/Dockerfile index db826f5..a624406 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -1,15 +1,18 @@ +#flask-app FROM base -# 升级pip -RUN pip install --upgrade pip # 创建一个用户运行flask RUN useradd -m -s /bin/bash flask && \ -chown -R flask:flask /home/flask && \ -mkdir -p /var/log/flask-app && touch /var/log/flask-app/flask-app.err.log && touch /var/log/flask-app/flask-app.out.log && \ -chown -R flask:flask /var/log/flask-app && \ -service ssh start && \ -service ssh restart + chown -R flask:flask /home/flask && \ + mkdir -p /var/log/flask-app && touch /var/log/flask-app/flask-app.err.log && touch /var/log/flask-app/flask-app.out.log && \ + chown -R flask:flask /var/log/flask-app \ + && apt-get -y update \ + && apt-get install -y --no-install-recommends \ + python3 python3-dev python3-pip python3-venv \ + && apt-get clean \ + && rm -rf /config/* /tmp/* /var/lib/apt/lists/* /var/tmp/* \ + && pip install --upgrade pip WORKDIR /home/flask USER flask diff --git a/python/app.py b/python/app.py index 5b52326..15c08eb 100644 --- a/python/app.py +++ b/python/app.py @@ -6,6 +6,7 @@ import paramiko from teacher_func import * from student_func import * +from k8s_func import * from flask import Flask, render_template, request, jsonify, send_from_directory, session from flask_cors import CORS @@ -256,13 +257,11 @@ def SendTrainTest(): TrainJudge=data['TrainJudge'] Hour=data['HourValue'] Min=data['MinValue'] + StopTime=data['StopTime'] Class=data['selectedItems'] Train=data['Train'] teacher_id=data['teacher_ID'] - startTime=data['startDate'] - endTime=data['endDate'] - SendTrainTestFunc(TrainChoice, TrainCompletion, TrainJudge, Hour, Min,Class,Train,teacher_id,startTime,endTime) - TeacherMark(Class,teacher_id) + SendTrainTestFunc(TrainChoice, TrainCompletion, TrainJudge, Hour, Min, StopTime,Class,Train,teacher_id) return '发布成功' @@ -271,14 +270,26 @@ def Find_details(): data=request.json ID=data['ID'] result=Find_details_Func(ID) + print(result) return jsonify({'TestScore':result}) +@app.route("/api/teacher/list_pods") # 列出pod +def teacher_list_pods(): + return list_pods() +@app.route("/api/teacher/list_services") # 列出服务 +def teacher_list_services(): + return list_services() -@app.route('/api/teacher/NotMarkTest',methods=["POST"]) -def NotMark(): - testID=request.json['testID'] - result=NotMarkTest(testID) - return jsonify({'result':result}) +@app.route("/api/teacher/create_pod") # 创建服务 0为项目实训, 1为安装实训 +def teacher_create_pod(): + return create_pod(1, "test") +@app.route("/api/teacher/delete_pod") # 删除服务 +def teacher_delete_pod(): + return delete_pod("test") + +@app.route("/api/teacher/check_pod") # 检测数据库是否安装成功 若成功,返回OK 否则返回NO +def teacher_check_pod(): + return check_dm("test") @app.route('/') @app.route('/') @@ -291,13 +302,14 @@ def handle_connect_ssh(data): ip = data['ip'] port = int(data['port']) password = data['password'] + user = data['user'] client_id = request.sid - + print("connected to " + ip + " " + str(port) + " " + password) ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: - ssh_client.connect(ip, port=port, username='your-username', password=password) + ssh_client.connect(ip, port=port, username=user, password=password) transport = ssh_client.get_transport() channel = transport.open_session() channel.get_pty() diff --git a/python/assets/type0-pod.yaml b/python/assets/type0-pod.yaml index 667ef74..c8b9701 100644 --- a/python/assets/type0-pod.yaml +++ b/python/assets/type0-pod.yaml @@ -4,16 +4,21 @@ metadata: name: NAME namespace: "" labels: - app: NAME + app: NAME spec: - containers: - - name: base-dm - image: harbor.dameng.io/cnsof50011836/base-dm - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: '1' - memory: 1Gi - requests: - cpu: '0.25' - memory: 0.5G \ No newline at end of file + containers: + - name: base-dm + image: harbor.dameng.io/cnsof50011836/base-dm:latest + imagePullPolicy: Always + command: [ "/bin/bash", "-c" ] + args: [ "service ssh start && tail -f /dev/null" ] + securityContext: + runAsUser: 0 + runAsGroup: 0 + resources: + limits: + cpu: '1' + memory: 1Gi + requests: + cpu: '0.25' + memory: 0.5Gi \ No newline at end of file diff --git a/python/assets/type0-service.yaml b/python/assets/type0-service.yaml index e69de29..85b888b 100644 --- a/python/assets/type0-service.yaml +++ b/python/assets/type0-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: NAME +spec: + selector: + app: NAME + ports: + - protocol: TCP + port: 22 + targetPort: 22 + name: "ssh" + - protocol: TCP + port: 5236 + targetPort: 5236 + name: "dm" + type: ClusterIP + + + diff --git a/python/assets/type1-pod.yaml b/python/assets/type1-pod.yaml new file mode 100644 index 0000000..6025574 --- /dev/null +++ b/python/assets/type1-pod.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Pod +metadata: + name: NAME + namespace: "" + labels: + app: NAME +spec: + containers: + - name: code-server + image: harbor.dameng.io/cnsof50011836/code-server:latest + imagePullPolicy: Always + securityContext: + runAsUser: 0 + runAsGroup: 0 + resources: + limits: + cpu: '1' + memory: 1Gi + requests: + cpu: '0.25' + memory: 0.5Gi \ No newline at end of file diff --git a/python/assets/type1-service.yaml b/python/assets/type1-service.yaml new file mode 100644 index 0000000..618840e --- /dev/null +++ b/python/assets/type1-service.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Service +metadata: + name: NAME +spec: + selector: + app: NAME + ports: + - protocol: TCP + port: 8443 + targetPort: 8443 + name: "code" + appProtocol: HTTP + - protocol: TCP + port: 5000 + targetPort: 5000 + name: "flask" + appProtocol: HTTP + - protocol: TCP + port: 3000 + targetPort: 3000 + name: "frontend" + appProtocol: HTTP + type: NodePort + + + diff --git a/python/k8s_func.py b/python/k8s_func.py new file mode 100644 index 0000000..b6f6bc1 --- /dev/null +++ b/python/k8s_func.py @@ -0,0 +1,84 @@ +import json +import traceback + +import yaml +from kubernetes import client, config +from flask import jsonify +import dmPython +# Load in-cluster config +config.load_incluster_config() +v1 = client.CoreV1Api() +namespace = open("/var/run/secrets/kubernetes.io/serviceaccount/namespace").read() +IP = "36.138.114.105" +def list_pods(): + ret = v1.list_namespaced_pod(namespace, watch=False) + return { + "list": [{ + "name": item.metadata.name, + "ip": item.status.pod_ip + } for item in ret.items] + } + +def list_services(): + ret = v1.list_namespaced_service(namespace) + return { + "list": [ + item.to_dict() + for item in ret.items] + } + +def create_pod(type, name): + # 读取 pod yaml 文件 + with open(f"assets/type{type}-pod.yaml") as f: + pod_manifest = yaml.safe_load(f) + pod_manifest["metadata"]["name"] = name + pod_manifest["metadata"]["labels"]["app"] = name + # 创建 Pod + resp = v1.create_namespaced_pod( + body=pod_manifest, + namespace=namespace + ) + print(f"pod '{resp.metadata.name}' 创建成功") + # 创建 Service + with open(f"assets/type{type}-service.yaml") as f: + service_pod = yaml.safe_load(f) + service_pod["metadata"]["name"] = name + "-service" + service_pod["spec"]["selector"]["app"] = name + + resp = v1.create_namespaced_service( + body=service_pod, + namespace=namespace + ) + print(f"服务 '{resp.metadata.name}' 创建成功") + if type == 1: + # 创建成功,再次查询,拿到端口 + service = v1.read_namespaced_service(name=name + "-service", namespace=namespace) + print(service) + print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port)) + else: + service = v1.read_namespaced_service(name=name + "-service", namespace=namespace) + print(service) + print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port)) + return f"{IP} {service.spec.ports[0].node_port}" + +def delete_pod(name): + v1.delete_namespaced_pod(name=name, namespace=namespace) + v1.delete_namespaced_service(name=name + "-service", namespace=namespace) + return "删除成功" + +def check_dm(name): + try: + service = v1.read_namespaced_service(name=name + "-service", namespace=namespace) + db = dmPython.connect(user='SYSDBA', password='SYSDBA', host=service.spec.cluster_ip, port="5236") + cursor = db.cursor() + records = cursor.execute("SELECT * FROM V$VERSION").fetchall() + for record in records: + print(record) + return "OK" + except: + traceback.print_exc() + return "NO" + + + +