site_actions.js 6.5 KB

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