system.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. const _ = require('lodash')
  2. const Promise = require('bluebird')
  3. const getos = Promise.promisify(require('getos'))
  4. const os = require('os')
  5. const filesize = require('filesize')
  6. const path = require('path')
  7. const fs = require('fs-extra')
  8. const moment = require('moment')
  9. const graphHelper = require('../../helpers/graph')
  10. const Docker = require('dockerode')
  11. /* global WIKI */
  12. const dbTypes = {
  13. mysql: 'MySQL',
  14. mariadb: 'MariaDB',
  15. postgres: 'PostgreSQL',
  16. sqlite: 'SQLite',
  17. mssql: 'MS SQL Server'
  18. }
  19. module.exports = {
  20. Query: {
  21. async system () { return {} }
  22. },
  23. Mutation: {
  24. async system () { return {} }
  25. },
  26. SystemQuery: {
  27. flags () {
  28. return _.transform(WIKI.config.flags, (result, value, key) => {
  29. result.push({ key, value })
  30. }, [])
  31. },
  32. async info() { return {} }
  33. },
  34. SystemMutation: {
  35. async updateFlags (obj, args, context) {
  36. WIKI.config.flags = _.transform(args.flags, (result, row) => {
  37. _.set(result, row.key, row.value)
  38. }, {})
  39. await WIKI.configSvc.applyFlags()
  40. await WIKI.configSvc.saveToDb(['flags'])
  41. return {
  42. responseResult: graphHelper.generateSuccess('System Flags applied successfully')
  43. }
  44. },
  45. async resetTelemetryClientId (obj, args, context) {
  46. try {
  47. WIKI.telemetry.generateClientId()
  48. await WIKI.configSvc.saveToDb(['telemetry'])
  49. return {
  50. responseResult: graphHelper.generateSuccess('Telemetry state updated successfully')
  51. }
  52. } catch (err) {
  53. return graphHelper.generateError(err)
  54. }
  55. },
  56. async setTelemetry (obj, args, context) {
  57. try {
  58. _.set(WIKI.config, 'telemetry.isEnabled', args.enabled)
  59. WIKI.telemetry.enabled = args.enabled
  60. await WIKI.configSvc.saveToDb(['telemetry'])
  61. return {
  62. responseResult: graphHelper.generateSuccess('Telemetry Client ID has been reset successfully')
  63. }
  64. } catch (err) {
  65. return graphHelper.generateError(err)
  66. }
  67. },
  68. async performUpgrade (obj, args, context) {
  69. try {
  70. const dockerEngine = new Docker({ socketPath: '/var/run/docker.sock' })
  71. await dockerEngine.run('containrrr/watchtower', ['--cleanup', '--run-once', 'wiki'], process.stdout, {
  72. HostConfig: {
  73. AutoRemove: true,
  74. Mounts: [
  75. {
  76. Target: '/var/run/docker.sock',
  77. Source: '/var/run/docker.sock',
  78. Type: 'bind'
  79. }
  80. ]
  81. }
  82. })
  83. return {
  84. responseResult: graphHelper.generateSuccess('Upgrade has started.')
  85. }
  86. } catch (err) {
  87. return graphHelper.generateError(err)
  88. }
  89. }
  90. },
  91. SystemInfo: {
  92. configFile () {
  93. return path.join(process.cwd(), 'config.yml')
  94. },
  95. cpuCores () {
  96. return os.cpus().length
  97. },
  98. currentVersion () {
  99. return WIKI.version
  100. },
  101. dbType () {
  102. return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB')
  103. },
  104. async dbVersion () {
  105. let version = 'Unknown Version'
  106. switch (WIKI.config.db.type) {
  107. case 'mariadb':
  108. case 'mysql':
  109. const resultMYSQL = await WIKI.models.knex.raw('SELECT VERSION() as version;')
  110. version = _.get(resultMYSQL, '[0][0].version', 'Unknown Version')
  111. break
  112. case 'mssql':
  113. const resultMSSQL = await WIKI.models.knex.raw('SELECT @@VERSION as version;')
  114. version = _.get(resultMSSQL, '[0].version', 'Unknown Version')
  115. break
  116. case 'postgres':
  117. version = _.get(WIKI.models, 'knex.client.version', 'Unknown Version')
  118. break
  119. case 'sqlite':
  120. version = _.get(WIKI.models, 'knex.client.driver.VERSION', 'Unknown Version')
  121. break
  122. }
  123. return version
  124. },
  125. dbHost () {
  126. if (WIKI.config.db.type === 'sqlite') {
  127. return WIKI.config.db.storage
  128. } else {
  129. return WIKI.config.db.host
  130. }
  131. },
  132. hostname () {
  133. return os.hostname()
  134. },
  135. latestVersion () {
  136. return WIKI.system.updates.version
  137. },
  138. latestVersionReleaseDate () {
  139. return moment.utc(WIKI.system.updates.releaseDate)
  140. },
  141. nodeVersion () {
  142. return process.version.substr(1)
  143. },
  144. async operatingSystem () {
  145. let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
  146. if (os.platform() === 'linux') {
  147. const osInfo = await getos()
  148. osLabel = `${os.type()} - ${osInfo.dist} (${osInfo.codename || os.platform()}) ${osInfo.release || os.release()} ${os.arch()}`
  149. }
  150. return osLabel
  151. },
  152. async platform () {
  153. const isDockerized = await fs.pathExists('/.dockerenv')
  154. if (isDockerized) {
  155. return 'docker'
  156. }
  157. return os.platform()
  158. },
  159. ramTotal () {
  160. return filesize(os.totalmem())
  161. },
  162. telemetry () {
  163. return WIKI.telemetry.enabled
  164. },
  165. telemetryClientId () {
  166. return WIKI.config.telemetry.clientId
  167. },
  168. async upgradeCapable () {
  169. return fs.pathExists('/var/run/docker.sock')
  170. },
  171. workingDirectory () {
  172. return process.cwd()
  173. },
  174. async groupsTotal () {
  175. const total = await WIKI.models.groups.query().count('* as total').first().pluck('total')
  176. return _.toSafeInteger(total)
  177. },
  178. async pagesTotal () {
  179. const total = await WIKI.models.pages.query().count('* as total').first().pluck('total')
  180. return _.toSafeInteger(total)
  181. },
  182. async usersTotal () {
  183. const total = await WIKI.models.users.query().count('* as total').first().pluck('total')
  184. return _.toSafeInteger(total)
  185. }
  186. }
  187. }