This commit is contained in:
Ylian Saint-Hilaire 2023-04-14 13:36:43 -07:00
commit 7a38b70506
13 changed files with 165 additions and 63 deletions

View File

@ -58,6 +58,7 @@ ENV CONFIG_FILE="config.json"
ENV USE_MONGODB="false"
ENV MONGO_INITDB_ROOT_USERNAME="root"
ENV MONGO_INITDB_ROOT_PASSWORD="pass"
ENV MONGO_URL=""
ENV HOSTNAME="localhost"
ENV ALLOW_NEW_ACCOUNTS="true"
ENV ALLOWPLUGINS="false"

View File

@ -13,11 +13,15 @@
# Templates
## .env
You can place the `config.json` file directly under `./meshcentral/data/`, or use the following `.env` file instead.
```ini
NODE_ENV=production
# initial mongodb-variables
USE_MONGODB=false
# set already exist mongo connection string url here
MONGO_URL=
# or set following init params for new mongodb, use it with docker-compose file with mongodb version
MONGO_INITDB_ROOT_USERNAME=mongodbadmin
MONGO_INITDB_ROOT_PASSWORD=mongodbpasswd
@ -26,7 +30,6 @@ MONGO_INITDB_ROOT_PASSWORD=mongodbpasswd
# your hostname
HOSTNAME=my.domain.com
USE_MONGODB=false
# set to your reverse proxy IP if you want to put meshcentral behind a reverse proxy
REVERSE_PROXY=false
REVERSE_PROXY_TLS_PORT=

View File

@ -1,28 +1,34 @@
#!/bin/bash
if [ -f "meshcentral-data/${CONFIG_FILE}" ]
then
node meshcentral/meshcentral --configfile ${CONFIG_FILE}
else
cp config.json.template meshcentral-data/${CONFIG_FILE}
if ! [ -z "$USE_MONGODB" ] && [ "$USE_MONGODB" == "true" ]; then
sed -i "s/\"_mongoDb\": null/\"mongoDb\": \"mongodb:\/\/$MONGO_INITDB_ROOT_USERNAME:$MONGO_INITDB_ROOT_PASSWORD@mongodb:27017\"/" meshcentral-data/${CONFIG_FILE}
if [ -f "meshcentral-data/${CONFIG_FILE}" ]; then
node meshcentral/meshcentral --configfile "${CONFIG_FILE}"
else
cp config.json.template meshcentral-data/"${CONFIG_FILE}"
if [ -n "$USE_MONGODB" ] && [ "$USE_MONGODB" == "true" ]; then
if [ -z "$MONGO_URL" ]; then
prefix=""
if [ -n "$MONGO_INITDB_ROOT_USERNAME" ] && [ -n "$MONGO_INITDB_ROOT_PASSWORD" ]; then
prefix="$MONGO_INITDB_ROOT_USERNAME:$MONGO_INITDB_ROOT_PASSWORD@"
fi
MONGO_URL="${prefix}mongodb:27017"
fi
sed -i "s/\"cert\": \"myserver.mydomain.com\"/\"cert\": \"$HOSTNAME\"/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"NewAccounts\": true/\"NewAccounts\": $ALLOW_NEW_ACCOUNTS/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"enabled\": false/\"enabled\": $ALLOWPLUGINS/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"localSessionRecording\": false/\"localSessionRecording\": $LOCALSESSIONRECORDING/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"minify\": true/\"minify\": $MINIFY/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"WebRTC\": false/\"WebRTC\": $WEBRTC/" meshcentral-data/${CONFIG_FILE}
sed -i "s/\"AllowFraming\": false/\"AllowFraming\": $IFRAME/" meshcentral-data/${CONFIG_FILE}
if [ -z "$SESSION_KEY" ]; then
SESSION_KEY="$(cat /dev/urandom | tr -dc 'A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}~' | fold -w 32 | head -n 1)";
fi
sed -i "s/\"_sessionKey\": \"MyReallySecretPassword1\"/\"sessionKey\": \"$SESSION_KEY\"/" meshcentral-data/${CONFIG_FILE}
if [ "$REVERSE_PROXY" != "false" ]; then
sed -i "s/\"_certUrl\": \"my\.reverse\.proxy\"/\"certUrl\": \"https:\/\/$REVERSE_PROXY:$REVERSE_PROXY_TLS_PORT\"/" meshcentral-data/${CONFIG_FILE}
node meshcentral/meshcentral --configfile ${CONFIG_FILE}
exit
fi
node meshcentral/meshcentral --configfile ${CONFIG_FILE} --cert "$HOSTNAME"
sed -i "s/\"_mongoDb\": null/\"mongoDb\": \"mongodb:\/\/$MONGO_URL\"/" meshcentral-data/"${CONFIG_FILE}"
fi
sed -i "s/\"cert\": \"myserver.mydomain.com\"/\"cert\": \"$HOSTNAME\"/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"NewAccounts\": true/\"NewAccounts\": $ALLOW_NEW_ACCOUNTS/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"enabled\": false/\"enabled\": $ALLOWPLUGINS/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"localSessionRecording\": false/\"localSessionRecording\": $LOCALSESSIONRECORDING/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"minify\": true/\"minify\": $MINIFY/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"WebRTC\": false/\"WebRTC\": $WEBRTC/" meshcentral-data/"${CONFIG_FILE}"
sed -i "s/\"AllowFraming\": false/\"AllowFraming\": $IFRAME/" meshcentral-data/"${CONFIG_FILE}"
if [ -z "$SESSION_KEY" ]; then
SESSION_KEY="$(cat /dev/urandom | tr -dc 'A-Za-z0-9!#$%&()*+,-./:;<=>?@[\]^_`{|}~' | fold -w 32 | head -n 1)"
fi
sed -i "s/\"_sessionKey\": \"MyReallySecretPassword1\"/\"sessionKey\": \"$SESSION_KEY\"/" meshcentral-data/"${CONFIG_FILE}"
if [ "$REVERSE_PROXY" != "false" ]; then
sed -i "s/\"_certUrl\": \"my\.reverse\.proxy\"/\"certUrl\": \"https:\/\/$REVERSE_PROXY:$REVERSE_PROXY_TLS_PORT\"/" meshcentral-data/"${CONFIG_FILE}"
node meshcentral/meshcentral --configfile "${CONFIG_FILE}"
exit
fi
node meshcentral/meshcentral --configfile "${CONFIG_FILE}" --cert "$HOSTNAME"
fi

View File

@ -20,11 +20,11 @@ For more information, [visit MeshCentral.com](https://www.meshcentral.com/).
## Documentation
The [User's Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2UserGuide.pdf) contains information every adminstrator should know including usage, the server configuration file, databases, TLS offloading, Lets Encrypt, IP Filtering, Email setup, embedding, server port aliasing, reverse proxy setup, multi factor authentication, branding & terms of use, HashiCorp Vault support, and SSO.
The [User's Guide](https://meshcentral.com/info/docs/MeshCentral2UserGuide.pdf) contains information every adminstrator should know including usage, the server configuration file, databases, TLS offloading, Lets Encrypt, IP Filtering, Email setup, embedding, server port aliasing, reverse proxy setup, multi factor authentication, branding & terms of use, HashiCorp Vault support, and SSO.
The [Installation Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2InstallGuide.pdf) has detailed instructions for installing the MeshCentral Server on Windows 8.1, Windows 10, Windows 2012 R2, Amazon Linux 2, Raspberry Pi, Microsoft Azure, Google Cloud, Ubuntu 18, Ubuntu 16 and OpenBSD.
The [Installation Guide](https://meshcentral.com/info/docs/MeshCentral2InstallGuide.pdf) has detailed instructions for installing the MeshCentral Server on Windows 8.1, Windows 10, Windows 2012 R2, Amazon Linux 2, Raspberry Pi, Microsoft Azure, Google Cloud, Ubuntu 18, Ubuntu 16 and OpenBSD.
The [Design and Architecture Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2DesignArchitecture.pdf) is a short document that includes information on the design overview, dependencies, source code descriptions of each file, certificates, TLS security, the agent to server handshake, browser to agent relay and WebRTC and the messenger service.
The [Design and Architecture Guide](https://meshcentral.com/info/docs/MeshCentral2DesignArchitecture.pdf) is a short document that includes information on the design overview, dependencies, source code descriptions of each file, certificates, TLS security, the agent to server handshake, browser to agent relay and WebRTC and the messenger service.
## Video Tutorials

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@ -7,3 +7,30 @@ The SSH terminal does support color. The issue is going to be the terminal confi
```bash
ls -al --color /tmp
```
## Fancy config editing with VS Code
A common problem in the issues is an incorrect config.json. What makes a config incorrect? How can you verify your config is correct?
Easy! Use Visual Studio Code to edit your config.json and add the schema at the top.
If you haven't already, download VS code.
Download or copy the config.json to your computer.
Open config.json in code and add the schema as the top line. This schema is the raw JSON file in the MeshCentral repo.
```json
{
"$schema": "https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json",
"settings": {
"your settings go here": "..."
}
}
```
Now you have autocomplete, auto-format and validation for your config.json! If you start typing, Code will show the values that are valid for the location you are editing. Words with a red squiggle line are errors. Words with a orange squiggle line are warnings. Hover over both to see the error message and possible fixes. Code can even format your config.
While this is a huge step up, it's not perfect. If you notice, there are some invalid keys in the screenshot. This is perfectly valid JSON and MeshCentral will ignore them (maybe?). If you paste some configs into the wrong section, code will not tell you it's in the wrong section. Autocomplete will tell you what keys are valid and the type of the value (i.e. string, number, boolean).
Hopefully this will help verify your config is syntactically correct and prevent needless formatting errors, misspellings, etc.
![](images/2023-02-24vscodejsonediting.png)

View File

@ -274,6 +274,7 @@ devicesharing
devicepower
indexagenterrorlog
agentdownload
report
```
You can get this list by just running MeshCtrl without any argument and can get more information on each action by typing “meshctrl help [action]”

View File

@ -21,7 +21,7 @@ MeshCentral is a remote management web site that connects users to remote comput
## Downloading
MeshCentral router is a Windows application that comes built-into the MeshCentral server or can
be downloaded at: <http://info.meshcentral.com/downloads/MeshCentral2/MeshCentralRouter.exe>
be downloaded at: <https://meshcentral.com/info/tools/MeshCentralRouter.exe>
Its probably best to use the MeshCentral router that comes with your version of the MeshCentral
server as the two will likely be most compatible. A given MeshCentral Router version may not

View File

@ -16,7 +16,7 @@ var settings = {};
const crypto = require('crypto');
const args = require('minimist')(process.argv.slice(2));
const path = require('path');
const possibleCommands = ['edituser', 'listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', 'listevents', 'logintokens', 'serverinfo', 'userinfo', 'adduser', 'removeuser', 'adddevicegroup', 'removedevicegroup', 'editdevicegroup', 'broadcast', 'showevents', 'addusertodevicegroup', 'removeuserfromdevicegroup', 'addusertodevice', 'removeuserfromdevice', 'sendinviteemail', 'generateinvitelink', 'config', 'movetodevicegroup', 'deviceinfo', 'removedevice', 'editdevice', 'addusergroup', 'listusergroups', 'removeusergroup', 'runcommand', 'shell', 'upload', 'download', 'deviceopenurl', 'devicemessage', 'devicetoast', 'addtousergroup', 'removefromusergroup', 'removeallusersfromusergroup', 'devicesharing', 'devicepower', 'indexagenterrorlog', 'agentdownload'];
const possibleCommands = ['edituser', 'listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', 'listevents', 'logintokens', 'serverinfo', 'userinfo', 'adduser', 'removeuser', 'adddevicegroup', 'removedevicegroup', 'editdevicegroup', 'broadcast', 'showevents', 'addusertodevicegroup', 'removeuserfromdevicegroup', 'addusertodevice', 'removeuserfromdevice', 'sendinviteemail', 'generateinvitelink', 'config', 'movetodevicegroup', 'deviceinfo', 'removedevice', 'editdevice', 'addusergroup', 'listusergroups', 'removeusergroup', 'runcommand', 'shell', 'upload', 'download', 'deviceopenurl', 'devicemessage', 'devicetoast', 'addtousergroup', 'removefromusergroup', 'removeallusersfromusergroup', 'devicesharing', 'devicepower', 'indexagenterrorlog', 'agentdownload', 'report'];
if (args.proxy != null) { try { require('https-proxy-agent'); } catch (ex) { console.log('Missing module "https-proxy-agent", type "npm install https-proxy-agent" to install it.'); return; } }
if (args['_'].length == 0) {
@ -69,6 +69,7 @@ if (args['_'].length == 0) {
console.log(" DevicePower - Perform wake/sleep/reset/off operations on remote devices.");
console.log(" DeviceSharing - View, add and remove sharing links for a given device.");
console.log(" AgentDownload - Download an agent of a specific type for a device group.");
console.log(" Report - Create and show a CSV report.");
console.log("\r\nSupported login arguments:");
console.log(" --url [wss://server] - Server url, wss://localhost:443 is default.");
console.log(" - Use wss://localhost:443?key=xxx if login key is required.");
@ -275,6 +276,11 @@ if (args['_'].length == 0) {
else { ok = true; }
break;
}
case 'report': {
if (args.type == null) { console.log(winRemoveSingleQuotes("Missing report type, use --type '[reporttype]'")); }
else { ok = true; }
break;
}
case 'help': {
if (args['_'].length < 2) {
console.log("Get help on an action. Type:\r\n\r\n help [action]\r\n\r\nPossible actions are: " + possibleCommands.join(', ') + '.');
@ -961,6 +967,20 @@ if (args['_'].length == 0) {
console.log(" --title [title] - Toast title, default is \"MeshCentral\".");
break;
}
case 'report': {
console.log("Generate a CSV report, Example usages:\r\n");
console.log(" MeshCtrl Report --type sessions --devicegroup mesh//...");
console.log(" MeshCtrl Report --type traffic --json");
console.log(" MeshCtrl Report --type logins --groupby day");
console.log(" MeshCtrl Report --type db");
console.log("\r\nOptional arguments:\r\n");
console.log(" --start [yyyy-mm-ddThh:mm:ss] - Filter the results starting at that date. Defaults to last 24h and last week when used with --groupby day. Usable with sessions, traffic and logins");
console.log(" --end [yyyy-mm-ddThh:mm:ss] - Filter the results ending at that date. Defaults to now. Usable with sessions, traffic and logins");
console.log(" --groupby [name] - How to group results. Options: user, day, device. Defaults to user. User and day usable in sessions and logins, device usable in sessions.");
console.log(" --devicegroup [devicegroupid] - Filter the results by device group. Usable in sessions");
console.log(" --showtraffic - Add traffic data in sessions report");
break;
}
default: {
console.log("Get help on an action. Type:\r\n\r\n help [action]\r\n\r\nPossible actions are: " + possibleCommands.join(', ') + '.');
}
@ -1683,6 +1703,41 @@ function serverConnect() {
ws.send(JSON.stringify({ action: 'toast', nodeids: [args.id], title: args.title ? args.title : "MeshCentral", msg: args.msg, responseid: 'meshctrl' }));
break;
}
case 'report': {
var reporttype = 1;
switch(args.type) {
case 'traffic':
reporttype = 2;
break;
case 'logins':
reporttype = 3;
break;
case 'db':
reporttype = 4;
break;
}
var reportgroupby = 1;
if(args.groupby){
reportgroupby = args.groupby === 'device' ? 2 : args.groupby === 'day' ? 3: 1;
}
var start = null, end = null;
if (args.start) {
start = Math.floor(Date.parse(args.start) / 1000);
} else {
start = reportgroupby === 3 ? Math.round(new Date().getTime() / 1000) - (168 * 3600) : Math.round(new Date().getTime() / 1000) - (24 * 3600);
}
if (args.end) {
end = Math.floor(Date.parse(args.end) / 1000);
} else {
end = Math.round(new Date().getTime() / 1000);
}
if (end <= start) { console.log("End time must be ahead of start time."); process.exit(1); return; }
ws.send(JSON.stringify({ action: 'report', type: reporttype, groupBy: reportgroupby, devGroup: args.devicegroup || null, start, end, tz: Intl.DateTimeFormat().resolvedOptions().timeZone, tf: new Date().getTimezoneOffset(), showTraffic: args.hasOwnProperty('showtraffic'), l: 'en', responseid: 'meshctrl' }));
break;
}
}
});
@ -2249,6 +2304,15 @@ function serverConnect() {
console.log(data.data);
process.exit();
}
case 'report': {
console.log('group,' + data.data.columns.flatMap(c => c.id).join(','));
Object.keys(data.data.groups).forEach(gk => {
data.data.groups[gk].entries.forEach(e => {
console.log(gk + ',' + Object.values(e).join(','));
});
});
process.exit();
}
default: { break; }
}
//console.log('Data', data);

View File

@ -23,11 +23,11 @@ For more information, [visit MeshCentral.com](https://www.meshcentral.com).
[BlogSpot](https://meshcentral2.blogspot.com/)
## Documentation
The [User's Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2UserGuide.pdf) contains information every adminstrator should know including usage, the server configuration file, databases, TLS offloading, Lets Encrypt, IP Filtering, Email setup, embedding, server port aliasing, reverse proxy setup, multi factor authentication, branding & terms of use, HashiCorp Vault support, and SSO.
The [User's Guide](https://meshcentral.com/info/docs/MeshCentral2UserGuide.pdf) contains information every adminstrator should know including usage, the server configuration file, databases, TLS offloading, Lets Encrypt, IP Filtering, Email setup, embedding, server port aliasing, reverse proxy setup, multi factor authentication, branding & terms of use, HashiCorp Vault support, and SSO.
The [Installation Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2InstallGuide.pdf) has detailed instructions for installing the MeshCentral Server on Windows 8.1, Windows 10, Windows 2012 R2, Amazon Linux 2, Raspberry Pi, Microsoft Azure, Google Cloud, Ubuntu 18, Ubuntu 16 and OpenBSD.
The [Installation Guide](https://meshcentral.com/info/docs/MeshCentral2InstallGuide.pdf) has detailed instructions for installing the MeshCentral Server on Windows 8.1, Windows 10, Windows 2012 R2, Amazon Linux 2, Raspberry Pi, Microsoft Azure, Google Cloud, Ubuntu 18, Ubuntu 16 and OpenBSD.
The [Design and Architecture Guide](https://info.meshcentral.com/downloads/MeshCentral2/MeshCentral2DesignArchitecture.pdf) is a short document that includes information on the design overview, dependencies, source code descriptions of each file, certificates, TLS security, the agent to server handshake, browser to agent relay and WebRTC and the messenger service.
The [Design and Architecture Guide](https://meshcentral.com/info/docs/MeshCentral2DesignArchitecture.pdf) is a short document that includes information on the design overview, dependencies, source code descriptions of each file, certificates, TLS security, the agent to server handshake, browser to agent relay and WebRTC and the messenger service.
[New Searchable Documentation](https://ylianst.github.io/MeshCentral/)

View File

@ -9697,7 +9697,7 @@
"ru": "Alt",
"sv": "Alt",
"tr": "Alt",
"zh-chs": "替代",
"zh-chs": "Alt",
"zh-cht": "Alt",
"hu": "Alt",
"xloc": [
@ -9727,8 +9727,8 @@
"ru": "Альтернативная оболочка",
"sv": "Alt Shell",
"tr": "Alt Kabuk",
"zh-chs": "替代",
"zh-cht": "替代",
"zh-chs": "替代Shell",
"zh-cht": "替代Shell",
"hu": "Alternatív Shell",
"xloc": [
"default.handlebars->47->1280"
@ -20532,8 +20532,8 @@
"ru": "Del",
"sv": "Del",
"tr": "del",
"zh-chs": "德尔",
"zh-cht": "德爾",
"zh-chs": "Del",
"zh-cht": "Del",
"hu": "Del",
"xloc": [
"default-mobile.handlebars->11->422",
@ -35303,7 +35303,7 @@
"ru": "Если вы не инициировали этот запрос, игнорируйте это письмо.",
"sv": "Om du inte initierade denna begäran, ignorerar du det här meddelandet.",
"tr": "Bu isteği siz başlatmadıysanız, lütfen bu postayı dikkate almayın.",
"zh-chs": "如果您没有发起此请求,请不理此邮件。",
"zh-chs": "如果您没有发起此请求,请忽略此邮件。",
"zh-cht": "如果你沒有發起此請求,請不理此電郵。",
"hu": "Ha nem Ön kezdeményezte ezt a kérést, kérjük, hagyja figyelmen kívül ezt a levelet.",
"xloc": [
@ -41037,8 +41037,8 @@
"ru": "Left",
"sv": "Vänster",
"tr": "Sol",
"zh-chs": "剩下",
"zh-cht": "剩下",
"zh-chs": "",
"zh-cht": "",
"hu": "Bal",
"xloc": [
"default-mobile.handlebars->11->427",
@ -61030,8 +61030,8 @@
"ru": "Right",
"sv": "Rätt",
"tr": "Doğru",
"zh-chs": "正确的",
"zh-cht": "正確的",
"zh-chs": "",
"zh-cht": "",
"hu": "Jobb",
"xloc": [
"default-mobile.handlebars->11->429",
@ -66340,8 +66340,8 @@
"ru": "Shift",
"sv": "Flytta",
"tr": "Vardiya",
"zh-chs": "转移",
"zh-cht": "轉移",
"zh-chs": "Shift",
"zh-cht": "Shift",
"hu": "Shift",
"xloc": [
"default-mobile.handlebars->11->432",
@ -70539,8 +70539,8 @@
"ru": "TAB",
"sv": "FLIK",
"tr": "Sekme",
"zh-chs": "标签",
"zh-cht": "標籤",
"zh-chs": "TAB",
"zh-cht": "TAB",
"hu": "TAB"
},
{
@ -70812,8 +70812,8 @@
"ru": "Tab",
"sv": "Flik",
"tr": "Sekme",
"zh-chs": "标签",
"zh-cht": "標籤",
"zh-chs": "Tab",
"zh-cht": "Tab",
"hu": "Tab",
"xloc": [
"default-mobile.handlebars->11->417",
@ -75590,8 +75590,8 @@
"ru": "Up",
"sv": "Upp",
"tr": "Yukarı",
"zh-chs": "返回",
"zh-cht": "上",
"zh-chs": "",
"zh-cht": "上",
"hu": "Fel",
"xloc": [
"default-mobile.handlebars->11->428",
@ -81566,7 +81566,7 @@
"ru": "[[0]] токен доступа: [[1]]",
"sv": "[[0]] åtkomsttoken är: [[1]]",
"tr": "[[0]] erişim anahtarı: [[1]]",
"zh-chs": "[[0]]访问保安编码是:[[1]]",
"zh-chs": "[[0]]访问令牌是:[[1]]",
"zh-cht": "[[0]]訪問保安編碼是:[[1]]",
"hu": "[[0]] hozzáférés token: [[1]]",
"xloc": [
@ -81926,7 +81926,7 @@
"ru": "[[[SERVERNAME]]] - подтверждение по электронной почте",
"sv": "[[[SERVERNAME]]] - E-postverifiering",
"tr": "[[[SERVERNAME]]] - E-posta Doğrulaması",
"zh-chs": "更改邮件地址",
"zh-chs": "[[[SERVERNAME]]] - 邮件验证",
"zh-cht": "[[[SERVERNAME]]] - 電郵驗證",
"hu": "[[[SERVERNAME]]] - Email megerősítés",
"xloc": [
@ -84419,7 +84419,7 @@
"ru": "time, type, action, user, message",
"sv": "tid, typ, åtgärd, användare, meddelande",
"tr": "zaman, tür, işlem, kullanıcı, mesaj",
"zh-chs": "时间,类型,指令,用户,消息",
"zh-chs": "时间,打字,指令,用户,消息",
"zh-cht": "時間,類型,指令,用戶,消息",
"hu": "time, type, action, user, message"
},
@ -84671,7 +84671,7 @@
"ru": "utc, time, type, action, user, device, message",
"sv": "utc, tid, typ, åtgärd, användare, enhet, meddelande",
"tr": "utc, saat, tür, işlem, kullanıcı, cihaz, mesaj",
"zh-chs": "utc时间类型,指令,用户,设备,消息",
"zh-chs": "utc时间打字,指令,用户,设备,消息",
"zh-cht": "utc時間類型指令用戶裝置消息",
"hu": "utc, time, type, action, user, device, message",
"xloc": [

View File

@ -4354,7 +4354,7 @@
QH('deskButtonMenu', x);
}
var keyStrings = { 8: "BackSpace", 9: "Tab", 13: "Enter", 27: "Escape", 44 : "Print Screen", 45: "Insert", 46: "Del", 36: "Home", 35: "End", 33: "Page Up", 34: "Page Down", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 0: "None" }
var keyStrings = { 8 : "BackSpace", 9 : "Tab", 13 : "Enter", 27 : "Escape", 44 : "Print Screen", 45 : "Insert", 46 : "Del", 36 : "Home", 35 : "End", 32 : "Espace", 33 : "Page Up", 34 : "Page Down", 37 : "Left", 38 : "Up", 39 : "Right", 40 : "Down", 0 : "None" }
function keyShortcutTotext(n) {
var x = [];

View File

@ -1908,7 +1908,7 @@
function p13zipFiles() {
var inputFiles = [], checkboxes = document.getElementsByName('fd');
for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { inputFiles.push(p13filetree.dir[checkboxes[i].value].n); } }
setDialogMode(2, "Zip Filename", 3, p13zipFilesEx, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="" />', { action: 'zip', path: p13filetreelocation.join('/'), files: inputFiles });
setDialogMode(2, "Zip Filename", 3, p13zipFilesEx, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="" />', { action: 'zip -r', path: p13filetreelocation.join('/'), files: inputFiles });
focusTextBox('p13renameinput');
p13fileNameCheck();
}