diff --git a/.gitignore b/.gitignore index 89a01af..5fb2297 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .c9 version +public/stackstemp/*.yml diff --git a/app.js b/app.js index 23ba740..8dfeaed 100644 --- a/app.js +++ b/app.js @@ -22,6 +22,7 @@ var dockerops = dockops.createDocker(); var images = new dockops.Images(dockerops); var xparse = require('xrandr-parse'); var fs = require('fs'); +var path = require('path'); let dockerHubAPI = require('docker-hub-api'); dockerHubAPI.setCacheOptions({enabled: false}); // Sleep Helper @@ -219,8 +220,7 @@ io.on('connection', function(socket){ }); // Get Taisun.io stacks running locally socket.on('getstacks', function(){ - // Just send an empty response for now - io.sockets.in(socket.id).emit('localstacks','no'); + containerinfo('localstacks'); }); // Get remote list of stack definition files from stacks.taisun.io socket.on('browsestacks', function(page){ @@ -244,17 +244,32 @@ io.on('connection', function(socket){ io.sockets.in(socket.id).emit('stackurlresults', [name,description,form,url]); }); }); - // Parse Taisun Stacks Yaml and send form to client + // Parse Yaml for single container and send to user socket.on('sendimagename', function(imagename){ - request.get({url:'http://localhost/public/stackstemp/basetemplate.yml'},function(error, response, body){ + request.get({url:'http://localhost/public/taisuntemplates/basetemplate.yml'},function(error, response, body){ var yml = yaml.safeLoad(body); var name = yml.name; var description = yml.description; var form = yml.form; form.push({type:'input',format:'text',label:'image',FormName:'Image',placeholder:'',value:imagename}); - io.sockets.in(socket.id).emit('stackurlresults', [name,description,form,'http://localhost/public/stackstemp/basetemplate.yml']); + io.sockets.in(socket.id).emit('stackurlresults', [name,description,form,'http://localhost/public/taisuntemplates/basetemplate.yml']); }); }); + // Get custom Yaml from user and create a temp file for using the standard workflow + socket.on('sendyaml', function(code){ + var guid = uuidv4().substring(0,12); + var file = path.join(__dirname, 'public/stackstemp/', guid + '.yml'); + fs.writeFile(file, code, function(err) { + if(err) { + return console.log(err); + } + var yml = yaml.safeLoad(code); + var name = yml.name; + var description = yml.description; + var form = yml.form; + io.sockets.in(socket.id).emit('stackurlresults', [name,description,form,'http://localhost/public/stackstemp/' + guid + '.yml']); + }); + }); // When user submits stack data launch the stack socket.on('launchstack', function(userinput){ var url = userinput.stackurl; diff --git a/public/LICENSE b/public/LICENSE index dd837fc..80465a0 100644 --- a/public/LICENSE +++ b/public/LICENSE @@ -12,10 +12,7 @@ furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +Taisun.io license below: + +Do whatever the hell you want with this code. The hive mind will never be stopped +by the copyright system. \ No newline at end of file diff --git a/public/css/sb-admin.css b/public/css/sb-admin.css deleted file mode 100644 index b4d1fad..0000000 --- a/public/css/sb-admin.css +++ /dev/null @@ -1,264 +0,0 @@ -/*! - * Start Bootstrap - SB Admin v4.0.0-beta (https://startbootstrap.com/template-overviews/sb-admin) - * Copyright 2013-2017 Start Bootstrap - * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin/blob/master/LICENSE) - */ -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: white; - background: rgba(52, 58, 64, 0.5); - line-height: 45px; } - .scroll-to-top:focus, .scroll-to-top:hover { - color: white; } - .scroll-to-top:hover { - background: #343a40; } - .scroll-to-top i { - font-weight: 800; } - -.smaller { - font-size: 0.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: 0.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: white; - font-size: 0.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: white; - background-color: #495057; } - #mainNav .navbar-collapse .navbar-sidenav li.active a:focus, #mainNav .navbar-collapse .navbar-sidenav li.active a:hover { - color: white; } - #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: white; } - @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; } diff --git a/public/gulpfile.js b/public/gulpfile.js deleted file mode 100644 index 12101e8..0000000 --- a/public/gulpfile.js +++ /dev/null @@ -1,124 +0,0 @@ -var gulp = require('gulp'); -var sass = require('gulp-sass'); -var browserSync = require('browser-sync').create(); -var header = require('gulp-header'); -var cleanCSS = require('gulp-clean-css'); -var rename = require("gulp-rename"); -var uglify = require('gulp-uglify'); -var pkg = require('./package.json'); - -// Set the banner content -var banner = ['/*!\n', - ' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\n', - ' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\n', - ' * Licensed under <%= pkg.license %> (https://github.com/BlackrockDigital/<%= pkg.name %>/blob/master/LICENSE)\n', - ' */\n', - '' -].join(''); - -// Compiles SCSS files from /scss into /css -gulp.task('sass', function() { - return gulp.src('scss/sb-admin.scss') - .pipe(sass()) - .pipe(header(banner, { - pkg: pkg - })) - .pipe(gulp.dest('css')) - .pipe(browserSync.reload({ - stream: true - })) -}); - -// Minify compiled CSS -gulp.task('minify-css', ['sass'], function() { - return gulp.src('css/sb-admin.css') - .pipe(cleanCSS({ - compatibility: 'ie8' - })) - .pipe(rename({ - suffix: '.min' - })) - .pipe(gulp.dest('css')) - .pipe(browserSync.reload({ - stream: true - })) -}); - -// Minify custom JS -gulp.task('minify-js', function() { - return gulp.src('js/sb-admin.js') - .pipe(uglify()) - .pipe(header(banner, { - pkg: pkg - })) - .pipe(rename({ - suffix: '.min' - })) - .pipe(gulp.dest('js')) - .pipe(browserSync.reload({ - stream: true - })) -}); - -// Copy vendor files from /node_modules into /vendor -// NOTE: requires `npm install` before running! -gulp.task('copy', function() { - gulp.src([ - 'node_modules/bootstrap/dist/**/*', - '!**/npm.js', - '!**/bootstrap-theme.*', - '!**/*.map' - ]) - .pipe(gulp.dest('vendor/bootstrap')) - - gulp.src(['node_modules/jquery/dist/jquery.js', 'node_modules/jquery/dist/jquery.min.js']) - .pipe(gulp.dest('vendor/jquery')) - - gulp.src(['node_modules/popper.js/dist/umd/popper.js', 'node_modules/popper.js/dist/umd/popper.min.js']) - .pipe(gulp.dest('vendor/popper')) - - gulp.src(['node_modules/jquery.easing/*.js']) - .pipe(gulp.dest('vendor/jquery-easing')) - - gulp.src([ - 'node_modules/font-awesome/**', - '!node_modules/font-awesome/**/*.map', - '!node_modules/font-awesome/.npmignore', - '!node_modules/font-awesome/*.txt', - '!node_modules/font-awesome/*.md', - '!node_modules/font-awesome/*.json' - ]) - .pipe(gulp.dest('vendor/font-awesome')) - - gulp.src(['node_modules/chart.js/dist/*.js']) - .pipe(gulp.dest('vendor/chart.js')) - - gulp.src([ - 'node_modules/datatables.net/js/*.js', - 'node_modules/datatables.net-bs4/js/*.js', - 'node_modules/datatables.net-bs4/css/*.css' - ]) - .pipe(gulp.dest('vendor/datatables/')) -}) - -// Default task -gulp.task('default', ['sass', 'minify-css', 'minify-js', 'copy']); - -// Configure the browserSync task -gulp.task('browserSync', function() { - browserSync.init({ - server: { - baseDir: '' - }, - }) -}) - -// Dev task with browserSync -gulp.task('dev', ['browserSync', 'sass', 'minify-css', 'minify-js'], function() { - gulp.watch('scss/*.scss', ['sass']); - gulp.watch('css/*.css', ['minify-css']); - gulp.watch('js/*.js', ['minify-js']); - // Reloads the browser whenever HTML or JS files change - gulp.watch('*.html', browserSync.reload); - gulp.watch('js/**/*.js', browserSync.reload); -}); diff --git a/public/img/debian.png b/public/img/debian.png deleted file mode 100644 index 9cf72b1..0000000 Binary files a/public/img/debian.png and /dev/null differ diff --git a/public/index.html b/public/index.html index f491a2b..034aaf8 100644 --- a/public/index.html +++ b/public/index.html @@ -10,7 +10,7 @@ - + @@ -144,6 +144,7 @@
Name | URL | Status | Created |
---|
Please see documentation here for writing Stack Templates
\ + \ + '); + // Ace editor + var editor = ace.edit("editor"); + editor.setTheme("ace/theme/chrome"); + editor.session.setMode("ace/mode/yaml"); + editor.session.setOptions({ + tabSize: 2 + }); + $('#modalfooter').show(); + $('#modalfooter').append('\ + \ + \ + '); +} +// Send custom yaml to application +function uploadyaml(){ + var editor = ace.edit("editor"); + var code = editor.getValue(); + modalpurge() + $('#modalloading').show(); + socket.emit('sendyaml',code); +} + //// Render the remote access pages //// function renderremote(){ $('.nav-item').removeClass('active'); @@ -1163,7 +1230,7 @@ function renderremotestart() {