feat(core): system assets and env config js file editor online

This commit is contained in:
OldHawk
2018-01-27 15:08:20 +08:00
parent 3ec3c9854a
commit 6007cfbfcc
19 changed files with 338 additions and 108 deletions

View File

@@ -1228,7 +1228,7 @@ module.exports = {
/**------------------------------------------------------------------------------------------------
* !IMPORTANT
* MEANTORRENT CONFIG START
* MEANTORRENT CONFIG END
* PLEASE DO NOT MODIFY THE FOLLOWING LINES
--------------------------------------------------------------------------------------------------*/
};

View File

@@ -6,11 +6,13 @@
.module(app.applicationModuleName)
.config(transConfig);
// **************************************************
// English Strings
// --------------------------------------------------
// Don`t change other code
// **************************************************
/**------------------------------------------------------------------------------------------------
* !IMPORTANT
* MEANTORRENT CONFIG START
* PLEASE DO NOT MODIFY THE ABOVE LINES
*
* English strings
--------------------------------------------------------------------------------------------------*/
var string_en = {
COMINGSOON: 'coming soon...',
@@ -1258,17 +1260,21 @@
//systems control panel
SYSTEMS: {
TORRENTS_CONFIG: 'System configure',
ASSETS_CONFIG: 'System assets configure',
ENV_CONFIG: 'System env configure',
TEMPLATES_EDIT: 'Templates editor',
STRINGS_EDIT: 'Translate strings editor',
TRANS_EDIT: 'Translate strings editor',
COMMANDS_EXECUTE: 'Server commands execute',
SELECT_FILE: 'Select file, please',
CONFIG_BLUR_CONFIRM_CANCEL: 'Cancel',
CONFIG_BLUR_CONFIRM_SAVE: 'Save',
CONFIG_BLUR_HEADER_TEXT: 'Configure was changed',
CONFIG_BLUR_BODY_TEXT: 'Configure was changed, are you sure to quit and don`t save it?',
CONFIG_CHANGED_CONFIRM_CANCEL: 'Cancel',
CONFIG_CHANGED_CONFIRM_SAVE: 'Save',
CONFIG_CHANGED_HEADER_TEXT: 'Configure was changed',
CONFIG_CHANGED_BODY_TEXT: 'Configure was changed, are you sure to quit and don`t save it?',
CONFIG_SAVE_SUCCESSFULLY: 'Configure save successfully',
CONFIG_SAVE_FAILED: 'Configure save failed'
CONFIG_SAVE_FAILED: 'Configure save failed',
DESC_CONFIG: ':warning: This is the system configuration file of **meanTorrent**. If you know what you are doing, you can modify them. Otherwise, don\'t change it arbitrarily. Incorrect settings may cause the system to not work properly. You can also consult the related system maintenance personnel before modification.'
},
/////////////////////////resources tag fields///////////////////////////////////
@@ -1548,9 +1554,13 @@
}
};
// **************************************************
// English Strings end
// **************************************************
/**------------------------------------------------------------------------------------------------
* !IMPORTANT
* MEANTORRENT CONFIG END
* PLEASE DO NOT MODIFY THE FOLLOWING LINES
*
* English strings
--------------------------------------------------------------------------------------------------*/
// config $translateProvider
transConfig.$inject = ['$translateProvider'];

View File

