You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dedaemon.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #!/usr/bin/env node
  2. var syscheck = require("./js/syscheck");
  3. var parseConf = require("./js/parse-conf");
  4. var async = require("./js/async");
  5. var udev = require("./udev");
  6. var execSync = require("child_process").execSync
  7. var fs = require("fs");
  8. var modules = {
  9. display: require("./modules/display"),
  10. input: require("./modules/input"),
  11. wallpaper: require("./modules/wallpaper"),
  12. process: require("./modules/process"),
  13. };
  14. if (!process.argv[2]) {
  15. console.error("Usage:", process.argv[1], "<config file>");
  16. console.error(" ", process.argv[1], "list -- List display and input devices");
  17. console.error(" ", process.argv[1], "reload -- Reload the running dedaemon instance");
  18. console.error(" ", process.argv[1], "stop -- Stop all running dedaemon instances");
  19. process.exit(1);
  20. }
  21. var config;
  22. var fatalError = false;
  23. function createLogger(name) {
  24. function log(pre, msg) {
  25. var str = pre+msg.join(" ");
  26. console.error(str);
  27. try {
  28. fs.appendFileSync(config.general.log, str+"\n");
  29. } catch (err) {
  30. if (!fatalError) {
  31. fatalError = true;
  32. console.error("FATAL: Failed to write to log file!!");
  33. console.error(err.toString());
  34. stopAll(() => {
  35. process.exit(1);
  36. });
  37. }
  38. };
  39. }
  40. return {
  41. info: (...msg) => log(name+": INFO: ", msg),
  42. warn: (...msg) => log(name+": WARNING: ", msg),
  43. error: (...msg) => log(name+": ERROR: ", msg),
  44. }
  45. }
  46. var logger = createLogger("dedaemon");
  47. function startAll() {
  48. try {
  49. fs.renameSync(config.general.log, config.general.log+".old");
  50. } catch (err) {}
  51. fs.writeFileSync(config.general.log, "");
  52. Object.keys(modules).forEach(i => {
  53. var mod = modules[i];
  54. var conf = config[i];
  55. if (conf instanceof Array && conf.length === 0)
  56. return;
  57. mod.start(conf, createLogger(i), modules);
  58. });
  59. }
  60. function stopAll(cb) {
  61. var keys = Object.keys(modules);
  62. var next = async(keys.length, cb);
  63. keys.forEach(i => modules[i].stop(next));
  64. }
  65. function onTerm() {
  66. logger.info("Exiting...");
  67. stopAll(() => {
  68. udev.exit();
  69. process.exit(1)
  70. });
  71. }
  72. function reload() {
  73. try {
  74. config = parseConf(process.argv[2]);
  75. } catch (err) {
  76. logger.error(
  77. "Tried to reload, but parsing the config file failed:",
  78. err.toString());
  79. return;
  80. }
  81. logger.info("Reloading.");
  82. stopAll(() => {
  83. startAll();
  84. });
  85. }
  86. function loglol(sig) {
  87. return function() {
  88. logger.info("Received signal", sig);
  89. }
  90. }
  91. function killRunningDaemon(signal, once) {
  92. var cmd =
  93. "pgrep -a node | "+
  94. "grep dedaemon | "+
  95. "grep -ve stop -e reload | "+
  96. "cut -d' ' -f1";
  97. var out = execSync(cmd)
  98. .toString();
  99. var lines = out.split("\n").filter(l => l !== "");
  100. if (lines.length > 1 && once) {
  101. console.error("There are multiple dedaemon processes running.");
  102. process.exit(1);
  103. }
  104. if (lines.length === 0) {
  105. console.error("No dedaemon process is running.");
  106. process.exit(1);
  107. }
  108. lines.forEach(line => {
  109. execSync("kill -s "+signal+" "+line);
  110. console.error("Sent", "SIG"+signal, "to process", line);
  111. });
  112. process.exit(0);
  113. }
  114. if (process.argv[2] === "list") {
  115. console.error("display:");
  116. modules.display.list(() => {
  117. console.error("input:");
  118. modules.input.list(() => {
  119. udev.exit();
  120. process.exit(0);
  121. });
  122. });
  123. } else if (process.argv[2] === "reload") {
  124. killRunningDaemon("USR1", true);
  125. } else if (process.argv[2] === "stop") {
  126. killRunningDaemon("TERM");
  127. } else {
  128. var config = parseConf(process.argv[2]);
  129. syscheck(ok => {
  130. if (ok)
  131. setTimeout(startAll, 1000);
  132. else
  133. console.error("Missing binaries, exiting.");
  134. });
  135. process.on("SIGTERM", onTerm);
  136. process.on("SIGINT", onTerm);
  137. process.on("SIGUSR1", reload);
  138. }