dashboard.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. const { readFileSync, writeFileSync, appendFileSync, readdirSync } = require('fs');
  2. const { execSync } = require("child_process");
  3. const { siteCard } = require('../components/siteCard');
  4. const { containerExec } = require('../functions/system')
  5. exports.Dashboard = async function (req, res) {
  6. let caddy = 'd-none';
  7. if (process.env.Proxy_Manager == 'enabled') {
  8. caddy = '';
  9. }
  10. // Render the home page
  11. res.render("pages/dashboard", {
  12. name: req.session.user,
  13. role: req.session.role,
  14. avatar: req.session.avatar,
  15. isLoggedIn: true,
  16. site_list: req.app.locals.site_list,
  17. caddy: caddy
  18. });
  19. }
  20. exports.AddSite = async function (req, res) {
  21. let { domain, type, host, port } = req.body;
  22. if ( domain && type && host && port) {
  23. let { domain, type, host, port } = req.body;
  24. // build caddyfile
  25. let caddyfile = `${domain} {`
  26. caddyfile += `\n\t${type} ${host}:${port}`
  27. caddyfile += `\n\theader {`
  28. caddyfile += `\n\t\tStrict-Transport-Security "max-age=31536000; includeSubDomains; preload"`
  29. caddyfile += `\n\t}`
  30. caddyfile += `\n}`
  31. // save caddyfile
  32. writeFileSync(`./caddyfiles/sites/${domain}.Caddyfile`, caddyfile, function (err) { console.log(err) });
  33. // format caddyfile
  34. let format = {
  35. container: 'DweebProxy',
  36. command: `caddy fmt --overwrite /etc/caddy/sites/${domain}.Caddyfile`
  37. }
  38. await containerExec(format, function(err, data) {
  39. if (err) {
  40. console.error(err);
  41. return;
  42. }
  43. console.log(`Formatted ${domain}.Caddyfile`);
  44. });
  45. ///////////////// convert caddyfile to json
  46. let convert = {
  47. container: 'DweebProxy',
  48. command: `caddy adapt --config /etc/caddy/sites/${domain}.Caddyfile --pretty >> /etc/caddy/sites/${domain}.json`
  49. }
  50. await containerExec(convert, function(err, data) {
  51. if (err) {
  52. console.error(err);
  53. return;
  54. }
  55. console.log(`Converted ${domain}.Caddyfile to JSON`);
  56. });
  57. ////////////// reload caddy
  58. let reload = {
  59. container: 'DweebProxy',
  60. command: `caddy reload --config /etc/caddy/Caddyfile`
  61. }
  62. await containerExec(reload, function(err, data) {
  63. if (err) {
  64. console.error(err);
  65. return;
  66. }
  67. console.log(`Reloaded Caddy Config`);
  68. });
  69. let site = siteCard(type, domain, host, port, 0);
  70. req.app.locals.site_list += site;
  71. res.redirect("/");
  72. } else {
  73. // Redirect
  74. console.log('missing info')
  75. res.redirect("/");
  76. }
  77. }
  78. exports.RemoveSite = async function (req, res) {
  79. for (const [key, value] of Object.entries(req.body)) {
  80. execSync(`rm ./caddyfiles/sites/${value}.Caddyfile`, (err, stdout, stderr) => {
  81. if (err) { console.error(`error: ${err.message}`); return; }
  82. if (stderr) { console.error(`stderr: ${stderr}`); return; }
  83. console.log(`removed ${value}.Caddyfile`);
  84. });
  85. }
  86. let reload = {
  87. container: 'DweebProxy',
  88. command: `caddy reload --config /etc/caddy/Caddyfile`
  89. }
  90. await containerExec(reload);
  91. console.log('Removed Site(s)')
  92. res.redirect("/refreshsites");
  93. }
  94. exports.RefreshSites = async function (req, res) {
  95. let domain, type, host, port;
  96. let id = 1;
  97. // Clear site_list.ejs
  98. req.app.locals.site_list = "";
  99. // check if ./caddyfiles/sites contains any .json files, then delete them
  100. try {
  101. let files = readdirSync('./caddyfiles/sites/');
  102. files.forEach(file => {
  103. if (file.includes(".json")) {
  104. execSync(`rm ./caddyfiles/sites/${file}`, (err, stdout, stderr) => {
  105. if (err) { console.error(`error: ${err.message}`); return; }
  106. if (stderr) { console.error(`stderr: ${stderr}`); return; }
  107. console.log(`removed ${file}`);
  108. });
  109. }
  110. });
  111. } catch (error) { console.log("No .json files to delete") }
  112. // get list of Caddyfiles
  113. let sites = readdirSync('./caddyfiles/sites/');
  114. sites.forEach(site_name => {
  115. // convert the caddyfile of each site to json
  116. let convert = {
  117. container: 'DweebProxy',
  118. command: `caddy adapt --config ./caddyfiles/sites/${site_name} --pretty >> ./caddyfiles/sites/${site_name}.json`
  119. }
  120. containerExec(convert);
  121. try {
  122. // read the json file
  123. let site_file = readFileSync(`./caddyfiles/sites/${site_name}.json`, 'utf8');
  124. // fix whitespace and parse the json file
  125. site_file = site_file.replace(/ /g, " ");
  126. site_file = JSON.parse(site_file);
  127. } catch (error) { console.log("No .json file to read") }
  128. // get the domain, type, host, and port from the json file
  129. try { domain = site_file.apps.http.servers.srv0.routes[0].match[0].host[0] } catch (error) { console.log("No Domain") }
  130. try { type = site_file.apps.http.servers.srv0.routes[0].handle[0].routes[0].handle[1].handler } catch (error) { console.log("No Type") }
  131. try { host = site_file.apps.http.servers.srv0.routes[0].handle[0].routes[0].handle[1].upstreams[0].dial.split(":")[0] } catch (error) { console.log("Not Localhost") }
  132. try { port = site_file.apps.http.servers.srv0.routes[0].handle[0].routes[0].handle[1].upstreams[0].dial.split(":")[1] } catch (error) { console.log("No Port") }
  133. // build the site card
  134. let site = siteCard(type, domain, host, port, id);
  135. // append the site card to site_list
  136. req.app.locals.site_list += site;
  137. id++;
  138. });
  139. res.redirect("/");
  140. }
  141. exports.DisableSite = async function (req, res) {
  142. console.log(req.body)
  143. console.log('Disable Site')
  144. res.redirect("/");
  145. }
  146. exports.EnableSite = async function (req, res) {
  147. console.log(req.body)
  148. console.log('Enable Site')
  149. res.redirect("/");
  150. }