├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── app.js ├── buildlocal └── encrypto │ ├── Dockerfile │ └── root │ └── gimmie.sh ├── docker-compose.yml ├── git ├── package.json ├── pre_install ├── public ├── LICENSE ├── css │ ├── sb-admin.min.css │ └── vdi.css ├── favicon │ ├── android-icon-144x144.png │ ├── android-icon-192x192.png │ ├── android-icon-36x36.png │ ├── android-icon-48x48.png │ ├── android-icon-72x72.png │ ├── android-icon-96x96.png │ ├── apple-icon-114x114.png │ ├── apple-icon-120x120.png │ ├── apple-icon-144x144.png │ ├── apple-icon-152x152.png │ ├── apple-icon-180x180.png │ ├── apple-icon-57x57.png │ ├── apple-icon-60x60.png │ ├── apple-icon-72x72.png │ ├── apple-icon-76x76.png │ ├── apple-icon-precomposed.png │ ├── apple-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.ico │ ├── manifest.json │ ├── ms-icon-144x144.png │ ├── ms-icon-150x150.png │ ├── ms-icon-310x310.png │ └── ms-icon-70x70.png ├── index.html ├── js │ ├── desktop.js │ ├── rdp.js │ ├── taisun.js │ ├── term.js │ └── vnc.js ├── stackstemp │ └── README.md ├── taisuntemplates │ ├── basetemplate.yml │ ├── cloud9.yml │ ├── codeserver.yml │ ├── pylon.yml │ ├── taisungateway.yml │ ├── taisunportforward.yml │ ├── taisunrdpvnc.yml │ ├── taisuntmux.yml │ └── taisunvdi.yml └── vendor │ ├── ace │ ├── ace.js │ ├── mode-yaml.js │ └── theme-chrome.js │ ├── bootstrap │ ├── css │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── js │ │ └── bootstrap.min.js │ ├── datatables │ ├── css │ │ └── datatables.min.css │ ├── images │ │ ├── sort_asc.png │ │ ├── sort_asc_disabled.png │ │ ├── sort_both.png │ │ ├── sort_desc.png │ │ └── sort_desc_disabled.png │ └── js │ │ └── datatables.min.js │ ├── font-awesome │ ├── css │ │ └── fontawesome.min.css │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ ├── guac │ └── js │ │ └── guac.min.js │ ├── jquery-easing │ └── jquery.easing.min.js │ ├── jquery │ └── jquery.min.js │ ├── popper │ └── popper.min.js │ ├── shortcut │ └── js │ │ └── shortcut.js │ ├── showdown │ └── showdown.min.js │ └── xterm │ ├── css │ └── xterm.css │ └── js │ └── xterm.js ├── root └── etc │ ├── cont-init.d │ └── 35-dev-config │ └── services.d │ └── taisun │ └── run └── views ├── guac.ejs ├── rdp.ejs ├── terminal.ejs └── vnc.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .c9 3 | version 4 | public/stackstemp/*.yml 5 | package-lock.json 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: true 2 | 3 | language: bash 4 | 5 | services: 6 | - docker 7 | 8 | env: 9 | global: 10 | - DEBIAN_FRONTEND="noninteractive" 11 | - BUILD_DATE=$(date '+%Y-%m-%dT%H:%M:%S%:z') 12 | - DOCKERHUB_LIVE="taisun/webapp" 13 | - GITHUB_REPO="Taisun-Docker/taisun" 14 | 15 | jobs: 16 | include: 17 | - stage: BuildCommitDev 18 | if: (NOT (type IN (pull_request))) AND (tag IS blank) 19 | before_install: 20 | - /bin/bash pre_install 21 | script: 22 | # Build Dev image 23 | - docker build --no-cache -f Dockerfile --build-arg BUILD_DATE="${BUILD_DATE}" -t ${DOCKERHUB_LIVE}:${TRAVIS_COMMIT} . 24 | - docker tag ${DOCKERHUB_LIVE}:${TRAVIS_COMMIT} ${DOCKERHUB_LIVE}:latest 25 | # Login to DockerHub 26 | - echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin 27 | # Push all of the tags 28 | - docker push ${DOCKERHUB_LIVE}:${TRAVIS_COMMIT} 29 | - docker push ${DOCKERHUB_LIVE}:latest 30 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Taisun ![Taisun](http://taisun.io/img/TaisunSmall.png) 2 | 3 | http://taisun.io 4 | 5 | The first step to contributing code to the project is insuring there is an issue open and accepted for the potential commit. You can see current issues here: 6 | 7 | https://gitlab.com/thelamer/taisun/issues 8 | 9 | Once an issue has been created go ahead and fork the repository: 10 | 11 | https://gitlab.com/thelamer/taisun/forks/new 12 | 13 | Now you need to submit a change, the Taisun project provides a container specifically for this. To run one simply execute: 14 | 15 | ``` 16 | sudo docker run --name taisun -d \ 17 | -p 3000:80 \ 18 | -p 8000:8000 \ 19 | -v /var/run/docker.sock:/var/run/docker.sock \ 20 | taisun/webapp:latest.dev 21 | ``` 22 | 23 | In this example a Cloud9 interface will be available at http://localhost:8000 . 24 | 25 | ### Cloud9 Basics 26 | 27 | When you first access the development interface you will be greeted with a login screen, this is only there to provide an ability to identify yourself if you are working in a shared environment. 28 | 29 | ![setuser](/uploads/ac74d3005383538bb9758485f74f9963/setuser.png) 30 | 31 | Once you are in the Cloud9 interface in your terminal on the bottom you will want to start tailing the nodemon output with: 32 | 33 | ``` 34 | tail -f /root/Taisun.log 35 | ``` 36 | 37 | Now whenever you make code changes the current node output will be seen here. 38 | 39 | ### Your first commit 40 | 41 | In order to tie this into your repo we need to change the remote away from the main Taisun repo so we will run three commands here: 42 | 43 | ``` 44 | git checkout master 45 | git config --global user.email "youremailhere" 46 | git remote set-url origin https://gitlab.com/Taisun-test/taisun.git 47 | ``` 48 | 49 | With the examples above swap out for your email and your forked project URL. 50 | 51 | For this example we are going to append something to the Readme: 52 | 53 | ![taisuncommit](/uploads/0c10af376ee26e762476bfd82868b460/taisuncommit.png) 54 | 55 | In the above image we changed the README.md file and here is the sequence of commands used to commit and push it: 56 | 57 | ``` 58 | root@47b6378ead89:/usr/src/Taisun# git add . 59 | root@47b6378ead89:/usr/src/Taisun# git commit -m '#70 adding test line to the readme' 60 | To Commit Please enter your gitlab username:taisun-test 61 | [master e769293] #70 adding test line to the readme 62 | 1 file changed, 2 insertions(+) 63 | root@47b6378ead89:/usr/src/Taisun# git push origin master 64 | Username for 'https://gitlab.com': taisun-test 65 | Password for 'https://taisun-test@gitlab.com': 66 | Counting objects: 3, done. 67 | Delta compression using up to 8 threads. 68 | Compressing objects: 100% (3/3), done. 69 | Writing objects: 100% (3/3), 326 bytes | 0 bytes/s, done. 70 | Total 3 (delta 2), reused 0 (delta 0) 71 | To https://gitlab.com/Taisun-test/taisun.git 72 | 07e9da8..e769293 master -> master 73 | ``` 74 | 75 | In this example #70 is used to represent the issue you are referencing in the main repo. 76 | 77 | 78 | ### Creating a merge request 79 | 80 | Click on the link below to start a Merge request: 81 | 82 | https://gitlab.com/thelamer/taisun/merge_requests 83 | 84 | You should automatically be presented with the merge request from your forked version, simply select the branch you want to merge ( in this case master ) : 85 | 86 | ![start](/uploads/8a002390e9f0aaeeb72241f036f72d2c/start.png) 87 | 88 | Edit the description to the merge request to your liking and submit it: 89 | 90 | ![submit](/uploads/a58434c0cf0bc05f167404da71723bf5/submit.png) 91 | 92 | Once approved your merge request will be integrated with the project and the open issue will hopefully be closed. -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lsiobase/alpine:3.11 as buildstage 2 | 3 | ARG COMPOSE_VERSION=1.24.1 4 | ARG PYINSTALLER_VERSION=v3.6 5 | 6 | RUN \ 7 | echo "**** install build deps ****" && \ 8 | apk add --no-cache \ 9 | curl \ 10 | g++ \ 11 | gcc \ 12 | git \ 13 | libc-dev \ 14 | libffi-dev \ 15 | make \ 16 | musl-dev \ 17 | openssl-dev \ 18 | python3 \ 19 | python3-dev \ 20 | zlib-dev 21 | 22 | RUN \ 23 | echo "**** build pyinstaller ****" && \ 24 | git clone --depth 1 \ 25 | --single-branch \ 26 | --branch ${PYINSTALLER_VERSION} \ 27 | https://github.com/pyinstaller/pyinstaller.git \ 28 | /tmp/pyinstaller && \ 29 | cd /tmp/pyinstaller/bootloader && \ 30 | CFLAGS="-Wno-stringop-overflow -Wno-error=stringop-truncation" python3 \ 31 | ./waf configure --no-lsb all && \ 32 | pip3 install .. 33 | 34 | 35 | RUN \ 36 | echo "**** build compose ****" && \ 37 | cd /tmp && \ 38 | git clone https://github.com/docker/compose.git && \ 39 | cd compose && \ 40 | git checkout ${COMPOSE_VERSION} && \ 41 | pip3 install \ 42 | -r requirements.txt && \ 43 | ./script/build/write-git-sha > compose/GITSHA && \ 44 | pyinstaller docker-compose.spec && \ 45 | mv dist/docker-compose / 46 | 47 | 48 | # runtime stage 49 | FROM lsiobase/cloud9:alpine 50 | MAINTAINER Ryan Kuba 51 | # Set Label info 52 | ARG BUILD_DATE 53 | LABEL build_version="Build-date:- ${BUILD_DATE}" 54 | 55 | RUN \ 56 | echo "**** install build packages ****" && \ 57 | apk add --no-cache --virtual=build-dependencies \ 58 | curl \ 59 | nodejs-npm && \ 60 | echo "**** install runtime packages ****" && \ 61 | apk add --no-cache \ 62 | docker-cli \ 63 | expect \ 64 | git \ 65 | libcap \ 66 | nodejs \ 67 | sudo \ 68 | tcl && \ 69 | echo "**** install Taisun ****" && \ 70 | git clone https://github.com/Taisun-Docker/taisun.git /code && \ 71 | echo "**** install node modules ****" && \ 72 | npm install --prefix /code && \ 73 | npm install -g nodemon && \ 74 | mv /usr/bin/git /usr/bin/gitbin && \ 75 | echo "**** cleanup ****" && \ 76 | addgroup -g 100 docker && \ 77 | apk del --purge \ 78 | build-dependencies && \ 79 | rm -rf \ 80 | /tmp/* 81 | 82 | # copy local files 83 | COPY root/ / 84 | COPY ./git /usr/bin/git 85 | COPY --from=buildstage /docker-compose /usr/local/bin/ 86 | 87 | #App runs on port 3000 development interface on port 8000 88 | EXPOSE 3000 89 | EXPOSE 8000 90 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # No longer being developed 2 | 3 | This project started in the hopes of community users writing out complex templates for large application stacks and automating them which never really came to fruition. It has since given birth to concepts like https://github.com/linuxserver/docker-mods and https://github.com/linuxserver/docker-webtop. There is no encompassing replacement, but in general this code has not been maintained for some time and I cannot in good conscious reccomend people still use it as is. 4 | 5 | ## Taisun ![Taisun](http://taisun.io/img/TaisunSmall.png) 6 | 7 | http://taisun.io 8 | 9 | [![Build Status](https://travis-ci.org/Taisun-Docker/taisun.svg?branch=master)](https://travis-ci.org/Taisun-Docker/taisun) 10 | 11 | Taisun is an application for a Docker enabled device with an emphasis on providing a web based interface for managing a single server. 12 | 13 | Taisun allows you to: 14 | 15 | - Deploy and manage web based virtual desktops. 16 | - Deploy Taisun specific stacks of applications 17 | - Browse available images on popular Docker repositories 18 | - Import a Docker project from any git repository and start developing on your choice of web based IDE or full Linux desktop 19 | - Spinup a developer container based on popular frameworks and work from a web based IDE 20 | 21 | ### QuickStart 22 | 23 | On a Docker enabled host run the following command from cli: 24 | ``` 25 | sudo docker run --name taisun -d \ 26 | --restart always \ 27 | -p 3000:3000 \ 28 | -v /var/run/docker.sock:/var/run/docker.sock \ 29 | linuxserver/taisun:latest 30 | ``` 31 | Taisun will be available by accessing: 32 | 33 | http://localhost:3000 34 | 35 | ## Documentation: 36 | 37 | [Installation](https://github.com/Taisun-Docker/taisun/wiki/Installation) 38 | - [Linux](https://github.com/Taisun-Docker/taisun/wiki/Linux) 39 | - [Windows](https://github.com/Taisun-Docker/taisun/wiki/Windows) 40 | - [Synology DSM](https://github.com/Taisun-Docker/taisun/wiki/Synology) 41 | 42 | [Usage](https://github.com/Taisun-Docker/taisun/wiki/Usage) 43 | - [Stack Management](https://github.com/Taisun-Docker/taisun/wiki/Stacks) 44 | - [Image Management](https://github.com/Taisun-Docker/taisun/wiki/Images) 45 | - [Virtual Desktops](https://github.com/Taisun-Docker/taisun/wiki/VDI) 46 | - [Remote Access](https://github.com/Taisun-Docker/taisun/wiki/Gateway) 47 | 48 | [Development](https://github.com/Taisun-Docker/taisun/wiki/Development) 49 | - [Create Stack Templates](https://github.com/Taisun-Docker/taisun/wiki/Templates) 50 | - [Taisun Development](https://github.com/Taisun-Docker/taisun/wiki/Taisundev) 51 | - [Development Containers](https://github.com/Taisun-Docker/taisun/wiki/YourApp) 52 | 53 | ##### License: 54 | WTFPL 55 | -------------------------------------------------------------------------------- /buildlocal/encrypto/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lsiobase/alpine:3.9 as buildstage 2 | 3 | # Build args 4 | ARG INPUT 5 | ARG PASS 6 | 7 | RUN \ 8 | echo "**** install packages ****" && \ 9 | apk add --no-cache --upgrade \ 10 | gnupg && \ 11 | echo "**** encode text blob ****" && \ 12 | echo "${INPUT}" > /input && \ 13 | echo "${PASS}" | gpg \ 14 | --output /enc.gpg \ 15 | --batch --yes \ 16 | --pinentry-mode loopback \ 17 | --passphrase-fd 0 -c /input 18 | 19 | # Runtime Stage 20 | FROM lsiobase/alpine:3.9 21 | 22 | RUN \ 23 | echo "**** install packages ****" && \ 24 | apk add --no-cache --upgrade \ 25 | gnupg 26 | 27 | # Add local files 28 | COPY root/ / 29 | COPY --from=buildstage /enc.gpg /enc.gpg 30 | 31 | ENTRYPOINT ["/bin/bash"] 32 | CMD ["/gimmie.sh"] -------------------------------------------------------------------------------- /buildlocal/encrypto/root/gimmie.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | # Output the file contents to stdout 4 | echo ${PASS} | \ 5 | gpg -q --output - \ 6 | --batch --yes \ 7 | --pinentry-mode loopback \ 8 | --passphrase-fd 0 -d /enc.gpg 9 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | taisun: 5 | image: linuxserver/taisun 6 | container_name: taisun 7 | volumes: 8 | - /var/run/docker.sock:/var/run/docker.sock 9 | ports: 10 | - 3000:3000 11 | network_mode: bridge 12 | restart: unless-stopped 13 | 14 | -------------------------------------------------------------------------------- /git: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | if [ $1 = 'commit' ]; then 3 | echo -n "To Commit Please enter your github username:" 4 | read username 5 | /usr/bin/gitbin config user.name "$username" 6 | /usr/bin/gitbin "$@" 7 | else 8 | /usr/bin/gitbin "$@" 9 | fi 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Taisun", 3 | "version": "v0.6.0", 4 | "description": "Taisun docker server management", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Taisun-Docker/taisun.git" 12 | }, 13 | "author": "Ryan Kuba", 14 | "license": "WTFPL", 15 | "homepage": "http://taisun.io", 16 | "dependencies": { 17 | "ansi_up": "^4.0.4", 18 | "docker-hub-api": "^0.8.0", 19 | "dockerode": "^3.1.0", 20 | "dockops": "^0.2.1", 21 | "ejs": "^3.0.1", 22 | "express": "^4.17.1", 23 | "git-clone": "^0.1.0", 24 | "guacamole-lite": "^0.6.3", 25 | "http": "0.0.0", 26 | "js-yaml": "^3.13.1", 27 | "nunjucks": "^3.2.1", 28 | "request": "^2.88.2", 29 | "rmdir": "^1.2.0", 30 | "socket.io": "^2.3.0", 31 | "systeminformation": "^4.23.1", 32 | "tar-fs": "^2.0.0", 33 | "util": "^0.12.2", 34 | "uuid": "^7.0.2", 35 | "xrandr-parse": "^1.0.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /pre_install: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | # Update Docker 4 | sudo apt-get update 5 | sudo apt-get install -y --only-upgrade docker-ce 6 | 7 | # Set experiemental features on 8 | mkdir -p ~/.docker/ 9 | echo '{"experimental": "enabled"}' > ~/.docker/config.json 10 | 11 | # Register the Qemu binaries 12 | docker run --rm --privileged multiarch/qemu-user-static:register 13 | -------------------------------------------------------------------------------- /public/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2017 Blackrock Digital LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | Taisun.io license below: 16 | 17 | Do whatever the hell you want with this code. The hive mind will never be stopped 18 | by the copyright system. -------------------------------------------------------------------------------- /public/css/sb-admin.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin v4.0.0-beta (https://startbootstrap.com/template-overviews/sb-admin) 3 | * Copyright 2013-2017 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin/blob/master/LICENSE) 5 | */body{background:#343a40}body.fixed-nav{padding-top:54px}@media (min-width:992px){body.fixed-nav{padding-top:56px}}.scroll-to-top{position:fixed;right:15px;bottom:3px;display:none;width:50px;height:50px;text-align:center;color:#fff;background:rgba(52,58,64,.5);line-height:45px}.scroll-to-top:focus,.scroll-to-top:hover{color:#fff}.scroll-to-top:hover{background:#343a40}.scroll-to-top i{font-weight:800}.smaller{font-size:.7rem}.o-hidden{overflow:hidden!important}.z-0{z-index:0}.z-1{z-index:1}.card-body-icon{position:absolute;z-index:0;top:-25px;right:-25px;font-size:5rem;-webkit-transform:rotate(15deg);-ms-transform:rotate(15deg);transform:rotate(15deg)}@media (min-width:576px){.card-columns{column-count:1}}@media (min-width:768px){.card-columns{column-count:2}}@media (min-width:1200px){.card-columns{column-count:2}}#mainNav .navbar-collapse{overflow:auto;max-height:75vh}#mainNav .navbar-collapse .navbar-nav .nav-item .nav-link{cursor:pointer}#mainNav .navbar-collapse .navbar-sidenav .nav-link-collapse:after{float:right;content:'\f107';color:#adb5bd;font-family:FontAwesome}#mainNav .navbar-collapse .navbar-sidenav .nav-link-collapse.collapsed:after{content:'\f105'}#mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level,#mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level{padding-left:0}#mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level>li>a,#mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level>li>a{display:block;padding:.5em 0;color:#868e96}#mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level>li>a:focus,#mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level>li>a:hover,#mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level>li>a:focus,#mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level>li>a:hover{text-decoration:none;color:#adb5bd}#mainNav .navbar-collapse .navbar-sidenav .sidenav-second-level>li>a{padding-left:1em}#mainNav .navbar-collapse .navbar-sidenav .sidenav-third-level>li>a{padding-left:2em}#mainNav .navbar-collapse .sidenav-toggler{display:none}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link{position:relative;min-width:45px}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link:after{float:right;width:auto;content:'\f105';color:#adb5bd;border:none;font-family:FontAwesome}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link .new-indicator{position:absolute;top:0;right:25px;font-size:1.1rem}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link .new-indicator .number{position:absolute;top:6px;left:0;width:22.625px;text-align:center;color:#fff;font-size:.5rem}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown.show>.nav-link:after{content:'\f107'}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown .dropdown-menu>.dropdown-item>.dropdown-message{overflow:hidden;max-width:none;text-overflow:ellipsis}@media (min-width:992px){#mainNav .navbar-brand{width:250px}#mainNav .navbar-collapse{overflow:visible;max-height:none}#mainNav .navbar-collapse .navbar-sidenav{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-top:56px;background:#343a40}#mainNav .navbar-collapse .navbar-sidenav>.nav-item{width:250px;padding:0}#mainNav .navbar-collapse .navbar-sidenav>.nav-item>.nav-link{padding:1em}#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-second-level,#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-third-level{padding-left:0;list-style:none;background:#343a40}#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-second-level>li,#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-third-level>li{width:250px}#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-second-level>li>a,#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-third-level>li>a{padding:1em}#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-second-level>li>a{padding-left:2em}#mainNav .navbar-collapse .navbar-sidenav>.nav-item .sidenav-third-level>li>a{padding-left:3em}#mainNav .navbar-collapse .navbar-sidenav li.active a{color:#fff;background-color:#495057}#mainNav .navbar-collapse .navbar-sidenav li.active a:focus,#mainNav .navbar-collapse .navbar-sidenav li.active a:hover{color:#fff}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link{min-width:0}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown>.nav-link:after{width:24px;text-align:center}#mainNav .navbar-collapse .navbar-nav>.nav-item.dropdown .dropdown-menu>.dropdown-item>.dropdown-message{max-width:300px}}#mainNav.fixed-top .sidenav-toggler{display:none}@media (min-width:992px){#mainNav.fixed-top .navbar-sidenav{height:calc(100vh - 112px)}#mainNav.fixed-top .sidenav-toggler{position:absolute;top:0;left:0;display:flex;overflow-x:hidden;overflow-y:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-top:calc(100vh - 56px);background-color:#212529}#mainNav.fixed-top .sidenav-toggler>.nav-item{width:250px;padding:0}#mainNav.fixed-top .sidenav-toggler>.nav-item>.nav-link{padding:1em}}body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler{overflow-x:hidden;width:55px}body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler .nav-item,body.sidenav-toggled #mainNav.fixed-top .sidenav-toggler .nav-link{width:55px!important}body.sidenav-toggled #mainNav.fixed-top #sidenavToggler i{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:FlipH}#mainNav.static-top .sidenav-toggler{display:none}@media (min-width:992px){#mainNav.static-top .navbar-sidenav{min-height:100vh}#mainNav.static-top .sidenav-toggler{display:flex}}body.sidenav-toggled #mainNav.static-top #sidenavToggler i{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:FlipH}.content-wrapper{overflow-x:hidden;background:#fff}@media (min-width:992px){.content-wrapper{margin-left:250px}}#sidenavToggler i{font-weight:800}.navbar-sidenav-tooltip.show{display:none}@media (min-width:992px){body.sidenav-toggled .content-wrapper{margin-left:55px}}body.sidenav-toggled .navbar-sidenav{overflow-x:hidden;width:55px}body.sidenav-toggled .navbar-sidenav .nav-link-text{display:none}body.sidenav-toggled .navbar-sidenav .nav-item,body.sidenav-toggled .navbar-sidenav .nav-link{width:55px!important}body.sidenav-toggled .navbar-sidenav .nav-item:after,body.sidenav-toggled .navbar-sidenav .nav-link:after{display:none}body.sidenav-toggled .navbar-sidenav-tooltip.show{display:flex} -------------------------------------------------------------------------------- /public/css/vdi.css: -------------------------------------------------------------------------------- 1 | input, textarea, .osk { 2 | max-width: 180px; 3 | } 4 | 5 | .nav-trigger { 6 | position: absolute; 7 | clip: rect(0, 0, 0, 0); 8 | } 9 | label[for="nav-trigger"] { 10 | position: fixed; 11 | left: 0; top: 50%; 12 | z-index: 2; 13 | height: 10px; 14 | width: 8px; 15 | cursor: pointer; 16 | } 17 | 18 | /* Allow user to interact outside of keyboard Modal */ 19 | .taisunosk { 20 | position: absolute; 21 | top:50px; 22 | left: 0; 23 | right: 0; 24 | bottom: auto; 25 | width: 100%; 26 | margin: 0 auto; 27 | } 28 | 29 | .taisunosk .modal-dialog { 30 | margin: 0; 31 | } 32 | 33 | 34 | 35 | /* 36 | * Licensed to the Apache Software Foundation (ASF) under one 37 | * or more contributor license agreements. See the NOTICE file 38 | * distributed with this work for additional information 39 | * regarding copyright ownership. The ASF licenses this file 40 | * to you under the Apache License, Version 2.0 (the 41 | * "License"); you may not use this file except in compliance 42 | * with the License. You may obtain a copy of the License at 43 | * 44 | * http://www.apache.org/licenses/LICENSE-2.0 45 | * 46 | * Unless required by applicable law or agreed to in writing, 47 | * software distributed under the License is distributed on an 48 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 49 | * KIND, either express or implied. See the License for the 50 | * specific language governing permissions and limitations 51 | * under the License. 52 | */ 53 | 54 | .osk { 55 | position: relative; 56 | } 57 | 58 | .guac-keyboard { 59 | display: inline-block; 60 | width: 100%; 61 | 62 | margin: 0; 63 | padding: 0; 64 | cursor: default; 65 | 66 | text-align: left; 67 | vertical-align: middle; 68 | } 69 | 70 | .guac-keyboard, 71 | .guac-keyboard * { 72 | overflow: hidden; 73 | white-space: nowrap; 74 | } 75 | 76 | .guac-keyboard .guac-keyboard-key-container { 77 | display: inline-block; 78 | margin: 0.05em; 79 | position: relative; 80 | } 81 | 82 | .guac-keyboard .guac-keyboard-key { 83 | 84 | position: absolute; 85 | left: 0; 86 | right: 0; 87 | top: 0; 88 | bottom: 0; 89 | 90 | background: #444; 91 | 92 | border: 0.125em solid #666; 93 | -moz-border-radius: 0.25em; 94 | -webkit-border-radius: 0.25em; 95 | -khtml-border-radius: 0.25em; 96 | border-radius: 0.25em; 97 | 98 | color: white; 99 | font-size: 40%; 100 | font-weight: lighter; 101 | text-align: center; 102 | white-space: pre; 103 | 104 | text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.25), 105 | 1px -1px 0 rgba(0, 0, 0, 0.25), 106 | -1px 1px 0 rgba(0, 0, 0, 0.25), 107 | -1px -1px 0 rgba(0, 0, 0, 0.25); 108 | 109 | } 110 | 111 | .guac-keyboard .guac-keyboard-key:hover { 112 | cursor: pointer; 113 | } 114 | 115 | .guac-keyboard .guac-keyboard-key.highlight { 116 | background: #666; 117 | border-color: #666; 118 | } 119 | 120 | /* Align some keys to the left */ 121 | .guac-keyboard .guac-keyboard-key-caps, 122 | .guac-keyboard .guac-keyboard-key-enter, 123 | .guac-keyboard .guac-keyboard-key-tab, 124 | .guac-keyboard .guac-keyboard-key-lalt, 125 | .guac-keyboard .guac-keyboard-key-ralt, 126 | .guac-keyboard .guac-keyboard-key-alt-gr, 127 | .guac-keyboard .guac-keyboard-key-lctrl, 128 | .guac-keyboard .guac-keyboard-key-rctrl, 129 | .guac-keyboard .guac-keyboard-key-lshift, 130 | .guac-keyboard .guac-keyboard-key-rshift { 131 | text-align: left; 132 | padding-left: 0.75em; 133 | } 134 | 135 | /* Active shift */ 136 | .guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key-rshift, 137 | .guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key-lshift, 138 | 139 | /* Active ctrl */ 140 | .guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key-rctrl, 141 | .guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key-lctrl, 142 | 143 | /* Active alt */ 144 | .guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key-ralt, 145 | .guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key-lalt, 146 | 147 | /* Active alt-gr */ 148 | .guac-keyboard.guac-keyboard-modifier-alt-gr .guac-keyboard-key-alt-gr, 149 | 150 | /* Active caps */ 151 | .guac-keyboard.guac-keyboard-modifier-caps .guac-keyboard-key-caps, 152 | 153 | /* Active super */ 154 | .guac-keyboard.guac-keyboard-modifier-super .guac-keyboard-key-super { 155 | background: #882; 156 | border-color: #DD4; 157 | } 158 | 159 | .guac-keyboard .guac-keyboard-key.guac-keyboard-pressed { 160 | background: #822; 161 | border-color: #D44; 162 | } 163 | 164 | .guac-keyboard .guac-keyboard-group { 165 | line-height: 0; 166 | } 167 | 168 | .guac-keyboard .guac-keyboard-group.guac-keyboard-alpha, 169 | .guac-keyboard .guac-keyboard-group.guac-keyboard-movement { 170 | display: inline-block; 171 | text-align: center; 172 | vertical-align: top; 173 | } 174 | 175 | .guac-keyboard .guac-keyboard-group.guac-keyboard-main { 176 | 177 | /* IE10 */ 178 | display: -ms-flexbox; 179 | -ms-flex-align: stretch; 180 | -ms-flex-direction: row; 181 | 182 | /* Ancient Mozilla */ 183 | display: -moz-box; 184 | -moz-box-align: stretch; 185 | -moz-box-orient: horizontal; 186 | 187 | /* Ancient WebKit */ 188 | display: -webkit-box; 189 | -webkit-box-align: stretch; 190 | -webkit-box-orient: horizontal; 191 | 192 | /* Old WebKit */ 193 | display: -webkit-flex; 194 | -webkit-align-items: stretch; 195 | -webkit-flex-direction: row; 196 | 197 | /* W3C */ 198 | display: flex; 199 | align-items: stretch; 200 | flex-direction: row; 201 | 202 | } 203 | 204 | .guac-keyboard .guac-keyboard-group.guac-keyboard-movement { 205 | -ms-flex: 1 1 auto; 206 | -moz-box-flex: 1; 207 | -webkit-box-flex: 1; 208 | -webkit-flex: 1 1 auto; 209 | flex: 1 1 auto; 210 | } 211 | 212 | .guac-keyboard .guac-keyboard-gap { 213 | display: inline-block; 214 | } 215 | 216 | /* Hide keycaps requiring modifiers which are NOT currently active. */ 217 | .guac-keyboard:not(.guac-keyboard-modifier-caps) 218 | .guac-keyboard-cap.guac-keyboard-requires-caps, 219 | 220 | .guac-keyboard:not(.guac-keyboard-modifier-shift) 221 | .guac-keyboard-cap.guac-keyboard-requires-shift, 222 | 223 | .guac-keyboard:not(.guac-keyboard-modifier-alt-gr) 224 | .guac-keyboard-cap.guac-keyboard-requires-alt-gr, 225 | 226 | /* Hide keycaps NOT requiring modifiers which ARE currently active, where that 227 | modifier is used to determine which cap is displayed for the current key. */ 228 | .guac-keyboard.guac-keyboard-modifier-shift 229 | .guac-keyboard-key.guac-keyboard-uses-shift 230 | .guac-keyboard-cap:not(.guac-keyboard-requires-shift), 231 | 232 | .guac-keyboard.guac-keyboard-modifier-caps 233 | .guac-keyboard-key.guac-keyboard-uses-caps 234 | .guac-keyboard-cap:not(.guac-keyboard-requires-caps), 235 | 236 | .guac-keyboard.guac-keyboard-modifier-alt-gr 237 | .guac-keyboard-key.guac-keyboard-uses-alt-gr 238 | .guac-keyboard-cap:not(.guac-keyboard-requires-alt-gr) { 239 | 240 | display: none; 241 | 242 | } 243 | 244 | /* Fade out keys which do not use AltGr if AltGr is active */ 245 | .guac-keyboard.guac-keyboard-modifier-alt-gr 246 | .guac-keyboard-key:not(.guac-keyboard-uses-alt-gr):not(.guac-keyboard-key-alt-gr) { 247 | opacity: 0.5; 248 | } 249 | -------------------------------------------------------------------------------- /public/favicon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-36x36.png -------------------------------------------------------------------------------- /public/favicon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-48x48.png -------------------------------------------------------------------------------- /public/favicon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-72x72.png -------------------------------------------------------------------------------- /public/favicon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/android-icon-96x96.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/apple-icon.png -------------------------------------------------------------------------------- /public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/favicon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /public/favicon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taisun-Docker/taisun/dd74a034403d558153462db4b317f2924e18168f/public/favicon/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Taisun 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 112 | 113 |
114 |
115 | 116 | 117 | 118 |
119 |
120 | 121 |
122 | 123 | 124 | 125 | 126 | 127 | 128 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /public/js/desktop.js: -------------------------------------------------------------------------------- 1 | // Desktop Client side custom javascript 2 | var host = window.location.hostname; 3 | var port = window.location.port; 4 | var path = window.location.pathname; 5 | var protocol = window.location.protocol; 6 | if (protocol == 'https:'){ 7 | var wsprotocol = 'wss:'; 8 | } 9 | else{ 10 | var wsprotocol = 'ws:' 11 | } 12 | // Hide Cursor 13 | document.body.style.cursor = 'none'; 14 | // Initiate a websocket connection to the server 15 | var socket = io.connect(protocol + '//' + host + ':' + port, { 16 | }); 17 | // Send the client window resolution to resize the desktop 18 | socket.emit('resizedesktop', $(window).width(), $(window).height(),path,'0'); 19 | socket.emit('getres', path); 20 | socket.on('sendres', function(resolutions){ 21 | // Sort resolutions by width so our future logic works 22 | var modes = resolutions.default.modes.sort(function(a, b){return b.width - a.width || b.height - a.height}); 23 | for (var i = 0; i < modes.length; i++) { 24 | $('#resolutions').append('