system.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 request = require('request-promise')
  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. if (process.env.UPGRADE_COMPANION) {
  71. await request({
  72. method: 'POST',
  73. uri: 'http://wiki-update-companion/upgrade'
  74. })
  75. return {
  76. responseResult: graphHelper.generateSuccess('Upgrade has started.')
  77. }
  78. } else {
  79. throw new Error('You must run the wiki-update-companion container and pass the UPGRADE_COMPANION env var in order to use this feature.')
  80. }
  81. } catch (err) {
  82. return graphHelper.generateError(err)
  83. }
  84. },
  85. async importUsersFromV1(obj, args, context) {
  86. try {
  87. const MongoClient = require('mongodb').MongoClient
  88. if (args.mongoDbConnString && args.mongoDbConnString.length > 10) {
  89. const client = await MongoClient.connect(args.mongoDbConnString, {
  90. appname: `Wiki.js ${WIKI.version} Migration Tool`
  91. })
  92. const dbUsers = client.db().collection('users')
  93. const userCursor = dbUsers.find({ email: { '$ne': 'guest' } })
  94. let failed = []
  95. let usersCount = 0
  96. let groupsCount = 0
  97. while (await userCursor.hasNext()) {
  98. const usr = await userCursor.next()
  99. try {
  100. await WIKI.models.users.createNewUser({
  101. providerKey: usr.provider,
  102. email: usr.email,
  103. name: usr.name,
  104. passwordRaw: usr.password,
  105. mustChangePassword: false,
  106. sendWelcomeEmail: false
  107. })
  108. usersCount++
  109. } catch (err) {
  110. failed.push({
  111. provider: usr.provider,
  112. email: usr.email,
  113. error: err.message
  114. })
  115. WIKI.logger.warn(`${usr.email}: ${err}`)
  116. }
  117. }
  118. client.close()
  119. return {
  120. responseResult: graphHelper.generateSuccess('Import completed.'),
  121. usersCount: usersCount,
  122. groupsCount: groupsCount,
  123. failed: failed
  124. }
  125. } else {
  126. throw new Error('MongoDB Connection String is missing or invalid.')
  127. }
  128. } catch (err) {
  129. return graphHelper.generateError(err)
  130. }
  131. }
  132. },
  133. SystemInfo: {
  134. configFile () {
  135. return path.join(process.cwd(), 'config.yml')
  136. },
  137. cpuCores () {
  138. return os.cpus().length
  139. },
  140. currentVersion () {
  141. return WIKI.version
  142. },
  143. dbType () {
  144. return _.get(dbTypes, WIKI.config.db.type, 'Unknown DB')
  145. },
  146. async dbVersion () {
  147. let version = 'Unknown Version'
  148. switch (WIKI.config.db.type) {
  149. case 'mariadb':
  150. case 'mysql':
  151. const resultMYSQL = await WIKI.models.knex.raw('SELECT VERSION() as version;')
  152. version = _.get(resultMYSQL, '[0][0].version', 'Unknown Version')
  153. break
  154. case 'mssql':
  155. const resultMSSQL = await WIKI.models.knex.raw('SELECT @@VERSION as version;')
  156. version = _.get(resultMSSQL, '[0].version', 'Unknown Version')
  157. break
  158. case 'postgres':
  159. version = _.get(WIKI.models, 'knex.client.version', 'Unknown Version')
  160. break
  161. case 'sqlite':
  162. version = _.get(WIKI.models, 'knex.client.driver.VERSION', 'Unknown Version')
  163. break
  164. }
  165. return version
  166. },
  167. dbHost () {
  168. if (WIKI.config.db.type === 'sqlite') {
  169. return WIKI.config.db.storage
  170. } else {
  171. return WIKI.config.db.host
  172. }
  173. },
  174. hostname () {
  175. return os.hostname()
  176. },
  177. latestVersion () {
  178. return WIKI.system.updates.version
  179. },
  180. latestVersionReleaseDate () {
  181. return moment.utc(WIKI.system.updates.releaseDate)
  182. },
  183. nodeVersion () {
  184. return process.version.substr(1)
  185. },
  186. async operatingSystem () {
  187. let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}`
  188. if (os.platform() === 'linux') {
  189. const osInfo = await getos()
  190. osLabel = `${os.type()} - ${osInfo.dist} (${osInfo.codename || os.platform()}) ${osInfo.release || os.release()} ${os.arch()}`
  191. }
  192. return osLabel
  193. },
  194. async platform () {
  195. const isDockerized = await fs.pathExists('/.dockerenv')
  196. if (isDockerized) {
  197. return 'docker'
  198. }
  199. return os.platform()
  200. },
  201. ramTotal () {
  202. return filesize(os.totalmem())
  203. },
  204. telemetry () {
  205. return WIKI.telemetry.enabled
  206. },
  207. telemetryClientId () {
  208. return WIKI.config.telemetry.clientId
  209. },
  210. async upgradeCapable () {
  211. return !_.isNil(process.env.UPGRADE_COMPANION)
  212. },
  213. workingDirectory () {
  214. return process.cwd()
  215. },
  216. async groupsTotal () {
  217. const total = await WIKI.models.groups.query().count('* as total').first().pluck('total')
  218. return _.toSafeInteger(total)
  219. },
  220. async pagesTotal () {
  221. const total = await WIKI.models.pages.query().count('* as total').first().pluck('total')
  222. return _.toSafeInteger(total)
  223. },
  224. async usersTotal () {
  225. const total = await WIKI.models.users.query().count('* as total').first().pluck('total')
  226. return _.toSafeInteger(total)
  227. }
  228. }
  229. }