site_actions.js 6.8 KB

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