Skip to content

Commit

Permalink
Added services.
Browse files Browse the repository at this point in the history
  • Loading branch information
petersirka committed Aug 20, 2021
1 parent 8069050 commit 90f306a
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 50 deletions.
23 changes: 6 additions & 17 deletions definitions/superadmin.js
Original file line number Diff line number Diff line change
Expand Up @@ -1111,7 +1111,6 @@ SuperAdmin.load = function(callback) {
for (var i = 0; i < APPLICATIONS.length; i++) {
var item = APPLICATIONS[i];
item.pid = 0;
item.notified = []; // IDs of already notified alarms
item.linker = item.url.superadmin_linker(item.path);
!item.priority && (item.priority = 0);
!item.delay && (item.delay = 0);
Expand Down Expand Up @@ -1154,6 +1153,8 @@ SuperAdmin.makescripts = function(app, callback) {

data.total = app.version === 'total3' ? 'total.js' : app.version;
data.threads = app.threads ? app.threads === '-' ? 'true' : ('\'' + app.threads + '\'') : '';
data.servicemode = app.servicemode;
data.watcher = app.watcher;

// Old format
if (typeof(app.cluster) === 'number') {
Expand Down Expand Up @@ -1356,19 +1357,11 @@ SuperAdmin.notify = function(app, type, callback) {
return;
}

var skip = {};

MAIN.rules.wait(function(item, next) {

var key = 'delay' + (item.each ? app.id + item.id : item.id);

if ((item.appid && item.appid !== app.id) || skip[key] || item[key] > NOW || (!item.debug && app.debug) || (item.highpriority && !app.highpriority)) {
next();
return;
}

// Already notified
if (app.notified.includes(item.id)) {
if ((item.appid && item.appid !== app.id) || item.appsnotified[key] > NOW || (!item.debug && app.debug) || (item.highpriority && !app.highpriority)) {
next();
return;
}
Expand All @@ -1381,8 +1374,7 @@ SuperAdmin.notify = function(app, type, callback) {

if (item.validate(app)) {

skip[key] = true;
item[key] = NOW.add(item.delay);
item.appsnotified[key] = NOW.add(item.delay);

var data = [];
data.push('CPU: ' + app.current.cpu + '%');
Expand All @@ -1403,15 +1395,13 @@ SuperAdmin.notify = function(app, type, callback) {
else
app.stats.alarms = 1;

app.notified.push(item.id);

SuperAdmin.send_notify(type, message);
NOSQL('alarms').modify({ '+notified': 1, dtnotified: NOW }).id(item.id);
NOSQL('alarms').modify({ '+notified': 1, dtnotified: NOW, appsnotified: item.appsnotified }).id(item.id);

item.phone && SuperAdmin.send_sms(item.phone, message.removeTags());
item.email && SuperAdmin.send_email(item.email, message, item.name);

PUBLISH('notify_apps', { type: type, body: message, message: item.message, dtnotified: NOW, dttms: NOW });

}

next();
Expand Down Expand Up @@ -1466,7 +1456,6 @@ SuperAdmin.notify_system = function() {
});
};


SuperAdmin.send_sms = function(numbers, message) {

if (!CONF.totalapi || !CONF.sms_from)
Expand Down
10 changes: 9 additions & 1 deletion private/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// https://www.totaljs.com
// ===================================================

const total = '{{ value.total }}';
const total = '{{ value.total }}' || 'total4';
const options = {};

// options.ip = '127.0.0.1';
Expand All @@ -24,6 +24,14 @@ options.logs = 'isolated';
options.cluster = {{ value.cluster }};
{{ fi }}

{{ if !value.debug && value.watcher }}
options.watcher = true;
{{ fi }}

{{ if value.servicemode }}
options.servicemode = true;
{{ fi }}

{{ if value.unixsocket }}
options.unixsocket = '{{ value.unixsocket }}';
options.unixsocket777 = true;
Expand Down
17 changes: 9 additions & 8 deletions public/forms/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@
<div class="alert"><i class="fa fa-warning"></i>@(<b>Uploading of source-code</b> is possible after the creation process.)</div>
</div>
<div class="padding">
<div data---="input__?.url__placeholder:https\://www.totaljs.com;required:true;type:url__'https://'">@(URL address)</div>
<div data---="input__?.url__monospace:1;placeholder:https\://www.totaljs.com;required:true;type:url__'https://'">@(URL address)</div>
<div class="help m">
@(The URL address must contain protocol <code>http</code> or <code>https</code>).<br />
<b>@(Make sure that DNS A records for this domain are targeted to this server</b>.)
</div>
<div data---="input__?.name__placeholder:@(e.g. CMS)" class="m">@(Internal name)</div>
<div data---="input__?.category__dirsource:apps.categories;dircustom:true;dirempty:@(Without category);placeholder:@(Choose a category);dirplaceholder:@(Search or create new)" class="m">@(Category)</div>
<div data---="checkbox__?.debug__null__true" class="inline b mr5 black">@(Enable debug mode)</div>
<div data---="input__?.debug__type:checkbox__true" class="inline b mr5 black">@(Enable debug mode)</div>
<div class="inline middle mr15"><span class="badge badge-red">@(debug)</span></div>
<div data---="checkbox__?.watcher__disabled:true__false" class="inline mr15" data-bind="?.debug__disabled">@(Enable watcher)</div>
<div data---="checkbox__?.highpriority" class="inline mr15 black">@(High priority)</div>
<div data---="checkbox__?.accesslog" class="inline mr15">@(Enable access logging)</div>
<div data---="checkbox__?.backup" class="inline">@(Enable backing up)</div>
<div data---="input__?.watcher__type:checkbox;disabled:true__false" class="inline mr15" data-bind="?.debug__disabled">@(Enable watcher)</div>
<div data---="input__?.highpriority__type:checkbox" class="inline mr15 black">@(High priority)</div>
<div data---="input__?.accesslog__type:checkbox" class="inline mr15">@(Enable access logging)</div>
<div data---="input__?.backup__type:checkbox" class="inline">@(Enable backing up)</div>
</div>
<hr class="nmb nmt" />
<div data-bind="?.url__show:value&&value.substring(0,8)==='https://'" class="hidden">
<div class="bg-smoke m">
<div class="padding">
<div><span class="badge badge-green b mr5"><i class="fa fa-lock"></i>@(Security)</span><b>@(SSL configuration)</b></div>
<div class="help m"><b>@(Good to know:)</b> @(SSL certificates are generated automatically via Let's Encrypt service. You must redirect DNS records to the IP address of this server.)</div>
<div data---="checkbox__?.sslcustom">@(Add own SSL certificates)</div>
<div data---="input__?.sslcustom__type:checkbox">@(Add own SSL certificates)</div>
<div data-bind="?.sslcustom__show" class="hidden">
<br />
<div class="row">
Expand Down Expand Up @@ -94,7 +94,7 @@ <h3>@(Type of application)</h3>
<div data-bind="common.unixsocket__show" class="hidden">
<hr />
<div class="help">@(SuperAdmin will use <b>Unix socket</b> instead of classic network routing. It's faster and more secure.)</div>
<div data---="checkbox__?.unixsocket" class="black mt5 b">@(Use Unix socket)</div>
<div data---="input__?.unixsocket__type:checkbox" class="black mt5 b">@(Use Unix socket)</div>
</div>
<hr />
<div data---="input__?.threads__dirsource:%threads;dircustom:1;dirplaceholder:@(Type a relative /endpoint/ or just enable threads)__''">@(Total.js threads)</div>
Expand Down Expand Up @@ -128,6 +128,7 @@ <h3>@(Type of application)</h3>

exports.submit = function(hide) {
var model = GET('? @reset @showloading');
model.servicemode = false;
DAPI('apps_save', model, ASETTER('message/response', function(response) {

if (!model.id && response.value) {
Expand Down
65 changes: 65 additions & 0 deletions public/forms/service.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<div data---="largeform___common.form__if:service;width:900;icon:fas fa-box;submit:?/submit;reload:?/reload;autofocus:1" class="hidden" data-scope="serviceform">
<div>
<div data-bind="appform.id___hide" class="hidden">
<div class="alert"><i class="fa fa-warning"></i>@(<b>Uploading of source-code</b> is possible after the creation process.)</div>
</div>
<div class="padding">
<div data---="input__?.name__required:1;placeholder:@(e.g. CMS)" class="m">@(Service name)</div>
<div data---="input__?.category__dirsource:apps.categories;dircustom:true;dirempty:@(Without category);placeholder:@(Choose a category);dirplaceholder:@(Search or create new)" class="m">@(Category)</div>
<div data---="input__?.debug__type:checkbox__true" class="inline b mr5 black">@(Enable debug mode)</div>
<div class="inline middle mr15"><span class="badge badge-red">@(debug)</span></div>
<div data---="input__?.watcher__type:checkbox;disabled:true__false" class="inline mr15" data-bind="?.debug__disabled">@(Enable watcher)</div>
<div data---="input__?.highpriority__type:checkbox" class="inline mr15 black">@(High priority)</div>
<div data---="input__?.backup__type:checkbox" class="inline">@(Enable backing up)</div>
</div>
<hr class="nmb nmt" />
<div class="padding npb">
<div class="row">
<div class="col-md-3 col-xs-6 m">
<div data---="input__?.memory__align:center;increment:true;maxlength:4;placeholder:@(auto);type:number__'auto'">@(Memory limit)</div>
</div>
<div class="col-md-3 col-xs-6 m">
<div data---="input__?.priority__align:center;increment:true;maxlength:3;type:number__0">@(Process priority)</div>
</div>
</div>
</div>
</div>
<nav data---="validation__?">
<button name="submit"><i class="fas fa-check-circle"></i>@(SUBMIT)</button>
<button name="cancel">@(Cancel)</button>
</nav>
</div>

<script>

PLUGIN('serviceform', function(exports) {

exports.reload = function(com) {
var model = GET('?');
com.reconfigure({ title: model.id ? '@(Edit service)' : '@(Create service)' });
};

exports.submit = function(hide) {
var model = GET('? @reset @showloading');
model.servicemode = true;
DAPI('apps_save', model, ASETTER('message/response', function(response) {

if (!model.id && response.value) {
setTimeout(function() {
var app = apps.apps.findItem('id', response.value);
if (app) {
SET('uploadform.app', app);
SET('common.form', 'upload');
}
SETTER('loading/hide', 1000);
}, 2500);
} else
SETTER('loading/hide', 1000);

hide();
}));
};

});

</script>
36 changes: 28 additions & 8 deletions public/parts/apps.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
</header>

<div data---="viewbox__common.page__margin:45;parent:.ui-layout2-section;scrollbar:1;visibleY:1">
<div class="help" style="margin:10px 0 0 20px;line-height:18px"><i class="far fa-bookmark"></i>@(Quick search:) <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@debug</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@release</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@total3</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@total4</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@errors</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@stopped</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@running</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@threads</span> <span class="link exec badge badge-yellow badge-small" data-exec="?/searchtype">@highpriority</span></div>
<div class="help" style="margin:10px 0 0 20px;line-height:18px"><i class="far fa-bookmark"></i>@(Quick search:) <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@debug</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@release</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@total3</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@total4</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@errors</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@stopped</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@running</span> <span class="link exec badge badge-blue badge-small" data-exec="?/searchtype">@threads</span> <span class="link exec badge badge-purple badge-small" data-exec="?/searchtype">@service</span> <span class="link exec badge badge-yellow badge-small" data-exec="?/searchtype">@highpriority</span></div>
<div data-bind="?.apps.length__visible" class="invisible">
<div class="statsbar">
<figure>
Expand Down Expand Up @@ -77,15 +77,15 @@ <h2 class="search"><span>{{ m.items.length }}</span><i class="fas fa-list"></i>@
{{ fi }}
<div>
{{ foreach n in m.items }}
<div class="item search" data-bind="appsinfo.app{{ n.id }}__.offline:!value||!value.is__.iserror:value&&value.analyzator==='error'__delay:100__exec:?/makesearch" data-id="{{ n.id }}" data-search="{{ n.url }}" data-url="{{ n.url }} {{ n.name }} {{ if n.debug }}@debug{{ else }}@release{{ fi }} @{{ n.version }}{{ if n.highpriority }} @highpriority{{ fi }}">
<div class="item search" data-bind="appsinfo.app{{ n.id }}__.offline:!value||!value.is__.iserror:value&&value.analyzator==='error'__delay:100__exec:?/makesearch" data-id="{{ n.id }}" data-search="{{ n.url }}" data-url="{{ n.url }} {{ n.name }} {{ if n.debug }}@debug{{ else }}@release{{ fi }} @{{ n.version }}{{ if n.highpriority }} @highpriority{{ fi }}{{ if n.servicemode }} @service{{ fi }}">
<div class="controls">
<button class="exec" data-exec="?/menu" name="menu" title="@(Settings)"><i class="fas fa-ellipsis-h"></i></button>
<button class="exec" data-exec="?/restart" name="restart" title="@(Restart)"><i class="fa fa-refresh"></i></button>
<a href="/logs/{{ n.id }}/" target="_blank" title="@(Show logs)" class="blue"><i class="fa fa-search"></i></a>
</div>
<div class="stats" data-bind="appsinfo.app{{ n.id }}__template:{#appstats}"></div>
{{ if n.debug }}<div class="debug"><i class="fas fa-flask"></i><span class="badge badge-purple">@(debug)</span></div>{{ fi }}
<div class="url"><em>{{ n.version }}</em><div class="openfiles" data-bind="appsinfo.app{{ n.id }}.openfiles__text span__show"><span></span><i class="far fa-copy"></i></div>{{ if n.https }}<span class="ssl badge badge-green badge-small mr5">SSL</span>{{ fi }}<a href="{{ n.url }}"{{ if n.name }} title="{{ n.domain }}"{{fi}} target="_blank">{{ if n.name }}{{ n.name }}{{ else }}{{ n.domain }}{{ fi }}</a>{{ if n.threads }}<i class="fa fa-cogs ml5" title="@(Threads are enabled)"></i>{{ fi }}{{ if n.highpriority }} <span class="hidden-sm hidden-xs badge badge-yellow">@(high priority)</span>{{ fi }} {{ if !n.unixsocket }}<span class="port">{{ n.port }}</span>{{ fi }}<b data-bind="appsinfo.app{{ n.id }}.connections__show__text" title="@(HTTP connections)" class="connections hidden"></b></div>
<div class="url"><em>{{ n.version }}</em><div class="openfiles" data-bind="appsinfo.app{{ n.id }}.openfiles__text span__show"><span></span><i class="far fa-copy"></i></div>{{ if n.servicemode }}<span class="ssl badge badge-pink badge-small mr5">service</span>{{ fi }}{{ if n.https }}<span class="ssl badge badge-green badge-small mr5">SSL</span>{{ fi }}{{ if n.servicemode }}{{ n.name }}{{ else }}<a href="{{ n.url }}"{{ if n.name }} title="{{ n.domain }}"{{fi}} target="_blank">{{ if n.name }}{{ n.name }}{{ else }}{{ n.domain }}{{ fi }}</a>{{ if n.threads }}<i class="fa fa-cogs ml5" title="@(Threads are enabled)"></i>{{ fi }}{{ fi }}{{ if n.highpriority }} <span class="hidden-sm hidden-xs badge badge-yellow">@(high priority)</span>{{ fi }} {{ if !n.unixsocket }}<span class="port">{{ n.port }}</span>{{ fi }}<b data-bind="appsinfo.app{{ n.id }}.connections__show__text" title="@(HTTP connections)" class="connections hidden"></b></div>
</div>
{{ end }}
</div>
Expand Down Expand Up @@ -118,6 +118,7 @@ <h2 class="search"><span>{{ m.items.length }}</span><i class="fas fa-list"></i>@
<div data---="importer__common.form__if:filebrowser;url:/forms/filebrowser.html"></div>
<div data---="importer__common.form__if:analyzator;url:/forms/analyzator.html"></div>
<div data---="importer__common.form__if:app;url:/forms/app.html"></div>
<div data---="importer__common.form__if:service;url:/forms/service.html"></div>
<div data---="importer__common.form__if:summary;url:/forms/summary.html"></div>
<div data---="importer__common.form__if:upload;url:/forms/upload.html"></div>
<div data---="importer__common.form__if:intro;url:/forms/intro.html"></div>
Expand Down Expand Up @@ -288,8 +289,14 @@ <h2 class="search"><span>{{ m.items.length }}</span><i class="fas fa-list"></i>@

// response.sslexpire = apps.apps.findValue('id', response.id, 'sslexpire', null);
response.sslcustom = !!response.ssl_key;
SET('appform @reset', response);
SET('common.form @hideloading', 'app');

if (response.servicemode) {
SET('serviceform @reset', response);
SET('common.form @hideloading', 'service');
} else {
SET('appform @reset', response);
SET('common.form @hideloading', 'app');
}

}));

Expand Down Expand Up @@ -345,9 +352,22 @@ <h2 class="search"><span>{{ m.items.length }}</span><i class="fas fa-list"></i>@
el.attrd('search', el.attrd('url') + (plus ? (' ' + plus) : ''));
};

exports.create = function() {
SET('appform @default', { unixsocket: true });
SET('common.form', 'app');
exports.create = function(el) {
var opt = {};
opt.element = el;
opt.items = [];
opt.items.push({ id: 'app', name: '@(App)', icon: 'fa fa-globe' });
opt.items.push({ id: 'service', name: '@(Service)', icon: 'fa fa-cogs' });
opt.callback = function(item) {
if (item.id === 'app') {
SET('appform @default', { unixsocket: true });
SET('common.form', 'app');
} else {
SET('serviceform @default', {});
SET('common.form', 'service');
}
};
SETTER('menu/show', opt);
};

exports.menubutton = function(el) {
Expand Down
2 changes: 1 addition & 1 deletion resources/default.resource
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
401 : Invalid permissions
404 : The requested tecord not found
404 : The requested record not found
error-file : File not found in the request
error-disabled : Your account was disabled
error-credentials : Invalid credentials
Expand Down
Loading

0 comments on commit 90f306a

Please sign in to comment.