@@ -6,11 +6,13 @@
.module(app.applicationModuleName)
.config(transConfig);
// **************************************************
// 中 文 翻 译
// --------------------------------------------------
// 请不要修改翻译部分之外的代码
// **************************************************
/**------------------------------------------------------------------------------------------------
* !重要提示
* MEANTORRENT 配置开始
* 请不要修改在这之前的任何代码
*
* 中文字符串
--------------------------------------------------------------------------------------------------*/
var string_zh = {
COMINGSOON: '开发中,请稍候...',
@@ -1258,17 +1260,21 @@
//systems control panel
SYSTEMS: {
TORRENTS_CONFIG: '系统配置调整',
ASSETS_CONFIG: 'Assets 资源配置调整',
ENV_CONFIG: 'Env 环境配置调整',
TEMPLATES_EDIT: '模板在线编辑',
STRINGS_EDIT: '多语言字符串在线编辑',
TRANS_EDIT: '多语言字符串在线编辑',
COMMANDS_EXECUTE: '服务器命令在线执行',
SELECT_FILE: '请选择文件',
CONFIG_BLUR_CONFIRM_CANCEL: '取消',
CONFIG_BLUR_CONFIRM_SAVE: '保存',
CONFIG_BLUR_HEADER_TEXT: '系统配置已更改',
CONFIG_BLUR_BODY_TEXT: '系统配置已被修改, 您确定要退出并放弃保存吗?',
CONFIG_CHANGED_CONFIRM_CANCEL: '取消',
CONFIG_CHANGED_CONFIRM_SAVE: '保存',
CONFIG_CHANGED_HEADER_TEXT: '系统配置已更改',
CONFIG_CHANGED_BODY_TEXT: '系统配置已被修改, 您确定要退出并放弃保存吗?',
CONFIG_SAVE_SUCCESSFULLY: '系统配置保存成功',
CONFIG_SAVE_FAILED: '系统配置保存失败'
CONFIG_SAVE_FAILED: '系统配置保存失败',
DESC_CONFIG: ':warning: 这是 **meantorrent** 的系统配置文件, 如果您知道你在干什么, 您可以修改它们, 否则不要随便改动, 不正确的设置可能会导致系统不能正常工作. 您也可以在修改前咨询相关系统维护人员.'
},
/////////////////////////resources tag fields///////////////////////////////////
@@ -1546,12 +1552,15 @@
SITE_NOTICE: {
GLOBAL_SALES_NOTICE: '### 重要通知! \n :radio: **新年快乐 2018**, **{{site_name}}** 新年促销活动已准备就绪, 促销活动类型为 <span class="sale_key">**{{sale_value}}**</span> , 活动将开始于 **{{sale_start_at | date: "yyyy-MM-dd HH:mm"}}** 并持续 <span class="sale_key">**{{sale_days}}**</span> 天, 结束于 **{{sale_end_at | date: "yyyy-MM-dd HH:mm"}}**, 并感谢所有会员用户一直以来给予我们的帮助与支持!'
}
};
// **************************************************
// 中文翻译结束
// **************************************************
/**------------------------------------------------------------------------------------------------
* !重要提示
* MEANTORRENT 配置结束
* 请不要修改在这之前的任何代码
*
* 中文字符串
--------------------------------------------------------------------------------------------------*/
// config $translateProvider
transConfig.$inject = ['$translateProvider'];

View File

