]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/schedulers/plugins-check-scheduler.ts
Implement remote runner jobs in server
[github/Chocobozzz/PeerTube.git] / server / lib / schedulers / plugins-check-scheduler.ts
index 9c60dbcd41c409c7e1e366f4f119ff924758dfdd..820c01693d96cc5e06a8df9f8f94f4e88a9e1aab 100644 (file)
@@ -1,31 +1,31 @@
+import { chunk } from 'lodash'
+import { compareSemVer } from '@shared/core-utils'
 import { logger } from '../../helpers/logger'
-import { AbstractScheduler } from './abstract-scheduler'
-import { retryTransactionWrapper } from '../../helpers/database-utils'
-import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 import { CONFIG } from '../../initializers/config'
+import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 import { PluginModel } from '../../models/server/plugin'
-import { chunk } from 'lodash'
+import { Notifier } from '../notifier'
 import { getLatestPluginsVersion } from '../plugins/plugin-index'
-import { compareSemVer } from '../../../shared/core-utils/miscs/miscs'
+import { AbstractScheduler } from './abstract-scheduler'
 
 export class PluginsCheckScheduler extends AbstractScheduler {
 
   private static instance: AbstractScheduler
 
-  protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.checkPlugins
+  protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.CHECK_PLUGINS
 
   private constructor () {
     super()
   }
 
   protected async internalExecute () {
-    return retryTransactionWrapper(this.checkLatestPluginsVersion.bind(this))
+    return this.checkLatestPluginsVersion()
   }
 
   private async checkLatestPluginsVersion () {
     if (CONFIG.PLUGINS.INDEX.ENABLED === false) return
 
-    logger.info('Checkin latest plugins version.')
+    logger.info('Checking latest plugins version.')
 
     const plugins = await PluginModel.listInstalled()
 
@@ -33,25 +33,39 @@ export class PluginsCheckScheduler extends AbstractScheduler {
     const chunks = chunk(plugins, 10)
     for (const chunk of chunks) {
       // Find plugins according to their npm name
-      const pluginIndex: { [npmName: string]: PluginModel} = {}
+      const pluginIndex: { [npmName: string]: PluginModel } = {}
       for (const plugin of chunk) {
         pluginIndex[PluginModel.buildNpmName(plugin.name, plugin.type)] = plugin
       }
 
       const npmNames = Object.keys(pluginIndex)
-      const results = await getLatestPluginsVersion(npmNames)
 
-      for (const result of results) {
-        const plugin = pluginIndex[result.npmName]
-        if (!result.latestVersion) continue
+      try {
+        const results = await getLatestPluginsVersion(npmNames)
+
+        for (const result of results) {
+          const plugin = pluginIndex[result.npmName]
+          if (!result.latestVersion) continue
+
+          if (
+            !plugin.latestVersion ||
+            (plugin.latestVersion !== result.latestVersion && compareSemVer(plugin.latestVersion, result.latestVersion) < 0)
+          ) {
+            plugin.latestVersion = result.latestVersion
+            await plugin.save()
 
-        if (plugin.latestVersion !== result.latestVersion && compareSemVer(plugin.latestVersion, result.latestVersion) < 0) {
-          plugin.latestVersion = result.latestVersion
-          await plugin.save()
+            // Notify if there is an higher plugin version available
+            if (compareSemVer(plugin.version, result.latestVersion) < 0) {
+              Notifier.Instance.notifyOfNewPluginVersion(plugin)
+            }
+
+            logger.info('Plugin %s has a new latest version %s.', result.npmName, plugin.latestVersion)
+          }
         }
+      } catch (err) {
+        logger.error('Cannot get latest plugins version.', { npmNames, err })
       }
     }
-
   }
 
   static get Instance () {