dashboard.js 7.3 KB

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