diff --git a/DockerfileDev b/DockerfileDev
index dc4e6d8..49892cf 100644
--- a/DockerfileDev
+++ b/DockerfileDev
@@ -28,13 +28,10 @@ COPY . /opt/cronicle
WORKDIR /opt/cronicle
#optional step to fix vulnerabilities reported by npm
-#RUN npm audit fix --force
+RUN npm audit fix --force
RUN npm install
-# if you run "audit fix" then you need to downgrade chart.js back to v2 (from v3)
-#RUN npm i chart.js@2.7.1
-
RUN node bin/build dist
# protect sensitive folders
diff --git a/htdocs/js/pages/admin/Servers.js b/htdocs/js/pages/admin/Servers.js
index 2dcb30a..941253f 100644
--- a/htdocs/js/pages/admin/Servers.js
+++ b/htdocs/js/pages/admin/Servers.js
@@ -162,7 +162,7 @@ Class.add( Page.Admin, {
return [
'
' + self.getNiceGroup(group, null, col_width) + '
',
- '/' + group.regexp + '/
',
+ '/' + encode_entities(group.regexp) + '/
',
// group.description || '(No description)',
num_servers ? commify( num_servers) : '(None)',
num_events ? commify( num_events ) : '(None)',
diff --git a/lib/job.js b/lib/job.js
index 883a634..dceadf1 100644
--- a/lib/job.js
+++ b/lib/job.js
@@ -130,6 +130,11 @@ module.exports = Class.create({
return callback(new Error("Maximum of " + category.max_children + " " + Tools.pluralize("job", category.max_children) + " already running for category: " + category.title));
}
}
+
+ var max_jobs = self.server.config.get('max_jobs') || 0;
+ if (max_jobs && (job_list.length >= max_jobs)) {
+ return callback( new Error("Global maximum of " + max_jobs + " " + Tools.pluralize("job", max_jobs) + " already running.") );
+ }
if (!category.enabled) {
return callback(new Error("Category '" + category.title + "' is disabled."));
diff --git a/lib/test.js b/lib/test.js
index a874fc0..7be1bab 100644
--- a/lib/test.js
+++ b/lib/test.js
@@ -92,7 +92,7 @@ module.exports = {
require('pixl-server-storage'),
require('pixl-server-web'),
require('pixl-server-api'),
- require('pixl-server-user'),
+ require('./user.js'),
require('./engine.js')
]
diff --git a/package-lock.json b/package-lock.json
index 866c2a6..e713c2e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "Cronicle",
- "version": "1.3.4",
+ "version": "1.4.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -248,34 +248,27 @@
}
},
"chart.js": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.1.tgz",
- "integrity": "sha512-pX1oQAY86MiuyZ2hY593Acbl4MLHKrBBhhmZ1YqSadzQbbsBE2rnd6WISoHjIsdf0WDeC0hbePYCz2ZxkV8L+g==",
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz",
+ "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==",
"requires": {
- "chartjs-color": "~2.2.0",
- "moment": "~2.18.0"
- },
- "dependencies": {
- "moment": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
- "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
- }
+ "chartjs-color": "^2.1.0",
+ "moment": "^2.10.2"
}
},
"chartjs-color": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz",
- "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz",
+ "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==",
"requires": {
- "chartjs-color-string": "^0.5.0",
- "color-convert": "^0.5.3"
+ "chartjs-color-string": "^0.6.0",
+ "color-convert": "^1.9.3"
}
},
"chartjs-color-string": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz",
- "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz",
+ "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==",
"requires": {
"color-name": "^1.0.0"
}
@@ -308,9 +301,19 @@
"integrity": "sha512-/D5PcsKyzthtSy2NNKCyJi3b+htRkoKv3idswR/tR6UAvMNKA7SrmyZy6fOONJxSRs1JlUWEDAbxqfdArbK8iA=="
},
"color-convert": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
- "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0="
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ },
+ "dependencies": {
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ }
+ }
},
"color-name": {
"version": "1.1.4",
@@ -585,9 +588,9 @@
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"jquery": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
- "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz",
+ "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ=="
},
"json3": {
"version": "3.3.2",
@@ -751,9 +754,9 @@
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
"netmask": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
- "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU="
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.1.tgz",
+ "integrity": "sha512-gB8eG6ubxz67c7O2gaGiyWdRUIbH61q7anjgueDqCC9kvIs/b4CTtCMaQKeJbv1/Y7FT19I4zKwYmjnjInRQsg=="
},
"node-static": {
"version": "0.7.10",
@@ -773,9 +776,9 @@
}
},
"nodemailer": {
- "version": "6.4.11",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz",
- "integrity": "sha512-BVZBDi+aJV4O38rxsUh164Dk1NCqgh6Cm0rQSb9SK/DHGll/DrCMnycVDD7msJgZCnmVa8ASo8EZzR7jsgTukQ=="
+ "version": "6.4.16",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.16.tgz",
+ "integrity": "sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ=="
},
"nomnom": {
"version": "1.6.2",
@@ -922,11 +925,11 @@
}
},
"pixl-mail": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/pixl-mail/-/pixl-mail-1.0.10.tgz",
- "integrity": "sha512-w4uDDOMeGCbmdn19E4nc8sCGPyQh2n/hmUhcuRq8G9XNHXuhhLRGt2AJPi/bYSDlFaWDIlFgJFAiZaOqeT0zNQ==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pixl-mail/-/pixl-mail-1.0.11.tgz",
+ "integrity": "sha512-QcWDdaJ8FJjEScb9pESLopXlci9y0n4q+/qTg6rokSXB3MOMYJlDn7FhXeiSLCeLe01Yv1uSzP9x1YSo3EXa/g==",
"requires": {
- "nodemailer": "6.4.11",
+ "nodemailer": "6.4.16",
"pixl-class": "^1.0.0",
"pixl-tools": "^1.0.19"
}
@@ -940,9 +943,9 @@
}
},
"pixl-request": {
- "version": "1.0.35",
- "resolved": "https://registry.npmjs.org/pixl-request/-/pixl-request-1.0.35.tgz",
- "integrity": "sha512-hUhgnLesj/qGDoKI2EJ22RU+fnWokojNZj2ZgUmKdFdi7S89/Qyjy6gjMJr+zLC3XPVe0sUNFjaB8zZsxJ47VA==",
+ "version": "1.0.36",
+ "resolved": "https://registry.npmjs.org/pixl-request/-/pixl-request-1.0.36.tgz",
+ "integrity": "sha512-pR8lmuo7rYInfbJ90oORWDW9FH202aQcBHqu9o4mtmh6ZQzZhSZSqci+a7Dnpqgny66HAIBl2ZeNerYeXHQeCA==",
"requires": {
"errno": "0.1.7",
"form-data": "2.3.2",
diff --git a/package.json b/package.json
index 96c09db..8c1095c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "Cronicle",
- "version": "1.4.0",
+ "version": "1.4.1",
"description": "A simple, distributed task scheduler and runner with a web based UI.",
"author": "Joseph Huckaby ",
"homepage": "https://github.com/jhuckaby/Cronicle",
@@ -25,18 +25,18 @@
"activedirectory2": "^2.1.0",
"async": "2.6.0",
"bcrypt-node": "0.1.0",
- "chart.js": "2.7.1",
+ "chart.js": "^2.9.4",
"codemirror": "^5.59.2",
"dotenv": "^8.2.0",
"font-awesome": "4.7.0",
"glob": "5.0.15",
- "jquery": "3.3.1",
+ "jquery": "^3.5.0",
"jstimezonedetect": "1.0.6",
"mdi": "1.9.33",
"mkdirp": "0.5.1",
"moment": "2.22.1",
"moment-timezone": "0.5.32",
- "netmask": "1.0.6",
+ "netmask": "^2.0.1",
"openssl-wrapper": "^0.3.4",
"pixl-args": "^1.0.3",
"pixl-class": "^1.0.2",
@@ -44,9 +44,9 @@
"pixl-config": "^1.0.5",
"pixl-json-stream": "^1.0.6",
"pixl-logger": "^1.0.20",
- "pixl-mail": "^1.0.10",
+ "pixl-mail": "^1.0.11",
"pixl-perf": "^1.0.5",
- "pixl-request": "^1.0.35",
+ "pixl-request": "^1.0.36",
"pixl-server": "^1.0.28",
"pixl-server-api": "^1.0.2",
"pixl-server-storage": "^2.0.10",
diff --git a/sample_conf/config.json b/sample_conf/config.json
index fed08f9..2acdc05 100644
--- a/sample_conf/config.json
+++ b/sample_conf/config.json
@@ -26,6 +26,7 @@
"scheduler_startup_grace": 10,
"universal_web_hook": "",
"track_manual_jobs": false,
+ "max_jobs": 0,
"server_comm_use_hostnames": true,
"web_direct_connect": false,