@@ -9,7 +9,7 @@
'NotifycationService', 'uibButtonConfig', 'marked', 'localStorageService'];
function RequestsListController($scope, $rootScope, $state, $timeout, $translate, Authentication, RequestsService, ScoreLevelService, MeanTorrentConfig, mtDebug,
NotifycationService, uibButtonConfig, marked, localStorageService) {
NotifycationService, uibButtonConfig, marked, localStorageService) {
var vm = this;
vm.user = Authentication.user;
vm.itemsPerPageConfig = MeanTorrentConfig.meanTorrentConfig.itemsPerPage;

View File

@@ -9,7 +9,7 @@
'NotifycationService', 'uibButtonConfig', 'marked', 'localStorageService'];
function RequestsResController($scope, $rootScope, $state, $timeout, $translate, Authentication, RequestsService, ScoreLevelService, MeanTorrentConfig, mtDebug,
NotifycationService, uibButtonConfig, marked, localStorageService) {
NotifycationService, uibButtonConfig, marked, localStorageService) {
var vm = this;
vm.user = Authentication.user;
vm.itemsPerPageConfig = MeanTorrentConfig.meanTorrentConfig.itemsPerPage;

View File

@@ -11,7 +11,7 @@
function menuConfig(menuService) {
menuService.addSubMenuItem('topbar', 'admin', {
title: 'MENU_ADMIN_SYSTEMS',
state: 'admin.systems.config',
state: 'admin.systems.env',
position: 1000,
roles: ['admin'],
divider: true

View File

@@ -19,17 +19,21 @@
roles: ['admin']
}
})
.state('admin.systems.config', {
url: '/config',
templateUrl: '/modules/systems/client/views/config.client.view.html'
.state('admin.systems.assets', {
url: '/assets',
templateUrl: '/modules/systems/client/views/assets.client.view.html'
})
.state('admin.systems.env', {
url: '/env',
templateUrl: '/modules/systems/client/views/env.client.view.html'
})
.state('admin.systems.templates', {
url: '/templates',
templateUrl: '/modules/systems/client/views/templates.client.view.html'
})
.state('admin.systems.strings', {
url: '/strings',
templateUrl: '/modules/systems/client/views/strings.client.view.html'
.state('admin.systems.trans', {
url: '/trans',
templateUrl: '/modules/systems/client/views/trans.client.view.html'
})
.state('admin.systems.commands', {
url: '/commands',

View File

@@ -5,22 +5,65 @@
.module('systems')
.controller('SystemConfigController', SystemConfigController);
SystemConfigController.$inject = ['$scope', '$state', '$timeout', '$translate', 'Authentication', 'SystemsService', 'ModalConfirmService', 'NotifycationService'];
SystemConfigController.$inject = ['$scope', '$state', '$timeout', '$translate', 'Authentication', 'SystemsService', 'ModalConfirmService', 'NotifycationService', 'marked',
'DebugConsoleService'];
function SystemConfigController($scope, $state, $timeout, $translate, Authentication, SystemsService, ModalConfirmService, NotifycationService) {
function SystemConfigController($scope, $state, $timeout, $translate, Authentication, SystemsService, ModalConfirmService, NotifycationService, marked,
mtDebug) {
var vm = this;
vm.user = Authentication.user;
vm.selectedFilename = 'null';
vm.cmOption = {
lineNumbers: true,
mode: {name: 'javascript', json: true},
tabSize: 2,
onLoad: function (_cm) {
/**
* initConfigContent
* @param value
*/
vm.initConfigContent = function (value) {
_cm.setOption('value', value);
vm.contentChanged = false;
};
/**
* onSelectedFileChanged
*/
vm.onSelectedFileChanged = function () {
if (vm.contentChanged) {
var modalOptions = {
closeButtonText: $translate.instant('SYSTEMS.CONFIG_CHANGED_CONFIRM_CANCEL'),
actionButtonText: $translate.instant('SYSTEMS.CONFIG_CHANGED_CONFIRM_SAVE'),
headerText: $translate.instant('SYSTEMS.CONFIG_CHANGED_HEADER_TEXT'),
bodyText: $translate.instant('SYSTEMS.CONFIG_CHANGED_BODY_TEXT')
};
ModalConfirmService.showModal({}, modalOptions)
.then(function (result) {
vm.saveConfigFileContent(function () {
loadNewFile();
});
}, function (result) {
loadNewFile();
});
} else {
loadNewFile();
}
};
function loadNewFile() {
_cm.setOption('value', '');
SystemsService.getSystemConfigContent({
filename: vm.selectedFilename
}, function (res) {
vm.loadedFilename = vm.selectedFilename;
vm.initConfigContent(res.configContent);
});
}
_cm.on('change', function () {
vm.contentChanged = true;
});
@@ -33,41 +76,70 @@
$scope.$on('$stateChangeStart', function () {
if (vm.contentChanged) {
var modalOptions = {
closeButtonText: $translate.instant('SYSTEMS.CONFIG_BLUR_CONFIRM_CANCEL'),
actionButtonText: $translate.instant('SYSTEMS.CONFIG_BLUR_CONFIRM_SAVE'),
headerText: $translate.instant('SYSTEMS.CONFIG_BLUR_HEADER_TEXT'),
bodyText: $translate.instant('SYSTEMS.CONFIG_BLUR_BODY_TEXT')
closeButtonText: $translate.instant('SYSTEMS.CONFIG_CHANGED_CONFIRM_CANCEL'),
actionButtonText: $translate.instant('SYSTEMS.CONFIG_CHANGED_CONFIRM_SAVE'),
headerText: $translate.instant('SYSTEMS.CONFIG_CHANGED_HEADER_TEXT'),
bodyText: $translate.instant('SYSTEMS.CONFIG_CHANGED_BODY_TEXT')
};
ModalConfirmService.showModal({}, modalOptions)
.then(function (result) {
vm.saveConfigContent();
vm.saveConfigFileContent();
});
}
});
/**
* getConfigFile
* getDescConfig
* @returns {*}
*/
vm.getConfigFile = function () {
SystemsService.getSystemConfig(function (res) {
vm.initConfigContent(res.configContent);
// vm.systemConfigContent = res.configContent;
}, function (err) {
vm.getDescConfig = function () {
var ts = $translate.instant('SYSTEMS.DESC_CONFIG');
return marked(ts, {sanitize: true});
};
/**
* getEnvConfigFiles
*/
vm.getEnvConfigFiles = function () {
SystemsService.getSystemEnvConfigFiles(function (res) {
vm.envConfigFiles = res;
});
};
/**
* saveConfigContent
* getTransConfigFiles
*/
vm.saveConfigContent = function () {
var sc = new SystemsService({
content: vm.systemConfigContent
vm.getTransConfigFiles = function () {
SystemsService.getSystemTransConfigFiles(function (res) {
vm.transConfigFiles = res;
});
sc.$setSystemConfig(function (res) {
};
/**
* getAssetsConfigFiles
*/
vm.getAssetsConfigFiles = function () {
SystemsService.getSystemAssetsConfigFiles(function (res) {
vm.assetsConfigFiles = res;
});
};
/**
* saveConfigFileContent
*/
vm.saveConfigFileContent = function (callback) {
mtDebug.info('save content to config file: ' + vm.loadedFilename);
var sc = new SystemsService({
filename: vm.loadedFilename,
content: vm.systemConfigContentValue
});
sc.$setSystemConfigContent(function (res) {
NotifycationService.showSuccessNotify('SYSTEMS.CONFIG_SAVE_SUCCESSFULLY');
vm.contentChanged = false;
if (callback)
callback();
});
};
}

View File

@@ -11,13 +11,18 @@
}
.panel-desc {
border-bottom: solid 1px #ddd;
padding: 10px 15px 5px;
background-color: @alert-warning-bg;
}
.panel-filelist {
border-bottom: solid 1px #ddd;
padding: 10px 15px;
background-color: #fafbfc;
height: 100px;
}
.panel-body {
padding: 0;
.CodeMirror {
min-height: 500px;
min-height: 450px;
}
}
}

View File

@@ -14,13 +14,25 @@
update: {
method: 'PUT'
},
getSystemConfig: {
getSystemEnvConfigFiles: {
method: 'GET',
url: '/api/systems/systemConfig'
url: '/api/systems/systemEnvConfigFiles'
},
setSystemConfig: {
getSystemAssetsConfigFiles: {
method: 'GET',
url: '/api/systems/systemAssetsConfigFiles'
},
getSystemTransConfigFiles: {
method: 'GET',
url: '/api/systems/systemTransConfigFiles'
},
getSystemConfigContent: {
method: 'GET',
url: '/api/systems/systemConfigContent'
},
setSystemConfigContent: {
method: 'PUT',
url: '/api/systems/systemConfig'
url: '/api/systems/systemConfigContent'
}
});
}

View File

@@ -0,0 +1,26 @@
<div class="panel panel-default system-panel" ng-controller="SystemConfigController as vm" ng-init="vm.getAssetsConfigFiles()">
<div class="panel-heading">{{'SYSTEMS.ASSETS_CONFIG' | translate}}
<small> - {{vm.loadedFilename}}</small>
</div>
<div class="panel-desc" ng-bind-html="vm.getDescConfig()"></div>
<div class="panel-filelist">
<select class="form-control" ng-model="vm.selectedFilename" ng-change="vm.onSelectedFileChanged();" autofocus>
<option value="null">{{'SYSTEMS.SELECT_FILE' | translate}}
</option>
<option ng-repeat="t in vm.assetsConfigFiles.files"
value="{{t}}">{{t}}
</option>
</select>
</div>
<div class="panel-body">
<textarea class="form-control config-content" id="configContent" name="configContent" ng-model="vm.systemConfigContentValue"
ui-codemirror="vm.cmOption"></textarea>
</div>
<div class="panel-footer">
<div class="text-right">
<button class="btn btn-success btn-width-100" ng-disabled="!vm.contentChanged"
ng-click="vm.saveConfigFileContent()">{{'BUTTON_SAVE' | translate}}
</button>
</div>
</div>
</div>

View File

@@ -1,19 +0,0 @@
<div class="panel panel-default system-panel" ng-controller="SystemConfigController as vm" ng-init="vm.getConfigFile()">
<div class="panel-heading">{{'SYSTEMS.TORRENTS_CONFIG' | translate}} -
<small>/config/env/torrent.js</small>
</div>
<div class="panel-desc">
</div>
<div class="panel-body">
<textarea class="form-control config-content" id="configContent" name="configContent" ng-model="vm.systemConfigContent"
ui-codemirror="vm.cmOption"></textarea>
</div>
<div class="panel-footer">
<div class="text-right">
<button class="btn btn-success btn-width-100" ng-disabled="!vm.contentChanged"
ng-click="vm.saveConfigContent()">{{'BUTTON_SAVE' | translate}}
</button>
</div>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="panel panel-default system-panel" ng-controller="SystemConfigController as vm" ng-init="vm.getEnvConfigFiles()">
<div class="panel-heading">{{'SYSTEMS.ENV_CONFIG' | translate}}
<small> - {{vm.loadedFilename}}</small>
</div>
<div class="panel-desc" ng-bind-html="vm.getDescConfig()"></div>
<div class="panel-filelist">
<select class="form-control" ng-model="vm.selectedFilename" ng-change="vm.onSelectedFileChanged();" autofocus>
<option value="null">{{'SYSTEMS.SELECT_FILE' | translate}}
</option>
<option ng-repeat="t in vm.envConfigFiles.files"
value="{{t}}">{{t}}
</option>
</select>
</div>
<div class="panel-body">
<textarea class="form-control config-content" id="configContent" name="configContent" ng-model="vm.systemConfigContentValue"
ui-codemirror="vm.cmOption"></textarea>
</div>
<div class="panel-footer">
<div class="text-right">
<button class="btn btn-success btn-width-100" ng-disabled="!vm.contentChanged"
ng-click="vm.saveConfigFileContent()">{{'BUTTON_SAVE' | translate}}
</button>
</div>
</div>
</div>

View File

@@ -2,8 +2,9 @@
<div class="row">
<div class="col-sm-4 col-md-3">
<div class="list-group">
<a ui-sref="admin.systems.config" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.TORRENTS_CONFIG' | translate}}</a>
<a ui-sref="admin.systems.strings" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.STRINGS_EDIT' | translate}}</a>
<a ui-sref="admin.systems.env" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.ENV_CONFIG' | translate}}</a>
<a ui-sref="admin.systems.assets" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.ASSETS_CONFIG' | translate}}</a>
<a ui-sref="admin.systems.trans" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.TRANS_EDIT' | translate}}</a>
<a ui-sref="admin.systems.templates" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.TEMPLATES_EDIT' | translate}}</a>
<a ui-sref="admin.systems.commands" class="list-group-item" ui-sref-active="active">{{'SYSTEMS.COMMANDS_EXECUTE' | translate}}</a>
</div>

View File

@@ -1,11 +0,0 @@
<div class="panel panel-default system-panel">
<div class="panel-heading">
{{'SYSTEMS.STRINGS_EDIT' | translate}}
</div>
<div class="panel-desc">
</div>
<div class="panel-body">
<p>...</p>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="panel panel-default system-panel" ng-controller="SystemConfigController as vm" ng-init="vm.getTransConfigFiles()">
<div class="panel-heading">{{'SYSTEMS.TRANS_EDIT' | translate}}
<small> - {{vm.loadedFilename}}</small>
</div>
<div class="panel-desc" ng-bind-html="vm.getDescConfig()"></div>
<div class="panel-filelist">
<select class="form-control" ng-model="vm.selectedFilename" ng-change="vm.onSelectedFileChanged();" autofocus>
<option value="null">{{'SYSTEMS.SELECT_FILE' | translate}}
</option>
<option ng-repeat="t in vm.transConfigFiles.files"
value="{{t}}">{{t}}
</option>
</select>
</div>
<div class="panel-body">
<textarea class="form-control config-content" id="configContent" name="configContent" ng-model="vm.systemConfigContentValue"
ui-codemirror="vm.cmOption"></textarea>
</div>
<div class="panel-footer">
<div class="text-right">
<button class="btn btn-success btn-width-100" ng-disabled="!vm.contentChanged"
ng-click="vm.saveConfigFileContent()">{{'BUTTON_SAVE' | translate}}
</button>
</div>
</div>
</div>

View File

@@ -17,12 +17,69 @@ var serverMessage = require(path.resolve('./config/lib/server-message'));
var serverNoticeConfig = config.meanTorrentConfig.serverNotice;
/**
* getSystemConfig
* getSystemEnvConfigFiles
* @param req
* @param res
*/
exports.getSystemConfig = function (req, res) {
var config = shell.cat(path.resolve('./config/env/torrents.js'));
exports.getSystemEnvConfigFiles = function (req, res) {
var files = shell.ls('./config/env/*.js');
if (req.user.isAdmin) {
res.json({
files: files
});
} else {
return res.status(403).json({
message: 'SERVER.USER_IS_NOT_AUTHORIZED'
});
}
};
/**
* getSystemAssetsConfigFiles
* @param req
* @param res
*/
exports.getSystemAssetsConfigFiles = function (req, res) {
var files = shell.ls('./config/assets/*.js');
if (req.user.isAdmin) {
res.json({
files: files
});
} else {
return res.status(403).json({
message: 'SERVER.USER_IS_NOT_AUTHORIZED'
});
}
};
/**
* getSystemTransConfigFiles
* @param req
* @param res
*/
exports.getSystemTransConfigFiles = function (req, res) {
var files = shell.ls('./modules/core/client/app/trans*.js');
if (req.user.isAdmin) {
res.json({
files: files
});
} else {
return res.status(403).json({
message: 'SERVER.USER_IS_NOT_AUTHORIZED'
});
}
};
/**
* getSystemConfigContent
* @param req
* @param res
*/
exports.getSystemConfigContent = function (req, res) {
var config = shell.cat(path.resolve(req.query.filename));
if (req.user.isAdmin) {
res.json({
@@ -36,18 +93,18 @@ exports.getSystemConfig = function (req, res) {
};
/**
* setSystemConfig
* setSystemConfigContent
* @param req
* @param res
*/
exports.setSystemConfig = function (req, res) {
exports.setSystemConfigContent = function (req, res) {
// eslint-disable-next-line new-cap
var cc = shell.ShellString(req.body.content);
if (req.user.isAdmin) {
cc.to('./config/env/torrents.js');
cc.to(path.resolve(req.body.filename));
res.json({
message: 'SERVER.TORRENT_CONFIG_SAVE_SUCCESSFULLY'
message: 'SERVER.SYSTEM_CONFIG_SAVE_SUCCESSFULLY'
});
} else {
return res.status(403).json({

View File

@@ -15,7 +15,10 @@ exports.invokeRolesPolicies = function () {
acl.allow([{
roles: ['admin'],
allows: [
{resources: '/api/systems/systemConfig', permissions: '*'}
{resources: '/api/systems/systemConfigContent', permissions: '*'},
{resources: '/api/systems/systemEnvConfigFiles', permissions: '*'},
{resources: '/api/systems/systemAssetsConfigFiles', permissions: '*'},
{resources: '/api/systems/systemTransConfigFiles', permissions: '*'}
]
}]);
};

View File

@@ -7,7 +7,16 @@ var systemsPolicy = require('../policies/systems.server.policy'),
systems = require('../controllers/systems.server.controller');
module.exports = function (app) {
app.route('/api/systems/systemConfig').all(systemsPolicy.isAllowed)
.get(systems.getSystemConfig)
.put(systems.setSystemConfig);
app.route('/api/systems/systemEnvConfigFiles').all(systemsPolicy.isAllowed)
.get(systems.getSystemEnvConfigFiles);
app.route('/api/systems/systemAssetsConfigFiles').all(systemsPolicy.isAllowed)
.get(systems.getSystemAssetsConfigFiles);
app.route('/api/systems/systemTransConfigFiles').all(systemsPolicy.isAllowed)
.get(systems.getSystemTransConfigFiles);
app.route('/api/systems/systemConfigContent').all(systemsPolicy.isAllowed)
.get(systems.getSystemConfigContent)
.put(systems.setSystemConfigContent);
};