mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-12-24 06:05:53 -05:00
Improved email system, mail templates in /meshcentral-data/mail-templates
This commit is contained in:
parent
b6bbe71c2a
commit
e39157b0ad
165
meshmail.js
165
meshmail.js
@ -22,23 +22,9 @@ module.exports.CreateMeshMail = function (parent) {
|
|||||||
obj.retry = 0;
|
obj.retry = 0;
|
||||||
obj.sendingMail = false;
|
obj.sendingMail = false;
|
||||||
obj.mailCookieEncryptionKey = null;
|
obj.mailCookieEncryptionKey = null;
|
||||||
|
obj.mailTemplates = {};
|
||||||
const nodemailer = require('nodemailer');
|
const nodemailer = require('nodemailer');
|
||||||
|
|
||||||
// Default account email validation mail
|
|
||||||
const accountCheckSubject = '[[[SERVERNAME]]] - Email Verification';
|
|
||||||
const accountCheckMailHtml = '<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Verification</b></td></tr></table><p>Hi [[[USERNAME]]], <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting email verification, click on the following link to complete the process.</p><p style="margin-left:30px"><a href="[[[CALLBACKURL]]]">Click here to verify your e-mail address.</a></p>If you did not initiate this request, please ignore this mail.</div>';
|
|
||||||
const accountCheckMailText = '[[[SERVERNAME]]] - Verification\r\n\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is performing an e-mail verification. Nagivate to the following link to complete the process: [[[CALLBACKURL]]]\r\nIf you did not initiate this request, please ignore this mail.\r\n';
|
|
||||||
|
|
||||||
// Default account reset mail
|
|
||||||
const accountResetSubject = '[[[SERVERNAME]]] - Account Reset';
|
|
||||||
const accountResetMailHtml = '<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Verification</b></td></tr></table><p>Hi [[[USERNAME]]], <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting an account password reset, click on the following link to complete the process.</p><p style="margin-left:30px"><a href="[[[CALLBACKURL]]]">Click here to reset your account password.</a></p>If you did not initiate this request, please ignore this mail.</div>';
|
|
||||||
const accountResetMailText = '[[[SERVERNAME]]] - Account Reset\r\n\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting an account password reset. Nagivate to the following link to complete the process: [[[CALLBACKURL]]]\r\nIf you did not initiate this request, please ignore this mail.\r\n';
|
|
||||||
|
|
||||||
// Default account invite mail
|
|
||||||
const accountInviteSubject = '[[[SERVERNAME]]] - Invitation';
|
|
||||||
const accountInviteMailHtml = '<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent Installation</b></td></tr></table><p>[[[INTROHTML]]]User [[[USERNAME]]] on server <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting you to download the following software to start the remote control session.</p>[[[MSGHTML]]][[[AGENTHTML]]]<p>If you did not initiate this request, please ignore this mail.</p>Best regards,<br>[[[USERNAME]]]<br></div>';
|
|
||||||
const accountInviteMailText = '[[[SERVERNAME]]] - Agent Installation Invitation\r\n\r\n[[[INTROTEXT]]]User [[[USERNAME]]] on server [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting you to download the following software to start the remote control session. [[[MSGTEXT]]][[[AGENTTEXT]]]If you did not initiate this request, please ignore this mail.\r\n\r\nBest regards,\r\n[[[USERNAME]]]\r\n';
|
|
||||||
|
|
||||||
function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, '''); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
|
function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, '''); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
|
||||||
//function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, ' '); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
|
//function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, ' '); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
|
||||||
|
|
||||||
@ -48,36 +34,87 @@ module.exports.CreateMeshMail = function (parent) {
|
|||||||
if ((parent.config.smtp.user != null) && (parent.config.smtp.pass != null)) { options.auth = { user: parent.config.smtp.user, pass: parent.config.smtp.pass }; }
|
if ((parent.config.smtp.user != null) && (parent.config.smtp.pass != null)) { options.auth = { user: parent.config.smtp.user, pass: parent.config.smtp.pass }; }
|
||||||
obj.smtpServer = nodemailer.createTransport(options);
|
obj.smtpServer = nodemailer.createTransport(options);
|
||||||
|
|
||||||
|
// Set default mail templates
|
||||||
|
// You can override these by placing a file with the same name in "meshcentral-data/mail"
|
||||||
|
// If the server hash many domains, just add the domainid to the file like this: 'account-check-customer1.html', 'mesh-invite-customer1.txt'.
|
||||||
|
obj.mailTemplates['account-check.html'] = '<title>[[[SERVERNAME]]] - Email Verification</title>\r\n<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Verification</b></td></tr></table><p>Hi [[[USERNAME]]], <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting email verification, click on the following link to complete the process.</p><p style="margin-left:30px"><a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]]">Click here to verify your e-mail address.</a></p>If you did not initiate this request, please ignore this mail.</div>';
|
||||||
|
obj.mailTemplates['account-reset.html'] = '<title>[[[SERVERNAME]]] - Account Reset</title>\r\n<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Verification</b></td></tr></table><p>Hi [[[USERNAME]]], <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting an account password reset, click on the following link to complete the process.</p><p style="margin-left:30px"><a href="[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]]">Click here to reset your account password.</a></p>If you did not initiate this request, please ignore this mail.</div>';
|
||||||
|
obj.mailTemplates['mesh-invite.html'] = '<title>[[[SERVERNAME]]] - Invitation</title>\r\n<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent Installation</b></td></tr></table>[[[AREA-NAME]]]<p>Hello [[[NAME]]],</p>[[[/AREA-NAME]]]<p>User [[[USERNAME]]] on server <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting you to download the following software to start the remote control session.</p>[[[AREA-MSG]]]<p>Message: <b>[[[MSG]]]</b></p>[[[/AREA-MSG]]][[[AREA-WINDOWS]]]<p style="margin-left:30px"><a href="[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHIDHEX]]]&tag=mailto:[[[EMAIL]]]">Click here to download the MeshAgent for Windows.</a></p>[[[/AREA-WINDOWS]]][[[AREA-LINUX]]]<p>For Linux, cut & paste the following in a terminal to install the agent:<br /><pre style="margin-left:30px">wget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] [[[MESHIDHEX]]]</pre></p>[[[/AREA-LINUX]]]<p>If you did not initiate this request, please ignore this mail.</p>Best regards,<br>[[[USERNAME]]]<br></div>';
|
||||||
|
obj.mailTemplates['account-check.txt'] = '[[[SERVERNAME]]] - Email Verification\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is performing an e-mail verification. Nagivate to the following link to complete the process:\r\n\r\n[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]]\r\n\r\nIf you did not initiate this request, please ignore this mail.\r\n';
|
||||||
|
obj.mailTemplates['account-reset.txt'] = '[[[SERVERNAME]]] - Account Reset\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting an account password reset. Nagivate to the following link to complete the process:\r\n\r\n[[[SERVERURL]]]/checkmail?c=[[[COOKIE]]]\r\n\r\nIf you did not initiate this request, please ignore this mail.';
|
||||||
|
obj.mailTemplates['mesh-invite.txt'] = '[[[SERVERNAME]]] - Invitation\r\n[[[AREA-NAME]]]Hello [[[NAME]]],\r\n\r\n[[[/AREA-NAME]]]User [[[USERNAME]]] on server [[[SERVERNAME]]] ([[[SERVERURL]]]/) is requesting you to download the following software to start the remote control session.[[[AREA-MSG]]]\r\n\r\nMessage: [[[MSG]]]\r\n\r\n[[[/AREA-MSG]]][[[AREA-WINDOWS]]]For Windows, nagivate to the following link to complete the process:\r\n\r\n[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHIDHEX]]]&tag=mailto:[[[EMAIL]]]\r\n\r\n[[[/AREA-WINDOWS]]][[[AREA-LINUX]]]For Linux, cut & paste the following in a terminal to install the agent:\r\n\r\nwget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] [[[MESHIDHEX]]]\r\n\r\n[[[/AREA-LINUX]]]If you did not initiate this request, please ignore this mail.\r\n\r\nBest regards,\r\n[[[USERNAME]]]';
|
||||||
|
|
||||||
|
// Load all of the mail templates if present
|
||||||
|
if (obj.parent.fs.existsSync(obj.parent.path.join(obj.parent.datapath, 'mail-templates'))) {
|
||||||
|
var mailDir = null;
|
||||||
|
try { mailDir = obj.parent.fs.readdirSync(obj.parent.path.join(obj.parent.datapath, 'mail-templates')); } catch (e) { }
|
||||||
|
if (mailDir != null) {
|
||||||
|
// Load all mail templates
|
||||||
|
for (var i in mailDir) {
|
||||||
|
var templateName = mailDir[i].toLowerCase();
|
||||||
|
if (templateName.endsWith('.html') || templateName.endsWith('.txt')) { obj.mailTemplates[templateName] = obj.parent.fs.readFileSync(obj.parent.path.join(obj.parent.datapath, 'mail-templates', mailDir[i])).toString(); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Save the default templates
|
||||||
|
try {
|
||||||
|
obj.parent.fs.mkdirSync(obj.parent.path.join(obj.parent.datapath, 'mail-templates'));
|
||||||
|
for (var i in obj.mailTemplates) { obj.parent.fs.writeFileSync(obj.parent.path.join(obj.parent.datapath, 'mail-templates', i), obj.mailTemplates[i], 'utf8'); }
|
||||||
|
} catch (e) { console.error(e); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the correct mail template
|
||||||
|
function getTemplate(name, domain, html) {
|
||||||
|
if (domain != null) { var r = obj.mailTemplates[name + '-' + domain.id + (html ? '.html' : '.txt')]; if (r) return r; }
|
||||||
|
return obj.mailTemplates[name + (html ? '.html' : '.txt')];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the correct mail template object
|
||||||
|
function getTemplateEx(name, domain) {
|
||||||
|
var r = {}, txt = getTemplate(name, domain, 0), html = getTemplate(name, domain, 1);
|
||||||
|
r.txtSubject = txt.split('\r\n')[0];
|
||||||
|
r.htmlSubject = getStrBetween(html, '<title>', '</title>\r\n');
|
||||||
|
r.txt = txt.substring(txt.indexOf('\r\n') + 2);
|
||||||
|
r.html = html.substring(html.indexOf('\r\n') + 2);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the string between two markers
|
||||||
|
function getStrBetween(str, start, end) {
|
||||||
|
var si = str.indexOf(start), ei = str.indexOf(end);
|
||||||
|
if ((si == -1) || (ei == -1) || (si > ei)) return null;
|
||||||
|
return str.substring(si + start.length, ei);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the string between two markers
|
||||||
|
function removeStrBetween(str, start, end) {
|
||||||
|
var si = str.indexOf(start), ei = str.indexOf(end);
|
||||||
|
if ((si == -1) || (ei == -1) || (si > ei)) return str;
|
||||||
|
return str.substring(0, si) + str.substring(ei + end.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the string between two markers
|
||||||
|
function strZone(str, marker, keep) {
|
||||||
|
marker = marker.toUpperCase();
|
||||||
|
if (keep) { return str.split('[[[AREA-' + marker + ']]]').join('').split('[[[/AREA-' + marker + ']]]').join(''); }
|
||||||
|
return removeStrBetween(str, '[[[AREA-' + marker + ']]]', '[[[/AREA-' + marker + ']]]');
|
||||||
|
}
|
||||||
|
|
||||||
// Perform all e-mail substitution
|
// Perform all e-mail substitution
|
||||||
function mailReplacements(text, domain, username, email, options) {
|
function mailReplacements(text, domain, options) {
|
||||||
var url;
|
|
||||||
if (domain.dns == null) {
|
if (domain.dns == null) {
|
||||||
// Default domain or subdomain of the default.
|
// Default domain or subdomain of the default.
|
||||||
url = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + parent.certificates.CommonName + ':' + obj.parent.args.port + domain.url;
|
options.serverurl = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + obj.parent.certificates.CommonName + ':' + obj.parent.args.port + domain.url;
|
||||||
} else {
|
} else {
|
||||||
// Domain with a DNS name.
|
// Domain with a DNS name.
|
||||||
url = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + domain.dns + ':' + obj.parent.args.port + domain.url;
|
options.serverurl = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + domain.dns + ':' + obj.parent.args.port + domain.url;
|
||||||
}
|
}
|
||||||
if (options) {
|
if (options.serverurl.endsWith('/')) { options.serverurl = options.serverurl.substring(0, options.serverurl.length - 1); } // Remove the ending / if present
|
||||||
if (options.cookie == null) { options.cookie = ''; }
|
for (var i in options) {
|
||||||
if (options.agentlinkhtml == null) { options.agentlinkhtml = ''; }
|
text = strZone(text, i.toUpperCase(), options[i]); // Adjust this text area
|
||||||
if (options.agentlinktext == null) { options.agentlinktext = ''; }
|
text = text.split('[[[' + i.toUpperCase() + ']]]').join(options[i]); // Replace this value
|
||||||
if (options.meshid == null) { options.meshid = ''; }
|
|
||||||
if (options.introtext == null) { options.introtext = ''; }
|
|
||||||
if (options.introhtml == null) { options.introhtml = ''; }
|
|
||||||
if (options.msgtext == null) { options.msgtext = ''; }
|
|
||||||
if (options.msghtml == null) { options.msghtml = ''; }
|
|
||||||
|
|
||||||
text = text.split('[[[CALLBACKURL]]]').join(url + 'checkmail?c=' + options.cookie);
|
|
||||||
text = text.split('[[[AGENTHTML]]]').join(options.agentlinkhtml);
|
|
||||||
text = text.split('[[[AGENTTEXT]]]').join(options.agentlinktext);
|
|
||||||
text = text.split('[[[MESHID]]]').join(options.meshid);
|
|
||||||
text = text.split('[[[INTROTEXT]]]').join(options.introtext);
|
|
||||||
text = text.split('[[[INTROHTML]]]').join(options.introhtml);
|
|
||||||
text = text.split('[[[MSGTEXT]]]').join(options.msgtext);
|
|
||||||
text = text.split('[[[MSGHTML]]]').join(options.msghtml);
|
|
||||||
}
|
}
|
||||||
return text.split('[[[USERNAME]]]').join(username).split('[[[SERVERURL]]]').join(url).split('[[[SERVERNAME]]]').join(domain.title).split('[[[EMAIL]]]').join(EscapeHtml(email)).split('[[[URL]]]').join(url);
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send a mail
|
// Send a mail
|
||||||
@ -88,40 +125,44 @@ module.exports.CreateMeshMail = function (parent) {
|
|||||||
|
|
||||||
// Send account check mail
|
// Send account check mail
|
||||||
obj.sendAccountCheckMail = function (domain, username, email) {
|
obj.sendAccountCheckMail = function (domain, username, email) {
|
||||||
if ((parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, no reset possible.
|
var template = getTemplateEx('account-check', domain);
|
||||||
var cookie = obj.parent.encodeCookie({ u: domain.id + '/' + username, e: email, a: 1 }, obj.mailCookieEncryptionKey);
|
if ((template == null) || (template.htmlSubject == null) || (template.txtSubject == null) || (parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, no reset possible.
|
||||||
obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(accountCheckSubject, domain, username, email), text: mailReplacements(accountCheckMailText, domain, username, email, { cookie: cookie }), html: mailReplacements(accountCheckMailHtml, domain, username, email, { cookie: cookie }) });
|
|
||||||
|
// Set all the options.
|
||||||
|
var options = { username: username, email: email, servername: domain.title };
|
||||||
|
options.cookie = obj.parent.encodeCookie({ u: domain.id + '/' + username, e: email, a: 1 }, obj.mailCookieEncryptionKey);
|
||||||
|
|
||||||
|
// Send the email
|
||||||
|
obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(template.htmlSubject, domain, options), text: mailReplacements(template.txt, domain, options), html: mailReplacements(template.html, domain, options) });
|
||||||
sendNextMail();
|
sendNextMail();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Send account reset mail
|
// Send account reset mail
|
||||||
obj.sendAccountResetMail = function (domain, username, email) {
|
obj.sendAccountResetMail = function (domain, username, email) {
|
||||||
if ((parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, don't validate the email address.
|
var template = getTemplateEx('account-reset', domain);
|
||||||
var cookie = obj.parent.encodeCookie({ u: domain.id + '/' + username, e: email, a: 2 }, obj.mailCookieEncryptionKey);
|
if ((template == null) || (template.htmlSubject == null) || (template.txtSubject == null) || (parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, don't validate the email address.
|
||||||
obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(accountResetSubject, domain, username, email), text: mailReplacements(accountResetMailText, domain, username, email, { cookie: cookie }), html: mailReplacements(accountResetMailHtml, domain, username, email, { cookie: cookie }) });
|
|
||||||
|
// Set all the options.
|
||||||
|
var options = { username: username, email: email, servername: domain.title };
|
||||||
|
options.cookie = obj.parent.encodeCookie({ u: domain.id + '/' + username, e: email, a: 2 }, obj.mailCookieEncryptionKey);
|
||||||
|
|
||||||
|
// Send the email
|
||||||
|
obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(template.htmlSubject, domain, options), text: mailReplacements(template.txt, domain, options), html: mailReplacements(template.html, domain, options) });
|
||||||
sendNextMail();
|
sendNextMail();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Send agent invite mail
|
// Send agent invite mail
|
||||||
obj.sendAgentInviteMail = function (domain, username, email, meshid, name, os, msg) {
|
obj.sendAgentInviteMail = function (domain, username, email, meshid, name, os, msg) {
|
||||||
if ((parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, can't do this.
|
var template = getTemplateEx('mesh-invite', domain);
|
||||||
var options = { meshid: meshid.split('/')[2] };
|
if ((template == null) || (template.htmlSubject == null) || (template.txtSubject == null) || (parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, don't validate the email address.
|
||||||
var agentLinkHtml = '';
|
|
||||||
var agentLinkText = '';
|
// Set all the template replacement options and generate the final email text (both in txt and html formats).
|
||||||
if (os == 0 || os == 1) { // All OS or Windows
|
var options = { username: username, name: name, email: email, msg: msg, meshid: meshid, meshidhex: meshid.split('/')[2], servername: domain.title };
|
||||||
agentLinkHtml += '<p style="margin-left:30px"><a href="[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHID]]]&tag=mailto:[[[EMAIL]]]">Click here to download the MeshAgent for Windows.</a></p>';
|
options.linux = ((os == 0) || (os == 2)) ? 1 : 0;
|
||||||
agentLinkText += 'For Windows, nagivate to the following link to complete the process:\r\n\r\n[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHID]]]&tag=mailto:[[[EMAIL]]]\r\n\r\n';
|
options.windows = ((os == 0) || (os == 1)) ? 1 : 0;
|
||||||
}
|
|
||||||
if (os == 0 || os == 2) { // All OS or Linux
|
// Send the email
|
||||||
agentLinkHtml += '<p>For Linux, cut & paste the following in a terminal to install the agent:<br/><pre style="margin-left:30px">wget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHID]]]\'</pre></p>';
|
obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(template.htmlSubject, domain, options), text: mailReplacements(template.txt, domain, options), html: mailReplacements(template.html, domain, options) });
|
||||||
agentLinkText += 'For Linux, cut & paste the following in a terminal to install the agent:\r\n\r\nwget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHID]]]\'\r\n\r\n';
|
|
||||||
}
|
|
||||||
options.agentlinkhtml = agentLinkHtml;
|
|
||||||
options.agentlinktext = agentLinkText;
|
|
||||||
if ((name != null) && (name != '')) { options.introtext = 'Hello ' + name + ',\r\n\r\n'; options.introhtml = '<p>Hello ' + name + ',</p>'; }
|
|
||||||
if ((msg != null) && (msg != '')) { options.msgtext = '\r\n\r\nMessage: ' + msg + '\r\n\r\n'; options.msghtml = '<p>Message: <b>' + msg + '</b></p>'; }
|
|
||||||
var mail = { to: email, from: parent.config.smtp.from, subject: mailReplacements(accountInviteSubject, domain, username, email), text: mailReplacements(accountInviteMailText, domain, username, email, options), html: mailReplacements(accountInviteMailHtml, domain, username, email, options) };
|
|
||||||
obj.pendingMails.push(mail);
|
|
||||||
sendNextMail();
|
sendNextMail();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2016,11 +2016,11 @@
|
|||||||
|
|
||||||
if (serverinfo.https == true) {
|
if (serverinfo.https == true) {
|
||||||
var portStr = (serverinfo.port == 443)?'':(":" + serverinfo.port);
|
var portStr = (serverinfo.port == 443)?'':(":" + serverinfo.port);
|
||||||
Q('agins_linux_area').value = "wget -q https://" + servername + portStr + "/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh https://" + servername + portStr + " '" + meshid.split('/')[2] + "'\r\n";
|
Q('agins_linux_area').value = "wget -q https://" + servername + portStr + "/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh https://" + servername + portStr + " " + meshid.split('/')[2] + "\r\n";
|
||||||
Q('agins_linux_area_un').value = "wget -q https://" + servername + portStr + "/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n";
|
Q('agins_linux_area_un').value = "wget -q https://" + servername + portStr + "/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n";
|
||||||
} else {
|
} else {
|
||||||
var portStr = (serverinfo.port == 80)?'':(":" + serverinfo.port);
|
var portStr = (serverinfo.port == 80)?'':(":" + serverinfo.port);
|
||||||
Q('agins_linux_area').value = "wget -q http://" + servername + portStr + "/meshagents?script=1 -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh http://" + servername + portStr + " '" + meshid.split('/')[2] + "'\r\n";
|
Q('agins_linux_area').value = "wget -q http://" + servername + portStr + "/meshagents?script=1 -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh http://" + servername + portStr + " " + meshid.split('/')[2] + "\r\n";
|
||||||
Q('agins_linux_area_un').value = "wget -q http://" + servername + portStr + "/meshagents?script=1 -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n";
|
Q('agins_linux_area_un').value = "wget -q http://" + servername + portStr + "/meshagents?script=1 -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n";
|
||||||
}
|
}
|
||||||
Q('aginsSelect').focus();
|
Q('aginsSelect').focus();
|
||||||
|
@ -177,7 +177,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
var passhint = "{{{passhint}}}";
|
var passhint = "{{{passhint}}}";
|
||||||
var newAccountPass = parseInt('{{{newAccountPass}}}');
|
var newAccountPass = parseInt('{{{newAccountPass}}}');
|
||||||
var emailCheck = parseInt('{{{emailcheck}}}');
|
var emailCheck = ('{{{emailcheck}}}' == 'true');
|
||||||
var features = parseInt('{{{features}}}');
|
var features = parseInt('{{{features}}}');
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
|
@ -171,7 +171,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
var passhint = "{{{passhint}}}";
|
var passhint = "{{{passhint}}}";
|
||||||
var newAccountPass = parseInt('{{{newAccountPass}}}');
|
var newAccountPass = parseInt('{{{newAccountPass}}}');
|
||||||
var emailCheck = parseInt('{{{emailcheck}}}');
|
var emailCheck = ('{{{emailcheck}}}' == 'true');
|
||||||
var features = parseInt('{{{features}}}');
|
var features = parseInt('{{{features}}}');
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
|
Loading…
Reference in New Issue
Block a user