-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #43 from Lissy93/feature_write-config-to-file-system
[FEATURE] Adds ability for config file to be written to directly from the UI
- Loading branch information
Showing
39 changed files
with
836 additions
and
186 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,84 +1,92 @@ | ||
/* eslint-disable no-console */ | ||
/* This is a simple Node.js http server, that is used to serve up the contents of ./dist */ | ||
const connect = require('connect'); | ||
const serveStatic = require('serve-static'); | ||
/** | ||
* Note: The app must first be built (yarn build) before this script is run | ||
* This is the main entry point for the application, a simple server that | ||
* runs some checks, and then serves up the app from the ./dist directory | ||
* Also includes some routes for status checks/ ping and config saving | ||
* */ | ||
|
||
/* Include required node dependencies */ | ||
const serveStatic = require('serve-static'); | ||
const connect = require('connect'); | ||
const util = require('util'); | ||
const dns = require('dns'); | ||
const os = require('os'); | ||
const bodyParser = require('body-parser'); | ||
|
||
require('./src/utils/ConfigValidator'); | ||
|
||
const pingUrl = require('./services/ping'); | ||
/* Include helper functions and route handlers */ | ||
const pingUrl = require('./services/ping'); // Used by the status check feature, to ping services | ||
const saveConfig = require('./services/save-config'); // Saves users new conf.yml to file-system | ||
const printMessage = require('./services/print-message'); // Function to print welcome msg on start | ||
const rebuild = require('./services/rebuild-app'); // A script to programmatically trigger a build | ||
require('./src/utils/ConfigValidator'); // Include and kicks off the config file validation script | ||
|
||
/* Checks if app is running within a container, from env var */ | ||
const isDocker = !!process.env.IS_DOCKER; | ||
|
||
/* Checks env var for port. If undefined, will use Port 80 for Docker, or 4000 for metal */ | ||
const port = process.env.PORT || (isDocker ? 80 : 4000); | ||
|
||
/* Attempts to get the users local IP, used as part of welcome message */ | ||
const getLocalIp = () => { | ||
const dnsLookup = util.promisify(dns.lookup); | ||
return dnsLookup(os.hostname()); | ||
}; | ||
|
||
const overComplicatedMessage = (ip) => { | ||
let msg = ''; | ||
const chars = { | ||
RESET: '\x1b[0m', | ||
CYAN: '\x1b[36m', | ||
GREEN: '\x1b[32m', | ||
BLUE: '\x1b[34m', | ||
BRIGHT: '\x1b[1m', | ||
BR: '\n', | ||
}; | ||
const stars = (count) => new Array(count).fill('*').join(''); | ||
const line = (count) => new Array(count).fill('━').join(''); | ||
const blanks = (count) => new Array(count).fill(' ').join(''); | ||
if (isDocker) { | ||
const containerId = process.env.HOSTNAME || undefined; | ||
msg = `${chars.BLUE}${stars(91)}${chars.BR}${chars.RESET}` | ||
+ `${chars.CYAN}Welcome to Dashy! 🚀${chars.RESET}${chars.BR}` | ||
+ `${chars.GREEN}Your new dashboard is now up and running ` | ||
+ `${containerId ? `in container ID ${containerId}` : 'with Docker'}${chars.BR}` | ||
+ `${chars.GREEN}After updating your config file, run ` | ||
+ `'${chars.BRIGHT}docker exec -it ${containerId || '[container-id]'} yarn build` | ||
+ `${chars.RESET}${chars.GREEN}' to rebuild${chars.BR}` | ||
+ `${chars.BLUE}${stars(91)}${chars.BR}${chars.RESET}`; | ||
} else { | ||
msg = `${chars.GREEN}┏${line(75)}┓${chars.BR}` | ||
+ `┃ ${chars.CYAN}Welcome to Dashy! 🚀${blanks(55)}${chars.GREEN}┃${chars.BR}` | ||
+ `┃ ${chars.CYAN}Your new dashboard is now up and running at ${chars.BRIGHT}` | ||
+ `http://${ip}:${port}${chars.RESET}${blanks(18 - ip.length)}${chars.GREEN}┃${chars.BR}` | ||
+ `┃ ${chars.CYAN}After updating your config file, run '${chars.BRIGHT}yarn build` | ||
+ `${chars.RESET}${chars.CYAN}' to rebuild the app${blanks(6)}${chars.GREEN}┃${chars.BR}` | ||
+ `┗${line(75)}┛${chars.BR}${chars.BR}`; | ||
} | ||
return msg; | ||
}; | ||
|
||
/* eslint no-console: 0 */ | ||
/* Gets the users local IP and port, then calls to print welcome message */ | ||
const printWelcomeMessage = () => { | ||
getLocalIp().then(({ address }) => { | ||
const ip = address || 'localhost'; | ||
console.log(overComplicatedMessage(ip)); | ||
console.log(printMessage(ip, port, isDocker)); // eslint-disable-line no-console | ||
}); | ||
}; | ||
|
||
/* Just console.warns an error */ | ||
const printWarning = (msg, error) => { | ||
console.warn(`\x1b[103m\x1b[34m${msg}\x1b[0m\n`, error || ''); // eslint-disable-line no-console | ||
}; | ||
|
||
/* A middleware function for Connect, that filters requests based on method type */ | ||
const method = (m, mw) => (req, res, next) => (req.method === m ? mw(req, res, next) : next()); | ||
|
||
try { | ||
connect() | ||
.use(serveStatic(`${__dirname}/dist`)) /* Serves up the main built application to the root */ | ||
.use(serveStatic(`${__dirname}/public`, { index: 'default.html' })) /* During build, a custom page will be served */ | ||
.use('/ping', (req, res) => { /* This root returns the status of a given service - used for uptime monitoring */ | ||
.use(bodyParser.json()) | ||
// Serves up the main built application to the root | ||
.use(serveStatic(`${__dirname}/dist`)) | ||
// During build, a custom page will be served before the app is available | ||
.use(serveStatic(`${__dirname}/public`, { index: 'default.html' })) | ||
// This root returns the status of a given service - used for uptime monitoring | ||
.use('/ping', (req, res) => { | ||
try { | ||
pingUrl(req.url, async (results) => { | ||
await res.end(results); | ||
}); | ||
// next(); | ||
} catch (e) { console.warn(`Error running ping check for ${req.url}\n`, e); } | ||
} catch (e) { | ||
printWarning(`Error running ping check for ${req.url}\n`, e); | ||
} | ||
}) | ||
// POST Endpoint used to save config, by writing conf.yml to disk | ||
.use('/config-manager/save', method('POST', (req, res) => { | ||
try { | ||
saveConfig(req.body, (results) => { | ||
res.end(results); | ||
}); | ||
} catch (e) { | ||
res.end(JSON.stringify({ success: false, message: e })); | ||
} | ||
})) | ||
// GET endpoint to trigger a build, and respond with success status and output | ||
.use('/config-manager/rebuild', (req, res) => { | ||
rebuild().then((response) => { | ||
res.end(JSON.stringify(response)); | ||
}).catch((response) => { | ||
res.end(JSON.stringify(response)); | ||
}); | ||
}) | ||
// Finally, initialize the server then print welcome message | ||
.listen(port, () => { | ||
try { printWelcomeMessage(); } catch (e) { console.log('Dashy is Starting...'); } | ||
try { printWelcomeMessage(); } catch (e) { printWarning('Dashy is Starting...'); } | ||
}); | ||
} catch (error) { | ||
console.log('Sorry, an error occurred ', error); | ||
printWarning('Sorry, a critical error occurred ', error); | ||
} |
Oops, something went wrong.
6e0449f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Successfully deployed to the following URLs: