executables: fix help message.

[?]
May 12, 2020, 6:04 PM
ZVQK2652XNKQ4QBNOFSROAP4QRJQCBYH2DQW7RCWZVRBRLUZ46SAC

Dependencies

  • [2] SXEJJKPI executables: add `--help` flag. hacker.js: change scheduling logic. refactor. kill.js: allow handling more than one server or script at a time. cyclic_weaken.js: add. README.md: update.
  • [3] 2BKHJI2S init
  • [4] RWMZ7DVL split and refactor various logics. update "README.md".
  • [5] HSNSECD5 all: refactor. main.js: fix call to `void_kill_script_named_server_named`.
  • [6] 2WOLGB42 README.md: update. kill.js: fix argument parser. lshw.js: add `-p` option. increase information given. main.js: fix error message. set saner defaults. hacker.js: split some functions into "lib_time.js" and "lib_score.js". ram.js: fix.
  • [7] SLSWBNYT added ram utilisation logic to `ram.js` and `servers.js`. split and refactored redundant code into separate library files.
  • [8] AXGQ7FML split and refactor hacking logic to "hacker.js" and argument parsing and script execution logic to "main.js". update "README.md".
  • [9] Y5OWMCQR all: remove unecessary uses of `exec`. refactor. main.js: add RAM reservation logic. lib_ram.js: renamed to lib_ram_server.js. README.js: update.
  • [*] DJDWBCCQ add missing "nop.js". killall.js: rename to kill.js. add `--script` and `--server` options.

Change contents

  • file deletion: lib_minimist.js (----------)
    [3.3711246][3.3733569:3733608](),[3.3733608][3.3725818:3725818]()
    // lib_minimist.js - 1.6GB - adapted from https://github.com/substack/minimist/blob/38a4d1caead72ef99e824bb420a2528eec03d9ab/index.js
    // This software is released under the MIT license:
    // Permission is hereby granted, free of charge, to any person obtaining a copy of
    // this software and associated documentation files (the "Software"), to deal in
    // the Software without restriction, including without limitation the rights to
    // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    // the Software, and to permit persons to whom the Software is furnished to do so,
    // subject to the following conditions:
    // The above copyright notice and this permission notice shall be included in all
    // copies or substantial portions of the Software.
    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    if (!opts) opts = {};
    var flags = { bools : {}, strings : {}, unknownFn: null };
    if (typeof opts['unknown'] === 'function') {
    flags.unknownFn = opts['unknown'];
    }
    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
    flags.allBools = true;
    } else {
    [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
    flags.bools[key] = true;
    });
    }
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
    aliases[key] = [].concat(opts.alias[key]);
    aliases[key].forEach(function (x) {
    aliases[x] = [key].concat(aliases[key].filter(function (y) {
    return x !== y;
    }));
    });
    });
    [].concat(opts.string).filter(Boolean).forEach(function (key) {
    flags.strings[key] = true;
    if (aliases[key]) {
    flags.strings[aliases[key]] = true;
    }
    });
    var defaults = opts['default'] || {};
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
    setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    var notFlags = [];
    if (args.indexOf('--') !== -1) {
    notFlags = args.slice(args.indexOf('--')+1);
    args = args.slice(0, args.indexOf('--'));
    }
    function argDefined(key, arg) {
    return (flags.allBools && /^--[^=]+$/.test(arg)) ||
    flags.strings[key] || flags.bools[key] || aliases[key];
    }
    function setArg (key, val, arg) {
    if (arg && flags.unknownFn && !argDefined(key, arg)) {
    if (flags.unknownFn(arg) === false) return;
    }
    var value = !flags.strings[key] && isNumber(val)
    ? Number(val) : val
    ;
    setKey(argv, key.split('.'), value);
    (aliases[key] || []).forEach(function (x) {
    setKey(argv, x.split('.'), value);
    });
    }
    function setKey (obj, keys, value) {
    var o = obj;
    for (var i = 0; i < keys.length-1; i++) {
    var key = keys[i];
    if (key === '__proto__') return;
    if (o[key] === undefined) o[key] = {};
    if (o[key] === Object.prototype || o[key] === Number.prototype
    || o[key] === String.prototype) o[key] = {};
    if (o[key] === Array.prototype) o[key] = [];
    o = o[key];
    }
    var key = keys[keys.length - 1];
    if (key === '__proto__') return;
    if (o === Object.prototype || o === Number.prototype
    || o === String.prototype) o = {};
    if (o === Array.prototype) o = [];
    if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
    o[key] = value;
    }
    else if (Array.isArray(o[key])) {
    o[key].push(value);
    }
    else {
    o[key] = [ o[key], value ];
    }
    }
    function aliasIsBoolean(key) {
    return aliases[key].some(function (x) {
    return flags.bools[x];
    });
    }
    for (var i = 0; i < args.length; i++) {
    var arg = args[i];
    if (/^--.+=/.test(arg)) {
    // Using [\s\S] instead of . because js doesn't support the
    // 'dotall' regex modifier. See:
    // http://stackoverflow.com/a/1068308/13216
    var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
    var key = m[1];
    var value = m[2];
    if (flags.bools[key]) {
    value = value !== 'false';
    }
    setArg(key, value, arg);
    }
    else if (/^--no-.+/.test(arg)) {
    var key = arg.match(/^--no-(.+)/)[1];
    setArg(key, false, arg);
    }
    else if (/^--.+/.test(arg)) {
    var key = arg.match(/^--(.+)/)[1];
    var next = args[i + 1];
    if (next !== undefined && !/^-/.test(next)
    && !flags.bools[key]
    && !flags.allBools
    && (aliases[key] ? !aliasIsBoolean(key) : true)) {
    setArg(key, next, arg);
    i++;
    }
    else if (/^(true|false)$/.test(next)) {
    setArg(key, next === 'true', arg);
    i++;
    }
    else {
    setArg(key, flags.strings[key] ? '' : true, arg);
    }
    }
    else if (/^-[^-]+/.test(arg)) {
    var letters = arg.slice(1,-1).split('');
    var broken = false;
    for (var j = 0; j < letters.length; j++) {
    var next = arg.slice(j+2);
    if (next === '-') {
    setArg(letters[j], next, arg)
    continue;
    }
    if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
    setArg(letters[j], next.split('=')[1], arg);
    broken = true;
    break;
    }
    if (/[A-Za-z]/.test(letters[j])
    && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
    setArg(letters[j], next, arg);
    broken = true;
    break;
    }
    if (letters[j+1] && letters[j+1].match(/\W/)) {
    setArg(letters[j], arg.slice(j+2), arg);
    broken = true;
    break;
    }
    else {
    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
    }
    }
    var key = arg.slice(-1)[0];
    if (!broken && key !== '-') {
    if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
    && !flags.bools[key]
    && (aliases[key] ? !aliasIsBoolean(key) : true)) {
    setArg(key, args[i+1], arg);
    i++;
    }
    else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
    setArg(key, args[i+1] === 'true', arg);
    i++;
    }
    else {
    setArg(key, flags.strings[key] ? '' : true, arg);
    }
    }
    }
    else {
    if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
    argv._.push(
    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
    );
    }
    if (opts.stopEarly) {
    argv._.push.apply(argv._, args.slice(i + 1));
    break;
    }
    }
    }
    Object.keys(defaults).forEach(function (key) {
    if (!hasKey(argv, key.split('.'))) {
    setKey(argv, key.split('.'), defaults[key]);
    (aliases[key] || []).forEach(function (x) {
    setKey(argv, x.split('.'), defaults[key]);
    });
    }
    });
    if (opts['--']) {
    argv['--'] = new Array();
    notFlags.forEach(function(key) {
    argv['--'].push(key);
    });
    }
    else {
    notFlags.forEach(function(key) {
    argv._.push(key);
    });
    }
    return argv;
    };
    function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
    o = (o[key] || {});
    });
    var key = keys[keys.length - 1];
    return key in o;
    }
    function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
    }
    export const object_parse_arguments = function (args, opts) {
  • file addition: lib_no_ns.js (----------)
    [3.3711246]
    // lib_no_ns.js - 1.6GB - functions that don't use NetScript
    // https://stackoverflow.com/a/30376762
    export const string_sanitise = function (string) {
    const object_map = {
    "&": "&amp",
    "<": "&lt",
    ">": "&gt",
    '"': "&quot",
    "'": "&apos",
    };
    return string.replace(/[&<>"']/g, (string_match) => object_map[string_match]);
    };
    // minimist - adapted from https://github.com/substack/minimist/blob/38a4d1caead72ef99e824bb420a2528eec03d9ab/index.js
    // This software is released under the MIT license:
    // Permission is hereby granted, free of charge, to any person obtaining a copy of
    // this software and associated documentation files (the "Software"), to deal in
    // the Software without restriction, including without limitation the rights to
    // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    // the Software, and to permit persons to whom the Software is furnished to do so,
    // subject to the following conditions:
    // The above copyright notice and this permission notice shall be included in all
    // copies or substantial portions of the Software.
    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    export const object_parse_arguments = function (args, opts) {
    if (!opts) opts = {};
    var flags = { bools : {}, strings : {}, unknownFn: null };
    if (typeof opts['unknown'] === 'function') {
    flags.unknownFn = opts['unknown'];
    }
    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
    flags.allBools = true;
    } else {
    [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
    flags.bools[key] = true;
    });
    }
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
    aliases[key] = [].concat(opts.alias[key]);
    aliases[key].forEach(function (x) {
    aliases[x] = [key].concat(aliases[key].filter(function (y) {
    return x !== y;
    }));
    });
    });
    [].concat(opts.string).filter(Boolean).forEach(function (key) {
    flags.strings[key] = true;
    if (aliases[key]) {
    flags.strings[aliases[key]] = true;
    }
    });
    var defaults = opts['default'] || {};
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
    setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    var notFlags = [];
    if (args.indexOf('--') !== -1) {
    notFlags = args.slice(args.indexOf('--')+1);
    args = args.slice(0, args.indexOf('--'));
    }
    function argDefined(key, arg) {
    return (flags.allBools && /^--[^=]+$/.test(arg)) ||
    flags.strings[key] || flags.bools[key] || aliases[key];
    }
    function setArg (key, val, arg) {
    if (arg && flags.unknownFn && !argDefined(key, arg)) {
    if (flags.unknownFn(arg) === false) return;
    }
    var value = !flags.strings[key] && isNumber(val)
    ? Number(val) : val
    ;
    setKey(argv, key.split('.'), value);
    (aliases[key] || []).forEach(function (x) {
    setKey(argv, x.split('.'), value);
    });
    }
    function setKey (obj, keys, value) {
    var o = obj;
    for (var i = 0; i < keys.length-1; i++) {
    var key = keys[i];
    if (key === '__proto__') return;
    if (o[key] === undefined) o[key] = {};
    if (o[key] === Object.prototype || o[key] === Number.prototype
    || o[key] === String.prototype) o[key] = {};
    if (o[key] === Array.prototype) o[key] = [];
    o = o[key];
    }
    var key = keys[keys.length - 1];
    if (key === '__proto__') return;
    if (o === Object.prototype || o === Number.prototype
    || o === String.prototype) o = {};
    if (o === Array.prototype) o = [];
    if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
    o[key] = value;
    }
    else if (Array.isArray(o[key])) {
    o[key].push(value);
    }
    else {
    o[key] = [ o[key], value ];
    }
    }
    function aliasIsBoolean(key) {
    return aliases[key].some(function (x) {
    return flags.bools[x];
    });
    }
    for (var i = 0; i < args.length; i++) {
    var arg = args[i];
    if (/^--.+=/.test(arg)) {
    // Using [\s\S] instead of . because js doesn't support the
    // 'dotall' regex modifier. See:
    // http://stackoverflow.com/a/1068308/13216
    var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
    var key = m[1];
    var value = m[2];
    if (flags.bools[key]) {
    value = value !== 'false';
    }
    setArg(key, value, arg);
    }
    else if (/^--no-.+/.test(arg)) {
    var key = arg.match(/^--no-(.+)/)[1];
    setArg(key, false, arg);
    }
    else if (/^--.+/.test(arg)) {
    var key = arg.match(/^--(.+)/)[1];
    var next = args[i + 1];
    if (next !== undefined && !/^-/.test(next)
    && !flags.bools[key]
    && !flags.allBools
    && (aliases[key] ? !aliasIsBoolean(key) : true)) {
    setArg(key, next, arg);
    i++;
    }
    else if (/^(true|false)$/.test(next)) {
    setArg(key, next === 'true', arg);
    i++;
    }
    else {
    setArg(key, flags.strings[key] ? '' : true, arg);
    }
    }
    else if (/^-[^-]+/.test(arg)) {
    var letters = arg.slice(1,-1).split('');
    var broken = false;
    for (var j = 0; j < letters.length; j++) {
    var next = arg.slice(j+2);
    if (next === '-') {
    setArg(letters[j], next, arg)
    continue;
    }
    if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
    setArg(letters[j], next.split('=')[1], arg);
    broken = true;
    break;
    }
    if (/[A-Za-z]/.test(letters[j])
    && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
    setArg(letters[j], next, arg);
    broken = true;
    break;
    }
    if (letters[j+1] && letters[j+1].match(/\W/)) {
    setArg(letters[j], arg.slice(j+2), arg);
    broken = true;
    break;
    }
    else {
    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
    }
    }
    var key = arg.slice(-1)[0];
    if (!broken && key !== '-') {
    if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
    && !flags.bools[key]
    && (aliases[key] ? !aliasIsBoolean(key) : true)) {
    setArg(key, args[i+1], arg);
    i++;
    }
    else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
    setArg(key, args[i+1] === 'true', arg);
    i++;
    }
    else {
    setArg(key, flags.strings[key] ? '' : true, arg);
    }
    }
    }
    else {
    if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
    argv._.push(
    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
    );
    }
    if (opts.stopEarly) {
    argv._.push.apply(argv._, args.slice(i + 1));
    break;
    }
    }
    }
    Object.keys(defaults).forEach(function (key) {
    if (!hasKey(argv, key.split('.'))) {
    setKey(argv, key.split('.'), defaults[key]);
    (aliases[key] || []).forEach(function (x) {
    setKey(argv, x.split('.'), defaults[key]);
    });
    }
    });
    if (opts['--']) {
    argv['--'] = new Array();
    notFlags.forEach(function(key) {
    argv['--'].push(key);
    });
    }
    else {
    notFlags.forEach(function(key) {
    argv._.push(key);
    });
    }
    return argv;
    };
    function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
    o = (o[key] || {});
    });
    var key = keys[keys.length - 1];
    return key in o;
    }
    function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
    }
  • edit in bin/main.js at line 9
    [11.1656]
    [3.9672]
    import {
    string_sanitise,
    object_parse_arguments
    } from "lib_no_ns.js";
  • replacement in bin/lshw.js at line 3
    [3.2362][3.2362:2420]()
    import { object_parse_arguments } from "lib_minimist.js";
    [3.2362]
    [3.2420]
    import {
    string_sanitise,
    object_parse_arguments
    } from "lib_no_ns.js";
  • replacement in bin/lshw.js at line 79
    [2.10527][2.10527:10529]()
    `
    [2.10527]
    [2.10529]
    string_sanitise(`
  • edit in bin/lshw.js at line 99
    [2.11230]
    [3.19105]
    )
  • edit in bin/kill.js at line 5
    [3.3798939]
    [3.5138]
    import {
    string_sanitise,
    object_parse_arguments
    } from "lib_no_ns.js";
  • edit in bin/kill.js at line 11
    [3.5257][3.5257:5315]()
    import { object_parse_arguments } from "lib_minimist.js";
  • replacement in bin/kill.js at line 69
    [2.12600][2.12600:12602]()
    `
    [2.12600]
    [2.12602]
    string_sanitise(`
  • edit in bin/kill.js at line 89
    [2.13085]
    [2.13085]
    )
  • replacement in bin/cp.js at line 2
    [3.11423][2.13812:13870]()
    import { object_parse_arguments } from "lib_minimist.js";
    [3.11423]
    [3.19516]
    import {
    string_sanitise,
    object_parse_arguments
    } from "lib_no_ns.js";
  • replacement in bin/cp.js at line 50
    [2.15040][2.15040:15042]()
    `
    [2.15040]
    [2.15042]
    string_sanitise(`
  • edit in bin/cp.js at line 62
    [2.15375]
    [2.15375]
    )